Merge branch 'merge-web-master'
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..61eaf49
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,8 @@
+.gradle
+bin/
+build/
+.classpath
+.project
+.settings/
+.idea/
+
diff --git a/BUILD.md b/BUILD.md
new file mode 100644
index 0000000..b1dcf6d
--- /dev/null
+++ b/BUILD.md
@@ -0,0 +1,88 @@
+How to build Virgo locally
+==========================
+
+Getting the Code
+----------------
+
+The Virgo source code is managed with Git and hosted at the Eclipse Foundation.
+All Virgo related repositories are listed [here](https://wiki.eclipse.org/Virgo/Source#Virgo_git_Repositories).
+
+    $ git clone git://git.eclipse.org/gitroot/virgo/org.eclipse.virgo.root.git virgo
+    $ cd virgo
+    $ git submodule update --init
+
+For the impatient
+-----------------
+
+Since 3.7.0.M02 Virgo is built with [Gradle](https://gradle.org/).
+
+Running the default tasks with `./gradlew` will
+* compile the Virgo sources
+* create a temporary p2 repository
+* and package the Virgo deliverables.
+
+Build the Virgo deliverables
+============================
+
+To build distributable zipped files run:
+
+    $ ./gradlew clean jar build distZip fullDistZip rapDistZip
+
+There is an additional task to install the zips, too. This comes quite handy to quickly check the distributables:
+
+    $ ./gradlew installDist installFullDist installRapDist
+
+To speed up local builds you can skip some time-consuming processes like follows:
+ * `-Dskip.normalize.bundles=true`
+ * `-Dskip.local.signing=true`
+ * `-Dskip.compress.bundles=true`
+
+If you are only interested in the distribution(s) you might additionally want to skip some Gradle tasks, too: `-x test -x findBugsMain -x findBugsTest`.
+
+A simple local build can be done using the following command:
+
+    $ ./gradlew -Dskip.normalize.bundles=true -Dskip.local.signing=true -Dskip.compress.bundles=true clean jar build distZip fullDistZip -x test
+
+Run the basic smoke tests
+=========================
+
+TBD
+
+Upload a p2 update site
+=======================
+
+You can upload the create p2 update site with `./gradlew uploadUpdateSite`. This will
+* normalize, compress and sign
+* then upload the bundles into a composite repository at eclipse.org.
+
+Please review the configuration located in `org.eclipse.virgo.updatesite/gradle.properties`. You can test your setup with `./gradlew testEclipseConnection`:
+
+```
+$ ./gradlew testEclipseConnection
+...
+:org.eclipse.virgo.site:testEclipseConnection
+eclipseDotOrg|Linux build 3.0.101-0.47.52-default #1 SMP Thu Mar 26 10:55:49 UTC 2015 (0e3c7c8) x86_64 x86_64 x86_64 GNU/Linux
+Linux build 3.0.101-0.47.52-default #1 SMP Thu Mar 26 10:55:49 UTC 2015 (0e3c7c8) x86_64 x86_64 x86_64 GNU/Linux
+
+BUILD SUCCESSFUL
+
+Total time: 12.935 secs
+```
+
+Once the configuration is successfully tested you can do the actual upload of a snapshot site with `./gradlew uploadUpdateSite`.
+
+```
+$ ./gradlew -Dci.build=true clean uploadUpdateSite
+...
+:org.eclipse.virgo.site:copyBundles
+:org.eclipse.virgo.site:normalizeBundles
+:org.eclipse.virgo.site:signBundles
+...
+:org.eclipse.virgo.site:compressBundles
+:org.eclipse.virgo.site:createP2Repository
+Generating metadata for ..
+Generation completed with success [3 seconds].
+Generating metadata for ..
+Generation completed with success [0 seconds].
+> Building 99% > :org.eclipse.virgo.site:uploadUpdateSite
+```
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..e3a5790
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,47 @@
+Contributing to Virgo
+=====================
+
+Thanks for your interest in this project.
+
+Project description:
+--------------------
+
+The Virgo Web Server from EclipseRT is a completely module-based Java application server that is designed to run enterprise Java applications and Spring-powered applications with a high degree of flexibility and reliability. It offers a simple yet comprehensive platform to develop, deploy, and service enterprise Java applications.
+The Virgo kernel supports the core concepts of Virgo and is not biased towards the web server, thus enabling other types of server to be created. The kernel can also be used stand-alone as a rich OSGi application platform. A server runtime can easily be constructed by deploying suitable bundles on top of the kernel.
+
+- https://projects.eclipse.org/projects/rt.virgo
+
+Developer resources:
+--------------------
+
+Information regarding source code management, builds, coding standards, and more.
+
+- https://projects.eclipse.org/projects/rt.virgo/developer
+
+Contributor License Agreement:
+------------------------------
+
+Before your contribution can be accepted by the project, you need to create and electronically sign the Eclipse Foundation Contributor License Agreement (CLA).
+
+- http://www.eclipse.org/legal/CLA.php
+
+Contact:
+--------
+
+Contact the project developers via the project's "dev" list.
+
+- https://dev.eclipse.org/mailman/listinfo/virgo-dev
+
+Search for bugs:
+----------------
+
+This project uses Bugzilla to track ongoing development and issues.
+
+- https://bugs.eclipse.org/bugs/buglist.cgi?product=Virgo
+
+Create a new bug:
+-----------------
+
+Be sure to search for existing bugs before you create another one. Remember that contributions are always welcome!
+
+- https://bugs.eclipse.org/bugs/enter_bug.cgi?product=Virgo
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..a4c1d75
--- /dev/null
+++ b/README.md
@@ -0,0 +1,4 @@
+### Building Virgo
+
+     ./gradlew clean assemble managementConsole distZip installDist
+
diff --git a/apps/.gitignore b/apps/.gitignore
new file mode 100644
index 0000000..3fbb103
--- /dev/null
+++ b/apps/.gitignore
@@ -0,0 +1,13 @@
+*/src/main/resources/META-INF/MANIFEST.MF
+*/src/test/resources/META-INF/TEST.MF
+target
+integration-repo
+ivy-cache
+.ant-targets-build.xml
+user-ivy.properties
+bin/
+build/
+.settings/
+.project
+.classpath
+
diff --git a/apps/CONTRIBUTING.md b/apps/CONTRIBUTING.md
new file mode 100644
index 0000000..e3a5790
--- /dev/null
+++ b/apps/CONTRIBUTING.md
@@ -0,0 +1,47 @@
+Contributing to Virgo
+=====================
+
+Thanks for your interest in this project.
+
+Project description:
+--------------------
+
+The Virgo Web Server from EclipseRT is a completely module-based Java application server that is designed to run enterprise Java applications and Spring-powered applications with a high degree of flexibility and reliability. It offers a simple yet comprehensive platform to develop, deploy, and service enterprise Java applications.
+The Virgo kernel supports the core concepts of Virgo and is not biased towards the web server, thus enabling other types of server to be created. The kernel can also be used stand-alone as a rich OSGi application platform. A server runtime can easily be constructed by deploying suitable bundles on top of the kernel.
+
+- https://projects.eclipse.org/projects/rt.virgo
+
+Developer resources:
+--------------------
+
+Information regarding source code management, builds, coding standards, and more.
+
+- https://projects.eclipse.org/projects/rt.virgo/developer
+
+Contributor License Agreement:
+------------------------------
+
+Before your contribution can be accepted by the project, you need to create and electronically sign the Eclipse Foundation Contributor License Agreement (CLA).
+
+- http://www.eclipse.org/legal/CLA.php
+
+Contact:
+--------
+
+Contact the project developers via the project's "dev" list.
+
+- https://dev.eclipse.org/mailman/listinfo/virgo-dev
+
+Search for bugs:
+----------------
+
+This project uses Bugzilla to track ongoing development and issues.
+
+- https://bugs.eclipse.org/bugs/buglist.cgi?product=Virgo
+
+Create a new bug:
+-----------------
+
+Be sure to search for existing bugs before you create another one. Remember that contributions are always welcome!
+
+- https://bugs.eclipse.org/bugs/enter_bug.cgi?product=Virgo
\ No newline at end of file
diff --git a/apps/build.gradle b/apps/build.gradle
new file mode 100644
index 0000000..3ce2378
--- /dev/null
+++ b/apps/build.gradle
@@ -0,0 +1,51 @@
+
+project(':apps:org.eclipse.virgo.apps.repository.core') {
+    dependencies {
+        testCompile group: 'org.easymock', name: 'easymock', version: easymockVersion
+		testCompile project(':medic:org.eclipse.virgo.medic.test')
+
+        compile group: "org.slf4j", name: "slf4j-api", version: slf4jVersion
+
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi", version: equinoxVersion, configuration: "compile", ext: "jar"
+
+        compile group: "org.eclipse.gemini", name: "org.eclipse.gemini.web.core", version: geminiWebVersion, configuration: "compile", ext: "jar"
+
+		compile project(':util:org.eclipse.virgo.util.math')
+		compile project(':util:org.eclipse.virgo.util.io')
+		compile project(':util:org.eclipse.virgo.util.jmx')
+		compile project(':util:org.eclipse.virgo.util.osgi.manifest')
+		compile project(':medic:org.eclipse.virgo.medic')
+		compile project(':repository:org.eclipse.virgo.repository')
+		compile project(':kernel:org.eclipse.virgo.kernel.services')
+
+        if (System.properties['weaving.enabled'] == 'true') {
+            aspectpath project(':medic:org.eclipse.virgo.medic')
+            aspectpath project(':util:org.eclipse.virgo.util.jmx')
+        }
+	}
+}
+
+project(':apps:org.eclipse.virgo.apps.repository.web') {
+    dependencies {
+		testCompile group: 'org.easymock', name: 'easymock', version: easymockVersion
+        testCompile group: "org.eclipse.virgo.mirrored", name: "org.springframework.test", version: springframeworkVersion,ext: "jar"
+
+        compile group: "org.eclipse.virgo.mirrored", name: "javax.servlet", version: javaxServletVersion, configuration: "compile", ext: "jar"
+
+        compile group: "org.eclipse.virgo.mirrored", name: "org.springframework.core", version: springframeworkVersion,ext: "jar"
+        compile group: "org.eclipse.virgo.mirrored", name: "org.springframework.context", version: springframeworkVersion, ext: "jar"
+        compile group: "org.eclipse.virgo.mirrored", name: "org.springframework.web", version: springframeworkVersion, ext: "jar"
+
+		compile project(':util:org.eclipse.virgo.util.io')
+		compile project(':apps:org.eclipse.virgo.apps.repository.core')
+	}
+}
+
+project(':apps:org.eclipse.virgo.apps.splash') {
+    dependencies {
+        compile group: "org.slf4j", name: "slf4j-api", version: slf4jVersion
+        compile group: "org.eclipse.virgo.mirrored", name: "javax.servlet", version: javaxServletVersion, configuration: "compile", ext: "jar"
+
+		compile project(':apps:org.eclipse.virgo.apps.repository.core')
+	}
+}
diff --git a/apps/java-server.profile b/apps/java-server.profile
new file mode 100644
index 0000000..453a56f
--- /dev/null
+++ b/apps/java-server.profile
@@ -0,0 +1,211 @@
+org.osgi.framework.system.packages = \
+ javax.accessibility,\
+ javax.activation,\
+ javax.activation;version="1.1.0",\
+ javax.activity,\
+ javax.annotation,\
+ javax.annotation;version="1.0.0",\
+ 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;version="2.0",\
+ javax.jws.soap,\
+ javax.jws.soap;version="2.0",\
+ 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.script;version="1.1",\
+ 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;version="1.0.1",\
+ javax.transaction;version="1.1.0",\
+ javax.transaction.xa,\
+ javax.transaction.xa;version="1.0.1",\
+ javax.transaction.xa;version="1.1.0",\
+ javax.xml,\
+ javax.xml;version="1.0.1",\
+ javax.xml.bind,\
+ javax.xml.bind;version="2.0",\
+ javax.xml.bind.annotation,\
+ javax.xml.bind.annotation;version="2.0",\
+ javax.xml.bind.annotation.adapters,\
+ javax.xml.bind.annotation.adapters;version="2.0",\
+ javax.xml.bind.attachment,\
+ javax.xml.bind.attachment;version="2.0",\
+ javax.xml.bind.helpers,\
+ javax.xml.bind.helpers;version="2.0",\
+ javax.xml.bind.util,\
+ javax.xml.bind.util;version="2.0",\
+ javax.xml.crypto,\
+ javax.xml.crypto;version="1.0",\
+ javax.xml.crypto.dom,\
+ javax.xml.crypto.dom;version="1.0",\
+ javax.xml.crypto.dsig,\
+ javax.xml.crypto.dsig;version="1.0",\
+ javax.xml.crypto.dsig.dom,\
+ javax.xml.crypto.dsig.dom;version="1.0",\
+ javax.xml.crypto.dsig.keyinfo,\
+ javax.xml.crypto.dsig.keyinfo;version="1.0",\
+ javax.xml.crypto.dsig.spec,\
+ javax.xml.crypto.dsig.spec;version="1.0",\
+ javax.xml.datatype,\
+ javax.xml.namespace,\
+ javax.xml.parsers,\
+ javax.xml.soap,\
+ javax.xml.soap;version="1.3.0",\
+ javax.xml.stream,\
+ javax.xml.stream;version="1.0.1",\
+ javax.xml.stream.events,\
+ javax.xml.stream.events;version="1.0.1",\
+ javax.xml.stream.util,\
+ javax.xml.stream.util;version="1.0.1",\
+ 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;version="2.1.1",\
+ javax.xml.ws.handler,\
+ javax.xml.ws.handler;version="2.1.1",\
+ javax.xml.ws.handler.soap,\
+ javax.xml.ws.handler.soap;version="2.1.1",\
+ javax.xml.ws.http,\
+ javax.xml.ws.http;version="2.1.1",\
+ javax.xml.ws.soap,\
+ javax.xml.ws.soap;version="2.1.1",\
+ javax.xml.ws.spi,\
+ javax.xml.ws.spi;version="2.1.1",\
+ javax.xml.xpath,\
+ org.eclipse.virgo.kernel.equinox.extensions;version="3.7.0",\
+ org.eclipse.virgo.kernel.equinox.extensions.hooks;version="3.7.0",\
+ org.eclipse.virgo.test.launcher;version="3.7.0",\
+ org.eclipse.virgo.util.launcher.parser;version="3.7.0",\
+ 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.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
+org.osgi.framework.bootdelegation = \
+ com_cenqua_clover,\
+ com.cenqua.*,\
+ com.yourkit.*,\
+ com.sun.*,\
+ javax.xml.*,\
+ org.apache.xerces.jaxp.*,\
+ org.w3c.*,\
+ org.xml.*,\
+ sun.*
+org.osgi.framework.executionenvironment = \
+ OSGi/Minimum-1.0,\
+ OSGi/Minimum-1.1,\
+ J2SE-1.3,\
+ J2SE-1.4,\
+ J2SE-1.5,\
+ JavaSE-1.6
+osgi.java.profile.name = Virgo-Web-Server-Java6
diff --git a/apps/org.eclipse.virgo.apps.repository.core/.settings/org.eclipse.virgo.ide.bundlor.core.prefs b/apps/org.eclipse.virgo.apps.repository.core/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
new file mode 100644
index 0000000..17d2afe
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.core/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
@@ -0,0 +1,3 @@
+#Wed Jun 10 13:33:49 BST 2009
+com.springsource.server.ide.bundlor.core.template.properties.files=../build.properties;../build.versions
+eclipse.preferences.version=1
diff --git a/apps/org.eclipse.virgo.apps.repository.core/.settings/org.eclipse.wst.common.project.facet.core.xml b/apps/org.eclipse.virgo.apps.repository.core/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..92aa290
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.core/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+  <installed facet="org.eclipse.virgo.server.bundle" version="1.0"/>
+</faceted-project>
diff --git a/apps/org.eclipse.virgo.apps.repository.core/.springBeans b/apps/org.eclipse.virgo.apps.repository.core/.springBeans
new file mode 100644
index 0000000..975966a
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.core/.springBeans
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beansProjectDescription>
+	<version>1</version>
+	<pluginVersion><![CDATA[2.2.2.RELEASE]]></pluginVersion>
+	<configSuffixes>
+		<configSuffix><![CDATA[xml]]></configSuffix>
+	</configSuffixes>
+	<enableImports><![CDATA[false]]></enableImports>
+	<configs>
+		<config>src/main/resources/META-INF/spring/hosted-repository-context.xml</config>
+	</configs>
+	<configSets>
+	</configSets>
+</beansProjectDescription>
diff --git a/apps/org.eclipse.virgo.apps.repository.core/src/main/java/org/eclipse/virgo/apps/repository/core/HostedRepositoryInfo.java b/apps/org.eclipse.virgo.apps.repository.core/src/main/java/org/eclipse/virgo/apps/repository/core/HostedRepositoryInfo.java
new file mode 100644
index 0000000..ebe42d8
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.core/src/main/java/org/eclipse/virgo/apps/repository/core/HostedRepositoryInfo.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.apps.repository.core;
+
+import javax.management.MXBean;
+
+/**
+ * A management interface for a hosted repository; 
+ * exposes information specific to the hosted repository and references underlying repository.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ * Implementations must be thread-safe.
+ *
+ */
+@MXBean
+public interface HostedRepositoryInfo {
+
+    /**
+     * @return the hosted repository's Uri prefix
+     */
+    String getUriPrefix();
+    
+    /**
+     * @return the name of the local repository being hosted
+     */
+    String getLocalRepositoryName();
+
+}
diff --git a/apps/org.eclipse.virgo.apps.repository.core/src/main/java/org/eclipse/virgo/apps/repository/core/RepositoryIndex.java b/apps/org.eclipse.virgo.apps.repository.core/src/main/java/org/eclipse/virgo/apps/repository/core/RepositoryIndex.java
new file mode 100644
index 0000000..c2a8d25
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.core/src/main/java/org/eclipse/virgo/apps/repository/core/RepositoryIndex.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.apps.repository.core;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+
+/**
+ * A <code>RepositoryIndex</code> represents the index of a hosted repository.
+ * 
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ * Implementations <strong>must</strong> be thread-safe.
+ *
+ */
+public interface RepositoryIndex {
+
+    /**
+     * Return the length of the index in bytes.
+     * 
+     * @return the index's length in bytes.
+     */
+    int getLength();
+    
+    /**
+     * Returns the index's entity tag
+     * 
+     * @return the entity tag
+     */
+    String getETag();
+    
+    /**
+     * Returns an {@link InputStream} from which the index can be read
+     * 
+     * @return an <code>InputStream</code> for the index
+     * @throws IOException 
+     */
+    InputStream getInputStream() throws IOException;
+}
diff --git a/apps/org.eclipse.virgo.apps.repository.core/src/main/java/org/eclipse/virgo/apps/repository/core/RepositoryManager.java b/apps/org.eclipse.virgo.apps.repository.core/src/main/java/org/eclipse/virgo/apps/repository/core/RepositoryManager.java
new file mode 100644
index 0000000..7a7bb29
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.core/src/main/java/org/eclipse/virgo/apps/repository/core/RepositoryManager.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.apps.repository.core;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * A <code>RepositoryManager</code> manages repositories, providing access to repository indices and artifacts.
+ * 
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations <strong>must</strong> be thread-safe.
+ * 
+ */
+public interface RepositoryManager {
+
+    /**
+     * Returns the {@link RepositoryIndex} of the repository identified by the supplied repository name.
+     * 
+     * @param repositoryName The name of the repository for which the index is required
+     * 
+     * @return The named repository's index, or <code>null</code> if a repository with the supplied name is not known.
+     * @throws IOException if index cannot be accessed
+     */
+    RepositoryIndex getIndex(String repositoryName) throws IOException;
+
+    /**
+     * Returns an <code>InputStream</code> from which the artifact, stored in the repository identified by the supplied
+     * repository name, and identified by the supplied type, name, and version, can be read.
+     * 
+     * @param repositoryName The name of the repository that holds the required artifact
+     * @param type The type of the required artifact
+     * @param name The name of the required artifact
+     * @param version The version of the required artifact
+     * 
+     * @return The requested artifact, or <code>null</code> if the artifact does not exist.
+     */
+    InputStream getArtifact(String repositoryName, String type, String name, String version);
+}
diff --git a/apps/org.eclipse.virgo.apps.repository.core/src/main/java/org/eclipse/virgo/apps/repository/core/internal/ExportableIndexFilePool.java b/apps/org.eclipse.virgo.apps.repository.core/src/main/java/org/eclipse/virgo/apps/repository/core/internal/ExportableIndexFilePool.java
new file mode 100644
index 0000000..991e8b9
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.core/src/main/java/org/eclipse/virgo/apps/repository/core/internal/ExportableIndexFilePool.java
@@ -0,0 +1,243 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.apps.repository.core.internal;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.virgo.util.io.FileSystemUtils;
+
+/**
+ * A pool of files managed to keep index files that are 'exported' on demand.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ * thread-safe
+ *
+ */
+final public class ExportableIndexFilePool implements FilePool {
+
+    private static final int INDEX_NUMBER_LENGTH = 4;
+    private static final int TRIAL_TIMES = 10;  // must not be exceed ten consecutive numbered files
+    private static final int POOL_SIZE = 10;  // must be greater than zero
+    private static final String INDEX_SUFFIX = ".index";
+    private static final String INDEX_FILENAME_SUFFIX_FORMAT = INDEX_SUFFIX + "%04d"; // last four digits assumed in set-up
+    private final String fileFormat;
+    private final File indexLocationDir;
+
+    private final Object monitorIndexPool = new Object(); // protects all following private state
+        private final List<File> exportedIndexes;
+        private final List<File> toBeDeleted;
+        private volatile int indexFileNameNumber;
+        private final List<File> generatedIndexFiles;
+
+
+    public ExportableIndexFilePool(File indexLocationDir, String fileNameBase) {
+        this.indexLocationDir = indexLocationDir;
+        this.fileFormat = fileNameBase + INDEX_FILENAME_SUFFIX_FORMAT;
+        
+        final String filePrefix = fileNameBase + INDEX_SUFFIX;
+        this.exportedIndexes = new ArrayList<File>(POOL_SIZE);
+        collectExportedIndexesAndDetermineLastIndexValue(this.indexLocationDir, this.exportedIndexes, filePrefix);
+        
+        this.indexFileNameNumber = determineLastIndexValue(this.exportedIndexes); 
+        
+        this.toBeDeleted = new ArrayList<File>(0);
+        this.generatedIndexFiles = new ArrayList<File>(0);
+        clearOldIndexes();
+    }
+
+    public File generateNextPoolFile() throws FilePoolException {
+        synchronized (monitorIndexPool) {
+            for (int i=0; i<TRIAL_TIMES; ++i) {
+                if (++this.indexFileNameNumber > 9999) {
+                    this.indexFileNameNumber = 0;
+                }
+                final File indexFile = new File(this.indexLocationDir, String.format(this.fileFormat, this.indexFileNameNumber));
+                try {
+                    final File canonicalIndexFile = indexFile.getCanonicalFile();
+                    if (!this.generatedIndexFiles.contains(canonicalIndexFile)) {
+                        if (canonicalIndexFile.createNewFile()) {
+                            this.generatedIndexFiles.add(canonicalIndexFile);
+                            return canonicalIndexFile;
+                        }
+                    }
+                } catch (IOException e) {
+                    throw new FilePoolException("Cannot generate new pool file in '" + this.indexLocationDir + "'.", e);
+                }
+            }
+        }
+        throw new FilePoolException("Cannot generate new pool file for '" + this.indexLocationDir + "'.");
+    }
+    
+    public void putFileInPool(File indexFile) throws FilePoolException {
+        synchronized (monitorIndexPool) {
+            try {
+                File canonicalFile = indexFile.getCanonicalFile();
+                if (this.generatedIndexFiles.contains(canonicalFile)) {
+                    this.exportedIndexes.add(0, canonicalFile);
+                }
+            } catch (IOException e) {
+                throw new FilePoolException("Cannot put file in pool", e);
+            }
+            clearOldIndexes();
+        }
+    }
+    
+    public File getMostRecentPoolFile() throws FilePoolException {
+        synchronized (monitorIndexPool) {
+            if (this.exportedIndexes.isEmpty()) {
+                throw new FilePoolException("No file in exportable index file pool in '" + this.indexLocationDir + "'.");
+            }
+            File indexFile = this.exportedIndexes.get(0);
+            clearOldIndexes();
+            return indexFile;
+        }
+    }
+
+    private static int collectExportedIndexesAndDetermineLastIndexValue(File indexLocationDir, List<File> exportedIndexes, final String filePrefix) {
+        if (indexLocationDir==null || (indexLocationDir.exists() && !indexLocationDir.isDirectory())) {
+            throw new IllegalArgumentException("Index location '" + indexLocationDir + "' for index pool must be a directory.");
+        }
+        if (!indexLocationDir.exists()) {
+            if (!indexLocationDir.mkdirs()) {
+                throw new IllegalArgumentException("Index location '" + indexLocationDir + "' cannot be created.");
+            }
+        }
+
+        try {
+            fillAndOrderExportedIndexes(indexLocationDir, exportedIndexes, filePrefix);
+        } catch (IOException e) {
+            throw new IllegalArgumentException("Directory '" + indexLocationDir + "' cannot be used for indexes.");
+        }
+        
+        return determineLastIndexValue(exportedIndexes);
+    }
+
+    private static void fillAndOrderExportedIndexes(File indexLocationDir, List<File> exportedIndexes, final String filePrefix) throws IOException {
+        List<LastModifiedOrderableFile> orderableFileList = new ArrayList<LastModifiedOrderableFile>();
+        final int indexNameLength = filePrefix.length() + INDEX_NUMBER_LENGTH; 
+        for (File file : FileSystemUtils.listFiles
+            ( indexLocationDir, 
+                new FileFilter() 
+                    { public boolean accept(File pathname) 
+                        { 
+                            if (pathname.isDirectory())
+                                return false;
+                            String name = pathname.getName();
+                            if (name.length() == indexNameLength) {
+                                if (name.startsWith(filePrefix) 
+                                    && allDigits(name.substring(indexNameLength - INDEX_NUMBER_LENGTH, indexNameLength))) {
+                                    return true;
+                                }
+                            }
+                            return false;
+                        }
+                    }
+                )
+            ) {
+            orderableFileList.add(new LastModifiedOrderableFile(file.getCanonicalFile()));
+        }
+         
+        Collections.<LastModifiedOrderableFile>sort(orderableFileList);
+        
+        for (LastModifiedOrderableFile lmoFile : orderableFileList) {
+            exportedIndexes.add(lmoFile.getFile());
+        }
+        
+        orderableFileList.clear();
+    }
+    
+    private static boolean allDigits(String string) {
+        final char[] chars = string.toCharArray();
+        for (char c : chars) {
+            if ("0123456789".indexOf(c)==-1) return false;
+        }
+        return true;
+    }
+
+    private static class LastModifiedOrderableFile implements Comparable<LastModifiedOrderableFile> {
+        private final File file;
+        private final long lastModifiedValue;
+        public LastModifiedOrderableFile(File file) {
+            this.file = file;
+            this.lastModifiedValue = file.lastModified();
+        }
+        public int compareTo(LastModifiedOrderableFile o) {
+            long diff = o.lastModifiedValue - this.lastModifiedValue;
+            return (diff<0) ? -1 : ((diff>0) ? +1 : 0);
+        }
+        public boolean equals(Object o) {
+            if (o instanceof LastModifiedOrderableFile) {
+                return ((LastModifiedOrderableFile) o).lastModifiedValue == this.lastModifiedValue;
+            }
+            return false;
+        }
+        
+        public int hashCode() {
+            assert false : "hashCode not designed";
+            return 13; // any arbitrary constant will do 
+        }
+        
+        public File getFile() {
+            return this.file;
+        }
+    }
+
+    /**
+     * Precondition: exportedIndexes must be in newest-->oldest order.
+     * @param exportedIndexes list of files
+     * @return last index value found on newest file name
+     */
+    private static int determineLastIndexValue(List<File> exportedIndexes) {
+        int lastIndexValue = 0;
+        for (int i = exportedIndexes.size()-1; i>=0; --i) {    
+            File file = exportedIndexes.get(i);
+            try {
+                String filename = file.getName();
+                String lastFourChars = filename.substring(filename.length()-4, filename.length());
+                int indexNumber = Integer.parseInt(lastFourChars);
+                lastIndexValue = indexNumber;
+            } catch (IndexOutOfBoundsException e) {
+            } catch (NumberFormatException e) {
+            }
+        }
+        return lastIndexValue;
+    }
+    
+    private void clearOldIndexes() {
+        if (this.exportedIndexes.size()>POOL_SIZE) {
+            for (int i = this.exportedIndexes.size() - 1; i >= POOL_SIZE; --i) {
+                File indexFile = this.exportedIndexes.remove(i);
+                this.generatedIndexFiles.remove(indexFile);
+                if (indexFile.exists() && !indexFile.delete()) {
+                    this.toBeDeleted.add(indexFile);
+                }
+            }
+        }
+        if (!this.toBeDeleted.isEmpty()) {
+            List<File> remnant = new ArrayList<File>(this.toBeDeleted.size());
+            for (int i = 0; i < this.toBeDeleted.size(); ++i) {
+                File file = this.toBeDeleted.get(i);
+                if (file.exists() && !file.delete()) {
+                    remnant.add(file);
+                }
+            }
+            this.toBeDeleted.clear();
+            this.toBeDeleted.addAll(remnant);
+        }
+    }
+}
diff --git a/apps/org.eclipse.virgo.apps.repository.core/src/main/java/org/eclipse/virgo/apps/repository/core/internal/ExportingArtifactDescriptorPersister.java b/apps/org.eclipse.virgo.apps.repository.core/src/main/java/org/eclipse/virgo/apps/repository/core/internal/ExportingArtifactDescriptorPersister.java
new file mode 100644
index 0000000..f23ded4
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.core/src/main/java/org/eclipse/virgo/apps/repository/core/internal/ExportingArtifactDescriptorPersister.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.apps.repository.core.internal;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.eclipse.virgo.repository.ArtifactDescriptorPersister;
+
+/**
+ * An extension of {@link ArtifactDescriptorPersister} which allows export of the index file.
+ *
+ */
+public interface ExportingArtifactDescriptorPersister extends ArtifactDescriptorPersister {
+    /**
+     * @return a persisted index file 
+     * @throws IOException if such a file cannot be supplied
+     */
+    public File exportIndexFile() throws IOException;
+}
diff --git a/apps/org.eclipse.virgo.apps.repository.core/src/main/java/org/eclipse/virgo/apps/repository/core/internal/FilePool.java b/apps/org.eclipse.virgo.apps.repository.core/src/main/java/org/eclipse/virgo/apps/repository/core/internal/FilePool.java
new file mode 100644
index 0000000..41e5443
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.core/src/main/java/org/eclipse/virgo/apps/repository/core/internal/FilePool.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.apps.repository.core.internal;
+
+import java.io.File;
+
+/**
+ * Interface to manage a pool of files. Only the last file put in the pool is guaranteed to be present.
+ * <p />
+ *
+ */
+public interface FilePool {
+    
+    /**
+     * Generates a new writable file which can be placed in the pool
+     * @return newly created file
+     * @throws FilePoolException if pool is full or cannot be written to
+     */
+    File generateNextPoolFile() throws FilePoolException;
+    
+    /**
+     * Add file to pool.<br/>
+     * Files not returned by {@link #generateNextPoolFile()} may be ignored.
+     * @param indexFile to be placed in the pool
+     * @throws FilePoolException if IOException occurs on File operations
+     */
+    void putFileInPool(File indexFile) throws FilePoolException;
+    
+    /**
+     * @return the last file placed in the pool
+     * @throws FilePoolException if the pool is empty
+     */
+    File getMostRecentPoolFile() throws FilePoolException;
+}
diff --git a/apps/org.eclipse.virgo.apps.repository.core/src/main/java/org/eclipse/virgo/apps/repository/core/internal/FilePoolException.java b/apps/org.eclipse.virgo.apps.repository.core/src/main/java/org/eclipse/virgo/apps/repository/core/internal/FilePoolException.java
new file mode 100644
index 0000000..ff15d76
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.core/src/main/java/org/eclipse/virgo/apps/repository/core/internal/FilePoolException.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.apps.repository.core.internal;
+
+/**
+ * Exceptions from {@link FilePool} class
+ * <p />
+ *
+ */
+public class FilePoolException extends Exception {
+    
+    private static final long serialVersionUID = -5591757057162475613L;
+
+    public FilePoolException(String message, Throwable throwable) {
+        super(message, throwable);
+    }
+
+    public FilePoolException(String message) {
+        super(message);
+    }
+
+}
diff --git a/apps/org.eclipse.virgo.apps.repository.core/src/main/java/org/eclipse/virgo/apps/repository/core/internal/HostedRepository.java b/apps/org.eclipse.virgo.apps.repository.core/src/main/java/org/eclipse/virgo/apps/repository/core/internal/HostedRepository.java
new file mode 100644
index 0000000..bbf5dad
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.core/src/main/java/org/eclipse/virgo/apps/repository/core/internal/HostedRepository.java
@@ -0,0 +1,155 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.apps.repository.core.internal;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.management.ManagementFactory;
+import java.net.URI;
+
+import javax.management.JMException;
+import javax.management.ObjectInstance;
+
+import org.eclipse.virgo.apps.repository.core.HostedRepositoryInfo;
+import org.eclipse.virgo.apps.repository.core.RepositoryIndex;
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+import org.eclipse.virgo.repository.Repository;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe
+ * 
+ */
+class HostedRepository {
+
+    private final String name; // hosted repository name
+
+    private final Repository repository;
+
+    private final ExportingArtifactDescriptorPersister persister;
+
+    private final HostedRepositoryUriMapper uriMapper;
+    
+    private final HostedRepositoryObjectNameFactory objectNameFactory;
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(HostedRepository.class);
+
+    private volatile ObjectInstance mBean;
+
+    HostedRepository(Repository repository, ExportingArtifactDescriptorPersister persister, HostedRepositoryUriMapper uriMapper, HostedRepositoryObjectNameFactory objectNameFactory) {
+        this.name = (null != repository) ? repository.getName() : "";
+        this.repository = repository;
+        this.persister = persister;
+        this.uriMapper = uriMapper;
+        this.objectNameFactory = objectNameFactory;
+    }
+
+    URI inverseMapping(String type, String name, String version) {
+        ArtifactDescriptor descriptor = this.repository.get(type, name, new VersionRange("[" + version + "," + version + "]"));
+        if (descriptor != null) {
+            return this.uriMapper.inverseMapping(descriptor.getUri());
+        }
+        return null;
+    }
+
+    RepositoryIndex getRepositoryIndex() throws IOException {
+        return new ImmutableHostedRepositoryIndex(this.persister);
+    }
+
+    private void registerMBean() {
+        try {
+            this.mBean = ManagementFactory.getPlatformMBeanServer().registerMBean(this.createMBean(),
+                this.objectNameFactory.createObjectName(this.name));
+        } catch (JMException jme) {
+            LOGGER.warn(String.format("Management Bean for hosted repository '%s' not registered.", this.name), jme);
+        }
+    }
+
+    void start() {
+        this.registerMBean();
+    }
+    
+    void stop() {
+        this.deRegisterMBean();
+    }
+
+    private void deRegisterMBean() {
+        if (this.mBean != null) {
+            try {
+                ManagementFactory.getPlatformMBeanServer().unregisterMBean(this.mBean.getObjectName());
+            } catch (JMException jme) {
+                LOGGER.warn(String.format("Management Bean for hosted repository '%s' cannot be deregistered.", this.name), jme);
+            }
+        }
+    }
+
+    HostedRepositoryInfo createMBean() {
+        return new StandardHostedRepositoryInfo(this.uriMapper.getUriPrefix(), this.repository.getName());
+    }
+    
+    String getName() {
+        return name;
+    }
+    
+
+    private static class ImmutableHostedRepositoryIndex implements RepositoryIndex {
+
+        private final File indexFile;
+        private final int length;
+        private final long eTag;
+
+        private ImmutableHostedRepositoryIndex(ExportingArtifactDescriptorPersister persister) throws IOException {
+            File indexFile = null;
+            try {
+                indexFile = persister.exportIndexFile();
+            } catch (IOException e) {
+                LOGGER.error("Cannot get indexFile from lazy persister",e);
+                throw e;
+            }
+            if (indexFile==null) {
+                LOGGER.error("Cannot get indexFile from lazy persister");
+                throw new IllegalArgumentException("Exporting persister did not supply an index file");
+            }
+            this.eTag = indexFile.lastModified();
+            this.length = (int) indexFile.length();
+            this.indexFile = indexFile;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public String getETag() {
+            return Long.toString(this.eTag);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public InputStream getInputStream() throws IOException {
+            return new FileInputStream(this.indexFile);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public int getLength() {
+            return this.length;
+        }
+    }
+}
diff --git a/apps/org.eclipse.virgo.apps.repository.core/src/main/java/org/eclipse/virgo/apps/repository/core/internal/HostedRepositoryLogEvents.java b/apps/org.eclipse.virgo.apps.repository.core/src/main/java/org/eclipse/virgo/apps/repository/core/internal/HostedRepositoryLogEvents.java
new file mode 100644
index 0000000..667564e
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.core/src/main/java/org/eclipse/virgo/apps/repository/core/internal/HostedRepositoryLogEvents.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.apps.repository.core.internal;
+
+import org.eclipse.virgo.medic.eventlog.Level;
+import org.eclipse.virgo.medic.eventlog.LogEvent;
+
+/**
+ * <code>enum</code> of {@link LogEvent}s for the Hosted Repository code.
+ * <p />
+ * <strong>Concurrent Semantics</strong><br />
+ * utterly thread-safe
+ * 
+ */
+public enum HostedRepositoryLogEvents implements LogEvent {
+    /** 
+     * The Hosted Repository configuration is incorrect. */
+    CONFIGURATION_EXCEPTION(1, Level.WARNING),
+    /** 
+     * The repository '{}' in a hosted repository configuration was not created. */
+    REPOSITORY_EXCEPTION(2, Level.WARNING),
+    /** 
+     * The host address for the repository '{}' cannot be determined. */
+    HOST_ADDRESS_EXCEPTION(3, Level.WARNING),
+    /** 
+     * The chain definition '{}' is ignored in a hosted repository configuration. */
+    CHAIN_NON_EMPTY(4, Level.WARNING),
+    /**
+     * The repository '{}' in a hosted repository configuration is not supported and is ignored. */
+    NON_SUPPORTED_REPOSITORY(5, Level.WARNING);
+
+    private static final String SERVER_LOG_FORMAT = "%s%04d%1.1s";
+
+    private static final String PREFIX = "HR";
+
+    private final int code;
+
+    private final Level level;
+
+    private HostedRepositoryLogEvents(int code, Level level) {
+        this.code = code;
+        this.level = level;
+    }
+
+    public String getEventCode() {
+        return String.format(HostedRepositoryLogEvents.SERVER_LOG_FORMAT, HostedRepositoryLogEvents.PREFIX, this.code, this.level);
+    }
+
+    public Level getLevel() {
+        return this.level;
+    }
+
+}
diff --git a/apps/org.eclipse.virgo.apps.repository.core/src/main/java/org/eclipse/virgo/apps/repository/core/internal/HostedRepositoryObjectNameFactory.java b/apps/org.eclipse.virgo.apps.repository.core/src/main/java/org/eclipse/virgo/apps/repository/core/internal/HostedRepositoryObjectNameFactory.java
new file mode 100644
index 0000000..44ef8e3
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.core/src/main/java/org/eclipse/virgo/apps/repository/core/internal/HostedRepositoryObjectNameFactory.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.apps.repository.core.internal;
+
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+
+/**
+ * Generate {@link ObjectName}s for the hosted repository instances
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread-safe
+ * 
+ */
+public class HostedRepositoryObjectNameFactory {
+
+    private static final String OBJECT_NAME_PATTERN = "%s:type=HostedRepository,name=%s";
+
+    private final String domain;
+
+    public HostedRepositoryObjectNameFactory(String domain) {
+        this.domain = domain;
+    }
+
+    /**
+     * Creates a uniform object name based on the name of the hosted repository
+     * 
+     * @param repositoryName The name of the repository
+     * @return The uniform object name
+     * @throws NullPointerException but this should never happen
+     * @throws MalformedObjectNameException if the generated object name would be badly formed
+     */
+    public ObjectName createObjectName(String repositoryName) throws MalformedObjectNameException, NullPointerException {
+        return new ObjectName(String.format(OBJECT_NAME_PATTERN, this.domain, repositoryName));
+    }
+}
diff --git a/apps/org.eclipse.virgo.apps.repository.core/src/main/java/org/eclipse/virgo/apps/repository/core/internal/HostedRepositoryUriMapper.java b/apps/org.eclipse.virgo.apps.repository.core/src/main/java/org/eclipse/virgo/apps/repository/core/internal/HostedRepositoryUriMapper.java
new file mode 100644
index 0000000..0ccf993
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.core/src/main/java/org/eclipse/virgo/apps/repository/core/internal/HostedRepositoryUriMapper.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.apps.repository.core.internal;
+
+import java.net.InetAddress;
+import java.net.URI;
+import java.net.UnknownHostException;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.osgi.framework.Version;
+
+import org.eclipse.virgo.repository.UriMapper;
+
+/**
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ * 
+ */
+class HostedRepositoryUriMapper implements UriMapper {
+
+    private final String uriPrefix;
+
+    private final Map<URI, URI> mappings = new HashMap<URI, URI>();
+
+    HostedRepositoryUriMapper(int port, String repositoryName) throws UnknownHostException {
+        String hostname = InetAddress.getLocalHost().getCanonicalHostName();
+        this.uriPrefix = String.format("http://%s:%s/org.eclipse.virgo.apps.repository/%s", hostname, port, repositoryName);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public URI map(URI uri, String type, String name, Version version) {
+        URI mapping = URI.create(String.format("%s/%s/%s/%s", this.uriPrefix, type, name, version.toString()));
+        this.mappings.put(mapping, uri);
+
+        return mapping;
+    }
+
+    URI inverseMapping(URI uri) {
+        return this.mappings.get(uri);
+    }
+
+    public String getUriPrefix() {
+        return this.uriPrefix;
+    }
+}
diff --git a/apps/org.eclipse.virgo.apps.repository.core/src/main/java/org/eclipse/virgo/apps/repository/core/internal/LazyExportableXMLArtifactDescriptorPersister.java b/apps/org.eclipse.virgo.apps.repository.core/src/main/java/org/eclipse/virgo/apps/repository/core/internal/LazyExportableXMLArtifactDescriptorPersister.java
new file mode 100644
index 0000000..aa44014
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.core/src/main/java/org/eclipse/virgo/apps/repository/core/internal/LazyExportableXMLArtifactDescriptorPersister.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.apps.repository.core.internal;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+import org.eclipse.virgo.repository.codec.RepositoryCodec;
+import org.eclipse.virgo.repository.ArtifactDescriptorPersister;
+import org.eclipse.virgo.repository.IndexFormatException;
+import org.eclipse.virgo.repository.XmlArtifactDescriptorPersister;
+
+
+/**
+ * An {@link ArtifactDescriptorPersister} which allows export of the persisted index file and only generates this when export is requested.
+ * It delegates to {@link XmlArtifactDescriptorPersister}s to do the actual writing. <p /> 
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ * This implementation is thread-safe.
+ *
+ */
+class LazyExportableXMLArtifactDescriptorPersister implements ExportingArtifactDescriptorPersister {
+
+    private final String repositoryName;
+    
+    private final RepositoryCodec repositoryCodec;
+    
+    private final Object monitorPersister = new Object(); // serialises access to following private state
+        private volatile boolean currentSetPersisted;
+        private final Set<RepositoryAwareArtifactDescriptor> artifactDescriptors = new HashSet<RepositoryAwareArtifactDescriptor>();
+        private final FilePool indexPool;
+
+    public LazyExportableXMLArtifactDescriptorPersister(String repositoryName, RepositoryCodec repositoryCodec, FilePool indexPool) {
+        this.repositoryCodec = repositoryCodec;
+        this.repositoryName = repositoryName;
+        this.currentSetPersisted = false;
+        this.indexPool = indexPool;
+    }
+
+    public Set<RepositoryAwareArtifactDescriptor> loadArtifacts() throws IndexFormatException {
+        synchronized (monitorPersister) {
+            Set<RepositoryAwareArtifactDescriptor> artifactDescriptorsCopy = new HashSet<RepositoryAwareArtifactDescriptor>(this.artifactDescriptors.size());
+            artifactDescriptorsCopy.addAll(this.artifactDescriptors);
+            return artifactDescriptorsCopy;
+        }
+    }
+
+    public void persistArtifactDescriptors(Set<RepositoryAwareArtifactDescriptor> descriptors) throws IOException {
+        synchronized (monitorPersister) {
+            this.artifactDescriptors.clear();
+            this.artifactDescriptors.addAll(descriptors);
+            this.currentSetPersisted = false;
+        }
+    }
+    
+    public File exportIndexFile() throws IOException {
+        File indexFile = null;
+        synchronized (monitorPersister) {
+            try {
+                if (!currentSetPersisted) {
+                    indexFile = this.indexPool.generateNextPoolFile();
+                    ArtifactDescriptorPersister artifactDescriptorPersister = new XmlArtifactDescriptorPersister(this.repositoryCodec, this.repositoryName, indexFile);
+                    artifactDescriptorPersister.persistArtifactDescriptors(this.artifactDescriptors);
+                    this.indexPool.putFileInPool(indexFile);
+                    this.currentSetPersisted = true;
+                } else {
+                    indexFile = this.indexPool.getMostRecentPoolFile();
+                }
+            } catch (FilePoolException e) {
+                throw new IOException(e.getMessage(), e);
+            }
+        }
+        return indexFile;
+    }
+
+}
diff --git a/apps/org.eclipse.virgo.apps.repository.core/src/main/java/org/eclipse/virgo/apps/repository/core/internal/StandardHostedRepositoryInfo.java b/apps/org.eclipse.virgo.apps.repository.core/src/main/java/org/eclipse/virgo/apps/repository/core/internal/StandardHostedRepositoryInfo.java
new file mode 100644
index 0000000..53bc10c
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.core/src/main/java/org/eclipse/virgo/apps/repository/core/internal/StandardHostedRepositoryInfo.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.apps.repository.core.internal;
+
+import org.eclipse.virgo.apps.repository.core.HostedRepositoryInfo;
+
+
+/**
+ * Standard implementation of the {@link HostedRepositoryInfo} MBean 
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread-safe.
+ *
+ */
+class StandardHostedRepositoryInfo implements HostedRepositoryInfo {
+
+    private final String uriPrefix;
+    private final String localRepositoryName;
+    
+    StandardHostedRepositoryInfo(String uriPrefix, String localRepositoryName) {
+        this.uriPrefix = uriPrefix;
+        this.localRepositoryName = localRepositoryName;
+    }
+    
+    /** 
+     * {@inheritDoc}
+     */
+    public String getLocalRepositoryName() {
+        return this.localRepositoryName;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public String getUriPrefix() {
+        return this.uriPrefix;
+    }
+
+}
diff --git a/apps/org.eclipse.virgo.apps.repository.core/src/main/java/org/eclipse/virgo/apps/repository/core/internal/StandardRepositoryManager.java b/apps/org.eclipse.virgo.apps.repository.core/src/main/java/org/eclipse/virgo/apps/repository/core/internal/StandardRepositoryManager.java
new file mode 100644
index 0000000..8a88dc8
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.core/src/main/java/org/eclipse/virgo/apps/repository/core/internal/StandardRepositoryManager.java
@@ -0,0 +1,186 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.apps.repository.core.internal;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+import java.net.UnknownHostException;
+import java.util.Collection;
+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.Map.Entry;
+
+import org.eclipse.virgo.apps.repository.core.RepositoryIndex;
+import org.eclipse.virgo.apps.repository.core.RepositoryManager;
+import org.eclipse.virgo.kernel.services.work.WorkArea;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.gemini.web.core.ConnectorDescriptor;
+import org.eclipse.gemini.web.core.WebContainerProperties;
+import org.eclipse.virgo.repository.ArtifactBridge;
+import org.eclipse.virgo.repository.Repository;
+import org.eclipse.virgo.repository.RepositoryCreationException;
+import org.eclipse.virgo.repository.RepositoryFactory;
+import org.eclipse.virgo.repository.codec.XMLRepositoryCodec;
+import org.eclipse.virgo.repository.configuration.PersistentRepositoryConfiguration;
+import org.eclipse.virgo.repository.configuration.PropertiesRepositoryConfigurationReader;
+import org.eclipse.virgo.repository.configuration.RepositoryConfiguration;
+import org.eclipse.virgo.repository.configuration.RepositoryConfigurationException;
+import org.eclipse.virgo.util.math.OrderedPair;
+
+/**
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ * 
+ */
+class StandardRepositoryManager implements RepositoryManager {
+
+    private final EventLogger eventLogger;
+
+    private final Map<String, HostedRepository> repositories = new HashMap<String, HostedRepository>();
+
+    StandardRepositoryManager(Properties configuration, RepositoryFactory repositoryFactory, WorkArea workArea, Set<ArtifactBridge> artifactBridges, String repositoryManagementDomain, HostedRepositoryObjectNameFactory objectNameFactory, WebContainerProperties webContainerProperties, EventLogger eventLogger) {
+        this(formConfigurationMap(configuration, workArea, artifactBridges, repositoryManagementDomain, eventLogger), repositoryFactory,
+            objectNameFactory, webContainerProperties, eventLogger);
+    }
+    
+    StandardRepositoryManager(Map<String, RepositoryConfiguration> configurationMap, RepositoryFactory repositoryFactory, HostedRepositoryObjectNameFactory objectNameFactory, WebContainerProperties webContainerProperties, EventLogger eventLogger) {
+        
+        this.eventLogger = eventLogger;
+        int port = determineHttpPort(webContainerProperties);
+        checkPersistentRepositoryConfigurations(configurationMap.values());
+
+        for (Entry<String, RepositoryConfiguration> mapEntry : configurationMap.entrySet()) {
+            String repositoryName = mapEntry.getKey();
+            
+            RepositoryConfiguration repositoryConfiguration = mapEntry.getValue();
+            if (repositoryConfiguration instanceof PersistentRepositoryConfiguration) {
+                PersistentRepositoryConfiguration persistentRepositoryConfiguration = (PersistentRepositoryConfiguration) repositoryConfiguration;
+                try {
+                    HostedRepositoryUriMapper uriMapper = new HostedRepositoryUriMapper(port, repositoryName);
+                    persistentRepositoryConfiguration.setUriMapper(uriMapper);
+                    ExportableIndexFilePool filePool = new ExportableIndexFilePool(persistentRepositoryConfiguration.getIndexLocation(), repositoryName);
+                    ExportingArtifactDescriptorPersister artifactDescriptorPersister = 
+                        new LazyExportableXMLArtifactDescriptorPersister(repositoryName, new XMLRepositoryCodec(), filePool);
+                    Repository repository = repositoryFactory.createRepository(persistentRepositoryConfiguration, artifactDescriptorPersister);
+                    HostedRepository hostedRepository = new HostedRepository(repository, artifactDescriptorPersister, uriMapper, objectNameFactory);
+
+                    repositories.put(repositoryName, hostedRepository);
+                } catch (UnknownHostException uhe) {
+                    eventLogger.log(HostedRepositoryLogEvents.HOST_ADDRESS_EXCEPTION, uhe, repositoryName);
+                } catch (RepositoryCreationException rce) {
+                    eventLogger.log(HostedRepositoryLogEvents.REPOSITORY_EXCEPTION, rce, repositoryName);
+                }
+            }
+        }
+    }
+
+    private static final Map<String, RepositoryConfiguration> formConfigurationMap(Properties configuration, WorkArea workArea,
+        Set<ArtifactBridge> artifactBridges, String repositoryManagementDomain, EventLogger eventLogger) {
+        Set<ArtifactBridge> copySet = new HashSet<ArtifactBridge>();
+        copySet.addAll(artifactBridges);
+
+        PropertiesRepositoryConfigurationReader configurationReader = new PropertiesRepositoryConfigurationReader(
+            workArea.getWorkDirectory().toFile(), copySet, eventLogger, repositoryManagementDomain);
+        OrderedPair<Map<String, RepositoryConfiguration>, List<String>> configurations;
+        try {
+            configurations = configurationReader.readConfiguration(configuration);
+            checkNoChainDefined(configurations, eventLogger);
+            return configurations.getFirst();
+        } catch (RepositoryConfigurationException rce) {
+            eventLogger.log(HostedRepositoryLogEvents.CONFIGURATION_EXCEPTION, rce);
+        }
+        return null;
+    }
+
+    private static final void checkNoChainDefined(OrderedPair<Map<String, RepositoryConfiguration>, List<String>> configurations,
+        EventLogger eventLogger) {
+        if (!configurations.getSecond().isEmpty()) {
+            final List<String> chainList = configurations.getSecond();
+            String chainListString = chainList.get(0);
+            for (int i = 1; i < chainList.size(); ++i) {
+                chainListString += "," + chainList.get(i);
+            }
+            eventLogger.log(HostedRepositoryLogEvents.CHAIN_NON_EMPTY, chainListString);
+        }
+    }
+
+    private final void checkPersistentRepositoryConfigurations(Collection<RepositoryConfiguration> configurationSet) {
+        for (RepositoryConfiguration repositoryConfiguration : configurationSet) {
+            if (!(repositoryConfiguration instanceof PersistentRepositoryConfiguration)) {
+                this.eventLogger.log(HostedRepositoryLogEvents.NON_SUPPORTED_REPOSITORY, repositoryConfiguration.getName());
+            }
+        }
+    }
+
+    private final static int determineHttpPort(final WebContainerProperties webContainerProperties) {
+        Set<ConnectorDescriptor> connectorDescriptors = webContainerProperties.getConnectorDescriptors();
+        int result = -1;
+        for(ConnectorDescriptor connectorDescriptor : connectorDescriptors) {
+            if(connectorDescriptor.sslEnabled() == false && connectorDescriptor.getScheme().contains("http")) {
+                result = connectorDescriptor.getPort();
+            }
+        }
+        return result;
+    }
+
+    /**
+     * Start the hosted repositories successfully constructed
+     */
+    void start() {
+        for (Entry<String, HostedRepository> entry : this.repositories.entrySet()) {
+            entry.getValue().start();
+        }
+    }
+
+    /**
+     * Stop the hosted repositories successfully constructed
+     */
+    void stop() {
+        for (Entry<String, HostedRepository> entry : this.repositories.entrySet()) {
+            entry.getValue().stop();
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public InputStream getArtifact(String repositoryName, String type, String name, String version) {
+        HostedRepository hostedRepository = this.repositories.get(repositoryName);
+        if (hostedRepository != null) {
+            try {
+                URI originalUri = hostedRepository.inverseMapping(type, name, version);
+                return null == originalUri ? null : originalUri.toURL().openStream();
+            } catch (IOException ioe) {
+                return null;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     * @throws IOException 
+     */
+    public RepositoryIndex getIndex(String repositoryName) throws IOException {
+        HostedRepository hostedRepository = this.repositories.get(repositoryName);
+        if (hostedRepository != null) {
+            return hostedRepository.getRepositoryIndex();
+        }
+        return null;
+    }
+}
diff --git a/apps/org.eclipse.virgo.apps.repository.core/src/main/resources/EventLogMessages.properties b/apps/org.eclipse.virgo.apps.repository.core/src/main/resources/EventLogMessages.properties
new file mode 100644
index 0000000..4bf1d96
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.core/src/main/resources/EventLogMessages.properties
@@ -0,0 +1,5 @@
+HR0001W=The Hosted Repository configuration is incorrect.
+HR0002W=The repository '{}' in a hosted repository configuration was not created.
+HR0003W=The host address for the repository '{}' cannot be determined.
+HR0004W=The chain definition '{}' is ignored in a hosted repository configuration.
+HR0005W=The repository '{}' in a hosted repository configuration is not supported and is ignored.
diff --git a/apps/org.eclipse.virgo.apps.repository.core/src/main/resources/META-INF/spring/hosted-repository-context.xml b/apps/org.eclipse.virgo.apps.repository.core/src/main/resources/META-INF/spring/hosted-repository-context.xml
new file mode 100644
index 0000000..7562016
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.core/src/main/resources/META-INF/spring/hosted-repository-context.xml
@@ -0,0 +1,45 @@
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns:osgi="http://www.springframework.org/schema/osgi"
+	xmlns:osgix="http://www.springframework.org/schema/osgi-compendium"
+	xmlns:context="http://www.springframework.org/schema/context"
+	xsi:schemaLocation="
+		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+		http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi.xsd
+		http://www.springframework.org/schema/osgi-compendium http://www.springframework.org/schema/osgi-compendium/spring-osgi-compendium.xsd
+		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
+		
+		<bean id="repositoryManager" class="org.eclipse.virgo.apps.repository.core.internal.StandardRepositoryManager"
+				init-method="start" destroy-method="stop">
+			<constructor-arg>
+				<osgix:cm-properties persistent-id="org.eclipse.virgo.apps.repository"/>
+			</constructor-arg>
+			<constructor-arg>
+				<osgi:reference interface="org.eclipse.virgo.repository.RepositoryFactory"/>
+			</constructor-arg>
+			<constructor-arg>
+				<osgi:reference interface="org.eclipse.virgo.kernel.services.work.WorkArea"/>
+			</constructor-arg>
+			<constructor-arg>
+				<osgi:set interface="org.eclipse.virgo.repository.ArtifactBridge"/>
+			</constructor-arg>
+			<constructor-arg value="${domain}"/>
+			<constructor-arg ref="objectNameFactory"/>
+			<constructor-arg ref="webContainerProperties"/>
+			<constructor-arg ref="eventLogger"/>
+		</bean>
+		
+		<bean id="objectNameFactory" class="org.eclipse.virgo.apps.repository.core.internal.HostedRepositoryObjectNameFactory">
+			<constructor-arg value="org.eclipse.virgo.server"/>
+		</bean>
+
+        <osgi:reference id="eventLogger" interface="org.eclipse.virgo.medic.eventlog.EventLogger"/>
+		
+		<osgi:service ref="repositoryManager" interface="org.eclipse.virgo.apps.repository.core.RepositoryManager"/>
+		
+		<osgi:reference id="webContainerProperties" interface="org.eclipse.gemini.web.core.WebContainerProperties" />
+		
+		<osgix:cm-properties id="kernelConfig" persistent-id="org.eclipse.virgo.kernel"/>
+		
+		<context:property-placeholder properties-ref="kernelConfig"/>
+</beans>
diff --git a/apps/org.eclipse.virgo.apps.repository.core/src/test/java/org/eclipse/virgo/apps/repository/core/internal/ExportableIndexFilePoolTests.java b/apps/org.eclipse.virgo.apps.repository.core/src/test/java/org/eclipse/virgo/apps/repository/core/internal/ExportableIndexFilePoolTests.java
new file mode 100644
index 0000000..6053520
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.core/src/test/java/org/eclipse/virgo/apps/repository/core/internal/ExportableIndexFilePoolTests.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.apps.repository.core.internal;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.io.File;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import org.eclipse.virgo.apps.repository.core.internal.ExportableIndexFilePool;
+import org.eclipse.virgo.apps.repository.core.internal.FilePool;
+import org.eclipse.virgo.apps.repository.core.internal.FilePoolException;
+import org.eclipse.virgo.util.io.PathReference;
+
+
+
+/**
+ * Tests for {@link ExportableIndexFilePool} implementation of {@link FilePool}
+ * 
+ */
+public class ExportableIndexFilePoolTests {
+
+    private FilePool filePool;
+    private File dirFile = new File("build/testfilepooldir");
+    
+    @Before
+    public void setupFilePools() throws Exception {
+        this.dirFile = this.dirFile.getCanonicalFile();
+        clearTestDirs();
+    }
+    
+    @After
+    public void clearupFilePools() {
+        clearTestDirs();
+    }
+    
+    private void clearTestDirs() {
+        PathReference pr = new PathReference(this.dirFile);
+        pr.createDirectory().delete(true);
+    }
+    
+    @Test 
+    public void generateNextPoolFile() throws Exception {
+        this.filePool = new ExportableIndexFilePool(this.dirFile, "testfilepoolfilename");  
+        
+        File file1 = this.filePool.generateNextPoolFile();
+        assertNotNull(file1);
+        assertEquals(new File(this.dirFile,"testfilepoolfilename.index0001"), file1);
+        
+        File file2 = this.filePool.generateNextPoolFile();
+        assertNotNull(file2);
+        assertEquals(new File(this.dirFile,"testfilepoolfilename.index0002"), file2);
+        
+        File nextFile = null;
+        for (int i=0; i<10; ++i) {
+            nextFile = this.filePool.generateNextPoolFile();
+        }
+        assertNotNull(nextFile);
+        assertEquals(new File(this.dirFile,"testfilepoolfilename.index0012"), nextFile);
+    }
+    
+    @Test(expected=FilePoolException.class) 
+    public void getMostRecentPoolFileFromEmptyPool() throws Exception {
+        this.filePool = new ExportableIndexFilePool(this.dirFile, "testfilepoolfilename");  
+
+        this.filePool.getMostRecentPoolFile();
+    }
+
+    @Test 
+    public void getMostRecentPoolFile() throws Exception {
+        this.filePool = new ExportableIndexFilePool(this.dirFile, "testfilepoolfilename");  
+
+        File[] files = new File[13];
+        for (int i=0; i<13; ++i) {
+            files[i] = this.filePool.generateNextPoolFile();
+            this.filePool.putFileInPool(files[i]);
+        }
+        File testFile = this.filePool.getMostRecentPoolFile();
+        assertNotNull(testFile);
+        assertEquals(new File(this.dirFile,"testfilepoolfilename.index0013"), testFile);
+        assertEquals("Directory holds wrong number of indexes", 10, this.dirFile.listFiles().length);
+    }
+    
+    @Test
+    public void initialiseWithDebris() throws Exception {
+        new PathReference(new File(this.dirFile, "testfilepoolfilename.index9999")).createFile();
+        
+        this.filePool = new ExportableIndexFilePool(this.dirFile, "testfilepoolfilename");  
+        
+        File testFile = this.filePool.getMostRecentPoolFile();
+        assertEquals("found old file", new File(this.dirFile,"testfilepoolfilename.index9999"), testFile);
+        
+        testFile = this.filePool.getMostRecentPoolFile();
+        assertEquals("Get not repeatable", new File(this.dirFile,"testfilepoolfilename.index9999"), testFile);
+
+        this.filePool.putFileInPool(this.filePool.generateNextPoolFile());
+        
+        testFile = this.filePool.getMostRecentPoolFile();
+        assertEquals("Wraparound failed", new File(this.dirFile,"testfilepoolfilename.index0000"), testFile);
+
+    }
+    
+}
diff --git a/apps/org.eclipse.virgo.apps.repository.core/src/test/java/org/eclipse/virgo/apps/repository/core/internal/HostedRepositoryObjectNameFactoryTests.java b/apps/org.eclipse.virgo.apps.repository.core/src/test/java/org/eclipse/virgo/apps/repository/core/internal/HostedRepositoryObjectNameFactoryTests.java
new file mode 100644
index 0000000..0d62bd3
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.core/src/test/java/org/eclipse/virgo/apps/repository/core/internal/HostedRepositoryObjectNameFactoryTests.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.apps.repository.core.internal;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+import javax.management.ObjectName;
+import javax.management.MalformedObjectNameException;
+
+import org.eclipse.virgo.apps.repository.core.internal.HostedRepositoryObjectNameFactory;
+import org.junit.Test;
+
+
+
+/**
+ * Unit tests for {@link HostedRepositoryObjectNameFactory}
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ * Test-safe
+ *
+ */
+public class HostedRepositoryObjectNameFactoryTests {
+
+    private static final String TEST_BEAN_MGT_DOMAIN = "com.dom";
+    
+    private final HostedRepositoryObjectNameFactory objectNameFactory = new HostedRepositoryObjectNameFactory(TEST_BEAN_MGT_DOMAIN);
+
+    @Test
+    public void testCreateValidObjectName() throws Exception {
+        ObjectName objectName = objectNameFactory.createObjectName("repo-name-one");
+        assertEquals("Objectname incorrect", TEST_BEAN_MGT_DOMAIN + ":name=repo-name-one,type=HostedRepository", objectName.getCanonicalName());
+    }
+    
+    @Test(expected=MalformedObjectNameException.class)
+    public void testCreateInvalidObjectName() throws Exception {
+        ObjectName objectName = objectNameFactory.createObjectName("a: :b");
+        String oName = objectName.getCanonicalName();
+        assertFalse("Objectname '" + oName + "' should not have been generated", oName.startsWith(TEST_BEAN_MGT_DOMAIN + ":") && oName.endsWith("type=HostedRepository"));
+    }
+}
diff --git a/apps/org.eclipse.virgo.apps.repository.core/src/test/java/org/eclipse/virgo/apps/repository/core/internal/HostedRepositoryTests.java b/apps/org.eclipse.virgo.apps.repository.core/src/test/java/org/eclipse/virgo/apps/repository/core/internal/HostedRepositoryTests.java
new file mode 100644
index 0000000..1649ec0
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.core/src/test/java/org/eclipse/virgo/apps/repository/core/internal/HostedRepositoryTests.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.apps.repository.core.internal;
+
+import java.io.File;
+
+import org.junit.Test;
+
+import org.eclipse.virgo.apps.repository.core.HostedRepositoryInfo;
+import org.eclipse.virgo.apps.repository.core.internal.ExportingArtifactDescriptorPersister;
+import org.eclipse.virgo.apps.repository.core.internal.HostedRepository;
+import org.eclipse.virgo.apps.repository.core.internal.HostedRepositoryObjectNameFactory;
+import org.eclipse.virgo.apps.repository.core.internal.HostedRepositoryUriMapper;
+import org.eclipse.virgo.repository.Repository;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+
+/**
+ * Tests for {@link HostedRepository} class
+ * 
+ */
+public class HostedRepositoryTests {
+
+    @Test
+    public void createHostedRepository() throws Exception {
+        Repository repository = createMock(Repository.class);
+        expect(repository.getName()).andReturn("testHostRepoName").atLeastOnce();
+        replay(repository);
+
+        final File dummyIndexFile = new File("dummyIndexFile");
+        ExportingArtifactDescriptorPersister persister = createMock(ExportingArtifactDescriptorPersister.class);
+        expect(persister.exportIndexFile()).andReturn(dummyIndexFile).atLeastOnce();
+        replay(persister);
+        
+        final HostedRepositoryUriMapper uriMapper = new HostedRepositoryUriMapper(0, repository.getName());
+        
+        HostedRepository hr = new HostedRepository(repository, persister, uriMapper,
+            new HostedRepositoryObjectNameFactory("testHostedRepo"));
+        assertNotNull("No hosted repository created", hr);
+        assertNotNull("No index for Hosted repository", hr.getRepositoryIndex());
+        assertEquals("Hosted repository misnamed.", "testHostRepoName", hr.getName());
+        HostedRepositoryInfo mBean = hr.createMBean();
+        assertEquals("Incorrect MBean name", "testHostRepoName", mBean.getLocalRepositoryName());
+        assertEquals("Uri prefix not same as mapper",uriMapper.getUriPrefix(), mBean.getUriPrefix());
+    }
+
+}
diff --git a/apps/org.eclipse.virgo.apps.repository.core/src/test/java/org/eclipse/virgo/apps/repository/core/internal/LazyExportableXMLArtifactDescriptorPersisterTests.java b/apps/org.eclipse.virgo.apps.repository.core/src/test/java/org/eclipse/virgo/apps/repository/core/internal/LazyExportableXMLArtifactDescriptorPersisterTests.java
new file mode 100644
index 0000000..06f93ab
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.core/src/test/java/org/eclipse/virgo/apps/repository/core/internal/LazyExportableXMLArtifactDescriptorPersisterTests.java
@@ -0,0 +1,161 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.apps.repository.core.internal;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.net.URI;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.junit.Test;
+import org.osgi.framework.Version;
+
+import org.eclipse.virgo.apps.repository.core.internal.ExportingArtifactDescriptorPersister;
+import org.eclipse.virgo.apps.repository.core.internal.FilePool;
+import org.eclipse.virgo.apps.repository.core.internal.LazyExportableXMLArtifactDescriptorPersister;
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+import org.eclipse.virgo.repository.Attribute;
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+import org.eclipse.virgo.repository.codec.RepositoryCodec;
+import org.eclipse.virgo.repository.codec.XMLRepositoryCodec;
+import org.eclipse.virgo.repository.internal.StandardArtifactDescriptor;
+import org.eclipse.virgo.util.io.PathReference;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+
+/**
+ * Tests for {@link LazyExportableXMLArtifactDescriptorPersister}
+ * <p />
+ *
+ */
+public class LazyExportableXMLArtifactDescriptorPersisterTests {
+
+    private File solePoolFile = new File("build/lazypersistertest/file001");
+
+    private File nextPoolFile = new File("build/lazypersistertest/file002");
+
+    @Test
+    public void persistAndLoadArtifacts() throws Exception {
+
+        RepositoryCodec repositoryCodec = new XMLRepositoryCodec();
+
+        new PathReference(solePoolFile).createFile();
+        new PathReference(nextPoolFile).createFile();
+        FilePool filePool = new StubFilePool(solePoolFile, nextPoolFile);
+
+        ExportingArtifactDescriptorPersister persister = new LazyExportableXMLArtifactDescriptorPersister("repo-name", repositoryCodec, filePool);
+
+        Set<RepositoryAwareArtifactDescriptor> testSet = generateDescriptorSet();
+
+        persister.persistArtifactDescriptors(testSet);
+
+        Set<RepositoryAwareArtifactDescriptor> set = persister.loadArtifacts();
+
+        assertFalse("Sets are identical -- persister should copy them", testSet == set);
+
+        assertEquals("Set of descriptors returned is not the same as the set put in", testSet, set);
+    }
+
+    private Set<RepositoryAwareArtifactDescriptor> generateDescriptorSet() {
+        Set<RepositoryAwareArtifactDescriptor> setDescriptors = new HashSet<RepositoryAwareArtifactDescriptor>();
+        RepositoryAwareArtifactDescriptor raad1 = new StubRepositoryAwareArtifactDescriptor("repo-name",
+            new File("build/testlazypersister/raad1").toURI(), "bundle", "bundle.raad1", new Version("1.1"), "raad1", new HashSet<Attribute>());
+        RepositoryAwareArtifactDescriptor raad2 = new StubRepositoryAwareArtifactDescriptor("repo-name",
+            new File("build/testlazypersister/raad2").toURI(), "bundle", "bundle.raad2", new Version("1.2"), "raad2", new HashSet<Attribute>());
+
+        setDescriptors.add(raad1);
+        setDescriptors.add(raad2);
+
+        return setDescriptors;
+    }
+
+    @Test
+    public void exportIndexFile() throws Exception {
+        RepositoryCodec repositoryCodec = new XMLRepositoryCodec();
+
+        new PathReference(solePoolFile).createFile();
+        new PathReference(nextPoolFile).createFile();
+        FilePool filePool = new StubFilePool(solePoolFile, nextPoolFile);
+
+        ExportingArtifactDescriptorPersister persister = new LazyExportableXMLArtifactDescriptorPersister("repo-name", repositoryCodec, filePool);
+
+        Set<RepositoryAwareArtifactDescriptor> testSet = generateDescriptorSet();
+        persister.persistArtifactDescriptors(testSet);
+
+        File exportedFile = persister.exportIndexFile();
+        assertNotNull(exportedFile);
+
+        Set<ArtifactDescriptor> decodedOutput = repositoryCodec.read(new FileInputStream(exportedFile));
+
+        assertEquals(removeRepositoryAwareness(testSet), decodedOutput);
+    }
+
+    private static Set<ArtifactDescriptor> removeRepositoryAwareness(Set<RepositoryAwareArtifactDescriptor> raSet) {
+        final Set<ArtifactDescriptor> result = new HashSet<ArtifactDescriptor>(raSet.size());
+        for (ArtifactDescriptor artifactDescriptor : raSet) {
+            StandardArtifactDescriptor standardArtifactDescriptor = new StandardArtifactDescriptor(artifactDescriptor.getUri(),
+                artifactDescriptor.getType(), artifactDescriptor.getName(), artifactDescriptor.getVersion(), artifactDescriptor.getFilename(),
+                artifactDescriptor.getAttributes());
+            result.add(standardArtifactDescriptor);
+        }
+        return result;
+    }
+
+    private static class StubRepositoryAwareArtifactDescriptor implements RepositoryAwareArtifactDescriptor {
+
+        private final ArtifactDescriptor artifactDescriptor;
+
+        private final String repositoryName;
+
+        public StubRepositoryAwareArtifactDescriptor(String repositoryName, URI uri, String type, String name, Version version, String filename,
+            Set<Attribute> attributes) {
+            this.artifactDescriptor = new StandardArtifactDescriptor(uri, type, name, version, filename, attributes);
+            this.repositoryName = repositoryName;
+        }
+
+        public Set<Attribute> getAttribute(String name) {
+            return artifactDescriptor.getAttribute(name);
+        }
+
+        public Set<Attribute> getAttributes() {
+            return artifactDescriptor.getAttributes();
+        }
+
+        public String getFilename() {
+            return artifactDescriptor.getFilename();
+        }
+
+        public String getName() {
+            return artifactDescriptor.getName();
+        }
+
+        public String getType() {
+            return artifactDescriptor.getType();
+        }
+
+        public java.net.URI getUri() {
+            return artifactDescriptor.getUri();
+        }
+
+        public Version getVersion() {
+            return artifactDescriptor.getVersion();
+        }
+
+        public String getRepositoryName() {
+            return this.repositoryName;
+        }
+    }
+
+}
diff --git a/apps/org.eclipse.virgo.apps.repository.core/src/test/java/org/eclipse/virgo/apps/repository/core/internal/StandardHostedRepositoryInfoTests.java b/apps/org.eclipse.virgo.apps.repository.core/src/test/java/org/eclipse/virgo/apps/repository/core/internal/StandardHostedRepositoryInfoTests.java
new file mode 100644
index 0000000..b701ec4
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.core/src/test/java/org/eclipse/virgo/apps/repository/core/internal/StandardHostedRepositoryInfoTests.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.apps.repository.core.internal;
+
+import static org.junit.Assert.assertEquals;
+
+import org.eclipse.virgo.apps.repository.core.HostedRepositoryInfo;
+import org.eclipse.virgo.apps.repository.core.internal.StandardHostedRepositoryInfo;
+import org.junit.Test;
+
+
+/**
+ * Tests for {@link StandardHostedRepositoryInfo}
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Test-safe
+ * 
+ */
+public class StandardHostedRepositoryInfoTests {
+
+    @Test
+    public void testCreateStandardHostedRepositoryInfo() {
+        String uriPrefix = "uriPrefix";
+        String localName = "localName";
+        HostedRepositoryInfo hri = new StandardHostedRepositoryInfo(uriPrefix, localName);
+        assertEquals("uriPrefix not on info mBean", uriPrefix, hri.getUriPrefix());
+        assertEquals("localRepositoryName not on info mBean", localName, hri.getLocalRepositoryName());
+    }
+}
diff --git a/apps/org.eclipse.virgo.apps.repository.core/src/test/java/org/eclipse/virgo/apps/repository/core/internal/StandardRepositoryManagerTests.java b/apps/org.eclipse.virgo.apps.repository.core/src/test/java/org/eclipse/virgo/apps/repository/core/internal/StandardRepositoryManagerTests.java
new file mode 100644
index 0000000..c58932f
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.core/src/test/java/org/eclipse/virgo/apps/repository/core/internal/StandardRepositoryManagerTests.java
@@ -0,0 +1,103 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.apps.repository.core.internal;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.junit.Test;
+
+import org.eclipse.virgo.apps.repository.core.internal.HostedRepositoryObjectNameFactory;
+import org.eclipse.virgo.apps.repository.core.internal.StandardRepositoryManager;
+import org.eclipse.virgo.kernel.services.work.WorkArea;
+import org.eclipse.virgo.medic.test.eventlog.MockEventLogger;
+import org.eclipse.gemini.web.core.ConnectorDescriptor;
+import org.eclipse.gemini.web.core.WebContainerProperties;
+import org.eclipse.virgo.repository.ArtifactBridge;
+import org.eclipse.virgo.repository.Repository;
+import org.eclipse.virgo.repository.RepositoryFactory;
+import org.eclipse.virgo.repository.configuration.ExternalStorageRepositoryConfiguration;
+import org.eclipse.virgo.repository.configuration.RepositoryConfiguration;
+import org.eclipse.virgo.repository.ArtifactDescriptorPersister;
+import org.eclipse.virgo.util.io.PathReference;
+
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.isA;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+/**
+ * Tests for {@link StandardRepositoryManager}
+ */
+public class StandardRepositoryManagerTests {
+    
+    private final MockEventLogger eventLogger = new MockEventLogger();
+
+    
+    private final Repository repository = createMock(Repository.class);
+    {
+        expect(this.repository.getName()).andReturn("testRepoName").atLeastOnce();
+        replay(this.repository);
+    }
+    
+    private final Map<String, RepositoryConfiguration> configurationMap = new HashMap<String, RepositoryConfiguration>();
+    {
+        final RepositoryConfiguration repositoryConfiguration 
+        = new ExternalStorageRepositoryConfiguration("testRepoName", new File("build/indexDir"), new HashSet<ArtifactBridge>(), "testDirToWatch", "testHostRepoDomain");
+        this.configurationMap.put("testRepoName", repositoryConfiguration);
+    }
+    
+    private final WorkArea workArea = createMock(WorkArea.class);
+    {
+        PathReference pathRef = new PathReference("abc");
+        expect(this.workArea.getWorkDirectory()).andReturn(pathRef).atLeastOnce();
+        replay(this.workArea);
+    }
+
+    private final HostedRepositoryObjectNameFactory objectNameFactory = new HostedRepositoryObjectNameFactory("testDomain");
+    
+
+    @Test
+    public void createOK() throws Exception {
+        WebContainerProperties webContainerProperties = createMock(WebContainerProperties.class);
+        Set<ConnectorDescriptor> mockConnectors = new HashSet<ConnectorDescriptor>();
+        ConnectorDescriptor mockConnectorDescriptor = createMock(ConnectorDescriptor.class);
+        expect(mockConnectorDescriptor.sslEnabled()).andReturn(false);
+        expect(mockConnectorDescriptor.getScheme()).andReturn("http-8080");
+        expect(mockConnectorDescriptor.getPort()).andReturn(8080);
+        mockConnectors.add(mockConnectorDescriptor);
+        expect(webContainerProperties.getConnectorDescriptors()).andReturn(mockConnectors);
+        
+        RepositoryFactory repositoryFactory = createMock(RepositoryFactory.class);
+        expect(repositoryFactory.createRepository(isA(RepositoryConfiguration.class), isA(ArtifactDescriptorPersister.class))).andReturn(this.repository);
+        
+        replay(repositoryFactory, webContainerProperties, mockConnectorDescriptor);
+        
+        final StandardRepositoryManager srm = new StandardRepositoryManager(this.configurationMap, repositoryFactory, this.objectNameFactory, webContainerProperties, this.eventLogger);
+        
+        assertEquals("Events logged during creation", new ArrayList<String>(), this.eventLogger.getLoggedEvents());
+        srm.start();
+        srm.stop();
+        assertEquals("Events were logged during start or stop", new ArrayList<String>(), this.eventLogger.getLoggedEvents());
+        assertNotNull("Repository index not created", srm.getIndex("testRepoName"));
+        
+        verify(repositoryFactory, webContainerProperties, mockConnectorDescriptor);
+    }
+}
diff --git a/apps/org.eclipse.virgo.apps.repository.core/src/test/java/org/eclipse/virgo/apps/repository/core/internal/StubFilePool.java b/apps/org.eclipse.virgo.apps.repository.core/src/test/java/org/eclipse/virgo/apps/repository/core/internal/StubFilePool.java
new file mode 100644
index 0000000..fa7caa6
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.core/src/test/java/org/eclipse/virgo/apps/repository/core/internal/StubFilePool.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.apps.repository.core.internal;
+
+import java.io.File;
+
+import org.eclipse.virgo.apps.repository.core.internal.FilePool;
+import org.eclipse.virgo.apps.repository.core.internal.FilePoolException;
+
+
+
+/**
+ * {@link FilePool} used for testing
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ * Immutable and thread-safe
+ *
+ */
+class StubFilePool implements FilePool {
+
+    private File soleFile;
+    private File nextFile;
+    
+    /**
+     * null parameters mean pool empty, or no next file respectively.
+     * @param soleFile file in pool
+     * @param nextFile next file for generate call
+     */
+    public StubFilePool(File soleFile, File nextFile) {
+        this.soleFile = soleFile;
+        this.nextFile = nextFile;
+    }
+    
+    /** 
+     * {@inheritDoc}
+     */
+    public File generateNextPoolFile() throws FilePoolException {
+        if (this.nextFile==null) 
+            throw new FilePoolException("Stub: no next file.");
+        return this.nextFile;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public File getMostRecentPoolFile() throws FilePoolException {
+        if (this.soleFile==null)
+            throw new FilePoolException("Stub: pool empty");
+        return this.soleFile;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void putFileInPool(File indexFile) {
+        if (indexFile != this.nextFile) 
+            return;
+        this.soleFile = indexFile;
+        this.nextFile = null;
+    }
+
+    /**
+     * For testing only
+     * @param nextFile for generate call.
+     */
+    void setNextFile(File nextFile) {
+        this.nextFile = nextFile;
+    }
+    
+}
diff --git a/apps/org.eclipse.virgo.apps.repository.core/src/test/resources/.gitignore b/apps/org.eclipse.virgo.apps.repository.core/src/test/resources/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.core/src/test/resources/.gitignore
diff --git a/apps/org.eclipse.virgo.apps.repository.core/template.mf b/apps/org.eclipse.virgo.apps.repository.core/template.mf
new file mode 100644
index 0000000..62e7d47
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.core/template.mf
@@ -0,0 +1,17 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Hosted Provisioning Repository
+Bundle-SymbolicName: org.eclipse.virgo.apps.repository.core
+Bundle-Version: ${version}
+Import-Template:
+ org.eclipse.virgo.medic.*;version="${version:[=.=.=, +1)}",
+ org.eclipse.virgo.kernel.*;version="${version:[=.=.=, +1)}",
+ org.eclipse.virgo.repository.*;version="${version:[=.=.=, +1)}",
+ org.eclipse.gemini.web.*;version="${geminiWebVersion:[=.=.=, +1)}",
+ org.eclipse.virgo.util.*;version="${version:[=.=.=, +1)}",
+ org.aspectj.*;version="${aspectjVersion:[=.=.=, +1)}",
+ org.osgi.framework.*;version="0",
+ javax.management.*;version="0",
+ org.slf4j.*;version="0"
+Excluded-Exports:
+ org.eclipse.virgo.apps.repository.core.internal.*
diff --git a/apps/org.eclipse.virgo.apps.repository.test/.settings/org.eclipse.jdt.core.prefs b/apps/org.eclipse.virgo.apps.repository.test/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..22fa368
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.test/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,12 @@
+#Wed Apr 01 16:34:16 BST 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
diff --git a/apps/org.eclipse.virgo.apps.repository.test/.settings/org.eclipse.virgo.ide.bundlor.core.prefs b/apps/org.eclipse.virgo.apps.repository.test/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
new file mode 100644
index 0000000..7241a08
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.test/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
@@ -0,0 +1,3 @@
+#Wed Jun 10 16:13:51 BST 2009
+com.springsource.server.ide.bundlor.core.template.properties.files=../build.properties;../build.versions
+eclipse.preferences.version=1
diff --git a/apps/org.eclipse.virgo.apps.repository.test/.settings/org.eclipse.wst.common.project.facet.core.xml b/apps/org.eclipse.virgo.apps.repository.test/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..92aa290
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.test/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+  <installed facet="org.eclipse.virgo.server.bundle" version="1.0"/>
+</faceted-project>
diff --git a/apps/org.eclipse.virgo.apps.repository.test/.springBeans b/apps/org.eclipse.virgo.apps.repository.test/.springBeans
new file mode 100644
index 0000000..d079ca1
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.test/.springBeans
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beansProjectDescription>
+	<version>1</version>
+	<pluginVersion><![CDATA[2.2.4.RELEASE]]></pluginVersion>
+	<configSuffixes>
+		<configSuffix><![CDATA[xml]]></configSuffix>
+	</configSuffixes>
+	<enableImports><![CDATA[false]]></enableImports>
+	<configs>
+	</configs>
+	<configSets>
+	</configSets>
+</beansProjectDescription>
diff --git a/apps/org.eclipse.virgo.apps.repository.test/build.xml b/apps/org.eclipse.virgo.apps.repository.test/build.xml
new file mode 100644
index 0000000..83b7db1
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.test/build.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="org.eclipse.virgo.apps.repository.test" xmlns:ivy="antlib:org.apache.ivy.ant">
+
+	<property file="${basedir}/../build.properties"/>
+	<property file="${basedir}/../build.versions"/>
+	<import file="${basedir}/../virgo-build/standard/default.xml"/>
+	
+	<target name="resolve.test" depends="common-common.resolve.test">
+            <ivy:resolve file="${basedir}/ivy.xml" conf="download"/>
+    </target>
+
+</project>
diff --git a/apps/org.eclipse.virgo.apps.repository.test/ivy.xml b/apps/org.eclipse.virgo.apps.repository.test/ivy.xml
new file mode 100644
index 0000000..d1a4c5d
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.test/ivy.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="http://ivyrep.jayasoft.org/ivy-doc.xsl"?>
+<ivy-module
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:noNamespaceSchemaLocation="http://incubator.apache.org/ivy/schemas/ivy.xsd"
+		version="1.3">
+
+	<info organisation="org.eclipse.virgo.server" module="${ant.project.name}">
+		<ivyauthor name="awilkinson"/>
+	</info>
+
+	<configurations>
+		<include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>
+		<conf name="download" visibility="private" description="Dependencies to be downloaded, but not to be added to the classpath"/>
+	</configurations>
+
+	<publications>
+		<artifact name="${ant.project.name}"/>
+		<artifact name="${ant.project.name}-sources" type="src" ext="jar"/>
+	</publications>
+
+	<dependencies>
+		<dependency org="org.junit" name="com.springsource.org.junit" rev="${org.junit}" conf="test->runtime"/>
+        <dependency org="org.eclipse.virgo.nano" name="org.eclipse.virgo.nano.core" rev="${org.eclipse.virgo.nano}" conf="test->runtime"/>
+        <dependency org="org.eclipse.virgo.nano" name="org.eclipse.virgo.nano.deployer.api" rev="${org.eclipse.virgo.nano}" conf="test->runtime"/>
+        <dependency org="org.eclipse.virgo.nano" name="org.eclipse.virgo.nano.deployer.hot" rev="${org.eclipse.virgo.nano}" conf="test->runtime"/>
+        <dependency org="org.eclipse.virgo.nano" name="org.eclipse.virgo.nano.management" rev="${org.eclipse.virgo.nano}" conf="test->compile"/>
+		<dependency org="org.eclipse.virgo.kernel" name="org.eclipse.virgo.kernel" rev="${org.eclipse.virgo.kernel}" conf="test->runtime"/>
+		<dependency org="org.eclipse.virgo.kernel" name="org.eclipse.virgo.kernel.services" rev="${org.eclipse.virgo.kernel}" conf="test->runtime"/>
+		<dependency org="org.eclipse.virgo.kernel" name="org.eclipse.virgo.kernel.osgi" rev="${org.eclipse.virgo.kernel}" conf="test->runtime"/>		
+		<dependency org="org.eclipse.virgo.web" name="org.eclipse.virgo.web.tomcat" rev="${org.eclipse.virgo.web}" conf="download->runtime"/>
+		<dependency org="org.eclipse.virgo.test" name="org.eclipse.virgo.test.framework" rev="${org.eclipse.virgo.test}" conf="test->runtime"/>
+		<dependency org="org.eclipse.virgo.apps" name="org.eclipse.virgo.apps.repository.core" rev="latest.integration"/>
+        <dependency org="org.eclipse.virgo.mirrored" name="org.slf4j.jcl" rev="${org.slf4j.jcl}" conf="test->runtime"/>
+        <dependency org="org.eclipse.virgo.mirrored" name="org.slf4j.jul" rev="${org.slf4j.jul}" conf="test->runtime"/>
+        <dependency org="org.springframework" name="org.springframework.spring-library" rev="${org.springframework}" conf="test->runtime"/>
+        <dependency org="org.eclipse.virgo.mirrored" name="javax.jms" rev="${javax.jms}" conf="test->runtime"/>
+
+		<!-- Prevent Xerces and Xalan from being on the classpath to work around Java bug 6723276 during integration testing -->
+		<exclude org="org.apache.xerces"/>
+		<exclude org="org.apache.xalan"/>
+	</dependencies>
+
+</ivy-module>
diff --git a/apps/org.eclipse.virgo.apps.repository.test/src/main/java/.gitignore b/apps/org.eclipse.virgo.apps.repository.test/src/main/java/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.test/src/main/java/.gitignore
diff --git a/apps/org.eclipse.virgo.apps.repository.test/src/test/java/org/eclipse/virgo/apps/repository/test/HostedRepositoryIntegrationTests.java b/apps/org.eclipse.virgo.apps.repository.test/src/test/java/org/eclipse/virgo/apps/repository/test/HostedRepositoryIntegrationTests.java
new file mode 100644
index 0000000..b3da0d1
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.test/src/test/java/org/eclipse/virgo/apps/repository/test/HostedRepositoryIntegrationTests.java
@@ -0,0 +1,117 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.apps.repository.test;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.virgo.nano.deployer.api.core.ApplicationDeployer;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentOptions;
+import org.eclipse.virgo.test.framework.OsgiTestRunner;
+import org.eclipse.virgo.util.io.PathReference;
+import org.eclipse.virgo.util.io.ZipUtils;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventConstants;
+import org.osgi.service.event.EventHandler;
+
+@RunWith(OsgiTestRunner.class)
+@Ignore("[DMS-2878]")
+public class HostedRepositoryIntegrationTests {
+
+    private final static File INDEX_LOCATION = new File("build/work/org.eclipse.virgo.apps.repository.core_2.0.0/integration-test.index");
+
+    private final static File W_INDEX_LOCATION = new File("build/work/org.eclipse.virgo.apps.repository.core_2.0.0/watched-integration-test.index");
+
+    private static boolean appDeployed = false;
+    
+    private ApplicationDeployer deployer;
+    
+    @BeforeClass
+    public static void awaitDeploymentOfInitialArtifacts() throws InterruptedException {
+    	final CountDownLatch latch = new CountDownLatch(1);
+    	
+    	EventHandler eventHandler = new EventHandler() {
+			public void handleEvent(Event event) {
+				if ("org/eclipse/virgo/kernel/deployer/systemartifacts/DEPLOYED".equals(event.getTopic())) {
+					latch.countDown();
+				}				
+			}    		
+    	};
+    	
+    	Dictionary<String, String> properties = new Hashtable<String, String>();
+    	properties.put(EventConstants.EVENT_TOPIC, "org/eclipse/virgo/kernel/deployer/*");
+    	FrameworkUtil.getBundle(HostedRepositoryIntegrationTests.class).getBundleContext().registerService(EventHandler.class, eventHandler, properties);
+    	
+    	if (!latch.await(30, TimeUnit.SECONDS)) {
+    		fail("Deployment of system artifacts did not complete within 30 seconds");
+    	}
+    }
+
+    @Before
+    public void setup() throws Exception {
+    	
+    	BundleContext bundleContext = FrameworkUtil.getBundle(getClass()).getBundleContext();
+    	
+    	ServiceReference<ApplicationDeployer> serviceReference = bundleContext.getServiceReference(ApplicationDeployer.class);
+        this.deployer = bundleContext.getService(serviceReference);
+    	
+        if (!appDeployed) {
+            deployHostedRepositoryApp();
+        }
+    }
+
+	private void deployHostedRepositoryApp() throws DeploymentException,
+			IOException {
+		if (INDEX_LOCATION.exists()) {
+		    assertTrue(INDEX_LOCATION.delete());
+		}
+		if (W_INDEX_LOCATION.exists()) {
+		    assertTrue(W_INDEX_LOCATION.delete());
+		}		
+		
+		DeploymentOptions deploymentOptions = new DeploymentOptions(false, false, true);
+		deployer.deploy(new File("../org.eclipse.virgo.apps.repository.core/target/classes").toURI(), deploymentOptions);
+		deployer.deploy(packageWebModule().toURI(), deploymentOptions);                        
+
+		appDeployed = true;
+	}
+
+    private static PathReference packageWebModule() throws IOException {
+        PathReference packagedModule = new PathReference("build/org.eclipse.virgo.apps.repository.web.war");
+        if (packagedModule.exists()) {
+            assertTrue(packagedModule.delete());
+        }
+        ZipUtils.zipTo(new PathReference("../org.eclipse.virgo.apps.repository.web/target/war-expanded"), packagedModule);
+        return packagedModule;
+    }
+
+    @Test(timeout=60000)
+    public void deploymentOfBundleWithConstraintsSatisfiedFromHostedRepository() throws Exception {
+        this.deployer.deploy(new File("src/test/resources/b.jar").toURI());
+    }
+}
diff --git a/apps/org.eclipse.virgo.apps.repository.test/src/test/resources/META-INF/MANIFEST.MF b/apps/org.eclipse.virgo.apps.repository.test/src/test/resources/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..cd3d892
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.test/src/test/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,17 @@
+Manifest-Version: 1.0

+Export-Package: config;version="3.0.0",config.management;version="3.0.

+ 0",hosted;version="3.0.0",org.eclipse.virgo.apps.repository.test;vers

+ ion="3.0.0";uses:="org.eclipse.virgo.util.io,org.junit,org.junit.runn

+ er,org.osgi.service.event",watched;version="3.0.0"

+Bundle-Vendor: SpringSource Inc.

+Bundle-ClassPath: .,b.jar,c.jar,hosted/a.jar,b.jar,c.jar,hosted/a.jar

+Bundle-Version: 3.0.0

+Tool: Bundlor 1.0.0.RELEASE

+Bundle-Name: Hosted Provisioning Repository Test

+Bundle-ManifestVersion: 2

+Bundle-SymbolicName: org.eclipse.virgo.apps.repository.test

+Import-Package: org.eclipse.virgo.nano.deployer.api.core;version="[3.0

+ .0,4)",org.eclipse.virgo.util.io;version="[3.0.0,4)",org.junit;versio

+ n="[4.7.0,5)",org.junit.runner;version="[4.7.0,5)",org.osgi.framework

+ ;version="0",org.osgi.service.event

+

diff --git a/apps/org.eclipse.virgo.apps.repository.test/src/test/resources/META-INF/test.config.properties b/apps/org.eclipse.virgo.apps.repository.test/src/test/resources/META-INF/test.config.properties
new file mode 100644
index 0000000..be66711
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.test/src/test/resources/META-INF/test.config.properties
@@ -0,0 +1,64 @@
+launcher.bundles =\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.slf4j.api/${org.slf4j.api}/org.slf4j.api-${org.slf4j.api}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.slf4j.jul/${org.slf4j.jul}/org.slf4j.jul-${org.slf4j.jul}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.slf4j.jcl/${org.slf4j.jcl}/org.slf4j.jcl-${org.slf4j.jcl}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/com.springsource.org.aspectj.runtime/${org.aspectj}/com.springsource.org.aspectj.runtime-${org.aspectj}.jar@start,\
+ file:${integration.repo.dir}/org.eclipse.virgo.medic/org.eclipse.virgo.medic/${org.eclipse.virgo.medic}/org.eclipse.virgo.medic-${org.eclipse.virgo.medic}.jar@start,\
+ file:${integration.repo.dir}/org.eclipse.virgo.medic/org.eclipse.virgo.medic.core/${org.eclipse.virgo.medic}/org.eclipse.virgo.medic.core-${org.eclipse.virgo.medic}.jar@start,\
+ file:${integration.repo.dir}/org.eclipse.virgo.util/org.eclipse.virgo.util.osgi/${org.eclipse.virgo.util}/org.eclipse.virgo.util.osgi-${org.eclipse.virgo.util}.jar@start,\
+ file:${integration.repo.dir}/org.eclipse.virgo.util/org.eclipse.virgo.util.osgi.manifest/${org.eclipse.virgo.util}/org.eclipse.virgo.util.osgi.manifest-${org.eclipse.virgo.util}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.eclipse.osgi.services/${org.eclipse.osgi.services}/org.eclipse.osgi.services-${org.eclipse.osgi.services}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.eclipse.equinox.cm/${org.eclipse.equinox.cm}/org.eclipse.equinox.cm-${org.eclipse.equinox.cm}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.eclipse.equinox.event/${org.eclipse.equinox.event}/org.eclipse.equinox.event-${org.eclipse.equinox.event}.jar@start,\
+ file:${integration.repo.dir}/org.eclipse.virgo.util/org.eclipse.virgo.util.common/${org.eclipse.virgo.util}/org.eclipse.virgo.util.common-${org.eclipse.virgo.util}.jar@start,\
+ file:${integration.repo.dir}/org.eclipse.virgo.util/org.eclipse.virgo.util.io/${org.eclipse.virgo.util}/org.eclipse.virgo.util.io-${org.eclipse.virgo.util}.jar@start,\
+ file:${integration.repo.dir}/org.eclipse.virgo.util/org.eclipse.virgo.util.math/${org.eclipse.virgo.util}/org.eclipse.virgo.util.math-${org.eclipse.virgo.util}.jar@start,\
+ file:${integration.repo.dir}/org.eclipse.virgo.util/org.eclipse.virgo.util.parser.manifest/${org.eclipse.virgo.util}/org.eclipse.virgo.util.parser.manifest-${org.eclipse.virgo.util}.jar@start,\
+ file:${integration.repo.dir}/org.eclipse.virgo.util/org.eclipse.virgo.util.parser.launcher/${org.eclipse.virgo.util}/org.eclipse.virgo.util.parser.launcher-${org.eclipse.virgo.util}.jar@start,\
+ file:${ivy.cache}/repository/org.apache.commons/com.springsource.org.apache.commons.codec/1.3.0/com.springsource.org.apache.commons.codec-1.3.0.jar@start,\
+ file:${ivy.cache}/repository/org.apache.commons/com.springsource.org.apache.commons.httpclient/3.1.0/com.springsource.org.apache.commons.httpclient-3.1.0.jar@start,\
+ file:${integration.repo.dir}/org.eclipse.virgo.repository/org.eclipse.virgo.repository/${org.eclipse.virgo.repository}/org.eclipse.virgo.repository-${org.eclipse.virgo.repository}.jar@start,\
+ file:${ivy.cache}/repository/org.springframework/org.springframework.aop/3.1.0.RELEASE/org.springframework.aop-3.1.0.RELEASE.jar,\
+ file:${ivy.cache}/repository/org.springframework/org.springframework.asm/3.1.0.RELEASE/org.springframework.asm-3.1.0.RELEASE.jar,\
+ file:${ivy.cache}/repository/org.springframework/org.springframework.expression/3.1.0.RELEASE/org.springframework.expression-3.1.0.RELEASE.jar,\
+ file:${ivy.cache}/repository/org.springframework/org.springframework.beans/3.1.0.RELEASE/org.springframework.beans-3.1.0.RELEASE.jar,\
+ file:${ivy.cache}/repository/org.springframework/org.springframework.core/3.1.0.RELEASE/org.springframework.core-3.1.0.RELEASE.jar,\
+ file:${ivy.cache}/repository/org.springframework/org.springframework.context/3.1.0.RELEASE/org.springframework.context-3.1.0.RELEASE.jar,\
+ file:${integration.repo.dir}/org.eclipse.virgo.nano/org.eclipse.virgo.nano.core/${org.eclipse.virgo.nano}/org.eclipse.virgo.nano.core-${org.eclipse.virgo.nano}.jar@start,\
+ file:${integration.repo.dir}/org.eclipse.virgo.nano/org.eclipse.virgo.nano.deployer.api/${org.eclipse.virgo.nano}/org.eclipse.virgo.nano.deployer.api-${org.eclipse.virgo.nano}.jar,\
+ file:${integration.repo.dir}/org.eclipse.virgo.nano/org.eclipse.virgo.nano.deployer.hot/${org.eclipse.virgo.nano}/org.eclipse.virgo.nano.deployer.hot-${org.eclipse.virgo.nano}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.nano/org.eclipse.virgo.nano.management/${org.eclipse.virgo.nano}/org.eclipse.virgo.nano.management-${org.eclipse.virgo.nano}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.gemini/org.eclipse.gemini.blueprint.core/2.0.0.M02/org.eclipse.gemini.blueprint.core-2.0.0.M02.jar,\
+ file:${ivy.cache}/repository/org.eclipse.gemini/org.eclipse.gemini.blueprint.extender/2.0.0.M02/org.eclipse.gemini.blueprint.extender-2.0.0.M02.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.gemini/org.eclipse.gemini.blueprint.io/2.0.0.M02/org.eclipse.gemini.blueprint.io-2.0.0.M02.jar,\
+ file:${ivy.cache}/repository/org.aopalliance/com.springsource.org.aopalliance/1.0.0/com.springsource.org.aopalliance-1.0.0.jar,\
+ file:${integration.repo.dir}/org.eclipse.virgo.kernel/org.eclipse.virgo.kernel.artifact/${org.eclipse.virgo.kernel}/org.eclipse.virgo.kernel.artifact-${org.eclipse.virgo.kernel}.jar@start,\
+ file:${integration.repo.dir}/org.eclipse.virgo.kernel/org.eclipse.virgo.kernel.services/${org.eclipse.virgo.kernel}/org.eclipse.virgo.kernel.services-${org.eclipse.virgo.kernel}.jar@start,\
+ file:${integration.repo.dir}/org.eclipse.virgo.kernel/org.eclipse.virgo.kernel.osgi/${org.eclipse.virgo.kernel}/org.eclipse.virgo.kernel.osgi-${org.eclipse.virgo.kernel}.jar@start,\
+ file:${integration.repo.dir}/org.eclipse.virgo.kernel/org.eclipse.virgo.kernel.deployer/${org.eclipse.virgo.kernel}/org.eclipse.virgo.kernel.deployer-${org.eclipse.virgo.kernel}.jar@start,\
+ file:${integration.repo.dir}/org.eclipse.virgo.kernel/org.eclipse.virgo.kernel.dmfragment/${org.eclipse.virgo.kernel}/org.eclipse.virgo.kernel.dmfragment-${org.eclipse.virgo.kernel}.jar,\
+ file:${integration.repo.dir}/org.eclipse.virgo.kernel/org.eclipse.virgo.kernel.deployer.dm/${org.eclipse.virgo.kernel}/org.eclipse.virgo.kernel.deployer.dm-${org.eclipse.virgo.kernel}.jar@start,\
+
+org.eclipse.virgo.test.properties.include=file:../build.versions,file:../user-ivy.properties
+
+#Equinox Configuration 
+osgi.parentClassloader=fwk
+osgi.context.bootdelegation=false
+osgi.compatibility.bootdelegation=false
+osgi.clean=true
+osgi.configuration.area=target
+
+osgi.java.profile=file:../java-server.profile
+osgi.java.profile.bootdelegation=override
+osgi.hook.configurators.include=org.eclipse.virgo.kernel.equinox.extensions.hooks.ExtensionsHookConfigurator
+
+org.eclipse.virgo.kernel.home=target
+org.eclipse.virgo.kernel.domain=org.eclipse.virgo.kernel
+# Paths are relative to the current working directory
+org.eclipse.virgo.kernel.config=src/test/resources/config
+
+org.eclipse.virgo.medic.log.config.path=src/test/resources/config/serviceability.xml
+
+org.eclipse.gemini.web.tomcat.config.path=src/test/resources/config/tomcat-server.xml
+
+org.eclipse.virgo.kernel.deployer.disableRecovery=true
diff --git a/apps/org.eclipse.virgo.apps.repository.test/src/test/resources/b.jar b/apps/org.eclipse.virgo.apps.repository.test/src/test/resources/b.jar
new file mode 100644
index 0000000..4e68452
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.test/src/test/resources/b.jar
Binary files differ
diff --git a/apps/org.eclipse.virgo.apps.repository.test/src/test/resources/c.jar b/apps/org.eclipse.virgo.apps.repository.test/src/test/resources/c.jar
new file mode 100644
index 0000000..225c5c7
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.test/src/test/resources/c.jar
Binary files differ
diff --git a/apps/org.eclipse.virgo.apps.repository.test/src/test/resources/config/management/keystore b/apps/org.eclipse.virgo.apps.repository.test/src/test/resources/config/management/keystore
new file mode 100644
index 0000000..bdd4dcd
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.test/src/test/resources/config/management/keystore
Binary files differ
diff --git a/apps/org.eclipse.virgo.apps.repository.test/src/test/resources/config/org.eclipse.virgo.apps.repository.properties b/apps/org.eclipse.virgo.apps.repository.test/src/test/resources/config/org.eclipse.virgo.apps.repository.properties
new file mode 100644
index 0000000..1af97b4
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.test/src/test/resources/config/org.eclipse.virgo.apps.repository.properties
@@ -0,0 +1,6 @@
+integration-test.type=external
+integration-test.searchPattern=src/test/resources/hosted/*
+
+watched-integration-test.type=watched
+watched-integration-test.watchDirectory=src/test/resources/watched
+watched-integration-test.watchInterval=1
diff --git a/apps/org.eclipse.virgo.apps.repository.test/src/test/resources/config/org.eclipse.virgo.kernel.properties b/apps/org.eclipse.virgo.apps.repository.test/src/test/resources/config/org.eclipse.virgo.kernel.properties
new file mode 100644
index 0000000..2f894c9
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.test/src/test/resources/config/org.eclipse.virgo.kernel.properties
@@ -0,0 +1,5 @@
+deployer.timeout=			300
+deployer.pickupDirectory=	target/pickup
+deployer.systemArtifacts=	repository:plan/org.eclipse.virgo.web.tomcat
+shell.enabled=				true
+shell.port=					2401
diff --git a/apps/org.eclipse.virgo.apps.repository.test/src/test/resources/config/org.eclipse.virgo.medic.properties b/apps/org.eclipse.virgo.apps.repository.test/src/test/resources/config/org.eclipse.virgo.medic.properties
new file mode 100644
index 0000000..9a52283
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.test/src/test/resources/config/org.eclipse.virgo.medic.properties
@@ -0,0 +1,3 @@
+dump.root.directory=target/serviceability/dump
+log.wrapSysOut=true
+log.wrapSysErr=true
diff --git a/apps/org.eclipse.virgo.apps.repository.test/src/test/resources/config/org.eclipse.virgo.repository.properties b/apps/org.eclipse.virgo.apps.repository.test/src/test/resources/config/org.eclipse.virgo.repository.properties
new file mode 100644
index 0000000..997d904
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.test/src/test/resources/config/org.eclipse.virgo.repository.properties
@@ -0,0 +1,15 @@
+artifacts.type=external
+artifacts.searchPattern=../{bundle}/target/artifacts/*
+
+ivy-cache.type=external
+ivy-cache.searchPattern=${user.home}/virgo-build-cache/ivy-cache/repository/{org}/{name}/{version}/*
+
+remote.type=remote
+remote.uri=http://localhost:8080/org.eclipse.virgo.server.repository/integration-test
+remote.indexRefreshInterval=1
+
+remote-watched.type=remote
+remote-watched.uri=http://localhost:8080/org.eclipse.virgo.server.repository/watched-integration-test
+remote.indexRefreshInterval=1
+
+chain=artifacts,ivy-cache,remote,remote-watched
diff --git a/apps/org.eclipse.virgo.apps.repository.test/src/test/resources/config/serviceability.xml b/apps/org.eclipse.virgo.apps.repository.test/src/test/resources/config/serviceability.xml
new file mode 100644
index 0000000..c44cff0
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.test/src/test/resources/config/serviceability.xml
@@ -0,0 +1,57 @@
+<configuration>
+
+	<jmxConfigurator />
+
+	<appender name="LOG_STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+			<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-24.24thread %msg %ex%n</Pattern>
+		</encoder>
+	</appender>
+
+	<appender name="LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<file>target/serviceability/log/log.log</file>
+		<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+			<FileNamePattern>target/serviceability/log/log_%i.log</FileNamePattern>
+			<MinIndex>1</MinIndex>
+			<MaxIndex>4</MaxIndex>
+		</rollingPolicy>
+		<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+			<MaxFileSize>10MB</MaxFileSize>
+		</triggeringPolicy>
+		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+			<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-24.24thread %msg %ex%n</Pattern>
+		</encoder>
+	</appender>
+
+	<appender name="EVENT_LOG_STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+			<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-24.24thread &lt;%X{medic.eventCode}&gt; %msg %ex%n</Pattern>
+		</encoder>
+	</appender>
+
+	<appender name="EVENT_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<file>target/serviceability/eventlog/eventlog.log</file>
+		<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+			<FileNamePattern>target/serviceability/eventlog/eventlog_%i.log</FileNamePattern>
+			<MinIndex>1</MinIndex>
+			<MaxIndex>4</MaxIndex>
+		</rollingPolicy>
+		<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+			<MaxFileSize>10MB</MaxFileSize>
+		</triggeringPolicy>
+		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+			<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-24.24thread &lt;%X{medic.eventCode}&gt; %msg %ex%n</Pattern>
+		</encoder>
+	</appender>
+
+	<logger name="org.eclipse.virgo.medic.eventlog.localized">
+		<appender-ref ref="EVENT_LOG_STDOUT" />
+		<appender-ref ref="EVENT_LOG_FILE" />
+	</logger>
+
+	<root level="INFO">
+		<!-- appender-ref ref="LOG_STDOUT" /-->
+		<appender-ref ref="LOG_FILE" />
+	</root>
+
+</configuration>
diff --git a/apps/org.eclipse.virgo.apps.repository.test/src/test/resources/config/tomcat-server.xml b/apps/org.eclipse.virgo.apps.repository.test/src/test/resources/config/tomcat-server.xml
new file mode 100644
index 0000000..19a0533
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.test/src/test/resources/config/tomcat-server.xml
@@ -0,0 +1,74 @@
+<?xml version='1.0' encoding='utf-8'?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<!-- Note:  A "Server" is not itself a "Container", so you may not
+     define subcomponents such as "Valves" at this level.
+     Documentation at /docs/config/server.html
+ -->
+<Server>
+  <!--APR library loader. Documentation at /docs/apr.html -->
+  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
+  <!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html -->
+  <!-- Prevent memory leaks due to use of particular java/javax APIs-->
+  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
+  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
+  <Listener className="org.eclipse.virgo.web.tomcat.support.ServerLifecycleLoggingListener"/>
+
+  <!-- A "Service" is a collection of one or more "Connectors" that share
+       a single "Container" Note:  A "Service" is not itself a "Container",
+       so you may not define subcomponents such as "Valves" at this level.
+       Documentation at /docs/config/service.html
+   -->
+  <Service name="Catalina">
+
+
+    <!-- A "Connector" represents an endpoint by which requests are received
+         and responses are returned. Documentation at :
+         Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)
+         Java AJP  Connector: /docs/config/ajp.html
+         APR (HTTP/AJP) Connector: /docs/apr.html
+         Define a non-SSL HTTP/1.1 Connector on port 8080
+    -->
+    <Connector port="8080" protocol="HTTP/1.1"
+               connectionTimeout="20000"
+               redirectPort="8443" />
+
+    <!-- Define an AJP 1.3 Connector on port 8009 -->
+    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
+
+
+    <!-- An Engine represents the entry point (within Catalina) that processes
+         every request.  The Engine implementation for Tomcat stand alone
+         analyzes the HTTP headers included with the request, and passes them
+         on to the appropriate Host (virtual host).
+         Documentation at /docs/config/engine.html -->
+
+    <!-- You should set jvmRoute to support load-balancing via AJP ie :
+    <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
+    -->
+    <Engine name="Catalina" defaultHost="localhost">
+
+      <Valve className="org.eclipse.virgo.web.tomcat.support.ApplicationNameTrackingValve"/>
+
+      <!-- Define the default virtual host -->
+      <Host name="localhost" deployOnStartup="false" autoDeploy="false"
+            unpackWARs="false" appBase="" createDirs="false">
+            <Listener className="org.eclipse.virgo.web.tomcat.support.ApplicationNameTrackingListener"/>
+      </Host>
+    </Engine>
+  </Service>
+</Server>
diff --git a/apps/org.eclipse.virgo.apps.repository.test/src/test/resources/hosted/a.jar b/apps/org.eclipse.virgo.apps.repository.test/src/test/resources/hosted/a.jar
new file mode 100644
index 0000000..be7f1c7
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.test/src/test/resources/hosted/a.jar
Binary files differ
diff --git a/apps/org.eclipse.virgo.apps.repository.test/src/test/resources/watched/.gitignore b/apps/org.eclipse.virgo.apps.repository.test/src/test/resources/watched/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.test/src/test/resources/watched/.gitignore
diff --git a/apps/org.eclipse.virgo.apps.repository.test/template.mf b/apps/org.eclipse.virgo.apps.repository.test/template.mf
new file mode 100644
index 0000000..a946fb9
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.test/template.mf
@@ -0,0 +1,20 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Hosted Provisioning Repository Test
+Bundle-SymbolicName: org.eclipse.virgo.apps.repository.test
+Bundle-Version: ${version}
+Import-Template:
+ org.eclipse.virgo.kernel.*;version="${org.eclipse.virgo.kernel:[=.=.=, +1)}",
+ org.eclipse.virgo.nano.*;version="${version:[=.=.=, +1)}",
+ org.eclipse.virgo.repository.*;version="${version:[=.=.=, +1)}",
+ org.eclipse.virgo.util.*;version="${version:[=.=.=, +1)}",
+ org.eclipse.virgo.medic.*;version="${version:[=.=.=, +1)}",
+ org.eclipse.gemini.web.*;version="${org.eclipse.gemini.web:[=.=.=, +1)}",
+ org.aspectj.*;version="${aspectjVersion:[=.=.=, +1)}",
+ org.junit.*;version="${org.junit:[=.=.=, +1)}",
+ org.osgi.framework.*;version="0",
+ javax.management.*;version="0",
+ org.slf4j.*;version="0"
+Excluded-Imports:
+ org.eclipse.virgo,
+ org.eclipse.virgo.kernel.equinox.extensions.hooks
diff --git a/apps/org.eclipse.virgo.apps.repository.web/.settings/org.eclipse.virgo.ide.bundlor.core.prefs b/apps/org.eclipse.virgo.apps.repository.web/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
new file mode 100644
index 0000000..39d2950
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.web/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
@@ -0,0 +1,3 @@
+#Wed Jun 10 13:39:42 BST 2009
+com.springsource.server.ide.bundlor.core.template.properties.files=../build.properties;../build.versions
+eclipse.preferences.version=1
diff --git a/apps/org.eclipse.virgo.apps.repository.web/.settings/org.eclipse.wst.common.project.facet.core.xml b/apps/org.eclipse.virgo.apps.repository.web/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..92aa290
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.web/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+  <installed facet="org.eclipse.virgo.server.bundle" version="1.0"/>
+</faceted-project>
diff --git a/apps/org.eclipse.virgo.apps.repository.web/.springBeans b/apps/org.eclipse.virgo.apps.repository.web/.springBeans
new file mode 100644
index 0000000..836d8d2
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.web/.springBeans
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beansProjectDescription>
+	<version>1</version>
+	<pluginVersion><![CDATA[2.2.2.RC]]></pluginVersion>
+	<configSuffixes>
+		<configSuffix><![CDATA[xml]]></configSuffix>
+	</configSuffixes>
+	<enableImports><![CDATA[false]]></enableImports>
+	<configs>
+		<config>src/main/resources/META-INF/spring/module-context.xml</config>
+	</configs>
+	<configSets>
+	</configSets>
+</beansProjectDescription>
diff --git a/apps/org.eclipse.virgo.apps.repository.web/src/main/java/org/eclipse/virgo/apps/repository/web/RepositoryController.java b/apps/org.eclipse.virgo.apps.repository.web/src/main/java/org/eclipse/virgo/apps/repository/web/RepositoryController.java
new file mode 100644
index 0000000..ae37067
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.web/src/main/java/org/eclipse/virgo/apps/repository/web/RepositoryController.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.apps.repository.web;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.util.FileCopyUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import org.eclipse.virgo.apps.repository.core.RepositoryIndex;
+import org.eclipse.virgo.apps.repository.core.RepositoryManager;
+
+@Controller
+class RepositoryController {
+    
+    private final RepositoryManager repositoryManager;
+    
+    private static final String INDEX_CONTENT_TYPE = "application/org.eclipse.virgo.repository.Index";
+    
+    private static final String ARTEFACT_CONTENT_TYPE = "application/octet-stream";
+    
+    private static final String IF_NONE_MATCH_HEADER_NAME = "If-None-Match";
+    
+    private static final String ETAG_HEADER_NAME = "Etag";
+    
+    RepositoryController(RepositoryManager repositoryManager) {
+        this.repositoryManager = repositoryManager;
+    }
+    
+    @RequestMapping(method = RequestMethod.GET, value = "/*")
+    void getIndex(HttpServletRequest request, HttpServletResponse response) throws IOException {        
+        String path = request.getRequestURI();
+        String repository = path.substring(path.lastIndexOf('/') + 1);
+        
+        RepositoryIndex index = this.repositoryManager.getIndex(repository);
+        if (index != null) {
+            String indexETag = index.getETag();
+            
+            String eTagHeader = request.getHeader(IF_NONE_MATCH_HEADER_NAME);
+            if (eTagHeader != null) {
+                String[] eTags = eTagHeader.split(",");
+                for (String eTag : eTags) {
+                    if (eTag.equals(indexETag)) {
+                        response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
+                        return;
+                    }
+                }
+            }
+            
+            response.setContentType(INDEX_CONTENT_TYPE);
+            response.setContentLength(index.getLength());
+            response.addHeader(ETAG_HEADER_NAME, index.getETag());
+                                                
+            FileCopyUtils.copy(index.getInputStream(), response.getOutputStream());            
+        } else {
+            response.setStatus(HttpServletResponse.SC_NOT_FOUND);
+        }
+    }
+    
+    @RequestMapping(method = RequestMethod.GET, value="/*/*/*/*")
+    void getArtifact(HttpServletRequest request, HttpServletResponse response) throws IOException {
+        String requestUri = request.getRequestURI();
+        String[] uriComponents = requestUri.split("/");
+        
+        String repository = uriComponents[uriComponents.length - 4];
+        String type = uriComponents[uriComponents.length - 3];
+        String name = uriComponents[uriComponents.length - 2];
+        String version = uriComponents[uriComponents.length - 1];
+            
+        InputStream artefact = this.repositoryManager.getArtifact(repository, type, name, version);
+        if (artefact != null) {
+            response.setContentType(ARTEFACT_CONTENT_TYPE);
+            FileCopyUtils.copy(artefact, response.getOutputStream());
+        } else {
+            response.setStatus(HttpServletResponse.SC_NOT_FOUND);
+        }                      
+    }
+}
diff --git a/apps/org.eclipse.virgo.apps.repository.web/src/main/webapp/WEB-INF/applicationContext.xml b/apps/org.eclipse.virgo.apps.repository.web/src/main/webapp/WEB-INF/applicationContext.xml
new file mode 100644
index 0000000..28cc9a7
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.web/src/main/webapp/WEB-INF/applicationContext.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns:osgi="http://www.springframework.org/schema/osgi"
+	xsi:schemaLocation="
+		http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi.xsd
+		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
+
+	<osgi:reference id="repositoryManager" interface="org.eclipse.virgo.apps.repository.core.RepositoryManager"/>
+
+</beans>
diff --git a/apps/org.eclipse.virgo.apps.repository.web/src/main/webapp/WEB-INF/hostedrepo-servlet.xml b/apps/org.eclipse.virgo.apps.repository.web/src/main/webapp/WEB-INF/hostedrepo-servlet.xml
new file mode 100644
index 0000000..0cf005e
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.web/src/main/webapp/WEB-INF/hostedrepo-servlet.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="
+		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
+	
+	<bean id="controller" class="org.eclipse.virgo.apps.repository.web.RepositoryController">
+		<constructor-arg ref="repositoryManager"/>
+	</bean>
+
+</beans>
diff --git a/apps/org.eclipse.virgo.apps.repository.web/src/main/webapp/WEB-INF/web.xml b/apps/org.eclipse.virgo.apps.repository.web/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..f334d41
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.web/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<web-app version="2.5"
+    xmlns="http://java.sun.com/xml/ns/javaee"
+    xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
+    xsi:schemaLocation="
+        http://java.sun.com/xml/ns/javaee
+        http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
+
+    <servlet>
+        <servlet-name>hostedrepo</servlet-name>
+        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
+        <load-on-startup>2</load-on-startup>                
+    </servlet>
+
+    <servlet-mapping>
+        <servlet-name>hostedrepo</servlet-name>
+        <url-pattern>/*</url-pattern>
+    </servlet-mapping>
+    
+
+	<listener>
+		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
+	</listener>
+	
+	<context-param>
+		<param-name>contextClass</param-name>
+		<param-value>org.eclipse.virgo.web.dm.ServerOsgiBundleXmlWebApplicationContext</param-value>
+	</context-param>
+
+    <display-name>Virgo Hosted Repository Web application</display-name>
+
+    <description>Virgo Hosted Repository Web application</description>
+
+    
+</web-app>
diff --git a/apps/org.eclipse.virgo.apps.repository.web/src/test/java/org/eclipse/virgo/apps/repository/web/RepositoryControllerTests.java b/apps/org.eclipse.virgo.apps.repository.web/src/test/java/org/eclipse/virgo/apps/repository/web/RepositoryControllerTests.java
new file mode 100644
index 0000000..b3e4531
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.web/src/test/java/org/eclipse/virgo/apps/repository/web/RepositoryControllerTests.java
@@ -0,0 +1,135 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.apps.repository.web;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.virgo.apps.repository.web.RepositoryController;
+import org.junit.Before;
+import org.junit.Test;
+import org.springframework.mock.web.MockHttpServletRequest;
+import org.springframework.mock.web.MockHttpServletResponse;
+import org.eclipse.virgo.apps.repository.core.RepositoryIndex;
+import org.eclipse.virgo.apps.repository.core.RepositoryManager;
+
+public class RepositoryControllerTests {
+
+    private RepositoryManager repositoryManager;
+
+    private RepositoryController repositoryController;
+
+    @Before
+    public void setup() {
+        repositoryManager = createMock(RepositoryManager.class);
+        repositoryController = new RepositoryController(this.repositoryManager);
+    }
+
+    @Test
+    public void getIndex() throws Exception {
+        MockHttpServletRequest request = new MockHttpServletRequest();
+        MockHttpServletResponse response = new MockHttpServletResponse();
+
+        request.setRequestURI("http://localhost:8080/org.eclipse.virgo.server.repository/my-repo");
+        request.setMethod("GET");
+
+        byte[] indexBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };
+
+        RepositoryIndex repositoryIndex = createMock(RepositoryIndex.class);
+
+        try (InputStream indexBytesAsStream = new ByteArrayInputStream(indexBytes)) {
+            expect(repositoryIndex.getInputStream()).andReturn(indexBytesAsStream);
+            expect(repositoryIndex.getETag()).andReturn("123456789").anyTimes();
+            expect(repositoryIndex.getLength()).andReturn(indexBytes.length);
+            
+            expect(this.repositoryManager.getIndex("my-repo")).andReturn(repositoryIndex);
+            
+            replay(this.repositoryManager, repositoryIndex);
+            
+            repositoryController.getIndex(request, response);
+            
+            verify(this.repositoryManager, repositoryIndex);
+            
+            assertEquals("application/org.eclipse.virgo.repository.Index", response.getContentType());
+            assertArrayEquals(indexBytes, response.getContentAsByteArray());
+        }
+    }
+
+    @Test
+    public void getIndexForUnknownRepository() throws Exception {
+        MockHttpServletRequest request = new MockHttpServletRequest();
+        MockHttpServletResponse response = new MockHttpServletResponse();
+
+        request.setRequestURI("http://localhost:8080/org.eclipse.virgo.server.repository/my-repo");
+        request.setMethod("GET");
+
+        expect(this.repositoryManager.getIndex("my-repo")).andReturn(null);
+
+        replay(this.repositoryManager);
+
+        repositoryController.getIndex(request, response);
+
+        verify(this.repositoryManager);
+
+        assertEquals(response.getStatus(), HttpServletResponse.SC_NOT_FOUND);
+    }
+
+    @Test
+    public void getArtefact() throws Exception {
+        MockHttpServletRequest request = new MockHttpServletRequest();
+        MockHttpServletResponse response = new MockHttpServletResponse();
+
+        request.setRequestURI("http://localhost:8080/org.eclipse.virgo.server.repository/my-repo/bundle/com.foo/1.0.0");
+        request.setMethod("GET");
+
+        byte[] artefactBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };
+
+        expect(this.repositoryManager.getArtifact("my-repo", "bundle", "com.foo", "1.0.0")).andReturn(new ByteArrayInputStream(artefactBytes));
+
+        replay(this.repositoryManager);
+
+        repositoryController.getArtifact(request, response);
+
+        verify(this.repositoryManager);
+
+        assertEquals("application/octet-stream", response.getContentType());
+        assertArrayEquals(artefactBytes, response.getContentAsByteArray());
+    }
+
+    @Test
+    public void getUnknownArtefact() throws Exception {
+        MockHttpServletRequest request = new MockHttpServletRequest();
+        MockHttpServletResponse response = new MockHttpServletResponse();
+
+        request.setRequestURI("http://localhost:8080/org.eclipse.virgo.server.repository/my-repo/bundle/com.foo/1.0.0");
+        request.setMethod("GET");
+
+        expect(this.repositoryManager.getArtifact("my-repo", "bundle", "com.foo", "1.0.0")).andReturn(null);
+
+        replay(this.repositoryManager);
+
+        repositoryController.getArtifact(request, response);
+
+        verify(this.repositoryManager);
+
+        assertEquals(response.getStatus(), HttpServletResponse.SC_NOT_FOUND);
+    }
+}
diff --git a/apps/org.eclipse.virgo.apps.repository.web/template.mf b/apps/org.eclipse.virgo.apps.repository.web/template.mf
new file mode 100644
index 0000000..f3829e0
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.repository.web/template.mf
@@ -0,0 +1,17 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Hosted Provisioning Repository Web Interface
+Bundle-SymbolicName: org.eclipse.virgo.apps.repository.web
+Bundle-Version: ${version}
+Bundle-ClassPath: WEB-INF/classes
+Web-ContextPath: org.eclipse.virgo.apps.repository
+Import-Template: 
+ org.eclipse.virgo.apps.repository.*;version="${version:[=.=.=, =.=.+1)}",
+ javax.servlet.*;version="${javaxServletVersion:[2.5.0,+1)}",
+ org.springframework.*;version="${springframeworkVersion:[2.5.6, +1)}",
+ org.osgi.framework.*;version="0"
+Import-Package: 
+ org.springframework.web.context;version="${springframeworkVersion:[2.5.6, +1)}",
+ org.springframework.web.servlet;version="${springframeworkVersion:[2.5.6, +1)}",
+ org.eclipse.virgo.web.dm;version="${version:[=.=.=, +1)}",
+ org.springframework.beans.factory.xml;version="${springframeworkVersion:[2.5.6, +1)}"
diff --git a/apps/org.eclipse.virgo.apps.splash/.settings/.jsdtscope b/apps/org.eclipse.virgo.apps.splash/.settings/.jsdtscope
new file mode 100644
index 0000000..5d8de19
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.splash/.settings/.jsdtscope
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.WebProject">
+		<attributes>
+			<attribute name="hide" value="false"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.baseBrowserLibrary"/>
+	<classpathentry kind="output" path=""/>
+</classpath>
diff --git a/apps/org.eclipse.virgo.apps.splash/.settings/org.eclipse.virgo.ide.bundlor.core.prefs b/apps/org.eclipse.virgo.apps.splash/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
new file mode 100644
index 0000000..a427da3
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.splash/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
@@ -0,0 +1,2 @@
+org.eclipse.virgo.ide.bundlor.core.template.properties.files=../build.properties;../build.versions
+eclipse.preferences.version=1
\ No newline at end of file
diff --git a/apps/org.eclipse.virgo.apps.splash/.settings/org.eclipse.wst.common.component b/apps/org.eclipse.virgo.apps.splash/.settings/org.eclipse.wst.common.component
new file mode 100644
index 0000000..4f3ad83
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.splash/.settings/org.eclipse.wst.common.component
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project-modules id="moduleCoreId" project-version="1.5.0">
+<wb-module deploy-name="com.springsource.server.splash">
+<wb-resource deploy-path="/" source-path="/src/main/webapp"/>
+<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/java"/>
+        <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/resources"/>
+<property name="context-root" value=""/>
+<property name="java-output-path" value="/target/classes"/>
+</wb-module>
+</project-modules>
diff --git a/apps/org.eclipse.virgo.apps.splash/.settings/org.eclipse.wst.common.project.facet.core.xml b/apps/org.eclipse.virgo.apps.splash/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..6e25134
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.splash/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+  <fixed facet="jst.web"/>
+  <fixed facet="jst.java"/>
+  <installed facet="jst.web" version="2.5"/>
+  <installed facet="jst.java" version="6.0"/>
+  <installed facet="org.eclipse.virgo.server.bundle" version="1.0"/>
+</faceted-project>
diff --git a/apps/org.eclipse.virgo.apps.splash/.settings/org.eclipse.wst.jsdt.ui.superType.container b/apps/org.eclipse.virgo.apps.splash/.settings/org.eclipse.wst.jsdt.ui.superType.container
new file mode 100644
index 0000000..3bd5d0a
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.splash/.settings/org.eclipse.wst.jsdt.ui.superType.container
@@ -0,0 +1 @@
+org.eclipse.wst.jsdt.launching.baseBrowserLibrary
\ No newline at end of file
diff --git a/apps/org.eclipse.virgo.apps.splash/.settings/org.eclipse.wst.jsdt.ui.superType.name b/apps/org.eclipse.virgo.apps.splash/.settings/org.eclipse.wst.jsdt.ui.superType.name
new file mode 100644
index 0000000..05bd71b
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.splash/.settings/org.eclipse.wst.jsdt.ui.superType.name
@@ -0,0 +1 @@
+Window
\ No newline at end of file
diff --git a/apps/org.eclipse.virgo.apps.splash/.settings/org.springframework.ide.eclipse.core.prefs b/apps/org.eclipse.virgo.apps.splash/.settings/org.springframework.ide.eclipse.core.prefs
new file mode 100644
index 0000000..785f1a6
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.splash/.settings/org.springframework.ide.eclipse.core.prefs
@@ -0,0 +1,63 @@
+#Wed Jun 22 16:08:40 IST 2011
+eclipse.preferences.version=1
+org.springframework.ide.eclipse.core.builders.enable.aopreferencemodelbuilder=true
+org.springframework.ide.eclipse.core.builders.enable.beanmetadatabuilder=true
+org.springframework.ide.eclipse.core.builders.enable.osgibundleupdater=false
+org.springframework.ide.eclipse.core.enable.project.preferences=false
+org.springframework.ide.eclipse.core.validator.enable.com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.enable.com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.enable.org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.enable.org.springframework.ide.eclipse.core.springvalidator=false
+org.springframework.ide.eclipse.core.validator.enable.org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.applicationSymbolicNameRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.applicationVersionRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleActivationPolicyRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleActivatorRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleManifestVersionRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleSymbolicNameRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleVersionRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.exportPackageRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.importRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.parsingProblemsRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.requireBundleRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.AvoidDriverManagerDataSource-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.ImportElementsAtTopRulee-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.ParentBeanSpecifiesAbstractClassRule-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.RefElementRule-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.TooManyBeansInFileRule-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.UnnecessaryValueElementRule-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.UseBeanInheritance-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.legacyxmlusage.jndiobjectfactory-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.autowire.autowire-org.springframework.ide.eclipse.beans.core.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanAlias-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanClass-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanConstructorArgument-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanDefinition-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanDefinitionHolder-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanFactory-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanInitDestroyMethod-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanProperty-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanReference-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.methodOverride-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.parsingProblems-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.requiredProperty-org.springframework.ide.eclipse.beans.core.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.toolAnnotation-org.springframework.ide.eclipse.beans.core.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.core.springClasspath-org.springframework.ide.eclipse.core.springvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.action-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.actionstate-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.attribute-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.attributemapper-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.beanaction-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.evaluationaction-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.evaluationresult-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.exceptionhandler-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.import-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.inputattribute-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.mapping-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.outputattribute-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.set-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.state-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.subflowstate-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.transition-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.variable-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.webflowstate-org.springframework.ide.eclipse.webflow.core.validator=true
diff --git a/apps/org.eclipse.virgo.apps.splash/src/main/java/org/eclipse/virgo/apps/splash/ContentServlet.java b/apps/org.eclipse.virgo.apps.splash/src/main/java/org/eclipse/virgo/apps/splash/ContentServlet.java
new file mode 100644
index 0000000..6cc67e6
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.splash/src/main/java/org/eclipse/virgo/apps/splash/ContentServlet.java
@@ -0,0 +1,237 @@
+/*
+ * Copyright 2004-2008 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.eclipse.virgo.apps.splash;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Scanner;
+import java.util.Set;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Special servlet to load static resources and render the admin HTML pages
+ * 
+ * @author Jeremy Grelle
+ * @author Scott Andrews
+ * @author Christopher Frost
+ */
+public class ContentServlet extends HttpServlet {
+
+    private static final Logger log = LoggerFactory.getLogger(ContentServlet.class);
+
+    private static final long serialVersionUID = 1L;
+
+    private static final String HTTP_CONTENT_LENGTH_HEADER = "Content-Length";
+
+    private static final String HTTP_LAST_MODIFIED_HEADER = "Last-Modified";
+
+    private static final String HTTP_EXPIRES_HEADER = "Expires";
+
+    private static final String HTTP_CACHE_CONTROL_HEADER = "Cache-Control";
+
+    private static final String PATH_TO_VERSION_FILE = "lib/.version";
+
+    private static final String VERSION_HOLDER = "<!--@<version@-->";
+
+    private String view = "/WEB-INF/splash.html";
+
+    private boolean gzipEnabled = true;
+
+    private final String version;
+
+    private int cacheTimeout = 60; // The number of seconds content should be cached by the client. Zero disables
+                                   // caching, 31556926 is one year.
+
+    private Map<String, String> defaultMimeTypes = new HashMap<String, String>();
+    {
+        defaultMimeTypes.put(".html", "text/html");
+        defaultMimeTypes.put(".htm", "text/html");
+        defaultMimeTypes.put(".xhtml", "text/html");
+    }
+
+    private Set<String> compressedMimeTypes = new HashSet<String>();
+    {
+        compressedMimeTypes.add("text/.*");
+        compressedMimeTypes.add(".*/xhtml.xml");
+    }
+
+    public ContentServlet() {
+        this.version = readServerVersion();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+        URL resource = getRequestedContentURL(this.view);
+        prepareContentResponse(response, resource);
+        PrintWriter out = selectOutputStream(request, response);
+        try {
+            URLConnection resourceConn = resource.openConnection();
+            InputStream in = resourceConn.getInputStream();
+            try {
+                this.parse(in, out);
+            } finally {
+                in.close();
+            }
+        } finally {
+            out.close();
+        }
+    }
+
+    private void parse(InputStream in, PrintWriter out) {
+        try (Scanner scanner = new Scanner(in, StandardCharsets.UTF_8.name())) {
+            String parsedLine;
+            while (scanner.hasNextLine()) {
+                parsedLine = parseLine(scanner.nextLine());
+                if (parsedLine != null && !parsedLine.trim().isEmpty()) {
+                    out.append(parsedLine);
+                    out.append('\n');
+                }
+            }
+        }
+    }
+
+    private String parseLine(String line) {
+        if (line.contains(VERSION_HOLDER)) {
+            int offset = line.indexOf(VERSION_HOLDER);
+            line = String.format("%s%s%s", line.substring(0, offset), this.version, line.substring(offset + VERSION_HOLDER.length()));
+        }
+        return line;
+    }
+
+    private PrintWriter selectOutputStream(HttpServletRequest request, HttpServletResponse response) throws IOException {
+        String acceptEncoding = request.getHeader("Accept-Encoding");
+        String mimeType = response.getContentType();
+        if (gzipEnabled && acceptEncoding != null && acceptEncoding.indexOf("gzip") > -1 && matchesCompressedMimeTypes(mimeType)) {
+            log.debug("Enabling GZIP compression for the current response.");
+            return new PrintWriter(new OutputStreamWriter(new GZIPResponseStream(response), StandardCharsets.UTF_8));
+        } else {
+            return response.getWriter();
+        }
+    }
+
+    private boolean matchesCompressedMimeTypes(String mimeType) {
+        for (String compressedMimeType : compressedMimeTypes) {
+            if (mimeType.matches(compressedMimeType)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private void prepareContentResponse(HttpServletResponse response, URL resource) throws IOException {
+        URLConnection resourceConn = resource.openConnection();
+        String mimeType = getServletContext().getMimeType(resource.getPath());
+        if (mimeType == null) {
+            String extension = resource.getPath().substring(resource.getPath().lastIndexOf('.'));
+            mimeType = (String) defaultMimeTypes.get(extension);
+        }
+        response.setContentType(mimeType);
+        response.setHeader(HTTP_CONTENT_LENGTH_HEADER, Long.toString(resourceConn.getContentLength()));
+        response.setDateHeader(HTTP_LAST_MODIFIED_HEADER, resourceConn.getLastModified());
+        if (cacheTimeout > 0) {
+            configureCaching(response, cacheTimeout);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    protected long getLastModified(HttpServletRequest request) {
+        String rawRequestPath = request.getPathInfo();
+        if (log.isDebugEnabled()) {
+            log.debug("Checking last modified of content: " + rawRequestPath);
+        }
+        URL resource;
+        try {
+            resource = getRequestedContentURL(rawRequestPath);
+        } catch (MalformedURLException e) {
+            return -1;
+        }
+        if (resource == null) {
+            return -1;
+        }
+        try {
+            return resource.openConnection().getLastModified();
+        } catch (IOException e) {
+            return -1;
+        }
+    }
+
+    private URL getRequestedContentURL(String rawRequestPath) throws MalformedURLException {
+        URL resource = getServletContext().getResource(rawRequestPath);
+        if (resource == null) {
+            if (log.isDebugEnabled()) {
+                log.debug("Content not found: " + rawRequestPath);
+            }
+        }
+        return resource;
+    }
+
+    /**
+     * Set HTTP headers to allow caching for the given number of seconds.
+     * 
+     * @param seconds number of seconds into the future that the response should be cacheable for
+     */
+    private void configureCaching(HttpServletResponse response, int seconds) {
+        response.setDateHeader(HTTP_EXPIRES_HEADER, System.currentTimeMillis() + seconds * 1000L); // HTTP 1.0 header
+        response.setHeader(HTTP_CACHE_CONTROL_HEADER, "max-age=" + seconds); // HTTP 1.1 header
+    }
+
+    private String readServerVersion() {
+        String readVersion;
+        File versionFile = new File(PATH_TO_VERSION_FILE);
+        Properties versions = new Properties();
+        InputStream stream = null;
+        try {
+            stream = new FileInputStream(versionFile);
+            versions.load(stream);
+            readVersion = versions.getProperty("virgo.server.version");
+            stream.close();
+        } catch (IOException e) {
+            readVersion = "";
+            try {
+                if (stream != null) {
+                    stream.close();
+                }
+            } catch (IOException e1) {
+                // no-op
+            }
+        }
+        return readVersion;
+    }
+}
diff --git a/apps/org.eclipse.virgo.apps.splash/src/main/java/org/eclipse/virgo/apps/splash/GZIPResponseStream.java b/apps/org.eclipse.virgo.apps.splash/src/main/java/org/eclipse/virgo/apps/splash/GZIPResponseStream.java
new file mode 100644
index 0000000..1b9a348
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.splash/src/main/java/org/eclipse/virgo/apps/splash/GZIPResponseStream.java
@@ -0,0 +1,84 @@
+package org.eclipse.virgo.apps.splash;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.zip.GZIPOutputStream;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.WriteListener;
+import javax.servlet.http.HttpServletResponse;
+
+public class GZIPResponseStream extends ServletOutputStream {
+
+	private ByteArrayOutputStream byteStream = null;
+
+	private GZIPOutputStream gzipStream = null;
+
+	private boolean closed = false;
+
+	private HttpServletResponse response = null;
+
+	private ServletOutputStream servletStream = null;
+
+	public GZIPResponseStream(HttpServletResponse response) throws IOException {
+		super();
+		closed = false;
+		this.response = response;
+		this.servletStream = response.getOutputStream();
+		byteStream = new ByteArrayOutputStream();
+		gzipStream = new GZIPOutputStream(byteStream);
+	}
+
+	public void close() throws IOException {
+		if (closed) {
+			throw new IOException("This output stream has already been closed");
+		}
+		gzipStream.finish();
+
+		byte[] bytes = byteStream.toByteArray();
+
+		response.setContentLength(bytes.length);
+		response.addHeader("Content-Encoding", "gzip");
+		servletStream.write(bytes);
+		servletStream.flush();
+		servletStream.close();
+		closed = true;
+	}
+
+	public void flush() throws IOException {
+		if (closed) {
+			throw new IOException("Cannot flush a closed output stream");
+		}
+		gzipStream.flush();
+	}
+
+	public void write(int b) throws IOException {
+		if (closed) {
+			throw new IOException("Cannot write to a closed output stream");
+		}
+		gzipStream.write((byte) b);
+	}
+
+	public void write(byte b[]) throws IOException {
+		write(b, 0, b.length);
+	}
+
+	public void write(byte b[], int off, int len) throws IOException {
+		if (closed) {
+			throw new IOException("Cannot write to a closed output stream");
+		}
+		gzipStream.write(b, off, len);
+	}
+
+    @Override
+    public boolean isReady() {
+        // TODO implement javax.servlet 3.1 method
+        return false;
+    }
+
+    @Override
+    public void setWriteListener(WriteListener arg0) {
+        // TODO implement javax.servlet 3.1 method
+    }
+
+}
\ No newline at end of file
diff --git a/apps/org.eclipse.virgo.apps.splash/src/main/resources/.gitignore b/apps/org.eclipse.virgo.apps.splash/src/main/resources/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.splash/src/main/resources/.gitignore
diff --git a/apps/org.eclipse.virgo.apps.splash/src/main/webapp/META-INF/.gitignore b/apps/org.eclipse.virgo.apps.splash/src/main/webapp/META-INF/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.splash/src/main/webapp/META-INF/.gitignore
diff --git a/apps/org.eclipse.virgo.apps.splash/src/main/webapp/META-INF/MANIFEST.MF b/apps/org.eclipse.virgo.apps.splash/src/main/webapp/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..633dc89
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.splash/src/main/webapp/META-INF/MANIFEST.MF
@@ -0,0 +1,9 @@
+Manifest-Version: 1.0

+Bundle-ClassPath: WEB-INF/classes

+Bundle-Version: 3.5.0

+Tool: Bundlor 1.1.0.BUILD-20101220120024

+Bundle-Name: Splash Screen

+Bundle-ManifestVersion: 2

+Bundle-SymbolicName: org.eclipse.virgo.apps.splash

+Web-ContextPath: /

+Import-Package: org.eclipse.virgo.apps.splash

diff --git a/apps/org.eclipse.virgo.apps.splash/src/main/webapp/WEB-INF/splash.html b/apps/org.eclipse.virgo.apps.splash/src/main/webapp/WEB-INF/splash.html
new file mode 100644
index 0000000..fd58a88
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.splash/src/main/webapp/WEB-INF/splash.html
@@ -0,0 +1,66 @@
+<!DOCTYPE html>
+<html lang="en">
+
+	<head>
+		<title>Virgo Splash Screen</title>
+		<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
+		<link rel="shortcut icon" href="images/favicon.ico" />
+		<link rel="stylesheet" href="styles/main.css" type="text/css" />
+		<link rel="stylesheet" href="styles/print.css" type="text/css" media="print" />
+	</head>
+	
+	<body class="main">
+	    <div id="page">
+	        <div id="mini-header">
+				<div id="mini-header-left"></div>
+				<div id="mini-header-right"></div>
+	        </div> <!-- /mini-header -->
+	
+	    <div id="primary-navigation">
+	        <div id="primary-left">
+	
+	        </div>
+	        <div id="left-cap"></div>
+	        <div id="primary-right">
+	            <ul>
+	                <li><a href="/admin" title="Admin Console">Admin Console</a></li>
+	            </ul>
+	        </div>
+	        <div id="right-cap"></div>
+	    </div><!-- /primary-navigation -->
+	
+	    <div id="container">
+	      <div id="content-no-nav">
+	
+	        <div id="splash-container"><img class="splash" src="images/server-splash.png" alt="EclipseRT Virgo Server" />
+	        	<div id="version-text"><!--@<version@--></div>
+	        </div>
+	        
+	        <h1>Welcome</h1>
+	        <p>
+	          Congratulations on installing the Virgo Server.
+	          From this splash page you can access the web-based <a href="/admin" title="Admin Console">admin console</a>.
+	        </p>
+	        
+	        <h1>Documentation</h1>
+	        <p>
+	          Documentation is available on-line for the server and related products.
+	        </p>
+	        <ul>
+	          <li><a href="http://www.eclipse.org/virgo/documentation" target="_blank" title="Eclipse Virgo Server Documentation">Eclipse Virgo Server Documentation</a>.</li>
+	          <li><a href="https://www.eclipse.org/gemini/blueprint/documentation/reference/2.0.0.RELEASE/html/index.html" target="_blank" title="Eclipse Gemini Blueprint Documentation">Eclipse Gemini Blueprint Documentation</a></li>
+	          <li><a href="http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/" target="_blank" title="Spring Framework Documentation">Spring Framework Documentation</a></li>
+	        </ul>
+	      </div><!-- /content -->
+	    </div><!-- /container -->
+	    
+	    <div id="footer-wrapper">
+	      <div id="footer-left">&#169; Copyright 2008, 2011 VMware Inc. Licensed under the Eclipse Public License v1.0.</div>
+	
+	      <div id="footer-right"></div> 
+	    </div>
+	
+	  </div> <!-- /page-->
+	
+	</body>
+</html>
diff --git a/apps/org.eclipse.virgo.apps.splash/src/main/webapp/WEB-INF/web.xml b/apps/org.eclipse.virgo.apps.splash/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..c71acd3
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.splash/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
+  <display-name>Virgo Splash Screen</display-name>
+  <description>Virgo Server - Splash Screen</description>
+  <welcome-file-list>
+    <welcome-file>index.jsp</welcome-file>
+    <welcome-file>index.html</welcome-file>
+  </welcome-file-list>
+  <servlet>
+    <servlet-name>content</servlet-name>
+    <servlet-class>org.eclipse.virgo.apps.splash.ContentServlet</servlet-class>
+  </servlet>
+  <servlet-mapping>
+    <servlet-name>content</servlet-name>
+    <url-pattern>/splash/*</url-pattern>
+  </servlet-mapping>
+</web-app>
\ No newline at end of file
diff --git a/apps/org.eclipse.virgo.apps.splash/src/main/webapp/images/favicon.ico b/apps/org.eclipse.virgo.apps.splash/src/main/webapp/images/favicon.ico
new file mode 100755
index 0000000..e963685
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.splash/src/main/webapp/images/favicon.ico
Binary files differ
diff --git a/apps/org.eclipse.virgo.apps.splash/src/main/webapp/images/footer-left.png b/apps/org.eclipse.virgo.apps.splash/src/main/webapp/images/footer-left.png
new file mode 100644
index 0000000..8bfe3b1
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.splash/src/main/webapp/images/footer-left.png
Binary files differ
diff --git a/apps/org.eclipse.virgo.apps.splash/src/main/webapp/images/footer-right.png b/apps/org.eclipse.virgo.apps.splash/src/main/webapp/images/footer-right.png
new file mode 100644
index 0000000..51527ad
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.splash/src/main/webapp/images/footer-right.png
Binary files differ
diff --git a/apps/org.eclipse.virgo.apps.splash/src/main/webapp/images/footer-stretch.png b/apps/org.eclipse.virgo.apps.splash/src/main/webapp/images/footer-stretch.png
new file mode 100644
index 0000000..c58f721
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.splash/src/main/webapp/images/footer-stretch.png
Binary files differ
diff --git a/apps/org.eclipse.virgo.apps.splash/src/main/webapp/images/header-left.png b/apps/org.eclipse.virgo.apps.splash/src/main/webapp/images/header-left.png
new file mode 100644
index 0000000..4920a0a
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.splash/src/main/webapp/images/header-left.png
Binary files differ
diff --git a/apps/org.eclipse.virgo.apps.splash/src/main/webapp/images/header-right.png b/apps/org.eclipse.virgo.apps.splash/src/main/webapp/images/header-right.png
new file mode 100644
index 0000000..09b0a59
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.splash/src/main/webapp/images/header-right.png
Binary files differ
diff --git a/apps/org.eclipse.virgo.apps.splash/src/main/webapp/images/menu-curve-left.png b/apps/org.eclipse.virgo.apps.splash/src/main/webapp/images/menu-curve-left.png
new file mode 100644
index 0000000..c48a2e0
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.splash/src/main/webapp/images/menu-curve-left.png
Binary files differ
diff --git a/apps/org.eclipse.virgo.apps.splash/src/main/webapp/images/menu-curve-right.png b/apps/org.eclipse.virgo.apps.splash/src/main/webapp/images/menu-curve-right.png
new file mode 100644
index 0000000..1f3b100
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.splash/src/main/webapp/images/menu-curve-right.png
Binary files differ
diff --git a/apps/org.eclipse.virgo.apps.splash/src/main/webapp/images/menu-stretch.png b/apps/org.eclipse.virgo.apps.splash/src/main/webapp/images/menu-stretch.png
new file mode 100644
index 0000000..0ca66f7
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.splash/src/main/webapp/images/menu-stretch.png
Binary files differ
diff --git a/apps/org.eclipse.virgo.apps.splash/src/main/webapp/images/mini-header-left.png b/apps/org.eclipse.virgo.apps.splash/src/main/webapp/images/mini-header-left.png
new file mode 100644
index 0000000..72551e7
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.splash/src/main/webapp/images/mini-header-left.png
Binary files differ
diff --git a/apps/org.eclipse.virgo.apps.splash/src/main/webapp/images/mini-header-right.png b/apps/org.eclipse.virgo.apps.splash/src/main/webapp/images/mini-header-right.png
new file mode 100644
index 0000000..8aaf50c
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.splash/src/main/webapp/images/mini-header-right.png
Binary files differ
diff --git a/apps/org.eclipse.virgo.apps.splash/src/main/webapp/images/server-splash.png b/apps/org.eclipse.virgo.apps.splash/src/main/webapp/images/server-splash.png
new file mode 100644
index 0000000..f8fe1f9
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.splash/src/main/webapp/images/server-splash.png
Binary files differ
diff --git a/apps/org.eclipse.virgo.apps.splash/src/main/webapp/index.html b/apps/org.eclipse.virgo.apps.splash/src/main/webapp/index.html
new file mode 100644
index 0000000..3f1e743
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.splash/src/main/webapp/index.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<html lang="en">
+	<head>
+		<title>Virgo Splash Screen</title>
+		<meta http-equiv="REFRESH" content="0;url=/splash">
+		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" href="images/favicon.ico" />
+	</head>
+	<body>
+		<!-- No loading msg -->
+	</body>
+</html>
\ No newline at end of file
diff --git a/apps/org.eclipse.virgo.apps.splash/src/main/webapp/styles/main.css b/apps/org.eclipse.virgo.apps.splash/src/main/webapp/styles/main.css
new file mode 100644
index 0000000..78e2927
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.splash/src/main/webapp/styles/main.css
@@ -0,0 +1,223 @@
+/* 
+ *  Local style information for the Virgo Splash Screen
+ *
+ *  Contains both style and colour information.
+ *
+ *  Christopher Frost - March 2010
+ *
+ */
+ 
+body {
+	font: 12px Helvetica, Arial, "Bitstream Vera Sans", sans-serif;
+	background-color: #dfdfdf;
+}
+
+#page {
+	margin: auto;
+	width: 800px;
+	color: #333;
+}
+
+/*
+ * TEXT FORMATTING STYLES
+ */
+h1 {
+	font-size: 1.4em;
+	padding: 12px 0 5px 0;
+	line-height: 125%;
+	color: #002E62;
+	border-bottom: 1px solid #BAD9EC;
+}
+
+h2 {
+	font-size: 1.2em;
+	padding: 10px 0 2px 0;
+	color: #002E62;
+}
+
+/*
+ * LINK STYLES
+ */
+ 
+a:link, a:visited {
+	color: #333;
+	text-decoration: underline;
+}
+
+a:hover, a:focus {
+	color: #0093CF;
+	text-decoration: underline;
+}
+
+a:active, a.active { 
+	color: #0093CF;
+}
+  
+/*
+ * MENU STYLES
+ */
+#primary-navigation {
+	background: #fff url(../images/menu-stretch.png) repeat-x scroll 0 0;
+	height:29px;
+	margin:0;
+	padding:0;
+	position: relative;
+}
+
+#primary-left {
+	background: #002E62;
+	float: left;
+	height: 26px;
+	line-height: normal;
+	padding: 3px 0 0;
+	position: relative;
+}
+
+#primary-right {
+	background: #002E62;
+	float: right;
+	height: 26px;
+	line-height: normal;
+	padding: 3px 0 0;
+	position: relative;
+}
+
+#primary-left ul, #primary-right ul {
+	padding: 0 4px 0 4px;
+	margin: 2px 0 0 0;
+	list-style: none;
+}
+
+#primary-left li, #primary-right li {
+	display: inline;
+}
+
+#primary-left a, #primary-right a {
+	color: #ffffff;
+	display: block;
+	float: left;
+	font-weight:normal;
+	margin: 0 1px 0 1px;
+	padding: 7px 8px 4px 10px;
+	text-decoration: none;
+}
+
+#primary-left a:hover, #primary-right a:hover, .selected-menu {
+	background: #ffffff;
+	color:#002E62;
+	text-decoration: none;
+}
+
+#left-cap {
+	background: transparent url(../images/menu-curve-left.png) no-repeat top left;
+	height: 29px;
+	width: 30px;
+	float: left;
+}
+
+#right-cap {
+	background: transparent url(../images/menu-curve-right.png) no-repeat top right;
+	height: 29px;
+	width: 30px;
+	float: right;
+}
+
+/*
+ * CONTAINER STYLES
+ */
+#content-no-nav {
+	display: block;
+	margin: 0px 22px 20px 22px;
+	padding: 0;
+}
+ 
+#container {
+	margin: 0;
+	padding-bottom: 20px;
+	overflow:hidden;
+	background:#fff;
+}
+
+/*
+ * FOOTER STYLES
+ */
+#footer-wrapper {
+	clear: both;
+	margin: 0;
+	background-image: url(../images/footer-stretch.png);
+	background-repeat: repeat-x;
+	height: 29px;
+	width: 100%;
+}
+
+#footer-left, #footer-right {
+	margin: 0;
+	font-size: 85%;
+	padding: 1em;
+	height: 29px;
+    color: #bbb;
+}
+
+#footer-left {
+	text-align: left;
+	background-image: url(../images/footer-left.png);
+	background-repeat: no-repeat;
+	position: relative;
+	left: 0;
+	float: left;
+}
+
+#footer-right {
+	text-align: right;
+	background-image: url(../images/footer-right.png);
+	background-repeat: no-repeat;
+	background-position: top right;
+	position: relative;
+	right: 0;
+	float: right;
+}
+
+#footer-left a, #footer-right a {
+    color: #999;
+    text-decoration:none;
+}
+ 
+#mini-header, #mini-header-left, #mini-header-right {
+	height: 7px;
+	width: 7px;
+	margin: 0px;
+	padding: 0px;
+}
+
+#mini-header {
+	width: 100%;
+	background-color: #002e62; 
+}
+
+#mini-header-left {
+	background-image: url(../images/mini-header-left.png); 
+	background-repeat: no-repeat; 
+	background-position: left top;
+	float: left;
+}
+
+#mini-header-right {
+	background-image: url(../images/mini-header-right.png); 
+	background-repeat: no-repeat scroll; 
+	background-position: right top;
+	float: right;
+}
+ 
+#splash-container{
+	display: block;
+	margin: 30px auto;
+	width: 500px;
+}
+ 
+#version-text {
+ 	text-align: right;
+	font-size: 30px;
+	font-family: arial;
+	text-align: right;
+	color: #848589;
+}
diff --git a/apps/org.eclipse.virgo.apps.splash/src/main/webapp/styles/print.css b/apps/org.eclipse.virgo.apps.splash/src/main/webapp/styles/print.css
new file mode 100644
index 0000000..3abe1c0
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.splash/src/main/webapp/styles/print.css
@@ -0,0 +1,60 @@
+/* print.css 2008/04/22 nicolekonicki */
+
+/* White background, black text, arial font, decent font size */
+  body
+  {
+    background-color: #fff;
+    color: #000;
+    font-family: Arial, Helvetica, "Bitstream Vera Sans", sans-serif;
+    font-size: 10pt;
+    width: 100%;
+  }
+
+/* Change the layout to remove columns */
+  html body
+  {
+    background: transparent;
+    width: auto;
+  }
+
+  #main, #container 
+  {
+    width: 100%;
+  }
+
+  #page
+  {
+    margin: 0;
+    width: 90%;
+  }
+  
+  #content
+  {
+  	margin:0;
+  	overflow:visible;
+  }
+
+
+/* Hide header and nav elements */
+  #header, #primary-navigation, #secondary-navigation, #footer-wrapper
+  {
+    visibility: hidden;
+    display: none;
+  }
+
+/* Style links */
+  a:link, a:visited
+  {
+    color: #520;
+    background: transparent;
+    text-decoration: underline !important;
+  }
+  
+/* Remove table header graphic */  
+  .bordered-table th
+  {
+  	background-image:none;
+  }
+  
+
+
diff --git a/apps/org.eclipse.virgo.apps.splash/src/test/java/META-INF/TEST.MF b/apps/org.eclipse.virgo.apps.splash/src/test/java/META-INF/TEST.MF
new file mode 100644
index 0000000..3ec0672
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.splash/src/test/java/META-INF/TEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0

+Bundle-ManifestVersion: 2

+

diff --git a/apps/org.eclipse.virgo.apps.splash/template.mf b/apps/org.eclipse.virgo.apps.splash/template.mf
new file mode 100644
index 0000000..31960e4
--- /dev/null
+++ b/apps/org.eclipse.virgo.apps.splash/template.mf
@@ -0,0 +1,11 @@
+Manifest-Version: 1.0
+Bundle-Name: Splash Screen
+Bundle-Version: ${version}
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: org.eclipse.virgo.apps.splash
+Bundle-ClassPath: WEB-INF/classes
+Web-ContextPath: /
+Import-Template: 
+ javax.servlet.*;version="${javaxServletVersion:[2.5.0,+1)}",
+ org.slf4j;version="${slf4jVersion:[=.=.=,+1)}"
+Excluded-Exports: *
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000..116523c
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,789 @@
+import org.apache.tools.ant.filters.ReplaceTokens
+import virgobuild.Config
+
+apply plugin: virgobuild.VirgoToolsPlugin
+
+if (System.properties['eclipse.build'] == 'true') {
+    // https://gradle.org/docs/current/userguide/build_environment.html
+    // https://wiki.eclipse.org/Hudson#Why_use_a_Proxy.3F
+    println "Checking that proxy properties are set before proceeding..."
+    if (!System.properties['http.proxyHost'] && !System.properties['http.proxyPort']) {
+        throw new StopActionException("Properties 'http.proxyHost' and 'http.proxyPort' are both not set.")
+    }
+    println 'http.proxyHost = ' + System.properties['http.proxyHost']
+    println 'http.proxyPort = ' + System.properties['http.proxyPort']
+    println 'http.nonProxyHosts = ' + System.properties['http.nonProxyHosts']
+    println 'Done.'
+}
+
+buildscript {
+    repositories {
+        mavenLocal()
+        maven {
+            url "https://plugins.gradle.org/m2/"
+        }
+        if (System.properties['local.build'] == 'true') {
+            jcenter()
+            maven { url 'https://repo.spring.io/libs-release' }
+        }
+    }
+    dependencies {
+        classpath "gradle.plugin.org.eclipse.virgo.bundlor:bundlor-plugin:0.2"
+        if (System.properties['include.docs'] == 'true') {
+            // docbook processing
+            classpath 'net.sf.docbook:docbook-xsl:1.78.1:resources@zip'
+            // TODO use docbook 4.5 to reduce buildtime? 4.5 DTDs are not available locally?
+            // TODO alternatively switch to docbook 5.0?
+            classpath 'net.sf.docbook:docbook-xml:5.0:xsd-resources@zip'
+            classpath 'net.sf.docbook:docbook-xsl-saxon:1.0.0'
+            classpath 'org.apache.xerces:resolver:2.9.1'
+            classpath 'org.apache.xerces:xercesImpl:2.9.1'
+            classpath 'saxon:saxon:6.5.3'
+            classpath 'net.sf.xslthl:xslthl:2.0.1'
+            classpath 'org.apache.xmlgraphics:fop:0.95-1@jar'
+            classpath 'org.apache.xmlgraphics:xmlgraphics-commons:1.3'
+            classpath 'org.apache.xmlgraphics:batik-bridge:1.7@jar'
+            classpath 'org.apache.xmlgraphics:batik-util:1.7@jar'
+            classpath 'org.apache.xmlgraphics:batik-css:1.7@jar'
+            classpath 'org.apache.xmlgraphics:batik-dom:1.7'
+            classpath 'org.apache.xmlgraphics:batik-svg-dom:1.7@jar'
+            classpath 'org.apache.avalon.framework:avalon-framework-api:4.3.1'
+        }
+    }
+}
+
+def timestamp = new Date().format('yyyyMMddHHmmss', TimeZone.getTimeZone('GMT'))
+
+defaultTasks 'clean', 'jar', 'build', 'distZip'
+
+def Properties versions = new Properties()
+versions.load(new FileInputStream(project.rootProject.file('gradle.properties')))
+project.ext.props = versions
+
+allprojects() {
+    if (System.properties['ci.build'] == 'true') {
+        version = '3.7.2.D-' + timestamp
+    } else {
+        version = '3.7.2.RELEASE'
+    }
+}
+
+ext.appsProjects = [
+        project(':apps:org.eclipse.virgo.apps.repository.core'),
+        project(':apps:org.eclipse.virgo.apps.repository.web'),
+        project(':apps:org.eclipse.virgo.apps.splash'),
+]
+
+ext.kernelProjects = [
+        project(':kernel:org.eclipse.virgo.kernel.agent.dm'),
+        project(':kernel:org.eclipse.virgo.kernel.artifact'),
+        project(':kernel:org.eclipse.virgo.kernel.deployer'),
+        project(':kernel:org.eclipse.virgo.kernel.deployer.dm'),
+        project(':kernel:org.eclipse.virgo.kernel.dmfragment'),
+        project(':kernel:org.eclipse.virgo.kernel.equinox.extensions'),
+        project(':kernel:org.eclipse.virgo.kernel.kerneldmfragment'),
+        project(':kernel:org.eclipse.virgo.kernel.model'),
+        project(':kernel:org.eclipse.virgo.kernel.osgi'),
+        project(':kernel:org.eclipse.virgo.kernel.services'),
+        project(':kernel:org.eclipse.virgo.kernel.userregion'),
+        project(':kernel:org.eclipse.virgo.kernel.userregionfactory'),
+        project(':kernel:org.eclipse.virgo.management.console'),
+        project(':kernel:org.eclipse.virgo.management.fragment'),
+        project(':kernel:org.eclipse.virgo.shell.command'),
+]
+
+ext.medicProjects = [
+        project(':medic:org.eclipse.virgo.medic'),
+        project(':medic:org.eclipse.virgo.medic.core'),
+        project(':medic:org.eclipse.virgo.medic.logbackclassicfragment'),
+        project(':medic:org.eclipse.virgo.medic.logbackcorefragment'),
+]
+
+ext.nanoProjects = [
+        project(':nano:org.eclipse.virgo.nano.core'),
+        project(':nano:org.eclipse.virgo.nano.deployer'),
+        project(':nano:org.eclipse.virgo.nano.deployer.api'),
+        project(':nano:org.eclipse.virgo.nano.deployer.hot'),
+        project(':nano:org.eclipse.virgo.nano.management'),
+        project(':nano:org.eclipse.virgo.nano.management.controller'),
+        project(':nano:org.eclipse.virgo.nano.services.concurrent'),
+        project(':nano:org.eclipse.virgo.nano.services.ds'),
+]
+
+ext.repositoryProjects = [
+        project(':repository:org.eclipse.virgo.repository'),
+]
+
+ext.testUtils = [
+        project(':test:org.eclipse.virgo.test.stubs'),
+        project(':medic:org.eclipse.virgo.medic.test'),
+        project(':kernel:org.eclipse.virgo.kernel.stubs'),
+        project(':test:org.eclipse.virgo.test.tools'),
+]
+
+ext.utilProjects = [
+        project(':util:org.eclipse.virgo.util.common'),
+        project(':util:org.eclipse.virgo.util.env'),
+        project(':util:org.eclipse.virgo.util.io'),
+        project(':util:org.eclipse.virgo.util.jmx'),
+        project(':util:org.eclipse.virgo.util.math'),
+        project(':util:org.eclipse.virgo.util.osgi'),
+        project(':util:org.eclipse.virgo.util.osgi.manifest'),
+        project(':util:org.eclipse.virgo.util.parser.launcher'),
+        project(':util:org.eclipse.virgo.util.parser.manifest'),
+]
+
+ext.webProjects = [
+        project(':web:org.eclipse.virgo.web.core'),
+        project(':web:org.eclipse.virgo.web.dm'),
+        project(':web:org.eclipse.virgo.web.tomcat.support'),
+        project(':web:org.eclipse.virgo.web.enterprise.appdeployer'),
+        project(':web:org.eclipse.virgo.web.enterprise.applistener'),
+        project(':web:org.eclipse.virgo.web.enterprise.catalina.fragment.webbeans'),
+        project(':web:org.eclipse.virgo.web.enterprise.javax.persistence.extension'),
+        project(':web:org.eclipse.virgo.web.enterprise.javax.persistence.provider.initializer'),
+        project(':web:org.eclipse.virgo.web.enterprise.jsf.support'),
+        project(':web:org.eclipse.virgo.web.enterprise.openejb.fragment.bval'),
+        project(':web:org.eclipse.virgo.web.enterprise.openejb.fragment.jotm'),
+        project(':web:org.eclipse.virgo.web.enterprise.openejb.fragment.jpa'),
+        project(':web:org.eclipse.virgo.web.enterprise.openejb.fragment.webbeans'),
+        project(':web:org.eclipse.virgo.web.enterprise.openejb.initialiser'),
+        project(':web:org.eclipse.virgo.web.enterprise.openejb.jpa.integration'),
+        project(':web:org.eclipse.virgo.web.enterprise.openejb.tomcat.factory'),
+        project(':web:org.eclipse.virgo.web.enterprise.openwebbeans.initialiser'),
+        project(':web:org.eclipse.virgo.web.enterprise.persistence.openejb.classloading.hook'),
+        project(':web:org.eclipse.virgo.web.enterprise.security'),
+        project(':web:org.eclipse.virgo.web.enterprise.security.openejb.classloading.hook'),
+        project(':web:org.eclipse.virgo.web.enterprise.security.valve'),
+        project(':web:org.eclipse.virgo.web.enterprise.services.accessor'),
+        project(':web:org.eclipse.virgo.web.servlet.adapter'),
+        project(':web:org.eclipse.virgo.web.spring.integration'),
+        project(':web:org.eclipse.virgo.web.war.deployer'),
+]
+
+ext.integrationTestProjects = [
+        project(':test:org.eclipse.virgo.test.launcher'),
+        project(':test:org.eclipse.virgo.test.framework'),
+
+        project(':util:org.eclipse.virgo.util.integrationtest'),
+        //	project(':medic:org.eclipse.virgo.medic.integrationtest'),
+]
+
+ext.smokeTestProjects = [
+        project(':packaging:nano:org.eclipse.virgo.nano.smoketest'),
+        project(':packaging:kernel:org.eclipse.virgo.kernel.smoketest'),
+        project(':packaging:jetty-server:org.eclipse.virgo.jetty.smoketest'),
+        project(':packaging:tomcat-server:org.eclipse.virgo.tomcat.smoketest'),
+]
+
+ext.javaProjects = ext.utilProjects + ext.medicProjects + ext.repositoryProjects + ext.nanoProjects + ext.kernelProjects + ext.webProjects + ext.appsProjects + ext.testUtils + ext.integrationTestProjects + smokeTestProjects +
+        [
+                project(':nano:org.eclipse.virgo.nano.authentication'),
+                project(':nano:org.eclipse.virgo.nano.shutdown'),
+        ]
+
+if (System.properties['local.build'] == 'true') {
+    ext.javaProjects += [
+            // project(':system-tests:org.eclipse.virgo.server.svt'),
+            // project(':performance-tests:org.eclipse.virgo.qa.performance'),
+    ]
+}
+
+ext.aspectjProjects = [
+        // these projects contain aspects
+        project(':util:org.eclipse.virgo.util.jmx'),
+        project(':test:org.eclipse.virgo.test.stubs'),
+        project(':medic:org.eclipse.virgo.medic'),
+        project(':nano:org.eclipse.virgo.nano.core'),
+        // these projects are woven
+        project(':kernel:org.eclipse.virgo.kernel.model'),
+        project(':kernel:org.eclipse.virgo.kernel.osgi'),
+]
+
+if (System.properties['local.build'] == 'true') {
+    if (System.properties['weaving.enabled'] == 'true') {
+        ext.aspectjProjects + [
+                project(':apps:org.eclipse.virgo.apps.repository.core'),
+                project(':kernel:org.eclipse.virgo.kernel.deployer'),
+                project(':kernel:org.eclipse.virgo.kernel.deployer.dm'),
+                project(':kernel:org.eclipse.virgo.kernel.dmfragment'),
+                project(':kernel:org.eclipse.virgo.shell.command'),
+                project(':repository:org.eclipse.virgo.repository'),
+                project(':web:org.eclipse.virgo.web.core'),
+                project(':web:org.eclipse.virgo.web.dm'),
+                project(':web:org.eclipse.virgo.web.tomcat.support'),
+        ]
+    }
+}
+
+/*
+ TODO - What about these modules? Do they have AspectJ nature in Eclipse?
+ aspectpath project(':nano:org.eclipse.virgo.nano.deployer.api')
+ aspectpath project(':nano:org.eclipse.virgo.nano.deployer.hot')
+ aspectpath project(':kernel:org.eclipse.virgo.kernel.services')
+ */
+
+ext.packagingProjects = [
+        project(':packaging:nano'),
+        project(':packaging:kernel'),
+        project(':packaging:jetty-server'),
+        project(':packaging:tomcat-server'),
+]
+
+ext {
+    // used when copying features and products
+    tokenMap = [
+            'VIRGO.VERSION'                : version,
+
+            'OSGI.SERVICES.VERSION'        : osgiServicesVersion, // used in oev.kernel.userregion.properties
+            'OSGI.ENTERPRISE.VERSION'      : osgiEnterpriseVersion,
+
+            'EQUINOX.HTTP.JETTY.VERSION'   : equinoxHttpJettyVersion,
+            'EQUINOX.APP.VERSION'          : equinoxAppVersion,
+            'EQUINOX.COMMON.VERSION'       : equinoxCommonVersion,
+            'EQUINOX.CONFIGADMIN.VERSION'  : equinoxCmVersion,
+            'EQUINOX.DS.VERSION'           : equinoxDsVersion,
+            'EQUINOX.SC.VERSION'           : equinoxSimpleConfiguratorVersion,
+            'EQUINOX.SC.M.VERSION'         : equinoxSimpleConfiguratorManipulatorVersion,
+            'EQUINOX.CONSOLE.VERSION'      : equinoxConsoleVersion,
+            'EQUINOX.CONSOLE.SSH.VERSION'  : equinoxConsoleSshVersion,
+            'EQUINOX.EVENT'                : equinoxEventVersion,
+            'EQUINOX.FRKA.E.VERSION'       : equinoxFrameworkadminEquinoxVersion,
+            'EQUINOX.FRKA.VERSION'         : equinoxFrameworkadminVersion,
+            'EQUINOX.PFRCS.VERSION'        : equinoxPreferencesVersion,
+            'REGION.VERSION'               : equinoxRegionVersion,
+            'EQUINOX.REGISTRY.VERSION'     : equinoxRegistryVersion,
+            'EQUINOX.SECURITY.VERSION'     : equinoxSecurityVersion,
+
+            'CONTENTTYPE.VERSION'          : eclipseCoreContenttypeVersion,
+            'JOBS.VERSION'                 : eclipseCoreJobsVersion,
+            'CORE.NET.VERSION'             : eclipseCoreNetVersion,
+            'CORE.VERSION'                 : eclipseCoreRuntimeVersion,
+
+            'ECF.FT.VERSION'               : eclipseEcfFiletransferVersion,
+            'ECF.I.VERSION'                : eclipseEcfIdentityVersion,
+            'ECF.P.FT.VERSION'             : eclipseEcfProviderFiletransferVersion,
+            'ECF.SSL.VERSION'              : eclipseEcfSslVersion,
+            'ECF.VERSION'                  : eclipseEcfVersion,
+
+            'MINA.CORE.VERSION'            : minaCoreVersion,
+            'SSHD.CORE.VERSION'            : apacheSshdCoreVersion,
+            'FELIX.GOGO.COMMAND.VERSION'   : gogoCommandVersion,
+            'FELIX.GOGO.RUNTIME.VERSION'   : gogoRuntimeVersion,
+            'FELIX.GOGO.SHELL.VERSION'     : gogoShellVersion,
+
+            'JOLOKIA.VERSION'              : jolokiaVersion,
+
+            'SPRING.VERSION'               : springframeworkVersion,
+
+            'GEMINI.MANAGEMENT.VERSION'    : geminiManagementVersion,
+            // TODO rename to 'GENIMI.BLUEPRINT.VERSION'
+            'SPRING.DM.VERSION'            : geminiBlueprintVersion,
+            'GEMINI.WEB.VERSION'           : geminiWebVersion,
+
+            'CATALINA.VERSION'             : apacheCatalinaVersion,
+
+            'ASPECTJ'                      : aspectjVersion,
+            'LOGBACK.CLASSIC.VERSION'      : logbackVersion,
+            'LOGBACK.CORE.VERSION'         : logbackVersion,
+            'SLF4J.API'                    : slf4jVersion,
+            'SLF4J.JCL'                    : slf4jVersion,
+            'SLF4J.LOG4J'                  : slf4jVersion,
+
+            'C.FILEUPLOAD.VERSION'         : commonsFileuploadVersion,
+            'C.IO.VERSION'                 : commonsIoVersion,
+
+            'SCANNOTATION'                 : scannotationVersion,
+            'JAVASSIST'                    : javassistVersion,
+            'JOTM'                         : jotmVersion,
+            'OBJECTWEB.ASM'                : objectwebAsmVersion,
+
+            'JAVAX.ACTIVATION'             : javaxActivationVersion,
+            'JAVAX.ANNOTATION'             : javaxAnnotationVersion,
+            'JAVAX.EJB'                    : javaxEjbVersion,
+            'JAVAX.EL'                     : javaxElVersion,
+            'JAVAX.INJECT'                 : javaxInjectVersion,
+            'JAVAX.JMS'                    : javaxJmsVersion,
+            'JAVAX.MAIL'                   : javaxMailVersion,
+            'JAVAX.PERSISTENCE'            : javaxPersistenceVersion,
+            'JAVAX.RESOURCE'               : javaxResourceVersion,
+            'JAVAX.SECURITY.AUTH'          : javaxSecurityAuthMessageVersion,
+            'JAVAX.SECURITY.JACC'          : javaxSecurityJaccVersion,
+            // TODO remove duplication 'JAVAX.SERVLET.VERSION' and 'JAVAX.SERVLET'
+            'JAVAX.SERVLET.VERSION'        : javaxServletVersion,
+            'JAVAX.SERVLET'                : javaxServletVersion,
+            'JAVAX.SERVLET.JSP'            : javaxServletJspVersion,
+            'JSTL.API'                     : javaxServletJspJstlApiVersion,
+            'JSTL.IMPL'                    : javaxServletJspJstlImplOsgiVersion,
+            'JAVAX.TRANSACTION'            : javaxTransactionVersion,
+            'JAVAX.VALIDATION'             : javaxValidationVersion,
+            'JAVAX.WEBSOCKET'              : javaxWebsocketVersion,
+            'JAVAX.WSDL'                   : javaxWsdlVersion,
+            'JAVAX.WS.RS'                  : javaxWsRsVersion,
+            'JAVAX.XML.RPC'                : javaxXmlRpcVersion,
+
+            'JETTY.VERSION'                : jettyVersion,
+            'RAP.RWT.VERSION'              : rapRwtVersion,
+            'RAP.RWT.OSGI.VERSION'         : rapRwtOsgiVersion,
+            'RAP.JFACE.VERSION'            : rapJfaceVersion,
+            'RAP.JFACE.DATABINDING.VERSION': rapJfaceDatabindingVersion,
+
+            'P2.A.R.VERSION'               : p2ArtifactRepositoryVersion,
+            'P2.CONSOLE.VERSION'           : p2ConsoleVersion,
+            'P2.CORE.VERSION'              : p2CoreVersion,
+            'P2.DIRECTOR.VERSION'          : p2DirectorVersion,
+            'P2.ENGINE.VERSION'            : p2EngineVersion,
+            'P2.GC.VERSION'                : p2GarbageCollectorVersion,
+            'P2.JP.VERSION'                : p2JarProcessorVersion,
+            'P2.METADATA.VERSION'          : p2MetadataVersion,
+            'P2.M.R.VERSION'               : p2MetadataRepositoryVersion,
+            'P2.PUBLISHER.VERSION'         : p2PublisherVersion,
+            'P2.P.E.VERSION'               : p2PublisherEclipseVersion,
+            'P2.REPOSITORY.VERSION'        : p2RepositoryVersion,
+            'P2.T.E.VERSION'               : p2TouchpointEclipseVersion,
+            'P2.T.N.VERSION'               : p2TouchpointNativesVersion,
+            'P2.T.ECF.VERSION'             : p2TransportEcfVersion,
+
+            'QUARTZ'                       : quartzVersion,
+            'WB.COMMON'                    : apacheOpenwebbeansVersion,
+            'WB.EE'                        : apacheOpenwebbeansEEVersion,
+            'WB.EJB'                       : apacheOpenwebbeansEEVersion,
+            'WB.IMPL'                      : apacheOpenwebbeansVersion,
+            'WB.SPI'                       : apacheOpenwebbeansVersion,
+            'WB.WEB'                       : apacheOpenwebbeansVersion,
+            'WB.JSF'                       : apacheOpenwebbeansVersion,
+            'WB.TOMCAT7'                   : apacheOpenwebbeansTomcat7Version,
+
+            'COMMOMS.BEANUTILS'            : commonsBeanutilsVersion,
+            'COMMONS.CLI'                  : commonsCliVersion,
+            'COMMONS.COLLECTIONS'          : commonsCollectionsVersion,
+            'COMMONS.DBCP'                 : commonsDbcpVersion,
+            'COMMONS.LANG'                 : commonsLangVersion,
+            'COMMONS.POOL'                 : commonsPoolVersion,
+
+            'BVAL'                         : apacheBvalVersion,
+            'G.CONNECTOR'                  : geronimoComponentsConnectorVersion,
+            'G.TRANSACTIONS'               : geronimoComponentsTransactionVersion,
+            'G.MANAGEMENT'                 : geronimoSpecsJ2eeManagementVersion,
+            'G.OSGI.LOCATOR'               : geronimoSpecsOsgiLocatorVersion,
+            'G.OSGI.REGISTRY'              : geronimoSpecsOsgiRegistryVersion,
+
+            'CDI.API'                      : cdiApiVersion,
+
+            'OE.API'                       : apacheOpenejbVersion,
+            'OE.CORE'                      : apacheOpenejbCoreVersion,
+            'OE.JAVAAGENT'                 : apacheOpenejbVersion,
+            'OE.JEE'                       : apacheOpenejbVersion,
+            'OE.LOADER'                    : apacheOpenejbVersion,
+            'OE.JPA.INTEGRATION'           : apacheOpenejbVersion,
+            'XB.ASM'                       : apacheXBeanAsmVersion,
+            'XB.BUNDLEUTILS'               : apacheXBeanBundleutilsVersion,
+            'XB.FINDER'                    : apacheXBeanFinderVersion,
+            'XB.NAMING'                    : apacheXBeanNamingVersion,
+            'XB.REFLECT'                   : apacheXBeanReflectVersion,
+            'EL.ANTLR'                     : eclipsePersistenceAntlrVersion,
+            'EL.ASM'                       : eclipsePersistenceAsmVersion,
+            'EL.CORE'                      : eclipsePersistenceCoreVersion,
+            'EL.JPA'                       : eclipsePersistenceJpaVersion,
+            'EL.JPQL'                      : eclipsePersistenceJpaJpqlVersion,
+            'FACES.API'                    : glassfishJavaxFacesVersion,
+            'FACES.IMPL'                   : glassfishComSunFacesVersion,
+
+            'DERBY'                        : apacheDerbyVersion,
+
+            // used in documentation
+            'project.name'                 : 'Virgo',
+            'runtime.category'             : 'EclipseRT',
+            'umbrella.product.name'        : 'Virgo Runtime Environment',
+            'umbrella.product.name.short'  : 'Virgo Runtime',
+            'tomcat.product.name'          : 'Virgo Server for Apache Tomcat',
+            'tomcat.product.name.short'    : 'VTS',
+            'jetty.product.name'           : 'Virgo Jetty Server',
+            'jetty.product.name.short'     : 'VJS',
+            'kernel.product.name'          : 'Virgo Kernel',
+            'kernel.product.name.short'    : 'VK',
+            'nano.product.name'            : 'Virgo Nano',
+            'nano.product.name.short'      : 'VN',
+            'nanoweb.product.name'         : 'Virgo Nano Web',
+            'snaps.product.name'           : 'Virgo Snaps',
+            'snaps.product.name.short'     : 'VS',
+            'ebr'                          : 'SpringSource Enterprise Bundle Repository',
+            'p2repo'                       : "http://download.eclipse.org/virgo/updatesite/${version}".toString(),
+            'bundle.version'               : "${version}".toString(),
+    ]
+}
+
+configure(javaProjects + aspectjProjects) {
+
+    apply plugin: 'java'
+    apply plugin: 'eclipse'
+
+    sourceCompatibility = '1.7'
+    targetCompatibility = '1.7'
+
+    compileJava {
+        options.encoding = 'utf-8'
+        options.fork = true
+        doFirst {
+            options.forkOptions.with {
+                executable = 'java'
+                jvmArgs = [
+                        '-cp',
+                        configurations.ecj.asPath,
+                        'org.eclipse.jdt.internal.compiler.batch.Main',
+                        '-warn:-unused'
+                ]
+            }
+        }
+    }
+    compileTestJava {
+        options.encoding = 'utf-8'
+        options.fork = true
+        doFirst {
+            options.forkOptions.with {
+                executable = 'java'
+                jvmArgs = [
+                        '-cp',
+                        configurations.ecj.asPath,
+                        'org.eclipse.jdt.internal.compiler.batch.Main',
+                        '-warn:-unused'
+                ]
+            }
+        }
+    }
+
+    test {
+        if (System.properties['ci.build'] == 'true') {
+            ignoreFailures = true
+        }
+    }
+
+    configurations { ecj {} }
+
+    dependencies {
+        ecj group: "org.eclipse.jdt.core.compiler", name: "ecj", version: ecjVersion
+
+        testCompile group: 'junit', name: 'junit', version: junitVersion, configuration: "compile", ext: "jar"
+        testRuntime group: 'org.eclipse.virgo.mirrored', name: "org.apache.commons.logging", version: commonsLoggingVersion, ext: "jar"
+    }
+
+    eclipse {
+        jdt {
+            sourceCompatibility = 1.7
+            targetCompatibility = 1.7
+        }
+    }
+}
+
+configure(ext.utilProjects + ext.medicProjects + ext.repositoryProjects + ext.nanoProjects + ext.kernelProjects + ext.webProjects + ext.appsProjects) {
+    assemble.doLast {
+        println '|--> Assembled Jar File: ' + jar.archivePath
+        if (System.properties['ci.build.signjars'] == 'true') {
+            println '|--> Normalize Jar File: ' + jar.archivePath
+            project.javaexec {
+                main = 'org.eclipse.equinox.internal.p2.jarprocessor.Main'
+                classpath Config.on(project).jarProcessorJar
+                args = [
+                        '-repack',
+                        jar.archivePath
+                ]
+            }
+            println '|--> Signing Jar File: ' + jar.archivePath
+            exec {
+                workingDir jar.destinationDir
+                commandLine 'curl',
+                        '-o',
+                        jar.archivePath,
+                        '-F',
+                        "file=@${jar.archivePath}",
+                        '--show-error',
+                        'http://build.eclipse.org:31338/sign'
+            }
+            println '|--> Compress Jar File: ' + jar.archivePath
+            project.javaexec {
+                main = 'org.eclipse.equinox.internal.p2.jarprocessor.Main'
+                classpath Config.on(project).jarProcessorJar
+                args = [
+                        '-pack',
+                        jar.archivePath
+                ]
+            }
+        } else {
+            println '|--> Skipping normalize/signing/compression of Jar File: ' + jar.archivePath
+        }
+    }
+}
+
+configure(javaProjects) {
+    task sourcesJar(type: Jar, dependsOn: classes) {
+        classifier = 'sources'
+        from sourceSets.main.allSource
+    }
+
+    artifacts {
+        archives sourcesJar
+    }
+}
+
+configure(javaProjects) {
+    apply plugin: 'maven-publish'
+    publishing {
+        repositories {
+            maven {
+                name = "BuildEclipseOrg"
+                url "/opt/public/rt/virgo/gradle/bundles"
+            }
+        }
+        publications {
+            virgo(MavenPublication) {
+                groupId 'org.eclipse.virgo'
+                from components.java
+                artifact sourcesJar {
+                    classifier "sources"
+                }
+            }
+        }
+    }
+}
+
+configure(javaProjects + aspectjProjects + packagingProjects + project(":org.eclipse.virgo.site")) {
+    repositories {
+        mavenCentral()
+        ivy {
+            url "http://build.eclipse.org/rt/virgo/ivy/bundles/release/"
+            layout "pattern", { artifact "[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" }
+        }
+        ivy {
+            url "http://build.eclipse.org/rt/virgo/ivy/bundles/milestone/"
+            layout "pattern", { artifact "[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" }
+        }
+    }
+}
+
+configure(javaProjects) {
+    if (System.properties['ci.build'] == 'true' || System.properties['include.findbugs'] == 'true') {
+        apply plugin: 'findbugs'
+
+        findbugs {
+            toolVersion = "3.0.1"
+            sourceSets = [sourceSets.main]
+            ignoreFailures = true
+            effort = "max"
+            reportLevel = "high"
+            excludeFilter = file("$rootProject.projectDir/config/findbugs/excludeFilter.xml")
+        }
+    }
+}
+
+configure(javaProjects) {
+    if (System.properties['ci.build'] == 'true' || System.properties['include.jacoco'] == 'true') {
+        apply plugin: "jacoco"
+
+        jacoco { toolVersion = "0.7.4.201502262128" }
+    }
+}
+
+configure(packagingProjects) {
+    configurations {
+        aspects { // visibility="private"
+            description = "Aspects to be woven"
+        }
+
+        nanoLib {
+            description = "Dependencies to be packaged in lib"
+            transitive = true
+            exclude module: "org.eclipse.osgi"
+        }
+        nanoLibEndorsed { description = "Dependencies to be packaged in endorsed" }
+        nanoLibPersistence {
+            transitive = false
+            description = "Dependencies to be packaged in lib/persistence"
+        }
+        nanoPickup {
+            transitive = false
+            description = "Dependencies to be packaged in pickup"
+        }
+        kernelPluginsExtras {
+            transitive = false
+            description = "Dependencies to be published without p2 into Kernel plugin directory"
+        }
+        repositoryExt {
+            transitive = false
+            description = "Dependencies to be packaged in repository/ext"
+        }
+    }
+}
+
+ext.wabProjects = [
+        project(':apps:org.eclipse.virgo.apps.splash'),
+        project(':kernel:org.eclipse.virgo.management.console'),
+]
+
+configure(utilProjects + medicProjects + repositoryProjects + nanoProjects + kernelProjects + webProjects + appsProjects) {
+
+    apply plugin: 'org.eclipse.virgo.bundlor'
+
+    task('addProjectVersionToGradlePropertiesTask', type: Copy) {
+        ext.outputDir = new File(buildDir, 'bundlor-properties')
+        inputs.file project.rootProject.file('gradle.properties')
+        outputs.dir ext.outputDir
+        from project.rootProject.file('gradle.properties')
+        into ext.outputDir
+        filter(ReplaceTokens, tokens: [
+                'VIRGO.VERSION': version,
+        ])
+    }
+
+    task('mergeClassesAndResources', type: Copy, dependsOn: 'compileJava') {
+        ext.bundlorInputPath = new File(buildDir, 'bundlor-inputPath')
+        inputs.file sourceSets.main.output.classesDir
+        inputs.file sourceSets.main.resources
+        outputs.dir ext.bundlorInputPath
+        from sourceSets.main.output.classesDir
+        from sourceSets.main.resources
+        into ext.bundlorInputPath
+    }
+
+    project.tasks.'bundlor'.dependsOn('addProjectVersionToGradlePropertiesTask', 'mergeClassesAndResources')
+
+    bundlor {
+        ext.bundlorInputPath = new File(buildDir, 'bundlor-inputPath')
+        project.tasks['bundlor'].inputs.file ext.bundlorInputPath
+        manifestTemplatePath = "template.mf"
+        propertiesPath = new File("${project.buildDir}/bundlor-properties/gradle.properties")
+        inputPath = ext.bundlorInputPath
+        failOnWarnings = false
+    }
+}
+
+configure(wabProjects) {
+    apply plugin: 'war'
+
+    war.dependsOn('bundlor')
+
+    war {
+        extension = 'jar'
+        rootSpec.exclude("**/*.jar")
+        manifest = project.manifest { from 'build/bundlor/META-INF/MANIFEST.MF' }
+    }
+}
+
+configure(aspectjProjects) {
+    configurations.compile.dependencies.each { dep ->
+        if (dep.hasProperty("dependencyProject")) {
+            println "dependent project: ${dep}"
+            iajcClasspath += ":" + dep.dependencyProject.buildDir + "/bundles/release/classes.jar"
+        } else {
+            println "other dependency: ${dep}"
+        }
+    }
+
+    configurations {
+        ajtools {
+            transitive = false
+            description = "AspectJ tools runtime"
+        }
+
+        aspectpath {
+            transitive = false
+            description = "Aspects are applied to types present in the project"
+        }
+
+        testAspectpath {
+            transitive = false
+            description = "Aspects are applied to tests present in the project"
+        }
+    }
+
+    dependencies {
+        compile "org.aspectj:aspectjrt:${project.aspectjVersion}"
+        ajtools "org.aspectj:aspectjtools:${project.aspectjVersion}"
+    }
+
+    apply plugin: aspectj.AspectJPlugin
+
+    // Add nature and buildCommand
+    eclipse.project {
+        natures 'org.eclipse.ajdt.ui.ajnature'
+        buildCommand 'org.eclipse.ajdt.core.ajbuilder'
+    }
+
+    eclipse {
+        classpath {
+            file {
+                withXml { xmlProvider ->
+                    def classpath = xmlProvider.asNode()
+                    def xmlparser = new XmlParser()
+                    configurations.aspectpath.dependencies.each { dep ->
+                        if (dep.hasProperty("dependencyProject")) {
+                            println "Name of project containing aspects to weave: " + dep.dependencyProject.name
+                            classpath.children().findAll { it['@path'] == '/' + dep.dependencyProject.name }.each {
+                                println "Adding ${it['@path']} to Aspect Path"
+                                def attrs = xmlparser.createNode(it, 'attributes', [:])
+                                xmlparser.createNode(attrs, 'attribute', [name: 'org.eclipse.ajdt.aspectpath', value: 'org.eclipse.ajdt.aspectpath']);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
+
+configure(testUtils) {
+    dependencies {
+        // changing junit dependency to configuration compile - this is a test util project based on JUnit :)
+        compile group: 'junit', name: 'junit', version: junitVersion
+    }
+}
+
+configure(integrationTestProjects) {
+    dependencies {
+        // OSGi runtime
+        testRuntime group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi", version: equinoxVersion, configuration: "compile", ext: "jar"
+
+        testCompile group: "org.eclipse.virgo.mirrored", name: "javax.inject", version: javaxInjectVersion, configuration: "compile", ext: "jar"
+
+        // PaxExam
+        testRuntime group: "org.slf4j", name: "slf4j-api", version: slf4jVersion
+        testCompile group: "org.ops4j.pax.exam", name: "pax-exam-junit4", version: paxExamJunit4Version
+        testRuntime group: "org.ops4j.pax.exam", name: "pax-exam-container-native", version: paxExamContainerNativeVersion
+        testRuntime group: "org.ops4j.pax.exam", name: "pax-exam-link-mvn", version: paxExamLinkMvnVersion
+        testRuntime group: "org.ops4j.pax.url", name: "pax-url-aether", version: paxUrlAetherVersion
+        testRuntime group: "org.ops4j.pax.url", name: "pax-url-aether", version: paxUrlAetherVersion
+        testRuntime group: "org.ops4j.pax.url", name: "pax-url-wrap", version: paxUrlWrapVersion
+    }
+}
+
+configure(smokeTestProjects) {
+    sourceSets {
+        smokeTest {
+            java.srcDir file('src/smokeTest/java')
+            resources.srcDir file('src/smokeTest/resources')
+        }
+    }
+
+    task smokeTest(type: Test) {
+        testClassesDir = sourceSets.smokeTest.output.classesDir
+        classpath = sourceSets.smokeTest.runtimeClasspath
+    }
+
+    dependencies {
+        testCompile project(':test:org.eclipse.virgo.test.tools')
+        testCompile project(':util:org.eclipse.virgo.util.io')
+
+        testRuntime group: "org.apache.httpcomponents", name: "httpcore", version: httpcomponentsCoreVersion
+        testRuntime group: "org.apache.httpcomponents", name: "httpclient", version: httpcomponentsClientVersion
+
+        smokeTestCompile sourceSets.main.output
+        smokeTestCompile configurations.testCompile
+        smokeTestCompile sourceSets.test.output
+        smokeTestRuntime configurations.testRuntime
+    }
+}
+
+task wrapper(type: Wrapper) {
+    description 'Creates a local Gradle Wrapper'
+    group = 'Build Setup'
+    gradleVersion = '3.5' // CQ 13634
+}
diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle
new file mode 100644
index 0000000..1b1f1e3
--- /dev/null
+++ b/buildSrc/build.gradle
@@ -0,0 +1,32 @@
+apply plugin: 'maven'
+apply plugin: 'groovy'
+
+repositories {
+    if (System.properties['local.build'] == 'true') {
+        mavenCentral()
+        maven { url 'https://repo.spring.io/libs-release' }
+    }
+}
+
+dependencies {
+    compile gradleApi()
+    compile localGroovy()
+
+    if (System.properties['local.build'] == 'true') {
+        compile 'net.sf.docbook:docbook-xsl:1.78.1:resources@zip'
+        compile 'net.sf.docbook:docbook-xml:5.0:xsd-resources@zip'
+        compile 'net.sf.docbook:docbook-xsl-saxon:1.0.0'
+        compile 'org.apache.xerces:resolver:2.9.1'
+        compile 'org.apache.xerces:xercesImpl:2.9.1'
+        compile 'saxon:saxon:6.5.3'
+        compile 'net.sf.xslthl:xslthl:2.0.1'
+        compile 'org.apache.xmlgraphics:fop:0.95-1@jar'
+        compile 'org.apache.xmlgraphics:xmlgraphics-commons:1.3'
+        compile 'org.apache.xmlgraphics:batik-bridge:1.7@jar'
+        compile 'org.apache.xmlgraphics:batik-util:1.7@jar'
+        compile 'org.apache.xmlgraphics:batik-css:1.7@jar'
+        compile 'org.apache.xmlgraphics:batik-dom:1.7'
+        compile 'org.apache.xmlgraphics:batik-svg-dom:1.7@jar'
+        compile 'org.apache.avalon.framework:avalon-framework-api:4.3.1'
+    }
+}
diff --git a/buildSrc/src/main/groovy/aspectj/AspectJPlugin.groovy b/buildSrc/src/main/groovy/aspectj/AspectJPlugin.groovy
new file mode 100644
index 0000000..509fef9
--- /dev/null
+++ b/buildSrc/src/main/groovy/aspectj/AspectJPlugin.groovy
@@ -0,0 +1,79 @@
+package aspectj
+
+import org.gradle.api.DefaultTask
+import org.gradle.api.Plugin
+import org.gradle.api.Project
+import org.gradle.api.file.FileCollection
+import org.gradle.api.logging.LogLevel
+import org.gradle.api.plugins.JavaPlugin
+import org.gradle.api.tasks.SourceSet
+import org.gradle.api.tasks.TaskAction
+
+class AspectJPlugin implements Plugin<Project> {
+
+    void apply(Project project) {
+        project.plugins.apply(JavaPlugin)
+
+        for (projectSourceSet in project.sourceSets) {
+            if (!projectSourceSet.allJava.isEmpty()) {
+                def aspectTaskName = "compileAspect"
+                def javaTaskName = "compileJava"
+                def configurationName = "aspectpath"
+                if (!projectSourceSet.name.equals('main')) {
+                    aspectTaskName = "compile${projectSourceSet.name.capitalize()}Aspect"
+                    javaTaskName = "compile${projectSourceSet.name.capitalize()}Java"
+                    configurationName = "${projectSourceSet.name}Aspectpath"
+                }
+
+                project.tasks.create(name: aspectTaskName, overwrite: true, description: "Compiles AspectJ Source for ${projectSourceSet.name} source set", type: Ajc) {
+                    sourceSet = projectSourceSet
+                    inputs.files(sourceSet.allJava)
+                    outputs.dir(sourceSet.output.classesDir)
+                    aspectpath = project.configurations.findByName(configurationName)
+                }
+
+                project.tasks[aspectTaskName].setDependsOn(project.tasks[javaTaskName].dependsOn)
+                project.tasks[aspectTaskName].dependsOn(project.tasks[aspectTaskName].aspectpath)
+                project.tasks[javaTaskName].deleteAllActions()
+                project.tasks[javaTaskName].dependsOn(project.tasks[aspectTaskName])
+            }
+        }
+    }
+}
+
+class Ajc extends DefaultTask {
+
+    SourceSet sourceSet
+
+    FileCollection aspectpath
+
+    Ajc() {
+        logging.captureStandardOutput(LogLevel.INFO)
+    }
+
+    @TaskAction
+    def compile() {
+        def iajcArgs = [
+            classpath           : sourceSet.compileClasspath.asPath,
+            destDir             : sourceSet.output.classesDir.absolutePath,
+            source              : '1.7',
+            target              : '1.7',
+            aspectPath          : aspectpath.asPath,
+            sourceRootCopyFilter: '**/*.java,**/*.aj',
+            showWeaveInfo       : 'true',
+            debug               : 'true',
+            debugLevel          : 'lines,vars,source',
+            checkRuntimeVersion : 'false',
+            X                   : '',
+        ]
+
+        ant.taskdef(resource: "org/aspectj/tools/ant/taskdefs/aspectjTaskdefs.properties", classpath: project.configurations.ajtools.asPath)
+        ant.iajc(iajcArgs) {
+            sourceRoots {
+                sourceSet.java.srcDirs.each {
+                    pathelement(location: it.absolutePath)
+                }
+            }
+        }
+    }
+}
diff --git a/buildSrc/src/main/groovy/docbook/Docbook.groovy b/buildSrc/src/main/groovy/docbook/Docbook.groovy
new file mode 100644
index 0000000..54000d2
--- /dev/null
+++ b/buildSrc/src/main/groovy/docbook/Docbook.groovy
@@ -0,0 +1,269 @@
+package docbook
+//
+//import org.apache.fop.apps.Fop
+//import org.apache.fop.apps.FopFactory
+//import org.apache.fop.apps.MimeConstants
+//
+//import java.io.File
+//
+//import javax.xml.parsers.SAXParserFactory
+//import javax.xml.transform.Result
+//import javax.xml.transform.Source
+//import javax.xml.transform.Transformer
+//import javax.xml.transform.TransformerFactory
+//import javax.xml.transform.sax.SAXSource
+//import javax.xml.transform.sax.SAXResult
+//import javax.xml.transform.stream.StreamResult
+//import javax.xml.transform.stream.StreamSource
+//
+//import org.apache.tools.ant.filters.ReplaceTokens
+//import org.apache.xml.resolver.CatalogManager
+//import org.apache.xml.resolver.tools.CatalogResolver
+//import org.gradle.api.DefaultTask
+import org.gradle.api.Plugin
+import org.gradle.api.Project
+//import org.gradle.api.tasks.OutputDirectory
+//import org.gradle.api.tasks.TaskAction
+//import org.xml.sax.InputSource
+//import org.xml.sax.XMLReader
+//
+//import com.icl.saxon.TransformerFactoryImpl
+//
+class Docbook implements Plugin<Project> {
+
+    public void apply(Project project) {
+//        project.extensions.create("docbook", DocbookExtension)
+//        project.docbook.with {
+//        }
+//
+//        project.plugins.apply('base')
+//
+//        project.configurations { docbook }
+//
+//        project.repositories.mavenCentral()
+//
+//        project.dependencies {
+//            docbook 'net.sf.docbook:docbook-xsl:1.78.1:resources@zip'
+//            docbook 'net.sf.docbook:docbook-xml:5.0:xsd-resources@zip'
+//        }
+//
+//        def tasks = project.tasks
+//
+//        def prepareDocbookResources = tasks.create("prepareDocbookResources", PrepareDocbookResources)
+//        def prepareDocSources = tasks.create("prepareDocSources", PrepareDocSources)
+//        prepareDocSources.dependsOn([prepareDocbookResources])
+//
+//        def single = tasks.create("referenceHtmlSingle", DocbookReferenceTask)
+//        single.dependsOn([prepareDocSources])
+//        single.description('Generates single-page HTML documentation.')
+//        single.customStylesheetLocation = "html/custom.xsl"
+//        single.outputFormat = 'html-single'
+//        single.extension = 'html'
+//
+//        def multi = tasks.create("referenceHtmlMulti", DocbookReferenceTask)
+//        multi.dependsOn([prepareDocSources])
+//        multi.description('Generates multi-page HTML documentation.')
+//        multi.customStylesheetLocation = "html-multi/custom.xsl"
+//        multi.outputFormat = 'html-multi'
+//        multi.extension = 'html'
+//
+//        def fo = tasks.create("referenceFo", DocbookReferenceTask)
+//        fo.dependsOn([prepareDocSources])
+//        fo.description('Generates FO intermediate documentation.')
+//        fo.customStylesheetLocation = "fo/custom.xsl"
+//        fo.outputFormat = 'pdf'
+//        fo.extension = 'fo'
+//
+//        def pdf = tasks.create("referencePdf", FopTask)
+//        pdf.dependsOn([fo])
+//        pdf.description('Generates PDF documentation.')
+//
+//        def reference = tasks.create("reference") {
+//            group = 'Documentation'
+//            description = "Generates HTML and PDF reference documentation."
+//            dependsOn([single, multi, pdf])
+//            outputs.dir new File(project.buildDir, "reference")
+//        }
+    }
+}
+//
+//class PrepareDocbookResources extends DefaultTask {
+//
+//    @OutputDirectory
+//    File outputDir = new File(project.getBuildDir(), "docbook")
+//
+//    @TaskAction
+//    public final void prepareDocbookResources() {
+//        File docbookZip = project.configurations.docbook.files.find { File file -> file.name.contains('docbook-xsl-')};
+//
+//        project.copy {
+//            from project.zipTree(docbookZip)
+//            include 'docbook/**'
+//            into project.getBuildDir()
+//        }
+//    }
+//}
+//
+//class PrepareDocSources extends DefaultTask {
+//
+//    @OutputDirectory
+//    File outputDir = new File(project.getBuildDir(), "work")
+//
+//    @TaskAction
+//    public final void prepareDocSources() {
+//        def version = project.docbook.version
+//        def tokenMap = [
+//            'project.name': 'Virgo',
+//            'runtime.category': 'EclipseRT',
+//            'umbrella.product.name': 'Virgo Runtime Environment',
+//            'umbrella.product.name.short': 'Virgo Runtime',
+//            'tomcat.product.name': 'Virgo Server for Apache Tomcat',
+//            'tomcat.product.name.short': 'VTS',
+//            'jetty.product.name': 'Virgo Jetty Server',
+//            'jetty.product.name.short': 'VJS',
+//            'kernel.product.name': 'Virgo Kernel',
+//            'kernel.product.name.short': 'VK',
+//            'nano.product.name': 'Virgo Nano',
+//            'nano.product.name.short': 'VN',
+//            'nanoweb.product.name': 'Virgo Nano Web',
+//            'snaps.product.name': 'Virgo Snaps',
+//            'snaps.product.name.short': 'VS',
+//            'ebr': 'SpringSource Enterprise Bundle Repository',
+//            'p2repo': "http://download.eclipse.org/virgo/updatesite/${version}".toString(),
+//            'bundle.version': "${version}".toString(),
+//        ]
+//
+//        project.copy {
+//            from project.file(project.docbook.docSourceDirName)
+//            into outputDir
+//            filter(ReplaceTokens, tokens: tokenMap)
+//        }
+//        // copy DocBook images and...
+//        project.copy {
+//            from "${project.buildDir}/docbook/images"
+//            into new File(outputDir, 'images')
+//        }
+//        // project images.
+//        project.copy {
+//            from project.file(project.docbook.imageSourceDirName)
+//            into new File(outputDir, 'images')
+//        }
+//    }
+//}
+//
+//class DocbookReferenceTask extends DefaultTask {
+//
+//    File inputDir
+//
+//    File outputDir
+//
+//    String customStylesheetLocation
+//
+//    String outputFormat
+//
+//    String extension
+//
+//    @OutputDirectory
+//    File outputBaseDir = new File(project.getBuildDir(), "reference")
+//
+//    @TaskAction
+//    public final void transform() {
+//        inputDir = new File(project.buildDir, 'work')
+//        outputDir = new File(outputBaseDir, outputFormat)
+//
+//        SAXParserFactory factory = new org.apache.xerces.jaxp.SAXParserFactoryImpl()
+//        factory.setXIncludeAware(true)
+//
+//        CatalogResolver resolver = new CatalogResolver(createCatalogManager())
+//
+//        TransformerFactory transformerFactory = new TransformerFactoryImpl()
+//        transformerFactory.setURIResolver(resolver)
+//
+//        File stylesheetFile = new File(inputDir, "styles/${customStylesheetLocation}")
+//        URL url = stylesheetFile.toURI().toURL()
+//
+//        Transformer transformer = transformerFactory.newTransformer(new StreamSource(url.openStream(), url.toExternalForm()))
+//        transformer.setParameter("highlight.source", "1")
+//        transformer.setParameter("highlight.xslthl.config", new File("${project.buildDir}/docbook/highlighting", "xslthl-config.xml").toURI().toURL())
+//        transformer.setParameter("root.filename", project.docbook.baseName)
+//        transformer.setParameter("base.dir", outputDir)
+//
+//        File inputFile = new File(inputDir, "${project.docbook.baseName}.xml")
+//        File outputFile = new File(outputDir, "${project.docbook.baseName}.${extension}")
+//
+//        XMLReader reader = factory.newSAXParser().getXMLReader()
+//        reader.setEntityResolver(resolver)
+//
+//        transformer.transform(new SAXSource(reader, new InputSource(inputFile.getAbsolutePath())), new StreamResult(outputFile.getAbsolutePath()))
+//
+//        project.copy {
+//            from "${inputDir}/images"
+//            into new File(outputDir, "images")
+//        }
+//        project.copy {
+//            from "${inputDir}/css"
+//            into new File(outputDir, "css")
+//        }
+//    }
+//
+//    private CatalogManager createCatalogManager() {
+//        CatalogManager manager = new CatalogManager()
+//        manager.setIgnoreMissingProperties(true)
+//        ClassLoader classLoader = this.getClass().getClassLoader()
+//        URL docbookCatalog = classLoader.getResource("docbook/catalog.xml")
+//        manager.setCatalogFiles(docbookCatalog.toExternalForm())
+//        return manager
+//    }
+//}
+//
+//class FopTask extends DefaultTask {
+//
+//    File inputDir = new File(project.getBuildDir(), "reference/pdf")
+//
+//    @TaskAction
+//    public final void foToPdf() {
+//        File foFile = new File(project.getBuildDir(), "reference/pdf/${project.docbook.baseName}.fo")
+//
+//        project.copy {
+//            from new File(project.buildDir, "work/images")
+//            into new File(inputDir, 'images')
+//        }
+//
+//        FopFactory fopFactory = FopFactory.newInstance()
+//        fopFactory.setBaseURL(inputDir.toURI().toURL().toExternalForm())
+//
+//        final File pdfFile = new File(foFile.parent, "${project.docbook.baseName}.pdf")
+//
+//        logger.debug("Transforming 'fo' file " + foFile + " to PDF: " + pdfFile)
+//
+//        OutputStream out = null
+//        try {
+//            out = new BufferedOutputStream(new FileOutputStream(pdfFile))
+//
+//            Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, out)
+//
+//            TransformerFactory factory = TransformerFactory.newInstance()
+//            Transformer transformer = factory.newTransformer()
+//
+//            Source src = new StreamSource(foFile)
+//            src.setSystemId(foFile.toURI().toURL().toExternalForm())
+//
+//            Result res = new SAXResult(fop.getDefaultHandler())
+//            transformer.transform(src, res)
+//        } finally {
+//            if (out != null) {
+//                out.close()
+//            }
+//        }
+//
+//        if (!foFile.delete()) {
+//            logger.warn("Failed to delete temporary 'fo' file " + foFile)
+//        }
+//        if (!project.delete(new File(inputDir, 'images'))) {
+//            logger.warn("Failed to delete 'images' path " + new File(inputDir, 'images'))
+//        }
+//        if (!project.delete(new File(inputDir, 'css'))) {
+//            logger.warn("Failed to delete 'css' path " + new File(inputDir, 'css'))
+//        }
+//    }
+//}
diff --git a/buildSrc/src/main/groovy/docbook/DocbookExtension.groovy b/buildSrc/src/main/groovy/docbook/DocbookExtension.groovy
new file mode 100644
index 0000000..b2008db
--- /dev/null
+++ b/buildSrc/src/main/groovy/docbook/DocbookExtension.groovy
@@ -0,0 +1,10 @@
+//package docbook
+//
+//class DocbookExtension {
+//
+//    String baseName = 'index'
+//    String docSourceDirName = 'src/docs/docbook'
+//    String imageSourceDirName = 'src/docs/images'
+//
+//    String version = 'undefined_doc_version'
+//}
diff --git a/buildSrc/src/main/groovy/eclipsebuild/BuildshipConfig.groovy b/buildSrc/src/main/groovy/eclipsebuild/BuildshipConfig.groovy
new file mode 100644
index 0000000..a315a71
--- /dev/null
+++ b/buildSrc/src/main/groovy/eclipsebuild/BuildshipConfig.groovy
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2015 the original author or authors.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Donát Csikós (Gradle Inc.) - initial API and implementation and initial documentation
+ */
+
+package eclipsebuild
+
+import org.gradle.api.Project
+
+/**
+ * Holds Buildship-specific, configuration-dependent settings for the plug-ins.
+ */
+class BuildshipConfig {
+
+    static final String RELEASE_TYPE_PROJECT_PROPERTY = 'release.type'
+
+    static final String RELEASE = 'release'
+    static final String MILESTONE = 'milestone'
+    static final String SNAPSHOT = 'snapshot'
+
+    static final def RELEASE_TYPES = [RELEASE, MILESTONE, SNAPSHOT]
+
+    final def project
+
+    private BuildshipConfig(Project project) {
+        this.project = project
+    }
+
+    static def on(Project project) {
+        new BuildshipConfig(project)
+    }
+
+    def isRelease() {
+        project.hasProperty(RELEASE_TYPE_PROJECT_PROPERTY) ? releaseType == RELEASE : false
+    }
+
+    def isMilestone() {
+        project.hasProperty(RELEASE_TYPE_PROJECT_PROPERTY) ? releaseType == MILESTONE : false
+    }
+
+    def isSnapshot() {
+        project.hasProperty(RELEASE_TYPE_PROJECT_PROPERTY) ? releaseType == SNAPSHOT : true // by default, use as snapshot release
+    }
+
+    private def getReleaseType() {
+        def releaseType = project.property(RELEASE_TYPE_PROJECT_PROPERTY)
+        if (RELEASE_TYPES.contains(releaseType)) {
+            releaseType
+        } else {
+          throw new IllegalArgumentException("Unsupported value for project property '$RELEASE_TYPE_PROJECT_PROPERTY': $releaseType. Supported values: $RELEASE_TYPES")
+        }
+    }
+
+}
diff --git a/buildSrc/src/main/groovy/eclipsebuild/FeaturePlugin.groovy b/buildSrc/src/main/groovy/eclipsebuild/FeaturePlugin.groovy
new file mode 100644
index 0000000..aea4b7a
--- /dev/null
+++ b/buildSrc/src/main/groovy/eclipsebuild/FeaturePlugin.groovy
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2015 the original author or authors.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Donát Csikós (Gradle Inc.) - initial API and implementation and initial documentation
+ */
+
+package eclipsebuild
+
+import org.gradle.api.Plugin
+import org.gradle.api.Project
+import org.gradle.api.plugins.JavaPlugin
+
+/**
+ * Gradle plug-in for building Eclipse features.
+ * <p/>
+ * It validates the existence of the files feature.xml, feature.properties, build.properties, and META-INF/MANIFEST.MF. It also
+ * adds all files and folders that are defined by the bin.includes entry in the build.properties file to the feature jar.
+ */
+class FeaturePlugin implements Plugin<Project> {
+
+    @Override
+    public void apply(Project project) {
+      // apply the Java plugin to have the life-cycle tasks
+      project.plugins.apply(JavaPlugin)
+
+      // sync jar content with the build.properties file
+      PluginUtils.configureFeatureJarInput(project)
+
+      // validate the content
+      validateRequiredFilesExist(project)
+    }
+
+    static void validateRequiredFilesExist(Project project) {
+        project.gradle.taskGraph.whenReady {
+            // make sure the required descriptors exist
+            assert project.file('build.properties').exists()
+            // TODO - do features really need a MANIFEST.MF?
+//            assert project.file('META-INF/MANIFEST.MF').exists()
+            assert project.file('feature.xml').exists()
+            assert project.file('feature.properties').exists()
+        }
+    }
+
+}
diff --git a/buildSrc/src/main/groovy/eclipsebuild/FileSemaphore.groovy b/buildSrc/src/main/groovy/eclipsebuild/FileSemaphore.groovy
new file mode 100644
index 0000000..7b9ad7f
--- /dev/null
+++ b/buildSrc/src/main/groovy/eclipsebuild/FileSemaphore.groovy
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2015 the original author or authors.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Donát Csikós (Gradle Inc.) - initial API and implementation and initial documentation
+ */
+
+package eclipsebuild
+
+import java.nio.channels.FileLock
+
+/**
+ * Utility class for inter-process-synchronization by using a {@code FileLock} as a semaphore.
+ * <p/>
+ * When the {@link FileSemaphore#lock()} method is called, a .lock file is created under a given folder guarded by
+ * the FileChannel.lock(). This lock can be released again by calling the {@link FileSemaphore#unlock()} method.
+ */
+class FileSemaphore {
+
+    final File directory
+    FileOutputStream fos
+    FileLock lock
+
+    FileSemaphore(File directory) {
+        this.directory = directory
+    }
+
+    def lock() {
+        File lockFile = new File(directory, ".lock")
+        if (!lockFile.exists()) {
+            lockFile.getParentFile().mkdirs()
+            lockFile.createNewFile()
+        }
+        fos = new FileOutputStream(lockFile)
+        lock = fos.getChannel().lock()
+    }
+
+    def unlock() {
+        lock.release()
+        fos.close()
+    }
+
+}
diff --git a/buildSrc/src/main/groovy/eclipsebuild/PluginUtils.groovy b/buildSrc/src/main/groovy/eclipsebuild/PluginUtils.groovy
new file mode 100644
index 0000000..168d21e
--- /dev/null
+++ b/buildSrc/src/main/groovy/eclipsebuild/PluginUtils.groovy
@@ -0,0 +1,120 @@
+/*
+ * Copyright (c) 2015 the original author or authors.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Donát Csikós (Gradle Inc.) - initial API and implementation and initial documentation
+ */
+
+package eclipsebuild
+
+import org.apache.tools.ant.filters.ReplaceTokens
+import org.gradle.api.Project
+
+/**
+ * Static helper functions which can be used different places around the Eclipse plugin build.
+ */
+public class PluginUtils {
+
+    /**
+     * Copies the content of the plugin project's MANIFEST.MF file to the plugin artifact generated by the <i>jar</i> task of this project.
+     * While copying the MANIFEST.MF file, the value of the <i>Bundle-Version</i> attribute is replaced with the build version of the project.
+     *
+     * @param project the plugin project whose MANIFEST.MF file of the artifact of the jar task to update
+     */
+    static void updatePluginManifest(Project project) {
+        project.jar {
+            manifest {
+                attributes 'Bundle-Version' : project.version
+                from('META-INF/MANIFEST.MF') {
+                    eachEntry { entry ->
+                        if (entry.key == 'Bundle-Version') {
+                            entry.value = project.version
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * Configures the plugin artifact generated by the <i>jar</i> task of this plugin project to have the same content as declared in the
+     * plugin project's build.properties file.
+     *
+     * @param project the plugin project whose content of the artifact of the jar task to configure
+     */
+    static void configurePluginJarInput(Project project) {
+        def buildProperties = readBuildPropertiesFile(project)
+        Set resources = splitBinIncludes(buildProperties.getProperty('bin.includes'))
+        addPluginJarInput(resources, project)
+    }
+
+    /**
+     * Configures the feature artifact generated by the <i>jar</i> task of this feature project to have the same content as declared in the
+     * plugin project's build.properties file. While configuring the <i>jar</i> task, the version placeholder in the <i>feature.xml<i/> file
+     * is replaced with the build version of the project.
+     *
+     * @param project the plugin project whose content of the artifact of the jar task to configure
+     */
+    static void configureFeatureJarInput(Project project) {
+        def buildProperties = readBuildPropertiesFile(project)
+        Set resources = splitBinIncludes(buildProperties.getProperty('bin.includes'))
+        addFeatureJarInput(resources, project)
+    }
+
+    private static Properties readBuildPropertiesFile(Project project) {
+        def buildProperties = new Properties()
+        def fis = new FileInputStream(project.file('build.properties'))
+        buildProperties.load(fis)
+        fis.close()
+        buildProperties
+    }
+
+    private static Set splitBinIncludes(String binIncludes) {
+        Set result = new LinkedHashSet()
+        def virtualResources = ['.']
+        binIncludes.split(',').each { relPath ->
+            relPath = relPath.trim()
+            if(!relPath.isEmpty() && !(relPath in virtualResources)) {
+                result.add(relPath)
+            }
+        }
+        result
+    }
+
+    private static void addPluginJarInput(Set locations, Project project) {
+        for (String location in locations) {
+            File resource = project.file(location)
+            if (resource.isDirectory()) {
+                project.jar {
+                    from(location, { into(location) })
+                }
+            } else {
+                project.jar { from location }
+            }
+        }
+    }
+
+    private static void addFeatureJarInput(Set locations, Project project) {
+        for (String location in locations) {
+            File resource = project.file(location)
+            if (resource.isDirectory()) {
+                project.jar {
+                    from(location, { into(location) })
+                }
+            } else {
+                project.jar {
+                    from location
+                    if (resource.name == 'feature.xml') {
+                        // TODO - discuss with buildship project
+                        // filter(ReplaceTokens, tokens:['1.0.0.qualifier' :'"' + project.version + '"'], beginToken: '"', endToken: '"')
+                        filter(ReplaceTokens, tokens: project.tokenMap)
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/buildSrc/src/main/groovy/virgobuild/Config.groovy b/buildSrc/src/main/groovy/virgobuild/Config.groovy
new file mode 100644
index 0000000..dddd4e7
--- /dev/null
+++ b/buildSrc/src/main/groovy/virgobuild/Config.groovy
@@ -0,0 +1,41 @@
+package virgobuild
+
+import org.gradle.api.Project
+
+class Config {
+
+    private final Project project
+
+    static Config on(Project project) {
+        return new Config(project)
+    }
+
+    private Config(Project project) {
+        this.project = project
+    }
+
+    File getVirgoBuildToolsBaseDir() {
+        // to avoid configuration timing issues we don't cache the values in fields
+        // @see buildship project eclipsebuild.Config
+        project.hasProperty('virgoBuildToolsDir') ?
+                new File(project.property('virgoBuildToolsDir') as String) :
+                new File(System.getProperty('user.home'), '.tooling/virgo')
+    }
+
+    File getVirgoBuildToolsDir() {
+        String virgoBuildToolsBaseName="virgo-build-tools-${Constants.virgoBuildToolsVersion}"
+        new File(virgoBuildToolsBaseDir, virgoBuildToolsBaseName)
+    }
+
+    File getVirgoBuildToolsArchive() {
+        new File(virgoBuildToolsDir, 'virgo-tools.zip')
+    }
+
+    File getEquinoxLauncherJar() {
+        new File(virgoBuildToolsDir.path, '/plugins').listFiles().find { it.name.startsWith('org.eclipse.equinox.launcher_') }
+    }
+
+    File getJarProcessorJar() {
+        new File(virgoBuildToolsDir.path, '/plugins').listFiles().find { it.name.startsWith('org.eclipse.equinox.p2.jarprocessor_') }
+    }
+}
diff --git a/buildSrc/src/main/groovy/virgobuild/Constants.groovy b/buildSrc/src/main/groovy/virgobuild/Constants.groovy
new file mode 100644
index 0000000..9225808
--- /dev/null
+++ b/buildSrc/src/main/groovy/virgobuild/Constants.groovy
@@ -0,0 +1,16 @@
+package virgobuild
+
+class Constants {
+
+    static String getGradleTaskGroupName() {
+        return "Virgo Build"
+    }
+
+    static String getVirgoBuildToolsVersion() {
+        return '1.4.1.RELEASE'
+    }
+
+    static URL getVirgoBuildToolsDownloadUrl() {
+        return new URL("http://build.eclipse.org/rt/virgo/zips/release/VB/${virgoBuildToolsVersion}/virgo-build-tools-${virgoBuildToolsVersion}.zip")
+    }
+}
diff --git a/buildSrc/src/main/groovy/virgobuild/UpdateSitePlugin.groovy b/buildSrc/src/main/groovy/virgobuild/UpdateSitePlugin.groovy
new file mode 100644
index 0000000..4df50c1
--- /dev/null
+++ b/buildSrc/src/main/groovy/virgobuild/UpdateSitePlugin.groovy
@@ -0,0 +1,374 @@
+package virgobuild
+
+import static virgobuild.VirgoToolsPlugin.DOWNLOAD_VIRGO_BUILD_TOOLS_TASK_NAME
+
+import org.gradle.api.Plugin
+import org.gradle.api.Project
+import org.gradle.api.artifacts.ProjectDependency
+import org.gradle.api.file.FileCollection
+import org.gradle.api.logging.LogLevel
+import org.gradle.api.plugins.JavaPlugin
+
+import eclipsebuild.FeaturePlugin
+
+// Derived from buildship Plugins
+class UpdateSitePlugin implements Plugin<Project> {
+
+    /**
+     * Extension class to configure the UpdateSite plugin.
+     */
+    static class Extension {
+        File siteDescriptor
+        FileCollection extraResources
+        // TOOD - remove this hook once all of our features are consolidated are migrated to feature projects
+        Closure hook
+        Closure signing
+        Closure mutateArtifactsXml
+    }
+
+    // name of the root node in the DSL
+    static final String DSL_EXTENSION_NAME = 'updateSite'
+
+    // buildship task names (in order of execution)
+    static final String COPY_BUNDLES_TASK_NAME = 'copyBundles'
+    static final String NORMALIZE_BUNDLES_TASK_NAME = 'normalizeBundles'
+    static final String SIGN_BUNDLES_TASK_NAME = 'signBundles'
+    static final String COMPRESS_BUNDLES_TASK_NAME = 'compressBundles'
+    static final String CREATE_P2_REPOSITORY_TASK_NAME = 'createP2Repository'
+
+    // temporary folder names during build
+    static final String PRE_NORMALIZED_BUNDLES_DIR_NAME = 'unconditioned-bundles'
+    static final String UNSIGNED_BUNDLES_DIR_NAME = 'unsigned-bundles'
+    static final String SIGNED_BUNDLES_DIR_NAME = 'signed-bundles'
+    static final String COMPRESSED_BUNDLES_DIR_NAME = 'compressed-bundles'
+    static final String FEATURES_DIR_NAME = 'features'
+    static final String PLUGINS_DIR_NAME = 'plugins'
+    static final String REPOSITORY_DIR_NAME = 'repository'
+
+    @Override
+    public void apply(Project project) {
+        configureProject(project)
+        addTaskCopyBundles(project)
+        addTaskNormalizeBundles(project)
+        addTaskSignBundles(project)
+        addTaskCompressBundles(project)
+        addTaskCreateP2Repository(project)
+    }
+
+    static void configureProject(Project project) {
+        // apply the Java plugin to have the life-cycle tasks
+        project.plugins.apply(JavaPlugin)
+
+        // create scopes for local and external plugins and features
+        project.configurations.create('localPlugin')
+        project.configurations.create('localFeature')
+        project.configurations.create('externalPlugin')
+        project.configurations.create('signedExternalPlugin')
+
+        // add the 'updateSite' extension
+        project.extensions.create(DSL_EXTENSION_NAME, Extension)
+        project.updateSite.siteDescriptor = project.file('category.xml')
+        project.updateSite.extraResources = project.files()
+        project.updateSite.hook = null
+        project.updateSite.signing = null
+        project.updateSite.mutateArtifactsXml = null
+
+        // validate the content
+        validateRequiredFilesExist(project)
+    }
+
+    static void addTaskCopyBundles(Project project) {
+        def copyBundlesTask = project.task(COPY_BUNDLES_TASK_NAME) {
+
+            dependsOn ':kernel:org.eclipse.virgo.kernel.services:rewriteJar'
+
+            group = Constants.gradleTaskGroupName
+            description = 'Collects the bundles that make up the update site.'
+            outputs.dir new File(project.buildDir, PRE_NORMALIZED_BUNDLES_DIR_NAME)
+            doLast { copyBundles(project) }
+            doLast { project.updateSite.hook(project) }
+        }
+
+        // add inputs for each plugin/feature project once this build script has been evaluated (before that, the dependencies are empty)
+        project.afterEvaluate {
+            for (ProjectDependency projectDependency : project.configurations.localPlugin.dependencies.withType(ProjectDependency)) {
+                // check if the dependent project is a bundle or feature, once its build script has been evaluated
+                def dependency = projectDependency.dependencyProject
+                //                if (dependency.plugins.hasPlugin(BundlePlugin)) {
+                copyBundlesTask.inputs.files dependency.tasks.assemble.outputs.files
+                //                } else {
+                //                    dependency.afterEvaluate {
+                //                        if (dependency.plugins.hasPlugin(BundlePlugin)) {
+                //                            copyBundlesTask.inputs.files dependency.tasks.jar.outputs.files
+                //                        }
+                //                    }
+                //                }
+            }
+        }
+
+        project.afterEvaluate {
+            for (ProjectDependency projectDependency : project.configurations.localFeature.dependencies.withType(ProjectDependency)) {
+                // check if the dependent project is a bundle or feature, once its build script has been evaluated
+                def dependency = projectDependency.dependencyProject
+                if (dependency.plugins.hasPlugin(FeaturePlugin)) {
+                    copyBundlesTask.inputs.files dependency.tasks.jar.outputs.files
+                } else {
+                    dependency.afterEvaluate {
+                        if (dependency.plugins.hasPlugin(FeaturePlugin)) {
+                            copyBundlesTask.inputs.files dependency.tasks.jar.outputs.files
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    static void copyBundles(Project project) {
+        def rootDir = new File(project.buildDir, PRE_NORMALIZED_BUNDLES_DIR_NAME)
+        def pluginsDir = new File(rootDir, PLUGINS_DIR_NAME)
+        def featuresDir = new File(rootDir, FEATURES_DIR_NAME)
+
+        // delete old content
+        if (rootDir.exists()) {
+            project.logger.info("Delete bundles directory '${rootDir.absolutePath}'")
+            rootDir.deleteDir()
+        }
+
+        // iterate over all the project dependencies to populate the update site with the plugins and features
+        project.logger.info("Copy features and plugins to bundles directory '${rootDir.absolutePath}'")
+
+        for (ProjectDependency projectDependency : project.configurations.localPlugin.dependencies.withType(ProjectDependency)) {
+            def dependency = projectDependency.dependencyProject
+
+            // copy the output jar for each plugin project dependency
+            //            if (dependency.plugins.hasPlugin(BundlePlugin)) {
+            //                project.logger.debug("Copy plugin project '${dependency.name}' with jar '${dependency.tasks.jar.outputs.files.singleFile.absolutePath}' to '${pluginsDir}'")
+            project.copy {
+                from dependency.tasks.jar.outputs.files.singleFile
+                into pluginsDir
+            }
+            //            }
+        }
+        for (ProjectDependency projectDependency : project.configurations.localFeature.dependencies.withType(ProjectDependency)) {
+            def dependency = projectDependency.dependencyProject
+            // copy the output jar for each feature project dependency
+            if (dependency.plugins.hasPlugin(FeaturePlugin)) {
+                project.logger.debug("Copy feature project '${dependency.name}' with jar '${dependency.tasks.jar.outputs.files.singleFile.absolutePath}' to '${pluginsDir}'")
+                project.copy {
+                    from dependency.tasks.jar.outputs.files.singleFile
+                    into featuresDir
+                }
+            }
+        }
+
+        // iterate over all external dependencies and add them to the plugins (this includes the transitive dependencies)
+        project.copy {
+            from project.configurations.externalPlugin
+            into pluginsDir
+        }
+    }
+
+    static void addTaskNormalizeBundles(Project project) {
+        project.task(NORMALIZE_BUNDLES_TASK_NAME, dependsOn: [
+            COPY_BUNDLES_TASK_NAME,
+            ":${DOWNLOAD_VIRGO_BUILD_TOOLS_TASK_NAME}"
+        ]) {
+            group = Constants.gradleTaskGroupName
+            description = 'Repacks the bundles that make up the update site using the pack200 tool.'
+            inputs.dir new File(project.buildDir, PRE_NORMALIZED_BUNDLES_DIR_NAME)
+            outputs.dir new File(project.buildDir, UNSIGNED_BUNDLES_DIR_NAME)
+            doLast { normalizeBundles(project) }
+        }
+    }
+
+    static void normalizeBundles(Project project) {
+        if (System.properties['skip.normalize.bundles'] == 'true') {
+            project.logger.warn("Skipping normalization of bundles!")
+            project.copy {
+                from new File(project.buildDir, PRE_NORMALIZED_BUNDLES_DIR_NAME)
+                into new File(project.buildDir, UNSIGNED_BUNDLES_DIR_NAME)
+            }
+        } else {
+            project.javaexec {
+                main = 'org.eclipse.equinox.internal.p2.jarprocessor.Main'
+                classpath Config.on(project).jarProcessorJar
+                args = [
+                    '-processAll',
+                    '-repack',
+                    '-outputDir',
+                    new File(project.buildDir, UNSIGNED_BUNDLES_DIR_NAME),
+                    new File(project.buildDir, PRE_NORMALIZED_BUNDLES_DIR_NAME)
+                ]
+            }
+        }
+    }
+
+    static void addTaskSignBundles(Project project) {
+        project.task(SIGN_BUNDLES_TASK_NAME, dependsOn: NORMALIZE_BUNDLES_TASK_NAME) {
+            group = Constants.gradleTaskGroupName
+            description = 'Signs the bundles that make up the update site.'
+            inputs.dir new File(project.buildDir, UNSIGNED_BUNDLES_DIR_NAME)
+            outputs.dir new File(project.buildDir, SIGNED_BUNDLES_DIR_NAME)
+            doLast { project.updateSite.signing(new File(project.buildDir, UNSIGNED_BUNDLES_DIR_NAME), new File(project.buildDir, SIGNED_BUNDLES_DIR_NAME)) }
+            doLast { copyOverAlreadySignedBundles(project) }
+            onlyIf { project.updateSite.signing != null }
+        }
+    }
+
+    static void copyOverAlreadySignedBundles(Project project) {
+        project.copy {
+            from project.configurations.signedExternalPlugin
+            into new File(project.buildDir, "$SIGNED_BUNDLES_DIR_NAME/$PLUGINS_DIR_NAME")
+        }
+    }
+
+    static void addTaskCompressBundles(Project project) {
+        project.task(COMPRESS_BUNDLES_TASK_NAME, dependsOn: [
+            NORMALIZE_BUNDLES_TASK_NAME,
+            SIGN_BUNDLES_TASK_NAME,
+            ":${DOWNLOAD_VIRGO_BUILD_TOOLS_TASK_NAME}"
+        ]) {
+            group = Constants.gradleTaskGroupName
+            description = 'Compresses the bundles that make up the update using the pack200 tool.'
+            project.afterEvaluate { inputs.dir project.updateSite.signing != null ? new File(project.buildDir, SIGNED_BUNDLES_DIR_NAME) : new File(project.buildDir, UNSIGNED_BUNDLES_DIR_NAME) }
+            outputs.dir  new File(project.buildDir, COMPRESSED_BUNDLES_DIR_NAME)
+            doLast { compressBundles(project) }
+        }
+    }
+
+    static void compressBundles(Project project) {
+        File uncompressedBundles = project.updateSite.signing != null ? new File(project.buildDir, SIGNED_BUNDLES_DIR_NAME) : new File(project.buildDir, UNSIGNED_BUNDLES_DIR_NAME)
+        File compressedBundles = new File(project.buildDir, COMPRESSED_BUNDLES_DIR_NAME)
+
+        // copy over all bundles
+        project.copy {
+            from uncompressedBundles
+            into compressedBundles
+        }
+
+        if (System.properties['skip.compress.bundles'] == 'true') {
+            project.logger.warn("Skipping compression of bundles!")
+        } else {
+            // compress and store them in the same folder
+            project.javaexec {
+                main = 'org.eclipse.equinox.internal.p2.jarprocessor.Main'
+                classpath Config.on(project).jarProcessorJar
+                args = [
+                    '-pack',
+                    '-outputDir',
+                    compressedBundles,
+                    compressedBundles
+                ]
+            }
+        }
+    }
+
+    static void addTaskCreateP2Repository(Project project) {
+        def createP2RepositoryTask = project.task(CREATE_P2_REPOSITORY_TASK_NAME, dependsOn: [
+            COMPRESS_BUNDLES_TASK_NAME,
+            ":${DOWNLOAD_VIRGO_BUILD_TOOLS_TASK_NAME}"
+        ]) {
+            group = Constants.gradleTaskGroupName
+            description = 'Generates the P2 repository.'
+            inputs.file project.updateSite.siteDescriptor
+            inputs.files project.updateSite.extraResources
+            inputs.dir new File(project.buildDir, COMPRESSED_BUNDLES_DIR_NAME)
+            outputs.dir new File(project.buildDir, REPOSITORY_DIR_NAME)
+            doLast { createP2Repository(project) }
+        }
+
+        project.tasks.assemble.dependsOn createP2RepositoryTask
+    }
+
+    static void createP2Repository(Project project) {
+        def repositoryDir = new File(project.buildDir, REPOSITORY_DIR_NAME)
+
+        // delete old content
+        if (repositoryDir.exists()) {
+            project.logger.info("Delete P2 repository directory '${repositoryDir.absolutePath}'")
+            repositoryDir.deleteDir()
+        }
+
+        // create the P2 update site
+        publishContentToLocalP2Repository(project, repositoryDir)
+
+        // add custom properties to the artifacts.xml file
+        def mutateArtifactsXml = project.updateSite.mutateArtifactsXml
+        if (mutateArtifactsXml) {
+            updateArtifactsXmlFromArchive(project, repositoryDir, mutateArtifactsXml)
+        }
+    }
+
+    static void publishContentToLocalP2Repository(Project project, File repositoryDir) {
+        def rootDir = new File(project.buildDir, COMPRESSED_BUNDLES_DIR_NAME)
+
+        // publish features/plugins to the update site
+        project.logger.info("Publish plugins and features from '${rootDir.absolutePath}' to the update site '${repositoryDir.absolutePath}'")
+        project.javaexec {
+            main = 'org.eclipse.equinox.launcher.Main'
+            classpath Config.on(project).equinoxLauncherJar
+            args = [
+                '-application',
+                'org.eclipse.equinox.p2.publisher.FeaturesAndBundlesPublisher',
+                '-metadataRepository',
+                repositoryDir.toURI().toURL(),
+                '-artifactRepository',
+                repositoryDir.toURI().toURL(),
+                '-source',
+                rootDir,
+                '-compress',
+                '-publishArtifacts',
+                '-reusePack200Files',
+                '-configs',
+                'ANY'
+            ]
+        }
+
+        // publish P2 category defined in the category.xml to the update site
+        project.logger.info("Publish categories defined in '${project.updateSite.siteDescriptor.absolutePath}' to the update site '${repositoryDir.absolutePath}'")
+        project.javaexec {
+            main = 'org.eclipse.equinox.launcher.Main'
+            classpath Config.on(project).equinoxLauncherJar
+            args = [
+                '-application',
+                'org.eclipse.equinox.p2.publisher.CategoryPublisher',
+                '-metadataRepository',
+                repositoryDir.toURI().toURL(),
+                '-categoryDefinition',
+                project.updateSite.siteDescriptor.toURI().toURL(),
+                '-compress'
+            ]
+        }
+
+        // copy the extra resources to the update site
+        project.copy {
+            from project.updateSite.extraResources
+            into repositoryDir
+        }
+    }
+
+    static void updateArtifactsXmlFromArchive(Project project, File repositoryLocation, Closure mutateArtifactsXml) {
+        //        // get the artifacts.xml file from the artifacts.jar
+        //        def artifactsJarFile = new File(repositoryLocation, "artifacts.jar")
+        //        def artifactsXmlFile = project.zipTree(artifactsJarFile).matching { 'artifacts.xml' }.singleFile
+        //
+        //        // parse the xml
+        //        def xml = new XmlParser().parse(artifactsXmlFile)
+        //
+        //        // apply artifacts.xml customization (append mirrors url, link to stat servers, etc.)
+        //        mutateArtifactsXml(xml)
+        //
+        //        // write the updated artifacts.xml back to its source
+        //        // the artifacts.xml is a temporary file hence it has to be copied back to the archive
+        //        new XmlNodePrinter(new PrintWriter(new FileWriter(artifactsXmlFile)), "  ", "'").print(xml)
+        //        project.ant.zip(update: true, filesonly: true, destfile: artifactsJarFile) { fileset(file: artifactsXmlFile) }
+    }
+
+    static void validateRequiredFilesExist(Project project) {
+        project.gradle.taskGraph.whenReady {
+            // make sure the required descriptors exist
+            assert project.file(project.updateSite.siteDescriptor).exists()
+        }
+    }
+
+}
diff --git a/buildSrc/src/main/groovy/virgobuild/VirgoToolsPlugin.groovy b/buildSrc/src/main/groovy/virgobuild/VirgoToolsPlugin.groovy
new file mode 100644
index 0000000..39f3cf4
--- /dev/null
+++ b/buildSrc/src/main/groovy/virgobuild/VirgoToolsPlugin.groovy
@@ -0,0 +1,173 @@
+package virgobuild
+
+import org.gradle.api.Plugin
+import org.gradle.api.Project
+import org.gradle.api.logging.LogLevel
+
+import eclipsebuild.FileSemaphore
+
+// new comment
+// Derived from buildship Plugins
+class VirgoToolsPlugin implements Plugin<Project> {
+
+    // virgo tasks names
+    static final String DOWNLOAD_VIRGO_BUILD_TOOLS_TASK_NAME = "downloadVirgoBuildTools"
+
+    static final String TASK_NAME_GENERATE_P2_INSTRUCTIONS = "generateP2Instructions"
+
+    @Override
+    public void apply(Project project) {
+        Config config = Config.on(project)
+        addTaskDownloadVirgoBuildTools(project, config)
+    }
+
+    static void generateP2Instructions(Project project, File assemblyFeatureDir) {
+        project.logger.info("Generating p2 instructions for '${assemblyFeatureDir}'.")
+        project.javaexec {
+            main = 'org.eclipse.equinox.launcher.Main'
+            classpath Config.on(project).equinoxLauncherJar
+            args = [
+                '-application',
+                'org.eclipse.virgo.build.p2tools.instructions.P2InstructionGeneratorApplication',
+                '-source',
+                assemblyFeatureDir
+            ]
+        }
+        project.logger.info("Generated p2 instructions for '${assemblyFeatureDir}'.")
+    }
+
+    static void publishProduct(Project project, File productFileLocation, File javaProfileLocation) {
+        File repositoryDir = project.file("${project.rootProject.projectDir}/org.eclipse.virgo.site/build/repository/")
+        publishProduct(project, repositoryDir, productFileLocation, javaProfileLocation)
+
+    }
+
+    // TODO remove unnecessary variable javaProfileLocation as this can be always oev.site/config/something?!
+    @Deprecated
+    static void publishProduct(Project project, File repositoryDir, File productFileLocation, File javaProfileLocation) {
+        project.logger.info("Publishing Virgo ${productFileLocation} to '${repositoryDir}'.")
+        project.javaexec {
+            main = 'org.eclipse.equinox.launcher.Main'
+            classpath Config.on(project).equinoxLauncherJar
+            args = [
+                '-application',
+                'org.eclipse.equinox.p2.publisher.ProductPublisher',
+                '-metadataRepository',
+                "file:${repositoryDir}",
+                '-artifactRepository',
+                "file:${repositoryDir}",
+                '-append',
+                '-compress',
+                '-publishArtifacts',
+                '-productFile',
+                productFileLocation,
+//                '-jreLocation',
+//                "${javaProfileLocation}",
+                '-configs',
+                'ANY.ANY.ANY',
+                '-flavor',
+                'tooling'
+            ]
+        }
+        project.logger.info("Published Virgo ${productFileLocation} to '${repositoryDir}'.")
+    }
+
+    static void installProduct(Project project, String productIu, File destinationDir) {
+        File repositoryDir = project.file("${project.rootProject.projectDir}/org.eclipse.virgo.site/build/repository/")
+        installProduct(project, productIu, repositoryDir, destinationDir)
+    }
+
+    @Deprecated
+    static void installProduct(Project project, String productIu, File repositoryDir, File destinationDir) {
+        project.logger.info("Installing Virgo '${productIu}' assembled from '${repositoryDir}' into '${destinationDir}'.")
+        project.javaexec {
+            main = 'org.eclipse.equinox.launcher.Main'
+            classpath Config.on(project).equinoxLauncherJar
+            args = [
+                '-application',
+                'org.eclipse.equinox.p2.director',
+                '-repository',
+                "file:${repositoryDir}",
+                '-installIU',
+                productIu,
+                '-tag',
+                'InitialState',
+                '-destination',
+                destinationDir,
+                '-profile',
+                'VIRGOProfile',
+                '-roaming'
+            ]
+        }
+        project.logger.info("Installed Virgo '${productIu}' assembled from '${repositoryDir}' into '${destinationDir}'.")
+    }
+
+    static void mirrorP2UpdateSite(Project project, String source) {
+        File repositoryDir = project.file("${project.rootProject.projectDir}/org.eclipse.virgo.site/build/repository/")
+        mirrorP2UpdateSite(project, source, repositoryDir)
+    }
+
+    static void mirrorP2UpdateSite(Project project, String source, File destinationDir) {
+        project.logger.info("Mirrorring update site '${source}' into '${destinationDir}'.")
+        project.javaexec {
+            main = 'org.eclipse.equinox.launcher.Main'
+            classpath Config.on(project).equinoxLauncherJar
+            args = [
+                '-application',
+                'org.eclipse.equinox.p2.metadata.repository.mirrorApplication',
+                '-writeMode',
+                '-source',
+                "${source}",
+                '-destination',
+                "${destinationDir}",
+            ]
+        }
+        project.javaexec {
+            main = 'org.eclipse.equinox.launcher.Main'
+            classpath Config.on(project).equinoxLauncherJar
+            args = [
+                '-application',
+                'org.eclipse.equinox.p2.artifact.repository.mirrorApplication',
+                '-writeMode',
+                '-source',
+                "${source}",
+                '-destination',
+                "${destinationDir}",
+            ]
+        }
+        project.logger.info("Mirrorred update site '${source}' into '${destinationDir}'.")
+    }
+
+    static void addTaskDownloadVirgoBuildTools(Project project, Config config) {
+        project.task(DOWNLOAD_VIRGO_BUILD_TOOLS_TASK_NAME) {
+            group = Constants.gradleTaskGroupName
+            description = "Downloads the Virgo Build Tools to perform P2 operations with."
+            outputs.file config.virgoBuildToolsArchive
+            doLast { downloadVirgoBuildTools(project, config) }
+        }
+    }
+
+    static void downloadVirgoBuildTools(Project project, Config config) {
+        // if multiple builds start on the same machine (which is the case with a CI server)
+        // we want to prevent them downloading the same file to the same destination
+        def directoryLock = new FileSemaphore(config.virgoBuildToolsDir)
+        directoryLock.lock()
+        try {
+            downloadVirgoBuildToolsUnprotected(project, config)
+        } finally {
+            directoryLock.unlock()
+        }
+    }
+
+    static void downloadVirgoBuildToolsUnprotected(Project project, Config config) {
+        // download the archive
+        File virgoBuildToolsArchive = config.virgoBuildToolsArchive
+        project.logger.info("Download Virgo Build Tools from '${Constants.virgoBuildToolsDownloadUrl}' to '${virgoBuildToolsArchive.absolutePath}'")
+        project.ant.get(src: Constants.virgoBuildToolsDownloadUrl, dest: virgoBuildToolsArchive)
+
+        // extract it to the same location where it was extracted
+        project.logger.info("Extract '$virgoBuildToolsArchive' to '$virgoBuildToolsArchive.parentFile.absolutePath'")
+        project.ant.unzip(src: virgoBuildToolsArchive, dest: virgoBuildToolsArchive.parentFile, overwrite: true)
+    }
+
+}
diff --git a/config/findbugs/excludeFilter.xml b/config/findbugs/excludeFilter.xml
new file mode 100644
index 0000000..3649aec
--- /dev/null
+++ b/config/findbugs/excludeFilter.xml
@@ -0,0 +1,6 @@
+<FindBugsFilter>
+     <!-- Exclusions -->
+     <Match>
+       	<Bug code="BAC,PS"/>
+     </Match>
+</FindBugsFilter>
diff --git a/ebr/README.md b/ebr/README.md
new file mode 100644
index 0000000..4971e96
--- /dev/null
+++ b/ebr/README.md
@@ -0,0 +1,22 @@
+## Publishing 3rd party bundles
+
+### Building 
+
+Gradle default tasks:
+ 1. `clean` - Cleans old build output
+ 2. `bundlor` - Generates the OSGiifed MF and outputs jar bundles
+ 3. `publishToMavenLocal` - Publishes jar bundles to `[USER_HOME]/.m2/org/eclipse/virgo/mirrored/[artifactId]/[version]/[bundle].jar`
+ 4. `test` - Executes the PaxExam tests, the bundles are resolved against local Maven repo thus `publishToMavenLocal` is required to be executed before `test`
+ 5. `publishIvyPublicationToIvyRepository` - Publishes the jar bundles to `build.eclipse.org` ivy repo (only possible on HIPP)
+ 
+Building locally:
+
+    `./gradlew clean bundlor publishToMavenLocal test`
+
+### Add new Version of Spring
+
+TBD
+
+### Writing PaxExam test for 3rd party bundle
+
+TBD
diff --git a/ebr/build.gradle b/ebr/build.gradle
new file mode 100644
index 0000000..0682ba1
--- /dev/null
+++ b/ebr/build.gradle
@@ -0,0 +1,111 @@
+buildscript {
+    repositories { mavenCentral() }
+    dependencies {
+        classpath 'org.apache.ivy:ivy:2.4.0'
+    }
+}
+
+defaultTasks 'clean', 'bundlor', 'publishToMavenLocal', 'test', 'publishIvyPublicationToIvyRepository'
+
+apply plugin: 'java'
+
+allprojects {
+    apply plugin: 'java'
+
+    repositories {
+        mavenCentral()
+        ivy {
+            url "http://build.eclipse.org/rt/virgo/ivy/bundles/release/"
+            layout "pattern", { artifact "[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" }
+        }
+        maven { url 'http://repository.springsource.com/maven/bundles/external' }
+    }
+}
+
+subprojects {
+    apply plugin: 'ivy-publish'
+    apply plugin: 'maven-publish'
+
+    configurations {
+        bundlorRuntime
+        sourceBundle
+    }
+
+    dependencies {
+        bundlorRuntime('org.eclipse.virgo.bundlor:org.eclipse.virgo.bundlor.commandline:1.1.2.RELEASE')
+        bundlorRuntime('org.eclipse.virgo.bundlor:org.eclipse.virgo.bundlor:1.1.2.RELEASE')
+        bundlorRuntime('org.eclipse.virgo.bundlor:org.eclipse.virgo.bundlor.blint:1.1.2.RELEASE')
+    }
+
+    task createBuildDir() {
+        doLast() {
+            file(project.buildDir).mkdir()
+        }
+    }
+
+    task('addProjectVersionToGradlePropertiesTask', type: Copy) {
+        ext.outputDir = new File(buildDir, 'bundlor-properties')
+        inputs.file project.rootProject.file('gradle.properties')
+        outputs.dir ext.outputDir
+        from project.rootProject.file('gradle.properties')
+        into ext.outputDir
+    }
+
+    def artifactName = project.name.split('-')[0]
+    def artifactVersion = project.name.split('-')[1]
+
+    def outputFile = new File(file(project.buildDir), "${project.name}.jar")
+
+    def propertiesPath = new File(file(project.buildDir), "bundlor-properties/gradle.properties")
+
+    task bundlor(type: JavaExec, dependsOn: [createBuildDir, 'addProjectVersionToGradlePropertiesTask']) {
+
+        classpath = configurations.bundlorRuntime
+
+        main = 'org.eclipse.virgo.bundlor.commandline.Bundlor'
+        args '-r', propertiesPath
+        args '-D', "springframeworkVersion=${springframeworkVersion}"
+        args '-i', "${-> configurations.sourceBundle[0]}" // lazy GString to resolve the configuration at runtime
+        args '-m', "${artifactName}.mf"
+        args '-o', outputFile
+        args '-f'
+    }
+
+    publishing {
+        publications {
+            ivy(IvyPublication) {
+                organisation 'org.eclipse.virgo.mirrored'
+                module "${artifactName}"
+                revision "${artifactVersion}"
+                artifact(outputFile)
+            }
+            maven(MavenPublication) {
+                groupId 'org.eclipse.virgo.mirrored'
+                artifactId "${artifactName}"
+                version "${artifactVersion}"
+                artifact(outputFile)
+            }
+        }
+        repositories {
+            ivy {
+                url "/opt/public/rt/virgo/ivy/bundles/release"
+            }
+        }
+    }
+}
+
+dependencies {
+    testCompile "junit:junit:${junitVersion}"
+    testCompile "org.ops4j.pax.exam:pax-exam-junit4:$paxExamJunit4Version"
+    testCompile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi", version: equinoxVersion, configuration: "compile", ext: "jar"
+    testCompile group: "org.eclipse.virgo.mirrored", name: "javax.inject", version: javaxInjectVersion, configuration: "compile", ext: "jar"
+    testRuntime "org.ops4j.pax.exam:pax-exam-container-native:$paxExamContainerNativeVersion"
+    testRuntime "org.ops4j.pax.exam:pax-exam-link-mvn:$paxExamLinkMvnVersion"
+    testRuntime "org.ops4j.pax.url:pax-url-aether:$paxUrlAetherVersion"
+}
+
+task wrapper(type: Wrapper) {
+    description 'Creates a local Gradle Wrapper'
+    group = 'Build Setup'
+    gradleVersion = '3.5' // CQ 13634
+}
diff --git a/ebr/com.squareup.okhttp3-3.8.0/build.gradle b/ebr/com.squareup.okhttp3-3.8.0/build.gradle
new file mode 100644
index 0000000..7e7973f
--- /dev/null
+++ b/ebr/com.squareup.okhttp3-3.8.0/build.gradle
@@ -0,0 +1,3 @@
+dependencies {
+    sourceBundle group: 'com.squareup.okhttp3', name: 'okhttp', version: okhttp3Version
+}
diff --git a/ebr/com.squareup.okhttp3-3.8.0/com.squareup.okhttp3.mf b/ebr/com.squareup.okhttp3-3.8.0/com.squareup.okhttp3.mf
new file mode 100644
index 0000000..c539dad
--- /dev/null
+++ b/ebr/com.squareup.okhttp3-3.8.0/com.squareup.okhttp3.mf
@@ -0,0 +1,16 @@
+Bundle-SymbolicName: com.squareup.okhttp3
+Bundle-Name: OkHttp
+Bundle-Vendor: Eclipse Virgo
+Bundle-ManifestVersion: 2
+Bundle-Version: 3.8.0
+Import-Template:
+ okio;version="[1.13.0,2)",
+ android.util;version="0";resolution:="optional",
+ javax.annotation;version="0";resolution:=optional,
+ javax.net.*;version="0";resolution:=optional,
+ javax.security.auth.x500;version="0";resolution:=optional
+Ignored-Existing-Headers:
+ Bnd-LastModified,
+ Import-Package,
+ Export-Package,
+ Tool
diff --git a/ebr/com.squareup.okio-1.13.0/build.gradle b/ebr/com.squareup.okio-1.13.0/build.gradle
new file mode 100644
index 0000000..9aabb53
--- /dev/null
+++ b/ebr/com.squareup.okio-1.13.0/build.gradle
@@ -0,0 +1,3 @@
+dependencies {
+    sourceBundle group: 'com.squareup.okio', name: 'okio', version: okioVersion
+}
diff --git a/ebr/com.squareup.okio-1.13.0/com.squareup.okio.mf b/ebr/com.squareup.okio-1.13.0/com.squareup.okio.mf
new file mode 100644
index 0000000..96eb69a
--- /dev/null
+++ b/ebr/com.squareup.okio-1.13.0/com.squareup.okio.mf
@@ -0,0 +1,14 @@
+Bundle-SymbolicName: com.squareup.okio
+Bundle-Name: Okio
+Bundle-Vendor: Eclipse Virgo
+Bundle-ManifestVersion: 2
+Bundle-Version: 1.13.0
+Import-Template:
+ javax.annotation;version="0";resolution:=optional,
+ javax.crypto.*;version="0";resolution:=optional,
+ org.codehaus.mojo.animal_sniffer;version="[1.15,2)";resolution:=optional
+Ignored-Existing-Headers:
+ Bnd-LastModified,
+ Import-Package,
+ Export-Package,
+ Tool
diff --git a/ebr/ebr.iml b/ebr/ebr.iml
new file mode 100644
index 0000000..f4601dc
--- /dev/null
+++ b/ebr/ebr.iml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module external.linked.project.id="ebr" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$" external.system.id="GRADLE" external.system.module.group="" external.system.module.version="unspecified" type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" inherit-compiler-output="true">
+    <exclude-output />
+    <content url="file://$MODULE_DIR$">
+      <excludeFolder url="file://$MODULE_DIR$/.gradle" />
+      <excludeFolder url="file://$MODULE_DIR$/build" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>
\ No newline at end of file
diff --git a/ebr/gradle.properties b/ebr/gradle.properties
new file mode 100644
index 0000000..8ba926d
--- /dev/null
+++ b/ebr/gradle.properties
@@ -0,0 +1,360 @@
+# sftp server url
+ECLIPSE_ORG_FTP_HOST=build.eclipse.org
+# sftp username
+ECLIPSE_ORG_FTP_USER=virgoBuild
+# sftp key
+ECLIPSE_ORG_FTP_IDENTITY=id_virgoBuild_rsa
+# absolute path to the root of the update-sites mirror
+ECLIPSE_ORG_FTP_MIRROR_PATH=/shared/rt/virgo/ivy/bundles/release
+
+# CQ4129 (PB CQ3480)
+junitVersion = 4.7
+
+# CQ4132 (PB CQ1887)
+easymockVersion = 2.3
+
+# PaxExam
+# CQ8541
+paxExamJunit4Version = 4.11.0
+paxExamContainerNativeVersion = 4.11.0
+paxExamLinkMvnVersion = 4.11.0
+paxUrlAetherVersion = 2.5.2
+paxUrlWrapVersion = 2.3.0
+
+# CQ 12463 SLF4J jcl-over-slf4j Version: 1.7.22
+# CQ 12465 SLF4J jul-to-slf4j Version: 1.7.22
+# CQ 12464 SLF4J log4j-over-slf4j Version: 1.7.22
+# CQ 12462 SLF4J slf4j-api Version: 1.7.22
+# CQ 12540 SLF4J slf4j-nop version 1.7.22 and Later
+slf4jVersion = 1.7.22
+# CQ 12508 - Logback Classic Version 1.1.8
+# CQ 12507 - Logback Core Version: 1.1.8
+logbackVersion = 1.1.8
+
+# Eclipse Kepler 4.3.2 (SR2)
+equinoxVersion = 3.9.1.v20140110-1610
+osgiServicesVersion = 3.3.100.v20130513-1956
+osgiEnterpriseVersion = 4.2.0.v201108120515
+
+equinoxAppVersion = 1.3.100.v20130327-1442
+# ConfigAdminService
+equinoxCmVersion = 1.0.400.v20130327-1442
+# Eclipse Mars.2
+# requires 'package org.osgi.framework 1.8.0'
+# equinoxCmVersion = 1.1.0.v20131021-1936
+equinoxCommonVersion = 3.6.200.v20130402-1505
+# DeclarativeService
+equinoxDsVersion = 1.4.101.v20130813-1853
+equinoxConsoleVersion = 1.0.100.v20130429-0953
+equinoxConsoleSshVersion = 1.0.0.v20130515-2026
+equinoxEventVersion = 1.3.0.v20130327-1442
+equinoxFrameworkadminEquinoxVersion = 1.0.500.v20130327-2119
+equinoxFrameworkadminVersion = 2.0.100.v20130327-2119
+
+#equinoxHttpJettyVersion = 3.0.200.v20131021-1843
+equinoxHttpJettyVersion = 3.0.100.v20130327-1442
+#equinoxHttpServletVersion = 1.1.500.v20140318-1755
+equinoxHttpServletVersion = 1.1.400.v20130418-1354
+
+# Note: Used by Virgo Build Tools, too
+equinoxLauncherVersion = 1.3.0.v20130327-1440
+equinoxPreferencesVersion = 3.5.100.v20130422-1538
+equinoxRegionVersion = 1.1.101.v20130722-1314
+equinoxRegionExportedPackageVersion = 1.1.0
+equinoxRegistryVersion = 3.5.301.v20130717-1549
+equinoxSecurityVersion = 1.2.0.v20130424-1801
+equinoxSimpleConfiguratorVersion = 1.0.400.v20130327-2119
+equinoxSimpleConfiguratorManipulatorVersion = 2.0.0.v20130327-2119
+equinoxUtilVersion = 1.0.500.v20130404-1337
+
+eclipseCoreContenttypeVersion = 3.4.200.v20130326-1255
+eclipseCoreJobsVersion = 3.5.300.v20130429-1813
+eclipseCoreNetVersion = 1.2.200.v20130430-1352
+eclipseCoreRuntimeVersion = 3.9.100.v20131218-1515
+
+eclipseJdtCoreCompilerBatchVersion = 3.10.0.v20140604-1726
+
+eclipseEcfIdentityVersion = 3.2.0.v20130604-1622
+eclipseEcfFiletransferVersion = 5.0.0.v20130604-1622
+eclipseEcfProviderFiletransferVersion = 3.2.0.v20130604-1622
+eclipseEcfSslVersion = 1.1.0.v20130604-1622
+eclipseEcfVersion = 3.2.0.v20130604-1622
+
+sat4jCoreVersion = 2.3.5.v201308161310
+sat4jPbVersion = 2.3.5.v201308161310
+
+p2ArtifactRepositoryVersion = 1.1.200.v20130515-2028
+p2ConsoleVersion = 1.0.300.v20130327-2119
+p2CoreVersion = 2.3.0.v20130327-2119
+p2DirectorVersion = 2.3.1.v20140221-1852
+p2EngineVersion = 2.3.0.v20130526-2122
+p2GarbageCollectorVersion = 1.0.200.v20130327-2119
+p2JarProcessorVersion = 1.0.300.v20130327-2119
+p2MetadataVersion = 2.2.0.v20130523-1557
+p2MetadataRepositoryVersion = 1.2.100.v20130327-2119
+p2PublisherVersion = 1.3.0.v20140129-1405
+p2PublisherEclipseVersion = 1.1.200.v20130516-1953
+p2RepositoryVersion = 2.3.0.v20130412-2032
+p2TouchpointEclipseVersion = 2.1.200.v20130327-2119
+p2TouchpointNativesVersion = 1.1.100.v20130327-2119
+p2TransportEcfVersion = 1.1.0.v20130516-1858
+
+#CQ5528
+apacheSshdCoreVersion = 0.5.0.v201108120515
+#CQ6402 - command, shell and runtime
+gogoCommandVersion = 0.10.0.v201209301215
+gogoRuntimeVersion = 0.10.0.v201209301036
+gogoShellVersion = 0.10.0.v201211091412
+#CQ5527
+minaCoreVersion = 2.0.2.v201108120515
+
+orgAopAllianceVersion = 1.0.0
+
+geminiBlueprintVersion = 2.0.0.RELEASE
+// TODO update CQs
+#CQ 13690 org.springframework.aop
+#CQ 13691 org.springframework.aspects
+#CQ 13692 org.springframework.beans
+#CQ 13693 org.springframework.context
+#CQ 13694 org.springframework.context.support
+#CQ 13695 org.springframework.core
+#CQ 13696 org.springframework.expression
+#CQ 13697 org.springframework.jdbc
+#CQ 13698 org.springframework.jms
+#CQ 13699 org.springframework.messaging
+#CQ 13700 org.springframework.orm
+#CQ 13701 org.springframework.oxm
+#CQ 13702 org.springframework.transaction
+#CQ 13703 org.springframework.web
+#CQ 13704 org.springframework.webmvc
+#CQ 13705 org.springframework.webmvc.portlet
+#CQ 13706 org.springframework.websocket
+springframeworkVersion = 4.3.9.RELEASE
+
+geminiManagementVersion = 1.0.5.RELEASE
+geminiWebVersion = 3.0.0.RC3
+
+objectwebAsmVersion = 3.2.0.v200909071300
+scannotationVersion = 1.0.2.v201205170710
+
+commonsBeanutilsVersion = 1.8.0.v201205091237
+# CQ 10288 (PB CQ9217)
+commonsCodecVersion = 1.10.0
+commonsCliVersion = 1.2.0
+# CQ12542 (PB CQ10386)
+commonsCollectionsVersion = 3.2.2
+commonsDbcpVersion = 1.4.0.v201204271417
+# CQ12541 (PB CQ12051)
+commonsFileuploadVersion = 1.3.2
+# CQ3956 (PB CQ1765)
+commonsHttpClientVersion = 3.1.0
+
+# CQ9555 (PB Orbit CQ8938)
+httpcomponentsCoreVersion = 4.3.3
+# CQ9556 (PB Orbit CQ8934)
+httpcomponentsClientVersion = 4.3.6
+
+# CQ11189 (PB Orbit CQ8294)
+commonsIoVersion = 2.2
+commonsLangVersion = 3.1.0
+# CQ pending PB CQ10162?
+commonsLoggingVersion = 1.2.0
+commonsPoolVersion = 1.6.0.v201204271246
+
+apacheTaglibsStandardVersion = 1.1.2.v20110517
+
+apacheBvalVersion = 0.5.0
+# TODO update derby to apacheDerbyVersion = 10.12.1.1 required by spring-orm
+apacheDerbyVersion = 10.8.2.2_v201211210650
+# CQ4833 log4j Version: 1.2.15 (Subset - see all comments) (PB Orbit CQ3560)
+# TODO move forward to 1.2.17 used in spring-core
+apacheLog4jVersion = 1.2.15.v201012070815
+# CQ7162 OpenEJB (Subset) Version: 4.5.2
+apacheOpenejbVersion = 4.5.2
+apacheOpenejbCoreVersion = 4.5.2.virgo-3
+
+# CQ7145 openwebbeans (Subset) Version: 1.1.7
+apacheOpenwebbeansVersion = 1.1.7.v201304201405
+apacheOpenwebbeansEEVersion = 1.1.7.v201304200545
+apacheOpenwebbeansTomcat7Version = 1.1.7.v201304201405-virgo-1
+
+# CQ7149 XBean (Subset) Version: 3.12
+apacheXBeanAsmVersion = 3.12.0.v201304200545
+apacheXBeanBundleutilsVersion = 3.12.0.v201304200545
+apacheXBeanFinderVersion = 3.12.0.v201304201405
+apacheXBeanNamingVersion = 3.12.0.v201304201405
+apacheXBeanReflectVersion = 3.12.0.v201304201405
+
+# CQ7147 Java Server Faces Version: 2.1.18
+# TODO What's the difference of javax.faces and com.sun.faces - do we need both?
+glassfishJavaxFacesVersion = 2.1.18.v201304200545
+glassfishComSunFacesVersion = 2.1.18.v201304210537-virgo-2
+
+geronimoComponentsConnectorVersion = 3.1.1.v201205170953
+geronimoComponentsTransactionVersion = 3.1.1.v201205170710
+geronimoSpecsJ2eeManagementVersion = 1.0.0.v201205091237
+geronimoSpecsOsgiLocatorVersion = 1.1.0.v201205170953
+geronimoSpecsOsgiRegistryVersion = 1.1.0.v201205170710
+
+javaxActivationVersion = 1.1.0.v201108011116
+javaxAnnotationVersion= 1.2.0.v201401042248
+# CQ6093 ejb-api Version: 3.1.1
+javaxEjbVersion=3.1.1.v201204261316
+javaxElVersion=3.0.0.20150414
+# CQ6090 (PB Orbit CQ3578)
+javaxInjectVersion = 1.0.0.v20091030
+javaxJmsVersion=1.1.0.v201205091237
+javaxMailVersion = 1.5.5
+# TODO create CQ?
+# Available from Eclipse Link p2 site http://download.eclipse.org/rt/eclipselink/updates/2.4.2.v20130514-5956486/
+javaxPersistenceVersion=2.1.0.v201304241213
+# CQ3940
+javaxPortletVersion=2.0.0
+javaxResourceVersion=1.6.0.v201204270900
+javaxSecurityAuthMessageVersion=1.1.0
+# TODO - check if a CQ is missing
+javaxSecurityJaccVersion=1.4.0.v201205031350
+# CQ6246 Jetty servlet-api Version: 3.0 (PB CQ3217)
+# TODO - update CQ?
+javaxServletVersion = 3.1.0.20150414
+javaxServletJspVersion = 2.3.0
+# CQ12544 javax.servlet.jsp.jstl api Version: 1.2.1
+javaxServletJspJstlApiVersion=1.2.1
+# CQ12543 JSP Standard Tag Library Version 1.2.5-b03
+javaxServletJspJstlImplVersion=1.2.5.b03
+# CQ12565 Java Interceptor API 1.2
+javaxInterceptorVersion = 1.2
+# CQ12546 Java Transaction API Version: 1.2 (PB Orbit CQ7296)
+javaxTransactionVersion = 1.2
+# CQ6095 Bean Validation API Version: 1.0.0 GA (PB CQ3570)
+javaxValidationVersion=1.0.0.GA_v201205091237
+# Covered by Tomcat CQ
+javaxWebsocketVersion=1.1.0.v201401130840
+javaxWsdlVersion=1.6.2.v201012040545
+javaxWsRsVersion=1.1.1.v20101004-1200
+javaxXmlRpcVersion=1.1.0.v201005080400
+
+eclipsePersistenceAntlrVersion = 3.2.0.v201206041011
+eclipsePersistenceAsmVersion = 3.3.1.v201206041142
+# TODO update to 2.4.2 required by spring-orm
+eclipsePersistenceCoreVersion = 2.4.1.v20121003-ad44345
+eclipsePersistenceJpaVersion = 2.4.1.v20121003-ad44345
+eclipsePersistenceJpaJpqlVersion = 2.0.1.v20121003-ad44345
+
+# CQ6092 cdi-api Version: 1.0 (Context and Dependency Injection API from JSR 299)
+cdiApiVersion = 1.0.0.v201105160744
+javassistVersion = 3.17.1.GA
+# CQ6100 Java Open Transaction Manager (JOTM) 2.1.9 *Subset*
+jotmVersion = 2.1.9.v201204271116
+# TODO - update to 2.2.2 required by spring-context-support
+quartzVersion = 1.6.0.v201204271540
+
+# CQ11207
+jolokiaVersion = 1.3.3
+
+aspectjVersion = 1.8.10
+
+# Delivered with RAP 2.3.2
+jettyVersion = 8.1.16.v20140903
+# TODO move forward to latest release (as of April 8th 2016)
+#jettyVersion = 8.1.18.v20150929
+
+# CQ9080 Apache Tomcat Version: 7.0.56 (PB Orbit CQ8933)
+#apacheCatalinaVersion = 7.0.56.v201412180755
+apacheCatalinaVersion = 8.5.5
+
+# CQ7699 (PB Orbit CQ6772)
+mozillaJavascriptVersion = 1.7.4.v201209142200
+# CQ7126 Hibernate Version: 4.1.0
+# TODO - upgrade to 4.3.2.Final used in spring-context
+hibernateVersion = 4.1.0.Final
+
+# RAP 2.3.2
+eclipseCoreCommandsVersion = 3.6.100.v20140528-1422
+eclipseCoreDatabindingObservableVersion = 1.4.1.v20140210-1835
+eclipseCoreDatabindingPropertyVersion = 1.4.200.v20140214-0004
+eclipseCoreDatabindingVersion = 1.4.2.v20140729-1044
+icuBaseVersion = 52.1.1.v201501240615
+
+rapRwtVersion = 2.3.2.20150128-1013
+rapRwtOsgiVersion = 2.3.2.20150119-1706
+rapJfaceVersion = 2.3.2.20150119-1706
+rapJfaceDatabindingVersion = 2.3.2.20150119-1706
+rapUiVersion = 2.3.2.20150119-1706
+
+# performance-tests
+#    jwebunitVersion = 2.2.0
+# TODO create CQ for version 3.2?
+jwebunitVersion = 3.2
+# TODO create CQ for version 2.15?
+htmlUnitVersion = 2.15
+
+# system-tests
+dumbsterVersion = 1.6.0
+
+# OSGi test
+# optional spring 4.2.9.RELEASE dependencies - used only to generate the correct OSGi manifests
+
+# spring-aop
+jamonVersion = 2.81
+commonsPool2Version = 2.4.2
+
+# spring-aspects
+javaxCacheVersion = 1.0.0
+
+# spring-beans
+groovyVersion = 2.4.5
+snakeYamlVersion = 1.16
+
+# spring-context
+# bundlor fails with 2.0b4
+beanShellVersion = 2
+jodaTimeVersion = 2.9.1
+jrubyVersion = 1.7.23
+
+# spring-context-support
+commonjVersion = 1.1.0
+ehcacheVersion = 2.10.1
+freemarkerVersion = 2.3.23
+jasperreportsVersion = 6.2.0
+velocityVersion = 1.7
+benmanesCaffeineVersion = 2.3.5
+
+# spring-core
+joptSimpleVersion = 4.9
+
+# spring-jdbc
+c3p0Version = 0.9.5.2
+hsqldbVersion = 2.3.3
+jacksonVersion = 2.6.4
+
+# spring-messaging
+nettyVersion = 4.0.33.Final
+reactorVersion = 2.0.7.RELEASE
+
+# spring-orm
+openjpaVersion = 2.4.0
+
+# spring-oxm
+xstreamVersion = 1.4.8
+xmlBeans = 2.6.0
+castorVersion = 1.4.0
+jibxVersion = 1.2.6
+
+# spring-web
+hessianVersion = 4.0.38
+gsonVersion = 2.5
+protobufJavaVersion = 2.6.1
+protobufJavaFormatVersion = 1.2
+romeVersion = 1.5.1
+okhttpVersion = 2.7.0
+okhttp3Version = 3.8.0
+okioVersion = 1.13.0
+
+# spring-webmvc
+jxlVersion = 2.6.12
+poiVersion = 3.13
+webjarsVersion = 0.28
+
+# spring-websocket
+undertowVersion = 1.3.10.Final
diff --git a/ebr/gradle/wrapper/gradle-wrapper.jar b/ebr/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..6ffa237
--- /dev/null
+++ b/ebr/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/ebr/gradle/wrapper/gradle-wrapper.properties b/ebr/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..f17aa14
--- /dev/null
+++ b/ebr/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Fri Jun 09 15:10:16 CEST 2017
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-3.5-all.zip
diff --git a/ebr/gradlew b/ebr/gradlew
new file mode 100755
index 0000000..9aa616c
--- /dev/null
+++ b/ebr/gradlew
@@ -0,0 +1,169 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+##  Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+        PRG="$link"
+    else
+        PRG=`dirname "$PRG"`"/$link"
+    fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+    echo "$*"
+}
+
+die ( ) {
+    echo
+    echo "$*"
+    echo
+    exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+  CYGWIN* )
+    cygwin=true
+    ;;
+  Darwin* )
+    darwin=true
+    ;;
+  MINGW* )
+    msys=true
+    ;;
+  NONSTOP* )
+    nonstop=true
+    ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+        # IBM's JDK on AIX uses strange locations for the executables
+        JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+        JAVACMD="$JAVA_HOME/bin/java"
+    fi
+    if [ ! -x "$JAVACMD" ] ; then
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+else
+    JAVACMD="java"
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+    MAX_FD_LIMIT=`ulimit -H -n`
+    if [ $? -eq 0 ] ; then
+        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+            MAX_FD="$MAX_FD_LIMIT"
+        fi
+        ulimit -n $MAX_FD
+        if [ $? -ne 0 ] ; then
+            warn "Could not set maximum file descriptor limit: $MAX_FD"
+        fi
+    else
+        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+    fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+    JAVACMD=`cygpath --unix "$JAVACMD"`
+
+    # We build the pattern for arguments to be converted via cygpath
+    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+    SEP=""
+    for dir in $ROOTDIRSRAW ; do
+        ROOTDIRS="$ROOTDIRS$SEP$dir"
+        SEP="|"
+    done
+    OURCYGPATTERN="(^($ROOTDIRS))"
+    # Add a user-defined pattern to the cygpath arguments
+    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+    fi
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    i=0
+    for arg in "$@" ; do
+        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
+
+        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
+            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+        else
+            eval `echo args$i`="\"$arg\""
+        fi
+        i=$((i+1))
+    done
+    case $i in
+        (0) set -- ;;
+        (1) set -- "$args0" ;;
+        (2) set -- "$args0" "$args1" ;;
+        (3) set -- "$args0" "$args1" "$args2" ;;
+        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+    esac
+fi
+
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+    JVM_OPTS=("$@")
+}
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [[ "$(uname)" == "Darwin" ]] && [[ "$HOME" == "$PWD" ]]; then
+  cd "$(dirname "$0")"
+fi
+
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/ebr/gradlew.bat b/ebr/gradlew.bat
new file mode 100644
index 0000000..e95643d
--- /dev/null
+++ b/ebr/gradlew.bat
@@ -0,0 +1,84 @@
+@if "%DEBUG%" == "" @echo off

+@rem ##########################################################################

+@rem

+@rem  Gradle startup script for Windows

+@rem

+@rem ##########################################################################

+

+@rem Set local scope for the variables with windows NT shell

+if "%OS%"=="Windows_NT" setlocal

+

+set DIRNAME=%~dp0

+if "%DIRNAME%" == "" set DIRNAME=.

+set APP_BASE_NAME=%~n0

+set APP_HOME=%DIRNAME%

+

+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.

+set DEFAULT_JVM_OPTS=

+

+@rem Find java.exe

+if defined JAVA_HOME goto findJavaFromJavaHome

+

+set JAVA_EXE=java.exe

+%JAVA_EXE% -version >NUL 2>&1

+if "%ERRORLEVEL%" == "0" goto init

+

+echo.

+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.

+echo.

+echo Please set the JAVA_HOME variable in your environment to match the

+echo location of your Java installation.

+

+goto fail

+

+:findJavaFromJavaHome

+set JAVA_HOME=%JAVA_HOME:"=%

+set JAVA_EXE=%JAVA_HOME%/bin/java.exe

+

+if exist "%JAVA_EXE%" goto init

+

+echo.

+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%

+echo.

+echo Please set the JAVA_HOME variable in your environment to match the

+echo location of your Java installation.

+

+goto fail

+

+:init

+@rem Get command-line arguments, handling Windows variants

+

+if not "%OS%" == "Windows_NT" goto win9xME_args

+

+:win9xME_args

+@rem Slurp the command line arguments.

+set CMD_LINE_ARGS=

+set _SKIP=2

+

+:win9xME_args_slurp

+if "x%~1" == "x" goto execute

+

+set CMD_LINE_ARGS=%*

+

+:execute

+@rem Setup the command line

+

+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar

+

+@rem Execute Gradle

+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%

+

+:end

+@rem End local scope for the variables with windows NT shell

+if "%ERRORLEVEL%"=="0" goto mainEnd

+

+:fail

+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of

+rem the _cmd.exe /c_ return code!

+if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1

+exit /b 1

+

+:mainEnd

+if "%OS%"=="Windows_NT" endlocal

+

+:omega

diff --git a/ebr/org.aspectj.weaver-1.8.10/build.gradle b/ebr/org.aspectj.weaver-1.8.10/build.gradle
new file mode 100644
index 0000000..89b906b
--- /dev/null
+++ b/ebr/org.aspectj.weaver-1.8.10/build.gradle
@@ -0,0 +1,3 @@
+dependencies {
+    sourceBundle group: 'org.aspectj', name: 'aspectjweaver', version: "${aspectjVersion}"
+}
diff --git a/ebr/org.aspectj.weaver-1.8.10/org.aspectj.weaver.mf b/ebr/org.aspectj.weaver-1.8.10/org.aspectj.weaver.mf
new file mode 100644
index 0000000..a04e97a
--- /dev/null
+++ b/ebr/org.aspectj.weaver-1.8.10/org.aspectj.weaver.mf
@@ -0,0 +1,22 @@
+Name: org/aspectj/weaver/
+Specification-Title: AspectJ Weaver Classes
+Specification-Version: ${aspectjVersion}
+Specification-Vendor: aspectj.org
+Implementation-Title: org.aspectj.weaver
+Implementation-Version: ${aspectjVersion}
+Implementation-Vendor: aspectj.org
+Premain-Class: org.aspectj.weaver.loadtime.Agent
+Agent-Class: org.aspectj.weaver.loadtime.Agent
+Can-Redefine-Classes: true
+Bundle-SymbolicName: org.aspectj.weaver
+Bundle-Name: AspectJ weaver
+Bundle-Vendor: Eclipse Virgo
+Bundle-ManifestVersion: 2
+Bundle-Version: ${aspectjVersion}
+Import-Template:
+ com.bea.jvm;version="0";resolution:="optional",
+ org.apache.commons.logging.*;version="${commonsLoggingVersion:[=.=.=, +1)}";resolution:="optional",
+ javax.xml.parsers;version="0",
+ org.xml.sax.*;version="0"
+Export-Template:
+ org.aspectj.*;version="${aspectjVersion}"
diff --git a/ebr/org.springframework.aop-4.2.9.RELEASE/build.gradle b/ebr/org.springframework.aop-4.2.9.RELEASE/build.gradle
new file mode 100644
index 0000000..e1a17da
--- /dev/null
+++ b/ebr/org.springframework.aop-4.2.9.RELEASE/build.gradle
@@ -0,0 +1,3 @@
+dependencies {
+    sourceBundle group: 'org.springframework', name: 'spring-aop', version: "${springframeworkVersion}"
+}
diff --git a/ebr/org.springframework.aop-4.2.9.RELEASE/org.springframework.aop.mf b/ebr/org.springframework.aop-4.2.9.RELEASE/org.springframework.aop.mf
new file mode 100644
index 0000000..726727a
--- /dev/null
+++ b/ebr/org.springframework.aop-4.2.9.RELEASE/org.springframework.aop.mf
@@ -0,0 +1,26 @@
+Bundle-SymbolicName: org.springframework.aop
+Bundle-Name: Spring AOP
+Bundle-Vendor: Eclipse Virgo
+Bundle-ManifestVersion: 2
+Bundle-Version: ${springframeworkVersion}
+Import-Template:
+ com.jamonapi.*;version="${jamonVersion:[=.=.=, +1)}";resolution:=optional,
+ org.aopalliance.*;version="${orgAopAllianceVersion:[=.=.=, +1)}",
+ org.apache.commons.logging.*;version="${commonsLoggingVersion:[=.=.=, +1)}",
+ org.apache.commons.pool.*;version="${commonsPoolVersion:[=.=.=, +1)}";resolution:=optional,
+ org.apache.commons.pool2.*;version="${commonsPool2Version:[=.=.=, +1)}";resolution:=optional,
+ org.aspectj.*;version="${aspectjVersion:[=.=.=, +1)}";resolution:=optional,
+ org.springframework.beans.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.cglib.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.core.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.lang.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.objenesis.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.util.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.w3c.dom.*;version="0";resolution:=optional
+Export-Template:
+ org.springframework.aop.*;version="${springframeworkVersion}"
+Ignored-Existing-Headers:
+ Bnd-LastModified,
+ Import-Package,
+ Export-Package,
+ Tool
diff --git a/ebr/org.springframework.aop-4.3.9.RELEASE/build.gradle b/ebr/org.springframework.aop-4.3.9.RELEASE/build.gradle
new file mode 100644
index 0000000..d6f2c81
--- /dev/null
+++ b/ebr/org.springframework.aop-4.3.9.RELEASE/build.gradle
@@ -0,0 +1,16 @@
+configurations {
+    origin
+}
+
+dependencies {
+    origin group: 'org.springframework', name: 'spring-aop', version: "${springframeworkVersion}"
+    sourceBundle fileTree("$buildDir/libs")
+}
+
+task removeAopallianceFromJar(type: Jar) {
+    baseName = 'spring-aop'
+    from zipTree(configurations.origin[0])
+    exclude 'org/aopalliance/**'
+}
+
+bundlor.dependsOn removeAopallianceFromJar
diff --git a/ebr/org.springframework.aop-4.3.9.RELEASE/org.springframework.aop.mf b/ebr/org.springframework.aop-4.3.9.RELEASE/org.springframework.aop.mf
new file mode 100644
index 0000000..d05ddc6
--- /dev/null
+++ b/ebr/org.springframework.aop-4.3.9.RELEASE/org.springframework.aop.mf
@@ -0,0 +1,27 @@
+Bundle-SymbolicName: org.springframework.aop
+Bundle-Name: Spring AOP
+Bundle-Vendor: Eclipse Virgo
+Bundle-ManifestVersion: 2
+Bundle-Version: ${springframeworkVersion}
+Import-Template:
+ org.apache.commons.logging.*;version="${commonsLoggingVersion:[=.=.=, +1)}",
+ org.aopalliance.*;version="${orgAopAllianceVersion:[=.=.=, +1)}",
+ org.springframework.beans.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.core.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.lang.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.objenesis.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.util.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ com.jamonapi.*;version="${jamonVersion:[=.=.=, +1)}";resolution:=optional,
+ org.apache.commons.pool.*;version="${commonsPoolVersion:[=.=.=, +1)}";resolution:=optional,
+ org.apache.commons.pool2.*;version="${commonsPool2Version:[=.=.=, +1)}";resolution:=optional,
+ org.aspectj.*;version="${aspectjVersion:[=.=.=, +1)}";resolution:=optional,
+ org.springframework.cglib.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.w3c.dom.*;version="0";resolution:=optional
+Export-Template:
+ org.springframework.aop.*;version="${springframeworkVersion}"
+Ignored-Existing-Headers:
+ Bnd-LastModified,
+ Export-Package,
+ Import-Package,
+ Tool
+
diff --git a/ebr/org.springframework.aspects-4.2.9.RELEASE/build.gradle b/ebr/org.springframework.aspects-4.2.9.RELEASE/build.gradle
new file mode 100644
index 0000000..5520b71
--- /dev/null
+++ b/ebr/org.springframework.aspects-4.2.9.RELEASE/build.gradle
@@ -0,0 +1,3 @@
+dependencies {
+    sourceBundle group: 'org.springframework', name: 'spring-aspects', version: "${springframeworkVersion}"
+}
diff --git a/ebr/org.springframework.aspects-4.2.9.RELEASE/org.springframework.aspects.mf b/ebr/org.springframework.aspects-4.2.9.RELEASE/org.springframework.aspects.mf
new file mode 100644
index 0000000..7cefed2
--- /dev/null
+++ b/ebr/org.springframework.aspects-4.2.9.RELEASE/org.springframework.aspects.mf
@@ -0,0 +1,29 @@
+Bundle-SymbolicName: org.springframework.aspects
+Bundle-Name: Spring Aspects
+Bundle-Vendor: Eclipse Virgo
+Bundle-ManifestVersion: 2
+Bundle-Version: ${springframeworkVersion}
+Import-Template:
+ javax.cache;version="${javaxCacheVersion:[=.=.=, +1)}";resolution:=optional,
+ javax.persistence;version="${javaxPersistenceVersion:[=.=, +1)}";resolution:=optional,
+ org.apache.commons.logging.*;version="${commonsLoggingVersion:[=.=.=, +1)}",
+ org.aspectj.*;version="${aspectjVersion:[=.=.=, +1)}";resolution:=optional,
+ org.springframework.aop.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.context.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.beans.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.cache.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.core.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.cglib.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.dao.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.orm.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.scheduling.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.transaction.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.util.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional
+Export-Template:
+ org.springframework.*;version="${springframeworkVersion}"
+Ignored-Existing-Headers:
+ Bnd-LastModified,
+ Import-Package,
+ Tool
+Excluded-Imports:
+ org.springframework.context.*
diff --git a/ebr/org.springframework.aspects-4.3.9.RELEASE/build.gradle b/ebr/org.springframework.aspects-4.3.9.RELEASE/build.gradle
new file mode 100644
index 0000000..5520b71
--- /dev/null
+++ b/ebr/org.springframework.aspects-4.3.9.RELEASE/build.gradle
@@ -0,0 +1,3 @@
+dependencies {
+    sourceBundle group: 'org.springframework', name: 'spring-aspects', version: "${springframeworkVersion}"
+}
diff --git a/ebr/org.springframework.aspects-4.3.9.RELEASE/org.springframework.aspects.mf b/ebr/org.springframework.aspects-4.3.9.RELEASE/org.springframework.aspects.mf
new file mode 100644
index 0000000..132f4bb
--- /dev/null
+++ b/ebr/org.springframework.aspects-4.3.9.RELEASE/org.springframework.aspects.mf
@@ -0,0 +1,30 @@
+Bundle-SymbolicName: org.springframework.aspects
+Bundle-Name: Spring Aspects
+Bundle-Vendor: Eclipse Virgo
+Bundle-ManifestVersion: 2
+Bundle-Version: ${springframeworkVersion}
+Import-Template:
+ javax.cache;version="${javaxCacheVersion:[=.=.=, +1)}";resolution:=optional,
+ javax.persistence;version="${javaxPersistenceVersion:[=.=, +1)}";resolution:=optional,
+ javax.transaction;version="${javaxTransactionVersion:[=.=, +1)}";resolution:=optional,
+ org.apache.commons.logging.*;version="${commonsLoggingVersion:[=.=.=, +1)}",
+ org.aspectj.*;version="${aspectjVersion:[=.=.=, +1)}";resolution:=optional,
+ org.springframework.aop.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.context.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.beans.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.cache.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.core.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.cglib.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.dao.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.orm.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.scheduling.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.transaction.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.util.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional
+Export-Template:
+ org.springframework.*;version="${springframeworkVersion}"
+Ignored-Existing-Headers:
+ Bnd-LastModified,
+ Import-Package,
+ Tool
+Excluded-Imports:
+ org.springframework.context.*
diff --git a/ebr/org.springframework.beans-4.2.9.RELEASE/build.gradle b/ebr/org.springframework.beans-4.2.9.RELEASE/build.gradle
new file mode 100644
index 0000000..cd78444
--- /dev/null
+++ b/ebr/org.springframework.beans-4.2.9.RELEASE/build.gradle
@@ -0,0 +1,3 @@
+dependencies {
+    sourceBundle group: 'org.springframework', name: 'spring-beans', version: "${springframeworkVersion}"
+}
diff --git a/ebr/org.springframework.beans-4.2.9.RELEASE/org.springframework.beans.mf b/ebr/org.springframework.beans-4.2.9.RELEASE/org.springframework.beans.mf
new file mode 100644
index 0000000..4005ddd
--- /dev/null
+++ b/ebr/org.springframework.beans-4.2.9.RELEASE/org.springframework.beans.mf
@@ -0,0 +1,26 @@
+Bundle-SymbolicName: org.springframework.beans
+Bundle-Name: Spring Beans
+Bundle-Vendor: Eclipse Virgo
+Bundle-ManifestVersion: 2
+Bundle-Version: ${springframeworkVersion}
+Import-Template:
+ javax.el.*;version="[2.2.5, 4)";resolution:=optional,
+ javax.inject.*;version="[1, 2)";resolution:=optional,
+ javax.xml.*;version="0";resolution:=optional,
+ groovy.*;version="${groovyVersion:[=.=.=, +1)}";resolution:="optional",
+ org.yaml.snakeyaml.*;version="${snakeYamlVersion:[=.=.=, +1)}";resolution:="optional",
+ org.codehaus.groovy.*;version="${groovyVersion:[=.=.=, +1)}";resolution:="optional",
+ org.apache.commons.logging.*;version="${commonsLoggingVersion:[=.=.=, +1)}",
+ org.springframework.core.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.cglib.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.lang.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.util.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.xml.sax.*;version="0";resolution:=optional,
+ org.w3c.dom.*;version="0";resolution:=optional
+Export-Template:
+ org.springframework.beans.*;version="${springframeworkVersion}"
+Ignored-Existing-Headers:
+ Bnd-LastModified,
+ Import-Package,
+ Export-Package,
+ Tool
diff --git a/ebr/org.springframework.beans-4.3.9.RELEASE/build.gradle b/ebr/org.springframework.beans-4.3.9.RELEASE/build.gradle
new file mode 100644
index 0000000..cd78444
--- /dev/null
+++ b/ebr/org.springframework.beans-4.3.9.RELEASE/build.gradle
@@ -0,0 +1,3 @@
+dependencies {
+    sourceBundle group: 'org.springframework', name: 'spring-beans', version: "${springframeworkVersion}"
+}
diff --git a/ebr/org.springframework.beans-4.3.9.RELEASE/org.springframework.beans.mf b/ebr/org.springframework.beans-4.3.9.RELEASE/org.springframework.beans.mf
new file mode 100644
index 0000000..8e5882b
--- /dev/null
+++ b/ebr/org.springframework.beans-4.3.9.RELEASE/org.springframework.beans.mf
@@ -0,0 +1,26 @@
+Bundle-SymbolicName: org.springframework.beans
+Bundle-Name: Spring Beans
+Bundle-Vendor: Eclipse Virgo
+Bundle-ManifestVersion: 2
+Bundle-Version: ${springframeworkVersion}
+Import-Template:
+ org.apache.commons.logging.*;version="${commonsLoggingVersion:[=.=.=, +1)}",
+ org.springframework.core.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.cglib.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.lang.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.util.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ javax.el.*;version="[2.2.5, 4)";resolution:=optional,
+ javax.inject.*;version="[1, 2)";resolution:=optional,
+ javax.xml.*;version="0";resolution:=optional,
+ groovy.*;version="${groovyVersion:[=.=.=, +1)}";resolution:="optional",
+ org.yaml.snakeyaml.*;version="${snakeYamlVersion:[=.=.=, +1)}";resolution:="optional",
+ org.codehaus.groovy.*;version="${groovyVersion:[=.=.=, +1)}";resolution:="optional",
+ org.xml.sax.*;version="0";resolution:=optional,
+ org.w3c.dom.*;version="0";resolution:=optional
+Export-Template:
+ org.springframework.beans.*;version="${springframeworkVersion}"
+Ignored-Existing-Headers:
+ Bnd-LastModified,
+ Import-Package,
+ Export-Package,
+ Tool
diff --git a/ebr/org.springframework.context-4.2.9.RELEASE/build.gradle b/ebr/org.springframework.context-4.2.9.RELEASE/build.gradle
new file mode 100644
index 0000000..652c1a5
--- /dev/null
+++ b/ebr/org.springframework.context-4.2.9.RELEASE/build.gradle
@@ -0,0 +1,3 @@
+dependencies {
+    sourceBundle group: 'org.springframework', name: 'spring-context', version: "${springframeworkVersion}"
+}
diff --git a/ebr/org.springframework.context-4.2.9.RELEASE/org.springframework.context.mf b/ebr/org.springframework.context-4.2.9.RELEASE/org.springframework.context.mf
new file mode 100644
index 0000000..09182f1
--- /dev/null
+++ b/ebr/org.springframework.context-4.2.9.RELEASE/org.springframework.context.mf
@@ -0,0 +1,58 @@
+Bundle-SymbolicName: org.springframework.context
+Bundle-Name: Spring Context
+Bundle-Vendor: Eclipse Virgo
+Bundle-ManifestVersion: 2
+Bundle-Version: ${springframeworkVersion}
+Import-Package:
+ org.springframework.cglib.reflect;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.orm.jpa.support;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ javax.inject;version="[1, 2)";resolution:=optional,
+ javax.persistence;version="${javaxPersistenceVersion:[=.=, +1)}";resolution:=optional,
+ com.ibm.websphere.management;version="0";resolution:=optional
+Import-Template:
+ bsh.*;version="${beanShellVersion:[=.=.=, +1)}";resolution:=optional,
+ com.sun.net.*;version="0";resolution:=optional,
+ edu.emory.mathcs.backport.*;version="[3.0.0, 4.0.0)";resolution:=optional,
+ groovy.*;version="${groovyVersion:[=.=.=, +1)}";resolution:="optional",
+ javax.annotation.*;version="0";resolution:=optional,
+ javax.ejb.*;version="[3, 4)";resolution:=optional,
+ javax.enterprise.concurrent;version="[1, 2)";resolution:=optional,
+ javax.interceptor.*;version="[3.0.0, 4.0.0)";resolution:=optional,
+ javax.jms.*;version="[1.1.0, 2.0.0)";resolution:=optional,
+ javax.management.*;version="0";resolution:=optional,
+ javax.money.*;version="[1, 2)";resolution:=optional,
+ javax.naming.*;version="0";resolution:=optional,
+ javax.persistence.*;version="${javaxPersistenceVersion:[=.=, +1)}";resolution:=optional,
+ javax.rmi.*;version="0";resolution:=optional,
+ javax.script;version="0";resotion:=optional,
+ javax.validation.*;version="[1, 2)";resolution:=optional,
+ javax.xml.*;version="0";resolution:=optional,
+ net.sf.ehcache.*;version="[1.0.0, 3.0.0)";resolution:=optional,
+ javax.cache.*;version="[0.5.0, 0.5.0]";resolution:=optional,
+ org.aopalliance.*;version="${orgAopAllianceVersion:[=.=.=, +1)}",
+ org.apache.commons.logging.*;version="${commonsLoggingVersion:[=.=.=, +1)}",
+ org.aspectj.*;version="${aspectjVersion:[=.=.=, +1)}";resolution:=optional,
+ org.codehaus.groovy.*;version="${groovyVersion:[=.=.=, +1)}";resolution:="optional",
+ org.hibernate.validator.*;version="${hibernateVersion:[=.=.=, +1)}";resolution:=optional,
+ org.joda.*;version="${jodaTimeVersion:[=.=.=, +1)}";resolution:=optional,
+ org.jruby.*;version="${jrubyVersion:[=.=.=, +1)}";resolution:=optional,
+ org.omg.CORBA.*;version="0";resolution:=optional,
+ org.springframework.aop.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.asm.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.beans.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.cglib.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.core.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.expression.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.instrument.*;version="0";resolution:=optional,
+ org.springframework.lang.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.objenesis.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.util.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.xml.sax.*;version="0";resolution:=optional,
+ org.w3c.dom.*;version="0";resolution:=optional
+Export-Template:
+ org.springframework.*;version="${springframeworkVersion}"
+Ignored-Existing-Headers:
+ Bnd-LastModified,
+ Import-Package,
+ Export-Package,
+ Tool
diff --git a/ebr/org.springframework.context-4.3.9.RELEASE/build.gradle b/ebr/org.springframework.context-4.3.9.RELEASE/build.gradle
new file mode 100644
index 0000000..652c1a5
--- /dev/null
+++ b/ebr/org.springframework.context-4.3.9.RELEASE/build.gradle
@@ -0,0 +1,3 @@
+dependencies {
+    sourceBundle group: 'org.springframework', name: 'spring-context', version: "${springframeworkVersion}"
+}
diff --git a/ebr/org.springframework.context-4.3.9.RELEASE/org.springframework.context.mf b/ebr/org.springframework.context-4.3.9.RELEASE/org.springframework.context.mf
new file mode 100644
index 0000000..9c5159c
--- /dev/null
+++ b/ebr/org.springframework.context-4.3.9.RELEASE/org.springframework.context.mf
@@ -0,0 +1,58 @@
+Bundle-SymbolicName: org.springframework.context
+Bundle-Name: Spring Context
+Bundle-Vendor: Eclipse Virgo
+Bundle-ManifestVersion: 2
+Bundle-Version: ${springframeworkVersion}
+Import-Package:
+ org.springframework.cglib.reflect;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.orm.jpa.support;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ javax.inject;version="[1, 2)";resolution:=optional,
+ javax.persistence;version="${javaxPersistenceVersion:[=.=, +1)}";resolution:=optional,
+ com.ibm.websphere.management;version="0";resolution:=optional
+Import-Template:
+ org.aopalliance.*;version="${orgAopAllianceVersion:[=.=.=, +1)}",
+ bsh.*;version="${beanShellVersion:[=.=.=, +1)}";resolution:=optional,
+ com.sun.net.*;version="0";resolution:=optional,
+ edu.emory.mathcs.backport.*;version="[3.0.0, 4.0.0)";resolution:=optional,
+ groovy.*;version="${groovyVersion:[=.=.=, +1)}";resolution:="optional",
+ javax.annotation.*;version="0";resolution:=optional,
+ javax.ejb.*;version="[3, 4)";resolution:=optional,
+ javax.enterprise.concurrent;version="[1, 2)";resolution:=optional,
+ javax.interceptor.*;version="[3.0.0, 4.0.0)";resolution:=optional,
+ javax.jms.*;version="[1.1.0, 2.0.0)";resolution:=optional,
+ javax.management.*;version="0";resolution:=optional,
+ javax.money.*;version="[1, 2)";resolution:=optional,
+ javax.naming.*;version="0";resolution:=optional,
+ javax.persistence.*;version="${javaxPersistenceVersion:[=.=, +1)}";resolution:=optional,
+ javax.rmi.*;version="0";resolution:=optional,
+ javax.script;version="0";resotion:=optional,
+ javax.validation.*;version="[1, 2)";resolution:=optional,
+ javax.xml.*;version="0";resolution:=optional,
+ net.sf.ehcache.*;version="[1.0.0, 3.0.0)";resolution:=optional,
+ javax.cache.*;version="[0.5.0, 0.5.0]";resolution:=optional,
+ org.apache.commons.logging.*;version="${commonsLoggingVersion:[=.=.=, +1)}",
+ org.aspectj.*;version="${aspectjVersion:[=.=.=, +1)}";resolution:=optional,
+ org.codehaus.groovy.*;version="${groovyVersion:[=.=.=, +1)}";resolution:="optional",
+ org.hibernate.validator.*;version="${hibernateVersion:[=.=.=, +1)}";resolution:=optional,
+ org.joda.*;version="${jodaTimeVersion:[=.=.=, +1)}";resolution:=optional,
+ org.jruby.*;version="${jrubyVersion:[=.=.=, +1)}";resolution:=optional,
+ org.omg.CORBA.*;version="0";resolution:=optional,
+ org.springframework.aop.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.asm.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.beans.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.cglib.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.core.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.expression.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.instrument.*;version="0";resolution:=optional,
+ org.springframework.lang.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.objenesis.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.util.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.xml.sax.*;version="0";resolution:=optional,
+ org.w3c.dom.*;version="0";resolution:=optional
+Export-Template:
+ org.springframework.*;version="${springframeworkVersion}"
+Ignored-Existing-Headers:
+ Bnd-LastModified,
+ Import-Package,
+ Export-Package,
+ Tool
diff --git a/ebr/org.springframework.context.support-4.2.9.RELEASE/build.gradle b/ebr/org.springframework.context.support-4.2.9.RELEASE/build.gradle
new file mode 100644
index 0000000..a6af036
--- /dev/null
+++ b/ebr/org.springframework.context.support-4.2.9.RELEASE/build.gradle
@@ -0,0 +1,3 @@
+dependencies {
+    sourceBundle group: 'org.springframework', name: 'spring-context-support', version: "${springframeworkVersion}"
+}
diff --git a/ebr/org.springframework.context.support-4.2.9.RELEASE/org.springframework.context.support.mf b/ebr/org.springframework.context.support-4.2.9.RELEASE/org.springframework.context.support.mf
new file mode 100644
index 0000000..d54c5fa
--- /dev/null
+++ b/ebr/org.springframework.context.support-4.2.9.RELEASE/org.springframework.context.support.mf
@@ -0,0 +1,40 @@
+Bundle-SymbolicName: org.springframework.context.support
+Bundle-Name: Spring Context Support
+Bundle-Vendor: Eclipse Virgo
+Bundle-ManifestVersion: 2
+Bundle-Version: ${springframeworkVersion}
+Import-Template:
+ com.google.common.*;version="[19, 100)";resolution:=optional,
+ commonj.*;version="${commonjVersion:[=.=.=, +1)}";resolution:=optional,
+ freemarker.*;version="${freemarkerVersion:[=.=.=, +1)}";resolution:=optional,
+ javax.activation.*;version="0";resolution:=optional,
+ javax.cache.*;version="[1, 2)";resolution:=optional,
+ javax.mail.*;version="[1.5, 2)";resolution:=optional,
+ javax.naming.*;version="0";resolution:=optional,
+ javax.sql.*;version="0";resolution:=optional,
+ net.sf.ehcache.*;version="${ehcacheVersion:[=.=.=, +1)}";resolution:=optional,
+ net.sf.jasperreports.*;version="${jasperreportsVersion:[=.=.=, +1)}";resolution:=optional,
+ org.aopalliance.*;version="${orgAopAllianceVersion:[=.=.=, +1)}",
+ org.apache.commons.collections.*;version="${commonsCollectionsVersion:[=.=.=, +1)}";resolution:=optional,
+ org.apache.commons.logging.*;version="${commonsLoggingVersion:[=.=.=, +1)}",
+ org.apache.velocity.*;version="${velocityVersion:[=.=.=, +1)}";resolution:=optional,
+ org.quartz.*;version="[2.2.2, 3)";resolution:=optional,
+ org.springframework.aop.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.beans.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.context.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.core.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.expression.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.jdbc.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.jndi.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.scheduling.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.transaction.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.cache.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.util.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.w3c.dom.*;version="0";resolution:=optional
+Export-Template:
+ org.springframework.context.support.*;version="${springframeworkVersion}"
+Ignored-Existing-Headers:
+ Bnd-LastModified,
+ Import-Package,
+ Export-Package,
+ Tool
diff --git a/ebr/org.springframework.context.support-4.3.9.RELEASE/build.gradle b/ebr/org.springframework.context.support-4.3.9.RELEASE/build.gradle
new file mode 100644
index 0000000..a6af036
--- /dev/null
+++ b/ebr/org.springframework.context.support-4.3.9.RELEASE/build.gradle
@@ -0,0 +1,3 @@
+dependencies {
+    sourceBundle group: 'org.springframework', name: 'spring-context-support', version: "${springframeworkVersion}"
+}
diff --git a/ebr/org.springframework.context.support-4.3.9.RELEASE/org.springframework.context.support.mf b/ebr/org.springframework.context.support-4.3.9.RELEASE/org.springframework.context.support.mf
new file mode 100644
index 0000000..0f76dbd
--- /dev/null
+++ b/ebr/org.springframework.context.support-4.3.9.RELEASE/org.springframework.context.support.mf
@@ -0,0 +1,42 @@
+Bundle-SymbolicName: org.springframework.context.support
+Bundle-Name: Spring Context Support
+Bundle-Vendor: Eclipse Virgo
+Bundle-ManifestVersion: 2
+Bundle-Version: ${springframeworkVersion}
+Import-Template:
+ org.aopalliance.*;version="${orgAopAllianceVersion:[=.=.=, +1)}",
+ com.github.benmanes.caffeine.cache;version="${benmanesCaffeineVersion:[=.=.=, +1)}";resolution:=optional,
+ com.google.common.*;version="[19, 100)";resolution:=optional,
+ commonj.*;version="${commonjVersion:[=.=.=, +1)}";resolution:=optional,
+ freemarker.*;version="${freemarkerVersion:[=.=.=, +1)}";resolution:=optional,
+ javax.activation.*;version="0";resolution:=optional,
+ javax.cache.*;version="[1, 2)";resolution:=optional,
+ javax.mail.*;version="[1.5, 2)";resolution:=optional,
+ javax.naming.*;version="0";resolution:=optional,
+ javax.sql.*;version="0";resolution:=optional,
+ net.sf.ehcache.*;version="${ehcacheVersion:[=.=.=, +1)}";resolution:=optional,
+ net.sf.jasperreports.*;version="${jasperreportsVersion:[=.=.=, +1)}";resolution:=optional,
+ org.apache.commons.collections.*;version="${commonsCollectionsVersion:[=.=.=, +1)}";resolution:=optional,
+ org.apache.commons.logging.*;version="${commonsLoggingVersion:[=.=.=, +1)}",
+ org.apache.velocity.*;version="${velocityVersion:[=.=.=, +1)}";resolution:=optional,
+ org.quartz.*;version="[2.2.2, 3)";resolution:=optional,
+ org.springframework.aop.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.beans.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.context.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.core.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.lang;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.expression.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.jdbc.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.jndi.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.scheduling.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.transaction.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.cache.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.util.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.w3c.dom.*;version="0";resolution:=optional
+Export-Template:
+ org.springframework.context.support.*;version="${springframeworkVersion}"
+Ignored-Existing-Headers:
+ Bnd-LastModified,
+ Import-Package,
+ Export-Package,
+ Tool
diff --git a/ebr/org.springframework.core-4.2.9.RELEASE/build.gradle b/ebr/org.springframework.core-4.2.9.RELEASE/build.gradle
new file mode 100644
index 0000000..fc6f651
--- /dev/null
+++ b/ebr/org.springframework.core-4.2.9.RELEASE/build.gradle
@@ -0,0 +1,3 @@
+dependencies {
+    sourceBundle group: 'org.springframework', name: 'spring-core', version: "${springframeworkVersion}"
+}
diff --git a/ebr/org.springframework.core-4.2.9.RELEASE/org.springframework.core.mf b/ebr/org.springframework.core-4.2.9.RELEASE/org.springframework.core.mf
new file mode 100644
index 0000000..d43b39a
--- /dev/null
+++ b/ebr/org.springframework.core-4.2.9.RELEASE/org.springframework.core.mf
@@ -0,0 +1,28 @@
+Bundle-SymbolicName: org.springframework.core
+Bundle-Name: Spring Core
+Bundle-Vendor: Eclipse Virgo
+Bundle-ManifestVersion: 2
+Bundle-Version: ${springframeworkVersion}
+Import-Template:
+ javax.net;version="0",
+ javax.xml.*;version="0",
+ joptsimple.*;version="${joptSimpleVersion:[=.=.=, +1)}";resolution:=optional,
+ org.apache.tools.ant.*;version="0";resolution:=optional,
+ org.apache.commons.codec.*;version="${commonsCodecVersion:[=.=.=, +1)}",
+ org.apache.commons.logging.*;version="${commonsLoggingVersion:[=.=.=, +1)}",
+ org.apache.log4j.*;version="${apacheLog4jVersion:[=.=.=, +1)}";resolution:=optional,
+ org.aspectj.*;version="${aspectjVersion:[=.=.=, +1)}";resolution:=optional,
+ org.xml.sax.*;version="0";resolution:=optional,
+ org.w3c.dom.*;version="0";resolution:=optional
+Export-Template:
+ org.springframework.asm.*;version="${springframeworkVersion}",
+ org.springframework.cglib.*;version="${springframeworkVersion}",
+ org.springframework.core.*;version="${springframeworkVersion}",
+ org.springframework.lang.*;version="${springframeworkVersion}",
+ org.springframework.objenesis.*;version="${springframeworkVersion}",
+ org.springframework.util.*;version="${springframeworkVersion}"
+Ignored-Existing-Headers:
+ Bnd-LastModified,
+ Import-Package,
+ Export-Package,
+ Tool
diff --git a/ebr/org.springframework.core-4.3.9.RELEASE/build.gradle b/ebr/org.springframework.core-4.3.9.RELEASE/build.gradle
new file mode 100644
index 0000000..fc6f651
--- /dev/null
+++ b/ebr/org.springframework.core-4.3.9.RELEASE/build.gradle
@@ -0,0 +1,3 @@
+dependencies {
+    sourceBundle group: 'org.springframework', name: 'spring-core', version: "${springframeworkVersion}"
+}
diff --git a/ebr/org.springframework.core-4.3.9.RELEASE/org.springframework.core.mf b/ebr/org.springframework.core-4.3.9.RELEASE/org.springframework.core.mf
new file mode 100644
index 0000000..4cf2d4d
--- /dev/null
+++ b/ebr/org.springframework.core-4.3.9.RELEASE/org.springframework.core.mf
@@ -0,0 +1,28 @@
+Bundle-SymbolicName: org.springframework.core
+Bundle-Name: Spring Core
+Bundle-Vendor: Eclipse Virgo
+Bundle-ManifestVersion: 2
+Bundle-Version: ${springframeworkVersion}
+Import-Template:
+ javax.net;version="0",
+ javax.xml.*;version="0",
+ org.apache.commons.logging.*;version="${commonsLoggingVersion:[=.=.=, +1)}",
+ joptsimple.*;version="${joptSimpleVersion:[=.=.=, +1)}";resolution:=optional,
+ org.apache.tools.ant.*;version="0";resolution:=optional,
+ org.apache.commons.codec.*;version="${commonsCodecVersion:[=.=.=, +1)}";resolution:=optional,
+ org.apache.log4j.*;version="${apacheLog4jVersion:[=.=.=, +1)}";resolution:=optional,
+ org.aspectj.*;version="${aspectjVersion:[=.=.=, +1)}";resolution:=optional,
+ org.xml.sax.*;version="0";resolution:=optional,
+ org.w3c.dom.*;version="0";resolution:=optional
+Export-Template:
+ org.springframework.asm.*;version="${springframeworkVersion}",
+ org.springframework.cglib.*;version="${springframeworkVersion}",
+ org.springframework.core.*;version="${springframeworkVersion}",
+ org.springframework.lang.*;version="${springframeworkVersion}",
+ org.springframework.objenesis.*;version="${springframeworkVersion}",
+ org.springframework.util.*;version="${springframeworkVersion}"
+Ignored-Existing-Headers:
+ Bnd-LastModified,
+ Import-Package,
+ Export-Package,
+ Tool
diff --git a/ebr/org.springframework.core-4.3.9.RELEASE/src/test/resources/bundle.conf b/ebr/org.springframework.core-4.3.9.RELEASE/src/test/resources/bundle.conf
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/ebr/org.springframework.core-4.3.9.RELEASE/src/test/resources/bundle.conf
diff --git a/ebr/org.springframework.expression-4.2.9.RELEASE/build.gradle b/ebr/org.springframework.expression-4.2.9.RELEASE/build.gradle
new file mode 100644
index 0000000..cd029da
--- /dev/null
+++ b/ebr/org.springframework.expression-4.2.9.RELEASE/build.gradle
@@ -0,0 +1,3 @@
+dependencies {
+    sourceBundle group: 'org.springframework', name: 'spring-expression', version: "${springframeworkVersion}"
+}
diff --git a/ebr/org.springframework.expression-4.2.9.RELEASE/org.springframework.expression.mf b/ebr/org.springframework.expression-4.2.9.RELEASE/org.springframework.expression.mf
new file mode 100644
index 0000000..8363aac
--- /dev/null
+++ b/ebr/org.springframework.expression-4.2.9.RELEASE/org.springframework.expression.mf
@@ -0,0 +1,12 @@
+Bundle-SymbolicName: org.springframework.expression
+Bundle-Name: Spring Expression Language
+Bundle-Vendor: Eclipse Virgo
+Bundle-ManifestVersion: 2
+Bundle-Version: ${springframeworkVersion}
+Import-Template:
+ org.apache.commons.logging.*;version="${commonsLoggingVersion:[=.=.=, +1)}",
+ org.springframework.asm.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.core.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.util.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}"
+Export-Template:
+ org.springframework.expression.*;version="${springframeworkVersion}"
diff --git a/ebr/org.springframework.expression-4.3.9.RELEASE/build.gradle b/ebr/org.springframework.expression-4.3.9.RELEASE/build.gradle
new file mode 100644
index 0000000..cd029da
--- /dev/null
+++ b/ebr/org.springframework.expression-4.3.9.RELEASE/build.gradle
@@ -0,0 +1,3 @@
+dependencies {
+    sourceBundle group: 'org.springframework', name: 'spring-expression', version: "${springframeworkVersion}"
+}
diff --git a/ebr/org.springframework.expression-4.3.9.RELEASE/org.springframework.expression.mf b/ebr/org.springframework.expression-4.3.9.RELEASE/org.springframework.expression.mf
new file mode 100644
index 0000000..8363aac
--- /dev/null
+++ b/ebr/org.springframework.expression-4.3.9.RELEASE/org.springframework.expression.mf
@@ -0,0 +1,12 @@
+Bundle-SymbolicName: org.springframework.expression
+Bundle-Name: Spring Expression Language
+Bundle-Vendor: Eclipse Virgo
+Bundle-ManifestVersion: 2
+Bundle-Version: ${springframeworkVersion}
+Import-Template:
+ org.apache.commons.logging.*;version="${commonsLoggingVersion:[=.=.=, +1)}",
+ org.springframework.asm.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.core.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.util.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}"
+Export-Template:
+ org.springframework.expression.*;version="${springframeworkVersion}"
diff --git a/ebr/org.springframework.instrument.tomcat/org.springframework.instrument.tomcat.mf b/ebr/org.springframework.instrument.tomcat/org.springframework.instrument.tomcat.mf
new file mode 100644
index 0000000..6dc1970
--- /dev/null
+++ b/ebr/org.springframework.instrument.tomcat/org.springframework.instrument.tomcat.mf
@@ -0,0 +1,6 @@
+Bundle-SymbolicName: org.springframework.instrument.tomcat
+Bundle-Name: Spring Instrument Tomcat Weaver
+Bundle-Vendor: Eclipse Virgo
+Bundle-ManifestVersion: 2
+Import-Template:
+ org.apache.catalina.*;version="[6.0.16, 7.0.0)"
diff --git a/ebr/org.springframework.instrument/org.springframework.instrument.mf b/ebr/org.springframework.instrument/org.springframework.instrument.mf
new file mode 100644
index 0000000..0ceb406
--- /dev/null
+++ b/ebr/org.springframework.instrument/org.springframework.instrument.mf
@@ -0,0 +1,5 @@
+Bundle-SymbolicName: org.springframework.instrument
+Bundle-Name: Spring Instrument
+Bundle-Vendor: Eclipse Virgo
+Bundle-ManifestVersion: 2
+Premain-Class: org.springframework.instrument.InstrumentationSavingAgent
diff --git a/ebr/org.springframework.jdbc-4.2.9.RELEASE/build.gradle b/ebr/org.springframework.jdbc-4.2.9.RELEASE/build.gradle
new file mode 100644
index 0000000..f4e86ff
--- /dev/null
+++ b/ebr/org.springframework.jdbc-4.2.9.RELEASE/build.gradle
@@ -0,0 +1,3 @@
+dependencies {
+    sourceBundle group: 'org.springframework', name: 'spring-jdbc', version: "${springframeworkVersion}"
+}
diff --git a/ebr/org.springframework.jdbc-4.2.9.RELEASE/org.springframework.jdbc.mf b/ebr/org.springframework.jdbc-4.2.9.RELEASE/org.springframework.jdbc.mf
new file mode 100644
index 0000000..9c5be59
--- /dev/null
+++ b/ebr/org.springframework.jdbc-4.2.9.RELEASE/org.springframework.jdbc.mf
@@ -0,0 +1,39 @@
+Bundle-SymbolicName: org.springframework.jdbc
+Bundle-Name: Spring JDBC
+Bundle-Vendor: Eclipse Virgo
+Bundle-ManifestVersion: 2
+Bundle-Version: ${springframeworkVersion}
+Import-Package:
+ com.ibm.websphere.rsadapter;version="0";resolution:=optional,
+ com.ibm.ws.rsadapter.jdbc;version="0";resolution:=optional,
+ oracle.jdbc;version="0";resolution:=optional,
+ oracle.sql;version="0";resolution:=optional,
+ org.jboss.resource.adapter.jdbc;version="0";resolution:=optional,
+ weblogic.jdbc.extensions;version="0";resolution:=optional
+Import-Template:
+ com.mchange.v2.c3p0.*;version="${c3p0Version:[=.=.=, +1)}";resolution:=optional,
+ com.sun.rowset.*;version="[1.0.1, 2.0.0)";resolution:=optional,
+ javax.naming.*;version="0";resolution:=optional,
+ javax.sql.*;version="0",
+ javax.transaction.*;version="${javaxTransactionVersion:[=.=.=, +1)}";resolution:=optional,
+ javax.xml.*;version="0";resolution:=optional,
+ org.h2.*;version="[1.0.0, 2.0.0)";resolution:=optional,
+ org.hsqldb.*;version="${hsqldbVersion:[=.=.=, +1)}";resolution:=optional,
+ org.apache.derby.*;version="${apacheDerbyVersion:[=.=.=, +1)}";resolution:=optional,
+ org.apache.commons.logging.*;version="${commonsLoggingVersion:[=.=.=, +1)}",
+ org.springframework.beans.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.core.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.context.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.dao.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.jndi.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.lang.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.transaction.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.util.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.w3c.dom.*;version="0";resolution:=optional
+Export-Template:
+ org.springframework.jdbc.*;version="${springframeworkVersion}"
+Ignored-Existing-Headers:
+ Bnd-LastModified,
+ Import-Package,
+ Export-Package,
+ Tool
diff --git a/ebr/org.springframework.jdbc-4.3.9.RELEASE/build.gradle b/ebr/org.springframework.jdbc-4.3.9.RELEASE/build.gradle
new file mode 100644
index 0000000..f4e86ff
--- /dev/null
+++ b/ebr/org.springframework.jdbc-4.3.9.RELEASE/build.gradle
@@ -0,0 +1,3 @@
+dependencies {
+    sourceBundle group: 'org.springframework', name: 'spring-jdbc', version: "${springframeworkVersion}"
+}
diff --git a/ebr/org.springframework.jdbc-4.3.9.RELEASE/org.springframework.jdbc.mf b/ebr/org.springframework.jdbc-4.3.9.RELEASE/org.springframework.jdbc.mf
new file mode 100644
index 0000000..9c5be59
--- /dev/null
+++ b/ebr/org.springframework.jdbc-4.3.9.RELEASE/org.springframework.jdbc.mf
@@ -0,0 +1,39 @@
+Bundle-SymbolicName: org.springframework.jdbc
+Bundle-Name: Spring JDBC
+Bundle-Vendor: Eclipse Virgo
+Bundle-ManifestVersion: 2
+Bundle-Version: ${springframeworkVersion}
+Import-Package:
+ com.ibm.websphere.rsadapter;version="0";resolution:=optional,
+ com.ibm.ws.rsadapter.jdbc;version="0";resolution:=optional,
+ oracle.jdbc;version="0";resolution:=optional,
+ oracle.sql;version="0";resolution:=optional,
+ org.jboss.resource.adapter.jdbc;version="0";resolution:=optional,
+ weblogic.jdbc.extensions;version="0";resolution:=optional
+Import-Template:
+ com.mchange.v2.c3p0.*;version="${c3p0Version:[=.=.=, +1)}";resolution:=optional,
+ com.sun.rowset.*;version="[1.0.1, 2.0.0)";resolution:=optional,
+ javax.naming.*;version="0";resolution:=optional,
+ javax.sql.*;version="0",
+ javax.transaction.*;version="${javaxTransactionVersion:[=.=.=, +1)}";resolution:=optional,
+ javax.xml.*;version="0";resolution:=optional,
+ org.h2.*;version="[1.0.0, 2.0.0)";resolution:=optional,
+ org.hsqldb.*;version="${hsqldbVersion:[=.=.=, +1)}";resolution:=optional,
+ org.apache.derby.*;version="${apacheDerbyVersion:[=.=.=, +1)}";resolution:=optional,
+ org.apache.commons.logging.*;version="${commonsLoggingVersion:[=.=.=, +1)}",
+ org.springframework.beans.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.core.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.context.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.dao.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.jndi.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.lang.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.transaction.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.util.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.w3c.dom.*;version="0";resolution:=optional
+Export-Template:
+ org.springframework.jdbc.*;version="${springframeworkVersion}"
+Ignored-Existing-Headers:
+ Bnd-LastModified,
+ Import-Package,
+ Export-Package,
+ Tool
diff --git a/ebr/org.springframework.jms-4.2.9.RELEASE/build.gradle b/ebr/org.springframework.jms-4.2.9.RELEASE/build.gradle
new file mode 100644
index 0000000..2e8586f
--- /dev/null
+++ b/ebr/org.springframework.jms-4.2.9.RELEASE/build.gradle
@@ -0,0 +1,3 @@
+dependencies {
+    sourceBundle group: 'org.springframework', name: 'spring-jms', version: "${springframeworkVersion}"
+}
diff --git a/ebr/org.springframework.jms-4.2.9.RELEASE/org.springframework.jms.mf b/ebr/org.springframework.jms-4.2.9.RELEASE/org.springframework.jms.mf
new file mode 100644
index 0000000..2d14fdd
--- /dev/null
+++ b/ebr/org.springframework.jms-4.2.9.RELEASE/org.springframework.jms.mf
@@ -0,0 +1,35 @@
+Bundle-SymbolicName: org.springframework.jms
+Bundle-Name: Spring JMS
+Bundle-Vendor: Eclipse Virgo
+Bundle-ManifestVersion: 2
+Bundle-Version: ${springframeworkVersion}
+Import-Template:
+ javax.jms.*;version="[1.1, 2)",
+ javax.naming.*;version="0";resolution:=optional,
+ javax.resource.*;version="[1.5, 2)";resolution:=optional,
+ javax.transaction.*;version="[1.0.1, 2.0.0)";resolution:=optional,
+ javax.xml.*;version="0";resolution:=optional,
+ org.aopalliance.*;version="${orgAopAllianceVersion:[=.=.=, +1)}",
+ org.apache.commons.logging.*;version="${commonsLoggingVersion:[=.=.=, +1)}",
+ org.codehaus.jackson.*;version="[1.4.2, 2.0.0)";resolution:=optional,
+ com.fasterxml.jackson.*;version="${jacksonVersion:[=.=.=, +1)}";resolution:=optional,
+ org.springframework.aop.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.beans.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.context.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.core.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.jca.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.jndi.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.messaging.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.oxm.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.remoting.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.scheduling.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.transaction.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.util.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.w3c.dom.*;version="0";resolution:=optional
+Export-Template:
+ org.springframework.jms.*;version="${springframeworkVersion}"
+Ignored-Existing-Headers:
+ Bnd-LastModified,
+ Import-Package,
+ Export-Package,
+ Tool
diff --git a/ebr/org.springframework.jms-4.3.9.RELEASE/build.gradle b/ebr/org.springframework.jms-4.3.9.RELEASE/build.gradle
new file mode 100644
index 0000000..2e8586f
--- /dev/null
+++ b/ebr/org.springframework.jms-4.3.9.RELEASE/build.gradle
@@ -0,0 +1,3 @@
+dependencies {
+    sourceBundle group: 'org.springframework', name: 'spring-jms', version: "${springframeworkVersion}"
+}
diff --git a/ebr/org.springframework.jms-4.3.9.RELEASE/org.springframework.jms.mf b/ebr/org.springframework.jms-4.3.9.RELEASE/org.springframework.jms.mf
new file mode 100644
index 0000000..c54ee07
--- /dev/null
+++ b/ebr/org.springframework.jms-4.3.9.RELEASE/org.springframework.jms.mf
@@ -0,0 +1,35 @@
+Bundle-SymbolicName: org.springframework.jms
+Bundle-Name: Spring JMS
+Bundle-Vendor: Eclipse Virgo
+Bundle-ManifestVersion: 2
+Bundle-Version: ${springframeworkVersion}
+Import-Template:
+ org.aopalliance.*;version="${orgAopAllianceVersion:[=.=.=, +1)}",
+ javax.jms.*;version="[1.1, 2)",
+ javax.naming.*;version="0";resolution:=optional,
+ javax.resource.*;version="[1.5, 2)";resolution:=optional,
+ javax.transaction.*;version="[1.0.1, 2.0.0)";resolution:=optional,
+ javax.xml.*;version="0";resolution:=optional,
+ org.apache.commons.logging.*;version="${commonsLoggingVersion:[=.=.=, +1)}",
+ org.codehaus.jackson.*;version="[1.4.2, 2.0.0)";resolution:=optional,
+ com.fasterxml.jackson.*;version="${jacksonVersion:[=.=.=, +1)}";resolution:=optional,
+ org.springframework.aop.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.beans.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.context.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.core.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.jca.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.jndi.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.messaging.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.oxm.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.remoting.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.scheduling.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.transaction.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.util.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.w3c.dom.*;version="0";resolution:=optional
+Export-Template:
+ org.springframework.jms.*;version="${springframeworkVersion}"
+Ignored-Existing-Headers:
+ Bnd-LastModified,
+ Import-Package,
+ Export-Package,
+ Tool
diff --git a/ebr/org.springframework.messaging-4.2.9.RELEASE/build.gradle b/ebr/org.springframework.messaging-4.2.9.RELEASE/build.gradle
new file mode 100644
index 0000000..fc5a4cf
--- /dev/null
+++ b/ebr/org.springframework.messaging-4.2.9.RELEASE/build.gradle
@@ -0,0 +1,3 @@
+dependencies {
+    sourceBundle group: 'org.springframework', name: 'spring-messaging', version: "${springframeworkVersion}"
+}
diff --git a/ebr/org.springframework.messaging-4.2.9.RELEASE/org.springframework.messaging.mf b/ebr/org.springframework.messaging-4.2.9.RELEASE/org.springframework.messaging.mf
new file mode 100644
index 0000000..cd299e0
--- /dev/null
+++ b/ebr/org.springframework.messaging-4.2.9.RELEASE/org.springframework.messaging.mf
@@ -0,0 +1,30 @@
+Bundle-SymbolicName: org.springframework.messaging
+Bundle-Name: Spring Messaging
+Bundle-Vendor: Eclipse Virgo
+Bundle-ManifestVersion: 2
+Bundle-Version: ${springframeworkVersion}
+Import-Template:
+ com.fasterxml.jackson.*;version="${jacksonVersion:[=.=.=, +1)}";resolution:=optional,
+ io.netty.*;version="${nettyVersion:[=.=.=, +1)}";resolution:=optional,
+ javax.xml.transform.*;version="0",
+ org.apache.commons.logging.*;version="${commonsLoggingVersion:[=.=.=, +1)}",
+ org.reactivestreams;version="[1, 2)";resolution:=optional,
+ org.springframework.beans.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.context.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.core.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.expression.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.format.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.lang.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.oxm.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.scheduling.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.stereotype.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.util.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.validation.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ reactor.*;version="${reactorVersion:[=.=.=, +1)}";resolution:=optional
+Export-Template:
+ org.springframework.messaging.*;version="${springframeworkVersion}"
+Ignored-Existing-Headers:
+ Bnd-LastModified,
+ Import-Package,
+ Export-Package,
+ Tool
diff --git a/ebr/org.springframework.messaging-4.3.9.RELEASE/build.gradle b/ebr/org.springframework.messaging-4.3.9.RELEASE/build.gradle
new file mode 100644
index 0000000..fc5a4cf
--- /dev/null
+++ b/ebr/org.springframework.messaging-4.3.9.RELEASE/build.gradle
@@ -0,0 +1,3 @@
+dependencies {
+    sourceBundle group: 'org.springframework', name: 'spring-messaging', version: "${springframeworkVersion}"
+}
diff --git a/ebr/org.springframework.messaging-4.3.9.RELEASE/org.springframework.messaging.mf b/ebr/org.springframework.messaging-4.3.9.RELEASE/org.springframework.messaging.mf
new file mode 100644
index 0000000..cd299e0
--- /dev/null
+++ b/ebr/org.springframework.messaging-4.3.9.RELEASE/org.springframework.messaging.mf
@@ -0,0 +1,30 @@
+Bundle-SymbolicName: org.springframework.messaging
+Bundle-Name: Spring Messaging
+Bundle-Vendor: Eclipse Virgo
+Bundle-ManifestVersion: 2
+Bundle-Version: ${springframeworkVersion}
+Import-Template:
+ com.fasterxml.jackson.*;version="${jacksonVersion:[=.=.=, +1)}";resolution:=optional,
+ io.netty.*;version="${nettyVersion:[=.=.=, +1)}";resolution:=optional,
+ javax.xml.transform.*;version="0",
+ org.apache.commons.logging.*;version="${commonsLoggingVersion:[=.=.=, +1)}",
+ org.reactivestreams;version="[1, 2)";resolution:=optional,
+ org.springframework.beans.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.context.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.core.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.expression.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.format.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.lang.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.oxm.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.scheduling.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.stereotype.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.util.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.validation.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ reactor.*;version="${reactorVersion:[=.=.=, +1)}";resolution:=optional
+Export-Template:
+ org.springframework.messaging.*;version="${springframeworkVersion}"
+Ignored-Existing-Headers:
+ Bnd-LastModified,
+ Import-Package,
+ Export-Package,
+ Tool
diff --git a/ebr/org.springframework.orm-4.2.9.RELEASE/build.gradle b/ebr/org.springframework.orm-4.2.9.RELEASE/build.gradle
new file mode 100644
index 0000000..f790231
--- /dev/null
+++ b/ebr/org.springframework.orm-4.2.9.RELEASE/build.gradle
@@ -0,0 +1,3 @@
+dependencies {
+    sourceBundle group: 'org.springframework', name: 'spring-orm', version: "${springframeworkVersion}"
+}
diff --git a/ebr/org.springframework.orm-4.2.9.RELEASE/org.springframework.orm.mf b/ebr/org.springframework.orm-4.2.9.RELEASE/org.springframework.orm.mf
new file mode 100644
index 0000000..2ba2d03
--- /dev/null
+++ b/ebr/org.springframework.orm-4.2.9.RELEASE/org.springframework.orm.mf
@@ -0,0 +1,50 @@
+Bundle-SymbolicName: org.springframework.orm
+Bundle-Name: Spring ORM
+Bundle-Vendor: Eclipse Virgo
+Bundle-ManifestVersion: 2
+Bundle-Version: ${springframeworkVersion}
+Import-Package:
+ com.ibatis.sqlmap.engine.transaction.external;version="[2.3.4, 3)";resolution:=optional,
+ oracle.toplink.essentials.expressions;version="[2, 3)";resolution:=optional,
+ javax.persistence.criteria;version="${javaxPersistenceVersion:[=.=, +1)}";resolution:=optional,
+ javax.persistence.metamodel;version="${javaxPersistenceVersion:[=.=, +1)}";resolution:=optional,
+ org.eclipse.persistence.expressions;version="[1, 3)";resolution:=optional
+Import-Template:
+ com.ibatis.*;version="[2.3.4, 3)";resolution:=optional,
+ javax.jdo.*;version="[3.1, 4)";resolution:=optional,
+ javax.naming.*;version="0";resolution:=optional,
+ javax.persistence.*;version="${javaxPersistenceVersion:[=.=, +1)}";resolution:=optional,
+ javax.servlet.*;version="[3.0.1, 4)";resolution:=optional,
+ javax.sql.*;version="0";resolution:=optional,
+ javax.transaction.*;version="[1.0.1, 2)";resolution:=optional,
+ javax.xml.*;version="0";resolution:=optional,
+ oracle.toplink.essentials.*;version="[2, 3)";resolution:=optional,
+ org.aopalliance.*;version="${orgAopAllianceVersion:[=.=.=, +1)}",
+ org.apache.commons.logging.*;version="${commonsLoggingVersion:[=.=.=, +1)}",
+ org.apache.openjpa.persistence.*;version="${openjpaVersion:[=.=.=, +1)}";resolution:=optional,
+ org.eclipse.persistence.core.*;version="${eclipsePersistenceCoreVersion:[=.=.=, +1)}";resolution:=optional,
+ org.eclipse.persistence.jpa.*;version="${eclipsePersistenceJpaVersion:[=.=.=, +1)}";resolution:=optional,
+ org.eclipse.persistence.sessions.*;version="${eclipsePersistenceCoreVersion:[=.=.=, +1)}";resolution:=optional,
+ org.hibernate.*;version="[3.6.10.Final, 6)";resolution:=optional,
+ org.springframework.aop.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.beans.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.context.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.core.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.dao.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.instrument.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.jdbc.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.jndi.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.transaction.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.util.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.web.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.ui.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.xml.sax.*;version="0";resolution:=optional,
+ org.w3c.dom.*;version="0";resolution:=optional
+Export-Template:
+ org.springframework.orm.*;version="${springframeworkVersion}"
+Ignored-Existing-Headers:
+ Bnd-LastModified,
+ DynamicImport-Package,
+ Import-Package,
+ Export-Package,
+ Tool
diff --git a/ebr/org.springframework.orm-4.3.9.RELEASE/build.gradle b/ebr/org.springframework.orm-4.3.9.RELEASE/build.gradle
new file mode 100644
index 0000000..f790231
--- /dev/null
+++ b/ebr/org.springframework.orm-4.3.9.RELEASE/build.gradle
@@ -0,0 +1,3 @@
+dependencies {
+    sourceBundle group: 'org.springframework', name: 'spring-orm', version: "${springframeworkVersion}"
+}
diff --git a/ebr/org.springframework.orm-4.3.9.RELEASE/org.springframework.orm.mf b/ebr/org.springframework.orm-4.3.9.RELEASE/org.springframework.orm.mf
new file mode 100644
index 0000000..46033d2
--- /dev/null
+++ b/ebr/org.springframework.orm-4.3.9.RELEASE/org.springframework.orm.mf
@@ -0,0 +1,50 @@
+Bundle-SymbolicName: org.springframework.orm
+Bundle-Name: Spring ORM
+Bundle-Vendor: Eclipse Virgo
+Bundle-ManifestVersion: 2
+Bundle-Version: ${springframeworkVersion}
+Import-Package:
+ com.ibatis.sqlmap.engine.transaction.external;version="[2.3.4, 3)";resolution:=optional,
+ oracle.toplink.essentials.expressions;version="[2, 3)";resolution:=optional,
+ javax.persistence.criteria;version="${javaxPersistenceVersion:[=.=, +1)}";resolution:=optional,
+ javax.persistence.metamodel;version="${javaxPersistenceVersion:[=.=, +1)}";resolution:=optional,
+ org.eclipse.persistence.expressions;version="[1, 3)";resolution:=optional
+Import-Template:
+ org.aopalliance.*;version="${orgAopAllianceVersion:[=.=.=, +1)}",
+ com.ibatis.*;version="[2.3.4, 3)";resolution:=optional,
+ javax.jdo.*;version="[3.1, 4)";resolution:=optional,
+ javax.naming.*;version="0";resolution:=optional,
+ javax.persistence.*;version="${javaxPersistenceVersion:[=.=, +1)}";resolution:=optional,
+ javax.servlet.*;version="[3.0.1, 4)";resolution:=optional,
+ javax.sql.*;version="0";resolution:=optional,
+ javax.transaction.*;version="[1.0.1, 2)";resolution:=optional,
+ javax.xml.*;version="0";resolution:=optional,
+ oracle.toplink.essentials.*;version="[2, 3)";resolution:=optional,
+ org.apache.commons.logging.*;version="${commonsLoggingVersion:[=.=.=, +1)}",
+ org.apache.openjpa.persistence.*;version="${openjpaVersion:[=.=.=, +1)}";resolution:=optional,
+ org.eclipse.persistence.core.*;version="${eclipsePersistenceCoreVersion:[=.=.=, +1)}";resolution:=optional,
+ org.eclipse.persistence.jpa.*;version="${eclipsePersistenceJpaVersion:[=.=.=, +1)}";resolution:=optional,
+ org.eclipse.persistence.sessions.*;version="${eclipsePersistenceCoreVersion:[=.=.=, +1)}";resolution:=optional,
+ org.hibernate.*;version="[3.6.10.Final, 6)";resolution:=optional,
+ org.springframework.aop.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.beans.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.context.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.core.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.dao.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.instrument.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.jdbc.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.jndi.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.transaction.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.util.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.web.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.ui.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.xml.sax.*;version="0";resolution:=optional,
+ org.w3c.dom.*;version="0";resolution:=optional
+Export-Template:
+ org.springframework.orm.*;version="${springframeworkVersion}"
+Ignored-Existing-Headers:
+ Bnd-LastModified,
+ DynamicImport-Package,
+ Import-Package,
+ Export-Package,
+ Tool
diff --git a/ebr/org.springframework.oxm-4.2.9.RELEASE/build.gradle b/ebr/org.springframework.oxm-4.2.9.RELEASE/build.gradle
new file mode 100644
index 0000000..8e714fc
--- /dev/null
+++ b/ebr/org.springframework.oxm-4.2.9.RELEASE/build.gradle
@@ -0,0 +1,3 @@
+dependencies {
+    sourceBundle group: 'org.springframework', name: 'spring-oxm', version: "${springframeworkVersion}"
+}
diff --git a/ebr/org.springframework.oxm-4.2.9.RELEASE/org.springframework.oxm.mf b/ebr/org.springframework.oxm-4.2.9.RELEASE/org.springframework.oxm.mf
new file mode 100644
index 0000000..a442e30
--- /dev/null
+++ b/ebr/org.springframework.oxm-4.2.9.RELEASE/org.springframework.oxm.mf
@@ -0,0 +1,28 @@
+Bundle-SymbolicName: org.springframework.oxm
+Bundle-Name: Spring Object/XML Mapping
+Bundle-Vendor: Eclipse Virgo
+Bundle-ManifestVersion: 2
+Bundle-Version: ${springframeworkVersion}
+Import-Template:
+ javax.activation.*;version="0";resolution:=optional,
+ javax.xml.*;version="0",
+ javax.xml.bind.*;version="0";resolution:=optional,
+ com.thoughtworks.xstream.*;version="${xstreamVersion:[=.=.=, +1)}";resolution:=optional,
+ org.apache.commons.logging.*;version="${commonsLoggingVersion:[=.=.=, +1)}",
+ org.apache.xmlbeans.*;version="${xmlBeans:[=.=.=, +1)}";resolution:=optional,
+ org.exolab.castor.*;version="${castorVersion:[=.=.=, +1)}";resolution:=optional,
+ org.jibx.runtime.*;version="${jibxVersion:[=.=.=, +1)}";resolution:=optional,
+ org.springframework.beans.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.context.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.core.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.util.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.w3c.dom.*;version="0",
+ org.xml.sax.*;version="0"
+Export-Template:
+ org.springframework.oxm.*;version="${springframeworkVersion}"
+Ignored-Existing-Headers:
+ Bnd-LastModified,
+ DynamicImport-Package,
+ Import-Package,
+ Export-Package,
+ Tool
diff --git a/ebr/org.springframework.oxm-4.3.9.RELEASE/build.gradle b/ebr/org.springframework.oxm-4.3.9.RELEASE/build.gradle
new file mode 100644
index 0000000..8e714fc
--- /dev/null
+++ b/ebr/org.springframework.oxm-4.3.9.RELEASE/build.gradle
@@ -0,0 +1,3 @@
+dependencies {
+    sourceBundle group: 'org.springframework', name: 'spring-oxm', version: "${springframeworkVersion}"
+}
diff --git a/ebr/org.springframework.oxm-4.3.9.RELEASE/org.springframework.oxm.mf b/ebr/org.springframework.oxm-4.3.9.RELEASE/org.springframework.oxm.mf
new file mode 100644
index 0000000..a442e30
--- /dev/null
+++ b/ebr/org.springframework.oxm-4.3.9.RELEASE/org.springframework.oxm.mf
@@ -0,0 +1,28 @@
+Bundle-SymbolicName: org.springframework.oxm
+Bundle-Name: Spring Object/XML Mapping
+Bundle-Vendor: Eclipse Virgo
+Bundle-ManifestVersion: 2
+Bundle-Version: ${springframeworkVersion}
+Import-Template:
+ javax.activation.*;version="0";resolution:=optional,
+ javax.xml.*;version="0",
+ javax.xml.bind.*;version="0";resolution:=optional,
+ com.thoughtworks.xstream.*;version="${xstreamVersion:[=.=.=, +1)}";resolution:=optional,
+ org.apache.commons.logging.*;version="${commonsLoggingVersion:[=.=.=, +1)}",
+ org.apache.xmlbeans.*;version="${xmlBeans:[=.=.=, +1)}";resolution:=optional,
+ org.exolab.castor.*;version="${castorVersion:[=.=.=, +1)}";resolution:=optional,
+ org.jibx.runtime.*;version="${jibxVersion:[=.=.=, +1)}";resolution:=optional,
+ org.springframework.beans.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.context.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.core.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.util.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.w3c.dom.*;version="0",
+ org.xml.sax.*;version="0"
+Export-Template:
+ org.springframework.oxm.*;version="${springframeworkVersion}"
+Ignored-Existing-Headers:
+ Bnd-LastModified,
+ DynamicImport-Package,
+ Import-Package,
+ Export-Package,
+ Tool
diff --git a/ebr/org.springframework.test-4.2.9.RELEASE/build.gradle b/ebr/org.springframework.test-4.2.9.RELEASE/build.gradle
new file mode 100644
index 0000000..b8eb387
--- /dev/null
+++ b/ebr/org.springframework.test-4.2.9.RELEASE/build.gradle
@@ -0,0 +1,64 @@
+import java.util.jar.JarEntry
+import java.util.jar.JarOutputStream
+import java.util.zip.ZipEntry
+import java.util.zip.ZipFile
+import java.util.zip.ZipOutputStream
+
+dependencies {
+    sourceBundle group: 'org.springframework', name: 'spring-test', version: "${springframeworkVersion}"
+}
+
+task rewriteJar(dependsOn: 'bundlor') {
+    String jarFileName = file(buildDir.path + "/org.springframework.test-${springframeworkVersion}.jar").path
+    doLast() {
+        ZipFile jarFile = new ZipFile(jarFileName)
+        println "------------"
+        println "Cloning content of jar file ${jarFileName}:"
+        println "------------"
+        new ZipFile(jarFileName).entries().findAll{ !it.directory }.each { println it.name }
+        println "------------"
+        String cloneFileName = new File(jarFileName).path + "-clone"
+        FileOutputStream fos = new FileOutputStream(cloneFileName)
+
+        String manifest
+        jarFile.entries().findAll { it.name == "META-INF/MANIFEST.MF" }.each {
+            manifest = jarFile.getInputStream(it).text
+        }
+        println "------------"
+        println manifest
+        println "------------"
+
+        JarOutputStream jarOutputStream = new JarOutputStream(fos,
+                new java.util.jar.Manifest(new ByteArrayInputStream(manifest.getBytes(java.nio.charset.Charset.forName("UTF-8")))))
+
+        println "------------"
+        byte[] readBuffer = new byte[2156]
+        jarFile.entries().findAll { !it.directory && !(it.name == "META-INF/MANIFEST.MF") && !(it.name.contains("TransactionalTestExecutionListener")) }.each {
+            println "adding ${it.name} to ${cloneFileName}"
+            jarOutputStream.putNextEntry(new JarEntry(it.name))
+            jarOutputStream << jarFile.getInputStream(it)
+        }
+        jarOutputStream.finish()
+        println "finished writing ${cloneFileName}"
+        println "------------"
+
+        println "from ${cloneFileName} to ${jarFileName}"
+        println "within ${file(cloneFileName).parentFile.path} is ${file(cloneFileName).name}"
+        println "rename ${file(cloneFileName).name} -> ${file(jarFileName).name}"
+
+        delete file(jarFileName)
+        copy {
+            from file(file(cloneFileName).parentFile.path)
+            into file(file(cloneFileName).parentFile.path)
+            rename { String fileName ->
+                fileName.replace(file(cloneFileName).name, file(jarFileName).name)
+            }
+        }
+        delete file(cloneFileName)
+        println "------------"
+        println "Removed 'TransactionalTestExecutionListener' from content of jar file ${jarFileName}:"
+        println "------------"
+        new ZipFile(jarFileName).entries().findAll{ !it.directory }.each { println it.name }
+        println "------------"
+    }
+}
diff --git a/ebr/org.springframework.test-4.2.9.RELEASE/org.springframework.test.mf b/ebr/org.springframework.test-4.2.9.RELEASE/org.springframework.test.mf
new file mode 100644
index 0000000..1347c46
--- /dev/null
+++ b/ebr/org.springframework.test-4.2.9.RELEASE/org.springframework.test.mf
@@ -0,0 +1,31 @@
+Bundle-SymbolicName: org.springframework.test
+Bundle-Name: Spring Test
+Bundle-Vendor: Eclipse Virgo
+Bundle-ManifestVersion: 2
+Import-Template:
+ javax.activation.*;version="0";resolution:=optional,
+ javax.el.*;version="[1.0.0, 3.0.0)";resolution:=optional,
+ javax.naming.*;version="0";resolution:=optional,
+ javax.persistence.*;version="${javaxPersistenceVersion:[=.=, +1)}";resolution:=optional,
+ javax.portlet.*;version="[2.0.0, 3.0.0)";resolution:=optional,
+ javax.servlet;version="[2.5.0, 4.0.0)";resolution:=optional,
+ javax.servlet.http;version="[2.5.0, 4.0.0)";resolution:=optional,
+ javax.servlet.jsp.*;version="[2.1.0, 3.0.0)";resolution:=optional,
+ javax.sql.*;version="0";resolution:=optional,
+ javax.xml.*;version="0";resolution:=optional,
+ junit.framework.*;version="[4.11.0, 5.0.0)";resolution:=optional,
+ org.apache.commons.logging.*;version="[1.1.1, 2.0.0)",
+ org.apache.taglibs.standard.*;version="[1.1.0, 2.0.0)";resolution:=optional,
+ org.aspectj.weaver.*;version="[1.7.1, 2.0.0)";resolution:=optional,
+ org.junit.*;version="[4.11.0, 5.0.0)";resolution:=optional,
+ org.springframework.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.testng.*;version="[6.5.2, 7.0.0)";resolution:=optional,
+ org.hamcrest.*;version="[1.3.0, 2.0.0)";resolution:=optional,
+ com.jayway.jsonpath.*;version="[0.8.1, 1.0.0)";resolution:=optional,
+ org.custommonkey.xmlunit.*;version="[1.2.0, 2.0.0)";resolution:=optional,
+ org.w3c.dom.*;version="0";resolution:=optional
+Ignored-Existing-Headers:
+ Bnd-LastModified,
+ Import-Package,
+ Export-Package,
+ Tool
diff --git a/ebr/org.springframework.test-4.3.9.RELEASE/build.gradle b/ebr/org.springframework.test-4.3.9.RELEASE/build.gradle
new file mode 100644
index 0000000..b8eb387
--- /dev/null
+++ b/ebr/org.springframework.test-4.3.9.RELEASE/build.gradle
@@ -0,0 +1,64 @@
+import java.util.jar.JarEntry
+import java.util.jar.JarOutputStream
+import java.util.zip.ZipEntry
+import java.util.zip.ZipFile
+import java.util.zip.ZipOutputStream
+
+dependencies {
+    sourceBundle group: 'org.springframework', name: 'spring-test', version: "${springframeworkVersion}"
+}
+
+task rewriteJar(dependsOn: 'bundlor') {
+    String jarFileName = file(buildDir.path + "/org.springframework.test-${springframeworkVersion}.jar").path
+    doLast() {
+        ZipFile jarFile = new ZipFile(jarFileName)
+        println "------------"
+        println "Cloning content of jar file ${jarFileName}:"
+        println "------------"
+        new ZipFile(jarFileName).entries().findAll{ !it.directory }.each { println it.name }
+        println "------------"
+        String cloneFileName = new File(jarFileName).path + "-clone"
+        FileOutputStream fos = new FileOutputStream(cloneFileName)
+
+        String manifest
+        jarFile.entries().findAll { it.name == "META-INF/MANIFEST.MF" }.each {
+            manifest = jarFile.getInputStream(it).text
+        }
+        println "------------"
+        println manifest
+        println "------------"
+
+        JarOutputStream jarOutputStream = new JarOutputStream(fos,
+                new java.util.jar.Manifest(new ByteArrayInputStream(manifest.getBytes(java.nio.charset.Charset.forName("UTF-8")))))
+
+        println "------------"
+        byte[] readBuffer = new byte[2156]
+        jarFile.entries().findAll { !it.directory && !(it.name == "META-INF/MANIFEST.MF") && !(it.name.contains("TransactionalTestExecutionListener")) }.each {
+            println "adding ${it.name} to ${cloneFileName}"
+            jarOutputStream.putNextEntry(new JarEntry(it.name))
+            jarOutputStream << jarFile.getInputStream(it)
+        }
+        jarOutputStream.finish()
+        println "finished writing ${cloneFileName}"
+        println "------------"
+
+        println "from ${cloneFileName} to ${jarFileName}"
+        println "within ${file(cloneFileName).parentFile.path} is ${file(cloneFileName).name}"
+        println "rename ${file(cloneFileName).name} -> ${file(jarFileName).name}"
+
+        delete file(jarFileName)
+        copy {
+            from file(file(cloneFileName).parentFile.path)
+            into file(file(cloneFileName).parentFile.path)
+            rename { String fileName ->
+                fileName.replace(file(cloneFileName).name, file(jarFileName).name)
+            }
+        }
+        delete file(cloneFileName)
+        println "------------"
+        println "Removed 'TransactionalTestExecutionListener' from content of jar file ${jarFileName}:"
+        println "------------"
+        new ZipFile(jarFileName).entries().findAll{ !it.directory }.each { println it.name }
+        println "------------"
+    }
+}
diff --git a/ebr/org.springframework.test-4.3.9.RELEASE/org.springframework.test.mf b/ebr/org.springframework.test-4.3.9.RELEASE/org.springframework.test.mf
new file mode 100644
index 0000000..69ded2a
--- /dev/null
+++ b/ebr/org.springframework.test-4.3.9.RELEASE/org.springframework.test.mf
@@ -0,0 +1,42 @@
+Bundle-SymbolicName: org.springframework.test
+Bundle-Name: Spring Test
+Bundle-Vendor: Eclipse Virgo
+Bundle-ManifestVersion: 2
+Import-Template:
+ javax.activation.*;version="0";resolution:=optional,
+ javax.el.*;version="[2.2.5, 4)";resolution:=optional,
+ javax.naming.*;version="0";resolution:=optional,
+ javax.persistence.*;version="${javaxPersistenceVersion:[=.=, +1)}";resolution:=optional,
+ javax.portlet.*;version="[2.0.0, 3.0.0)";resolution:=optional,
+ javax.servlet;version="[2.5.0, 4.0.0)";resolution:=optional,
+ javax.servlet.http;version="[2.5.0, 4.0.0)";resolution:=optional,
+ javax.servlet.descriptor;version="[2.5.0, 4.0.0)";resolution:=optional,
+ javax.servlet.jsp.*;version="[2.1.0, 3.0.0)";resolution:=optional,
+ javax.sql.*;version="0";resolution:=optional,
+ javax.xml.*;version="0";resolution:=optional,
+ junit.framework.*;version="[4.11.0, 5.0.0)";resolution:=optional,
+ org.apache.commons.logging.*;version="[1.1.1, 2.0.0)",
+ org.apache.taglibs.standard.*;version="[1.1.0, 2.0.0)";resolution:=optional,
+ org.aspectj.weaver.*;version="[1.7.1, 2.0.0)";resolution:=optional,
+ org.junit.*;version="[4.11.0, 5.0.0)";resolution:=optional,
+ org.springframework.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.mock.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.test.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.testng.*;version="[6.5.2, 7.0.0)";resolution:=optional,
+ org.hamcrest.*;version="[1.3.0, 2.0.0)";resolution:=optional,
+ com.jayway.jsonpath.*;version="[0.8.1, 1.0.0)";resolution:=optional,
+ org.custommonkey.xmlunit.*;version="[1.2.0, 2.0.0)";resolution:=optional,
+ org.w3c.dom.*;version="0";resolution:=optional,
+ com.gargoylesoftware.htmlunit.*;version="0";resolution:=optional,
+ javax.websocket.*;version="0";resolution:=optional,
+ org.apache.http.*;version="0";resolution:=optional,
+ org.openqa.selenium.*;version="0";resolution:=optional,
+ org.skyscreamer.jsonassert;version="0";resolution:=optional,
+ org.xml.sax;version="0";resolution:=optional
+Export-Template:
+ org.springframework.*;version="${springframeworkVersion}"
+Ignored-Existing-Headers:
+ Bnd-LastModified,
+ Import-Package,
+ Export-Package,
+ Tool
diff --git a/ebr/org.springframework.transaction-4.2.9.RELEASE/build.gradle b/ebr/org.springframework.transaction-4.2.9.RELEASE/build.gradle
new file mode 100644
index 0000000..8e17c12
--- /dev/null
+++ b/ebr/org.springframework.transaction-4.2.9.RELEASE/build.gradle
@@ -0,0 +1,3 @@
+dependencies {
+    sourceBundle group: 'org.springframework', name: 'spring-tx', version: "${springframeworkVersion}"
+}
diff --git a/ebr/org.springframework.transaction-4.2.9.RELEASE/org.springframework.transaction.mf b/ebr/org.springframework.transaction-4.2.9.RELEASE/org.springframework.transaction.mf
new file mode 100644
index 0000000..4f96228
--- /dev/null
+++ b/ebr/org.springframework.transaction-4.2.9.RELEASE/org.springframework.transaction.mf
@@ -0,0 +1,37 @@
+Bundle-SymbolicName: org.springframework.transaction
+Bundle-Name: Spring Transaction
+Bundle-Vendor: Eclipse Virgo
+Bundle-ManifestVersion: 2
+Bundle-Version: ${springframeworkVersion}
+Import-Package:
+ com.ibm.websphere.uow;version="[6.0.2.17, 7)";resolution:=optional,
+ com.ibm.wsspi.uow;version="[6.0.2.17, 7)";resolution:=optional,
+ oracle.j2ee.transaction;version="0";resolution:=optional,
+ org.jboss.resource.work;version="0";resolution:=optional,
+ weblogic.transaction;version="0";resolution:=optional
+Import-Template:
+ javax.ejb.*;version="[3, 4)";resolution:=optional,
+ javax.management.*;version="0";resolution:=optional,
+ javax.naming.*;version="0";resolution:=optional,
+ javax.resource.*;version="[1.5, 2)";resolution:=optional,
+ javax.transaction.*;version="[1.0.1, 2.0.0)";resolution:=optional,
+ org.aopalliance.*;version="${orgAopAllianceVersion:[=.=.=, +1)}";resolution:=optional,
+ org.apache.commons.logging.*;version="${commonsLoggingVersion:[=.=.=, +1)}",
+ org.springframework.aop.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.beans.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.context.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.core.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.jndi.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.scheduling.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.stereotype;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.util.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.w3c.dom.*;version="0";resolution:=optional
+Export-Template:
+ org.springframework.dao.*;version="${springframeworkVersion}",
+ org.springframework.jca.*;version="${springframeworkVersion}",
+ org.springframework.transaction.*;version="${springframeworkVersion}"
+Ignored-Existing-Headers:
+ Bnd-LastModified,
+ Import-Package,
+ Export-Package,
+ Tool
diff --git a/ebr/org.springframework.transaction-4.3.9.RELEASE/build.gradle b/ebr/org.springframework.transaction-4.3.9.RELEASE/build.gradle
new file mode 100644
index 0000000..8e17c12
--- /dev/null
+++ b/ebr/org.springframework.transaction-4.3.9.RELEASE/build.gradle
@@ -0,0 +1,3 @@
+dependencies {
+    sourceBundle group: 'org.springframework', name: 'spring-tx', version: "${springframeworkVersion}"
+}
diff --git a/ebr/org.springframework.transaction-4.3.9.RELEASE/org.springframework.transaction.mf b/ebr/org.springframework.transaction-4.3.9.RELEASE/org.springframework.transaction.mf
new file mode 100644
index 0000000..ab20435
--- /dev/null
+++ b/ebr/org.springframework.transaction-4.3.9.RELEASE/org.springframework.transaction.mf
@@ -0,0 +1,37 @@
+Bundle-SymbolicName: org.springframework.transaction
+Bundle-Name: Spring Transaction
+Bundle-Vendor: Eclipse Virgo
+Bundle-ManifestVersion: 2
+Bundle-Version: ${springframeworkVersion}
+Import-Package:
+ com.ibm.websphere.uow;version="[6.0.2.17, 7)";resolution:=optional,
+ com.ibm.wsspi.uow;version="[6.0.2.17, 7)";resolution:=optional,
+ oracle.j2ee.transaction;version="0";resolution:=optional,
+ org.jboss.resource.work;version="0";resolution:=optional,
+ weblogic.transaction;version="0";resolution:=optional
+Import-Template:
+ org.aopalliance.*;version="${orgAopAllianceVersion:[=.=.=, +1)}",
+ javax.ejb.*;version="[3, 4)";resolution:=optional,
+ javax.management.*;version="0";resolution:=optional,
+ javax.naming.*;version="0";resolution:=optional,
+ javax.resource.*;version="[1.5, 2)";resolution:=optional,
+ javax.transaction.*;version="[1.0.1, 2.0.0)";resolution:=optional,
+ org.apache.commons.logging.*;version="${commonsLoggingVersion:[=.=.=, +1)}",
+ org.springframework.aop.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.beans.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.context.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.core.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.jndi.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.scheduling.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.stereotype;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.util.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.w3c.dom.*;version="0";resolution:=optional
+Export-Template:
+ org.springframework.dao.*;version="${springframeworkVersion}",
+ org.springframework.jca.*;version="${springframeworkVersion}",
+ org.springframework.transaction.*;version="${springframeworkVersion}"
+Ignored-Existing-Headers:
+ Bnd-LastModified,
+ Import-Package,
+ Export-Package,
+ Tool
diff --git a/ebr/org.springframework.web-4.2.9.RELEASE/build.gradle b/ebr/org.springframework.web-4.2.9.RELEASE/build.gradle
new file mode 100644
index 0000000..71a51f6
--- /dev/null
+++ b/ebr/org.springframework.web-4.2.9.RELEASE/build.gradle
@@ -0,0 +1,3 @@
+dependencies {
+    sourceBundle group: 'org.springframework', name: 'spring-web', version: "${springframeworkVersion}"
+}
diff --git a/ebr/org.springframework.web-4.2.9.RELEASE/org.springframework.web.mf b/ebr/org.springframework.web-4.2.9.RELEASE/org.springframework.web.mf
new file mode 100644
index 0000000..ab8eb53
--- /dev/null
+++ b/ebr/org.springframework.web-4.2.9.RELEASE/org.springframework.web.mf
@@ -0,0 +1,59 @@
+Bundle-SymbolicName: org.springframework.web
+Bundle-Name: Spring Web
+Bundle-Vendor: Eclipse Virgo
+Bundle-ManifestVersion: 2
+Bundle-Version: ${springframeworkVersion}
+Import-Template:
+ com.caucho.*;version="${hessianVersion:[=.=.=, +1)}";resolution:=optional,
+ com.fasterxml.jackson.*;version="${jacksonVersion:[=.=.=, +1)}";resolution:=optional,
+ com.google.gson.*;version="${gsonVersion:[=.=.=, +1)}";resolution:=optional,
+ com.google.protobuf;version="${protobufJavaVersion:[=.=.=, +1)}";resolution:=optional,
+ com.googlecode.protobuf.format;version="${protobufJavaFormatVersion:[=.=.=, +1)}";resolution:=optional,
+ com.rometools.rome.*;version="${romeVersion:[=.=.=, +1)}";resolution:=optional,
+ com.squareup.okhttp.*;version="${okhttpVersion:[=.=.=, +1)}";resolution:=optional,
+ com.sun.net.*;version="0";resolution:=optional,
+ groovy.*;version="${groovyVersion:[=.=.=, +1)}";resolution:="optional",
+ io.netty.*;version="${nettyVersion:[=.=.=, +1)}";resolution:=optional,
+ javax.activation.*;version="0";resolution:=optional,
+ javax.el.*;version="[2.2.5, 3)";resolution:=optional,
+ javax.faces.*;version="[2.2, 3)";resolution:=optional,
+ javax.imageio.*;version="0";resolution:=optional,
+ javax.jws.*;version="0";resolution:=optional,
+ javax.mail.*;version="[1.5, 2)";resolution:=optional,
+ javax.portlet.*;version="[2, 3)";resolution:=optional,
+ javax.servlet.*;version="[2.4, 4)",
+ javax.servlet.annotation;version="[3, 4)";resolution:=optional,
+ javax.servlet.jsp.*;version="[2.2.1, 3)";resolution:=optional,
+ javax.validation.*;version="[1, 2)";resolution:=optional,
+ javax.xml.*;version="0";resolution:=optional,
+ org.aopalliance.*;version="${orgAopAllianceVersion:[=.=.=, +1)}",
+ org.apache.commons.fileupload.*;version="${commonsFileuploadVersion:[=.=.=, +1)}";resolution:=optional,
+ org.apache.commons.httpclient.*;version="[3.1.0, 4.0.0)";resolution:=optional,
+ org.apache.commons.logging.*;version="${commonsLoggingVersion:[=.=.=, +1)}",
+ org.apache.http.*;version="[4.1.0, 5.0.0)";resolution:=optional,
+ org.apache.log4j.*;version="${apacheLog4jVersion:[=.=.=, +1)}";resolution:=optional,
+ org.codehaus.jackson.*;version="[1.3.0, 2.0.0)";resolution:=optional,
+ org.springframework.aop.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.beans.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.context.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.core.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.format.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.jndi.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.lang.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.oxm.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.remoting.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.stereotype.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.ui.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.util.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.validation.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.xml.sax.*;version="0";resolution:=optional,
+ org.w3c.dom.*;version="0";resolution:=optional
+Export-Template:
+ org.springframework.http.*;version="${springframeworkVersion}",
+ org.springframework.remoting.*;version="${springframeworkVersion}",
+ org.springframework.web.*;version="${springframeworkVersion}"
+Ignored-Existing-Headers:
+ Bnd-LastModified,
+ Import-Package,
+ Export-Package,
+ Tool
diff --git a/ebr/org.springframework.web-4.3.9.RELEASE/build.gradle b/ebr/org.springframework.web-4.3.9.RELEASE/build.gradle
new file mode 100644
index 0000000..71a51f6
--- /dev/null
+++ b/ebr/org.springframework.web-4.3.9.RELEASE/build.gradle
@@ -0,0 +1,3 @@
+dependencies {
+    sourceBundle group: 'org.springframework', name: 'spring-web', version: "${springframeworkVersion}"
+}
diff --git a/ebr/org.springframework.web-4.3.9.RELEASE/org.springframework.web.mf b/ebr/org.springframework.web-4.3.9.RELEASE/org.springframework.web.mf
new file mode 100644
index 0000000..a0497af
--- /dev/null
+++ b/ebr/org.springframework.web-4.3.9.RELEASE/org.springframework.web.mf
@@ -0,0 +1,62 @@
+Bundle-SymbolicName: org.springframework.web
+Bundle-Name: Spring Web
+Bundle-Vendor: Eclipse Virgo
+Bundle-ManifestVersion: 2
+Bundle-Version: ${springframeworkVersion}
+Import-Template:
+ org.aopalliance.*;version="${orgAopAllianceVersion:[=.=.=, +1)}",
+ com.caucho.*;version="${hessianVersion:[=.=.=, +1)}";resolution:=optional,
+ com.fasterxml.jackson.*;version="${jacksonVersion:[=.=.=, +1)}";resolution:=optional,
+ com.google.gson.*;version="${gsonVersion:[=.=.=, +1)}";resolution:=optional,
+ com.google.protobuf;version="${protobufJavaVersion:[=.=.=, +1)}";resolution:=optional,
+ com.googlecode.protobuf.format;version="${protobufJavaFormatVersion:[=.=.=, +1)}";resolution:=optional,
+ com.rometools.rome.*;version="${romeVersion:[=.=.=, +1)}";resolution:=optional,
+ com.squareup.okhttp.*;version="${okhttpVersion:[=.=.=, +1)}";resolution:=optional,
+ com.squareup.okhttp3.*;version="${okhttp3Version:[=.=.=, +1)}";resolution:=optional,
+ okhttp3.*;version="${okhttp3Version:[=.=.=, +1)}";resolution:=optional,
+ com.sun.net.*;version="0";resolution:=optional,
+ groovy.*;version="${groovyVersion:[=.=.=, +1)}";resolution:="optional",
+ io.netty.*;version="${nettyVersion:[=.=.=, +1)}";resolution:=optional,
+ javax.activation.*;version="0";resolution:=optional,
+ javax.el.*;version="[2.2.5, 4)";resolution:=optional,
+ javax.faces.*;version="[2.2, 3)";resolution:=optional,
+ javax.imageio.*;version="0";resolution:=optional,
+ javax.jws.*;version="0";resolution:=optional,
+ javax.mail.*;version="[1.5, 2)";resolution:=optional,
+ javax.portlet.*;version="[2, 3)";resolution:=optional,
+ javax.servlet.*;version="[2.4, 4)",
+ javax.servlet.annotation;version="[3, 4)";resolution:=optional,
+ javax.servlet.jsp.*;version="[2.2.1, 3)";resolution:=optional,
+ javax.validation.*;version="[1, 2)";resolution:=optional,
+ javax.xml.*;version="0";resolution:=optional,
+ javax.net.ssl;version="0";resolution:=optional,
+ org.apache.commons.fileupload.*;version="${commonsFileuploadVersion:[=.=.=, +1)}";resolution:=optional,
+ org.apache.commons.httpclient.*;version="[3.1.0, 4.0.0)";resolution:=optional,
+ org.apache.commons.logging.*;version="${commonsLoggingVersion:[=.=.=, +1)}",
+ org.apache.http.*;version="[4.1.0, 5.0.0)";resolution:=optional,
+ org.apache.log4j.*;version="${apacheLog4jVersion:[=.=.=, +1)}";resolution:=optional,
+ org.codehaus.jackson.*;version="[1.3.0, 2.0.0)";resolution:=optional,
+ org.springframework.aop.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.beans.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.context.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.core.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.format.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.jndi.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.lang.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.oxm.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.remoting.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.stereotype.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.ui.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.util.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.validation.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.xml.sax.*;version="0";resolution:=optional,
+ org.w3c.dom.*;version="0";resolution:=optional
+Export-Template:
+ org.springframework.http.*;version="${springframeworkVersion}",
+ org.springframework.remoting.*;version="${springframeworkVersion}",
+ org.springframework.web.*;version="${springframeworkVersion}"
+Ignored-Existing-Headers:
+ Bnd-LastModified,
+ Import-Package,
+ Export-Package,
+ Tool
diff --git a/ebr/org.springframework.webmvc-4.2.9.RELEASE/build.gradle b/ebr/org.springframework.webmvc-4.2.9.RELEASE/build.gradle
new file mode 100644
index 0000000..ac18802
--- /dev/null
+++ b/ebr/org.springframework.webmvc-4.2.9.RELEASE/build.gradle
@@ -0,0 +1,3 @@
+dependencies {
+    sourceBundle group: 'org.springframework', name: 'spring-webmvc', version: "${springframeworkVersion}"
+}
diff --git a/ebr/org.springframework.webmvc-4.2.9.RELEASE/org.springframework.webmvc.mf b/ebr/org.springframework.webmvc-4.2.9.RELEASE/org.springframework.webmvc.mf
new file mode 100644
index 0000000..7252e6f
--- /dev/null
+++ b/ebr/org.springframework.webmvc-4.2.9.RELEASE/org.springframework.webmvc.mf
@@ -0,0 +1,62 @@
+Bundle-SymbolicName: org.springframework.webmvc
+Bundle-Name: Spring Web MVC
+Bundle-Vendor: Eclipse Virgo
+Bundle-ManifestVersion: 2
+Bundle-Version: ${springframeworkVersion}
+Import-Package:
+ org.springframework.cglib.reflect;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}"
+Import-Template:
+ org.aopalliance.*;version="${orgAopAllianceVersion:[=.=.=, +1)}",
+ com.fasterxml.jackson.*;version="${jacksonVersion:[=.=.=, +1)}";resolution:=optional,
+ com.lowagie.text.*;version="[2.0.8, 3)";resolution:=optional,
+ com.rometools.rome.*;version="${romeVersion:[=.=.=, +1)}";resolution:=optional,
+ com.sun.syndication.*;version="[1, 2)";resolution:=optional,
+ freemarker.*;version="[2.3.14, 3)";resolution:=optional,
+ groovy.*;version="${groovyVersion:[=.=.=, +1)}";resolution:="optional",
+ javax.activation.*;version="0";resolution:=optional,
+ javax.el.*;version="[2.2.5, 4)";resolution:=optional,
+ javax.script;version="0";resotion:=optional,
+ javax.sql.*;version="0";resolution:=optional,
+ javax.servlet.*;version="[3.0.1, 4)",
+ javax.servlet.jsp.*;version="[2.2.1, 3)";resolution:=optional,
+ javax.servlet.jsp.jstl.*;version="[1.2.1, 2)";resolution:=optional,
+ javax.validation.*;version="[1, 2)";resolution:=optional,
+ javax.xml.*;version="0";resolution:=optional,
+ javax.xml.bind.*;version="0";resolution:=optional,
+ jxl.*;version="${jxlVersion:[=.=.=, +1)}";resolution:=optional,
+ net.sf.jasperreports.*;version="${jasperreportsVersion:[=.=.=, +1)}";resolution:=optional,
+ org.apache.commons.logging.*;version="${commonsLoggingVersion:[=.=.=, +1)}",
+ org.apache.poi.*;version="${poiVersion:[=.=.=, +1)}";resolution:=optional,
+ org.apache.tiles.*;version="[2.2.2, 4)";resolution:=optional,
+ org.apache.tiles.request.*;version="[1, 2)";resolution:=optional,
+ org.apache.velocity.*;version="${velocityVersion:[=.=.=, +1)}";resolution:=optional,
+ org.codehaus.jackson.*;version="[1.3.0, 2)";resolution:=optional,
+ org.springframework.aop.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.beans.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.cache.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.cglib.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.context.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.core.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.expression.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.format.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.http.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.lang.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.objenesis.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.oxm.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.scripting.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.stereotype;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.ui.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.util.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.validation.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.web.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.xml.sax.*;version="0";resolution:=optional,
+ org.webjars.*;version="${webjarsVersion:[=.=.=, +1)}";resolution:=optional,
+ org.w3c.dom.*;version="0";resolution:=optional,
+ edu.emory.mathcs.backport.*;version="[3, 4)";resolution:=optional
+Export-Template:
+ org.springframework.web.servlet.*;version="${springframeworkVersion}"
+Ignored-Existing-Headers:
+ Bnd-LastModified,
+ Import-Package,
+ Export-Package,
+ Tool
diff --git a/ebr/org.springframework.webmvc-4.3.9.RELEASE/build.gradle b/ebr/org.springframework.webmvc-4.3.9.RELEASE/build.gradle
new file mode 100644
index 0000000..ac18802
--- /dev/null
+++ b/ebr/org.springframework.webmvc-4.3.9.RELEASE/build.gradle
@@ -0,0 +1,3 @@
+dependencies {
+    sourceBundle group: 'org.springframework', name: 'spring-webmvc', version: "${springframeworkVersion}"
+}
diff --git a/ebr/org.springframework.webmvc-4.3.9.RELEASE/org.springframework.webmvc.mf b/ebr/org.springframework.webmvc-4.3.9.RELEASE/org.springframework.webmvc.mf
new file mode 100644
index 0000000..7252e6f
--- /dev/null
+++ b/ebr/org.springframework.webmvc-4.3.9.RELEASE/org.springframework.webmvc.mf
@@ -0,0 +1,62 @@
+Bundle-SymbolicName: org.springframework.webmvc
+Bundle-Name: Spring Web MVC
+Bundle-Vendor: Eclipse Virgo
+Bundle-ManifestVersion: 2
+Bundle-Version: ${springframeworkVersion}
+Import-Package:
+ org.springframework.cglib.reflect;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}"
+Import-Template:
+ org.aopalliance.*;version="${orgAopAllianceVersion:[=.=.=, +1)}",
+ com.fasterxml.jackson.*;version="${jacksonVersion:[=.=.=, +1)}";resolution:=optional,
+ com.lowagie.text.*;version="[2.0.8, 3)";resolution:=optional,
+ com.rometools.rome.*;version="${romeVersion:[=.=.=, +1)}";resolution:=optional,
+ com.sun.syndication.*;version="[1, 2)";resolution:=optional,
+ freemarker.*;version="[2.3.14, 3)";resolution:=optional,
+ groovy.*;version="${groovyVersion:[=.=.=, +1)}";resolution:="optional",
+ javax.activation.*;version="0";resolution:=optional,
+ javax.el.*;version="[2.2.5, 4)";resolution:=optional,
+ javax.script;version="0";resotion:=optional,
+ javax.sql.*;version="0";resolution:=optional,
+ javax.servlet.*;version="[3.0.1, 4)",
+ javax.servlet.jsp.*;version="[2.2.1, 3)";resolution:=optional,
+ javax.servlet.jsp.jstl.*;version="[1.2.1, 2)";resolution:=optional,
+ javax.validation.*;version="[1, 2)";resolution:=optional,
+ javax.xml.*;version="0";resolution:=optional,
+ javax.xml.bind.*;version="0";resolution:=optional,
+ jxl.*;version="${jxlVersion:[=.=.=, +1)}";resolution:=optional,
+ net.sf.jasperreports.*;version="${jasperreportsVersion:[=.=.=, +1)}";resolution:=optional,
+ org.apache.commons.logging.*;version="${commonsLoggingVersion:[=.=.=, +1)}",
+ org.apache.poi.*;version="${poiVersion:[=.=.=, +1)}";resolution:=optional,
+ org.apache.tiles.*;version="[2.2.2, 4)";resolution:=optional,
+ org.apache.tiles.request.*;version="[1, 2)";resolution:=optional,
+ org.apache.velocity.*;version="${velocityVersion:[=.=.=, +1)}";resolution:=optional,
+ org.codehaus.jackson.*;version="[1.3.0, 2)";resolution:=optional,
+ org.springframework.aop.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.beans.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.cache.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.cglib.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.context.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.core.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.expression.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.format.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.http.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.lang.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.objenesis.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.oxm.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.scripting.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.stereotype;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.ui.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.util.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.validation.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.web.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.xml.sax.*;version="0";resolution:=optional,
+ org.webjars.*;version="${webjarsVersion:[=.=.=, +1)}";resolution:=optional,
+ org.w3c.dom.*;version="0";resolution:=optional,
+ edu.emory.mathcs.backport.*;version="[3, 4)";resolution:=optional
+Export-Template:
+ org.springframework.web.servlet.*;version="${springframeworkVersion}"
+Ignored-Existing-Headers:
+ Bnd-LastModified,
+ Import-Package,
+ Export-Package,
+ Tool
diff --git a/ebr/org.springframework.webmvc.portlet-4.2.9.RELEASE/build.gradle b/ebr/org.springframework.webmvc.portlet-4.2.9.RELEASE/build.gradle
new file mode 100644
index 0000000..4f47288
--- /dev/null
+++ b/ebr/org.springframework.webmvc.portlet-4.2.9.RELEASE/build.gradle
@@ -0,0 +1,3 @@
+dependencies {
+    sourceBundle group: 'org.springframework', name: 'spring-webmvc-portlet', version: "${springframeworkVersion}"
+}
diff --git a/ebr/org.springframework.webmvc.portlet-4.2.9.RELEASE/org.springframework.webmvc.portlet.mf b/ebr/org.springframework.webmvc.portlet-4.2.9.RELEASE/org.springframework.webmvc.portlet.mf
new file mode 100644
index 0000000..9b5b967
--- /dev/null
+++ b/ebr/org.springframework.webmvc.portlet-4.2.9.RELEASE/org.springframework.webmvc.portlet.mf
@@ -0,0 +1,29 @@
+Bundle-SymbolicName: org.springframework.webmvc.portlet
+Bundle-Name: Spring Web MVC Portlet
+Bundle-Vendor: Eclipse Virgo
+Bundle-ManifestVersion: 2
+Bundle-Version: ${springframeworkVersion}
+Import-Template:
+ javax.portlet.*;version="[2, 3)",
+ javax.servlet.*;version="[3.0.1, 4)",
+ javax.xml.*;version="0";resolution:=optional,
+ org.apache.commons.fileupload.*;version="${commonsFileuploadVersion:[=.=.=, +1)}";resolution:=optional,
+ org.apache.commons.logging.*;version="${commonsLoggingVersion:[=.=.=, +1)}",
+ org.springframework.beans.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.context.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.core.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.http.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.jndi.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.stereotype;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.ui.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.util.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.validation.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.web.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.xml.sax.*;version="0";resolution:=optional
+Export-Template:
+ org.springframework.web.portlet.*;version="${springframeworkVersion}"
+Ignored-Existing-Headers:
+ Bnd-LastModified,
+ Import-Package,
+ Export-Package,
+ Tool
diff --git a/ebr/org.springframework.webmvc.portlet-4.3.9.RELEASE/build.gradle b/ebr/org.springframework.webmvc.portlet-4.3.9.RELEASE/build.gradle
new file mode 100644
index 0000000..4f47288
--- /dev/null
+++ b/ebr/org.springframework.webmvc.portlet-4.3.9.RELEASE/build.gradle
@@ -0,0 +1,3 @@
+dependencies {
+    sourceBundle group: 'org.springframework', name: 'spring-webmvc-portlet', version: "${springframeworkVersion}"
+}
diff --git a/ebr/org.springframework.webmvc.portlet-4.3.9.RELEASE/org.springframework.webmvc.portlet.mf b/ebr/org.springframework.webmvc.portlet-4.3.9.RELEASE/org.springframework.webmvc.portlet.mf
new file mode 100644
index 0000000..9b5b967
--- /dev/null
+++ b/ebr/org.springframework.webmvc.portlet-4.3.9.RELEASE/org.springframework.webmvc.portlet.mf
@@ -0,0 +1,29 @@
+Bundle-SymbolicName: org.springframework.webmvc.portlet
+Bundle-Name: Spring Web MVC Portlet
+Bundle-Vendor: Eclipse Virgo
+Bundle-ManifestVersion: 2
+Bundle-Version: ${springframeworkVersion}
+Import-Template:
+ javax.portlet.*;version="[2, 3)",
+ javax.servlet.*;version="[3.0.1, 4)",
+ javax.xml.*;version="0";resolution:=optional,
+ org.apache.commons.fileupload.*;version="${commonsFileuploadVersion:[=.=.=, +1)}";resolution:=optional,
+ org.apache.commons.logging.*;version="${commonsLoggingVersion:[=.=.=, +1)}",
+ org.springframework.beans.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.context.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.core.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.http.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.jndi.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.stereotype;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.ui.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.util.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.validation.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.web.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.xml.sax.*;version="0";resolution:=optional
+Export-Template:
+ org.springframework.web.portlet.*;version="${springframeworkVersion}"
+Ignored-Existing-Headers:
+ Bnd-LastModified,
+ Import-Package,
+ Export-Package,
+ Tool
diff --git a/ebr/org.springframework.websocket-4.2.9.RELEASE/build.gradle b/ebr/org.springframework.websocket-4.2.9.RELEASE/build.gradle
new file mode 100644
index 0000000..a86cf8e
--- /dev/null
+++ b/ebr/org.springframework.websocket-4.2.9.RELEASE/build.gradle
@@ -0,0 +1,3 @@
+dependencies {
+    sourceBundle group: 'org.springframework', name: 'spring-websocket', version: "${springframeworkVersion}"
+}
diff --git a/ebr/org.springframework.websocket-4.2.9.RELEASE/org.springframework.websocket.mf b/ebr/org.springframework.websocket-4.2.9.RELEASE/org.springframework.websocket.mf
new file mode 100644
index 0000000..6935ab3
--- /dev/null
+++ b/ebr/org.springframework.websocket-4.2.9.RELEASE/org.springframework.websocket.mf
@@ -0,0 +1,33 @@
+Bundle-SymbolicName: org.springframework.websocket
+Bundle-Name: Spring Websocket
+Bundle-Vendor: Eclipse Virgo
+Bundle-ManifestVersion: 2
+Bundle-Version: ${springframeworkVersion}
+Import-Template:
+ com.fasterxml.jackson.*;version="${jacksonVersion:[=.=.=, +1)}";resolution:=optional,
+ io.undertow.*;version="${undertowVersion:[=.=.=, +1)}";resolution:=optional,
+ javax.servlet.*;version="[3.1, 4)";resolution:=optional,
+ javax.websocket.*;version="[1, 2)";resolution:=optional,
+ org.apache.commons.logging.*;version="${commonsLoggingVersion:[=.=.=, +1)}",
+ org.apache.tomcat.websocket.server;version="[8.0.30, 9)";resolution:=optional,
+ org.eclipse.jetty.*;version="[9.3.6.v20151106, 10)";resolution:=optional,
+ org.glassfish.tyrus.*;version="[1.3.5, 2)";resolution:=optional,
+ org.springframework.beans.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.context.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.core.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.http.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.lang.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.messaging.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.scheduling.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.stereotype;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.util.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.web.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.w3c.dom.*;version="0";resolution:=optional,
+ org.xnio.*;version="0";resolution:=optional
+Export-Template:
+ org.springframework.web.socket.*;version="${springframeworkVersion}"
+Ignored-Existing-Headers:
+ Bnd-LastModified,
+ Import-Package,
+ Export-Package,
+ Tool
diff --git a/ebr/org.springframework.websocket-4.3.9.RELEASE/build.gradle b/ebr/org.springframework.websocket-4.3.9.RELEASE/build.gradle
new file mode 100644
index 0000000..a86cf8e
--- /dev/null
+++ b/ebr/org.springframework.websocket-4.3.9.RELEASE/build.gradle
@@ -0,0 +1,3 @@
+dependencies {
+    sourceBundle group: 'org.springframework', name: 'spring-websocket', version: "${springframeworkVersion}"
+}
diff --git a/ebr/org.springframework.websocket-4.3.9.RELEASE/org.springframework.websocket.mf b/ebr/org.springframework.websocket-4.3.9.RELEASE/org.springframework.websocket.mf
new file mode 100644
index 0000000..6935ab3
--- /dev/null
+++ b/ebr/org.springframework.websocket-4.3.9.RELEASE/org.springframework.websocket.mf
@@ -0,0 +1,33 @@
+Bundle-SymbolicName: org.springframework.websocket
+Bundle-Name: Spring Websocket
+Bundle-Vendor: Eclipse Virgo
+Bundle-ManifestVersion: 2
+Bundle-Version: ${springframeworkVersion}
+Import-Template:
+ com.fasterxml.jackson.*;version="${jacksonVersion:[=.=.=, +1)}";resolution:=optional,
+ io.undertow.*;version="${undertowVersion:[=.=.=, +1)}";resolution:=optional,
+ javax.servlet.*;version="[3.1, 4)";resolution:=optional,
+ javax.websocket.*;version="[1, 2)";resolution:=optional,
+ org.apache.commons.logging.*;version="${commonsLoggingVersion:[=.=.=, +1)}",
+ org.apache.tomcat.websocket.server;version="[8.0.30, 9)";resolution:=optional,
+ org.eclipse.jetty.*;version="[9.3.6.v20151106, 10)";resolution:=optional,
+ org.glassfish.tyrus.*;version="[1.3.5, 2)";resolution:=optional,
+ org.springframework.beans.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.context.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.core.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.http.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.lang.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.messaging.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}";resolution:=optional,
+ org.springframework.scheduling.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.stereotype;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.util.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.springframework.web.*;version="${springframeworkVersion:[=.=.=.=, =.=.=.=]}",
+ org.w3c.dom.*;version="0";resolution:=optional,
+ org.xnio.*;version="0";resolution:=optional
+Export-Template:
+ org.springframework.web.socket.*;version="${springframeworkVersion}"
+Ignored-Existing-Headers:
+ Bnd-LastModified,
+ Import-Package,
+ Export-Package,
+ Tool
diff --git a/ebr/settings.gradle b/ebr/settings.gradle
new file mode 100644
index 0000000..76a421c
--- /dev/null
+++ b/ebr/settings.gradle
@@ -0,0 +1,21 @@
+include "org.springframework.aop-${springframeworkVersion}"
+include "org.springframework.aspects-${springframeworkVersion}"
+include "org.springframework.beans-${springframeworkVersion}"
+include "org.springframework.context-${springframeworkVersion}"
+include "org.springframework.context.support-${springframeworkVersion}"
+include "org.springframework.core-${springframeworkVersion}"
+include "org.springframework.expression-${springframeworkVersion}"
+include "org.springframework.jdbc-${springframeworkVersion}"
+include "org.springframework.jms-${springframeworkVersion}"
+include "org.springframework.messaging-${springframeworkVersion}"
+include "org.springframework.orm-${springframeworkVersion}"
+include "org.springframework.oxm-${springframeworkVersion}"
+include "org.springframework.transaction-${springframeworkVersion}"
+include "org.springframework.web-${springframeworkVersion}"
+include "org.springframework.webmvc-${springframeworkVersion}"
+include "org.springframework.webmvc.portlet-${springframeworkVersion}"
+include "org.springframework.websocket-${springframeworkVersion}"
+include "org.springframework.test-${springframeworkVersion}"
+include "org.aspectj.weaver-${aspectjVersion}"
+include "com.squareup.okio-${okioVersion}"
+include "com.squareup.okhttp3-${okhttp3Version}"
diff --git a/ebr/src/test/java/org/eclipse/virgo/ebr/AbstractBaseTest.java b/ebr/src/test/java/org/eclipse/virgo/ebr/AbstractBaseTest.java
new file mode 100644
index 0000000..e64a491
--- /dev/null
+++ b/ebr/src/test/java/org/eclipse/virgo/ebr/AbstractBaseTest.java
@@ -0,0 +1,48 @@
+package org.eclipse.virgo.ebr;
+
+import org.junit.runner.RunWith;
+import org.ops4j.pax.exam.Option;
+import org.ops4j.pax.exam.junit.PaxExam;
+import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
+import org.ops4j.pax.exam.spi.reactors.PerClass;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+
+import javax.inject.Inject;
+
+import static org.junit.Assert.fail;
+import static org.junit.Assume.assumeFalse;
+import static org.junit.Assume.assumeNotNull;
+import static org.osgi.framework.Bundle.ACTIVE;
+
+/**
+ * Abstract test class to be extended by all test implementations.
+ * <p>
+ * Created by dam on 6/14/17.
+ */
+@RunWith(PaxExam.class)
+@ExamReactorStrategy(PerClass.class)
+public abstract class AbstractBaseTest {
+
+    public static final String MIRROR_GROUP = "org.eclipse.virgo.mirrored";
+
+    @Inject
+    protected BundleContext bundleContext;
+
+    public abstract Option[] config();
+
+    protected void assertBundleActive(String symbolicName) throws BundleException {
+        assumeNotNull(symbolicName);
+        assumeFalse(symbolicName.isEmpty());
+        for (Bundle b : this.bundleContext.getBundles()) {
+            if (symbolicName.equals(b.getSymbolicName())) {
+                if (ACTIVE != b.getState()) {
+                    b.start(); // start the bundle so we get the exception
+                }
+                return;
+            }
+        }
+        fail("Bundle with symbolicName [" + symbolicName + "] could not be found.");
+    }
+}
diff --git a/ebr/src/test/java/org/eclipse/virgo/ebr/OkHttp3Test.java b/ebr/src/test/java/org/eclipse/virgo/ebr/OkHttp3Test.java
new file mode 100644
index 0000000..81e0abf
--- /dev/null
+++ b/ebr/src/test/java/org/eclipse/virgo/ebr/OkHttp3Test.java
@@ -0,0 +1,43 @@
+package org.eclipse.virgo.ebr;
+
+import org.junit.Test;
+import org.ops4j.pax.exam.Configuration;
+import org.ops4j.pax.exam.Option;
+
+import static org.ops4j.pax.exam.CoreOptions.*;
+
+/**
+ * Test class testing OkHttp3 bundle resolution.
+ * <p>
+ * Created by dam on 6/14/17.
+ */
+public class OkHttp3Test extends AbstractBaseTest {
+
+    private static final String OKIO = "com.squareup.okio";
+    private static final String OKIO_VERSION = "1.13.0";
+
+    private static final String OKHTTP3 = "com.squareup.okhttp3";
+    private static final String OKHTTP3_VERSION = "3.8.0";
+
+    @Configuration
+    @Override
+    public Option[] config() {
+        return options(
+                // maven local
+                mavenBundle(MIRROR_GROUP, OKIO, OKIO_VERSION),
+                mavenBundle(MIRROR_GROUP, OKHTTP3, OKHTTP3_VERSION),
+                // specify junit bundles
+                junitBundles()
+        );
+    }
+
+    @Test
+    public void testOkio() throws Exception {
+        assertBundleActive(OKIO);
+    }
+
+    @Test
+    public void testOkHttp3() throws Exception {
+        assertBundleActive(OKHTTP3);
+    }
+}
diff --git a/ebr/src/test/java/org/eclipse/virgo/ebr/SpringFrameworkTest.java b/ebr/src/test/java/org/eclipse/virgo/ebr/SpringFrameworkTest.java
new file mode 100644
index 0000000..b299a0e
--- /dev/null
+++ b/ebr/src/test/java/org/eclipse/virgo/ebr/SpringFrameworkTest.java
@@ -0,0 +1,162 @@
+package org.eclipse.virgo.ebr;
+
+import org.junit.Test;
+import org.ops4j.pax.exam.Configuration;
+import org.ops4j.pax.exam.Option;
+
+import static org.ops4j.pax.exam.CoreOptions.*;
+
+/**
+ * Test class testing Spring Framework bundle resolution.
+ * <p>
+ * Created by dam on 6/9/17.
+ */
+public class SpringFrameworkTest extends AbstractBaseTest {
+
+    private static final String ASPECTJ_WEAVER = "org.aspectj.weaver";
+    private static final String ASPECTJ_WEAVER_VERSION = "1.8.10";
+
+    private static final String SF_VERSION = "4.3.9.RELEASE";
+    private static final String SF_PREFIX = "org.springframework.";
+    private static final String SF_CORE = SF_PREFIX + "core";
+    private static final String SF_BEANS = SF_PREFIX + "beans";
+    private static final String SF_AOP = SF_PREFIX + "aop";
+    private static final String SF_ASPECTS = SF_PREFIX + "aspects";
+    private static final String SF_EXPRESSION = SF_PREFIX + "expression";
+    private static final String SF_CONTEXT = SF_PREFIX + "context";
+    private static final String SF_CONTEXT_SUPPORT = SF_PREFIX + "context.support";
+    private static final String SF_TRANSACTION = SF_PREFIX + "transaction";
+    private static final String SF_JDBC = SF_PREFIX + "jdbc";
+    private static final String SF_MESSAGING = SF_PREFIX + "messaging";
+    private static final String SF_JMS = SF_PREFIX + "jms";
+    private static final String SF_ORM = SF_PREFIX + "orm";
+    private static final String SF_OXM = SF_PREFIX + "oxm";
+    private static final String SF_WEB = SF_PREFIX + "web";
+    private static final String SF_WEBMVC = SF_PREFIX + "webmvc";
+    private static final String SF_WEBMVC_PORTLET = SF_PREFIX + "webmvc.portlet";
+    private static final String SF_WEBSOCKET = SF_PREFIX + "websocket";
+
+    @Configuration
+    @Override
+    public Option[] config() {
+        return options(
+                // spring framework dependencies
+                mavenBundle("commons-logging", "commons-logging", "1.2"),
+                mavenBundle("javax.servlet", "javax.servlet-api", "3.1.0"),
+                mavenBundle("javax.portlet", "portlet-api", "2.0"),
+                bundle("http://build.eclipse.org/rt/virgo/ivy/bundles/release/org.eclipse.virgo.mirrored/oevm.org.aopalliance/1.0.0/oevm.org.aopalliance-1.0.0.jar"),
+                bundle("http://build.eclipse.org/rt/virgo/ivy/bundles/release/org.eclipse.virgo.mirrored/javax.jms/1.1.0.v201205091237/javax.jms-1.1.0.v201205091237.jar"),
+                // maven local
+                mavenBundle(MIRROR_GROUP, ASPECTJ_WEAVER, ASPECTJ_WEAVER_VERSION),
+                mavenBundle(MIRROR_GROUP, SF_CORE, SF_VERSION),
+                mavenBundle(MIRROR_GROUP, SF_BEANS, SF_VERSION),
+                mavenBundle(MIRROR_GROUP, SF_AOP, SF_VERSION),
+                mavenBundle(MIRROR_GROUP, SF_ASPECTS, SF_VERSION),
+                mavenBundle(MIRROR_GROUP, SF_EXPRESSION, SF_VERSION),
+                mavenBundle(MIRROR_GROUP, SF_CONTEXT, SF_VERSION),
+                mavenBundle(MIRROR_GROUP, SF_CONTEXT_SUPPORT, SF_VERSION),
+                mavenBundle(MIRROR_GROUP, SF_TRANSACTION, SF_VERSION),
+                mavenBundle(MIRROR_GROUP, SF_JDBC, SF_VERSION),
+                mavenBundle(MIRROR_GROUP, SF_MESSAGING, SF_VERSION),
+                mavenBundle(MIRROR_GROUP, SF_JMS, SF_VERSION),
+                mavenBundle(MIRROR_GROUP, SF_ORM, SF_VERSION),
+                mavenBundle(MIRROR_GROUP, SF_OXM, SF_VERSION),
+                mavenBundle(MIRROR_GROUP, SF_WEB, SF_VERSION),
+                mavenBundle(MIRROR_GROUP, SF_WEBMVC, SF_VERSION),
+                mavenBundle(MIRROR_GROUP, SF_WEBMVC_PORTLET, SF_VERSION),
+                mavenBundle(MIRROR_GROUP, SF_WEBSOCKET, SF_VERSION),
+                // specify junit bundles
+                junitBundles()
+        );
+    }
+
+    @Test
+    public void testAspectjWeaver() throws Exception {
+        assertBundleActive(ASPECTJ_WEAVER);
+    }
+
+    @Test
+    public void testSpringCore() throws Exception {
+        assertBundleActive(SF_CORE);
+    }
+
+    @Test
+    public void testSpringBeans() throws Exception {
+        assertBundleActive(SF_BEANS);
+    }
+
+    @Test
+    public void testSpringAop() throws Exception {
+        assertBundleActive(SF_AOP);
+    }
+
+    @Test
+    public void testSpringAspects() throws Exception {
+        assertBundleActive(SF_ASPECTS);
+    }
+
+    @Test
+    public void testSpringExpression() throws Exception {
+        assertBundleActive(SF_EXPRESSION);
+    }
+
+    @Test
+    public void testSpringContext() throws Exception {
+        assertBundleActive(SF_CONTEXT);
+    }
+
+    @Test
+    public void testSpringContextSupport() throws Exception {
+        assertBundleActive(SF_CONTEXT_SUPPORT);
+    }
+
+    @Test
+    public void testSpringTransaction() throws Exception {
+        assertBundleActive(SF_TRANSACTION);
+    }
+
+    @Test
+    public void testSpringJdbc() throws Exception {
+        assertBundleActive(SF_JDBC);
+    }
+
+    @Test
+    public void testSpringMessaging() throws Exception {
+        assertBundleActive(SF_MESSAGING);
+    }
+
+    @Test
+    public void testSpringJsm() throws Exception {
+        assertBundleActive(SF_JMS);
+    }
+
+    @Test
+    public void testSpringOrm() throws Exception {
+        assertBundleActive(SF_ORM);
+    }
+
+    @Test
+    public void testSpringOxm() throws Exception {
+        assertBundleActive(SF_OXM);
+    }
+
+    @Test
+    public void testSpringWeb() throws Exception {
+        assertBundleActive(SF_WEB);
+    }
+
+    @Test
+    public void testSpringWebMvc() throws Exception {
+        assertBundleActive(SF_WEBMVC);
+    }
+
+    @Test
+    public void testSpringWebMvcPortlet() throws Exception {
+        assertBundleActive(SF_WEBMVC_PORTLET);
+    }
+
+    @Test
+    public void testSpringWebsocket() throws Exception {
+        assertBundleActive(SF_WEBSOCKET);
+    }
+}
diff --git a/gradle.properties b/gradle.properties
new file mode 100644
index 0000000..b990802
--- /dev/null
+++ b/gradle.properties
@@ -0,0 +1,370 @@
+# will be replaced before running the bundlor task
+version = @VIRGO.VERSION@
+
+# Eclipse JDT Core Batch Compiler
+ecjVersion = 4.6.1
+
+# CQ4129 (PB CQ3480)
+junitVersion = 4.7
+
+# CQ4132 (PB CQ1887)
+easymockVersion = 2.3
+
+# PaxExam
+# CQ8541
+paxExamJunit4Version = 4.1.0
+paxExamContainerNativeVersion = 4.1.0
+paxExamLinkMvnVersion = 4.1.0
+paxUrlAetherVersion = 1.3.5
+paxUrlWrapVersion = 2.3.0
+
+# CQ 13678 SLF4J jcl-over-slf4j Version: 1.7.25
+# CQ 13367 SLF4J jul-to-slf4j Version: 1.7.25
+# CQ 13680 SLF4J log4j-over-slf4j Version: 1.7.25
+# CQ 13637 SLF4J slf4j-api Version: 1.7.25
+# CQ 12540 SLF4J slf4j-nop version 1.7.22 and later (incl. 1.7.25)
+slf4jVersion = 1.7.25
+# CQ 13636 - Logback Classic Version 1.2.3
+# CQ 13635 - Logback Core Version: 1.2.3
+logbackVersion = 1.2.3
+
+# Eclipse Kepler 4.3.2 (SR2)
+equinoxVersion = 3.9.1.v20140110-1610
+osgiServicesVersion = 3.3.100.v20130513-1956
+osgiEnterpriseVersion = 4.2.0.v201108120515
+
+equinoxAppVersion = 1.3.100.v20130327-1442
+# ConfigAdminService
+equinoxCmVersion = 1.0.400.v20130327-1442
+# Eclipse Mars.2
+# requires 'package org.osgi.framework 1.8.0'
+# equinoxCmVersion = 1.1.0.v20131021-1936
+equinoxCommonVersion = 3.6.200.v20130402-1505
+# DeclarativeService
+#equinoxDsVersion = 1.4.101.v20130813-1853
+#equinoxDsVersion = 1.4.400.v20160226-2036
+equinoxDsVersion = 1.4.200.v20131126-2331
+equinoxConsoleVersion = 1.0.100.v20130429-0953
+equinoxConsoleSshVersion = 1.0.0.v20130515-2026
+equinoxEventVersion = 1.3.0.v20130327-1442
+equinoxFrameworkadminEquinoxVersion = 1.0.500.v20130327-2119
+equinoxFrameworkadminVersion = 2.0.100.v20130327-2119
+
+#equinoxHttpJettyVersion = 3.0.200.v20131021-1843
+equinoxHttpJettyVersion = 3.0.100.v20130327-1442
+#equinoxHttpServletVersion = 1.1.500.v20140318-1755
+equinoxHttpServletVersion = 1.1.400.v20130418-1354
+
+# Note: Used by Virgo Build Tools, too
+equinoxLauncherVersion = 1.3.0.v20130327-1440
+equinoxPreferencesVersion = 3.5.100.v20130422-1538
+equinoxRegionVersion = 1.1.101.v20130722-1314
+equinoxRegionExportedPackageVersion = 1.1.0
+equinoxRegistryVersion = 3.5.301.v20130717-1549
+equinoxSecurityVersion = 1.2.0.v20130424-1801
+equinoxSimpleConfiguratorVersion = 1.0.400.v20130327-2119
+equinoxSimpleConfiguratorManipulatorVersion = 2.0.0.v20130327-2119
+equinoxUtilVersion = 1.0.500.v20130404-1337
+
+eclipseCoreContenttypeVersion = 3.4.200.v20130326-1255
+eclipseCoreJobsVersion = 3.5.300.v20130429-1813
+eclipseCoreNetVersion = 1.2.200.v20130430-1352
+eclipseCoreRuntimeVersion = 3.9.100.v20131218-1515
+
+eclipseJdtCoreCompilerBatchVersion = 3.10.0.v20140604-1726
+
+eclipseEcfIdentityVersion = 3.2.0.v20130604-1622
+eclipseEcfFiletransferVersion = 5.0.0.v20130604-1622
+eclipseEcfProviderFiletransferVersion = 3.2.0.v20130604-1622
+eclipseEcfSslVersion = 1.1.0.v20130604-1622
+eclipseEcfVersion = 3.2.0.v20130604-1622
+
+sat4jCoreVersion = 2.3.5.v201308161310
+sat4jPbVersion = 2.3.5.v201308161310
+
+p2ArtifactRepositoryVersion = 1.1.200.v20130515-2028
+p2ConsoleVersion = 1.0.300.v20130327-2119
+p2CoreVersion = 2.3.0.v20130327-2119
+p2DirectorVersion = 2.3.1.v20140221-1852
+p2EngineVersion = 2.3.0.v20130526-2122
+p2GarbageCollectorVersion = 1.0.200.v20130327-2119
+p2JarProcessorVersion = 1.0.300.v20130327-2119
+p2MetadataVersion = 2.2.0.v20130523-1557
+p2MetadataRepositoryVersion = 1.2.100.v20130327-2119
+p2PublisherVersion = 1.3.0.v20140129-1405
+p2PublisherEclipseVersion = 1.1.200.v20130516-1953
+p2RepositoryVersion = 2.3.0.v20130412-2032
+p2TouchpointEclipseVersion = 2.1.200.v20130327-2119
+p2TouchpointNativesVersion = 1.1.100.v20130327-2119
+p2TransportEcfVersion = 1.1.0.v20130516-1858
+
+#CQ5528
+apacheSshdCoreVersion = 0.5.0.v201108120515
+#CQ6402 - command, shell and runtime
+gogoCommandVersion = 0.10.0.v201209301215
+gogoRuntimeVersion = 0.10.0.v201209301036
+gogoShellVersion = 0.10.0.v201211091412
+#CQ5527
+minaCoreVersion = 2.0.2.v201108120515
+
+#CQ4033
+orgAopAllianceVersion = 1.0.0
+
+geminiBlueprintVersion = 2.1.0.JAVA7
+
+#CQ 13690 org.springframework.aop
+#CQ 13691 org.springframework.aspects
+#CQ 13692 org.springframework.beans
+#CQ 13693 org.springframework.context
+#CQ 13694 org.springframework.context.support
+#CQ 13695 org.springframework.core
+#CQ 13696 org.springframework.expression
+#CQ 13697 org.springframework.jdbc
+#CQ 13698 org.springframework.jms
+#CQ 13699 org.springframework.messaging
+#CQ 13700 org.springframework.orm
+#CQ 13701 org.springframework.oxm
+#CQ 13702 org.springframework.transaction
+#CQ 13703 org.springframework.web
+#CQ 13704 org.springframework.webmvc
+#CQ 13705 org.springframework.webmvc.portlet
+#CQ 13706 org.springframework.websocket
+springframeworkVersion = 4.3.9.RELEASE
+
+geminiManagementVersion = 1.0.5.RELEASE
+geminiWebVersion = 3.0.3.RELEASE
+
+objectwebAsmVersion = 3.2.0.v200909071300
+scannotationVersion = 1.0.2.v201205170710
+
+commonsBeanutilsVersion = 1.8.0.v201205091237
+# CQ 10288 (PB CQ9217)
+commonsCodecVersion = 1.10.0
+commonsCliVersion = 1.2.0
+# CQ12542 (PB CQ10386)
+commonsCollectionsVersion = 3.2.2
+commonsDbcpVersion = 1.4.0.v201204271417
+# CQ12541 (PB CQ12051)
+commonsFileuploadVersion = 1.3.2
+# CQ3956 (PB CQ1765)
+commonsHttpClientVersion = 3.1.0
+
+# CQ9555 (PB Orbit CQ8938)
+httpcomponentsCoreVersion = 4.3.3
+# CQ9556 (PB Orbit CQ8934)
+httpcomponentsClientVersion = 4.3.6
+
+# CQ13049
+commonsIoVersion = 2.5
+# CQ7151
+commonsLangVersion = 3.1.0
+# CQ12625 (PB CQ10162)
+commonsLoggingVersion = 1.2.0
+# CQ6102
+commonsPoolVersion = 1.6.0.v201204271246
+
+apacheTaglibsStandardVersion = 1.1.2.v20110517
+
+apacheBvalVersion = 0.5.0
+# TODO update derby to apacheDerbyVersion = 10.12.1.1 required by spring-orm
+apacheDerbyVersion = 10.8.2.2_v201211210650
+# CQ4833 log4j Version: 1.2.15 (Subset - see all comments) (PB Orbit CQ3560)
+# TODO move forward to 1.2.17 used in spring-core
+apacheLog4jVersion = 1.2.15.v201012070815
+# CQ7162 OpenEJB (Subset) Version: 4.5.2
+apacheOpenejbVersion = 4.5.2
+apacheOpenejbCoreVersion = 4.5.2.virgo-3
+
+# CQ7145 openwebbeans (Subset) Version: 1.1.7
+apacheOpenwebbeansVersion = 1.1.7.v201304201405
+apacheOpenwebbeansEEVersion = 1.1.7.v201304200545
+apacheOpenwebbeansTomcat7Version = 1.1.7.v201304201405-virgo-1
+
+# CQ7149 XBean (Subset) Version: 3.12
+apacheXBeanAsmVersion = 3.12.0.v201304200545
+apacheXBeanBundleutilsVersion = 3.12.0.v201304200545
+apacheXBeanFinderVersion = 3.12.0.v201304201405
+apacheXBeanNamingVersion = 3.12.0.v201304201405
+apacheXBeanReflectVersion = 3.12.0.v201304201405
+
+# CQ7147 Java Server Faces Version: 2.1.18
+# TODO What's the difference of javax.faces and com.sun.faces - do we need both?
+glassfishJavaxFacesVersion = 2.1.18.v201304200545
+glassfishComSunFacesVersion = 2.1.18.v201304210537-virgo-2
+
+geronimoComponentsConnectorVersion = 3.1.1.v201205170953
+geronimoComponentsTransactionVersion = 3.1.1.v201205170710
+geronimoSpecsJ2eeManagementVersion = 1.0.0.v201205091237
+geronimoSpecsOsgiLocatorVersion = 1.1.0.v201205170953
+geronimoSpecsOsgiRegistryVersion = 1.1.0.v201205170710
+
+javaxActivationVersion = 1.1.0.v201108011116
+javaxAnnotationVersion= 1.2.0.v201401042248
+# CQ6093 ejb-api Version: 3.1.1
+javaxEjbVersion=3.1.1.v201204261316
+javaxElVersion=3.0.0.20170128
+# CQ6090 (PB Orbit CQ3578)
+javaxInjectVersion = 1.0.0.v20091030
+javaxJmsVersion=1.1.0.v201205091237
+# CQ12547 (PB CQ11275)
+javaxMailVersion = 1.5.5
+# TODO create CQ?
+# Available from Eclipse Link p2 site http://download.eclipse.org/rt/eclipselink/updates/2.4.2.v20130514-5956486/
+javaxPersistenceVersion=2.1.0.v201304241213
+# CQ3940
+javaxPortletVersion=2.0.0
+javaxResourceVersion=1.6.0.v201204270900
+javaxSecurityAuthMessageVersion=1.1.0.20170128
+# TODO - check if a CQ is missing
+javaxSecurityJaccVersion=1.4.0.v201205031350
+# CQ6246 Jetty servlet-api Version: 3.0 (PB CQ3217)
+# CQ5123 Glassfish servlet-api Version: 3.1-b33 (PB CQ4712)
+javaxServletVersion = 3.1.0.20170128
+# CQ12626 JSP 2.3 FINAL (API 2.3.1 & Impl 2.3.2) (PB Orbit CQ 7295)
+# TODO upgrade to 2.3.1 ?!
+javaxServletJspVersion = 2.3.0.20170128
+# CQ5435 (PB Orbit CQ2334)
+# TODO upgrade to 1.2 needed by spring-aspects, spring-jdbc, spring-jms, spring-orm, spring-tx
+# CQ12544 javax.servlet.jsp.jstl api Version: 1.2.1
+javaxServletJspJstlApiVersion=1.2.1
+# CQ12543 JSP Standard Tag Library Version 1.2.5-b03
+javaxServletJspJstlImplVersion=1.2.5-b03
+javaxServletJspJstlImplOsgiVersion=1.2.5.b03
+# CQ12565 Java Interceptor API 1.2
+javaxInterceptorVersion = 1.2
+# CQ12546 Java Transaction API Version: 1.2 (PB Orbit CQ7296)
+javaxTransactionVersion = 1.2
+# CQ6095 Bean Validation API Version: 1.0.0 GA (PB CQ3570)
+javaxValidationVersion=1.0.0.GA_v201205091237
+# Covered by Tomcat CQ
+javaxWebsocketVersion=1.1.0.20170128
+javaxWsdlVersion=1.6.2.v201012040545
+javaxWsRsVersion=1.1.1.v20101004-1200
+javaxXmlRpcVersion=1.1.0.v201005080400
+
+eclipsePersistenceAntlrVersion = 3.2.0.v201206041011
+eclipsePersistenceAsmVersion = 3.3.1.v201206041142
+# TODO update to 2.4.2 required by spring-orm
+eclipsePersistenceCoreVersion = 2.4.1.v20121003-ad44345
+eclipsePersistenceJpaVersion = 2.4.1.v20121003-ad44345
+eclipsePersistenceJpaJpqlVersion = 2.0.1.v20121003-ad44345
+
+# CQ6092 cdi-api Version: 1.0 (Context and Dependency Injection API from JSR 299)
+cdiApiVersion = 1.0.0.v201105160744
+javassistVersion = 3.17.1.GA
+# CQ6100 Java Open Transaction Manager (JOTM) 2.1.9 *Subset*
+jotmVersion = 2.1.9.v201204271116
+# TODO - update to 2.2.2 required by spring-context-support
+quartzVersion = 1.6.0.v201204271540
+
+# CQ 11207
+# CQ 13683
+jolokiaVersion = 1.3.6
+
+aspectjVersion = 1.8.10
+
+# Delivered with RAP 2.3.2
+jettyVersion = 8.1.16.v20140903
+# TODO move forward to latest release (as of April 8th 2016)
+#jettyVersion = 8.1.18.v20150929
+
+# CQ13795 Apache Tomcat 8.5.16 (PB CQ13794)
+apacheCatalinaVersion = 8.5.16
+
+# CQ7699 (PB Orbit CQ6772)
+mozillaJavascriptVersion = 1.7.4.v201209142200
+# CQ7126 Hibernate Version: 4.1.0
+# TODO - upgrade to 4.3.2.Final used in spring-context
+hibernateVersion = 4.1.0.Final
+
+# RAP 2.3.2
+eclipseCoreCommandsVersion = 3.6.100.v20140528-1422
+eclipseCoreDatabindingObservableVersion = 1.4.1.v20140210-1835
+eclipseCoreDatabindingPropertyVersion = 1.4.200.v20140214-0004
+eclipseCoreDatabindingVersion = 1.4.2.v20140729-1044
+icuBaseVersion = 52.1.1.v201501240615
+
+rapRwtVersion = 2.3.2.20150128-1013
+rapRwtOsgiVersion = 2.3.2.20150119-1706
+rapJfaceVersion = 2.3.2.20150119-1706
+rapJfaceDatabindingVersion = 2.3.2.20150119-1706
+rapUiVersion = 2.3.2.20150119-1706
+
+# performance-tests
+#    jwebunitVersion = 2.2.0
+# TODO create CQ for version 3.2?
+jwebunitVersion = 3.2
+# TODO create CQ for version 2.15?
+htmlUnitVersion = 2.15
+
+# system-tests
+dumbsterVersion = 1.6.0
+
+# optional Spring Framework 4.2.9.RELEASE dependencies
+# only used to generate the correct OSGi manifests
+
+# spring-aop
+jamonVersion = 2.81
+commonsPool2Version = 2.4.2
+
+# spring-aspects
+javaxCacheVersion = 1.0.0
+
+# spring-beans
+groovyVersion = 2.4.5
+snakeYamlVersion = 1.16
+
+# spring-context
+# bundlor fails with 2.0b4
+beanShellVersion = 2
+jodaTimeVersion = 2.9.1
+jrubyVersion = 1.7.23
+
+# spring-context-support
+commonjVersion = 1.1.0
+ehcacheVersion = 2.10.1
+freemarkerVersion = 2.3.23
+jasperreportsVersion = 6.2.0
+velocityVersion = 1.7
+
+# spring-core
+joptSimpleVersion = 4.9
+
+# spring-jdbc
+c3p0Version = 0.9.5.2
+hsqldbVersion = 2.3.3
+jacksonVersion = 2.6.4
+
+# spring-messaging
+nettyVersion = 4.0.33.Final
+reactorVersion = 2.0.7.RELEASE
+
+# spring-orm
+openjpaVersion = 2.4.0
+
+# spring-oxm
+xstreamVersion = 1.4.8
+xmlBeans = 2.6.0
+castorVersion = 1.4.0
+jibxVersion = 1.2.6
+
+# spring-web
+hessianVersion = 4.0.38
+gsonVersion = 2.5
+protobufJavaVersion = 2.6.1
+protobufJavaFormatVersion = 1.2
+romeVersion = 1.5.1
+okhttpVersion = 2.7.0
+
+# CQ 13638
+okhttp3Version = 3.8.0
+# CQ 13639
+okioVersion = 1.13.0
+
+# spring-webmvc
+jxlVersion = 2.6.12
+poiVersion = 3.13
+webjarsVersion = 0.28
+
+# spring-websocket
+undertowVersion = 1.3.10.Final
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..ebf9a52
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..113d8f7
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Wed Jun 07 09:24:50 CEST 2017
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-3.5-all.zip
diff --git a/gradlew b/gradlew
new file mode 100755
index 0000000..4453cce
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,172 @@
+#!/usr/bin/env sh
+
+##############################################################################
+##
+##  Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+        PRG="$link"
+    else
+        PRG=`dirname "$PRG"`"/$link"
+    fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+    echo "$*"
+}
+
+die ( ) {
+    echo
+    echo "$*"
+    echo
+    exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+  CYGWIN* )
+    cygwin=true
+    ;;
+  Darwin* )
+    darwin=true
+    ;;
+  MINGW* )
+    msys=true
+    ;;
+  NONSTOP* )
+    nonstop=true
+    ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+        # IBM's JDK on AIX uses strange locations for the executables
+        JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+        JAVACMD="$JAVA_HOME/bin/java"
+    fi
+    if [ ! -x "$JAVACMD" ] ; then
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+else
+    JAVACMD="java"
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+    MAX_FD_LIMIT=`ulimit -H -n`
+    if [ $? -eq 0 ] ; then
+        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+            MAX_FD="$MAX_FD_LIMIT"
+        fi
+        ulimit -n $MAX_FD
+        if [ $? -ne 0 ] ; then
+            warn "Could not set maximum file descriptor limit: $MAX_FD"
+        fi
+    else
+        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+    fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+    JAVACMD=`cygpath --unix "$JAVACMD"`
+
+    # We build the pattern for arguments to be converted via cygpath
+    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+    SEP=""
+    for dir in $ROOTDIRSRAW ; do
+        ROOTDIRS="$ROOTDIRS$SEP$dir"
+        SEP="|"
+    done
+    OURCYGPATTERN="(^($ROOTDIRS))"
+    # Add a user-defined pattern to the cygpath arguments
+    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+    fi
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    i=0
+    for arg in "$@" ; do
+        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
+
+        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
+            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+        else
+            eval `echo args$i`="\"$arg\""
+        fi
+        i=$((i+1))
+    done
+    case $i in
+        (0) set -- ;;
+        (1) set -- "$args0" ;;
+        (2) set -- "$args0" "$args1" ;;
+        (3) set -- "$args0" "$args1" "$args2" ;;
+        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+    esac
+fi
+
+# Escape application args
+save ( ) {
+    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+    echo " "
+}
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+  cd "$(dirname "$0")"
+fi
+
+exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
new file mode 100644
index 0000000..e95643d
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,84 @@
+@if "%DEBUG%" == "" @echo off

+@rem ##########################################################################

+@rem

+@rem  Gradle startup script for Windows

+@rem

+@rem ##########################################################################

+

+@rem Set local scope for the variables with windows NT shell

+if "%OS%"=="Windows_NT" setlocal

+

+set DIRNAME=%~dp0

+if "%DIRNAME%" == "" set DIRNAME=.

+set APP_BASE_NAME=%~n0

+set APP_HOME=%DIRNAME%

+

+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.

+set DEFAULT_JVM_OPTS=

+

+@rem Find java.exe

+if defined JAVA_HOME goto findJavaFromJavaHome

+

+set JAVA_EXE=java.exe

+%JAVA_EXE% -version >NUL 2>&1

+if "%ERRORLEVEL%" == "0" goto init

+

+echo.

+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.

+echo.

+echo Please set the JAVA_HOME variable in your environment to match the

+echo location of your Java installation.

+

+goto fail

+

+:findJavaFromJavaHome

+set JAVA_HOME=%JAVA_HOME:"=%

+set JAVA_EXE=%JAVA_HOME%/bin/java.exe

+

+if exist "%JAVA_EXE%" goto init

+

+echo.

+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%

+echo.

+echo Please set the JAVA_HOME variable in your environment to match the

+echo location of your Java installation.

+

+goto fail

+

+:init

+@rem Get command-line arguments, handling Windows variants

+

+if not "%OS%" == "Windows_NT" goto win9xME_args

+

+:win9xME_args

+@rem Slurp the command line arguments.

+set CMD_LINE_ARGS=

+set _SKIP=2

+

+:win9xME_args_slurp

+if "x%~1" == "x" goto execute

+

+set CMD_LINE_ARGS=%*

+

+:execute

+@rem Setup the command line

+

+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar

+

+@rem Execute Gradle

+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%

+

+:end

+@rem End local scope for the variables with windows NT shell

+if "%ERRORLEVEL%"=="0" goto mainEnd

+

+:fail

+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of

+rem the _cmd.exe /c_ return code!

+if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1

+exit /b 1

+

+:mainEnd

+if "%OS%"=="Windows_NT" endlocal

+

+:omega

diff --git a/kernel/.gitignore b/kernel/.gitignore
new file mode 100644
index 0000000..3fbb103
--- /dev/null
+++ b/kernel/.gitignore
@@ -0,0 +1,13 @@
+*/src/main/resources/META-INF/MANIFEST.MF
+*/src/test/resources/META-INF/TEST.MF
+target
+integration-repo
+ivy-cache
+.ant-targets-build.xml
+user-ivy.properties
+bin/
+build/
+.settings/
+.project
+.classpath
+
diff --git a/kernel/CONTRIBUTING.md b/kernel/CONTRIBUTING.md
new file mode 100644
index 0000000..e3a5790
--- /dev/null
+++ b/kernel/CONTRIBUTING.md
@@ -0,0 +1,47 @@
+Contributing to Virgo
+=====================
+
+Thanks for your interest in this project.
+
+Project description:
+--------------------
+
+The Virgo Web Server from EclipseRT is a completely module-based Java application server that is designed to run enterprise Java applications and Spring-powered applications with a high degree of flexibility and reliability. It offers a simple yet comprehensive platform to develop, deploy, and service enterprise Java applications.
+The Virgo kernel supports the core concepts of Virgo and is not biased towards the web server, thus enabling other types of server to be created. The kernel can also be used stand-alone as a rich OSGi application platform. A server runtime can easily be constructed by deploying suitable bundles on top of the kernel.
+
+- https://projects.eclipse.org/projects/rt.virgo
+
+Developer resources:
+--------------------
+
+Information regarding source code management, builds, coding standards, and more.
+
+- https://projects.eclipse.org/projects/rt.virgo/developer
+
+Contributor License Agreement:
+------------------------------
+
+Before your contribution can be accepted by the project, you need to create and electronically sign the Eclipse Foundation Contributor License Agreement (CLA).
+
+- http://www.eclipse.org/legal/CLA.php
+
+Contact:
+--------
+
+Contact the project developers via the project's "dev" list.
+
+- https://dev.eclipse.org/mailman/listinfo/virgo-dev
+
+Search for bugs:
+----------------
+
+This project uses Bugzilla to track ongoing development and issues.
+
+- https://bugs.eclipse.org/bugs/buglist.cgi?product=Virgo
+
+Create a new bug:
+-----------------
+
+Be sure to search for existing bugs before you create another one. Remember that contributions are always welcome!
+
+- https://bugs.eclipse.org/bugs/enter_bug.cgi?product=Virgo
\ No newline at end of file
diff --git a/kernel/build.gradle b/kernel/build.gradle
new file mode 100644
index 0000000..22fb381
--- /dev/null
+++ b/kernel/build.gradle
@@ -0,0 +1,437 @@
+import java.util.jar.JarEntry
+import java.util.jar.JarOutputStream
+import java.util.zip.ZipEntry
+import java.util.zip.ZipFile
+import java.util.zip.ZipOutputStream
+
+def customOrder(ZipEntry a, ZipEntry b) {
+    if (a.name == 'META-INF/MANIFEST.MF' && b.name == 'META-INF/MANIFEST.MF') return 0
+    if (a.name == 'META-INF/MANIFEST.MF') return -1
+    if (b.name == 'META-INF/MANIFEST.MF') return 1
+    return a.name.compareTo(b.name)
+}
+
+project(':kernel:org.eclipse.virgo.kernel.agent.dm') {
+    dependencies {
+        testCompile group: 'org.easymock', name: 'easymock', version: easymockVersion
+        testCompile project(':test:org.eclipse.virgo.test.stubs')
+
+        testRuntime "org.aspectj:aspectjrt:${project.aspectjVersion}"
+
+        compile group: "org.slf4j", name: "slf4j-api", version: slf4jVersion
+
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi", version: equinoxVersion, configuration: "compile", ext: "jar"
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi.services", version: osgiServicesVersion, configuration: "compile", ext: "jar"
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.region", version: equinoxRegionVersion, configuration: "compile", ext: "jar"
+
+        compile group: "org.eclipse.virgo.mirrored", name: "org.springframework.core", version: springframeworkVersion, ext: "jar"
+        compile group: "org.eclipse.virgo.mirrored", name: "org.springframework.context", version: springframeworkVersion, ext: "jar"
+        compile group: "org.eclipse.virgo.mirrored", name: "org.springframework.beans", version: springframeworkVersion, ext: "jar"
+
+        compile group: "org.eclipse.gemini.blueprint", name: "gemini-blueprint-core", version: geminiBlueprintVersion, ext: "jar"
+        compile group: "org.eclipse.gemini.blueprint", name: "gemini-blueprint-extender", version: geminiBlueprintVersion, ext: "jar"
+
+        compile project(':util:org.eclipse.virgo.util.osgi')
+        compile project(':medic:org.eclipse.virgo.medic')
+        compile project(':nano:org.eclipse.virgo.nano.core')
+    }
+}
+
+project(':kernel:org.eclipse.virgo.kernel.artifact') {
+    dependencies {
+        testCompile group: 'org.easymock', name: 'easymock', version: easymockVersion
+        testRuntime group: "org.eclipse.virgo.mirrored", name: "org.apache.commons.dbcp", version: commonsDbcpVersion, configuration: "compile", ext: "jar"
+
+        compile group: "org.slf4j", name: "slf4j-api", version: slf4jVersion
+
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi", version: equinoxVersion, configuration: "compile", ext: "jar"
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi.services", version: osgiServicesVersion, configuration: "compile", ext: "jar"
+
+        compile project(':util:org.eclipse.virgo.util.common')
+        compile project(':util:org.eclipse.virgo.util.io')
+        compile project(':util:org.eclipse.virgo.util.osgi.manifest')
+        compile project(':util:org.eclipse.virgo.util.parser.manifest')
+        compile project(':nano:org.eclipse.virgo.nano.core')
+        compile project(':repository:org.eclipse.virgo.repository')
+    }
+}
+
+project(':kernel:org.eclipse.virgo.kernel.deployer') {
+    dependencies {
+        testCompile group: 'org.easymock', name: 'easymock', version: easymockVersion
+        testCompile project(':medic:org.eclipse.virgo.medic.test')
+        testCompile project(':test:org.eclipse.virgo.test.stubs')
+
+        testRuntime "org.aspectj:aspectjrt:${project.aspectjVersion}"
+        testRuntime group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.region", version: equinoxRegionVersion, configuration: "compile", ext: "jar"
+
+        compile group: "org.slf4j", name: "slf4j-api", version: slf4jVersion
+
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi", version: equinoxVersion, configuration: "compile", ext: "jar"
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi.services", version: osgiServicesVersion, configuration: "compile", ext: "jar"
+
+        compile group: "org.eclipse.virgo.mirrored", name: "org.springframework.beans", version: springframeworkVersion, ext: "jar"
+        compile group: "org.eclipse.virgo.mirrored", name: "org.springframework.context", version: springframeworkVersion, ext: "jar"
+        compile group: "org.eclipse.virgo.mirrored", name: "org.springframework.core", version: springframeworkVersion, ext: "jar"
+
+        compile group: "org.eclipse.gemini.blueprint", name: "gemini-blueprint-core", version: geminiBlueprintVersion, ext: "jar"
+
+        compile project(':kernel:org.eclipse.virgo.kernel.artifact')
+        compile project(':kernel:org.eclipse.virgo.kernel.osgi')
+        compile project(':kernel:org.eclipse.virgo.kernel.services')
+        compile project(':medic:org.eclipse.virgo.medic')
+        compile project(':nano:org.eclipse.virgo.nano.core')
+        compile project(':nano:org.eclipse.virgo.nano.deployer.api')
+        compile project(':nano:org.eclipse.virgo.nano.deployer.hot')
+        compile project(':repository:org.eclipse.virgo.repository')
+        compile project(':util:org.eclipse.virgo.util.common')
+        compile project(':util:org.eclipse.virgo.util.io')
+        compile project(':util:org.eclipse.virgo.util.jmx')
+        compile project(':util:org.eclipse.virgo.util.math')
+        compile project(':util:org.eclipse.virgo.util.osgi.manifest')
+
+        if (System.properties['weaving.enabled'] == 'true') {
+            aspectpath project(':medic:org.eclipse.virgo.medic')
+            aspectpath project(':nano:org.eclipse.virgo.nano.core')
+            aspectpath project(':util:org.eclipse.virgo.util.jmx')
+        }
+    }
+}
+
+project(':kernel:org.eclipse.virgo.kernel.deployer.dm') {
+    dependencies {
+        testCompile group: 'org.easymock', name: 'easymock', version: easymockVersion
+        testCompile project(':medic:org.eclipse.virgo.medic.test')
+        testCompile project(':test:org.eclipse.virgo.test.stubs')
+
+        testRuntime "org.aspectj:aspectjrt:${project.aspectjVersion}"
+
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi", version: equinoxVersion, configuration: "compile", ext: "jar"
+
+        compile group: "org.eclipse.virgo.mirrored", name: "org.springframework.beans", version: springframeworkVersion, ext: "jar"
+        compile group: "org.eclipse.virgo.mirrored", name: "org.springframework.context", version: springframeworkVersion, ext: "jar"
+        compile group: "org.eclipse.virgo.mirrored", name: "org.springframework.core", version: springframeworkVersion, ext: "jar"
+
+        compile group: "org.eclipse.gemini.blueprint", name: "gemini-blueprint-core", version: geminiBlueprintVersion, ext: "jar"
+
+        compile project(':kernel:org.eclipse.virgo.kernel.agent.dm')
+        compile project(':kernel:org.eclipse.virgo.kernel.deployer')
+        compile project(':medic:org.eclipse.virgo.medic')
+        compile project(':nano:org.eclipse.virgo.nano.core')
+
+        if (System.properties['weaving.enabled'] == 'true') {
+            aspectpath project(':medic:org.eclipse.virgo.medic')
+        }
+    }
+}
+
+project(':kernel:org.eclipse.virgo.kernel.dmfragment') {
+    dependencies {
+        compile group: "org.slf4j", name: "slf4j-api", version: slf4jVersion
+
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi", version: equinoxVersion, configuration: "compile", ext: "jar"
+
+        compile group: "org.eclipse.virgo.mirrored", name: "org.springframework.beans", version: springframeworkVersion, ext: "jar"
+        compile group: "org.eclipse.virgo.mirrored", name: "org.springframework.context", version: springframeworkVersion, ext: "jar"
+        compile group: "org.eclipse.virgo.mirrored", name: "org.springframework.context.support", version: springframeworkVersion, ext: "jar"
+        compile group: "org.eclipse.virgo.mirrored", name: "org.springframework.core", version: springframeworkVersion, ext: "jar"
+
+        compile group: "org.eclipse.gemini.blueprint", name: "gemini-blueprint-core", version: geminiBlueprintVersion, ext: "jar"
+
+        compile project(':kernel:org.eclipse.virgo.kernel.agent.dm')
+        compile project(':kernel:org.eclipse.virgo.kernel.osgi')
+        compile project(':kernel:org.eclipse.virgo.kernel.deployer')
+        compile project(':medic:org.eclipse.virgo.medic')
+        compile project(':nano:org.eclipse.virgo.nano.core')
+
+        if (System.properties['weaving.enabled'] == 'true') {
+            aspectpath project(':medic:org.eclipse.virgo.medic')
+        }
+    }
+}
+
+project(':kernel:org.eclipse.virgo.kernel.model') {
+    dependencies {
+        testCompile group: "org.slf4j", name: "slf4j-api", version: slf4jVersion
+        testCompile group: 'org.easymock', name: 'easymock', version: easymockVersion
+        testCompile group: "org.eclipse.virgo.mirrored", name: "org.springframework.beans", version: springframeworkVersion, ext: "jar"
+        testCompile group: "org.eclipse.virgo.mirrored", name: "org.springframework.context", version: springframeworkVersion, ext: "jar"
+        testCompile group: "org.eclipse.virgo.mirrored", name: "org.springframework.core", version: springframeworkVersion, ext: "jar"
+
+        testCompile project(':test:org.eclipse.virgo.test.stubs')
+        testCompile project(':kernel:org.eclipse.virgo.kernel.stubs')
+
+        testRuntime group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi.services", version: osgiServicesVersion, configuration: "compile", ext: "jar"
+
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi", version: equinoxVersion, configuration: "compile", ext: "jar"
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.region", version: equinoxRegionVersion, configuration: "compile", ext: "jar"
+
+        compile project(':kernel:org.eclipse.virgo.kernel.osgi')
+        compile project(':kernel:org.eclipse.virgo.kernel.deployer')
+        compile project(':medic:org.eclipse.virgo.medic')
+        compile project(':nano:org.eclipse.virgo.nano.core')
+        compile project(':nano:org.eclipse.virgo.nano.deployer.api')
+        compile project(':util:org.eclipse.virgo.util.jmx')
+
+        aspectpath project(':nano:org.eclipse.virgo.nano.core')
+        if (System.properties['weaving.enabled'] == 'true') {
+            aspectpath project(':medic:org.eclipse.virgo.medic')
+            aspectpath project(':util:org.eclipse.virgo.util.jmx')
+        }
+    }
+}
+
+project(':kernel:org.eclipse.virgo.kernel.osgi') {
+    dependencies {
+        compile group: "org.slf4j", name: "slf4j-api", version: slf4jVersion
+
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi", version: equinoxVersion, configuration: "compile", ext: "jar"
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi.services", version: osgiServicesVersion, configuration: "compile", ext: "jar"
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.region", version: equinoxRegionVersion, configuration: "compile", ext: "jar"
+
+        compile project(':util:org.eclipse.virgo.util.osgi.manifest')
+        compile project(':medic:org.eclipse.virgo.medic')
+        compile project(':nano:org.eclipse.virgo.nano.core')
+        compile project(':kernel:org.eclipse.virgo.kernel.artifact')
+
+        aspectpath project(':nano:org.eclipse.virgo.nano.core')
+    }
+}
+
+project(':kernel:org.eclipse.virgo.kernel.equinox.extensions') {
+    dependencies {
+        testCompile group: 'org.easymock', name: 'easymock', version: easymockVersion
+        testCompile project(':test:org.eclipse.virgo.test.stubs')
+        testRuntime "org.aspectj:aspectjrt:${project.aspectjVersion}"
+
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi", version: equinoxVersion, configuration: "compile", ext: "jar"
+    }
+}
+
+project(':kernel:org.eclipse.virgo.kernel.stubs') {
+    dependencies {
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi", version: equinoxVersion, configuration: "compile", ext: "jar"
+
+        compile project(':util:org.eclipse.virgo.util.common')
+        compile project(':util:org.eclipse.virgo.util.osgi.manifest')
+        compile project(':nano:org.eclipse.virgo.nano.core')
+        compile project(':nano:org.eclipse.virgo.nano.deployer.api')
+        compile project(':kernel:org.eclipse.virgo.kernel.artifact')
+        compile project(':kernel:org.eclipse.virgo.kernel.deployer')
+        compile project(':kernel:org.eclipse.virgo.kernel.osgi')
+    }
+}
+
+project(':kernel:org.eclipse.virgo.kernel.services') {
+    dependencies {
+        testCompile group: 'org.easymock', name: 'easymock', version: easymockVersion
+        testCompile project(':test:org.eclipse.virgo.test.stubs')
+        testCompile project(':medic:org.eclipse.virgo.medic.test')
+
+        testRuntime "org.aspectj:aspectjrt:${project.aspectjVersion}"
+
+        compile group: "org.slf4j", name: "slf4j-api", version: slf4jVersion
+
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi", version: equinoxVersion, configuration: "compile", ext: "jar"
+
+        compile group: "org.eclipse.virgo.mirrored", name: "org.springframework.beans", version: springframeworkVersion, ext: "jar"
+
+        compile project(':util:org.eclipse.virgo.util.math')
+        compile project(':util:org.eclipse.virgo.util.io')
+        compile project(':util:org.eclipse.virgo.util.osgi.manifest')
+        compile project(':medic:org.eclipse.virgo.medic')
+        compile project(':nano:org.eclipse.virgo.nano.core')
+        compile project(':repository:org.eclipse.virgo.repository')
+        compile project(':kernel:org.eclipse.virgo.kernel.artifact')
+    }
+
+    task rewriteJar(dependsOn: jar) {
+        tasks['uploadArchives'].dependsOn('rewriteJar')
+        tasks['assemble'].dependsOn('rewriteJar')
+        String jarFileName
+        // store name of the created jar file
+        jar.outputs.files.each {
+            println it.getPath()
+            jarFileName = it.getPath()
+        }
+        doLast() {
+            ZipFile jarFile = new ZipFile(jarFileName)
+            println "------------"
+            println "Reordering content of jar file ${jarFileName}:"
+            println "------------"
+            new ZipFile(jarFileName).entries().findAll{ !it.directory }.each { println it.name }
+            println "------------"
+            String cloneFileName = new File(jarFileName).path + "-clone"
+            FileOutputStream fos = new FileOutputStream(cloneFileName)
+
+            String manifest
+            jarFile.entries().findAll { it.name == "META-INF/MANIFEST.MF" }.each {
+                manifest = jarFile.getInputStream(it).text
+            }
+            println "------------"
+            println manifest
+            println "------------"
+
+            JarOutputStream jarOutputStream = new JarOutputStream(fos,
+                    new java.util.jar.Manifest(new ByteArrayInputStream(manifest.getBytes(java.nio.charset.Charset.forName("UTF-8")))))
+
+            println "------------"
+            byte[] readBuffer = new byte[2156]
+            jarFile.entries().findAll { !it.directory && !(it.name == "META-INF/MANIFEST.MF") }.sort( {a,b -> customOrder(a,b) } ).each {
+                println "adding ${it.name} to ${cloneFileName}"
+                jarOutputStream.putNextEntry(new JarEntry(it.name))
+                jarOutputStream << jarFile.getInputStream(it)
+            }
+            jarOutputStream.finish()
+            println "finished writing ${cloneFileName}"
+            println "------------"
+
+            println "from ${cloneFileName} to ${jarFileName}"
+            println "within ${file(cloneFileName).parentFile.path} is ${file(cloneFileName).name}"
+            println "rename ${file(cloneFileName).name} -> ${file(jarFileName).name}"
+
+            delete file(jarFileName)
+            copy {
+                from file(file(cloneFileName).parentFile.path)
+                into file(file(cloneFileName).parentFile.path)
+                rename { String fileName ->
+                    fileName.replace(file(cloneFileName).name, file(jarFileName).name)
+                }
+            }
+            delete file(cloneFileName)
+            println "------------"
+            println "Reordered content of jar file ${jarFileName}:"
+            println "------------"
+            new ZipFile(jarFileName).entries().findAll{ !it.directory }.each { println it.name }
+            println "------------"
+        }
+    }
+}
+
+project(':kernel:org.eclipse.virgo.kernel.userregion') {
+    dependencies {
+        testCompile group: 'org.easymock', name: 'easymock', version: easymockVersion
+        testCompile project(':test:org.eclipse.virgo.test.stubs')
+        testCompile project(':medic:org.eclipse.virgo.medic.test')
+        testCompile project(':repository:org.eclipse.virgo.repository')
+
+        testRuntime group: "org.eclipse.virgo.mirrored", name: "org.apache.commons.logging", version: commonsLoggingVersion, ext: "jar"
+        testRuntime group: "org.eclipse.virgo.mirrored", name: "org.apache.commons.codec", version: commonsCodecVersion, ext: "jar"
+        testRuntime group: "org.eclipse.virgo.mirrored", name: "org.springframework.beans", version: springframeworkVersion, ext: "jar"
+        testRuntime group: "org.eclipse.virgo.mirrored", name: "org.springframework.core", version: springframeworkVersion, ext: "jar"
+        testRuntime "org.aspectj:aspectjrt:${project.aspectjVersion}"
+
+        compile group: "org.slf4j", name: "slf4j-api", version: slf4jVersion
+
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi", version: equinoxVersion, configuration: "compile", ext: "jar"
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi.services", version: osgiServicesVersion, configuration: "compile", ext: "jar"
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.region", version: equinoxRegionVersion, configuration: "compile", ext: "jar"
+
+        compile project(':util:org.eclipse.virgo.util.common')
+        compile project(':util:org.eclipse.virgo.util.math')
+        compile project(':util:org.eclipse.virgo.util.io')
+        compile project(':util:org.eclipse.virgo.util.osgi')
+        compile project(':util:org.eclipse.virgo.util.osgi.manifest')
+        compile project(':util:org.eclipse.virgo.util.parser.manifest')
+        compile project(':medic:org.eclipse.virgo.medic')
+        compile project(':nano:org.eclipse.virgo.nano.core')
+        compile project(':nano:org.eclipse.virgo.nano.deployer.api')
+        compile project(':repository:org.eclipse.virgo.repository')
+        compile project(':kernel:org.eclipse.virgo.kernel.artifact')
+        compile project(':kernel:org.eclipse.virgo.kernel.osgi')
+        compile project(':kernel:org.eclipse.virgo.kernel.deployer')
+        compile project(':kernel:org.eclipse.virgo.kernel.services')
+        compile project(':kernel:org.eclipse.virgo.kernel.equinox.extensions')
+    }
+}
+
+project(':kernel:org.eclipse.virgo.kernel.userregionfactory') {
+    dependencies {
+        testCompile group: 'org.easymock', name: 'easymock', version: easymockVersion
+        testCompile project(':test:org.eclipse.virgo.test.stubs')
+
+        testRuntime "org.aspectj:aspectjrt:${project.aspectjVersion}"
+
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi", version: equinoxVersion, configuration: "compile", ext: "jar"
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi.services", version: osgiServicesVersion, configuration: "compile", ext: "jar"
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.region", version: equinoxRegionVersion, configuration: "compile", ext: "jar"
+
+        compile project(':util:org.eclipse.virgo.util.parser.launcher')
+        compile project(':util:org.eclipse.virgo.util.osgi')
+        compile project(':util:org.eclipse.virgo.util.osgi.manifest')
+        compile project(':util:org.eclipse.virgo.util.parser.manifest')
+        compile project(':medic:org.eclipse.virgo.medic')
+        compile project(':nano:org.eclipse.virgo.nano.core')
+        compile project(':kernel:org.eclipse.virgo.kernel.osgi')
+    }
+}
+
+project(':kernel:org.eclipse.virgo.shell.command') {
+    dependencies {
+        testCompile group: "org.slf4j", name: "slf4j-nop", version: slf4jVersion
+        testCompile group: 'org.easymock', name: 'easymock', version: easymockVersion
+        testCompile project(':test:org.eclipse.virgo.test.stubs')
+
+        testRuntime "org.aspectj:aspectjrt:${project.aspectjVersion}"
+
+        compile group: "org.slf4j", name: "slf4j-api", version: slf4jVersion
+
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi", version: equinoxVersion, configuration: "compile", ext: "jar"
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi.services", version: osgiServicesVersion, configuration: "compile", ext: "jar"
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.region", version: equinoxRegionVersion, configuration: "compile", ext: "jar"
+
+        compile group: "org.eclipse.virgo.mirrored", name: "org.apache.felix.gogo.runtime", version: gogoRuntimeVersion, configuration: "compile", ext: "jar"
+
+        compile group: "org.eclipse.virgo.mirrored", name: "org.springframework.core", version: springframeworkVersion, ext: "jar"
+
+        compile project(':kernel:org.eclipse.virgo.kernel.deployer')
+        compile project(':kernel:org.eclipse.virgo.kernel.model')
+        compile project(':kernel:org.eclipse.virgo.kernel.osgi')
+        compile project(':medic:org.eclipse.virgo.medic')
+        compile project(':nano:org.eclipse.virgo.nano.deployer.api')
+        compile project(':repository:org.eclipse.virgo.repository')
+        compile project(':util:org.eclipse.virgo.util.common')
+        compile project(':util:org.eclipse.virgo.util.io')
+        compile project(':util:org.eclipse.virgo.util.osgi')
+        compile project(':util:org.eclipse.virgo.util.osgi.manifest')
+
+        if (System.properties['weaving.enabled'] == 'true') {
+            aspectpath project(':medic:org.eclipse.virgo.medic')
+        }
+    }
+}
+
+project(':kernel:org.eclipse.virgo.management.fragment') {
+    dependencies {
+        testCompile group: 'org.easymock', name: 'easymock', version: easymockVersion
+
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi", version: equinoxVersion, configuration: "compile", ext: "jar"
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.region", version: equinoxRegionVersion, configuration: "compile", ext: "jar"
+
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.gemini.management", version: geminiManagementVersion, configuration: "compile", ext: 'jar'
+    }
+}
+
+project(':kernel:org.eclipse.virgo.management.console') {
+    dependencies {
+        testCompile group: "org.slf4j", name: "slf4j-nop", version: slf4jVersion
+        testCompile group: 'org.easymock', name: 'easymock', version: easymockVersion
+        testCompile group: "org.eclipse.virgo.mirrored", name: "org.springframework.core", version: springframeworkVersion, ext: "jar"
+        testCompile group: "org.eclipse.virgo.mirrored", name: "org.springframework.web", version: springframeworkVersion, ext: "jar"
+        testCompile group: "org.eclipse.virgo.mirrored", name: "org.springframework.test", version: springframeworkVersion,ext: "jar"
+        testCompile group: "org.eclipse.virgo.mirrored", name: "org.mozilla.javascript", version: mozillaJavascriptVersion, configuration: "compile", ext: "jar"
+        testCompile group: "org.eclipse.virgo.mirrored", name: "org.apache.commons.logging", version: commonsLoggingVersion, ext: "jar"
+        testCompile group: "commons-io", name: "commons-io", version: commonsIoVersion, ext: "jar"
+
+        compile group: "org.slf4j", name: "slf4j-api", version: slf4jVersion
+        compile group: "org.eclipse.virgo.mirrored", name: "javax.servlet", version: javaxServletVersion, configuration: "compile", ext: "jar"
+
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi", version: equinoxVersion, configuration: "compile", ext: "jar"
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi.services", version: osgiServicesVersion, configuration: "compile", ext: "jar"
+
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.gemini.management", version: geminiManagementVersion, configuration: "compile", ext: 'jar'
+
+        compile group: "commons-fileupload", name: "commons-fileupload", version: commonsFileuploadVersion, ext: "jar"
+        compile group: "org.jolokia", name: "jolokia-osgi", version: jolokiaVersion, ext: "jar"
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.agent.dm/.settings/org.eclipse.virgo.ide.bundlor.core.prefs b/kernel/org.eclipse.virgo.kernel.agent.dm/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
new file mode 100644
index 0000000..bf6d2f7
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.agent.dm/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
@@ -0,0 +1,3 @@
+#Mon Jul 06 09:08:03 BST 2009
+org.eclipse.virgo.ide.bundlor.core.template.properties.files=../build.properties;../build.versions
+eclipse.preferences.version=1
diff --git a/kernel/org.eclipse.virgo.kernel.agent.dm/.settings/org.eclipse.wst.common.project.facet.core.xml b/kernel/org.eclipse.virgo.kernel.agent.dm/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..92aa290
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.agent.dm/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+  <installed facet="org.eclipse.virgo.server.bundle" version="1.0"/>
+</faceted-project>
diff --git a/kernel/org.eclipse.virgo.kernel.agent.dm/.springBeans b/kernel/org.eclipse.virgo.kernel.agent.dm/.springBeans
new file mode 100644
index 0000000..6c11e70
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.agent.dm/.springBeans
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beansProjectDescription>
+	<version>1</version>
+	<pluginVersion><![CDATA[2.2.6.200908051215-RELEASE]]></pluginVersion>
+	<configSuffixes>
+		<configSuffix><![CDATA[xml]]></configSuffix>
+	</configSuffixes>
+	<enableImports><![CDATA[false]]></enableImports>
+	<configs>
+	</configs>
+	<configSets>
+		<configSet>
+			<name><![CDATA[com.springsource.kernel.config]]></name>
+			<allowBeanDefinitionOverriding>true</allowBeanDefinitionOverriding>
+			<incomplete>false</incomplete>
+			<configs>
+			</configs>
+		</configSet>
+	</configSets>
+</beansProjectDescription>
diff --git a/kernel/org.eclipse.virgo.kernel.agent.dm/src/main/java/org/eclipse/virgo/kernel/agent/dm/AgentDMStartTracker.java b/kernel/org.eclipse.virgo.kernel.agent.dm/src/main/java/org/eclipse/virgo/kernel/agent/dm/AgentDMStartTracker.java
new file mode 100644
index 0000000..013fd9d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.agent.dm/src/main/java/org/eclipse/virgo/kernel/agent/dm/AgentDMStartTracker.java
@@ -0,0 +1,24 @@
+/*******************************************************************************

+ * Copyright (c) 2008, 2010 SAP AG

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ *

+ * Contributors:

+ *   SAP AG - initial contribution

+ *******************************************************************************/

+

+package org.eclipse.virgo.kernel.agent.dm;

+

+/**

+ * 

+ * This interface is registered as a service that is enabled only when the agent.DM is started successfully

+ * <p />

+ *

+ * <strong>Concurrent Semantics</strong><br />

+ * Implementations of this interface must be thread safe.

+ */

+public interface AgentDMStartTracker {

+

+}

diff --git a/kernel/org.eclipse.virgo.kernel.agent.dm/src/main/java/org/eclipse/virgo/kernel/agent/dm/ContextPropagatingTaskExecutor.java b/kernel/org.eclipse.virgo.kernel.agent.dm/src/main/java/org/eclipse/virgo/kernel/agent/dm/ContextPropagatingTaskExecutor.java
new file mode 100644
index 0000000..843b2da
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.agent.dm/src/main/java/org/eclipse/virgo/kernel/agent/dm/ContextPropagatingTaskExecutor.java
@@ -0,0 +1,122 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.agent.dm;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.eclipse.virgo.nano.shim.serviceability.TracingService;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.springframework.beans.factory.DisposableBean;
+import org.springframework.core.task.TaskExecutor;
+
+
+/**
+ * {@link TaskExecutor} implementation that propagates trace context to spawned threads.
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ * 
+ */
+public final class ContextPropagatingTaskExecutor implements TaskExecutor, DisposableBean {
+    
+    private static final NoOpTracingService NO_OP_TRACING_SERVICE = new NoOpTracingService();
+
+    private final AtomicInteger threadCount = new AtomicInteger();
+
+    private final ExecutorService executor;    
+
+    private volatile TracingService tracingService;
+    
+    private final BundleContext bundleContext;
+
+    public ContextPropagatingTaskExecutor(final String threadNamePrefix, int poolSize, BundleContext bundleContext) {
+        
+        this.bundleContext = bundleContext;
+        
+        this.executor = Executors.newFixedThreadPool(poolSize, new ThreadFactory() {
+
+            public Thread newThread(Runnable r) {
+                Thread t = new Thread(r);
+                t.setName(threadNamePrefix + ContextPropagatingTaskExecutor.this.threadCount.getAndIncrement());
+                return t;
+            }
+        });                
+    }
+
+    private TracingService getTracingService() {
+        TracingService localTracingService = this.tracingService;
+        
+        if (localTracingService != null && NO_OP_TRACING_SERVICE.equals(localTracingService)) {
+            return localTracingService;
+        }                
+                
+        ServiceReference<TracingService> serviceReference = this.bundleContext.getServiceReference(TracingService.class);
+        if (serviceReference != null) {
+            localTracingService = (TracingService) this.bundleContext.getService(serviceReference);
+        }
+        
+        if (localTracingService == null) {
+            localTracingService = NO_OP_TRACING_SERVICE;
+        }
+        
+        this.tracingService = localTracingService;
+        
+        return localTracingService;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void execute(final Runnable task) {
+        final String applicationName = getTracingService().getCurrentApplicationName();
+        final ClassLoader threadContextClassLoader = Thread.currentThread().getContextClassLoader();
+        this.executor.execute(new Runnable() {
+
+            public void run() {
+                ClassLoader originalContextClassLoader = Thread.currentThread().getContextClassLoader();
+                try {
+                    Thread.currentThread().setContextClassLoader(threadContextClassLoader);
+                    ContextPropagatingTaskExecutor.this.tracingService.setCurrentApplicationName(applicationName);
+                    task.run();
+                } finally {
+                    ContextPropagatingTaskExecutor.this.tracingService.setCurrentApplicationName(null);
+                    Thread.currentThread().setContextClassLoader(originalContextClassLoader);
+                }
+            }
+
+        });
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void destroy() throws Exception {
+        if (this.executor != null) {
+            this.executor.shutdown();
+        }
+    }
+    
+    private static final class NoOpTracingService implements TracingService {
+        public String getCurrentApplicationName() {            
+            return null;
+        }
+
+        public void setCurrentApplicationName(String applicationName) {
+        }        
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.agent.dm/src/main/java/org/eclipse/virgo/kernel/agent/dm/StandardAgentDMStartTracker.java b/kernel/org.eclipse.virgo.kernel.agent.dm/src/main/java/org/eclipse/virgo/kernel/agent/dm/StandardAgentDMStartTracker.java
new file mode 100644
index 0000000..faefba1
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.agent.dm/src/main/java/org/eclipse/virgo/kernel/agent/dm/StandardAgentDMStartTracker.java
@@ -0,0 +1,25 @@
+/*******************************************************************************

+ * Copyright (c) 2008, 2010 SAP AG

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ *

+ * Contributors:

+ *   SAP AG - initial contribution

+ *******************************************************************************/

+

+package org.eclipse.virgo.kernel.agent.dm;

+

+/**

+ * 

+ * This class is the standard implementation for the AgentDMStartTracker

+ * <p />

+ *

+ * <strong>Concurrent Semantics</strong><br />

+ * Thread safe.

+ */

+

+public class StandardAgentDMStartTracker implements AgentDMStartTracker {

+

+}

diff --git a/kernel/org.eclipse.virgo.kernel.agent.dm/src/main/java/org/eclipse/virgo/kernel/agent/dm/internal/AgentActivator.java b/kernel/org.eclipse.virgo.kernel.agent.dm/src/main/java/org/eclipse/virgo/kernel/agent/dm/internal/AgentActivator.java
new file mode 100644
index 0000000..134b4a9
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.agent.dm/src/main/java/org/eclipse/virgo/kernel/agent/dm/internal/AgentActivator.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.agent.dm.internal;
+
+import java.util.Dictionary;
+import java.util.Hashtable;
+
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.medic.eventlog.EventLoggerFactory;
+import org.eclipse.virgo.util.osgi.ServiceRegistrationTracker;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventConstants;
+import org.osgi.service.event.EventHandler;
+import org.eclipse.gemini.blueprint.context.event.OsgiBundleApplicationContextListener;
+
+/**
+ * ComponentContext activator for the Kernel's Agent bundle
+ * 
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ * 
+ */
+public final class AgentActivator {
+
+    private static final String AGENT_DM_START_TRACKER = "agentDMStartTracker";
+    private final ServiceRegistrationTracker registrationTracker = new ServiceRegistrationTracker();
+
+    public void activate(ComponentContext context) {
+        registerSpringDmToBlueprintEventAdapter(context.getBundleContext());
+        context.enableComponent(AGENT_DM_START_TRACKER);
+    }
+
+    private void registerSpringDmToBlueprintEventAdapter(BundleContext context) {
+        registerBlueprintEventPostingOsgiBundleApplicationContextListener(context);
+        registerDeployerFailureListener(context);
+    }
+
+    private void registerBlueprintEventPostingOsgiBundleApplicationContextListener(BundleContext context) {
+        EventAdmin eventAdmin = getRequiredService(context, EventAdmin.class);
+        BlueprintEventPostingOsgiBundleApplicationContextListener listener = new BlueprintEventPostingOsgiBundleApplicationContextListener(eventAdmin);
+        this.registrationTracker.track(context.registerService(OsgiBundleApplicationContextListener.class.getName(), listener, null));
+    }
+
+    private void registerDeployerFailureListener(BundleContext context) {
+        EventLoggerFactory eventLoggerFactory = getRequiredService(context, EventLoggerFactory.class);
+        EventLogger eventLogger = eventLoggerFactory.createEventLogger(context.getBundle());
+        DeployerFailureListener failureListener = new DeployerFailureListener(eventLogger);
+        Dictionary<String, String[]> props = new Hashtable<String, String[]>();
+        props.put(EventConstants.EVENT_TOPIC, new String[] { "org/osgi/service/blueprint/container/*" });
+        this.registrationTracker.track(context.registerService(EventHandler.class.getName(), failureListener, props));
+    }
+
+    public void deactivate(ComponentContext context) throws Exception {
+        this.registrationTracker.unregisterAll();
+    }
+
+    private <T> T getRequiredService(BundleContext context, Class<T> clazz) {
+        T result = null;
+        ServiceReference<T> ref = context.getServiceReference(clazz);
+        if (ref != null) {
+            result = (T) context.getService(ref);
+        }
+        if (result == null) {
+            // TODO: is consuming service references reasonable if failures are retried many times? May need the
+            // following code.
+            // if (ref != null) {
+            // context.ungetService(ref);
+            // }
+            throw new IllegalStateException("Unable to access required service of type '" + clazz.getName() + "' from bundle '" + context.getBundle().getSymbolicName() + "'");
+        }
+        return result;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.agent.dm/src/main/java/org/eclipse/virgo/kernel/agent/dm/internal/AgentLogEvents.java b/kernel/org.eclipse.virgo.kernel.agent.dm/src/main/java/org/eclipse/virgo/kernel/agent/dm/internal/AgentLogEvents.java
new file mode 100644
index 0000000..33cf644
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.agent.dm/src/main/java/org/eclipse/virgo/kernel/agent/dm/internal/AgentLogEvents.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.agent.dm.internal;
+
+import org.eclipse.virgo.nano.serviceability.LogEventDelegate;
+import org.eclipse.virgo.medic.eventlog.Level;
+import org.eclipse.virgo.medic.eventlog.LogEvent;
+
+/**
+ * Defines all the {@link LogEvent LogEvents} for the kernel agent.
+ * 
+ * <strong>Concurrent Semantics</strong><br/>
+ * 
+ * Implementation is immutable.
+ * 
+ */
+public enum AgentLogEvents implements LogEvent {
+
+    BUNDLE_CONTEXT_FAILED(0, Level.ERROR);
+
+    private static final String PREFIX = "AG";
+
+    private final LogEventDelegate delegate;
+
+    private AgentLogEvents(int code, Level level) {
+        this.delegate = new LogEventDelegate(PREFIX, code, level);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getEventCode() {
+        return this.delegate.getEventCode();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Level getLevel() {
+        return this.delegate.getLevel();
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.agent.dm/src/main/java/org/eclipse/virgo/kernel/agent/dm/internal/BlueprintEventPostingOsgiBundleApplicationContextListener.java b/kernel/org.eclipse.virgo.kernel.agent.dm/src/main/java/org/eclipse/virgo/kernel/agent/dm/internal/BlueprintEventPostingOsgiBundleApplicationContextListener.java
new file mode 100644
index 0000000..114c30a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.agent.dm/src/main/java/org/eclipse/virgo/kernel/agent/dm/internal/BlueprintEventPostingOsgiBundleApplicationContextListener.java
@@ -0,0 +1,256 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.agent.dm.internal;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Dictionary;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+
+import org.osgi.framework.Bundle;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.eclipse.gemini.blueprint.context.event.OsgiBundleApplicationContextEvent;
+import org.eclipse.gemini.blueprint.context.event.OsgiBundleApplicationContextListener;
+import org.eclipse.gemini.blueprint.context.event.OsgiBundleContextClosedEvent;
+import org.eclipse.gemini.blueprint.context.event.OsgiBundleContextFailedEvent;
+import org.eclipse.gemini.blueprint.context.event.OsgiBundleContextRefreshedEvent;
+import org.eclipse.gemini.blueprint.extender.event.BootstrappingDependencyEvent;
+import org.eclipse.gemini.blueprint.service.importer.OsgiServiceDependency;
+import org.eclipse.gemini.blueprint.service.importer.event.OsgiServiceDependencyEvent;
+import org.eclipse.gemini.blueprint.service.importer.event.OsgiServiceDependencyWaitEndedEvent;
+import org.eclipse.gemini.blueprint.service.importer.event.OsgiServiceDependencyWaitStartingEvent;
+import org.eclipse.gemini.blueprint.service.importer.event.OsgiServiceDependencyWaitTimedOutEvent;
+
+/**
+ * An {@link OsgiBundleApplicationContextListener} implementation that listens to Spring DM events and sends the
+ * equivalent Blueprint events.
+ * 
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ * 
+ */
+public final class BlueprintEventPostingOsgiBundleApplicationContextListener implements OsgiBundleApplicationContextListener<OsgiBundleApplicationContextEvent> {
+
+    private static final String PROPERTY_BUNDLE_SYMBOLICNAME = "bundle.symbolicName";
+
+    private static final String PROPERTY_BUNDLE_ID = "bundle.id";
+
+    private static final String PROPERTY_BUNDLE = "bundle";
+
+    private static final String PROPERTY_BUNDLE_VERSION = "bundle.version";
+
+    private static final String PROPERTY_TIMESTAMP = "timestamp";
+
+    private static final String PROPERTY_EXCEPTION = "exception";
+
+    private static final String PROPERTY_DEPENDENCIES = "dependencies";
+
+    private static final String PROPERTY_BEAN_NAME = "bean.name";
+
+    private static final String PROPERTY_MANDATORY = "mandatory";
+
+    private static final String PROPERTY_TYPE = "type";
+
+    private static final String TOPIC_BLUEPRINT_EVENTS = "org/osgi/service/blueprint/container/";
+
+    private static final String EVENT_CREATED = TOPIC_BLUEPRINT_EVENTS + "CREATED";
+
+    private static final String EVENT_DESTROYED = TOPIC_BLUEPRINT_EVENTS + "DESTROYED";
+
+    private static final String EVENT_FAILURE = TOPIC_BLUEPRINT_EVENTS + "FAILURE";
+
+    private static final String EVENT_WAITING = TOPIC_BLUEPRINT_EVENTS + "WAITING";
+
+    private static final String EVENT_GRACE_PERIOD = TOPIC_BLUEPRINT_EVENTS + "GRACE_PERIOD";
+
+    private static final Logger logger = LoggerFactory.getLogger(BlueprintEventPostingOsgiBundleApplicationContextListener.class);
+
+    private static final int TYPE_CREATED = 1;
+
+    private static final int TYPE_DESTROYED = 4;
+
+    private static final int TYPE_FAILURE = 5;
+
+    private static final int TYPE_GRACE_PERIOD = 6;
+
+    private static final int TYPE_WAITING = 7;
+
+    private final EventAdmin eventAdmin;
+
+    private final Map<Bundle, List<OsgiServiceDependency>> unsatisfiedDependencies = new HashMap<Bundle, List<OsgiServiceDependency>>();
+
+    private final Object monitor = new Object();
+
+    public BlueprintEventPostingOsgiBundleApplicationContextListener(EventAdmin eventAdmin) {
+        this.eventAdmin = eventAdmin;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onOsgiApplicationEvent(OsgiBundleApplicationContextEvent event) {
+        Bundle bundle = event.getBundle();
+        Dictionary<String, Object> properties = createEventProperties(event);
+
+        if (event instanceof OsgiBundleContextRefreshedEvent) {
+            clearUnsatisfiedDependencies(bundle);
+            sendCreatedEvent(properties);
+        } else if (event instanceof OsgiBundleContextFailedEvent) {
+            clearUnsatisfiedDependencies(bundle);
+            properties.put(PROPERTY_EXCEPTION, ((OsgiBundleContextFailedEvent) event).getFailureCause());
+            sendFailureEvent(properties);
+        } else if (event instanceof OsgiBundleContextClosedEvent) {
+            sendDestroyedEvent(properties);
+        } else if (event instanceof BootstrappingDependencyEvent) {
+            OsgiServiceDependencyEvent serviceDependencyEvent = ((BootstrappingDependencyEvent) event).getDependencyEvent();
+
+            OsgiServiceDependency dependency = serviceDependencyEvent.getServiceDependency();
+
+            if (serviceDependencyEvent instanceof OsgiServiceDependencyWaitStartingEvent) {
+                addUnsatisfiedDependency(bundle, dependency);
+                addDependencyProperties(dependency, properties);
+                sendWaitingEvent(properties);
+            } else if (serviceDependencyEvent instanceof OsgiServiceDependencyWaitTimedOutEvent) {
+                List<OsgiServiceDependency> unsatisfiedDependencies = getUnsatisfiedDependencies(bundle);
+                addDependenciesProperties(unsatisfiedDependencies, properties);
+                sendFailureEvent(properties);
+            } else if (serviceDependencyEvent instanceof OsgiServiceDependencyWaitEndedEvent) {
+                List<OsgiServiceDependency> unsatisfiedDependencies = removeUnsatisfiedDependency(bundle, dependency);
+                if (unsatisfiedDependencies != null) {
+                    addDependenciesProperties(unsatisfiedDependencies, properties);
+                    sendGracePeriodEvent(properties);
+                }
+            }
+        }
+    }
+
+    private List<OsgiServiceDependency> getUnsatisfiedDependencies(Bundle bundle) {
+        synchronized (this.monitor) {
+            List<OsgiServiceDependency> dependencies = this.unsatisfiedDependencies.get(bundle);
+            if (dependencies == null) {
+                dependencies = Collections.<OsgiServiceDependency> emptyList();
+            }
+            return dependencies;
+        }
+    }
+
+    private List<OsgiServiceDependency> addUnsatisfiedDependency(Bundle bundle, OsgiServiceDependency dependency) {
+        synchronized (this.monitor) {
+            List<OsgiServiceDependency> bundlesDependencies = this.unsatisfiedDependencies.get(bundle);
+            if (bundlesDependencies == null) {
+                bundlesDependencies = new ArrayList<OsgiServiceDependency>();
+                this.unsatisfiedDependencies.put(bundle, bundlesDependencies);
+            }
+            bundlesDependencies.add(dependency);
+            return bundlesDependencies;
+        }
+    }
+
+    private List<OsgiServiceDependency> removeUnsatisfiedDependency(Bundle bundle, OsgiServiceDependency satisfiedDependency) {
+        synchronized (this.monitor) {
+            List<OsgiServiceDependency> bundlesDependencies = this.unsatisfiedDependencies.get(bundle);
+            if (bundlesDependencies != null) {
+                bundlesDependencies.remove(satisfiedDependency);
+            }
+            return bundlesDependencies;
+        }
+    }
+
+    private void clearUnsatisfiedDependencies(Bundle bundle) {
+        synchronized (this.monitor) {
+            this.unsatisfiedDependencies.remove(bundle);
+        }
+    }
+
+    private void addDependenciesProperties(List<OsgiServiceDependency> dependencies, Dictionary<String, Object> properties) {
+        if (!dependencies.isEmpty()) {
+            String[] beanNames = new String[dependencies.size()];
+            String[] filters = new String[dependencies.size()];
+            boolean[] mandatory = new boolean[dependencies.size()];
+
+            for (int i = 0; i < dependencies.size(); i++) {
+                OsgiServiceDependency serviceDependency = dependencies.get(i);
+
+                beanNames[i] = serviceDependency.getBeanName();
+                filters[i] = serviceDependency.getServiceFilter().toString();
+                mandatory[i] = serviceDependency.isMandatory();
+            }
+
+            properties.put(PROPERTY_DEPENDENCIES, filters);
+            properties.put(PROPERTY_BEAN_NAME, beanNames);
+            properties.put(PROPERTY_MANDATORY, mandatory);
+        }
+    }
+
+    private void addDependencyProperties(OsgiServiceDependency dependency, Dictionary<String, Object> properties) {
+        addDependenciesProperties(Arrays.asList(new OsgiServiceDependency[] { dependency }), properties);
+    }
+
+    private void sendCreatedEvent(Dictionary<String, Object> properties) {
+        sendEvent(EVENT_CREATED, properties, TYPE_CREATED);
+    }
+
+    private void sendEvent(String topic, Dictionary<String, Object> properties, int type) {
+        properties.put(PROPERTY_TYPE, type);
+        logger.info("Sending event to topic '{}' with properties '{}'", topic, properties);
+        try {
+            this.eventAdmin.sendEvent(new Event(topic, properties));
+        } catch (Exception ex) {
+            if (logger.isDebugEnabled()) {
+                logger.debug("Failed to send event to topic '" + topic + "'. This may be expected during shutdown.", ex);
+            } else {
+                logger.error(
+                    "Failed to send event to topic '{}'. Exception message: '{}'. This may be expected during shutdown. Turn on debug logging for more details.",
+                    topic, ex.getMessage());
+            }
+        }
+    }
+
+    private void sendFailureEvent(Dictionary<String, Object> properties) {
+        sendEvent(EVENT_FAILURE, properties, TYPE_FAILURE);
+    }
+
+    private void sendDestroyedEvent(Dictionary<String, Object> properties) {
+        sendEvent(EVENT_DESTROYED, properties, TYPE_DESTROYED);
+    }
+
+    private void sendWaitingEvent(Dictionary<String, Object> properties) {
+        sendEvent(EVENT_WAITING, properties, TYPE_WAITING);
+    }
+
+    private void sendGracePeriodEvent(Dictionary<String, Object> properties) {
+        sendEvent(EVENT_GRACE_PERIOD, properties, TYPE_GRACE_PERIOD);
+    }
+
+    private Dictionary<String, Object> createEventProperties(OsgiBundleApplicationContextEvent event) {
+        Dictionary<String, Object> properties = new Hashtable<String, Object>();
+
+        Bundle bundle = event.getBundle();
+        properties.put(PROPERTY_BUNDLE, bundle);
+        properties.put(PROPERTY_BUNDLE_ID, bundle.getBundleId());
+        properties.put(PROPERTY_BUNDLE_SYMBOLICNAME, bundle.getSymbolicName());
+        properties.put(PROPERTY_BUNDLE_VERSION, bundle.getVersion());
+        properties.put(PROPERTY_TIMESTAMP, event.getTimestamp());
+
+        return properties;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.agent.dm/src/main/java/org/eclipse/virgo/kernel/agent/dm/internal/DeployerFailureListener.java b/kernel/org.eclipse.virgo.kernel.agent.dm/src/main/java/org/eclipse/virgo/kernel/agent/dm/internal/DeployerFailureListener.java
new file mode 100644
index 0000000..e7868f7
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.agent.dm/src/main/java/org/eclipse/virgo/kernel/agent/dm/internal/DeployerFailureListener.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.agent.dm.internal;
+
+import org.eclipse.equinox.region.Region;
+import org.eclipse.equinox.region.RegionDigraph;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventHandler;
+
+/**
+ * A {@link EventHandler} implementation that listens for and handles Blueprint container failure events.
+ * <p />
+ * 
+ * Note that the events that are handled by this listener depend on the properties that are supplied when it is
+ * registered as a service.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ * 
+ */
+final class DeployerFailureListener implements EventHandler {
+
+    private static final String FAILURE_TOPIC = "org/osgi/service/blueprint/container/FAILURE";
+
+    private final EventLogger eventLogger;
+
+    private volatile RegionDigraph regionDigraph;
+
+    private volatile Region agentRegion;
+
+    public DeployerFailureListener(EventLogger eventLogger) {
+        this.eventLogger = eventLogger;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void handleEvent(Event event) {
+        if (FAILURE_TOPIC.equals(event.getTopic())) {
+            Throwable failure = (Throwable) event.getProperty("exception");
+            Bundle bundle = (Bundle) event.getProperty("bundle");
+            if (inThisRegion(bundle)) {
+                this.eventLogger.log(AgentLogEvents.BUNDLE_CONTEXT_FAILED, failure, bundle.getSymbolicName(), bundle.getVersion().toString());
+            }
+        }
+    }
+
+    private boolean inThisRegion(Bundle bundle) {
+        if (regionDigraph == null) {
+            Bundle agentBundle = FrameworkUtil.getBundle(getClass());
+            BundleContext bundleContext = agentBundle.getBundleContext();
+            ServiceReference<RegionDigraph> regionMembershipServiceReference = bundleContext.getServiceReference(RegionDigraph.class);
+            if (regionMembershipServiceReference != null) {
+                this.regionDigraph = bundleContext.getService(regionMembershipServiceReference);
+                this.agentRegion = getRegion(agentBundle);
+            }
+        }
+        return this.regionDigraph != null ? getRegion(bundle).equals(this.agentRegion) : true;
+    }
+
+    private Region getRegion(Bundle bundle) {
+        for (Region region : this.regionDigraph) {
+            if (region.contains(bundle)) {
+                return region;
+            }
+        }
+        return null;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.agent.dm/src/main/resources/EventLogMessages.properties b/kernel/org.eclipse.virgo.kernel.agent.dm/src/main/resources/EventLogMessages.properties
new file mode 100644
index 0000000..d99d856
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.agent.dm/src/main/resources/EventLogMessages.properties
@@ -0,0 +1,2 @@
+#Enter log event codes to short messages - XX9999(E,W,I) = This is the short code
+AG0000E  =  Application context creation failure for bundle '{}' version '{}'.
diff --git a/kernel/org.eclipse.virgo.kernel.agent.dm/src/main/resources/OSGI-INF/agentdm_start_tracker.xml b/kernel/org.eclipse.virgo.kernel.agent.dm/src/main/resources/OSGI-INF/agentdm_start_tracker.xml
new file mode 100644
index 0000000..2e7d9f5
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.agent.dm/src/main/resources/OSGI-INF/agentdm_start_tracker.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<component name="agentDMStartTracker" enabled="false" xmlns:src="http://www.osgi.org/xmlns/src/v1.1.0">

+	<implementation class="org.eclipse.virgo.kernel.agent.dm.StandardAgentDMStartTracker"/>

+	<service>

+      <provide interface="org.eclipse.virgo.kernel.agent.dm.AgentDMStartTracker"/>

+   	</service>

+</component>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.agent.dm/src/main/resources/OSGI-INF/dm_agent.xml b/kernel/org.eclipse.virgo.kernel.agent.dm/src/main/resources/OSGI-INF/dm_agent.xml
new file mode 100644
index 0000000..1b52c6b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.agent.dm/src/main/resources/OSGI-INF/dm_agent.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<component name="agentDM" immediate="true" xmlns:src="http://www.osgi.org/xmlns/src/v1.1.0">

+	<implementation class="org.eclipse.virgo.kernel.agent.dm.internal.AgentActivator"/>

+	<reference name="EventLogger"

+		interface="org.eclipse.virgo.medic.eventlog.EventLoggerFactory"

+		policy="dynamic"/>	

+	<reference name="EventAdmin"

+		interface="org.osgi.service.event.EventAdmin"

+		policy="dynamic"/>

+</component>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.agent.dm/src/test/java/org/eclipse/virgo/kernel/agent/dm/internal/BlueprintEventPostingOsgiBundleApplicationContextListenerTests.java b/kernel/org.eclipse.virgo.kernel.agent.dm/src/test/java/org/eclipse/virgo/kernel/agent/dm/internal/BlueprintEventPostingOsgiBundleApplicationContextListenerTests.java
new file mode 100644
index 0000000..3c4286a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.agent.dm/src/test/java/org/eclipse/virgo/kernel/agent/dm/internal/BlueprintEventPostingOsgiBundleApplicationContextListenerTests.java
@@ -0,0 +1,233 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.agent.dm.internal;
+
+import static org.easymock.EasyMock.createNiceMock;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Dictionary;
+import java.util.Hashtable;
+
+import org.junit.Test;
+import org.osgi.framework.Filter;
+import org.osgi.framework.Version;
+import org.osgi.service.event.Event;
+import org.springframework.context.ApplicationContext;
+import org.eclipse.gemini.blueprint.context.event.OsgiBundleContextClosedEvent;
+import org.eclipse.gemini.blueprint.context.event.OsgiBundleContextFailedEvent;
+import org.eclipse.gemini.blueprint.context.event.OsgiBundleContextRefreshedEvent;
+import org.eclipse.gemini.blueprint.extender.event.BootstrappingDependencyEvent;
+import org.eclipse.gemini.blueprint.service.importer.OsgiServiceDependency;
+import org.eclipse.gemini.blueprint.service.importer.event.OsgiServiceDependencyEvent;
+import org.eclipse.gemini.blueprint.service.importer.event.OsgiServiceDependencyWaitEndedEvent;
+import org.eclipse.gemini.blueprint.service.importer.event.OsgiServiceDependencyWaitStartingEvent;
+import org.eclipse.gemini.blueprint.service.importer.event.OsgiServiceDependencyWaitTimedOutEvent;
+
+import org.eclipse.virgo.kernel.agent.dm.internal.BlueprintEventPostingOsgiBundleApplicationContextListener;
+import org.eclipse.virgo.test.stubs.framework.StubBundle;
+import org.eclipse.virgo.test.stubs.service.event.StubEventAdmin;
+import org.eclipse.virgo.test.stubs.support.ObjectClassFilter;
+
+
+/**
+ */
+public class BlueprintEventPostingOsgiBundleApplicationContextListenerTests {
+    
+    private static final int TYPE_CREATED = 1;
+    
+    private static final int TYPE_DESTROYED = 4;
+    
+    private static final int TYPE_FAILURE = 5;
+    
+    private static final int TYPE_GRACE_PERIOD = 6;
+    
+    private static final int TYPE_WAITING = 7;
+    
+    private final StubEventAdmin eventAdmin = new StubEventAdmin();
+    
+    private final BlueprintEventPostingOsgiBundleApplicationContextListener listener = new BlueprintEventPostingOsgiBundleApplicationContextListener(eventAdmin);
+    
+    private final ApplicationContext applicationContext = createNiceMock(ApplicationContext.class);
+    
+    private final StubBundle bundle = new StubBundle("foo", new Version(1,2,3));
+    
+    @Test
+    public void contextRefreshedPostsCreatedEvent() {
+        OsgiBundleContextRefreshedEvent event = new OsgiBundleContextRefreshedEvent(applicationContext, bundle);
+        listener.onOsgiApplicationEvent(event);
+        
+        assertTrue(eventAdmin.awaitSendingOfEvent(new Event("org/osgi/service/blueprint/container/CREATED", createEventProperties(event.getTimestamp(), TYPE_CREATED)), 1000));
+    }
+    
+    @Test
+    public void contextCreationFailedPostsFailureEvent() {
+        Throwable cause = new Throwable();        
+        
+        OsgiBundleContextFailedEvent event = new OsgiBundleContextFailedEvent(applicationContext, bundle, cause);
+        listener.onOsgiApplicationEvent(event);
+        
+        assertTrue(eventAdmin.awaitSendingOfEvent(new Event("org/osgi/service/blueprint/container/FAILURE", createEventProperties(null, event.getTimestamp(), cause, TYPE_FAILURE)), 1000));
+    }
+    
+    @Test
+    public void contextClosedPostsDestroyedEvent() {        
+        OsgiBundleContextClosedEvent event = new OsgiBundleContextClosedEvent(applicationContext, bundle);
+        listener.onOsgiApplicationEvent(event);
+        
+        assertTrue(eventAdmin.awaitSendingOfEvent(new Event("org/osgi/service/blueprint/container/DESTROYED", createEventProperties(event.getTimestamp(), TYPE_DESTROYED)), 1000));
+    }
+    
+    @Test
+    public void startOfWaitOnServicePostsWaitingEvent() {
+        final Filter filter = new ObjectClassFilter(Integer.class);
+        
+        OsgiServiceDependency serviceDependency = new StubOsgiServiceDependency(filter);
+        
+        OsgiServiceDependencyEvent serviceDependencyEvent = new OsgiServiceDependencyWaitStartingEvent(applicationContext, serviceDependency, 1000);
+        BootstrappingDependencyEvent event = new BootstrappingDependencyEvent(applicationContext, bundle, serviceDependencyEvent);
+        listener.onOsgiApplicationEvent(event);
+        
+        Dictionary<String, Object> properties = createEventProperties(serviceDependency, event.getTimestamp(), TYPE_WAITING);
+        
+        assertTrue(eventAdmin.awaitSendingOfEvent(new Event("org/osgi/service/blueprint/container/WAITING", properties), 1000));
+    }
+    
+    @Test
+    public void waitTimeoutPostsFailureEvent() {
+        final Filter filter = new ObjectClassFilter(Integer.class);
+        
+        OsgiServiceDependency serviceDependency = new StubOsgiServiceDependency(filter);
+        
+        OsgiServiceDependencyEvent serviceDependencyEvent = new OsgiServiceDependencyWaitStartingEvent(applicationContext, serviceDependency, 1000);
+        BootstrappingDependencyEvent event = new BootstrappingDependencyEvent(applicationContext, bundle, serviceDependencyEvent);
+        listener.onOsgiApplicationEvent(event);
+        
+        serviceDependencyEvent = new OsgiServiceDependencyWaitTimedOutEvent(applicationContext, serviceDependency, 1000);
+        event = new BootstrappingDependencyEvent(applicationContext, bundle, serviceDependencyEvent);
+        listener.onOsgiApplicationEvent(event);
+        
+        Dictionary<String, Object> properties = createEventProperties(serviceDependency, event.getTimestamp(), TYPE_FAILURE);
+        
+        assertTrue(eventAdmin.awaitSendingOfEvent(new Event("org/osgi/service/blueprint/container/FAILURE", properties), 1000));
+    }
+    
+    @Test
+    public void endOfWaitOnServicePostsGracePeriodEvent() {
+        final Filter integerFilter = new ObjectClassFilter(Integer.class);
+        final Filter booleanFilter = new ObjectClassFilter(Boolean.class);
+        
+        sendWaitStartingEvent(booleanFilter);
+        sendWaitStartingEvent(integerFilter);
+        
+        long timestamp = sendWaitEndedEvent(booleanFilter);
+                
+        Dictionary<String, Object> properties = createEventProperties(new StubOsgiServiceDependency(integerFilter), timestamp, TYPE_GRACE_PERIOD);
+        assertTrue(eventAdmin.awaitSendingOfEvent(new Event("org/osgi/service/blueprint/container/GRACE_PERIOD", properties), 1000));
+        
+        timestamp = sendWaitEndedEvent(integerFilter);
+        
+        properties = createEventProperties(timestamp, TYPE_GRACE_PERIOD);
+        assertTrue(eventAdmin.awaitSendingOfEvent(new Event("org/osgi/service/blueprint/container/GRACE_PERIOD", properties), 1000));
+    }
+    
+    private void sendWaitStartingEvent(Filter filter) {
+        OsgiServiceDependency serviceDependency = new StubOsgiServiceDependency(filter);        
+        OsgiServiceDependencyEvent serviceDependencyEvent = new OsgiServiceDependencyWaitStartingEvent(applicationContext, serviceDependency, 1000);
+        BootstrappingDependencyEvent event = new BootstrappingDependencyEvent(applicationContext, bundle, serviceDependencyEvent);
+        listener.onOsgiApplicationEvent(event);
+    }
+    
+    private long sendWaitEndedEvent(Filter filter) {
+        OsgiServiceDependency serviceDependency = new StubOsgiServiceDependency(filter);
+        OsgiServiceDependencyEvent serviceDependencyEvent = new OsgiServiceDependencyWaitEndedEvent(this.applicationContext, serviceDependency, 1000);
+        BootstrappingDependencyEvent event = new BootstrappingDependencyEvent(applicationContext, bundle, serviceDependencyEvent);
+        listener.onOsgiApplicationEvent(event);
+        return event.getTimestamp();
+    }
+    
+    private Dictionary<String, Object> createEventProperties(long timestamp, int type) {
+        return createEventProperties(null, timestamp, null, type);
+    }
+    
+    private Dictionary<String, Object> createEventProperties(OsgiServiceDependency serviceDependency, long timestamp, int type) {
+        return createEventProperties(serviceDependency, timestamp, null, type);
+    }
+    
+    private Dictionary<String, Object> createEventProperties(OsgiServiceDependency serviceDependency, long timestamp, Throwable cause, int type) {
+        Dictionary<String, Object> properties = new Hashtable<String, Object>();
+        
+        properties.put("bundle", bundle);
+        properties.put("bundle.id", bundle.getBundleId());
+        properties.put("bundle.symbolicName", bundle.getSymbolicName());
+        properties.put("bundle.version", bundle.getVersion());        
+        properties.put("timestamp", timestamp);
+        properties.put("type", type);
+        
+        if (cause != null) {
+            properties.put("exception", cause);
+        }
+        
+        if (serviceDependency != null) {
+            properties.put("dependencies", new String[] {serviceDependency.getServiceFilter().toString()});
+            properties.put("bean.name", new String[] {serviceDependency.getBeanName()});
+            properties.put("mandatory", new boolean[] {serviceDependency.isMandatory()});
+        }
+        
+        return properties;
+    }
+    
+    private static final class StubOsgiServiceDependency implements OsgiServiceDependency {
+        
+        private final Filter filter;
+                        
+        private StubOsgiServiceDependency(Filter filter) {
+            this.filter = filter;
+        }
+        
+        public String getBeanName() {
+            return "bean";
+        }
+
+        public Filter getServiceFilter() {
+            return filter;
+        }
+
+        public boolean isMandatory() {
+            return true;
+        }
+
+        @Override
+        public int hashCode() {
+            final int prime = 31;
+            int result = 1;
+            result = prime * result + ((filter == null) ? 0 : filter.hashCode());
+            return result;
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (this == obj)
+                return true;
+            if (obj == null)
+                return false;
+            if (getClass() != obj.getClass())
+                return false;
+            StubOsgiServiceDependency other = (StubOsgiServiceDependency) obj;
+            if (filter == null) {
+                if (other.filter != null)
+                    return false;
+            } else if (!filter.equals(other.filter))
+                return false;
+            return true;
+        }        
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.agent.dm/src/test/resources/.gitignore b/kernel/org.eclipse.virgo.kernel.agent.dm/src/test/resources/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.agent.dm/src/test/resources/.gitignore
diff --git a/kernel/org.eclipse.virgo.kernel.agent.dm/template.mf b/kernel/org.eclipse.virgo.kernel.agent.dm/template.mf
new file mode 100644
index 0000000..e2d9bf9
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.agent.dm/template.mf
@@ -0,0 +1,21 @@
+Manifest-Version: 1.0

+Bundle-ManifestVersion: 2

+Bundle-Name: Virgo Kernel Agent Spring DM integration

+Bundle-SymbolicName: org.eclipse.virgo.kernel.agent.dm

+Bundle-Version: ${version}

+Excluded-Exports:

+ *.internal.*

+Import-Template:

+ org.eclipse.virgo.kernel.*;version="${version:[=.=.=, =.+1)}",

+ org.eclipse.virgo.util.*;version="${version:[=.=.=, =.+1)}",

+ org.eclipse.virgo.nano.*;version="${version:[=.=.=, =.+1)}",

+ org.eclipse.virgo.medic.*;version="${version:[=.=.=, =.+1)}",

+ org.springframework.*;version="${springframeworkVersion:[2.5.6, +1)}",

+ org.eclipse.gemini.blueprint.*;version="${geminiBlueprintVersion:[=.=.=, +1)}",

+ org.eclipse.equinox.region.*;version="${equinoxRegionExportedPackageVersion:[=.=.=, =.+1)}",

+ org.aspectj.*;version="${aspectjVersion:[=.=.=, +1)}",

+ org.osgi.*;version="0",

+ org.slf4j.*;version="${slf4jVersion:[=.=.=, +1)}",

+ org.osgi.*;version="0",

+ org.eclipse.osgi.*;version="0"

+Service-Component: OSGI-INF/dm_agent.xml, OSGI-INF/agentdm_start_tracker.xml

diff --git a/kernel/org.eclipse.virgo.kernel.artifact/.settings/org.eclipse.virgo.ide.bundlor.core.prefs b/kernel/org.eclipse.virgo.kernel.artifact/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
new file mode 100644
index 0000000..e6647c9
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
@@ -0,0 +1,3 @@
+#Fri Sep 11 18:21:36 BST 2009
+org.eclipse.virgo.ide.bundlor.core.template.properties.files=../build.properties;../build.versions
+eclipse.preferences.version=1
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/.settings/org.eclipse.wst.common.project.facet.core.xml b/kernel/org.eclipse.virgo.kernel.artifact/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..92aa290
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+  <installed facet="org.eclipse.virgo.server.bundle" version="1.0"/>
+</faceted-project>
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/.springBeans b/kernel/org.eclipse.virgo.kernel.artifact/.springBeans
new file mode 100644
index 0000000..8058887
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/.springBeans
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beansProjectDescription>
+	<version>1</version>
+	<pluginVersion><![CDATA[2.2.6.200908051215-RELEASE]]></pluginVersion>
+	<configSuffixes>
+		<configSuffix><![CDATA[xml]]></configSuffix>
+	</configSuffixes>
+	<enableImports><![CDATA[false]]></enableImports>
+	<configs>
+	</configs>
+	<configSets>
+	</configSets>
+</beansProjectDescription>
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/ArtifactSpecification.java b/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/ArtifactSpecification.java
new file mode 100644
index 0000000..ac2c1a3
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/ArtifactSpecification.java
@@ -0,0 +1,154 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2012 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.artifact;
+
+import java.net.URI;
+import java.util.Collections;
+import java.util.Map;
+
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+
+/**
+ * An <code>ArtifactSpecification</code> is a reference to an artifact by type, name and version <i>range</i> or URI,
+ * but not both, together with some properties.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread-safe.
+ * 
+ */
+public final class ArtifactSpecification {
+
+    private static final Map<String, String> IMMUTABLE_EMPTY_MAP = Collections.<String, String> emptyMap();
+
+    private final String type;
+
+    private final String name;
+
+    private final VersionRange versionRange;
+
+    private final URI uri;
+
+    private final Map<String, String> properties;
+
+    /**
+     * Constructs a {@link ArtifactSpecification} with the given type, name, version range and no properties.
+     * 
+     * @param type the type of the artifact specification, which must not be <code>null</code>
+     * @param name the name of the artifact specification, which must not be <code>null</code>
+     * @param versionRange the version range of the artifact specification, which must not be <code>null</code>
+     */
+    public ArtifactSpecification(@NonNull String type, @NonNull String name, @NonNull VersionRange versionRange) {
+        this(type, name, versionRange, null, null);
+    }
+
+    /**
+     * Constructs a {@link ArtifactSpecification} with the given type, name, version range, and properties.
+     * 
+     * @param type the type of the artifact specification, which must not be <code>null</code>
+     * @param name the name of the artifact specification, which must not be <code>null</code>
+     * @param versionRange the version range of the artifact specification, which must not be <code>null</code>
+     * @param properties the properties of the artifact specification, which must not be <code>null</code>
+     */
+    public ArtifactSpecification(@NonNull String type, @NonNull String name, @NonNull VersionRange versionRange,
+        @NonNull Map<String, String> properties) {
+        this(type, name, versionRange, null, properties);
+    }
+
+    /**
+     * Constructs a {@link ArtifactSpecification} with the given URI and with no properties.
+     * 
+     * @param uri the URI of the artifact specification, which must not be <code>null</code>
+     */
+    public ArtifactSpecification(@NonNull URI uri) {
+        this(null, null, null, uri, null);
+    }
+
+    /**
+     * Constructs a {@link ArtifactSpecification} with the given URI and with no properties.
+     * 
+     * @param uri the URI of the artifact specification, which must not be <code>null</code>
+     * @param properties the properties of the artifact specification, which must not be <code>null</code>
+     */
+    public ArtifactSpecification(@NonNull URI uri, @NonNull Map<String, String> properties) {
+        this(null, null, null, uri, properties);
+    }
+
+    /**
+     * Constructs a {@link ArtifactSpecification} with the given type, name, version range, URI, and properties.
+     * <p>
+     * Either the type, name, and version range must be non-<code>null</code> and the URI <code>null</code> or the URI
+     * must be non-<code>null</code> and the type, name, and version range <code>null</code>. The properties may be
+     * <code>null</code>.
+     * 
+     * @param type the type of the artifact specification
+     * @param name the name of the artifact specification
+     * @param versionRange the version range of the artifact specification
+     * @param uri the URI of the artifact specification
+     * @param properties the properties of the artifact specification, which may be <code>null</code>
+     */
+    private ArtifactSpecification(String type, String name, VersionRange versionRange, URI uri, Map<String, String> properties) {
+        this.type = type;
+        this.name = name;
+        this.versionRange = versionRange;
+        this.uri = uri;
+        this.properties = properties == null ? IMMUTABLE_EMPTY_MAP : Collections.unmodifiableMap(properties);
+    }
+
+    /**
+     * Returns the type.
+     * 
+     * @return the type, or <code>null</code> if this artifact specification is by URI
+     */
+    public String getType() {
+        return this.type;
+    }
+
+    /**
+     * Returns the name.
+     * 
+     * @return the name, or <code>null</code> if this artifact specification is by URI
+     */
+    public String getName() {
+        return this.name;
+    }
+
+    /**
+     * Returns the version range.
+     * 
+     * @return a {@link VersionRange}, or <code>null</code> if this artifact specification is by URI
+     */
+    public VersionRange getVersionRange() {
+        return this.versionRange;
+    }
+
+    /**
+     * Returns the URI. If a URI was not specified, returns <code>null</code>.
+     * 
+     * @return a {@link URI} or <code>null</code> if this artifact specification is by type, name, and version range
+     */
+    public URI getUri() {
+        return this.uri;
+    }
+
+    /**
+     * Returns the properties. If properties were not specified, returns an empty map. The returned properties may not
+     * be modified.
+     * 
+     * @return a properties map, never <code>null</code>
+     */
+    public Map<String, String> getProperties() {
+        return this.properties;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/bundle/BundleBridge.java b/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/bundle/BundleBridge.java
new file mode 100644
index 0000000..c8d259b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/bundle/BundleBridge.java
@@ -0,0 +1,268 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.artifact.bundle;
+
+import java.io.File;
+import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.virgo.kernel.artifact.internal.BundleManifestUtils;
+import org.eclipse.virgo.repository.ArtifactBridge;
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+import org.eclipse.virgo.repository.ArtifactGenerationException;
+import org.eclipse.virgo.repository.Attribute;
+import org.eclipse.virgo.repository.HashGenerator;
+import org.eclipse.virgo.repository.builder.ArtifactDescriptorBuilder;
+import org.eclipse.virgo.repository.builder.AttributeBuilder;
+import org.eclipse.virgo.util.common.CaseInsensitiveMap;
+import org.eclipse.virgo.util.common.MapToDictionaryAdapter;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+import org.eclipse.virgo.util.osgi.manifest.BundleSymbolicName;
+import org.eclipse.virgo.util.osgi.manifest.ExportedPackage;
+import org.eclipse.virgo.util.osgi.manifest.FragmentHost;
+import org.eclipse.virgo.util.osgi.manifest.FragmentHost.Extension;
+import org.eclipse.virgo.util.osgi.manifest.ImportedPackage;
+import org.osgi.framework.Constants;
+import org.osgi.framework.Version;
+
+/**
+ * Implementation of {@link ArtifactBridge} that creates an {@link ArtifactDescriptor} from an OSGi bundle packaged
+ * either as a JAR file, or a directory.
+ * <p />
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * This class is thread-safe
+ *
+ */
+public final class BundleBridge implements ArtifactBridge {
+
+    private static final String JAR_SUFFIX = ".jar";
+
+    private static final String WAR_SUFFIX = ".war";
+
+    public static final String RAW_HEADER_PREFIX = "RAW_HEADER:";
+
+    public static final String BRIDGE_TYPE = "bundle";
+
+    private final HashGenerator hashGenerator;
+
+    public BundleBridge(HashGenerator hashGenerator) {
+        this.hashGenerator = hashGenerator;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public ArtifactDescriptor generateArtifactDescriptor(File artifactFile) throws ArtifactGenerationException {
+
+        if (artifactFile == null) {
+            throw new ArtifactGenerationException("The artifact file must not be null.", BRIDGE_TYPE);
+        }
+
+        BundleManifest bundleManifest;
+
+        try {
+            bundleManifest = BundleManifestUtils.readBundleManifest(artifactFile, JAR_SUFFIX, WAR_SUFFIX);
+        } catch (RuntimeException re) {
+            throw new RuntimeException(String.format("Error occurred while parsing the manifest of file '%s'.", artifactFile.getPath()),  re);
+        } catch (Exception e) {
+            throw new ArtifactGenerationException("Error occurred while parsing the manifest.", BRIDGE_TYPE, e);
+        }
+
+        ArtifactDescriptor descriptor = null;
+
+        if (bundleManifest != null) {
+            descriptor = createArtifactDescriptorFromManifest(artifactFile, bundleManifest);
+        }
+
+        if (descriptor == null) {
+            descriptor = createArtifactDescriptorFromFile(artifactFile);
+        }
+
+        return descriptor;
+    }
+
+    private ArtifactDescriptor createArtifactDescriptorFromFile(File artifactFile) {
+        String fileName = artifactFile.getName();
+
+        if (fileName.endsWith(JAR_SUFFIX) || fileName.endsWith(WAR_SUFFIX)) {
+            String name = fileName.substring(0, fileName.length() - JAR_SUFFIX.length());
+
+            ArtifactDescriptorBuilder artifactDescriptorBuilder = new ArtifactDescriptorBuilder();
+            artifactDescriptorBuilder.setUri(artifactFile.toURI());
+            artifactDescriptorBuilder.setName(name);
+            artifactDescriptorBuilder.setType(BRIDGE_TYPE);
+            artifactDescriptorBuilder.setVersion(Version.emptyVersion);
+
+            this.hashGenerator.generateHash(artifactDescriptorBuilder, artifactFile);
+
+            return artifactDescriptorBuilder.build();
+        }
+
+        return null;
+    }
+
+    private ArtifactDescriptor createArtifactDescriptorFromManifest(File artifactFile, BundleManifest bundleManifest) throws ArtifactGenerationException {
+        try {
+            ArtifactDescriptorBuilder artifactDescriptorBuilder = new ArtifactDescriptorBuilder();
+
+            String name = applyBundleSymbolicName(artifactDescriptorBuilder, bundleManifest);
+            if (name == null) { // no bundle symbolic name ==> not a bundle
+                return null;
+            }
+
+            artifactDescriptorBuilder.setUri(artifactFile.toURI());
+            artifactDescriptorBuilder.setName(name);
+            artifactDescriptorBuilder.setType(BRIDGE_TYPE);
+            artifactDescriptorBuilder.setVersion(applyBundleVersion(artifactDescriptorBuilder, bundleManifest));
+            applyImportPackage(artifactDescriptorBuilder, bundleManifest);
+            applyFragmentHost(artifactDescriptorBuilder, bundleManifest);
+            applyExportPackage(artifactDescriptorBuilder, bundleManifest);
+            this.hashGenerator.generateHash(artifactDescriptorBuilder, artifactFile);
+
+            Dictionary<String, String> rawManifest = bundleManifest.toDictionary();
+            Enumeration<String> keys = rawManifest.keys();
+
+            while (keys.hasMoreElements()) {
+                String key = keys.nextElement();
+                String value = rawManifest.get(key);
+                artifactDescriptorBuilder.addAttribute(new AttributeBuilder().setName(RAW_HEADER_PREFIX + key).setValue(value).build());
+            }
+
+            return artifactDescriptorBuilder.build();
+        } catch (Exception e) {
+            throw new ArtifactGenerationException("Manifest ill-formed.", BRIDGE_TYPE, e);
+        }
+    }
+
+    /**
+     * Providing the <code>artifactDescriptor</code> was created by this bridge in the first place then all its
+     * attributes from the main section of the manifest are placed in to a dictionary and returned. If not then
+     * <code>null</code> is returned.
+     *
+     * @param artifactDescriptor to be converted
+     * @return the new dictionary or null if the provided <code>artifactDescriptor</code> was not created by this bridge
+     */
+    public static Dictionary<String, String> convertToDictionary(ArtifactDescriptor artifactDescriptor) {
+        Map<String, String> map = convertToMap(artifactDescriptor);
+        
+        return map == null ? null : new MapToDictionaryAdapter<String, String>(map);
+
+    }
+    
+    /**
+     * Providing the <code>artifactDescriptor</code> was created by this bridge in the first place then all its
+     * attributes from the main section of the manifest are placed in to a case insensitive map and returned. If not then
+     * <code>null</code> is returned.
+     *
+     * @param artifactDescriptor to be converted
+     * @return the new map or null if the provided <code>artifactDescriptor</code> was not created by this bridge
+     */
+    public static Map<String, String> convertToMap(ArtifactDescriptor artifactDescriptor) {
+        if (!BRIDGE_TYPE.equals(artifactDescriptor.getType())) {
+            return null;
+        }
+
+        CaseInsensitiveMap<String> map = new CaseInsensitiveMap<String>();
+        for (Attribute attribute : artifactDescriptor.getAttributes()) {
+            if (attribute.getKey().startsWith(RAW_HEADER_PREFIX)) {
+                map.put(attribute.getKey().substring(RAW_HEADER_PREFIX.length()), attribute.getValue());
+            }
+        }
+        return map;
+    }
+
+    private String applyBundleSymbolicName(ArtifactDescriptorBuilder artifactBuilder, BundleManifest bundleManifest) {
+        BundleSymbolicName bundleSymbolicName = bundleManifest.getBundleSymbolicName();
+        String symbolicName = bundleSymbolicName.getSymbolicName();
+
+        if (symbolicName != null) { // not a bundle if null
+            AttributeBuilder attributeBuilder = new AttributeBuilder();
+            attributeBuilder.setName(Constants.BUNDLE_SYMBOLICNAME);
+            attributeBuilder.setValue(symbolicName);
+            attributeBuilder.putProperties(Constants.FRAGMENT_ATTACHMENT_DIRECTIVE, bundleSymbolicName.getFragmentAttachment().name());
+            attributeBuilder.putProperties(Constants.SINGLETON_DIRECTIVE, Boolean.toString(bundleSymbolicName.isSingleton()));
+            artifactBuilder.addAttribute(attributeBuilder.build());
+        }
+        return symbolicName;
+    }
+
+    private Version applyBundleVersion(ArtifactDescriptorBuilder artifactBuilder, BundleManifest bundleManifest) {
+        Version version = bundleManifest.getBundleVersion();
+        artifactBuilder.addAttribute(new AttributeBuilder().setName(Constants.BUNDLE_VERSION).setValue(version.toString()).build());
+        return version;
+    }
+
+    private void applyImportPackage(ArtifactDescriptorBuilder artifactBuilder, BundleManifest bundleManifest) {
+        for (ImportedPackage importedPackage : bundleManifest.getImportPackage().getImportedPackages()) {
+            AttributeBuilder attributeBuilder = new AttributeBuilder();
+            attributeBuilder.setName(Constants.IMPORT_PACKAGE);
+            attributeBuilder.setValue(importedPackage.getPackageName());
+            attributeBuilder.putProperties(Constants.RESOLUTION_DIRECTIVE, importedPackage.getResolution().name());
+            attributeBuilder.putProperties(Constants.VERSION_ATTRIBUTE, importedPackage.getVersion().toParseString());
+            artifactBuilder.addAttribute(attributeBuilder.build());
+        }
+    }
+
+    private void applyFragmentHost(ArtifactDescriptorBuilder artifactBuilder, BundleManifest bundleManifest) {
+        FragmentHost fragmentHost = bundleManifest.getFragmentHost();
+        String hostSymbolicName = fragmentHost.getBundleSymbolicName();
+
+        if (hostSymbolicName != null) {
+            AttributeBuilder attributeBuilder = new AttributeBuilder();
+            attributeBuilder.setName(Constants.FRAGMENT_HOST);
+            attributeBuilder.setValue(hostSymbolicName);
+
+            Extension extension = fragmentHost.getExtension();
+            if (extension != null) {
+                attributeBuilder.putProperties(Constants.EXTENSION_DIRECTIVE, extension.name());
+            }
+
+            attributeBuilder.putProperties(Constants.BUNDLE_VERSION_ATTRIBUTE, fragmentHost.getBundleVersion().toParseString());
+            artifactBuilder.addAttribute(attributeBuilder.build());
+        }
+    }
+
+    private void applyExportPackage(ArtifactDescriptorBuilder artifactBuilder, BundleManifest bundleManifest) {
+        for (ExportedPackage exportedPackage : bundleManifest.getExportPackage().getExportedPackages()) {
+            AttributeBuilder attributeBuilder = new AttributeBuilder();
+            attributeBuilder.setName(Constants.EXPORT_PACKAGE);
+            attributeBuilder.setValue(exportedPackage.getPackageName());
+
+            attributeBuilder.putProperties(Constants.VERSION_ATTRIBUTE, exportedPackage.getVersion().toString());
+
+            List<String> include = exportedPackage.getInclude();
+            if (include.size() > 0) {
+                attributeBuilder.putProperties(Constants.INCLUDE_DIRECTIVE, include);
+            }
+
+            List<String> exclude = exportedPackage.getExclude();
+            if (exclude.size() > 0) {
+                attributeBuilder.putProperties(Constants.EXCLUDE_DIRECTIVE, exclude);
+            }
+
+            List<String> mandatory = exportedPackage.getMandatory();
+            if (mandatory.size() > 0) {
+                attributeBuilder.putProperties(Constants.MANDATORY_DIRECTIVE, mandatory);
+            }
+            List<String> uses = exportedPackage.getUses();
+            if (uses.size() > 0) {
+                attributeBuilder.putProperties(Constants.USES_DIRECTIVE, uses);
+            }
+
+            artifactBuilder.addAttribute(attributeBuilder.build());
+        }
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/fs/ArtifactFS.java b/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/fs/ArtifactFS.java
new file mode 100644
index 0000000..5b34761
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/fs/ArtifactFS.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.artifact.fs;
+
+import java.io.File;
+
+/**
+ * An abstraction that represents the filesystem location of an artifact
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations must be threadsafe
+ * 
+ */
+public interface ArtifactFS {
+
+    /**
+     * Gets an entry from this artifact
+     * 
+     * @param name The name of the entry to retrieve
+     * @return An {@link ArtifactFSEntry} that represents the entry in the artifact
+     */
+    ArtifactFSEntry getEntry(String name);
+
+    /**
+     * Gets the file upon which this {@link ArtifactFS} is built
+     * 
+     * @return the underlying file for this {@link ArtifactFS}
+     */
+    File getFile();
+}
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/fs/ArtifactFSEntry.java b/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/fs/ArtifactFSEntry.java
new file mode 100644
index 0000000..5682d00
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/fs/ArtifactFSEntry.java
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.artifact.fs;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+
+/**
+ * An abstraction that represents an entry inside of an artifact
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ * @see ArtifactFS
+ */
+public interface ArtifactFSEntry {
+
+    /**
+     * Gets the path of this entry, relative to the root {@link ArtifactFS}
+     * 
+     * @return the path of this entry
+     */
+    String getPath();
+
+    /**
+     * Gets the name of this entry
+     * 
+     * @return the name of this entry
+     */
+    String getName();
+
+    /**
+     * Deletes this entry from the artifact
+     * 
+     * @return whether the deletion of this artifact was successful
+     */
+    boolean delete();
+
+    /**
+     * Whether this entry is a directory
+     * 
+     * @return whether this entry is a directory
+     */
+    boolean isDirectory();
+
+    /**
+     * Gets an {@link InputStream} for reading from this artifact. This method is not supported for directory artifacts.
+     * 
+     * @return an {@link InputStream} for reading from this artifact
+     */
+    InputStream getInputStream();
+
+    /**
+     * Gets an {@link OutputStream} for writing to this artifact. The artifact is created if it does not already exist
+     * and is overwritten if it does. This method is not supported for directory artifacts.
+     * 
+     * @return an {@link OutputStream} for writing to this artifact
+     */
+    OutputStream getOutputStream();
+
+    /**
+     * Returns a list of children entries for this entry. This method is only supported for directory artifacts.
+     * 
+     * @return a list of children entries.
+     */
+    ArtifactFSEntry[] getChildren();
+
+    /**
+     * Returns a new {@link ArtifactFS} that is rooted at this entry
+     * 
+     * @return a new {@link ArtifactFS}
+     */
+    ArtifactFS getArtifactFS();
+
+    /**
+     * Returns <code>true</code> if this entry exists, otherwise <code>false</code>
+     * @return <code>true</code> if this entry exists, otherwise <code>false</code>
+     */
+    boolean exists();
+}
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/fs/ArtifactFSFactory.java b/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/fs/ArtifactFSFactory.java
new file mode 100644
index 0000000..7adf151
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/fs/ArtifactFSFactory.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.artifact.fs;
+
+import java.io.File;
+
+public interface ArtifactFSFactory {
+
+    public abstract ArtifactFS create(File file);
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/fs/StandardArtifactFSFactory.java b/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/fs/StandardArtifactFSFactory.java
new file mode 100644
index 0000000..9cbfc73
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/fs/StandardArtifactFSFactory.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.artifact.fs;
+
+import java.io.File;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Locale;
+
+import org.eclipse.virgo.kernel.artifact.fs.internal.DirectoryArtifactFS;
+import org.eclipse.virgo.kernel.artifact.fs.internal.FileArtifactFS;
+import org.eclipse.virgo.kernel.artifact.fs.internal.JarFileArtifactFS;
+
+
+public final class StandardArtifactFSFactory implements ArtifactFSFactory {
+    
+    private static final List<String> JAR_EXTENSIONS = Arrays.asList("jar", "war");
+
+    /**
+     * {@inheritDoc}
+     */
+    public ArtifactFS create(File file) {
+        if (file.isDirectory()) {
+            return new DirectoryArtifactFS(file);
+        }
+        return looksLikeAJar(file.getName()) ? new JarFileArtifactFS(file) : new FileArtifactFS(file);
+    }
+    
+    private boolean looksLikeAJar(String name) {
+        String fileName = name.toLowerCase(Locale.ENGLISH);
+
+        int dotLocation = fileName.lastIndexOf('.');
+        if (dotLocation == -1) {
+            return false;
+        }
+        return JAR_EXTENSIONS.contains(fileName.substring(dotLocation + 1));
+    }
+
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/fs/internal/DirectoryArtifactFS.java b/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/fs/internal/DirectoryArtifactFS.java
new file mode 100644
index 0000000..15c1973
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/fs/internal/DirectoryArtifactFS.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.artifact.fs.internal;
+
+import java.io.File;
+
+import org.eclipse.virgo.kernel.artifact.fs.ArtifactFS;
+import org.eclipse.virgo.kernel.artifact.fs.ArtifactFSEntry;
+
+
+/**
+ * An implementation of {@link ArtifactFS} that represents a directory on the filesystem
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+public final class DirectoryArtifactFS implements ArtifactFS {
+
+    private final File root;
+
+    public DirectoryArtifactFS(File root) {
+        if (root.exists() && !root.isDirectory()) {
+            throw new IllegalArgumentException(String.format("File '%s' must be a directory", root.getAbsolutePath()));
+        }
+        this.root = root;
+    }
+
+    public ArtifactFSEntry getEntry(String name) {
+        return new FileArtifactFSEntry(this.root, new File(root, name));
+    }
+
+    public File getFile() {
+        return this.root;
+    }
+
+    @Override
+    public String toString() {
+        return this.root.getAbsolutePath();
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/fs/internal/FileArtifactFS.java b/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/fs/internal/FileArtifactFS.java
new file mode 100644
index 0000000..5641faf
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/fs/internal/FileArtifactFS.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.artifact.fs.internal;
+
+import java.io.File;
+
+import org.eclipse.virgo.kernel.artifact.fs.ArtifactFS;
+import org.eclipse.virgo.kernel.artifact.fs.ArtifactFSEntry;
+import org.eclipse.virgo.util.common.StringUtils;
+
+/**
+ * An implementation of {@link ArtifactFS} that represents a single file. This implementation will only allow a call to
+ * {@link #getEntry(String)} with a <code>null</code> value. A call with this argument returns an entry that matches
+ * this single element.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+public class FileArtifactFS implements ArtifactFS {
+
+    private final File file;
+
+    public FileArtifactFS(File file) {
+        if (file.isDirectory()) {
+            throw new IllegalArgumentException(String.format("This ArtifactFS cannot be created for '%s' as it is a directory",
+                file.getAbsolutePath()));
+        }
+        this.file = file;
+    }
+
+    public ArtifactFSEntry getEntry(String name) {
+        if (StringUtils.hasText(name)) {
+            throw new IllegalArgumentException(
+                "This ArtifactFS represents a single static file.  Requesting any entry other than null or \"\" is unsupported");
+        }
+
+        return new FileArtifactFSEntry(this.file.getParentFile(), this.file);
+    }
+
+    public final File getFile() {
+        return this.file;
+    }
+
+    @Override
+    public String toString() {
+        return this.file.getAbsolutePath();
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/fs/internal/FileArtifactFSEntry.java b/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/fs/internal/FileArtifactFSEntry.java
new file mode 100644
index 0000000..e6eaf9e
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/fs/internal/FileArtifactFSEntry.java
@@ -0,0 +1,124 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.artifact.fs.internal;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.virgo.kernel.artifact.fs.ArtifactFS;
+import org.eclipse.virgo.kernel.artifact.fs.ArtifactFSEntry;
+import org.eclipse.virgo.kernel.artifact.fs.ArtifactFSFactory;
+import org.eclipse.virgo.kernel.artifact.fs.StandardArtifactFSFactory;
+import org.eclipse.virgo.util.io.FileSystemUtils;
+import org.eclipse.virgo.util.io.PathReference;
+
+final class FileArtifactFSEntry implements ArtifactFSEntry {
+
+    private final ArtifactFSFactory artifactFSFactory = new StandardArtifactFSFactory();
+
+    private final File root;
+
+    private final File file;
+
+    public FileArtifactFSEntry(File root, File file) {
+        this.root = root;
+        this.file = file;
+    }
+
+    public boolean delete() {
+        return new PathReference(this.file).delete(true);
+    }
+
+    public ArtifactFSEntry[] getChildren() {
+        List<ArtifactFSEntry> children = new ArrayList<ArtifactFSEntry>();
+        if (this.file.isDirectory()) {
+            for (File child : FileSystemUtils.listFiles(this.file)) {
+                children.add(new FileArtifactFSEntry(this.root, child));
+            }
+        }
+        return children.toArray(new ArtifactFSEntry[children.size()]);
+    }
+
+    public InputStream getInputStream() {
+        if (!this.file.exists()) {
+            throw new UnsupportedOperationException(String.format("Cannot open an input stream for '%s' as it does not exist",
+                this.file.getAbsolutePath()));
+        }
+
+        if (this.file.isDirectory()) {
+            throw new UnsupportedOperationException(String.format("Cannot open an input stream for '%s' as it is a directory",
+                this.file.getAbsolutePath()));
+        }
+
+        try {
+            return new FileInputStream(this.file);
+        } catch (FileNotFoundException e) {
+            throw new IllegalStateException(String.format("Unable to open an input stream for '%s'", this.file.getAbsolutePath()), e);
+        }
+    }
+
+    public String getPath() {
+        String relativePath = this.file.getAbsolutePath().substring(this.root.getAbsolutePath().length());
+        if (relativePath.startsWith("/") || relativePath.startsWith("\\")) {
+            return relativePath.substring(1);
+        }
+        return relativePath;
+
+    }
+
+    public String getName() {
+        return this.file.getName();
+    }
+
+    public OutputStream getOutputStream() {
+        if (this.file.exists()) {
+            if (this.file.isDirectory()) {
+                throw new UnsupportedOperationException(String.format("Cannot open an ouput stream for '%s' as it is a directory",
+                    this.file.getAbsolutePath()));
+            }
+        } else {
+            File parentDir = this.file.getParentFile();
+            if (!parentDir.exists() && !parentDir.mkdirs()) {
+                throw new IllegalStateException("Failed to create directory " + parentDir + " prior to creating stream for " + this.file);
+            }
+        }
+
+        try {
+            return new FileOutputStream(this.file);
+        } catch (FileNotFoundException e) {
+            throw new IllegalStateException(String.format("Unable to open an output stream for '%s'", this.file.getAbsolutePath()), e);
+        }
+    }
+
+    public boolean isDirectory() {
+        return this.file.isDirectory();
+    }
+
+    public String toString() {
+        return this.file.getAbsolutePath();
+    }
+
+    public ArtifactFS getArtifactFS() {
+        return this.artifactFSFactory.create(this.file);
+    }
+
+    public boolean exists() {
+        return this.file.exists();
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/fs/internal/JarFileArtifactFS.java b/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/fs/internal/JarFileArtifactFS.java
new file mode 100644
index 0000000..bf02169
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/fs/internal/JarFileArtifactFS.java
@@ -0,0 +1,52 @@
+/*
+ * This file is part of the Eclipse Virgo project.
+ *
+ * Copyright (c) 2012 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    VMware Inc. - initial contribution
+ */
+
+package org.eclipse.virgo.kernel.artifact.fs.internal;
+
+import java.io.File;
+
+import org.eclipse.virgo.kernel.artifact.fs.ArtifactFS;
+import org.eclipse.virgo.kernel.artifact.fs.ArtifactFSEntry;
+import org.eclipse.virgo.util.common.StringUtils;
+
+/**
+ * {@link JarFileArtifactFS} is an {@link ArtifactFS} implementation for JAR files.
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread safe
+ */
+public final class JarFileArtifactFS extends FileArtifactFS implements ArtifactFS {
+
+    /**
+     * Constructs a new {@link JarFileArtifactFS} for the given file which is assumed to be in JAR format.
+     * 
+     * @param file a JAR file
+     */
+    public JarFileArtifactFS(File file) {
+        super(file);
+    }
+
+    /**
+     * {@InheritDoc}
+     */
+    @Override
+    public ArtifactFSEntry getEntry(String name) {
+        if (!StringUtils.hasText(name)) {
+            return super.getEntry(name);
+        } else {
+            return new JarFileArtifactFSEntry(getFile(), name);
+        }
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/fs/internal/JarFileArtifactFSEntry.java b/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/fs/internal/JarFileArtifactFSEntry.java
new file mode 100644
index 0000000..5f4866d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/fs/internal/JarFileArtifactFSEntry.java
@@ -0,0 +1,311 @@
+/*
+ * This file is part of the Eclipse Virgo project.
+ *
+ * Copyright (c) 2012 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    VMware Inc. - initial contribution
+ */
+
+package org.eclipse.virgo.kernel.artifact.fs.internal;
+
+import java.io.BufferedInputStream;
+import java.io.Closeable;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+
+import org.eclipse.virgo.kernel.artifact.fs.ArtifactFS;
+import org.eclipse.virgo.kernel.artifact.fs.ArtifactFSEntry;
+
+/**
+ * {@link JarFileArtifactFSEntry} is an {@link ArtifactFSEntry} implementation for JAR file entries.
+ * <p/>
+ * The implementation uses ZipInputStream specifically to avoid JarFile's caching behaviour, inherited from that of
+ * ZipFile. See the note on caching in http://java.sun.com/developer/technicalArticles/Programming/compression/
+ * JarFile's caching behaviour is unsuitable as it produces incorrect results when a JAR file is replaced with a new
+ * version since the cache returns entries from the old version.
+ * <p/>
+ * The implementation handles missing directory entries by simulating them. Although this does not faithfully reflect
+ * the structure of a JAR with a missing directory entry, it is more robust for callers who may not expect, or test
+ * with, such JARs.
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread safe
+ */
+final class JarFileArtifactFSEntry implements ArtifactFSEntry {
+
+    private final File file;
+
+    private final String entryName;
+
+    /**
+     * Constructs a new {@link JarFileArtifactFSEntry} for the given file which is assumed to be in JAR format and the
+     * given entry name.
+     * 
+     * @param file a JAR file
+     * @param entryName the name of an entry
+     * @throws IOException if the entry cannot be created
+     */
+    JarFileArtifactFSEntry(File file, String entryName) {
+        this.file = file;
+        this.entryName = entryName;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getPath() {
+        return this.entryName;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getName() {
+        String filePath = removeTrailingSlash();
+        int lastDir = filePath.lastIndexOf("/");
+        return filePath.substring(lastDir + 1);
+    }
+
+    private String removeTrailingSlash() {
+        return this.entryName.endsWith("/") ? this.entryName.substring(0, this.entryName.length() - 1) : this.entryName;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean delete() {
+        throw new UnsupportedOperationException("This ArtifactFSEntry is a member of a JAR file. Deleting it is unsupported");
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isDirectory() {
+        ZipEntry zipEntry = findZipEntry();
+        if (zipEntry != null) {
+            return zipEntry.isDirectory();
+        } else {
+            return hasChildren();
+        }
+    }
+
+    private ZipEntry findZipEntry() {
+        JarFileScanner scanner = new JarFileScanner();
+        try {
+            ZipEntry entry = scanner.getNextEntry();
+            while (entry != null) {
+                if (this.entryName.equals(entry.getName())) {
+                    return entry;
+                }
+                entry = scanner.getNextEntry();
+            }
+            return null;
+        } finally {
+            scanner.close();
+        }
+    }
+
+    // This method copes with non-existent entries.
+    private boolean hasChildren() {
+        boolean hasChildren = false;
+        if (this.entryName.endsWith("/")) {
+            JarFileScanner scanner = new JarFileScanner();
+            try {
+                ZipEntry entry = scanner.getNextEntry();
+                while (entry != null) {
+                    String name = entry.getName();
+                    if (name != null && name.startsWith(this.entryName)) {
+                        hasChildren = true;
+                        break;
+                    }
+                    entry = scanner.getNextEntry();
+                }
+            } finally {
+                scanner.close();
+            }
+        }
+        return hasChildren;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @SuppressWarnings("resource")
+	public InputStream getInputStream() {
+        JarFileScanner scanner = new JarFileScanner();
+        ZipEntry entry = scanner.getNextEntry();
+        while (entry != null && !this.entryName.equals(entry.getName())) {
+            entry = scanner.getNextEntry();
+        }
+
+        if (entry == null) {
+            scanner.close();
+            throw new UnsupportedOperationException("Cannot open an input stream for a non-existent entry");
+        }
+
+        if (entry.isDirectory()) {
+            scanner.close();
+            throw new UnsupportedOperationException("Cannot open an input stream for a directory");
+        }
+        return scanner.getZipInputStream();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public OutputStream getOutputStream() {
+        throw new UnsupportedOperationException("This ArtifactFSEntry is a member of a JAR file. Writing it is unsupported");
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public ArtifactFSEntry[] getChildren() {
+        if (!isDirectory()) {
+            throw new UnsupportedOperationException("Cannot get children of a non-directory entry");
+        }
+        Set<ArtifactFSEntry> children = new HashSet<ArtifactFSEntry>();
+        if (exists()) {
+            JarFileScanner scanner = new JarFileScanner();
+            try {
+                ZipEntry entry = scanner.getNextEntry();
+                while (entry != null) {
+                    String childEntry = entry.getName();
+                    if (childEntry.length() > this.entryName.length() && childEntry.startsWith(this.entryName)) {
+                        children.add(createChildEntry(childEntry));
+                        // Ensure missing parents of this child are added.
+                        addParentDirectories(childEntry, children);
+                    }
+                    entry = scanner.getNextEntry();
+                }
+            } finally {
+                scanner.close();
+            }
+        }
+        return children.toArray(new ArtifactFSEntry[children.size()]);
+    }
+
+    public JarFileArtifactFSEntry createChildEntry(String childEntryName) {
+        return new JarFileArtifactFSEntry(this.file, childEntryName);
+    }
+
+    // Precondition: childEntry.length() > this.entryName.length() && childEntry.startsWith(this.entryName)
+    private void addParentDirectories(String childEntry, Set<ArtifactFSEntry> children) {
+        int l = this.entryName.length();
+        String childPath = childEntry.substring(l);
+        String[] childPathComponents = childPath.split("/");
+        String parentPath = this.entryName;
+        for (int parent = 0; parent < childPathComponents.length - 1; parent++) {
+            parentPath = parentPath + childPathComponents[parent]+ "/";
+            children.add(createChildEntry(parentPath));
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public ArtifactFS getArtifactFS() {
+        throw new UnsupportedOperationException("getArtifactFS method not supported by JarFileArtifactFSEntry");
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean exists() {
+        if (findZipEntry() != null) {
+            return true;
+        } else {
+            return hasChildren();
+        }
+    }
+
+    private class JarFileScanner implements Closeable {
+
+        private final ZipInputStream zipInputStream;
+
+        public JarFileScanner() {
+            InputStream is = null;
+            try {
+                is = new BufferedInputStream(new FileInputStream(file));
+            } catch (FileNotFoundException ignored) {
+            }
+            this.zipInputStream = is == null ? null : new ZipInputStream(is);
+        }
+
+        public ZipEntry getNextEntry() {
+            if (this.zipInputStream != null) {
+                try {
+                    return this.zipInputStream.getNextEntry();
+                } catch (IOException ignored) {
+                }
+            }
+            return null;
+        }
+
+        public ZipInputStream getZipInputStream() {
+            return this.zipInputStream;
+        }
+
+        public void close() {
+            if (this.zipInputStream != null) {
+                try {
+                    this.zipInputStream.close();
+                } catch (IOException e) {
+                    throw new RuntimeException(e);
+                }
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((entryName == null) ? 0 : entryName.hashCode());
+        result = prime * result + ((file == null) ? 0 : file.hashCode());
+        return result;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (!(obj instanceof JarFileArtifactFSEntry))
+            return false;
+        JarFileArtifactFSEntry other = (JarFileArtifactFSEntry) obj;
+        if (entryName == null) {
+            if (other.entryName != null)
+                return false;
+        } else if (!entryName.equals(other.entryName))
+            return false;
+        if (file == null) {
+            if (other.file != null)
+                return false;
+        } else if (!file.equals(other.file))
+            return false;
+        return true;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/internal/BundleManifestUtils.java b/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/internal/BundleManifestUtils.java
new file mode 100644
index 0000000..eda378b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/internal/BundleManifestUtils.java
@@ -0,0 +1,107 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.artifact.internal;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.util.jar.JarFile;
+
+import org.eclipse.virgo.kernel.artifact.fs.ArtifactFS;
+import org.eclipse.virgo.kernel.artifact.fs.ArtifactFSEntry;
+import org.eclipse.virgo.kernel.artifact.fs.internal.JarFileArtifactFS;
+import org.eclipse.virgo.util.io.FileCopyUtils;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifestFactory;
+
+/**
+ * Utility methods for working with {@link BundleManifest BundleManifests}.
+ * 
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ * 
+ */
+public final class BundleManifestUtils {
+
+    /**
+     * Reads the <code>BundleManifest</code> from the supplied <code>file</code>. The <code>File</code> can either be a
+     * file, i.e. a jar archive, or a directory. If the file is an archive its manifest will only be read if its name
+     * ends with one of the supplied <code>archiveSuffixes</code>
+     * 
+     * @param file The file from which the manifest is to be read.
+     * @param archiveSuffixes The suffixes with which an archive's file name must end
+     * @return The <code>BundleManifest</code> from the file or <code>null</code> if one was not found.
+     * @throws IOException Thrown if a manifest is detected but the reading of it fails.
+     * @throws SecurityException Thrown if a manifest is detected but the reading of it fails because of signature
+     *         checks (invalid signature file digest...)
+     */
+    public static BundleManifest readBundleManifest(File file, String... archiveSuffixes) throws IOException, SecurityException {
+        String fileName = file.getName();
+
+        Reader reader = null;
+
+        if (file.isDirectory()) {
+            File manifestFile = new File(file, JarFile.MANIFEST_NAME);
+            if (manifestFile.exists()) {
+                reader = manifestReaderFromFile(manifestFile);
+            }
+        } else {
+            for (String suffix : archiveSuffixes) {
+                if (fileName.endsWith(suffix)) {
+                    reader = manifestReaderFromJar(file);
+                }
+            }
+        }
+
+        if (reader != null) {
+            return BundleManifestFactory.createBundleManifest(reader);
+        } else {
+            return null;
+        }
+    }
+
+    private static Reader manifestReaderFromJar(File file) throws IOException, SecurityException {
+        if (!file.exists()) {
+            throw new IOException("File '" + file + "' not found");
+        }
+        ArtifactFS fs = new JarFileArtifactFS(file);
+        ArtifactFSEntry fsEntry = fs.getEntry(JarFile.MANIFEST_NAME);
+        if (fsEntry == null || !fsEntry.exists()) {
+            return null; // not an error -- no manifest means this isn't a bundle
+        }
+        StringWriter writer = new StringWriter();
+        InputStream inputStream = fsEntry.getInputStream();
+		FileCopyUtils.copy(new InputStreamReader(inputStream, UTF_8), writer);
+		inputStream.close();
+        return new StringReader(writer.toString());
+    }
+
+    private static Reader manifestReaderFromFile(File file) throws IOException {
+        try {
+            StringWriter writer = new StringWriter();
+            FileCopyUtils.copy(new InputStreamReader(new FileInputStream(file), UTF_8), writer);
+            return new StringReader(writer.toString());
+        } catch (IOException ioe) {
+            throw new IOException("Failed to create reader for manifest file.", ioe);
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/library/LibraryBridge.java b/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/library/LibraryBridge.java
new file mode 100644
index 0000000..284e1e4
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/library/LibraryBridge.java
@@ -0,0 +1,214 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.artifact.library;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map.Entry;
+
+import org.eclipse.virgo.kernel.artifact.library.internal.ArtifactDescriptorLibraryDefinition;
+import org.eclipse.virgo.repository.ArtifactBridge;
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+import org.eclipse.virgo.repository.ArtifactGenerationException;
+import org.eclipse.virgo.repository.HashGenerator;
+import org.eclipse.virgo.repository.builder.ArtifactDescriptorBuilder;
+import org.eclipse.virgo.repository.builder.AttributeBuilder;
+import org.eclipse.virgo.util.common.CaseInsensitiveMap;
+import org.eclipse.virgo.util.common.StringUtils;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifestFactory;
+import org.eclipse.virgo.util.osgi.manifest.ImportedBundle;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderDeclaration;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderParserFactory;
+import org.eclipse.virgo.util.parser.manifest.ManifestContents;
+import org.eclipse.virgo.util.parser.manifest.ManifestParser;
+import org.eclipse.virgo.util.parser.manifest.RecoveringManifestParser;
+import org.osgi.framework.Version;
+
+public class LibraryBridge implements ArtifactBridge {
+
+    public static final String LIBRARY_VERSION = "Library-Version";
+
+    public static final String LIBRARY_SYMBOLICNAME = "Library-SymbolicName";
+
+    public static final String IMPORT_BUNDLE = "Import-Bundle";
+
+    public static final String LIBRARY_NAME = "Library-Name";
+
+    public static final String LIBRARY_DESCRIPTION = "Library-Description";
+
+    private static final String LIBRARY_DESCRIPTOR_SUFFIX = ".libd";
+
+    private static final String DEFAULT_LIBRARY_VERSION = "0";
+
+    public static final String RAW_HEADER_PREFIX = "RAW_HEADER:";
+
+    private static final String VERSION_ATTRIBUTE = "version";
+
+    private static final String RESOLUTION_DIRECTIVE = "resolution";
+
+    private static final String IMPORT_SCOPE_DIRECTIVE = "import-scope";
+
+    private final HashGenerator hashGenerator;
+
+    public LibraryBridge(HashGenerator hashGenerator) {
+        this.hashGenerator = hashGenerator;
+    }
+
+    public ArtifactDescriptor generateArtifactDescriptor(File artifactFile) throws ArtifactGenerationException {
+
+        if (!artifactFile.getName().endsWith(LIBRARY_DESCRIPTOR_SUFFIX)) {
+            return null;
+        }
+
+        ManifestContents manifestContents;
+
+        try {
+            manifestContents = getManifestContents(artifactFile);
+        } catch (IOException ie) {
+            throw new ArtifactGenerationException("Unable to read library definition", LibraryDefinition.LIBRARY_TYPE, ie);
+        }
+
+        CaseInsensitiveMap<String> contentsMap = new CaseInsensitiveMap<String>();
+        contentsMap.putAll(manifestContents.getMainAttributes());
+
+        ArtifactDescriptorBuilder builder = new ArtifactDescriptorBuilder();
+        builder.setUri(artifactFile.toURI());
+        builder.setType(LibraryDefinition.LIBRARY_TYPE);
+
+        String name = createAttributeFromLibrarySymbolicName(contentsMap, artifactFile, builder);
+        builder.setName(name);
+
+        Version version = createAttributeFromLibraryVersion(contentsMap, builder);
+        builder.setVersion(version);
+
+        createAttributesFromImportBundle(contentsMap, artifactFile, builder);
+        createAttributeFromLibraryName(contentsMap, builder);
+        createAttributeFromLibraryDescription(contentsMap, builder);
+
+        createAttributesFromRawHeaders(contentsMap, builder);
+        
+        this.hashGenerator.generateHash(builder, artifactFile);
+
+        return builder.build();
+    }
+
+    private static ManifestContents getManifestContents(File file) throws IOException {
+        ManifestParser manifestParser = new RecoveringManifestParser();
+
+        try (Reader reader = new InputStreamReader(new FileInputStream(file), UTF_8)) {
+            return manifestParser.parse(reader);
+        }
+    }
+
+    private static String createAttributeFromLibrarySymbolicName(CaseInsensitiveMap<String> manifestAttributes, File artifact,
+        ArtifactDescriptorBuilder builder) throws ArtifactGenerationException {
+        String symbolicNameString = getRequiredHeader(LIBRARY_SYMBOLICNAME, manifestAttributes, artifact);
+        HeaderDeclaration symbolicNameDeclaration = HeaderParserFactory.newHeaderParser(null).parseLibrarySymbolicName(symbolicNameString);
+
+        String symbolicName = symbolicNameDeclaration.getNames().get(0);
+
+        AttributeBuilder attBuilder = new AttributeBuilder();
+        attBuilder.setName(LIBRARY_SYMBOLICNAME);
+        attBuilder.setValue(symbolicName);
+
+        builder.addAttribute(attBuilder.build());
+        return symbolicName;
+    }
+
+    private static Version createAttributeFromLibraryVersion(CaseInsensitiveMap<String> manifestAttributes, ArtifactDescriptorBuilder builder) {
+        String versionString = manifestAttributes.get(LIBRARY_VERSION);
+
+        if (!StringUtils.hasText(versionString)) {
+            versionString = DEFAULT_LIBRARY_VERSION;
+        }
+
+        Version version = new Version(versionString);
+
+        builder.addAttribute(new AttributeBuilder().setName(LIBRARY_VERSION).setValue(version.toString()).build());
+        return version;
+    }
+
+    private static void createAttributesFromImportBundle(CaseInsensitiveMap<String> manifestAttributes, File artifact,
+        ArtifactDescriptorBuilder builder) throws ArtifactGenerationException {
+        String importBundleString = getRequiredHeader(IMPORT_BUNDLE, manifestAttributes, artifact);
+        Dictionary<String, String> headers = new Hashtable<String, String>();
+        headers.put(IMPORT_BUNDLE, importBundleString);
+        BundleManifest manifest = BundleManifestFactory.createBundleManifest(headers);
+
+        List<ImportedBundle> importedBundles = manifest.getImportBundle().getImportedBundles();
+
+        for (ImportedBundle importedBundle : importedBundles) {
+            AttributeBuilder attBuilder = new AttributeBuilder();
+            attBuilder.setName(IMPORT_BUNDLE);
+            attBuilder.setValue(importedBundle.getBundleSymbolicName());
+
+            attBuilder.putProperties(RESOLUTION_DIRECTIVE, importedBundle.getResolution().toString().toLowerCase(Locale.ENGLISH));
+            attBuilder.putProperties(VERSION_ATTRIBUTE, importedBundle.getVersion().toParseString());
+            if (importedBundle.isApplicationImportScope()) {
+                attBuilder.putProperties(IMPORT_SCOPE_DIRECTIVE, "application");
+            }
+
+            builder.addAttribute(attBuilder.build());
+        }
+    }
+
+    private static void createAttributeFromLibraryName(CaseInsensitiveMap<String> manifestAttributes, ArtifactDescriptorBuilder builder) {
+        String name = manifestAttributes.get(LIBRARY_NAME);
+        if (name != null) {
+            builder.addAttribute(new AttributeBuilder().setName(LIBRARY_NAME).setValue(name).build());
+        }
+    }
+
+    private static void createAttributeFromLibraryDescription(CaseInsensitiveMap<String> manifestAttributes, ArtifactDescriptorBuilder builder) {
+        String name = manifestAttributes.get(LIBRARY_DESCRIPTION);
+        if (name != null) {
+            builder.addAttribute(new AttributeBuilder().setName(LIBRARY_DESCRIPTION).setValue(name).build());
+        }
+    }
+
+    private static void createAttributesFromRawHeaders(CaseInsensitiveMap<String> manifestAttributes, ArtifactDescriptorBuilder builder) {
+        for (Entry<String, String> entry : manifestAttributes.entrySet()) {
+            builder.addAttribute(new AttributeBuilder().setName(RAW_HEADER_PREFIX + entry.getKey()).setValue(entry.getValue()).build());
+        }
+    }
+
+    private static String getRequiredHeader(String name, CaseInsensitiveMap<String> attrs, File artifactFile) throws ArtifactGenerationException {
+        String value = attrs.get(name);
+        if (value == null || value.trim().length() == 0) {
+            throw new ArtifactGenerationException(String.format("Required attribute '%s' is missing from library descriptor '%s'.", name,
+                artifactFile.getName()), LibraryDefinition.LIBRARY_TYPE);
+        }
+        return value;
+    }
+
+    public static List<ImportedBundle> parseImportBundle(String importBundleString) {
+        Dictionary<String, String> headers = new Hashtable<String, String>();
+        headers.put(IMPORT_BUNDLE, importBundleString);
+        BundleManifest manifest = BundleManifestFactory.createBundleManifest(headers);
+        return manifest.getImportBundle().getImportedBundles();
+    }
+
+    public static LibraryDefinition createLibraryDefinition(ArtifactDescriptor artefact) {
+        return new ArtifactDescriptorLibraryDefinition(artefact);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/library/LibraryDefinition.java b/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/library/LibraryDefinition.java
new file mode 100644
index 0000000..282eba8
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/library/LibraryDefinition.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.artifact.library;
+
+import java.net.URI;
+import java.util.List;
+
+import org.osgi.framework.Version;
+
+import org.eclipse.virgo.util.osgi.manifest.ImportedBundle;
+
+/**
+ * Defines a library that can be installed into the OSGi framework. <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations must be threadsafe.
+ * 
+ */
+public interface LibraryDefinition {
+    
+    public static final String LIBRARY_TYPE = "library";
+
+     /**
+     * Gets the symbolic name of the library.
+     * 
+     * @return the library's symbolic name
+     */
+    String getSymbolicName();
+
+    /**
+     * Gets the description of the library. <p/>
+     * 
+     * May return <code>null</code> if no description is defined.
+     * 
+     * @return the library's description
+     */
+    String getDescription();
+
+    /**
+     * Gets the name of the library.
+     * 
+     * @return the library's name.
+     */
+    String getName();
+    
+    /**
+     * Gets the version of the library.
+     * 
+     * @return the library's version.
+     */
+    Version getVersion();
+
+    /**
+     * Gets the bundles in this library.
+     * 
+     * @return the library's bundles.
+     */
+    List<ImportedBundle> getLibraryBundles();
+    
+    /**
+     * Returns the location of the library
+     * @return the library's location
+     */
+    URI getLocation();
+}
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/library/internal/ArtifactDescriptorLibraryDefinition.java b/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/library/internal/ArtifactDescriptorLibraryDefinition.java
new file mode 100644
index 0000000..ee1789c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/library/internal/ArtifactDescriptorLibraryDefinition.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.artifact.library.internal;
+
+import java.net.URI;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.virgo.kernel.artifact.library.LibraryBridge;
+import org.eclipse.virgo.kernel.artifact.library.LibraryDefinition;
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+import org.eclipse.virgo.repository.Attribute;
+import org.eclipse.virgo.util.osgi.manifest.ImportedBundle;
+import org.osgi.framework.Version;
+
+public final class ArtifactDescriptorLibraryDefinition implements LibraryDefinition {
+
+    private final String description;
+
+    private final String name;
+
+    private final URI location;
+
+    private final Version version;
+
+    private final String symbolicName;
+
+    private final List<ImportedBundle> importedBundles;
+
+    public ArtifactDescriptorLibraryDefinition(ArtifactDescriptor artifactDescriptor) {
+        Set<Attribute> descriptionSet = artifactDescriptor.getAttribute(LibraryBridge.LIBRARY_DESCRIPTION);
+        if (!descriptionSet.isEmpty()) {
+            this.description = descriptionSet.iterator().next().getValue();
+        } else {
+            this.description = null;
+        }
+
+        Set<Attribute> nameSet = artifactDescriptor.getAttribute(LibraryBridge.LIBRARY_NAME);
+        if (!nameSet.isEmpty()) {
+            this.name = nameSet.iterator().next().getValue();
+        } else {
+            this.name = null;
+        }
+
+        this.location = artifactDescriptor.getUri();
+
+        Set<Attribute> versionSet = artifactDescriptor.getAttribute(LibraryBridge.LIBRARY_VERSION);
+        this.version = new Version(versionSet.iterator().next().getValue());
+
+        Set<Attribute> symbolicNameSet = artifactDescriptor.getAttribute(LibraryBridge.LIBRARY_SYMBOLICNAME);
+        Attribute symbolicNameAttribute = symbolicNameSet.iterator().next();
+
+        this.symbolicName = symbolicNameAttribute.getValue();
+       
+        String importBundleHeader = artifactDescriptor.getAttribute(LibraryBridge.RAW_HEADER_PREFIX + LibraryBridge.IMPORT_BUNDLE).iterator().next().getValue();
+
+        this.importedBundles = LibraryBridge.parseImportBundle(importBundleHeader);
+    }
+
+    public String getDescription() {
+        return this.description;
+    }
+
+    public List<ImportedBundle> getLibraryBundles() {
+        return this.importedBundles;
+    }
+
+    public String getName() {
+        return this.name;
+    }
+
+    public String getSymbolicName() {
+        return this.symbolicName;
+    }
+
+    public Version getVersion() {
+        return this.version;
+    }
+
+    public URI getLocation() {
+        return this.location;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/par/ParBridge.java b/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/par/ParBridge.java
new file mode 100644
index 0000000..d3f145a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/par/ParBridge.java
@@ -0,0 +1,150 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.artifact.par;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.eclipse.virgo.kernel.artifact.internal.BundleManifestUtils;
+import org.eclipse.virgo.repository.ArtifactBridge;
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+import org.eclipse.virgo.repository.ArtifactGenerationException;
+import org.eclipse.virgo.repository.HashGenerator;
+import org.eclipse.virgo.repository.builder.ArtifactDescriptorBuilder;
+import org.eclipse.virgo.repository.builder.AttributeBuilder;
+import org.eclipse.virgo.util.common.StringUtils;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+import org.osgi.framework.Version;
+
+/**
+ * An <code>ArtifactBridge</code> for PAR files.
+ *
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Thread-safe.
+ *
+ */
+public final class ParBridge implements ArtifactBridge {
+
+    private static final String SYMBOLIC_NAME_REGEX = "[-_0-9a-zA-Z]+(\\.[-_0-9a-zA-Z]+)*";
+
+    private static final String HEADER_APPLICATION_SYMBOLIC_NAME = "Application-SymbolicName";
+
+    private static final String HEADER_APPLICATION_NAME = "Application-Name";
+
+    private static final String HEADER_APPLICATION_DESCRIPTION = "Application-Description";
+
+    private static final String HEADER_APPLICATION_VERSION = "Application-Version";
+
+    public static final String BRIDGE_TYPE = "par";
+
+    public static final String PAR_SUFFIX = ".par";
+
+    private final HashGenerator hashGenerator;
+
+    public ParBridge(HashGenerator hashGenerator) {
+        this.hashGenerator = hashGenerator;
+    }
+
+    public ArtifactDescriptor generateArtifactDescriptor(File artifactFile) throws ArtifactGenerationException {
+
+        BundleManifest manifest;
+
+        try {
+            manifest = BundleManifestUtils.readBundleManifest(artifactFile, PAR_SUFFIX);
+        } catch (IOException ioe) {
+            throw new ArtifactGenerationException("Failed to read manifest from " + artifactFile, ioe);
+        }
+
+        if (manifest != null) {
+            return createDescriptorFromManifest(manifest, artifactFile);
+        } else {
+            return createDescriptorFromFile(artifactFile);
+        }
+    }
+
+    private ArtifactDescriptor createDescriptorFromFile(File artifactFile) throws ArtifactGenerationException {
+        String fileName = artifactFile.getName();
+
+        if (fileName.endsWith(PAR_SUFFIX)) {
+            String symbolicName = fileName.substring(0, fileName.length() - PAR_SUFFIX.length());
+
+            ArtifactDescriptorBuilder builder = new ArtifactDescriptorBuilder();
+            builder.setType(BRIDGE_TYPE).setName(symbolicName).setVersion(Version.emptyVersion).setUri(artifactFile.toURI());
+
+            this.hashGenerator.generateHash(builder, artifactFile);
+
+            return builder.build();
+        }
+
+        return null;
+    }
+
+    private ArtifactDescriptor createDescriptorFromManifest(BundleManifest manifest, File artifactFile) throws ArtifactGenerationException {
+
+        String symbolicName = getApplicationSymbolicName(manifest);
+
+        if (symbolicName == null) {
+            return null;
+        }
+
+        Version version = getApplicationVersion(manifest);
+
+        ArtifactDescriptorBuilder builder = new ArtifactDescriptorBuilder();
+        builder.setType(BRIDGE_TYPE).setName(symbolicName).setVersion(version).setUri(artifactFile.toURI());
+
+        applyAttributeIfPresent(HEADER_APPLICATION_NAME, manifest, builder);
+        applyAttributeIfPresent(HEADER_APPLICATION_DESCRIPTION, manifest, builder);
+
+        this.hashGenerator.generateHash(builder, artifactFile);
+
+        return builder.build();
+    }
+
+    private void applyAttributeIfPresent(String headerName, BundleManifest manifest, ArtifactDescriptorBuilder builder) {
+        String headerValue = manifest.getHeader(headerName);
+        if (headerValue != null) {
+            AttributeBuilder attributeBuilder = new AttributeBuilder();
+            builder.addAttribute(attributeBuilder.setName(headerName).setValue(headerValue).build());
+        }
+    }
+
+    private Version getApplicationVersion(BundleManifest manifest) {
+        String versionString = manifest.getHeader(HEADER_APPLICATION_VERSION);
+        Version version;
+
+        if (!StringUtils.hasText(versionString)) {
+            version = Version.emptyVersion;
+        } else {
+            try {
+                version = new Version(versionString);
+            } catch (IllegalArgumentException iae) {
+                throw new IllegalArgumentException("Version '" + versionString + "' is ill-formed", iae);
+            }
+        }
+        return version;
+    }
+
+    private String getApplicationSymbolicName(BundleManifest manifest) throws ArtifactGenerationException {
+        String symbolicName = manifest.getHeader(HEADER_APPLICATION_SYMBOLIC_NAME);
+
+        if (!StringUtils.hasText(symbolicName)) {
+            return null;
+        }
+        if (!symbolicName.matches(SYMBOLIC_NAME_REGEX)) {
+            throw new ArtifactGenerationException(HEADER_APPLICATION_SYMBOLIC_NAME + " '" + symbolicName + "' contains illegal characters");
+        }
+        return symbolicName;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/plan/PlanBridge.java b/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/plan/PlanBridge.java
new file mode 100644
index 0000000..48ca429
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/plan/PlanBridge.java
@@ -0,0 +1,115 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.artifact.plan;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.util.List;
+
+import org.eclipse.virgo.kernel.artifact.ArtifactSpecification;
+import org.eclipse.virgo.repository.ArtifactBridge;
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+import org.eclipse.virgo.repository.ArtifactGenerationException;
+import org.eclipse.virgo.repository.HashGenerator;
+import org.eclipse.virgo.repository.builder.ArtifactDescriptorBuilder;
+import org.eclipse.virgo.repository.builder.AttributeBuilder;
+import org.eclipse.virgo.util.io.IOUtils;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+
+/**
+ * An {@link ArtifactBridge} that reads and parses a .plan file.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+public class PlanBridge implements ArtifactBridge {
+
+    public static final String BRIDGE_TYPE = "plan";
+
+    private final PlanReader reader = new PlanReader();
+
+    private static final String SCOPED = "scoped";
+
+    private static final String ATOMIC = "atomic";
+    
+    private static final String PROVISIONING = "provisioning";
+
+    private static final String ARTIFACT = "artifact";
+
+    private static final String TYPE = "type";
+
+    private static final String NAME = "name";
+
+    private static final String VERSION = "version";
+
+    private final HashGenerator hashGenerator;
+
+    public PlanBridge(HashGenerator hashGenerator) {
+        this.hashGenerator = hashGenerator;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public ArtifactDescriptor generateArtifactDescriptor(File artifactFile) throws ArtifactGenerationException {
+        if (!artifactFile.getPath().endsWith(".plan")) {
+            return null;
+        }
+
+        PlanDescriptor plan;
+        FileInputStream in = null;
+        try {
+            in = new FileInputStream(artifactFile);
+            plan = reader.read(in);
+        } catch (Exception e) {
+            throw new ArtifactGenerationException("Failed to read plan descriptor", BRIDGE_TYPE, e);
+        } finally {
+            IOUtils.closeQuietly(in);
+        }
+
+        return parsePlan(plan, artifactFile);
+    }
+
+    private ArtifactDescriptor parsePlan(PlanDescriptor plan, File artifactFile) {
+        ArtifactDescriptorBuilder builder = new ArtifactDescriptorBuilder();
+        builder.setUri(artifactFile.toURI());
+        builder.setType(BRIDGE_TYPE);
+        builder.setName(plan.getName());
+        builder.setVersion(plan.getVersion());
+
+        builder.addAttribute(new AttributeBuilder().setName(SCOPED).setValue(Boolean.toString(plan.getScoped())).build());
+        builder.addAttribute(new AttributeBuilder().setName(ATOMIC).setValue(Boolean.toString(plan.getAtomic())).build());
+        builder.addAttribute(new AttributeBuilder().setName(PROVISIONING).setValue(plan.getProvisioning().toString()).build());
+
+        parseArtifacts(plan.getArtifactSpecifications(), builder);
+        
+        this.hashGenerator.generateHash(builder, artifactFile);
+
+        return builder.build();
+    }
+
+    private void parseArtifacts(List<ArtifactSpecification> artifacts, ArtifactDescriptorBuilder builder) {
+        for (ArtifactSpecification artifact : artifacts) {
+            AttributeBuilder attributeBuilder = new AttributeBuilder();
+            attributeBuilder.setName(ARTIFACT);
+            attributeBuilder.setValue("");
+            attributeBuilder.putProperties(TYPE, artifact.getType());
+            attributeBuilder.putProperties(NAME, artifact.getName());
+            VersionRange versionRange = artifact.getVersionRange();
+            attributeBuilder.putProperties(VERSION, versionRange == null ? "" : versionRange.toParseString());
+            builder.addAttribute(attributeBuilder.build());
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/plan/PlanDescriptor.java b/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/plan/PlanDescriptor.java
new file mode 100644
index 0000000..30c13d9
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/plan/PlanDescriptor.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.artifact.plan;
+
+import java.util.List;
+
+import org.eclipse.virgo.kernel.artifact.ArtifactSpecification;
+import org.osgi.framework.Version;
+
+/**
+ * {@link PlanDescriptor} is a parsed form of a plan file.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread safe.
+ */
+public final class PlanDescriptor {
+
+    public enum Provisioning {
+        INHERIT, AUTO, DISABLED;
+
+        /** 
+         * {@inheritDoc}
+         */
+        @Override
+        public String toString() {
+            return this == INHERIT ? "inherit" : this == AUTO ? "auto" : "disabled";
+        }
+    }
+
+    private final String name;
+
+    private final Version version;
+
+    private final boolean scoped;
+
+    private final boolean atomic;
+
+    private final Provisioning provisioning;
+
+    private final List<ArtifactSpecification> artifactSpecifications;
+
+    public PlanDescriptor(String name, Version version, boolean scoped, boolean atomic, Provisioning provisioning,
+        List<ArtifactSpecification> artifactSpecifications) {
+        this.name = name;
+        this.version = version;
+        this.scoped = scoped;
+        this.atomic = atomic;
+        this.provisioning = provisioning;
+        this.artifactSpecifications = artifactSpecifications;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public Version getVersion() {
+        return version;
+    }
+
+    public boolean getScoped() {
+        return scoped;
+    }
+
+    public boolean getAtomic() {
+        return atomic;
+    }
+
+    public Provisioning getProvisioning() {
+        return provisioning;
+    }
+
+    public List<ArtifactSpecification> getArtifactSpecifications() {
+        return artifactSpecifications;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/plan/PlanReader.java b/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/plan/PlanReader.java
new file mode 100644
index 0000000..828211b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/plan/PlanReader.java
@@ -0,0 +1,217 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.artifact.plan;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.osgi.framework.Version;
+import org.slf4j.LoggerFactory;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+import org.eclipse.virgo.kernel.artifact.ArtifactSpecification;
+import org.eclipse.virgo.kernel.artifact.plan.PlanDescriptor.Provisioning;
+import org.eclipse.virgo.kernel.artifact.plan.internal.PlanReaderEntityResolver;
+import org.eclipse.virgo.kernel.artifact.plan.internal.PlanReaderErrorHandler;
+import org.eclipse.virgo.util.common.PropertyPlaceholderResolver;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+
+/**
+ * A reader that takes a URI and transforms it into a {@link PlanDescriptor} metadata artifact
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+public final class PlanReader {
+
+    private static final String TYPE_ATTRIBUTE = "type";
+
+    private static final String NAME_ATTRIBUTE = "name";
+
+    private static final String VERSION_ATTRIBUTE = "version";
+
+    private static final String URI_ATTRIBUTE = "uri";
+
+    private static final String SCOPED_ATTRIBUTE = "scoped";
+
+    private static final String ATOMIC_ATTRIBUTE = "atomic";
+
+    private static final String PROVISIONING_INHERIT_ATTRIBUTE = "inherit";
+
+    private static final String PROVISIONING_AUTO_ATTRIBUTE = "auto";
+
+    private static final String PROVISIONING_DISABLED_ATTRIBUTE = "disabled";
+
+    private static final String ARTIFACT_ELEMENT = "artifact";
+
+    private static final String ATTRIBUTE_ELEMENT = "attribute";
+
+    private static final String PROPERTY_ELEMENT = "property";
+
+    private static final String VALUE_ATTRIBUTE = "value";
+
+    private static final String SCHEMA_LANGUAGE_ATTRIBUTE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage";
+
+    private static final String XSD_SCHEMA_LANGUAGE = "http://www.w3.org/2001/XMLSchema";
+
+    private final PropertyPlaceholderResolver resolver = new PropertyPlaceholderResolver();
+
+    /**
+     * Creates a {@link PlanDescriptor} meta-data artifact from an {@link InputStream}
+     * 
+     * @param inputStream from which the plan is to be read
+     * @return The plan descriptor (meta-data) from the input stream
+     */
+    public PlanDescriptor read(InputStream inputStream) {
+        try {
+            Document doc = readDocument(inputStream);
+            Element element = doc.getDocumentElement();
+            return parsePlanElement(element);
+        } catch (Exception e) {
+            throw new RuntimeException("Failed to read plan descriptor", e);
+        }
+    }
+
+    private Document readDocument(InputStream inputStream) throws ParserConfigurationException, SAXException, IOException {
+        DocumentBuilder builder = createDocumentBuilderFactory().newDocumentBuilder();
+        builder.setEntityResolver(new PlanReaderEntityResolver());
+        builder.setErrorHandler(new PlanReaderErrorHandler(LoggerFactory.getLogger(PlanBridge.class)));
+        return builder.parse(inputStream);
+    }
+
+    private DocumentBuilderFactory createDocumentBuilderFactory() {
+        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+        factory.setValidating(true);
+        factory.setNamespaceAware(true);
+        factory.setAttribute(SCHEMA_LANGUAGE_ATTRIBUTE, XSD_SCHEMA_LANGUAGE);
+        return factory;
+    }
+
+    private PlanDescriptor parsePlanElement(Element element) {
+        String name = element.getAttribute(NAME_ATTRIBUTE);
+        Version version = new Version(element.getAttribute(VERSION_ATTRIBUTE));
+        boolean scoped = Boolean.parseBoolean(element.getAttribute(SCOPED_ATTRIBUTE));
+        boolean atomic = Boolean.parseBoolean(element.getAttribute(ATOMIC_ATTRIBUTE));
+        Provisioning dependencies = parseProvisioningAttribute(element);
+
+        Properties attributes = parseAttributes(element);
+
+        List<ArtifactSpecification> artifactSpecifications = parseArtifactElements(element.getElementsByTagName(ARTIFACT_ELEMENT), attributes);
+
+        return new PlanDescriptor(name, version, scoped, atomic, dependencies, artifactSpecifications);
+    }
+
+    private Provisioning parseProvisioningAttribute(Element element) {
+        String provisioningAttribute = element.getAttribute("provisioning");
+        Provisioning provisioning;
+        if (isEmpty(provisioningAttribute) || PROVISIONING_INHERIT_ATTRIBUTE.equals(provisioningAttribute)) {
+            provisioning = Provisioning.INHERIT;
+        } else if (PROVISIONING_AUTO_ATTRIBUTE.equals(provisioningAttribute)) {
+            provisioning = Provisioning.AUTO;
+        } else if (PROVISIONING_DISABLED_ATTRIBUTE.equals(provisioningAttribute)) {
+            provisioning = Provisioning.DISABLED;
+        } else {
+            throw new IllegalArgumentException("Invalid provisioning value '" + provisioningAttribute + "'");
+        }
+        return provisioning;
+    }
+
+    private Properties parseAttributes(Element element) {
+        Properties result = new Properties();
+        NodeList attributeElements = element.getElementsByTagName(ATTRIBUTE_ELEMENT);
+        for (int x = 0; x < attributeElements.getLength(); x++) {
+            Element attribute = (Element) attributeElements.item(x);
+
+            String name = attribute.getAttribute(NAME_ATTRIBUTE);
+            String value = attribute.getAttribute(VALUE_ATTRIBUTE);
+
+            result.put(name, value);
+        }
+        return result;
+    }
+
+    private List<ArtifactSpecification> parseArtifactElements(NodeList artifactElements, Properties attributes) {
+        List<ArtifactSpecification> artifactSpecifications = new ArrayList<ArtifactSpecification>(artifactElements.getLength());
+        for (int i = 0; i < artifactElements.getLength(); i++) {
+            Element artifactElement = (Element) artifactElements.item(i);
+
+            String type = replacePlaceholders(artifactElement.getAttribute(TYPE_ATTRIBUTE), attributes);
+            String name = replacePlaceholders(artifactElement.getAttribute(NAME_ATTRIBUTE), attributes);
+            String version = replacePlaceholders(artifactElement.getAttribute(VERSION_ATTRIBUTE), attributes);
+            String uri = replacePlaceholders(artifactElement.getAttribute(URI_ATTRIBUTE), attributes);
+            Map<String, String> properties = parseArtifactProperties(artifactElement, attributes);
+            artifactSpecifications.add(buildArtifactSpecification(type, name, version, uri, properties));
+        }
+
+        return artifactSpecifications;
+    }
+
+    private ArtifactSpecification buildArtifactSpecification(String type, String name, String version, String uriString, Map<String, String> properties) {
+        if (isEmpty(uriString)) {
+            return new ArtifactSpecification(type, name, new VersionRange(version), properties);
+        } else {
+            URI uri;
+            try {
+                uri = new URI(uriString);
+            } catch (URISyntaxException e) {
+                throw new IllegalArgumentException("Invalid URI in plan artifact specification", e);
+            }
+            if (!isEmpty(type)) {
+                throw new IllegalArgumentException("Plan artifact may not specify both URI (" + uriString + ") and type (" + type + ")");
+            }
+            if (!isEmpty(name)) {
+                throw new IllegalArgumentException("Plan artifact may not specify both URI (" + uriString + ") and name (" + name + ")");
+            }
+            if (!isEmpty(version)) {
+                throw new IllegalArgumentException("Plan artifact may not specify both URI (" + uriString + ") and version (" + version + ")");
+            }
+            return new ArtifactSpecification(uri, properties);
+        }
+    }
+
+    private static boolean isEmpty(String string) {
+        return "".equals(string);
+    }
+
+    private Map<String, String> parseArtifactProperties(Element artifactElement, Properties attributes) {
+        Map<String, String> result = new HashMap<String, String>();
+        NodeList propertyElements = artifactElement.getElementsByTagName(PROPERTY_ELEMENT);
+        for (int x = 0; x < propertyElements.getLength(); x++) {
+            Element propertyElement = (Element) propertyElements.item(x);
+            String name = replacePlaceholders(propertyElement.getAttribute(NAME_ATTRIBUTE), attributes);
+            String value = replacePlaceholders(propertyElement.getAttribute(VALUE_ATTRIBUTE), attributes);
+            result.put(name, value);
+        }
+        return result;
+    }
+
+    private String replacePlaceholders(String value, Properties attributes) {
+        return this.resolver.resolve(value, attributes);
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/plan/internal/PlanReaderEntityResolver.java b/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/plan/internal/PlanReaderEntityResolver.java
new file mode 100644
index 0000000..0243358
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/plan/internal/PlanReaderEntityResolver.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.artifact.plan.internal;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.osgi.framework.FrameworkUtil;
+import org.xml.sax.EntityResolver;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+public final class PlanReaderEntityResolver implements EntityResolver {
+
+    private static final String DMS_INDICATOR = "springsource-dm-server";
+
+    private static final String SCHEMA_LOCATION = "org/eclipse/virgo/kernel/artifact/plan/eclipse-virgo-plan.xsd";
+    
+    private static final String DMS_SCHEMA_LOCATION = "org/eclipse/virgo/kernel/artifact/plan/springsource-dm-server-plan.xsd";
+
+    public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {
+        ClassLoader classLoader = this.getClass().getClassLoader();
+        boolean dmsSystemId = systemId != null && systemId.contains(DMS_INDICATOR);
+        InputStream xsdResource = classLoader.getResourceAsStream(dmsSystemId ? DMS_SCHEMA_LOCATION : SCHEMA_LOCATION);
+        if (xsdResource != null) {
+            InputSource source = new InputSource(xsdResource);
+            source.setPublicId(publicId);
+            source.setSystemId(systemId);        
+            return source;
+        } else {
+            throw new SAXException("Plan XSD could not be loaded from bundle " + FrameworkUtil.getBundle(getClass()));
+        }
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/plan/internal/PlanReaderErrorHandler.java b/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/plan/internal/PlanReaderErrorHandler.java
new file mode 100644
index 0000000..576df23
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/plan/internal/PlanReaderErrorHandler.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.artifact.plan.internal;
+
+import org.slf4j.Logger;
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+
+public final class PlanReaderErrorHandler implements ErrorHandler {
+
+    private final Logger logger;
+
+    public PlanReaderErrorHandler(Logger logger) {
+        this.logger = logger;
+    }
+
+    public void error(SAXParseException exception) throws SAXException {
+        throw exception;
+    }
+
+    public void fatalError(SAXParseException exception) throws SAXException {
+        throw exception;
+    }
+
+    public void warning(SAXParseException exception) throws SAXException {
+        logger.warn("Ignored XML validation warning", exception);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/properties/PropertiesBridge.java b/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/properties/PropertiesBridge.java
new file mode 100644
index 0000000..6991ce7
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/main/java/org/eclipse/virgo/kernel/artifact/properties/PropertiesBridge.java
@@ -0,0 +1,125 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.artifact.properties;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.util.Properties;
+
+import org.eclipse.virgo.repository.ArtifactBridge;
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+import org.eclipse.virgo.repository.ArtifactGenerationException;
+import org.eclipse.virgo.repository.HashGenerator;
+import org.eclipse.virgo.repository.builder.ArtifactDescriptorBuilder;
+import org.eclipse.virgo.repository.builder.AttributeBuilder;
+import org.eclipse.virgo.util.common.StringUtils;
+import org.eclipse.virgo.util.io.IOUtils;
+import org.osgi.framework.Constants;
+import org.osgi.framework.Version;
+import org.osgi.service.cm.ConfigurationAdmin;
+
+/**
+ * An {@link ArtifactBridge} that creates {@link ArtifactDescriptor ArtifactDescriptors} for .properties files.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe
+ * 
+ */
+public final class PropertiesBridge implements ArtifactBridge {
+
+    static final String PROPERTIES_SUFFIX = ".properties";
+
+    static final String ARTIFACT_TYPE = "configuration";
+
+    private final HashGenerator hashGenerator;
+
+    private final ConfigurationAdmin configAdmin;
+
+    public PropertiesBridge(HashGenerator hashGenerator, ConfigurationAdmin configAdmin) {
+        this.hashGenerator = hashGenerator;
+        this.configAdmin = configAdmin;
+    }
+
+    public ArtifactDescriptor generateArtifactDescriptor(File artifactFile) throws ArtifactGenerationException {
+        if (artifactFile.getName().endsWith(PROPERTIES_SUFFIX)) {
+            Reader reader = null;
+            try {
+                reader = new InputStreamReader(new FileInputStream(artifactFile), UTF_8);
+                Properties properties = new Properties();
+                properties.load(reader);
+                return createArtifactDescriptor(artifactFile, properties);
+            } catch (IOException e) {
+                throw new ArtifactGenerationException("Failed processing properties file", ARTIFACT_TYPE, e);
+            } finally {
+                IOUtils.closeQuietly(reader);
+            }
+        }
+        return null;
+    }
+
+    private ArtifactDescriptor createArtifactDescriptor(File propertiesFile, Properties properties) throws IOException {
+
+        String name = properties.getProperty(ConfigurationAdmin.SERVICE_FACTORYPID);
+        if (StringUtils.hasText(name)) {
+            // this is a factory configuration - need to generate actual PID for a new configuration
+            return buildForManagedServiceFactoryConfiguration(propertiesFile, name, properties);
+        }
+
+        name = properties.getProperty(Constants.SERVICE_PID);
+        if (!StringUtils.hasText(name)) {
+            String fileName = propertiesFile.getName();
+            name = fileName.substring(0, fileName.length() - PROPERTIES_SUFFIX.length());
+        }
+
+        return buildAtrifactDescriptor(propertiesFile, name).build();
+    }
+
+    /**
+     * @param propertiesFile
+     * @param name
+     * @param properties
+     * @return
+     * @throws IOException
+     */
+    private ArtifactDescriptor buildForManagedServiceFactoryConfiguration(File propertiesFile, String factoryPid, Properties properties)
+        throws IOException {
+
+        // generated service.pid - will use as a name for artifactId
+        String pid = configAdmin.createFactoryConfiguration(factoryPid, null).getPid();
+
+        ArtifactDescriptorBuilder builder = buildAtrifactDescriptor(propertiesFile, pid);
+        builder.addAttribute(new AttributeBuilder().setName(ConfigurationAdmin.SERVICE_FACTORYPID).setValue(factoryPid).build());
+
+        return builder.build();
+    }
+
+    private ArtifactDescriptorBuilder buildAtrifactDescriptor(File propertiesFile, String name) {
+        ArtifactDescriptorBuilder artifactDescriptorBuilder = new ArtifactDescriptorBuilder();
+
+        artifactDescriptorBuilder //
+        .setUri(propertiesFile.toURI()) //
+        .setType(ARTIFACT_TYPE) //
+        .setName(name) //
+        .setVersion(Version.emptyVersion);
+
+        this.hashGenerator.generateHash(artifactDescriptorBuilder, propertiesFile);
+
+        return artifactDescriptorBuilder;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/main/resources/org/eclipse/virgo/kernel/artifact/plan/eclipse-virgo-plan.xsd b/kernel/org.eclipse.virgo.kernel.artifact/src/main/resources/org/eclipse/virgo/kernel/artifact/plan/eclipse-virgo-plan.xsd
new file mode 100644
index 0000000..26989f0
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/main/resources/org/eclipse/virgo/kernel/artifact/plan/eclipse-virgo-plan.xsd
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema
+		xmlns="http://www.w3.org/2001/XMLSchema"
+		xmlns:plan="http://www.eclipse.org/virgo/schema/plan"
+		targetNamespace="http://www.eclipse.org/virgo/schema/plan"
+		elementFormDefault="qualified">
+
+<!-- Types -->
+	<complexType name="nameValueType">
+		<attribute name="name" type="string" use="required" >
+			<annotation>
+				<documentation><![CDATA[The name of the attribute/property.]]></documentation>
+			</annotation>
+		</attribute>
+		<attribute name="value" type="string" use="required" >
+			<annotation>
+				<documentation><![CDATA[The value of the attribute/property.]]></documentation>
+			</annotation>
+		</attribute>
+	</complexType>
+	
+	<complexType name="attributesType">
+		<sequence minOccurs="1" maxOccurs="unbounded">
+			<element name="attribute" type="plan:nameValueType">
+				<annotation>
+					<documentation><![CDATA[An attribute for replacement in the plan.]]></documentation>
+				</annotation>
+			</element>
+		</sequence>
+	</complexType>
+	
+	<complexType name="artifactType">
+		<sequence minOccurs="0" maxOccurs="unbounded">
+			<element name="property" type="plan:nameValueType">
+				<annotation>
+					<documentation>
+						<![CDATA[Defines a property for the enclosing artifact. Properties are interpreted in an artifact-specific manner.]]>
+					</documentation>
+				</annotation>
+			</element>
+		</sequence>
+        <attribute name="type" type="string" use="optional" >
+			<annotation>
+				<documentation><![CDATA[The type of the artifact. This must be specifed if and only if uri is not specified.]]></documentation>
+			</annotation>
+		</attribute>
+		<attribute name="name" type="string" use="optional" >
+			<annotation>
+				<documentation><![CDATA[The name of the artifact. This must be specifed if and only if uri is not specified.]]></documentation>
+			</annotation>
+		</attribute>
+		<attribute name="uri" type="string" use="optional" >
+			<annotation>
+				<documentation><![CDATA[The absolute file URI of the artifact. This attribute is optional and when not specified will result in the repository being searched for the artifact.]]></documentation>
+			</annotation>
+		</attribute>
+		<attribute name="version" type="string" use="optional">
+            <annotation>
+            	<documentation><![CDATA[The version or version range for this artifact.
+This version or version number must meet the OSGi version specification. This attribute is optional and when neither it nor uri is specified will result in a default value of "0" meaning 0 to infinity in OSGi.]]></documentation>
+            </annotation>
+		</attribute>
+	</complexType>
+
+	<complexType name="plan">
+		<sequence minOccurs="1" maxOccurs="1">
+			<sequence minOccurs="0" maxOccurs="1">
+				<element name="attributes" type="plan:attributesType">
+					<annotation>
+						<documentation><![CDATA[The attributes for this plan]]></documentation>
+					</annotation>
+				</element>
+			</sequence>
+	        <sequence minOccurs="1" maxOccurs="unbounded">
+				<element name="artifact" type="plan:artifactType">
+					<annotation>
+						<documentation><![CDATA[An artifact to include as part of this plan.]]></documentation>
+					</annotation>
+				</element>
+			</sequence>
+		</sequence>
+		<attribute name="name" type="string" use="required">
+			<annotation>
+				<documentation><![CDATA[The name of this plan.
+This is one component of the unique identifier for this plan along with a type of 'plan' and a specified version.]]></documentation>
+			</annotation>
+		</attribute>
+		<attribute name="version" use="required">
+            <annotation>
+            	<documentation><![CDATA[The version of this plan.
+This version must meet the OSGi version specification. This is one component of the unique identifier for this plan along with a type of 'plan' and a specified name.]]></documentation>
+            </annotation>
+            <simpleType>
+				<restriction base="string">
+					<pattern value="\d+(\.\d+(\.\d+(\.([\w_-])+)?)?)?"/>
+				</restriction>
+			</simpleType>
+		</attribute>
+		<attribute name="scoped" type="boolean" use="required">
+            <annotation>
+            	<documentation><![CDATA[Whether or not the artifacts in the plan should be installed into a plan-specific scope. When scoping is disabled, the artifacts are deployed into the global scope and are available for access by all other artifacts.]]></documentation>
+            </annotation>
+		</attribute>
+		<attribute name="atomic" type="boolean" use="required" >
+			<annotation>
+				<documentation><![CDATA[Whether the lifecycle of the artifacts in the plan should be tied together. Making a plan atomic means that install, start, stop and uninstall events for a single artifact in the plan will be escalated to all artifacts in the plan. Also, in an atomic plan, Virgo prevents artifacts from being in inconsistent states. For example, if one artifact should fail to start, then Virgo will stop all artifacts in the plan.]]></documentation>
+			</annotation>
+		</attribute>
+		<attribute name="provisioning" type="string" default="inherit" >
+			<annotation>
+				<documentation><![CDATA[Specifies whether Virgo installs bundles from the repository to attempt to satisfy any missing dependencies in the plan. A value of 'auto' instructs Virgo to install bundles from the repository to attempt to satisfy any missing dependencies in the plan. This is known as 'auto-provisioning'. A value of 'disabled' prevents Virgo from installing bundles from the repository to attempt to satisfy any missing	dependencies in the plan. A value of 'inherit', which is the default if no value is specified, inherits the parent plan's provisioning behaviour. If the plan does not have a parent, it inherits Virgo's auto-provisioning behaviour.]]></documentation>
+			</annotation>
+		</attribute>
+	</complexType>
+
+<!-- Elements -->
+	<element name="plan" type="plan:plan">
+		<annotation>
+			<documentation><![CDATA[Plans are a way to group bundles, and other artifacts, together as a single logical unit in Virgo. Within a plan, bundles and services can be placed into a scope that isolates them from the rest of the system. This scoping ensures that the bundles wire to each other and see each other's services in preference to services from outside the scope. Scoping also prevents application code from leaking into the global scope or scope of another application. In addition, a plan can serve as a way to link the lifcycle of a group of bundles together atomically. This atomicity ensures that instal, start, stop, and uninstall events on a single artifact in the plan will be escalated to all artifacts in the plan.]]></documentation>
+		</annotation>
+	</element>
+
+</schema>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/main/resources/org/eclipse/virgo/kernel/artifact/plan/springsource-dm-server-plan.xsd b/kernel/org.eclipse.virgo.kernel.artifact/src/main/resources/org/eclipse/virgo/kernel/artifact/plan/springsource-dm-server-plan.xsd
new file mode 100644
index 0000000..06454af
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/main/resources/org/eclipse/virgo/kernel/artifact/plan/springsource-dm-server-plan.xsd
@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema
+		xmlns="http://www.w3.org/2001/XMLSchema"
+		xmlns:plan="http://www.springsource.org/schema/dm-server/plan"
+		targetNamespace="http://www.springsource.org/schema/dm-server/plan"
+		elementFormDefault="qualified">
+
+<!-- Types -->
+	<complexType name="nameValueType">
+		<attribute name="name" type="string" use="required" >
+			<annotation>
+				<documentation><![CDATA[The name of the attribute/property.]]></documentation>
+			</annotation>
+		</attribute>
+		<attribute name="value" type="string" use="required" >
+			<annotation>
+				<documentation><![CDATA[The value of the attribute/property.]]></documentation>
+			</annotation>
+		</attribute>
+	</complexType>
+	
+	<complexType name="attributesType">
+		<sequence minOccurs="1" maxOccurs="unbounded">
+			<element name="attribute" type="plan:nameValueType">
+				<annotation>
+					<documentation><![CDATA[An attribute for replacement in the plan.]]></documentation>
+				</annotation>
+			</element>
+		</sequence>
+	</complexType>
+	
+	<complexType name="artifactType">
+		<sequence minOccurs="0" maxOccurs="unbounded">
+			<element name="property" type="plan:nameValueType">
+				<annotation>
+					<documentation>
+						<![CDATA[Defines a property for the enclosing artifact. Properties are interpreted in an artifact-specific manner.]]>
+					</documentation>
+				</annotation>
+			</element>
+		</sequence>
+        <attribute name="type" type="string" use="required" >
+			<annotation>
+				<documentation><![CDATA[The type of the artifact.]]></documentation>
+			</annotation>
+		</attribute>
+		<attribute name="name" type="string" use="required" >
+			<annotation>
+				<documentation><![CDATA[The name of the artifact.]]></documentation>
+			</annotation>
+		</attribute>
+		<attribute name="version" type="string" use="optional" default="0">
+            <annotation>
+            	<documentation><![CDATA[The version or version range for this artifact.
+This version or version number must meet the OSGi version specification. This attribute is optional and when not specified will result in a default value of "0" meaning 0 to infinity in OSGi.]]></documentation>
+            </annotation>
+		</attribute>
+	</complexType>
+
+	<complexType name="plan">
+		<sequence minOccurs="1" maxOccurs="1">
+			<sequence minOccurs="0" maxOccurs="1">
+				<element name="attributes" type="plan:attributesType">
+					<annotation>
+						<documentation><![CDATA[The attributes for this plan]]></documentation>
+					</annotation>
+				</element>
+			</sequence>
+	        <sequence minOccurs="1" maxOccurs="unbounded">
+				<element name="artifact" type="plan:artifactType">
+					<annotation>
+						<documentation><![CDATA[An artifact to include as part of this plan.]]></documentation>
+					</annotation>
+				</element>
+			</sequence>
+		</sequence>
+		<attribute name="name" type="string" use="required">
+			<annotation>
+				<documentation><![CDATA[The name of this plan.
+This is one component of the unique identifier for this plan along with a type of 'plan' and a specified version.]]></documentation>
+			</annotation>
+		</attribute>
+		<attribute name="version" use="required">
+            <annotation>
+            	<documentation><![CDATA[The version of this plan.
+This version must meet the OSGi version specification. This is one component of the unique identifier for this plan along with a type of 'plan' and a specified name.]]></documentation>
+            </annotation>
+            <simpleType>
+				<restriction base="string">
+					<pattern value="\d+(\.\d+(\.\d+(\.([\w_-])+)?)?)?"/>
+				</restriction>
+			</simpleType>
+		</attribute>
+		<attribute name="scoped" type="boolean" use="required">
+            <annotation>
+            	<documentation><![CDATA[Whether or not the artifacts in the plan should be installed into a plan-specific scope. When scoping is disabled, the artifacts are deployed into the global scope and are available for access by all other artifacts.]]></documentation>
+            </annotation>
+		</attribute>
+		<attribute name="atomic" type="boolean" use="required" >
+			<annotation>
+				<documentation><![CDATA[Whether the lifecycle of the artifacts in the plan should be tied together. Making a plan atomic means that install, start, stop and uninstall events for a single artifact in the plan will be escalated to all artifacts in the plan. Also, in an atomic plan, dm Server prevents artifacts from being in inconsistent states. For example, if one artifact should fail to start, then dm Server will stop all artifacts in the plan.]]></documentation>
+			</annotation>
+		</attribute>
+	</complexType>
+
+<!-- Elements -->
+	<element name="plan" type="plan:plan">
+		<annotation>
+			<documentation><![CDATA[Plans are a way to group bundles together as a single logical unit in dm Server. Within a plan, bundles and services can be placed into a scope that isolates them from the rest of the system. This scoping ensures that the bundles wire to each other and see each other's services in preference to services from outside the scope. Scoping also prevents application code from leaking into the global scope or scope of another application. In addition, a plan can serve as a way to link the lifcycle of a group of bundles together atomically. This atomicity ensures that instal, start, stop, and uninstall events on a single artifact in the plan will be escalated to all artifacts in the plan.]]></documentation>
+		</annotation>
+	</element>
+
+</schema>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/ArtifactSpecificationTests.java b/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/ArtifactSpecificationTests.java
new file mode 100644
index 0000000..16c7d4c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/ArtifactSpecificationTests.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.artifact;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.net.URI;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+import org.junit.Test;
+
+public class ArtifactSpecificationTests {
+
+    @Test
+    public void testCreateWithProperties() {
+        Map<String, String> props = new HashMap<String, String>();
+        props.put("foo", "bar");
+        ArtifactSpecification spec = new ArtifactSpecification("t", "n", new VersionRange("1.2.3"), props);
+        assertEquals("bar", spec.getProperties().get("foo"));
+    }
+
+    @Test
+    public void testCreateWithoutProperties() {
+        ArtifactSpecification spec = new ArtifactSpecification("t", "n", new VersionRange("1.2.3"));
+        assertNotNull(spec.getProperties());
+    }
+
+    @Test(expected = UnsupportedOperationException.class)
+    public void testPropertiesImmutable() {
+        Map<String, String> props = new HashMap<String, String>();
+        props.put("foo", "bar");
+        ArtifactSpecification spec = new ArtifactSpecification("t", "n", new VersionRange("1.2.3"), props);
+        spec.getProperties().put("a", "b");
+    }
+
+    @Test(expected = UnsupportedOperationException.class)
+    public void testEmptyPropertiesImmutable() {
+        ArtifactSpecification spec = new ArtifactSpecification("t", "n", new VersionRange("1.2.3"));
+        spec.getProperties().put("foo", "bar");
+    }
+
+    @Test
+    public void testCreateWithUrlAndProperties() throws Exception {
+        Map<String, String> props = new HashMap<String, String>();
+        props.put("foo", "bar");
+        URI uri = new URI("file:x.y");
+        ArtifactSpecification spec = new ArtifactSpecification(uri, props);
+        assertEquals(uri, spec.getUri());
+    }
+
+    @Test
+    public void testCreateWithUrlWithoutProperties() throws Exception {
+        URI uri = new URI("file:x.y");
+        ArtifactSpecification spec = new ArtifactSpecification(uri);
+        assertEquals(uri, spec.getUri());
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/StubHashGenerator.java b/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/StubHashGenerator.java
new file mode 100644
index 0000000..6572b80
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/StubHashGenerator.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.artifact;
+
+import java.io.File;
+
+import org.eclipse.virgo.repository.HashGenerator;
+import org.eclipse.virgo.repository.builder.ArtifactDescriptorBuilder;
+
+public class StubHashGenerator implements HashGenerator {
+
+    public void generateHash(ArtifactDescriptorBuilder artifactDescriptorBuilder, File artifactFile) {
+        // Do nothing
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/bundle/BundleBridgeTests.java b/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/bundle/BundleBridgeTests.java
new file mode 100644
index 0000000..77f2411
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/bundle/BundleBridgeTests.java
@@ -0,0 +1,206 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.artifact.bundle;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Dictionary;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.jar.Attributes;
+import java.util.jar.JarFile;
+
+import org.eclipse.virgo.kernel.artifact.StubHashGenerator;
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+import org.eclipse.virgo.repository.ArtifactGenerationException;
+import org.eclipse.virgo.repository.Attribute;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.osgi.framework.Constants;
+import org.osgi.framework.Version;
+
+/**
+ * <p>
+ * Unit tests for {@link org.eclipse.virgo.kernel.artifact.bundle.BundleBridge BundleBridge}. Uses a combination of real
+ * bundle files and static test data.
+ * </p>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe test case
+ * 
+ */
+public class BundleBridgeTests {
+
+    // Test Data
+
+    private final static String ARTEFACT_ATTRIBUTE_NAME = "name";
+
+    private final static String ARTEFACT_ATTRIBUTE_VERSION = "version";
+
+    // End Test Data
+
+    private static BundleBridge BUNDLE_BRIDGE;
+
+    private static final StubBundleArtefactBridge STUB_ARTEFACT_DEFINITION = new StubBundleArtefactBridge();
+
+    private static final String BUNDLE_MANIFEST_VERSION_HEADER_NAME = "Bundle-ManifestVersion";
+
+    private static final String BUNDLE_NAME_HEADER_NAME = "Bundle-Name";
+
+    @BeforeClass
+    public static void setUp() throws Exception {
+        BUNDLE_BRIDGE = new BundleBridge(new StubHashGenerator());
+    }
+
+    @Test
+    public void testFictionalURI() {
+        File file = new File("foo/bar.jar");
+        try {
+            BUNDLE_BRIDGE.generateArtifactDescriptor(file);
+            assertTrue("Should throw exception", false);
+        } catch (ArtifactGenerationException age) {
+            assertEquals("ArtifactType in exception is incorrect", age.getArtifactType(), BundleBridge.BRIDGE_TYPE);
+        }
+    }
+
+    @Test
+    public void testBadManifest01() {
+        File file = new File("./src/test/resources/wars/testbad01.war"); // contains Erroneous-Data: Bundle-Version
+        try {
+            BUNDLE_BRIDGE.generateArtifactDescriptor(file);
+            assertTrue("Should throw exception", false);
+        } catch (ArtifactGenerationException age) {
+            assertEquals("ArtifactType in exception is incorrect", age.getArtifactType(), BundleBridge.BRIDGE_TYPE);
+        }
+    }
+
+    @Test
+    public void testGenerateArtefact() throws ArtifactGenerationException {
+        File jarsDirectory = new File(
+            System.getProperty("user.home") + "/.gradle/caches/modules-2/files-2.1/org.eclipse.virgo.mirrored/org.apache.commons.dbcp/1.4.0.v201204271417/4378c1a6c057f1e1da2b8287351b288c2c13e6c0/org.apache.commons.dbcp-1.4.0.v201204271417.jar");
+        File directoriesDirectory = new File("./src/test/resources/directories");
+
+        Set<ArtifactDescriptor> artefacts = new HashSet<ArtifactDescriptor>();
+
+        artefacts.add(BUNDLE_BRIDGE.generateArtifactDescriptor(jarsDirectory));
+
+        assertEquals("Wrong number of artefacts have been parsed", 1, artefacts.size());
+
+        artefacts.addAll(generateArtefacts(directoriesDirectory));
+
+        assertEquals("Wrong number of artefacts have been parsed", 2, artefacts.size());
+
+        ArtifactDescriptor stubArtefact;
+        Set<Attribute> stubAttributes;
+        Set<Attribute> testAttributes;
+
+        for (ArtifactDescriptor testArtefact : artefacts) {
+            stubArtefact = STUB_ARTEFACT_DEFINITION.generateArtifactDescriptor(new File(testArtefact.getUri()));
+
+            stubAttributes = stubArtefact.getAttribute(ARTEFACT_ATTRIBUTE_NAME);
+            testAttributes = testArtefact.getAttribute(Constants.BUNDLE_SYMBOLICNAME);
+
+            assertEquals("Error on: " + testArtefact.toString(), stubAttributes.iterator().next().getValue(),
+                testAttributes.iterator().next().getValue());
+
+            stubAttributes = stubArtefact.getAttribute(ARTEFACT_ATTRIBUTE_VERSION);
+            testAttributes = testArtefact.getAttribute(Constants.BUNDLE_VERSION);
+
+            assertEquals("Error on: " + testArtefact.toString(), stubAttributes.iterator().next().getValue(),
+                testAttributes.iterator().next().getValue());
+        }
+    }
+
+    @Test
+    public void testBuildDictionary() throws ArtifactGenerationException, IOException {
+        File testFile = new File(
+            System.getProperty("user.home") + "/.gradle/caches/modules-2/files-2.1/org.eclipse.virgo.mirrored/javax.servlet/3.1.0.v201410161800/e0e698d1be57aaef38e54428f5c09c7fe0cf594e/javax.servlet-3.1.0.v201410161800.jar");
+
+        ArtifactDescriptor inputArtefact = BUNDLE_BRIDGE.generateArtifactDescriptor(testFile);
+
+        Dictionary<String, String> dictionary = BundleBridge.convertToDictionary(inputArtefact);
+
+        JarFile testJar = new JarFile(testFile);
+        Attributes attributes = testJar.getManifest().getMainAttributes();
+
+        testJar.close();
+
+        assertEquals("Failed to match regenerated " + Constants.BUNDLE_SYMBOLICNAME, dictionary.get(Constants.BUNDLE_SYMBOLICNAME),
+            attributes.getValue(Constants.BUNDLE_SYMBOLICNAME));
+        assertEquals("Failed to match regenerated " + Constants.BUNDLE_VERSION, dictionary.get(Constants.BUNDLE_VERSION),
+            attributes.getValue(Constants.BUNDLE_VERSION));
+        assertEquals("Failed to match regenerated " + BUNDLE_MANIFEST_VERSION_HEADER_NAME, dictionary.get(BUNDLE_MANIFEST_VERSION_HEADER_NAME),
+            attributes.getValue(BUNDLE_MANIFEST_VERSION_HEADER_NAME));
+        assertEquals("Failed to match regenerated " + BUNDLE_NAME_HEADER_NAME, dictionary.get(BUNDLE_NAME_HEADER_NAME),
+            attributes.getValue(BUNDLE_NAME_HEADER_NAME));
+
+    }
+
+    @Test
+    public void webBundleWar() throws ArtifactGenerationException {
+        ArtifactDescriptor descriptor = BUNDLE_BRIDGE.generateArtifactDescriptor(new File("src/test/resources/wars/test.war"));
+        assertNotNull(descriptor);
+        assertEquals(BundleBridge.BRIDGE_TYPE, descriptor.getType());
+        assertEquals("com.springsource.server.admin.web", descriptor.getName());
+        assertEquals(new Version(2, 0, 0), descriptor.getVersion());
+    }
+
+    @Test
+    public void explodedBundle() throws ArtifactGenerationException {
+        ArtifactDescriptor descriptor = BUNDLE_BRIDGE.generateArtifactDescriptor(new File("src/test/resources/bundle.jar"));
+        assertNotNull(descriptor);
+        assertEquals(BundleBridge.BRIDGE_TYPE, descriptor.getType());
+        assertEquals("exploded.bundle", descriptor.getName());
+        assertEquals(new Version(1, 0, 0), descriptor.getVersion());
+    }
+
+    @Test
+    public void noSymbolicName() throws ArtifactGenerationException {
+        ArtifactDescriptor descriptor = BUNDLE_BRIDGE.generateArtifactDescriptor(new File("src/test/resources/jars/no-symbolic-name.jar"));
+        assertNotNull(descriptor);
+        assertEquals(BundleBridge.BRIDGE_TYPE, descriptor.getType());
+        assertEquals("no-symbolic-name", descriptor.getName());
+        assertEquals(new Version(0, 0, 0), descriptor.getVersion());
+    }
+
+    @Test
+    public void noManifest() throws ArtifactGenerationException {
+        ArtifactDescriptor descriptor = BUNDLE_BRIDGE.generateArtifactDescriptor(new File("src/test/resources/jars/no-manifest.jar"));
+        assertNotNull(descriptor);
+        assertEquals(BundleBridge.BRIDGE_TYPE, descriptor.getType());
+        assertEquals("no-manifest", descriptor.getName());
+        assertEquals(Version.emptyVersion, descriptor.getVersion());
+    }
+
+    private Set<ArtifactDescriptor> generateArtefacts(File directory) throws ArtifactGenerationException {
+        Set<ArtifactDescriptor> artefacts = new HashSet<ArtifactDescriptor>();
+
+        File[] fileList = directory.listFiles();
+        if (fileList == null) {
+        	throw new IllegalStateException("Failed to list files inside '" + directory + "'.");
+		}
+		for (File fileInDir : fileList) {
+            if (!fileInDir.getName().endsWith(".jar") && !fileInDir.getName().contains("sources")) {
+                ArtifactDescriptor artefact = BUNDLE_BRIDGE.generateArtifactDescriptor(fileInDir);
+                if (artefact != null) {
+                    artefacts.add(BUNDLE_BRIDGE.generateArtifactDescriptor(fileInDir));
+                }
+            }
+        }
+        return artefacts;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/bundle/StubBundleArtefactBridge.java b/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/bundle/StubBundleArtefactBridge.java
new file mode 100644
index 0000000..0e0d445
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/bundle/StubBundleArtefactBridge.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.artifact.bundle;
+
+import java.io.File;
+import java.net.URI;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.virgo.repository.ArtifactBridge;
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+import org.eclipse.virgo.repository.Attribute;
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+import org.eclipse.virgo.repository.internal.StandardAttribute;
+import org.osgi.framework.Version;
+
+/**
+ * <p>
+ * A Stub impl of Artefact Bridge, is pre-configured to return values from the test data set.
+ * </p>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is Threadsafe
+ * 
+ */
+final public class StubBundleArtefactBridge implements ArtifactBridge {
+
+    private final Map<String, RepositoryAwareArtifactDescriptor> testArtefacts = new HashMap<String, RepositoryAwareArtifactDescriptor>();
+
+    public StubBundleArtefactBridge() {
+
+        testArtefacts.put(translate(TEST_FILE_URI), TEST_ARTEFACT);
+        testArtefacts.put(translate(TEST_DIRECTORY_URI), TEST_DIRECTORY_ARTEFACT);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public ArtifactDescriptor generateArtifactDescriptor(File artifact) {
+        return this.testArtefacts.get(artifact.getName());
+    }
+
+    private String translate(URI uri) {
+        return new File(uri).getName();
+    }
+
+    //TEST DATA
+    
+    private static final URI TEST_DIRECTORY_URI = URI.create("file:/src/test/resources/directories/y.different-" + new Version("1.2.3"));
+
+    private static final Set<Attribute> TEST_ATTRIBUTE_SET_DIRECTORY = createAttributeSet("y.different", new Version("1.2.3"), TEST_DIRECTORY_URI);
+
+    private final static RepositoryAwareArtifactDescriptor TEST_DIRECTORY_ARTEFACT = new StubRepositoryAwareArtifactDescriptor(TEST_DIRECTORY_URI, "y.different", new Version("1.2.3"), TEST_ATTRIBUTE_SET_DIRECTORY);
+
+    private final static URI TEST_FILE_URI = new File(System.getProperty("user.home") + "/virgo-build-cache/ivy-cache/repository/org.eclipse.virgo.mirrored/org.apache.commons.dbcp/1.4.0.v201204271417/org.apache.commons.dbcp-1.4.0.v201204271417.jar").toURI();
+
+    private static final Set<Attribute> TEST_ATTRIBUTE_SET = createAttributeSet("org.apache.commons.dbcp", new Version("1.4.0.v201204271417"), TEST_FILE_URI);
+
+    private final static RepositoryAwareArtifactDescriptor TEST_ARTEFACT = new StubRepositoryAwareArtifactDescriptor(TEST_FILE_URI, "org.apache.commons.dbcp", new Version("1.4.0.v201204271417"), TEST_ATTRIBUTE_SET);
+
+    private static Set<Attribute> createAttributeSet(String name, Version version, URI uri) {
+        Set<Attribute> attributes = new HashSet<Attribute>();
+        attributes.add(new StandardAttribute("type", "test"));
+        attributes.add(new StandardAttribute("name", name));
+        attributes.add(new StandardAttribute("version", version.toString()));
+        attributes.add(new StandardAttribute("uri", uri.toString()));
+        return attributes;
+    }
+ 
+}
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/bundle/StubRepositoryAwareArtifactDescriptor.java b/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/bundle/StubRepositoryAwareArtifactDescriptor.java
new file mode 100644
index 0000000..4428981
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/bundle/StubRepositoryAwareArtifactDescriptor.java
@@ -0,0 +1,79 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.artifact.bundle;
+
+import java.io.File;
+import java.net.URI;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.osgi.framework.Version;
+
+import org.eclipse.virgo.repository.Attribute;
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+
+class StubRepositoryAwareArtifactDescriptor implements RepositoryAwareArtifactDescriptor {
+
+    private final URI uri;
+    
+    private final String name;
+    
+    private final Version version;
+    
+    private final Set<Attribute> attributes;
+    
+    public StubRepositoryAwareArtifactDescriptor(URI uri, String name, Version version, Set<Attribute> attributes) {
+        this.uri = uri;
+        this.name  = name;
+        this.version = version;
+        this.attributes = attributes;
+    }
+
+    public Set<Attribute> getAttribute(String name) {
+        Set<Attribute> matchingAttribs = new HashSet<Attribute>();
+        for(Attribute attrib : this.attributes){
+            if(attrib.getKey().equals(name)){
+                matchingAttribs.add(attrib);
+            }
+        }
+        return matchingAttribs;
+    }
+
+    public Set<Attribute> getAttributes() {
+        return this.attributes;
+    }
+
+    public String getFilename() {
+        return new File(this.uri).getName();
+    }
+
+    public String getName() {
+        return this.name;
+    }
+
+    public String getType() {
+        return "test_type";
+    }
+
+    public URI getUri() {
+        return this.uri;
+    }
+
+    public Version getVersion() {
+        return this.version;
+    }
+
+    public String getRepositoryName() {
+        return "test-repo";
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/fs/internal/DirectoryArtifactFSTests.java b/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/fs/internal/DirectoryArtifactFSTests.java
new file mode 100644
index 0000000..3da108b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/fs/internal/DirectoryArtifactFSTests.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.artifact.fs.internal;
+
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+
+import org.eclipse.virgo.kernel.artifact.fs.internal.DirectoryArtifactFS;
+import org.eclipse.virgo.kernel.artifact.fs.internal.FileArtifactFSEntry;
+import org.junit.Test;
+
+
+public class DirectoryArtifactFSTests {
+
+    private final DirectoryArtifactFS artifactFS = new DirectoryArtifactFS(new File("build"));
+
+    @Test
+    public void getEntry() {
+        assertTrue(this.artifactFS.getEntry("test") instanceof FileArtifactFSEntry);
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/fs/internal/FileArtifactFSEntryTests.java b/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/fs/internal/FileArtifactFSEntryTests.java
new file mode 100644
index 0000000..5d61611
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/fs/internal/FileArtifactFSEntryTests.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.artifact.fs.internal;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.File;
+import java.util.jar.JarFile;
+
+import org.eclipse.virgo.kernel.artifact.fs.internal.FileArtifactFSEntry;
+import org.junit.Test;
+
+public class FileArtifactFSEntryTests {
+
+    private final File file;
+
+    public FileArtifactFSEntryTests() throws Exception {
+        this.file = new File("src/test/resources/artifacts/exploded");
+        new FileArtifactFSEntry(this.file, new File(this.file, JarFile.MANIFEST_NAME));
+        new FileArtifactFSEntry(this.file, new File(this.file, "META-INF/"));
+    }
+
+    @Test
+    public void getNameRoot() {
+        assertEquals("", new FileArtifactFSEntry(this.file, this.file).getPath());
+    }
+
+    @Test
+    public void getName() {
+        assertEquals("test", new FileArtifactFSEntry(this.file, new File(this.file, "test")).getPath());
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/fs/internal/FileArtifactFSTests.java b/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/fs/internal/FileArtifactFSTests.java
new file mode 100644
index 0000000..e1d2bc8
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/fs/internal/FileArtifactFSTests.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.artifact.fs.internal;
+
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+
+import org.eclipse.virgo.kernel.artifact.fs.internal.FileArtifactFS;
+import org.eclipse.virgo.kernel.artifact.fs.internal.FileArtifactFSEntry;
+import org.junit.Test;
+
+
+public class FileArtifactFSTests {
+
+    private final FileArtifactFS artifactFS = new FileArtifactFS(new File(".classpath"));
+
+    @Test(expected = IllegalArgumentException.class)
+    public void constructorDirectory() {
+        new FileArtifactFS(new File("build"));
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void getEntryNonNull() {
+        this.artifactFS.getEntry("test");
+    }
+
+    @Test
+    public void getEntry() {
+        assertTrue(this.artifactFS.getEntry(null) instanceof FileArtifactFSEntry);
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/fs/internal/JarFileArtifactFSRefreshTests.java b/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/fs/internal/JarFileArtifactFSRefreshTests.java
new file mode 100644
index 0000000..4328a73
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/fs/internal/JarFileArtifactFSRefreshTests.java
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.artifact.fs.internal;
+
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Scanner;
+
+import org.eclipse.virgo.kernel.artifact.fs.ArtifactFS;
+import org.eclipse.virgo.kernel.artifact.fs.ArtifactFSEntry;
+import org.eclipse.virgo.util.io.PathReference;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Emulate the file manipulations when refreshing a bundle and test that JarFileArtifactFS does not perform
+ * inappropriate caching.
+ */
+public class JarFileArtifactFSRefreshTests {
+
+    private PathReference testModule;
+
+    private PathReference pr;
+
+    @Before
+    public void setUp() throws Exception {
+        this.pr = new PathReference("./build/redeploy-refresh");
+        this.pr.delete(true);
+        this.pr.createDirectory();
+        this.testModule = this.pr.newChild("simple.module.jar");
+    }
+
+    @Test
+    public void testRefresh() throws Exception {
+        PathReference simpleModule = new PathReference("src/test/resources/refresh/simple.module.jar");
+        simpleModule.copy(this.testModule);
+
+        ArtifactFS artifactFS = new JarFileArtifactFS(new PathReference("./build/redeploy-refresh/simple.module.jar").toFile());
+
+        checkBsn(artifactFS, "simple.module");
+        
+        PathReference old = this.pr.newChild("simple.module.jar-past");
+        this.testModule.moveTo(old);
+        new PathReference("src/test/resources/refresh/simple2.module.jar").copy(this.testModule);
+
+        JarFileArtifactFS fs = new JarFileArtifactFS(new PathReference("./build/redeploy-refresh/simple.module.jar").toFile());
+
+        checkBsn(fs, "simple2.module");
+    }
+
+    public void checkBsn(ArtifactFS artifactFS, String bsn) throws IOException {
+        ArtifactFSEntry entry = artifactFS.getEntry("META-INF/MANIFEST.MF");
+        InputStream inputStream = entry.getInputStream();
+        String manifest;
+		try (Scanner scanner = new Scanner(inputStream)) {
+			manifest = scanner.useDelimiter("\\A").next();
+		}
+        assertTrue(manifest.contains(bsn));
+        inputStream.close();
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/fs/internal/JarFileArtifactFSTests.java b/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/fs/internal/JarFileArtifactFSTests.java
new file mode 100644
index 0000000..8d3a26c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/fs/internal/JarFileArtifactFSTests.java
@@ -0,0 +1,273 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.artifact.fs.internal;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Scanner;
+
+import org.eclipse.virgo.kernel.artifact.fs.ArtifactFS;
+import org.eclipse.virgo.kernel.artifact.fs.ArtifactFSEntry;
+import org.junit.Test;
+
+public class JarFileArtifactFSTests {
+
+    private final FileArtifactFS artifactFS = new JarFileArtifactFS(new File("src/test/resources/artifacts/simple.jar"));
+
+    private final FileArtifactFS artifactFSWithMissingEntries = new JarFileArtifactFS(new File(
+        "src/test/resources/artifacts/bundle-with-missing-entries.jar"));
+
+    @Test(expected = IllegalArgumentException.class)
+    public void constructorDirectory() {
+        new JarFileArtifactFS(new File("build"));
+    }
+
+    /**
+     * This usage is not expected, but is tested to ensure predictable behaviour.
+     */
+    @Test
+    public void constructorNonJarFile() {
+        ArtifactFS fileArtifactFS = new JarFileArtifactFS(new File("src/test/resources/properties/foo.properties"));
+        File file = fileArtifactFS.getFile();
+        assertEquals("foo.properties", file.getName());
+        ArtifactFSEntry entry = fileArtifactFS.getEntry("");
+        assertTrue(entry instanceof FileArtifactFSEntry);
+        assertFalse(entry instanceof JarFileArtifactFSEntry);
+        ArtifactFSEntry badEntry = fileArtifactFS.getEntry("blah");
+        assertFalse(badEntry.exists());
+    }
+
+    /**
+     * Just in case manifests are somehow special cased in the implementation.
+     */
+    @Test
+    public void getManifestEntry() {
+        ArtifactFSEntry entry = this.artifactFS.getEntry("META-INF/MANIFEST.MF");
+        InputStream inputStream = entry.getInputStream();
+        try (Scanner scanner = new Scanner(inputStream)) {
+            String manifest = scanner.useDelimiter("\\A").next();
+            assertEquals(
+                "Manifest-Version: 1.0\nCreated-By: 1.6.0_07 (Apple Inc.)\nBundle-Name: test\nBundle-SymbolicName: test\nBundle-Version: 0.0.0\n\n",
+                manifest);
+        }
+        assertEquals("MANIFEST.MF", entry.getName());
+        assertEquals("META-INF/MANIFEST.MF", entry.getPath());
+    }
+
+    @Test
+    public void getNormalEntry() {
+        ArtifactFSEntry entry = this.artifactFS.getEntry("test/rawfile");
+        InputStream inputStream = entry.getInputStream();
+        try (Scanner scanner = new Scanner(inputStream)) {
+            String rawfile = scanner.useDelimiter("\\A").next();
+            assertEquals("rawfile", rawfile);
+        }
+        assertFalse(entry.isDirectory());
+        assertEquals("rawfile", entry.getName());
+        assertEquals("test/rawfile", entry.getPath());
+        assertTrue(entry.exists());
+    }
+
+    @Test(expected = UnsupportedOperationException.class)
+    public void getOutputStream() throws IOException {
+        ArtifactFSEntry entry = this.artifactFS.getEntry("test/rawfile");
+        try (OutputStream dummy = entry.getOutputStream()) {
+        }
+    }
+
+    @Test(expected = UnsupportedOperationException.class)
+    public void delete() {
+        ArtifactFSEntry entry = this.artifactFS.getEntry("test/rawfile");
+        entry.delete();
+    }
+
+    @Test(expected = UnsupportedOperationException.class)
+    public void getEntryArtifactFS() {
+        ArtifactFSEntry entry = this.artifactFS.getEntry("test/rawfile");
+        entry.getArtifactFS();
+    }
+
+    @Test
+    public void getDirectoryEntry() {
+        ArtifactFSEntry entry = this.artifactFS.getEntry("test/");
+        assertTrue(entry.isDirectory());
+        assertEquals("test", entry.getName());
+        assertEquals("test/", entry.getPath());
+        assertTrue(entry.exists());
+    }
+
+    @Test(expected = UnsupportedOperationException.class)
+    public void getDirectoryInputStream() throws IOException {
+        ArtifactFSEntry entry = this.artifactFS.getEntry("test/");
+        try (InputStream dummy = entry.getInputStream()) {
+        }
+    }
+
+    @Test
+    public void getDirectoryChildren() {
+        ArtifactFSEntry entry = this.artifactFS.getEntry("test/");
+        ArtifactFSEntry[] children = entry.getChildren();
+        assertEquals(1, children.length);
+        assertEquals("rawfile", children[0].getName());
+    }
+
+    @Test(expected = UnsupportedOperationException.class)
+    public void getFileChildren() {
+        ArtifactFSEntry entry = this.artifactFS.getEntry("test/rawfile");
+        ArtifactFSEntry[] children = entry.getChildren();
+        assertEquals(0, children.length);
+    }
+
+    @Test(expected = UnsupportedOperationException.class)
+    public void getChildrenOfNonExistentFile() {
+        ArtifactFSEntry entry = this.artifactFS.getEntry("x/nosuch");
+        ArtifactFSEntry[] children = entry.getChildren();
+        assertEquals(0, children.length);
+    }
+
+    @Test
+    public void getPathOfNonExistentFile() {
+        ArtifactFSEntry entry = this.artifactFS.getEntry("x/nosuch");
+        assertEquals("x/nosuch", entry.getPath());
+    }
+
+    @Test
+    public void getNameOfNonExistentFile() {
+        ArtifactFSEntry entry = this.artifactFS.getEntry("x/nosuch");
+        assertEquals("nosuch", entry.getName());
+    }
+
+    @Test
+    public void isDirectoryOfNonExistentFile() {
+        ArtifactFSEntry entry = this.artifactFS.getEntry("x/nosuch");
+        assertFalse(entry.isDirectory());
+    }
+
+    @Test(expected = UnsupportedOperationException.class)
+    public void getInputStreamOfNonExistentFile() throws IOException {
+        ArtifactFSEntry entry = this.artifactFS.getEntry("x/nosuch");
+        try (InputStream dummy = entry.getInputStream()) {
+        }
+    }
+
+    @Test
+    public void getExistenceOfNonExistentFile() {
+        ArtifactFSEntry entry = this.artifactFS.getEntry("x/nosuch");
+        assertFalse(entry.exists());
+    }
+
+    @Test(expected = UnsupportedOperationException.class)
+    public void getChildrenOfNonExistentDirectory() {
+        ArtifactFSEntry entry = this.artifactFS.getEntry("x/nosuch/");
+        ArtifactFSEntry[] children = entry.getChildren();
+        assertEquals(0, children.length);
+    }
+
+    @Test
+    public void getPathOfNonExistentDirectory() {
+        ArtifactFSEntry entry = this.artifactFS.getEntry("x/nosuch/");
+        assertEquals("x/nosuch/", entry.getPath());
+    }
+
+    @Test
+    public void getNameOfNonExistentDirectory() {
+        ArtifactFSEntry entry = this.artifactFS.getEntry("x/nosuch/");
+        assertEquals("nosuch", entry.getName());
+    }
+
+    @Test
+    public void isDirectoryOfNonExistentDirectory() {
+        ArtifactFSEntry entry = this.artifactFS.getEntry("x/nosuch/");
+        assertFalse(entry.isDirectory());
+    }
+
+    @Test(expected = UnsupportedOperationException.class)
+    public void getInputStreamOfNonExistentDirectory() throws IOException {
+        ArtifactFSEntry entry = this.artifactFS.getEntry("x/nosuch/");
+        try (InputStream dummy = entry.getInputStream()) {
+        }
+    }
+
+    @Test
+    public void getExistenceOfNonExistentDirectory() {
+        ArtifactFSEntry entry = this.artifactFS.getEntry("x/nosuch/");
+        assertFalse(entry.exists());
+    }
+
+    @Test
+    public void getEntryNull() {
+        assertTrue(this.artifactFS.getEntry(null) instanceof FileArtifactFSEntry);
+    }
+
+    @Test
+    public void getFile() {
+        File file = this.artifactFS.getFile();
+        assertEquals("simple.jar", file.getName());
+    }
+
+    @Test
+    public void testDirectory() {
+        ArtifactFS artifactFS = new JarFileArtifactFS(new File("src/test/resources/artifacts/bundle.jar"));
+        ArtifactFSEntry dir = artifactFS.getEntry("META-INF/spring/");
+        assertTrue(dir.exists());
+        ArtifactFSEntry[] files = dir.getChildren();
+        assertEquals(1, files.length);
+        ArtifactFSEntry entry = files[0];
+        InputStream inputStream = entry.getInputStream();
+        try (Scanner scanner = new Scanner(inputStream)) {
+            String contents = scanner.useDelimiter("\\A").next();
+            assertTrue(contents.startsWith("<beans xmlns=\"http://www.springframework.org/schema/beans\""));
+        }
+    }
+
+    @Test
+    public void getMissingDirectoryEntry() {
+        ArtifactFSEntry entry = this.artifactFSWithMissingEntries.getEntry("META-INF/spring/");
+        assertTrue(entry.exists());
+        assertTrue(entry.isDirectory());
+    }
+
+    @Test
+    public void getMissingDirectoryEntryName() {
+        ArtifactFSEntry entry = this.artifactFSWithMissingEntries.getEntry("META-INF/spring/");
+        assertEquals("spring", entry.getName());
+        assertEquals("META-INF/spring/", entry.getPath());
+    }
+
+    @Test
+    public void getMissingDirectoryEntryChildren() {
+        ArtifactFSEntry entry = this.artifactFSWithMissingEntries.getEntry("META-INF/spring/");
+        ArtifactFSEntry[] children = entry.getChildren();
+        assertEquals(1, children.length);
+    }
+
+    @Test
+    public void getChildrenIncludingMissingEntry() {
+        ArtifactFSEntry entry = this.artifactFSWithMissingEntries.getEntry("META-INF/");
+        ArtifactFSEntry[] children = entry.getChildren();
+        assertEquals(3, children.length);
+        boolean found = false;
+        for (ArtifactFSEntry artifactFSEntry : children) {
+            if (artifactFSEntry.getPath().equals("META-INF/spring/")) {
+                found = true;
+            }
+        }
+        assertTrue(found);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/library/LibraryBridgeTests.java b/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/library/LibraryBridgeTests.java
new file mode 100644
index 0000000..fdc2bcc
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/library/LibraryBridgeTests.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.artifact.library;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+import java.io.File;
+
+import org.junit.Test;
+
+
+import org.eclipse.virgo.kernel.artifact.StubHashGenerator;
+import org.eclipse.virgo.kernel.artifact.library.LibraryBridge;
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+import org.eclipse.virgo.repository.ArtifactGenerationException;
+
+/**
+ */
+public class LibraryBridgeTests {
+
+    @Test
+    public void testValidLibraryFile() throws ArtifactGenerationException {
+        LibraryBridge bridge = new LibraryBridge(new StubHashGenerator());
+
+        ArtifactDescriptor descriptor = bridge.generateArtifactDescriptor(new File("src/test/resources/libraries/test.libd"));
+        assertNotNull(descriptor);
+
+        assertEquals("test.library", descriptor.getName());
+        assertEquals("1.2.0", descriptor.getAttribute("Library-Version").iterator().next().getValue());
+        assertEquals(3, descriptor.getAttribute("Import-Bundle").size());
+    }
+
+    @Test
+    public void testNotALibraryFile() throws ArtifactGenerationException {
+        LibraryBridge bridge = new LibraryBridge(new StubHashGenerator());
+
+        ArtifactDescriptor descriptor = bridge.generateArtifactDescriptor(new File("src/test/resources/libraries/test.foo"));
+        assertNull(descriptor);
+    }
+
+    @Test(expected = ArtifactGenerationException.class)
+    public void testInvalidLibraryFile() throws ArtifactGenerationException {
+        LibraryBridge bridge = new LibraryBridge(new StubHashGenerator());
+        bridge.generateArtifactDescriptor(new File("src/test/resources/libraries/invalid.libd"));
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/par/ParBridgeTests.java b/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/par/ParBridgeTests.java
new file mode 100644
index 0000000..8a47a35
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/par/ParBridgeTests.java
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.artifact.par;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.File;
+
+import org.junit.Test;
+import org.osgi.framework.Version;
+
+import org.eclipse.virgo.kernel.artifact.StubHashGenerator;
+import org.eclipse.virgo.kernel.artifact.par.ParBridge;
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+import org.eclipse.virgo.repository.ArtifactGenerationException;
+
+public class ParBridgeTests {
+
+    private final ParBridge parBridge = new ParBridge(new StubHashGenerator());
+
+    @Test
+    public void descriptorGeneration() throws ArtifactGenerationException {
+        ArtifactDescriptor descriptor = this.parBridge.generateArtifactDescriptor(new File("src/test/resources/pars/basic.par"));
+        assertDescriptor(descriptor, "par", "basic", new Version(1,2,3), "Basic Par", "A basic PAR file for the unit tests");
+    }
+
+    @Test
+    public void generationWithNoManifest() throws ArtifactGenerationException {
+        ArtifactDescriptor descriptor = this.parBridge.generateArtifactDescriptor(new File("src/test/resources/pars/no-manifest.par"));
+        assertDescriptor(descriptor, "par", "no-manifest", Version.emptyVersion, null, null);
+    }
+
+    @Test
+    public void generationWithNoApplicationSymbolicName() throws ArtifactGenerationException {
+        ArtifactDescriptor descriptor = this.parBridge.generateArtifactDescriptor(new File("src/test/resources/pars/no-asn.par"));
+        assertNull(descriptor);
+    }
+
+    @Test
+    public void generationWithNoApplicationVersion() throws ArtifactGenerationException {
+        ArtifactDescriptor descriptor = this.parBridge.generateArtifactDescriptor(new File("src/test/resources/pars/no-version.par"));
+        assertDescriptor(descriptor, "par", "basic", Version.emptyVersion, "Basic Par", "A basic PAR file for the unit tests");
+    }
+
+    @Test
+    public void generationWithNoName() throws ArtifactGenerationException {
+        ArtifactDescriptor descriptor = this.parBridge.generateArtifactDescriptor(new File("src/test/resources/pars/no-name.par"));
+        assertDescriptor(descriptor, "par", "basic", new Version(1,2,3), null, "A basic PAR file for the unit tests");
+    }
+
+    @Test
+    public void generationWithNoDescription() throws ArtifactGenerationException {
+        ArtifactDescriptor descriptor = this.parBridge.generateArtifactDescriptor(new File("src/test/resources/pars/no-description.par"));
+        assertDescriptor(descriptor, "par", "basic", new Version(1,2,3), "Basic Par", null);
+    }
+
+    @Test
+    public void generationWithIllegalApplicationSymbolicName() throws Exception {
+        try {
+            this.parBridge.generateArtifactDescriptor(new File("src/test/resources/pars/illegal-asn.par"));
+            fail("Illegal Application-SymbolicName did not throw an ArtifactGenerationException");
+        } catch (ArtifactGenerationException age) {
+            assertEquals("Application-SymbolicName '.@$%' contains illegal characters", age.getMessage());
+        }
+    }
+
+    @Test
+    public void generationWithIllegalApplicationVersion() throws Exception {
+        try {
+            this.parBridge.generateArtifactDescriptor(new File("src/test/resources/pars/illegal-version.par"));
+            fail("Illegal Application-Version did not throw an IllegalArgumentException");
+        } catch (IllegalArgumentException iae) {
+            assertEquals("Version 'alpha' is ill-formed", iae.getMessage());
+        }
+    }
+
+    @Test(expected=ArtifactGenerationException.class)
+    public void generationWithMissingPar() throws ArtifactGenerationException {
+        this.parBridge.generateArtifactDescriptor(new File("src/test/resources/pars/not-there.par"));
+    }
+
+    private void assertDescriptor(ArtifactDescriptor descriptor, String type, String symbolicName, Version version, String name, String description) {
+        assertNotNull(descriptor);
+        assertEquals(type, descriptor.getType());
+        assertEquals(symbolicName, descriptor.getName());
+        assertEquals(version, descriptor.getVersion());
+        if (name != null) {
+            assertEquals(name, descriptor.getAttribute("Application-Name").iterator().next().getValue());
+        } else {
+            assertTrue(descriptor.getAttribute("Application-Name").isEmpty());
+        }
+
+        if (description != null) {
+            assertEquals(description, descriptor.getAttribute("Application-Description").iterator().next().getValue());
+        } else {
+            assertTrue(descriptor.getAttribute("Application-Description").isEmpty());
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/plan/DMSPlanBridgeTests.java b/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/plan/DMSPlanBridgeTests.java
new file mode 100644
index 0000000..bfb6fd6
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/plan/DMSPlanBridgeTests.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.artifact.plan;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import java.io.File;
+import java.util.Map;
+import java.util.Set;
+
+import org.junit.Test;
+import org.osgi.framework.Version;
+
+
+import org.eclipse.virgo.kernel.artifact.StubHashGenerator;
+import org.eclipse.virgo.kernel.artifact.plan.PlanBridge;
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+import org.eclipse.virgo.repository.ArtifactGenerationException;
+import org.eclipse.virgo.repository.Attribute;
+
+public class DMSPlanBridgeTests {
+
+    private final PlanBridge bridge = new PlanBridge(new StubHashGenerator());
+
+    @Test(expected = ArtifactGenerationException.class)
+    public void testBadPlanFile() throws ArtifactGenerationException {
+        bridge.generateArtifactDescriptor(new File("src/test/resources/dms-plans/malformed.plan"));
+    }
+
+    @Test()
+    public void testNotAPlanFile() throws ArtifactGenerationException {
+        assertNull(bridge.generateArtifactDescriptor(new File("src/test/resources/dms-plans/not-a-plan.xml")));
+    }
+
+    @Test
+    public void testSingleArtifactPlan() throws ArtifactGenerationException {
+        org.eclipse.virgo.repository.ArtifactDescriptor artefact = bridge.generateArtifactDescriptor(new File(
+            "src/test/resources/dms-plans/single-artifact.plan"));
+        assertEquals("plan", artefact.getType());
+        assertEquals("single-artifact.plan", artefact.getName());
+        assertEquals(new Version(1, 0, 0), artefact.getVersion());
+
+        Set<Attribute> attributes = artefact.getAttribute("artifact");
+        assertEquals(1, attributes.size());
+        Map<String, Set<String>> properties = attributes.iterator().next().getProperties();
+        assertEquals("bundle", getProperty("type", properties));
+        assertEquals("org.springframework.context.support", getProperty("name", properties));
+        assertEquals("[1.0.0, 2.0.0)", getProperty("version", properties));
+    }
+
+    @Test
+    public void testMultiArtifactPlan() throws ArtifactGenerationException {
+        ArtifactDescriptor artefact = bridge.generateArtifactDescriptor(new File("src/test/resources/dms-plans/multi-artifact.plan"));
+        assertEquals("plan", artefact.getType());
+        assertEquals("multi-artifact.plan", artefact.getName());
+        assertEquals(new Version(1, 0, 0), artefact.getVersion());
+
+        Set<Attribute> attributes = artefact.getAttribute("artifact");
+        assertEquals(3, attributes.size());
+        for (Attribute attribute : attributes) {
+            Map<String, Set<String>> properties = attribute.getProperties();
+            String type = getProperty("type", properties);
+            if ("alpha".equals(type)) {
+                assertEquals("org.springframework.core", getProperty("name", properties));
+                assertEquals("0.0.0", getProperty("version", properties));
+            } else if ("bravo".equals(type)) {
+                assertEquals("org.springframework.context", getProperty("name", properties));
+                assertEquals("1.0.0", getProperty("version", properties));
+            } else if ("charlie".equals(type)) {
+                assertEquals("org.springframework.context.support", getProperty("name", properties));
+                assertEquals("[1.0.0, 2.0.0)", getProperty("version", properties));
+            }
+        }
+    }
+
+    private String getProperty(String key, Map<String, Set<String>> properties) {
+        return properties.get(key).iterator().next();
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/plan/DMSPlanReaderTests.java b/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/plan/DMSPlanReaderTests.java
new file mode 100644
index 0000000..17e1783
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/plan/DMSPlanReaderTests.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.artifact.plan;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.util.List;
+
+import org.junit.Test;
+import org.osgi.framework.Version;
+
+import org.eclipse.virgo.kernel.artifact.ArtifactSpecification;
+import org.eclipse.virgo.kernel.artifact.plan.PlanDescriptor;
+import org.eclipse.virgo.kernel.artifact.plan.PlanReader;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+
+public class DMSPlanReaderTests {
+
+    private final PlanReader reader = new PlanReader();
+
+    @Test(expected = RuntimeException.class)
+    public void testBadPlanFile() throws FileNotFoundException {
+        reader.read(new FileInputStream("src/test/resources/dms-plans/malformed.plan"));
+    }
+
+    @Test
+    public void testSingleArtifactPlan() throws FileNotFoundException {
+        PlanDescriptor plan = reader.read(new FileInputStream("src/test/resources/dms-plans/single-artifact.plan"));
+        assertEquals("single-artifact.plan", plan.getName());
+        assertEquals(new Version(1, 0, 0), plan.getVersion());
+
+        List<ArtifactSpecification> artifactSpecifications = plan.getArtifactSpecifications();
+        assertEquals(1, artifactSpecifications.size());
+        ArtifactSpecification artifactSpecification = artifactSpecifications.iterator().next();
+        assertEquals("bundle", artifactSpecification.getType());
+        assertEquals("org.springframework.context.support", artifactSpecification.getName());
+        assertEquals(new VersionRange("[1.0.0, 2.0.0)"), artifactSpecification.getVersionRange());
+        assertNotNull(artifactSpecification.getProperties());
+        assertTrue(artifactSpecification.getProperties().isEmpty());
+    }
+
+    @Test
+    public void testSingleArtifactPlanWithAttributes() throws FileNotFoundException {
+        PlanDescriptor plan = reader.read(new FileInputStream("src/test/resources/dms-plans/attributes.plan"));
+        assertEquals("single-artifact.plan", plan.getName());
+        assertEquals(new Version(1, 0, 0), plan.getVersion());
+
+        List<ArtifactSpecification> artifactSpecifications = plan.getArtifactSpecifications();
+        assertEquals(1, artifactSpecifications.size());
+        ArtifactSpecification artifactSpecification = artifactSpecifications.iterator().next();
+        assertEquals("bundle", artifactSpecification.getType());
+        assertEquals("org.springframework.context.support", artifactSpecification.getName());
+        assertEquals(new VersionRange("[1.0.0, 2.0.0)"), artifactSpecification.getVersionRange());
+    }
+
+    @Test
+    public void testSingleArtifactPlanWithProperties() throws FileNotFoundException {
+        PlanDescriptor plan = reader.read(new FileInputStream("src/test/resources/dms-plans/properties.plan"));
+        assertEquals("properties.plan", plan.getName());
+        assertEquals(new Version(1, 0, 0), plan.getVersion());
+
+        List<ArtifactSpecification> artifactSpecifications = plan.getArtifactSpecifications();
+        assertEquals(1, artifactSpecifications.size());
+        ArtifactSpecification artifactSpecification = artifactSpecifications.iterator().next();
+        assertEquals("bundle", artifactSpecification.getType());
+        assertEquals("my.webapp", artifactSpecification.getName());
+        assertEquals(new VersionRange("[1.0.0, 2.0.0)"), artifactSpecification.getVersionRange());
+        assertEquals("/foo", artifactSpecification.getProperties().get("Web-ContextPath"));
+    }
+
+    @Test
+    public void testMultiArtifactPlan() throws FileNotFoundException {
+        PlanDescriptor plan = reader.read(new FileInputStream("src/test/resources/dms-plans/multi-artifact.plan"));
+        assertEquals("multi-artifact.plan", plan.getName());
+        assertEquals(new Version(1, 0, 0), plan.getVersion());
+
+        List<ArtifactSpecification> artifactSpecifications = plan.getArtifactSpecifications();
+        assertEquals(3, artifactSpecifications.size());
+        for (ArtifactSpecification artifactSpecification : artifactSpecifications) {
+            String type = artifactSpecification.getType();
+            if ("alpha".equals(type)) {
+                assertEquals("org.springframework.core", artifactSpecification.getName());
+                assertEquals(new VersionRange("0"), artifactSpecification.getVersionRange());
+            } else if ("bravo".equals(type)) {
+                assertEquals("org.springframework.context", artifactSpecification.getName());
+                assertEquals(new VersionRange("1.0.0"), artifactSpecification.getVersionRange());
+            } else if ("charlie".equals(type)) {
+                assertEquals("org.springframework.context.support", artifactSpecification.getName());
+                assertEquals(new VersionRange("[1.0.0, 2.0.0)"), artifactSpecification.getVersionRange());
+            }
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/plan/PlanBridgeTests.java b/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/plan/PlanBridgeTests.java
new file mode 100644
index 0000000..1e8fe54
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/plan/PlanBridgeTests.java
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.artifact.plan;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import java.io.File;
+import java.util.Map;
+import java.util.Set;
+
+import org.junit.Test;
+import org.osgi.framework.Version;
+
+
+import org.eclipse.virgo.kernel.artifact.StubHashGenerator;
+import org.eclipse.virgo.kernel.artifact.plan.PlanBridge;
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+import org.eclipse.virgo.repository.ArtifactGenerationException;
+import org.eclipse.virgo.repository.Attribute;
+
+public class PlanBridgeTests {
+
+    private final PlanBridge bridge = new PlanBridge(new StubHashGenerator());
+
+    @Test(expected = ArtifactGenerationException.class)
+    public void testBadPlanFile() throws ArtifactGenerationException {
+        bridge.generateArtifactDescriptor(new File("src/test/resources/plans/malformed.plan"));
+    }
+
+    @Test()
+    public void testNotAPlanFile() throws ArtifactGenerationException {
+        assertNull(bridge.generateArtifactDescriptor(new File("src/test/resources/plans/not-a-plan.xml")));
+    }
+
+    @Test
+    public void testSingleArtifactPlan() throws ArtifactGenerationException {
+        org.eclipse.virgo.repository.ArtifactDescriptor artefact = bridge.generateArtifactDescriptor(new File(
+            "src/test/resources/plans/single-artifact.plan"));
+        assertEquals("plan", artefact.getType());
+        assertEquals("single-artifact.plan", artefact.getName());
+        assertEquals(new Version(1, 0, 0), artefact.getVersion());
+
+        Set<Attribute> attributes = artefact.getAttribute("artifact");
+        assertEquals(1, attributes.size());
+        Map<String, Set<String>> properties = attributes.iterator().next().getProperties();
+        assertEquals("bundle", getProperty("type", properties));
+        assertEquals("org.springframework.context.support", getProperty("name", properties));
+        assertEquals("[1.0.0, 2.0.0)", getProperty("version", properties));
+    }
+
+    @Test
+    public void testMultiArtifactPlan() throws ArtifactGenerationException {
+        ArtifactDescriptor artefact = bridge.generateArtifactDescriptor(new File("src/test/resources/plans/multi-artifact.plan"));
+        assertEquals("plan", artefact.getType());
+        assertEquals("multi-artifact.plan", artefact.getName());
+        assertEquals(new Version(1, 0, 0), artefact.getVersion());
+
+        Set<Attribute> attributes = artefact.getAttribute("artifact");
+        assertEquals(3, attributes.size());
+        for (Attribute attribute : attributes) {
+            Map<String, Set<String>> properties = attribute.getProperties();
+            String type = getProperty("type", properties);
+            if ("alpha".equals(type)) {
+                assertEquals("org.springframework.core", getProperty("name", properties));
+                assertEquals("0.0.0", getProperty("version", properties));
+            } else if ("bravo".equals(type)) {
+                assertEquals("org.springframework.context", getProperty("name", properties));
+                assertEquals("1.0.0", getProperty("version", properties));
+            } else if ("charlie".equals(type)) {
+                assertEquals("org.springframework.context.support", getProperty("name", properties));
+                assertEquals("[1.0.0, 2.0.0)", getProperty("version", properties));
+            }
+        }
+    }
+    
+    @Test
+    public void testProvisioningDisabledPlan() throws ArtifactGenerationException {
+        org.eclipse.virgo.repository.ArtifactDescriptor artefact = bridge.generateArtifactDescriptor(new File(
+            "src/test/resources/plans/provisioning-disabled.plan"));
+        assertEquals("plan", artefact.getType());
+        assertEquals("provisioningdisabled.plan", artefact.getName());
+        assertEquals(new Version(1, 0, 0), artefact.getVersion());
+
+        Set<Attribute> attributes = artefact.getAttribute("provisioning");
+        assertEquals(1, attributes.size());
+        Attribute attribute = attributes.iterator().next();
+        assertEquals("provisioning", attribute.getKey());
+        assertEquals("disabled", attribute.getValue());
+        assertEquals(0, attribute.getProperties().size());
+    }
+
+    private String getProperty(String key, Map<String, Set<String>> properties) {
+        return properties.get(key).iterator().next();
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/plan/PlanReaderTests.java b/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/plan/PlanReaderTests.java
new file mode 100644
index 0000000..f4cbd86
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/plan/PlanReaderTests.java
@@ -0,0 +1,170 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.artifact.plan;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.util.List;
+
+import org.junit.Test;
+import org.osgi.framework.Version;
+
+import org.eclipse.virgo.kernel.artifact.ArtifactSpecification;
+import org.eclipse.virgo.kernel.artifact.plan.PlanDescriptor;
+import org.eclipse.virgo.kernel.artifact.plan.PlanDescriptor.Provisioning;
+import org.eclipse.virgo.kernel.artifact.plan.PlanReader;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+
+public class PlanReaderTests {
+
+    private final PlanReader reader = new PlanReader();
+
+    @Test(expected = RuntimeException.class)
+    public void testBadPlanFile() throws FileNotFoundException {
+        reader.read(new FileInputStream("src/test/resources/plans/malformed.plan"));
+    }
+
+    @Test
+    public void testSingleArtifactPlan() throws FileNotFoundException {
+        PlanDescriptor plan = reader.read(new FileInputStream("src/test/resources/plans/single-artifact.plan"));
+        assertEquals("single-artifact.plan", plan.getName());
+        assertEquals(new Version(1, 0, 0), plan.getVersion());
+        
+        assertEquals(Provisioning.INHERIT, plan.getProvisioning());
+
+        List<ArtifactSpecification> artifactSpecifications = plan.getArtifactSpecifications();
+        assertEquals(1, artifactSpecifications.size());
+        ArtifactSpecification artifactSpecification = artifactSpecifications.iterator().next();
+        assertEquals("bundle", artifactSpecification.getType());
+        assertEquals("org.springframework.context.support", artifactSpecification.getName());
+        assertEquals(new VersionRange("[1.0.0, 2.0.0)"), artifactSpecification.getVersionRange());
+        assertNotNull(artifactSpecification.getProperties());
+        assertTrue(artifactSpecification.getProperties().isEmpty());
+        assertNull(artifactSpecification.getUri());
+    }
+
+    @Test
+    public void testSingleArtifactPlanWithAttributes() throws FileNotFoundException {
+        PlanDescriptor plan = reader.read(new FileInputStream("src/test/resources/plans/attributes.plan"));
+        assertEquals("single-artifact.plan", plan.getName());
+        assertEquals(new Version(1, 0, 0), plan.getVersion());
+
+        List<ArtifactSpecification> artifactSpecifications = plan.getArtifactSpecifications();
+        assertEquals(1, artifactSpecifications.size());
+        ArtifactSpecification artifactSpecification = artifactSpecifications.iterator().next();
+        assertEquals("bundle", artifactSpecification.getType());
+        assertEquals("org.springframework.context.support", artifactSpecification.getName());
+        assertEquals(new VersionRange("[1.0.0, 2.0.0)"), artifactSpecification.getVersionRange());
+    }
+
+    @Test
+    public void testSingleArtifactPlanWithProperties() throws FileNotFoundException {
+        PlanDescriptor plan = reader.read(new FileInputStream("src/test/resources/plans/properties.plan"));
+        assertEquals("properties.plan", plan.getName());
+        assertEquals(new Version(1, 0, 0), plan.getVersion());
+
+        List<ArtifactSpecification> artifactSpecifications = plan.getArtifactSpecifications();
+        assertEquals(1, artifactSpecifications.size());
+        ArtifactSpecification artifactSpecification = artifactSpecifications.iterator().next();
+        assertEquals("bundle", artifactSpecification.getType());
+        assertEquals("my.webapp", artifactSpecification.getName());
+        assertEquals(new VersionRange("[1.0.0, 2.0.0)"), artifactSpecification.getVersionRange());
+        assertEquals("/foo", artifactSpecification.getProperties().get("Web-ContextPath"));
+    }
+
+    @Test
+    public void testMultiArtifactPlan() throws FileNotFoundException {
+        PlanDescriptor plan = reader.read(new FileInputStream("src/test/resources/plans/multi-artifact.plan"));
+        assertEquals("multi-artifact.plan", plan.getName());
+        assertEquals(new Version(1, 0, 0), plan.getVersion());
+
+        List<ArtifactSpecification> artifactSpecifications = plan.getArtifactSpecifications();
+        assertEquals(3, artifactSpecifications.size());
+        for (ArtifactSpecification artifactSpecification : artifactSpecifications) {
+            String type = artifactSpecification.getType();
+            if ("alpha".equals(type)) {
+                assertEquals("org.springframework.core", artifactSpecification.getName());
+                assertEquals(new VersionRange("0"), artifactSpecification.getVersionRange());
+            } else if ("bravo".equals(type)) {
+                assertEquals("org.springframework.context", artifactSpecification.getName());
+                assertEquals(new VersionRange("1.0.0"), artifactSpecification.getVersionRange());
+            } else if ("charlie".equals(type)) {
+                assertEquals("org.springframework.context.support", artifactSpecification.getName());
+                assertEquals(new VersionRange("[1.0.0, 2.0.0)"), artifactSpecification.getVersionRange());
+            }
+        }
+    }
+    
+    @Test
+    public void testProvisioningDefaultPlan() throws FileNotFoundException {
+        PlanDescriptor plan = reader.read(new FileInputStream("src/test/resources/plans/provisioning-default.plan"));
+        assertEquals(Provisioning.INHERIT, plan.getProvisioning());
+    }
+    
+    @Test
+    public void testProvisioningInheritPlan() throws FileNotFoundException {
+        PlanDescriptor plan = reader.read(new FileInputStream("src/test/resources/plans/provisioning-inherit.plan"));
+        assertEquals(Provisioning.INHERIT, plan.getProvisioning());
+    }
+    
+    @Test
+    public void testProvisioningAutoPlan() throws FileNotFoundException {
+        PlanDescriptor plan = reader.read(new FileInputStream("src/test/resources/plans/provisioning-auto.plan"));
+        assertEquals(Provisioning.AUTO, plan.getProvisioning());
+    }
+    
+    @Test
+    public void testProvisioningDisabledPlan() throws FileNotFoundException {
+        PlanDescriptor plan = reader.read(new FileInputStream("src/test/resources/plans/provisioning-disabled.plan"));
+        assertEquals(Provisioning.DISABLED, plan.getProvisioning());
+    }
+    
+    @Test
+    public void testSingleUriPlan() throws FileNotFoundException {
+        PlanDescriptor plan = reader.read(new FileInputStream("src/test/resources/plans/single-uri.plan"));
+        assertEquals("single-uri.plan", plan.getName());
+        assertEquals(new Version(1, 0, 0), plan.getVersion());
+        
+        assertEquals(Provisioning.INHERIT, plan.getProvisioning());
+
+        List<ArtifactSpecification> artifactSpecifications = plan.getArtifactSpecifications();
+        assertEquals(1, artifactSpecifications.size());
+        ArtifactSpecification artifactSpecification = artifactSpecifications.iterator().next();
+        assertNull(artifactSpecification.getType());
+        assertNull(artifactSpecification.getName());
+        assertNull(artifactSpecification.getVersionRange());
+        assertNotNull(artifactSpecification.getProperties());
+        assertTrue(artifactSpecification.getProperties().isEmpty());
+        assertEquals("file:/a/b.c", artifactSpecification.getUri().toString());
+    }
+
+    @Test(expected=RuntimeException.class)
+    public void testInvalidUriWithTypePlan() throws FileNotFoundException {
+        reader.read(new FileInputStream("src/test/resources/plans/invalid-uri-type.plan"));
+    }
+    
+    @Test(expected=RuntimeException.class)
+    public void testInvalidUriWithNamePlan() throws FileNotFoundException {
+        reader.read(new FileInputStream("src/test/resources/plans/invalid-uri-name.plan"));
+    }
+    
+    @Test(expected=RuntimeException.class)
+    public void testInvalidUriWithVersionRangePlan() throws FileNotFoundException {
+        reader.read(new FileInputStream("src/test/resources/plans/invalid-uri-versionrange.plan"));
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/properties/PropertiesBridgeTests.java b/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/properties/PropertiesBridgeTests.java
new file mode 100644
index 0000000..d0aa49f
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/java/org/eclipse/virgo/kernel/artifact/properties/PropertiesBridgeTests.java
@@ -0,0 +1,117 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.artifact.properties;
+
+import static org.junit.Assert.*;
+import static org.easymock.EasyMock.*;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Set;
+
+import org.junit.Test;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+
+import org.easymock.EasyMock;
+import org.eclipse.virgo.kernel.artifact.StubHashGenerator;
+import org.eclipse.virgo.kernel.artifact.properties.PropertiesBridge;
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+import org.eclipse.virgo.repository.ArtifactGenerationException;
+import org.eclipse.virgo.repository.Attribute;
+
+/**
+ */
+public class PropertiesBridgeTests {
+
+    @Test
+    public void testGeneratePropertiesFile() throws ArtifactGenerationException {
+        PropertiesBridge bridge = new PropertiesBridge(new StubHashGenerator(), EasyMock.createMock(ConfigurationAdmin.class));
+        ArtifactDescriptor result = bridge.generateArtifactDescriptor(new File("src/test/resources/properties/foo.properties"));
+        assertNotNull(result);
+    }
+
+    @Test(expected = ArtifactGenerationException.class)
+    public void testFileDoesNotExist() throws ArtifactGenerationException {
+        PropertiesBridge bridge = new PropertiesBridge(new StubHashGenerator(), EasyMock.createMock(ConfigurationAdmin.class));
+
+        File file = new File("src/test/resources/properties/not.exist.properties");
+        bridge.generateArtifactDescriptor(file);
+    }
+
+    @Test
+    public void testGenerateNotPropertiesFile() throws ArtifactGenerationException {
+        PropertiesBridge bridge = new PropertiesBridge(new StubHashGenerator(), createMock(ConfigurationAdmin.class));
+        ArtifactDescriptor descriptor = bridge.generateArtifactDescriptor(new File("src/test/resources/bar.noterties"));
+        assertNull(descriptor);
+    }
+
+    @Test
+    public void testGenerateWithFactoryPid() throws ArtifactGenerationException {
+        final String factoryPid = "test.factory.pid";
+        final String propertiesFile = "src/test/resources/properties/factoryPid.properties";
+
+        ConfigurationAdmin mockConfigAdmin = createMock(ConfigurationAdmin.class);
+        Configuration mockConfiguration = createMock(Configuration.class);
+
+        try {
+            expect(mockConfigAdmin.createFactoryConfiguration(factoryPid, null)).andReturn(mockConfiguration);
+        } catch (IOException e) {
+            fail(e.getMessage());
+        }
+        expect(mockConfiguration.getPid()).andReturn("1");
+
+        replay(mockConfigAdmin, mockConfiguration);
+        
+        PropertiesBridge bridge = new PropertiesBridge(new StubHashGenerator(), mockConfigAdmin);
+        ArtifactDescriptor descriptor = bridge.generateArtifactDescriptor(new File(propertiesFile));
+        
+        verify(mockConfigAdmin, mockConfiguration);
+        
+        // asserts
+        assertNotNull(descriptor);
+        assertEquals("1", descriptor.getName());
+        // only expect one attribute
+        Set<Attribute> attrSet = descriptor.getAttribute(ConfigurationAdmin.SERVICE_FACTORYPID);
+        assertEquals(1, attrSet.size());
+        Attribute attr = attrSet.iterator().next();
+        assertNotNull(factoryPid, attr.getValue());
+    }
+    
+    @Test(expected = ArtifactGenerationException.class)
+    public void testGenerateWithFactoryPidAndIoExceptionFromConfigAdmin() throws ArtifactGenerationException {
+        final String factoryPid = "test.factory.pid";
+        final String propertiesFile = "src/test/resources/properties/factoryPid.properties";
+
+        ConfigurationAdmin mockConfigAdmin = createMock(ConfigurationAdmin.class);
+        
+        try {
+            expect(mockConfigAdmin.createFactoryConfiguration(factoryPid, null)).andThrow(new IOException("exception from configadmin"));
+        } catch (IOException e) {
+            // I really hate checked exceptions.
+        }
+        
+        replay(mockConfigAdmin);
+        PropertiesBridge bridge = new PropertiesBridge(new StubHashGenerator(), mockConfigAdmin);
+        bridge.generateArtifactDescriptor(new File(propertiesFile));
+        verify(mockConfigAdmin);
+    }
+    
+    @Test
+    public void makeSureThatServicePidIsTakenFromTheFileProvidedProperties() throws ArtifactGenerationException {
+        final String name = "service.pid.in.the.file";
+        PropertiesBridge bridge = new PropertiesBridge(new StubHashGenerator(), EasyMock.createMock(ConfigurationAdmin.class));
+        ArtifactDescriptor result = bridge.generateArtifactDescriptor(new File("src/test/resources/properties/with-service-pid.properties"));
+        assertNotNull(result);
+        assertEquals(name, result.getName());
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/artefacts/exploded/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/artefacts/exploded/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/artefacts/exploded/META-INF/MANIFEST.MF
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/artefacts/exploded/META-INF/web/index.jsp b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/artefacts/exploded/META-INF/web/index.jsp
new file mode 100644
index 0000000..8102008
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/artefacts/exploded/META-INF/web/index.jsp
@@ -0,0 +1,12 @@
+<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
+	pageEncoding="ISO-8859-1"%>
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Hello Web!</title>
+</head>
+<body>
+<p>Hello Web!</p>
+</body>
+</html>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/artefacts/exploded/somefile.txt b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/artefacts/exploded/somefile.txt
new file mode 100644
index 0000000..c57eff5
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/artefacts/exploded/somefile.txt
@@ -0,0 +1 @@
+Hello World!
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/artifacts/bundle-with-missing-entries.jar b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/artifacts/bundle-with-missing-entries.jar
new file mode 100644
index 0000000..ea524f8
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/artifacts/bundle-with-missing-entries.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/artifacts/bundle.jar b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/artifacts/bundle.jar
new file mode 100644
index 0000000..1de4b41
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/artifacts/bundle.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/artifacts/simple.jar b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/artifacts/simple.jar
new file mode 100644
index 0000000..7efafc1
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/artifacts/simple.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/bundle.jar/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/bundle.jar/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..4a7652c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/bundle.jar/META-INF/MANIFEST.MF
@@ -0,0 +1,4 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: exploded.bundle
+Bundle-Version: 1.0
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/directories/y.different-1.2.3/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/directories/y.different-1.2.3/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..582885d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/directories/y.different-1.2.3/META-INF/MANIFEST.MF
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0

+Bundle-ManifestVersion: 2

+Bundle-SymbolicName: y.different

+Export-Package: x

+Bundle-Version: 1.2.3

diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/dms-plans/attributes.plan b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/dms-plans/attributes.plan
new file mode 100644
index 0000000..5ae8d8c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/dms-plans/attributes.plan
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="single-artifact.plan" version="1.0.0" scoped="true" atomic="true"
+		xmlns="http://www.springsource.org/schema/dm-server/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.springsource.org/schema/dm-server/plan 
+			http://www.springsource.org/schema/dm-server/plan/springsource-dm-server-plan.xsd">
+
+	<attributes>
+		<attribute name="version" value="[1.0.0, 2.0.0)"/>
+		
+	</attributes>
+	<artifact type="bundle" name="org.springframework.context.support" version="${version}"/>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/dms-plans/malformed.plan b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/dms-plans/malformed.plan
new file mode 100644
index 0000000..71cc5c1
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/dms-plans/malformed.plan
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="malformed.plan" version="1.0.0"
+		xmlns="http://www.springsource.org/schema/dm-server/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.springsource.org/schema/dm-server/plan 
+			http://www.springsource.org/schema/dm-server/plan/springsource-dm-server-plan.xsd">
+	<artifact type="bundle"/>
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/dms-plans/multi-artifact.plan b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/dms-plans/multi-artifact.plan
new file mode 100644
index 0000000..ea5363d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/dms-plans/multi-artifact.plan
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="multi-artifact.plan" version="1.0.0" scoped="true" atomic="true"
+		xmlns="http://www.springsource.org/schema/dm-server/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.springsource.org/schema/dm-server/plan 
+			http://www.springsource.org/schema/dm-server/plan/springsource-dm-server-plan.xsd">
+
+	<artifact type="alpha" name="org.springframework.core"/>
+	<artifact type="bravo" name="org.springframework.context" version="1.0.0"/>
+	<artifact type="charlie" name="org.springframework.context.support" version="[1.0.0, 2.0.0)"/>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/dms-plans/properties.plan b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/dms-plans/properties.plan
new file mode 100644
index 0000000..8e76e71
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/dms-plans/properties.plan
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="properties.plan" version="1.0.0" scoped="true" atomic="true"
+		xmlns="http://www.springsource.org/schema/dm-server/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.springsource.org/schema/dm-server/plan 
+			http://www.springsource.org/schema/dm-server/plan/springsource-dm-server-plan.xsd">
+
+	<artifact type="bundle" name="my.webapp" version="[1.0.0, 2.0.0)">
+		<property name="Web-ContextPath" value="/foo"/>
+	</artifact>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/dms-plans/single-artifact.plan b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/dms-plans/single-artifact.plan
new file mode 100644
index 0000000..e537797
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/dms-plans/single-artifact.plan
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="single-artifact.plan" version="1.0.0" scoped="true" atomic="true"
+		xmlns="http://www.springsource.org/schema/dm-server/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.springsource.org/schema/dm-server/plan 
+			http://www.springsource.org/schema/dm-server/plan/springsource-dm-server-plan.xsd">
+
+	<artifact type="bundle" name="org.springframework.context.support" version="[1.0.0, 2.0.0)"/>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/jars/no-manifest.jar b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/jars/no-manifest.jar
new file mode 100644
index 0000000..f63054b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/jars/no-manifest.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/jars/no-symbolic-name.jar b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/jars/no-symbolic-name.jar
new file mode 100644
index 0000000..7ab5fb3
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/jars/no-symbolic-name.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/libraries/invalid.libd b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/libraries/invalid.libd
new file mode 100644
index 0000000..ff55009
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/libraries/invalid.libd
@@ -0,0 +1,3 @@
+Manifest-Version: 1
+Library-Version: 1.2
+Import-Bundle: a,b,c
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/libraries/test.libd b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/libraries/test.libd
new file mode 100644
index 0000000..3e4e6f0
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/libraries/test.libd
@@ -0,0 +1,4 @@
+Manifest-Version: 1
+Library-SymbolicName: test.library
+Library-Version: 1.2
+Import-Bundle: a,b,c
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/pars/basic.par/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/pars/basic.par/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..8099c75
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/pars/basic.par/META-INF/MANIFEST.MF
@@ -0,0 +1,4 @@
+Application-SymbolicName: basic
+Application-Version: 1.2.3
+Application-Name: Basic Par
+Application-Description: A basic PAR file for the unit tests
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/pars/illegal-asn.par/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/pars/illegal-asn.par/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..e5fa459
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/pars/illegal-asn.par/META-INF/MANIFEST.MF
@@ -0,0 +1,4 @@
+Application-SymbolicName: .@$%
+Application-Version: 1.2.3
+Application-Name: Basic Par
+Application-Description: A basic PAR file for the unit tests
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/pars/illegal-version.par/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/pars/illegal-version.par/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..6488d37
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/pars/illegal-version.par/META-INF/MANIFEST.MF
@@ -0,0 +1,4 @@
+Application-SymbolicName: basic
+Application-Version: alpha
+Application-Name: Basic Par
+Application-Description: A basic PAR file for the unit tests
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/pars/no-asn.par/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/pars/no-asn.par/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..f9f79e5
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/pars/no-asn.par/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Application-Version: 1.2.3
+Application-Name: Basic Par
+Application-Description: A basic PAR file for the unit tests
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/pars/no-description.par/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/pars/no-description.par/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..fd589a8
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/pars/no-description.par/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Application-SymbolicName: basic
+Application-Version: 1.2.3
+Application-Name: Basic Par
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/pars/no-manifest.par/META-INF/dummy.txt b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/pars/no-manifest.par/META-INF/dummy.txt
new file mode 100644
index 0000000..0fa9423
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/pars/no-manifest.par/META-INF/dummy.txt
@@ -0,0 +1 @@
+Just a file to keep the directory around
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/pars/no-name.par/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/pars/no-name.par/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..ad855b6
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/pars/no-name.par/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Application-SymbolicName: basic
+Application-Version: 1.2.3
+Application-Description: A basic PAR file for the unit tests
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/pars/no-version.par/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/pars/no-version.par/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..a5a84ba
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/pars/no-version.par/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Application-SymbolicName: basic
+Application-Name: Basic Par
+Application-Description: A basic PAR file for the unit tests
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/plans/attributes.plan b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/plans/attributes.plan
new file mode 100644
index 0000000..d992b69
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/plans/attributes.plan
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="single-artifact.plan" version="1.0.0" scoped="true" atomic="true"
+		xmlns="http://www.eclipse.org/virgo/schema/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.eclipse.org/virgo/schema/plan 
+			http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+	<attributes>
+		<attribute name="version" value="[1.0.0, 2.0.0)"/>
+		
+	</attributes>
+	<artifact type="bundle" name="org.springframework.context.support" version="${version}"/>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/plans/invalid-uri-name.plan b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/plans/invalid-uri-name.plan
new file mode 100644
index 0000000..4142c2e
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/plans/invalid-uri-name.plan
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="invalid-uri-name.plan" version="1.0.0" scoped="true" atomic="true"
+		xmlns="http://www.eclipse.org/virgo/schema/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.eclipse.org/virgo/schema/plan 
+			http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+	<artifact name="any" uri="file:/a/b.c"/>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/plans/invalid-uri-type.plan b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/plans/invalid-uri-type.plan
new file mode 100644
index 0000000..dc9a0de
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/plans/invalid-uri-type.plan
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="invalid-uri-type.plan" version="1.0.0" scoped="true" atomic="true"
+		xmlns="http://www.eclipse.org/virgo/schema/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.eclipse.org/virgo/schema/plan 
+			http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+	<artifact type="bundle" uri="file:/a/b.c"/>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/plans/invalid-uri-versionrange.plan b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/plans/invalid-uri-versionrange.plan
new file mode 100644
index 0000000..d00ab2a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/plans/invalid-uri-versionrange.plan
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="invalid-uri-versionrange.plan" version="1.0.0" scoped="true" atomic="true"
+		xmlns="http://www.eclipse.org/virgo/schema/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.eclipse.org/virgo/schema/plan 
+			http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+	<artifact version="[1.0.0, 2.0.0)" uri="file:/a/b.c"/>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/plans/malformed.plan b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/plans/malformed.plan
new file mode 100644
index 0000000..f8764fd
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/plans/malformed.plan
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="malformed.plan" version="1.0.0"
+		xmlns="http://www.eclipse.org/virgo/schema/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.eclipse.org/virgo/schema/plan 
+			http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+	<artifact type="bundle"/>
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/plans/multi-artifact.plan b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/plans/multi-artifact.plan
new file mode 100644
index 0000000..2d6725d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/plans/multi-artifact.plan
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="multi-artifact.plan" version="1.0.0" scoped="true" atomic="true"
+		xmlns="http://www.eclipse.org/virgo/schema/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.eclipse.org/virgo/schema/plan 
+			http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+	<artifact type="alpha" name="org.springframework.core"/>
+	<artifact type="bravo" name="org.springframework.context" version="1.0.0"/>
+	<artifact type="charlie" name="org.springframework.context.support" version="[1.0.0, 2.0.0)"/>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/plans/properties.plan b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/plans/properties.plan
new file mode 100644
index 0000000..2a7d0fd
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/plans/properties.plan
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="properties.plan" version="1.0.0" scoped="true" atomic="true"
+		xmlns="http://www.eclipse.org/virgo/schema/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.eclipse.org/virgo/schema/plan 
+			http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+	<artifact type="bundle" name="my.webapp" version="[1.0.0, 2.0.0)">
+		<property name="Web-ContextPath" value="/foo"/>
+	</artifact>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/plans/provisioning-auto.plan b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/plans/provisioning-auto.plan
new file mode 100644
index 0000000..a2d5f56
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/plans/provisioning-auto.plan
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="provisioningauto.plan" version="1.0.0" scoped="false"
+	atomic="true" provisioning="auto" xmlns="http://www.eclipse.org/virgo/schema/plan"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="
+			http://www.eclipse.org/virgo/schema/plan 
+			http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+	<artifact type="bundle" name="org.springframework.context.support"
+		version="[1.0.0, 2.0.0)" />
+
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/plans/provisioning-default.plan b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/plans/provisioning-default.plan
new file mode 100644
index 0000000..893d0f4
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/plans/provisioning-default.plan
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="provisioningdefault.plan" version="1.0.0" scoped="false"
+	atomic="true" xmlns="http://www.eclipse.org/virgo/schema/plan"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="
+			http://www.eclipse.org/virgo/schema/plan 
+			http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+	<artifact type="bundle" name="org.springframework.context.support"
+		version="[1.0.0, 2.0.0)" />
+
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/plans/provisioning-disabled.plan b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/plans/provisioning-disabled.plan
new file mode 100644
index 0000000..b8ac91d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/plans/provisioning-disabled.plan
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="provisioningdisabled.plan" version="1.0.0" scoped="false"
+	atomic="true" provisioning="disabled" xmlns="http://www.eclipse.org/virgo/schema/plan"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="
+			http://www.eclipse.org/virgo/schema/plan 
+			http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+	<artifact type="bundle" name="org.springframework.context.support"
+		version="[1.0.0, 2.0.0)" />
+
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/plans/provisioning-inherit.plan b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/plans/provisioning-inherit.plan
new file mode 100644
index 0000000..116f259
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/plans/provisioning-inherit.plan
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="provisioninginherit.plan" version="1.0.0" scoped="false"
+	atomic="true" provisioning="inherit" xmlns="http://www.eclipse.org/virgo/schema/plan"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="
+			http://www.eclipse.org/virgo/schema/plan 
+			http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+	<artifact type="bundle" name="org.springframework.context.support"
+		version="[1.0.0, 2.0.0)" />
+
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/plans/single-artifact.plan b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/plans/single-artifact.plan
new file mode 100644
index 0000000..6388d76
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/plans/single-artifact.plan
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="single-artifact.plan" version="1.0.0" scoped="true" atomic="true"
+		xmlns="http://www.eclipse.org/virgo/schema/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.eclipse.org/virgo/schema/plan 
+			http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+	<artifact type="bundle" name="org.springframework.context.support" version="[1.0.0, 2.0.0)"/>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/plans/single-uri.plan b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/plans/single-uri.plan
new file mode 100644
index 0000000..4d9114a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/plans/single-uri.plan
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="single-uri.plan" version="1.0.0" scoped="true" atomic="true"
+		xmlns="http://www.eclipse.org/virgo/schema/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.eclipse.org/virgo/schema/plan 
+			http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+	<artifact uri="file:/a/b.c"/>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/properties/factoryPid.properties b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/properties/factoryPid.properties
new file mode 100644
index 0000000..f8d8d91
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/properties/factoryPid.properties
@@ -0,0 +1,6 @@
+# factory pid for config admin service
+service.factoryPid = test.factory.pid
+
+# properties for the managed service
+prop1 = prop1
+prop2 = 2
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/properties/foo.properties b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/properties/foo.properties
new file mode 100644
index 0000000..74d0a43
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/properties/foo.properties
@@ -0,0 +1 @@
+foo=bar
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/properties/with-service-pid.properties b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/properties/with-service-pid.properties
new file mode 100644
index 0000000..e008c6c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/properties/with-service-pid.properties
@@ -0,0 +1,6 @@
+#config admin properties config with service.pid specified in the file vs. filename
+service.pid = service.pid.in.the.file
+
+# properties
+prop1 = prop1
+prop2 = 2
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/refresh/simple.module.jar b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/refresh/simple.module.jar
new file mode 100644
index 0000000..a1738c4
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/refresh/simple.module.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/refresh/simple2.module.jar b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/refresh/simple2.module.jar
new file mode 100644
index 0000000..cefbadb
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/refresh/simple2.module.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/wars/test.war b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/wars/test.war
new file mode 100644
index 0000000..c08c731
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/wars/test.war
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/wars/testbad01.war b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/wars/testbad01.war
new file mode 100644
index 0000000..677a6ba
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/src/test/resources/wars/testbad01.war
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.artifact/template.mf b/kernel/org.eclipse.virgo.kernel.artifact/template.mf
new file mode 100644
index 0000000..5ec7b8c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.artifact/template.mf
@@ -0,0 +1,19 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Virgo Kernel Artifact Integration
+Bundle-SymbolicName: org.eclipse.virgo.kernel.artifact
+Bundle-Version: ${version}
+Import-Template: 
+ org.eclipse.virgo.kernel.*;version="${version:[=.=.=, =.+1)}", 
+ org.eclipse.virgo.util.*;version="${version:[=.=.=, =.+1)}",
+ org.eclipse.virgo.nano.*;version="${version:[=.=.=, =.+1)}",
+ org.eclipse.virgo.repository.*;version="${version:[=.=.=, =.+1)}",
+ org.slf4j.*;version="${slf4jVersion:[=.=.=, +1)}",
+ org.eclipse.virgo.medic.*;version="${version:[=.=.=, =.+1)}",
+ org.osgi.framework.*;version="0",
+ org.osgi.service.cm.*;version="0",
+ org.springframework.*;version="${springframeworkVersion:[2.5.6, +1)}",
+ javax.xml.*;version="0",
+ org.xml.*;version="0",
+ org.w3c.*;version="0"
+Excluded-Exports: *.internal.*
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.dm/.settings/org.eclipse.virgo.ide.bundlor.core.prefs b/kernel/org.eclipse.virgo.kernel.deployer.dm/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
new file mode 100644
index 0000000..5de6e6a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.dm/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
@@ -0,0 +1,3 @@
+#Mon Jul 06 09:07:34 BST 2009
+org.eclipse.virgo.ide.bundlor.core.template.properties.files=../build.properties;../build.versions
+eclipse.preferences.version=1
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.dm/.settings/org.eclipse.wst.common.project.facet.core.xml b/kernel/org.eclipse.virgo.kernel.deployer.dm/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..92aa290
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.dm/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+  <installed facet="org.eclipse.virgo.server.bundle" version="1.0"/>
+</faceted-project>
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.dm/.springBeans b/kernel/org.eclipse.virgo.kernel.deployer.dm/.springBeans
new file mode 100644
index 0000000..4dbe37b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.dm/.springBeans
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beansProjectDescription>
+	<version>1</version>
+	<pluginVersion><![CDATA[2.2.7.200910202224-RELEASE]]></pluginVersion>
+	<configSuffixes>
+		<configSuffix><![CDATA[xml]]></configSuffix>
+	</configSuffixes>
+	<enableImports><![CDATA[false]]></enableImports>
+	<configs>
+	</configs>
+	<configSets>
+	</configSets>
+</beansProjectDescription>
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.dm/src/main/java/org/eclipse/virgo/kernel/deployer/app/spring/ApplicationBundleUtils.java b/kernel/org.eclipse.virgo.kernel.deployer.dm/src/main/java/org/eclipse/virgo/kernel/deployer/app/spring/ApplicationBundleUtils.java
new file mode 100644
index 0000000..99d0201
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.dm/src/main/java/org/eclipse/virgo/kernel/deployer/app/spring/ApplicationBundleUtils.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.app.spring;
+
+import org.osgi.framework.Bundle;
+
+/**
+ * Utility methods for working with server application module bundles. <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ * 
+ */
+public final class ApplicationBundleUtils {
+    
+    private static final String MODULE_TYPE_MANIFEST_HEADER = "Module-Type";
+
+
+    /**
+     * Gets the server module type for the supplied {@link Bundle}.
+     * 
+     * @param bundle the <code>Bundle</code>.
+     * @return the server module type, or <code>null</code> if the supplied <code>Bundle</code> is not a server
+     *         application module.
+     */
+    public static String getModuleType(Bundle bundle) {
+        String value = (String) bundle.getHeaders().get(MODULE_TYPE_MANIFEST_HEADER);
+        return (value == null || value.length() == 0 ? null : value);
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.dm/src/main/java/org/eclipse/virgo/kernel/deployer/app/spring/ModuleContextWrapper.java b/kernel/org.eclipse.virgo.kernel.deployer.dm/src/main/java/org/eclipse/virgo/kernel/deployer/app/spring/ModuleContextWrapper.java
new file mode 100644
index 0000000..1f8c6c9
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.dm/src/main/java/org/eclipse/virgo/kernel/deployer/app/spring/ModuleContextWrapper.java
@@ -0,0 +1,101 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.app.spring;
+
+import org.springframework.beans.BeansException;
+import org.springframework.context.ConfigurableApplicationContext;
+
+import org.eclipse.virgo.kernel.module.Component;
+import org.eclipse.virgo.kernel.module.ModuleContext;
+import org.eclipse.virgo.kernel.module.NoSuchComponentException;
+
+/**
+ * {@link ModuleContextWrapper} wraps a {@link ConfigurableApplicationContext} to provide an equivalent {@link ModuleContext}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread safe.
+ * 
+ */
+final class ModuleContextWrapper implements ModuleContext {
+
+    private final ConfigurableApplicationContext appCtx;
+
+    ModuleContextWrapper(ConfigurableApplicationContext appCtx) {
+        this.appCtx = appCtx;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Object getApplicationContext() {
+        return this.appCtx;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Component getComponent(final String componentName) throws NoSuchComponentException {
+        try {
+            final Object component = this.appCtx.getBean(componentName);
+            return new Component() {
+
+                /**
+                 * {@inheritDoc}
+                 */
+                public String getName() {
+                    return componentName;
+                }
+
+                /**
+                 * {@inheritDoc}
+                 */
+                public String getType() {
+                    return component.getClass().getName();
+                }
+
+                /**
+                 * {@inheritDoc}
+                 */
+                public boolean isPrototype() {
+                    return ModuleContextWrapper.this.appCtx.getBeanFactory().isPrototype(componentName);
+                }
+
+                /**
+                 * {@inheritDoc}
+                 */
+                public boolean isSingleton() {
+                    return ModuleContextWrapper.this.appCtx.getBeanFactory().isSingleton(componentName);
+                }
+
+            };
+        } catch (BeansException e) {
+            throw new NoSuchComponentException(e.getMessage());
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String[] getComponentNames() {
+        return this.appCtx.getBeanDefinitionNames();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getDisplayName() {
+        return this.appCtx.getDisplayName();
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.dm/src/main/java/org/eclipse/virgo/kernel/deployer/app/spring/UserRegionModuleContextAccessor.java b/kernel/org.eclipse.virgo.kernel.deployer.dm/src/main/java/org/eclipse/virgo/kernel/deployer/app/spring/UserRegionModuleContextAccessor.java
new file mode 100644
index 0000000..4109aae
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.dm/src/main/java/org/eclipse/virgo/kernel/deployer/app/spring/UserRegionModuleContextAccessor.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.app.spring;
+
+import java.util.Collection;
+
+import org.eclipse.virgo.kernel.module.KernelModuleContextAccessorFactory;
+import org.eclipse.virgo.kernel.module.ModuleContext;
+import org.eclipse.virgo.kernel.module.ModuleContextAccessor;
+import org.eclipse.virgo.nano.serviceability.Assert;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+import org.springframework.context.ApplicationContext;
+import org.eclipse.gemini.blueprint.context.ConfigurableOsgiBundleApplicationContext;
+
+/**
+ * {@link UserRegionModuleContextAccessor} accesses {@link ModuleContext ModuleContexts} in either the the user region or the kernel, but this class must
+ * be loaded in the user region.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread safe.
+ * 
+ */
+final class UserRegionModuleContextAccessor implements ModuleContextAccessor {
+    
+    private final ModuleContextAccessor kernelModuleContextAccessor;
+
+    UserRegionModuleContextAccessor() {
+        this.kernelModuleContextAccessor = KernelModuleContextAccessorFactory.create();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public ModuleContext getModuleContext(@NonNull Bundle bundle) {
+        BundleContext bundleContext = bundle.getBundleContext();
+        // The bundle must have a bundle context in order to have a module context.
+        if (bundleContext != null) {
+            String symbolicName = bundle.getSymbolicName();
+            try {
+                Collection<ServiceReference<ApplicationContext>> refs = bundleContext.getServiceReferences(ApplicationContext.class,
+                    "(Bundle-SymbolicName=" + symbolicName + ")");
+                if (refs.size() != 0) {
+                    for (ServiceReference<ApplicationContext> ref : refs) {
+                        Object service = bundleContext.getService(ref);
+                        try {
+                            // Avoid kernel region application contexts.
+                            if (service instanceof ApplicationContext) {
+                                ApplicationContext appCtx = (ApplicationContext) service;
+                                if (appCtx instanceof ConfigurableOsgiBundleApplicationContext) {
+                                    if (bundleContext == ((ConfigurableOsgiBundleApplicationContext) appCtx).getBundleContext()) {
+                                        return new ModuleContextWrapper((ConfigurableOsgiBundleApplicationContext) appCtx);
+                                    }
+                                }
+                            }
+                        } finally {
+                            bundleContext.ungetService(ref);
+                        }
+                    }
+                }
+            } catch (InvalidSyntaxException e) {
+                Assert.isFalse(true, "Unexpected exception %s", e.getMessage());
+            }
+        }
+        // Try the kernel in case the bundle resides in the kernel region.
+        return this.kernelModuleContextAccessor.getModuleContext(bundle);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.dm/src/main/resources/META-INF/spring/deployer-dm-context.xml b/kernel/org.eclipse.virgo.kernel.deployer.dm/src/main/resources/META-INF/spring/deployer-dm-context.xml
new file mode 100644
index 0000000..b7e2279
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.dm/src/main/resources/META-INF/spring/deployer-dm-context.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans:beans xmlns="http://www.springframework.org/schema/osgi"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"
+	xmlns:osgi="http://www.springframework.org/schema/osgi"
+	xsi:schemaLocation="http://www.springframework.org/schema/osgi  
+       http://www.springframework.org/schema/osgi/spring-osgi.xsd
+       http://www.springframework.org/schema/beans   
+       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
+
+	<beans:bean id="moduleContextAccessor"
+		class="org.eclipse.virgo.kernel.deployer.app.spring.UserRegionModuleContextAccessor" />
+
+	<osgi:service ref="moduleContextAccessor"
+		interface="org.eclipse.virgo.kernel.module.ModuleContextAccessor" />
+		
+	<osgi:reference id="agentDMStartTracker"
+		interface="org.eclipse.virgo.kernel.agent.dm.AgentDMStartTracker" />
+
+</beans:beans>
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.dm/src/test/java/org/eclipse/virgo/kernel/deployer/app/spring/UserRegionModuleContextAccessorTests.java b/kernel/org.eclipse.virgo.kernel.deployer.dm/src/test/java/org/eclipse/virgo/kernel/deployer/app/spring/UserRegionModuleContextAccessorTests.java
new file mode 100644
index 0000000..f17034e
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.dm/src/test/java/org/eclipse/virgo/kernel/deployer/app/spring/UserRegionModuleContextAccessorTests.java
@@ -0,0 +1,155 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.app.spring;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+import java.util.Dictionary;
+import java.util.Map;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Filter;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.Version;
+import org.springframework.context.ApplicationContext;
+import org.eclipse.gemini.blueprint.context.ConfigurableOsgiBundleApplicationContext;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+
+import org.eclipse.virgo.kernel.deployer.app.spring.UserRegionModuleContextAccessor;
+import org.eclipse.virgo.kernel.module.ModuleContext;
+import org.eclipse.virgo.kernel.module.ModuleContextAccessor;
+import org.eclipse.virgo.test.stubs.framework.StubBundle;
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+
+/**
+ */
+public class UserRegionModuleContextAccessorTests {
+
+    private static final String BUNDLE_SYMBOLIC_NAME = "bundle";
+
+    private ModuleContextAccessor moduleContextAccessor;
+
+    private StubBundle stubBundle;
+
+    private StubBundleContext stubBundleContext;
+
+    private ApplicationContext mockBasicApplicationContext;
+    
+    private interface TestAppCtx extends ConfigurableOsgiBundleApplicationContext, ModuleContext {}
+    
+    private TestAppCtx mockTestAppCtx;
+    
+    private static final Filter NEGATIVE_FILTER = new Filter() {
+        
+        @Override
+        public boolean match(ServiceReference<?> reference) {
+            return false;
+        }
+        
+        @Override
+        public boolean match(Dictionary<String, ?> dictionary) {
+            return false;
+        }
+        
+        @Override
+        public boolean matchCase(Dictionary<String, ?> dictionary) {
+            return false;
+        }
+
+        @Override
+        public boolean matches(Map<String, ?> map) {
+            return false;
+        }
+        
+    };
+    
+private static final Filter POSITIVE_FILTER = new Filter() {
+        
+    @Override
+    public boolean match(ServiceReference<?> reference) {
+        return true;
+    }
+    
+    @Override
+    public boolean match(Dictionary<String, ?> dictionary) {
+        return true;
+    }
+    
+    @Override
+    public boolean matchCase(Dictionary<String, ?> dictionary) {
+        return true;
+    }
+
+    @Override
+    public boolean matches(Map<String, ?> map) {
+        return true;
+    }
+        
+    };
+
+    @Before
+    public void setUp() throws Exception {
+        this.moduleContextAccessor = new UserRegionModuleContextAccessor();
+
+        this.stubBundle = new StubBundle(BUNDLE_SYMBOLIC_NAME, Version.emptyVersion);
+
+        this.stubBundleContext = new StubBundleContext();
+
+        this.stubBundle.setBundleContext(this.stubBundleContext);
+        
+        this.mockBasicApplicationContext= createMock(ApplicationContext.class);
+        
+        this.mockTestAppCtx = createMock(TestAppCtx.class);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+    }
+
+    @Test
+    public void testUnpublishedApplicationContext() {
+        this.stubBundleContext.addFilter("(Bundle-SymbolicName=" + BUNDLE_SYMBOLIC_NAME + ")", NEGATIVE_FILTER);
+        assertNull(this.moduleContextAccessor.getModuleContext(this.stubBundle));
+    }
+
+    @Test
+    public void testUnpublishedApplicationContextWithOtherServicesPresent() {
+        this.stubBundleContext.addFilter("(Bundle-SymbolicName=" + BUNDLE_SYMBOLIC_NAME + ")", NEGATIVE_FILTER);
+        this.stubBundleContext.registerService(String.class.getName(), "", null);
+        assertNull(this.moduleContextAccessor.getModuleContext(this.stubBundle));
+    }
+    
+    @Test
+    public void testPublishedApplicationContextOfWrongType() {
+        this.stubBundleContext.addFilter("(Bundle-SymbolicName=" + BUNDLE_SYMBOLIC_NAME + ")", POSITIVE_FILTER);
+        this.stubBundleContext.registerService(ApplicationContext.class.getName(), this.mockBasicApplicationContext, null);
+        assertNull(this.moduleContextAccessor.getModuleContext(this.stubBundle));
+    }
+    
+    @Test
+    public void testPublishedApplicationContextOfCorrectType() {
+        this.stubBundleContext.addFilter("(Bundle-SymbolicName=" + BUNDLE_SYMBOLIC_NAME + ")", POSITIVE_FILTER);
+        this.stubBundleContext.registerService(ApplicationContext.class.getName(), this.mockTestAppCtx, null);
+        expect(this.mockTestAppCtx.getBundleContext()).andReturn(this.stubBundleContext);
+        replay(this.mockTestAppCtx);
+        assertNotNull(this.moduleContextAccessor.getModuleContext(this.stubBundle));
+        verify(this.mockTestAppCtx);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.dm/template.mf b/kernel/org.eclipse.virgo.kernel.deployer.dm/template.mf
new file mode 100644
index 0000000..4b6da54
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.dm/template.mf
@@ -0,0 +1,14 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Virgo Kernel Deployer Spring DM Integration
+Bundle-SymbolicName: org.eclipse.virgo.kernel.deployer.dm
+Bundle-Version: ${version}
+Import-Template:
+ org.eclipse.virgo.kernel.*;version="${version:[=.=.=, =.+1)}",
+ org.eclipse.virgo.nano.*;version="${version:[=.=.=, =.+1)}",
+ org.eclipse.virgo.medic.*;version="${version:[=.=.=, =.+1)}",
+ org.slf4j.*;version="${slf4jVersion:[=.=.=, +1)}",
+ org.aspectj.*;version="${aspectjVersion:[=.=.=, +1)}",
+ org.osgi.framework.*;version="0",
+ org.springframework.*;version="${springframeworkVersion:[2.5.6, +1)}",
+ org.eclipse.gemini.blueprint.*;version="${geminiBlueprintVersion:[=.=.=, +1)}"
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/.settings/org.eclipse.virgo.ide.bundlor.core.prefs b/kernel/org.eclipse.virgo.kernel.deployer.test/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
new file mode 100644
index 0000000..9f2192a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
@@ -0,0 +1,3 @@
+#Mon Jul 06 09:07:17 BST 2009
+org.eclipse.virgo.ide.bundlor.core.template.properties.files=../build.properties;../build.versions
+eclipse.preferences.version=1
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/.settings/org.eclipse.wst.common.project.facet.core.xml b/kernel/org.eclipse.virgo.kernel.deployer.test/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..92aa290
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+  <installed facet="org.eclipse.virgo.server.bundle" version="1.0"/>
+</faceted-project>
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/.settings/org.springframework.ide.eclipse.core.prefs b/kernel/org.eclipse.virgo.kernel.deployer.test/.settings/org.springframework.ide.eclipse.core.prefs
new file mode 100644
index 0000000..b016865
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/.settings/org.springframework.ide.eclipse.core.prefs
@@ -0,0 +1,68 @@
+#Thu Nov 05 13:30:41 GMT 2009
+eclipse.preferences.version=1
+org.springframework.ide.eclipse.core.builders.enable.aopreferencemodelbuilder=true
+org.springframework.ide.eclipse.core.builders.enable.beanmetadatabuilder=true
+org.springframework.ide.eclipse.core.builders.enable.osgibundleupdater=false
+org.springframework.ide.eclipse.core.enable.project.preferences=false
+org.springframework.ide.eclipse.core.validator.enable.com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.enable.com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.enable.com.springsource.sts.server.quickfix.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.enable.org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.enable.org.springframework.ide.eclipse.core.springvalidator=false
+org.springframework.ide.eclipse.core.validator.enable.org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.applicationSymbolicNameRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.applicationVersionRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleActivationPolicyRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleActivatorRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleManifestVersionRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleSymbolicNameRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleVersionRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.exportPackageRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.importRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.parsingProblemsRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.requireBundleRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.AvoidDriverManagerDataSource-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.ImportElementsAtTopRulee-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.ParentBeanSpecifiesAbstractClassRule-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.RefElementRule-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.TooManyBeansInFileRule-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.UnnecessaryValueElementRule-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.UseBeanInheritance-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.legacyxmlusage.jndiobjectfactory-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.importBundleVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.importLibraryVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.importPackageVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.requireBundleVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.autowire.autowire-org.springframework.ide.eclipse.beans.core.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanAlias-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanClass-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanConstructorArgument-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanDefinition-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanDefinitionHolder-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanFactory-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanInitDestroyMethod-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanProperty-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanReference-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.methodOverride-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.parsingProblems-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.requiredProperty-org.springframework.ide.eclipse.beans.core.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.toolAnnotation-org.springframework.ide.eclipse.beans.core.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.core.springClasspath-org.springframework.ide.eclipse.core.springvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.action-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.actionstate-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.attribute-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.attributemapper-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.beanaction-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.evaluationaction-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.evaluationresult-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.exceptionhandler-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.import-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.inputattribute-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.mapping-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.outputattribute-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.set-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.state-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.subflowstate-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.transition-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.variable-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.webflowstate-org.springframework.ide.eclipse.webflow.core.validator=true
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/.springBeans b/kernel/org.eclipse.virgo.kernel.deployer.test/.springBeans
new file mode 100644
index 0000000..d079ca1
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/.springBeans
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beansProjectDescription>
+	<version>1</version>
+	<pluginVersion><![CDATA[2.2.4.RELEASE]]></pluginVersion>
+	<configSuffixes>
+		<configSuffix><![CDATA[xml]]></configSuffix>
+	</configSuffixes>
+	<enableImports><![CDATA[false]]></enableImports>
+	<configs>
+	</configs>
+	<configSets>
+	</configSets>
+</beansProjectDescription>
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/build.xml b/kernel/org.eclipse.virgo.kernel.deployer.test/build.xml
new file mode 100644
index 0000000..7fb8970
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/build.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="org.eclipse.virgo.kernel.deployer.test">
+
+	<property file="${basedir}/../build.properties"/>
+	<property file="${basedir}/../build.versions"/>
+	<import file="${basedir}/../virgo-build/standard/default.xml"/>
+
+</project>
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/ivy.xml b/kernel/org.eclipse.virgo.kernel.deployer.test/ivy.xml
new file mode 100644
index 0000000..48a5135
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/ivy.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ivy-module xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd" version="2.0">
+
+	<info organisation="${project.organisation}" module="${ant.project.name}"/>
+
+	<configurations>
+		<include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>
+	</configurations>
+
+	<publications>
+		<artifact name="${ant.project.name}"/>
+		<artifact name="${ant.project.name}-sources" type="src" ext="jar"/>
+	</publications>
+
+	<dependencies>
+		<dependency org="com.mchange.c3p0" name="com.springsource.com.mchange.v2.c3p0" rev="${com.mchange.c3p0}" conf="compile->runtime"/>
+		<dependency org="com.opensymphony.quartz" name="com.springsource.org.quartz" rev="${com.opensymphony.quartz}" conf="test->runtime"/>
+		<dependency org="com.oracle.toplink.essentials" name="com.springsource.oracle.toplink.essentials" rev="${com.oracle.toplink.essentials}" conf="test->runtime"/>
+		<dependency org="com.oracle.toplink.essentials" name="oracle.toplink.essentials-library" rev="${com.oracle.toplink.essentials}" />
+		<dependency org="org.eclipse.virgo.test" name="org.eclipse.virgo.test.framework" rev="${org.eclipse.virgo.test}" conf="test->runtime"/>
+		<dependency org="org.eclipse.virgo.util" name="org.eclipse.virgo.util.common" rev="${org.eclipse.virgo.util}" conf="test->compile"/>
+		<dependency org="org.eclipse.virgo.util" name="org.eclipse.virgo.util.io" rev="${org.eclipse.virgo.util}" conf="test->compile"/>
+		<dependency org="org.eclipse.virgo.util" name="org.eclipse.virgo.util.math" rev="${org.eclipse.virgo.util}" conf="test->compile"/>
+		<dependency org="org.eclipse.virgo.nano" name="org.eclipse.virgo.nano.core" rev="${org.eclipse.virgo.nano}" conf="test->compile"/>
+        <dependency org="org.eclipse.virgo.nano" name="org.eclipse.virgo.nano.management" rev="${org.eclipse.virgo.nano}" conf="test->compile"/>
+		<dependency org="org.eclipse.virgo.kernel" name="org.eclipse.virgo.kernel.model" rev="latest.integration" conf="test->compile"/>
+		<dependency org="org.eclipse.virgo.kernel" name="org.eclipse.virgo.kernel.osgi" rev="latest.integration" conf="test->compile"/>
+		<dependency org="org.eclipse.virgo.kernel" name="org.eclipse.virgo.kernel.deployer" rev="latest.integration" conf="test->compile"/>
+		<dependency org="org.eclipse.virgo.mirrored" name="javax.jms" rev="${javax.jms}" conf="test->runtime"/>
+		<dependency org="org.eclipse.virgo.mirrored" name="javax.transaction" rev="${javax.transaction}" conf="test->runtime"/>
+		<dependency org="org.eclipse.virgo.mirrored" name="com.springsource.org.aspectj.weaver" rev="${org.aspectj}" conf="compile->runtime"/>
+		<dependency org="org.hsqldb" name="com.springsource.org.hsqldb" rev="${org.hsqldb}" conf="test->runtime"/>
+		<dependency org="org.eclipse.virgo.mirrored" name="org.apache.commons.dbcp" rev="${org.apache.commons.dbcp}" conf="test->runtime"/>
+		<dependency org="org.eclipse.virgo.mirrored" name="org.apache.commons.pool" rev="${org.apache.commons.pool}" conf="test->runtime"/>
+		<dependency org="org.eclipse.virgo.mirrored" name="org.apache.felix.gogo.runtime" rev="${org.apache.felix.gogo.runtime}" conf="test->runtime"/>
+		
+		<dependency org="org.eclipse.virgo.medic" name="org.eclipse.virgo.medic.core" rev="${org.eclipse.virgo.medic}" conf="test->runtime"/>
+		<dependency org="org.eclipse.virgo.medic" name="org.eclipse.virgo.medic.logbackcorefragment" rev="${org.eclipse.virgo.medic}" conf="test->runtime"/>
+		<dependency org="org.eclipse.virgo.medic" name="org.eclipse.virgo.medic.logbackclassicfragment" rev="${org.eclipse.virgo.medic}" conf="test->runtime"/>
+		<dependency org="org.eclipse.virgo.mirrored" name="ch.qos.logback.classic" rev="${ch.qos.logback.classic}" conf="test->runtime"/>
+		<dependency org="org.eclipse.virgo.mirrored" name="ch.qos.logback.core" rev="${ch.qos.logback.core}" conf="test->runtime"/>
+		
+		<dependency org="org.eclipse.virgo.mirrored" name="org.eclipse.equinox.ds" rev="${org.eclipse.equinox.ds}" conf="test->runtime"/>
+		<dependency org="org.eclipse.virgo.mirrored" name="org.eclipse.equinox.util" rev="${org.eclipse.equinox.util}" conf="test->runtime"/>
+		<dependency org="org.eclipse.virgo.mirrored" name='org.eclipse.equinox.region' rev='${org.eclipse.equinox.region}' conf='test->runtime' />
+		<dependency org="org.junit" name="com.springsource.org.junit" rev="${org.junit}" conf="test->runtime"/>
+		<dependency org="org.springframework" name="org.springframework.spring-library" rev="${org.springframework}" conf="test->runtime"/>
+		<dependency org="org.springframework" name="org.springframework.core" rev="${org.springframework}" conf="test->runtime"/>
+		<dependency org="org.springframework" name="org.springframework.context" rev="${org.springframework}" conf="test->runtime"/>
+		<dependency org="org.springframework" name="org.springframework.orm" rev="${org.springframework}" conf="test->runtime"/>
+		<dependency org="org.springframework" name="org.springframework.transaction" rev="${org.springframework}" conf="test->runtime"/>
+		<dependency org="org.springframework" name="org.springframework.aspects" rev="${org.springframework}" conf="test->runtime"/>
+		<dependency org="org.springframework" name="org.springframework.jdbc" rev="${org.springframework}" conf="test->runtime"/>
+		<dependency org="javax.portlet" name="com.springsource.javax.portlet" rev="${javax.portlet}" conf="test->runtime"/>
+		<dependency org="org.eclipse.virgo.mirrored" name="javax.servlet" rev="${javax.servlet}" conf="test->runtime"/>
+		<dependency org="org.eclipse.virgo.mirrored" name="javax.el" rev="${javax.el}" conf="test->runtime"/>
+		<dependency org="org.eclipse.virgo.kernel" name="org.eclipse.virgo.kernel.equinox.extensions" rev="latest.integration" conf="test->runtime"/>
+		<dependency org="org.eclipse.virgo.test" name="org.eclipse.virgo.test.launcher" rev="${org.eclipse.virgo.test}" conf="test->runtime"/>
+		<dependency org="org.eclipse.virgo.mirrored" name="org.slf4j.jul" rev="${org.slf4j.jul}" conf="test->runtime"/>
+
+		<dependency name='org.eclipse.virgo.repository' rev='${org.eclipse.virgo.repository}' conf='compile->compile' org='org.eclipse.virgo.repository'/>
+
+		<!-- Explicitly listed for 2.5.6.A specific test -->
+		<dependency org="org.springframework" name="org.springframework.beans" rev="2.5.6.A" conf="additional,test->runtime"/>
+		<dependency org="org.springframework" name="org.springframework.core" rev="2.5.6.A" conf="additional,test->runtime"/>
+
+		<!-- Prevent Xerces from being on the classpath to work around Java bug 6723276 during integration testing -->
+		<exclude org="org.apache.xerces"/>
+        <exclude org="org.eclipse.osgi"/>
+
+		<override org="org.eclipse.virgo.mirrored" module="org.eclipse.osgi" rev="${org.eclipse.osgi}"/>
+		<override org="org.eclipse.virgo.test" rev="${org.eclipse.virgo.test}"/>
+		<override org="org.eclipse.virgo.util" rev="${org.eclipse.virgo.util}"/>
+		
+	</dependencies>
+
+</ivy-module>
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/main/java/.gitignore b/kernel/org.eclipse.virgo.kernel.deployer.test/src/main/java/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/main/java/.gitignore
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/main/resources/.gitignore b/kernel/org.eclipse.virgo.kernel.deployer.test/src/main/resources/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/main/resources/.gitignore
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/AbstractDeployerIntegrationTest.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/AbstractDeployerIntegrationTest.java
new file mode 100644
index 0000000..a0c76c6
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/AbstractDeployerIntegrationTest.java
@@ -0,0 +1,129 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+import java.io.IOException;
+import java.lang.management.ManagementFactory;
+
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+
+import org.eclipse.virgo.nano.deployer.api.core.ApplicationDeployer;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.eclipse.virgo.kernel.osgi.framework.OsgiFramework;
+import org.eclipse.virgo.test.framework.dmkernel.DmKernelTestRunner;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.runner.RunWith;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.Version;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.packageadmin.PackageAdmin;
+
+@RunWith(DmKernelTestRunner.class)
+@SuppressWarnings("deprecation")
+public abstract class AbstractDeployerIntegrationTest {
+
+    protected final BundleContext context = FrameworkUtil.getBundle(getClass()).getBundleContext();
+
+    protected static final String TEST_APPS_VERSION = "1.0.0.BUILD-20120912133003";
+
+    protected volatile OsgiFramework framework;
+
+    protected volatile ApplicationDeployer deployer;
+
+    protected volatile BundleContext kernelContext;
+
+    protected volatile PackageAdmin packageAdmin;
+
+    @Before
+    public void setup() {
+        ServiceReference<OsgiFramework> osgiFrameworkServiceReference = context.getServiceReference(OsgiFramework.class);
+        if (osgiFrameworkServiceReference != null) {
+            this.framework = context.getService(osgiFrameworkServiceReference);
+        }
+
+        ServiceReference<ApplicationDeployer> applicationDeployerServiceReference = this.context.getServiceReference(ApplicationDeployer.class);
+        if (applicationDeployerServiceReference != null) {
+            this.deployer = this.context.getService(applicationDeployerServiceReference);
+        }
+
+        this.kernelContext = getKernelContext();
+
+        ServiceReference<PackageAdmin> packageAdminServiceReference = context.getServiceReference(PackageAdmin.class);
+        if (packageAdminServiceReference != null) {
+            this.packageAdmin = context.getService(packageAdminServiceReference);
+        }
+    }
+    
+    private BundleContext getKernelContext() {
+        return this.context.getBundle(0L).getBundleContext();
+    }
+
+    @BeforeClass
+    public static void awaitKernelStartup() throws Exception {
+        MBeanServer platformMBeanServer = ManagementFactory.getPlatformMBeanServer();
+        int sleepCount = 800;
+        while (!"STARTED".equals(platformMBeanServer.getAttribute(new ObjectName("org.eclipse.virgo.kernel:type=KernelStatus"), "Status"))) {
+            Thread.sleep(50);
+            if (--sleepCount == 0)
+                break;
+        }
+        assertFalse("Waited for Kernel too long.", sleepCount == 0);
+    }
+
+    protected static void assertDeploymentIdentityEquals(DeploymentIdentity deploymentIdentity, String name, String type, String symbolicName,
+        String version) {
+        String header = String.format("DeploymentIdentity('%s').", name);
+
+        assertEquals(header + "type is incorrect", type, deploymentIdentity.getType());
+        assertEquals(header + "symbolicName is incorrect", symbolicName, deploymentIdentity.getSymbolicName());
+        assertEquals(header + "version is incorrect", new Version(version), new Version(deploymentIdentity.getVersion()));
+    }
+
+    protected Configuration getConfiguration(String pid) throws IOException, InvalidSyntaxException {
+        ServiceReference<?> serviceReference = this.context.getServiceReference(ConfigurationAdmin.class.getName());
+        ConfigurationAdmin configurationAdmin = (ConfigurationAdmin) this.context.getService(serviceReference);
+        try {
+            Configuration[] listConfigurations = configurationAdmin.listConfigurations(null);
+
+            Configuration match = null;
+
+            for (Configuration configuration : listConfigurations) {
+                if (pid.equals(configuration.getPid())) {
+                    match = configuration;
+                }
+            }
+            return match;
+        } finally {
+            this.context.ungetService(serviceReference);
+        }
+    }
+
+    protected Bundle getBundle(String symbolicName, Version version) {
+        Bundle[] bundles = this.context.getBundles();
+        for (Bundle bundle : bundles) {
+            if (symbolicName.equals(bundle.getSymbolicName()) && version.equals(bundle.getVersion())) {
+                return bundle;
+            }
+        }
+        return null;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/AbstractParTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/AbstractParTests.java
new file mode 100644
index 0000000..ca80666
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/AbstractParTests.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.util.jar.JarFile;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.osgi.framework.ServiceRegistration;
+
+import org.eclipse.virgo.kernel.module.ModuleContextEvent;
+import org.eclipse.virgo.kernel.module.ModuleContextEventListener;
+import org.eclipse.virgo.kernel.module.ModuleContextFailedEvent;
+
+/**
+ */
+public abstract class AbstractParTests extends AbstractDeployerIntegrationTest {
+
+    protected DeploymentIdentity deploy(File file) throws Throwable {
+        String appSymbolicName = getApplicationSymbolicName(file);
+
+        FailureTrackingListener listener = new FailureTrackingListener(appSymbolicName);
+        ServiceRegistration<ModuleContextEventListener> registration = this.context.registerService(ModuleContextEventListener.class, listener, null);
+
+        try {
+            DeploymentIdentity deploymentIdentity = this.deployer.deploy(file.toURI());
+            if (listener.cause != null) {
+                throw listener.cause;
+            }
+            return deploymentIdentity;
+        } finally {
+            if (registration != null) {
+                registration.unregister();
+            }
+        }
+    }
+
+    private String getApplicationSymbolicName(File par) throws Exception {
+        JarFile jar = null;
+        try {
+            jar = new JarFile(par);
+            String name = jar.getManifest().getMainAttributes().getValue("Application-SymbolicName");
+            if (name == null) {
+                name = jar.getManifest().getMainAttributes().getValue("Bundle-SymbolicName");
+            }
+            jar.close();
+            assertTrue("Application-SymbolicName or Bundle-SymbolicName cannot be found for file: " + par, name != null && name.length() > 0);
+            return name;
+        } finally {
+            if (jar != null) {
+                jar.close();
+            }
+        }
+    }
+
+    private final class FailureTrackingListener implements ModuleContextEventListener {
+
+        private final String appName;
+
+        private Throwable cause;
+
+        private FailureTrackingListener(String appName) {
+            this.appName = appName;
+        }
+
+        public void onEvent(ModuleContextEvent moduleContextEvent) {
+            String symbolicName = moduleContextEvent.getBundle().getSymbolicName();
+            if (symbolicName.startsWith(this.appName) && moduleContextEvent instanceof ModuleContextFailedEvent) {
+                this.cause = ((ModuleContextFailedEvent) moduleContextEvent).getFailureCause();
+            }
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/AbstractRAMIntegrationTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/AbstractRAMIntegrationTests.java
new file mode 100644
index 0000000..8d62470
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/AbstractRAMIntegrationTests.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import java.lang.management.ManagementFactory;
+
+import javax.management.JMX;
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+
+import org.eclipse.equinox.region.Region;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.eclipse.virgo.kernel.model.management.ManageableArtifact;
+import org.eclipse.virgo.kernel.model.management.RuntimeArtifactModelObjectNameCreator;
+import org.osgi.framework.Version;
+
+import org.eclipse.virgo.kernel.osgi.framework.OsgiFrameworkUtils;
+
+public class AbstractRAMIntegrationTests extends AbstractDeployerIntegrationTest {
+    
+    public ManageableArtifact getManageableArtifact(DeploymentIdentity deploymentIdentity, Region region) {
+        return getManageableArtifact(deploymentIdentity.getType(), deploymentIdentity.getSymbolicName(), new Version(deploymentIdentity.getVersion()), region);
+    }
+    
+    public ManageableArtifact getManageableArtifact(String type, String name, Version version, Region region) {
+        RuntimeArtifactModelObjectNameCreator objectNameCreator = OsgiFrameworkUtils.getService(this.kernelContext, RuntimeArtifactModelObjectNameCreator.class).getService();
+        ObjectName objectName = objectNameCreator.createArtifactModel(type, name, version, region);
+        
+        return getManageableArtifact(objectName);
+    }
+    
+    private ManageableArtifact getManageableArtifact(ObjectName objectName) {
+        MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();        
+        ManageableArtifact artifact = JMX.newMXBeanProxy(mBeanServer, objectName, ManageableArtifact.class);
+        return artifact;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/ActivatorTcclTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/ActivatorTcclTests.java
new file mode 100644
index 0000000..2846e56
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/ActivatorTcclTests.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import java.io.File;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.junit.Test;
+
+
+
+/**
+ *
+ */
+public class ActivatorTcclTests extends AbstractDeployerIntegrationTest {
+    
+    @Test
+    public void tcclDuringBundleActivation() throws DeploymentException {
+        // Bundle will fail to start if the TCCL is not the bundle's class loader during activator start()
+        DeploymentIdentity deployed = this.deployer.deploy(new File("src/test/resources/activator-tccl.jar").toURI());
+        // Bundle will fail to stop if the TCCL is not the bundle's class loader during activator stop()
+        this.deployer.undeploy(deployed);
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/ApplicationContextUtils.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/ApplicationContextUtils.java
new file mode 100644
index 0000000..af0e46f
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/ApplicationContextUtils.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+import org.springframework.context.ApplicationContext;
+
+final class ApplicationContextUtils {
+    
+    static void assertApplicationContextContainsExpectedBeanDefinitions(ApplicationContext applicationContext, String... beanNames) {        
+        for (String beanName : beanNames) {
+            assertTrue("A definition for a bean named " + beanName + " was not found in the application context", applicationContext.containsBeanDefinition(beanName));
+        }        
+    }
+    
+    static ApplicationContext getApplicationContext(BundleContext bundleContext, String symbolicName) {
+        ServiceReference<?>[] serviceReferences = null;
+        
+        try {
+            serviceReferences = bundleContext.getServiceReferences(ApplicationContext.class.getName(), "(Bundle-SymbolicName=" + symbolicName + ")");
+        } catch (InvalidSyntaxException e) {
+            fail(e.toString());
+        }
+        
+        if (serviceReferences != null) {
+            assertEquals("Found " + serviceReferences.length + " matching service references when only 1 was expected", 1, serviceReferences.length);
+            return (ApplicationContext) bundleContext.getService(serviceReferences[0]);
+        }
+        
+        return null;
+    }
+    
+    static void awaitApplicationContext(BundleContext bundleContext, String symbolicName, long timeout) {
+        long endTime = System.currentTimeMillis() + (timeout * 1000);
+        
+        ApplicationContext applicationContext = null;
+        
+        while (applicationContext == null && System.currentTimeMillis() < endTime) {
+            applicationContext = getApplicationContext(bundleContext, symbolicName);
+        }
+        
+        if (applicationContext == null) {
+            fail("ApplicationContext for bundle with symbolic name '" + symbolicName + "' was not published within " + timeout + " seconds.");
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/BlueprintDependencyMonitorIntegrationTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/BlueprintDependencyMonitorIntegrationTests.java
new file mode 100644
index 0000000..9c680e8
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/BlueprintDependencyMonitorIntegrationTests.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ */
+public class BlueprintDependencyMonitorIntegrationTests extends AbstractDeployerIntegrationTest {
+    
+    private static final File LOG_FILE = new File("build/serviceability/eventlog/eventlog.log");
+
+    private int existingLines;
+
+    @Before
+    public void countExistingLogLines() throws IOException {
+        BufferedReader reader = new BufferedReader(new FileReader(LOG_FILE));
+        String line = reader.readLine();
+        existingLines = 0;
+        while (line != null) {
+            existingLines++;
+            line = reader.readLine();
+        }
+        reader.close();
+    }
+
+    private List<String> findLogMessages(String logCode) throws IOException {
+        List<String> logMessages = new ArrayList<String>();
+        try {
+            Thread.sleep(1000);
+        } catch (InterruptedException ie) {
+
+        }
+
+        BufferedReader reader = new BufferedReader(new FileReader(LOG_FILE));
+        String line;
+        int lines = 0;
+        while ((line = reader.readLine()) != null) {
+            lines++;
+            if (lines > existingLines) {
+                int index = line.indexOf(logCode);
+                if (index > -1) {
+                    logMessages.add(line.substring(index));
+                }
+            }
+        }
+        reader.close();
+        return logMessages;
+    }
+
+
+    @Test
+    public void testBlueprintDependencyMonitoring() throws Exception {
+        this.deployer.deploy(new File("src/test/resources/QuickConsumerBlueprint.jar").toURI());
+        
+        // We need to sleep for a little while to give the
+        // log output sufficient time to make it out onto disk
+        try {
+            Thread.sleep(21000);
+        } catch (InterruptedException _) {
+            // Ignore
+        }
+        
+        assertEquals("One KE0100W message was expected", 1, findLogMessages("<KE0100W>").size());
+        assertEquals("One KE0101I message was expected", 1, findLogMessages("<KE0101I>").size());
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/BundleActivationPolicyTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/BundleActivationPolicyTests.java
new file mode 100644
index 0000000..92945d9
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/BundleActivationPolicyTests.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+
+import org.junit.Ignore;
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+
+/**
+ */
+@Ignore("[DMS-2882] Bundle activation policy is current ignored by the pipelined deployer")
+public class BundleActivationPolicyTests extends AbstractParTests {
+    
+    private static final String MODULE_A_BUNDLE_SYMBOLIC_NAME = "bundle.activation.policy.module.a";
+    private static final String MODULE_B_BUNDLE_SYMBOLIC_NAME = "bundle.activation.policy.module.b";
+    
+    @Test
+    public void lazyActivationPolicy() throws Throwable {
+        deploy(new File("src/test/resources/bundle-activation-policy.par"));
+        Bundle[] bundles = this.framework.getBundleContext().getBundles();
+        Bundle moduleA = null;
+        Bundle moduleB = null;
+        
+        for (Bundle bundle : bundles) {
+            String bundleSymbolicName = (String)bundle.getHeaders().get("Bundle-SymbolicName");
+            if (bundleSymbolicName != null) {
+                if (bundleSymbolicName.endsWith(MODULE_A_BUNDLE_SYMBOLIC_NAME)) {
+                    moduleA = bundle;
+                    if (moduleB != null) {
+                        break;
+                    }
+                } else if (bundleSymbolicName.endsWith(MODULE_B_BUNDLE_SYMBOLIC_NAME)) {
+                    moduleB = bundle;
+                    if (moduleA != null) {
+                        break;
+                    }
+                }
+            }
+        }
+        
+        assertNotNull(moduleA);
+        assertNotNull(moduleB);
+        
+        assertTrue(moduleA.getState() == Bundle.ACTIVE);
+        assertTrue(moduleB.getState() == Bundle.STARTING);
+        
+        Class<?> clazz = moduleA.loadClass("a.UseBundleB");
+        Object instance = clazz.newInstance();
+        assertNotNull(clazz.getMethod("getClassInBundleB", (Class[])null).invoke(instance, (Object[])null));
+        
+        assertTrue(moduleA.getState() == Bundle.ACTIVE);
+        assertTrue(moduleB.getState() == Bundle.ACTIVE);
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/BundleDeployerIntegrationTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/BundleDeployerIntegrationTests.java
new file mode 100644
index 0000000..4b08768
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/BundleDeployerIntegrationTests.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+import java.io.File;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.junit.Test;
+
+
+/**
+ * Test deploying a bundle devoid of personality.
+ * 
+ */
+public class BundleDeployerIntegrationTests extends AbstractDeployerIntegrationTest {
+
+    private static final String TEST_BUNDLE_TYPE = "bundle";
+
+    private static final String TEST_BUNDLE_SYMBOLIC_NAME = "com.springsource.kernel.deployer.testbundle";
+
+    private static final String TEST_BUNDLE_VERSION = "2.0.0.build-20080229163630";
+
+    @Test
+    public void testDeployer() throws Exception {
+        File file = new File("src/test/resources/com.springsource.platform.deployer.testbundle.jar");
+
+        DeploymentIdentity deploymentId = this.deployer.deploy(file.toURI());
+        
+        assertDeploymentIdentityEquals(deploymentId, "testbundle.jar", TEST_BUNDLE_TYPE, TEST_BUNDLE_SYMBOLIC_NAME, TEST_BUNDLE_VERSION);
+
+        assertNotNull(ApplicationContextUtils.getApplicationContext(this.context, TEST_BUNDLE_SYMBOLIC_NAME));
+
+        this.deployer.undeploy(deploymentId.getType(), deploymentId.getSymbolicName(), deploymentId.getVersion());
+
+        // Check that the test bundle's application context is destroyed.
+        assertNull(ApplicationContextUtils.getApplicationContext(this.context, TEST_BUNDLE_SYMBOLIC_NAME));
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/BundleLifecycleTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/BundleLifecycleTests.java
new file mode 100644
index 0000000..189849c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/BundleLifecycleTests.java
@@ -0,0 +1,155 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import java.io.File;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+
+import org.eclipse.virgo.kernel.install.artifact.BundleInstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifactLifecycleListener;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifactLifecycleListenerSupport;
+
+/**
+ * Test bundle state when listening to deployer lifecycle events.
+ * 
+ */
+public class BundleLifecycleTests extends AbstractDeployerIntegrationTest {    
+
+    @Before
+    public void setUp() throws Exception {                
+        this.context.registerService(InstallArtifactLifecycleListener.class.getName(), new Listener(), null);
+    }
+
+    @Test public void testDeployer() throws Exception {
+        File file = new File("src/test/resources/dummy.jar");
+
+        DeploymentIdentity deploymentIdentity = this.deployer.deploy(file.toURI());
+        
+
+        this.deployer.undeploy(deploymentIdentity);
+        
+    }
+    
+    private class Listener extends InstallArtifactLifecycleListenerSupport {
+
+        /** 
+         * {@inheritDoc}
+         */
+        @Override
+        public void onInstalled(InstallArtifact installArtifact) {
+            assertBundleState(installArtifact, Bundle.INSTALLED);
+        }
+
+        /** 
+         * {@inheritDoc}
+         */
+        @Override
+        public void onInstalling(InstallArtifact installArtifact) {
+            assertNoBundle(installArtifact);
+        }
+
+        /** 
+         * {@inheritDoc}
+         */
+        @Override
+        public void onResolved(InstallArtifact installArtifact) {
+            assertBundleState(installArtifact, Bundle.RESOLVED);            
+        }
+
+        /** 
+         * {@inheritDoc}
+         */
+        @Override
+        public void onResolving(InstallArtifact installArtifact) {
+            assertBundleState(installArtifact, Bundle.INSTALLED);
+        }
+
+        /** 
+         * {@inheritDoc}
+         */
+        @Override
+        public void onStarted(InstallArtifact installArtifact) {
+            assertBundleState(installArtifact, Bundle.ACTIVE);
+        }
+
+        /** 
+         * {@inheritDoc}
+         */
+        @Override
+        public void onStarting(InstallArtifact installArtifact) {
+            assertBundleState(installArtifact, Bundle.STARTING);
+        }
+
+        /** 
+         * {@inheritDoc}
+         */
+        @Override
+        public void onStopped(InstallArtifact installArtifact) {
+            assertBundleState(installArtifact, Bundle.RESOLVED);
+        }
+
+        /** 
+         * {@inheritDoc}
+         */
+        @Override
+        public void onStopping(InstallArtifact installArtifact) {
+            assertBundleState(installArtifact, Bundle.STOPPING);
+        }
+
+        /** 
+         * {@inheritDoc}
+         */
+        @Override
+        public void onUninstalled(InstallArtifact installArtifact) {
+            assertNoBundle(installArtifact);
+        }
+
+        /** 
+         * {@inheritDoc}
+         */
+        @Override
+        public void onUninstalling(InstallArtifact installArtifact) {
+            assertBundleState(installArtifact, Bundle.RESOLVED);
+        }
+
+        /** 
+         * {@inheritDoc}
+         */
+        @Override
+        public void onUnresolved(InstallArtifact installArtifact) {
+            assertBundleState(installArtifact, Bundle.INSTALLED);
+        }
+        
+        
+    }
+
+    public void assertBundleState(InstallArtifact installArtifact, int expectedBundleState) {
+        Assert.assertTrue(installArtifact instanceof BundleInstallArtifact);
+        BundleInstallArtifact bundleInstallArtifact = (BundleInstallArtifact)installArtifact;
+        Bundle bundle = bundleInstallArtifact.getBundle();
+        Assert.assertNotNull(bundle);
+        Assert.assertEquals(expectedBundleState, bundle.getState());
+    }
+    
+    public void assertNoBundle(InstallArtifact installArtifact) {
+        Assert.assertTrue(installArtifact instanceof BundleInstallArtifact);
+        BundleInstallArtifact bundleInstallArtifact = (BundleInstallArtifact)installArtifact;
+        Bundle bundle = bundleInstallArtifact.getBundle();
+        Assert.assertNull(bundle);
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/BundleRefreshTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/BundleRefreshTests.java
new file mode 100644
index 0000000..3348e5a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/BundleRefreshTests.java
@@ -0,0 +1,155 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.fail;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceRegistration;
+
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifactLifecycleListener;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifactLifecycleListenerSupport;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.util.io.PathReference;
+
+/**
+ * Test refreshing single bundles.
+ * <p />
+ * 
+ */
+public class BundleRefreshTests extends AbstractDeployerIntegrationTest {
+
+    private final String TEST_IMPORTER_BUNDLE_SYMBOLIC_NAME = "RefreshImporter";
+
+    @Test
+    public void testBundleRefresh() throws DeploymentException, InterruptedException {
+        UninstallTrackingInstallArtifactLifecycleListener listener = new UninstallTrackingInstallArtifactLifecycleListener();
+        ServiceRegistration<InstallArtifactLifecycleListener> listenerRegistration = this.context.registerService(InstallArtifactLifecycleListener.class, listener, null);
+        
+        new PathReference("./target/bundle-refresh").createDirectory();
+
+        PathReference exporterSource = new PathReference("./src/test/resources/bundle-refresh/RefreshExporter.jar");
+        PathReference exporter = new PathReference("./target/bundle-refresh/RefreshExporter.jar");
+        exporter.delete();
+        exporterSource.copy(exporter);
+
+        this.deployer.deploy(exporter.toURI());
+
+        PathReference importer = new PathReference("./src/test/resources/bundle-refresh/RefreshImporter.jar");
+        this.deployer.deploy(importer.toURI());
+
+        // Check that the test bundle's application contexts are created.
+        assertNotNull(ApplicationContextUtils.getApplicationContext(this.context, TEST_IMPORTER_BUNDLE_SYMBOLIC_NAME));
+
+        checkV1Classes();
+
+        PathReference exporterv2Source = new PathReference("./src/test/resources/bundle-refresh/RefreshExporterv2.jar");
+        exporter.delete();
+        exporterv2Source.copy(exporter);
+
+        this.deployer.refresh(exporter.toURI(), "RefreshExporter");
+
+        Thread.sleep(1000); // wait for appCtx to be properly closed before waiting for it to be created.
+
+        ApplicationContextUtils.awaitApplicationContext(this.context, TEST_IMPORTER_BUNDLE_SYMBOLIC_NAME, 10);
+
+        checkV2Classes();
+        
+        assertEquals(0, listener.getUninstalledArtifacts().size());
+
+        PathReference exporterv3Source = new PathReference("./src/test/resources/bundle-refresh/RefreshExporterv3.jar");
+        exporter.delete();
+        exporterv3Source.copy(exporter);
+
+        this.deployer.refresh(exporter.toURI(), "RefreshExporter");
+        Thread.sleep(1000); // wait for appCtx to be properly closed before waiting for it to be created.
+
+        ApplicationContextUtils.awaitApplicationContext(this.context, TEST_IMPORTER_BUNDLE_SYMBOLIC_NAME, 10);
+
+        checkV3Classes();
+        
+        assertEquals(0, listener.getUninstalledArtifacts().size());        
+        
+        listenerRegistration.unregister();
+    }
+
+    private void checkV1Classes() {
+        LoadableClasses loadableClasses = (LoadableClasses) getApplicationBundleContext().getService(
+            getApplicationBundleContext().getServiceReference("org.eclipse.virgo.kernel.deployer.test.LoadableClasses"));
+        Set<String> loadableClassNames = loadableClasses.getLoadableClasses();
+        Assert.assertTrue(loadableClassNames.contains("refresh.exporter.b1.B11"));
+        Assert.assertFalse(loadableClassNames.contains("refresh.exporter.b1.B12"));
+        Assert.assertFalse(loadableClassNames.contains("refresh.exporter.b2.B21"));
+    }
+
+    private void checkV2Classes() {
+        LoadableClasses loadableClasses = (LoadableClasses) getApplicationBundleContext().getService(
+            getApplicationBundleContext().getServiceReference("org.eclipse.virgo.kernel.deployer.test.LoadableClasses"));
+        Set<String> loadableClassNames = loadableClasses.getLoadableClasses();
+        Assert.assertTrue(loadableClassNames.contains("refresh.exporter.b1.B11"));
+        Assert.assertTrue(loadableClassNames.contains("refresh.exporter.b1.B12"));
+        Assert.assertFalse(loadableClassNames.contains("refresh.exporter.b2.B21"));
+    }
+
+    private void checkV3Classes() {
+        LoadableClasses loadableClasses = (LoadableClasses) getApplicationBundleContext().getService(
+            getApplicationBundleContext().getServiceReference("org.eclipse.virgo.kernel.deployer.test.LoadableClasses"));
+        Set<String> loadableClassNames = loadableClasses.getLoadableClasses();
+        Assert.assertTrue(loadableClassNames.contains("refresh.exporter.b1.B11"));
+        Assert.assertTrue(loadableClassNames.contains("refresh.exporter.b1.B12"));
+        Assert.assertTrue(loadableClassNames.contains("refresh.exporter.b2.B21"));
+    }
+
+    private BundleContext getApplicationBundleContext() {
+        Bundle[] bundles = this.context.getBundles();
+        for (Bundle bundle : bundles) {
+            String symbolicName = bundle.getSymbolicName();
+            if (symbolicName.contains("RefreshImporter")) {
+                System.out.println(bundle.getSymbolicName());
+                return bundle.getBundleContext();
+            }
+        }
+        fail("Cannot find bundle context");
+        return null;
+    }
+    
+    private final class UninstallTrackingInstallArtifactLifecycleListener extends InstallArtifactLifecycleListenerSupport {
+        
+        private final List<InstallArtifact> uninstalledArtifacts = new ArrayList<InstallArtifact>();
+        
+        private final Object monitor = new Object();
+
+        @Override
+        public void onUninstalled(InstallArtifact installArtifact) throws DeploymentException {
+            synchronized (this.monitor) {
+                this.uninstalledArtifacts.add(installArtifact);
+            }
+        }
+        
+        private List<InstallArtifact> getUninstalledArtifacts() {
+            synchronized (this.monitor) {
+                return new ArrayList<InstallArtifact>(this.uninstalledArtifacts);
+            }
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/ClasspathScanningTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/ClasspathScanningTests.java
new file mode 100644
index 0000000..4deeed6
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/ClasspathScanningTests.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import java.io.File;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.ServiceReference;
+
+import org.eclipse.virgo.nano.deployer.api.core.ApplicationDeployer;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.eclipse.virgo.util.io.PathReference;
+
+public class ClasspathScanningTests extends AbstractDeployerIntegrationTest {
+
+    private ServiceReference<ApplicationDeployer> appDeployerServiceReference;
+
+    private ApplicationDeployer appDeployer;
+
+    @Before
+    public void setUp() throws Exception {
+        cleanUp();
+
+        this.appDeployerServiceReference = this.context.getServiceReference(ApplicationDeployer.class);
+        this.appDeployer = (ApplicationDeployer) this.context.getService(this.appDeployerServiceReference);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        if (this.appDeployerServiceReference != null) {
+            this.context.ungetService(this.appDeployerServiceReference);
+        }
+        cleanUp();
+    }
+
+    @Test
+    public void testComponentAnnotatedClassesFromImportedPackagesArePresentInApplicationContext() throws Exception  {
+        DeploymentIdentity identity = this.appDeployer.deploy(new File("src/test/resources/classpath-scanning.par").toURI());
+
+        String symbolicName = "ClasspathScanning-1-com.foo.app";
+
+        ApplicationContextUtils.assertApplicationContextContainsExpectedBeanDefinitions(ApplicationContextUtils.getApplicationContext(this.context,
+            symbolicName), "dependencyOne", "dependencyTwo");
+        
+        this.appDeployer.undeploy(identity);
+    }
+
+    private void cleanUp() {
+        cleanDirectory("./target/org.eclipse.virgo.kernel");
+        cleanDirectory("./target/install");
+        cleanDirectory("./target/locationCache");
+    }
+
+    private void cleanDirectory(String dir) {
+        PathReference prd = new PathReference(dir);
+        prd.delete(true);
+        prd.createDirectory();
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/CommonsDbcpTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/CommonsDbcpTests.java
new file mode 100644
index 0000000..828ef54
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/CommonsDbcpTests.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import java.io.File;
+
+import org.hsqldb.Server;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.eclipse.virgo.util.io.FileSystemUtils;
+
+public class CommonsDbcpTests extends AbstractDeployerIntegrationTest {
+
+    private static Server server;
+
+    @BeforeClass
+    public static void setupDatabase() {
+        FileSystemUtils.deleteRecursively(new File("build/db"));
+        server = new Server();
+        server.setDatabasePath(0, "build/db/commons-dbcp-test-db");
+        server.setDatabaseName(0, "");
+        server.setSilent(true);
+        server.start();
+    }
+
+    @AfterClass
+    public static void stopDatabase() {
+    	if (server != null) {
+    		server.stop();
+    	}
+    }
+
+    @Test
+    public void testCommonsDbcpClassLoading() throws Exception {
+        this.deployer.deploy(new File(System.getProperty("user.home") + "/virgo-build-cache/ivy-cache/repository/org.eclipse.virgo.mirrored/org.apache.commons.dbcp/1.4.0.v201204271417/org.apache.commons.dbcp-1.4.0.v201204271417.jar").toURI());
+        this.deployer.deploy(new File("src/test/resources/com.springsource.platform.test.commons-dbcp.jar").toURI());
+        ApplicationContextUtils.assertApplicationContextContainsExpectedBeanDefinitions(ApplicationContextUtils.getApplicationContext(this.context, "com.springsource.server.test.commons-dbcp"), "dataSourceTest");
+    }    
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/ConfigurationDeploymentTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/ConfigurationDeploymentTests.java
new file mode 100644
index 0000000..4a90e7c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/ConfigurationDeploymentTests.java
@@ -0,0 +1,242 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Dictionary;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.framework.Version;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.cm.ConfigurationEvent;
+import org.osgi.service.cm.ConfigurationListener;
+
+import org.eclipse.virgo.nano.deployer.api.core.ApplicationDeployer;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.eclipse.virgo.util.io.FileCopyUtils;
+
+/**
+ * Test deploying a configuration properties file.
+ * 
+ */
+public class ConfigurationDeploymentTests extends AbstractDeployerIntegrationTest implements ConfigurationListener {
+
+    private ServiceReference<ApplicationDeployer> appDeployerServiceReference;
+
+    private ApplicationDeployer appDeployer;
+
+    private ServiceReference<ConfigurationAdmin> configAdminServiceReference;
+
+    private ConfigurationAdmin configAdmin;
+
+    private volatile int cmUpdates;
+
+    private volatile int cmDeletes;
+
+    private ServiceRegistration<ConfigurationListener> configurationListenerServiceRegistration;
+
+    @Before
+    public void setUp() throws Exception {
+        this.appDeployerServiceReference = this.context.getServiceReference(ApplicationDeployer.class);
+        this.appDeployer = (ApplicationDeployer) this.context.getService(this.appDeployerServiceReference);
+        this.configAdminServiceReference = this.context.getServiceReference(ConfigurationAdmin.class);
+        this.configAdmin = (ConfigurationAdmin) this.context.getService(this.configAdminServiceReference);
+        this.cmUpdates = 0;
+        this.cmDeletes = 0;
+        this.configurationListenerServiceRegistration = context.registerService(ConfigurationListener.class, this, null);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        if (this.appDeployerServiceReference != null) {
+            this.context.ungetService(this.appDeployerServiceReference);
+        }
+        if (this.configAdminServiceReference != null) {
+            this.context.ungetService(this.configAdminServiceReference);
+        }
+        if (this.configurationListenerServiceRegistration != null) {
+            this.configurationListenerServiceRegistration.unregister();
+        }
+    }
+
+    @Test
+    public void testDeployConfig() throws Exception {
+        File file = new File("src/test/resources/configuration.deployment/t.properties");
+
+        DeploymentIdentity deploymentIdentity = this.appDeployer.deploy(file.toURI());
+
+        assertDeploymentIdentityEquals(deploymentIdentity, "t.properties", "configuration", "t", "0");
+        Assert.assertTrue(isInDeploymentIdentities(deploymentIdentity));
+        checkConfigAvailable();
+        Assert.assertEquals(1, this.cmUpdates);
+        Assert.assertEquals(0, this.cmDeletes);
+
+        this.appDeployer.undeploy(deploymentIdentity);
+        Assert.assertFalse(isInDeploymentIdentities(deploymentIdentity));
+        checkConfigUnavailable();
+        Assert.assertEquals(1, this.cmUpdates);
+        Assert.assertEquals(1, this.cmDeletes);
+
+        // Check that the configuration can be deployed again after being undeployed
+        this.appDeployer.deploy(file.toURI());
+        Assert.assertTrue(isInDeploymentIdentities(deploymentIdentity));
+        checkConfigAvailable();
+        Assert.assertEquals(2, this.cmUpdates);
+        Assert.assertEquals(1, this.cmDeletes);
+
+        // And that a deploy while deployed works as well
+        this.appDeployer.deploy(file.toURI());
+        Assert.assertTrue(isInDeploymentIdentities(deploymentIdentity));
+        checkConfigAvailable();
+        Assert.assertEquals(3, this.cmUpdates);
+        Assert.assertEquals(1, this.cmDeletes);
+
+        this.appDeployer.undeploy(deploymentIdentity);
+        Assert.assertFalse(isInDeploymentIdentities(deploymentIdentity));
+        checkConfigUnavailable();
+        Assert.assertEquals(3, this.cmUpdates);
+        Assert.assertEquals(2, this.cmDeletes);
+
+    }
+
+    @Test
+    public void testHotDeployConfig() throws Exception {
+        File source = new File("src/test/resources/configuration.deployment/t.properties");
+        File target = new File("build/pickup/t.properties");
+
+        if (target.exists()) {
+            assertTrue(target.delete());
+        }
+
+        try {
+            FileCopyUtils.copy(source, target);
+            pollUntilInDeploymentIdentities("configuration", "t", "0.0.0");
+
+            checkConfigAvailable();
+
+            target.delete();
+            pollUntilNotInDeploymentIdentities("configuration", "t", "0.0.0");
+            checkConfigUnavailable();
+
+            // Check that the configuration can be deployed again after being undeployed
+            FileCopyUtils.copy(source, target);
+            pollUntilInDeploymentIdentities("configuration", "t", "0.0.0");
+            checkConfigAvailable();
+
+            // Trigger a redeploy of the file by the hot deployer and sleep till
+            // the redeploy has taken effect.
+            target.setLastModified(System.currentTimeMillis() + 1000);
+            Thread.sleep(3000);
+            pollUntilInDeploymentIdentities("configuration", "t", "0.0.0");
+            checkConfigAvailable();
+
+            target.delete();
+            pollUntilNotInDeploymentIdentities("configuration", "t", "0.0.0");
+            checkConfigUnavailable();
+        } finally {
+            target.delete();
+        }
+    }
+
+    private void pollUntilInDeploymentIdentities(String type, String name, String version) throws InterruptedException {
+        ConfigurationTestUtils.pollUntilInDeploymentIdentities(appDeployer, type, name, version);
+    }
+
+    private void pollUntilNotInDeploymentIdentities(String type, String name, String version) throws InterruptedException {
+        ConfigurationTestUtils.pollUntilNotInDeploymentIdentities(appDeployer, type, name, version);
+    }
+
+    @Test
+    public void testDeployEmptyConfig() throws Exception {
+        File file = new File("src/test/resources/configuration.deployment/empty.properties");
+
+        DeploymentIdentity deploymentIdentity = this.appDeployer.deploy(file.toURI());
+        Assert.assertEquals("configuration", deploymentIdentity.getType());
+        Assert.assertEquals("empty", deploymentIdentity.getSymbolicName());
+        Assert.assertEquals(Version.emptyVersion, new Version(deploymentIdentity.getVersion()));
+
+        Assert.assertTrue(isInDeploymentIdentities(deploymentIdentity));
+        Configuration configuration = this.configAdmin.getConfiguration("empty", null);
+        Dictionary<String, Object> dictionary = configuration.getProperties();
+        Assert.assertEquals(1, dictionary.size());
+        Assert.assertEquals("empty", dictionary.get("service.pid"));
+
+        this.appDeployer.undeploy(deploymentIdentity);
+        Assert.assertFalse(isInDeploymentIdentities(deploymentIdentity));
+        configuration = this.configAdmin.getConfiguration("empty", null);
+        Assert.assertNull(configuration.getProperties());
+    }
+
+    private boolean isInDeploymentIdentities(DeploymentIdentity deploymentIdentity) {
+        return ConfigurationTestUtils.isInDeploymentIdentities(appDeployer, deploymentIdentity);
+    }
+
+    private boolean isInConfigurationAdmin() throws IOException, InvalidSyntaxException {
+        return ConfigurationTestUtils.isInConfigurationAdmin(configAdmin, "t");
+    }
+
+    private void checkConfigAvailable() throws IOException, InvalidSyntaxException, InterruptedException {
+        // Allow asynchronous delivery of configuration events to complete
+        Thread.sleep(100);
+
+        long start = System.currentTimeMillis();
+
+        while (!isInConfigurationAdmin()) {
+            long delta = System.currentTimeMillis() - start;
+            if (delta > 60000) {
+                fail("Configuration was not available in ConfigAdmin within 60 seconds");
+            }
+            Thread.sleep(100);
+        }
+
+        Configuration configuration = this.configAdmin.getConfiguration("t", null);
+        Dictionary<String, Object> dictionary = configuration.getProperties();
+        Assert.assertEquals("t", dictionary.get("service.pid"));
+        Assert.assertEquals("b", dictionary.get("a"));
+    }
+
+    private void checkConfigUnavailable() throws IOException, InvalidSyntaxException, InterruptedException {
+        // Allow asynchronous delivery of configuration events to complete
+        Thread.sleep(100);
+
+        assertFalse(isInConfigurationAdmin());
+    }
+
+    @Override
+    public void configurationEvent(ConfigurationEvent event) {
+        switch (event.getType()) {
+            case ConfigurationEvent.CM_UPDATED:
+                this.cmUpdates++;
+                break;
+            case ConfigurationEvent.CM_DELETED:
+                this.cmDeletes++;
+                break;
+            default:
+                Assert.assertTrue(false);
+                break;
+        }
+
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/ConfigurationTestUtils.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/ConfigurationTestUtils.java
new file mode 100644
index 0000000..683a251
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/ConfigurationTestUtils.java
@@ -0,0 +1,123 @@
+/*
+ * This file is part of the Eclipse Virgo project.
+ *
+ * Copyright (c) 2011 Chariot Solutions LLC
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    dsklyut - initial contribution
+ */
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import static org.junit.Assert.fail;
+
+import java.io.IOException;
+
+import org.eclipse.virgo.nano.deployer.api.core.ApplicationDeployer;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+
+/**
+ * Utilities to share between configuration and factory configuration tests.
+ * <p />
+ * 
+ */
+final class ConfigurationTestUtils {
+
+    static void pollUntilInDeploymentIdentities(ApplicationDeployer appDeployer, String type, String name, String version)
+        throws InterruptedException {
+        long start = System.currentTimeMillis();
+
+        while (!isInDeploymentIdentities(appDeployer, type, name, version)) {
+            long delta = System.currentTimeMillis() - start;
+            if (delta > 60000) {
+                fail("Deployment identity was not available within 60 seconds");
+            }
+            Thread.sleep(100);
+        }
+    }
+
+    static void pollUntilNotInDeploymentIdentities(ApplicationDeployer appDeployer, String type, String name, String version)
+        throws InterruptedException {
+        long start = System.currentTimeMillis();
+
+        while (isInDeploymentIdentities(appDeployer, type, name, version)) {
+            long delta = System.currentTimeMillis() - start;
+            if (delta > 60000) {
+                fail("Deployment identity was still available after 60 seconds");
+            }
+            Thread.sleep(100);
+        }
+    }
+
+    static boolean isInDeploymentIdentities(ApplicationDeployer appDeployer, DeploymentIdentity deploymentIdentity) {
+        for (DeploymentIdentity id : appDeployer.getDeploymentIdentities()) {
+            if (deploymentIdentity.equals(id)) {
+                return true;
+            }
+        }
+        return false;
+
+    }
+
+    static boolean isInDeploymentIdentities(ApplicationDeployer appDeployer, String type, String name, String version) {
+        for (DeploymentIdentity id : appDeployer.getDeploymentIdentities()) {
+            if (id.getType().equals(type) && id.getSymbolicName().equals(name) && id.getVersion().equals(version)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    static boolean isInConfigurationAdmin(ConfigurationAdmin configAdmin, String pid) throws IOException, InvalidSyntaxException {
+        Configuration[] configurations = configAdmin.listConfigurations(null);
+        for (Configuration configuration : configurations) {
+            if (pid.equals(configuration.getPid())) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    static boolean isFactoryInConfigurationAdmin(ConfigurationAdmin configAdmin, String factoryPid) throws IOException, InvalidSyntaxException {
+        Configuration[] configurations = configAdmin.listConfigurations(null);
+        for (Configuration configuration : configurations) {
+            if (factoryPid.equals(configuration.getFactoryPid())) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    static void pollUntilFactoryInConfigurationAdmin(ConfigurationAdmin configAdmin, String factoryPid) throws Exception {
+        long start = System.currentTimeMillis();
+
+        while (!isFactoryInConfigurationAdmin(configAdmin, factoryPid)) {
+            long delta = System.currentTimeMillis() - start;
+            if (delta > 60000) {
+                fail("Deployment identity was not available within 60 seconds");
+            }
+            Thread.sleep(100);
+        }
+    }
+
+    static void pollUntilFactoryNotInConfigurationAdmin(ConfigurationAdmin configAdmin, String factoryPid) throws Exception {
+        long start = System.currentTimeMillis();
+
+        while (isFactoryInConfigurationAdmin(configAdmin, factoryPid)) {
+            long delta = System.currentTimeMillis() - start;
+            if (delta > 60000) {
+                fail("Deployment identity was still available after 60 seconds");
+            }
+            Thread.sleep(100);
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/DMSPlanDeploymentTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/DMSPlanDeploymentTests.java
new file mode 100644
index 0000000..d98661b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/DMSPlanDeploymentTests.java
@@ -0,0 +1,195 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.List;
+import java.util.Properties;
+import java.util.Set;
+import java.util.Map.Entry;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+
+
+public class DMSPlanDeploymentTests extends AbstractDeployerIntegrationTest {
+
+	private ServiceReference<ConfigurationAdmin> configAdminServiceReference;
+
+	private ConfigurationAdmin configAdmin;
+	
+	@Test
+	public void planReferencingAPar() throws Exception {
+	    testPlanDeployment(new File("src/test/resources/dms-test-with-par.plan"), null, "par-deployed-by-plan-1-one");
+	}
+	
+	@Test(expected=DeploymentException.class)
+    public void scopedPlanReferencingAPar() throws Exception {
+        testPlanDeployment(new File("src/test/resources/dms-scoped-test-with-par.plan"), null);
+    }
+
+    @Test
+    public void scopedBundlesAndConfig() throws Exception {
+        String oneBsn = "simple.bundle.one";
+        String twoBsn = "simple.bundle.two";
+
+        testPlanDeployment(new File("src/test/resources/dms-test.plan"), new File("src/test/resources/plan-deployment/com.foo.bar.properties"), oneBsn, twoBsn);
+    }
+    
+    @Test
+    public void testSimpleBundleWithFragment() throws Exception {
+        String oneBsn = "simple.bundle.one";
+        String twoBsn = "simple.fragment.one";
+
+        testPlanDeployment(new File("src/test/resources/dms-fragment.plan"), null, oneBsn, twoBsn);
+    }
+    
+    @Test
+    public void testUnscopedNonAtomicPlan() throws Exception {
+        String oneBsn = "simple.bundle.one";
+        String twoBsn = "simple.bundle.two";
+
+        testPlanDeployment(new File("src/test/resources/dms-testunscopednonatomic.plan"), new File("src/test/resources/plan-deployment/com.foo.bar.properties"), oneBsn, twoBsn);
+    }
+
+    @Test
+    public void testPlanWithProperties() throws Exception {
+        this.deployer.deploy(new File("src/test/resources/dms-properties.plan").toURI());
+        Bundle[] bundles = this.context.getBundles();
+        boolean found = false;
+        for (Bundle bundle : bundles) {
+            if("bundle.properties".equals(bundle.getSymbolicName())) {
+                found = true;
+                assertEquals("foo", bundle.getHeaders().get("Test-Header"));
+            }
+        }
+        assertTrue(found);
+    }
+    
+    @Before
+    public void setUp() throws Exception {        
+        this.configAdminServiceReference = this.context.getServiceReference(ConfigurationAdmin.class);
+        this.configAdmin = this.context.getService(this.configAdminServiceReference);
+    }
+
+    private void testPlanDeployment(File plan, File propertiesFile, String... candidateBsns) throws Exception {
+        Bundle[] beforeDeployBundles = this.context.getBundles();
+        assertBundlesNotInstalled(beforeDeployBundles, candidateBsns);
+
+        DeploymentIdentity deploymentIdentity = this.deployer.deploy(plan.toURI());
+        Bundle[] afterDeployBundles = this.context.getBundles();
+        assertBundlesInstalled(afterDeployBundles, candidateBsns);
+        
+        String pid = null;
+        
+        if (propertiesFile != null) {
+        	pid = propertiesFile.getName().substring(0, propertiesFile.getName().length() - ".properties".length());
+        	checkConfigAvailable(pid, propertiesFile);
+        }
+
+        this.deployer.undeploy(deploymentIdentity);
+        Bundle[] afterUndeployBundles = this.context.getBundles();
+        assertBundlesNotInstalled(afterUndeployBundles, candidateBsns);
+        
+        if (propertiesFile != null) {
+        	checkConfigUnavailable(pid);
+        }
+        
+        uninstallBundles(afterUndeployBundles, "simple.fragment.one");
+    }
+
+    private void assertBundlesNotInstalled(Bundle[] bundles, String... candidateBsns) {
+        List<String> installedBsns = getInstalledBsns(bundles);
+        for (String candidateBsn : candidateBsns) {
+            for (String installedBsn : installedBsns) {
+                if (installedBsn.contains(candidateBsn)) {
+                    fail(candidateBsn + " was installed");
+                }
+            }
+        }
+    }
+    
+    private void uninstallBundles(Bundle[] bundles, String... uninstallBsns) {
+        for (Bundle bundle : bundles) {
+            String symbolicName = bundle.getSymbolicName();
+            for (String uninstallBsn : uninstallBsns) {
+                if (uninstallBsn.equals(symbolicName)) {
+                    try {
+                        bundle.uninstall();
+                    } catch (BundleException _) {
+                    }
+                }
+            }
+        }
+    }
+    
+    private void checkConfigAvailable(String pid, File propertiesFile) throws IOException {
+        Configuration configuration = this.configAdmin.getConfiguration(pid, null);
+        Dictionary<String, Object> dictionary = configuration.getProperties();
+        
+        Properties properties = new Properties();
+        properties.load(new FileReader(propertiesFile));
+        
+        Set<Entry<Object, Object>> entrySet = properties.entrySet();
+        
+        for (Entry<Object, Object> entry : entrySet) {
+        	Assert.assertEquals(entry.getValue(), dictionary.get(entry.getKey()));
+		}
+        
+        Assert.assertEquals(pid, dictionary.get("service.pid"));
+    }
+
+    private void checkConfigUnavailable(String pid) throws IOException {
+        Configuration configuration = this.configAdmin.getConfiguration(pid, null);
+        Assert.assertNull(configuration.getProperties());
+    }
+
+    private void assertBundlesInstalled(Bundle[] bundles, String... candidateBsns) {
+        List<String> installedBsns = getInstalledBsns(bundles);
+        for (String candidateBsn : candidateBsns) {
+            boolean found = false;
+            for (String installedBsn : installedBsns) {
+                if (installedBsn.contains(candidateBsn)) {
+                    found = true;
+                }
+            }
+            assertTrue(candidateBsn + " was not installed", found);
+        }
+    }
+
+    private List<String> getInstalledBsns(Bundle[] bundles) {
+        List<String> installedBsns = new ArrayList<String>(bundles.length);
+        for (Bundle bundle : bundles) {
+            installedBsns.add(bundle.getSymbolicName());
+        }
+
+        return installedBsns;
+    }
+    
+    
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/DeployerEdgeTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/DeployerEdgeTests.java
new file mode 100644
index 0000000..33f68d1
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/DeployerEdgeTests.java
@@ -0,0 +1,266 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.io.File;
+import java.net.URI;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.ServiceReference;
+
+import org.eclipse.virgo.nano.deployer.api.core.ApplicationDeployer;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.eclipse.virgo.util.io.PathReference;
+
+/**
+ * Test various usages of the deployer interface for edge cases.
+ * <p />
+ *
+ */
+public class DeployerEdgeTests extends AbstractDeployerIntegrationTest {
+
+    private final String TEST_PAR_BUNDLE_SYMBOLIC_NAME = "MyApp-1-com.springsource.kernel.deployer.testbundle";
+
+    private ServiceReference<ApplicationDeployer> appDeployerServiceReference;
+
+    private ApplicationDeployer appDeployer;
+
+    private PathReference parCopy1, parCopy2, parCopy3;
+
+    private PathReference par;
+
+    private PathReference jarCopy1, jarCopy2, jarCopy3;
+
+    private PathReference jar;
+
+    @Before
+    public void setUp() throws Exception {
+        PathReference pr = new PathReference("./target/org.eclipse.virgo.kernel");
+        pr.delete(true);
+        pr.createDirectory();
+        pr = new PathReference("./target/deployer-edge-test");
+        pr.delete(true);
+        pr.createDirectory();
+        pr = new PathReference("./target/deployer-edge-test/other");
+        pr.createDirectory();
+
+        this.appDeployerServiceReference = this.context.getServiceReference(ApplicationDeployer.class);
+        this.appDeployer = this.context.getService(this.appDeployerServiceReference);
+
+        parCopy1 = new PathReference("./target/deployer-edge-test/app0.par");
+        parCopy2 = new PathReference("./target/deployer-edge-test/app0copy.par");
+        parCopy3 = new PathReference("./target/deployer-edge-test/other/app0.par");
+        par = new PathReference("src/test/resources/app0.par");
+
+        jarCopy1 = new PathReference("./target/deployer-edge-test/dummy.jar");
+        jarCopy2 = new PathReference("./target/deployer-edge-test/dummycopy.jar");
+        jarCopy3 = new PathReference("./target/deployer-edge-test/other/dummy.jar");
+        jar = new PathReference("src/test/resources/dummy.jar");
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        if (this.appDeployerServiceReference != null) {
+            this.context.ungetService(this.appDeployerServiceReference);
+        }
+        PathReference pr = new PathReference("./target/org.eclipse.virgo.kernel");
+        pr.delete(true);
+        pr = new PathReference("./target/deployer-edge-test");
+        pr.delete(true);
+    }
+
+    @Test(expected = DeploymentException.class)
+    public void testNonExistentFile() throws DeploymentException {
+        PathReference noPar = new PathReference("./blah");
+
+        this.appDeployer.deploy(noPar.toURI());
+    }
+
+    @Test(expected = DeploymentException.class)
+    public void testNonExistentJar() throws DeploymentException {
+        PathReference noJar = new PathReference("./blah.jar");
+
+        this.appDeployer.deploy(noJar.toURI());
+    }
+
+    @Test(expected = DeploymentException.class)
+    public void testDuplicateAppFromDifferentLocation() throws DeploymentException {
+        parCopy1.delete(true);
+        par.copy(parCopy1);
+
+        this.appDeployer.deploy(parCopy1.toURI());
+        // Check that the test bundle's application contexts are created.
+        assertNotNull(ApplicationContextUtils.getApplicationContext(this.context, TEST_PAR_BUNDLE_SYMBOLIC_NAME));
+
+        parCopy2.delete(true);
+        par.copy(parCopy2);
+
+        this.appDeployer.deploy(parCopy2.toURI());
+    }
+
+    @Test(expected = DeploymentException.class)
+    public void testDuplicateJarFromDifferentLocation() throws DeploymentException {
+        jarCopy1.delete(true);
+        jar.copy(jarCopy1);
+
+        this.appDeployer.deploy(jarCopy1.toURI());
+
+        jarCopy2.delete(true);
+        jar.copy(jarCopy2);
+
+        this.appDeployer.deploy(jarCopy2.toURI());
+    }
+
+    @Test(expected = DeploymentException.class)
+    public void testDuplicateAppSameFileNameDifferentLocation() throws DeploymentException {
+        parCopy1.delete(true);
+        par.copy(parCopy1);
+
+        this.appDeployer.deploy(parCopy1.toURI());
+        // Check that the test bundle's application contexts are created.
+        assertNotNull(ApplicationContextUtils.getApplicationContext(this.context, TEST_PAR_BUNDLE_SYMBOLIC_NAME));
+
+        parCopy3.delete(true);
+        par.copy(parCopy3);
+
+        this.appDeployer.deploy(parCopy3.toURI());
+    }
+
+    @Test(expected = DeploymentException.class)
+    public void testDuplicateJarSameFileNameDifferentLocation() throws DeploymentException {
+        jarCopy1.delete(true);
+        jar.copy(jarCopy1);
+
+        this.appDeployer.deploy(jarCopy1.toURI());
+
+        jarCopy3.delete(true);
+        jar.copy(jarCopy3);
+
+        this.appDeployer.deploy(jarCopy3.toURI());
+    }
+
+    @Test
+    public void testDifferentAppSameLocation() throws Exception {
+        parCopy1.delete(true);
+        par.copy(parCopy1);
+
+        this.appDeployer.deploy(parCopy1.toURI());
+        // Check that the test bundle's application contexts are created.
+        assertNotNull(ApplicationContextUtils.getApplicationContext(this.context, TEST_PAR_BUNDLE_SYMBOLIC_NAME));
+
+        parCopy1.delete(true);
+        new PathReference("src/test/resources/app4.par").copy(parCopy1);
+
+        this.appDeployer.deploy(parCopy1.toURI());
+    }
+
+    @Test
+    public void testDifferentJarSameLocation() throws Exception {
+        jarCopy1.delete(true);
+        jar.copy(jarCopy1);
+
+        this.appDeployer.deploy(jarCopy1.toURI());
+
+        jarCopy1.delete(true);
+        new PathReference("src/test/resources/ExporterC.jar").copy(jarCopy1);
+
+        this.appDeployer.deploy(jarCopy1.toURI());
+    }
+
+    @Test(expected = DeploymentException.class)
+    public void testDifferentAppSameFileNameDifferentLocation() throws Exception {
+        parCopy1.delete(true);
+        par.copy(parCopy1);
+
+        this.appDeployer.deploy(parCopy1.toURI());
+        // Check that the test bundle's application contexts are created.
+        assertNotNull(ApplicationContextUtils.getApplicationContext(this.context, TEST_PAR_BUNDLE_SYMBOLIC_NAME));
+
+        parCopy3.delete(true);
+        new PathReference("src/test/resources/app4.par").copy(parCopy3);
+
+        this.appDeployer.deploy(parCopy3.toURI());
+    }
+
+    @Test(expected = DeploymentException.class)
+    public void testDifferentJarSameFileNameDifferentLocation() throws Exception {
+        jarCopy1.delete(true);
+        jar.copy(jarCopy1);
+
+        this.appDeployer.deploy(jarCopy1.toURI());
+
+        jarCopy3.delete(true);
+        new PathReference("src/test/resources/ExporterC.jar").copy(jarCopy3);
+
+        this.appDeployer.deploy(jarCopy3.toURI());
+    }
+
+    @Test
+    public void testParWithoutManifest() throws Exception {
+        File f = new File("src/test/resources/nomanifest.par");
+        DeploymentIdentity deployed = this.appDeployer.deploy(f.toURI());
+
+        assertEquals("par", deployed.getType());
+        assertEquals("nomanifest", deployed.getSymbolicName());
+        assertEquals("0.0.0", deployed.getVersion());
+    }
+
+    @Test
+    public void testJarWithoutManifest() throws Exception {
+        File f = new File("src/test/resources/nomanifest.jar");
+        DeploymentIdentity deploymentIdentity = this.appDeployer.deploy(f.toURI());
+        this.appDeployer.undeploy(deploymentIdentity);
+    }
+
+    @Test
+    public void testParWithoutMetaInf() throws Exception {
+        File f = new File("src/test/resources/nometainf.par");
+        DeploymentIdentity deployed = this.appDeployer.deploy(f.toURI());
+
+        assertEquals("par", deployed.getType());
+        assertEquals("nometainf", deployed.getSymbolicName());
+        assertEquals("0.0.0", deployed.getVersion());
+    }
+
+    @Test
+    public void testJarWithoutMetaInf() throws Exception {
+        File f = new File("src/test/resources/nometainf.jar");
+        DeploymentIdentity deploymentIdentity = this.appDeployer.deploy(f.toURI());
+        this.appDeployer.undeploy(deploymentIdentity);
+    }
+
+    @Test(expected = DeploymentException.class)
+    public void testParWithClashingExports() throws Exception {
+        File f = new File("src/test/resources/clashing.exports.in.a.scope.par");
+        this.appDeployer.deploy(f.toURI());
+    }
+
+    @Test(expected = DeploymentException.class)
+    public void testUnsupportedURIScheme() throws Exception {
+        URI httpURI = new URI("http://www.springsource.com");
+
+        this.appDeployer.deploy(httpURI);
+    }
+
+    @Test(expected = DeploymentException.class)
+    public void testNonBundleDirectory() throws Exception {
+        URI dirURI = new File("build").toURI();
+        this.appDeployer.deploy(dirURI);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/DeployerLogMessageTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/DeployerLogMessageTests.java
new file mode 100644
index 0000000..80252b4
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/DeployerLogMessageTests.java
@@ -0,0 +1,127 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeployerLogEvents;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.test.framework.ConfigLocation;
+import org.junit.Before;
+import org.junit.Test;
+
+
+/**
+ */
+@ConfigLocation("META-INF/no.heap.dump.test.config.properties")
+public class DeployerLogMessageTests extends AbstractParTests {
+
+    private static final File LOG_FILE = new File("build/serviceability/eventlog/eventlog.log");
+
+    private int existingLines;
+
+    @Before
+    public void countExistingLogLines() throws IOException {
+        BufferedReader reader = new BufferedReader(new FileReader(LOG_FILE));
+        String line = reader.readLine();
+        existingLines = 0;
+        while (line != null) {
+            existingLines++;
+            line = reader.readLine();
+        }
+        reader.close();
+    }
+
+    private List<String> findLogMessages(String logCode) throws IOException {
+        List<String> logMessages = new ArrayList<String>();
+        try {
+            Thread.sleep(1000);
+        } catch (InterruptedException ie) {
+
+        }
+
+        BufferedReader reader = new BufferedReader(new FileReader(LOG_FILE));
+        String line;
+        int lines = 0;
+        while ((line = reader.readLine()) != null) {
+            lines++;
+            if (lines > existingLines) {
+                int index = line.indexOf(logCode);
+                if (index > -1) {
+                    logMessages.add(line.substring(index));
+                }
+            }
+        }
+        reader.close();
+        return logMessages;
+    }
+
+    @Test(expected = DeploymentException.class)
+    public void unsatisfiablePackageImport() throws Throwable {
+        try {
+            deploy(new File("src/test/resources/deployer-log-message-tests/missing-package.par"));
+        } finally {
+            List<String> logMessages = findLogMessages("<" + DeployerLogEvents.INSTALL_FAILURE.getEventCode() + ">");
+            assertTrue(logMessages.size() == 1);
+        }
+    }
+
+    @Test(expected = DeploymentException.class)
+    public void unsatisfiableBundleImport() throws Throwable {
+        try {
+            deploy(new File("src/test/resources/deployer-log-message-tests/missing-bundle.par"));
+        } finally {
+            List<String> logMessages = findLogMessages("<" + DeployerLogEvents.INSTALL_FAILURE.getEventCode() + ">");
+            assertTrue(logMessages.size() == 1);
+        }
+    }
+
+    @Test(expected = DeploymentException.class)
+    public void unsatisfiableLibraryImport() throws Throwable {
+        try {
+            deploy(new File("src/test/resources/deployer-log-message-tests/missing-library.par"));
+        } finally {
+            List<String> logMessages = findLogMessages("<" + DeployerLogEvents.INSTALL_FAILURE.getEventCode() + ">");
+            assertTrue(logMessages.size() == 1);
+        }
+    }
+
+    @Test(expected = DeploymentException.class)
+    public void malformedApplicationContext() throws Throwable {
+        try {
+            deploy(new File("src/test/resources/deployer-log-message-tests/malformed-application-context.par"));
+        } finally {
+            List<String> logMessages = findLogMessages("<" + DeployerLogEvents.CONFIG_FILE_ERROR.getEventCode() + ">");
+            assertEquals(1, logMessages.size());
+            assertTrue(logMessages.get(0).contains("my.bundle"));
+        }
+    }
+
+    @Test(expected = DeploymentException.class)
+    public void classNotFoundException() throws Throwable {
+        try {
+            deploy(new File("src/test/resources/deployer-log-message-tests/ClassNotFoundException.jar"));
+        } finally {
+            List<String> logMessages = findLogMessages("<AG0000E>");
+            assertTrue(logMessages.size() >= 1);
+            assertTrue(logMessages.get(0).contains("com.does.not.exist.NothingToSeeHere"));
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/FactoryConfigurationDeploymentTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/FactoryConfigurationDeploymentTests.java
new file mode 100644
index 0000000..c99a05c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/FactoryConfigurationDeploymentTests.java
@@ -0,0 +1,400 @@
+/*
+ * This file is part of the Eclipse Virgo project.
+ *
+ * Copyright (c) 2011 Chariot Solutions, LLC
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    dsklyut - initial contribution
+ */
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.Properties;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.eclipse.virgo.nano.deployer.api.core.ApplicationDeployer;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.cm.ConfigurationException;
+import org.osgi.service.cm.ManagedServiceFactory;
+
+/**
+ * Tests for Configuration artifacts that support ManagedServiceFactory
+ *
+ */
+public class FactoryConfigurationDeploymentTests extends AbstractDeployerIntegrationTest {
+
+    private static final SimpleDateFormat TIMESTAMP_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
+
+    private static String getTimestamp() {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTimeInMillis(System.currentTimeMillis());
+        String timestamp = "[" + TIMESTAMP_FORMAT.format(calendar.getTime()) + "]";
+        return timestamp;
+    }
+
+    private ServiceReference<ApplicationDeployer> appDeployerServiceReference;
+
+    private ApplicationDeployer appDeployer;
+
+    private ServiceReference<ConfigurationAdmin> configAdminServiceReference;
+
+    private ConfigurationAdmin configAdmin;
+
+    @Before
+    public void setUp() throws Exception {
+        this.appDeployerServiceReference = this.context.getServiceReference(ApplicationDeployer.class);
+        this.appDeployer = this.context.getService(this.appDeployerServiceReference);
+        this.configAdminServiceReference = this.context.getServiceReference(ConfigurationAdmin.class);
+        this.configAdmin = this.context.getService(this.configAdminServiceReference);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        if (this.appDeployerServiceReference != null) {
+            this.context.ungetService(this.appDeployerServiceReference);
+        }
+        if (this.configAdminServiceReference != null) {
+            this.context.ungetService(this.configAdminServiceReference);
+        }
+    }
+
+    @SuppressWarnings("rawtypes")
+    private static class TestManagedServiceFactory implements ManagedServiceFactory {
+
+        private volatile Dictionary properties;
+
+        private final AtomicInteger updateCallCount = new AtomicInteger(0);
+
+        private final AtomicInteger deleteCallCount = new AtomicInteger(0);
+
+        @Override
+        public String getName() {
+            return "Test Managed Service Factory";
+        }
+
+        @Override
+        public void updated(String pid, Dictionary properties) throws ConfigurationException {
+            System.out.println(getTimestamp() + " updated pid '" + pid + "' with properties '" + properties + "'");
+            this.updateCallCount.incrementAndGet();
+            this.properties = properties;
+        }
+
+        @Override
+        public void deleted(String pid) {
+            this.deleteCallCount.incrementAndGet();
+        }
+
+        Dictionary getProperties() {
+            return this.properties;
+        }
+
+        int updateCount() {
+            return this.updateCallCount.get();
+        }
+
+        int deleteCount() {
+            return this.deleteCallCount.get();
+        }
+    }
+
+    @Test
+    @SuppressWarnings("rawtypes")
+    public void testSimpleDeployUndeployOfFactoryConfig() throws Exception {
+
+        Hashtable<String, String> properties = new Hashtable<String, String>();
+        properties.put(Constants.SERVICE_PID, "test.factory.pid.a");
+        TestManagedServiceFactory service = new TestManagedServiceFactory();
+        this.context.registerService(ManagedServiceFactory.class, service, properties);
+
+        // make sure that we are starting off with a clean slate
+        assertEquals(0, countFactoryConfigurations("test.factory.pid.a"));
+
+        File configurationFile = new File("src/test/resources/configuration.deployment/factory-config-a.properties");
+
+        DeploymentIdentity deploymentIdentity = this.appDeployer.deploy(configurationFile.toURI());
+        assertNotNull(deploymentIdentity);
+
+        // let it deploy
+        sleep(100);
+
+        assertEquals(1, countFactoryConfigurations("test.factory.pid.a"));
+        assertEquals(1, service.updateCount());
+        assertEquals(0, service.deleteCount());
+        Dictionary propertiesFromService = service.getProperties();
+        assertNotNull(propertiesFromService);
+        assertEquals("prop1", propertiesFromService.get("prop1"));
+        assertEquals("2", propertiesFromService.get("prop2"));
+
+        this.appDeployer.undeploy(deploymentIdentity);
+
+        // give time for events to percolate
+        sleep(100);
+        assertEquals(0, countFactoryConfigurations("test.factory.pid.a"));
+        assertEquals(1, service.updateCount());
+        assertEquals(1, service.deleteCount());
+
+        // now lets make sure that we can deploy it again
+        deploymentIdentity = this.appDeployer.deploy(configurationFile.toURI());
+        sleep(1000);
+        assertEquals(1, countFactoryConfigurations("test.factory.pid.a"));
+        assertEquals(2, service.updateCount());
+        assertEquals(1, service.deleteCount());
+
+        this.appDeployer.undeploy(deploymentIdentity);
+    }
+
+    @Test
+    @SuppressWarnings("rawtypes")
+    public void testHotDeployFactoryConfiguration() throws Exception {
+
+        final String factoryPid = "test.factory.pid.hot";
+        final Properties hotDeployConfiguration = new Properties();
+        hotDeployConfiguration.setProperty(ConfigurationAdmin.SERVICE_FACTORYPID, factoryPid);
+        hotDeployConfiguration.setProperty("prop1", "prop1");
+        hotDeployConfiguration.setProperty("prop2", "2");
+
+        File target = new File("build/pickup/factory-config-a-hot.properties");
+
+        if (target.exists()) {
+            assertTrue(target.delete());
+        }
+
+        try {
+            Hashtable<String, String> properties = new Hashtable<String, String>();
+            properties.put(Constants.SERVICE_PID, factoryPid);
+            TestManagedServiceFactory service = new TestManagedServiceFactory();
+            this.context.registerService(ManagedServiceFactory.class, service, properties);
+
+            // make sure that we are starting off with a clean slate
+            assertEquals(0, countFactoryConfigurations(factoryPid));
+
+            // copy file to hot deploy location
+            writePropertiesFile(hotDeployConfiguration, target, "no comment");
+
+            ConfigurationTestUtils.pollUntilFactoryInConfigurationAdmin(this.configAdmin, factoryPid);
+            // let events propagate
+            sleep(100);
+            assertEquals(1, countFactoryConfigurations(factoryPid));
+            assertEquals(1, service.updateCount());
+            assertEquals(0, service.deleteCount());
+
+            Dictionary propertiesFromService = service.getProperties();
+            assertNotNull(propertiesFromService);
+            assertEquals("prop1", propertiesFromService.get("prop1"));
+            assertEquals("2", propertiesFromService.get("prop2"));
+
+            // remove the file and let it be removed
+            target.delete();
+            ConfigurationTestUtils.pollUntilFactoryNotInConfigurationAdmin(this.configAdmin, factoryPid);
+            // let events propagate
+            sleep(100);
+            assertEquals(0, countFactoryConfigurations(factoryPid));
+            assertEquals(1, service.updateCount());
+            assertEquals(1, service.deleteCount());
+        } finally {
+            if (target.exists()) {
+                target.delete();
+            }
+        }
+
+    }
+
+    @Test
+    @SuppressWarnings("rawtypes")
+    public void testHotDeployWithUpdateFactoryConfiguration() throws Exception {
+
+        final String factoryPid = "test.factory.pid.hot.update";
+        final Properties hotDeployConfiguration = new Properties();
+        hotDeployConfiguration.setProperty(ConfigurationAdmin.SERVICE_FACTORYPID, factoryPid);
+        hotDeployConfiguration.setProperty("prop1", "prop1");
+        hotDeployConfiguration.setProperty("prop2", "2");
+
+        File target = new File("build/pickup/factory-config-a-hot-update.properties");
+
+        if (target.exists()) {
+            assertTrue(target.delete());
+        }
+
+        try {
+
+            Hashtable<String, String> properties = new Hashtable<String, String>();
+            properties.put(Constants.SERVICE_PID, factoryPid);
+            TestManagedServiceFactory service = new TestManagedServiceFactory();
+            this.context.registerService(ManagedServiceFactory.class, service, properties);
+
+            // make sure that we are starting off with a clean slate
+            assertEquals(0, countFactoryConfigurations(factoryPid));
+
+            writePropertiesFile(hotDeployConfiguration, target, "initial");
+
+            ConfigurationTestUtils.pollUntilFactoryInConfigurationAdmin(this.configAdmin, factoryPid);
+            // let events propagate
+            sleep(100);
+            assertEquals(1, countFactoryConfigurations(factoryPid));
+            assertEquals(1, service.updateCount());
+            assertEquals(0, service.deleteCount());
+
+            Dictionary propertiesFromService = service.getProperties();
+            assertNotNull(propertiesFromService);
+            assertEquals("prop1", propertiesFromService.get("prop1"));
+            assertEquals("2", propertiesFromService.get("prop2"));
+
+            // update configuration
+            hotDeployConfiguration.setProperty("prop2", "22");
+            // save updated configuration
+            writePropertiesFile(hotDeployConfiguration, target, "updated");
+
+            // let events propagate and update happen
+            sleep(4001);
+            assertEquals(1, countFactoryConfigurations(factoryPid));
+            assertEquals(2, service.updateCount()); // This takes several seconds to change from 1 to 2
+            assertEquals(0, service.deleteCount());
+
+            propertiesFromService = service.getProperties();
+            assertNotNull(propertiesFromService);
+            assertEquals("prop1", propertiesFromService.get("prop1"));
+            assertEquals("22", propertiesFromService.get("prop2"));
+
+            // remove the file and let it be removed
+            target.delete();
+            ConfigurationTestUtils.pollUntilFactoryNotInConfigurationAdmin(this.configAdmin, factoryPid);
+
+            assertEquals(0, countFactoryConfigurations(factoryPid));
+            assertEquals(2, service.updateCount());
+            assertEquals(1, service.deleteCount());
+        } finally {
+            if (target.exists()) {
+                target.delete();
+            }
+        }
+    }
+    
+    private static void sleep(long millis) throws InterruptedException {
+        System.out.println(getTimestamp() + " entered sleep(" + millis + ")");
+        Thread.sleep(millis);
+        System.out.println(getTimestamp() + " exited sleep(" + millis + ")");
+    }
+
+    private void writePropertiesFile(final Properties hotDeployConfiguration, File target, String comment) throws IOException, FileNotFoundException {
+        FileOutputStream stream = new FileOutputStream(target);
+        hotDeployConfiguration.store(stream, comment);
+        stream.flush();
+        stream.close();
+    }
+
+    @Test
+    @SuppressWarnings("rawtypes")
+    public void testHotDeployMultipleFactoryConfiguration() throws Exception {
+
+        final String factoryPid = "test.factory.pid.hot.multiple";
+
+        final Properties configOne = new Properties();
+        configOne.setProperty(ConfigurationAdmin.SERVICE_FACTORYPID, factoryPid);
+        configOne.setProperty("prop1", "prop1");
+        configOne.setProperty("prop2", "1");
+
+        final Properties configTwo = new Properties();
+        configTwo.setProperty(ConfigurationAdmin.SERVICE_FACTORYPID, factoryPid);
+        configTwo.setProperty("prop1", "prop2");
+        configTwo.setProperty("prop2", "2");
+
+        final File targetOne = new File("build/pickup/factory-config-a-hot-update-1.properties");
+        final File targetTwo = new File("build/pickup/factory-config-a-hot-update-2.properties");
+
+        if (targetOne.exists()) {
+            assertTrue(targetOne.delete());
+        }
+        if (targetTwo.exists()) {
+            assertTrue(targetTwo.delete());
+        }
+
+        try {
+
+            Hashtable<String, String> properties = new Hashtable<String, String>();
+            properties.put(Constants.SERVICE_PID, factoryPid);
+            TestManagedServiceFactory service = new TestManagedServiceFactory();
+            this.context.registerService(ManagedServiceFactory.class, service, properties);
+
+            // make sure that we are starting off with a clean slate
+            assertEquals(0, countFactoryConfigurations(factoryPid));
+
+            // copy file to hot deploy location
+            writePropertiesFile(configOne, targetOne, "initial");
+
+            ConfigurationTestUtils.pollUntilFactoryInConfigurationAdmin(this.configAdmin, factoryPid);
+            // let events propagate
+            sleep(100);
+            assertEquals(1, countFactoryConfigurations(factoryPid));
+            assertEquals(1, service.updateCount());
+            assertEquals(0, service.deleteCount());
+
+            // validate first configuration
+            Dictionary propertiesFromService = service.getProperties();
+            assertNotNull(propertiesFromService);
+            assertEquals("prop1", propertiesFromService.get("prop1"));
+            assertEquals("1", propertiesFromService.get("prop2"));
+
+            writePropertiesFile(configTwo, targetTwo, "initial");
+            sleep(4002);
+            assertEquals(2, countFactoryConfigurations(factoryPid));
+            assertEquals(2, service.updateCount());
+            assertEquals(0, service.deleteCount());
+
+            propertiesFromService = service.getProperties();
+            assertNotNull(propertiesFromService);
+            assertEquals("prop2", propertiesFromService.get("prop1"));
+            assertEquals("2", propertiesFromService.get("prop2"));
+
+            assertTrue(targetOne.delete());
+            assertTrue(targetTwo.delete());
+
+            // let events propagate and update happen
+            ConfigurationTestUtils.pollUntilFactoryNotInConfigurationAdmin(this.configAdmin, factoryPid);
+            assertEquals(0, countFactoryConfigurations(factoryPid));
+            assertEquals(2, service.updateCount());
+            assertEquals(2, service.deleteCount());
+
+        } finally {
+            if (targetOne.exists()) {
+                targetOne.delete();
+            }
+            if (targetTwo.exists()) {
+                targetTwo.delete();
+            }
+        }
+    }
+
+    private int countFactoryConfigurations(String factoryPid) throws Exception {
+        Configuration[] configurations = this.configAdmin.listConfigurations(null);
+        int counter = 0;
+        for (Configuration c : configurations) {
+            if (factoryPid.equals(c.getFactoryPid())) {
+                counter++;
+            }
+        }
+        return counter;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/HotDeploymentTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/HotDeploymentTests.java
new file mode 100644
index 0000000..64cb90e
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/HotDeploymentTests.java
@@ -0,0 +1,108 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.fail;
+
+import java.lang.management.ManagementFactory;
+
+import javax.management.JMException;
+import javax.management.JMX;
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+
+import org.junit.Test;
+
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.model.management.ManageableArtifact;
+import org.eclipse.virgo.util.io.PathReference;
+
+
+/**
+ */
+public class HotDeploymentTests extends AbstractDeployerIntegrationTest {
+
+	private static final String ORG_ECLIPSE_VIRGO_REGION_USER = "org.eclipse.virgo.region.user";
+    
+    private static final String GLOBAL_REGION = "global";
+
+	private static final long TIMEOUT = 10000;
+    
+    private final MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
+    
+    @Test
+    public void programmaticUndeployDeletesHotDeployedPropertiesFile() throws DeploymentException {
+        PathReference pathReference = new PathReference("src/test/resources/hot-deployment-tests/test.properties");
+        doTest(pathReference, "configuration", "test", "0.0.0");
+    }
+    
+    @Test
+    public void programmaticUndeployDeletesHotDeployedExplodedBundle() throws DeploymentException {
+        PathReference pathReference = new PathReference("src/test/resources/hot-deployment-tests/bundle");
+        doTest(pathReference, "bundle", "test", "1.0.0");
+    }
+    
+    @Test
+    public void programmaticUndeployDeletesHotDeployedBundle() throws DeploymentException {
+        PathReference pathReference = new PathReference("src/test/resources/hot-deployment-tests/bundle.jar");
+        doTest(pathReference, "bundle", "test", "1.0.0");
+    }
+    
+    private void doTest(PathReference artifact, String type, String name, String version) throws DeploymentException {
+        PathReference copyInPickup = artifact.copy(new PathReference("build/pickup"), true);
+        
+        try {
+            while (!this.deployer.isDeployed(copyInPickup.toURI())) {
+                try {
+                    Thread.sleep(50);
+                } catch (InterruptedException _) {
+                }
+            }
+            
+            awaitActive(type, name, version);
+            
+            this.deployer.undeploy(type, name, version);
+            
+            assertFalse(copyInPickup.toFile().exists());
+            
+        } finally {
+            copyInPickup.delete();
+        }
+    }
+    
+    private void awaitActive(String type, String name, String version) {
+    	String region = ORG_ECLIPSE_VIRGO_REGION_USER;
+    	if(type=="configuration"){
+    		region = GLOBAL_REGION;
+    	}
+        try {
+            ObjectName objectName = new ObjectName("org.eclipse.virgo.kernel:type=ArtifactModel,artifact-type=" + type + ",name=" + name + ",version=" + version + ",region=" + region);
+            ManageableArtifact artifact = JMX.newMXBeanProxy(this.mBeanServer, objectName, ManageableArtifact.class);
+            
+            long startTime = System.currentTimeMillis();
+            
+            while (!"ACTIVE".equals(artifact.getState())) {
+                if (System.currentTimeMillis() - startTime > TIMEOUT) {
+                    fail("Artifact " + type + " " + name + " " + version + " was not active within " + TIMEOUT + "ms.");
+                }
+                try {
+                    Thread.sleep(50);
+                } catch (InterruptedException _) {
+                }
+            }
+        } catch (JMException jme) {
+            fail(jme.getMessage());
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/ImportMergeDiagnosticsTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/ImportMergeDiagnosticsTests.java
new file mode 100644
index 0000000..4ee40d4
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/ImportMergeDiagnosticsTests.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import java.io.File;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.junit.Assert;
+import org.junit.Test;
+
+
+/**
+ * Test diagnostics for the merging of imports.
+ * 
+ */
+public class ImportMergeDiagnosticsTests extends AbstractDeployerIntegrationTest {
+
+    @Test
+    public void testImportClashingBundles() throws DeploymentException {
+        DeploymentIdentity p1Identity = this.deployer.deploy(new File("src/test/resources/importMergeDiagnostics/TestP1.jar").toURI());
+        DeploymentIdentity p2Identity = this.deployer.deploy(new File("src/test/resources/importMergeDiagnostics/TestP2.jar").toURI());
+        try {
+            this.deployer.deploy(new File("src/test/resources/importMergeDiagnostics/TestImportP1P2.jar").toURI());
+        } catch (DeploymentException e) {
+            System.out.println(e);
+            Throwable ime = e.getCause();
+            String message = ime.getMessage();
+            Assert.assertEquals(
+                "Incorrect message text",
+                "cannot merge imports of package 'p' from sources 'Import-Bundle 'TestP1' version '0.0.0', Import-Bundle 'TestP2' version '0.0.0'' because of conflicting values 'TestP2', 'TestP1' of attribute 'bundle-symbolic-name'",
+                message);
+        } finally {
+            this.deployer.undeploy(p1Identity);
+            this.deployer.undeploy(p2Identity);
+        }
+    }
+    
+    @Test
+    public void testImportClashingLibraries() throws DeploymentException {
+        DeploymentIdentity p1Identity = this.deployer.deploy(new File("src/test/resources/importMergeDiagnostics/TestP1.jar").toURI());
+        DeploymentIdentity p2Identity = this.deployer.deploy(new File("src/test/resources/importMergeDiagnostics/TestP2.jar").toURI());        
+        try {
+            this.deployer.deploy(new File("src/test/resources/importMergeDiagnostics/TestImportP1P2ViaLibraries.jar").toURI());
+        } catch (DeploymentException e) {
+            System.out.println(e);
+            Throwable ime = e.getCause();
+            String message = ime.getMessage();
+            Assert.assertEquals(
+                "Incorrect message text",
+                "cannot merge imports of package 'p' from sources 'Import-Library 'LibraryImportingP1' version '1.0.0'(Import-Bundle 'TestP1' version '0.0.0'), Import-Library 'LibraryImportingP2' version '1.0.0'(Import-Bundle 'TestP2' version '0.0.0')' because of conflicting values 'TestP2', 'TestP1' of attribute 'bundle-symbolic-name'",
+                message);
+        } finally {
+            this.deployer.undeploy(p1Identity);
+            this.deployer.undeploy(p2Identity);
+        }
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/ImportPromotionTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/ImportPromotionTests.java
new file mode 100644
index 0000000..232ebcb
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/ImportPromotionTests.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import static org.junit.Assert.assertNotNull;
+
+import java.io.File;
+
+import org.junit.Test;
+
+/**
+ * Test the promotion of a bundle import across the bundles of a PAR file.
+ * 
+ */
+public class ImportPromotionTests extends AbstractParTests {
+
+    private static final String BUNDLE_SYMBOLIC_NAME = "ImportPromotion-1-ImporterA";
+
+    private static final String BUNDLE_SYMBOLIC_NAME_2 = "ImportPromotionViaLibrary-1-ImporterA";
+
+    @Test
+    public void testImportPromotion() throws Throwable {
+        File par = new File("src/test/resources/ImportPromotion.par");
+        deploy(par);
+        assertNotNull(ApplicationContextUtils.getApplicationContext(this.context, BUNDLE_SYMBOLIC_NAME));
+        this.deployer.refresh(par.toURI(), "ImporterA");
+        Thread.sleep(100);
+        assertNotNull(ApplicationContextUtils.getApplicationContext(this.context, BUNDLE_SYMBOLIC_NAME));
+    }
+
+    @Test
+    public void testImportPromotionViaLibrary() throws Throwable {
+        deploy(new File("src/test/resources/ImportPromotionViaLibrary.par"));
+        assertNotNull(ApplicationContextUtils.getApplicationContext(this.context, BUNDLE_SYMBOLIC_NAME_2));
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/InterdependentBundleDeploymentTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/InterdependentBundleDeploymentTests.java
new file mode 100644
index 0000000..b751d35
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/InterdependentBundleDeploymentTests.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import java.io.File;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.ServiceReference;
+
+import org.eclipse.virgo.nano.deployer.api.core.ApplicationDeployer;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.eclipse.virgo.util.io.PathReference;
+
+/**
+ * Test deploying bundles that depend on each other.
+ * 
+ */
+public class InterdependentBundleDeploymentTests extends AbstractDeployerIntegrationTest {
+
+    private ServiceReference<ApplicationDeployer> appDeployerServiceReference;
+
+    private ApplicationDeployer appDeployer;
+
+    @Before public void setUp() throws Exception {
+        PathReference pr = new PathReference("./target/org.eclipse.virgo.kernel");
+        pr.delete(true);
+        pr.createDirectory();
+        
+        this.appDeployerServiceReference = this.context.getServiceReference(ApplicationDeployer.class);
+        this.appDeployer = this.context.getService(this.appDeployerServiceReference);
+    }
+
+    @After public void tearDown() throws Exception {
+        if (this.appDeployerServiceReference != null) {
+            this.context.ungetService(this.appDeployerServiceReference);
+        }
+    }
+
+    @Test public void testImportBundleDependency() throws Exception {
+        DeploymentIdentity deploymentIdentity = this.appDeployer.deploy(new File("src/test/resources/osgi_test.jar").toURI());
+        DeploymentIdentity deploymentIdentity2 = this.appDeployer.deploy(new File("src/test/resources/osgi_test2.jar").toURI());
+        this.appDeployer.undeploy(deploymentIdentity2);
+        this.appDeployer.undeploy(deploymentIdentity);
+    }
+    
+    @Test
+//    @Ignore("[DMS-2883] Fails intermittently due to problem described in ENGINE-1755")
+    public void testUndeploymentOrder() throws Exception {
+        DeploymentIdentity deploymentIdentity = this.appDeployer.deploy(new File("src/test/resources/osgi_test.jar").toURI());
+        DeploymentIdentity deploymentIdentity2 = this.appDeployer.deploy(new File("src/test/resources/osgi_test2.jar").toURI());
+        this.appDeployer.undeploy(deploymentIdentity);
+        this.appDeployer.undeploy(deploymentIdentity2);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/JmxArtifactModelTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/JmxArtifactModelTests.java
new file mode 100644
index 0000000..b003c17
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/JmxArtifactModelTests.java
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ * Copyright (c) 2011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.management.ManagementFactory;
+
+import javax.management.MBeanServerConnection;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+import javax.management.openmbean.CompositeDataSupport;
+import javax.management.openmbean.TabularDataSupport;
+
+import org.eclipse.virgo.nano.deployer.api.core.ApplicationDeployer;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * Test deployed artifacts show up correctly in JMX, in both the older Model and the newer, region-aware ArtifactModel.
+ * 
+ */
+public class JmxArtifactModelTests extends AbstractDeployerIntegrationTest {
+
+    private static final String GLOBAL_USER_REGION = "global";
+
+    private static final String CONFIGURATION_TYPE = "configuration";
+
+    private static final String CONFIGURATION_NAME = "t";
+
+    private static final String CONFIGURATION_VERSION = "0.0.0";
+
+    private ServiceReference<ApplicationDeployer> appDeployerServiceReference;
+
+    private ApplicationDeployer appDeployer;
+
+    private MBeanServerConnection mBeanServerConnection;
+
+    @Before
+    public void setUp() throws Exception {
+        this.appDeployerServiceReference = this.context.getServiceReference(ApplicationDeployer.class);
+        this.appDeployer = (ApplicationDeployer) this.context.getService(this.appDeployerServiceReference);
+        this.mBeanServerConnection = getMBeanServerConnection();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        if (this.appDeployerServiceReference != null) {
+            this.context.ungetService(this.appDeployerServiceReference);
+        }
+    }
+
+    @Test
+    public void testConfigArtifactModel() throws Exception {
+        File file = new File("src/test/resources/configuration.deployment/t.properties");
+
+        DeploymentIdentity deploymentIdentity = this.appDeployer.deploy(file.toURI());
+
+        assertDeploymentIdentityEquals(deploymentIdentity, "t.properties", CONFIGURATION_TYPE, CONFIGURATION_NAME, "0");
+
+        assertArtifactState(GLOBAL_USER_REGION, CONFIGURATION_TYPE, CONFIGURATION_NAME, CONFIGURATION_VERSION, "ACTIVE");
+
+        TabularDataSupport attribute = (TabularDataSupport) this.mBeanServerConnection.getAttribute(
+            getObjectName(GLOBAL_USER_REGION, CONFIGURATION_TYPE, CONFIGURATION_NAME, CONFIGURATION_VERSION), "Properties");
+        assertEquals("b", getStringValue(attribute, "a"));
+        assertEquals("d", getStringValue(attribute, "c"));
+
+        this.appDeployer.undeploy(deploymentIdentity);
+    }
+    
+    //TODO: test other artefact types
+
+    private String getStringValue(TabularDataSupport attribute, String key) {
+        Object[] keys = { key };
+        CompositeDataSupport cds = (CompositeDataSupport) attribute.get(keys);
+        return (String) cds.get("value");
+    }
+
+    private void assertArtifactState(String region, String type, String name, String version, String state) throws MalformedObjectNameException,
+        IOException, Exception {
+        assertArtifactExists(region, type, name, version);
+        assertEquals(String.format("Artifact %s:%s:%s:%s is not in state %s", region, type, name, version, state), state, this.mBeanServerConnection.getAttribute(getObjectName(region, type, name, version), "State"));
+    }
+
+    private void assertArtifactExists(String region, String type, String name, String version) throws IOException, Exception, MalformedObjectNameException {
+        assertTrue(String.format("Artifact %s:%s:%s:%s does not exist", region, type, name, version), this.mBeanServerConnection.isRegistered(getObjectName(region, type, name, version)));
+    }
+
+    protected static ObjectName getObjectName(String region, String type, String name, String version) throws MalformedObjectNameException {
+        return new ObjectName(String.format("org.eclipse.virgo.kernel:type=ArtifactModel,artifact-type=%s,name=%s,version=%s,region=%s",type, name, version,region));
+    }
+
+    private static MBeanServerConnection getMBeanServerConnection() throws Exception {
+        return ManagementFactory.getPlatformMBeanServer();
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/JpaLtwParTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/JpaLtwParTests.java
new file mode 100644
index 0000000..fcf3787
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/JpaLtwParTests.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.File;
+import java.lang.management.ManagementFactory;
+
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.junit.Ignore;
+import org.junit.Test;
+
+
+/**
+ */
+@Ignore("[DMS-2881] Uses TopLink Essentials which leaks a file handle and breaks the build on Windows")
+public class JpaLtwParTests extends AbstractParTests {
+
+    @Test public void testDeployApp() throws Throwable {        
+        doTest(new File("src/test/resources/jpa-ltw-sample-update.par"));
+    }
+
+    void doTest(File f) throws Throwable {
+        DeploymentIdentity deploymentIdentity = deploy(f);
+        try {
+            ObjectName oname = ObjectName.getInstance("bean:name=addressSupport");
+            MBeanServer server = ManagementFactory.getPlatformMBeanServer();
+            int size = (Integer) server.getAttribute(oname, "AddressesSize");
+            assertEquals(3, size);
+        } finally {
+            this.deployer.undeploy(deploymentIdentity);
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/LibraryScopingTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/LibraryScopingTests.java
new file mode 100644
index 0000000..5f06904
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/LibraryScopingTests.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import java.io.File;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.junit.Test;
+
+
+// TODO This description is wrong, the test doesn't deploy a library, i.e. there isn't one in the par
+/**
+ * Test deploying a library as part of an application and then deploying an application which depends on the library.
+ * 
+ */
+public class LibraryScopingTests extends AbstractParTests {
+
+    @Test(expected = DeploymentException.class) public void testLibraryClash() throws Throwable {
+        File file = new File("src/test/resources/clashinguses.par");
+        deploy(file);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/LoadableClasses.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/LoadableClasses.java
new file mode 100644
index 0000000..e56913a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/LoadableClasses.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import java.util.Set;
+
+public interface LoadableClasses {
+
+    Set<String> getLoadableClasses();
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/ManualSpringContextTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/ManualSpringContextTests.java
new file mode 100644
index 0000000..200662c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/ManualSpringContextTests.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import static org.junit.Assert.assertNotNull;
+
+import java.io.File;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.junit.Ignore;
+import org.junit.Test;
+
+
+@Ignore("Failed when not connected to the internet")
+public class ManualSpringContextTests extends AbstractDeployerIntegrationTest {
+
+    @Test
+    public void testManualContextDefinitionWithBadImports() throws Exception {
+        DeploymentIdentity id = this.deployer.deploy(new File("src/test/resources/manual-context.jar").toURI());
+        try {
+            assertNotNull(id);
+        } finally {
+            this.deployer.undeploy(id);
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/MissingImportLibraryTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/MissingImportLibraryTests.java
new file mode 100644
index 0000000..be7de91
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/MissingImportLibraryTests.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import java.io.File;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.junit.Test;
+
+
+
+/**
+ */
+public class MissingImportLibraryTests extends AbstractParTests {
+
+    @Test(expected=DeploymentException.class)
+    public void testInvalidBrits() throws Throwable {
+        deploy(new File("src/test/resources/com.springsource.brits.par"));
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/MultiBundleApplicationDeploymentTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/MultiBundleApplicationDeploymentTests.java
new file mode 100644
index 0000000..dd5ad5b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/MultiBundleApplicationDeploymentTests.java
@@ -0,0 +1,258 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.virgo.nano.deployer.api.core.ApplicationDeployer;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.eclipse.virgo.kernel.deployer.core.event.ApplicationBundleDeploymentEvent;
+import org.eclipse.virgo.kernel.deployer.core.event.ApplicationBundleStarted;
+import org.eclipse.virgo.kernel.deployer.core.event.ApplicationDeploymentEvent;
+import org.eclipse.virgo.kernel.deployer.core.event.DeploymentListener;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
+
+/**
+ * Test deploying an OSGi application containing a simple bundle.
+ * 
+ */
+public class MultiBundleApplicationDeploymentTests extends AbstractDeployerIntegrationTest implements DeploymentListener {
+
+    private static final String TEST_BUNDLE_P_SYMBOLIC_NAME = "MultiBundleApp-1-com.springsource.server.apps.app4.p";
+
+    private static final String TEST_BUNDLE_Q_SYMBOLIC_NAME = "MultiBundleApp-1-com.springsource.server.apps.app4.q";
+
+    private ServiceReference<ApplicationDeployer> appDeployerServiceReference;
+
+    private ApplicationDeployer appDeployer;
+
+    private ServiceRegistration<DeploymentListener> listenerRegistration = null;
+
+    private List<EventInfo> events = null;
+
+    @Before
+    public void setUp() throws Exception {
+        this.listenerRegistration = this.context.registerService(DeploymentListener.class, this, null);
+
+        this.appDeployerServiceReference = this.context.getServiceReference(ApplicationDeployer.class);
+        this.appDeployer = this.context.getService(this.appDeployerServiceReference);
+        this.events = new ArrayList<EventInfo>();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        if (this.listenerRegistration != null) {
+            this.listenerRegistration.unregister();
+        }
+        if (this.appDeployerServiceReference != null) {
+            this.context.ungetService(this.appDeployerServiceReference);
+        }
+    }
+
+    @Test
+    public void testDeployer() throws Exception {
+
+        File file = new File("src/test/resources/app4.par");
+        URI fileURI = file.toURI();
+        assertFalse("File " + file + " deployed before test!", this.appDeployer.isDeployed(fileURI));
+
+        DeploymentIdentity deploymentId = this.appDeployer.deploy(fileURI);
+        // Check that the test bundle's application contexts are created.
+        assertNotNull(ApplicationContextUtils.getApplicationContext(this.context, TEST_BUNDLE_P_SYMBOLIC_NAME));
+        assertNotNull(ApplicationContextUtils.getApplicationContext(this.context, TEST_BUNDLE_Q_SYMBOLIC_NAME));
+
+        assertTrue("File " + file + " not deployed.", this.appDeployer.isDeployed(fileURI));
+
+        this.appDeployer.undeploy(deploymentId.getType(), deploymentId.getSymbolicName(), deploymentId.getVersion());
+        // Check that the test bundle's application contexts are destroyed.
+        assertNull(ApplicationContextUtils.getApplicationContext(this.context, TEST_BUNDLE_P_SYMBOLIC_NAME));
+        assertNull(ApplicationContextUtils.getApplicationContext(this.context, TEST_BUNDLE_Q_SYMBOLIC_NAME));
+
+        assertFalse("File " + file + " deployed after test!", this.appDeployer.isDeployed(fileURI));
+
+        @SuppressWarnings("unused")
+        String[] expectedEvents = {
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationDeploying MultiBundleApp 1",
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationBundleDeploying MultiBundleApp 1 MultiBundleApp-1-MultiBundleApp-synthetic.context",
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationBundleStarting MultiBundleApp 1 MultiBundleApp-1-MultiBundleApp-synthetic.context",
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationBundleDeploying MultiBundleApp 1 MultiBundleApp-1-com.springsource.server.apps.app4.p",
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationBundleStarting MultiBundleApp 1 MultiBundleApp-1-com.springsource.server.apps.app4.p",
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationBundleDeploying MultiBundleApp 1 MultiBundleApp-1-com.springsource.server.apps.app4.q",
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationBundleStarting MultiBundleApp 1 MultiBundleApp-1-com.springsource.server.apps.app4.q",
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationBundleDeployed MultiBundleApp 1 MultiBundleApp-1-MultiBundleApp-synthetic.context",
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationBundleDeployed MultiBundleApp 1 MultiBundleApp-1-com.springsource.server.apps.app4.p",
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationBundleDeployed MultiBundleApp 1 MultiBundleApp-1-com.springsource.server.apps.app4.q",
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationDeployed MultiBundleApp 1",
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationUndeploying MultiBundleApp 1",
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationBundleUndeploying MultiBundleApp 1 MultiBundleApp-1-com.springsource.server.apps.app4.q",
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationBundleStopping MultiBundleApp 1 MultiBundleApp-1-com.springsource.server.apps.app4.q",
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationBundleStopped MultiBundleApp 1 MultiBundleApp-1-com.springsource.server.apps.app4.q",
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationBundleUndeployed MultiBundleApp 1 MultiBundleApp-1-com.springsource.server.apps.app4.q",
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationBundleUndeploying MultiBundleApp 1 MultiBundleApp-1-com.springsource.server.apps.app4.p",
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationBundleStopping MultiBundleApp 1 MultiBundleApp-1-com.springsource.server.apps.app4.p",
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationBundleStopped MultiBundleApp 1 MultiBundleApp-1-com.springsource.server.apps.app4.p",
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationBundleUndeployed MultiBundleApp 1 MultiBundleApp-1-com.springsource.server.apps.app4.p",
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationBundleUndeploying MultiBundleApp 1 MultiBundleApp-1-MultiBundleApp-synthetic.context",
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationBundleStopping MultiBundleApp 1 MultiBundleApp-1-MultiBundleApp-synthetic.context",
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationBundleStopped MultiBundleApp 1 MultiBundleApp-1-MultiBundleApp-synthetic.context",
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationBundleUndeployed MultiBundleApp 1 MultiBundleApp-1-MultiBundleApp-synthetic.context",
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationUndeployed MultiBundleApp 1" };
+        // TODO: [DMS-1388] reinstate checkEvents(expectedEvents);
+    }
+
+    @Test
+    public void installAParWithInternalRequireBundle() throws Exception {
+        File file = new File("src/test/resources/requirebundle/bundles/parWithInternalRequireBundle.par");
+        URI fileURI = file.toURI();
+
+        assertFalse("File " + file + " deployed before test!", this.appDeployer.isDeployed(fileURI));
+        DeploymentIdentity deploymentId = this.appDeployer.deploy(fileURI);
+        assertTrue("File " + file + " not deployed.", this.appDeployer.isDeployed(fileURI));
+
+        this.appDeployer.undeploy("par", deploymentId.getSymbolicName(), deploymentId.getVersion());
+        assertFalse("File " + file + " not undeployed.", this.appDeployer.isDeployed(fileURI));
+    }
+
+    @Test(expected = DeploymentException.class)
+    public void testClashDetection() throws Exception {
+        File file = new File("src/test/resources/app4clash.par");
+        assertFalse("File " + file + " deployed before test!", this.appDeployer.isDeployed(file.toURI()));
+
+        this.appDeployer.deploy(file.toURI());
+    }
+
+    // @Ignore
+    @Test
+    public void installAParWithTwoBundlesThatImportTheSameLibrary() throws DeploymentException {
+
+        File par = new File("src/test/resources/twoBundlesThatImportTheSameLibrary.par");
+        URI parURI = par.toURI();
+        assertFalse("File " + par + " deployed before test!", this.appDeployer.isDeployed(parURI));
+
+        DeploymentIdentity deploymentId = this.appDeployer.deploy(parURI);
+
+        assertTrue("File " + par + " not deployed.", this.appDeployer.isDeployed(parURI));
+
+        this.appDeployer.undeploy("par", deploymentId.getSymbolicName(), deploymentId.getVersion());
+
+        assertFalse("File " + par + " deployed after undeploy.", this.appDeployer.isDeployed(parURI));
+
+        @SuppressWarnings("unused")
+        String[] expectedEvents = {
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationDeploying TwoBundlesThatImportTheSameLibrary 1",
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationBundleDeploying TwoBundlesThatImportTheSameLibrary 1 TwoBundlesThatImportTheSameLibrary-1-TwoBundlesThatImportTheSameLibrary-synthetic.context",
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationBundleStarting TwoBundlesThatImportTheSameLibrary 1 TwoBundlesThatImportTheSameLibrary-1-TwoBundlesThatImportTheSameLibrary-synthetic.context",
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationBundleDeploying TwoBundlesThatImportTheSameLibrary 1 TwoBundlesThatImportTheSameLibrary-1-two",
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationBundleStarting TwoBundlesThatImportTheSameLibrary 1 TwoBundlesThatImportTheSameLibrary-1-two",
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationBundleDeploying TwoBundlesThatImportTheSameLibrary 1 TwoBundlesThatImportTheSameLibrary-1-one",
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationBundleStarting TwoBundlesThatImportTheSameLibrary 1 TwoBundlesThatImportTheSameLibrary-1-one",
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationBundleDeployed TwoBundlesThatImportTheSameLibrary 1 TwoBundlesThatImportTheSameLibrary-1-TwoBundlesThatImportTheSameLibrary-synthetic.context",
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationBundleDeployed TwoBundlesThatImportTheSameLibrary 1 TwoBundlesThatImportTheSameLibrary-1-two",
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationBundleDeployed TwoBundlesThatImportTheSameLibrary 1 TwoBundlesThatImportTheSameLibrary-1-one",
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationDeployed TwoBundlesThatImportTheSameLibrary 1",
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationUndeploying TwoBundlesThatImportTheSameLibrary 1",
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationBundleUndeploying TwoBundlesThatImportTheSameLibrary 1 TwoBundlesThatImportTheSameLibrary-1-one",
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationBundleStopping TwoBundlesThatImportTheSameLibrary 1 TwoBundlesThatImportTheSameLibrary-1-one",
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationBundleStopped TwoBundlesThatImportTheSameLibrary 1 TwoBundlesThatImportTheSameLibrary-1-one",
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationBundleUndeployed TwoBundlesThatImportTheSameLibrary 1 TwoBundlesThatImportTheSameLibrary-1-one",
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationBundleUndeploying TwoBundlesThatImportTheSameLibrary 1 TwoBundlesThatImportTheSameLibrary-1-two",
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationBundleStopping TwoBundlesThatImportTheSameLibrary 1 TwoBundlesThatImportTheSameLibrary-1-two",
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationBundleStopped TwoBundlesThatImportTheSameLibrary 1 TwoBundlesThatImportTheSameLibrary-1-two",
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationBundleUndeployed TwoBundlesThatImportTheSameLibrary 1 TwoBundlesThatImportTheSameLibrary-1-two",
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationBundleUndeploying TwoBundlesThatImportTheSameLibrary 1 TwoBundlesThatImportTheSameLibrary-1-TwoBundlesThatImportTheSameLibrary-synthetic.context",
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationBundleStopping TwoBundlesThatImportTheSameLibrary 1 TwoBundlesThatImportTheSameLibrary-1-TwoBundlesThatImportTheSameLibrary-synthetic.context",
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationBundleStopped TwoBundlesThatImportTheSameLibrary 1 TwoBundlesThatImportTheSameLibrary-1-TwoBundlesThatImportTheSameLibrary-synthetic.context",
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationBundleUndeployed TwoBundlesThatImportTheSameLibrary 1 TwoBundlesThatImportTheSameLibrary-1-TwoBundlesThatImportTheSameLibrary-synthetic.context",
+            "org.eclipse.virgo.kernel.deployer.core.event.ApplicationUndeployed TwoBundlesThatImportTheSameLibrary 1" };
+        // FIXME: [DMS-1388] reinstate checkEvents(expectedEvents);
+        // NB: no onEvent() calls are made.
+    }
+
+    @SuppressWarnings("unused")
+    private void checkEvents(String[] expectedEvents) {
+        /*
+         * Previously this checked the sequence of events and was far too fragile. Given that start is now asynchronous
+         * to install, the only option is to sort the events and compare.
+         */
+        Arrays.sort(expectedEvents);
+        String[] actualEvents = new String[this.events.size()];
+        int i = 0;
+        for (EventInfo eventInfo : this.events) {
+            actualEvents[i++] = eventInfo.toString();
+        }
+        Arrays.sort(actualEvents);
+        Assert.assertArrayEquals(expectedEvents, actualEvents);
+    }
+
+    public void onEvent(ApplicationDeploymentEvent event) {
+        if (event instanceof ApplicationBundleDeploymentEvent) {
+            // Skip bundle started events as these are sent asynchronously and therefore in unpredictable order
+            if (!(event instanceof ApplicationBundleStarted)) {
+                String symbolicName = ((ApplicationBundleDeploymentEvent) event).getBundle().getSymbolicName();
+                // Focus on test bundles and the synthetic context.
+                if (symbolicName.endsWith("-synthetic.context") || symbolicName.contains(".apps.") || symbolicName.contains("-one")
+                    || symbolicName.contains("-two")) {
+                    this.events.add(new EventInfo(event.getClass().getName(), event.getApplicationSymbolicName(),
+                        event.getApplicationVersion().toString(), symbolicName));
+                }
+            }
+        } else {
+            this.events.add(new EventInfo(event.getClass().getName(), event.getApplicationSymbolicName(), event.getApplicationVersion().toString()));
+        }
+    }
+
+    static class EventInfo {
+
+        private String eventClass;
+
+        private String appName;
+
+        private String appVersion;
+
+        private String bundleName;
+
+        EventInfo(String eventClass, String appName, String appVersion) {
+            this(eventClass, appName, appVersion, null);
+        }
+
+        EventInfo(String eventClass, String appName, String appVersion, String bundleName) {
+            this.eventClass = eventClass;
+            this.appName = appName;
+            this.appVersion = appVersion;
+            this.bundleName = bundleName;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public String toString() {
+            return this.eventClass + " " + this.appName + " " + this.appVersion + (this.bundleName == null ? "" : (" " + this.bundleName));
+        }
+
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/NestedPlanIntegrationTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/NestedPlanIntegrationTests.java
new file mode 100644
index 0000000..b7daa66
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/NestedPlanIntegrationTests.java
@@ -0,0 +1,815 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.Writer;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.eclipse.virgo.kernel.model.Artifact;
+import org.eclipse.virgo.kernel.model.ArtifactState;
+import org.eclipse.virgo.kernel.model.RuntimeArtifactRepository;
+import org.eclipse.equinox.region.Region;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.Version;
+import org.osgi.service.packageadmin.ExportedPackage;
+
+
+/**
+ * These tests cover parent and child plans in all combinations of scoped/unscoped and atomic/non-atomic.
+ * <p/>
+ * A bundle "global" exports the package "global". A bundle "parent" in the parent plans exports the package "parent"
+ * imports the bundle "global" with application import scope. A bundle "child" in the child plans exports the package
+ * "child".
+ * <p/>
+ * An inner class called {@link Model} encapsulates how the various combinations should work in terms of scoping and
+ * atomicity.
+ * <p/>
+ * When scoping occurs, the tests check the synthetic context bundle and the promotion of the "global" package when
+ * appropriate. The lifecycle dependence or independence is checked between the bundles "parent" and "child" and between
+ * the parent and child plans.
+ * 
+ */
+@SuppressWarnings("deprecation")
+public class NestedPlanIntegrationTests extends AbstractDeployerIntegrationTest {
+    
+    private static final String GLOBAL_PACKAGE = "global";
+
+    private static final String PARENT_PACKAGE_NAME = "parent";
+
+    private static final String CHILD_PACKAGE_NAME = "child";
+
+    private static final String SCOPE_SEPARATOR = "-";
+
+    private static final String SYNTHETIC_CONTEXT_BSN_SUFFIX = "-synthetic.context";
+
+    private static final String PLAN_TYPE = "plan";
+
+    private static final String BUNDLE_TYPE = "bundle";
+
+    private static final int WATCH_INTERVAL_MS = 1000;
+
+    /*
+     * An artifact must be present in a watched repository directory for up to two watch intervals before it will be
+     * processed. Then it will take a while (a surprisingly long while on some operating systems) to be scheduled and
+     * complete processing.
+     */
+    private static final int WATCH_WAIT_INTERVAL_MS = 2 * WATCH_INTERVAL_MS + 1000;
+
+    private static final String TEST_RESOURCES_DIRECTORY = "src/test/resources/plan-deployment/";
+
+    private static final String GENERATED_PLAN_DIRECTORY = "build/watched/";
+
+    private static final String PLAN_EXTENSION = ".plan";
+
+    private static final String XML_HEADER = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+
+    private static final String NAMESPACES = "    xmlns=\"http://www.eclipse.org/virgo/schema/plan\" \n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" \n    xsi:schemaLocation=\" http://www.eclipse.org/virgo/schema/plan http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd\"";
+
+    private static final Version DEFAULT_VERSION = new Version("0");
+
+    private static TestArtifactInfo GLOBAL_BUNDLE_INFO = new TestArtifactInfo("bundle", GLOBAL_PACKAGE, DEFAULT_VERSION);
+
+    private static TestArtifactInfo PARENT_BUNDLE_INFO = new TestArtifactInfo("bundle", PARENT_PACKAGE_NAME, DEFAULT_VERSION);
+
+    private static TestArtifactInfo CHILD_BUNDLE_INFO = new TestArtifactInfo("bundle", CHILD_PACKAGE_NAME, DEFAULT_VERSION);
+
+    static {
+        GLOBAL_BUNDLE_INFO.setFile(new File(TEST_RESOURCES_DIRECTORY + "global.jar"));
+    }
+
+    private RuntimeArtifactRepository ram = null;
+    
+    private Region globalRegion;
+
+    private static TestPlanArtifactInfo[] PARENTS;
+
+    private DeploymentIdentity globalBundleDeploymentIdentity;
+
+    @BeforeClass
+    public static void setUpClass() throws Exception {
+        File generatedPlanDirectory = new File(GENERATED_PLAN_DIRECTORY);
+        generatedPlanDirectory.mkdirs();
+
+        generatePlans();
+    }
+
+    @Before
+    public void setUp() throws Exception {
+        ServiceReference<RuntimeArtifactRepository> runtimeArtifactRepositoryServiceReference = context.getServiceReference(RuntimeArtifactRepository.class);
+        if (runtimeArtifactRepositoryServiceReference != null) {
+            this.ram = context.getService(runtimeArtifactRepositoryServiceReference);
+        }
+        
+        if(this.ram == null){
+        	throw new RuntimeException("Unable to locate the RuntimeArtifactRepository. Found " + runtimeArtifactRepositoryServiceReference);
+        }
+        
+        Collection<ServiceReference<Region>> regionServiceReferences = context.getServiceReferences(Region.class, "(org.eclipse.virgo.kernel.region.name=global)");
+        if (regionServiceReferences != null && regionServiceReferences.size() == 1) {
+            this.globalRegion = context.getService(regionServiceReferences.iterator().next());
+        }
+
+        globalBundleDeploymentIdentity = deploy(GLOBAL_BUNDLE_INFO);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        if (this.globalBundleDeploymentIdentity != null) {
+            this.deployer.undeploy(this.globalBundleDeploymentIdentity);
+            this.globalBundleDeploymentIdentity = null;
+        }
+    }
+
+    @Test
+    public void testUnscopedNonatomicParentOfUnscopedNonatomicChild() throws IOException, DeploymentException, InterruptedException {
+        testParent("unscoped.nonatomic.parentOf.unscoped.nonatomic.child");
+    }
+
+    @Test
+    public void testUnscopedAtomicParentOfUnscopedNonatomicChild() throws IOException, DeploymentException, InterruptedException {
+        testParent("unscoped.atomic.parentOf.unscoped.nonatomic.child");
+    }
+
+    @Test
+    public void testScopedNonatomicParentOfUnscopedNonatomicChild() throws IOException, DeploymentException, InterruptedException {
+        testParent("scoped.nonatomic.parentOf.unscoped.nonatomic.child");
+    }
+
+    @Test
+    public void testScopedAtomicParentOfUnscopedNonatomicChild() throws IOException, DeploymentException, InterruptedException {
+        testParent("scoped.atomic.parentOf.unscoped.nonatomic.child");
+    }
+
+    @Test
+    public void testUnscopedNonatomicParentOfUnscopedAtomicChild() throws IOException, DeploymentException, InterruptedException {
+        testParent("unscoped.nonatomic.parentOf.unscoped.atomic.child");
+    }
+
+    @Test
+    public void testUnscopedAtomicParentOfUnscopedAtomicChild() throws IOException, DeploymentException, InterruptedException {
+        testParent("unscoped.atomic.parentOf.unscoped.atomic.child");
+    }
+
+    @Test
+    public void testScopedNonatomicParentOfUnscopedAtomicChild() throws IOException, DeploymentException, InterruptedException {
+        testParent("scoped.nonatomic.parentOf.unscoped.atomic.child");
+    }
+
+    @Test
+    public void testScopedAtomicParentOfUnscopedAtomicChild() throws IOException, DeploymentException, InterruptedException {
+        testParent("scoped.atomic.parentOf.unscoped.atomic.child");
+    }
+
+    @Test
+    public void testUnscopedNonatomicParentOfScopedNonatomicChild() throws IOException, DeploymentException, InterruptedException {
+        testParent("unscoped.nonatomic.parentOf.scoped.nonatomic.child");
+    }
+
+    @Test
+    public void testUnscopedAtomicParentOfScopedNonatomicChild() throws IOException, DeploymentException, InterruptedException {
+        testParent("unscoped.atomic.parentOf.scoped.nonatomic.child");
+    }
+
+    @Test
+    public void testScopedNonatomicParentOfScopedNonatomiChild() throws IOException, DeploymentException, InterruptedException {
+        testParent("scoped.nonatomic.parentOf.scoped.nonatomic.child");
+    }
+
+    @Test
+    public void testScopedAtomicParentOfScopedNonatomicChild() throws IOException, DeploymentException, InterruptedException {
+        testParent("scoped.atomic.parentOf.scoped.nonatomic.child");
+    }
+
+    @Test
+    public void testUnscopedNonatomicParentOfScopedAtomicChild() throws IOException, DeploymentException, InterruptedException {
+        testParent("unscoped.nonatomic.parentOf.scoped.atomic.child");
+    }
+
+    @Test
+    public void testUnscopedAtomicParentOfScopedAtomicChild() throws IOException, DeploymentException, InterruptedException {
+        testParent("unscoped.atomic.parentOf.scoped.atomic.child");
+    }
+
+    @Test
+    public void testScopedNonatomicParentOfScopedAtomicChild() throws IOException, DeploymentException, InterruptedException {
+        testParent("scoped.nonatomic.parentOf.scoped.atomic.child");
+    }
+
+    @Test
+    public void testScopedAtomicParentOfScopedAtomicChild() throws IOException, DeploymentException, InterruptedException {
+        testParent("scoped.atomic.parentOf.scoped.atomic.child");
+    }
+
+    /**
+     * @throws IOException 
+     * @throws DeploymentException  
+     * @throws InterruptedException 
+     */
+    private void testParent(String parentName) throws IOException, DeploymentException, InterruptedException {
+        for (int p = 0; p < PARENTS.length; p++) {
+            TestPlanArtifactInfo parent = PARENTS[p];
+            if (parentName.equals(parent.getName())) {
+                testParent(parent);
+            }
+        }
+    }
+
+    private void testParent(TestPlanArtifactInfo parent) {
+        Model model = new Model(parent);
+
+        boolean expectDeployOk = model.shouldDeployOk();
+
+        try {
+            DeploymentIdentity parentId = deploy(parent);
+
+            // Fail the test if the plan should not have deployed ok.
+            assertTrue(expectDeployOk);
+
+            checkScoping(parent, model);
+
+            checkAtomicity(parent, model);
+
+            this.deployer.undeploy(parentId);
+        } catch (DeploymentException e) {
+            // Fail the test if the plan should have deployed ok.
+            assertFalse("The plan '" + parent.getName() + "' failed to deploy '" + e.getMessage() + "'", expectDeployOk);
+        }
+    }
+
+    private static void generatePlans() throws IOException, InterruptedException {
+        // Generate the child plans
+        TestPlanArtifactInfo[] children = generateChildPlans();
+
+        // Wait for watched directory interval to pass.
+        Thread.sleep(WATCH_WAIT_INTERVAL_MS);
+
+        PARENTS = generateParentPlans(children);
+    }
+
+    private void checkScoping(TestPlanArtifactInfo parent, Model model) {
+
+        if (model.shouldHaveScope()) {
+            checkSyntheticContextBundle(model);
+            checkImportPromotion(model);
+            checkPlanScoping(parent, model);
+        } else {
+            checkNoSyntheticContextBundle();
+            checkNoImportPromotion(model);
+        }
+    }
+
+    private void checkPlanScoping(TestPlanArtifactInfo parent, Model model) {
+        if (parent.isScoped()) {
+            Artifact parentPlan = getPlan(parent);
+            Set<Artifact> children = parentPlan.getDependents();
+            for (Artifact child : children) {
+                if (PLAN_TYPE.equals(child.getType())) {
+                    String childPlanName = child.getName();
+                    String unscopedChildPlanName = parent.getChildPlan().getName();
+                    String expectedChildPlanName = model.getScopeName() + SCOPE_SEPARATOR + unscopedChildPlanName;
+                    assertEquals(expectedChildPlanName, childPlanName);
+                }
+            }
+        }
+
+    }
+
+    private void checkSyntheticContextBundle(Model model) {
+        Bundle syntheticContextBundle = getSyntheticContextBundle(model.getScopeName());
+        assertNotNull(syntheticContextBundle);
+
+        if (model.syntheticContextShouldIncludeParent()) {
+            assertTrue(contains(getBundlesImportingPackage(PARENT_PACKAGE_NAME), syntheticContextBundle));
+        }
+
+        if (model.syntheticContextShouldIncludeChild()) {
+            assertTrue(contains(getBundlesImportingPackage(CHILD_PACKAGE_NAME), syntheticContextBundle));
+        }
+    }
+
+    private static boolean contains(Bundle[] importingBundles, Bundle syntheticContextBundle) {
+        if (importingBundles != null) {
+            for (Bundle bundle : importingBundles) {
+                if (bundle == syntheticContextBundle) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    private Bundle[] getBundlesImportingPackage(String pkg) {
+        ExportedPackage[] exportedPackages = this.packageAdmin.getExportedPackages(pkg);
+
+        // The tests should not export a package from multiple bundles at any point in time.
+        assertEquals("The Package '" + pkg + "' is exported from " + exportedPackages.length + " bundles.", 1, exportedPackages.length);
+
+        ExportedPackage parentExportedPackage = exportedPackages[0];
+        Bundle[] importingBundles = parentExportedPackage.getImportingBundles();
+        return importingBundles;
+    }
+
+    private void checkNoSyntheticContextBundle() {
+        Bundle[] bundles = this.framework.getBundleContext().getBundles();
+        for (Bundle bundle : bundles) {
+            assertFalse(bundle.getSymbolicName().endsWith(SYNTHETIC_CONTEXT_BSN_SUFFIX));
+        }
+    }
+
+    private Bundle getSyntheticContextBundle(String scopeName) {
+        String bsn = scopeName + SYNTHETIC_CONTEXT_BSN_SUFFIX;
+        Bundle[] bundles = this.packageAdmin.getBundles(bsn, null);
+        assertTrue(bundles.length <= 1);
+        return bundles.length == 0 ? null : bundles[0];
+    }
+
+    private void checkImportPromotion(Model model) {
+        if (model.importShouldBePromoted()) {
+            assertTrue(globalImportHasBeenPromoted(model));
+        }
+    }
+
+    private void checkNoImportPromotion(Model model) {
+        assertFalse(globalImportHasBeenPromoted(model));
+    }
+
+    private boolean globalImportHasBeenPromoted(Model model) {
+        // The global import has been promoted if and only if the child bundle imports it.
+        Bundle childBundle = model.getChildBundle();
+        Bundle[] bundlesImportingGlobalPackage = getBundlesImportingPackage(GLOBAL_PACKAGE);
+        return contains(bundlesImportingGlobalPackage, childBundle);
+    }
+
+    private void checkAtomicity(TestPlanArtifactInfo parent, Model model) {
+        TestPlanArtifactInfo childPlan = parent.getChildPlan();
+        
+        Artifact parentArtifact = getPlan(parent);
+        Artifact childArtifact;
+        
+        if (parent.isScoped()) {
+            childArtifact = getPlan(childPlan.getType(), model.getScopeName() + SCOPE_SEPARATOR + childPlan.getName(), childPlan.getVersion(), globalRegion);
+        } else {
+            childArtifact = getPlan(childPlan);
+        }
+        
+        if (parent.isAtomic() && childPlan.isAtomic()) {
+            checkParentAndChildBundleLifecyclesAreTied(model.getParentBundle(), model.getChildBundle(), parentArtifact, childArtifact);
+        } else {
+            checkParentAndChildBundleLifecyclesAreIndependent(parent.isAtomic(), model.getParentBundle(), model.getChildBundle(), parentArtifact, childArtifact);
+        }                
+                
+        if (parent.isAtomic()) {
+            checkParentAndChildPlanLifecyclesAreTied(parentArtifact, childArtifact);
+        } else {
+            checkParentAndChildPlanLifecyclesAreIndependent(parentArtifact, childArtifact);
+        }
+    }
+
+    private Artifact getPlan(TestPlanArtifactInfo plan) {
+        return getPlan(plan.getType(), plan.getName(), plan.getVersion(), globalRegion);       
+    }
+    
+    private Artifact getPlan(String type, String name, Version version, Region region) {
+        Artifact planArtifact = this.ram.getArtifact(type, name, version, region);
+        assertNotNull(planArtifact);
+        return planArtifact;
+    }
+
+    private void checkParentAndChildPlanLifecyclesAreTied(Artifact parentPlan, Artifact childPlan) {
+        waitUntilActive(parentPlan);
+        waitUntilActive(childPlan);
+
+        parentPlan.stop();
+        assertEquals(ArtifactState.RESOLVED, parentPlan.getState());
+        assertEquals(ArtifactState.RESOLVED, childPlan.getState());
+
+        parentPlan.start();
+        waitUntilActive(parentPlan);
+        waitUntilActive(childPlan);
+
+        childPlan.stop();
+        assertEquals(ArtifactState.RESOLVED, parentPlan.getState());
+        assertEquals(ArtifactState.RESOLVED, childPlan.getState());
+
+        childPlan.start();
+        waitUntilActive(parentPlan);
+        waitUntilActive(childPlan);
+    }
+
+    private void checkParentAndChildPlanLifecyclesAreIndependent(Artifact parentPlan, Artifact childPlan) {
+        waitUntilActive(parentPlan);
+        waitUntilActive(childPlan);
+
+        parentPlan.stop();
+        assertEquals(ArtifactState.RESOLVED, parentPlan.getState());
+        // Stopping the parent plan stops the child plan regardless of the parent's atomicity.
+        assertEquals(ArtifactState.RESOLVED, childPlan.getState());
+
+        parentPlan.start();
+        waitUntilActive(parentPlan);
+        // Starting the parent plan stops the child plan regardless of the parent's atomicity.
+        waitUntilActive(childPlan);
+
+        childPlan.stop();
+        assertEquals(ArtifactState.ACTIVE, parentPlan.getState());
+        assertEquals(ArtifactState.RESOLVED, childPlan.getState());
+
+        childPlan.start();
+        waitUntilActive(parentPlan);
+        waitUntilActive(childPlan);
+    }
+
+    private void waitUntilActive(Artifact parentPlan) {
+        int i = 0;
+        while (parentPlan.getState() != ArtifactState.ACTIVE) {
+            if (i++ > 10) {
+                // Took too long - give up.
+                assertTrue(false);
+            }
+            try {
+                Thread.sleep(100);
+            } catch (InterruptedException e) {
+            }
+        }
+    }
+
+    private void checkParentAndChildBundleLifecyclesAreTied(Bundle parentBundle, Bundle childBundle, Artifact parentPlan, Artifact childPlan) {
+        assertEquals(Bundle.ACTIVE, parentBundle.getState());
+        assertEquals(Bundle.ACTIVE, childBundle.getState());
+        waitUntilActive(parentPlan);
+        waitUntilActive(childPlan);
+        try {
+            parentBundle.stop();
+            assertEquals(Bundle.RESOLVED, parentBundle.getState());
+            assertEquals(Bundle.RESOLVED, childBundle.getState());
+
+            parentBundle.start();
+            assertEquals(Bundle.ACTIVE, parentBundle.getState());
+            assertEquals(Bundle.ACTIVE, childBundle.getState());
+            waitUntilActive(parentPlan);
+            waitUntilActive(childPlan);
+
+            childBundle.stop();
+            assertEquals(Bundle.RESOLVED, parentBundle.getState());
+            assertEquals(Bundle.RESOLVED, childBundle.getState());
+
+            childBundle.start();
+            assertEquals(Bundle.ACTIVE, parentBundle.getState());
+            assertEquals(Bundle.ACTIVE, childBundle.getState());
+            waitUntilActive(parentPlan);
+            waitUntilActive(childPlan);
+        } catch (BundleException e) {
+            e.printStackTrace();
+            assertTrue(false);
+        }
+    }
+
+    private void checkParentAndChildBundleLifecyclesAreIndependent(boolean atomicParentPlan, Bundle parentBundle, Bundle childBundle,
+        Artifact parentPlan, Artifact childPlan) {
+        assertEquals(Bundle.ACTIVE, parentBundle.getState());
+        assertEquals(Bundle.ACTIVE, childBundle.getState());
+        waitUntilActive(parentPlan);
+        waitUntilActive(childPlan);
+        try {
+            parentBundle.stop();
+            assertEquals(Bundle.RESOLVED, parentBundle.getState());
+            // Stopping the parent bundle stops parent plan if the parent is atomic which stops the child plan, and its
+            // bundles.
+            assertEquals(atomicParentPlan ? Bundle.RESOLVED : Bundle.ACTIVE, childBundle.getState());
+
+            parentBundle.start();
+            assertEquals(Bundle.ACTIVE, parentBundle.getState());
+            assertEquals(Bundle.ACTIVE, childBundle.getState());
+            waitUntilActive(parentPlan);
+            waitUntilActive(childPlan);
+
+            childBundle.stop();
+            assertEquals(Bundle.ACTIVE, parentBundle.getState());
+            assertEquals(Bundle.RESOLVED, childBundle.getState());
+
+            childBundle.start();
+            assertEquals(Bundle.ACTIVE, parentBundle.getState());
+            assertEquals(Bundle.ACTIVE, childBundle.getState());
+            waitUntilActive(parentPlan);
+            waitUntilActive(childPlan);
+        } catch (BundleException e) {
+            e.printStackTrace();
+            assertTrue(false);
+        }
+    }
+
+    private Bundle getSpecificBundle(String bsn, Version version) {
+        Bundle[] bundles = packageAdmin.getBundles(bsn, "[" + version.toString() + ", " + version.toString() + "]");
+        assertNotNull(bundles);
+        assertEquals(1, bundles.length);
+        return bundles[0];
+    }
+
+    /**
+     * The Model class encapsulates the expected behaviour of this testcase.
+     */
+    private final class Model {
+
+        private final TestPlanArtifactInfo parent;
+
+        private final TestPlanArtifactInfo child;
+
+        public Model(TestPlanArtifactInfo parent) {
+            this.parent = parent;
+
+            TestPlanArtifactInfo[] childPlans = parent.getChildPlans();
+            assertEquals(1, childPlans.length);
+            this.child = childPlans[0];
+        }
+
+        public boolean importShouldBePromoted() {
+            return this.parent.isScoped();
+        }
+
+        public boolean shouldDeployOk() {
+            // A parent and child should deploy ok if and only if they are not both scoped.
+            return !(this.parent.isScoped() && this.child.isScoped());
+        }
+
+        public boolean shouldHaveScope() {
+            return shouldChildBeScoped();
+        }
+
+        public String getScopeName() {
+            assertTrue(shouldHaveScope());
+            return getScopeName(this.parent.isScoped() ? this.parent : this.child);
+        }
+
+        private String getScopeName(TestPlanArtifactInfo scopedPlan) {
+            assertTrue(scopedPlan.isScoped());
+            StringBuffer scopeName = new StringBuffer();
+            scopeName.append(scopedPlan.getName() + SCOPE_SEPARATOR + versionToShortString(scopedPlan.getVersion()));
+            return scopeName.toString();
+        }
+
+        private String versionToShortString(Version version) {
+            String result = version.toString();
+            while (result.endsWith(".0")) {
+                result = result.substring(0, result.length() - 2);
+            }
+            return result;
+        }
+
+        public boolean syntheticContextShouldIncludeParent() {
+            return this.parent.isScoped();
+        }
+
+        public boolean syntheticContextShouldIncludeChild() {
+            return shouldChildBeScoped();
+        }
+
+        private boolean shouldChildBeScoped() {
+            return this.parent.isScoped() || this.child.isScoped();
+        }
+
+        public Bundle getParentBundle() {
+            return getBundle(this.parent, this.parent.isScoped() ? getScopeName() : null);
+        }
+
+        public Bundle getChildBundle() {
+            return getBundle(this.child, shouldChildBeScoped() ? getScopeName() : null);
+        }
+
+        private Bundle getBundle(TestPlanArtifactInfo planContainingBundle, String scopeName) {
+            TestArtifactInfo[] childBundles = planContainingBundle.getChildBundles();
+            assertEquals(1, childBundles.length);
+            TestArtifactInfo childBundle = childBundles[0];
+
+            String bsn = childBundle.getName();
+            Version version = childBundle.getVersion();
+
+            if (scopeName != null) {
+                return getSpecificBundle(scopeName + SCOPE_SEPARATOR + bsn, version);
+            } else {
+                return getSpecificBundle(bsn, version);
+            }
+        }
+
+    }
+
+    private static TestPlanArtifactInfo[] generateParentPlans(TestArtifactInfo[] children) throws IOException {
+        TestPlanArtifactInfo[] parents = new TestPlanArtifactInfo[16];
+        int p = 0;
+        for (int c = 0; c < children.length; c++) {
+            for (int s = 0; s < 2; s++) {
+                boolean scopedParent = s == 1;
+                for (int a = 0; a < 2; a++) {
+                    boolean atomicParent = a == 1;
+                    TestArtifactInfo childPlan = children[c];
+                    String parentName = parentPlanName(scopedParent, atomicParent, childPlan);
+                    parents[p++] = createPlanFile(parentName, DEFAULT_VERSION, scopedParent, atomicParent, PARENT_BUNDLE_INFO, childPlan);
+                }
+            }
+        }
+        return parents;
+    }
+
+    private static TestPlanArtifactInfo[] generateChildPlans() throws IOException {
+        TestPlanArtifactInfo[] children = new TestPlanArtifactInfo[4];
+        int c = 0;
+        for (int s = 0; s < 2; s++) {
+            boolean scopedChild = s == 1;
+            for (int a = 0; a < 2; a++) {
+                boolean atomicChild = a == 1;
+                String childName = childPlanName(scopedChild, atomicChild);
+                children[c++] = createPlanFile(childName, DEFAULT_VERSION, scopedChild, atomicChild, CHILD_BUNDLE_INFO);
+            }
+        }
+        return children;
+    }
+
+    private static String childPlanName(boolean scopedChild, boolean atomicChild) {
+        return scopingAtomicityName(scopedChild, atomicChild) + ".child";
+    }
+
+    private static String parentPlanName(boolean scopedParent, boolean atomicParent, TestArtifactInfo childPlan) {
+        return scopingAtomicityName(scopedParent, atomicParent) + ".parentOf." + childPlan.getName();
+    }
+
+    private static String scopingAtomicityName(boolean scoped, boolean atomic) {
+        return (scoped ? "scoped" : "unscoped") + "." + (atomic ? "atomic" : "nonatomic");
+    }
+
+    private DeploymentIdentity deploy(TestArtifactInfo artifact) throws DeploymentException {
+        DeploymentIdentity identity = this.deployer.deploy(artifact.getFile().toURI());
+        Assert.assertEquals(artifact.getType(), identity.getType());
+        Assert.assertEquals(artifact.getName(), identity.getSymbolicName());
+        Assert.assertEquals(artifact.getVersion(), new Version(identity.getVersion()));
+        return identity;
+    }
+
+    public static TestPlanArtifactInfo createPlanFile(String planName, Version planVersion, boolean scoped, boolean atomic, TestArtifactInfo... children) throws IOException {
+        StringBuffer planContent = new StringBuffer(1024);
+        planContent.append(XML_HEADER);
+        planContent.append("<plan name=\"" + planName + "\" version=\"" + planVersion + "\" scoped=\"" + new Boolean(scoped) + "\" atomic=\"" + new Boolean(atomic) + "\" \n" + NAMESPACES + ">\n");
+
+        for (TestArtifactInfo childInfo : children) {
+            Version childVersion = childInfo.getVersion();
+            planContent.append("    <artifact type=\"" + childInfo.getType() + "\" name=\"" + childInfo.getName() + "\" version=\"[" + childVersion + ", " + childVersion + "]\"/>\n");
+        }
+
+        planContent.append("</plan>");
+
+        TestPlanArtifactInfo info = new TestPlanArtifactInfo(planName, planVersion, scoped, atomic, children);
+
+        String fileName = planName + "-" + planVersion + PLAN_EXTENSION;
+        File planFile = new File(GENERATED_PLAN_DIRECTORY + fileName);
+        Writer writer = new FileWriter(planFile);
+        try {
+            writer.write(planContent.toString());
+        } finally {
+            writer.close();
+        }
+
+        info.setFile(planFile);
+
+        return info;
+    }
+
+    private static final class TestPlanArtifactInfo extends TestArtifactInfo {
+
+        private static final TestPlanArtifactInfo[] EMPTY_CHILD_PLAN_ARRAY = new TestPlanArtifactInfo[0];
+
+        private final boolean scoped;
+
+        private final boolean atomic;
+
+        public TestPlanArtifactInfo(String name, Version version, Boolean scoped, Boolean atomic, TestArtifactInfo[] children) {
+            super(PLAN_TYPE, name, version, children);
+            this.scoped = scoped;
+            this.atomic = atomic;
+        }
+
+        public TestPlanArtifactInfo[] getChildPlans() {
+            List<TestPlanArtifactInfo> childPlans = new ArrayList<TestPlanArtifactInfo>();
+            for (TestArtifactInfo child : getChildren()) {
+                if (child instanceof TestPlanArtifactInfo) {
+                    childPlans.add((TestPlanArtifactInfo) child);
+                }
+            }
+            return childPlans.toArray(EMPTY_CHILD_PLAN_ARRAY);
+        }
+
+        public TestPlanArtifactInfo getChildPlan() {
+            TestPlanArtifactInfo[] childPlans = getChildPlans();
+            assertEquals(1, childPlans.length);
+            return childPlans[0];
+        }
+
+        public boolean isScoped() {
+            return scoped;
+        }
+
+        public boolean isAtomic() {
+            return atomic;
+        }
+
+    }
+
+    private static class TestArtifactInfo {
+
+        private static final TestArtifactInfo[] EMPTY_CHILD_ARRAY = new TestArtifactInfo[0];
+
+        private final String type;
+
+        private final String name;
+
+        private final Version version;
+
+        private File file;
+
+        private TestArtifactInfo[] children;
+
+        public TestArtifactInfo(String type, String name, Version version, TestArtifactInfo[] children) {
+            this.type = type;
+            this.name = name;
+            this.version = version;
+            this.children = children == null ? EMPTY_CHILD_ARRAY : children;
+        }
+
+        public TestArtifactInfo(String type, String name, Version version) {
+            this(type, name, version, null);
+        }
+
+        public String getType() {
+            return type;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public Version getVersion() {
+            return version;
+        }
+
+        public TestArtifactInfo[] getChildren() {
+            return this.children;
+        }
+
+        public TestArtifactInfo[] getChildBundles() {
+            List<TestArtifactInfo> childBundles = new ArrayList<TestArtifactInfo>();
+            for (TestArtifactInfo child : getChildren()) {
+                if (BUNDLE_TYPE.equals(child.getType())) {
+                    childBundles.add(child);
+                }
+            }
+            return childBundles.toArray(EMPTY_CHILD_ARRAY);
+        }
+
+        public void setFile(File file) {
+            this.file = file;
+        }
+
+        public File getFile() {
+            if (this.file == null) {
+                throw new IllegalStateException("TestArtifactInfo file not set");
+            }
+            return file;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public String toString() {
+            return /* "TestArtifactInfo [type=" + type + ", name=" + */name /* + ", version=" + version + "]" */;
+        }
+
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/OnStartedFailureTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/OnStartedFailureTests.java
new file mode 100644
index 0000000..2761bdf
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/OnStartedFailureTests.java
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import static org.junit.Assert.fail;
+
+import java.io.File;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.junit.Test;
+import org.osgi.framework.ServiceRegistration;
+
+import org.eclipse.virgo.kernel.install.artifact.BundleInstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifactLifecycleListener;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifactLifecycleListenerSupport;
+import org.eclipse.virgo.kernel.model.management.ManageableArtifact;
+import org.eclipse.virgo.test.framework.ConfigLocation;
+
+
+/**
+ * 
+ * Integration tests for handling failures from the onStarted lifecycle event.
+ * 
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Thread-safe.
+ *
+ */
+@ConfigLocation("META-INF/no.heap.dump.test.config.properties")
+public class OnStartedFailureTests extends AbstractRAMIntegrationTests {
+    
+    private final OnStartedFailureLifecycleListener lifecycleListener = new OnStartedFailureLifecycleListener();
+    
+    private volatile ServiceRegistration<InstallArtifactLifecycleListener> registration;
+    
+    private void registerListener() {
+        this.registration = this.context.registerService(InstallArtifactLifecycleListener.class, this.lifecycleListener, null);
+    }
+    
+    private void unregisterListener() {
+        ServiceRegistration<InstallArtifactLifecycleListener> localRegistration = this.registration;
+        if (localRegistration != null) {
+            localRegistration.unregister();
+        }
+    }
+    
+    @Test(expected=DeploymentException.class)
+    public void standaloneBundleFailsDuringDeployment() throws DeploymentException {
+        registerListener();
+        
+        try {
+            this.deployer.deploy(new File("src/test/resources/onstarted-failure-tests/bundle.jar").toURI());        
+        } finally {
+            unregisterListener();
+        }
+    }
+    
+    @Test
+    public void standaloneBundleFailsWhenStartedUsingTheRAM() throws DeploymentException {
+        DeploymentIdentity deployed = this.deployer.deploy(new File("src/test/resources/onstarted-failure-tests/bundle.jar").toURI());
+        
+        registerListener();
+        
+        try {
+            ManageableArtifact manageableArtifact = getManageableArtifact(deployed, new StubRegion("org.eclipse.virgo.region.user"));
+            manageableArtifact.stop();
+            
+            try {
+                manageableArtifact.start();
+                fail("Start of artifact did not throw an exception");
+            } catch (RuntimeException re) {
+                re.printStackTrace();
+            }
+        } finally {
+            unregisterListener();
+        }
+    }
+    
+    @Test(expected=DeploymentException.class)
+    public void bundleWithinParFailsDuringDeployment() throws DeploymentException {
+        registerListener();
+        
+        try {
+            this.deployer.deploy(new File("src/test/resources/onstarted-failure-tests/started-failure.par").toURI());        
+        } finally {
+            unregisterListener();
+        }
+    }
+    
+    private static final class OnStartedFailureLifecycleListener extends InstallArtifactLifecycleListenerSupport {
+
+        @Override
+        public void onStarted(InstallArtifact installArtifact) throws DeploymentException {
+            if (installArtifact instanceof BundleInstallArtifact) {
+                throw new DeploymentException("onStarted failure");
+            }
+        }        
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/ParDeploymentTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/ParDeploymentTests.java
new file mode 100644
index 0000000..9236990
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/ParDeploymentTests.java
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.Version;
+import org.osgi.service.cm.Configuration;
+
+public class ParDeploymentTests extends AbstractDeployerIntegrationTest {
+
+    private static final File PAR_FILE = new File("src/test/resources/BundlesAndConfig.par");
+
+    private static final File PAR_FOR_BUG331767 = new File("src/test/resources/bug331767.par");
+
+    private static final File PAR_FOR_BUG330506 = new File("src/test/resources/bug330506.par");
+
+    private static final File PAR_CONTAINING_PLAN = new File("src/test/resources/plan-in-par/ParContainingPlan.par");
+
+    private static final String BUNDLE_SYMBOLIC_NAME = "appA-1-bundleA";
+
+    private static final String BUNDLE_SYMBOLIC_NAME_BUG331767 = "PARbug331767-1-BUNDLEbug331767";
+
+    private static final Version BUNDLE_VERSION = new Version(1, 0, 0);
+
+    @Test
+    public void deployParContainingBundlesAndProperties() throws DeploymentException, IOException, InvalidSyntaxException {
+        DeploymentIdentity deploymentIdentity = this.deployer.deploy(PAR_FILE.toURI());
+
+        Configuration configuration = getConfiguration("foo");
+        assertNotNull(configuration);
+        assertEquals("bar", configuration.getProperties().get("foo"));
+
+        assertBundlePresent(BUNDLE_SYMBOLIC_NAME, BUNDLE_VERSION);
+
+        this.deployer.undeploy(deploymentIdentity);
+
+        configuration = getConfiguration("foo");
+        assertNull(configuration);
+
+        assertBundleNotPresent(BUNDLE_SYMBOLIC_NAME, BUNDLE_VERSION);
+    }
+
+    @Test
+    public void deployParContainingDynamicImportStar() throws DeploymentException {
+        DeploymentIdentity deploymentIdentity = this.deployer.deploy(PAR_FOR_BUG331767.toURI());
+        assertBundlePresent(BUNDLE_SYMBOLIC_NAME_BUG331767, BUNDLE_VERSION);
+        this.deployer.undeploy(deploymentIdentity);
+        assertBundleNotPresent(BUNDLE_SYMBOLIC_NAME_BUG331767, BUNDLE_VERSION);
+    }
+
+    @Test(expected = DeploymentException.class)
+    public void deployParContainingFragmentOfSystemBundle() throws DeploymentException {
+        this.deployer.deploy(PAR_FOR_BUG330506.toURI());
+    }
+
+    @Test
+    public void deployParContainingPlan() throws DeploymentException {
+        DeploymentIdentity deploymentIdentity = this.deployer.deploy(PAR_CONTAINING_PLAN.toURI());
+        assertBundlePresent("par.with.plan-1-simple.bundle.one", new Version(TEST_APPS_VERSION));
+        this.deployer.undeploy(deploymentIdentity);
+    }
+
+    private void assertBundlePresent(String symbolicName, Version version) {
+        Bundle[] bundles = this.context.getBundles();
+
+        for (Bundle bundle : bundles) {
+            if (symbolicName.equals(bundle.getSymbolicName()) && version.equals(bundle.getVersion())) {
+                return;
+            }
+        }
+
+        fail("The bundle " + symbolicName + " " + version + " was not found.");
+    }
+
+    private void assertBundleNotPresent(String symbolicName, Version version) {
+        Bundle[] bundles = this.context.getBundles();
+
+        for (Bundle bundle : bundles) {
+            if (symbolicName.equals(bundle.getSymbolicName()) && version.equals(bundle.getVersion())) {
+                fail("Bundle " + bundle + " should not be present");
+            }
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/ParRefreshTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/ParRefreshTests.java
new file mode 100644
index 0000000..2927db9
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/ParRefreshTests.java
@@ -0,0 +1,180 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.eclipse.virgo.kernel.deployer.test.util.ArtifactLifecycleEvent;
+import org.eclipse.virgo.kernel.deployer.test.util.ArtifactListener;
+import org.eclipse.virgo.kernel.deployer.test.util.TestLifecycleEvent;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifactLifecycleListener;
+import org.eclipse.virgo.util.math.Sets;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.Version;
+
+/**
+ * Test refresh of artifacts in a Par
+ *
+ */
+public class ParRefreshTests extends AbstractDeployerIntegrationTest {
+    
+    private static final File PAR_FILE = new File("src/test/resources/ParRefreshPar.par");
+    private static final String PAR_SYMBOLIC_NAME = "RefreshPar";
+    private static final Version PAR_VERSION = new Version(1,0,0);
+    
+    private static final String BUNDLE_A_SYMBOLIC_NAME = PAR_SYMBOLIC_NAME + "-1-bundleA";
+    private static final String BUNDLE_B_SYMBOLIC_NAME = PAR_SYMBOLIC_NAME + "-1-bundleB";
+    private static final Version BUNDLE_VERSION = new Version(1,0,0);
+
+    private static final String SYNTHETIC_CONTEXT_BUNDLE_SYMBOLIC_NAME = PAR_SYMBOLIC_NAME + "-1-synthetic.context";
+
+    private ArtifactListener artifactListener = new ArtifactListener();
+    
+    @Before
+    public void parRefreshSetup() throws Exception {
+        this.context.registerService(InstallArtifactLifecycleListener.class.getName(), artifactListener, null);
+    }
+    
+    @Test
+    public void testRefreshOfBundleInPar() throws DeploymentException {
+        
+        DeploymentIdentity parIdentity = this.deployer.deploy(PAR_FILE.toURI());
+
+        assertBundlePresent(BUNDLE_A_SYMBOLIC_NAME, BUNDLE_VERSION);
+
+        this.artifactListener.clear();
+
+        Set<ArtifactLifecycleEvent> expectedEventSet = new HashSet<ArtifactLifecycleEvent>();
+        //events expected due to explicit refresh;
+        expectedEventSet.add(new ArtifactLifecycleEvent(TestLifecycleEvent.STOPPING, "bundle", BUNDLE_A_SYMBOLIC_NAME, BUNDLE_VERSION));
+        expectedEventSet.add(new ArtifactLifecycleEvent(TestLifecycleEvent.STOPPED, "bundle", BUNDLE_A_SYMBOLIC_NAME, BUNDLE_VERSION));
+        expectedEventSet.add(new ArtifactLifecycleEvent(TestLifecycleEvent.UNRESOLVED, "bundle", BUNDLE_A_SYMBOLIC_NAME, BUNDLE_VERSION));
+        expectedEventSet.add(new ArtifactLifecycleEvent(TestLifecycleEvent.RESOLVED, "bundle", BUNDLE_A_SYMBOLIC_NAME, BUNDLE_VERSION));
+        expectedEventSet.add(new ArtifactLifecycleEvent(TestLifecycleEvent.STARTING, "bundle", BUNDLE_A_SYMBOLIC_NAME, BUNDLE_VERSION));
+        expectedEventSet.add(new ArtifactLifecycleEvent(TestLifecycleEvent.STARTED, "bundle", BUNDLE_A_SYMBOLIC_NAME, BUNDLE_VERSION));
+        
+        //events caused by PackageAdmin propagation
+        expectedEventSet.add(new ArtifactLifecycleEvent(TestLifecycleEvent.STOPPING, "bundle", SYNTHETIC_CONTEXT_BUNDLE_SYMBOLIC_NAME, BUNDLE_VERSION));
+        expectedEventSet.add(new ArtifactLifecycleEvent(TestLifecycleEvent.STOPPED, "bundle", SYNTHETIC_CONTEXT_BUNDLE_SYMBOLIC_NAME, BUNDLE_VERSION));
+        expectedEventSet.add(new ArtifactLifecycleEvent(TestLifecycleEvent.UNRESOLVED, "bundle", SYNTHETIC_CONTEXT_BUNDLE_SYMBOLIC_NAME, BUNDLE_VERSION));
+        expectedEventSet.add(new ArtifactLifecycleEvent(TestLifecycleEvent.RESOLVED, "bundle", SYNTHETIC_CONTEXT_BUNDLE_SYMBOLIC_NAME, BUNDLE_VERSION));
+        expectedEventSet.add(new ArtifactLifecycleEvent(TestLifecycleEvent.STARTING, "bundle", SYNTHETIC_CONTEXT_BUNDLE_SYMBOLIC_NAME, BUNDLE_VERSION));
+        expectedEventSet.add(new ArtifactLifecycleEvent(TestLifecycleEvent.STARTED, "bundle", SYNTHETIC_CONTEXT_BUNDLE_SYMBOLIC_NAME, BUNDLE_VERSION));
+        // bundleB depends on (imports) bundleA
+        expectedEventSet.add(new ArtifactLifecycleEvent(TestLifecycleEvent.STOPPING, "bundle", BUNDLE_B_SYMBOLIC_NAME, BUNDLE_VERSION));
+        expectedEventSet.add(new ArtifactLifecycleEvent(TestLifecycleEvent.STOPPED, "bundle", BUNDLE_B_SYMBOLIC_NAME, BUNDLE_VERSION));
+        expectedEventSet.add(new ArtifactLifecycleEvent(TestLifecycleEvent.UNRESOLVED, "bundle", BUNDLE_B_SYMBOLIC_NAME, BUNDLE_VERSION));
+        expectedEventSet.add(new ArtifactLifecycleEvent(TestLifecycleEvent.RESOLVED, "bundle", BUNDLE_B_SYMBOLIC_NAME, BUNDLE_VERSION));
+        expectedEventSet.add(new ArtifactLifecycleEvent(TestLifecycleEvent.STARTING, "bundle", BUNDLE_B_SYMBOLIC_NAME, BUNDLE_VERSION));
+        expectedEventSet.add(new ArtifactLifecycleEvent(TestLifecycleEvent.STARTED, "bundle", BUNDLE_B_SYMBOLIC_NAME, BUNDLE_VERSION));
+        
+        // Refresh the bundle, get back 'new' par identity
+        DeploymentIdentity newIdentity = this.deployer.refresh(PAR_FILE.toURI(), BUNDLE_A_SYMBOLIC_NAME);
+
+        waitForAndCheckEventsReceived(expectedEventSet, 10000L); // ten seconds backstop
+        
+        Set<ArtifactLifecycleEvent> actualEventSet = new HashSet<ArtifactLifecycleEvent>(artifactListener.extract());
+        
+        Set<ArtifactLifecycleEvent> extraEvents = Sets.difference(actualEventSet, expectedEventSet);
+        Set<ArtifactLifecycleEvent> missingEvents = Sets.difference(expectedEventSet, actualEventSet);
+        
+        assertTrue("Extra events were received: " + extraEvents, extraEvents.isEmpty());
+        assertTrue("Events were missing: " + missingEvents, missingEvents.isEmpty());
+        
+        assertBundlePresent(BUNDLE_A_SYMBOLIC_NAME, BUNDLE_VERSION);
+
+        assertDeploymentIdentityEquals(newIdentity, PAR_SYMBOLIC_NAME, "par", PAR_SYMBOLIC_NAME, PAR_VERSION.toString());
+        
+        this.deployer.undeploy(parIdentity);
+
+        assertBundleNotPresent(BUNDLE_A_SYMBOLIC_NAME, BUNDLE_VERSION);
+    }
+    
+    @Test
+    public void testRefreshOfDependentBundleInPar() throws DeploymentException {
+        
+        DeploymentIdentity parIdentity = this.deployer.deploy(PAR_FILE.toURI());
+
+        assertBundlePresent(BUNDLE_A_SYMBOLIC_NAME, BUNDLE_VERSION);
+        assertBundlePresent(BUNDLE_B_SYMBOLIC_NAME, BUNDLE_VERSION);
+
+        this.artifactListener.clear();
+
+        Set<ArtifactLifecycleEvent> expectedEventSet = new HashSet<ArtifactLifecycleEvent>();
+        //events expected due to explicit refresh;
+        expectedEventSet.add(new ArtifactLifecycleEvent(TestLifecycleEvent.STOPPING, "bundle", BUNDLE_B_SYMBOLIC_NAME, BUNDLE_VERSION));
+        expectedEventSet.add(new ArtifactLifecycleEvent(TestLifecycleEvent.STOPPED, "bundle", BUNDLE_B_SYMBOLIC_NAME, BUNDLE_VERSION));
+        expectedEventSet.add(new ArtifactLifecycleEvent(TestLifecycleEvent.UNRESOLVED, "bundle", BUNDLE_B_SYMBOLIC_NAME, BUNDLE_VERSION));
+        expectedEventSet.add(new ArtifactLifecycleEvent(TestLifecycleEvent.RESOLVED, "bundle", BUNDLE_B_SYMBOLIC_NAME, BUNDLE_VERSION));
+        expectedEventSet.add(new ArtifactLifecycleEvent(TestLifecycleEvent.STARTING, "bundle", BUNDLE_B_SYMBOLIC_NAME, BUNDLE_VERSION));
+        expectedEventSet.add(new ArtifactLifecycleEvent(TestLifecycleEvent.STARTED, "bundle", BUNDLE_B_SYMBOLIC_NAME, BUNDLE_VERSION));
+        
+        // Refresh the configuration, get back 'new' par identity
+        DeploymentIdentity newIdentity = this.deployer.refresh(PAR_FILE.toURI(), BUNDLE_B_SYMBOLIC_NAME);
+
+        waitForAndCheckEventsReceived(expectedEventSet, 10000L); // ten seconds backstop
+        
+        assertBundlePresent(BUNDLE_A_SYMBOLIC_NAME, BUNDLE_VERSION);
+        assertBundlePresent(BUNDLE_B_SYMBOLIC_NAME, BUNDLE_VERSION);
+
+        assertDeploymentIdentityEquals(newIdentity, PAR_SYMBOLIC_NAME, "par", PAR_SYMBOLIC_NAME, PAR_VERSION.toString());
+
+        this.deployer.undeploy(parIdentity);
+
+        assertBundleNotPresent(BUNDLE_A_SYMBOLIC_NAME, BUNDLE_VERSION);
+        assertBundleNotPresent(BUNDLE_B_SYMBOLIC_NAME, BUNDLE_VERSION);
+    }
+
+    private void waitForAndCheckEventsReceived(Set<ArtifactLifecycleEvent> expectedEventSet, long timeout) {
+        artifactListener.waitForEvents(expectedEventSet, timeout);
+        
+        Set<ArtifactLifecycleEvent> actualEventSet = new HashSet<ArtifactLifecycleEvent>(this.artifactListener.extract());
+        
+        Set<ArtifactLifecycleEvent> extraEvents = Sets.difference(actualEventSet, expectedEventSet);
+        Set<ArtifactLifecycleEvent> missingEvents = Sets.difference(expectedEventSet, actualEventSet);
+        
+        assertTrue("Extra events were received: " + extraEvents, extraEvents.isEmpty());
+        assertTrue("Events were missing: " + missingEvents, missingEvents.isEmpty());
+    }
+    
+    private void assertBundlePresent(String symbolicName, Version version) {
+        Bundle[] bundles = this.context.getBundles();
+        
+        for (Bundle bundle : bundles) {
+            if (symbolicName.equals(bundle.getSymbolicName()) && version.equals(bundle.getVersion())) {
+                return;
+            }
+        }
+        
+        fail("The bundle " + symbolicName + " " + version + " was not found.");
+    }
+    
+    private void assertBundleNotPresent(String symbolicName, Version version) {
+        Bundle[] bundles = this.context.getBundles();
+        
+        for (Bundle bundle : bundles) {
+            if (symbolicName.equals(bundle.getSymbolicName()) && version.equals(bundle.getVersion())) {
+                fail("Bundle " + bundle + " should not be present");
+            }
+        }
+    }  
+    
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/PipelinedDeployerIntegrationTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/PipelinedDeployerIntegrationTests.java
new file mode 100644
index 0000000..24b8b61
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/PipelinedDeployerIntegrationTests.java
@@ -0,0 +1,252 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertEquals;
+
+import java.io.File;
+import java.lang.management.ManagementFactory;
+
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.ServiceRegistration;
+
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifactLifecycleListener;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentOptions;
+import org.eclipse.virgo.repository.WatchableRepository;
+import org.eclipse.virgo.util.io.FileCopyUtils;
+import org.eclipse.virgo.util.io.FileSystemUtils;
+import org.eclipse.virgo.util.io.PathReference;
+
+/**
+ * Test the generic deployer using a test deployer. This doesn't check OSGi behaviour but will detect clashes in the
+ * file system during deployment.
+ * 
+ */
+public class PipelinedDeployerIntegrationTests extends AbstractDeployerIntegrationTest {
+
+    private static final int POLLING_INTERVAL_MILLIS = 100;
+
+    private final PathReference pickup = new PathReference("./build/pickup");
+
+    private final PathReference target = new PathReference("./build");
+
+    private StubInstallArtifactLifecycleListener lifecycleListener;
+
+    private ServiceRegistration<InstallArtifactLifecycleListener> lifecycleListenerRegistration;
+
+    private StubWatchableRepository watchableRepository;
+
+    private ServiceRegistration<WatchableRepository> watchableRepositoryRegistration;
+
+    private DeploymentIdentity deploymentIdentity;
+    
+    @Before
+    public void setUp() throws Exception {
+        PathReference pr = new PathReference("./build/deployer");
+        pr.delete(true);
+        pr.createDirectory();
+
+        clearPickup();
+
+        this.lifecycleListener = new StubInstallArtifactLifecycleListener();
+        this.lifecycleListenerRegistration = this.kernelContext.registerService(InstallArtifactLifecycleListener.class, this.lifecycleListener, null);
+        
+        this.watchableRepository = new StubWatchableRepository();
+        this.watchableRepositoryRegistration = this.kernelContext.registerService(WatchableRepository.class, this.watchableRepository, null);
+    }
+
+    private void clearPickup() {
+        for (File file : FileSystemUtils.listFiles(this.pickup.toFile())) {
+            file.delete();
+        }
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        undeploy();
+        clearPickup();
+        if (this.lifecycleListenerRegistration != null) {
+            this.lifecycleListenerRegistration.unregister();
+        }
+        if (this.watchableRepository != null) {
+            this.watchableRepositoryRegistration.unregister();
+        }
+    }
+
+    private void undeploy() throws DeploymentException {
+        if (this.deploymentIdentity != null) {
+            this.deployer.undeploy(this.deploymentIdentity);
+            this.deploymentIdentity = null;
+        }
+    }
+
+    private void undeploy(boolean deleted) throws DeploymentException {
+        if (this.deploymentIdentity != null) {
+            this.deployer.undeploy(this.deploymentIdentity, deleted);
+            this.deploymentIdentity = null;
+        }
+    }
+
+    @Test
+    public void testDeployer() throws Exception {
+        File file = new File("src/test/resources/dummy.jar");
+        this.lifecycleListener.assertLifecycleCounts(0, 0, 0, 0);
+        this.deploymentIdentity = this.deployer.deploy(file.toURI());
+        this.lifecycleListener.assertLifecycleCounts(1, 1, 0, 0);
+        this.deployer.undeploy(this.deploymentIdentity);
+        this.deploymentIdentity = null;
+        this.lifecycleListener.assertLifecycleCounts(1, 1, 1, 1);
+        assertEquals(1, this.watchableRepository.getCheckCount());
+    }
+
+    @Test
+    public void testDeployerCleanup() throws Exception {
+        File file = new File("src/test/resources/dummy.jar");
+        this.lifecycleListener.assertLifecycleCounts(0, 0, 0, 0);
+        this.deploymentIdentity = this.deployer.deploy(file.toURI());
+        this.lifecycleListener.assertLifecycleCounts(1, 1, 0, 0);
+        undeploy();
+        this.lifecycleListener.assertLifecycleCounts(1, 1, 1, 1);
+
+        File workDir = new File("build/work/org.eclipse.virgo.kernel/Module/dummy.jar-0");
+        assertFalse(workDir.exists());
+        assertEquals(1, this.watchableRepository.getCheckCount());
+    }
+
+    @Test
+    public void testAwaitRecovery() throws Exception {
+        MBeanServer server = ManagementFactory.getPlatformMBeanServer();
+        ObjectName objectName = ObjectName.getInstance("org.eclipse.virgo.kernel:category=Control,type=RecoveryMonitor");
+        assertTrue(server.isRegistered(objectName));
+        assertTrue((Boolean) server.getAttribute(objectName, "RecoveryComplete"));
+        assertEquals(0, this.watchableRepository.getCheckCount());
+    }
+
+    @Test
+    public void testRepeatDeployment() throws Exception {
+        File file = new File("src/test/resources/dummy.jar");
+        this.lifecycleListener.assertLifecycleCounts(0, 0, 0, 0);
+        this.deploymentIdentity = this.deployer.deploy(file.toURI());
+        this.lifecycleListener.assertLifecycleCounts(1, 1, 0, 0);
+        undeploy();
+        this.lifecycleListener.assertLifecycleCounts(1, 1, 1, 1);
+        this.deploymentIdentity = this.deployer.deploy(file.toURI());
+        this.lifecycleListener.assertLifecycleCounts(2, 2, 1, 1);
+        undeploy();
+        this.lifecycleListener.assertLifecycleCounts(2, 2, 2, 2);
+        assertEquals(2, this.watchableRepository.getCheckCount());
+    }
+
+    @Test
+    public void testDuplicateDeployment() throws Exception {
+        File file = new File("src/test/resources/dummy.jar");
+        this.lifecycleListener.assertLifecycleCounts(0, 0, 0, 0);
+        this.deploymentIdentity = this.deployer.deploy(file.toURI());
+        this.lifecycleListener.assertLifecycleCounts(1, 1, 0, 0);
+        this.deployer.deploy(file.toURI());
+        this.lifecycleListener.assertLifecycleCounts(2, 2, 1, 1);
+        undeploy();
+        this.lifecycleListener.assertLifecycleCounts(2, 2, 2, 2);
+        assertEquals(1, this.watchableRepository.getCheckCount());
+    }
+
+    @Test
+    public void testHotDeploy() throws Exception {
+        PathReference dummy = new PathReference("src/test/resources/dummy.jar");
+        this.lifecycleListener.assertLifecycleCounts(0, 0, 0, 0);
+        PathReference deployed = dummy.copy(this.pickup);
+        assertLifecycleCountsAfterWait(1, 1, 0, 0, 10000);
+        deployed.delete();
+        assertLifecycleCountsAfterWait(1, 1, 1, 1, 6000);
+        assertEquals(1, this.watchableRepository.getCheckCount());
+    }
+
+    private void assertLifecycleCountsAfterWait(int starting, int started, int stopping, int stopped, long waitMillis) throws InterruptedException {
+        long remainingWait = waitMillis;
+        while (remainingWait > 0 && !this.lifecycleListener.checkLifecycleCounts(starting, started, stopping, stopped)) {
+            Thread.sleep(POLLING_INTERVAL_MILLIS);
+            remainingWait -= POLLING_INTERVAL_MILLIS;
+        }
+        this.lifecycleListener.assertLifecycleCounts(starting, started, stopping, stopped);
+    }
+
+    @Test
+    public void testDeployerOwned() throws Exception {
+        File dummyCopy = new File(this.target.toFile(), "dummy.jar");
+        if (dummyCopy.exists()) {
+            dummyCopy.delete();
+        }
+
+        PathReference dummy = new PathReference("src/test/resources/dummy.jar");
+        PathReference copy = dummy.copy(this.target);
+        assertTrue(copy.exists());
+        this.lifecycleListener.assertLifecycleCounts(0, 0, 0, 0);
+        this.deploymentIdentity = this.deployer.deploy(copy.toURI(), new DeploymentOptions(false, true, true));
+        this.lifecycleListener.assertLifecycleCounts(1, 1, 0, 0);
+        undeploy();
+        this.lifecycleListener.assertLifecycleCounts(1, 1, 1, 1);
+        assertFalse(copy.exists());
+
+        copy = dummy.copy(this.target);
+        this.deploymentIdentity = this.deployer.deploy(copy.toURI(), new DeploymentOptions(false, true, true));
+        copy.delete();
+        undeploy();
+
+        // Check artifact not deleted when undeploy specifies deleted=true.
+        dummy.copy(this.target);
+        assertTrue(copy.exists());
+        this.deploymentIdentity = this.deployer.deploy(copy.toURI(), new DeploymentOptions(false, true, true));
+        undeploy(true);
+        assertTrue(copy.exists());
+        copy.delete();
+        assertEquals(3, this.watchableRepository.getCheckCount());
+    }
+
+    @Test
+    public void testRedeployDeployerOwned() throws Exception {
+        File dummyCopy = new File(this.target.toFile(), "dummy.jar");
+        if (dummyCopy.exists()) {
+            dummyCopy.delete();
+        }
+
+        PathReference dummy = new PathReference("src/test/resources/dummy.jar");
+        PathReference copy = dummy.copy(this.target);
+        assertTrue(copy.exists());
+        this.lifecycleListener.assertLifecycleCounts(0, 0, 0, 0);
+        this.deploymentIdentity = this.deployer.deploy(copy.toURI(), new DeploymentOptions(false, true, true));
+        this.lifecycleListener.assertLifecycleCounts(1, 1, 0, 0);
+
+        File dummyModifiedFile = (new PathReference("src/test/resources/dummymodified.jar")).toFile().getAbsoluteFile();
+        FileCopyUtils.copy(dummyModifiedFile, copy.toFile().getAbsoluteFile()); // force direct overwrite
+
+        // simulate action on MODIFIED
+        this.deploymentIdentity = this.deployer.deploy(copy.toURI(), new DeploymentOptions(false, true, true));
+
+        this.lifecycleListener.assertLifecycleCounts(2, 2, 1, 1);
+        assertTrue(copy.exists());
+
+        undeploy();
+        this.lifecycleListener.assertLifecycleCounts(2, 2, 2, 2);
+        assertFalse(copy.exists());
+        assertEquals(2, this.watchableRepository.getCheckCount());
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/PipelinedDeployerTimeOutTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/PipelinedDeployerTimeOutTests.java
new file mode 100644
index 0000000..1b3a216
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/PipelinedDeployerTimeOutTests.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import java.io.File;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
+
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifactLifecycleListener;
+
+import org.eclipse.virgo.nano.deployer.api.core.ApplicationDeployer;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.eclipse.virgo.util.io.PathReference;
+
+/**
+ * Test the generic deployer using a test deployer. This doesn't check OSGi behaviour but will detect clashes in the
+ * file system during deployment.
+ * 
+ */
+// TODO Additional config paths in the new test framework
+// @AdditionalConfigPaths("src/test/resources/configTimeout/")
+// TODO This test is not robust: it passes without the change to the configured timeout value
+public class PipelinedDeployerTimeOutTests extends AbstractDeployerIntegrationTest {
+
+    private ServiceReference<ApplicationDeployer> appDeployerServiceReference;
+
+    private ApplicationDeployer appDeployer;
+
+    private final PathReference pickup = new PathReference("./target/pickup");
+
+    private StubInstallArtifactLifecycleListener lifecycleListener;
+
+    private ServiceRegistration<InstallArtifactLifecycleListener> lifecycleListenerRegistration;
+
+    @Before
+    public void setUp() throws Exception {
+        PathReference pr = new PathReference("./target/deployer");
+        pr.delete(true);
+        pr.createDirectory();
+
+        clearPickup();
+
+        this.appDeployerServiceReference = this.context.getServiceReference(ApplicationDeployer.class);
+        this.appDeployer = this.context.getService(this.appDeployerServiceReference);
+        this.lifecycleListener = new StubInstallArtifactLifecycleListener();
+        this.lifecycleListenerRegistration = this.context.registerService(InstallArtifactLifecycleListener.class, this.lifecycleListener, null);
+    }
+
+    private void clearPickup() {
+        File[] contents = this.pickup.toFile().listFiles();
+        for (File file : contents) {
+            file.delete();
+        }
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        clearPickup();
+        if (this.appDeployerServiceReference != null) {
+            this.context.ungetService(this.appDeployerServiceReference);
+        }
+        if (this.lifecycleListenerRegistration != null) {
+            this.lifecycleListenerRegistration.unregister();
+        }
+    }
+
+    @Test
+    public void testZeroTimeoutDeployer() throws Exception {
+        File file = new File("src/test/resources/ExporterC.jar");
+        this.lifecycleListener.assertLifecycleCounts(0, 0, 0, 0);
+        DeploymentIdentity deploymentIdentity = this.appDeployer.deploy(file.toURI());
+        this.lifecycleListener.assertLifecycleCounts(1, 1, 0, 0);
+        this.appDeployer.undeploy(deploymentIdentity);
+        this.lifecycleListener.assertLifecycleCounts(1, 1, 1, 1);
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/PlanDeploymentTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/PlanDeploymentTests.java
new file mode 100644
index 0000000..1b3b1c0
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/PlanDeploymentTests.java
@@ -0,0 +1,303 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map.Entry;
+import java.util.Properties;
+import java.util.Set;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.eclipse.virgo.kernel.deployer.test.util.ArtifactLifecycleEvent;
+import org.eclipse.virgo.kernel.deployer.test.util.ArtifactListener;
+import org.eclipse.virgo.kernel.deployer.test.util.TestLifecycleEvent;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifactLifecycleListener;
+import org.eclipse.virgo.util.math.Sets;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.Version;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+
+public class PlanDeploymentTests extends AbstractDeployerIntegrationTest {
+
+    private ServiceReference<ConfigurationAdmin> configAdminServiceReference;
+
+    private ConfigurationAdmin configAdmin;
+
+    private static final String PLAN_SYMBOLIC_NAME_BUG336200 = "bug336200.plan";
+
+    private static final String BUG336200_LAZY_BSN = "lazyBundle";
+
+    private static final Version VERSION_BUG336200 = new Version(1, 0, 0);
+
+    private final ArtifactListener artifactListener = new ArtifactListener();
+
+    @Test
+    public void planReferencingAPar() throws Exception {
+        testPlanDeployment(new File("src/test/resources/test-with-par.plan"), null, "par-deployed-by-plan-1-one");
+    }
+
+    @Test(expected = DeploymentException.class)
+    public void scopedPlanReferencingAPar() throws Exception {
+        testPlanDeployment(new File("src/test/resources/scoped-test-with-par.plan"), null);
+    }
+
+    @Test
+    public void scopedBundlesAndConfig() throws Exception {
+        String oneBsn = "simple.bundle.one";
+        String twoBsn = "simple.bundle.two";
+
+        testPlanDeployment(new File("src/test/resources/test.plan"), new File("src/test/resources/plan-deployment/com.foo.bar.properties"), oneBsn,
+            twoBsn);
+    }
+
+    @Test
+    public void testSimpleBundleWithFragment() throws Exception {
+        String oneBsn = "simple.bundle.one";
+        String twoBsn = "simple.fragment.one";
+
+        testPlanDeployment(new File("src/test/resources/fragment.plan"), null, oneBsn, twoBsn);
+    }
+
+    @Test
+    public void testUnscopedNonAtomicPlan() throws Exception {
+        String oneBsn = "simple.bundle.one";
+        String twoBsn = "simple.bundle.two";
+
+        testPlanDeployment(new File("src/test/resources/testunscopednonatomic.plan"), new File(
+            "src/test/resources/plan-deployment/com.foo.bar.properties"), oneBsn, twoBsn);
+    }
+
+    @Test
+    public void testPlanWithProperties() throws Exception {
+        this.deployer.deploy(new File("src/test/resources/properties.plan").toURI());
+        Bundle[] bundles = this.context.getBundles();
+        boolean found = false;
+        for (Bundle bundle : bundles) {
+            if ("bundle.properties".equals(bundle.getSymbolicName())) {
+                found = true;
+                assertEquals("foo", bundle.getHeaders().get("Test-Header"));
+            }
+        }
+        assertTrue(found);
+    }
+
+    @Test
+    public void testUnscopedAtomicPlanStartingEventsDuringDeployment() throws Exception {
+        testPlanDeploymentStartingEvents(new File("src/test/resources/bug336200.plan"), BUG336200_LAZY_BSN);
+    }
+
+    @Before
+    public void setUp() throws Exception {
+        this.configAdminServiceReference = this.context.getServiceReference(ConfigurationAdmin.class);
+        this.configAdmin = this.context.getService(this.configAdminServiceReference);
+        this.context.registerService(InstallArtifactLifecycleListener.class.getName(), artifactListener, null);
+    }
+
+    private void testPlanDeployment(File plan, File propertiesFile, String... candidateBsns) throws Exception {
+        Bundle[] beforeDeployBundles = this.context.getBundles();
+        assertBundlesNotInstalled(beforeDeployBundles, candidateBsns);
+
+        DeploymentIdentity deploymentIdentity = this.deployer.deploy(plan.toURI());
+        Bundle[] afterDeployBundles = this.context.getBundles();
+        assertBundlesInstalled(afterDeployBundles, candidateBsns);
+
+        String pid = null;
+
+        if (propertiesFile != null) {
+            pid = propertiesFile.getName().substring(0, propertiesFile.getName().length() - ".properties".length());
+            checkConfigAvailable(pid, propertiesFile);
+        }
+
+        this.deployer.undeploy(deploymentIdentity);
+        Bundle[] afterUndeployBundles = this.context.getBundles();
+        assertBundlesNotInstalled(afterUndeployBundles, candidateBsns);
+
+        if (propertiesFile != null) {
+            checkConfigUnavailable(pid);
+        }
+        
+        uninstallBundles(afterUndeployBundles, "simple.fragment.one");
+    }
+
+    private void testPlanDeploymentStartingEvents(File plan, String... candidateBsns) throws Exception {
+
+        this.artifactListener.clear();
+
+        Set<ArtifactLifecycleEvent> expectedEventSet = new HashSet<ArtifactLifecycleEvent>();
+        // events expected due to explicit refresh;
+        expectedEventSet.add(new ArtifactLifecycleEvent(TestLifecycleEvent.RESOLVING, "plan", PLAN_SYMBOLIC_NAME_BUG336200, VERSION_BUG336200));
+        expectedEventSet.add(new ArtifactLifecycleEvent(TestLifecycleEvent.RESOLVED, "plan", PLAN_SYMBOLIC_NAME_BUG336200, VERSION_BUG336200));
+        expectedEventSet.add(new ArtifactLifecycleEvent(TestLifecycleEvent.INSTALLING, "plan", PLAN_SYMBOLIC_NAME_BUG336200, VERSION_BUG336200));
+        expectedEventSet.add(new ArtifactLifecycleEvent(TestLifecycleEvent.INSTALLED, "plan", PLAN_SYMBOLIC_NAME_BUG336200, VERSION_BUG336200));
+        expectedEventSet.add(new ArtifactLifecycleEvent(TestLifecycleEvent.STARTING, "plan", PLAN_SYMBOLIC_NAME_BUG336200, VERSION_BUG336200));
+        expectedEventSet.add(new ArtifactLifecycleEvent(TestLifecycleEvent.STARTED, "plan", PLAN_SYMBOLIC_NAME_BUG336200, VERSION_BUG336200));
+        
+        expectedEventSet.add(new ArtifactLifecycleEvent(TestLifecycleEvent.RESOLVING, "bundle", BUG336200_LAZY_BSN, VERSION_BUG336200));
+        expectedEventSet.add(new ArtifactLifecycleEvent(TestLifecycleEvent.RESOLVED, "bundle", BUG336200_LAZY_BSN, VERSION_BUG336200));
+        expectedEventSet.add(new ArtifactLifecycleEvent(TestLifecycleEvent.INSTALLING, "bundle", BUG336200_LAZY_BSN, VERSION_BUG336200));
+        expectedEventSet.add(new ArtifactLifecycleEvent(TestLifecycleEvent.INSTALLED, "bundle", BUG336200_LAZY_BSN, VERSION_BUG336200));
+        expectedEventSet.add(new ArtifactLifecycleEvent(TestLifecycleEvent.STARTING, "bundle", BUG336200_LAZY_BSN, VERSION_BUG336200));
+        expectedEventSet.add(new ArtifactLifecycleEvent(TestLifecycleEvent.STARTED, "bundle", BUG336200_LAZY_BSN, VERSION_BUG336200));
+ 
+        Bundle[] beforeDeployBundles = this.context.getBundles();
+        assertBundlesNotInstalled(beforeDeployBundles, candidateBsns);
+        Thread startBundleThread = new Thread(new StartBundleRunnable(this.context));
+        startBundleThread.start();
+        
+        DeploymentIdentity deploymentIdentity = this.deployer.deploy(plan.toURI());
+        waitForAndCheckEventsReceived(expectedEventSet, 10000L);
+
+        Bundle[] afterDeployBundles = this.context.getBundles();
+        assertBundlesInstalled(afterDeployBundles, candidateBsns);
+
+        this.deployer.undeploy(deploymentIdentity);
+        Bundle[] afterUndeployBundles = this.context.getBundles();
+        assertBundlesNotInstalled(afterUndeployBundles, candidateBsns);
+        
+        uninstallBundles(afterUndeployBundles, "simple.fragment.one");
+    }
+    
+    private void uninstallBundles(Bundle[] bundles, String... uninstallBsns) {
+        for (Bundle bundle : bundles) {
+            String symbolicName = bundle.getSymbolicName();
+            for (String uninstallBsn : uninstallBsns) {
+                if (uninstallBsn.equals(symbolicName)) {
+                    try {
+                        bundle.uninstall();
+                    } catch (BundleException _) {
+                    }
+                }
+            }
+        }
+    }
+    
+    private class StartBundleRunnable implements Runnable {
+
+        BundleContext context = null;
+
+        public StartBundleRunnable(BundleContext bundleContext) {
+            this.context = bundleContext;
+        }
+
+        @Override
+        public void run() {
+            try {
+                waitAndStartLazyBundle();
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            } catch (BundleException e) {
+                e.printStackTrace();
+            }
+
+        }
+
+        private void waitAndStartLazyBundle() throws InterruptedException, BundleException {
+            Thread.sleep(2500);
+
+            for (Bundle bundle : this.context.getBundles()) {
+                if (bundle.getSymbolicName().equals(BUG336200_LAZY_BSN)) {
+                    bundle.start();
+                }
+            }
+        }
+
+    }
+
+    private void waitForAndCheckEventsReceived(Set<ArtifactLifecycleEvent> expectedEventSet, long timeout) {
+        this.artifactListener.waitForEvents(expectedEventSet, timeout);
+        
+        Set<ArtifactLifecycleEvent> actualEventSet = new HashSet<ArtifactLifecycleEvent>(this.artifactListener.extract());
+
+        Set<ArtifactLifecycleEvent> extraEvents = Sets.difference(actualEventSet, expectedEventSet);
+        Set<ArtifactLifecycleEvent> missingEvents = Sets.difference(expectedEventSet, actualEventSet);
+
+        assertTrue("More events were received than expected: " + extraEvents, extraEvents.isEmpty());
+        assertTrue("There were missing events: " + missingEvents, missingEvents.isEmpty());
+        
+        List<ArtifactLifecycleEvent> actualEventSetList = this.artifactListener.extract();
+        ArtifactLifecycleEvent planStartingEvent = new ArtifactLifecycleEvent(TestLifecycleEvent.STARTING, "bundle", BUG336200_LAZY_BSN, VERSION_BUG336200);
+        assertTrue("More than one STARTING event received for the atomic plan.", actualEventSetList.indexOf(planStartingEvent) == actualEventSetList.lastIndexOf(planStartingEvent));
+    }
+
+    static void assertBundlesNotInstalled(Bundle[] bundles, String... candidateBsns) {
+        List<String> installedBsns = getInstalledBsns(bundles);
+        for (String candidateBsn : candidateBsns) {
+            for (String installedBsn : installedBsns) {
+                if (installedBsn.contains(candidateBsn)) {
+                    fail(candidateBsn + " was installed");
+                }
+            }
+        }
+    }
+
+    private void checkConfigAvailable(String pid, File propertiesFile) throws IOException {
+        Configuration configuration = this.configAdmin.getConfiguration(pid, null);
+        Dictionary<String, Object> dictionary = configuration.getProperties();
+
+        Properties properties = new Properties();
+        properties.load(new FileReader(propertiesFile));
+
+        Set<Entry<Object, Object>> entrySet = properties.entrySet();
+
+        for (Entry<Object, Object> entry : entrySet) {
+            Assert.assertEquals(entry.getValue(), dictionary.get(entry.getKey()));
+        }
+
+        Assert.assertEquals(pid, dictionary.get("service.pid"));
+    }
+
+    private void checkConfigUnavailable(String pid) throws IOException {
+        Configuration configuration = this.configAdmin.getConfiguration(pid, null);
+        Assert.assertNull(configuration.getProperties());
+    }
+
+    static void assertBundlesInstalled(Bundle[] bundles, String... candidateBsns) {
+        List<String> installedBsns = getInstalledBsns(bundles);
+        for (String candidateBsn : candidateBsns) {
+            boolean found = false;
+            for (String installedBsn : installedBsns) {
+                if (installedBsn.contains(candidateBsn)) {
+                    found = true;
+                }
+            }
+            assertTrue(candidateBsn + " was not installed", found);
+        }
+    }
+
+    static List<String> getInstalledBsns(Bundle[] bundles) {
+        List<String> installedBsns = new ArrayList<String>(bundles.length);
+        for (Bundle bundle : bundles) {
+            installedBsns.add(bundle.getSymbolicName());
+        }
+
+        return installedBsns;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/PlanDeploymentWithDAGTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/PlanDeploymentWithDAGTests.java
new file mode 100644
index 0000000..d763688
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/PlanDeploymentWithDAGTests.java
@@ -0,0 +1,1539 @@
+/*******************************************************************************
+ * Copyright (c) 2011 EclipseSource
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   EclipseSource - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import static org.eclipse.virgo.kernel.deployer.test.PlanDeploymentTests.assertBundlesInstalled;
+import static org.eclipse.virgo.kernel.deployer.test.PlanDeploymentTests.assertBundlesNotInstalled;
+import static org.eclipse.virgo.kernel.deployer.test.PlanDeploymentTests.getInstalledBsns;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.equinox.region.Region;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.eclipse.virgo.kernel.deployer.test.util.ArtifactLifecycleEvent;
+import org.eclipse.virgo.kernel.deployer.test.util.ArtifactListener;
+import org.eclipse.virgo.kernel.deployer.test.util.TestLifecycleEvent;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifactLifecycleListener;
+import org.eclipse.virgo.kernel.model.Artifact;
+import org.eclipse.virgo.kernel.model.RuntimeArtifactRepository;
+import org.eclipse.virgo.util.math.Sets;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.framework.Version;
+
+// TODO 1c. (transitive dependencies) (@see https://bugs.eclipse.org/bugs/show_bug.cgi?id=365034)
+public class PlanDeploymentWithDAGTests extends AbstractDeployerIntegrationTest {
+
+    private static final String BUNDLE_ONE_SYMBOLIC_NAME = "simple.bundle.one";
+
+    private static final DeploymentIdentity BUNDLE_ONE_IDENTITY = new DeploymentIdentity() {
+
+        private static final long serialVersionUID = 1L;
+
+        @Override
+        public String getType() {
+            return "bundle";
+        }
+
+        @Override
+        public String getSymbolicName() {
+            return BUNDLE_ONE_SYMBOLIC_NAME;
+        }
+
+        @Override
+        public String getVersion() {
+            return TEST_APPS_VERSION;
+        }
+    };
+
+    private static final DeploymentIdentity SHARED_PLAN_IDENTITY = new DeploymentIdentity() {
+
+        private static final long serialVersionUID = 1L;
+
+        @Override
+        public String getType() {
+            return "plan";
+        }
+
+        @Override
+        public String getSymbolicName() {
+            return "testAshared";
+        }
+
+        @Override
+        public String getVersion() {
+            return "1.0.0";
+        }
+    };
+
+    private static final String BUNDLE_THREE_SYMBOLIC_NAME = "simple.bundle.three";
+
+    private final ArtifactListener artifactListener = new ArtifactListener();
+
+    private ServiceRegistration<InstallArtifactLifecycleListener> testInstallArtifactLifecycleListenerServiceRegistration = null;
+
+    private RuntimeArtifactRepository ram;
+
+    private Region globalRegion;
+
+    private Region userRegion;
+
+    private Set<ArtifactLifecycleEvent> expectedEventSet;
+
+    private DeploymentIdentity bundleId;
+
+    private Artifact bundleArtifact;
+
+    private DeploymentIdentity planAId;
+
+    private Artifact planAArtifact;
+
+    private DeploymentIdentity planBId;
+
+    private Artifact planBArtifact;
+
+    private DeploymentIdentity sharedPlanId;
+
+    @Before
+    public void setUp() throws Exception {
+        this.testInstallArtifactLifecycleListenerServiceRegistration = this.context.registerService(InstallArtifactLifecycleListener.class,
+            this.artifactListener, null);
+
+        ServiceReference<RuntimeArtifactRepository> runtimeArtifactRepositoryServiceReference = this.context.getServiceReference(RuntimeArtifactRepository.class);
+        if (runtimeArtifactRepositoryServiceReference != null) {
+            this.ram = this.context.getService(runtimeArtifactRepositoryServiceReference);
+        }
+
+        Collection<ServiceReference<Region>> globalRegionServiceReferences = this.context.getServiceReferences(Region.class,
+            "(org.eclipse.virgo.kernel.region.name=global)");
+        if (globalRegionServiceReferences != null && globalRegionServiceReferences.size() == 1) {
+            this.globalRegion = this.context.getService(globalRegionServiceReferences.iterator().next());
+        }
+
+        Collection<ServiceReference<Region>> userRegionServiceReferences = this.context.getServiceReferences(Region.class,
+            "(org.eclipse.virgo.kernel.region.name=org.eclipse.virgo.region.user)");
+        if (userRegionServiceReferences != null && userRegionServiceReferences.size() == 1) {
+            this.userRegion = this.context.getService(userRegionServiceReferences.iterator().next());
+        }
+
+        this.expectedEventSet = new HashSet<ArtifactLifecycleEvent>();
+        this.bundleId = null;
+        this.bundleArtifact = null;
+        this.planAId = null;
+        this.planAArtifact = null;
+        this.planBId = null;
+        this.planBArtifact = null;
+
+        clearEvents();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        if (this.testInstallArtifactLifecycleListenerServiceRegistration != null) {
+            this.testInstallArtifactLifecycleListenerServiceRegistration.unregister();
+            this.testInstallArtifactLifecycleListenerServiceRegistration = null;
+        }
+
+        if (this.planAArtifact != null) {
+            this.deployer.undeploy(this.planAId);
+        }
+
+        if (this.planBArtifact != null) {
+            this.deployer.undeploy(this.planBId);
+        }
+
+        if (this.bundleArtifact != null) {
+            this.deployer.undeploy(this.bundleId);
+        }
+    }
+
+    @Test
+    // 1a. (@see https://bugs.eclipse.org/bugs/show_bug.cgi?id=365034)
+    public void planReferencingAnAlreadyInstalledBundle() throws Exception {
+
+        File file = new File("src/test/resources/plan-deployment/simple.bundle.one.jar");
+        DeploymentIdentity deploymentId = this.deployer.deploy(file.toURI());
+        assertBundlesInstalled(this.context.getBundles(), BUNDLE_ONE_SYMBOLIC_NAME);
+
+        DeploymentIdentity deploymentIdentity = this.deployer.deploy(new File("src/test/resources/testunscopednonatomicA.plan").toURI());
+        assertBundlesInstalled(this.context.getBundles(), BUNDLE_ONE_SYMBOLIC_NAME);
+
+        this.deployer.undeploy(deploymentIdentity);
+        assertBundlesInstalled(this.context.getBundles(), BUNDLE_ONE_SYMBOLIC_NAME);
+
+        this.deployer.undeploy(deploymentId.getType(), deploymentId.getSymbolicName(), deploymentId.getVersion());
+        assertBundlesNotInstalled(this.context.getBundles(), BUNDLE_ONE_SYMBOLIC_NAME);
+    }
+
+    @Test
+    // 1a. (@see https://bugs.eclipse.org/bugs/show_bug.cgi?id=365034)
+    public void planReferencingAnAlreadyInstalledBundleUndeployBundleFirst() throws Exception {
+
+        File file = new File("src/test/resources/plan-deployment/simple.bundle.one.jar");
+        DeploymentIdentity bundleDeploymentId = this.deployer.deploy(file.toURI());
+        assertBundlesInstalled(this.context.getBundles(), BUNDLE_ONE_SYMBOLIC_NAME);
+
+        DeploymentIdentity planDeploymentId = this.deployer.deploy(new File("src/test/resources/testunscopednonatomicA.plan").toURI());
+        assertNoDuplicatesInstalled(this.context.getBundles(), BUNDLE_ONE_SYMBOLIC_NAME);
+        assertBundlesInstalled(this.context.getBundles(), BUNDLE_ONE_SYMBOLIC_NAME);
+
+        this.deployer.undeploy(bundleDeploymentId.getType(), bundleDeploymentId.getSymbolicName(), bundleDeploymentId.getVersion());
+        assertBundlesInstalled(this.context.getBundles(), BUNDLE_ONE_SYMBOLIC_NAME);
+
+        this.deployer.undeploy(planDeploymentId);
+        assertBundlesNotInstalled(this.context.getBundles(), BUNDLE_ONE_SYMBOLIC_NAME);
+    }
+
+    @Test
+    // 1a. (@see https://bugs.eclipse.org/bugs/show_bug.cgi?id=365034)
+    public void planReferencingAnAlreadyInstalledBundleUndeployPlanFirst() throws Exception {
+
+        File file = new File("src/test/resources/plan-deployment/simple.bundle.one.jar");
+        DeploymentIdentity deploymentId = this.deployer.deploy(file.toURI());
+        assertBundlesInstalled(this.context.getBundles(), BUNDLE_ONE_SYMBOLIC_NAME);
+
+        DeploymentIdentity deploymentIdentity = this.deployer.deploy(new File("src/test/resources/testunscopednonatomicA.plan").toURI());
+        assertNoDuplicatesInstalled(this.context.getBundles(), BUNDLE_ONE_SYMBOLIC_NAME);
+        assertBundlesInstalled(this.context.getBundles(), BUNDLE_ONE_SYMBOLIC_NAME);
+
+        this.deployer.undeploy(deploymentIdentity);
+        assertBundlesInstalled(this.context.getBundles(), BUNDLE_ONE_SYMBOLIC_NAME);
+
+        this.deployer.undeploy(deploymentId.getType(), deploymentId.getSymbolicName(), deploymentId.getVersion());
+        assertBundlesNotInstalled(this.context.getBundles(), BUNDLE_ONE_SYMBOLIC_NAME);
+    }
+
+    private void assertNoDuplicatesInstalled(Bundle[] bundles, String bundleOneSymbolicName) {
+        List<String> installedBsns = getInstalledBsns(bundles);
+        int found = 0;
+        for (String installedBsn : installedBsns) {
+            if (installedBsn.contains(bundleOneSymbolicName)) {
+                found++;
+            }
+        }
+        assertTrue("Too many bundles '" + bundleOneSymbolicName + "' found. Should be shared.", found <= 1);
+    }
+
+    @Test
+    // 1b. (@see https://bugs.eclipse.org/bugs/show_bug.cgi?id=365034)
+    public void twoPlansReferencingASharedBundle() throws Exception {
+
+        DeploymentIdentity deploymentIdentityPlanA = this.deployer.deploy(new File("src/test/resources/testunscopednonatomicA.plan").toURI());
+        assertBundlesInstalled(this.context.getBundles(), BUNDLE_ONE_SYMBOLIC_NAME);
+
+        DeploymentIdentity deploymentIdentityPlanB = this.deployer.deploy(new File("src/test/resources/testunscopednonatomicB.plan").toURI());
+        assertBundlesInstalled(this.context.getBundles(), BUNDLE_ONE_SYMBOLIC_NAME);
+
+        this.deployer.undeploy(deploymentIdentityPlanB);
+
+        assertBundlesInstalled(this.context.getBundles(), BUNDLE_ONE_SYMBOLIC_NAME);
+
+        this.deployer.undeploy(deploymentIdentityPlanA);
+        assertBundlesNotInstalled(this.context.getBundles(), BUNDLE_ONE_SYMBOLIC_NAME);
+    }
+
+    @Test
+    // 2. (1a. / 1b) (@see https://bugs.eclipse.org/bugs/show_bug.cgi?id=365034)
+    public void bundleAlreadyInstalledAsPartOfAPlan() throws Exception {
+
+        DeploymentIdentity deploymentIdentity = this.deployer.deploy(new File("src/test/resources/testunscopednonatomicA.plan").toURI());
+        assertBundlesInstalled(this.context.getBundles(), BUNDLE_ONE_SYMBOLIC_NAME);
+
+        File file = new File("src/test/resources/plan-deployment/simple.bundle.one.jar");
+        DeploymentIdentity deploymentId = this.deployer.deploy(file.toURI());
+        assertBundlesInstalled(this.context.getBundles(), BUNDLE_ONE_SYMBOLIC_NAME);
+
+        this.deployer.undeploy(deploymentId.getType(), deploymentId.getSymbolicName(), deploymentId.getVersion());
+        assertBundlesInstalled(this.context.getBundles(), BUNDLE_ONE_SYMBOLIC_NAME);
+
+        this.deployer.undeploy(deploymentIdentity);
+        assertBundlesNotInstalled(this.context.getBundles(), BUNDLE_ONE_SYMBOLIC_NAME);
+    }
+
+    @Test
+    public void testLifecycleWithTwoPlansReferencingASharedBundle() throws Exception {
+
+        DeploymentIdentity deploymentIdentityPlanA = this.deployer.deploy(new File("src/test/resources/testunscopednonatomicA.plan").toURI());
+        assertBundlesActive(this.context.getBundles(), BUNDLE_ONE_SYMBOLIC_NAME);
+
+        DeploymentIdentity deploymentIdentityPlanB = this.deployer.deploy(new File("src/test/resources/testunscopednonatomicB.plan").toURI());
+        assertBundlesActive(this.context.getBundles(), BUNDLE_ONE_SYMBOLIC_NAME);
+
+        this.deployer.undeploy(deploymentIdentityPlanB);
+
+        assertBundlesActive(this.context.getBundles(), BUNDLE_ONE_SYMBOLIC_NAME);
+
+        this.deployer.undeploy(deploymentIdentityPlanA);
+    }
+
+    @Test
+    public void testLifecycleWithPlanReferencingAnAlreadyInstalledBundleUndeployBundleFirst() throws Exception {
+
+        File file = new File("src/test/resources/plan-deployment/simple.bundle.one.jar");
+        DeploymentIdentity deploymentId = this.deployer.deploy(file.toURI());
+        assertBundlesActive(this.context.getBundles(), BUNDLE_ONE_SYMBOLIC_NAME);
+
+        DeploymentIdentity deploymentIdentity = this.deployer.deploy(new File("src/test/resources/testunscopednonatomicA.plan").toURI());
+        assertBundlesActive(this.context.getBundles(), BUNDLE_ONE_SYMBOLIC_NAME);
+
+        this.deployer.undeploy(deploymentId.getType(), deploymentId.getSymbolicName(), deploymentId.getVersion());
+        assertBundlesResolved(this.context.getBundles(), BUNDLE_ONE_SYMBOLIC_NAME);
+
+        this.deployer.undeploy(deploymentIdentity);
+    }
+
+    @Test
+    public void testLifecycleWithPlanReferencingAnAlreadyInstalledBundleUndeployPlanFirst() throws Exception {
+
+        File file = new File("src/test/resources/plan-deployment/simple.bundle.one.jar");
+        DeploymentIdentity deploymentId = this.deployer.deploy(file.toURI());
+        assertBundlesActive(this.context.getBundles(), BUNDLE_ONE_SYMBOLIC_NAME);
+
+        DeploymentIdentity deploymentIdentity = this.deployer.deploy(new File("src/test/resources/testunscopednonatomicA.plan").toURI());
+        assertBundlesActive(this.context.getBundles(), BUNDLE_ONE_SYMBOLIC_NAME);
+
+        this.deployer.undeploy(deploymentIdentity);
+        assertBundlesActive(this.context.getBundles(), BUNDLE_ONE_SYMBOLIC_NAME);
+
+        this.deployer.undeploy(deploymentId.getType(), deploymentId.getSymbolicName(), deploymentId.getVersion());
+    }
+
+    @Test
+    public void planReferencingAnAlreadyInstalledBundleNotInRepository() throws Exception {
+
+        File file = new File("src/test/resources/plan-deployment-dag/simple.bundle.three.jar");
+        DeploymentIdentity bundleDeploymentId = this.deployer.deploy(file.toURI());
+        assertBundlesInstalled(this.context.getBundles(), BUNDLE_THREE_SYMBOLIC_NAME);
+
+        DeploymentIdentity planDeploymentId = this.deployer.deploy(new File("src/test/resources/testunscopednonatomicC.plan").toURI());
+        assertBundlesInstalled(this.context.getBundles(), BUNDLE_THREE_SYMBOLIC_NAME);
+
+        this.deployer.undeploy(planDeploymentId);
+        assertBundlesInstalled(this.context.getBundles(), BUNDLE_THREE_SYMBOLIC_NAME);
+
+        this.deployer.undeploy(bundleDeploymentId.getType(), bundleDeploymentId.getSymbolicName(), bundleDeploymentId.getVersion());
+        assertBundlesNotInstalled(this.context.getBundles(), BUNDLE_THREE_SYMBOLIC_NAME);
+    }
+
+    @Test
+    public void planReferencingAnAlreadyInstalledBundleNotInRepositoryUndeployBundleFirst() throws Exception {
+
+        File file = new File("src/test/resources/plan-deployment-dag/simple.bundle.three.jar");
+        DeploymentIdentity deploymentId = this.deployer.deploy(file.toURI());
+        assertBundlesInstalled(this.context.getBundles(), BUNDLE_THREE_SYMBOLIC_NAME);
+
+        DeploymentIdentity deploymentIdentity = this.deployer.deploy(new File("src/test/resources/testunscopednonatomicC.plan").toURI());
+        assertNoDuplicatesInstalled(this.context.getBundles(), BUNDLE_THREE_SYMBOLIC_NAME);
+        assertBundlesInstalled(this.context.getBundles(), BUNDLE_THREE_SYMBOLIC_NAME);
+
+        this.deployer.undeploy(deploymentId.getType(), deploymentId.getSymbolicName(), deploymentId.getVersion());
+        assertBundlesInstalled(this.context.getBundles(), BUNDLE_THREE_SYMBOLIC_NAME);
+
+        this.deployer.undeploy(deploymentIdentity);
+        assertBundlesNotInstalled(this.context.getBundles(), BUNDLE_THREE_SYMBOLIC_NAME);
+    }
+
+    @Test
+    public void twoPlansReferencingAnAlreadyInstalledBundleNotInRepository() throws Exception {
+
+        File file = new File("src/test/resources/plan-deployment-dag/simple.bundle.three.jar");
+        DeploymentIdentity bundleDeploymentId = this.deployer.deploy(file.toURI());
+        assertBundlesInstalled(this.context.getBundles(), BUNDLE_THREE_SYMBOLIC_NAME);
+
+        DeploymentIdentity planCDeploymentId = this.deployer.deploy(new File("src/test/resources/testunscopednonatomicC.plan").toURI());
+        assertBundlesInstalled(this.context.getBundles(), BUNDLE_THREE_SYMBOLIC_NAME);
+
+        DeploymentIdentity planDDeploymentId = this.deployer.deploy(new File("src/test/resources/testunscopednonatomicD.plan").toURI());
+        assertBundlesInstalled(this.context.getBundles(), BUNDLE_THREE_SYMBOLIC_NAME);
+
+        this.deployer.undeploy(planCDeploymentId);
+        assertBundlesInstalled(this.context.getBundles(), BUNDLE_THREE_SYMBOLIC_NAME);
+
+        this.deployer.undeploy(bundleDeploymentId.getType(), bundleDeploymentId.getSymbolicName(), bundleDeploymentId.getVersion());
+        assertBundlesInstalled(this.context.getBundles(), BUNDLE_THREE_SYMBOLIC_NAME);
+
+        this.deployer.undeploy(planDDeploymentId);
+        assertBundlesNotInstalled(this.context.getBundles(), BUNDLE_THREE_SYMBOLIC_NAME);
+    }
+
+    // sharedTopLevelBundleActiveActive
+
+    @Test
+    public void sharedTopLevelBundleActiveActiveStartPlan() throws Exception {
+        sharedTopLevelBundlePlanActiveBundleActive();
+        startPlanA();
+        checkEvents();
+    }
+
+    @Test
+    public void sharedTopLevelBundleActiveActiveStopPlan() throws Exception {
+        sharedTopLevelBundlePlanActiveBundleActive();
+        stopPlanA();
+        expectPlanAStop();
+        checkEvents();
+    }
+
+    @Test
+    public void sharedTopLevelBundleActiveActiveUninstallPlan() throws Exception {
+        sharedTopLevelBundlePlanActiveBundleActive();
+        uninstallPlanA();
+        expectPlanAStop();
+        expectPlanAUninstall();
+        checkEvents();
+    }
+
+    @Test
+    public void sharedTopLevelBundleActiveActiveStartBundle() throws Exception {
+        sharedTopLevelBundlePlanActiveBundleActive();
+        startBundle();
+        checkEvents();
+    }
+
+    @Test
+    public void sharedTopLevelBundleActiveActiveStopBundle() throws Exception {
+        sharedTopLevelBundlePlanActiveBundleActive();
+        stopBundle();
+        expectBundleStop();
+        checkEvents();
+    }
+
+    @Test
+    public void sharedTopLevelBundleActiveActiveUninstallBundle() throws Exception {
+        sharedTopLevelBundlePlanActiveBundleActive();
+        uninstallBundle();
+        expectBundleStop();
+        checkEvents();
+    }
+
+    // sharedTopLevelBundleActiveResolved
+
+    @Test
+    public void sharedTopLevelBundleActiveResolvedStartPlan() throws Exception {
+        sharedTopLevelBundlePlanActiveBundleResolved();
+        startPlanA();
+        // no bundle events expected as ACTIVE plan no-ops when started
+        checkEvents();
+    }
+
+    @Test
+    public void sharedTopLevelBundleActiveResolvedStopPlan() throws Exception {
+        sharedTopLevelBundlePlanActiveBundleResolved();
+        stopPlanA();
+        expectPlanAStop();
+        checkEvents();
+    }
+
+    @Test
+    public void sharedTopLevelBundleActiveResolvedUninstallPlan() throws Exception {
+        sharedTopLevelBundlePlanActiveBundleResolved();
+        uninstallPlanA();
+        expectPlanAStop();
+        expectPlanAUninstall();
+        checkEvents();
+    }
+
+    @Test
+    public void sharedTopLevelBundleActiveResolvedStartBundle() throws Exception {
+        sharedTopLevelBundlePlanActiveBundleResolved();
+        startBundle();
+        expectBundleStart();
+        checkEvents();
+    }
+
+    @Test
+    public void sharedTopLevelBundleActiveResolvedStopBundle() throws Exception {
+        sharedTopLevelBundlePlanActiveBundleResolved();
+        stopBundle();
+        checkEvents();
+    }
+
+    @Test
+    public void sharedTopLevelBundleActiveResolvedUninstallBundle() throws Exception {
+        sharedTopLevelBundlePlanActiveBundleResolved();
+        uninstallBundle();
+        checkEvents();
+    }
+
+    // sharedTopLevelBundleResolvedActive
+
+    @Test
+    public void sharedTopLevelBundleResolvedActiveStartPlan() throws Exception {
+        sharedTopLevelBundlePlanResolvedBundleActive();
+        startPlanA();
+        expectPlanAStart();
+        checkEvents();
+    }
+
+    @Test
+    public void sharedTopLevelBundleResolvedActiveStopPlan() throws Exception {
+        sharedTopLevelBundlePlanResolvedBundleActive();
+        stopPlanA();
+        checkEvents();
+    }
+
+    @Test
+    public void sharedTopLevelBundleResolvedActiveUninstallPlan() throws Exception {
+        sharedTopLevelBundlePlanResolvedBundleActive();
+        uninstallPlanA();
+        expectPlanAUninstall();
+        checkEvents();
+    }
+
+    @Test
+    public void sharedTopLevelBundleResolvedActiveStartBundle() throws Exception {
+        sharedTopLevelBundlePlanResolvedBundleActive();
+        startBundle();
+        checkEvents();
+    }
+
+    @Test
+    public void sharedTopLevelBundleResolvedActiveStopBundle() throws Exception {
+        sharedTopLevelBundlePlanResolvedBundleActive();
+        stopBundle();
+        expectBundleStop();
+        checkEvents();
+    }
+
+    @Test
+    public void sharedTopLevelBundleResolvedActiveUninstallBundle() throws Exception {
+        sharedTopLevelBundlePlanResolvedBundleActive();
+        uninstallBundle();
+        expectBundleStop();
+        checkEvents();
+    }
+
+    // sharedTopLevelBundleResolvedResolved
+
+    @Test
+    public void sharedTopLevelBundleResolvedResolvedStartPlan() throws Exception {
+        sharedTopLevelBundlePlanResolvedBundleResolved();
+        startPlanA();
+        expectPlanAStart();
+        expectBundleStart();
+        checkEvents();
+    }
+
+    @Test
+    public void sharedTopLevelBundleResolvedResolvedStopPlan() throws Exception {
+        sharedTopLevelBundlePlanResolvedBundleResolved();
+        stopPlanA();
+        checkEvents();
+    }
+
+    @Test
+    public void sharedTopLevelBundleResolvedResolvedUninstallPlan() throws Exception {
+        sharedTopLevelBundlePlanResolvedBundleResolved();
+        uninstallPlanA();
+        expectPlanAUninstall();
+        checkEvents();
+    }
+
+    @Test
+    public void sharedTopLevelBundleResolvedResolvedStartBundle() throws Exception {
+        sharedTopLevelBundlePlanResolvedBundleResolved();
+        startBundle();
+        expectBundleStart();
+        checkEvents();
+    }
+
+    @Test
+    public void sharedTopLevelBundleResolvedResolvedStopBundle() throws Exception {
+        sharedTopLevelBundlePlanResolvedBundleResolved();
+        stopBundle();
+        checkEvents();
+    }
+
+    @Test
+    public void sharedTopLevelBundleResolvedResolvedUninstallBundle() throws Exception {
+        sharedTopLevelBundlePlanResolvedBundleResolved();
+        uninstallBundle();
+        checkEvents();
+    }
+
+    @Test
+    public void sharedTopLevelBundleResolvedResolvedUninstallBundleUninstallPlan() throws Exception {
+        sharedTopLevelBundlePlanResolvedBundleResolved();
+        uninstallBundle();
+        uninstallPlanA();
+        expectBundleUninstall();
+        expectPlanAUninstall();
+        checkEvents();
+    }
+
+    @Test
+    public void sharedTopLevelBundleResolvedResolvedUninstallPlanUninstallBundle() throws Exception {
+        sharedTopLevelBundlePlanResolvedBundleResolved();
+        uninstallPlanA();
+        uninstallBundle();
+        expectPlanAUninstall();
+        expectBundleUninstall();
+        checkEvents();
+    }
+
+    // twoPlansReferencingASharedBundleActiveActive
+
+    @Test
+    public void twoPlansReferencingASharedBundleActiveActiveStartPlanB() throws Exception {
+        sharedBundlePlanAActivePlanBActive();
+        startPlanB();
+        checkEvents();
+    }
+
+    @Test
+    public void twoPlansReferencingASharedBundleActiveActiveStopPlanB() throws Exception {
+        sharedBundlePlanAActivePlanBActive();
+        stopPlanB();
+        expectPlanBStop();
+        checkEvents();
+    }
+
+    @Test
+    public void twoPlansReferencingASharedBundleActiveActiveUninstallPlanB() throws Exception {
+        sharedBundlePlanAActivePlanBActive();
+        uninstallPlanB();
+        expectPlanBStop();
+        expectPlanBUninstall();
+        checkEvents();
+    }
+
+    // twoPlansReferencingASharedBundleActiveResolved
+
+    @Test
+    public void twoPlansReferencingASharedBundleActiveResolvedStartPlanB() throws Exception {
+        sharedBundlePlanAActivePlanBResolved();
+        startPlanB();
+        expectPlanBStart();
+        checkEvents();
+    }
+
+    @Test
+    public void twoPlansReferencingASharedBundleActiveResolvedStopPlanB() throws Exception {
+        sharedBundlePlanAActivePlanBResolved();
+        stopPlanB();
+        checkEvents();
+    }
+
+    @Test
+    public void twoPlansReferencingASharedBundleActiveResolvedUninstallPlanB() throws Exception {
+        sharedBundlePlanAActivePlanBResolved();
+        uninstallPlanB();
+        expectPlanBUninstall();
+        checkEvents();
+    }
+
+    @Test
+    public void twoPlansReferencingASharedBundleActiveResolvedStartPlanA() throws Exception {
+        sharedBundlePlanAActivePlanBResolved();
+        startPlanA();
+        checkEvents();
+    }
+
+    @Test
+    public void twoPlansReferencingASharedBundleActiveResolvedStopPlanA() throws Exception {
+        sharedBundlePlanAActivePlanBResolved();
+        stopPlanA();
+        expectPlanAStop();
+        expectBundleStop();
+        checkEvents();
+    }
+
+    @Test
+    public void twoPlansReferencingASharedBundleActiveResolvedUninstallPlanA() throws Exception {
+        sharedBundlePlanAActivePlanBResolved();
+        uninstallPlanA();
+        expectPlanAStop();
+        expectPlanAUninstall();
+        expectBundleStop();
+        checkEvents();
+    }
+
+    // twoPlansReferencingASharedBundleResolvedResolved
+
+    @Test
+    public void twoPlansReferencingASharedBundleResolvedResolvedStartPlanB() throws Exception {
+        sharedBundlePlanAResolvedPlanBResolved();
+        startPlanB();
+        expectPlanBStart();
+        expectBundleStart();
+        checkEvents();
+    }
+
+    @Test
+    public void twoPlansReferencingASharedBundleResolvedResolvedStopPlanB() throws Exception {
+        sharedBundlePlanAResolvedPlanBResolved();
+        stopPlanB();
+        checkEvents();
+    }
+
+    @Test
+    public void twoPlansReferencingASharedBundleResolvedResolvedUninstallPlanB() throws Exception {
+        sharedBundlePlanAResolvedPlanBResolved();
+        uninstallPlanB();
+        expectPlanBUninstall();
+        checkEvents();
+    }
+
+    @Test
+    public void twoPlansReferencingASharedBundleResolvedResolvedUninstallPlanAUninstallPlanB() throws Exception {
+        sharedBundlePlanAResolvedPlanBResolved();
+        uninstallPlanA();
+        uninstallPlanB();
+        expectPlanAUninstall();
+        expectPlanBUninstall();
+        expectBundleUninstall();
+        checkEvents();
+    }
+
+    // sharedTopLevelPlanActiveActive
+
+    @Test
+    public void sharedTopLevelPlanActiveActiveStartChildPlan() throws Exception {
+        sharedTopLevelPlanChildActiveParentActive();
+        startChildPlan();
+        checkEvents();
+    }
+
+    @Test
+    public void sharedTopLevelPlanActiveActiveStopChildPlan() throws Exception {
+        sharedTopLevelPlanChildActiveParentActive();
+        stopChildPlan();
+        expectChildPlanStop();
+        expectBundleStop();
+        checkEvents();
+    }
+
+    @Test
+    public void sharedTopLevelPlanActiveActiveUninstallChildPlan() throws Exception {
+        sharedTopLevelPlanChildActiveParentActive();
+        uninstallChildPlan();
+        expectChildPlanStop();
+        expectBundleStop();
+        checkEvents();
+    }
+
+    @Test
+    public void sharedTopLevelPlanActiveActiveStartParentPlan() throws Exception {
+        sharedTopLevelPlanChildActiveParentActive();
+        startParentPlan();
+        checkEvents();
+    }
+
+    @Test
+    public void sharedTopLevelPlanActiveActiveStopParentPlan() throws Exception {
+        sharedTopLevelPlanChildActiveParentActive();
+        stopParentPlan();
+        expectParentPlanStop();
+        checkEvents();
+    }
+
+    @Test
+    public void sharedTopLevelPlanActiveActiveUninstallParentPlan() throws Exception {
+        sharedTopLevelPlanChildActiveParentActive();
+        uninstallParentPlan();
+        expectParentPlanStop();
+        expectParentPlanUninstall();
+        checkEvents();
+    }
+
+    // sharedTopLevelPlanActiveResolved
+
+    @Test
+    public void sharedTopLevelPlanActiveResolvedStartChildPlan() throws Exception {
+        sharedTopLevelPlanChildActiveParentResolved();
+        startChildPlan();
+        checkEvents();
+    }
+
+    @Test
+    public void sharedTopLevelPlanActiveResolvedStopChildPlan() throws Exception {
+        sharedTopLevelPlanChildActiveParentResolved();
+        stopChildPlan();
+        expectChildPlanStop();
+        expectBundleStop();
+        checkEvents();
+    }
+
+    @Test
+    public void sharedTopLevelPlanActiveResolvedUninstallChildPlan() throws Exception {
+        sharedTopLevelPlanChildActiveParentResolved();
+        uninstallChildPlan();
+        expectChildPlanStop();
+        expectBundleStop();
+        checkEvents();
+    }
+
+    @Test
+    public void sharedTopLevelPlanActiveResolvedStartParentPlan() throws Exception {
+        sharedTopLevelPlanChildActiveParentResolved();
+        startParentPlan();
+        expectParentPlanStart();
+        checkEvents();
+    }
+
+    @Test
+    public void sharedTopLevelPlanActiveResolvedStopParentPlan() throws Exception {
+        sharedTopLevelPlanChildActiveParentResolved();
+        stopParentPlan();
+        checkEvents();
+    }
+
+    @Test
+    public void sharedTopLevelPlanActiveResolvedUninstallParentPlan() throws Exception {
+        sharedTopLevelPlanChildActiveParentResolved();
+        uninstallParentPlan();
+        expectParentPlanUninstall();
+        checkEvents();
+    }
+
+    // sharedTopLevelPlanResolvedActive
+
+    @Test
+    public void sharedTopLevelPlanResolvedActiveStartChildPlan() throws Exception {
+        sharedTopLevelPlanChildResolvedParentActive();
+        startChildPlan();
+        expectChildPlanStart();
+        expectBundleStart();
+        checkEvents();
+    }
+
+    @Test
+    public void sharedTopLevelPlanResolvedActiveStopChildPlan() throws Exception {
+        sharedTopLevelPlanChildResolvedParentActive();
+        stopChildPlan();
+        checkEvents();
+    }
+
+    @Test
+    public void sharedTopLevelPlanResolvedActiveUninstallChildPlan() throws Exception {
+        sharedTopLevelPlanChildResolvedParentActive();
+        uninstallChildPlan();
+        checkEvents();
+    }
+
+    @Test
+    public void sharedTopLevelPlanResolvedActiveStartParentPlan() throws Exception {
+        sharedTopLevelPlanChildResolvedParentActive();
+        startParentPlan();
+        checkEvents();
+    }
+
+    @Test
+    public void sharedTopLevelPlanResolvedActiveStopParentPlan() throws Exception {
+        sharedTopLevelPlanChildResolvedParentActive();
+        stopParentPlan();
+        expectParentPlanStop();
+        checkEvents();
+    }
+
+    @Test
+    public void sharedTopLevelPlanResolvedActiveUninstallParentPlan() throws Exception {
+        sharedTopLevelPlanChildResolvedParentActive();
+        uninstallParentPlan();
+        expectParentPlanStop();
+        expectParentPlanUninstall();
+        checkEvents();
+    }
+
+    // sharedTopLevelPlanResolvedResolved
+
+    @Test
+    public void sharedTopLevelPlanResolvedResolvedStartChildPlan() throws Exception {
+        sharedTopLevelPlanChildResolvedParentResolved();
+        startChildPlan();
+        expectChildPlanStart();
+        expectBundleStart();
+        checkEvents();
+    }
+
+    @Test
+    public void sharedTopLevelPlanResolvedResolvedStopChildPlan() throws Exception {
+        sharedTopLevelPlanChildResolvedParentResolved();
+        stopChildPlan();
+        checkEvents();
+    }
+
+    @Test
+    public void sharedTopLevelPlanResolvedResolvedUninstallChildPlan() throws Exception {
+        sharedTopLevelPlanChildResolvedParentResolved();
+        uninstallChildPlan();
+        checkEvents();
+    }
+
+    @Test
+    public void sharedTopLevelPlanResolvedResolvedStartParentPlan() throws Exception {
+        sharedTopLevelPlanChildResolvedParentResolved();
+        startParentPlan();
+        expectParentPlanStart();
+        expectChildPlanStart();
+        expectBundleStart();
+        checkEvents();
+    }
+
+    @Test
+    public void sharedTopLevelPlanResolvedResolvedStopParentPlan() throws Exception {
+        sharedTopLevelPlanChildResolvedParentResolved();
+        stopParentPlan();
+        checkEvents();
+    }
+
+    @Test
+    public void sharedTopLevelPlanResolvedResolvedUninstallParentPlan() throws Exception {
+        sharedTopLevelPlanChildResolvedParentResolved();
+        uninstallParentPlan();
+        expectParentPlanUninstall();
+        checkEvents();
+    }
+
+    @Test
+    public void sharedTopLevelPlanResolvedResolvedUninstallParentPlanUninstallChildPlan() throws Exception {
+        sharedTopLevelPlanChildResolvedParentResolved();
+        uninstallParentPlan();
+        uninstallChildPlan();
+        expectParentPlanUninstall();
+        expectChildPlanUninstall();
+        expectBundleUninstall();
+        checkEvents();
+    }
+
+    @Test
+    public void sharedTopLevelPlanResolvedResolvedUninstallChildPlanUninstallParentPlan() throws Exception {
+        sharedTopLevelPlanChildResolvedParentResolved();
+        uninstallChildPlan();
+        uninstallParentPlan();
+        expectChildPlanUninstall();
+        expectParentPlanUninstall();
+        expectBundleUninstall();
+        checkEvents();
+    }
+
+    // twoPlansReferencingASharedPlanActiveActive
+
+    @Test
+    public void twoPlansReferencingASharedPlanActiveActiveStartPlanB() throws Exception {
+        sharedPlanPlanAActivePlanBActive();
+        startPlanB();
+        checkEvents();
+    }
+
+    @Test
+    public void twoPlansReferencingASharedPlanActiveActiveStopPlanB() throws Exception {
+        sharedPlanPlanAActivePlanBActive();
+        stopPlanB();
+        expectPlanBStop();
+        checkEvents();
+    }
+
+    @Test
+    public void twoPlansReferencingASharedPlanActiveActiveUninstallPlanB() throws Exception {
+        sharedPlanPlanAActivePlanBActive();
+        uninstallPlanB();
+        expectPlanBStop();
+        expectPlanBUninstall();
+        checkEvents();
+    }
+
+    // twoPlansReferencingASharedPlanActiveResolved
+
+    @Test
+    public void twoPlansReferencingASharedPlanActiveResolvedStartPlanB() throws Exception {
+        sharedPlanPlanAActivePlanBResolved();
+        startPlanB();
+        expectPlanBStart();
+        checkEvents();
+    }
+
+    @Test
+    public void twoPlansReferencingASharedPlanActiveResolvedStopPlanB() throws Exception {
+        sharedPlanPlanAActivePlanBResolved();
+        stopPlanB();
+        checkEvents();
+    }
+
+    @Test
+    public void twoPlansReferencingASharedPlanActiveResolvedUninstallPlanB() throws Exception {
+        sharedPlanPlanAActivePlanBResolved();
+        uninstallPlanB();
+        expectPlanBUninstall();
+        checkEvents();
+    }
+
+    @Test
+    public void twoPlansReferencingASharedPlanActiveResolvedStartPlanA() throws Exception {
+        sharedPlanPlanAActivePlanBResolved();
+        startPlanA();
+        checkEvents();
+    }
+
+    @Test
+    public void twoPlansReferencingASharedPlanActiveResolvedStopPlanA() throws Exception {
+        sharedPlanPlanAActivePlanBResolved();
+        stopPlanA();
+        expectPlanAStop();
+        expectSharedPlanStop();
+        checkEvents();
+    }
+
+    @Test
+    public void twoPlansReferencingASharedPlanActiveResolvedUninstallPlanA() throws Exception {
+        sharedPlanPlanAActivePlanBResolved();
+        uninstallPlanA();
+        expectPlanAStop();
+        expectPlanAUninstall();
+        expectSharedPlanStop();
+        checkEvents();
+    }
+
+    // twoPlansReferencingASharedPlanResolvedResolved
+
+    @Test
+    public void twoPlansReferencingASharedPlanResolvedResolvedStartPlanB() throws Exception {
+        sharedPlanPlanAResolvedPlanBResolved();
+        startPlanB();
+        expectPlanBStart();
+        expectSharedPlanStart();
+        checkEvents();
+    }
+
+    @Test
+    public void twoPlansReferencingASharedPlanResolvedResolvedStopPlanB() throws Exception {
+        sharedPlanPlanAResolvedPlanBResolved();
+        stopPlanB();
+        checkEvents();
+    }
+
+    @Test
+    public void twoPlansReferencingASharedPlanResolvedResolvedUninstallPlanB() throws Exception {
+        sharedPlanPlanAResolvedPlanBResolved();
+        uninstallPlanB();
+        expectPlanBUninstall();
+        checkEvents();
+    }
+
+    @Test
+    public void twoPlansReferencingASharedPlanResolvedResolvedUninstallPlanAUninstallPlanB() throws Exception {
+        sharedPlanPlanAResolvedPlanBResolved();
+        uninstallPlanA();
+        uninstallPlanB();
+        expectPlanAUninstall();
+        expectPlanBUninstall();
+        expectSharedPlanUninstall();
+        checkEvents();
+    }
+
+    // Some atomic plan variants
+
+    @Test
+    public void sharedTopLevelBundleResolvedAtomicPlanResolvedStartBundle() throws Exception {
+        deploySimpleBundleOne();
+        deployUnscopedAtomicPlanA();
+        stopBundle();
+        stopPlanA();
+        clearEvents();
+
+        startBundle();
+        expectPlanAStart();
+        expectBundleStart();
+        checkEvents();
+    }
+
+    @Test
+    public void sharedTopLevelBundleActiveAtomicPlanActiveStopBundle() throws Exception {
+        deploySimpleBundleOne();
+        deployUnscopedAtomicPlanA();
+        clearEvents();
+
+        stopBundle();
+        expectBundleStop();
+        expectPlanAStop();
+        checkEvents();
+    }
+
+    @Test
+    public void twoPlansAtomicNonAtomicReferencingASharedPlanActiveActiveStopPlanB() throws Exception {
+        deployUnscopedAtomicPlanAParent();
+        deployUnscopedNonatomicPlanBParent();
+        this.sharedPlanId = SHARED_PLAN_IDENTITY;
+        this.bundleId = BUNDLE_ONE_IDENTITY;
+        clearEvents();
+
+        stopPlanB();
+        expectPlanBStop();
+        checkEvents();
+    }
+
+    @Test
+    public void twoPlansAtomicNonAtomicReferencingASharedPlanResolvedResolvedStartPlanB() throws Exception {
+        deployUnscopedAtomicPlanAParent();
+        deployUnscopedNonatomicPlanBParent();
+        this.sharedPlanId = SHARED_PLAN_IDENTITY;
+        this.bundleId = BUNDLE_ONE_IDENTITY;
+        stopPlanA();
+        stopPlanB();
+        clearEvents();
+
+        startPlanB();
+        expectPlanAStart();
+        expectPlanBStart();
+        expectSharedPlanStart();
+        checkEvents();
+    }
+
+    // Deployment-time lifecycle
+
+    @Test
+    public void sharedTopLevelBundleResolvedDeployPlan() throws Exception {
+        deploySimpleBundleOne();
+        stopBundle();
+        clearEvents();
+
+        deployUnscopedNonatomicPlanA();
+        expectPlanAInstall();
+        expectPlanAStart();
+        expectBundleStart();
+        checkEvents();
+    }
+
+    @Test
+    public void sharedTopLevelBundleResolvedDeployPlanStopBundle() throws Exception {
+        deploySimpleBundleOne();
+        stopBundle();
+        deployUnscopedNonatomicPlanA();
+        clearEvents();
+
+        stopBundle();
+        expectBundleStop();
+        checkEvents();
+    }
+
+    @Test
+    public void twoPlansReferencingASharedPlanResolvedDeployPlanA() throws Exception {
+        deployUnscopedNonatomicPlanBParent();
+        this.sharedPlanId = SHARED_PLAN_IDENTITY;
+        this.bundleId = BUNDLE_ONE_IDENTITY;
+        stopPlanB();
+        clearEvents();
+
+        deployUnscopedNonatomicPlanAParent();
+        expectPlanAInstall();
+        expectPlanAStart();
+        expectSharedPlanStart();
+        checkEvents();
+    }
+    
+    // Raw bundle access
+    
+    @Test
+    public void rawBundleStop() throws Exception {
+        deployUnscopedNonatomicPlanA();
+        deploySimpleBundleOne();
+        stopPlanA();
+        Bundle b = getUnderlyingBundle();
+        b.stop();
+        clearEvents();
+
+        startPlanA();
+        stopPlanA();
+        expectPlanAStart();
+        expectBundleStart();
+        expectPlanAStop();
+        // Do not expect bundle stop, since bundle was not stopped via the deployer.
+        checkEvents();
+    }
+
+    @Test
+    public void rawBundleStart() throws Exception {
+        deployUnscopedNonatomicPlanA();
+        deploySimpleBundleOne();
+        stopBundle();
+        Bundle b = getUnderlyingBundle();
+        b.start();
+        Thread.sleep(50);
+        clearEvents();
+        
+        stopPlanA();
+        expectPlanAStop();
+        expectBundleStop(); // since bundle was not started via the deployer
+        checkEvents();
+    }
+
+    // helper methods
+    
+    private Bundle getUnderlyingBundle() {
+        for (Bundle bundle : this.context.getBundles()) {
+            if (BUNDLE_ONE_SYMBOLIC_NAME.equals(bundle.getSymbolicName()) && (new Version(TEST_APPS_VERSION)).equals(bundle.getVersion())) {
+                return bundle;
+            }
+        }
+        return null;
+    }
+
+    private void checkEvents() {
+        waitForAndCheckEventsReceived(this.expectedEventSet, 50L);
+    }
+
+    private void startChildPlan() {
+        startPlanA();
+    }
+
+    private void stopChildPlan() {
+        stopPlanA();
+    }
+
+    private void uninstallChildPlan() {
+        uninstallPlanA();
+    }
+
+    private void startParentPlan() {
+        startPlanB();
+    }
+
+    private void stopParentPlan() {
+        stopPlanB();
+    }
+
+    private void uninstallParentPlan() {
+        uninstallPlanB();
+    }
+
+    private void startPlanA() {
+        this.planAArtifact.start();
+    }
+
+    private void stopPlanA() {
+        this.planAArtifact.stop();
+    }
+
+    private void uninstallPlanA() {
+        this.planAArtifact.uninstall();
+        this.planAArtifact = null;
+    }
+
+    private void startPlanB() {
+        this.planBArtifact.start();
+    }
+
+    private void stopPlanB() {
+        this.planBArtifact.stop();
+    }
+
+    private void uninstallPlanB() {
+        this.planBArtifact.uninstall();
+        this.planBArtifact = null;
+    }
+
+    private void startBundle() {
+        this.bundleArtifact.start();
+    }
+
+    private void stopBundle() {
+        this.bundleArtifact.stop();
+    }
+
+    private void uninstallBundle() {
+        this.bundleArtifact.uninstall();
+        this.bundleArtifact = null;
+    }
+
+    private void expectChildPlanStart() {
+        expectPlanAStart();
+    }
+
+    private void expectChildPlanStop() {
+        expectPlanAStop();
+    }
+
+    private void expectChildPlanUninstall() {
+        expectPlanAUninstall();
+    }
+
+    private void expectParentPlanStart() {
+        expectPlanBStart();
+    }
+
+    private void expectParentPlanStop() {
+        expectPlanBStop();
+    }
+
+    private void expectParentPlanUninstall() {
+        expectPlanBUninstall();
+    }
+
+    private void expectPlanAInstall() {
+        expectEvent(this.planAId, TestLifecycleEvent.RESOLVING, TestLifecycleEvent.RESOLVED, TestLifecycleEvent.INSTALLING,
+            TestLifecycleEvent.INSTALLED);
+    }
+
+    private void expectPlanAStart() {
+        expectEvent(this.planAId, TestLifecycleEvent.STARTING, TestLifecycleEvent.STARTED);
+    }
+
+    private void expectPlanAStop() {
+        expectEvent(this.planAId, TestLifecycleEvent.STOPPING, TestLifecycleEvent.STOPPED);
+    }
+
+    private void expectPlanAUninstall() {
+        expectEvent(this.planAId, TestLifecycleEvent.UNINSTALLING, TestLifecycleEvent.UNINSTALLED);
+    }
+
+    private void expectPlanBStart() {
+        expectEvent(this.planBId, TestLifecycleEvent.STARTING, TestLifecycleEvent.STARTED);
+    }
+
+    private void expectPlanBStop() {
+        expectEvent(this.planBId, TestLifecycleEvent.STOPPING, TestLifecycleEvent.STOPPED);
+    }
+
+    private void expectPlanBUninstall() {
+        expectEvent(this.planBId, TestLifecycleEvent.UNINSTALLING, TestLifecycleEvent.UNINSTALLED);
+    }
+
+    private void expectBundleStart() {
+        expectEvent(this.bundleId, TestLifecycleEvent.STARTING, TestLifecycleEvent.STARTED);
+    }
+
+    private void expectBundleStop() {
+        expectEvent(this.bundleId, TestLifecycleEvent.STOPPING, TestLifecycleEvent.STOPPED);
+    }
+
+    private void expectBundleUninstall() {
+        expectEvent(this.bundleId, TestLifecycleEvent.UNRESOLVED, TestLifecycleEvent.UNINSTALLING, TestLifecycleEvent.UNINSTALLED);
+    }
+
+    private void expectSharedPlanStart() {
+        expectEvent(this.sharedPlanId, TestLifecycleEvent.STARTING, TestLifecycleEvent.STARTED);
+        expectBundleStart();
+    }
+
+    private void expectSharedPlanStop() {
+        expectEvent(this.sharedPlanId, TestLifecycleEvent.STOPPING, TestLifecycleEvent.STOPPED);
+        expectBundleStop();
+    }
+
+    private void expectSharedPlanUninstall() {
+        expectEvent(this.sharedPlanId, TestLifecycleEvent.UNINSTALLING, TestLifecycleEvent.UNINSTALLED);
+        expectBundleUninstall();
+    }
+
+    private void deploySharedTopLevelBundle() throws DeploymentException {
+        deploySimpleBundleOne();
+        deployUnscopedNonatomicPlanA();
+    }
+
+    private void deployTwoPlansReferencingASharedBundle() throws DeploymentException {
+        deployUnscopedNonatomicPlanA();
+        deployUnscopedNonatomicPlanB();
+        this.bundleId = BUNDLE_ONE_IDENTITY;
+    }
+
+    private void deployTwoPlansReferencingASharedPlan() throws DeploymentException {
+        deployUnscopedNonatomicPlanAParent();
+        deployUnscopedNonatomicPlanBParent();
+        this.sharedPlanId = SHARED_PLAN_IDENTITY;
+        this.bundleId = BUNDLE_ONE_IDENTITY;
+    }
+
+    private void sharedBundlePlanAActivePlanBActive() throws DeploymentException {
+        deployTwoPlansReferencingASharedBundle();
+        clearEvents();
+    }
+
+    private void sharedBundlePlanAActivePlanBResolved() throws DeploymentException {
+        deployTwoPlansReferencingASharedBundle();
+        stopPlanB();
+        clearEvents();
+    }
+
+    private void sharedBundlePlanAResolvedPlanBResolved() throws DeploymentException {
+        deployTwoPlansReferencingASharedBundle();
+        stopPlanA();
+        stopPlanB();
+        clearEvents();
+    }
+
+    private void sharedPlanPlanAActivePlanBActive() throws DeploymentException {
+        deployTwoPlansReferencingASharedPlan();
+        clearEvents();
+    }
+
+    private void sharedPlanPlanAActivePlanBResolved() throws DeploymentException {
+        deployTwoPlansReferencingASharedPlan();
+        stopPlanB();
+        clearEvents();
+    }
+
+    private void sharedPlanPlanAResolvedPlanBResolved() throws DeploymentException {
+        deployTwoPlansReferencingASharedPlan();
+        stopPlanA();
+        stopPlanB();
+        clearEvents();
+    }
+
+    private void sharedTopLevelBundlePlanActiveBundleActive() throws DeploymentException {
+        deploySharedTopLevelBundle();
+        clearEvents();
+    }
+
+    private void sharedTopLevelBundlePlanActiveBundleResolved() throws DeploymentException {
+        deploySharedTopLevelBundle();
+        stopBundle();
+        clearEvents();
+    }
+
+    private void sharedTopLevelBundlePlanResolvedBundleActive() throws DeploymentException {
+        deploySharedTopLevelBundle();
+        stopPlanA();
+        startBundle();
+        clearEvents();
+    }
+
+    private void sharedTopLevelBundlePlanResolvedBundleResolved() throws DeploymentException {
+        deploySharedTopLevelBundle();
+        stopPlanA();
+        stopBundle();
+        clearEvents();
+    }
+
+    private void sharedTopLevelPlanChildActiveParentActive() throws DeploymentException {
+        deploySharedTopLevelPlan();
+        clearEvents();
+    }
+
+    private void deploySharedTopLevelPlan() throws DeploymentException {
+        deployUnscopedNonatomicPlanA();
+        deployUnscopedNonatomicParentPlanB();
+        this.bundleId = BUNDLE_ONE_IDENTITY;
+    }
+
+    private void deployUnscopedNonatomicParentPlanB() throws DeploymentException {
+        this.planBId = this.deployer.deploy(new File("src/test/resources/testunscopednonatomicBparent.plan").toURI());
+        this.planBArtifact = getPlanArtifact(this.planBId);
+    }
+
+    private void sharedTopLevelPlanChildActiveParentResolved() throws DeploymentException {
+        deploySharedTopLevelPlan();
+        stopParentPlan();
+        clearEvents();
+    }
+
+    private void sharedTopLevelPlanChildResolvedParentActive() throws DeploymentException {
+        deploySharedTopLevelPlan();
+        stopChildPlan();
+        clearEvents();
+    }
+
+    private void sharedTopLevelPlanChildResolvedParentResolved() throws DeploymentException {
+        deploySharedTopLevelPlan();
+        stopParentPlan();
+        stopChildPlan();
+        clearEvents();
+    }
+
+    public void clearEvents() {
+        this.artifactListener.clear();
+    }
+
+    private void deployUnscopedNonatomicPlanA() throws DeploymentException {
+        this.planAId = this.deployer.deploy(new File("src/test/resources/testunscopednonatomicA.plan").toURI());
+        this.planAArtifact = getPlanArtifact(this.planAId);
+    }
+
+    private void deployUnscopedNonatomicPlanB() throws DeploymentException {
+        this.planBId = this.deployer.deploy(new File("src/test/resources/testunscopednonatomicB.plan").toURI());
+        this.planBArtifact = getPlanArtifact(this.planBId);
+    }
+
+    private void deployUnscopedNonatomicPlanAParent() throws DeploymentException {
+        this.planAId = this.deployer.deploy(new File("src/test/resources/testunscopednonatomicAparentofsharedplan.plan").toURI());
+        this.planAArtifact = getPlanArtifact(this.planAId);
+    }
+
+    private void deployUnscopedNonatomicPlanBParent() throws DeploymentException {
+        this.planBId = this.deployer.deploy(new File("src/test/resources/testunscopednonatomicBparentofsharedplan.plan").toURI());
+        this.planBArtifact = getPlanArtifact(this.planBId);
+    }
+
+    private void deploySimpleBundleOne() throws DeploymentException {
+        File file = new File("src/test/resources/plan-deployment/simple.bundle.one.jar");
+        this.bundleId = this.deployer.deploy(file.toURI());
+        this.bundleArtifact = getBundleArtifact(this.bundleId);
+    }
+
+    private void deployUnscopedAtomicPlanA() throws DeploymentException {
+        this.planAId = this.deployer.deploy(new File("src/test/resources/testunscopedatomicA.plan").toURI());
+        this.planAArtifact = getPlanArtifact(this.planAId);
+    }
+
+    private void deployUnscopedAtomicPlanAParent() throws DeploymentException {
+        this.planAId = this.deployer.deploy(new File("src/test/resources/testunscopedatomicAparentofsharedplan.plan").toURI());
+        this.planAArtifact = getPlanArtifact(this.planAId);
+    }
+
+    private void expectEvent(DeploymentIdentity deploymentIdentity, TestLifecycleEvent... events) {
+        for (TestLifecycleEvent event : events) {
+            this.expectedEventSet.add(new ArtifactLifecycleEvent(event, deploymentIdentity.getType(), deploymentIdentity.getSymbolicName(),
+                new Version(deploymentIdentity.getVersion())));
+        }
+    }
+
+    private Artifact getBundleArtifact(DeploymentIdentity bundleId) {
+        return this.ram.getArtifact(bundleId.getType(), bundleId.getSymbolicName(), new Version(bundleId.getVersion()), this.userRegion);
+    }
+
+    private Artifact getPlanArtifact(DeploymentIdentity planId) {
+        return this.ram.getArtifact(planId.getType(), planId.getSymbolicName(), new Version(planId.getVersion()), this.globalRegion);
+    }
+
+    static void assertBundlesActive(Bundle[] bundles, String... bsns) {
+        assertBundlesInState(Bundle.ACTIVE, bundles, bsns);
+    }
+
+    static void assertBundlesResolved(Bundle[] bundles, String... bsns) {
+        assertBundlesInState(Bundle.RESOLVED, bundles, bsns);
+    }
+
+    private static void assertBundlesInState(int state, Bundle[] bundles, String... bsns) {
+        for (String bsn : bsns) {
+            boolean found = false;
+            for (Bundle bundle : bundles) {
+                if (bsn.equals(bundle.getSymbolicName())) {
+                    found = true;
+                    assertEquals(state, bundle.getState());
+                }
+            }
+            assertTrue(found);
+        }
+    }
+
+    private void waitForAndCheckEventsReceived(Set<ArtifactLifecycleEvent> expectedEventSet, long timeout) {
+        this.artifactListener.waitForEvents(expectedEventSet, timeout);
+
+        Set<ArtifactLifecycleEvent> actualEventSet = new HashSet<ArtifactLifecycleEvent>(this.artifactListener.extract());
+
+        Set<ArtifactLifecycleEvent> extraEvents = Sets.difference(actualEventSet, expectedEventSet);
+        Set<ArtifactLifecycleEvent> missingEvents = Sets.difference(expectedEventSet, actualEventSet);
+
+        assertTrue(extraEvents.size() + " more events were received than expected: " + extraEvents, extraEvents.isEmpty());
+        assertTrue(missingEvents.size() + " more events were expected than received: " + missingEvents, missingEvents.isEmpty());
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/PlanDeploymentWithNestedDAGTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/PlanDeploymentWithNestedDAGTests.java
new file mode 100644
index 0000000..d7365be
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/PlanDeploymentWithNestedDAGTests.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2011 EclipseSource
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   EclipseSource - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import static org.eclipse.virgo.kernel.deployer.test.PlanDeploymentTests.assertBundlesInstalled;
+import static org.eclipse.virgo.kernel.deployer.test.PlanDeploymentTests.assertBundlesNotInstalled;
+
+import java.io.File;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.junit.Test;
+
+public class PlanDeploymentWithNestedDAGTests extends AbstractDeployerIntegrationTest {
+
+    private static final String BUNDLE_ONE_SYMBOLIC_NAME = "simple.bundle.one";
+
+    @Test
+    // 3. (@see https://bugs.eclipse.org/bugs/show_bug.cgi?id=365034)
+    public void testNestedPlanWithSharedBundle() throws Exception {
+
+        DeploymentIdentity deploymentIdentity = this.deployer.deploy(new File("src/test/resources/testunscopednonatomicNested.plan").toURI());
+        assertBundlesInstalled(this.context.getBundles(), BUNDLE_ONE_SYMBOLIC_NAME);
+        // TODO - check that the bundle in installed once?!
+
+        this.deployer.undeploy(deploymentIdentity);
+        assertBundlesNotInstalled(this.context.getBundles(), BUNDLE_ONE_SYMBOLIC_NAME);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/PlanProvisioningTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/PlanProvisioningTests.java
new file mode 100644
index 0000000..882c1a4
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/PlanProvisioningTests.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * Copyright (c) 2011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import java.io.File;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.Version;
+
+public class PlanProvisioningTests extends AbstractDeployerIntegrationTest {
+    
+    @Test
+    public void testDefaultProvisioning() throws Exception {
+        testPlanDeployment("src/test/resources/plan-provisioning/default.plan");
+    }
+
+    @Test
+    public void testInheritProvisioning() throws Exception {
+        testPlanDeployment("src/test/resources/plan-provisioning/inherit.plan");
+    }
+
+    @Test
+    public void testAutoProvisioning() throws Exception {
+        testPlanDeployment("src/test/resources/plan-provisioning/auto.plan");
+    }
+
+    @Test(expected = DeploymentException.class)
+    public void testDisabledProvisioning() throws Exception {
+        testPlanDeployment("src/test/resources/plan-provisioning/disabled.plan");
+    }
+    
+    @Test
+    public void testAutoInheritProvisioning() throws Exception {
+        testPlanDeployment("src/test/resources/plan-provisioning/auto-inherit.plan");
+    }
+
+    @Test(expected = DeploymentException.class)
+    public void testDisabledInheritProvisioning() throws Exception {
+        testPlanDeployment("src/test/resources/plan-provisioning/disabled-inherit.plan");
+    }
+
+    @Test(expected = DeploymentException.class)
+    public void testDisabledDefaultProvisioning() throws Exception {
+        testPlanDeployment("src/test/resources/plan-provisioning/disabled-default.plan");
+    }
+    
+    @Test
+    public void testParentWithExporterDisabledProvisioning() throws Exception {
+        testPlanDeployment("src/test/resources/plan-provisioning/parent-with-exporter-disabled.plan");
+    }
+    
+    private void testPlanDeployment(String planPath) throws Exception {
+        DeploymentIdentity deploymentIdentity = this.deployer.deploy(new File(planPath).toURI());
+        this.deployer.undeploy(deploymentIdentity);
+        Bundle exporter = getBundle("plan.provisioning.p.exporter", Version.emptyVersion);
+        if (exporter != null) {
+            exporter.uninstall();
+        }
+    }
+
+ 
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/PlanUriIntegrationTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/PlanUriIntegrationTests.java
new file mode 100644
index 0000000..3953979
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/PlanUriIntegrationTests.java
@@ -0,0 +1,166 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.Writer;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.osgi.framework.Version;
+
+/**
+ * These tests cover the use of URIs in plans.
+ */
+public class PlanUriIntegrationTests extends AbstractDeployerIntegrationTest {
+
+    private static final String PLAN_TYPE = "plan";
+
+    private static final String TEST_RESOURCES_DIRECTORY = "src/test/resources/plan-deployment/";
+
+    private static final String GENERATED_PLAN_DIRECTORY = "build/PlanUriIntegrationTests/";
+
+    private static final String PLAN_EXTENSION = ".plan";
+
+    private static final String XML_HEADER = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+
+    private static final String NAMESPACES = "    xmlns=\"http://www.eclipse.org/virgo/schema/plan\" \n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" \n    xsi:schemaLocation=\" http://www.eclipse.org/virgo/schema/plan http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd\"";
+
+    @BeforeClass
+    public static void setUpClass() throws Exception {
+        File generatedPlanDirectory = new File(GENERATED_PLAN_DIRECTORY);
+        generatedPlanDirectory.mkdirs();
+    }
+
+    @Test
+    public void testUriInPlan() throws IOException, DeploymentException, InterruptedException {
+        TestArtifactInfo planInfo = createPlanFile("uriplan", Version.emptyVersion, false, false,
+            new File(TEST_RESOURCES_DIRECTORY + "global.jar").toURI().toString());
+        testPlan(planInfo);
+    }
+
+    @Test
+    public void testBundleAndConfigUrisInPlan() throws IOException, DeploymentException, InterruptedException {
+        TestArtifactInfo planInfo = createPlanFile("uriplan", Version.emptyVersion, false, false, new File(TEST_RESOURCES_DIRECTORY
+            + "com.foo.bar.properties").toURI().toString(), new File(TEST_RESOURCES_DIRECTORY + "global.jar").toURI().toString());
+        testPlan(planInfo);
+    }
+
+    @Test(expected = DeploymentException.class)
+    public void testNonFileUriInPlan() throws IOException, DeploymentException, InterruptedException {
+        TestArtifactInfo planInfo = createPlanFile("uriplan", Version.emptyVersion, false, false, "http://www.eclipse.org");
+        testPlan(planInfo);
+    }
+
+    @Test(expected = DeploymentException.class)
+    public void testRelativeUriInPlan() throws IOException, DeploymentException, InterruptedException {
+        TestArtifactInfo planInfo = createPlanFile("uriplan", Version.emptyVersion, false, false, "file:" + TEST_RESOURCES_DIRECTORY + "global.jar");
+        testPlan(planInfo);
+    }
+
+    private void testPlan(TestArtifactInfo plan) throws DeploymentException {
+        DeploymentIdentity parentId = deploy(plan);
+        this.deployer.undeploy(parentId);
+    }
+
+    private DeploymentIdentity deploy(TestArtifactInfo i) throws DeploymentException {
+        DeploymentIdentity identity = this.deployer.deploy(i.getFile().toURI());
+        Assert.assertEquals(i.getType(), identity.getType());
+        Assert.assertEquals(i.getName(), identity.getSymbolicName());
+        Assert.assertEquals(i.getVersion(), new Version(identity.getVersion()));
+        return identity;
+    }
+
+    public static TestArtifactInfo createPlanFile(String planName, Version planVersion, boolean scoped, boolean atomic, String... uris)
+        throws IOException {
+        StringBuffer planContent = new StringBuffer(1024);
+        planContent.append(XML_HEADER);
+        planContent.append("<plan name=\"" + planName + "\" version=\"" + planVersion + "\" scoped=\"" + new Boolean(scoped) + "\" atomic=\""
+            + new Boolean(atomic) + "\" \n" + NAMESPACES + ">\n");
+
+        for (String uri : uris) {
+            planContent.append("    <artifact uri=\"" + uri + "\"/>\n");
+        }
+
+        planContent.append("</plan>");
+
+        TestArtifactInfo info = new TestArtifactInfo(PLAN_TYPE, planName, planVersion);
+
+        String fileName = planName + "-" + planVersion + PLAN_EXTENSION;
+        File planFile = new File(GENERATED_PLAN_DIRECTORY + fileName);
+        Writer writer = new FileWriter(planFile);
+        try {
+            writer.write(planContent.toString());
+        } finally {
+            writer.close();
+        }
+
+        info.setFile(planFile);
+
+        return info;
+    }
+
+    private static class TestArtifactInfo {
+
+        private final String type;
+
+        private final String name;
+
+        private final Version version;
+
+        private File file;
+
+        public TestArtifactInfo(String type, String name, Version version) {
+            this.type = type;
+            this.name = name;
+            this.version = version;
+        }
+
+        public String getType() {
+            return type;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public Version getVersion() {
+            return version;
+        }
+
+        public void setFile(File file) {
+            this.file = file;
+        }
+
+        public File getFile() {
+            if (this.file == null) {
+                throw new IllegalStateException("TestArtifactInfo file not set");
+            }
+            return file;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public String toString() {
+            return name;
+        }
+
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/PropertiesArtifactMBeanTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/PropertiesArtifactMBeanTests.java
new file mode 100644
index 0000000..eb94985
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/PropertiesArtifactMBeanTests.java
@@ -0,0 +1,100 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.management.ManagementFactory;
+import java.net.URI;
+
+import javax.management.InstanceNotFoundException;
+import javax.management.IntrospectionException;
+import javax.management.JMException;
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+import javax.management.ReflectionException;
+
+import org.junit.Test;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.service.cm.Configuration;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.util.io.FileCopyUtils;
+
+
+/**
+ */
+public class PropertiesArtifactMBeanTests extends AbstractDeployerIntegrationTest {
+    
+    private final MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
+    
+    private final ObjectName objectName;    
+    {
+        try {
+            objectName = new ObjectName("org.eclipse.virgo.kernel:type=ArtifactModel,artifact-type=configuration,name=test,version=0.0.0,region=global");
+        } catch (JMException jme) {
+            throw new RuntimeException(jme);
+        }
+    }
+    
+    @Test
+    public void lifecycle() throws DeploymentException, IOException, InvalidSyntaxException, JMException {
+        File artifactFile = new File("build/test.properties");
+        
+        FileCopyUtils.copy(new File("src/test/resources/test.properties"), artifactFile);
+        
+        URI artifactUri = artifactFile.toURI();
+        
+        this.deployer.deploy(artifactUri);
+        
+        assertConfigurationPresentAndCorrect("foo", "bar");
+        
+        mBeanServer.invoke(objectName, "stop", null, null);
+        
+        assertConfigurationNotPresent();
+        
+        mBeanServer.invoke(objectName, "start", null, null);
+        
+        assertConfigurationPresentAndCorrect("foo", "bar");
+        
+        mBeanServer.invoke(objectName, "uninstall", null, null);
+        
+        assertConfigurationNotPresent();
+        assertMBeanNotPresent();
+        assertFalse(this.deployer.isDeployed(artifactUri));
+    }
+    
+    private void assertConfigurationPresentAndCorrect(String key, String value) throws IOException, InvalidSyntaxException {
+        Configuration configuration = getConfiguration("test");
+        assertNotNull(configuration);
+        assertEquals(value, configuration.getProperties().get(key));
+    }
+    
+    private void assertConfigurationNotPresent() throws IOException, InvalidSyntaxException {
+        Configuration configuration = getConfiguration("test");
+        assertNull(configuration);
+    }
+    
+    private void assertMBeanNotPresent() throws IntrospectionException, ReflectionException {
+        try {
+            mBeanServer.getMBeanInfo(objectName);
+            fail("MBean still present after uninstall");
+        } catch (InstanceNotFoundException infe) {            
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/QuartzSchedulerTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/QuartzSchedulerTests.java
new file mode 100644
index 0000000..cdb1fe7
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/QuartzSchedulerTests.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotSame;
+
+import java.io.File;
+
+import org.junit.Test;
+import org.springframework.context.ApplicationContext;
+
+/**
+ * Integration tests for <em>OSGi-ready</em> Quartz Scheduler configuration with Spring 2.5.6 and higher.
+ * 
+ * <p>
+ * See <a href="http://jira.springframework.org/browse/SPR-5220" target="_blank">SPR-5220</a> for details.
+ * </p>
+ * 
+ */
+public class QuartzSchedulerTests extends AbstractParTests {
+
+    private static final String SCHEDULER_FACTORY_BEAN_NAME = "schedulerFactoryBean";
+
+    private static final File BUNDLE_SAME1 = new File("src/test/resources/quartz/quartz.bundle.same1.jar");
+
+    private static final String BSN_SAME1 = "quartz.bundle.same1";
+
+    private static final File BUNDLE_SAME2 = new File("src/test/resources/quartz/quartz.bundle.same2.jar");
+
+    private static final String BSN_SAME2 = "quartz.bundle.same2";
+
+    private static final File BUNDLE_A = new File("src/test/resources/quartz/quartz.bundle.a.jar");
+
+    private static final String BSN_A = "quartz.bundle.a";
+
+    private static final String QUARTZ_SCHEDULER_A = "QuartzScheduler-A";
+
+    private static final File BUNDLE_B = new File("src/test/resources/quartz/quartz.bundle.b.jar");
+
+    private static final String BSN_B = "quartz.bundle.b";
+
+    private static final String QUARTZ_SCHEDULER_B = "QuartzScheduler-B";
+
+    private Object verifySchedulerConfiguration(final String bsn, final File bundle, final String expectedSchedulerName) throws Throwable {
+        deploy(bundle);
+        
+        ApplicationContext appCtx = ApplicationContextUtils.getApplicationContext(this.context, bsn);
+        
+        Object scheduler = appCtx.getBean(SCHEDULER_FACTORY_BEAN_NAME);
+        assertEquals("Verifying the name of the Quartz Scheduler for " + bsn, expectedSchedulerName, scheduler.getClass().getMethod(
+            "getSchedulerName").invoke(scheduler));
+
+        return scheduler;
+    }
+
+    @Test
+    public void testQuartzSchedulerSupportForBundlesWithSameAppCtxConfig() throws Throwable {
+        Object schedulerSame1 = verifySchedulerConfiguration(BSN_SAME1, BUNDLE_SAME1, SCHEDULER_FACTORY_BEAN_NAME);
+        Object schedulerSame2 = verifySchedulerConfiguration(BSN_SAME2, BUNDLE_SAME2, SCHEDULER_FACTORY_BEAN_NAME);
+        assertNotSame("The QuartzSchedulers for bundles " + BSN_SAME1 + " and " + BSN_SAME2 + " should not be the same.", schedulerSame1,
+            schedulerSame2);
+    }
+
+    @Test
+    public void testQuartzSchedulerSupportForBundlesWithDifferentAppCtxConfig() throws Throwable {
+        Object schedulerA = verifySchedulerConfiguration(BSN_A, BUNDLE_A, QUARTZ_SCHEDULER_A);
+        Object schedulerB = verifySchedulerConfiguration(BSN_B, BUNDLE_B, QUARTZ_SCHEDULER_B);
+        assertNotSame("The QuartzSchedulers for bundles " + BSN_A + " and " + BSN_B + " should not be the same.", schedulerA, schedulerB);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/RAMBundleRefreshTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/RAMBundleRefreshTests.java
new file mode 100644
index 0000000..7974cdb
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/RAMBundleRefreshTests.java
@@ -0,0 +1,271 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.File;
+
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.Version;
+import org.osgi.service.packageadmin.ExportedPackage;
+
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.eclipse.virgo.kernel.model.management.ManageableArtifact;
+import org.eclipse.virgo.util.io.PathReference;
+
+/**
+ * Tests for refreshing a bundle via its entry in the runtime artifact model (RAM).
+ * <p />
+ *
+ */
+@SuppressWarnings("deprecation")
+public class RAMBundleRefreshTests extends AbstractRAMIntegrationTests {
+    
+    @Test
+    public void refresh() throws DeploymentException {
+        PathReference copyToDeploy = new PathReference("build/initial.jar");
+        if (copyToDeploy.exists() && !copyToDeploy.delete(true)) {
+            fail("Failed to delete " + copyToDeploy);
+        }
+        
+        PathReference original = new PathReference("src/test/resources/ram-bundle-refresh/initial.jar");
+        original.copy(copyToDeploy, true);
+        
+        DeploymentIdentity deployed = this.deployer.deploy(copyToDeploy.toURI());                      
+        
+        assertStateOfInitialBundle();
+        
+        PathReference refresh = new PathReference("src/test/resources/ram-bundle-refresh/new-entry.jar");
+        copyToDeploy.delete(true);
+        refresh.copy(copyToDeploy, true);
+        
+        ManageableArtifact artifact = getManageableArtifact(deployed, new StubRegion("org.eclipse.virgo.region.user"));
+        assertTrue(artifact.refresh());        
+        assertEquals("ACTIVE", artifact.getState());
+        
+        assertStateOfNewEntryBundle();
+        
+        refresh = new PathReference("src/test/resources/ram-bundle-refresh/new-export.jar");
+        copyToDeploy.delete(true);
+        refresh.copy(copyToDeploy, true);
+        
+        assertTrue(artifact.refresh());             
+        assertEquals("ACTIVE", artifact.getState());
+        assertStateOfNewExportBundle();
+        
+        refresh = new PathReference("src/test/resources/ram-bundle-refresh/new-name.jar");
+        copyToDeploy.delete(true);
+        refresh.copy(copyToDeploy, true);
+        
+        assertFalse(artifact.refresh());
+        assertEquals("ACTIVE", artifact.getState());
+        
+        refresh = new PathReference("src/test/resources/ram-bundle-refresh/new-version.jar");
+        copyToDeploy.delete(true);
+        refresh.copy(copyToDeploy, true);
+        
+        assertFalse(artifact.refresh());
+        assertEquals("ACTIVE", artifact.getState());
+
+        this.deployer.undeploy(deployed);
+        
+        assertNull(getBundle("refresh", new Version(1,0,0)));
+    }  
+  
+    @Test
+    public void refreshWithinAnUnscopedPlan() throws DeploymentException, InterruptedException {
+        PathReference watchedRepository = new PathReference("build/watched");
+        if (watchedRepository.exists() && ! watchedRepository.delete(true)) {
+            fail("Failed to delete watched repository");
+        }
+        
+        watchedRepository.createDirectory();
+        
+        PathReference copyToDeploy = new PathReference("build/watched/refresh.jar");        
+        PathReference original = new PathReference("src/test/resources/ram-bundle-refresh/initial.jar");
+        original.copy(copyToDeploy, true);
+        
+        Thread.sleep(2000);
+        
+        DeploymentIdentity deployed = this.deployer.deploy(new File("src/test/resources/ram-bundle-refresh/test.plan").toURI());    
+        
+        assertStateOfInitialBundle();
+        
+        PathReference refresh = new PathReference("src/test/resources/ram-bundle-refresh/new-entry.jar");        
+        copyToDeploy.delete(true);
+        refresh.copy(copyToDeploy, true);
+        
+        ManageableArtifact artifact = getManageableArtifact("bundle", "refresh", new Version(1,0,0), new StubRegion("org.eclipse.virgo.region.user"));
+        assertTrue(artifact.refresh());
+        assertEquals("ACTIVE", artifact.getState());
+        
+        assertStateOfNewEntryBundle();
+        
+        refresh = new PathReference("src/test/resources/ram-bundle-refresh/new-export.jar");        
+        copyToDeploy.delete(true);
+        refresh.copy(copyToDeploy, true);
+        
+        assertTrue(artifact.refresh());
+        assertEquals("ACTIVE", artifact.getState());
+        
+        assertStateOfNewExportBundle();
+        
+        this.deployer.undeploy(deployed);
+        assertNull(getBundle("refresh", new Version(1,0,0)));
+    }
+    
+    @Test
+    public void refreshWithinAPar() throws DeploymentException {
+        PathReference copyToDeploy = new PathReference("build/bundle-refresh.par");
+        if (copyToDeploy.exists() && !copyToDeploy.delete(true)) {
+            fail("Failed to delete " + copyToDeploy);
+        }
+        
+        PathReference original = new PathReference("src/test/resources/ram-bundle-refresh/bundle-refresh.par");
+        original.copy(copyToDeploy, true);
+        
+        DeploymentIdentity deployed = this.deployer.deploy(copyToDeploy.toURI());                   
+        
+        assertStateOfScopedInitialBundle();
+        
+        PathReference refreshSource = new PathReference("src/test/resources/ram-bundle-refresh/new-entry.jar");
+        PathReference refreshTarget = new PathReference("build/bundle-refresh.par/initial.jar");
+        refreshTarget.delete(true);
+        refreshSource.copy(refreshTarget, true);
+        
+        ManageableArtifact artifact = getManageableArtifact("bundle", "bundle-refresh-1-refresh", new Version(1,0,0), new StubRegion("org.eclipse.virgo.region.user"));
+        assertTrue(artifact.refresh());
+        assertEquals("ACTIVE", artifact.getState());
+        
+        assertStateOfScopedNewEntryBundle();   
+        
+        refreshSource = new PathReference("src/test/resources/ram-bundle-refresh/new-export.jar");
+        refreshTarget.delete(true);
+        refreshSource.copy(refreshTarget, true);
+        
+        assertFalse(artifact.refresh());
+        assertEquals("ACTIVE", artifact.getState());
+        
+        this.deployer.undeploy(deployed);
+        assertNull(getBundle("refresh", new Version(1,0,0)));
+    }
+    
+    @Test
+    public void refreshWithDefaultSymbolicNameAndVersion() throws DeploymentException {        
+        PathReference original = new PathReference("src/test/resources/ram-bundle-refresh/no-bsn-no-version.jar");
+        
+        DeploymentIdentity deployed = this.deployer.deploy(original.toURI());                      
+        assertEquals("no-bsn-no-version", deployed.getSymbolicName());
+        assertEquals("0.0.0", deployed.getVersion());
+                        
+        ManageableArtifact artifact = getManageableArtifact(deployed, new StubRegion("org.eclipse.virgo.region.user"));
+        assertTrue(artifact.refresh());        
+        assertEquals("ACTIVE", artifact.getState());
+        
+        this.deployer.undeploy(deployed);
+    }
+    
+    @Test
+    public void refreshWithinAnUnscopedPlanWithAScopedParent() throws DeploymentException, InterruptedException {
+        PathReference watchedRepository = new PathReference("build/watched");
+        if (watchedRepository.exists() && ! watchedRepository.delete(true)) {
+            fail("Failed to delete watched repository");
+        }
+        
+        watchedRepository.createDirectory();
+        
+        PathReference copyToDeploy = new PathReference("build/watched/refresh.jar");        
+        PathReference original = new PathReference("src/test/resources/ram-bundle-refresh/initial.jar");
+        original.copy(copyToDeploy, true);
+        
+        new PathReference("src/test/resources/ram-bundle-refresh/test.plan").copy(new PathReference("build/watched/test.plan"));
+        
+        Thread.sleep(2000);
+        
+        DeploymentIdentity deployed = this.deployer.deploy(new File("src/test/resources/ram-bundle-refresh/parent-test.plan").toURI());    
+        
+        assertStateOfScopedInitialBundle();
+        
+        PathReference refresh = new PathReference("src/test/resources/ram-bundle-refresh/new-entry.jar");        
+        copyToDeploy.delete(true);
+        refresh.copy(copyToDeploy, true);
+        
+        ManageableArtifact artifact = getManageableArtifact("bundle", "bundle-refresh-1-refresh", new Version(1,0,0), new StubRegion("org.eclipse.virgo.region.user"));
+        assertTrue(artifact.refresh());
+        assertEquals("ACTIVE", artifact.getState());
+        
+        assertStateOfScopedNewEntryBundle();
+        
+        refresh = new PathReference("src/test/resources/ram-bundle-refresh/new-export.jar");        
+        copyToDeploy.delete(true);
+        refresh.copy(copyToDeploy, true);
+        
+        assertFalse(artifact.refresh());
+        assertEquals("ACTIVE", artifact.getState());
+        
+        this.deployer.undeploy(deployed);
+        assertNull(getBundle("refresh", new Version(1,0,0)));
+    }
+    
+    private void assertStateOfNewExportBundle() {
+        Bundle bundle = getBundle("refresh", new Version(1,0,0));
+        ExportedPackage[] exportedPackages = this.packageAdmin.getExportedPackages(bundle);
+        
+        assertEquals(2, exportedPackages.length);
+    }
+
+    private void assertStateOfNewEntryBundle() {
+        Bundle bundle = getBundle("refresh", new Version(1,0,0));
+        assertStateOfNewEntryBundle(bundle);        
+    }
+    
+    private void assertStateOfScopedNewEntryBundle() {
+        Bundle bundle = getBundle("bundle-refresh-1-refresh", new Version(1,0,0));
+        assertStateOfNewEntryBundle(bundle);
+    }
+    
+    private void assertStateOfNewEntryBundle(Bundle bundle) {        
+        assertNotNull(bundle);
+        assertNotNull(bundle.getEntry("one/foo.txt"));
+        
+        ExportedPackage[] exportedPackages = this.packageAdmin.getExportedPackages(bundle);
+        
+        assertEquals(1, exportedPackages.length);
+    }
+
+    private void assertStateOfInitialBundle() {
+        Bundle bundle = getBundle("refresh", new Version(1,0,0));
+        assertStateOfInitialBundle(bundle);
+    }
+    
+    private void assertStateOfScopedInitialBundle() {
+        Bundle bundle = getBundle("bundle-refresh-1-refresh", new Version(1,0,0));
+        assertStateOfInitialBundle(bundle);
+    } 
+    
+    private void assertStateOfInitialBundle(Bundle initialBundle) {
+        assertNotNull(initialBundle);
+        assertNull(initialBundle.getEntry("one/foo.txt"));
+        
+        ExportedPackage[] exportedPackages = this.packageAdmin.getExportedPackages(initialBundle);
+        assertEquals(1, exportedPackages.length);
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/RAMConfigurationRefreshTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/RAMConfigurationRefreshTests.java
new file mode 100644
index 0000000..7ad2734
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/RAMConfigurationRefreshTests.java
@@ -0,0 +1,135 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.junit.Test;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.Version;
+import org.osgi.service.cm.Configuration;
+
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.eclipse.virgo.kernel.model.management.ManageableArtifact;
+import org.eclipse.virgo.util.io.PathReference;
+
+
+/**
+ * Tests for refreshing a configuration artifact via the runtime artifact model (RAM).
+ * <p />
+ *
+ */
+public class RAMConfigurationRefreshTests extends AbstractRAMIntegrationTests {
+    
+    @Test
+    public void refresh() throws DeploymentException, IOException, InvalidSyntaxException {
+        PathReference copyToDeploy = new PathReference("build/test.properties");
+        if (copyToDeploy.exists() && !copyToDeploy.delete()) {
+            fail("Failed to delete " + copyToDeploy);
+        }
+        
+        PathReference original = new PathReference("src/test/resources/test.properties");
+        original.copy(copyToDeploy);
+        
+        DeploymentIdentity deployed = this.deployer.deploy(copyToDeploy.toURI());
+        
+        Configuration configuration = getConfiguration("test");
+        assertNotNull(configuration);        
+        assertEquals("bar", configuration.getProperties().get("foo"));
+        
+        PathReference refresh = new PathReference("src/test/resources/test-refresh.properties");
+        copyToDeploy.delete();
+        refresh.copy(copyToDeploy);
+                
+        ManageableArtifact artifact = getManageableArtifact(deployed, new StubRegion("global"));
+        artifact.refresh();
+        
+        configuration = getConfiguration("test");
+        assertNotNull(configuration);        
+        assertEquals("bravo", configuration.getProperties().get("alpha"));
+    }   
+    
+    @Test
+    public void refreshWithinAPar() throws DeploymentException, IOException, InvalidSyntaxException {
+        PathReference copyToDeploy = new PathReference("build/config-refresh.par");
+        if (copyToDeploy.exists() && !copyToDeploy.delete(true)) {
+            fail("Failed to delete " + copyToDeploy);
+        }
+        
+        PathReference original = new PathReference("src/test/resources/ram-config-refresh/config-refresh.par");
+        original.copy(copyToDeploy, true);
+        
+        DeploymentIdentity parIdentity = this.deployer.deploy(copyToDeploy.toURI());
+        
+        Configuration configuration = getConfiguration("test");
+        assertNotNull(configuration);        
+        assertEquals("bar", configuration.getProperties().get("foo"));
+        
+        PathReference refresh = new PathReference("src/test/resources/ram-config-refresh/test-refresh.properties");
+        PathReference propertiesToRefresh = new PathReference(new File(copyToDeploy.toFile(), "test.properties"));
+        propertiesToRefresh.delete();
+        refresh.copy(propertiesToRefresh);                
+        
+        ManageableArtifact artifact = getManageableArtifact("configuration", "test", new Version(0,0,0), new StubRegion("global"));
+        artifact.refresh();
+        
+        configuration = getConfiguration("test");
+        assertNotNull(configuration);        
+        assertEquals("bravo", configuration.getProperties().get("alpha"));
+        
+        this.deployer.undeploy(parIdentity);
+    }
+    
+    @Test
+    public void refreshWithinAPlan() throws DeploymentException, IOException, InvalidSyntaxException, InterruptedException {
+        PathReference watchedRepository = new PathReference("build/watched");
+        if (watchedRepository.exists() && ! watchedRepository.delete(true)) {
+            fail("Failed to delete watched repository");
+        }
+        
+        watchedRepository.createDirectory();
+        
+        PathReference copyToDeploy = new PathReference("build/watched/test.properties");
+        if (copyToDeploy.exists() && !copyToDeploy.delete(true)) {
+            fail("Failed to delete " + copyToDeploy);
+        }                
+        
+        PathReference configurationCopy = new PathReference("build/watched/test.properties");
+        new PathReference("src/test/resources/ram-config-refresh/test.properties").copy(configurationCopy);
+        
+        Thread.sleep(2000);
+        
+        this.deployer.deploy(new File("src/test/resources/ram-config-refresh/test.plan").toURI());
+        
+        Configuration configuration = getConfiguration("test");
+        assertNotNull(configuration);        
+        assertEquals("bar", configuration.getProperties().get("foo"));
+        
+        PathReference refresh = new PathReference("src/test/resources/test-refresh.properties");        
+        configurationCopy.delete();
+        refresh.copy(configurationCopy);
+                
+        ManageableArtifact artifact = getManageableArtifact("configuration", "test", new Version(0,0,0), new StubRegion("global"));
+        artifact.refresh();
+        
+        configuration = getConfiguration("test");
+        assertNotNull(configuration);        
+        assertEquals("bravo", configuration.getProperties().get("alpha"));
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/RAMDeploymentIntegrationTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/RAMDeploymentIntegrationTests.java
new file mode 100644
index 0000000..a78847f
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/RAMDeploymentIntegrationTests.java
@@ -0,0 +1,100 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import static org.junit.Assert.assertNotNull;
+
+import java.io.File;
+
+import org.eclipse.equinox.region.RegionDigraph;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifactLifecycleListener;
+import org.eclipse.virgo.kernel.model.Artifact;
+import org.eclipse.virgo.kernel.model.RuntimeArtifactRepository;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.framework.Version;
+
+/**
+ * Test the interactions between the Runtime Artifact Model (RAM) and the deployer.
+ * 
+ */
+public class RAMDeploymentIntegrationTests extends AbstractDeployerIntegrationTest {
+
+    private static final String REGION_USER = "org.eclipse.virgo.region.user";
+    
+    private StubInstallArtifactLifecycleListener lifecycleListener;
+
+    private ServiceRegistration<InstallArtifactLifecycleListener> lifecycleListenerRegistration;
+
+    private DeploymentIdentity deploymentIdentity;
+
+    private ServiceReference<RuntimeArtifactRepository> ramReference;
+    
+    private RuntimeArtifactRepository ram;
+
+    private ServiceReference<RegionDigraph> regionDigraphReference;
+
+    private RegionDigraph regionDigraph;
+
+    @Before
+    public void setUp() throws Exception {
+        this.lifecycleListener = new StubInstallArtifactLifecycleListener();
+        this.lifecycleListenerRegistration = this.kernelContext.registerService(InstallArtifactLifecycleListener.class, this.lifecycleListener, null);
+
+        this.ramReference = this.kernelContext.getServiceReference(RuntimeArtifactRepository.class);
+        this.ram = this.kernelContext.getService(ramReference);
+        
+        this.regionDigraphReference = this.kernelContext.getServiceReference(RegionDigraph.class);
+        this.regionDigraph = this.kernelContext.getService(regionDigraphReference);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        if (this.lifecycleListenerRegistration != null) {
+            this.lifecycleListenerRegistration.unregister();
+        }
+        if (this.ramReference != null) {
+            this.ram = null;
+            this.kernelContext.ungetService(this.ramReference);
+            this.ramReference = null;
+        }
+    }
+
+    @Test
+    public void testRAMUndeployment() throws Exception {
+        File file = new File("src/test/resources/dummy.jar");
+        this.lifecycleListener.assertLifecycleCounts(0, 0, 0, 0);
+        this.deploymentIdentity = this.deployer.deploy(file.toURI());
+        this.lifecycleListener.assertLifecycleCounts(1, 1, 0, 0);
+        Artifact artifact = this.ram.getArtifact(this.deploymentIdentity.getType(), this.deploymentIdentity.getSymbolicName(), new Version(this.deploymentIdentity.getVersion()), this.regionDigraph.getRegion(REGION_USER));
+        assertNotNull(artifact);
+        artifact.uninstall();
+        this.lifecycleListener.assertLifecycleCounts(1, 1, 1, 1);
+    }
+
+    @Test(expected = DeploymentException.class)
+    public void testRAMUndeploymentFollowedByDeployerUndeployment() throws Exception {
+        File file = new File("src/test/resources/dummy.jar");
+        this.deploymentIdentity = this.deployer.deploy(file.toURI());
+        Artifact artifact = this.ram.getArtifact(this.deploymentIdentity.getType(), this.deploymentIdentity.getSymbolicName(), new Version(this.deploymentIdentity.getVersion()), this.regionDigraph.getRegion(REGION_USER));
+        artifact.uninstall();
+
+        // The following deployer operation should throw DeploymentException.
+        this.deployer.undeploy(this.deploymentIdentity);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/RAMParRefreshTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/RAMParRefreshTests.java
new file mode 100644
index 0000000..e817f9c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/RAMParRefreshTests.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import static org.junit.Assert.assertFalse;
+
+import java.io.File;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.eclipse.virgo.kernel.model.management.ManageableArtifact;
+import org.junit.Test;
+
+/**
+ * Tests for refreshing a PAR via its entry in the runtime artifact model
+ * 
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Thread-safe.
+ *
+ */
+public class RAMParRefreshTests extends AbstractRAMIntegrationTests {
+    
+    @Test
+    public void refreshNotSupported() throws DeploymentException {
+        DeploymentIdentity deployed = this.deployer.deploy(new File("src/test/resources/ram-par-refresh/refresh.par").toURI());
+        ManageableArtifact manageableArtifact = getManageableArtifact(deployed, new StubRegion("global"));
+        assertFalse(manageableArtifact.refresh());        
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/RAMPlanRefreshTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/RAMPlanRefreshTests.java
new file mode 100644
index 0000000..5e15171
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/RAMPlanRefreshTests.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import static org.junit.Assert.assertFalse;
+
+import java.io.File;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.eclipse.virgo.kernel.model.management.ManageableArtifact;
+import org.junit.Test;
+
+/**
+ * Tests for refreshing a plan via its entry in the runtime artifact model
+ * 
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Thread-safe.
+ *
+ */
+public class RAMPlanRefreshTests extends AbstractRAMIntegrationTests {
+    
+    @Test
+    public void refreshNotSupported() throws DeploymentException {
+        DeploymentIdentity deployed = this.deployer.deploy(new File("src/test/resources/ram-plan-refresh/test.plan").toURI());
+        ManageableArtifact manageableArtifact = getManageableArtifact(deployed, new StubRegion("global"));
+        assertFalse(manageableArtifact.refresh());        
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/RedeployRefreshTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/RedeployRefreshTests.java
new file mode 100644
index 0000000..66fbf68
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/RedeployRefreshTests.java
@@ -0,0 +1,110 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.ServiceReference;
+
+import org.eclipse.virgo.nano.deployer.api.core.ApplicationDeployer;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentOptions;
+import org.eclipse.virgo.util.io.PathReference;
+
+/**
+ * Test deploying a simple bundle, then a bad version, then a good version again.
+ * 
+ */
+public class RedeployRefreshTests extends AbstractDeployerIntegrationTest {
+
+    private static final DeploymentOptions OPTIONS_NON_RECOVERABLE = new DeploymentOptions(false, false, true);
+
+    private static final DeploymentOptions OPTIONS_OWNED = new DeploymentOptions(false, true, true);
+
+    private ServiceReference<ApplicationDeployer> appDeployerServiceReference;
+
+    private ApplicationDeployer appDeployer;
+
+    private PathReference simpleModule;
+
+    @Before
+    public void setUp() throws Exception {
+        // The following races with server startup and causes unpleasantness on
+        // the console, but is unfortunately
+        // necessary until the test framework cold starts the server.
+        PathReference pr = new PathReference("./target/redeploy-refresh");
+        pr.delete(true);
+        pr.createDirectory();
+        simpleModule = pr.newChild("simple.module.jar");
+
+        this.appDeployerServiceReference = this.context.getServiceReference(ApplicationDeployer.class);
+        this.appDeployer = this.context.getService(this.appDeployerServiceReference);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        if (this.appDeployerServiceReference != null) {
+            this.context.ungetService(this.appDeployerServiceReference);
+        }
+    }
+
+    @Test
+    public void testRedeployRefresh() throws Exception {
+        PathReference goodModule = new PathReference("src/test/resources/redeploy-refresh/good/simple.module.jar");
+        goodModule.copy(this.simpleModule);
+        DeploymentIdentity deploymentIdentity = this.appDeployer.deploy(this.simpleModule.toURI(), OPTIONS_NON_RECOVERABLE);
+
+        PathReference badModule = new PathReference("src/test/resources/redeploy-refresh/bad/simple.module.jar");
+        this.simpleModule.delete();
+        badModule.copy(this.simpleModule);
+        try {
+            deploymentIdentity = this.appDeployer.deploy(this.simpleModule.toURI(), OPTIONS_NON_RECOVERABLE);
+            Assert.assertTrue(false);
+        } catch (DeploymentException e) {
+            // Expected
+        }
+
+        this.simpleModule.delete();
+        goodModule.copy(this.simpleModule);
+        deploymentIdentity = this.appDeployer.deploy(this.simpleModule.toURI(), OPTIONS_NON_RECOVERABLE);
+
+        this.appDeployer.undeploy(deploymentIdentity);
+    }
+
+    @Test
+    public void testRedeployRefreshOwned() throws Exception {
+        PathReference goodModule = new PathReference("src/test/resources/redeploy-refresh/good/simple.module.jar");
+        goodModule.copy(this.simpleModule);
+
+        DeploymentIdentity deploymentIdentity = this.appDeployer.deploy(this.simpleModule.toURI(), OPTIONS_OWNED);
+        String symbolicName = deploymentIdentity.getSymbolicName();
+
+        PathReference good2Module = new PathReference("src/test/resources/redeploy-refresh/good/simple2.module.jar");
+        this.simpleModule.delete();
+        good2Module.copy(this.simpleModule);
+
+        DeploymentIdentity newDeploymentIdentity = this.appDeployer.refresh(this.simpleModule.toURI(), symbolicName); // should redeploy
+
+        assertEquals("Refreshed application doesn't have correct version", "2.0.0.BUILD-20090219114136", newDeploymentIdentity.getVersion());
+
+        this.appDeployer.undeploy(newDeploymentIdentity.getType(), newDeploymentIdentity.getSymbolicName(), newDeploymentIdentity.getVersion());
+
+        assertFalse("File should not exist", this.simpleModule.exists());
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/RefreshTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/RefreshTests.java
new file mode 100644
index 0000000..c30afd9
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/RefreshTests.java
@@ -0,0 +1,239 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.IOException;
+import java.util.Set;
+
+import org.eclipse.virgo.nano.deployer.api.core.ApplicationDeployer;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.eclipse.virgo.util.io.JarUtils;
+import org.eclipse.virgo.util.io.PathReference;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * Test refreshing individual modules of a deployed application.
+ * <p />
+ * 
+ */
+public class RefreshTests extends AbstractDeployerIntegrationTest {
+
+    private final String TEST_IMPORTER_BUNDLE_SYMBOLIC_NAME = "RefreshTest-1-RefreshImporter";
+
+    private final String TEST_IMPORT_BUNDLE_IMPORTER_BUNDLE_SYMBOLIC_NAME = "RefreshTest-Import-Bundle-" + TEST_APPS_VERSION + "-RefreshImporter";
+
+    private ServiceReference<ApplicationDeployer> appDeployerServiceReference;
+
+    private ApplicationDeployer appDeployer;
+
+    private PathReference explodedPar;
+
+    private PathReference par;
+
+    private PathReference parImportBundle;
+
+    @Before
+    public void setUp() throws Exception {
+        PathReference pr = new PathReference("./target/org.eclipse.virgo.kernel");
+        pr.delete(true);
+        pr.createDirectory();
+
+        this.appDeployerServiceReference = this.context.getServiceReference(ApplicationDeployer.class);
+        this.appDeployer = this.context.getService(this.appDeployerServiceReference);
+
+        explodedPar = new PathReference("./target/refresh-test/refresh.par");
+        explodedPar.delete(true);
+
+        par = new PathReference("src/test/resources/refresh.par");
+        JarUtils.unpackTo(par, explodedPar);
+
+        parImportBundle = new PathReference("src/test/resources/refresh-import-bundle.par");
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        if (this.appDeployerServiceReference != null) {
+            this.context.ungetService(this.appDeployerServiceReference);
+        }
+    }
+
+    @Test
+    public void testBasicRefresh() throws DeploymentException, InterruptedException, IOException {
+        explodedPar.delete(true);
+        JarUtils.unpackTo(par, explodedPar);
+
+        this.appDeployer.deploy(explodedPar.toURI());
+        // Check that the test bundle's application contexts are created.
+        assertNotNull(ApplicationContextUtils.getApplicationContext(this.context, TEST_IMPORTER_BUNDLE_SYMBOLIC_NAME));        
+
+        checkV1Classes();
+
+        PathReference exporter = new PathReference("./target/refresh-test/refresh.par/RefreshExporter.jar");
+        PathReference v2 = new PathReference("./target/refresh-test/refresh.par/build/RefreshExporterv2.jar");
+        exporter.delete();
+        v2.copy(exporter);
+        this.appDeployer.refresh(explodedPar.toURI(), "RefreshExporter");
+        Thread.sleep(1000); // wait for appCtx to be properly closed before waiting for it to be created.
+        ApplicationContextUtils.awaitApplicationContext(this.context, TEST_IMPORTER_BUNDLE_SYMBOLIC_NAME, 10);
+        
+        checkV2Classes();
+
+        PathReference v3 = new PathReference("./target/refresh-test/refresh.par/build/RefreshExporterv3.jar");
+        exporter.delete();
+        v3.copy(exporter);
+        this.appDeployer.refresh(explodedPar.toURI(), "RefreshExporter");
+        Thread.sleep(1000); // wait for appCtx to be properly closed before waiting for it to be created.
+        ApplicationContextUtils.awaitApplicationContext(this.context, TEST_IMPORTER_BUNDLE_SYMBOLIC_NAME, 10);
+
+        checkV3Classes();
+    }
+
+    @Test(expected=DeploymentException.class)
+    public void testRefreshOfUndeployedApplication() throws DeploymentException, IOException {
+        explodedPar.delete(true);
+        JarUtils.unpackTo(par, explodedPar);
+
+        // Ensure application isn't already deployed.
+        this.appDeployer.undeploy("par", "RefreshTest", "1");
+
+        this.appDeployer.refresh(explodedPar.toURI(), "RefreshExporter");
+    }
+
+    @Test
+    public void testRefreshWithImportBundle() throws DeploymentException, InterruptedException, IOException {
+        explodedPar.delete(true);
+        JarUtils.unpackTo(parImportBundle, explodedPar);
+
+        this.appDeployer.deploy(explodedPar.toURI());
+        // Check that the test bundle's application contexts are created.
+        ApplicationContextUtils.awaitApplicationContext(this.context, TEST_IMPORT_BUNDLE_IMPORTER_BUNDLE_SYMBOLIC_NAME, 10);        
+
+        checkV1Classes();
+
+        this.appDeployer.refresh(explodedPar.toURI(), "RefreshImporter");
+        Thread.sleep(1000); // wait for appCtx to be properly closed before waiting for it to be created.
+        ApplicationContextUtils.awaitApplicationContext(this.context, TEST_IMPORT_BUNDLE_IMPORTER_BUNDLE_SYMBOLIC_NAME, 10);        
+
+        checkV1Classes();
+    }
+
+
+    @Test
+    public void testRedeployOfDependentBundles() throws DeploymentException, IOException {
+        explodedPar.delete(true);
+        JarUtils.unpackTo(par, explodedPar);
+
+        PathReference exporterJar = explodedPar.newChild("RefreshExporter.jar");
+        PathReference explodedExporterJar = explodedPar.newChild("explode").newChild("RefreshExporter.jar");
+        explodedExporterJar.delete(true);
+        JarUtils.unpackTo(exporterJar, explodedExporterJar);
+
+        PathReference importerJar = explodedPar.newChild("RefreshImporter.jar");
+        PathReference explodedImporterJar = explodedPar.newChild("explode").newChild("RefreshImporter.jar");
+        explodedImporterJar.delete(true);
+        JarUtils.unpackTo(importerJar, explodedImporterJar);
+
+        // Ensure bundles are not already deployed.
+        try {
+            this.appDeployer.undeploy("bundle", "RefreshExporter.jar", TEST_APPS_VERSION);
+        } catch (DeploymentException e) {
+        }
+        try {
+            this.appDeployer.undeploy("bundle", "RefreshImporter.jar", TEST_APPS_VERSION);
+        } catch (DeploymentException e) {
+        }
+
+        DeploymentIdentity diExporter = this.appDeployer.deploy(explodedExporterJar.toURI());
+        DeploymentIdentity diImporter = this.appDeployer.deploy(explodedImporterJar.toURI());
+
+        assertDeploymentIdentityEquals(diExporter, "RefreshExporter", "bundle", "RefreshExporter", TEST_APPS_VERSION);
+        assertDeploymentIdentityEquals(diImporter, "RefreshImporter", "bundle", "RefreshImporter", TEST_APPS_VERSION);
+        
+        // Check that the test bundle's application contexts are created.
+        ApplicationContextUtils.awaitApplicationContext(this.context, "RefreshImporter", 10);
+
+        // Save the importer's manifest and overwrite it with the exporter's
+        PathReference importerManifest = explodedImporterJar.newChild("META-INF").newChild("MANIFEST.MF");
+        PathReference importerManifestSave = explodedImporterJar.newChild("META-INF").newChild("MANIFEST.MF.SAVED");
+        importerManifest.copy(importerManifestSave);
+        PathReference exporterManifest = explodedExporterJar.newChild("META-INF").newChild("MANIFEST.MF");
+        importerManifest.delete();
+        exporterManifest.copy(importerManifest);
+        
+        // Redeploy the importer which will fail because of a duplicate bundle.
+        try {
+            this.appDeployer.deploy(explodedImporterJar.toURI());
+            assertFalse("deploy should fail because of a duplicate bundle", true);
+        } catch (DeploymentException e) {
+            assertTrue("Message did not report clash: " + e.getMessage(), e.getMessage().contains("clashes"));
+        }
+
+        // Restore the importer's manifest
+        importerManifest.delete();
+        importerManifestSave.copy(importerManifest);
+        
+        // Redeploy the importer which should now succeed.
+        DeploymentIdentity deploymentIdentity = this.appDeployer.deploy(explodedImporterJar.toURI());
+        assertDeploymentIdentityEquals(deploymentIdentity, "RefreshImporter", "bundle", "RefreshImporter", TEST_APPS_VERSION);
+    }
+    
+    private void checkV1Classes() {
+        LoadableClasses loadableClasses = (LoadableClasses) getApplicationBundleContext().getService(
+            getApplicationBundleContext().getServiceReference("org.eclipse.virgo.kernel.deployer.test.LoadableClasses"));
+        Set<String> loadableClassNames = loadableClasses.getLoadableClasses();
+        assertTrue(loadableClassNames.contains("refresh.exporter.b1.B11"));
+        assertFalse(loadableClassNames.contains("refresh.exporter.b1.B12"));
+        assertFalse(loadableClassNames.contains("refresh.exporter.b2.B21"));
+    }
+    
+    private void checkV2Classes() {
+        LoadableClasses loadableClasses = (LoadableClasses) getApplicationBundleContext().getService(
+            getApplicationBundleContext().getServiceReference("org.eclipse.virgo.kernel.deployer.test.LoadableClasses"));
+        Set<String> loadableClassNames = loadableClasses.getLoadableClasses();
+        assertTrue(loadableClassNames.contains("refresh.exporter.b1.B11"));
+        assertTrue(loadableClassNames.contains("refresh.exporter.b1.B12"));
+        assertFalse(loadableClassNames.contains("refresh.exporter.b2.B21"));
+    }
+    
+    private void checkV3Classes() {
+        LoadableClasses loadableClasses = (LoadableClasses) getApplicationBundleContext().getService(
+            getApplicationBundleContext().getServiceReference("org.eclipse.virgo.kernel.deployer.test.LoadableClasses"));
+        Set<String> loadableClassNames = loadableClasses.getLoadableClasses();
+        assertTrue(loadableClassNames.contains("refresh.exporter.b1.B11"));
+        assertTrue(loadableClassNames.contains("refresh.exporter.b1.B12"));
+        assertTrue(loadableClassNames.contains("refresh.exporter.b2.B21"));
+    }
+    
+    private BundleContext getApplicationBundleContext() {
+        Bundle[] bundles = this.context.getBundles();
+        for (Bundle bundle : bundles) {
+            String symbolicName = bundle.getSymbolicName();
+            if (symbolicName.contains("RefreshTest")) {
+                System.out.println(bundle.getSymbolicName());
+                return bundle.getBundleContext();
+            }
+        }
+        fail("Cannot find bundle context");
+        return null;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/RepositoryDeploymentTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/RepositoryDeploymentTests.java
new file mode 100644
index 0000000..50241ef
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/RepositoryDeploymentTests.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import java.net.URI;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.junit.Test;
+
+
+public class RepositoryDeploymentTests extends AbstractDeployerIntegrationTest {
+    
+    @Test
+    public void repositoryDeployment() throws Exception {
+        DeploymentIdentity deployed = this.deployer.deploy(URI.create("repository:configuration/com.foo.bar/0"));
+        this.deployer.undeploy(deployed);
+    }
+    
+    @Test(expected=DeploymentException.class)
+    public void repositoryDeploymentOfNonExistentArtifact() throws Exception {
+        this.deployer.deploy(URI.create("repository:configuration/com.foo.bar/1"));        
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/ServicePublishingFromRepoTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/ServicePublishingFromRepoTests.java
new file mode 100644
index 0000000..cbfa4ae
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/ServicePublishingFromRepoTests.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import java.io.File;
+
+import org.junit.Test;
+
+
+/**
+ */
+public class ServicePublishingFromRepoTests extends AbstractParTests {
+    @Test
+    public void publicationOfServiceByBundleInRepository() throws Throwable {        
+        deploy(new File("src/test/resources/service-publication-from-repo/consumer.jar"));
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/ServiceScopingTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/ServiceScopingTests.java
new file mode 100644
index 0000000..cb0a5f6
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/ServiceScopingTests.java
@@ -0,0 +1,174 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.lang.management.ManagementFactory;
+import java.util.Collection;
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.eclipse.virgo.kernel.install.artifact.ScopeServiceRepository;
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceEvent;
+import org.osgi.framework.ServiceListener;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.Version;
+
+/**
+ */
+public class ServiceScopingTests extends AbstractParTests {
+
+    @Test
+    public void testServiceScoping() throws Throwable {
+        File bundle = new File("src/test/resources/service-scoping/scoping.service.global.jar");
+        assertTrue(bundle.exists());
+        File par = new File("src/test/resources/service-scoping/service-scoping.par");
+
+        DeploymentIdentity bundleDeploymentIdentity = deploy(bundle);
+        DeploymentIdentity parDeploymentIdentity = deploy(par);
+
+        BundleContext context = this.framework.getBundleContext();
+
+        // check unable to access scoped service from unscoped view
+        Collection<ServiceReference<Appendable>> refs = context.getServiceReferences(Appendable.class, "(provider=local)");
+        assertEquals("refs should be empty", refs.size(), 0);
+
+        // check able to publish into global from app
+        ServiceReference<CharSequence> serviceReference = context.getServiceReference(CharSequence.class);
+        assertNotNull("cannot see service in global scope", serviceReference);
+
+        this.deployer.undeploy(parDeploymentIdentity);
+        this.deployer.undeploy(bundleDeploymentIdentity);
+    }
+
+    @Test
+    public void testGlobalListenerCannotSeeAppServices() throws Throwable {
+        BundleContext context = this.framework.getBundleContext();
+        final AtomicInteger counter = new AtomicInteger();
+        ServiceListener listener = new ServiceListener() {
+
+            public void serviceChanged(ServiceEvent event) {
+                if (event.getType() == ServiceEvent.REGISTERED) {
+                    counter.incrementAndGet();
+                }
+            }
+
+        };
+        context.addServiceListener(listener, "(provider=local)");
+        File bundle = new File("src/test/resources/service-scoping/scoping.service.global.jar");
+        assertTrue(bundle.exists());
+        File par = new File("src/test/resources/service-scoping/service-scoping.par");
+
+        DeploymentIdentity bundleDeploymentIdentity = deploy(bundle);
+        DeploymentIdentity parDeploymentIdentity = deploy(par);
+
+        assertEquals("listener should not have seen the service", 0, counter.get());
+        this.deployer.undeploy(parDeploymentIdentity);
+        this.deployer.undeploy(bundleDeploymentIdentity);
+    }
+
+    @Test
+    public void testApplicationListener() throws Throwable {
+        File bundle = new File("src/test/resources/service-scoping/scoping.service.global.jar");
+        assertTrue(bundle.exists());
+        File par = new File("src/test/resources/service-scoping/service-scoping.par");
+
+        DeploymentIdentity bundleDeploymentIdentity = deploy(bundle);
+        DeploymentIdentity parDeploymentIdentity = deploy(par);
+
+        ObjectName oname = ObjectName.getInstance("scoping.test:type=Listener");
+
+        MBeanServer server = ManagementFactory.getPlatformMBeanServer();
+        Integer count = (Integer) server.getAttribute(oname, "Count");
+        assertEquals(0, count.intValue());
+
+        server.invoke(oname, "registerService", null, null);
+
+        count = (Integer) server.getAttribute(oname, "Count");
+        assertEquals(1, count.intValue());
+
+        Dictionary<String, String> properties = new Hashtable<String, String>();
+        properties.put("test-case", "app-listener");
+        this.context.registerService(CharSequence.class.getName(), "foo", properties);
+
+        count = (Integer) server.getAttribute(oname, "Count");
+        assertEquals(2, count.intValue());
+
+        assertFalse(knownScopes().isEmpty());
+        
+        this.deployer.undeploy(parDeploymentIdentity);
+        this.deployer.undeploy(bundleDeploymentIdentity);
+        
+        assertTrue(knownScopes().isEmpty());
+    }
+
+    @Test
+    public void testEngine1265() throws Throwable {
+        File par = new File("src/test/resources/service-scoping/service-scoping-engine-1265.par");
+        assertTrue(par.exists());
+        DeploymentIdentity identity = deploy(par);
+        this.deployer.undeploy(identity);
+    }
+
+    @Test
+    public void testPlatform183() throws Throwable {
+        File par = new File("src/test/resources/service-scoping/service-scoping-platform-183.par");
+        assertTrue(par.exists());
+        DeploymentIdentity identity = deploy(par);
+        this.deployer.undeploy(identity);
+    }
+    
+    @Test
+    public void serviceScopingOfNestedPlan() throws Throwable {
+        DeploymentIdentity deployed = this.deployer.deploy(new File("src/test/resources/service-scoping/service-scoping.plan").toURI());       
+        
+        Bundle bundle = getBundle("service-scoping-1-service.scoping.two", new Version(1, 0, 0));
+        assertNotNull(bundle);
+        
+        // Check that bundle two is wired to the service from bundle one.
+        @SuppressWarnings("rawtypes")
+        ServiceReference<List> serviceReference = bundle.getBundleContext().getServiceReference(List.class);
+        assertNotNull(serviceReference);
+        assertEquals("service-scoping-1-service.scoping.one", serviceReference.getBundle().getSymbolicName());
+        
+        // Check that the service is not visible outside the scope
+        serviceReference = this.context.getServiceReference(List.class);
+        assertNull(serviceReference);
+        
+        this.deployer.undeploy(deployed);
+    }
+   
+    private Set<String> knownScopes() throws Exception {
+        BundleContext context = this.framework.getBundleContext();
+        ServiceReference<ScopeServiceRepository> reference = context.getServiceReference(ScopeServiceRepository.class);
+        ScopeServiceRepository scopeServiceRepository = context.getService(reference);
+        Set<String> knownScopes = scopeServiceRepository.knownScopes();
+        context.ungetService(reference);
+        return knownScopes;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/SimpleBundleApplicationDeploymentTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/SimpleBundleApplicationDeploymentTests.java
new file mode 100644
index 0000000..fcbc7ef
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/SimpleBundleApplicationDeploymentTests.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+import java.io.File;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.junit.Test;
+
+
+/**
+ * Test deploying an OSGi application containing a simple bundle.
+ * 
+ */
+public class SimpleBundleApplicationDeploymentTests extends AbstractDeployerIntegrationTest {
+
+    private static final String TEST_BUNDLE_SYMBOLIC_NAME = "MyApp-1-com.springsource.kernel.deployer.testbundle";
+
+    @Test public void testDeployer() throws Exception {
+        File file = new File("src/test/resources/app0.par");
+
+        DeploymentIdentity deploymentIdentity = this.deployer.deploy(file.toURI());
+        // Check that the test bundle's application context is created.
+        assertNotNull(ApplicationContextUtils.getApplicationContext(this.context, TEST_BUNDLE_SYMBOLIC_NAME));        
+
+        this.deployer.undeploy(deploymentIdentity);
+        // Check that the test bundle's application context is destroyed.
+        assertNull(ApplicationContextUtils.getApplicationContext(this.context, TEST_BUNDLE_SYMBOLIC_NAME));
+
+        // Check that the application can be deployed again after being undeployed
+        this.deployer.deploy(file.toURI());
+        // Check that the test bundle's application context is created.
+        assertNotNull(ApplicationContextUtils.getApplicationContext(this.context, TEST_BUNDLE_SYMBOLIC_NAME));
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/Spring256ABundleTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/Spring256ABundleTests.java
new file mode 100644
index 0000000..8a97136
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/Spring256ABundleTests.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import static org.junit.Assert.assertNotNull;
+import org.osgi.framework.ServiceReference;
+import org.springframework.context.ApplicationContext;
+
+import org.eclipse.virgo.nano.deployer.api.core.ApplicationDeployer;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.eclipse.virgo.test.framework.ConfigLocation;
+import org.eclipse.virgo.util.io.PathReference;
+
+@ConfigLocation("META-INF/spring256.test.config.properties")
+public class Spring256ABundleTests extends AbstractDeployerIntegrationTest {
+
+    private static final String BUNDLE_SYMBOLIC_NAME = "spring.256A.sample";
+
+    private static final String BEAN_NAME = "sampleBean";
+
+    private static final String expectedUserName = "admin";
+
+    private static final String SPRING_256A_BUNDLE_SYMBOLIC_NAME = "spring.256A.sample";
+
+    private static final String SPRING_256A_BUNDLE_VERSION = TEST_APPS_VERSION;
+
+    private ApplicationDeployer appDeployer;
+
+    private ServiceReference<ApplicationDeployer> appDeployerServiceReference;
+
+    @Before
+    public void setUp() throws Exception {
+        PathReference pr = new PathReference("./target/work/org.eclipse.virgo.kernel");
+        pr.delete(true);
+
+        this.appDeployerServiceReference = this.context.getServiceReference(ApplicationDeployer.class);
+        this.appDeployer = this.context.getService(this.appDeployerServiceReference);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        if (this.appDeployerServiceReference != null) {
+            this.context.ungetService(this.appDeployerServiceReference);
+        }
+    }
+
+    @Test
+    public void testDeploymentOfBundleHavingSpring256A() throws Exception {
+        File file = new File("src/test/resources/spring.256A.sample.jar");
+        DeploymentIdentity deploymentId = this.appDeployer.deploy(file.toURI());
+
+        assertDeploymentIdentityEquals(deploymentId, "spring.256A.sample.war", "bundle", SPRING_256A_BUNDLE_SYMBOLIC_NAME, SPRING_256A_BUNDLE_VERSION);
+
+        ApplicationContext appCtx = ApplicationContextUtils.getApplicationContext(this.context, BUNDLE_SYMBOLIC_NAME);
+
+        assertNotNull(appCtx);
+        assertTrue(appCtx.containsBean(BEAN_NAME));
+
+        Object beanName = appCtx.getBean(BEAN_NAME);
+        assertEquals("UserName Value Getting from Bean is " + BUNDLE_SYMBOLIC_NAME, expectedUserName,
+            beanName.getClass().getMethod("getUsername").invoke(beanName));
+
+        this.appDeployer.undeploy(deploymentId.getType(), deploymentId.getSymbolicName(), deploymentId.getVersion());
+
+        // Check that the spring 256A bundle's application context is destroyed.
+        assertNull(ApplicationContextUtils.getApplicationContext(this.context, BUNDLE_SYMBOLIC_NAME));
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/StubInstallArtifactLifecycleListener.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/StubInstallArtifactLifecycleListener.java
new file mode 100644
index 0000000..4baefa8
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/StubInstallArtifactLifecycleListener.java
@@ -0,0 +1,149 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifactLifecycleListener;
+
+final class StubInstallArtifactLifecycleListener implements InstallArtifactLifecycleListener {
+
+    private final AtomicInteger startingCount = new AtomicInteger();
+
+    private final AtomicInteger startedCount = new AtomicInteger();
+
+    private final AtomicInteger stoppingCount = new AtomicInteger();
+
+    private final AtomicInteger stoppedCount = new AtomicInteger();
+
+    public void assertLifecycleCounts(int starting, int started, int stopping, int stopped) {
+        assertEquals("Incorrect starting count", starting, this.startingCount.get());
+        assertEquals("Unexpected started count", started, this.startedCount.get());
+        assertEquals("Unexpected stopping count", stopping, this.stoppingCount.get());
+        assertEquals("Unexpected stopped count", stopped, this.stoppedCount.get());
+    }
+
+    public boolean checkLifecycleCounts(int starting, int started, int stopping, int stopped) {
+        return starting == this.startingCount.get() && started == this.startedCount.get() && stopping == this.stoppingCount.get()
+            && stopped == this.stoppedCount.get();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onInstalling(InstallArtifact installArtifact) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onInstallFailed(InstallArtifact installArtifact) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onInstalled(InstallArtifact installArtifact) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onResolving(InstallArtifact installArtifact) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onResolveFailed(InstallArtifact installArtifact) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onResolved(InstallArtifact installArtifact) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onStarting(InstallArtifact installArtifact) {
+        this.startingCount.incrementAndGet();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onStartFailed(InstallArtifact installArtifact, Throwable cause) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onStartAborted(InstallArtifact installArtifact) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onStarted(InstallArtifact installArtifact) {
+        this.startedCount.incrementAndGet();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onStopping(InstallArtifact installArtifact) {
+        this.stoppingCount.incrementAndGet();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onStopFailed(InstallArtifact installArtifact, Throwable cause) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onStopped(InstallArtifact installArtifact) {
+        this.stoppedCount.incrementAndGet();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onUnresolved(InstallArtifact installArtifact) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onUninstalling(InstallArtifact installArtifact) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onUninstallFailed(InstallArtifact installArtifact, Throwable cause) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onUninstalled(InstallArtifact installArtifact) {
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/StubRegion.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/StubRegion.java
new file mode 100644
index 0000000..c7d5139
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/StubRegion.java
@@ -0,0 +1,161 @@
+/*
+ * This file is part of the Eclipse Virgo project.
+ *
+ * Copyright (c) 2011 copyright_holder
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    cgfrost - initial contribution
+ */
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import java.io.InputStream;
+import java.util.Set;
+
+import org.eclipse.equinox.region.Region;
+import org.eclipse.equinox.region.RegionDigraph;
+import org.eclipse.equinox.region.RegionDigraphVisitor;
+import org.eclipse.equinox.region.RegionFilter;
+import org.eclipse.equinox.region.RegionDigraph.FilteredRegion;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.Version;
+
+/**
+ * StubRegion
+ */
+public class StubRegion implements Region {
+
+    private final String name;
+
+    public StubRegion(String name) {
+        this.name = name;
+    }
+    
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public String getName() {
+        return this.name;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public void addBundle(Bundle bundle) throws BundleException {
+
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public void addBundle(long bundleId) {
+
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public Bundle installBundle(String location, InputStream input) throws BundleException {
+        return null;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public Bundle installBundle(String location) throws BundleException {
+        return null;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public Set<Long> getBundleIds() {
+        return null;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean contains(Bundle bundle) {
+        return false;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean contains(long bundleId) {
+        return false;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public Bundle getBundle(String symbolicName, Version version) {
+        return null;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public void connectRegion(Region headRegion, RegionFilter filter) throws BundleException {
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public RegionDigraph getRegionDigraph() {
+        return null;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public void removeBundle(Bundle bundle) {
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public void removeBundle(long bundleId) {
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public Set<FilteredRegion> getEdges() {
+        return null;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public void visitSubgraph(RegionDigraphVisitor visitor) {
+    }
+
+	@Override
+	public Bundle installBundleAtLocation(String arg0, InputStream arg1)
+			throws BundleException {
+		return null;
+	}
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/StubWatchableRepository.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/StubWatchableRepository.java
new file mode 100644
index 0000000..179643b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/StubWatchableRepository.java
@@ -0,0 +1,31 @@
+package org.eclipse.virgo.kernel.deployer.test;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.virgo.repository.WatchableRepository;
+
+
+public class StubWatchableRepository implements WatchableRepository {
+
+    private int checkCount = 0;
+    
+    @Override
+    public Set<String> getArtifactLocations(String filename) {
+        return new HashSet<String>();
+    }
+
+    @Override
+    public void forceCheck() throws Exception {
+        this.checkCount++;
+    }
+    
+    public void resetCheckCount(){
+        this.checkCount = 0;
+    }
+    
+    public int getCheckCount(){
+        return this.checkCount;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/SyntheticContextTCCLIntegrationTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/SyntheticContextTCCLIntegrationTests.java
new file mode 100644
index 0000000..96d77ef
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/SyntheticContextTCCLIntegrationTests.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import java.io.File;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.junit.Test;
+
+/**
+ * Test that the synthetic context bundle's class loader is used as the TCCL for a PAR.
+ * <p/>
+ * A bundle "b" in the test PAR invokes a static "run" method in a bundle "global" outside the PAR. The run method
+ * attempts to load a class "AClass" of a package exported by bundle "a" in the PAR (but not imported by bundle "b")
+ * using the current thread context class loader (TCCL). The TCCL should be the class loader of the synthetic context
+ * bundle of the PAR and this class loader should be able to load classes from all packages exported by bundles in the
+ * PAR, including "AClass".
+ * <p/>
+ * For the source of the PAR and "global" bundle, see test-apps/synthetic-tccl. Instructions for building are in
+ * README.TXT.
+ */
+public class SyntheticContextTCCLIntegrationTests extends AbstractDeployerIntegrationTest {
+
+    @Test
+    public void testSyntheticContextIsTCCL() throws Exception {
+        File libraryBundle = new File("src/test/resources/synthetic-tccl/synthetic.tccl.global.jar");
+        DeploymentIdentity libraryBundleDeploymentId = this.deployer.deploy(libraryBundle.toURI());
+
+        try {
+            File par = new File("src/test/resources/synthetic-tccl/synthetic.tccl.par");
+            DeploymentIdentity parDeploymentId = this.deployer.deploy(par.toURI());
+
+            this.deployer.undeploy(parDeploymentId);
+        } finally {
+            this.deployer.undeploy(libraryBundleDeploymentId);
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/ThreadContextClassLoaderTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/ThreadContextClassLoaderTests.java
new file mode 100644
index 0000000..2b7a14e
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/ThreadContextClassLoaderTests.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import java.io.File;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * Test deploying an application which has one module which checks that an exported package from the other module is available via the thread
+ * context class loader.
+ * 
+ */
+public class ThreadContextClassLoaderTests extends AbstractParTests {
+    
+    private static final String BUNDLE_A_SYMBOLIC_NAME = "tccltest-1-BundleA";
+
+    @Test public void testThreadContextClassLoader() throws Throwable {
+        File file = new File("src/test/resources/tccltest.par");
+        deploy(file);
+        Assert.assertNotNull(ApplicationContextUtils.getApplicationContext(this.context, BUNDLE_A_SYMBOLIC_NAME));
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/TransitiveConstraintFailureDiagnosisTests.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/TransitiveConstraintFailureDiagnosisTests.java
new file mode 100644
index 0000000..1d330b2
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/TransitiveConstraintFailureDiagnosisTests.java
@@ -0,0 +1,131 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.net.URI;
+
+import org.eclipse.virgo.nano.deployer.api.core.ApplicationDeployer;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.ServiceReference;
+
+import org.eclipse.virgo.kernel.deployer.test.modules.TesterModule;
+import org.eclipse.virgo.kernel.deployer.test.modules.TesterModuleExport;
+import org.eclipse.virgo.kernel.deployer.test.modules.TesterModuleImport;
+
+/**
+ * Test detection and diagnosis of transitive uses constraint failures.
+ * 
+ */
+public class TransitiveConstraintFailureDiagnosisTests extends AbstractDeployerIntegrationTest {
+
+    private ServiceReference<ApplicationDeployer> appDeployerServiceReference;
+
+    private ApplicationDeployer appDeployer;
+
+    @Before
+    public void setUp() throws Exception {
+        this.appDeployerServiceReference = this.context.getServiceReference(ApplicationDeployer.class);
+        this.appDeployer = this.context.getService(this.appDeployerServiceReference);
+    }
+    
+    @After
+    public void tearDown() throws Exception {
+        if (this.appDeployerServiceReference != null) {
+            this.context.ungetService(this.appDeployerServiceReference);
+        }
+    }
+
+    /**
+     * Modules and their manifest headers.
+     * A:   import r;version="[1,2)",p
+     * B:   export p;uses="q"
+     *      import q
+     * C:   export q;uses="r",r;version=0
+     * D:   export r;version=1
+     * 
+     * A should fail to resolve because the transitive uses constraint prevents wiring r to A from D 
+     * because of the version clash with r from C exposed by the transitive uses directives.
+     * @throws Exception if run-time errors
+     */
+    @Test
+    public void listTesterModuleHeaders() throws Exception {
+        TesterModule tmA = new TesterModule.Builder("a")
+        .addImport(new TesterModuleImport.Builder("r").versionRange("[1,2)").build())
+        .addImport(new TesterModuleImport.Builder("p").build())
+        .build();
+        
+        TesterModule tmB = new TesterModule.Builder("b")
+        .addExport(new TesterModuleExport.Builder("p").uses("q").build())
+        .addImport(new TesterModuleImport.Builder("q").build())
+        .build();
+        
+        TesterModule tmC = new TesterModule.Builder("c")
+        .addExport(new TesterModuleExport.Builder("q").uses("r").build())
+        .addExport(new TesterModuleExport.Builder("r").version("0").build())
+        .build();
+        
+        TesterModule tmD = new TesterModule.Builder("d")
+        .addExport(new TesterModuleExport.Builder("r").version("1").build())
+        .build();
+
+        printHeaders(tmA);
+        printHeaders(tmB);
+        printHeaders(tmC);
+        printHeaders(tmD);
+    }
+    
+    private static void printHeaders(TesterModule tm) {
+        System.out.println("All headers for '" + tm.getName() + "'--------------");
+        for (String hdr : tm.getAllHeaders()) {
+            System.out.println(hdr);
+        }
+        System.out.println("-----------------------------------------\n");
+    }
+
+    @Test(expected=DeploymentException.class)
+    public void testConstraint() throws Exception {
+        
+        DeploymentIdentity depIdD = deployJar("src/test/resources/transitiveconstraint/tmD.jar");
+        assertEquals("d", depIdD.getSymbolicName());
+        
+        DeploymentIdentity depIdC = deployJar("src/test/resources/transitiveconstraint/tmC.jar");
+        assertEquals("c", depIdC.getSymbolicName());
+        
+        DeploymentIdentity depIdB = deployJar("src/test/resources/transitiveconstraint/tmB.jar");
+        assertEquals("b", depIdB.getSymbolicName());
+
+            DeploymentIdentity depIdA = deployJar("src/test/resources/transitiveconstraint/tmA.jar");
+            assertEquals("a", depIdA.getSymbolicName());
+    }
+    
+    private DeploymentIdentity deployJar(String jarFilePath) throws DeploymentException {
+        File file = new File(jarFilePath);
+        URI jarURI = file.toURI();
+        
+        assertFalse("File " + file + " deployed before test!", this.appDeployer.isDeployed(jarURI));
+
+        DeploymentIdentity depId = this.appDeployer.deploy(jarURI);
+        
+        assertTrue("File " + file + " not deployed.", this.appDeployer.isDeployed(jarURI));
+
+        return depId;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/modules/TesterModule.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/modules/TesterModule.java
new file mode 100644
index 0000000..00e8079
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/modules/TesterModule.java
@@ -0,0 +1,133 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test.modules;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.osgi.framework.Version;
+
+
+/**
+ * A module for testing deployment/resolution problems.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ * thread-safe
+ *
+ */
+public class TesterModule {
+    private final String moduleName;
+    private final Version moduleVersion;
+    public static final Version MINIMUM_VERSION = new Version("0");
+
+    private final Set<TesterModuleImport> moduleImports;
+    private final Set<TesterModuleExport> moduleExports;
+    
+    public static class Builder {
+        private final String moduleName;
+        private Version moduleVersion = MINIMUM_VERSION;
+        private Set<TesterModuleImport> moduleImports = new HashSet<TesterModuleImport>();
+        private Set<TesterModuleExport> moduleExports = new HashSet<TesterModuleExport>();
+
+        public Builder(String name) {
+            this.moduleName = name;
+        }
+        
+        public Builder version(String version) {
+            this.moduleVersion = new Version(version);
+            return this;
+        }
+        public Builder addImport(TesterModuleImport imp) {
+            this.moduleImports.add(imp);
+            return this;
+        }
+        public Builder addExport(TesterModuleExport exp) {
+            this.moduleExports.add(exp);
+            return this;
+        }
+        
+        public TesterModule build() {
+            return new TesterModule(this);
+        }
+    }
+    
+    private TesterModule(Builder builder) {
+        this.moduleName = builder.moduleName;
+        this.moduleVersion = builder.moduleVersion;
+        this.moduleImports = builder.moduleImports;
+        this.moduleExports = builder.moduleExports;
+    }
+    
+    public String getName() {
+        return this.moduleName;
+    }
+    public Version getVersion() {
+        return this.moduleVersion;
+    }
+    public Set<TesterModuleImport> getImports() {
+        return this.moduleImports;
+    }
+    public Set<TesterModuleExport> getExports() {
+        return this.moduleExports;
+    }
+
+    public String getImportsEntry() {
+        return importsList(this.moduleImports);
+    }
+
+    public String getExportsEntry() {
+        return exportsList(this.moduleExports);
+    }
+    
+    public List<String> getAllHeaders() {
+        List<String> hdrs = new ArrayList<String>();
+        hdrs.add("Manifest-Version: 1.0");
+        hdrs.add("Bundle-ManifestVersion: 2");
+        hdrs.add("Bundle-Name: TesterModule-" + this.moduleName);
+        hdrs.add("Bundle-SymbolicName: " + this.moduleName);
+        if (!this.moduleVersion.equals(MINIMUM_VERSION)) {
+            hdrs.add("Bundle-Version: " + this.moduleVersion);
+        }
+        if (!this.moduleExports.isEmpty()) {
+            hdrs.add("Export-Package: " + exportsList(this.moduleExports));
+        }
+        if (!this.moduleImports.isEmpty()) {
+            hdrs.add("Import-Package: " + importsList(this.moduleImports));
+        }
+        
+        return hdrs;
+    }
+    
+    private static String importsList(Set<TesterModuleImport> imports) {
+        boolean firstTime = true;
+        StringBuffer sb = new StringBuffer();
+        for (TesterModuleImport imp : imports) {
+            if (firstTime) firstTime = false;
+            else           sb.append(",");
+            sb.append(imp.headerEntry());
+        }
+        return sb.toString();
+    }
+    private static String exportsList(Set<TesterModuleExport> exports) {
+        boolean firstTime = true;
+        StringBuffer sb = new StringBuffer();
+        for (TesterModuleExport exp : exports) {
+            if (firstTime) firstTime = false;
+            else           sb.append(",");
+            sb.append(exp.headerEntry());
+        }
+        return sb.toString();
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/modules/TesterModuleExport.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/modules/TesterModuleExport.java
new file mode 100644
index 0000000..8fc376a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/modules/TesterModuleExport.java
@@ -0,0 +1,156 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test.modules;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.Map.Entry;
+
+import org.osgi.framework.Version;
+/**
+ * Export for a {@link TesterModule}
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ * thread-safe
+ */
+public class TesterModuleExport {
+    private static final String HEADER_ENTRY_CLAUSE_SEPARATOR = ";";
+    private static final String HEADER_ENTRY_ATTRIBUTE_NAME_SEPARATOR = ",";    
+    public static final Version MINIMUM_VERSION = new Version("0");
+    private final String pkgName;
+    private final Version pkgVersion;
+    private final Map<String,String> pkgAttributes;
+    private final Set<String> pkgMandatoryAttributes;
+    private final Set<String> pkgUses;
+    
+    public static class  Builder {
+        //Required parameters
+        private final String pkgName;
+        //Optional parameters
+        private Version pkgVersion = MINIMUM_VERSION;
+        private Map<String,String> pkgAttributes = new HashMap<String,String>();
+        private Set<String> pkgMandatoryAttributes = new HashSet<String>();
+        private Set<String> pkgUses = new HashSet<String>();
+
+        public Builder(String pkgName) {
+            this.pkgName = pkgName;
+        }
+        public Builder version(String version) {
+            this.pkgVersion = new Version(version);
+            return this;
+        }
+        public Builder attribute(String name, String value) {
+            this.pkgAttributes.put(name, value);
+            return this;
+        }
+        public Builder mandatoryAttribute(String name, String value) {
+            this.pkgAttributes.put(name, value);
+            this.pkgMandatoryAttributes.add(name);
+            return this;
+        }
+        public Builder uses(String name) {
+            this.pkgUses.add(name);
+            return this;
+        }
+        public TesterModuleExport build() {
+            return new TesterModuleExport(this);
+        }
+    }
+    
+    private TesterModuleExport(Builder builder) {
+        this.pkgName = builder.pkgName;
+        this.pkgAttributes = builder.pkgAttributes;
+        this.pkgVersion = builder.pkgVersion;
+        this.pkgMandatoryAttributes = builder.pkgMandatoryAttributes;
+        this.pkgUses = builder.pkgUses;
+    }
+
+    public String getName() {
+        return this.pkgName;
+    }
+
+    public Version getVersion() {
+        return this.pkgVersion;
+    }
+
+    public Map<String,String> getAttributes() {
+        return this.pkgAttributes;
+    }
+    
+    public Set<String> getMandatoryAttributes() {
+        return this.pkgMandatoryAttributes;
+    }
+    
+    public String headerEntry() {
+        StringBuffer sb = new StringBuffer(this.pkgName);
+        if (!this.pkgVersion.equals(MINIMUM_VERSION)) {
+            sb.append(HEADER_ENTRY_CLAUSE_SEPARATOR).append(versionClause(this.pkgVersion));
+        }        
+        if (!this.pkgAttributes.isEmpty()) {
+            sb.append(HEADER_ENTRY_CLAUSE_SEPARATOR).append(attributesClause(this.pkgAttributes));
+        }
+        if (!this.pkgMandatoryAttributes.isEmpty()) {
+            sb.append(HEADER_ENTRY_CLAUSE_SEPARATOR).append(mandatoryAttributesClause(this.pkgMandatoryAttributes));
+        }
+        if (!this.pkgUses.isEmpty()) {
+            sb.append(HEADER_ENTRY_CLAUSE_SEPARATOR).append(usesDirectiveClause(this.pkgUses));
+        }
+        
+        return sb.toString();    
+    }
+    
+    private static String versionClause(Version vr) {
+        return new StringBuffer("version=\"").append(vr.toString()).append("\"").toString();
+    }
+
+    private static String attributesClause(Map<String,String> attrs) {
+        boolean firstTime = true;
+        StringBuffer sb = new StringBuffer();
+        for (Entry<String,String> entry : attrs.entrySet()) {
+            
+            if (firstTime) firstTime = false;
+            else           sb.append(HEADER_ENTRY_CLAUSE_SEPARATOR);
+            
+            sb.append(entry.getKey()).append("=").append("\"").append(entry.getValue()).append("\"");
+        }
+        return sb.toString();
+    }
+    
+    private static String mandatoryAttributesClause(Set<String> attrs) {
+        boolean firstTime = true;
+        StringBuffer sb = new StringBuffer("mandatory:=\"");
+        for (String attr : attrs) {
+            
+            if (firstTime) firstTime = false;
+            else           sb.append(HEADER_ENTRY_ATTRIBUTE_NAME_SEPARATOR);
+            
+            sb.append(attr);
+        }
+        return sb.append("\"").toString();
+    }
+    
+    private static String usesDirectiveClause(Set<String> uses) {
+        boolean firstTime = true;
+        StringBuffer sb = new StringBuffer("uses:=\"");
+        for (String use : uses) {
+            
+            if (firstTime) firstTime = false;
+            else           sb.append(HEADER_ENTRY_ATTRIBUTE_NAME_SEPARATOR);
+            
+            sb.append(use);
+        }
+        return sb.append("\"").toString();
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/modules/TesterModuleImport.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/modules/TesterModuleImport.java
new file mode 100644
index 0000000..6efdc37
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/modules/TesterModuleImport.java
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test.modules;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.eclipse.osgi.service.resolver.VersionRange;
+
+
+/**
+ * Import for a {@link TesterModule}
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ * thread-safe
+ */
+public class TesterModuleImport {
+
+    private static final String HEADER_ENTRY_CLAUSE_SEPARATOR = ";";
+    private final String pkgName;
+    private final VersionRange pkgVersionRange;
+    private final Map<String,String> pkgAttributes;
+    
+    
+    public static class  Builder {
+        //Required parameters
+        private final String pkgName;
+        //Optional parameters
+        private VersionRange pkgVersionRange = VersionRange.emptyRange;
+        private Map<String,String> pkgAttributes = new HashMap<String,String>(); 
+        
+        public Builder(String pkgName) {
+            this.pkgName = pkgName;
+        }
+        public Builder versionRange(String versionRangeString) {
+            this.pkgVersionRange = new VersionRange(versionRangeString);
+            return this;
+        }
+        public Builder attribute(String name, String value) {
+            this.pkgAttributes.put(name, value);
+            return this;
+        }
+        
+        public TesterModuleImport build() {
+            return new TesterModuleImport(this);
+        }
+    }
+    
+    private TesterModuleImport(Builder builder) {
+        this.pkgName = builder.pkgName;
+        this.pkgAttributes = builder.pkgAttributes;
+        this.pkgVersionRange = builder.pkgVersionRange;
+    }
+
+    public String getName() {
+        return this.pkgName;
+    }
+
+    public VersionRange getVersionRange() {
+        return this.pkgVersionRange;
+    }
+
+    public Map<String,String> getAttributes() {
+        return this.pkgAttributes;
+    }
+    
+    public String headerEntry() {
+        StringBuffer sb = new StringBuffer(this.pkgName);
+        if (!this.pkgVersionRange.equals(VersionRange.emptyRange)) {
+            sb.append(HEADER_ENTRY_CLAUSE_SEPARATOR).append(versionClause(this.pkgVersionRange));
+        }        
+        if (!this.pkgAttributes.isEmpty()) {
+            sb.append(HEADER_ENTRY_CLAUSE_SEPARATOR).append(attributesClause(this.pkgAttributes));
+        }
+        return sb.toString();    
+    }
+    
+    private static String versionClause(VersionRange vr) {
+        return new StringBuffer("version=\"").append(vr.toString()).append("\"").toString();
+    }
+
+    private static String attributesClause(Map<String,String> attrs) {
+        boolean firstTime = true;
+        StringBuffer sb = new StringBuffer();
+        for (Entry<String,String> entry : attrs.entrySet()) {
+            
+            if (firstTime) firstTime = false;
+            else           sb.append(HEADER_ENTRY_CLAUSE_SEPARATOR);
+            
+            sb.append(entry.getKey()).append("=").append("\"").append(entry.getValue()).append("\"");
+        }
+        return sb.toString();
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/util/ArtifactLifecycleEvent.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/util/ArtifactLifecycleEvent.java
new file mode 100644
index 0000000..18f2030
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/util/ArtifactLifecycleEvent.java
@@ -0,0 +1,60 @@
+/*******************************************************************************

+ * Copyright (c) 2008, 2011 VMware Inc.

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ *

+ * Contributors:

+ *   VMware Inc. - initial contribution

+ *******************************************************************************/

+

+package org.eclipse.virgo.kernel.deployer.test.util;

+

+import org.osgi.framework.Version;

+

+public class ArtifactLifecycleEvent {

+

+    public ArtifactLifecycleEvent(TestLifecycleEvent lifecycleEvent, String type, String name, Version version) {

+        this.lifeCycleEvent = lifecycleEvent;

+        this.type = type;

+        this.name = name;

+        this.version = version;

+    }

+

+    @Override

+    public boolean equals(Object obj) {

+        if (obj instanceof ArtifactLifecycleEvent) {

+            ArtifactLifecycleEvent other = (ArtifactLifecycleEvent) obj;

+            return this.lifeCycleEvent.equals(other.lifeCycleEvent) && this.type.equals(other.type) && this.name.equals(other.name)

+                && this.version.equals(other.version);

+        }

+        return false;

+    }

+

+    @Override

+    public int hashCode() {

+        final int prime = 17;

+        int result = this.lifeCycleEvent.hashCode() + prime

+            * (this.name.hashCode() + prime * (this.type.hashCode() + prime * this.version.hashCode()));

+        return result;

+    }

+

+    @Override

+    public String toString() {

+        StringBuilder sb = new StringBuilder("[");

+        sb.append(this.lifeCycleEvent).append(", ");

+        sb.append(this.type).append(", ");

+        sb.append(this.name).append(", ");

+        sb.append(this.version).append("]");

+        return sb.toString();

+    }

+

+    private final TestLifecycleEvent lifeCycleEvent;

+

+    private final String type;

+

+    private final String name;

+

+    private final Version version;

+}
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/util/ArtifactListener.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/util/ArtifactListener.java
new file mode 100644
index 0000000..ad3b4dc
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/util/ArtifactListener.java
@@ -0,0 +1,157 @@
+/*******************************************************************************

+ * Copyright (c) 2008, 2011 VMware Inc.

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ *

+ * Contributors:

+ *   VMware Inc. - initial contribution

+ *******************************************************************************/

+

+package org.eclipse.virgo.kernel.deployer.test.util;

+

+import java.util.ArrayList;

+import java.util.List;

+import java.util.Set;

+

+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;

+import org.eclipse.virgo.kernel.install.artifact.InstallArtifactLifecycleListenerSupport;

+

+public class ArtifactListener extends InstallArtifactLifecycleListenerSupport {

+

+    private final Object monitor = new Object();

+

+    List<ArtifactLifecycleEvent> eventList = new ArrayList<ArtifactLifecycleEvent>();

+

+    public void clear() {

+        synchronized (this.monitor) {

+            this.eventList.clear();

+        }

+    }

+

+    public boolean waitForEvents(final Set<ArtifactLifecycleEvent> expectedEventSet, long timeout) {

+        boolean allReceived = eventsReceived(expectedEventSet);

+        while (!allReceived && timeout > 0) {

+            timeout -= 50L;

+            try {

+                Thread.sleep(50L);

+            } catch (InterruptedException _) {

+                // do nothing

+            }

+            allReceived = eventsReceived(expectedEventSet);

+        }

+        return allReceived;

+    }

+

+    private boolean eventsReceived(Set<ArtifactLifecycleEvent> eventSet) {

+        synchronized (this.monitor) {

+            for (ArtifactLifecycleEvent event : eventSet) {

+                if (!this.eventList.contains(event)) {

+                    return false;

+                }

+            }

+            return true;

+        }

+    }

+

+    public List<ArtifactLifecycleEvent> extract() {

+        synchronized (this.monitor) {

+            return new ArrayList<ArtifactLifecycleEvent>(this.eventList);

+        }

+    }

+

+    /**

+     * {@inheritDoc}

+     */

+    @Override

+    public void onInstalled(InstallArtifact installArtifact) {

+        addEvent(TestLifecycleEvent.INSTALLED, installArtifact);

+    }

+

+    /**

+     * {@inheritDoc}

+     */

+    @Override

+    public void onInstalling(InstallArtifact installArtifact) {

+        addEvent(TestLifecycleEvent.INSTALLING, installArtifact);

+    }

+

+    /**

+     * {@inheritDoc}

+     */

+    @Override

+    public void onResolved(InstallArtifact installArtifact) {

+        addEvent(TestLifecycleEvent.RESOLVED, installArtifact);

+    }

+

+    /**

+     * {@inheritDoc}

+     */

+    @Override

+    public void onResolving(InstallArtifact installArtifact) {

+        addEvent(TestLifecycleEvent.RESOLVING, installArtifact);

+    }

+

+    /**

+     * {@inheritDoc}

+     */

+    @Override

+    public void onStarted(InstallArtifact installArtifact) {

+        addEvent(TestLifecycleEvent.STARTED, installArtifact);

+    }

+

+    /**

+     * {@inheritDoc}

+     */

+    @Override

+    public void onStarting(InstallArtifact installArtifact) {

+        addEvent(TestLifecycleEvent.STARTING, installArtifact);

+    }

+

+    /**

+     * {@inheritDoc}

+     */

+    @Override

+    public void onStopped(InstallArtifact installArtifact) {

+        addEvent(TestLifecycleEvent.STOPPED, installArtifact);

+    }

+

+    /**

+     * {@inheritDoc}

+     */

+    @Override

+    public void onStopping(InstallArtifact installArtifact) {

+        addEvent(TestLifecycleEvent.STOPPING, installArtifact);

+    }

+

+    /**

+     * {@inheritDoc}

+     */

+    @Override

+    public void onUninstalled(InstallArtifact installArtifact) {

+        addEvent(TestLifecycleEvent.UNINSTALLED, installArtifact);

+    }

+

+    /**

+     * {@inheritDoc}

+     */

+    @Override

+    public void onUninstalling(InstallArtifact installArtifact) {

+        addEvent(TestLifecycleEvent.UNINSTALLING, installArtifact);

+    }

+

+    /**

+     * {@inheritDoc}

+     */

+    @Override

+    public void onUnresolved(InstallArtifact installArtifact) {

+        addEvent(TestLifecycleEvent.UNRESOLVED, installArtifact);

+    }

+

+    private void addEvent(TestLifecycleEvent event, InstallArtifact installArtifact) {

+        synchronized (this.monitor) {

+            this.eventList.add(new ArtifactLifecycleEvent(event, installArtifact.getType(), installArtifact.getName(), installArtifact.getVersion()));

+        }

+    }

+}
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/util/TestLifecycleEvent.java b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/util/TestLifecycleEvent.java
new file mode 100644
index 0000000..fa86ee8
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/java/org/eclipse/virgo/kernel/deployer/test/util/TestLifecycleEvent.java
@@ -0,0 +1,16 @@
+/*******************************************************************************

+ * Copyright (c) 2008, 2011 VMware Inc.

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ *

+ * Contributors:

+ *   VMware Inc. - initial contribution

+ *******************************************************************************/

+

+package org.eclipse.virgo.kernel.deployer.test.util;

+

+public enum TestLifecycleEvent {

+    INSTALLED, INSTALLING, RESOLVED, RESOLVING, STARTED, STARTING, STOPPED, STOPPING, UNINSTALLED, UNINSTALLING, UNRESOLVED

+}

diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/BundlesAndConfig.par b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/BundlesAndConfig.par
new file mode 100644
index 0000000..c5a61d9
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/BundlesAndConfig.par
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ExporterC.jar b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ExporterC.jar
new file mode 100644
index 0000000..0073386
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ExporterC.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ImportPromotion.par b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ImportPromotion.par
new file mode 100644
index 0000000..ec7e53d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ImportPromotion.par
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ImportPromotionViaLibrary.par b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ImportPromotionViaLibrary.par
new file mode 100644
index 0000000..e1f0fd4
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ImportPromotionViaLibrary.par
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/LibraryC.libd b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/LibraryC.libd
new file mode 100644
index 0000000..6b740b4
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/LibraryC.libd
@@ -0,0 +1,2 @@
+Library-SymbolicName: LibraryC
+Import-Bundle: ExporterC;import-scope:=application
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..f4817a8
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,32 @@
+Manifest-Version: 1.0

+Bundle-ManifestVersion: 2

+Bundle-SymbolicName: org.eclipse.virgo.kernel.deployer.test

+Export-Package: org.eclipse.virgo.kernel.deployer.test

+Import-Package: org.eclipse.virgo.nano.core,

+ org.eclipse.virgo.nano.deployer.api.core,

+ org.eclipse.virgo.kernel.deployer.core.event,

+ org.eclipse.virgo.kernel.install.artifact,

+ org.eclipse.virgo.kernel.install.environment,

+ org.eclipse.virgo.kernel.model,

+ org.eclipse.virgo.kernel.model.management,

+ org.eclipse.virgo.kernel.module,

+ org.eclipse.virgo.kernel.osgi.framework,

+ org.eclipse.equinox.region,

+ org.eclipse.virgo.kernel.services.work,

+ org.eclipse.virgo.util.io,

+ org.eclipse.virgo.util.math,

+ org.eclipse.virgo.repository,

+ javax.management,

+ javax.management.openmbean,

+ javax.management.remote,

+ org.eclipse.osgi.service.resolver,

+ org.junit,

+ org.osgi.framework,

+ org.osgi.service.cm,

+ org.osgi.service.framework,

+ org.osgi.service.packageadmin,

+ org.springframework.context,

+ org.eclipse.gemini.blueprint.context,

+ org.eclipse.gemini.blueprint.context.event,

+ org.springframework.util,

+ org.hsqldb

diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/META-INF/java-profile/java-server.profile b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/META-INF/java-profile/java-server.profile
new file mode 100644
index 0000000..396c539
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/META-INF/java-profile/java-server.profile
@@ -0,0 +1,212 @@
+org.osgi.framework.system.packages = \
+ javax.accessibility,\
+ javax.activation,\
+ javax.activation;version="1.1.1",\
+ javax.activity,\
+ javax.annotation,\
+ javax.annotation;version="1.0.0",\
+ javax.annotation;version="1.1.0",\
+ 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;version="2.0",\
+ javax.jws.soap,\
+ javax.jws.soap;version="2.0",\
+ 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.script;version="1.1",\
+ 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;version="1.0.1",\
+ javax.transaction;version="1.1.0",\
+ javax.transaction.xa,\
+ javax.transaction.xa;version="1.0.1",\
+ javax.transaction.xa;version="1.1.0",\
+ javax.xml,\
+ javax.xml;version="1.0.1",\
+ javax.xml.bind,\
+ javax.xml.bind;version="2.0",\
+ javax.xml.bind.annotation,\
+ javax.xml.bind.annotation;version="2.0",\
+ javax.xml.bind.annotation.adapters,\
+ javax.xml.bind.annotation.adapters;version="2.0",\
+ javax.xml.bind.attachment,\
+ javax.xml.bind.attachment;version="2.0",\
+ javax.xml.bind.helpers,\
+ javax.xml.bind.helpers;version="2.0",\
+ javax.xml.bind.util,\
+ javax.xml.bind.util;version="2.0",\
+ javax.xml.crypto,\
+ javax.xml.crypto;version="1.0",\
+ javax.xml.crypto.dom,\
+ javax.xml.crypto.dom;version="1.0",\
+ javax.xml.crypto.dsig,\
+ javax.xml.crypto.dsig;version="1.0",\
+ javax.xml.crypto.dsig.dom,\
+ javax.xml.crypto.dsig.dom;version="1.0",\
+ javax.xml.crypto.dsig.keyinfo,\
+ javax.xml.crypto.dsig.keyinfo;version="1.0",\
+ javax.xml.crypto.dsig.spec,\
+ javax.xml.crypto.dsig.spec;version="1.0",\
+ javax.xml.datatype,\
+ javax.xml.namespace,\
+ javax.xml.parsers,\
+ javax.xml.soap,\
+ javax.xml.soap;version="1.3.0",\
+ javax.xml.stream,\
+ javax.xml.stream;version="1.0.1",\
+ javax.xml.stream.events,\
+ javax.xml.stream.events;version="1.0.1",\
+ javax.xml.stream.util,\
+ javax.xml.stream.util;version="1.0.1",\
+ 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;version="2.1.1",\
+ javax.xml.ws.handler,\
+ javax.xml.ws.handler;version="2.1.1",\
+ javax.xml.ws.handler.soap,\
+ javax.xml.ws.handler.soap;version="2.1.1",\
+ javax.xml.ws.http,\
+ javax.xml.ws.http;version="2.1.1",\
+ javax.xml.ws.soap,\
+ javax.xml.ws.soap;version="2.1.1",\
+ javax.xml.ws.spi,\
+ javax.xml.ws.spi;version="2.1.1",\
+ javax.xml.ws.wsaddressing;version="2.1.1",\
+ javax.xml.xpath,\
+ org.eclipse.virgo.kernel.equinox.extensions,\
+ org.eclipse.virgo.kernel.equinox.extensions;version="3.7.0",\
+ org.eclipse.virgo.kernel.equinox.extensions.hooks,\
+ org.eclipse.virgo.kernel.equinox.extensions.hooks;version="3.7.0",\
+ 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.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
+org.osgi.framework.bootdelegation = \
+ org.eclipse.virgo.nano.authentication,\
+ com.sun.*,\
+ javax.xml.*,\
+ org.apache.xerces.jaxp.*,\
+ org.w3c.*,\
+ org.xml.*,\
+ sun.*
+org.osgi.framework.executionenvironment = \
+ OSGi/Minimum-1.0,\
+ OSGi/Minimum-1.1,\
+ J2SE-1.2,\
+ J2SE-1.3,\
+ J2SE-1.4,\
+ J2SE-1.5,\
+ JavaSE-1.6
+osgi.java.profile.name = Virgo-Java7
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/META-INF/no.heap.dump.test.config.properties b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/META-INF/no.heap.dump.test.config.properties
new file mode 100644
index 0000000..a374d40
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/META-INF/no.heap.dump.test.config.properties
@@ -0,0 +1,88 @@
+launcher.bundles =\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.eclipse.equinox.region/${org.eclipse.equinox.region}/org.eclipse.equinox.region-${org.eclipse.equinox.region}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.eclipse.equinox.ds/${org.eclipse.equinox.ds}/org.eclipse.equinox.ds-${org.eclipse.equinox.ds}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.eclipse.equinox.util/${org.eclipse.equinox.util}/org.eclipse.equinox.util-${org.eclipse.equinox.util}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.slf4j.api/${org.slf4j.api}/org.slf4j.api-${org.slf4j.api}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.slf4j.jul/${org.slf4j.jul}/org.slf4j.jul-${org.slf4j.jul}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.slf4j.jcl/${org.slf4j.jcl}/org.slf4j.jcl-${org.slf4j.jcl}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/com.springsource.org.aspectj.weaver/${org.aspectj}/com.springsource.org.aspectj.weaver-${org.aspectj}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.medic/org.eclipse.virgo.medic/${org.eclipse.virgo.medic}/org.eclipse.virgo.medic-${org.eclipse.virgo.medic}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.medic/org.eclipse.virgo.medic.logbackcorefragment/${org.eclipse.virgo.medic}/org.eclipse.virgo.medic.logbackcorefragment-${org.eclipse.virgo.medic}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.medic/org.eclipse.virgo.medic.logbackclassicfragment/${org.eclipse.virgo.medic}/org.eclipse.virgo.medic.logbackclassicfragment-${org.eclipse.virgo.medic}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/ch.qos.logback.core/${ch.qos.logback.core}/ch.qos.logback.core-${ch.qos.logback.core}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/ch.qos.logback.classic/${ch.qos.logback.classic}/ch.qos.logback.classic-${ch.qos.logback.classic}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/ch.qos.logback.slf4j/${ch.qos.logback.slf4j}/ch.qos.logback.slf4j-${ch.qos.logback.slf4j}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.eclipse.osgi.services/${org.eclipse.osgi.services}/org.eclipse.osgi.services-${org.eclipse.osgi.services}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.eclipse.equinox.cm/${org.eclipse.equinox.cm}/org.eclipse.equinox.cm-${org.eclipse.equinox.cm}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.medic/org.eclipse.virgo.medic.core/${org.eclipse.virgo.medic}/org.eclipse.virgo.medic.core-${org.eclipse.virgo.medic}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.util/org.eclipse.virgo.util.osgi/${org.eclipse.virgo.util}/org.eclipse.virgo.util.osgi-${org.eclipse.virgo.util}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.util/org.eclipse.virgo.util.osgi.manifest/${org.eclipse.virgo.util}/org.eclipse.virgo.util.osgi.manifest-${org.eclipse.virgo.util}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.eclipse.equinox.event/${org.eclipse.equinox.event}/org.eclipse.equinox.event-${org.eclipse.equinox.event}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.util/org.eclipse.virgo.util.common/${org.eclipse.virgo.util}/org.eclipse.virgo.util.common-${org.eclipse.virgo.util}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.util/org.eclipse.virgo.util.io/${org.eclipse.virgo.util}/org.eclipse.virgo.util.io-${org.eclipse.virgo.util}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.util/org.eclipse.virgo.util.jmx/${org.eclipse.virgo.util}/org.eclipse.virgo.util.jmx-${org.eclipse.virgo.util}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.util/org.eclipse.virgo.util.math/${org.eclipse.virgo.util}/org.eclipse.virgo.util.math-${org.eclipse.virgo.util}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.util/org.eclipse.virgo.util.parser.manifest/${org.eclipse.virgo.util}/org.eclipse.virgo.util.parser.manifest-${org.eclipse.virgo.util}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.util/org.eclipse.virgo.util.parser.launcher/${org.eclipse.virgo.util}/org.eclipse.virgo.util.parser.launcher-${org.eclipse.virgo.util}.jar@start,\
+ file:${ivy.cache}/repository/org.apache.commons/com.springsource.org.apache.commons.codec/1.3.0/com.springsource.org.apache.commons.codec-1.3.0.jar@start,\
+ file:${ivy.cache}/repository/org.apache.commons/com.springsource.org.apache.commons.httpclient/3.1.0/com.springsource.org.apache.commons.httpclient-3.1.0.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.repository/org.eclipse.virgo.repository/${org.eclipse.virgo.repository}/org.eclipse.virgo.repository-${org.eclipse.virgo.repository}.jar@start,\
+ file:${ivy.cache}/repository/org.springframework/org.springframework.aop/3.1.0.RELEASE/org.springframework.aop-3.1.0.RELEASE.jar,\
+ file:${ivy.cache}/repository/org.springframework/org.springframework.asm/3.1.0.RELEASE/org.springframework.asm-3.1.0.RELEASE.jar,\
+ file:${ivy.cache}/repository/org.springframework/org.springframework.expression/3.1.0.RELEASE/org.springframework.expression-3.1.0.RELEASE.jar,\
+ file:${ivy.cache}/repository/org.springframework/org.springframework.beans/3.1.0.RELEASE/org.springframework.beans-3.1.0.RELEASE.jar,\
+ file:${ivy.cache}/repository/org.springframework/org.springframework.core/3.1.0.RELEASE/org.springframework.core-3.1.0.RELEASE.jar,\
+ file:${ivy.cache}/repository/org.springframework/org.springframework.context/3.1.0.RELEASE/org.springframework.context-3.1.0.RELEASE.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.nano/org.eclipse.virgo.nano.core/${org.eclipse.virgo.nano}/org.eclipse.virgo.nano.core-${org.eclipse.virgo.nano}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.nano/org.eclipse.virgo.nano.deployer.api/${org.eclipse.virgo.nano}/org.eclipse.virgo.nano.deployer.api-${org.eclipse.virgo.nano}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.nano/org.eclipse.virgo.nano.deployer.hot/${org.eclipse.virgo.nano}/org.eclipse.virgo.nano.deployer.hot-${org.eclipse.virgo.nano}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.nano/org.eclipse.virgo.nano.management/${org.eclipse.virgo.nano}/org.eclipse.virgo.nano.management-${org.eclipse.virgo.nano}.jar@start,\
+ file:../org.eclipse.virgo.kernel.agent.dm/target/classes@start,\
+ file:${ivy.cache}/repository/org.eclipse.gemini/org.eclipse.gemini.blueprint.core/2.0.0.M02/org.eclipse.gemini.blueprint.core-2.0.0.M02.jar,\
+ file:${ivy.cache}/repository/org.eclipse.gemini/org.eclipse.gemini.blueprint.extender/2.0.0.M02/org.eclipse.gemini.blueprint.extender-2.0.0.M02.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.gemini/org.eclipse.gemini.blueprint.io/2.0.0.M02/org.eclipse.gemini.blueprint.io-2.0.0.M02.jar,\
+ file:${ivy.cache}/repository/org.aopalliance/com.springsource.org.aopalliance/1.0.0/com.springsource.org.aopalliance-1.0.0.jar,\
+ file:../org.eclipse.virgo.kernel.artifact/target/classes@start,\
+ file:../org.eclipse.virgo.kernel.services/target/classes@start,\
+ file:../org.eclipse.virgo.kernel.deployer/target/classes@start,\
+ file:../org.eclipse.virgo.kernel.model/target/classes@start,\
+ file:../org.eclipse.virgo.kernel.kerneldmfragment/target/classes,\
+ file:../org.eclipse.virgo.kernel.osgi/target/classes@start,\
+ file:../org.eclipse.virgo.kernel.userregionfactory/target/classes@start
+ 
+
+org.eclipse.virgo.test.properties.include=file:../build.versions,file:../user-ivy.properties
+
+#Equinox Configuration 
+osgi.parentClassloader=ext
+osgi.context.bootdelegation=false
+osgi.compatibility.bootdelegation=false
+osgi.clean=true
+osgi.configuration.area=target
+org.osgi.framework.bsnversion=multiple
+
+# osgi console support
+# osgi.console=2401
+osgi.console.enable.builtin=false
+osgi.console.ssh.useDefaultSecureStorage=true
+osgi.console.useConfigAdmin=true
+gosh.args=--nointeractive
+
+org.apache.felix.eventadmin.Timeout=0
+
+osgi.java.profile=file:src/test/resources/META-INF/java-profile/java-server.profile
+osgi.java.profile.bootdelegation=override
+osgi.hook.configurators.include=org.eclipse.virgo.kernel.equinox.extensions.hooks.ExtensionsHookConfigurator
+
+org.eclipse.virgo.kernel.deployer.disableRecovery=true
+org.eclipse.virgo.suppress.heap.dumps=true
+org.eclipse.virgo.kernel.home=target
+org.eclipse.virgo.kernel.domain=org.eclipse.virgo.kernel
+# Paths are relative to the current working directory
+org.eclipse.virgo.kernel.config=src/test/resources/config
+
+org.eclipse.virgo.medic.log.config.path=src/test/resources/config/serviceability.xml
+
+logback.ignoreTCL=true
+eclipse.bundle.setTCCL=false
+eclipse.enableStateSaver=false
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/META-INF/spring256.test.config.properties b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/META-INF/spring256.test.config.properties
new file mode 100644
index 0000000..6058fd7
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/META-INF/spring256.test.config.properties
@@ -0,0 +1,84 @@
+launcher.bundles =\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.eclipse.equinox.region/${org.eclipse.equinox.region}/org.eclipse.equinox.region-${org.eclipse.equinox.region}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.eclipse.equinox.ds/${org.eclipse.equinox.ds}/org.eclipse.equinox.ds-${org.eclipse.equinox.ds}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.eclipse.equinox.util/${org.eclipse.equinox.util}/org.eclipse.equinox.util-${org.eclipse.equinox.util}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.slf4j.api/${org.slf4j.api}/org.slf4j.api-${org.slf4j.api}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.slf4j.jul/${org.slf4j.jul}/org.slf4j.jul-${org.slf4j.jul}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.slf4j.jcl/${org.slf4j.jcl}/org.slf4j.jcl-${org.slf4j.jcl}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/com.springsource.org.aspectj.weaver/${org.aspectj}/com.springsource.org.aspectj.weaver-${org.aspectj}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.medic/org.eclipse.virgo.medic/${org.eclipse.virgo.medic}/org.eclipse.virgo.medic-${org.eclipse.virgo.medic}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.medic/org.eclipse.virgo.medic.logbackcorefragment/${org.eclipse.virgo.medic}/org.eclipse.virgo.medic.logbackcorefragment-${org.eclipse.virgo.medic}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.medic/org.eclipse.virgo.medic.logbackclassicfragment/${org.eclipse.virgo.medic}/org.eclipse.virgo.medic.logbackclassicfragment-${org.eclipse.virgo.medic}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/ch.qos.logback.core/${ch.qos.logback.core}/ch.qos.logback.core-${ch.qos.logback.core}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/ch.qos.logback.classic/${ch.qos.logback.classic}/ch.qos.logback.classic-${ch.qos.logback.classic}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/ch.qos.logback.slf4j/${ch.qos.logback.slf4j}/ch.qos.logback.slf4j-${ch.qos.logback.slf4j}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.eclipse.osgi.services/${org.eclipse.osgi.services}/org.eclipse.osgi.services-${org.eclipse.osgi.services}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.eclipse.equinox.cm/${org.eclipse.equinox.cm}/org.eclipse.equinox.cm-${org.eclipse.equinox.cm}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.medic/org.eclipse.virgo.medic.core/${org.eclipse.virgo.medic}/org.eclipse.virgo.medic.core-${org.eclipse.virgo.medic}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.util/org.eclipse.virgo.util.osgi/${org.eclipse.virgo.util}/org.eclipse.virgo.util.osgi-${org.eclipse.virgo.util}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.util/org.eclipse.virgo.util.osgi.manifest/${org.eclipse.virgo.util}/org.eclipse.virgo.util.osgi.manifest-${org.eclipse.virgo.util}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.eclipse.equinox.event/${org.eclipse.equinox.event}/org.eclipse.equinox.event-${org.eclipse.equinox.event}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.util/org.eclipse.virgo.util.common/${org.eclipse.virgo.util}/org.eclipse.virgo.util.common-${org.eclipse.virgo.util}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.util/org.eclipse.virgo.util.io/${org.eclipse.virgo.util}/org.eclipse.virgo.util.io-${org.eclipse.virgo.util}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.util/org.eclipse.virgo.util.jmx/${org.eclipse.virgo.util}/org.eclipse.virgo.util.jmx-${org.eclipse.virgo.util}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.util/org.eclipse.virgo.util.math/${org.eclipse.virgo.util}/org.eclipse.virgo.util.math-${org.eclipse.virgo.util}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.util/org.eclipse.virgo.util.parser.manifest/${org.eclipse.virgo.util}/org.eclipse.virgo.util.parser.manifest-${org.eclipse.virgo.util}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.util/org.eclipse.virgo.util.parser.launcher/${org.eclipse.virgo.util}/org.eclipse.virgo.util.parser.launcher-${org.eclipse.virgo.util}.jar@start,\
+ file:${ivy.cache}/repository/org.apache.commons/com.springsource.org.apache.commons.codec/1.3.0/com.springsource.org.apache.commons.codec-1.3.0.jar@start,\
+ file:${ivy.cache}/repository/org.apache.commons/com.springsource.org.apache.commons.httpclient/3.1.0/com.springsource.org.apache.commons.httpclient-3.1.0.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.repository/org.eclipse.virgo.repository/${org.eclipse.virgo.repository}/org.eclipse.virgo.repository-${org.eclipse.virgo.repository}.jar@start,\
+ file:${ivy.cache}/repository/org.springframework/org.springframework.aop/3.1.0.RELEASE/org.springframework.aop-3.1.0.RELEASE.jar,\
+ file:${ivy.cache}/repository/org.springframework/org.springframework.asm/3.1.0.RELEASE/org.springframework.asm-3.1.0.RELEASE.jar,\
+ file:${ivy.cache}/repository/org.springframework/org.springframework.expression/3.1.0.RELEASE/org.springframework.expression-3.1.0.RELEASE.jar,\
+ file:${ivy.cache}/repository/org.springframework/org.springframework.beans/3.1.0.RELEASE/org.springframework.beans-3.1.0.RELEASE.jar,\
+ file:${ivy.cache}/repository/org.springframework/org.springframework.core/3.1.0.RELEASE/org.springframework.core-3.1.0.RELEASE.jar,\
+ file:${ivy.cache}/repository/org.springframework/org.springframework.context/3.1.0.RELEASE/org.springframework.context-3.1.0.RELEASE.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.nano/org.eclipse.virgo.nano.core/${org.eclipse.virgo.nano}/org.eclipse.virgo.nano.core-${org.eclipse.virgo.nano}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.nano/org.eclipse.virgo.nano.deployer.api/${org.eclipse.virgo.nano}/org.eclipse.virgo.nano.deployer.api-${org.eclipse.virgo.nano}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.nano/org.eclipse.virgo.nano.deployer.hot/${org.eclipse.virgo.nano}/org.eclipse.virgo.nano.deployer.hot-${org.eclipse.virgo.nano}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.nano/org.eclipse.virgo.nano.management/${org.eclipse.virgo.nano}/org.eclipse.virgo.nano.management-${org.eclipse.virgo.nano}.jar@start,\
+ file:../org.eclipse.virgo.kernel.agent.dm/target/classes@start,\
+ file:${ivy.cache}/repository/org.eclipse.gemini/org.eclipse.gemini.blueprint.core/2.0.0.M02/org.eclipse.gemini.blueprint.core-2.0.0.M02.jar,\
+ file:${ivy.cache}/repository/org.eclipse.gemini/org.eclipse.gemini.blueprint.extender/2.0.0.M02/org.eclipse.gemini.blueprint.extender-2.0.0.M02.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.gemini/org.eclipse.gemini.blueprint.io/2.0.0.M02/org.eclipse.gemini.blueprint.io-2.0.0.M02.jar,\
+ file:${ivy.cache}/repository/org.aopalliance/com.springsource.org.aopalliance/1.0.0/com.springsource.org.aopalliance-1.0.0.jar,\
+ file:../org.eclipse.virgo.kernel.artifact/target/classes@start,\
+ file:../org.eclipse.virgo.kernel.services/target/classes@start,\
+ file:../org.eclipse.virgo.kernel.deployer/target/classes@start,\
+ file:../org.eclipse.virgo.kernel.model/target/classes@start,\
+ file:../org.eclipse.virgo.kernel.kerneldmfragment/target/classes,\
+ file:../org.eclipse.virgo.kernel.osgi/target/classes@start,\
+ file:../org.eclipse.virgo.kernel.userregionfactory/target/classes@start
+ 
+
+org.eclipse.virgo.test.properties.include=file:../build.versions,file:../user-ivy.properties
+
+#Equinox Configuration 
+osgi.parentClassloader=ext
+osgi.context.bootdelegation=false
+osgi.compatibility.bootdelegation=false
+osgi.clean=true
+osgi.configuration.area=target
+org.osgi.framework.bsnversion=multiple
+
+# osgi console support
+# osgi.console=2401
+osgi.console.enable.builtin=false
+osgi.console.ssh.useDefaultSecureStorage=true
+osgi.console.useConfigAdmin=true
+gosh.args=--nointeractive
+
+org.apache.felix.eventadmin.Timeout=0
+
+osgi.java.profile=file:src/test/resources/META-INF/java-profile/java-server.profile
+osgi.java.profile.bootdelegation=override
+osgi.hook.configurators.include=org.eclipse.virgo.kernel.equinox.extensions.hooks.ExtensionsHookConfigurator
+
+org.eclipse.virgo.kernel.deployer.disableRecovery=true
+org.eclipse.virgo.suppress.heap.dumps=false
+org.eclipse.virgo.kernel.home=target
+org.eclipse.virgo.kernel.domain=org.eclipse.virgo.kernel
+# Paths are relative to the current working directory
+org.eclipse.virgo.kernel.config=src/test/resources/config
+
+org.eclipse.virgo.medic.log.config.path=src/test/resources/config/serviceability.xml
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/META-INF/test.config.properties b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/META-INF/test.config.properties
new file mode 100644
index 0000000..e50f929
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/META-INF/test.config.properties
@@ -0,0 +1,85 @@
+launcher.bundles =\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.eclipse.equinox.region/${org.eclipse.equinox.region}/org.eclipse.equinox.region-${org.eclipse.equinox.region}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.eclipse.equinox.ds/${org.eclipse.equinox.ds}/org.eclipse.equinox.ds-${org.eclipse.equinox.ds}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.eclipse.equinox.util/${org.eclipse.equinox.util}/org.eclipse.equinox.util-${org.eclipse.equinox.util}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.slf4j.api/${org.slf4j.api}/org.slf4j.api-${org.slf4j.api}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.slf4j.jul/${org.slf4j.jul}/org.slf4j.jul-${org.slf4j.jul}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.slf4j.jcl/${org.slf4j.jcl}/org.slf4j.jcl-${org.slf4j.jcl}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/com.springsource.org.aspectj.weaver/${org.aspectj}/com.springsource.org.aspectj.weaver-${org.aspectj}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.medic/org.eclipse.virgo.medic/${org.eclipse.virgo.medic}/org.eclipse.virgo.medic-${org.eclipse.virgo.medic}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.medic/org.eclipse.virgo.medic.logbackcorefragment/${org.eclipse.virgo.medic}/org.eclipse.virgo.medic.logbackcorefragment-${org.eclipse.virgo.medic}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.medic/org.eclipse.virgo.medic.logbackclassicfragment/${org.eclipse.virgo.medic}/org.eclipse.virgo.medic.logbackclassicfragment-${org.eclipse.virgo.medic}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/ch.qos.logback.core/${ch.qos.logback.core}/ch.qos.logback.core-${ch.qos.logback.core}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/ch.qos.logback.classic/${ch.qos.logback.classic}/ch.qos.logback.classic-${ch.qos.logback.classic}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/ch.qos.logback.slf4j/${ch.qos.logback.slf4j}/ch.qos.logback.slf4j-${ch.qos.logback.slf4j}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.eclipse.osgi.services/${org.eclipse.osgi.services}/org.eclipse.osgi.services-${org.eclipse.osgi.services}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.eclipse.equinox.cm/${org.eclipse.equinox.cm}/org.eclipse.equinox.cm-${org.eclipse.equinox.cm}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.medic/org.eclipse.virgo.medic.core/${org.eclipse.virgo.medic}/org.eclipse.virgo.medic.core-${org.eclipse.virgo.medic}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.util/org.eclipse.virgo.util.osgi/${org.eclipse.virgo.util}/org.eclipse.virgo.util.osgi-${org.eclipse.virgo.util}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.util/org.eclipse.virgo.util.osgi.manifest/${org.eclipse.virgo.util}/org.eclipse.virgo.util.osgi.manifest-${org.eclipse.virgo.util}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.eclipse.equinox.event/${org.eclipse.equinox.event}/org.eclipse.equinox.event-${org.eclipse.equinox.event}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.util/org.eclipse.virgo.util.common/${org.eclipse.virgo.util}/org.eclipse.virgo.util.common-${org.eclipse.virgo.util}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.util/org.eclipse.virgo.util.io/${org.eclipse.virgo.util}/org.eclipse.virgo.util.io-${org.eclipse.virgo.util}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.util/org.eclipse.virgo.util.jmx/${org.eclipse.virgo.util}/org.eclipse.virgo.util.jmx-${org.eclipse.virgo.util}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.util/org.eclipse.virgo.util.math/${org.eclipse.virgo.util}/org.eclipse.virgo.util.math-${org.eclipse.virgo.util}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.util/org.eclipse.virgo.util.parser.manifest/${org.eclipse.virgo.util}/org.eclipse.virgo.util.parser.manifest-${org.eclipse.virgo.util}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.util/org.eclipse.virgo.util.parser.launcher/${org.eclipse.virgo.util}/org.eclipse.virgo.util.parser.launcher-${org.eclipse.virgo.util}.jar@start,\
+ file:${ivy.cache}/repository/org.apache.commons/com.springsource.org.apache.commons.codec/1.3.0/com.springsource.org.apache.commons.codec-1.3.0.jar@start,\
+ file:${ivy.cache}/repository/org.apache.commons/com.springsource.org.apache.commons.httpclient/3.1.0/com.springsource.org.apache.commons.httpclient-3.1.0.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.repository/org.eclipse.virgo.repository/${org.eclipse.virgo.repository}/org.eclipse.virgo.repository-${org.eclipse.virgo.repository}.jar@start,\
+ file:${ivy.cache}/repository/org.springframework/org.springframework.aop/3.1.0.RELEASE/org.springframework.aop-3.1.0.RELEASE.jar,\
+ file:${ivy.cache}/repository/org.springframework/org.springframework.asm/3.1.0.RELEASE/org.springframework.asm-3.1.0.RELEASE.jar,\
+ file:${ivy.cache}/repository/org.springframework/org.springframework.expression/3.1.0.RELEASE/org.springframework.expression-3.1.0.RELEASE.jar,\
+ file:${ivy.cache}/repository/org.springframework/org.springframework.beans/3.1.0.RELEASE/org.springframework.beans-3.1.0.RELEASE.jar,\
+ file:${ivy.cache}/repository/org.springframework/org.springframework.core/3.1.0.RELEASE/org.springframework.core-3.1.0.RELEASE.jar,\
+ file:${ivy.cache}/repository/org.springframework/org.springframework.context/3.1.0.RELEASE/org.springframework.context-3.1.0.RELEASE.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.nano/org.eclipse.virgo.nano.core/${org.eclipse.virgo.nano}/org.eclipse.virgo.nano.core-${org.eclipse.virgo.nano}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.nano/org.eclipse.virgo.nano.deployer.api/${org.eclipse.virgo.nano}/org.eclipse.virgo.nano.deployer.api-${org.eclipse.virgo.nano}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.nano/org.eclipse.virgo.nano.deployer.hot/${org.eclipse.virgo.nano}/org.eclipse.virgo.nano.deployer.hot-${org.eclipse.virgo.nano}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.nano/org.eclipse.virgo.nano.management/${org.eclipse.virgo.nano}/org.eclipse.virgo.nano.management-${org.eclipse.virgo.nano}.jar@start,\
+ file:../org.eclipse.virgo.kernel.agent.dm/target/classes@start,\
+ file:${ivy.cache}/repository/org.eclipse.gemini/org.eclipse.gemini.blueprint.core/2.0.0.M02/org.eclipse.gemini.blueprint.core-2.0.0.M02.jar,\
+ file:${ivy.cache}/repository/org.eclipse.gemini/org.eclipse.gemini.blueprint.extender/2.0.0.M02/org.eclipse.gemini.blueprint.extender-2.0.0.M02.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.gemini/org.eclipse.gemini.blueprint.io/2.0.0.M02/org.eclipse.gemini.blueprint.io-2.0.0.M02.jar,\
+ file:${ivy.cache}/repository/org.aopalliance/com.springsource.org.aopalliance/1.0.0/com.springsource.org.aopalliance-1.0.0.jar,\
+ file:../org.eclipse.virgo.kernel.artifact/target/classes@start,\
+ file:../org.eclipse.virgo.kernel.services/target/classes@start,\
+ file:../org.eclipse.virgo.kernel.deployer/target/classes@start,\
+ file:../org.eclipse.virgo.kernel.model/target/classes@start,\
+ file:../org.eclipse.virgo.kernel.kerneldmfragment/target/classes,\
+ file:../org.eclipse.virgo.kernel.osgi/target/classes@start,\
+ file:../org.eclipse.virgo.kernel.userregionfactory/target/classes@start
+ 
+
+org.eclipse.virgo.test.properties.include=file:../build.versions,file:../user-ivy.properties
+
+#Equinox Configuration 
+osgi.parentClassloader=ext
+osgi.context.bootdelegation=false
+osgi.compatibility.bootdelegation=false
+osgi.clean=true
+osgi.configuration.area=target
+org.osgi.framework.bsnversion=multiple
+
+# osgi console support
+# osgi.console=2401
+osgi.console.enable.builtin=false
+osgi.console.ssh.useDefaultSecureStorage=true
+osgi.console.useConfigAdmin=true
+gosh.args=--nointeractive
+
+osgi.java.profile=file:src/test/resources/META-INF/java-profile/java-server.profile
+osgi.java.profile.bootdelegation=override
+osgi.hook.configurators.include=org.eclipse.virgo.kernel.equinox.extensions.hooks.ExtensionsHookConfigurator
+
+org.eclipse.virgo.kernel.deployer.disableRecovery=true
+org.eclipse.virgo.suppress.heap.dumps=false
+org.eclipse.virgo.kernel.home=target
+org.eclipse.virgo.kernel.domain=org.eclipse.virgo.kernel
+# Paths are relative to the current working directory
+org.eclipse.virgo.kernel.config=src/test/resources/config
+
+org.eclipse.virgo.medic.log.config.path=src/test/resources/config/serviceability.xml
+
+eclipse.bundle.setTCCL=false
+eclipse.enableStateSaver=false
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ParRefreshPar.par b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ParRefreshPar.par
new file mode 100644
index 0000000..a705b3e
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ParRefreshPar.par
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/QuickConsumerBlueprint.jar b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/QuickConsumerBlueprint.jar
new file mode 100644
index 0000000..45f14d2
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/QuickConsumerBlueprint.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/activator-tccl.jar b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/activator-tccl.jar
new file mode 100644
index 0000000..2fa8cc7
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/activator-tccl.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/app0.par b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/app0.par
new file mode 100644
index 0000000..88dcc1d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/app0.par
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/app4.par b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/app4.par
new file mode 100644
index 0000000..7655dcb
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/app4.par
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/app4clash.par b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/app4clash.par
new file mode 100644
index 0000000..66c6868
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/app4clash.par
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/app5.par b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/app5.par
new file mode 100644
index 0000000..c7cac15
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/app5.par
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/app6.par b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/app6.par
new file mode 100644
index 0000000..6ddb7da
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/app6.par
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/app7.par b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/app7.par
new file mode 100644
index 0000000..7db14c7
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/app7.par
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/blueprint/SlowServiceBlueprint.jar b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/blueprint/SlowServiceBlueprint.jar
new file mode 100644
index 0000000..a9ec4de
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/blueprint/SlowServiceBlueprint.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/bug330506.par b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/bug330506.par
new file mode 100644
index 0000000..84cceab
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/bug330506.par
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/bug331767.par b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/bug331767.par
new file mode 100755
index 0000000..12f8caf
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/bug331767.par
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/bug336200.plan b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/bug336200.plan
new file mode 100644
index 0000000..f64ea0a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/bug336200.plan
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="bug336200.plan" version="1.0.0" scoped="false" atomic="true"
+		xmlns="http://www.eclipse.org/virgo/schema/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.eclipse.org/virgo/schema/plan 
+			http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+	<artifact type="bundle" name="lazyBundle" version="0.0.0"/>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/bundle-activation-policy.par b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/bundle-activation-policy.par
new file mode 100644
index 0000000..7e8e0a4
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/bundle-activation-policy.par
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/bundle-refresh/RefreshExporter.jar b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/bundle-refresh/RefreshExporter.jar
new file mode 100644
index 0000000..4c3efd8
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/bundle-refresh/RefreshExporter.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/bundle-refresh/RefreshExporterv2.jar b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/bundle-refresh/RefreshExporterv2.jar
new file mode 100644
index 0000000..f943c5b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/bundle-refresh/RefreshExporterv2.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/bundle-refresh/RefreshExporterv3.jar b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/bundle-refresh/RefreshExporterv3.jar
new file mode 100644
index 0000000..3bff130
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/bundle-refresh/RefreshExporterv3.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/bundle-refresh/RefreshImporter.jar b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/bundle-refresh/RefreshImporter.jar
new file mode 100644
index 0000000..9d01457
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/bundle-refresh/RefreshImporter.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/clashing-exports-in-a-scope-par.par b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/clashing-exports-in-a-scope-par.par
new file mode 100644
index 0000000..219ce8b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/clashing-exports-in-a-scope-par.par
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/clashing.exports.in.a.scope.par b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/clashing.exports.in.a.scope.par
new file mode 100644
index 0000000..aba4ae8
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/clashing.exports.in.a.scope.par
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/clashinguses.par b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/clashinguses.par
new file mode 100644
index 0000000..820748d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/clashinguses.par
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/classpath-scanning.par b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/classpath-scanning.par
new file mode 100644
index 0000000..a1e3d14
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/classpath-scanning.par
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/com.springsource.brits.par b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/com.springsource.brits.par
new file mode 100644
index 0000000..40e9089
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/com.springsource.brits.par
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/com.springsource.platform.deployer.testbundle.jar b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/com.springsource.platform.deployer.testbundle.jar
new file mode 100644
index 0000000..a8f61bc
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/com.springsource.platform.deployer.testbundle.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/com.springsource.platform.test.commons-dbcp.jar b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/com.springsource.platform.test.commons-dbcp.jar
new file mode 100644
index 0000000..2a44ee6
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/com.springsource.platform.test.commons-dbcp.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/config-admin-test.jar b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/config-admin-test.jar
new file mode 100644
index 0000000..0044a85
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/config-admin-test.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/config/org.eclipse.virgo.kernel.properties b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/config/org.eclipse.virgo.kernel.properties
new file mode 100644
index 0000000..7c8dd56
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/config/org.eclipse.virgo.kernel.properties
@@ -0,0 +1,6 @@
+deployer.timeout=			300
+deployer.pickupDirectory=	target/pickup
+deployer.scanIntervalMillis=1000
+deployer.systemArtifacts=
+deployer.unpackBundles=false
+
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/config/org.eclipse.virgo.kernel.userregion.properties b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/config/org.eclipse.virgo.kernel.userregion.properties
new file mode 100644
index 0000000..f9928b8
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/config/org.eclipse.virgo.kernel.userregion.properties
@@ -0,0 +1,109 @@
+baseBundles =\
+ file:${ivy.cache}/repository/org.springframework/org.springframework.aop/3.1.0.RELEASE/org.springframework.aop-3.1.0.RELEASE.jar,\
+ file:${ivy.cache}/repository/org.springframework/org.springframework.asm/3.1.0.RELEASE/org.springframework.asm-3.1.0.RELEASE.jar,\
+ file:${ivy.cache}/repository/org.springframework/org.springframework.expression/3.1.0.RELEASE/org.springframework.expression-3.1.0.RELEASE.jar,\
+ file:${ivy.cache}/repository/org.springframework/org.springframework.beans/3.1.0.RELEASE/org.springframework.beans-3.1.0.RELEASE.jar,\
+ file:${ivy.cache}/repository/org.springframework/org.springframework.core/3.1.0.RELEASE/org.springframework.core-3.1.0.RELEASE.jar,\
+ file:${ivy.cache}/repository/org.springframework/org.springframework.context/3.1.0.RELEASE/org.springframework.context-3.1.0.RELEASE.jar,\
+ file:${ivy.cache}/repository/org.eclipse.gemini/org.eclipse.gemini.blueprint.core/2.0.0.M02/org.eclipse.gemini.blueprint.core-2.0.0.M02.jar,\
+ file:${ivy.cache}/repository/org.eclipse.gemini/org.eclipse.gemini.blueprint.extender/2.0.0.M02/org.eclipse.gemini.blueprint.extender-2.0.0.M02.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.gemini/org.eclipse.gemini.blueprint.io/2.0.0.M02/org.eclipse.gemini.blueprint.io-2.0.0.M02.jar,\
+ file:${ivy.cache}/repository/org.aopalliance/com.springsource.org.aopalliance/1.0.0/com.springsource.org.aopalliance-1.0.0.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.eclipse.equinox.ds/1.4.0.v20120112-1400/org.eclipse.equinox.ds-1.4.0.v20120112-1400.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.eclipse.equinox.util/1.0.300.v20111010-1614/org.eclipse.equinox.util-1.0.300.v20111010-1614.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.eclipse.osgi.services/3.3.0.v20120307-2102/org.eclipse.osgi.services-3.3.0.v20120307-2102.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.eclipse.equinox.cm/1.0.400.v20120319-2029/org.eclipse.equinox.cm-1.0.400.v20120319-2029.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.apache.felix.gogo.runtime/0.10.0.v201209301036/org.apache.felix.gogo.runtime-0.10.0.v201209301036.jar@start,\
+ file:../org.eclipse.virgo.kernel.agent.dm/target/classes@start,\
+ file:../org.eclipse.virgo.kernel.deployer.dm/target/classes@start,\
+ file:../org.eclipse.virgo.kernel.dmfragment/target/classes,\
+ file:../org.eclipse.virgo.kernel.userregion/target/classes@start,\
+ file:../org.eclipse.virgo.shell.command/target/classes@start,\
+ file:${ivy.cache}/repository/org.hsqldb/com.springsource.org.hsqldb/1.8.0.9/com.springsource.org.hsqldb-1.8.0.9.jar,\
+ file:${ivy.cache}/repository/org.springframework/org.springframework.orm/3.1.0.RELEASE/org.springframework.orm-3.1.0.RELEASE.jar@start,\
+ file:${ivy.cache}/repository/org.springframework/org.springframework.transaction/3.1.0.RELEASE/org.springframework.transaction-3.1.0.RELEASE.jar@start,\
+ file:${ivy.cache}/repository/org.springframework/org.springframework.jdbc/3.1.0.RELEASE/org.springframework.jdbc-3.1.0.RELEASE.jar@start,\
+ file:${ivy.cache}/repository/javax.persistence/com.springsource.javax.persistence/1.0.0/com.springsource.javax.persistence-1.0.0.jar,\
+ file:${ivy.cache}/repository/com.oracle.toplink.essentials/com.springsource.oracle.toplink.essentials/2.0.0.b41-beta2/com.springsource.oracle.toplink.essentials-2.0.0.b41-beta2.jar
+ 
+bundleImports = org.eclipse.osgi;bundle-version="0"
+
+packageImports =\
+ org.eclipse.virgo.kernel.artifact.*;version="0",\
+ org.eclipse.virgo.nano.core;version="0",\
+ org.eclipse.virgo.nano.deployer.api.*;version="0",\
+ org.eclipse.virgo.nano.deployer.api;version="0",\
+ org.eclipse.virgo.kernel.deployer.core.event;version="0",\
+ org.eclipse.virgo.kernel.install.*;version="0",\
+ org.eclipse.virgo.kernel.osgi.*;version="0",\
+ org.eclipse.virgo.kernel.model;version="0",\
+ org.eclipse.virgo.kernel.model.management;version="0",\
+ org.eclipse.virgo.kernel.module;version="0",\
+ org.eclipse.virgo.nano.serviceability;version="0",\
+ org.eclipse.virgo.nano.serviceability.*;version="0",\
+ org.eclipse.virgo.kernel.services.work;version="0",\
+ org.eclipse.virgo.kernel.shell;version="0",\
+ org.eclipse.virgo.nano.shim.*;version="0",\
+ org.eclipse.virgo.medic.*;version="0",\
+ org.eclipse.virgo.repository;version="0",\
+ org.eclipse.virgo.repository.*;version="0",\
+ org.eclipse.virgo.util.*;version="0",\
+ org.apache.commons.logging;version="[1.0.0,2.0.0)",\
+ org.apache.commons.logging.impl;version="[1.0.0,2.0.0)",\
+ org.aspectj.*;version="[1.6.5.RELEASE,2.0.0)",\
+ org.osgi.service.cm;version="0",\
+ org.osgi.service.event;version="0",\
+ org.osgi.service.log;version="0",\
+ org.osgi.service.http;version="0",\
+ org.eclipse.equinox.region;version="1",\
+ ch.qos.logback.*;version="[1.0.0,2.0.0)",\
+ org.slf4j;version="[1.6.4,2)",\
+ org.slf4j.helpers;version="[1.6.4,2)",\
+ org.slf4j.spi;version="[1.6.4,2)",\
+ org.junit;version="[4.7.0,5.0.0)",\
+ org.junit.runner;version="[4.7.0,5.0.0)"
+
+serviceImports =\
+ org.eclipse.equinox.region.Region,\
+ org.eclipse.equinox.region.RegionDigraph,\
+ org.eclipse.virgo.nano.deployer.api.core.ApplicationDeployer,\
+ org.eclipse.virgo.nano.deployer.api.core.DeployUriNormaliser,\
+ org.eclipse.virgo.kernel.install.artifact.ScopeServiceRepository,\
+ org.eclipse.virgo.kernel.services.work.WorkArea,\
+ org.eclipse.virgo.kernel.model.RuntimeArtifactRepository,\
+ org.eclipse.virgo.repository.ArtifactBridge,\
+ org.eclipse.virgo.kernel.shell.CommandExecutor,\
+ org.eclipse.virgo.repository.RepositoryFactory,\
+ org.eclipse.virgo.medic.eventlog.EventLoggerFactory,\
+ org.eclipse.virgo.repository.Repository,\
+ org.eclipse.virgo.nano.core.Shutdown,\
+ org.osgi.framework.hooks.resolver.ResolverHookFactory,\
+ org.osgi.service.cm.ConfigurationAdmin,\
+ org.osgi.service.event.EventAdmin,\
+ org.osgi.service.log.LogService,\
+ org.eclipse.virgo.medic.eventlog.EventLogger,\
+ org.eclipse.virgo.medic.dump.DumpGenerator,\
+ org.eclipse.virgo.nano.shim.scope.ScopeFactory,\
+ org.eclipse.virgo.nano.shim.serviceability.TracingService,\
+ org.eclipse.virgo.kernel.model.management.RuntimeArtifactModelObjectNameCreator,\
+ org.eclipse.osgi.service.resolver.PlatformAdmin,\
+ org.osgi.service.packageadmin.PackageAdmin,\
+ org.eclipse.virgo.nano.core.ConfigurationExporter
+
+serviceExports =\
+ org.eclipse.virgo.kernel.install.artifact.InstallArtifactLifecycleListener,\
+ org.eclipse.virgo.kernel.install.artifact.ArtifactTypeDeterminer,\
+ org.eclipse.virgo.kernel.install.pipeline.stage.transform.Transformer,\
+ org.eclipse.virgo.kernel.module.ModuleContextAccessor,\
+ org.eclipse.virgo.medic.dump.DumpContributor,\
+ org.eclipse.virgo.kernel.osgi.quasi.QuasiFrameworkFactory,\
+ org.eclipse.virgo.kernel.osgi.framework.OsgiFramework,\
+ org.eclipse.virgo.kernel.osgi.framework.ImportExpander,\
+ org.eclipse.virgo.kernel.osgi.framework.PackageAdminUtil,\
+ org.eclipse.equinox.region.Region,\
+ org.osgi.service.event.EventHandler,\
+ org.osgi.service.cm.ConfigurationListener,\
+ org.osgi.service.cm.ManagedService,\
+ org.osgi.service.cm.ManagedServiceFactory,\
+ org.osgi.framework.BundleContext,\
+ org.eclipse.virgo.nano.deployer.api.config.ConfigurationDeployer
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/config/org.eclipse.virgo.medic.properties b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/config/org.eclipse.virgo.medic.properties
new file mode 100644
index 0000000..8b9e75a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/config/org.eclipse.virgo.medic.properties
@@ -0,0 +1,7 @@
+dump.root.directory=target/serviceability/dump
+log.wrapSysOut=true
+log.wrapSysErr=true
+log.dump.level=DEBUG
+log.dump.bufferSize=10000
+log.dump.pattern=[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-28.28thread %-64.64logger{64} %X{medic.eventCode} %msg %ex%n
+log.jul.consoleHandler=false
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/config/org.eclipse.virgo.repository.properties b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/config/org.eclipse.virgo.repository.properties
new file mode 100644
index 0000000..0686df4
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/config/org.eclipse.virgo.repository.properties
@@ -0,0 +1,47 @@
+bundles.type=external
+bundles.searchPattern=../{bundle}/target/classes
+
+ivy-cache-bundles.type=external
+ivy-cache-bundles.searchPattern=${user.home}/virgo-build-cache/ivy-cache/repository/{org}/{name}/{version}/{bundle}.jar
+
+ivy-cache-libraries.type=external
+ivy-cache-libraries.searchPattern=${user.home}/virgo-build-cache/ivy-cache/repository/{org}/{name}/{version}/{library}.libd
+
+target-watched.type=watched
+target-watched.watchDirectory=target/watched
+target-watched.watchInterval=1
+
+src-test-resources-1.type=external
+src-test-resources-1.searchPattern=src/test/resources/importMergeDiagnostics/*.libd
+
+src-test-resources-2.type=external
+src-test-resources-2.searchPattern=src/test/resources/ExporterC.jar
+
+src-test-resources-3.type=external
+src-test-resources-3.searchPattern=src/test/resources/LibraryC.libd
+
+src-test-resources-4.type=external
+src-test-resources-4.searchPattern=src/test/resources/service-publication-from-repo/*.jar
+
+src-test-resources-5.type=external
+src-test-resources-5.searchPattern=src/test/resources/requirebundle/bundles/parrequirebundlethree.jar
+
+src-test-resources-6.type=external
+src-test-resources-6.searchPattern=src/test/resources/plan-deployment/*
+
+src-test-resources-6-plans.type=external
+src-test-resources-6-plans.searchPattern=src/test/resources/plan-deployment/*.plan
+
+src-test-resources-7.type=external
+src-test-resources-7.searchPattern=src/test/resources/properties/*
+
+src-test-resources-8.type=external
+src-test-resources-8.searchPattern=src/test/resources/service-scoping/repository/*
+
+src-test-resources-9.type=external
+src-test-resources-9.searchPattern=src/test/resources/plan-provisioning/*
+
+src-test-resources-10.type=external
+src-test-resources-10.searchPattern=src/test/resources/blueprint/*
+
+chain=target-watched,bundles,ivy-cache-bundles,ivy-cache-libraries,src-test-resources-1,src-test-resources-2,src-test-resources-3,src-test-resources-4,src-test-resources-5,src-test-resources-6,src-test-resources-6-plans,src-test-resources-7,src-test-resources-8,src-test-resources-9,src-test-resources-10
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/config/serviceability.xml b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/config/serviceability.xml
new file mode 100644
index 0000000..ebfb8fb
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/config/serviceability.xml
@@ -0,0 +1,56 @@
+<configuration>
+
+	<jmxConfigurator />
+
+	<contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"/>
+
+	<appender name="LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<file>target/serviceability/log/log.log</file>
+		<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+			<FileNamePattern>target/serviceability/log/log_%i.log</FileNamePattern>
+			<MinIndex>1</MinIndex>
+			<MaxIndex>4</MaxIndex>
+		</rollingPolicy>
+		<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+			<MaxFileSize>10MB</MaxFileSize>
+		</triggeringPolicy>
+		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+			<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-5level %-28.28thread %-64.64logger{64} %X{medic.eventCode} %msg %ex%n</Pattern>
+		</encoder>
+	</appender>
+
+	<appender name="EVENT_LOG_STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+			<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-28.28thread &lt;%X{medic.eventCode}&gt; %msg %ex%n</Pattern>
+		</encoder>
+	</appender>
+
+	<appender name="EVENT_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<file>target/serviceability/eventlog/eventlog.log</file>
+		<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+			<FileNamePattern>target/serviceability/eventlog/eventlog_%i.log</FileNamePattern>
+			<MinIndex>1</MinIndex>
+			<MaxIndex>4</MaxIndex>
+		</rollingPolicy>
+		<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+			<MaxFileSize>10MB</MaxFileSize>
+		</triggeringPolicy>
+		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+			<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-28.28thread &lt;%X{medic.eventCode}&gt; %msg %ex%n</Pattern>
+		</encoder>
+	</appender>
+
+	<logger level="INFO" additivity="false" name="org.eclipse.virgo.medic.eventlog.localized">
+		<appender-ref ref="EVENT_LOG_STDOUT" />
+		<appender-ref ref="EVENT_LOG_FILE" />
+	</logger>
+	
+	<logger level="INFO" additivity="false" name="org.eclipse.virgo.medic.eventlog.default">
+		<appender-ref ref="LOG_FILE" />
+	</logger>
+
+	<root level="INFO">
+		<appender-ref ref="LOG_FILE" />
+	</root>
+
+</configuration>
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/configTimeout/org.eclipse.virgo.kernel.properties b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/configTimeout/org.eclipse.virgo.kernel.properties
new file mode 100644
index 0000000..132ac38
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/configTimeout/org.eclipse.virgo.kernel.properties
@@ -0,0 +1,9 @@
+deployer.timeout=			0
+deployer.pickupDirectory=	target/pickup
+deployer.scanIntervalMillis=1000
+io.workDirectory=			target/work
+io.dumpDirectory=			target/serviceability/dump
+
+profile.name = deployer integration tests
+profile.subsystems=
+profile.optionalSubsystems=
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/configuration.deployment/empty.properties b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/configuration.deployment/empty.properties
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/configuration.deployment/empty.properties
@@ -0,0 +1 @@
+
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/configuration.deployment/factory-config-a.properties b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/configuration.deployment/factory-config-a.properties
new file mode 100644
index 0000000..6313f1a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/configuration.deployment/factory-config-a.properties
@@ -0,0 +1,6 @@
+# factory pid for config admin service
+service.factoryPid = test.factory.pid.a
+
+# properties for the managed service
+prop1 = prop1
+prop2 = 2
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/configuration.deployment/t.properties b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/configuration.deployment/t.properties
new file mode 100644
index 0000000..20c0243
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/configuration.deployment/t.properties
@@ -0,0 +1,2 @@
+a=b
+c=d
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/deployedArtifactJmxBeanTests/test.plan b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/deployedArtifactJmxBeanTests/test.plan
new file mode 100644
index 0000000..4237660
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/deployedArtifactJmxBeanTests/test.plan
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="test.plan" version="1.0.0" scoped="false" atomic="false"
+		xmlns="http://www.springsource.org/schema/dm-server/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.springsource.org/schema/dm-server/plan 
+			http://www.springsource.org/schema/dm-server/plan/springsource-dm-server-plan.xsd">
+
+	<artifact type="bundle" name="simple.bundle.one" version="[1, 2)"/>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/deployer-log-message-tests/ClassNotFoundException.jar b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/deployer-log-message-tests/ClassNotFoundException.jar
new file mode 100644
index 0000000..e780bd2
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/deployer-log-message-tests/ClassNotFoundException.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/deployer-log-message-tests/malformed-application-context.par b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/deployer-log-message-tests/malformed-application-context.par
new file mode 100644
index 0000000..3222f4c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/deployer-log-message-tests/malformed-application-context.par
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/deployer-log-message-tests/missing-bundle.par b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/deployer-log-message-tests/missing-bundle.par
new file mode 100644
index 0000000..73ef21e
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/deployer-log-message-tests/missing-bundle.par
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/deployer-log-message-tests/missing-library.par b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/deployer-log-message-tests/missing-library.par
new file mode 100644
index 0000000..b8b363e
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/deployer-log-message-tests/missing-library.par
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/deployer-log-message-tests/missing-package.par b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/deployer-log-message-tests/missing-package.par
new file mode 100644
index 0000000..86090ab
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/deployer-log-message-tests/missing-package.par
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/dms-fragment.plan b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/dms-fragment.plan
new file mode 100644
index 0000000..aa9a11c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/dms-fragment.plan
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="fragment" version="1.0.0" scoped="false" atomic="true"
+		xmlns="http://www.springsource.org/schema/dm-server/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.springsource.org/schema/dm-server/plan 
+			http://www.springsource.org/schema/dm-server/plan/springsource-dm-server-plan.xsd">
+
+	<artifact type="bundle" name="simple.bundle.one" version="[1, 2)"/>
+	<artifact type="bundle" name="simple.fragment.one" version="[1, 2)"/>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/dms-properties.plan b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/dms-properties.plan
new file mode 100644
index 0000000..95963fb
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/dms-properties.plan
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="properties.plan" version="1.0.0" scoped="false" atomic="true"
+		xmlns="http://www.springsource.org/schema/dm-server/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.springsource.org/schema/dm-server/plan 
+			http://www.springsource.org/schema/dm-server/plan/springsource-dm-server-plan.xsd">
+
+	<artifact type="bundle" name="bundle.properties" version="[1, 2)">
+		<property name="header:Test-Header" value="foo"/>
+	</artifact>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/dms-scoped-test-with-par.plan b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/dms-scoped-test-with-par.plan
new file mode 100644
index 0000000..415387d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/dms-scoped-test-with-par.plan
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="test.plan" version="1.0.0" scoped="true" atomic="true"
+		xmlns="http://www.springsource.org/schema/dm-server/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.springsource.org/schema/dm-server/plan 
+			http://www.springsource.org/schema/dm-server/plan/springsource-dm-server-plan.xsd">
+
+	<artifact type="par" name="par-deployed-by-plan" version="[1, 2)"/>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/dms-test-with-par.plan b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/dms-test-with-par.plan
new file mode 100644
index 0000000..1972dc4
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/dms-test-with-par.plan
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="test.plan" version="1.0.0" scoped="false" atomic="true"
+		xmlns="http://www.springsource.org/schema/dm-server/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.springsource.org/schema/dm-server/plan 
+			http://www.springsource.org/schema/dm-server/plan/springsource-dm-server-plan.xsd">
+
+	<artifact type="par" name="par-deployed-by-plan" version="[1, 2)"/>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/dms-test.plan b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/dms-test.plan
new file mode 100644
index 0000000..b9a4208
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/dms-test.plan
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="test.plan" version="1.0.0" scoped="true" atomic="true"
+		xmlns="http://www.springsource.org/schema/dm-server/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.springsource.org/schema/dm-server/plan 
+			http://www.springsource.org/schema/dm-server/plan/springsource-dm-server-plan.xsd">
+
+	<artifact type="bundle" name="simple.bundle.one" version="[1, 2)"/>
+	<artifact type="bundle" name="simple.bundle.two" version="[1, 2)"/>
+	<artifact type="configuration" name="com.foo.bar" version="[0,0]"/>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/dms-testunscopednonatomic.plan b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/dms-testunscopednonatomic.plan
new file mode 100644
index 0000000..d863fca
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/dms-testunscopednonatomic.plan
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="test.plan" version="1.0.0" scoped="false" atomic="false"
+		xmlns="http://www.springsource.org/schema/dm-server/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.springsource.org/schema/dm-server/plan 
+			http://www.springsource.org/schema/dm-server/plan/springsource-dm-server-plan.xsd">
+
+	<artifact type="bundle" name="simple.bundle.one" version="[1, 2)"/>
+	<artifact type="bundle" name="simple.bundle.two" version="[1, 2)"/>
+	<artifact type="configuration" name="com.foo.bar" version="[0,0]"/>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/dummy-library.libd b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/dummy-library.libd
new file mode 100644
index 0000000..fb1451f
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/dummy-library.libd
@@ -0,0 +1,3 @@
+Library-SymbolicName: dummy
+Library-Version: 1.0
+Import-Bundle: javax.el;version="[1.0,2.0)"
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/dummy.jar b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/dummy.jar
new file mode 100644
index 0000000..aebcad3
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/dummy.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/dummymodified.jar b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/dummymodified.jar
new file mode 100644
index 0000000..1ed12a9
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/dummymodified.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/estunscopednonatomicB2.plan b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/estunscopednonatomicB2.plan
new file mode 100644
index 0000000..3cc42a2
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/estunscopednonatomicB2.plan
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="testB.plan" version="1.0.0" scoped="false" atomic="false"
+		xmlns="http://www.eclipse.org/virgo/schema/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.eclipse.org/virgo/schema/plan 
+			http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+	<artifact type="plan" name="testA.plan" version="[1, 2)"/>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/fragment.plan b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/fragment.plan
new file mode 100644
index 0000000..abdbd6c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/fragment.plan
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="fragment" version="1.0.0" scoped="false" atomic="true"
+		xmlns="http://www.eclipse.org/virgo/schema/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.eclipse.org/virgo/schema/plan 
+			http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+	<artifact type="bundle" name="simple.bundle.one" version="[1, 2)"/>
+	<artifact type="bundle" name="simple.fragment.one" version="[1, 2)"/>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/hot-deployment-tests/bundle.jar b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/hot-deployment-tests/bundle.jar
new file mode 100644
index 0000000..145a852
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/hot-deployment-tests/bundle.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/hot-deployment-tests/bundle/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/hot-deployment-tests/bundle/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..27d8924
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/hot-deployment-tests/bundle/META-INF/MANIFEST.MF
@@ -0,0 +1,4 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: test
+Bundle-Version: 1.0
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/hot-deployment-tests/test.properties b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/hot-deployment-tests/test.properties
new file mode 100644
index 0000000..74d0a43
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/hot-deployment-tests/test.properties
@@ -0,0 +1 @@
+foo=bar
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/importMergeDiagnostics/LibraryImportingP1.libd b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/importMergeDiagnostics/LibraryImportingP1.libd
new file mode 100644
index 0000000..1a04eda
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/importMergeDiagnostics/LibraryImportingP1.libd
@@ -0,0 +1,3 @@
+Library-SymbolicName: LibraryImportingP1
+Library-Version: 1.0
+Import-Bundle: TestP1
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/importMergeDiagnostics/LibraryImportingP2.libd b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/importMergeDiagnostics/LibraryImportingP2.libd
new file mode 100644
index 0000000..1d4220a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/importMergeDiagnostics/LibraryImportingP2.libd
@@ -0,0 +1,3 @@
+Library-SymbolicName: LibraryImportingP2
+Library-Version: 1.0
+Import-Bundle: TestP2
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/importMergeDiagnostics/TestImportP1P2.jar/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/importMergeDiagnostics/TestImportP1P2.jar/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..52d335f
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/importMergeDiagnostics/TestImportP1P2.jar/META-INF/MANIFEST.MF
@@ -0,0 +1,4 @@
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: TestImportP1P2
+Import-Bundle: TestP1,TestP2
+
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/importMergeDiagnostics/TestImportP1P2ViaLibraries.jar/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/importMergeDiagnostics/TestImportP1P2ViaLibraries.jar/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..da52755
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/importMergeDiagnostics/TestImportP1P2ViaLibraries.jar/META-INF/MANIFEST.MF
@@ -0,0 +1,4 @@
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: TestImportP1P2ViaLibraries
+Import-Library: LibraryImportingP1,LibraryImportingP2
+
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/importMergeDiagnostics/TestP1.jar/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/importMergeDiagnostics/TestP1.jar/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..823733b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/importMergeDiagnostics/TestP1.jar/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: TestP1
+Export-Package: p
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/importMergeDiagnostics/TestP2.jar/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/importMergeDiagnostics/TestP2.jar/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..9f980da
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/importMergeDiagnostics/TestP2.jar/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: TestP2
+Export-Package: p
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/initial-artifact-plan/com.springsource.kernel.deployer.test.userregion.springdm.plan b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/initial-artifact-plan/com.springsource.kernel.deployer.test.userregion.springdm.plan
new file mode 100644
index 0000000..8523004
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/initial-artifact-plan/com.springsource.kernel.deployer.test.userregion.springdm.plan
@@ -0,0 +1,10 @@
+<plan name="org.eclipse.virgo.kernel.deployer.test.userregion.springdm" version="2.0" scoped="false" atomic="false"
+                xmlns="http://www.springsource.org/schema/dm-server/plan"
+                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+                xsi:schemaLocation="
+                        http://www.springsource.org/schema/dm-server/plan 
+                        http://www.springsource.org/schema/dm-server/plan/springsource-dm-server-plan.xsd">
+
+        <artifact type="bundle" name="com.springsource.kernel.agent.dm" version="[2.0, 2.1)"/>
+        <artifact type="bundle" name="org.eclipse.virgo.kernel.deployer.dm" version="[2.0, 2.1)"/>
+</plan>
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/jpa-ltw-sample-update.par b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/jpa-ltw-sample-update.par
new file mode 100644
index 0000000..8e47322
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/jpa-ltw-sample-update.par
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/library-deployment-test.par b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/library-deployment-test.par
new file mode 100644
index 0000000..313c745
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/library-deployment-test.par
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/manual-context.jar b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/manual-context.jar
new file mode 100644
index 0000000..e8b750c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/manual-context.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/monitor/failure/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/monitor/failure/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..0f93025
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/monitor/failure/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: monitor.failure
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/monitor/failure/META-INF/spring/context.xml b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/monitor/failure/META-INF/spring/context.xml
new file mode 100644
index 0000000..ce29a3f
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/monitor/failure/META-INF/spring/context.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans:beans xmlns="http://www.springframework.org/schema/osgi"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns:beans="http://www.springframework.org/schema/beans"
+	xsi:schemaLocation="http://www.springframework.org/schema/osgi  
+       http://www.springframework.org/schema/osgi/spring-osgi.xsd
+       http://www.springframework.org/schema/beans   
+       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
+       
+      <ba 
+</beans:beans>
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/monitor/nondm/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/monitor/nondm/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..c3b9ee1
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/monitor/nondm/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: monitor.nondm
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/monitor/success/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/monitor/success/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..199421b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/monitor/success/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: monitor.success
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/monitor/success/META-INF/spring/context.xml b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/monitor/success/META-INF/spring/context.xml
new file mode 100644
index 0000000..e6eb844
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/monitor/success/META-INF/spring/context.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans:beans xmlns="http://www.springframework.org/schema/osgi"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns:beans="http://www.springframework.org/schema/beans"
+	xsi:schemaLocation="http://www.springframework.org/schema/osgi  
+       http://www.springframework.org/schema/osgi/spring-osgi.xsd
+       http://www.springframework.org/schema/beans   
+       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
+       
+       
+</beans:beans>
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/nomanifest.jar b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/nomanifest.jar
new file mode 100644
index 0000000..a5de4a7
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/nomanifest.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/nomanifest.par b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/nomanifest.par
new file mode 100644
index 0000000..a5de4a7
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/nomanifest.par
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/nometainf.jar b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/nometainf.jar
new file mode 100644
index 0000000..47a7426
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/nometainf.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/nometainf.par b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/nometainf.par
new file mode 100644
index 0000000..47a7426
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/nometainf.par
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/onstarted-failure-tests/bundle.jar/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/onstarted-failure-tests/bundle.jar/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..564b943
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/onstarted-failure-tests/bundle.jar/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Bundle-SymbolicName: bundle
+Bundle-Version: 1
+Bundle-ManifestVersion: 2
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/onstarted-failure-tests/started-failure.par/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/onstarted-failure-tests/started-failure.par/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..4ce10b6
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/onstarted-failure-tests/started-failure.par/META-INF/MANIFEST.MF
@@ -0,0 +1,2 @@
+Application-SymbolicName: onstarted-failure
+Application-Version: 1
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/onstarted-failure-tests/started-failure.par/bundle.jar/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/onstarted-failure-tests/started-failure.par/bundle.jar/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..564b943
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/onstarted-failure-tests/started-failure.par/bundle.jar/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Bundle-SymbolicName: bundle
+Bundle-Version: 1
+Bundle-ManifestVersion: 2
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/org.aspectj-library.libd b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/org.aspectj-library.libd
new file mode 100644
index 0000000..4540c2c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/org.aspectj-library.libd
@@ -0,0 +1,6 @@
+Library-SymbolicName: org.aspectj
+Library-Version: 1.6.1
+Library-Name: AspectJ
+Import-Bundle: 
+ com.springsource.org.aspectj.runtime;version="[1.6.1 ,1.6.1]",
+ com.springsource.org.aspectj.weaver;version="[1.6.1, 1.6.1]"
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/osgi_test.jar b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/osgi_test.jar
new file mode 100644
index 0000000..fa42700
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/osgi_test.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/osgi_test2.jar b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/osgi_test2.jar
new file mode 100644
index 0000000..d196801
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/osgi_test2.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment-dag/simple.bundle.three.jar b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment-dag/simple.bundle.three.jar
new file mode 100644
index 0000000..380e058
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment-dag/simple.bundle.three.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/child.jar b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/child.jar
new file mode 100644
index 0000000..9c67dc8
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/child.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/com.foo.bar.properties b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/com.foo.bar.properties
new file mode 100644
index 0000000..094a8ed
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/com.foo.bar.properties
@@ -0,0 +1,3 @@
+a=alpha
+b=bravo
+c=charlie
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/global.jar b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/global.jar
new file mode 100644
index 0000000..1281739
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/global.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/lazyBundle.jar b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/lazyBundle.jar
new file mode 100644
index 0000000..5ec5d32
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/lazyBundle.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/parent.jar b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/parent.jar
new file mode 100644
index 0000000..7333a5c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/parent.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/plan-deployment.par/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/plan-deployment.par/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..5822475
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/plan-deployment.par/META-INF/MANIFEST.MF
@@ -0,0 +1,2 @@
+Application-SymbolicName: par-deployed-by-plan
+Application-Version: 1
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/plan-deployment.par/one.jar/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/plan-deployment.par/one.jar/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..74e806d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/plan-deployment.par/one.jar/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Bundle-SymbolicName: one
+Bundle-Version: 1
+Bundle-ManifestVersion: 2
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/plan-deployment.par/some-config.properties b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/plan-deployment.par/some-config.properties
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/plan-deployment.par/some-config.properties
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/plan-deployment.par/three.jar/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/plan-deployment.par/three.jar/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..25aab64
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/plan-deployment.par/three.jar/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Bundle-SymbolicName: three
+Bundle-Version: 1
+Bundle-ManifestVersion: 2
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/plan-deployment.par/two.jar/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/plan-deployment.par/two.jar/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..908c549
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/plan-deployment.par/two.jar/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Bundle-SymbolicName: two
+Bundle-Version: 1
+Bundle-ManifestVersion: 2
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/simple.bundle.one.jar b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/simple.bundle.one.jar
new file mode 100644
index 0000000..90ba2bb
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/simple.bundle.one.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/simple.bundle.two.jar b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/simple.bundle.two.jar
new file mode 100644
index 0000000..b2416df
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/simple.bundle.two.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/simple.fragment.one.jar b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/simple.fragment.one.jar
new file mode 100644
index 0000000..a190325
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/simple.fragment.one.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/simple.plan.one.plan b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/simple.plan.one.plan
new file mode 100644
index 0000000..74b7321
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/simple.plan.one.plan
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="simple.plan.one" version="1.0.0" scoped="false" atomic="false"
+		xmlns="http://www.eclipse.org/virgo/schema/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.eclipse.org/virgo/schema/plan 
+			http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+	<artifact type="bundle" name="simple.bundle.one" version="[1, 2)"/>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/simple.plan.two.plan b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/simple.plan.two.plan
new file mode 100644
index 0000000..0d04fac
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/simple.plan.two.plan
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="simple.plan.two" version="1.0.0" scoped="false" atomic="false"
+		xmlns="http://www.eclipse.org/virgo/schema/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.eclipse.org/virgo/schema/plan 
+			http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+	<artifact type="bundle" name="simple.bundle.one" version="[1, 2)"/>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/testAshared.plan b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/testAshared.plan
new file mode 100644
index 0000000..253bd64
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/testAshared.plan
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="testAshared" version="1.0.0" scoped="false" atomic="false"
+		xmlns="http://www.eclipse.org/virgo/schema/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.eclipse.org/virgo/schema/plan 
+			http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+	<artifact type="bundle" name="simple.bundle.one" version="[1, 2)"/>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-in-par/ParContainingPlan.par b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-in-par/ParContainingPlan.par
new file mode 100644
index 0000000..8241347
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-in-par/ParContainingPlan.par
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-provisioning/auto-inherit.plan b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-provisioning/auto-inherit.plan
new file mode 100644
index 0000000..46ca0ab
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-provisioning/auto-inherit.plan
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="auto.inherit" version="1.0.0" scoped="false" atomic="true" provisioning="auto"
+		xmlns="http://www.eclipse.org/virgo/schema/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.eclipse.org/virgo/schema/plan 
+			http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+	<artifact type="plan" name="inherit" version="1"/>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-provisioning/auto.plan b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-provisioning/auto.plan
new file mode 100644
index 0000000..7e9313a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-provisioning/auto.plan
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="auto" version="1.0.0" scoped="false" atomic="true" provisioning="auto"
+		xmlns="http://www.eclipse.org/virgo/schema/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.eclipse.org/virgo/schema/plan 
+			http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+	<artifact type="bundle" name="plan.provisioning.p.importer" version="0"/>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-provisioning/default.plan b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-provisioning/default.plan
new file mode 100644
index 0000000..a09e5b2
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-provisioning/default.plan
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="default" version="1.0.0" scoped="false" atomic="true"
+		xmlns="http://www.eclipse.org/virgo/schema/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.eclipse.org/virgo/schema/plan 
+			http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+	<artifact type="bundle" name="plan.provisioning.p.importer" version="0"/>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-provisioning/disabled-default.plan b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-provisioning/disabled-default.plan
new file mode 100644
index 0000000..328f755
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-provisioning/disabled-default.plan
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="disabled.default" version="1.0.0" scoped="false" atomic="true" provisioning="disabled"
+		xmlns="http://www.eclipse.org/virgo/schema/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.eclipse.org/virgo/schema/plan 
+			http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+	<artifact type="plan" name="inherit" version="1"/>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-provisioning/disabled-inherit.plan b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-provisioning/disabled-inherit.plan
new file mode 100644
index 0000000..80e4c26
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-provisioning/disabled-inherit.plan
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="disabled.inherit" version="1.0.0" scoped="false" atomic="true" provisioning="disabled"
+		xmlns="http://www.eclipse.org/virgo/schema/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.eclipse.org/virgo/schema/plan 
+			http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+	<artifact type="plan" name="inherit" version="1"/>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-provisioning/disabled.plan b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-provisioning/disabled.plan
new file mode 100644
index 0000000..ec361aa
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-provisioning/disabled.plan
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="disabled" version="1.0.0" scoped="false" atomic="true" provisioning="disabled"
+		xmlns="http://www.eclipse.org/virgo/schema/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.eclipse.org/virgo/schema/plan 
+			http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+	<artifact type="bundle" name="plan.provisioning.p.importer" version="0"/>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-provisioning/inherit.plan b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-provisioning/inherit.plan
new file mode 100644
index 0000000..57a678a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-provisioning/inherit.plan
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="inherit" version="1.0.0" scoped="false" atomic="true" provisioning="inherit"
+		xmlns="http://www.eclipse.org/virgo/schema/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.eclipse.org/virgo/schema/plan 
+			http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+	<artifact type="bundle" name="plan.provisioning.p.importer" version="0"/>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-provisioning/parent-with-exporter-disabled.plan b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-provisioning/parent-with-exporter-disabled.plan
new file mode 100644
index 0000000..b9a1cc6
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-provisioning/parent-with-exporter-disabled.plan
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="parent.with.exporter.disabled" version="1.0.0" scoped="false" atomic="true" provisioning="inherit"
+		xmlns="http://www.eclipse.org/virgo/schema/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.eclipse.org/virgo/schema/plan 
+			http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+	<artifact type="plan" name="inherit" version="1"/>
+	<artifact type="bundle" name="plan.provisioning.p.exporter" version="0"/>
+	
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-provisioning/pexporter.jar b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-provisioning/pexporter.jar
new file mode 100644
index 0000000..05a23e6
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-provisioning/pexporter.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-provisioning/pimporter.jar b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-provisioning/pimporter.jar
new file mode 100644
index 0000000..d641c91
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-provisioning/pimporter.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/properties.plan b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/properties.plan
new file mode 100644
index 0000000..cf3bcbc
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/properties.plan
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="properties.plan" version="1.0.0" scoped="false" atomic="true"
+		xmlns="http://www.eclipse.org/virgo/schema/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.eclipse.org/virgo/schema/plan 
+			http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+	<artifact type="bundle" name="bundle.properties" version="[1, 2)">
+		<property name="header:Test-Header" value="foo"/>
+	</artifact>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/properties/bundle/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/properties/bundle/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..f611094
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/properties/bundle/META-INF/MANIFEST.MF
@@ -0,0 +1,4 @@
+Manifest-Version: 1
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: bundle.properties
+Bundle-Version: 1
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/quartz/quartz.bundle.a.jar b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/quartz/quartz.bundle.a.jar
new file mode 100644
index 0000000..9936a3f
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/quartz/quartz.bundle.a.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/quartz/quartz.bundle.b.jar b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/quartz/quartz.bundle.b.jar
new file mode 100644
index 0000000..1deee84
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/quartz/quartz.bundle.b.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/quartz/quartz.bundle.same1.jar b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/quartz/quartz.bundle.same1.jar
new file mode 100644
index 0000000..977f372
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/quartz/quartz.bundle.same1.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/quartz/quartz.bundle.same2.jar b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/quartz/quartz.bundle.same2.jar
new file mode 100644
index 0000000..e2db99e
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/quartz/quartz.bundle.same2.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-bundle-refresh/bundle-refresh.par/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-bundle-refresh/bundle-refresh.par/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..4ebd135
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-bundle-refresh/bundle-refresh.par/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Application-SymbolicName: bundle-refresh
+Application-Version: 1.0
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-bundle-refresh/bundle-refresh.par/initial.jar/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-bundle-refresh/bundle-refresh.par/initial.jar/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..b94c70a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-bundle-refresh/bundle-refresh.par/initial.jar/META-INF/MANIFEST.MF
@@ -0,0 +1,5 @@
+Manifest-Version: 1
+Bundle-SymbolicName: refresh
+Bundle-Version: 1.0
+Bundle-ManifestVersion: 2
+Export-Package: one
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-bundle-refresh/initial.jar/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-bundle-refresh/initial.jar/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..b94c70a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-bundle-refresh/initial.jar/META-INF/MANIFEST.MF
@@ -0,0 +1,5 @@
+Manifest-Version: 1
+Bundle-SymbolicName: refresh
+Bundle-Version: 1.0
+Bundle-ManifestVersion: 2
+Export-Package: one
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-bundle-refresh/new-entry.jar/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-bundle-refresh/new-entry.jar/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..b94c70a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-bundle-refresh/new-entry.jar/META-INF/MANIFEST.MF
@@ -0,0 +1,5 @@
+Manifest-Version: 1
+Bundle-SymbolicName: refresh
+Bundle-Version: 1.0
+Bundle-ManifestVersion: 2
+Export-Package: one
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-bundle-refresh/new-entry.jar/one/foo.txt b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-bundle-refresh/new-entry.jar/one/foo.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-bundle-refresh/new-entry.jar/one/foo.txt
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-bundle-refresh/new-export.jar/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-bundle-refresh/new-export.jar/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..a644533
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-bundle-refresh/new-export.jar/META-INF/MANIFEST.MF
@@ -0,0 +1,5 @@
+Manifest-Version: 1
+Bundle-SymbolicName: refresh
+Bundle-Version: 1.0
+Bundle-ManifestVersion: 2
+Export-Package: one,two
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-bundle-refresh/new-export.jar/one/foo.txt b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-bundle-refresh/new-export.jar/one/foo.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-bundle-refresh/new-export.jar/one/foo.txt
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-bundle-refresh/new-name.jar/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-bundle-refresh/new-name.jar/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..cebf007
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-bundle-refresh/new-name.jar/META-INF/MANIFEST.MF
@@ -0,0 +1,5 @@
+Manifest-Version: 1
+Bundle-SymbolicName: different
+Bundle-Version: 1.0
+Bundle-ManifestVersion: 2
+Export-Package: one
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-bundle-refresh/new-version.jar/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-bundle-refresh/new-version.jar/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..a2d3cfe
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-bundle-refresh/new-version.jar/META-INF/MANIFEST.MF
@@ -0,0 +1,5 @@
+Manifest-Version: 1
+Bundle-SymbolicName: refresh
+Bundle-Version: 2.0
+Bundle-ManifestVersion: 2
+Export-Package: one
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-bundle-refresh/no-bsn-no-version.jar/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-bundle-refresh/no-bsn-no-version.jar/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..e550bfa
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-bundle-refresh/no-bsn-no-version.jar/META-INF/MANIFEST.MF
@@ -0,0 +1 @@
+Manifest-Version: 1
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-bundle-refresh/parent-test.plan b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-bundle-refresh/parent-test.plan
new file mode 100644
index 0000000..e52f0c0
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-bundle-refresh/parent-test.plan
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="bundle-refresh" version="1.0.0" scoped="true" atomic="true"
+		xmlns="http://www.springsource.org/schema/dm-server/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.springsource.org/schema/dm-server/plan 
+			http://www.springsource.org/schema/dm-server/plan/springsource-dm-server-plan.xsd">
+	
+	<artifact type="plan" name="unscoped-bundle-refresh" version="[1,1]"/>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-bundle-refresh/test.plan b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-bundle-refresh/test.plan
new file mode 100644
index 0000000..35ae2e3
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-bundle-refresh/test.plan
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="unscoped-bundle-refresh" version="1.0.0" scoped="false" atomic="true"
+		xmlns="http://www.springsource.org/schema/dm-server/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.springsource.org/schema/dm-server/plan 
+			http://www.springsource.org/schema/dm-server/plan/springsource-dm-server-plan.xsd">
+	
+	<artifact type="bundle" name="refresh" version="[1,1]"/>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-config-refresh/config-refresh.par/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-config-refresh/config-refresh.par/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..dd05424
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-config-refresh/config-refresh.par/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Application-SymbolicName: config-refresh
+Application-Version: 1.0
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-config-refresh/config-refresh.par/test.properties b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-config-refresh/config-refresh.par/test.properties
new file mode 100644
index 0000000..74d0a43
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-config-refresh/config-refresh.par/test.properties
@@ -0,0 +1 @@
+foo=bar
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-config-refresh/test-refresh.properties b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-config-refresh/test-refresh.properties
new file mode 100644
index 0000000..011da3c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-config-refresh/test-refresh.properties
@@ -0,0 +1 @@
+alpha=bravo
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-config-refresh/test.plan b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-config-refresh/test.plan
new file mode 100644
index 0000000..ee806c8
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-config-refresh/test.plan
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="config-refresh" version="1.0.0" scoped="true" atomic="true"
+		xmlns="http://www.springsource.org/schema/dm-server/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.springsource.org/schema/dm-server/plan 
+			http://www.springsource.org/schema/dm-server/plan/springsource-dm-server-plan.xsd">
+	
+	<artifact type="configuration" name="test" version="[0,0]"/>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-config-refresh/test.properties b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-config-refresh/test.properties
new file mode 100644
index 0000000..74d0a43
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-config-refresh/test.properties
@@ -0,0 +1 @@
+foo=bar
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-par-refresh/refresh.par/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-par-refresh/refresh.par/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..6f9bc6c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-par-refresh/refresh.par/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Application-SymbolicName: refresh
+Application-Version: 1.0
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-plan-refresh/test.plan b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-plan-refresh/test.plan
new file mode 100644
index 0000000..979e4ea
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-plan-refresh/test.plan
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="refresh" version="1.0.0" scoped="false" atomic="true"
+		xmlns="http://www.springsource.org/schema/dm-server/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.springsource.org/schema/dm-server/plan 
+			http://www.springsource.org/schema/dm-server/plan/springsource-dm-server-plan.xsd">	
+			
+		<artifact type="configuration" name="test" version="[0,0]"/>
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-plan-refresh/test.properties b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-plan-refresh/test.properties
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/ram-plan-refresh/test.properties
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/redeploy-refresh/bad/simple.module.jar b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/redeploy-refresh/bad/simple.module.jar
new file mode 100644
index 0000000..ad36d35
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/redeploy-refresh/bad/simple.module.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/redeploy-refresh/good/simple.module.jar b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/redeploy-refresh/good/simple.module.jar
new file mode 100644
index 0000000..4503a34
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/redeploy-refresh/good/simple.module.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/redeploy-refresh/good/simple2.module.jar b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/redeploy-refresh/good/simple2.module.jar
new file mode 100644
index 0000000..ce66b3a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/redeploy-refresh/good/simple2.module.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/refresh-import-bundle.par b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/refresh-import-bundle.par
new file mode 100644
index 0000000..1327a1f
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/refresh-import-bundle.par
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/refresh.par b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/refresh.par
new file mode 100644
index 0000000..b607789
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/refresh.par
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/requirebundle/bundles/parWithInternalRequireBundle.par b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/requirebundle/bundles/parWithInternalRequireBundle.par
new file mode 100644
index 0000000..b38120c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/requirebundle/bundles/parWithInternalRequireBundle.par
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/requirebundle/bundles/parrequirebundlethree.jar b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/requirebundle/bundles/parrequirebundlethree.jar
new file mode 100644
index 0000000..1dea9d2
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/requirebundle/bundles/parrequirebundlethree.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/scoped-test-with-par.plan b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/scoped-test-with-par.plan
new file mode 100644
index 0000000..e615778
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/scoped-test-with-par.plan
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="test.plan" version="1.0.0" scoped="true" atomic="true"
+		xmlns="http://www.eclipse.org/virgo/schema/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.eclipse.org/virgo/schema/plan 
+			http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+	<artifact type="par" name="par-deployed-by-plan" version="[1, 2)"/>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/service-publication-from-repo/consumer.jar b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/service-publication-from-repo/consumer.jar
new file mode 100644
index 0000000..f29e7bc
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/service-publication-from-repo/consumer.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/service-publication-from-repo/publisher.jar b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/service-publication-from-repo/publisher.jar
new file mode 100644
index 0000000..8e10354
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/service-publication-from-repo/publisher.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/service-scoping/repository/one.jar/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/service-scoping/repository/one.jar/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..61bdbb0
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/service-scoping/repository/one.jar/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Bundle-SymbolicName: service.scoping.one
+Bundle-ManifestVersion: 2
+Bundle-Version: 1
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/service-scoping/repository/one.jar/META-INF/spring/context.xml b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/service-scoping/repository/one.jar/META-INF/spring/context.xml
new file mode 100644
index 0000000..84bb0db
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/service-scoping/repository/one.jar/META-INF/spring/context.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns:osgi="http://www.springframework.org/schema/osgi"
+	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+		http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi.xsd">
+
+	<osgi:service interface="java.util.List">
+		<bean class="java.util.ArrayList"/>
+	</osgi:service>
+	
+</beans>
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/service-scoping/repository/service-scoping-nested.plan b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/service-scoping/repository/service-scoping-nested.plan
new file mode 100644
index 0000000..8200323
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/service-scoping/repository/service-scoping-nested.plan
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="service-scoping-nested" version="1.0.0" scoped="false" atomic="true"
+		xmlns="http://www.springsource.org/schema/dm-server/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.springsource.org/schema/dm-server/plan 
+			http://www.springsource.org/schema/dm-server/plan/springsource-dm-server-plan.xsd">
+
+	<artifact type="bundle" name="service.scoping.two" version="[1, 2)"/>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/service-scoping/repository/two.jar/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/service-scoping/repository/two.jar/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..34404bf
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/service-scoping/repository/two.jar/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Bundle-SymbolicName: service.scoping.two
+Bundle-ManifestVersion: 2
+Bundle-Version: 1
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/service-scoping/repository/two.jar/META-INF/spring/context.xml b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/service-scoping/repository/two.jar/META-INF/spring/context.xml
new file mode 100644
index 0000000..66d2b1c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/service-scoping/repository/two.jar/META-INF/spring/context.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns:osgi="http://www.springframework.org/schema/osgi"
+	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+		http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi.xsd">
+
+	<osgi:reference id="testList" interface="java.util.List"/>
+	
+</beans>
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/service-scoping/scoping.service.global.jar b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/service-scoping/scoping.service.global.jar
new file mode 100644
index 0000000..148d0ad
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/service-scoping/scoping.service.global.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/service-scoping/service-scoping-engine-1265.par b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/service-scoping/service-scoping-engine-1265.par
new file mode 100644
index 0000000..f75bd00
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/service-scoping/service-scoping-engine-1265.par
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/service-scoping/service-scoping-platform-183.par b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/service-scoping/service-scoping-platform-183.par
new file mode 100644
index 0000000..813a0a2
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/service-scoping/service-scoping-platform-183.par
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/service-scoping/service-scoping.par b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/service-scoping/service-scoping.par
new file mode 100644
index 0000000..d4b7727
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/service-scoping/service-scoping.par
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/service-scoping/service-scoping.plan b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/service-scoping/service-scoping.plan
new file mode 100644
index 0000000..468a746
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/service-scoping/service-scoping.plan
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="service-scoping" version="1.0.0" scoped="true" atomic="true"
+		xmlns="http://www.springsource.org/schema/dm-server/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.springsource.org/schema/dm-server/plan 
+			http://www.springsource.org/schema/dm-server/plan/springsource-dm-server-plan.xsd">
+
+	<artifact type="plan" name="service-scoping-nested" version="[1, 2)"/>
+	<artifact type="bundle" name="service.scoping.one" version="[1, 2)"/>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/spring.256A.sample.jar b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/spring.256A.sample.jar
new file mode 100644
index 0000000..4781ed3
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/spring.256A.sample.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/spring.libd b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/spring.libd
new file mode 100644
index 0000000..42ef2e9
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/spring.libd
@@ -0,0 +1,5 @@
+Library-SymbolicName: org.springframework
+Library-Version: 2.5.3
+Import-Bundle: org.springframework.core;version="[2.5.3,3.0.0)",
+ org.springframework.beans;version="[2.5.3,3.0.0)"
+ 
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/spring_instrumented.libd b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/spring_instrumented.libd
new file mode 100644
index 0000000..7fc9d1b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/spring_instrumented.libd
@@ -0,0 +1,5 @@
+Library-SymbolicName: org.springframework
+Library-Version: 2.5.3
+Import-Bundle: org.springframework.core.instrumented;version="[2.5.3,3.0.0)",
+ org.springframework.beans.instrumented;version="[2.5.3,3.0.0)"
+ 
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/synthetic-tccl/synthetic.tccl.global.jar b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/synthetic-tccl/synthetic.tccl.global.jar
new file mode 100644
index 0000000..9d8ea7e
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/synthetic-tccl/synthetic.tccl.global.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/synthetic-tccl/synthetic.tccl.par b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/synthetic-tccl/synthetic.tccl.par
new file mode 100644
index 0000000..d889540
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/synthetic-tccl/synthetic.tccl.par
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/tccltest.par b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/tccltest.par
new file mode 100644
index 0000000..0056f34
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/tccltest.par
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/test-refresh.properties b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/test-refresh.properties
new file mode 100644
index 0000000..011da3c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/test-refresh.properties
@@ -0,0 +1 @@
+alpha=bravo
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/test-with-par.plan b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/test-with-par.plan
new file mode 100644
index 0000000..f151fd2
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/test-with-par.plan
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="test.plan" version="1.0.0" scoped="false" atomic="true"
+		xmlns="http://www.eclipse.org/virgo/schema/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.eclipse.org/virgo/schema/plan 
+			http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+	<artifact type="par" name="par-deployed-by-plan" version="[1, 2)"/>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/test.plan b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/test.plan
new file mode 100644
index 0000000..59e936a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/test.plan
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="test.plan" version="1.0.0" scoped="true" atomic="true"
+		xmlns="http://www.eclipse.org/virgo/schema/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.eclipse.org/virgo/schema/plan 
+			http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+	<artifact type="bundle" name="simple.bundle.one" version="[1, 2)"/>
+	<artifact type="bundle" name="simple.bundle.two" version="[1, 2)"/>
+	<artifact type="configuration" name="com.foo.bar" version="[0,0]"/>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/test.properties b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/test.properties
new file mode 100644
index 0000000..74d0a43
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/test.properties
@@ -0,0 +1 @@
+foo=bar
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/testunscopedatomicA.plan b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/testunscopedatomicA.plan
new file mode 100644
index 0000000..b4fb8d9
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/testunscopedatomicA.plan
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="testA.plan" version="1.0.0" scoped="false" atomic="true"
+		xmlns="http://www.eclipse.org/virgo/schema/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.eclipse.org/virgo/schema/plan 
+			http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+	<artifact type="bundle" name="simple.bundle.one" version="[1, 2)"/>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/testunscopedatomicAparentofsharedplan.plan b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/testunscopedatomicAparentofsharedplan.plan
new file mode 100644
index 0000000..c0e7527
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/testunscopedatomicAparentofsharedplan.plan
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="testAParentAtomic.plan" version="1.0.0" scoped="false" atomic="true"
+		xmlns="http://www.eclipse.org/virgo/schema/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.eclipse.org/virgo/schema/plan 
+			http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+	<artifact type="plan" name="testAshared" version="[1, 2)"/>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/testunscopednonatomic.plan b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/testunscopednonatomic.plan
new file mode 100644
index 0000000..598b0bf
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/testunscopednonatomic.plan
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="test.plan" version="1.0.0" scoped="false" atomic="false"
+		xmlns="http://www.eclipse.org/virgo/schema/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.eclipse.org/virgo/schema/plan 
+			http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+	<artifact type="bundle" name="simple.bundle.one" version="[1, 2)"/>
+	<artifact type="bundle" name="simple.bundle.two" version="[1, 2)"/>
+	<artifact type="configuration" name="com.foo.bar" version="[0,0]"/>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/testunscopednonatomicA.plan b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/testunscopednonatomicA.plan
new file mode 100644
index 0000000..eeae16a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/testunscopednonatomicA.plan
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="testA.plan" version="1.0.0" scoped="false" atomic="false"
+		xmlns="http://www.eclipse.org/virgo/schema/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.eclipse.org/virgo/schema/plan 
+			http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+	<artifact type="bundle" name="simple.bundle.one" version="[1, 2)"/>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/testunscopednonatomicAparentofsharedplan.plan b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/testunscopednonatomicAparentofsharedplan.plan
new file mode 100644
index 0000000..d242ece
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/testunscopednonatomicAparentofsharedplan.plan
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="testAParent.plan" version="1.0.0" scoped="false" atomic="false"
+		xmlns="http://www.eclipse.org/virgo/schema/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.eclipse.org/virgo/schema/plan 
+			http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+	<artifact type="plan" name="testAshared" version="[1, 2)"/>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/testunscopednonatomicB.plan b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/testunscopednonatomicB.plan
new file mode 100644
index 0000000..b1fea68
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/testunscopednonatomicB.plan
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="testB.plan" version="1.0.0" scoped="false" atomic="false"
+		xmlns="http://www.eclipse.org/virgo/schema/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.eclipse.org/virgo/schema/plan 
+			http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+	<artifact type="bundle" name="simple.bundle.one" version="[1, 2)"/>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/testunscopednonatomicBparent.plan b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/testunscopednonatomicBparent.plan
new file mode 100644
index 0000000..4895685
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/testunscopednonatomicBparent.plan
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="testBparent.plan" version="1.0.0" scoped="false" atomic="false"
+		xmlns="http://www.eclipse.org/virgo/schema/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.eclipse.org/virgo/schema/plan 
+			http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+	<artifact type="plan" name="testA.plan" version="[1, 2)"/>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/testunscopednonatomicBparentofsharedplan.plan b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/testunscopednonatomicBparentofsharedplan.plan
new file mode 100644
index 0000000..4b5d079
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/testunscopednonatomicBparentofsharedplan.plan
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="testBparent.plan" version="1.0.0" scoped="false" atomic="false"
+		xmlns="http://www.eclipse.org/virgo/schema/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.eclipse.org/virgo/schema/plan 
+			http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+	<artifact type="plan" name="testAshared" version="[1, 2)"/>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/testunscopednonatomicC.plan b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/testunscopednonatomicC.plan
new file mode 100644
index 0000000..92fc05a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/testunscopednonatomicC.plan
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="testC.plan" version="1.0.0" scoped="false" atomic="false"
+		xmlns="http://www.eclipse.org/virgo/schema/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.eclipse.org/virgo/schema/plan 
+			http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+	<artifact type="bundle" name="simple.bundle.three" version="[1, 2)"/>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/testunscopednonatomicD.plan b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/testunscopednonatomicD.plan
new file mode 100644
index 0000000..6cf0f4e
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/testunscopednonatomicD.plan
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="testD.plan" version="1.0.0" scoped="false" atomic="false"
+		xmlns="http://www.eclipse.org/virgo/schema/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.eclipse.org/virgo/schema/plan 
+			http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+	<artifact type="bundle" name="simple.bundle.three" version="[1, 2)"/>
+
+</plan>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/testunscopednonatomicNested.plan b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/testunscopednonatomicNested.plan
new file mode 100644
index 0000000..1b7a4ee
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/testunscopednonatomicNested.plan
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="nestedPlansWithSharedBundle.plan" version="1.0.0" scoped="false" atomic="false"
+		xmlns="http://www.eclipse.org/virgo/schema/plan"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="
+			http://www.eclipse.org/virgo/schema/plan 
+			http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+	<artifact type="plan" name="simple.plan.one" version="[0, 2)"/>
+	<artifact type="plan" name="simple.plan.two" version="[0, 2)"/>
+
+</plan>
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/trace-config/app.jar b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/trace-config/app.jar
new file mode 100644
index 0000000..a312624
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/trace-config/app.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/trace-config/app.par b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/trace-config/app.par
new file mode 100644
index 0000000..ebd483d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/trace-config/app.par
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/transitiveconstraint/tmA.jar b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/transitiveconstraint/tmA.jar
new file mode 100644
index 0000000..55fe933
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/transitiveconstraint/tmA.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/transitiveconstraint/tmB.jar b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/transitiveconstraint/tmB.jar
new file mode 100644
index 0000000..0ad7b28
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/transitiveconstraint/tmB.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/transitiveconstraint/tmC.jar b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/transitiveconstraint/tmC.jar
new file mode 100644
index 0000000..aaf6e54
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/transitiveconstraint/tmC.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/transitiveconstraint/tmD.jar b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/transitiveconstraint/tmD.jar
new file mode 100644
index 0000000..b269ce3
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/transitiveconstraint/tmD.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/twoBundlesThatImportTheSameLibrary.par b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/twoBundlesThatImportTheSameLibrary.par
new file mode 100644
index 0000000..dc67c38
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/src/test/resources/twoBundlesThatImportTheSameLibrary.par
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.test/template.mf b/kernel/org.eclipse.virgo.kernel.deployer.test/template.mf
new file mode 100644
index 0000000..3cf8a6c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.test/template.mf
@@ -0,0 +1,9 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Virgo Kernel Deployer Test
+Bundle-SymbolicName: org.eclipse.virgo.kernel.deployer.test.loadable
+Bundle-Version: ${version}
+Excluded-Exports: 
+ *
+Excluded-Imports: 
+ *
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.testbundle/.settings/org.eclipse.virgo.ide.bundlor.core.prefs b/kernel/org.eclipse.virgo.kernel.deployer.testbundle/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
new file mode 100644
index 0000000..7b7f2b0
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.testbundle/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
@@ -0,0 +1,3 @@
+#Mon Jul 06 09:07:10 BST 2009
+org.eclipse.virgo.ide.bundlor.core.template.properties.files=../build.properties;../build.versions
+eclipse.preferences.version=1
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.testbundle/.settings/org.eclipse.wst.common.project.facet.core.xml b/kernel/org.eclipse.virgo.kernel.deployer.testbundle/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..92aa290
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.testbundle/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+  <installed facet="org.eclipse.virgo.server.bundle" version="1.0"/>
+</faceted-project>
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.testbundle/.springBeans b/kernel/org.eclipse.virgo.kernel.deployer.testbundle/.springBeans
new file mode 100644
index 0000000..34b281c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.testbundle/.springBeans
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beansProjectDescription>
+	<version>1</version>
+	<pluginVersion><![CDATA[2.3.0.200912170948-RELEASE]]></pluginVersion>
+	<configSuffixes>
+		<configSuffix><![CDATA[xml]]></configSuffix>
+	</configSuffixes>
+	<enableImports><![CDATA[false]]></enableImports>
+	<configs>
+	</configs>
+	<configSets>
+	</configSets>
+</beansProjectDescription>
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.testbundle/build.xml b/kernel/org.eclipse.virgo.kernel.deployer.testbundle/build.xml
new file mode 100644
index 0000000..846abdc
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.testbundle/build.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="org.eclipse.virgo.kernel.deployer.testbundle">
+
+	<property file="${basedir}/../build.properties"/>
+	<property file="${basedir}/../build.versions"/>
+	<import file="${basedir}/../virgo-build/standard/default.xml"/>
+
+</project>
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.testbundle/ivy.xml b/kernel/org.eclipse.virgo.kernel.deployer.testbundle/ivy.xml
new file mode 100644
index 0000000..d29bc85
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.testbundle/ivy.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ivy-module xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd" version="2.0">
+
+	<info organisation="${project.organisation}" module="${ant.project.name}"/>
+
+	<configurations>
+		<include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>
+	</configurations>
+
+	<publications>
+		<artifact name="${ant.project.name}"/>
+		<artifact name="${ant.project.name}-sources" type="src" ext="jar"/>
+	</publications>
+
+</ivy-module>
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.testbundle/src/main/java/.gitignore b/kernel/org.eclipse.virgo.kernel.deployer.testbundle/src/main/java/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.testbundle/src/main/java/.gitignore
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.testbundle/src/main/resources/META-INF/spring/deployer-testbundle-context.xml b/kernel/org.eclipse.virgo.kernel.deployer.testbundle/src/main/resources/META-INF/spring/deployer-testbundle-context.xml
new file mode 100644
index 0000000..742d43a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.testbundle/src/main/resources/META-INF/spring/deployer-testbundle-context.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans:beans xmlns="http://www.springframework.org/schema/osgi"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns:beans="http://www.springframework.org/schema/beans"
+	xsi:schemaLocation="http://www.springframework.org/schema/osgi  
+       http://www.springframework.org/schema/osgi/spring-osgi.xsd
+       http://www.springframework.org/schema/beans   
+       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
+
+</beans:beans>
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.testbundle/src/test/java/.gitignore b/kernel/org.eclipse.virgo.kernel.deployer.testbundle/src/test/java/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.testbundle/src/test/java/.gitignore
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.testbundle/src/test/resources/suppresswarning/.gitignore b/kernel/org.eclipse.virgo.kernel.deployer.testbundle/src/test/resources/suppresswarning/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.testbundle/src/test/resources/suppresswarning/.gitignore
diff --git a/kernel/org.eclipse.virgo.kernel.deployer.testbundle/template.mf b/kernel/org.eclipse.virgo.kernel.deployer.testbundle/template.mf
new file mode 100644
index 0000000..e3331f2
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer.testbundle/template.mf
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Virgo Kernel Deployer Test Bundle
+Bundle-SymbolicName: org.eclipse.virgo.kernel.deployer.testbundle
+Bundle-Version: ${version}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/.settings/org.eclipse.virgo.ide.bundlor.core.prefs b/kernel/org.eclipse.virgo.kernel.deployer/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
new file mode 100644
index 0000000..67700c2
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
@@ -0,0 +1,3 @@
+#Mon Jul 06 09:07:54 BST 2009
+org.eclipse.virgo.ide.bundlor.core.template.properties.files=../build.properties;../build.versions
+eclipse.preferences.version=1
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/.settings/org.eclipse.wst.common.project.facet.core.xml b/kernel/org.eclipse.virgo.kernel.deployer/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..92aa290
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+  <installed facet="org.eclipse.virgo.server.bundle" version="1.0"/>
+</faceted-project>
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/.settings/org.springframework.ide.eclipse.beans.core.prefs b/kernel/org.eclipse.virgo.kernel.deployer/.settings/org.springframework.ide.eclipse.beans.core.prefs
new file mode 100644
index 0000000..4fde268
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/.settings/org.springframework.ide.eclipse.beans.core.prefs
@@ -0,0 +1,3 @@
+#Wed Jul 22 12:03:46 BST 2009
+eclipse.preferences.version=1
+org.springframework.ide.eclipse.beans.core.ignoreMissingNamespaceHandler=false
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/.settings/org.springframework.ide.eclipse.core.prefs b/kernel/org.eclipse.virgo.kernel.deployer/.settings/org.springframework.ide.eclipse.core.prefs
new file mode 100644
index 0000000..aebc2e4
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/.settings/org.springframework.ide.eclipse.core.prefs
@@ -0,0 +1,67 @@
+#Thu Aug 20 10:13:09 BST 2009
+eclipse.preferences.version=1
+org.springframework.ide.eclipse.core.builders.enable.aopreferencemodelbuilder=true
+org.springframework.ide.eclipse.core.builders.enable.beanmetadatabuilder=true
+org.springframework.ide.eclipse.core.builders.enable.osgibundleupdater=true
+org.springframework.ide.eclipse.core.enable.project.preferences=true
+org.springframework.ide.eclipse.core.validator.enable.com.springsource.server.ide.manifest.core.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.enable.com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.enable.com.springsource.sts.server.quickfix.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.enable.org.springframework.ide.eclipse.beans.core.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.enable.org.springframework.ide.eclipse.core.springvalidator=false
+org.springframework.ide.eclipse.core.validator.enable.org.springframework.ide.eclipse.webflow.core.validator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.applicationSymbolicNameRule-com.springsource.server.ide.manifest.core.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.applicationVersionRule-com.springsource.server.ide.manifest.core.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleActivationPolicyRule-com.springsource.server.ide.manifest.core.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleActivatorRule-com.springsource.server.ide.manifest.core.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleManifestVersionRule-com.springsource.server.ide.manifest.core.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleNameRule-com.springsource.server.ide.manifest.core.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleSymbolicNameRule-com.springsource.server.ide.manifest.core.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleVersionRule-com.springsource.server.ide.manifest.core.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.exportPackageRule-com.springsource.server.ide.manifest.core.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.importRule-com.springsource.server.ide.manifest.core.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.parsingProblemsRule-com.springsource.server.ide.manifest.core.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.requireBundleRule-com.springsource.server.ide.manifest.core.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.AvoidDriverManagerDataSource-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.ImportElementsAtTopRulee-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.ParentBeanSpecifiesAbstractClassRule-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.RefElementRule-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.TooManyBeansInFileRule-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.UnnecessaryValueElementRule-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.UseBeanInheritance-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.legacyxmlusage.jndiobjectfactory-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.importBundleVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.importLibraryVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.importPackageVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.requireBundleVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanAlias-org.springframework.ide.eclipse.beans.core.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanClass-org.springframework.ide.eclipse.beans.core.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanConstructorArgument-org.springframework.ide.eclipse.beans.core.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanDefinition-org.springframework.ide.eclipse.beans.core.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanDefinitionHolder-org.springframework.ide.eclipse.beans.core.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanFactory-org.springframework.ide.eclipse.beans.core.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanInitDestroyMethod-org.springframework.ide.eclipse.beans.core.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanProperty-org.springframework.ide.eclipse.beans.core.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanReference-org.springframework.ide.eclipse.beans.core.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.methodOverride-org.springframework.ide.eclipse.beans.core.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.parsingProblems-org.springframework.ide.eclipse.beans.core.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.requiredProperty-org.springframework.ide.eclipse.beans.core.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.core.springClasspath-org.springframework.ide.eclipse.core.springvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.action-org.springframework.ide.eclipse.webflow.core.validator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.actionstate-org.springframework.ide.eclipse.webflow.core.validator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.attribute-org.springframework.ide.eclipse.webflow.core.validator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.attributemapper-org.springframework.ide.eclipse.webflow.core.validator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.beanaction-org.springframework.ide.eclipse.webflow.core.validator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.evaluationaction-org.springframework.ide.eclipse.webflow.core.validator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.evaluationresult-org.springframework.ide.eclipse.webflow.core.validator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.exceptionhandler-org.springframework.ide.eclipse.webflow.core.validator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.import-org.springframework.ide.eclipse.webflow.core.validator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.inputattribute-org.springframework.ide.eclipse.webflow.core.validator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.mapping-org.springframework.ide.eclipse.webflow.core.validator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.outputattribute-org.springframework.ide.eclipse.webflow.core.validator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.set-org.springframework.ide.eclipse.webflow.core.validator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.state-org.springframework.ide.eclipse.webflow.core.validator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.subflowstate-org.springframework.ide.eclipse.webflow.core.validator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.transition-org.springframework.ide.eclipse.webflow.core.validator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.variable-org.springframework.ide.eclipse.webflow.core.validator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.webflowstate-org.springframework.ide.eclipse.webflow.core.validator=false
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/.springBeans b/kernel/org.eclipse.virgo.kernel.deployer/.springBeans
new file mode 100644
index 0000000..4dbe37b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/.springBeans
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beansProjectDescription>
+	<version>1</version>
+	<pluginVersion><![CDATA[2.2.7.200910202224-RELEASE]]></pluginVersion>
+	<configSuffixes>
+		<configSuffix><![CDATA[xml]]></configSuffix>
+	</configSuffixes>
+	<enableImports><![CDATA[false]]></enableImports>
+	<configs>
+	</configs>
+	<configSets>
+	</configSets>
+</beansProjectDescription>
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/findbugs-exclude.xml b/kernel/org.eclipse.virgo.kernel.deployer/findbugs-exclude.xml
new file mode 100644
index 0000000..9bbf399
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/findbugs-exclude.xml
@@ -0,0 +1,8 @@
+<FindBugsFilter>
+     <!-- Exclusions -->
+     <Match>
+       	<Bug pattern="ES_COMPARING_PARAMETER_STRING_WITH_EQ"/>
+        <Class name="org.eclipse.virgo.kernel.deployer.core.module.StandardModule"/>
+        <Method name="unwrapNull"/>
+     </Match>	
+</FindBugsFilter>
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/event/ApplicationBundleDeployed.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/event/ApplicationBundleDeployed.java
new file mode 100644
index 0000000..2ad11d8
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/event/ApplicationBundleDeployed.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core.event;
+
+import org.osgi.framework.Bundle;
+
+import org.osgi.framework.Version;
+
+
+/**
+ * {@link ApplicationBundleDeployed} is an event which is broadcast when an application bundle has been successfully deployed.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * This class is immutable and therefore thread safe.
+ *
+ */
+public class ApplicationBundleDeployed extends ApplicationBundleDeploymentEvent {
+
+    /**
+     * Construct a {@link ApplicationBundleDeployed} event with the given application symbolic name and version.
+     * 
+     * @param applicationSymbolicName of bundle
+     * @param applicationVersion of bundle
+     * @param bundle object deployed
+     */
+    public ApplicationBundleDeployed(String applicationSymbolicName, Version applicationVersion, Bundle bundle) {
+        super(applicationSymbolicName, applicationVersion, bundle);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/event/ApplicationBundleDeploying.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/event/ApplicationBundleDeploying.java
new file mode 100644
index 0000000..5506980
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/event/ApplicationBundleDeploying.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core.event;
+
+import org.osgi.framework.Bundle;
+
+import org.osgi.framework.Version;
+
+
+/**
+ * {@link ApplicationBundleDeploying} is an event which is broadcast when an application bundle is about to be deployed.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * This class is immutable and therefore thread safe.
+ *
+ */
+public class ApplicationBundleDeploying extends ApplicationBundleDeploymentEvent {
+
+    /**
+     * Construct a {@link ApplicationBundleDeploying} event with the given application symbolic name and version.
+     * 
+     * @param applicationSymbolicName of bundle
+     * @param applicationVersion of bundle
+     * @param bundle object deploying
+     */
+    public ApplicationBundleDeploying(String applicationSymbolicName, Version applicationVersion, Bundle bundle) {
+        super(applicationSymbolicName, applicationVersion, bundle);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/event/ApplicationBundleDeploymentEvent.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/event/ApplicationBundleDeploymentEvent.java
new file mode 100644
index 0000000..4c38f09
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/event/ApplicationBundleDeploymentEvent.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core.event;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.Version;
+
+/**
+ * {@link ApplicationBundleDeploymentEvent} is the base class for all events relating to deployment of bundles of
+ * applications.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is immutable and therefore thread safe.
+ * 
+ */
+public abstract class ApplicationBundleDeploymentEvent extends ApplicationDeploymentEvent {
+
+    private final Bundle bundle;
+
+    /**
+     * Construct a {@link ApplicationBundleDeploymentEvent} event with the given application symbolic name, application
+     * version, and bundle.
+     * 
+     * @param applicationSymbolicName
+     * @param applicationVersion
+     */
+    protected ApplicationBundleDeploymentEvent(String applicationSymbolicName, Version applicationVersion, Bundle bundle) {
+        super(applicationSymbolicName, applicationVersion);
+        this.bundle = bundle;
+    }
+
+    /**
+     * Get this event's {@link Bundle}.
+     * 
+     * @return the bundle
+     */
+    public Bundle getBundle() {
+        return this.bundle;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override public String toString() {
+        return this.getClass().getName() + " for bundle " + this.bundle.getSymbolicName() + " of application " + this.getApplicationSymbolicName()
+            + " version " + this.getApplicationVersion();
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/event/ApplicationBundleStarted.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/event/ApplicationBundleStarted.java
new file mode 100644
index 0000000..2ddf6be
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/event/ApplicationBundleStarted.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core.event;
+
+import org.osgi.framework.Bundle;
+
+import org.osgi.framework.Version;
+
+
+/**
+ * {@link ApplicationBundleStarted} is an event which is broadcast when an application bundle has been started.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * This class is immutable and therefore thread safe.
+ *
+ */
+public class ApplicationBundleStarted extends ApplicationBundleDeploymentEvent {
+
+    /**
+     * Construct a {@link ApplicationBundleStarted} event with the given application symbolic name and version.
+     * 
+     * @param applicationSymbolicName of bundle
+     * @param applicationVersion of bundle
+     * @param bundle object started
+     */
+    public ApplicationBundleStarted(String applicationSymbolicName, Version applicationVersion, Bundle bundle) {
+        super(applicationSymbolicName, applicationVersion, bundle);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/event/ApplicationBundleStarting.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/event/ApplicationBundleStarting.java
new file mode 100644
index 0000000..bf8d800
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/event/ApplicationBundleStarting.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core.event;
+
+import org.osgi.framework.Bundle;
+
+import org.osgi.framework.Version;
+
+
+/**
+ * {@link ApplicationBundleStarting} is an event which is broadcast when an application bundle is being started.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * This class is immutable and therefore thread safe.
+ *
+ */
+public class ApplicationBundleStarting extends ApplicationBundleDeploymentEvent {
+
+    /**
+     * Construct a {@link ApplicationBundleStarting} event with the given application symbolic name and version.
+     * 
+     * @param applicationSymbolicName of bundle
+     * @param applicationVersion of bundle
+     * @param bundle object starting
+     */
+    public ApplicationBundleStarting(String applicationSymbolicName, Version applicationVersion, Bundle bundle) {
+        super(applicationSymbolicName, applicationVersion, bundle);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/event/ApplicationBundleStopped.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/event/ApplicationBundleStopped.java
new file mode 100644
index 0000000..41653de
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/event/ApplicationBundleStopped.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core.event;
+
+import org.osgi.framework.Bundle;
+
+import org.osgi.framework.Version;
+
+
+/**
+ * {@link ApplicationBundleStopped} is an event which is broadcast when an application bundle has been stopped.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * This class is immutable and therefore thread safe.
+ *
+ */
+public class ApplicationBundleStopped extends ApplicationBundleDeploymentEvent {
+
+    /**
+     * Construct a {@link ApplicationBundleStopped} event with the given application symbolic name and version.
+     * 
+     * @param applicationSymbolicName of bundle
+     * @param applicationVersion of bundle
+     * @param bundle object stopped
+     */
+    public ApplicationBundleStopped(String applicationSymbolicName, Version applicationVersion, Bundle bundle) {
+        super(applicationSymbolicName, applicationVersion, bundle);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/event/ApplicationBundleStopping.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/event/ApplicationBundleStopping.java
new file mode 100644
index 0000000..563b328
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/event/ApplicationBundleStopping.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core.event;
+
+import org.osgi.framework.Bundle;
+
+import org.osgi.framework.Version;
+
+
+/**
+ * {@link ApplicationBundleStopping} is an event which is broadcast when an application bundle is being stopped.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * This class is immutable and therefore thread safe.
+ *
+ */
+public class ApplicationBundleStopping extends ApplicationBundleDeploymentEvent {
+
+    /**
+     * Construct a {@link ApplicationBundleStopping} event with the given application symbolic name and version.
+     * 
+     * @param applicationSymbolicName of bundle
+     * @param applicationVersion of bundle
+     * @param bundle object stopping
+     */
+    public ApplicationBundleStopping(String applicationSymbolicName, Version applicationVersion, Bundle bundle) {
+        super(applicationSymbolicName, applicationVersion, bundle);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/event/ApplicationBundleUndeployed.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/event/ApplicationBundleUndeployed.java
new file mode 100644
index 0000000..8554ccf
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/event/ApplicationBundleUndeployed.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core.event;
+
+import org.osgi.framework.Bundle;
+
+import org.osgi.framework.Version;
+
+
+/**
+ * {@link ApplicationBundleUndeployed} is an event which is broadcast when an application bundle has been undeployed.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * This class is immutable and therefore thread safe.
+ *
+ */
+public class ApplicationBundleUndeployed extends ApplicationBundleDeploymentEvent {
+
+    /**
+     * Construct a {@link ApplicationBundleUndeployed} event with the given application symbolic name and version.
+     * 
+     * @param applicationSymbolicName of bundle
+     * @param applicationVersion of bundle
+     * @param bundle object undeployed
+     */
+    public ApplicationBundleUndeployed(String applicationSymbolicName, Version applicationVersion, Bundle bundle) {
+        super(applicationSymbolicName, applicationVersion, bundle);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/event/ApplicationBundleUndeploying.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/event/ApplicationBundleUndeploying.java
new file mode 100644
index 0000000..6f0f0c2
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/event/ApplicationBundleUndeploying.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core.event;
+
+import org.osgi.framework.Bundle;
+
+import org.osgi.framework.Version;
+
+
+/**
+ * {@link ApplicationBundleUndeploying} is an event which is broadcast when an application bundle is about to be undeployed.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * This class is immutable and therefore thread safe.
+ *
+ */
+public class ApplicationBundleUndeploying extends ApplicationBundleDeploymentEvent {
+
+    /**
+     * Construct a {@link ApplicationBundleUndeploying} event with the given application symbolic name and version.
+     * 
+     * @param applicationSymbolicName of bundle
+     * @param applicationVersion of bundle
+     * @param bundle object un-deploying
+     */
+    public ApplicationBundleUndeploying(String applicationSymbolicName, Version applicationVersion, Bundle bundle) {
+        super(applicationSymbolicName, applicationVersion, bundle);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/event/ApplicationDeployed.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/event/ApplicationDeployed.java
new file mode 100644
index 0000000..82d36db
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/event/ApplicationDeployed.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core.event;
+
+import org.osgi.framework.Version;
+
+
+/**
+ * {@link ApplicationDeployed} is an event which is broadcast when an application has been successfully deployed.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * This class is immutable and therefore thread safe.
+ *
+ */
+public class ApplicationDeployed extends ApplicationDeploymentEvent {
+
+    /**
+     * Construct a {@link ApplicationDeployed} event with the given application symbolic name and version.
+     * 
+     * @param applicationSymbolicName
+     * @param applicationVersion
+     */
+    public ApplicationDeployed(String applicationSymbolicName, Version applicationVersion) {
+        super(applicationSymbolicName, applicationVersion);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/event/ApplicationDeploying.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/event/ApplicationDeploying.java
new file mode 100644
index 0000000..65aaa84
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/event/ApplicationDeploying.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core.event;
+
+import org.osgi.framework.Version;
+
+
+/**
+ * {@link ApplicationDeploying} is an event which is broadcast when an application is about to be deployed.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * This class is immutable and therefore thread safe.
+ *
+ */
+public class ApplicationDeploying extends ApplicationDeploymentEvent {
+
+    /**
+     * Construct a {@link ApplicationDeploying} event with the given application symbolic name and version.
+     * 
+     * @param applicationSymbolicName
+     * @param applicationVersion
+     */
+    public ApplicationDeploying(String applicationSymbolicName, Version applicationVersion) {
+        super(applicationSymbolicName, applicationVersion);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/event/ApplicationDeploymentEvent.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/event/ApplicationDeploymentEvent.java
new file mode 100644
index 0000000..512a0da
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/event/ApplicationDeploymentEvent.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core.event;
+
+import org.osgi.framework.Version;
+
+/**
+ * {@link ApplicationDeploymentEvent} is the base class for all events relating to deployment of applications and
+ * modules of applications.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is immutable and therefore thread safe.
+ * 
+ */
+public abstract class ApplicationDeploymentEvent {
+
+    private final String applicationSymbolicName;
+
+    private final Version applicationVersion;
+
+    /**
+     * Construct a new {@link ApplicationDeploymentEvent} with the given application name and version.
+     * 
+     * @param applicationSymbolicName the symbolic name of the application
+     * @param applicationVersion the version of the application
+     */
+    protected ApplicationDeploymentEvent(String applicationSymbolicName, Version applicationVersion) {
+        this.applicationSymbolicName = applicationSymbolicName;
+        this.applicationVersion = applicationVersion;
+    }
+
+    /**
+     * Get the symbolic name of this event's application.
+     * 
+     * @return the application symbolic name
+     */
+    public String getApplicationSymbolicName() {
+        return applicationSymbolicName;
+    }
+
+    /**
+     * Get the version of this event's application.
+     * 
+     * @return the application version
+     */
+    public Version getApplicationVersion() {
+        return applicationVersion;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override public String toString() {
+        return this.getClass().getName() + " for application " + this.applicationSymbolicName + " version " + this.applicationVersion;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/event/ApplicationDeploymentEventNotifier.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/event/ApplicationDeploymentEventNotifier.java
new file mode 100644
index 0000000..18ad815
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/event/ApplicationDeploymentEventNotifier.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core.event;
+
+import java.util.Set;
+
+import org.osgi.framework.Bundle;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * {@link ApplicationDeploymentEventNotifier} is used by the deployer to notify all {@link DeploymentListener
+ * ApplicationDeploymentListeners} of an application deployment event.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+class ApplicationDeploymentEventNotifier implements DeploymentListener {
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private final Set<DeploymentListener> listeners;
+
+    /**
+     * Construct an {@link ApplicationDeploymentEventNotifier} for the given set of listeners. The given set will be
+     * modified externally to this class as listeners come and go.
+     * 
+     * @param listeners the listeners to be notified
+     */
+    ApplicationDeploymentEventNotifier(Set<DeploymentListener> listeners) {
+        this.listeners = listeners;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onEvent(ApplicationDeploymentEvent event) {
+        Bundle bundle = null;
+        if (event instanceof ApplicationBundleDeploymentEvent) {
+            bundle = ((ApplicationBundleDeploymentEvent) event).getBundle();
+        }
+
+        if (bundle == null) {
+            logger.info("Delivering '{}' for application '{}' version '{}' to application deployment listeners", new Object[] {
+                event.getClass().getName(), event.getApplicationSymbolicName(), event.getApplicationVersion() });
+        } else {
+            logger.info("Delivering '{}' for bundle '{}' of application '{}' version '{}' to application deployment listeners", new Object[] {
+                event.getClass().getName(), bundle.getSymbolicName(), event.getApplicationSymbolicName(), event.getApplicationVersion() });
+        }
+
+        for (DeploymentListener listener : listeners) {
+            try {
+                listener.onEvent(event);
+            } catch (RuntimeException e) {
+                // Trace and ignore the exception.
+                logger.error("Application deployment listener '{}' threw exception", e, listener);
+            }
+        }
+
+        if (bundle == null) {
+            logger.info("Delivered '{}' for application '%s' version '{}' to application deployment listeners", new Object[] {
+                event.getClass().getName(), event.getApplicationSymbolicName(), event.getApplicationVersion() });
+        } else {
+            logger.info("Delivered '{}' for bundle '{}' of application '{}' version '{}' to application deployment listeners", new Object[] {
+                event.getClass().getName(), bundle.getSymbolicName(), event.getApplicationSymbolicName(), event.getApplicationVersion() });
+        }
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/event/ApplicationUndeployed.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/event/ApplicationUndeployed.java
new file mode 100644
index 0000000..960e805
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/event/ApplicationUndeployed.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core.event;
+
+import org.osgi.framework.Version;
+
+
+/**
+ * {@link ApplicationUndeployed} is an event which is broadcast when an application has been undeployed.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * This class is immutable and therefore thread safe.
+ *
+ */
+public class ApplicationUndeployed extends ApplicationDeploymentEvent {
+
+    /**
+     * Construct a {@link ApplicationUndeployed} event with the given application symbolic name and version.
+     * 
+     * @param applicationSymbolicName
+     * @param applicationVersion
+     */
+    public ApplicationUndeployed(String applicationSymbolicName, Version applicationVersion) {
+        super(applicationSymbolicName, applicationVersion);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/event/ApplicationUndeploying.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/event/ApplicationUndeploying.java
new file mode 100644
index 0000000..2b43ef5
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/event/ApplicationUndeploying.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core.event;
+
+import org.osgi.framework.Version;
+
+
+/**
+ * {@link ApplicationUndeploying} is an event which is broadcast when an application is about to be undeployed.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * This class is immutable and therefore thread safe.
+ *
+ */
+public class ApplicationUndeploying extends ApplicationDeploymentEvent {
+
+    /**
+     * Construct a {@link ApplicationUndeploying} event with the given application symbolic name and version.
+     * 
+     * @param applicationSymbolicName
+     * @param applicationVersion
+     */
+    public ApplicationUndeploying(String applicationSymbolicName, Version applicationVersion) {
+        super(applicationSymbolicName, applicationVersion);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/event/DeploymentListener.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/event/DeploymentListener.java
new file mode 100644
index 0000000..77a96d3
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/event/DeploymentListener.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core.event;
+
+/**
+ * {@link DeploymentListener} is used to listen for events relating to application deployment.
+ * <p />
+ * Application wide events extend {@link ApplicationDeploymentEvent} and are delivered synchronously by the thread which
+ * initiated deployment.
+ * <p />
+ * Events for specific bundles of an application extend {@link ApplicationBundleDeploymentEvent} and may be delivered
+ * during deployment or undeployment of the application or refresh of a bundle of the application.
+ * <p />
+ * Users of this interface should simply publish an object that implements this interface to the OSGi service registry.
+ * <p />
+ * 
+ * @see ApplicationDeploymentEvent
+ * @see ApplicationBundleDeploymentEvent
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations of this interface must be thread safe.
+ * 
+ */
+public interface DeploymentListener {
+
+    /**
+     * Notify an {@link ApplicationDeploymentEvent}.
+     * 
+     * @param event the event being notified
+     */
+    void onEvent(ApplicationDeploymentEvent event);
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/AbortableSignalJunction.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/AbortableSignalJunction.java
new file mode 100644
index 0000000..252847e
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/AbortableSignalJunction.java
@@ -0,0 +1,173 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core.internal;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.eclipse.virgo.nano.core.AbortableSignal;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * {@link AbortableSignalJunction} provides a collection of signals of a given size that join to drive a given signal. The given
+ * signal is driven for completion when any of the signals in the collection is driven for failure or all the signals in
+ * the collection are driven for successful completion. The given signal is driven at most once.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+public final class AbortableSignalJunction {
+	
+	private static final Logger LOGGER = LoggerFactory.getLogger(AbortableSignalJunction.class);
+
+    private final AbortableSignal signal;
+
+    private final List<AbortableSignal> subSignals;
+
+    private final AtomicInteger incompleteCount;
+
+    private final AtomicBoolean failureSignalled = new AtomicBoolean(false);
+    
+    private final AtomicBoolean abortionSignalled = new AtomicBoolean(false);
+
+    /**
+     * Constructs a {@link AbortableSignalJunction} of the given size for the given signal.
+     * 
+     * @param signal the signal to be controlled
+     * @param size the number of signals in the collection
+     */
+    public AbortableSignalJunction(AbortableSignal signal, int size) {
+        this.signal = signal;
+        List<AbortableSignal> s = new ArrayList<AbortableSignal>();
+        for (int i = 0; i < size; i++) {
+            s.add(new SubSignal());
+        }
+        this.subSignals = Collections.unmodifiableList(s);
+        this.incompleteCount = new AtomicInteger(size);
+        if (size <= 0) {
+            if (this.signal != null) {
+                this.signal.signalSuccessfulCompletion();
+            }
+        }
+    }
+
+    /**
+     * Gets the signals in the collection.
+     * 
+     * @return an unmodifiable {@link Set} of signals in the collection
+     */
+    public List<AbortableSignal> getSignals() {
+        return this.subSignals;
+    }
+    
+    public boolean failed() {
+        return this.failureSignalled.get();
+    }
+    
+    public boolean aborted() {
+        return this.abortionSignalled.get();
+    }
+    
+    private void subSignalFailed(Throwable cause) {
+        // Ensure the incomplete count is zero.
+        int i = AbortableSignalJunction.this.incompleteCount.get();
+        
+        LOGGER.debug("SubSignal failed. {} has {} incomplete signals", this, i);
+        
+        while (i > 0 && !AbortableSignalJunction.this.incompleteCount.compareAndSet(i, 0)) {
+            i = AbortableSignalJunction.this.incompleteCount.get();
+        }
+
+        // If this invocation took the count to zero, drive failure.
+        if (i > 0) {
+            if (AbortableSignalJunction.this.signal != null) {
+            	LOGGER.debug("{} signalling failure", this);
+                AbortableSignalJunction.this.signal.signalFailure(cause);
+                this.failureSignalled.set(true);
+            }
+        }
+    }
+
+    private void subSignalAborted() {
+        // Ensure the incomplete count is zero.
+        int i = AbortableSignalJunction.this.incompleteCount.get();
+        
+        LOGGER.debug("SubSignal aborted. {} has {} incomplete signals", this, i);
+        
+        while (i > 0 && !AbortableSignalJunction.this.incompleteCount.compareAndSet(i, 0)) {
+            i = AbortableSignalJunction.this.incompleteCount.get();
+        }
+
+        // If this invocation took the count to zero, drive failure.
+        if (i > 0) {
+            if (AbortableSignalJunction.this.signal != null) {
+            	LOGGER.debug("{} signalling aborted", this);
+                AbortableSignalJunction.this.signal.signalAborted();
+                this.abortionSignalled.set(true);
+            }
+        }
+    }
+
+    private void subSignalSucceeded() {
+        // Decrement the incomplete count.
+        int incomplete = AbortableSignalJunction.this.incompleteCount.decrementAndGet();
+        
+        LOGGER.debug("SubSignal succeeded. {} now has {} incomplete signals", this, incomplete);
+        
+		if (incomplete == 0) {
+            // If this invocation took the count to zero, drive successful completion.
+            if (AbortableSignalJunction.this.signal != null) {
+            	LOGGER.debug("{} has no incomplete signals. Signalling success", this);
+                AbortableSignalJunction.this.signal.signalSuccessfulCompletion();
+            }
+        }
+    }
+
+    /**
+     * {@link SubSignal} is a signal that reports completion to its {@link AbortableSignalJunction} once and only once.
+     * 
+     */
+    private class SubSignal implements AbortableSignal {
+
+        private final AtomicBoolean complete = new AtomicBoolean(false);
+
+        public void signalFailure(Throwable cause) {
+            if (this.complete.compareAndSet(false, true)) {
+            	LOGGER.debug("SubSignal {} signalling failure", this);
+                subSignalFailed(cause);
+            }
+        }
+
+        public void signalSuccessfulCompletion() {
+            if (this.complete.compareAndSet(false, true)) {
+            	LOGGER.debug("SubSignal {} signalling success", this);
+                subSignalSucceeded();
+            }
+        }
+
+		public void signalAborted() {
+            if (this.complete.compareAndSet(false, true)) {
+            	LOGGER.debug("SubSignal {} signalling abortion", this);
+                subSignalAborted();
+            }
+		}
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/ApplicationRecoverer.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/ApplicationRecoverer.java
new file mode 100644
index 0000000..6a042be
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/ApplicationRecoverer.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core.internal;
+
+import java.net.URI;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentOptions;
+
+
+/**
+ * {@link ApplicationRecoverer} is an interface to an {@link org.eclipse.virgo.nano.deployer.api.core.ApplicationDeployer ApplicationDeployer} 
+ * intended only for use by the recovery agent.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Implementations of this interface must be thread safe.
+ *
+ */
+public interface ApplicationRecoverer {
+
+    /**
+     * Redeploy the artifact that was originally deployed from the given URI.
+     * 
+     * @param location URI of artifact
+     * @param options the {@link DeploymentOptions} of the artifact
+     * @throws DeploymentException 
+     */
+    void recoverDeployment(URI location, DeploymentOptions options) throws DeploymentException;
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/ArtefactNotFoundException.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/ArtefactNotFoundException.java
new file mode 100644
index 0000000..154972a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/ArtefactNotFoundException.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core.internal;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+
+
+/**
+ * Thrown when an artefact is not found, i.e. the artefact does not exist.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Thread-safe.
+ * 
+ */
+public final class ArtefactNotFoundException extends DeploymentException {
+
+    private static final long serialVersionUID = 7374184559342205863L;
+    
+    /**
+     * @param message The exception's message
+     */
+    public ArtefactNotFoundException(String message) {
+        super(message);
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/BlockingAbortableSignal.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/BlockingAbortableSignal.java
new file mode 100644
index 0000000..dcc4d2e
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/BlockingAbortableSignal.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.virgo.kernel.deployer.core.internal;
+
+import org.eclipse.virgo.nano.core.AbortableSignal;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+
+
+/**
+ * <p>
+ * A <code>Signal</code> implementation that blocks until notified of completion or abortion.
+ * </p>
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Thread-safe.
+ *
+ */
+public final class BlockingAbortableSignal implements AbortableSignal {
+
+	private final BlockingSignal blockingSignal;
+	
+	private boolean aborted = false;
+	
+	public BlockingAbortableSignal(boolean synchronous) {
+		this.blockingSignal = new BlockingSignal(synchronous);
+	}
+	
+    /**
+     * {@inheritDoc}
+     */
+	public void signalSuccessfulCompletion() {
+		this.blockingSignal.signalSuccessfulCompletion();
+	}
+
+    /**
+     * {@inheritDoc}
+     */
+	public void signalFailure(Throwable cause) {
+		this.blockingSignal.signalFailure(cause);
+	}
+
+    /**
+     * {@inheritDoc}
+     */
+	public void signalAborted() {
+		this.aborted = true;
+	}
+
+	public boolean isAborted(){
+		return this.aborted;
+	}
+	
+	public boolean awaitCompletion(long timeInSeconds) throws DeploymentException {
+		return this.blockingSignal.awaitCompletion(timeInSeconds);
+	}
+
+	public boolean checkComplete() throws DeploymentException {
+		boolean complete = this.blockingSignal.checkComplete();
+		if(this.aborted){
+			return false;
+		}
+		return complete;
+	}
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/BlockingSignal.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/BlockingSignal.java
new file mode 100644
index 0000000..d5dacbf
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/BlockingSignal.java
@@ -0,0 +1,121 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core.internal;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.virgo.nano.core.Signal;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+
+
+/**
+ * {@link BlockingSignal} is a {@link Signal} that blocks until complete.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * This class is thread safe.
+ *
+ */
+public final class BlockingSignal implements Signal {
+
+    private Object monitor = new Object();
+
+    private final CountDownLatch latch = new CountDownLatch(1);
+
+    private boolean complete = false;
+
+    private Throwable cause = null;
+
+    private final boolean block;
+
+    public BlockingSignal(boolean block) {
+        this.block = block;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void signalFailure(Throwable cause) {
+        synchronized (this.monitor) {
+            this.complete = true;
+            this.cause = cause;
+            latch.countDown();
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void signalSuccessfulCompletion() {
+        synchronized (this.monitor) {
+            this.complete = true;
+            latch.countDown();
+        }
+    }
+
+    public boolean awaitCompletion(long timeInSeconds) throws DeploymentException {
+        if (this.block) {
+            try {
+                this.latch.await(timeInSeconds, TimeUnit.SECONDS);
+            } catch (InterruptedException i) {
+                throw new DeploymentException("latch await interrupted", i);
+            }
+        }
+        synchronized (this.monitor) {
+            if (!complete) {
+                return false;
+            } else {
+                if (this.cause == null) {
+                    return true;
+                } else {
+                    try {
+                        throw this.cause;
+                    } catch (DeploymentException de) {
+                        throw de;
+                    } catch (Throwable t) {
+                        throw new DeploymentException(t.getMessage(), t.getCause());
+                    }
+                }
+            }
+        }
+    }
+    
+    public boolean checkComplete() throws DeploymentException {
+        if (this.block) {
+            try {
+                this.latch.await();
+            } catch (InterruptedException i) {
+                throw new DeploymentException("latch await interrupted", i);
+            }
+        }
+        synchronized (this.monitor) {
+            if (!complete) {
+                return false;
+            } else {
+                if (this.cause == null) {
+                    return true;
+                } else {
+                    try {
+                        throw this.cause;
+                    } catch (DeploymentException de) {
+                        throw de;
+                    } catch (Throwable t) {
+                        throw new DeploymentException(t.getMessage(), t.getCause());
+                    }
+                }
+            }
+        }
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/BundleDeploymentPropertiesTransformer.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/BundleDeploymentPropertiesTransformer.java
new file mode 100644
index 0000000..4badf7b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/BundleDeploymentPropertiesTransformer.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core.internal;
+
+import java.io.IOException;
+import java.util.Map;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.BundleInstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.environment.InstallEnvironment;
+import org.eclipse.virgo.kernel.install.pipeline.stage.transform.Transformer;
+import org.eclipse.virgo.util.common.GraphNode;
+import org.eclipse.virgo.util.common.GraphNode.ExceptionThrowingDirectedAcyclicGraphVisitor;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+
+/**
+ * {@link Transformer} implementation that converts deployment properties on bundle artifacts into the corresponding
+ * manifest headers.
+ * <p/>
+ * Any deployment property with a key prefixed by <code>header:</code> will be treated a as bundle header.
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ * 
+ */
+final class BundleDeploymentPropertiesTransformer implements Transformer {
+
+    private static final String HEADER_PREFIX = "header:";
+
+    public void transform(GraphNode<InstallArtifact> installGraph, InstallEnvironment installEnvironment) throws DeploymentException {
+        installGraph.visit(new Visitor());
+    }
+
+    private void doTransformBundleArtifact(BundleInstallArtifact value, Map<String, String> deploymentProperties) throws IOException {
+        BundleManifest manifest = value.getBundleManifest();
+        
+        for(Map.Entry<String, String> entries : deploymentProperties.entrySet()) {
+            String headerName = convertToHeaderName(entries.getKey());
+            if(headerName != null) {
+                manifest.setHeader(headerName, entries.getValue());
+            }
+        }
+    }
+
+    /**
+     * Attempts to convert the supplied property key into a header name. If the key is not a valid header name (it
+     * doesn't have the header: prefix) then <code>null</code> is returned.
+     */
+    private String convertToHeaderName(String propertyKey) {
+        if(propertyKey.startsWith(HEADER_PREFIX)) {
+            return propertyKey.substring(HEADER_PREFIX.length());
+        } else {
+            return null;
+        }
+    }
+
+    private final class Visitor implements ExceptionThrowingDirectedAcyclicGraphVisitor<InstallArtifact, DeploymentException> {
+
+        public boolean visit(GraphNode<InstallArtifact> graph) throws DeploymentException {
+            InstallArtifact value = graph.getValue();
+            if (value instanceof BundleInstallArtifact) {
+                Map<String, String> deploymentProperties = ((BundleInstallArtifact)value).getDeploymentProperties();
+                if (deploymentProperties != null && !deploymentProperties.isEmpty()) {
+                    try {
+                        doTransformBundleArtifact((BundleInstallArtifact) value, deploymentProperties);
+                    } catch (Exception e) {
+                        throw new DeploymentException("Unable to apply deployment for artifact '" + value.getName() + "'", e);
+                    }
+                }
+            }
+            return true;
+        }
+
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/DescopingBundleManifest.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/DescopingBundleManifest.java
new file mode 100644
index 0000000..27d41f1
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/DescopingBundleManifest.java
@@ -0,0 +1,255 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core.internal;
+
+import java.io.IOException;
+import java.io.Writer;
+import java.net.URL;
+import java.util.Dictionary;
+import java.util.List;
+
+import org.osgi.framework.Version;
+
+import org.eclipse.virgo.util.osgi.manifest.BundleActivationPolicy;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+import org.eclipse.virgo.util.osgi.manifest.BundleSymbolicName;
+import org.eclipse.virgo.util.osgi.manifest.DynamicImportPackage;
+import org.eclipse.virgo.util.osgi.manifest.ExportPackage;
+import org.eclipse.virgo.util.osgi.manifest.FragmentHost;
+import org.eclipse.virgo.util.osgi.manifest.ImportBundle;
+import org.eclipse.virgo.util.osgi.manifest.ImportLibrary;
+import org.eclipse.virgo.util.osgi.manifest.ImportPackage;
+import org.eclipse.virgo.util.osgi.manifest.RequireBundle;
+
+/**
+ * {@link DescopingBundleManifest} is a wrapper of a {@link BundleManifest} that reverses the effects of scoping. In the
+ * first instance only the effects on the bundle symbolic are reversed.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+final class DescopingBundleManifest implements BundleManifest {
+
+    private final BundleManifest wrappedManifest;
+
+    DescopingBundleManifest(BundleManifest bundleManifest) {
+        this.wrappedManifest = bundleManifest;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public BundleActivationPolicy getBundleActivationPolicy() {
+        return this.wrappedManifest.getBundleActivationPolicy();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public List<String> getBundleClasspath() {
+        return this.wrappedManifest.getBundleClasspath();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getBundleDescription() {
+        return this.wrappedManifest.getBundleDescription();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public int getBundleManifestVersion() {
+        return this.wrappedManifest.getBundleManifestVersion();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getBundleName() {
+        return this.wrappedManifest.getBundleName();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public BundleSymbolicName getBundleSymbolicName() {
+        return new DescopingBundleSymbolicName(this.wrappedManifest.getBundleSymbolicName(), this.wrappedManifest.getModuleScope());
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public URL getBundleUpdateLocation() {
+        return this.wrappedManifest.getBundleUpdateLocation();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Version getBundleVersion() {
+        return this.wrappedManifest.getBundleVersion();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public DynamicImportPackage getDynamicImportPackage() {
+        return this.wrappedManifest.getDynamicImportPackage();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public ExportPackage getExportPackage() {
+        return this.wrappedManifest.getExportPackage();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public FragmentHost getFragmentHost() {
+        return this.wrappedManifest.getFragmentHost();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getHeader(String name) {
+        return this.wrappedManifest.getHeader(name);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public ImportBundle getImportBundle() {
+        return this.wrappedManifest.getImportBundle();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public ImportLibrary getImportLibrary() {
+        return this.wrappedManifest.getImportLibrary();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public ImportPackage getImportPackage() {
+        return this.wrappedManifest.getImportPackage();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getModuleScope() {
+        return this.wrappedManifest.getModuleScope();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getModuleType() {
+        return this.wrappedManifest.getModuleType();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public RequireBundle getRequireBundle() {
+        return this.wrappedManifest.getRequireBundle();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void setBundleDescription(String bundleDescription) {
+        this.wrappedManifest.setBundleDescription(bundleDescription);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void setBundleManifestVersion(int bundleManifestVersion) {
+        this.wrappedManifest.setBundleManifestVersion(bundleManifestVersion);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void setBundleName(String bundleName) {
+        this.wrappedManifest.setBundleName(bundleName);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void setBundleUpdateLocation(URL bundleUpdateLocation) {
+        this.wrappedManifest.setBundleUpdateLocation(bundleUpdateLocation);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void setBundleVersion(Version bundleVersion) {
+        this.wrappedManifest.setBundleVersion(bundleVersion);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void setHeader(String name, String value) {
+        this.wrappedManifest.setHeader(name, value);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void setModuleScope(String moduleScope) {
+        this.wrappedManifest.setModuleScope(moduleScope);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void setModuleType(String moduleType) {
+        this.wrappedManifest.setModuleType(moduleType);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Dictionary<String, String> toDictionary() {
+        return this.wrappedManifest.toDictionary();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void write(Writer writer) throws IOException {
+        this.wrappedManifest.write(writer);
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public String toString() {
+        return this.wrappedManifest.toString();
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/DescopingBundleSymbolicName.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/DescopingBundleSymbolicName.java
new file mode 100644
index 0000000..1b5711a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/DescopingBundleSymbolicName.java
@@ -0,0 +1,125 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core.internal;
+
+import java.util.Map;
+
+import org.eclipse.virgo.util.osgi.manifest.BundleSymbolicName;
+
+/**
+ * {@link DescopingBundleSymbolicName} is a wrapper of a {@link BundleSymbolicName} that reverses the effects of
+ * scoping.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+final class DescopingBundleSymbolicName implements BundleSymbolicName {
+
+    public static final String SCOPE_SEPARATOR = "-";
+
+    private final BundleSymbolicName wrappedBundleSymbolicName;
+
+    private final String moduleScope;
+
+    DescopingBundleSymbolicName(BundleSymbolicName bundleSymbolicName, String moduleScope) {
+        this.wrappedBundleSymbolicName = bundleSymbolicName;
+        this.moduleScope = moduleScope;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public FragmentAttachment getFragmentAttachment() {
+        return this.wrappedBundleSymbolicName.getFragmentAttachment();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getSymbolicName() {
+        return getUnscopedSymbolicName();
+    }
+
+    private String getUnscopedSymbolicName() {
+        String symbolicName = null;
+        if (this.wrappedBundleSymbolicName != null) {
+            symbolicName = this.wrappedBundleSymbolicName.getSymbolicName();
+            if (this.moduleScope != null) {
+                String scopeName = this.moduleScope + SCOPE_SEPARATOR;
+                if (symbolicName.startsWith(scopeName)) {
+                    symbolicName = symbolicName.substring(scopeName.length());
+                }
+            }
+        }
+        return symbolicName;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isSingleton() {
+        return this.wrappedBundleSymbolicName.isSingleton();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void setFragmentAttachment(FragmentAttachment fragmentAttachment) {
+        this.wrappedBundleSymbolicName.setFragmentAttachment(fragmentAttachment);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void setSingleton(boolean singleton) {
+        this.wrappedBundleSymbolicName.setSingleton(singleton);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void setSymbolicName(String symbolicName) {
+        this.wrappedBundleSymbolicName.setSymbolicName(symbolicName);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Map<String, String> getAttributes() {
+        return this.wrappedBundleSymbolicName.getAttributes();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Map<String, String> getDirectives() {
+        return this.wrappedBundleSymbolicName.getDirectives();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void resetFromParseString(String string) {
+       this.wrappedBundleSymbolicName.resetFromParseString(string);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String toParseString() {
+        return this.wrappedBundleSymbolicName.toParseString();
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/ExistingNodeLocator.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/ExistingNodeLocator.java
new file mode 100644
index 0000000..61a170c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/ExistingNodeLocator.java
@@ -0,0 +1,97 @@
+/*******************************************************************************
+ * Copyright (c) 2012 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core.internal;
+
+import org.eclipse.virgo.kernel.deployer.model.GCRoots;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactIdentity;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.eclipse.virgo.util.common.GraphNode;
+import org.eclipse.virgo.util.common.GraphNode.DirectedAcyclicGraphVisitor;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+
+public final class ExistingNodeLocator implements DirectedAcyclicGraphVisitor<InstallArtifact> {
+
+    private final String scopeName;
+
+    private GraphNode<InstallArtifact> foundNode = null;
+
+    private final String type;
+
+    private final String name;
+
+    private final VersionRange versionRange;
+
+    /**
+     * Searches the DAG from the given GC roots looking for an install artifact with the given identity and returns the
+     * first one it finds or <code>null</code> if none are found.
+     */
+    public static GraphNode<InstallArtifact> findSharedNode(GCRoots gcRoots, ArtifactIdentity artifactIdentity) {
+        ExistingNodeLocator visitor = new ExistingNodeLocator(artifactIdentity.getType(), artifactIdentity.getName(),
+            VersionRange.createExactRange(artifactIdentity.getVersion()), artifactIdentity.getScopeName());
+        for (InstallArtifact gcRoot : gcRoots) {
+            gcRoot.getGraph().visit(visitor);
+        }
+        return visitor.getFoundNode();
+    }
+
+    /**
+     * Searches the DAG from the given GC roots looking for an install artifact with the given type, name, and scope
+     * name and with version in the given version range and returns the first one it finds or <code>null</code> if none
+     * are found.
+     */
+    public static GraphNode<InstallArtifact> findSharedNode(GCRoots gcRoots, String type, String name, VersionRange versionRange, String scopeName) {
+        ExistingNodeLocator visitor = new ExistingNodeLocator(type, name, versionRange, scopeName);
+        for (InstallArtifact gcRoot : gcRoots) {
+            gcRoot.getGraph().visit(visitor);
+        }
+        return visitor.getFoundNode();
+    }
+
+    /**
+     * Searches the DAG from the given GC roots looking for an install artifact that matches the given graph node and
+     * returns the first one it finds or <code>null</code> if none are found.
+     */
+    public static GraphNode<InstallArtifact> findSharedNode(GCRoots gcRoots, GraphNode<InstallArtifact> installGraph) {
+        InstallArtifact installArtifact = installGraph.getValue();
+        ArtifactIdentity artifactIdentity = new ArtifactIdentity(installArtifact.getType(), installArtifact.getName(), installArtifact.getVersion(),
+            installArtifact.getScopeName());
+        return findSharedNode(gcRoots, artifactIdentity);
+    }
+
+    ExistingNodeLocator(@NonNull String type, @NonNull String name, @NonNull VersionRange versionRange, String scopeName) {
+        this.type = type;
+        this.name = name;
+        this.versionRange = versionRange;
+        this.scopeName = scopeName;
+    }
+
+    @Override
+    public boolean visit(GraphNode<InstallArtifact> node) {
+        InstallArtifact candidate = node.getValue();
+        if (this.foundNode == null && matches(candidate)) {
+            this.foundNode = node;
+        }
+        return this.foundNode == null;
+    }
+
+    private boolean matches(InstallArtifact candidate) {
+        return candidate.getType().equals(this.type)
+            && candidate.getName().equals(this.name)
+            && (this.scopeName == null && candidate.getScopeName() == null || this.scopeName != null
+                && this.scopeName.equals(candidate.getScopeName())) && this.versionRange.includes(candidate.getVersion());
+    }
+
+    public GraphNode<InstallArtifact> getFoundNode() {
+        return this.foundNode;
+    }
+}
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/ImportExpandingTransformer.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/ImportExpandingTransformer.java
new file mode 100644
index 0000000..e0bac1c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/ImportExpandingTransformer.java
@@ -0,0 +1,119 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core.internal;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.BundleInstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.PlanInstallArtifact;
+import org.eclipse.virgo.kernel.install.environment.InstallEnvironment;
+import org.eclipse.virgo.kernel.install.pipeline.stage.transform.Transformer;
+import org.eclipse.virgo.kernel.install.pipeline.stage.transform.internal.BundleInstallArtifactGatheringGraphVisitor;
+import org.eclipse.virgo.kernel.osgi.framework.ImportExpander;
+import org.eclipse.virgo.kernel.osgi.framework.ImportMergeException;
+import org.eclipse.virgo.kernel.osgi.framework.UnableToSatisfyDependenciesException;
+import org.eclipse.virgo.util.common.GraphNode;
+import org.eclipse.virgo.util.common.GraphNode.ExceptionThrowingDirectedAcyclicGraphVisitor;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+
+/**
+ * {@link ImportExpandingTransformer} is a {@link Transformer} that expands Import-Library and Import-Bundle into package imports.
+ * Expansion of imports in bundles that are part of a scope is performed against all of the bundles at the same time.
+ * Expansion of bundles that are not part of a scope is performed on a bundle-by-bundle basis.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ * 
+ */
+final class ImportExpandingTransformer implements Transformer {
+
+    private final ImportExpander importExpander;
+
+    ImportExpandingTransformer(ImportExpander importExpander) {
+        this.importExpander = importExpander;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void transform(GraphNode<InstallArtifact> installGraph, final InstallEnvironment installEnvironment) throws DeploymentException {
+        installGraph.visit(new ImportExpandingGraphVisitor(installEnvironment));
+    }
+
+    private final class ImportExpandingGraphVisitor implements ExceptionThrowingDirectedAcyclicGraphVisitor<InstallArtifact, DeploymentException> {
+
+        private final InstallEnvironment installEnvironment;
+
+        ImportExpandingGraphVisitor(InstallEnvironment installEnvironment) {
+            this.installEnvironment = installEnvironment;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public boolean visit(GraphNode<InstallArtifact> graph) throws DeploymentException {
+            if (graph.getValue() instanceof PlanInstallArtifact) {
+                PlanInstallArtifact planInstallArtifact = (PlanInstallArtifact) graph.getValue();
+                if (planInstallArtifact.isScoped()) {
+                    expandImportsOfBundlesInScopedPlan(graph, this.installEnvironment);
+                    return false;
+                }
+            } else if (graph.getValue() instanceof BundleInstallArtifact) {
+                expandImports(Collections.singleton((BundleInstallArtifact) graph.getValue()), this.installEnvironment);
+            }
+            return true;
+        }
+    }
+
+    void expandImportsOfBundlesInScopedPlan(GraphNode<InstallArtifact> planGraph, InstallEnvironment installEnvironment) throws DeploymentException {
+        BundleInstallArtifactGatheringGraphVisitor visitor = new BundleInstallArtifactGatheringGraphVisitor();
+        planGraph.visit(visitor);
+        expandImports(visitor.getChildBundles(), installEnvironment);
+    }
+
+    void expandImports(Set<BundleInstallArtifact> bundleInstallArtifacts, InstallEnvironment installEnvironment) throws DeploymentException {
+
+        List<BundleManifest> bundleManifestList = new ArrayList<BundleManifest>(bundleInstallArtifacts.size());
+
+        for (BundleInstallArtifact bundleInstallArtifact : bundleInstallArtifacts) {
+            try {
+                BundleManifest bundleManifest = bundleInstallArtifact.getBundleManifest();
+                bundleManifestList.add(bundleManifest);
+            } catch (IOException e) {
+                installEnvironment.getInstallLog().log(this, "I/O error getting bundle manifest for  %s", bundleInstallArtifact.toString());
+                throw new DeploymentException("I/O error getting bundle manifest for " + bundleInstallArtifact, e);
+            }
+        }
+
+        try {
+            this.importExpander.expandImports(bundleManifestList);
+            installEnvironment.getInstallLog().log(this, "Expanded imports of %s", bundleInstallArtifacts.toString());
+        } catch (ImportMergeException e) {
+            installEnvironment.getInstallLog().log(this, "Error in %s merging expanded imports for package %s from %s",
+                bundleInstallArtifacts.toString(), e.getConflictingPackageName(), e.getSources());
+            throw new DeploymentException("Error merging expanded imports for " + bundleInstallArtifacts, e);
+        } catch (UnableToSatisfyDependenciesException e) {
+            installEnvironment.getInstallLog().log(this, "Unsatisfied dependencies in %s: %s", bundleInstallArtifacts.toString(),
+                e.getFailureDescription());
+            throw new DeploymentException(e.getMessage(), e);
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/ManifestUpgrader.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/ManifestUpgrader.java
new file mode 100644
index 0000000..19e8ba8
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/ManifestUpgrader.java
@@ -0,0 +1,118 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core.internal;
+
+import java.io.IOException;
+import java.net.URL;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeployerLogEvents;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.BundleInstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.environment.InstallEnvironment;
+import org.eclipse.virgo.kernel.install.pipeline.stage.transform.Transformer;
+import org.eclipse.virgo.util.common.GraphNode;
+import org.eclipse.virgo.util.common.GraphNode.ExceptionThrowingDirectedAcyclicGraphVisitor;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+
+/**
+ * {@link ManifestUpgrader} upgrades OSGi R3 manifests to be R4.1 compliant as this the minimum required to enable
+ * scoping.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+public class ManifestUpgrader implements Transformer {
+
+    private static final int BUNDLE_MANIFEST_VERSION_FOR_OSGI_R4 = 2;
+
+    /**
+     * {@inheritDoc}
+     */
+    public void transform(GraphNode<InstallArtifact> installGraph, final InstallEnvironment installEnvironment) throws DeploymentException {
+        installGraph.visit(new ExceptionThrowingDirectedAcyclicGraphVisitor<InstallArtifact, DeploymentException>() {
+
+            public boolean visit(GraphNode<InstallArtifact> graph) throws DeploymentException {
+                operate(graph.getValue(), installEnvironment);
+                return true;
+            }
+        });
+    }
+
+    void operate(InstallArtifact installArtifact, InstallEnvironment installEnvironment) throws DeploymentException {
+        if (installArtifact instanceof BundleInstallArtifact) {
+            BundleManifest bundleManifest = getBundleManifest(installArtifact, installEnvironment);
+            upgradeManifestIfNecessary(bundleManifest, installArtifact, installEnvironment);
+            validateManifest(bundleManifest, installArtifact, installEnvironment);
+            removeBundleUpdateLocation(installArtifact, installEnvironment, bundleManifest);
+        }
+    }
+
+    private BundleManifest getBundleManifest(InstallArtifact installArtifact, InstallEnvironment installEnvironment) throws DeploymentException {
+        try {
+            return ((BundleInstallArtifact) installArtifact).getBundleManifest();
+        } catch (IOException e) {
+            installEnvironment.getInstallLog().log(DeployerLogEvents.BUNDLE_MANIFEST_NOT_FOUND, e, installArtifact.getName(), installArtifact.getVersion());
+            throw new DeploymentException("I/O error accessing bundle manifest for " + installArtifact, e);
+        }
+    }
+
+    /**
+     * Upgrade the bundle manifest version to OSGi R4 if it is older. Do not issue a log message to avoid flooding the
+     * log.
+     * 
+     * This upgrade is necessary to support application scoping.
+     * 
+     * @param bundleManifest The manifest to upgrade
+     * @throws DeploymentException
+     */
+    private void upgradeManifestIfNecessary(BundleManifest bundleManifest, InstallArtifact installArtifact, InstallEnvironment installEnvironment) {
+        if (bundleManifest.getBundleManifestVersion() < BUNDLE_MANIFEST_VERSION_FOR_OSGI_R4) {
+            installEnvironment.getInstallLog().log(this, "OSGi R3 or earlier manifest detected:\n'%s'\nfor %s - upgrading manifest to OSGi R4.",
+                bundleManifest.toString(), installArtifact.toString());
+
+            bundleManifest.setBundleManifestVersion(BUNDLE_MANIFEST_VERSION_FOR_OSGI_R4);
+
+            if (bundleManifest.getBundleSymbolicName().getSymbolicName() == null) {
+                bundleManifest.getBundleSymbolicName().setSymbolicName(installArtifact.getName());
+            }
+        }
+    }
+
+    private void validateManifest(BundleManifest bundleManifest, InstallArtifact installArtifact, InstallEnvironment installEnvironment)
+        throws DeploymentException {
+        if (bundleManifest.getBundleSymbolicName().getSymbolicName() == null) {
+            installEnvironment.getInstallLog().log(DeployerLogEvents.MISSING_BUNDLE_SYMBOLIC_NAME, installArtifact.getName(),
+                installArtifact.getVersion(), bundleManifest);
+            throw new DeploymentException("OSGi R4 manifest with no bundle symbolic name detected:\n" + bundleManifest + "'\nfor module '" + this
+                + "'.");
+        }
+    }
+
+    /**
+     * Remove any bundle update location header to avoid it interfering with refresh.
+     */
+    private void removeBundleUpdateLocation(InstallArtifact installArtifact, InstallEnvironment installEnvironment, BundleManifest bundleManifest) {
+        URL bundleUpdateLocation = bundleManifest.getBundleUpdateLocation();
+
+        if (bundleUpdateLocation != null) {
+            installEnvironment.getInstallLog().log(DeployerLogEvents.DISCARDING_BUNDLE_UPDATE_LOCATION, bundleUpdateLocation,
+                installArtifact.getName(), installArtifact.getVersion().toString());
+            bundleManifest.setBundleUpdateLocation(null);
+        }
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/PipelinedApplicationDeployer.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/PipelinedApplicationDeployer.java
new file mode 100644
index 0000000..82e6731
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/PipelinedApplicationDeployer.java
@@ -0,0 +1,673 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core.internal;
+
+import java.io.File;
+import java.net.URI;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.virgo.nano.core.KernelException;
+import org.eclipse.virgo.nano.deployer.api.core.ApplicationDeployer;
+import org.eclipse.virgo.nano.deployer.api.core.DeployUriNormaliser;
+import org.eclipse.virgo.nano.deployer.api.core.DeployerConfiguration;
+import org.eclipse.virgo.nano.deployer.api.core.DeployerLogEvents;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentOptions;
+import org.eclipse.virgo.kernel.deployer.core.internal.event.DeploymentListener;
+import org.eclipse.virgo.kernel.deployer.model.DuplicateDeploymentIdentityException;
+import org.eclipse.virgo.kernel.deployer.model.DuplicateFileNameException;
+import org.eclipse.virgo.kernel.deployer.model.DuplicateLocationException;
+import org.eclipse.virgo.kernel.deployer.model.GCRoots;
+import org.eclipse.virgo.kernel.deployer.model.RuntimeArtifactModel;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactIdentity;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactIdentityDeterminer;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifactGraphInclosure;
+import org.eclipse.virgo.kernel.install.artifact.PlanInstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.internal.AbstractInstallArtifact;
+import org.eclipse.virgo.kernel.install.environment.InstallEnvironment;
+import org.eclipse.virgo.kernel.install.environment.InstallEnvironmentFactory;
+import org.eclipse.virgo.kernel.install.pipeline.Pipeline;
+import org.eclipse.virgo.kernel.osgi.framework.UnableToSatisfyBundleDependenciesException;
+import org.eclipse.virgo.kernel.osgi.framework.UnableToSatisfyDependenciesException;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.repository.Repository;
+import org.eclipse.virgo.repository.WatchableRepository;
+import org.eclipse.virgo.util.common.GraphNode;
+import org.eclipse.virgo.util.io.PathReference;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.Version;
+
+/**
+ * {@link PipelinedApplicationDeployer} is an implementation of {@link ApplicationDeployer} which creates a
+ * {@link GraphNode} of {@link InstallArtifact InstallArtifacts} and processes the graph by passing it through a
+ * {@link Pipeline} while operating on an {@link InstallEnvironment}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+final class PipelinedApplicationDeployer implements ApplicationDeployer, ApplicationRecoverer {
+    
+    private static final String BUNDLE_TYPE = "bundle";
+    
+    private final EventLogger eventLogger;
+    
+    private final Object monitor = new Object();
+    
+    private final InstallEnvironmentFactory installEnvironmentFactory;
+    
+    private final InstallArtifactGraphInclosure installArtifactGraphInclosure;
+    
+    private final ArtifactIdentityDeterminer artifactIdentityDeterminer;
+    
+    private final RuntimeArtifactModel ram;
+    
+    private final DeploymentListener deploymentListener;
+    
+    private final Map<DeploymentIdentity, DeploymentOptions> deploymentOptionsMap = new HashMap<DeploymentIdentity, DeploymentOptions>();
+    
+    private final Pipeline pipeline;
+    
+    private final DeployUriNormaliser deployUriNormaliser;
+    
+    private final int deployerConfiguredTimeoutInSeconds;
+    
+    private final BundleContext bundleContext;
+    
+    public PipelinedApplicationDeployer(@NonNull Pipeline pipeline, @NonNull InstallArtifactGraphInclosure installArtifactGraphInclosure,
+                                        @NonNull ArtifactIdentityDeterminer artifactIdentityDeterminer, @NonNull InstallEnvironmentFactory installEnvironmentFactory,
+                                        @NonNull RuntimeArtifactModel ram, @NonNull DeploymentListener deploymentListener, @NonNull EventLogger eventLogger,
+                                        @NonNull DeployUriNormaliser normaliser, @NonNull DeployerConfiguration deployerConfiguration, @NonNull BundleContext bundleContext) {
+        this.eventLogger = eventLogger;
+        this.installArtifactGraphInclosure = installArtifactGraphInclosure;
+        this.artifactIdentityDeterminer = artifactIdentityDeterminer;
+        this.installEnvironmentFactory = installEnvironmentFactory;
+        this.ram = ram;
+        this.deploymentListener = deploymentListener;
+        this.deployUriNormaliser = normaliser;
+        this.bundleContext = bundleContext;
+        this.pipeline = pipeline;
+        this.deployerConfiguredTimeoutInSeconds = deployerConfiguration.getDeploymentTimeoutSeconds();
+    }
+    
+    /**
+     * {@inheritDoc}
+     */
+    public DeploymentIdentity deploy(URI location) throws DeploymentException {
+        synchronized (this.monitor) {
+            return deploy(location, new DeploymentOptions());
+        }
+    }
+    
+    private URI normaliseDeploymentUri(URI uri) throws DeploymentException {
+        URI normalisedLocation = this.deployUriNormaliser.normalise(uri);
+        
+        if (normalisedLocation == null) {
+            this.eventLogger.log(DeployerLogEvents.UNSUPPORTED_URI_SCHEME, uri, uri.getScheme());
+            throw new DeploymentException("PipelinedApplicationDeployer.deploy does not support '" + uri.getScheme() + "' scheme URIs");
+        }
+        
+        return normalisedLocation;
+    }
+    
+    public DeploymentIdentity install(URI location) throws DeploymentException {
+        return install(location, new DeploymentOptions());
+    }
+    
+    public DeploymentIdentity install(URI uri, DeploymentOptions deploymentOptions) throws DeploymentException {
+        URI normalisedUri = normaliseDeploymentUri(uri);
+        
+        DeploymentIdentity deploymentIdentity = doInstall(normalisedUri, deploymentOptions);
+        this.deploymentListener.deployed(normalisedUri, deploymentOptions);
+        
+        return deploymentIdentity;
+    }
+    
+    private DeploymentIdentity doInstall(URI normalisedUri, DeploymentOptions deploymentOptions) throws DeploymentException {
+        synchronized (this.monitor) {
+            InstallArtifact existingArtifact = this.ram.get(normalisedUri);
+            
+            if (existingArtifact != null) {
+                DeploymentIdentity refreshedIdentity = refreshExistingArtifact(normalisedUri, existingArtifact);
+                if (refreshedIdentity != null) {
+                    return refreshedIdentity;
+                }
+            }
+            
+            GraphNode<InstallArtifact> installNode;
+            boolean shared = false;
+            try {
+                ArtifactIdentity artifactIdentity = determineIdentity(normalisedUri);
+                installNode = findSharedNode(artifactIdentity);
+                if (installNode == null) {
+                    installNode = this.installArtifactGraphInclosure.constructGraphNode(artifactIdentity, new File(normalisedUri), null, null);
+                } else {
+                    shared = true;
+                }
+            } catch (Exception e) {
+                throw new DeploymentException(e.getMessage() + ": uri='" + normalisedUri + "'", e);
+            }
+            
+            DeploymentIdentity deploymentIdentity;
+            
+            try {
+                deploymentIdentity = addGraphToModel(normalisedUri, installNode);
+            } catch (KernelException ke) {
+                if (!shared) {
+                    destroyInstallGraph(installNode);
+                }
+                throw new DeploymentException(ke.getMessage(), ke);
+            }
+            
+            if (!shared) {
+                this.deploymentOptionsMap.put(deploymentIdentity, deploymentOptions);
+                try {
+                    driveInstallPipeline(normalisedUri, installNode);
+                } catch (DeploymentException de) {
+                    removeFromModel(deploymentIdentity);
+                    destroyInstallGraph(installNode);
+                    throw de;
+                } catch (RuntimeException re) {
+                    removeFromModel(deploymentIdentity);
+                    destroyInstallGraph(installNode);
+                    throw re;
+                }
+            }
+            
+            return deploymentIdentity;
+        }
+    }
+    
+    private ArtifactIdentity determineIdentity(URI artifactUri) throws DeploymentException {
+        try {
+            File artifact = new File(artifactUri);
+            if (!artifact.exists()) {
+                throw new DeploymentException(artifact + " does not exist");
+            }
+            
+            return determineIdentity(artifact, null);
+        } catch (Exception e) {
+            throw new DeploymentException(e.getMessage() + ": uri='" + artifactUri + "'", e);
+        }
+    }
+    
+    private GraphNode<InstallArtifact> findSharedNode(ArtifactIdentity artifactIdentity) {
+        GCRoots gcRoots = (GCRoots) this.ram;
+        return ExistingNodeLocator.findSharedNode(gcRoots, artifactIdentity);
+    }
+    
+    private void destroyInstallGraph(GraphNode<InstallArtifact> installGraph) throws DeploymentException {
+        installGraph.getValue().uninstall();
+    }
+    
+    private void removeFromModel(DeploymentIdentity deploymentIdentity) throws DeploymentException {
+        this.ram.delete(deploymentIdentity);
+    }
+    
+    private DeploymentIdentity refreshExistingArtifact(URI normalisedLocation, InstallArtifact existingArtifact) throws DeploymentException {
+        String oldType = existingArtifact.getType();
+        String oldName = existingArtifact.getName();
+        Version oldVersion = existingArtifact.getVersion();
+        
+        DeploymentIdentity deploymentIdentity = refreshArtifact(normalisedLocation, existingArtifact);
+        if (deploymentIdentity != null) {
+            return deploymentIdentity;
+        }
+        
+        DeploymentIdentity oldDeploymentIdentity = new StandardDeploymentIdentity(oldType, oldName, oldVersion.toString());
+        undeployInternal(oldDeploymentIdentity, true, false);
+        
+        return null;
+    }
+    
+    /**
+     * {@inheritDoc}
+     */
+    public DeploymentIdentity deploy(URI location, DeploymentOptions deploymentOptions) throws DeploymentException {
+        URI normalisedLocation = normaliseDeploymentUri(location);
+        
+        InstallArtifact installedArtifact;
+        DeploymentIdentity deploymentIdentity;
+        
+        synchronized (this.monitor) {
+            deploymentIdentity = install(location, deploymentOptions);
+            installedArtifact = this.ram.get(normalisedLocation);
+        }
+        
+        try {
+            start(installedArtifact, deploymentOptions.getSynchronous());
+        } catch (DeploymentException de) {
+            synchronized (this.monitor) {
+                stopArtifact(installedArtifact);
+                uninstallArtifact(installedArtifact);
+            }
+            throw de;
+        }
+        
+        this.deploymentListener.deployed(normalisedLocation, deploymentOptions);
+        
+        return deploymentIdentity;
+    }
+    
+    private DeploymentIdentity refreshArtifact(URI location, InstallArtifact installArtifact) throws DeploymentException {
+        DeploymentIdentity deploymentIdentity = null;
+        if (installArtifact.refresh()) {
+            this.deploymentListener.refreshed(location);
+            
+            deploymentIdentity = new StandardDeploymentIdentity(installArtifact.getType(), installArtifact.getName(),
+                                                                installArtifact.getVersion().toString());
+        }
+        return deploymentIdentity;
+    }
+    
+    /**
+     * {@inheritDoc}
+     */
+    public DeploymentIdentity deploy(String type, String name, Version version) throws DeploymentException {
+        throw new UnsupportedOperationException(
+                                                "PipelinedApplicationDeployer ApplicationDeployer does not support deployment by type, name, and version");
+    }
+    
+    /**
+     * {@inheritDoc}
+     */
+    public DeploymentIdentity deploy(String type, String name, Version version, DeploymentOptions options) throws DeploymentException {
+        throw new UnsupportedOperationException(
+                                                "PipelinedApplicationDeployer ApplicationDeployer does not support deployment by type, name, and version");
+    }
+    
+    private DeploymentIdentity addGraphToModel(URI location, GraphNode<InstallArtifact> installGraph) throws DuplicateFileNameException,
+    DuplicateLocationException, DuplicateDeploymentIdentityException, DeploymentException {
+        InstallArtifact installArtifact = installGraph.getValue();
+        ((AbstractInstallArtifact) installArtifact).setTopLevelDeployed();
+        return this.ram.add(location, installArtifact);
+    }
+    
+    /**
+     * {@inheritDoc}
+     */
+    public void recoverDeployment(URI uri, DeploymentOptions options) throws DeploymentException {
+        
+        GraphNode<InstallArtifact> installNode = null;
+        boolean shared = false;
+        File artifact = new File(uri);
+        if (options.getRecoverable() && (!options.getDeployerOwned() || artifact.exists())) {
+            ArtifactIdentity artifactIdentity = determineIdentity(artifact, null);
+            installNode = findSharedNode(artifactIdentity);
+            if (installNode == null) {
+                installNode = this.installArtifactGraphInclosure.recoverInstallGraph(artifactIdentity, artifact);
+            } else {
+                shared = true;
+            }
+        }
+        
+        if (installNode == null) {
+            // Remove the URI from the recovery log.
+            this.deploymentListener.undeployed(uri);
+        } else {
+            if (!shared) {
+                driveInstallPipeline(uri, installNode);
+                
+                start(installNode.getValue(), options.getSynchronous());
+            }
+            
+            try {
+                addGraphToModel(uri, installNode);
+            } catch (KernelException e) {
+                throw new DeploymentException(e.getMessage(), e);
+            }
+        }
+    }
+    
+    private ArtifactIdentity determineIdentity(File file, String scopeName) throws DeploymentException {
+        ArtifactIdentity artifactIdentity = this.artifactIdentityDeterminer.determineIdentity(file, scopeName);
+        
+        if (artifactIdentity == null) {
+            this.eventLogger.log(DeployerLogEvents.INDETERMINATE_ARTIFACT_TYPE, file);
+            throw new DeploymentException("Cannot determine the artifact identity of the file '" + file + "'");
+        }
+        
+        return artifactIdentity;
+    }
+    
+    private void driveInstallPipeline(URI uri, GraphNode<InstallArtifact> installGraph) throws DeploymentException {
+        
+        refreshWatchedRepositories();
+        InstallEnvironment installEnvironment = this.installEnvironmentFactory.createInstallEnvironment(installGraph.getValue());
+        
+        try {
+            this.pipeline.process(installGraph, installEnvironment);
+        } catch (UnableToSatisfyBundleDependenciesException utsbde) {
+            logDependencySatisfactionException(uri, utsbde);
+            throw new DeploymentException("Dependency satisfaction failed", utsbde);
+        } finally {
+            installEnvironment.destroy();
+        }
+    }
+    
+    private void logDependencySatisfactionException(URI uri, UnableToSatisfyDependenciesException ex) {
+        this.eventLogger.log(DeployerLogEvents.UNABLE_TO_SATISFY_CONSTRAINTS, ex, uri, ex.getSymbolicName(), ex.getVersion(),
+                             ex.getFailureDescription());
+    }
+    
+    private void start(InstallArtifact installArtifact, boolean synchronous) throws DeploymentException {
+        BlockingAbortableSignal blockingSignal = new BlockingAbortableSignal(synchronous);
+        installArtifact.start(blockingSignal);
+        if (synchronous && this.deployerConfiguredTimeoutInSeconds > 0) {
+            boolean complete = blockingSignal.awaitCompletion(this.deployerConfiguredTimeoutInSeconds);
+            if (blockingSignal.isAborted()) {
+                this.eventLogger.log(DeployerLogEvents.START_ABORTED, installArtifact.getType(), installArtifact.getName(),
+                                     installArtifact.getVersion(), this.deployerConfiguredTimeoutInSeconds);
+            } else if (!complete) {
+                this.eventLogger.log(DeployerLogEvents.START_TIMED_OUT, installArtifact.getType(), installArtifact.getName(),
+                                     installArtifact.getVersion(), this.deployerConfiguredTimeoutInSeconds);
+            }
+        } else {
+            // Completion messages will have been issued if complete, so ignore return value.
+            blockingSignal.checkComplete();
+        }
+    }
+    
+    /**
+     * {@inheritDoc}
+     */
+    public DeploymentIdentity[] getDeploymentIdentities() {
+        synchronized (this.monitor) {
+            return this.ram.getDeploymentIdentities();
+        }
+    }
+    
+    /**
+     * {@inheritDoc}
+     */
+    public DeploymentIdentity getDeploymentIdentity(URI location) {
+        synchronized (this.monitor) {
+            InstallArtifact installArtifact = this.ram.get(location);
+            if (installArtifact != null) {
+                return getDeploymentIdentity(installArtifact);
+            }
+        }
+        return null;
+    }
+    
+    private DeploymentIdentity getDeploymentIdentity(InstallArtifact installArtifact) {
+        return new StandardDeploymentIdentity(installArtifact.getType(), installArtifact.getName(), installArtifact.getVersion().toString());
+    }
+    
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isDeployed(URI location) {
+        URI normalisedLocation;
+        try {
+            normalisedLocation = this.deployUriNormaliser.normalise(location);
+        } catch (DeploymentException e) {
+            return false;
+        }
+        
+        if (normalisedLocation == null) {
+            this.eventLogger.log(DeployerLogEvents.UNSUPPORTED_URI_SCHEME, location.toString(), location.getScheme());
+            return false;
+        }
+        synchronized (this.monitor) {
+            return this.ram.get(normalisedLocation) != null;
+        }
+    }
+    
+    /**
+     * {@inheritDoc}
+     */
+    public DeploymentIdentity refresh(URI location, String symbolicName) throws DeploymentException {
+        URI normalisedLocation = this.deployUriNormaliser.normalise(location);
+        
+        if (normalisedLocation == null) {
+            this.eventLogger.log(DeployerLogEvents.UNSUPPORTED_URI_SCHEME, location.toString(), location.getScheme());
+            throw new DeploymentException("PipelinedApplicationDeployer.refresh does not support '" + location.getScheme() + "' scheme URIs");
+        }
+        
+        DeploymentIdentity deploymentIdentity;
+        synchronized (this.monitor) {
+            InstallArtifact installArtifact = this.ram.get(normalisedLocation);
+            if (installArtifact == null) {
+                this.eventLogger.log(DeployerLogEvents.REFRESH_REQUEST_URI_NOT_FOUND, location.toString());
+                throw new DeploymentException("Refresh not possible as no application is deployed from URI " + location);
+            } else {
+                DeploymentIdentity originalDeploymentIdentity = getDeploymentIdentity(installArtifact);
+                deploymentIdentity = originalDeploymentIdentity;
+                try {
+                    // Attempt to refresh the artifact and escalate to redeploy if this fails.
+                    if (refreshInternal(symbolicName, installArtifact)) {
+                        this.deploymentListener.refreshed(normalisedLocation);
+                    } else {
+                        DeploymentOptions deploymentOptions = this.deploymentOptionsMap.get(deploymentIdentity);
+                        if (deploymentOptions == null) {
+                            deploymentOptions = DeploymentOptions.DEFAULT_DEPLOYMENT_OPTIONS;
+                        }
+                        deploymentIdentity = redeploy(originalDeploymentIdentity, normalisedLocation, deploymentOptions);
+                    }
+                    this.eventLogger.log(DeployerLogEvents.REFRESH_REQUEST_COMPLETED, symbolicName, originalDeploymentIdentity.getType(),
+                                         originalDeploymentIdentity.getSymbolicName(), originalDeploymentIdentity.getVersion());
+                } catch (RuntimeException e) {
+                    this.eventLogger.log(DeployerLogEvents.REFRESH_REQUEST_FAILED, e, symbolicName, originalDeploymentIdentity.getType(),
+                                         originalDeploymentIdentity.getSymbolicName(), originalDeploymentIdentity.getVersion());
+                    throw e;
+                } catch (Exception e) {
+                    this.eventLogger.log(DeployerLogEvents.REFRESH_REQUEST_FAILED, e, symbolicName, originalDeploymentIdentity.getType(),
+                                         originalDeploymentIdentity.getSymbolicName(), originalDeploymentIdentity.getVersion());
+                    throw new DeploymentException("refresh failed", e);
+                }
+            }
+        }
+        return deploymentIdentity;
+    }
+    
+    private boolean refreshInternal(String symbolicName, InstallArtifact installArtifact) throws DeploymentException {
+        if (installArtifact instanceof PlanInstallArtifact) {
+            return ((PlanInstallArtifact) installArtifact).refresh(symbolicName);
+        } else {
+            return installArtifact.refresh();
+        }
+    }
+    
+    private DeploymentIdentity redeploy(DeploymentIdentity toUndeploy, URI toDeploy, DeploymentOptions deploymentOptions) throws DeploymentException {
+        synchronized (this.monitor) {
+            undeployInternal(toUndeploy, true, false);
+        }
+        return deploy(toDeploy, deploymentOptions);
+    }
+    
+    /**
+     * {@inheritDoc}
+     */
+    public void refreshBundle(String bundleSymbolicName, String bundleVersion) throws DeploymentException {
+        DeploymentIdentity deploymentIdentity = new StandardDeploymentIdentity(BUNDLE_TYPE, bundleSymbolicName, bundleVersion);
+        InstallArtifact bundleInstallArtifact;
+        synchronized (this.monitor) {
+            bundleInstallArtifact = this.ram.get(deploymentIdentity);
+        }
+        if (bundleInstallArtifact == null) {
+            this.eventLogger.log(DeployerLogEvents.REFRESH_ARTEFACT_NOT_FOUND, BUNDLE_TYPE, bundleSymbolicName, bundleVersion);
+            throw new DeploymentException("Refresh not possible as no " + BUNDLE_TYPE + " with name " + bundleSymbolicName + " and version "
+                                          + bundleVersion + " is deployed");
+        }
+        bundleInstallArtifact.refresh();
+    }
+    
+    /**
+     * {@inheritDoc}
+     */
+    public void undeploy(String symbolicName, String version) throws DeploymentException {
+        // This method is deprecated and should be deleted when it is no longer used. Meanwhile, just try undeploying
+        // the possible types...
+        DeploymentException de = null;
+        try {
+            undeploy(BUNDLE_TYPE, symbolicName, version);
+            return;
+        } catch (DeploymentException e) {
+            de = e;
+        }
+        
+        try {
+            undeploy("par", symbolicName, version);
+            return;
+        } catch (DeploymentException e) {
+            de = e;
+        }
+        
+        try {
+            undeploy("plan", symbolicName, version);
+            return;
+        } catch (DeploymentException e) {
+            de = e;
+        }
+        
+        try {
+            undeploy("properties", symbolicName, version);
+            return;
+        } catch (DeploymentException e) {
+            de = e;
+        }
+        
+        throw de;
+        
+    }
+    
+    /**
+     * {@inheritDoc}
+     */
+    public void undeploy(String type, String symbolicName, String version) throws DeploymentException {
+        DeploymentIdentity deploymentIdentity = new StandardDeploymentIdentity(type, symbolicName, version);
+        synchronized (this.monitor) {
+            undeployInternal(deploymentIdentity, false, false);
+        }
+    }
+    
+    /**
+     * {@inheritDoc}
+     */
+    public void undeploy(DeploymentIdentity deploymentIdentity) throws DeploymentException {
+        synchronized (this.monitor) {
+            undeployInternal(deploymentIdentity, false, false);
+        }
+    }
+    
+    /**
+     * {@inheritDoc}
+     */
+    public void undeploy(DeploymentIdentity deploymentIdentity, boolean deleted) throws DeploymentException {
+        synchronized (this.monitor) {
+            undeployInternal(deploymentIdentity, false, true);
+        }
+    }
+    
+    /**
+     * All the undeploy work goes on in here -- it is assumed that any required monitors are already held by the caller.
+     * <p>
+     * The deleted parameter indicates whether the undeployment is a consequence of the artifact having been deleted.
+     * This affects the processing of "deployer owned" artifacts which undeploy would normally delete automatically. If
+     * the undeploy is a consequence of the artifact having been deleted, then undeploy must not delete the artifact
+     * automatically since this may actually delete a "new" artifact which has arrived shortly after the "old" artifact
+     * was deleted.
+     * 
+     * @param deploymentIdentity identity of artifact to undeploy
+     * @param redeploying flag to indicate if we are performing a re-deploy
+     * @param deleted <code>true</code> if and only if undeploy is being driven as a consequence of the artifact having
+     *        been deleted
+     * @throws DeploymentException
+     */
+    private void undeployInternal(DeploymentIdentity deploymentIdentity, boolean redeploying, boolean deleted) throws DeploymentException {
+        DeploymentOptions options = this.deploymentOptionsMap.remove(deploymentIdentity);
+        URI location = doUndeploy(deploymentIdentity);
+        if (location != null && !redeploying) {
+            deleteArtifactIfNecessary(location, options, deleted);
+        }
+    }
+    
+    private void deleteArtifactIfNecessary(URI location, DeploymentOptions options, boolean deleted) {
+        if (options != null && options.getDeployerOwned() && !deleted) {
+            new PathReference(location).delete(true);
+        }
+    }
+    
+    private URI doUndeploy(DeploymentIdentity deploymentIdentity) throws DeploymentException {
+        synchronized (this.monitor) {
+            InstallArtifact installArtifact = this.ram.get(deploymentIdentity);
+            if (installArtifact == null) {
+                String type = deploymentIdentity.getType();
+                String symbolicName = deploymentIdentity.getSymbolicName();
+                String version = deploymentIdentity.getVersion();
+                this.eventLogger.log(DeployerLogEvents.UNDEPLOY_ARTEFACT_NOT_FOUND, type, symbolicName, version);
+                throw new DeploymentException("Undeploy not possible as no " + type + " with name " + symbolicName + " and version " + version
+                                              + " is deployed");
+            } else {
+                URI location = this.ram.getLocation(deploymentIdentity);
+                
+                this.ram.delete(deploymentIdentity);
+                
+                stopArtifact(installArtifact);
+                uninstallArtifact(installArtifact);
+                return location;
+            }
+        }
+    }
+    
+    private void stopArtifact(InstallArtifact installArtifact) throws DeploymentException {
+        
+        installArtifact.stop();
+        
+    }
+    
+    private void uninstallArtifact(InstallArtifact installArtifact) throws DeploymentException {
+        installArtifact.uninstall();
+    }
+    
+    private void refreshWatchedRepositories() {
+        try {
+            Collection<ServiceReference<WatchableRepository>> references = this.bundleContext.getServiceReferences(WatchableRepository.class, null);
+            for (ServiceReference<WatchableRepository> reference : references) {
+                WatchableRepository watchableRepository = this.bundleContext.getService(reference);
+                try {
+                    watchableRepository.forceCheck();
+                } catch (Exception e) {
+                    String name;
+                    if (watchableRepository instanceof Repository) {
+                        name = ((Repository) watchableRepository).getName();
+                    } else {
+                        name = "unknown repository type";
+                    }
+                    this.eventLogger.log(DeployerLogEvents.WATCHED_REPOSITORY_REFRESH_FAILED, name);
+                }
+                this.bundleContext.ungetService(reference);
+            }
+        } catch (InvalidSyntaxException e) {
+            this.eventLogger.log(DeployerLogEvents.WATCHED_REPOSITORIES_REFRESH_FAILED);
+        }
+        
+    }
+    
+    @Override
+    public DeploymentIdentity[] bulkDeploy(List<URI> arg0, DeploymentOptions arg1) throws DeploymentException {
+        throw new UnsupportedOperationException();
+    }
+    
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/PlanResolver.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/PlanResolver.java
new file mode 100644
index 0000000..ce43be8
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/PlanResolver.java
@@ -0,0 +1,236 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core.internal;
+
+import java.io.File;
+import java.net.URI;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.virgo.kernel.artifact.ArtifactSpecification;
+import org.eclipse.virgo.kernel.artifact.plan.PlanDescriptor.Provisioning;
+import org.eclipse.virgo.nano.deployer.api.core.DeployerLogEvents;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.deployer.model.GCRoots;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactIdentity;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactIdentityDeterminer;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifactGraphInclosure;
+import org.eclipse.virgo.kernel.install.artifact.PlanInstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.internal.AbstractInstallArtifact;
+import org.eclipse.virgo.kernel.install.environment.InstallEnvironment;
+import org.eclipse.virgo.kernel.install.pipeline.stage.transform.Transformer;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.repository.Repository;
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+import org.eclipse.virgo.util.common.GraphNode;
+import org.eclipse.virgo.util.common.GraphNode.ExceptionThrowingDirectedAcyclicGraphVisitor;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+import org.osgi.framework.Version;
+
+/**
+ * {@link PlanResolver} adds the immediate child nodes to a plan node.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+public class PlanResolver implements Transformer {
+
+    private static final String PROVISIONING_PROPERTY_NAME = "org.eclipse.virgo.kernel.provisioning";
+
+    private static final String SCOPE_SEPARATOR = "-";
+
+    private final InstallArtifactGraphInclosure installArtifactGraphInclosure;
+
+    private final GCRoots gcRoots;
+
+    private final Repository repository;
+
+    private final ArtifactIdentityDeterminer artifactIdentityDeterminer;
+
+    private final EventLogger eventLogger;
+
+    public PlanResolver(@NonNull InstallArtifactGraphInclosure installArtifactGraphInclosure, @NonNull GCRoots gcRoots,
+        @NonNull Repository repository, @NonNull ArtifactIdentityDeterminer artifactIdentityDeterminer, @NonNull EventLogger eventLogger) {
+        this.installArtifactGraphInclosure = installArtifactGraphInclosure;
+        this.gcRoots = gcRoots;
+        this.repository = repository;
+        this.artifactIdentityDeterminer = artifactIdentityDeterminer;
+        this.eventLogger = eventLogger;
+    }
+
+    /**
+     * {@InheritDoc}
+     */
+    @Override
+    public void transform(GraphNode<InstallArtifact> installGraph, final InstallEnvironment installEnvironment) throws DeploymentException {
+        installGraph.visit(new ExceptionThrowingDirectedAcyclicGraphVisitor<InstallArtifact, DeploymentException>() {
+
+            @Override
+            public boolean visit(GraphNode<InstallArtifact> graph) throws DeploymentException {
+                PlanResolver.this.operate(graph.getValue());
+                return true;
+            }
+        });
+    }
+
+    private void operate(InstallArtifact installArtifact) throws DeploymentException {
+        if (installArtifact instanceof PlanInstallArtifact) {
+            PlanInstallArtifact planInstallArtifact = (PlanInstallArtifact) installArtifact;
+            if (planInstallArtifact.getGraph().getChildren().isEmpty()) {
+                try {
+                    String scopeName = getArtifactScopeName(planInstallArtifact);
+                    GraphNode<InstallArtifact> graph = planInstallArtifact.getGraph();
+                    List<ArtifactSpecification> artifactSpecifications = planInstallArtifact.getArtifactSpecifications();
+                    for (ArtifactSpecification artifactSpecification : artifactSpecifications) {
+                        GraphNode<InstallArtifact> childInstallNode = obtainInstallArtifactGraph(artifactSpecification, scopeName,
+                            planInstallArtifact.getProvisioning());
+
+                        boolean newNode = childInstallNode.getParents().isEmpty()
+                            && !(((AbstractInstallArtifact) childInstallNode.getValue()).getTopLevelDeployed());
+                        graph.addChild(childInstallNode);
+                        if (newNode) {
+                            // Put child into the INSTALLING state as Transformers (like this) are after the
+                            // "begin install"
+                            // pipeline stage.
+                            InstallArtifact childInstallArtifact = childInstallNode.getValue();
+                            ((AbstractInstallArtifact) childInstallArtifact).beginInstall();
+                        }
+                    }
+                } catch (DeploymentException de) {
+                    throw new DeploymentException("Deployment of " + planInstallArtifact + " failed: " + de.getMessage(), de);
+                }
+            }
+        }
+    }
+
+    /**
+     * Returns the scope name of the given {@link InstallArtifact} or <code>null</code> if the given InstallArtifact
+     * does not belong to a scope.
+     * 
+     * @param installArtifact the <code>InstallArtiface</code> whose scope name is required
+     * @return the scope name or <code>null</code> if the given InstallArtifact does not belong to a scope
+     */
+    private String getArtifactScopeName(InstallArtifact installArtifact) {
+        if (installArtifact instanceof PlanInstallArtifact) {
+            PlanInstallArtifact planInstallArtifact = (PlanInstallArtifact) installArtifact;
+            boolean scoped = planInstallArtifact.isScoped();
+            if (scoped) {
+                return planInstallArtifact.getName() + SCOPE_SEPARATOR + versionToShortString(planInstallArtifact.getVersion());
+            }
+        }
+        return installArtifact.getScopeName();
+    }
+
+    private static String versionToShortString(Version version) {
+        String result = version.toString();
+        while (result.endsWith(".0")) {
+            result = result.substring(0, result.length() - 2);
+        }
+        return result;
+    }
+
+    private GraphNode<InstallArtifact> obtainInstallArtifactGraph(ArtifactSpecification artifactSpecification, String scopeName,
+        Provisioning parentProvisioning) throws DeploymentException {
+        GraphNode<InstallArtifact> sharedNode = null;
+        ArtifactIdentity identity = null;
+        File artifact = null;
+        Map<String, String> properties = determineDeploymentProperties(artifactSpecification.getProperties(), parentProvisioning);
+        String repositoryName = null;
+        URI uri = artifactSpecification.getUri();
+        if (uri == null) {
+            RepositoryAwareArtifactDescriptor repositoryAwareArtifactDescriptor = lookup(artifactSpecification);
+            if (repositoryAwareArtifactDescriptor == null) {
+                String type = artifactSpecification.getType();
+                String name = artifactSpecification.getName();
+                VersionRange versionRange = artifactSpecification.getVersionRange();
+                sharedNode = findSharedNode(type, name, versionRange, null);
+                if (sharedNode == null) {
+                    this.eventLogger.log(DeployerLogEvents.ARTIFACT_NOT_FOUND, type, name, versionRange, this.repository.getName());
+                    throw new DeploymentException(type + " '" + name + "' in version range '" + versionRange + "' not found");
+                }
+            } else {
+                URI artifactUri = repositoryAwareArtifactDescriptor.getUri();
+
+                artifact = new File(artifactUri);
+                identity = new ArtifactIdentity(repositoryAwareArtifactDescriptor.getType(), repositoryAwareArtifactDescriptor.getName(),
+                    repositoryAwareArtifactDescriptor.getVersion(), scopeName);
+                repositoryName = repositoryAwareArtifactDescriptor.getRepositoryName();
+                sharedNode = findSharedNode(identity);
+            }
+
+        } else {
+            try {
+                artifact = new File(uri);
+            } catch (IllegalArgumentException e) {
+                throw new DeploymentException("Invalid artifact specification URI '" + uri.toString() + "'", e);
+            }
+            identity = determineIdentity(uri, scopeName);
+            sharedNode = findSharedNode(identity);
+        }
+        return sharedNode == null ? this.installArtifactGraphInclosure.constructGraphNode(identity, artifact, properties, repositoryName)
+            : sharedNode;
+    }
+
+    private Map<String, String> determineDeploymentProperties(Map<String, String> properties, Provisioning parentProvisioning) {
+        Map<String, String> deploymentProperties = new HashMap<String, String>(properties);
+        deploymentProperties.put(PROVISIONING_PROPERTY_NAME, parentProvisioning.toString());
+        return deploymentProperties;
+    }
+
+    private RepositoryAwareArtifactDescriptor lookup(ArtifactSpecification specification) throws DeploymentException {
+        String type = specification.getType();
+        String name = specification.getName();
+        VersionRange versionRange = specification.getVersionRange();
+
+        return this.repository.get(type, name, versionRange);
+    }
+
+    private ArtifactIdentity determineIdentity(URI artifactUri, String scopeName) throws DeploymentException {
+        try {
+            File artifact = new File(artifactUri);
+            if (!artifact.exists()) {
+                throw new DeploymentException(artifact + " does not exist");
+            }
+
+            return determineIdentity(artifact, scopeName);
+        } catch (Exception e) {
+            throw new DeploymentException(e.getMessage() + ": uri='" + artifactUri + "'", e);
+        }
+    }
+
+    private ArtifactIdentity determineIdentity(File file, String scopeName) throws DeploymentException {
+        ArtifactIdentity artifactIdentity = this.artifactIdentityDeterminer.determineIdentity(file, scopeName);
+
+        if (artifactIdentity == null) {
+            this.eventLogger.log(DeployerLogEvents.INDETERMINATE_ARTIFACT_TYPE, file);
+            throw new DeploymentException("Cannot determine the artifact identity of the file '" + file + "'");
+        }
+
+        return artifactIdentity;
+    }
+
+    private GraphNode<InstallArtifact> findSharedNode(ArtifactIdentity artifactIdentity) {
+        return ExistingNodeLocator.findSharedNode(this.gcRoots, artifactIdentity);
+    }
+
+    public GraphNode<InstallArtifact> findSharedNode(String type, String name, VersionRange versionRange, String scopeName) {
+        return ExistingNodeLocator.findSharedNode(this.gcRoots, type, name, versionRange, scopeName);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/Plumber.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/Plumber.java
new file mode 100644
index 0000000..e039c10
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/Plumber.java
@@ -0,0 +1,165 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core.internal;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.internal.AbstractInstallArtifact;
+import org.eclipse.virgo.kernel.install.environment.InstallEnvironment;
+import org.eclipse.virgo.kernel.install.pipeline.Pipeline;
+import org.eclipse.virgo.kernel.install.pipeline.PipelineFactory;
+import org.eclipse.virgo.kernel.install.pipeline.stage.resolve.internal.CommitStage;
+import org.eclipse.virgo.kernel.install.pipeline.stage.resolve.internal.QuasiInstallStage;
+import org.eclipse.virgo.kernel.install.pipeline.stage.resolve.internal.QuasiResolveStage;
+import org.eclipse.virgo.kernel.install.pipeline.stage.resolve.internal.ResolveStage;
+import org.eclipse.virgo.kernel.install.pipeline.stage.transform.internal.TransformationStage;
+import org.eclipse.virgo.kernel.install.pipeline.stage.visit.Visitor;
+import org.eclipse.virgo.kernel.install.pipeline.stage.visit.internal.VisitationStage;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.osgi.framework.BundleContext;
+import org.osgi.service.packageadmin.PackageAdmin;
+
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiFrameworkFactory;
+
+/**
+ * {@link Plumber} plumbs together pipeline stages for use in the {@link PipelinedApplicationDeployer}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+@SuppressWarnings("deprecation")
+final class Plumber {
+
+    private final PackageAdmin packageAdmin;
+
+    private final BundleContext bundleContext;
+
+    private final PipelineFactory pipelineFactory;
+
+    private final Pipeline pipeline;
+
+    private final Pipeline refreshSubpipeline;
+
+    private final QuasiFrameworkFactory quasiFrameworkFactory;
+
+    public Plumber(@NonNull PackageAdmin packageAdmin, @NonNull BundleContext bundleContext, @NonNull PipelineFactory pipelineFactory,
+        @NonNull QuasiFrameworkFactory quasiFrameworkFactory) {
+        this.packageAdmin = packageAdmin;
+        this.bundleContext = bundleContext;
+        this.pipelineFactory = pipelineFactory;
+        this.quasiFrameworkFactory = quasiFrameworkFactory;
+        this.refreshSubpipeline = this.pipelineFactory.create();
+        this.pipeline = this.pipelineFactory.create();
+        initialisePipelines();
+    }
+
+    public Pipeline getMainPipeline() {
+        return this.pipeline;
+    }
+
+    public Pipeline getRefreshSubpipeline() {
+        return this.refreshSubpipeline;
+    }
+
+    private void initialisePipelines() {
+        // new ManifestUpgrader(), new ImportExpander(this.bundleInstaller), new
+        // PlanResolver(this.installArtifactTreeInclosure));
+
+        TransformationStage transformationStage = new TransformationStage(this.bundleContext);
+
+        plumbRefreshPipeline(transformationStage);
+
+        plumbMainPipeline(transformationStage);
+    }
+
+    /**
+     * Build the main pipeline from normalization, install, and resolve stages using the given normalization and
+     * transformation stages.
+     */
+    private void plumbMainPipeline(TransformationStage transformationStage) {
+        plumbMainPipelineInstallStages(transformationStage);
+        plumbMainPipelineResolveStages();
+    }
+
+    private void plumbMainPipelineInstallStages(TransformationStage transformationStage) {
+        VisitationStage beginInstallStage = new VisitationStage(new Visitor() {
+
+            public void operate(InstallArtifact installArtifact, InstallEnvironment installEnvironment) throws DeploymentException {
+                ((AbstractInstallArtifact) installArtifact).beginInstall();
+
+            }
+        });
+
+        VisitationStage endInstallStage = new VisitationStage(new Visitor() {
+
+            public void operate(InstallArtifact installArtifact, InstallEnvironment installEnvironment) throws DeploymentException {
+                ((AbstractInstallArtifact) installArtifact).endInstall();
+
+            }
+        }, false);
+
+        VisitationStage failInstallStage = new VisitationStage(new Visitor() {
+
+            public void operate(InstallArtifact installArtifact, InstallEnvironment installEnvironment) throws DeploymentException {
+                ((AbstractInstallArtifact) installArtifact).failInstall();
+
+            }
+        }, false);
+
+        Pipeline installStages = this.pipelineFactory.createCompensatingPipeline(failInstallStage);
+
+        installStages.appendStage(transformationStage).appendStage(new QuasiInstallStage()).appendStage(new QuasiResolveStage()).appendStage(
+            new CommitStage());
+
+        this.pipeline.appendStage(beginInstallStage).appendStage(installStages).appendStage(endInstallStage);
+    }
+
+    private void plumbMainPipelineResolveStages() {
+        VisitationStage beginResolveStage = new VisitationStage(new Visitor() {
+
+            public void operate(InstallArtifact installArtifact, InstallEnvironment installEnvironment) throws DeploymentException {
+                ((AbstractInstallArtifact) installArtifact).beginResolve();
+
+            }
+        });
+
+        VisitationStage endResolveStage = new VisitationStage(new Visitor() {
+
+            public void operate(InstallArtifact installArtifact, InstallEnvironment installEnvironment) throws DeploymentException {
+                ((AbstractInstallArtifact) installArtifact).endResolve();
+
+            }
+        });
+
+        VisitationStage failResolveStage = new VisitationStage(new Visitor() {
+
+            public void operate(InstallArtifact installArtifact, InstallEnvironment installEnvironment) throws DeploymentException {
+                ((AbstractInstallArtifact) installArtifact).failResolve();
+
+            }
+        });
+
+        Pipeline resolveStages = this.pipelineFactory.createCompensatingPipeline(failResolveStage);
+
+        resolveStages.appendStage(new ResolveStage(this.packageAdmin, this.quasiFrameworkFactory));
+
+        this.pipeline.appendStage(beginResolveStage).appendStage(resolveStages).appendStage(endResolveStage);
+    }
+
+    private void plumbRefreshPipeline(TransformationStage transformationStage) {
+        this.refreshSubpipeline.appendStage(transformationStage);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/StandardDeployerConfiguration.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/StandardDeployerConfiguration.java
new file mode 100644
index 0000000..5339832
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/StandardDeployerConfiguration.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core.internal;
+
+import java.io.File;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeployerConfiguration;
+import org.eclipse.virgo.util.io.PathReference;
+
+/**
+ * Standard implementation of {@link DeployerConfiguration}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+final class StandardDeployerConfiguration implements DeployerConfiguration {
+
+    private final int deploymentTimeoutSeconds;
+
+    private final PathReference deploymentPickupDirectory;
+
+    private final int scanIntervalMillis;
+
+    /**
+     * Construct a deployment configuration using the given <code>deploymentTimeout</code>, <code>pickupDirectory</code>
+     * and <code>scanIntervalMillis</code>.
+     * 
+     * @param deploymentTimeout The timeout period, in seconds
+     * @param pickupDirectory The deployer's pickup directory
+     * @param scanIntervalMillis The deployer's scan interval in milliseconds
+     */
+    StandardDeployerConfiguration(int deploymentTimeout, File pickupDirectory, int scanIntervalMillis) {
+        this.deploymentTimeoutSeconds = deploymentTimeout;
+        this.deploymentPickupDirectory = new PathReference(pickupDirectory);
+        this.scanIntervalMillis = scanIntervalMillis;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public int getDeploymentTimeoutSeconds() {
+        return this.deploymentTimeoutSeconds;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public PathReference getDeploymentPickupDirectory() {
+        return this.deploymentPickupDirectory;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public int getScanIntervalMillis() {
+        return this.scanIntervalMillis;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String toString() {
+        return String.format("Timeout: '%s', Pickup directory: '%s', Scan interval in millis: '%s'", this.deploymentTimeoutSeconds,
+            this.deploymentPickupDirectory, this.scanIntervalMillis);
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/StandardDeploymentIdentity.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/StandardDeploymentIdentity.java
new file mode 100644
index 0000000..51e9d6c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/StandardDeploymentIdentity.java
@@ -0,0 +1,109 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core.internal;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.osgi.framework.Version;
+
+
+
+/**
+ * {@link StandardDeploymentIdentity} is the implementation of {@link DeploymentIdentity}.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * This class is immutable and therefore thread safe.
+ *
+ */
+public final class StandardDeploymentIdentity implements DeploymentIdentity {
+
+    private static final long serialVersionUID = 67849234293492373L;
+    
+    private final String type;
+    
+    private final String symbolicName;
+    
+    private final String version;
+        
+    /**
+     * Construct a {@link StandardDeploymentIdentity} with the given type, name, and version.
+     * 
+     * @param type the type of the deployed artefact
+     * @param symbolicName the symbolic name of the deployed artefact
+     * @param version the version of the deployed artefact
+     */
+    public StandardDeploymentIdentity(String type, String symbolicName, String version) {
+        this.type = type;
+        this.symbolicName = symbolicName;
+        
+        // Normalise the version to ensure accurate comparisons.
+        this.version = Version.parseVersion(version).toString();
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public String getType() {
+        return this.type;
+    }
+    
+    /** 
+     * {@inheritDoc}
+     */
+    public String getSymbolicName() {
+        return this.symbolicName;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public String getVersion() {
+        return this.version;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((type == null) ? 0 : type.hashCode());
+        result = prime * result + ((symbolicName == null) ? 0 : symbolicName.hashCode());
+        result = prime * result + ((version == null) ? 0 : version.hashCode());
+        return result;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj instanceof StandardDeploymentIdentity) {
+            final StandardDeploymentIdentity other = (StandardDeploymentIdentity) obj;
+            return (type        ==null ? other.type        ==null : type        .equals(other.type        ))
+            &&     (symbolicName==null ? other.symbolicName==null : symbolicName.equals(other.symbolicName))
+            &&     (version     ==null ? other.version     ==null : version     .equals(other.version     ))
+            ;
+        }
+        return false;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override public String toString() {
+        return "DeploymentIdentity(" + getType() + ", " + getSymbolicName() + ", " + getVersion() + ")";
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/StateCleanupInstallArtifactLifecycleListener.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/StateCleanupInstallArtifactLifecycleListener.java
new file mode 100644
index 0000000..b7d3317
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/StateCleanupInstallArtifactLifecycleListener.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core.internal;
+
+import java.net.URI;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.eclipse.virgo.kernel.deployer.core.internal.event.DeploymentListener;
+import org.eclipse.virgo.kernel.deployer.model.RuntimeArtifactModel;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifactLifecycleListener;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifactLifecycleListenerSupport;
+
+
+/**
+ * Cleans up the state related to an {@link InstallArtifact} when it is uninstalled.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ * 
+ */
+final class StateCleanupInstallArtifactLifecycleListener extends InstallArtifactLifecycleListenerSupport implements InstallArtifactLifecycleListener {
+
+    private final DeploymentListener deploymentListener;
+
+    private final RuntimeArtifactModel runtimeArtifactModel;
+
+    StateCleanupInstallArtifactLifecycleListener(DeploymentListener deploymentListener, RuntimeArtifactModel runtimeArtifactModel) {
+        this.deploymentListener = deploymentListener;
+        this.runtimeArtifactModel = runtimeArtifactModel;
+    }
+
+    @Override
+    public void onUninstalled(InstallArtifact installArtifact) throws DeploymentException {
+        DeploymentIdentity deploymentIdentity = new StandardDeploymentIdentity(installArtifact.getType(), installArtifact.getName(),
+            installArtifact.getVersion().toString());
+
+        URI location = this.runtimeArtifactModel.getLocation(deploymentIdentity);
+
+        if (location != null) {
+            this.deploymentListener.undeployed(location);
+            this.runtimeArtifactModel.delete(deploymentIdentity);
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/event/DeploymentListener.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/event/DeploymentListener.java
new file mode 100644
index 0000000..664a9a7
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/event/DeploymentListener.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core.internal.event;
+
+import java.net.URI;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentOptions;
+
+
+
+/**
+ * A <code>DeploymentListener</code> is notified of deployment events.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Thread-safe.
+ *
+ */
+public interface DeploymentListener {
+    
+    void refreshed(URI sourceLocation);
+    
+    void deployed(URI sourceLocation, DeploymentOptions deploymentOptions);
+    
+    void undeployed(URI sourceLocation);
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/recovery/DeployerRecoveryLog.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/recovery/DeployerRecoveryLog.java
new file mode 100644
index 0000000..f06c9a6
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/recovery/DeployerRecoveryLog.java
@@ -0,0 +1,274 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core.internal.recovery;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.io.Reader;
+import java.io.Writer;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentOptions;
+import org.eclipse.virgo.nano.deployer.api.core.FatalDeploymentException;
+import org.eclipse.virgo.util.io.PathReference;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * {@link DeployerRecoveryLog} maintains the deployer's recoverable state across restarts.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+final class DeployerRecoveryLog {
+
+    private static final String REDEPLOY_FILE_NAME = "deployed";
+
+    private static final String REDEPLOY_COMPRESSION_FILE_NAME = "deployed.compress";
+
+    private static final int INITIAL_REDEPLOY_DATA_SIZE = 32 * 1024;
+
+    private static final int COMPRESSION_THRESHOLD = 10;
+
+    private static final int COMMAND_LENGTH = 3;
+
+    private static final String UNDEPLOY_URI_COMMAND = "---";
+
+    private static final String URI_SEPARATOR = ";";
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private final PathReference redeployDataset;
+
+    private final PathReference redeployCompressionDataset;
+
+    private final long redeployFileLastModified;
+
+    DeployerRecoveryLog(PathReference workArea) {
+        PathReference recoveryArea = workArea.newChild("recovery");
+        recoveryArea.createDirectory();
+
+        this.redeployDataset = recoveryArea.newChild(REDEPLOY_FILE_NAME);
+        this.redeployFileLastModified = this.redeployDataset.toFile().lastModified();
+        this.redeployCompressionDataset = recoveryArea.newChild(REDEPLOY_COMPRESSION_FILE_NAME);
+
+        // Recover from a crash during compression
+        if (!this.redeployDataset.exists() && this.redeployCompressionDataset.exists()) {
+            this.redeployCompressionDataset.copy(this.redeployDataset);
+            if (!this.redeployCompressionDataset.delete()) {
+                logger.warn("Could not delete '%s' in recovery after compression failure.", this.redeployCompressionDataset);
+            }
+        }
+    }
+
+    /**
+     * Get the URIs that need to be recovered along with their deployment options.
+     * 
+     * @return a map of URI to deployment options
+     */
+    public Map<URI, DeploymentOptions> getRecoveryState() {
+        Map<URI, DeploymentOptions> redeploySet = new LinkedHashMap<URI, DeploymentOptions>(20);
+
+        String redeployData = readRedployData();
+
+        int recordCount = 0;
+        int undeployCount = 0;
+
+        for (String uriCommandString : redeployData.split(URI_SEPARATOR)) {
+            recordCount++;
+            // Skip short command strings as there will typically be one
+            // at the end of the dataset.
+            if (uriCommandString.length() >= COMMAND_LENGTH) {
+                String uriCommand = uriCommandString.substring(0, COMMAND_LENGTH);
+                String uriString = uriCommandString.substring(COMMAND_LENGTH);
+                try {
+                    URI uri = new URI(uriString);
+                    if (UNDEPLOY_URI_COMMAND.equals(uriCommand)) {
+                        undeployCount++;
+                        redeploySet.remove(uri);
+                    } else {
+                        char[] commands = uriCommand.toCharArray();
+                        DeploymentOptions options = new DeploymentOptions(fromCommandOption(commands[0]), fromCommandOption(commands[1]),
+                            fromCommandOption(commands[2]));
+
+                        redeploySet.put(uri, options);
+                    }
+                } catch (URISyntaxException e) {
+                    logger.error("Invalid URI in command string '%s' read from redeploy dataset", e, uriCommandString);
+                    // skip and carry on
+                }
+            }
+        }
+
+        // If there is a significant amount of wasted space in the redeploy
+        // dataset, rewrite it.
+        if (COMPRESSION_THRESHOLD * undeployCount > recordCount) {
+            rewriteRedeploySet(redeploySet);
+        }
+
+        return redeploySet;
+    }
+
+    private String readRedployData() {
+        StringBuffer redeployData = new StringBuffer(INITIAL_REDEPLOY_DATA_SIZE);
+        Reader redeployDataReader = null;
+        try {
+            redeployDataReader = new BufferedReader(new InputStreamReader(new FileInputStream(redeployDataset.toFile()), UTF_8));
+            try {
+                char[] chars = new char[INITIAL_REDEPLOY_DATA_SIZE];
+                int numRead;
+                while (-1 != (numRead = redeployDataReader.read(chars))) {
+                    redeployData.append(String.valueOf(chars, 0, numRead));
+                }
+            } catch (IOException e) {
+                logger.error("Problem reading redeploy dataset", e);
+            } finally {
+                try {
+                    redeployDataReader.close();
+                } catch (IOException e) {
+                    logger.error("Problem closing redeploy dataset", e);
+                }
+            }
+        } catch (FileNotFoundException e) {
+            // Ignore - this is acceptable if there are no deployed applications
+        }
+        return redeployData.toString();
+    }
+
+    /**
+     * Write the given set of URIs to the redeploy dataset. To avoid corruption if a crash occurs, write to a redeploy
+     * compression file and then switch this for the redeploy dataset.
+     * 
+     * @param redeploySet the URIs to be written
+     */
+    private void rewriteRedeploySet(Map<URI, DeploymentOptions> redeploySet) {
+        this.redeployCompressionDataset.delete();
+        try (Writer redeployDataWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(this.redeployCompressionDataset.toFile()),
+            UTF_8))) {
+            for (Entry<URI, DeploymentOptions> redeployEntry : redeploySet.entrySet()) {
+                recordUriCommand(redeployDataWriter, redeployEntry.getKey(), getCommandString(redeployEntry.getValue()));
+            }
+            redeployDataWriter.close();
+        } catch (IOException e) {
+            logger.warn("Problem while rewriting redeploy dataset", e);
+            // Return without replacing the redeploy dataset.
+        }
+        // Now switch the files
+        this.redeployDataset.delete();
+        this.redeployCompressionDataset.moveTo(this.redeployDataset);
+    }
+
+    /**
+     * Add the given location and deployment options to the recovery state.
+     * 
+     * @param location
+     * @param deploymentOptions
+     */
+    void add(URI location, DeploymentOptions deploymentOptions) {
+        recordUriCommand(location, getCommandString(deploymentOptions));
+    }
+
+    /**
+     * Return the command string for tagging the type of a log record based on the given deployment options.
+     * 
+     * @param deploymentOptions
+     * @return the command string
+     */
+    private String getCommandString(DeploymentOptions deploymentOptions) {
+        // boolean recoverable, boolean deployerOwned, boolean synchronous
+        StringBuilder command = new StringBuilder().append(toCommandOption(deploymentOptions.getRecoverable())).append(
+            toCommandOption(deploymentOptions.getDeployerOwned())).append(toCommandOption(deploymentOptions.getSynchronous()));
+        return command.toString();
+    }
+
+    /**
+     * Remove the given location and associated deployment options from the recovery state.
+     * 
+     * @param location
+     */
+    void remove(URI location) {
+        recordUriCommand(location, UNDEPLOY_URI_COMMAND);
+    }
+
+    private void recordUriCommand(URI uri, String command) {
+        try (Writer writer = new FileWriter(this.redeployDataset.toFile(), true)) {
+            recordUriCommand(writer, uri, command);
+            writer.close();
+        } catch (IOException e) {
+            throw new FatalDeploymentException("Failed to record (un)deployment", e);
+        }
+
+    }
+
+    private static void recordUriCommand(Writer writer, URI uri, String command) throws IOException {
+        writer.write(command);
+        writer.write(uri.toString());
+        writer.write(URI_SEPARATOR);
+    }
+
+    /**
+     * Converts boolean deployment option flag to a string representation for the logged command option
+     * 
+     * @param deploymentOption
+     * @return
+     */
+    private static char toCommandOption(boolean deploymentOption) {
+        return deploymentOption ? 'Y' : 'N';
+    }
+
+    /**
+     * Converts from a String command option to a boolean deployment option flag
+     * 
+     * @param commandOption
+     * @return
+     */
+    private static boolean fromCommandOption(char commandOption) {
+        return 'Y' == commandOption ? true : false;
+    }
+
+    /**
+     * Get the last modified time of the deployer's recovery file. Any applications in the pickup directory with a later
+     * last modified time will need to be redeployed.
+     * 
+     * @return the last modified time of the deployer's recovery file
+     */
+    public long getRedeployFileLastModified() {
+        return redeployFileLastModified;
+    }
+
+    /**
+     * Update the last modified time of the deployer's recovery file.
+     * 
+     * @return <code>true</code> iff the operation succeeded
+     */
+    // TODO Make package private
+    public boolean setRedeployFileLastModified() {
+        return this.redeployDataset.touch();
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/recovery/DeployerRecoveryLogDeploymentListener.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/recovery/DeployerRecoveryLogDeploymentListener.java
new file mode 100644
index 0000000..385ab39
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/recovery/DeployerRecoveryLogDeploymentListener.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core.internal.recovery;
+
+import java.net.URI;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentOptions;
+import org.eclipse.virgo.kernel.deployer.core.internal.event.DeploymentListener;
+
+
+
+/**
+ * TODO Document DeployerRecoveryLogDeploymentListener
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * TODO Document concurrent semantics of DeployerRecoveryLogDeploymentListener
+ *
+ */
+final class DeployerRecoveryLogDeploymentListener implements DeploymentListener {
+    
+    private final DeployerRecoveryLog recoveryLog;
+            
+    DeployerRecoveryLogDeploymentListener(DeployerRecoveryLog recoveryLog) {
+        this.recoveryLog = recoveryLog;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void deployed(URI sourceLocation, DeploymentOptions deploymentOptions) {
+        this.recoveryLog.add(sourceLocation, deploymentOptions);
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void refreshed(URI sourceLocation) {
+        this.recoveryLog.setRedeployFileLastModified();
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void undeployed(URI sourceLocation) {
+        this.recoveryLog.remove(sourceLocation);
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/recovery/RecoveryAgent.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/recovery/RecoveryAgent.java
new file mode 100644
index 0000000..9d7ee29
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/recovery/RecoveryAgent.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core.internal.recovery;
+
+import java.net.URI;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventHandler;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeployerLogEvents;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentOptions;
+import org.eclipse.virgo.nano.deployer.api.core.FatalDeploymentException;
+import org.eclipse.virgo.kernel.deployer.core.internal.ApplicationRecoverer;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+
+/**
+ * A <code>RecoveryAgent</code> is an {@link EventHandler} that waits for <code>systemartifacts/DEPLOYED</code> and, if
+ * recovery is enabled, drives recovery on all redeploy entries in the recovery state.
+ * The recovery is run in another thread.
+ * When complete (or if not enabled), fires the <code>recovery/COMPLETED</code> event.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ * thread-safe
+ *
+ */
+final class RecoveryAgent implements EventHandler {
+    
+    private static final String TOPIC_SYSTEM_ARTIFACTS_DEPLOYED = "org/eclipse/virgo/kernel/userregion/systemartifacts/DEPLOYED";
+    
+    private static final String TOPIC_RECOVERY_COMPLETED = "org/eclipse/virgo/kernel/deployer/recovery/COMPLETED";
+    
+    private final ApplicationRecoverer recoverer;
+    
+    private final EventLogger eventLogger;
+    
+    private final EventAdmin eventAdmin;
+    
+    private final Map<URI, DeploymentOptions> recoveryState;
+    
+    public RecoveryAgent(ApplicationRecoverer recoverer, DeployerRecoveryLog recoveryLog, EventLogger eventLogger, EventAdmin eventAdmin) {
+        this.recoverer = recoverer;
+        this.recoveryState = recoveryLog.getRecoveryState();
+        this.eventLogger = eventLogger;
+        this.eventAdmin = eventAdmin;
+    }
+
+    void performRecovery() {                
+        if (isRecoveryEnabled()) {
+            Thread recoveryThread = new Thread(new Runnable() {
+                public void run() {
+                	try {	                    
+	                    for (Entry<URI, DeploymentOptions> redeployEntry : recoveryState.entrySet()) {
+	                        URI uri = redeployEntry.getKey();
+	                        DeploymentOptions deploymentOptions = redeployEntry.getValue();
+	                        try {
+	                            recoverer.recoverDeployment(uri, deploymentOptions);
+	                        } catch (DeploymentException e) {
+	                            eventLogger.log(DeployerLogEvents.RECOVERY_FAILED, e, uri);
+	                        } catch (FatalDeploymentException e) {
+	                            eventLogger.log(DeployerLogEvents.RECOVERY_FAILED, e, uri);
+	                        }
+	                    }
+                	} finally {
+                		recoveryComplete();
+                	}
+                }
+            }, "deployer-recovery");
+            recoveryThread.start();
+        } else {
+            recoveryComplete();
+        }
+    }
+
+	private void recoveryComplete() {
+		this.recoveryState.clear();
+		eventAdmin.postEvent(new Event(TOPIC_RECOVERY_COMPLETED, (Map<String, ?>)null));
+	}
+    
+    private boolean isRecoveryEnabled() {
+        return !Boolean.valueOf(FrameworkUtil.getBundle(getClass()).getBundleContext().getProperty("org.eclipse.virgo.kernel.deployer.disableRecovery"));
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void handleEvent(Event event) {
+        if (TOPIC_SYSTEM_ARTIFACTS_DEPLOYED.equals(event.getTopic())) {
+            performRecovery();
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/uri/CompoundDeployUriNormaliser.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/uri/CompoundDeployUriNormaliser.java
new file mode 100644
index 0000000..0ee46a1
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/uri/CompoundDeployUriNormaliser.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core.internal.uri;
+
+import java.net.URI;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeployUriNormaliser;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+
+
+
+/**
+ * A {@link DeployUriNormaliser} implementation that calls a list of delegate
+ * normalisers until the {@link URI} is normalised.
+ * 
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * As thread-safe as the delegates.
+ *
+ */
+class CompoundDeployUriNormaliser implements DeployUriNormaliser {
+    
+    private final DeployUriNormaliser[] normalisers;
+       
+    public CompoundDeployUriNormaliser(@NonNull DeployUriNormaliser[] normalisers) {       
+        this.normalisers = normalisers.clone();
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public URI normalise(URI uri) throws DeploymentException {
+        for (DeployUriNormaliser normaliser : normalisers) {
+            URI normalised = normaliser.normalise(uri);
+            if (normalised != null) {
+                return normalised;
+            }
+        }
+        return null;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/uri/FileDeployUriNormaliser.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/uri/FileDeployUriNormaliser.java
new file mode 100644
index 0000000..9d728b5
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/uri/FileDeployUriNormaliser.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core.internal.uri;
+
+import java.net.URI;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeployUriNormaliser;
+
+
+/**
+ * A {@link DeployUriNormaliser} implementation that normalises file: {@link URI URIs}.
+ * 
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Thread-safe.
+ *
+ */
+class FileDeployUriNormaliser implements DeployUriNormaliser {
+    
+    private static final String SCHEME_FILE = "file";
+
+    /** 
+     * {@inheritDoc}
+     */
+    public URI normalise(URI uri) {
+        if (SCHEME_FILE.equals(uri.getScheme())) {            
+            return uri;
+        }
+        return null;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/uri/RepositoryDeployUriNormaliser.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/uri/RepositoryDeployUriNormaliser.java
new file mode 100644
index 0000000..2b8d26b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/core/internal/uri/RepositoryDeployUriNormaliser.java
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core.internal.uri;
+
+import java.net.URI;
+
+import org.osgi.framework.Version;
+
+
+import org.eclipse.virgo.nano.deployer.api.core.DeployUriNormaliser;
+import org.eclipse.virgo.nano.deployer.api.core.DeployerLogEvents;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+import org.eclipse.virgo.repository.Repository;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+
+/**
+ * A {@link DeployUriNormaliser} implementation that works with a {@link Repository}. Uris in the form
+ * repository://type/name/version are normalised by querying the <code>Repository</code> for a matching
+ * {@link ArtifactDescriptor} and, if one is found, returning its {@link ArtifactDescriptor#getUri() URI}.
+ * 
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ * 
+ */
+final class RepositoryDeployUriNormaliser implements DeployUriNormaliser {
+
+    private static final String SCHEME_REPOSITORY = "repository";
+    
+    private static final int COMPONENTS_MINIMUM = 2;
+    
+    private static final int COMPONENTS_MAXIMUM = 3;
+    
+    private final Repository repository;
+    
+    private final EventLogger eventLogger;
+    
+    RepositoryDeployUriNormaliser(@NonNull Repository repository, EventLogger eventLogger) {
+        this.repository = repository;
+        this.eventLogger = eventLogger;
+    }
+
+    public URI normalise(URI uri) throws DeploymentException {
+        if (SCHEME_REPOSITORY.equals(uri.getScheme())) {
+            return normaliseRepositoryUri(uri);
+        }
+        return null;
+    }
+
+    private URI normaliseRepositoryUri(URI uri) throws DeploymentException {
+        String[] tnv = extractTypeNameAndVersion(uri);
+        
+        URI normalisedUri = null;
+        if (tnv.length >= COMPONENTS_MINIMUM && tnv.length <= COMPONENTS_MAXIMUM) {
+            String versionString = null;
+            if (tnv.length == 3) {
+                versionString = tnv[2];
+            }
+            ArtifactDescriptor artifactDescriptor = lookupArtifactDescriptor(tnv[0], tnv[1], versionString, uri);        
+            if (artifactDescriptor != null) {
+                normalisedUri = artifactDescriptor.getUri();
+            }            
+        } else {
+            this.eventLogger.log(DeployerLogEvents.REPOSITORY_DEPLOYMENT_URI_MALFORMED, uri);
+            throw new DeploymentException("The URI '" + uri + "' is malformed");
+        }
+        return normalisedUri;
+    }
+
+    private String[] extractTypeNameAndVersion(URI uri) {
+        String tnv = uri.getSchemeSpecificPart();
+        String[] tnvComponents = tnv.split("/");
+        return tnvComponents;
+    }
+    
+    private ArtifactDescriptor lookupArtifactDescriptor(String type, String name, String versionString, URI uri) throws DeploymentException {                
+        try {
+            VersionRange versionRange;
+            
+            if (versionString == null) {
+                versionRange = VersionRange.NATURAL_NUMBER_RANGE;
+            } else {
+                Version version = new Version(versionString);
+                versionRange = VersionRange.createExactRange(version);
+            }
+            
+            ArtifactDescriptor artifactDescriptor = this.repository.get(type, name, versionRange);
+            if (artifactDescriptor == null) {
+                this.eventLogger.log(DeployerLogEvents.ARTIFACT_NOT_FOUND, type, name, versionRange, this.repository.getName());
+                throw new DeploymentException("The URI '" + uri + "' references a non-existent artifact");
+            }
+            return artifactDescriptor;
+        } catch (IllegalArgumentException iae) {
+            this.eventLogger.log(DeployerLogEvents.REPOSITORY_DEPLOYMENT_INVALID_VERSION, versionString, uri);
+            throw new DeploymentException("The version '" + versionString + "' is invalid");
+        }            
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/hotenabler/HotDeployerEnabler.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/hotenabler/HotDeployerEnabler.java
new file mode 100644
index 0000000..8d07201
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/hotenabler/HotDeployerEnabler.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.hotenabler;
+
+import org.eclipse.virgo.nano.deployer.api.core.ApplicationDeployer;
+import org.eclipse.virgo.nano.deployer.api.core.DeployerConfiguration;
+import org.eclipse.virgo.nano.deployer.hot.HotDeployer;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventHandler;
+
+/**
+ * Handles hot deployment of application artefacts.
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.
+ * 
+ */
+public final class HotDeployerEnabler implements EventHandler {
+
+    private static final String TOPIC_RECOVERY_COMPLETED = "org/eclipse/virgo/kernel/deployer/recovery/COMPLETED";
+
+    private final HotDeployer hotDeployer;
+    
+    private final DeployerConfiguration deployerConfig;
+
+    /**
+     * Creates a new <code>HotDeployer</code>.
+     * 
+     * @param deployerConfiguration the {@link DeployerConfiguration} parameters.
+     * @param deployer the {@link ApplicationDeployer} to deploy to.
+     * @param eventLogger where to log events
+     */
+    public HotDeployerEnabler(@NonNull DeployerConfiguration deployerConfiguration, @NonNull ApplicationDeployer deployer,
+         EventLogger eventLogger) {
+        this.deployerConfig = deployerConfiguration;
+        this.hotDeployer = new HotDeployer(deployerConfiguration, deployer, eventLogger);
+    }
+
+    /**
+     * Start the <code>FileSystemWatcher</code>.
+     */
+    private void doStart() {
+        this.hotDeployer.doStart();
+    }
+
+    /**
+     * Stop the <code>FileSystemWatcher</code>,
+     */
+    public void stop() {
+        this.hotDeployer.doStop();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String toString() {
+        return String.format("Hot Deployer [pickupDir = %s]", this.deployerConfig.getDeploymentPickupDirectory().getAbsolutePath());
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void handleEvent(Event event) {
+        if (TOPIC_RECOVERY_COMPLETED.equals(event.getTopic())) {
+            doStart();
+        }    
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/management/StandardDeployer.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/management/StandardDeployer.java
new file mode 100644
index 0000000..02b5c0b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/management/StandardDeployer.java
@@ -0,0 +1,134 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.management;
+
+import java.io.File;
+import java.net.URI;
+import java.net.URISyntaxException;
+
+import org.eclipse.virgo.nano.deployer.api.ArtifactIdentity;
+import org.eclipse.virgo.nano.deployer.api.Deployer;
+import org.eclipse.virgo.nano.deployer.api.core.ApplicationDeployer;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentOptions;
+
+
+/**
+ * Standard implementation of the deployer's control.
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread-safe assuming that the ApplicationDeployer is thread-safe.
+ * 
+ */
+public class StandardDeployer implements Deployer {
+
+    private final ApplicationDeployer applicationDeployer;
+
+    public StandardDeployer(ApplicationDeployer applicationDeployer) {
+        this.applicationDeployer = applicationDeployer;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public DeploymentIdentity deploy(String uri) throws DeploymentException {
+        return this.applicationDeployer.deploy(URI.create(uri));
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public DeploymentIdentity deploy(String uri, boolean recoverable) throws DeploymentException {
+        return this.applicationDeployer.deploy(URI.create(uri), new DeploymentOptions(recoverable, false, true));
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @SuppressWarnings("deprecation")
+    public void undeploy(String applicationSymbolicName, String version) throws DeploymentException {
+        this.applicationDeployer.undeploy(applicationSymbolicName, version);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void refresh(String uri, String symbolicName) throws DeploymentException {
+        this.applicationDeployer.refresh(URI.create(uri), symbolicName);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void refreshBundle(String bundleSymbolicName, String bundleVersion) throws DeploymentException {
+        this.applicationDeployer.refreshBundle(bundleSymbolicName, bundleVersion);
+    }
+
+    public ArtifactIdentity install(String artifactUri) throws DeploymentException {
+        DeploymentIdentity deploymentIdentity = this.applicationDeployer.install(createURI(artifactUri), new DeploymentOptions());
+        return new ArtifactIdentity(deploymentIdentity.getType(), deploymentIdentity.getSymbolicName(), deploymentIdentity.getVersion());
+    }
+
+    public ArtifactIdentity install(String artifactUri, boolean recover) throws DeploymentException {
+        DeploymentIdentity deploymentIdentity = this.applicationDeployer.install(createURI(artifactUri), new DeploymentOptions(recover, false, true));
+        return new ArtifactIdentity(deploymentIdentity.getType(), deploymentIdentity.getSymbolicName(), deploymentIdentity.getVersion());
+    }
+
+    public ArtifactIdentity install(String type, String name, String version) throws DeploymentException {
+        throw new UnsupportedOperationException("Not yet implemented, use deploy instead of install and start");
+    }
+
+    public ArtifactIdentity install(String type, String name, String version, boolean recover) throws DeploymentException {
+        throw new UnsupportedOperationException("Not yet implemented, use deploy instead of install and start");
+    }
+
+    public void start(ArtifactIdentity artifactIdentity) throws DeploymentException, IllegalStateException {
+        throw new UnsupportedOperationException("Not yet implemented, use deploy instead of install and start");
+
+    }
+
+    public void start(String type, String name, String version) throws DeploymentException, IllegalStateException {
+        throw new UnsupportedOperationException("Not yet implemented, use deploy instead of install and start");
+    }
+
+    public void stop(ArtifactIdentity artifactIdentity) throws DeploymentException, IllegalStateException {
+        throw new UnsupportedOperationException("Not yet implemented, use undeploy instead of stop and uninstall");
+    }
+
+    public void stop(String type, String name, String version) throws DeploymentException, IllegalStateException {
+        throw new UnsupportedOperationException("Not yet implemented, use undeploy instead of stop and uninstall");
+    }
+
+    public void uninstall(ArtifactIdentity artifactIdentity) throws DeploymentException {
+        throw new UnsupportedOperationException("Not yet implemented, use undeploy instead of stop and uninstall");
+    }
+
+    public void uninstall(String type, String name, String version) throws DeploymentException {
+        throw new UnsupportedOperationException("Not yet implemented, use undeploy instead of stop and uninstall");
+    }
+
+    private URI createURI(String uriString) {
+        URI uri;
+        try {
+            uri = new URI(uriString);
+        } catch (URISyntaxException urise) {
+            throw new IllegalArgumentException(String.format("The location '%s' is not a valid URI", uriString));
+        }
+
+        if ("file".equals(uri.getScheme())) {
+            uri = new File(uri.getSchemeSpecificPart()).toURI();
+        }
+
+        return uri;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/model/DuplicateDeploymentIdentityException.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/model/DuplicateDeploymentIdentityException.java
new file mode 100644
index 0000000..c83b6cb
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/model/DuplicateDeploymentIdentityException.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.model;
+
+import org.eclipse.virgo.nano.core.KernelException;
+
+/**
+ */
+public final class DuplicateDeploymentIdentityException extends KernelException {
+
+    private static final long serialVersionUID = -730509322497877970L;
+
+    public DuplicateDeploymentIdentityException(String message) {
+        super(message);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/model/DuplicateFileNameException.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/model/DuplicateFileNameException.java
new file mode 100644
index 0000000..8c80658
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/model/DuplicateFileNameException.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.model;
+
+import org.eclipse.virgo.nano.core.KernelException;
+
+/**
+ */
+public final class DuplicateFileNameException extends KernelException {
+
+    private static final long serialVersionUID = -3176735650891485758L;
+
+    public DuplicateFileNameException(String message) {
+        super(message);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/model/DuplicateLocationException.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/model/DuplicateLocationException.java
new file mode 100644
index 0000000..6545656
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/model/DuplicateLocationException.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.model;
+
+import org.eclipse.virgo.nano.core.KernelException;
+
+/**
+ */
+public final class DuplicateLocationException extends KernelException {
+
+    private static final long serialVersionUID = -3566869644719767195L;
+
+    public DuplicateLocationException(String message) {
+        super(message);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/model/GCRoots.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/model/GCRoots.java
new file mode 100644
index 0000000..e7701d1
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/model/GCRoots.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2012 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.model;
+
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+
+/**
+ * {@link GCRoots}, "garbage collection roots", provides access to the install artifacts that have been installed
+ * directly rather than as children of other install artifacts. The notion is that an install artifact becomes eligible
+ * for garbage collection when it is no longer accessible from the GC roots. The "GC root" terminology is important as a
+ * GC root may be a child of another install artifact due to the way install artifacts may be shared.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Implementations of this interface must be thread safe.
+ */
+public interface GCRoots extends Iterable<InstallArtifact> {
+
+    /**
+     * Checks whether or not the given {@link InstallArtifact} is a GC root.
+     * 
+     * @param installArtifact the {@link InstallArtifact} to be checked, which must not be <code>null</code>
+     * @return <code>true</code> if and only if the given {@link InstallArtifact} is a GC root
+     */
+    boolean isGCRoot(@NonNull InstallArtifact installArtifact);
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/model/RuntimeArtifactModel.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/model/RuntimeArtifactModel.java
new file mode 100644
index 0000000..c082025
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/model/RuntimeArtifactModel.java
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.model;
+
+import java.net.URI;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+
+
+/**
+ * {@link RuntimeArtifactModel} tracks all the {@link InstallArtifact InstallArtifacts} in the kernel.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations of this interface must be thread safe.
+ * 
+ */
+public interface RuntimeArtifactModel {
+
+    /**
+     * Adds the given {@link InstallArtifact} deployed from the given {@link URI} to this {@link RuntimeArtifactModel}.
+     * 
+     * @param location the <code>URI</code> from which the artifact was deployed
+     * @param installArtifact the <code>InstallArtifact</code>
+     * @return the {@link DeploymentIdentity} of the <code>InstallArtifact</code>
+     * @throws DuplicateFileNameException 
+     * @throws DuplicateLocationException 
+     * @throws DuplicateDeploymentIdentityException 
+     * @throws DeploymentException 
+     */
+    DeploymentIdentity add(URI location, InstallArtifact installArtifact) throws DuplicateFileNameException, DuplicateLocationException,
+        DuplicateDeploymentIdentityException, DeploymentException;
+
+    /**
+     * Gets the {@link InstallArtifact} with the given {@link DeploymentIdentity} in this {@link RuntimeArtifactModel}.
+     * If there is no such <code>InstallArtifact</code>, returns <code>null</code>.
+     * 
+     * @param deploymentIdentity the <code>DeploymentIdentity</code> of the <code>InstallArtifact</code> to get
+     * @return the <code>InstallArtifact</code> or <code>null</code> if there is no such <code>InstallArtifact</code>
+     */
+    InstallArtifact get(DeploymentIdentity deploymentIdentity);
+
+    /**
+     * Gets the {@link InstallArtifact} deployed from the given {@link URI} in this {@link RuntimeArtifactModel}. If
+     * there is no such <code>InstallArtifact</code>, returns <code>null</code>.
+     * 
+     * @param location the <code>URI</code> of the <code>InstallArtifact</code> to get
+     * @return the <code>InstallArtifact</code> or <code>null</code> if there is no such <code>InstallArtifact</code>
+     */
+    InstallArtifact get(URI location);
+
+    /**
+     * Gets the {@link URI} from which the artifact with the given {@link DeploymentIdentity} was deployed.
+     * 
+     * @param deploymentIdentity the <code>DeploymentIdentity</code> of the artifact
+     * @return the <code>URI</code> from which the artifact was deployed, or <code>null</code> if no such artifact was
+     *         found
+     */
+    URI getLocation(DeploymentIdentity deploymentIdentity);
+
+    /**
+     * Gets an array of all the {@link DeploymentIdentity DeploymentIdentities} in this {@link RuntimeArtifactModel}.
+     * 
+     * @return an array of <code>DeploymentIdentity</code>
+     */
+    DeploymentIdentity[] getDeploymentIdentities();
+
+    /**
+     * Deletes the {@link InstallArtifact} with the given {@link DeploymentIdentity} from this
+     * {@link RuntimeArtifactModel} and returns the <code>InstallArtifact</code>. If no such artifact is present, does
+     * not modify this <code>RuntimeArtifactModel</code> and returns <code>null</code>.
+     * 
+     * @param deploymentIdentity the <code>DeploymentIdentity</code> of the artifact to be deleted
+     * @return the <code>InstallArtifact</code> which was deleted
+     * @throws DeploymentException 
+     */
+    InstallArtifact delete(DeploymentIdentity deploymentIdentity) throws DeploymentException;
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/model/internal/StandardRuntimeArtifactModel.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/model/internal/StandardRuntimeArtifactModel.java
new file mode 100644
index 0000000..2142360
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/model/internal/StandardRuntimeArtifactModel.java
@@ -0,0 +1,261 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.model.internal;
+
+import java.io.File;
+import java.net.URI;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeployUriNormaliser;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.eclipse.virgo.kernel.deployer.core.internal.StandardDeploymentIdentity;
+import org.eclipse.virgo.kernel.deployer.model.DuplicateDeploymentIdentityException;
+import org.eclipse.virgo.kernel.deployer.model.DuplicateFileNameException;
+import org.eclipse.virgo.kernel.deployer.model.DuplicateLocationException;
+import org.eclipse.virgo.kernel.deployer.model.GCRoots;
+import org.eclipse.virgo.kernel.deployer.model.RuntimeArtifactModel;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.nano.serviceability.Assert;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+
+/**
+ * {@link StandardRuntimeArtifactModel} is the default {@link RuntimeArtifactModel} implementation.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+final class StandardRuntimeArtifactModel implements RuntimeArtifactModel, GCRoots {
+
+    private static final String CLASH_MESSAGE_FORMAT = "The artifact %s at URI '%s' cannot be stored in the runtime artifact model as it clashes with the artifact %s which is already present.";
+
+    private static final String URI_PATH_SEPARATOR = "/";
+
+    private static final String SCHEME_FILE = "file";
+
+    private final Object monitor = new Object();
+
+    private final Map<URI, InstallArtifact> artifactByUri = new HashMap<URI, InstallArtifact>();
+
+    private final Map<DeploymentIdentity, URI> uriByIdentity = new HashMap<DeploymentIdentity, URI>();
+
+    private final Map<String, URI> uriByFileName = new HashMap<String, URI>();
+
+    private final DeployUriNormaliser uriNormaliser;
+
+    StandardRuntimeArtifactModel(DeployUriNormaliser uriNormaliser) {
+        this.uriNormaliser = uriNormaliser;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public DeploymentIdentity add(@NonNull URI location, @NonNull InstallArtifact installArtifact) throws DuplicateFileNameException,
+        DuplicateLocationException, DuplicateDeploymentIdentityException, DeploymentException {
+
+        URI canonicalLocation = getCanonicalFileLocation(location);
+
+        synchronized (this.monitor) {
+
+            // Check the precondition and throw an exception if it is violated.
+            checkLocation(canonicalLocation, installArtifact);
+
+            String fileName = getFileName(canonicalLocation);
+            checkFileName(canonicalLocation, installArtifact, fileName);
+
+            DeploymentIdentity deploymentIdentity = getDeploymentIdentity(installArtifact);
+            checkDeploymentIdentity(canonicalLocation, installArtifact, deploymentIdentity);
+
+            // The precondition is true, so update the state. The invariants are preserved.
+            updateState(canonicalLocation, installArtifact, fileName, deploymentIdentity);
+
+            return deploymentIdentity;
+        }
+    }
+
+    private void checkLocation(URI canonicalLocation, InstallArtifact installArtifact) throws DuplicateLocationException {
+        if (this.artifactByUri.containsKey(canonicalLocation)) {
+            InstallArtifact clashingArtifact = getArtifactByUri(canonicalLocation);
+            throw new DuplicateLocationException(getClashMessage(canonicalLocation, installArtifact, clashingArtifact));
+        }
+    }
+
+    private void checkFileName(URI location, InstallArtifact installArtifact, String fileName) throws DuplicateFileNameException {
+        if (this.uriByFileName.containsKey(fileName)) {
+            InstallArtifact clashingArtifact = getArtifactByUri(this.uriByFileName.get(fileName));
+            throw new DuplicateFileNameException(getClashMessage(location, installArtifact, clashingArtifact));
+        }
+    }
+
+    private void checkDeploymentIdentity(URI location, InstallArtifact installArtifact, DeploymentIdentity deploymentIdentity)
+        throws DuplicateDeploymentIdentityException {
+        if (this.uriByIdentity.containsKey(deploymentIdentity)) {
+            InstallArtifact clashingArtifact = getArtifactByUri(this.uriByIdentity.get(deploymentIdentity));
+            throw new DuplicateDeploymentIdentityException(getClashMessage(location, installArtifact, clashingArtifact));
+        }
+    }
+
+    private String getClashMessage(URI location, InstallArtifact installArtifact, InstallArtifact clashingArtifact) {
+        return String.format(CLASH_MESSAGE_FORMAT, installArtifact, location, clashingArtifact);
+    }
+
+    private DeploymentIdentity getDeploymentIdentity(@NonNull InstallArtifact installArtifact) {
+        return new StandardDeploymentIdentity(installArtifact.getType(), installArtifact.getName(), installArtifact.getVersion().toString());
+    }
+
+    private String getFileName(@NonNull URI location) throws DeploymentException {
+        URI normalisedLocation = this.uriNormaliser.normalise(location);
+        String path = normalisedLocation.getPath();
+        
+        String pathSeparator = URI_PATH_SEPARATOR;
+        if (SCHEME_FILE.equals(normalisedLocation.getScheme())) {
+            pathSeparator = File.separator;
+        }
+        
+        if (path.endsWith(pathSeparator)) {
+            path = path.substring(0, path.length() - 1);
+        }
+        int separatorIndex = path.lastIndexOf(pathSeparator);
+        return separatorIndex != -1 ? path.substring(separatorIndex + 1) : path;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public InstallArtifact get(@NonNull DeploymentIdentity deploymentIdentity) {
+        synchronized (this.monitor) {
+            URI location = this.uriByIdentity.get(deploymentIdentity);
+            return location == null ? null : getArtifactByUri(location);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public InstallArtifact get(@NonNull URI location) {
+        synchronized (this.monitor) {
+            return getArtifactByUri(location);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public URI getLocation(DeploymentIdentity deploymentIdentity) {
+        synchronized (this.monitor) {
+            return this.uriByIdentity.get(deploymentIdentity);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public DeploymentIdentity[] getDeploymentIdentities() {
+        synchronized (this.monitor) {
+            Set<DeploymentIdentity> deploymentIdentities = this.uriByIdentity.keySet();
+            return deploymentIdentities.toArray(new DeploymentIdentity[deploymentIdentities.size()]);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public InstallArtifact delete(DeploymentIdentity deploymentIdentity) throws DeploymentException {
+        synchronized (this.monitor) {
+            URI location = this.uriByIdentity.get(deploymentIdentity);
+
+            if (location == null) {
+                return null;
+            }
+
+            InstallArtifact installArtifact = getArtifactByUri(location);
+            Assert.notNull(installArtifact,
+                "Broken invariant: artifactByUri is missing an entry for URI '%s' but this URI is present in uriByIdentity for '%s'", location,
+                deploymentIdentity);
+            String fileName = getFileName(location);
+
+            Assert.isTrue(this.uriByFileName.containsKey(fileName),
+                "Broken invariant: uriByFileName is missing an entry for file name '%s' but URI '%s' is present in uriByIdentity for '%s'", fileName,
+                location, deploymentIdentity);
+            removeState(deploymentIdentity, location, fileName);
+            return installArtifact;
+        }
+    }
+
+    private void updateState(URI location, InstallArtifact installArtifact, String fileName, DeploymentIdentity deploymentIdentity) {
+        this.artifactByUri.put(getCanonicalFileLocation(location), installArtifact);
+        this.uriByIdentity.put(deploymentIdentity, location);
+        this.uriByFileName.put(fileName, location);
+    }
+
+    private void removeState(DeploymentIdentity deploymentIdentity, URI location, String fileName) {
+        this.artifactByUri.remove(getCanonicalFileLocation(location));
+        this.uriByIdentity.remove(deploymentIdentity);
+        this.uriByFileName.remove(fileName);
+    }
+
+    private InstallArtifact getArtifactByUri(URI uri) {
+        return this.artifactByUri.get(getCanonicalFileLocation(uri));
+    }
+
+    private URI getCanonicalFileLocation(URI uri) {
+        if (SCHEME_FILE.equals(uri.getScheme())) {
+            File file = new File(uri);
+            try {
+                String canonicalPath = file.getCanonicalPath();
+                // Remove trailing slashes as these are added or not, for a directory, depending on the existence of the
+                // directory.
+                if (canonicalPath.endsWith(File.separator)) {
+                    canonicalPath = canonicalPath.substring(0, canonicalPath.length() - 1);
+                }
+                // Add leading forward slash if this is not already present, for example "C:\xxx"
+                if (!canonicalPath.startsWith(URI_PATH_SEPARATOR)) {
+                    canonicalPath = URI_PATH_SEPARATOR + canonicalPath;
+                }
+                // Construct a file scheme URI with the given path. Note that we can't use File.toURI as its results for
+                // a directory depends on the existence of the directory.
+                return new URI("file", null, canonicalPath, null);
+            } catch (Exception e) {
+                throw new RuntimeException("Failed to calculate canonical file URI for '" + uri + "'", e);
+            }
+        } else {
+            return uri;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isGCRoot(InstallArtifact installArtifact) {
+        synchronized (this.monitor) {
+            return this.artifactByUri.containsValue(installArtifact);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Iterator<InstallArtifact> iterator() {
+        synchronized (this.monitor) {
+            Collection<InstallArtifact> roots = this.artifactByUri.values();
+            return new HashSet<InstallArtifact>(roots).iterator();
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/ArtifactIdentity.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/ArtifactIdentity.java
new file mode 100644
index 0000000..d0468b1
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/ArtifactIdentity.java
@@ -0,0 +1,130 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact;
+
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.osgi.framework.Version;
+
+
+/**
+ * An {@link ArtifactIdentity} encapsulates the identity of an artifact.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Thread-safe.
+ *
+ */
+public class ArtifactIdentity {
+    
+    private final String type;
+    
+    private final String name;
+    
+    private final Version version;
+    
+    private final String scopeName;
+
+    /**
+     * Creates a new <code>ArtifactIdentity</code> with the supplied <code>type</code>, <code>name</code>, <code>version</code>, 
+     * and <code>scopeName</code>.
+     * 
+     * @param type the artifact's type
+     * @param name the artifact's name
+     * @param version the artifact's version
+     * @param scopeName the name of the artifact's scope, or <code>null</code> if the artifact is not scoped.
+     */
+    public ArtifactIdentity(@NonNull String type, @NonNull String name, @NonNull Version version, String scopeName) {
+        this.type = type;
+        this.name = name;
+        this.version = version;
+        this.scopeName = scopeName;
+    }
+    
+    /**
+     * Returns the type of the artifact
+     * @return the artifact's type
+     */
+    public String getType() {
+        return type;
+    }
+
+    /**
+     * Returns the name of the artifact
+     * @return the artifact's name
+     */
+    public String getName() {
+        return name;
+    }
+    
+    /**
+     * Returns the version of the artifact
+     * @return the artifact's version
+     */
+    public Version getVersion() {
+        return version;
+    }
+    
+    /**
+     * Returns the name of the artifact's scope, or <code>null</code> if the artifact is not in a scope
+     * @return the artifact's scope name
+     */
+    public String getScopeName() {
+        return scopeName;
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + name.hashCode();
+        result = prime * result + ((scopeName == null) ? 0 : scopeName.hashCode());
+        result = prime * result + type.hashCode();
+        result = prime * result + version.hashCode();
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        
+        if (obj == null)
+            return false;
+        
+        if (getClass() != obj.getClass())
+            return false;
+        
+        ArtifactIdentity other = (ArtifactIdentity) obj;
+        
+        if (!name.equals(other.name))
+            return false;
+        
+        if (scopeName == null) {
+            if (other.scopeName != null)
+                return false;
+        } else if (!scopeName.equals(other.scopeName))
+            return false;
+        
+        if (!type.equals(other.type))
+            return false;
+
+        if (!version.equals(other.version))
+            return false;
+        
+        return true;
+    }
+    
+    public String toString() {
+        return String.format("%s '%s' version '%s' in scope '%s'", this.type, this.name, this.version, this.scopeName);
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/ArtifactIdentityDeterminer.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/ArtifactIdentityDeterminer.java
new file mode 100644
index 0000000..cf59d88
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/ArtifactIdentityDeterminer.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact;
+
+import java.io.File;
+
+/**
+ * {@link ArtifactIdentityDeterminer} is kernel extension point for determining the identity of an install artifact.
+ * It also provides some constants for well known Artifact types.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations of this interface must be thread safe.
+ * 
+ */
+public interface ArtifactIdentityDeterminer {
+
+    public static final String BUNDLE_TYPE = "bundle";
+
+    public static final String PLAN_TYPE = "plan";
+
+    public static final String CONFIGURATION_TYPE = "configuration";
+
+    public static final String PAR_TYPE = "par";
+
+    /**
+     * Determines the identity of the given artifact.
+     * 
+     * @param file The {@link File} that represents the artifact
+     * @param scopeName The name of the artifact's scope
+     * @return the identity of the artifact or <code>null</code> if the identity could not be determined
+     */
+    ArtifactIdentity determineIdentity(File file, String scopeName);
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/ArtifactState.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/ArtifactState.java
new file mode 100644
index 0000000..546f6ea
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/ArtifactState.java
@@ -0,0 +1,145 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact;
+
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact.State;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+
+
+/**
+ * {@link ArtifactState} encapsulates the state of an install artifact.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+public final class ArtifactState {
+
+    private final Object monitor = new Object();
+
+    private State state;
+
+    /**
+     * Creates an {@link ArtifactState} in the INITIAL {@link State}.
+     */
+    public ArtifactState() {
+        this.state = State.INITIAL;
+    }
+
+    /**
+     * Gets the current {@link State}.
+     * 
+     * @return the current <code>State</code>
+     */
+    public State getState() {
+        synchronized (this.monitor) {
+            return this.state;
+        }
+    }
+
+    /**
+     * Sets the state to the given value.
+     * 
+     * @param newState
+     * @return <code>true</code> if and only if the state changed
+     */
+    private boolean setState(@NonNull State newState) {
+        synchronized (this.monitor) {
+            boolean changed = !this.state.equals(newState);
+            this.state = newState;
+            return changed;
+        }
+    }
+
+    /**
+     * Sets the current state to INITIAL.
+     * @return <code>true</code> if and only if the state changed
+     */
+    public boolean setInitial() {
+        return setState(State.INITIAL);
+    }
+
+    /**
+     * Sets the current state to INSTALLING.
+     * @return <code>true</code> if and only if the state changed
+     */
+    public boolean setInstalling() {
+        return setState(State.INSTALLING);
+    }
+
+    /**
+     * Sets the current state to INSTALLED.
+     * @return <code>true</code> if and only if the state changed
+     */
+    public boolean setInstalled() {
+        return setState(State.INSTALLED);
+    }
+
+    /**
+     * Sets the current state to RESOLVING.
+     * @return <code>true</code> if and only if the state changed
+     */
+    public boolean setResolving() {
+        return setState(State.RESOLVING);
+    }
+
+    /**
+     * Sets the current state to RESOLVED.
+     * @return <code>true</code> if and only if the state changed
+     */
+    public boolean setResolved() {
+        return setState(State.RESOLVED);
+    }
+
+    /**
+     * Sets the current state to STARTING.
+     * @return <code>true</code> if and only if the state changed
+     */
+    public boolean setStarting() {
+        return setState(State.STARTING);
+    }
+
+    /**
+     * Sets the current state to ACTIVE.
+     * @return <code>true</code> if and only if the state changed
+     */
+    public boolean setActive() {
+        return setState(State.ACTIVE);
+    }
+
+    /**
+     * Sets the current state to STOPPING.
+     * @return <code>true</code> if and only if the state changed
+     */
+    public boolean setStopping() {
+        return setState(State.STOPPING);
+    }
+
+    /**
+     * Sets the current state to UNINSTALLING.
+     * @return <code>true</code> if and only if the state changed
+     */
+    public boolean setUninstalling() {
+        return setState(State.UNINSTALLING);
+    }
+
+    /**
+     * Sets the current state to UNINSTALLED.
+     * @return <code>true</code> if and only if the state changed
+     */
+    public boolean setUninstalled() {
+        return setState(State.UNINSTALLED);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/ArtifactStorage.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/ArtifactStorage.java
new file mode 100644
index 0000000..680d4b0
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/ArtifactStorage.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact;
+
+import java.net.URI;
+
+import org.eclipse.virgo.kernel.artifact.fs.ArtifactFS;
+
+
+public interface ArtifactStorage {
+
+    void synchronize();
+
+    void synchronize(URI sourceUri);
+    
+    void rollBack();
+
+    void delete();
+
+    ArtifactFS getArtifactFS();
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/BundleInstallArtifact.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/BundleInstallArtifact.java
new file mode 100644
index 0000000..672f31a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/BundleInstallArtifact.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact;
+
+import java.io.IOException;
+import java.net.URI;
+import java.util.Map;
+
+import org.osgi.framework.Bundle;
+
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiBundle;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+
+/**
+ * {@link BundleInstallArtifact} is an {@link InstallArtifact} for a bundle.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+public interface BundleInstallArtifact extends GraphAssociableInstallArtifact {
+
+    /**
+     * Returns the bundle manifest. This may differ from the bundle's original manifest file contents if transformations
+     * have been performed in the installation pipeline. Note that such transformations are performed in memory and the
+     * results are not written to a manifest file.
+     * 
+     * @return the {@link BundleManifest} abstract syntax tree
+     * @throws IOException if an I/O error occurred while reading the bundle manifest
+     */
+    BundleManifest getBundleManifest() throws IOException;
+
+    /**
+     * Sets the {@link QuasiBundle} for this {@link BundleInstallArtifact}.
+     * 
+     * @param quasiBundle the <code>QuasiBundle</code>
+     */
+    void setQuasiBundle(QuasiBundle quasiBundle);
+
+    /**
+     * Gets the {@link QuasiBundle} for this {@link BundleInstallArtifact}.
+     * 
+     * @return the <code>QuasiBundle</code> or <code>null</code> if no <code>QuasiBundle</code> has been set
+     */
+    QuasiBundle getQuasiBundle();
+
+    /**
+     * Gets the OSGi {@link Bundle} for this {@link BundleInstallArtifact}.
+     * 
+     * @return the <code>Bundle</code> or <code>null</code> if this <code>BundleInstallArtifact</code> has not been
+     *         installed in the OSGi framework
+     */
+    Bundle getBundle();
+
+    /**
+     * Returns the properties that are used to customize the deployment of the <code>BundleInstallArtifact</code>.
+     * 
+     * @return The deployment properties
+     */
+    Map<String, String> getDeploymentProperties();
+
+    /**
+     * Delete an entry within this bundle
+     * 
+     * @param targetPath The bundle relative path to delete
+     */
+    void deleteEntry(String targetPath);
+
+    /**
+     * Update an entry within this bundle. If the target path does not already exist, creates a new entry at that
+     * location.
+     * 
+     * @param inputPath The path to read update from
+     * @param targetPath The bundle relative path to write the update to
+     */
+    void updateEntry(URI inputPath, String targetPath);
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/ConfigInstallArtifact.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/ConfigInstallArtifact.java
new file mode 100644
index 0000000..7c710f2
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/ConfigInstallArtifact.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact;
+
+import java.io.IOException;
+import java.util.Properties;
+
+/**
+ * {@link ConfigInstallArtifact} is a marker interface to identify configuration install artifacts.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Implementations of this interface must be thread safe.
+ */
+public interface ConfigInstallArtifact extends GraphAssociableInstallArtifact {
+    
+    Properties getProperties() throws IOException;
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/GraphAssociableInstallArtifact.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/GraphAssociableInstallArtifact.java
new file mode 100644
index 0000000..6d75d2d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/GraphAssociableInstallArtifact.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.util.common.GraphNode;
+
+/**
+ * {@link GraphAssociableInstallArtifact} is an {@link InstallArtifact} which may have its graph node set.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Implementation <strong>must</strong> be thread-safe.
+ */
+public interface GraphAssociableInstallArtifact extends InstallArtifact {
+
+    /**
+     * Associate the given graph with this install artifact.
+     * 
+     * @param graph to set
+     * @throws DeploymentException possible from overriding methods
+     */
+    void setGraph(GraphNode<InstallArtifact> graph) throws DeploymentException;
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/InstallArtifact.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/InstallArtifact.java
new file mode 100644
index 0000000..b809597
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/InstallArtifact.java
@@ -0,0 +1,203 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact;
+
+import java.util.Set;
+
+import org.eclipse.virgo.kernel.artifact.fs.ArtifactFS;
+import org.eclipse.virgo.nano.core.AbortableSignal;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.eclipse.virgo.util.common.GraphNode;
+import org.osgi.framework.Version;
+
+/**
+ * An {@link InstallArtifact} is a single node in an install tree.
+ * 
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementation <strong>must</strong> be thread-safe.
+ * 
+ */
+public interface InstallArtifact {
+
+	/**
+	 * The possible states of an artifact.
+	 */
+	public enum State {
+		INITIAL, INSTALLING, INSTALLED, RESOLVING, RESOLVED, STARTING, ACTIVE, STOPPING, UNINSTALLING, UNINSTALLED
+	}
+
+	/**
+	 * Returns the type of the artifact.
+	 * 
+	 * @return the artifact's type.
+	 */
+	String getType();
+
+	/**
+	 * Returns the name of the artifact.
+	 * 
+	 * @return the artifact's name.
+	 */
+	String getName();
+
+	/**
+	 * Returns the version of the artifact.
+	 * 
+	 * @return the artifact's version.
+	 */
+	Version getVersion();
+
+	/**
+	 * Returns the name of the scope in which this <code>InstallArtifact</code>
+	 * resides, or <code>null</code> if it is not scoped.
+	 * 
+	 * @return the artifact's scope name
+	 */
+	String getScopeName();
+
+	/**
+	 * Gets the {@link State} of this {@link InstallArtifact}.
+	 * 
+	 * @return a non-<code>null</code> <code>State</code>
+	 */
+	State getState();
+
+	/**
+	 * Starts this {@link InstallArtifact}. Returns before any asynchronous
+	 * processing has necessarily completed.
+	 * <p/>
+	 * Equivalent to calling {@link InstallArtifact#start(AbortableSignal)
+	 * start(null)}.
+	 * 
+	 * @throws DeploymentException
+	 */
+	void start() throws DeploymentException;
+
+	/**
+	 * Starts this {@link InstallArtifact} and drives the given
+	 * {@link AbortableSignal} when the start, including any asynchronous
+	 * processing, completes either successfully or unsuccessfully.
+	 * <p/>
+	 * If the start does not involve asynchronous processing, drives the given
+	 * <code>Signal</code> before returning.
+	 * <p/>
+	 * Note that the given <code>Signal</code> may be driven before this method
+	 * returns, after the method has returned, or possibly never if there is
+	 * asynchronous processing which never completes. The caller must ensure
+	 * that the given <code>Signal</code> is ready to be driven <i>before</i>
+	 * calling this method.
+	 * <p/>
+	 * If the caller is not interested in being signalled, it should pass a
+	 * <code>null</code> <code>Signal</code>.
+	 * <p/>
+	 * Note: this method behaves as specified above when called multiple times
+	 * on the same <code>InstallArtifact</code> with any combination of the same
+	 * or distinct or <code>null</code> <code>Signals</code>.
+	 * 
+	 * @param signal
+	 *            a <code>AbortableSignal</code> that is ready to be driven or
+	 *            <code>null</code> if signalling is not required
+	 * @throws DeploymentException
+	 */
+	void start(AbortableSignal signal) throws DeploymentException;
+
+	/**
+	 * Stops this {@link InstallArtifact}. If the <code>InstallArtifact</code>
+	 * is already stopped, do nothing.
+	 * 
+	 * @throws DeploymentException
+	 *             if the operation fails
+	 */
+	void stop() throws DeploymentException;
+
+	/**
+	 * Uninstalls this {@link InstallArtifact}. If the
+	 * <code>InstallArtifact</code> is already uninstalled, do nothing.
+	 * 
+	 * @throws DeploymentException
+	 *             if the operation fails
+	 */
+	void uninstall() throws DeploymentException;
+
+	/**
+	 * Returns the <code>ArtifactFS</code> for this artifact
+	 * 
+	 * @return the <code>ArtifactFS</code>
+	 */
+	ArtifactFS getArtifactFS();
+
+	/**
+	 * Attempts to refresh this {@link InstallArtifact}. Returns
+	 * <code>true</code> if and only if this has completed successfully.
+	 * 
+	 * @return <code>true</code> if and only if the operation completed
+	 *         successfully
+	 * @throws DeploymentException
+	 */
+	boolean refresh() throws DeploymentException;
+
+	/**
+	 * Associates the property with the given name and value with this
+	 * {@link InstallArtifact}. Properties may be set by participants in the
+	 * artifact's installation. Once the artifact has been installed, an MBean
+	 * representing it is exported and these properties will be available via
+	 * that MBean.
+	 * 
+	 * @param name
+	 *            the property name
+	 * @param value
+	 *            the property value
+	 * @return the property's previous value or <code>null</code> if there was
+	 *         no such property
+	 */
+	String setProperty(@NonNull String name, @NonNull String value);
+
+	/**
+	 * Returns the property with the given name associated with this
+	 * {@link InstallArtifact}. If there is no associated property with the
+	 * given name, returns <code>null</code>.
+	 * 
+	 * @param name
+	 *            the property name
+	 * @return the property value or <code>null</code> if there is no property
+	 *         with the given name
+	 */
+	String getProperty(@NonNull String name);
+
+	/**
+	 * Returns the names of the properties that are associated with this
+	 * {@link InstallArtifact}.
+	 * 
+	 * @return a set of property names
+	 */
+	Set<String> getPropertyNames();
+
+	/**
+	 * Returns the local name of the repository from which the artifact was
+	 * installed, or null if not from a repository.
+	 * 
+	 * @return the local name of the repository whence the artifact came
+	 */
+	String getRepositoryName();
+
+	/**
+	 * Returns the install graph rooted in this {@link InstallArtifact}.
+	 * 
+	 * @return this artifact's graph
+	 */
+	GraphNode<InstallArtifact> getGraph();
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/InstallArtifactGraphFactory.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/InstallArtifactGraphFactory.java
new file mode 100644
index 0000000..c93eaa6
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/InstallArtifactGraphFactory.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution (InstallArtifactTreeFactory)
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact;
+
+import java.util.Map;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.util.common.GraphNode;
+
+/**
+ * {@link InstallArtifactGraphFactory} is used to create graphs of {@link InstallArtifact InstallArtifacts}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations of this interface must be thread safe.
+ * 
+ */
+public interface InstallArtifactGraphFactory {
+
+    /**
+     * Constructs an install graph from the {@link ArtifactStorage}. If this factory cannot handle the given artifact type, it
+     * returns <code>null</code>.
+     * @param artifactIdentity 
+     * @param artifactStorage 
+     * @param deploymentProperties the deployment properties for the artifact. Can be <code>null</code>.
+     * @param repositoryName The name of the repository from which that artifact originates, or <code>null</code> if the artifact is not from a repository.
+     * @return an install graph or <code>null</code> if the factory cannot handle the given artifact type
+     * @throws DeploymentException if the graph cannot be constructed
+     */
+    GraphNode<InstallArtifact> constructInstallArtifactGraph(ArtifactIdentity artifactIdentity, ArtifactStorage artifactStorage, Map<String, String> deploymentProperties,
+        String repositoryName) throws DeploymentException;
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/InstallArtifactGraphInclosure.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/InstallArtifactGraphInclosure.java
new file mode 100644
index 0000000..ae5a63d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/InstallArtifactGraphInclosure.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact;
+
+import java.io.File;
+import java.util.Map;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentOptions;
+import org.eclipse.virgo.util.common.GraphNode;
+
+/**
+ * {@link InstallArtifactGraphInclosure} is used to create, and store persistently, various types of
+ * {@link InstallArtifact}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+public interface InstallArtifactGraphInclosure {
+
+    /**
+     * Create an install graph consisting of a single artifact with the given identity and file contents, the given
+     * artifact properties, optionally originating from the repository with the given name.
+     * 
+     * @param identity the identity of the artifact
+     * @param artifact the file contents of the artifact
+     * @param properties the artifact properties
+     * @param repositoryName the name of the repository from which the artifact originated or <code>null</code> if the
+     *        artifact did not originate from a repository
+     * @return an install graph
+     * @throws DeploymentException if the graph cannot be created
+     */
+    GraphNode<InstallArtifact> constructGraphNode(ArtifactIdentity identity, File artifact, Map<String, String> properties, String repositoryName)
+        throws DeploymentException;
+
+    /**
+     * Optionally recover an install graph from the staging area using the given file URI to identify the artifact. The
+     * source URI need no longer be valid unless the artifact is owned by the deployer. Non-recoverable artifacts are
+     * "recovered" by deleting them.
+     * 
+     * @param location the source location of the artifact
+     * @param options the {@link DeploymentOptions} of the artifact
+     * @return an install graph or <code>null</code>
+     */
+    GraphNode<InstallArtifact> recoverInstallGraph(ArtifactIdentity identity, File location);
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/InstallArtifactLifecycleListener.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/InstallArtifactLifecycleListener.java
new file mode 100644
index 0000000..d55b8f9
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/InstallArtifactLifecycleListener.java
@@ -0,0 +1,189 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+
+/**
+ * An <code>InstallArtifactLifecycleListener</code> is notified of {@link InstallArtifact} lifecycle events.
+ * <p />
+ * An <code>InstallArtifactLifecycleListener</code> implementation should be stateless and is made known to the deployer
+ * by publishing it as an OSGi service.
+ * <p />
+ * An <code>InstallArtifactLifecycleListener</code> is not notified of events it has missed. For example, if an
+ * <code>InstallArtifactLifecycleListener</code> is published while an <code>InstallArtifact</code> is being started, it
+ * may miss the <code>onStarting</code> notification and any <code>onStarted</code> notification.
+ * <p />
+ * If an <code>InstallArtifactLifecycleListener</code> has missed some events, it is still notified of other events. For
+ * example, if an <code>InstallArtifactLifecycleListener</code> is published while an <code>InstallArtifact</code> is
+ * being started, it may be notified of an <code>onStarted</code> event for the <code>InstallArtifact</code> even if it
+ * has missed the <code>onStarting</code> event for the <code>InstallArtifact</code>. Similarly, an
+ * <code>InstallArtifactLifecycleListener</code> may be notified of an <code>onStopping</code> event for an
+ * <code>InstallArtifact</code> event if it missed the <code>onStarting</code> event and any <code>onStarted</code>
+ * event for the <code>InstallArtifact</code>.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations <strong>must</strong> be thread-safe. Notifications of events for a given
+ * <code>InstallArtifact</code> may be delivered on the same thread or on distinct threads.
+ * 
+ */
+public interface InstallArtifactLifecycleListener {
+
+    /**
+     * Notification that the given {@link InstallArtifact} is installing.
+     * <p/>
+     * 
+     * Throwing a {@link DeploymentException} will result in no further listeners being notified that the
+     * <code>installArtifact</code> is being installed. Install failure will then be notified and the installation
+     * aborted.
+     * 
+     * @param installArtifact the <code>InstallArtifact</code> that is installing
+     * @throws DeploymentException if the listener failed to handle the event
+     */
+    void onInstalling(InstallArtifact installArtifact) throws DeploymentException;
+
+    /**
+     * Notification that the given {@link InstallArtifact} failed to install.
+     * 
+     * @param installArtifact the <code>InstallArtifact</code> that failed to install
+     * @throws DeploymentException if the listener failed to handle the event
+     */
+    void onInstallFailed(InstallArtifact installArtifact) throws DeploymentException;
+
+    /**
+     * Notification that the given {@link InstallArtifact} installed successfully.
+     * 
+     * @param installArtifact the <code>InstallArtifact</code> that installed successfully
+     * @throws DeploymentException if the listener failed to handle the event
+     */
+    void onInstalled(InstallArtifact installArtifact) throws DeploymentException;
+
+    /**
+     * Notification that the given {@link InstallArtifact} is resolving.
+     * 
+     * @param installArtifact the <code>InstallArtifact</code> that is resolving
+     * @throws DeploymentException if the listener failed to handle the event
+     */
+    void onResolving(InstallArtifact installArtifact) throws DeploymentException;
+
+    /**
+     * Notification that the given {@link InstallArtifact} failed to resolve.
+     * 
+     * @param installArtifact the <code>InstallArtifact</code> that failed to resolve
+     * @throws DeploymentException if the listener failed to handle the event
+     */
+    void onResolveFailed(InstallArtifact installArtifact) throws DeploymentException;
+
+    /**
+     * Notification that the given {@link InstallArtifact} resolved successfully.
+     * 
+     * @param installArtifact the <code>InstallArtifact</code> that resolved successfully
+     * @throws DeploymentException if the listener failed to handle the event
+     */
+    void onResolved(InstallArtifact installArtifact) throws DeploymentException;
+
+    /**
+     * Notification that the given {@link InstallArtifact} is starting.
+     * 
+     * @param installArtifact the <code>InstallArtifact</code> that is starting
+     * @throws DeploymentException if the listener failed to handle the event
+     */
+    void onStarting(InstallArtifact installArtifact) throws DeploymentException;
+
+    /**
+     * Notification that the given {@link InstallArtifact} failed to start.
+     * 
+     * @param installArtifact the <code>InstallArtifact</code> that failed to start
+     * @param cause the exception indicating the cause of the failure or <code>null</code> if there was no exception
+     * @throws DeploymentException if the listener failed to handle the event
+     */
+    void onStartFailed(InstallArtifact installArtifact, Throwable cause) throws DeploymentException;
+
+    /**
+     * Notification that the given {@link InstallArtifact} aborted while starting.
+     * 
+     * @param installArtifact the <code>InstallArtifact</code> that aborted
+     * @throws DeploymentException if the listener failed to handle the event
+     */
+    void onStartAborted(InstallArtifact installArtifact) throws DeploymentException;
+
+    /**
+     * Notification that the given {@link InstallArtifact} has started.
+     * 
+     * <p/>
+     * 
+     * Throwing a {@link DeploymentException} will result in no further listeners being notified that the
+     * <code>installArtifact</code> has started. The <code>installArtifact</code> will then be stopped.
+     * 
+     * @param installArtifact the <code>InstallArtifact</code> that has started
+     * @throws DeploymentException if the listener failed to handle the event
+     */
+    void onStarted(InstallArtifact installArtifact) throws DeploymentException;
+
+    /**
+     * Notification that the given {@link InstallArtifact} is stopping.
+     * 
+     * @param installArtifact the <code>InstallArtifact</code> that is stopping
+     */
+    void onStopping(InstallArtifact installArtifact);
+
+    /**
+     * Notification that the given {@link InstallArtifact} failed to stop.
+     * 
+     * @param installArtifact the <code>InstallArtifact</code> that failed to stop
+     * @param cause the exception indicating the cause of the failure or <code>null</code> if there was no exception
+     * @throws DeploymentException if the listener failed to handle the event
+     */
+    void onStopFailed(InstallArtifact installArtifact, Throwable cause) throws DeploymentException;
+
+    /**
+     * Notification that the given {@link InstallArtifact} has stopped.
+     * 
+     * @param installArtifact the <code>InstallArtifact</code> that has stopped
+     */
+    void onStopped(InstallArtifact installArtifact);
+
+    /**
+     * Notification that the given {@link InstallArtifact} has become unresolved.
+     * 
+     * @param installArtifact the <code>InstallArtifact</code> that has become unresolved
+     * @throws DeploymentException if the listener failed to handle the event
+     */
+    void onUnresolved(InstallArtifact installArtifact) throws DeploymentException;
+
+    /**
+     * Notification that the given {@link InstallArtifact} is uninstalling.
+     * 
+     * @param installArtifact the <code>InstallArtifact</code> that is unintalling
+     * @throws DeploymentException if the listener failed to handle the event
+     */
+    void onUninstalling(InstallArtifact installArtifact) throws DeploymentException;
+
+    /**
+     * Notification that the given {@link InstallArtifact} failed to uninstall.
+     * 
+     * @param installArtifact the <code>InstallArtifact</code> that failed to uninstall
+     * @param cause the exception indicating the cause of the failure or <code>null</code> if there was no exception
+     * @throws DeploymentException if the listener failed to handle the event
+     */
+    void onUninstallFailed(InstallArtifact installArtifact, Throwable cause) throws DeploymentException;
+
+    /**
+     * Notification that the given {@link InstallArtifact} has uninstalled.
+     * 
+     * @param installArtifact the <code>InstallArtifact</code> that has uninstalled
+     * @throws DeploymentException if the listener failed to handle the event
+     */
+    void onUninstalled(InstallArtifact installArtifact) throws DeploymentException;
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/InstallArtifactLifecycleListenerSupport.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/InstallArtifactLifecycleListenerSupport.java
new file mode 100644
index 0000000..ed2b770
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/InstallArtifactLifecycleListenerSupport.java
@@ -0,0 +1,129 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+
+/**
+ * {@link InstallArtifactLifecycleListenerSupport} is an abstract implementation of
+ * {@link InstallArtifactLifecycleListener} which ignores all events.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+public abstract class InstallArtifactLifecycleListenerSupport implements InstallArtifactLifecycleListener {
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onInstallFailed(InstallArtifact installArtifact) throws DeploymentException {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onInstalled(InstallArtifact installArtifact) throws DeploymentException {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onInstalling(InstallArtifact installArtifact) throws DeploymentException {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onResolveFailed(InstallArtifact installArtifact) throws DeploymentException {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onResolved(InstallArtifact installArtifact) throws DeploymentException {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onResolving(InstallArtifact installArtifact) throws DeploymentException {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onStartFailed(InstallArtifact installArtifact, Throwable cause) throws DeploymentException {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onStartAborted(InstallArtifact installArtifact) throws DeploymentException {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onStarted(InstallArtifact installArtifact) throws DeploymentException {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onStarting(InstallArtifact installArtifact) throws DeploymentException {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onStopFailed(InstallArtifact installArtifact, Throwable cause) throws DeploymentException {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onStopped(InstallArtifact installArtifact) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onStopping(InstallArtifact installArtifact) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onUninstallFailed(InstallArtifact installArtifact, Throwable cause) throws DeploymentException {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onUninstalled(InstallArtifact installArtifact) throws DeploymentException {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onUninstalling(InstallArtifact installArtifact) throws DeploymentException {
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void onUnresolved(InstallArtifact installArtifact) throws DeploymentException {
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/PlanInstallArtifact.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/PlanInstallArtifact.java
new file mode 100644
index 0000000..bc05e0c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/PlanInstallArtifact.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact;
+
+import java.util.List;
+
+import org.eclipse.virgo.kernel.artifact.ArtifactSpecification;
+import org.eclipse.virgo.kernel.artifact.plan.PlanDescriptor;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+
+
+/**
+ * {@link PlanInstallArtifact} is an {@link InstallArtifact} for a plan.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+public interface PlanInstallArtifact extends GraphAssociableInstallArtifact {
+
+    /**
+     * Returns whether or not this plan is scoped.
+     * 
+     * @return <code>true</code> if and only if this plan is scoped
+     */
+    boolean isScoped();
+
+    /**
+     * Returns whether or not this plan is atomic.
+     * 
+     * @return <code>true</code> if and only if this plan is atomic
+     */
+    boolean isAtomic();
+
+    /**
+     * Returns {@link ArtifactSpecification}s for the artifacts of this plan.
+     * 
+     * @return a list of <code>ArtifactSpecification</code>s
+     */
+    public List<ArtifactSpecification> getArtifactSpecifications();
+
+    /**
+     * Refresh the child of this plan with the given symbolic name.
+     * 
+     * @param symbolicName the symbolic name of the child to refresh
+     * @return <code>true</code> if and only if the child was successfully refreshed
+     * @throws DeploymentException if an error occurred during refresh
+     */
+    boolean refresh(String symbolicName) throws DeploymentException;
+
+    /**
+     * If this plan is scoped, run its install tree through the refresh subpipeline. If this plan is unscoped, recurse
+     * to any parents this plan has. Note that a plan may be a descendent of at most one scoped plan since scopes do not
+     * overlap.
+     * 
+     * @return <code>true</code> if successfully refreshed, <code>false</code> otherwise
+     */
+    boolean refreshScope();
+
+    /**
+     * Returns the {@link PlanDescriptor.Provisioning} for the plan.
+     * @return the provisioning setting of the plan
+     */
+    PlanDescriptor.Provisioning getProvisioning();
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/ScopeServiceRepository.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/ScopeServiceRepository.java
new file mode 100644
index 0000000..870f678
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/ScopeServiceRepository.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact;
+
+import java.util.Dictionary;
+import java.util.Set;
+
+import org.osgi.framework.InvalidSyntaxException;
+
+public interface ScopeServiceRepository {
+
+    void recordService(String scopeName, String[] types, Dictionary<String, Object> properties);
+
+    boolean scopeHasMatchingService(String scopeName, String type, String filter) throws InvalidSyntaxException;
+
+    void clearScope(String scopeName);
+
+    Set<String> knownScopes();
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/AbstractArtifactGraphFactory.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/AbstractArtifactGraphFactory.java
new file mode 100644
index 0000000..75f4031
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/AbstractArtifactGraphFactory.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2011 EclipseSource
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.GraphAssociableInstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifactGraphFactory;
+import org.eclipse.virgo.util.common.DirectedAcyclicGraph;
+import org.eclipse.virgo.util.common.GraphNode;
+
+/**
+ * {@link AbstractArtifactGraphFactory} is a base class for implementations of {@link InstallArtifactGraphFactory}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+public abstract class AbstractArtifactGraphFactory implements InstallArtifactGraphFactory {
+
+    private final DirectedAcyclicGraph<InstallArtifact> dag;
+
+    public AbstractArtifactGraphFactory(DirectedAcyclicGraph<InstallArtifact> dag) {
+        this.dag = dag;
+    }
+
+    protected GraphNode<InstallArtifact> constructAssociatedGraphNode(GraphAssociableInstallArtifact rootArtifact) throws DeploymentException {
+        //TODO: rework the DAG interface to contain just a createNode method and then call that instead of the following close approximation
+        GraphNode<InstallArtifact> graphNode = this.dag.createRootNode(rootArtifact);
+        this.dag.deleteRootNode(graphNode);
+        rootArtifact.setGraph(graphNode);
+        return graphNode;
+    }
+
+}
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/AbstractArtifactStore.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/AbstractArtifactStore.java
new file mode 100644
index 0000000..2db44d8
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/AbstractArtifactStore.java
@@ -0,0 +1,44 @@
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import org.eclipse.virgo.util.io.PathReference;
+
+public abstract class AbstractArtifactStore implements ArtifactStore {
+
+    private boolean saved = false;
+
+    protected final Object monitor = new Object();
+
+    public AbstractArtifactStore(PathReference basePathReference) {
+        if (basePathReference == null) {
+            throw new IllegalArgumentException("Null path");
+        }
+        if ("".equals(basePathReference.getName())) {
+            throw new IllegalArgumentException("Empty filename");
+        }
+    }
+
+    public abstract PathReference getCurrentPath();
+
+    public void save() {
+        synchronized (this.monitor) {
+            this.saved = true;
+            PathReference currentPathReference = getCurrentPath();
+            currentPathReference.getParent().createDirectory();
+            currentPathReference.delete(true);
+        }
+    }
+
+    public void restore() {
+        synchronized (this.monitor) {
+            if (!this.saved) {
+                throw new IllegalStateException("No saved artifact available");
+            }
+            getCurrentPath().delete(true);
+            this.saved = false;
+        }
+    }
+
+    protected abstract PathReference getSavedPath();
+
+}
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/AbstractInstallArtifact.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/AbstractInstallArtifact.java
new file mode 100644
index 0000000..fea83e2
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/AbstractInstallArtifact.java
@@ -0,0 +1,705 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.eclipse.virgo.kernel.artifact.fs.ArtifactFS;
+import org.eclipse.virgo.nano.core.AbortableSignal;
+import org.eclipse.virgo.nano.core.Signal;
+import org.eclipse.virgo.nano.deployer.api.core.DeployerLogEvents;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactIdentity;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactState;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactStorage;
+import org.eclipse.virgo.kernel.install.artifact.GraphAssociableInstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.util.common.GraphNode;
+import org.osgi.framework.Version;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * {@link AbstractInstallArtifact} is a base class for implementations of {@link InstallArtifact}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+public abstract class AbstractInstallArtifact implements GraphAssociableInstallArtifact {
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private final Object monitor = new Object();
+
+    private final ArtifactIdentity identity;
+
+    protected final ArtifactStorage artifactStorage;
+
+    private final Map<String, String> properties = new ConcurrentHashMap<String, String>();
+
+    private final Map<String, String> deploymentProperties = new ConcurrentHashMap<String, String>();
+
+    private final ArtifactStateMonitor artifactStateMonitor;
+
+    private final String repositoryName;
+
+    protected final EventLogger eventLogger;
+
+    private GraphNode<InstallArtifact> graph;
+
+    private volatile boolean isRefreshing;
+
+    // Whether or not this artifact was the target of a deployment operation (rather than a child of such a target).
+    private boolean isTopLevelDeployed = false;
+
+    /*
+     * If isTopLevelDeployed is true, whether or not this artifact is ACTIVE (or STARTING) from the perspective of the
+     * deployer operations that have been performed on it. If isTopLevelDeployed is false, this flag is undefined.
+     */
+    private boolean isTopLevelActive = false;
+
+    /**
+     * Construct an {@link AbstractInstallArtifact} from the given type, name, version, {@link ArtifactFS}, and
+     * {@link ArtifactState}, none of which may be null.
+     * 
+     * @param type a non-<code>null</code> artifact type
+     * @param name a non-<code>null</code> artifact name
+     * @param version a non-<code>null</code> artifact {@link Version}
+     * @param artifactFS a non-<code>null</code> <code>ArtifactFS</code>
+     * @param repositoryName the name of the source repository, or <code>null</code> if the artifact is not from a
+     *        repository
+     */
+    protected AbstractInstallArtifact(@NonNull ArtifactIdentity identity, @NonNull ArtifactStorage artifactStorage,
+        @NonNull ArtifactStateMonitor artifactStateMonitor, String repositoryName, EventLogger eventLogger) {
+        this.identity = identity;
+        this.artifactStorage = artifactStorage;
+        this.artifactStateMonitor = artifactStateMonitor;
+        this.repositoryName = repositoryName;
+        this.eventLogger = eventLogger;
+        this.isRefreshing = false;
+    }
+
+    final ArtifactIdentity getIdentity() {
+        return this.identity;
+    }
+
+    public final boolean isRefreshing() {
+        return this.isRefreshing;
+    }
+
+    public void beginInstall() throws DeploymentException {
+        try {
+            this.artifactStateMonitor.onInstalling(this);
+        } catch (DeploymentException de) {
+            failInstall();
+            throw de;
+        }
+
+    }
+
+    public void failInstall() throws DeploymentException {
+        this.artifactStateMonitor.onInstallFailed(this);
+    }
+
+    public void endInstall() throws DeploymentException {
+        this.artifactStateMonitor.onInstalled(this);
+    }
+
+    public void beginResolve() throws DeploymentException {
+        pushThreadContext();
+        try {
+            this.artifactStateMonitor.onResolving(this);
+        } finally {
+            popThreadContext();
+        }
+    }
+
+    public void failResolve() throws DeploymentException {
+        pushThreadContext();
+        try {
+            this.artifactStateMonitor.onResolveFailed(this);
+        } finally {
+            popThreadContext();
+        }
+    }
+
+    public void endResolve() throws DeploymentException {
+        pushThreadContext();
+        try {
+            this.artifactStateMonitor.onResolved(this);
+        } finally {
+            popThreadContext();
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public final String getType() {
+        return this.identity.getType();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public final String getName() {
+        return this.identity.getName();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public final Version getVersion() {
+        return this.identity.getVersion();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public final String getScopeName() {
+        return this.identity.getScopeName();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public State getState() {
+        return this.artifactStateMonitor.getState();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void start() throws DeploymentException {
+        start(null);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void start(AbortableSignal signal) throws DeploymentException {
+        // If ACTIVE, signal successful completion immediately, otherwise
+        // proceed with start processing.
+        if (getState().equals(State.ACTIVE)) {
+            if (signal != null) {
+                signal.signalSuccessfulCompletion();
+            }
+        } else {
+            if (!hasStartingParent()) {
+                topLevelStart();
+            }
+            pushThreadContext();
+            try {
+                boolean stateChanged = this.artifactStateMonitor.onStarting(this);
+                if (stateChanged || signal != null) {
+                    driveDoStart(signal);
+                }
+            } finally {
+                popThreadContext();
+            }
+        }
+    }
+
+    protected final void driveDoStart(AbortableSignal signal) throws DeploymentException {
+        AbortableSignal stateMonitorSignal = createStateMonitorSignal(signal);
+        doStart(stateMonitorSignal);
+    }
+
+    protected final AbortableSignal createStateMonitorSignal(AbortableSignal signal) {
+        return new StateMonitorSignal(signal);
+    }
+
+    private final class StateMonitorSignal implements AbortableSignal {
+
+        private final AbortableSignal signal;
+
+        public StateMonitorSignal(AbortableSignal signal) {
+            this.signal = signal;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public void signalSuccessfulCompletion() {
+            try {
+                asyncStartSucceeded();
+                AbstractInstallArtifact.signalSuccessfulCompletion(this.signal);
+            } catch (DeploymentException de) {
+                signalFailure(de);
+            }
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public void signalFailure(Throwable cause) {
+            asyncStartFailed(cause);
+            try {
+                stop();
+            } catch (DeploymentException de) {
+                AbstractInstallArtifact.this.logger.error("Stop failed", de);
+            }
+            AbstractInstallArtifact.signalFailure(this.signal, cause);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public void signalAborted() {
+            asyncStartAborted();
+            try {
+                stop();
+            } catch (DeploymentException de) {
+                AbstractInstallArtifact.this.logger.error("Stop aborted", de);
+            }
+            AbstractInstallArtifact.signalAbortion(this.signal);
+        }
+
+    }
+
+    protected static void signalSuccessfulCompletion(Signal signal) {
+        if (signal != null) {
+            signal.signalSuccessfulCompletion();
+        }
+    }
+
+    protected static void signalFailure(Signal signal, Throwable e) {
+        if (signal != null) {
+            signal.signalFailure(e);
+        }
+    }
+
+    protected static void signalAbortion(AbortableSignal signal) {
+        if (signal != null) {
+            signal.signalAborted();
+        }
+    }
+
+    /**
+     * Perform the actual start of this {@link InstallArtifact} and drive the given {@link Signal} on successful or
+     * unsuccessful completion.
+     * 
+     * @param signal the <code>Signal</code> to be driven
+     * @throws DeploymentException if the start fails synchronously
+     */
+    protected abstract void doStart(AbortableSignal signal) throws DeploymentException;
+
+    private final void asyncStartSucceeded() throws DeploymentException {
+        pushThreadContext();
+        try {
+            this.artifactStateMonitor.onStarted(this);
+        } finally {
+            popThreadContext();
+        }
+    }
+
+    private final void asyncStartFailed(Throwable cause) {
+        topLevelStop();
+        pushThreadContext();
+        try {
+            this.artifactStateMonitor.onStartFailed(this, cause);
+        } catch (DeploymentException e) {
+            logger.error(String.format("listener for %s threw DeploymentException", this), e);
+        } finally {
+            popThreadContext();
+        }
+    }
+
+    private final void asyncStartAborted() {
+        topLevelStop();
+        pushThreadContext();
+        try {
+            this.artifactStateMonitor.onStartAborted(this);
+        } catch (DeploymentException e) {
+            logger.error(String.format("listener for %s threw DeploymentException", this), e);
+        } finally {
+            popThreadContext();
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void stop() throws DeploymentException {
+        // Only stop if ACTIVE or STARTING and this artifact should stop given its parent's states.
+        if ((getState().equals(State.ACTIVE) || getState().equals(State.STARTING)) && shouldStop()) {
+            pushThreadContext();
+            try {
+                this.artifactStateMonitor.onStopping(this);
+                try {
+                    doStop();
+                    this.artifactStateMonitor.onStopped(this);
+                } catch (DeploymentException e) {
+                    this.artifactStateMonitor.onStopFailed(this, e);
+                }
+            } finally {
+                popThreadContext();
+            }
+        }
+    }
+
+    protected boolean shouldStop() {
+        /*
+         * The artifact should stop if it was explicitly stopped (not via a parent) or if it was implicitly stopped (via
+         * a parents) and it has no parents that are ACTIVE or STARTING.
+         */
+        boolean explicitStop = explicitStop();
+        if (explicitStop) {
+            topLevelStop();
+        }
+        return explicitStop || !hasActiveParent();
+    }
+
+    public boolean explicitStop() {
+        return !hasStoppingParent();
+    }
+
+    private boolean hasActiveParent() {
+        synchronized (this.monitor) {
+            if (this.isTopLevelDeployed && this.isTopLevelActive) {
+                return true;
+            }
+        }
+        for (GraphNode<InstallArtifact> parent : this.graph.getParents()) {
+            State parentState = parent.getValue().getState();
+            if (parentState.equals(State.ACTIVE) || parentState.equals(State.STARTING)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private boolean hasStoppingParent() {
+        return hasParentInState(State.STOPPING);
+    }
+
+    private boolean hasParentInState(State state) {
+        for (GraphNode<InstallArtifact> parent : this.graph.getParents()) {
+            State parentState = parent.getValue().getState();
+            if (parentState.equals(state)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private void topLevelStop() {
+        synchronized (this.monitor) {
+            if (this.isTopLevelDeployed) {
+                this.isTopLevelActive = false;
+            }
+        }
+    }
+
+    protected boolean hasStartingParent() {
+        for (GraphNode<InstallArtifact> parent : this.graph.getParents()) {
+            State parentState = parent.getValue().getState();
+            if (parentState.equals(State.STARTING)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    protected void topLevelStart() {
+        synchronized (this.monitor) {
+            if (this.isTopLevelDeployed) {
+                this.isTopLevelActive = true;
+            }
+        }
+    }
+
+    /**
+     * @see stop
+     */
+    protected abstract void doStop() throws DeploymentException;
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void uninstall() throws DeploymentException {
+        if ((getState().equals(State.STARTING) || getState().equals(State.ACTIVE) || getState().equals(State.RESOLVED)
+            || getState().equals(State.INSTALLED) || getState().equals(State.INITIAL))) {
+            try {
+                if (!getState().equals(State.INITIAL)) {
+                    pushThreadContext();
+                    try {
+                        if (getState().equals(State.ACTIVE) || getState().equals(State.STARTING)) {
+                            stop();
+                        }
+                        if (shouldUninstall()) {
+                            this.artifactStateMonitor.onUninstalling(this);
+                            try {
+                                doUninstall();
+                                this.artifactStateMonitor.onUninstalled(this);
+                            } catch (DeploymentException e) {
+                                this.artifactStateMonitor.onUninstallFailed(this, e);
+                            }
+                        }
+                    } finally {
+                        popThreadContext();
+                    }
+                }
+            } finally {
+                this.artifactStorage.delete();
+            }
+        }
+    }
+
+    private boolean shouldUninstall() {
+        boolean explicitUninstall = explicitUninstall();
+        if (explicitUninstall) {
+            topLevelUninstall();
+        }
+        return allParentsInState(State.UNINSTALLING);
+    }
+
+    private boolean allParentsInState(State state) {
+        for (GraphNode<InstallArtifact> parent : this.graph.getParents()) {
+            State parentState = parent.getValue().getState();
+            if (!parentState.equals(state)) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    public boolean explicitUninstall() {
+        return !hasUninstallingParent();
+    }
+
+    private boolean hasUninstallingParent() {
+        return hasParentInState(State.UNINSTALLING);
+    }
+
+    private void topLevelUninstall() {
+        synchronized (this.monitor) {
+            this.isTopLevelDeployed = false;
+        }
+
+    }
+
+    /**
+     * @see uninstall
+     */
+    protected abstract void doUninstall() throws DeploymentException;
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public final ArtifactFS getArtifactFS() {
+        return this.artifactStorage.getArtifactFS();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String toString() {
+        return this.identity.toString();
+    }
+
+    /**
+     * Push the thread context including any application trace name and thread context class loader. The caller is
+     * responsible for calling <code>popThreadContext</code>.
+     */
+    public void pushThreadContext() {
+        // There is no default thread context. Subclasses must override to
+        // provide one.
+    }
+
+    /**
+     * Pop a previously pushed thread context.
+     */
+    public void popThreadContext() {
+        // There is no default thread context. Subclasses must override to
+        // provide one.
+    }
+
+    protected final ArtifactStateMonitor getStateMonitor() {
+        return this.artifactStateMonitor;
+    }
+
+    /**
+     * @return false
+     */
+    @Override
+    public boolean refresh() throws DeploymentException {
+        try {
+            this.isRefreshing = true;
+            this.eventLogger.log(DeployerLogEvents.REFRESHING, getType(), getName(), getVersion());
+            this.artifactStorage.synchronize();
+
+            boolean refreshed = doRefresh();
+
+            if (refreshed) {
+                this.eventLogger.log(DeployerLogEvents.REFRESHED, getType(), getName(), getVersion());
+            } else {
+                failRefresh();
+            }
+
+            return refreshed;
+        } catch (DeploymentException de) {
+            failRefresh(de);
+            throw de;
+        } catch (RuntimeException re) {
+            failRefresh(re);
+            throw re;
+        } finally {
+            this.isRefreshing = false;
+        }
+    }
+
+    private void failRefresh() {
+        failRefresh(null);
+    }
+
+    private void failRefresh(Exception ex) {
+        this.artifactStorage.rollBack();
+        issueFailedRefreshMessage(ex);
+    }
+
+    public void issueFailedRefreshMessage(Exception ex) {
+        if (ex == null) {
+            this.eventLogger.log(DeployerLogEvents.REFRESH_FAILED, getType(), getName(), getVersion());
+        } else {
+            this.eventLogger.log(DeployerLogEvents.REFRESH_FAILED, ex, getType(), getName(), getVersion());
+        }
+    }
+
+    protected boolean doRefresh() throws DeploymentException {
+        return false;
+    }
+
+    public boolean refresh(String symbolicName) throws DeploymentException {
+        try {
+            this.isRefreshing = true;
+            this.eventLogger.log(DeployerLogEvents.REFRESHING, getType(), getName(), getVersion());
+
+            boolean refreshed = doRefresh(symbolicName);
+
+            if (refreshed) {
+                this.eventLogger.log(DeployerLogEvents.REFRESHED, getType(), getName(), getVersion());
+            } else {
+                issueFailedRefreshMessage(null);
+            }
+
+            return refreshed;
+        } catch (DeploymentException de) {
+            issueFailedRefreshMessage(de);
+            throw de;
+        } catch (RuntimeException re) {
+            issueFailedRefreshMessage(re);
+            throw re;
+        } finally {
+            this.isRefreshing = false;
+        }
+    }
+    
+    protected boolean doRefresh(String symbolicName) throws DeploymentException {
+        return false;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public final String getProperty(@NonNull String name) {
+        return this.properties.get(name);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public final Set<String> getPropertyNames() {
+        HashSet<String> propertyNames = new HashSet<String>(this.properties.keySet());
+        return Collections.unmodifiableSet(propertyNames);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public final String setProperty(String name, String value) {
+        return this.properties.put(name, value);
+    }
+
+    public Map<String, String> getDeploymentProperties() {
+        return this.deploymentProperties;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public final String getRepositoryName() {
+        return this.repositoryName;
+    }
+
+    /**
+     * @param graph to set
+     * @throws DeploymentException possible from overriding methods
+     */
+    public void setGraph(GraphNode<InstallArtifact> graph) throws DeploymentException {
+        synchronized (this.monitor) {
+            this.graph = graph;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public final GraphNode<InstallArtifact> getGraph() {
+        synchronized (this.monitor) {
+            return this.graph;
+        }
+    }
+
+    public void setTopLevelDeployed() {
+        synchronized (this.monitor) {
+            this.isTopLevelDeployed = true;
+            this.isTopLevelActive = true;
+        }
+    }
+
+    public boolean getTopLevelDeployed() {
+        synchronized (this.monitor) {
+            return this.isTopLevelDeployed;
+        }
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/ArtifactStateMonitor.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/ArtifactStateMonitor.java
new file mode 100644
index 0000000..ad178c3
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/ArtifactStateMonitor.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact.State;
+
+/**
+ * 
+ * Implementations must be thread safe
+ * 
+ */
+public interface ArtifactStateMonitor {
+
+    /**
+     * Returns the current state of the install artifact according to the events which have occurred.
+     * 
+     * @return the {@link State} of this {@link StandardArtifactStateMonitor}
+     */
+    public State getState();
+
+    public void setState(State state);
+
+    public void onInstalling(InstallArtifact installArtifact) throws DeploymentException;
+
+    public void onInstallFailed(InstallArtifact installArtifact) throws DeploymentException;
+
+    public void onInstalled(InstallArtifact installArtifact) throws DeploymentException;
+
+    public void onResolving(InstallArtifact installArtifact) throws DeploymentException;
+
+    public void onResolveFailed(InstallArtifact installArtifact) throws DeploymentException;
+
+    public void onResolved(InstallArtifact installArtifact) throws DeploymentException;
+
+    public boolean onStarting(InstallArtifact installArtifact) throws DeploymentException;
+
+    public void onStartFailed(InstallArtifact installArtifact, Throwable cause) throws DeploymentException;
+
+    public void onStartAborted(InstallArtifact installArtifact) throws DeploymentException;
+
+    public void onStarted(InstallArtifact installArtifact) throws DeploymentException;
+
+    public void onStopping(InstallArtifact installArtifact);
+
+    public void onStopFailed(InstallArtifact installArtifact, Throwable cause) throws DeploymentException;
+
+    public void onStopped(InstallArtifact installArtifact);
+
+    public void onUnresolved(InstallArtifact installArtifact) throws DeploymentException;
+
+    public void onUninstalling(InstallArtifact installArtifact) throws DeploymentException;
+
+    public void onUninstallFailed(InstallArtifact installArtifact, Throwable cause) throws DeploymentException;
+
+    public void onUninstalled(InstallArtifact installArtifact) throws DeploymentException;
+
+}
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/ArtifactStorageFactory.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/ArtifactStorageFactory.java
new file mode 100644
index 0000000..5942671
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/ArtifactStorageFactory.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import java.io.File;
+
+import org.eclipse.virgo.kernel.install.artifact.ArtifactIdentity;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactStorage;
+
+
+/**
+ * An {@link ArtifactStorageFactory} can be used to create {@link ArtifactStorage} instances.
+ * 
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations <strong>must</strong> be thread-safe.
+ * 
+ */
+public interface ArtifactStorageFactory {
+
+    /**
+     * Creates a new <code>ArtifactStorage</code> for the artifact in the given <code>File</code>. The artifact has the
+     * supplied <code>artifactIdentity</code>.
+     * 
+     * @param artifact The artifact's <code>File</code>.
+     * @param artifactIdentity The identity of the artifact for which storage is being created
+     * @return <code>ArtifactStorage</code> for the artifact.
+     */
+    ArtifactStorage create(File artifact, ArtifactIdentity artifactIdentity);
+
+    /**
+     * Creates a new empty <code>ArtifactStorage</code>. Once created, the artifact must have the supplied
+     * <code>artifactIdentity</code>.
+     * 
+     * @param artifactIdentity The identity of the artifact for which storage is being created
+     * @param directoryName The name of the directory for the artifact
+     * @param scopeName The scope in which the artifact resides
+     * @return <code>ArtifactStorage</code> for the artifact.
+     */
+    ArtifactStorage createDirectoryStorage(ArtifactIdentity artifactIdentity, String directoryName);
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/ArtifactStore.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/ArtifactStore.java
new file mode 100644
index 0000000..954a193
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/ArtifactStore.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2012 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import org.eclipse.virgo.util.io.PathReference;
+
+/**
+ * {@link ArtifactStore} manages the disk storage used to hold a working copy of an artifact. When updating the
+ * artifact, the old version of the artifact is saved in case the update operation fails and the artifact needs to be
+ * restored to the old version (in which case the new version is deleted). At most one saved version is maintained to
+ * conserve disk space if the artifact is updated multiple times.
+ * <p />
+ * An implementation of this interface may expose a single current path and save the artifact by moving it, it may
+ * create a series of paths without moving the artifact, or it may use another approach.
+ * <p />
+ * Note that instances of this interface may be stateful, so only a single instance should be used to manage the
+ * disk storage for a particular artifact.
+ * <p />
+ * <strong>Concurrent Semantics</strong><br />
+ * Implementations of this interface need not be thread safe.
+ */
+interface ArtifactStore {
+
+    /**
+     * Gets the current artifact path.
+     * 
+     * @return a {@link PathReference} to the current artifact path.
+     */
+    public PathReference getCurrentPath();
+
+    /**
+     * Saves the current artifact and prepares the current artifact path storage ready for the new artifact. Only one
+     * saved version is kept: any previously saved version is deleted.
+     */
+    public void save();
+
+    /**
+     * Deletes the current artifact and restores the saved version. The new current artifact has the same path as when
+     * it was last current.
+     */
+    public void restore();
+
+}
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/AtomicInstallArtifactLifecycleListener.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/AtomicInstallArtifactLifecycleListener.java
new file mode 100644
index 0000000..4522291
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/AtomicInstallArtifactLifecycleListener.java
@@ -0,0 +1,197 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.swing.tree.TreeNode;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifactLifecycleListenerSupport;
+import org.eclipse.virgo.kernel.install.artifact.PlanInstallArtifact;
+import org.eclipse.virgo.util.common.GraphNode;
+
+/**
+ * <code>AtomicInstallArtifactLifecycleListener</code> is an InstallArtifactLifecycleListener which initiates state
+ * changes on an atomic ancestor of an artifact when the artifact changes state.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread-safe
+ * 
+ */
+final class AtomicInstallArtifactLifecycleListener extends InstallArtifactLifecycleListenerSupport {
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void onStarting(InstallArtifact installArtifact) throws DeploymentException {
+        logger.debug("Processing atomic starting event for {}", installArtifact);
+
+        for (InstallArtifact atomicParent : getAtomicParents(installArtifact)) {
+            if (aChildIsRefreshing(atomicParent)) {
+                logger.info("Atomic starting event not propagated from {} as a child of {} is refreshing.", installArtifact, atomicParent);
+            } else {
+                logger.info("Propagating atomic starting event from {} to {}", installArtifact, atomicParent);
+                atomicParent.start();
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void onStartFailed(InstallArtifact installArtifact, Throwable cause) throws DeploymentException {
+        logger.debug("Processing atomic start failed (stop) event for {}", installArtifact);
+
+        for (InstallArtifact atomicParent : getAtomicParents(installArtifact)) {
+            if (aChildIsRefreshing(atomicParent)) {
+                logger.info("Atomic start failed event not propagated from {} as a child of {} is refreshing.", installArtifact, atomicParent);
+            } else {
+                logger.info("Propagating atomic start failed (stop) event from {} to {}", installArtifact, atomicParent);
+                atomicParent.stop();
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void onStopped(InstallArtifact installArtifact) {
+        logger.debug("Processing atomic stopped event for {}", installArtifact);
+
+        for (InstallArtifact atomicParent : getAtomicParents(installArtifact)) {
+            if (aChildIsRefreshing(atomicParent)) {
+                logger.info("Atomic stopped event not propagated from {} as a child of {} is refreshing.", installArtifact, atomicParent);
+            } else {
+                logger.info("Propagating atomic stopped event from {} to {}", installArtifact, atomicParent);
+                try {
+                    atomicParent.stop();
+                } catch (DeploymentException e) {
+                    logger.warn("Unable to propagate stopped event to an atomic root due to an exception", e);
+                }
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void onUninstalled(InstallArtifact installArtifact) throws DeploymentException {
+        logger.debug("Processing atomic uninstalled event for {}", installArtifact);
+
+        for (InstallArtifact atomicParent : getAtomicParents(installArtifact)) {
+            if (aChildIsRefreshing(atomicParent)) {
+                logger.info("Atomic uninstalled event not propagated from {} as a child of {} is refreshing.", installArtifact, atomicParent);
+            } else {
+                logger.info("Propagating atomic uninstalled event from {} to {}", installArtifact, atomicParent);
+                atomicParent.uninstall();
+            }
+        }
+    }
+
+    private Set<InstallArtifact> getAtomicParents(InstallArtifact installArtifact) {
+        Set<InstallArtifact> atomicParents = new HashSet<InstallArtifact>();
+        for (InstallArtifact parent : getParentInstallArtifacts(installArtifact)) {
+            if (isAtomicInstallArtifact(parent)) {
+                atomicParents.add(parent);
+            }
+        }
+        return atomicParents;
+    }
+
+    /**
+     * Return true if this is an {@link InstallArtifact} and contains others (in the {@link TreeNode}) and is an atomic
+     * container.
+     * 
+     * @param installArtifact
+     * @return true iff this is an artifact that has the {@link PlanInstallArtifact#isAtomic} attribute equal to true
+     */
+    private static final boolean isAtomicInstallArtifact(InstallArtifact installArtifact) {
+        if (installArtifact instanceof PlanInstallArtifact) {
+            return ((PlanInstallArtifact) installArtifact).isAtomic();
+        }
+        return false;
+    }
+
+    /**
+     * Get the parent {@link InstallArtifact}s in the {@link GraphNode} associated with the {@link InstallArtifact}, if
+     * there are any.
+     * 
+     * @param installArtifact to find the parents of
+     * @return the parent artifacts in the graph, never <code>null</code>
+     */
+    private static final Set<InstallArtifact> getParentInstallArtifacts(InstallArtifact installArtifact) {
+        Set<InstallArtifact> parentInstallArtifacts = new HashSet<InstallArtifact>();
+        GraphNode<InstallArtifact> iaGraph = installArtifact.getGraph();
+        if (iaGraph != null) {
+            List<GraphNode<InstallArtifact>> parents = iaGraph.getParents();
+            for (GraphNode<InstallArtifact> parent : parents) {
+                parentInstallArtifacts.add(parent.getValue());
+            }
+        }
+        return parentInstallArtifacts;
+    }
+
+    /**
+     * Determines if <em>any</em> child of this {@link InstallArtifact} has
+     * {@link AbstractInstallArtifact#isRefreshing() isRefreshing()} which returns true.
+     * 
+     * @param atomicParent whose children are checked
+     * @return true if any child is refreshing, otherwise false.
+     */
+    private static boolean aChildIsRefreshing(InstallArtifact atomicParent) {
+        for (InstallArtifact child : childrenOf(atomicParent)) {
+            if (child instanceof AbstractInstallArtifact) {
+                AbstractInstallArtifact aChild = (AbstractInstallArtifact) child;
+                if (aChild.isRefreshing()) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    /**
+     * @param parent
+     * @return an array of the children of the parent (which can be zero length)
+     */
+    private static InstallArtifact[] childrenOf(InstallArtifact parent) {
+        List<InstallArtifact> children = new ArrayList<InstallArtifact>();
+        if (parent != null) {
+            GraphNode<InstallArtifact> graph = parent.getGraph();
+            if (graph != null) {
+                for (GraphNode<InstallArtifact> childBranch : graph.getChildren()) {
+                    InstallArtifact child = childBranch.getValue();
+                    if (child != null) {
+                        children.add(child);
+                    }
+                }
+            }
+        }
+        return children.toArray(new InstallArtifact[children.size()]);
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/ConfigInstallArtifactGraphFactory.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/ConfigInstallArtifactGraphFactory.java
new file mode 100644
index 0000000..8259d1e
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/ConfigInstallArtifactGraphFactory.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import java.util.Map;
+
+import org.eclipse.virgo.nano.deployer.api.config.ConfigurationDeployer;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactIdentity;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactIdentityDeterminer;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactStorage;
+import org.eclipse.virgo.kernel.install.artifact.ConfigInstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifactGraphFactory;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.util.common.DirectedAcyclicGraph;
+import org.eclipse.virgo.util.common.GraphNode;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * {@link ConfigInstallArtifactGraphFactory} is an {@link InstallArtifactGraphFactory} for configuration properties file
+ * {@link InstallArtifact InstallArtifacts}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+final class ConfigInstallArtifactGraphFactory extends AbstractArtifactGraphFactory {
+
+    private static final String PROPERTIES_TYPE = ArtifactIdentityDeterminer.CONFIGURATION_TYPE;
+
+    private final BundleContext bundleContext;
+
+    private final ConfigLifecycleEngine lifecycleEngine;
+
+    private final EventLogger eventLogger;
+    
+    private final Object monitor = new Object();
+
+    private ConfigurationDeployer configurationDeployer;
+
+    ConfigInstallArtifactGraphFactory(BundleContext bundleContext, EventLogger eventLogger, @NonNull DirectedAcyclicGraph<InstallArtifact> dag) {
+    	super(dag);
+        this.bundleContext = bundleContext;
+        this.lifecycleEngine = new ConfigLifecycleEngine(bundleContext);
+        this.eventLogger = eventLogger;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public GraphNode<InstallArtifact> constructInstallArtifactGraph(ArtifactIdentity artifactIdentity, ArtifactStorage artifactStorage, Map<String, String> deploymentProperties, String repositoryName) throws DeploymentException {
+        if (PROPERTIES_TYPE.equalsIgnoreCase(artifactIdentity.getType())) {
+            ConfigurationDeployer configDeployer = obtainConfigurationDeployer();
+            if(configDeployer == null){
+            	throw new DeploymentException(String.format("Unable to locate a '%s' service to deploy '%s'", ConfigurationDeployer.class.getName(), artifactIdentity.getName()));
+            }
+            ArtifactStateMonitor artifactStateMonitor = new StandardArtifactStateMonitor(this.bundleContext);
+            ConfigInstallArtifact configInstallArtifact = new StandardConfigInstallArtifact(artifactIdentity, artifactStorage, this.lifecycleEngine, this.lifecycleEngine, this.lifecycleEngine, artifactStateMonitor, repositoryName, eventLogger, configDeployer);
+            return constructAssociatedGraphNode(configInstallArtifact);
+        } else {
+            return null;
+        }
+    }
+
+    private ConfigurationDeployer obtainConfigurationDeployer() throws DeploymentException {
+        synchronized (this.monitor) {
+            if (this.configurationDeployer == null) {
+                ServiceReference<ConfigurationDeployer> serviceReference = this.bundleContext.getServiceReference(ConfigurationDeployer.class);
+                this.configurationDeployer = this.bundleContext.getService(serviceReference);
+            }
+            return this.configurationDeployer;
+        }
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/ConfigLifecycleEngine.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/ConfigLifecycleEngine.java
new file mode 100644
index 0000000..643c79b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/ConfigLifecycleEngine.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Properties;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.eclipse.virgo.kernel.artifact.fs.ArtifactFS;
+import org.eclipse.virgo.nano.deployer.api.config.ConfigurationDeployer;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactIdentity;
+import org.eclipse.virgo.util.io.IOUtils;
+
+public final class ConfigLifecycleEngine implements StartEngine, RefreshEngine, StopEngine {
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private BundleContext context;
+    private ConfigurationDeployer configurationDeployer;
+
+    public ConfigLifecycleEngine(BundleContext context) {
+    	this.context = context;
+    }
+
+    public void start(ArtifactIdentity artifactIdentity, ArtifactFS artifactFS) throws StartException {
+    	
+    	initialiseConfigurationDeployer();
+		
+        try {
+            updateConfiguration(artifactIdentity, artifactFS);
+        } catch (IOException e) {
+            String message = String.format("Unable to start configuration '%s' with '%s'", artifactIdentity.getName(), artifactFS);
+            logger.error(message);
+            throw new StartException(message, e);
+        }
+    }
+
+	private void initialiseConfigurationDeployer() {
+		ServiceReference<ConfigurationDeployer> configurationImporterRef = context.getServiceReference(ConfigurationDeployer.class);
+		this.configurationDeployer = context.getService(configurationImporterRef);
+	}
+
+    public void refresh(ArtifactIdentity artifactIdentity, ArtifactFS artifactFS) throws RefreshException {
+        try {
+            updateConfiguration(artifactIdentity, artifactFS);
+        } catch (IOException e) {
+            String message = String.format("Unable to refresh configuration '%s' with '%s'", artifactIdentity.getName(), artifactFS);
+            logger.error(message);
+            throw new RefreshException(message, e);
+        }
+    }
+
+    private void updateConfiguration(ArtifactIdentity artifactIdentity, ArtifactFS artifactFS) throws IOException {
+        InputStream inputStream = null;
+        try {
+            inputStream = artifactFS.getEntry("").getInputStream();
+            configurationDeployer.publishConfiguration(artifactIdentity.getName(), getProperties(inputStream));
+        } finally {
+            IOUtils.closeQuietly(inputStream);
+        }
+    }
+
+    private Properties getProperties(InputStream inputSteam) throws IOException {
+        Properties p = new Properties();
+        p.load(inputSteam);
+        return p;
+    }
+
+    public void stop(ArtifactIdentity artifactIdentity, ArtifactFS artifactFS) throws StopException {
+        try {
+        	configurationDeployer.deleteConfiguration(artifactIdentity.getName());
+        } catch (IOException e) {
+            String message = String.format("Unable to stop configuration '%s'", artifactIdentity.getName());
+            logger.error(message);
+            throw new StopException(message, e);
+        }
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/DelegatingServiceRegistryBackedArtifactIdentityDeterminer.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/DelegatingServiceRegistryBackedArtifactIdentityDeterminer.java
new file mode 100644
index 0000000..4bf62f4
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/DelegatingServiceRegistryBackedArtifactIdentityDeterminer.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import java.io.File;
+
+import org.eclipse.virgo.kernel.install.artifact.ArtifactIdentity;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactIdentityDeterminer;
+import org.osgi.framework.BundleContext;
+import org.osgi.util.tracker.ServiceTracker;
+
+
+/**
+ * An {@link ArtifactIdentityDeterminer} that delegates to the <code>ArtifactTypeDeterminer</code>s available in the
+ * OSGi service registry.
+ * 
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread-safe.
+ * 
+ */
+public class DelegatingServiceRegistryBackedArtifactIdentityDeterminer implements ArtifactIdentityDeterminer {
+    
+    private final ServiceTracker<ArtifactIdentityDeterminer, ArtifactIdentityDeterminer> serviceTracker;
+
+    /**
+     * @param bundleContext
+     */
+    public DelegatingServiceRegistryBackedArtifactIdentityDeterminer(BundleContext bundleContext) {
+        this.serviceTracker = new ServiceTracker<ArtifactIdentityDeterminer, ArtifactIdentityDeterminer>(bundleContext, ArtifactIdentityDeterminer.class.getName(), null);       
+    }
+    
+    public void init() {
+        this.serviceTracker.open();
+    }
+    
+    public void destroy() {
+        this.serviceTracker.close();
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public ArtifactIdentity determineIdentity(File file, String scopeName) {
+        Object[] services = this.serviceTracker.getServices();
+        
+        if (services != null) {
+            for (Object service : services) {
+                if (service != null) {
+                    ArtifactIdentity identity = ((ArtifactIdentityDeterminer)service).determineIdentity(file, scopeName);
+                    if (identity != null) {
+                        return identity;
+                    }
+                }
+            }
+        }
+        
+        return null;
+    }    
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/FileMovingArtifactStore.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/FileMovingArtifactStore.java
new file mode 100644
index 0000000..5e17bb7
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/FileMovingArtifactStore.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright (c) 2012 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import org.eclipse.virgo.util.io.PathReference;
+
+/**
+ * {@link FileMovingArtifactStore} implements {@link ArtifactStore} and saves its artifact by moving it to another
+ * location on disk.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread safe.
+ */
+final class FileMovingArtifactStore extends AbstractArtifactStore implements ArtifactStore {
+
+    private final PathReference currentPath;
+
+    private final PathReference savedPath;
+
+    /**
+     * Constructs a {@link FileMovingArtifactStore} at the specified path and prepares the path storage ready for the
+     * new artifact.
+     */
+    FileMovingArtifactStore(PathReference basePathReference) {
+        super(basePathReference);
+        this.currentPath = basePathReference;
+        this.savedPath = new PathReference(String.format("%s-saved", this.currentPath.getAbsolutePath()));
+
+        this.currentPath.getParent().createDirectory();
+        this.currentPath.delete(true);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void save() {
+        if (this.currentPath.exists()) {
+            this.savedPath.delete(true);
+            this.currentPath.moveTo(this.savedPath);
+        }
+        super.save();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void restore() {
+        super.restore();
+        if (this.savedPath.exists()) {
+            this.savedPath.moveTo(this.currentPath);
+        }
+
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public PathReference getCurrentPath() {
+        return this.currentPath;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected PathReference getSavedPath() {
+        return this.savedPath;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/GenerationalArtifactStore.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/GenerationalArtifactStore.java
new file mode 100644
index 0000000..ae34664
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/GenerationalArtifactStore.java
@@ -0,0 +1,119 @@
+/*******************************************************************************
+ * Copyright (c) 2012 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import java.io.File;
+
+import org.eclipse.virgo.util.io.PathReference;
+
+/**
+ * {@link GenerationalArtifactStore} implements {@link ArtifactStore} by creating a series of paths so that each version
+ * of the artifact has a fresh path (unless the series wraps which is extremely unlikely in practice). This is designed
+ * for storing a bundle which will be installed by reference into the OSGi framework since, when the bundle is updated,
+ * the current version of the bundle may be in use until the bundle becomes unresolved.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * TODO Document concurrent semantics of GenerationalArtifactStore
+ */
+final class GenerationalArtifactStore extends AbstractArtifactStore implements ArtifactStore {
+
+    private final PathReference baseDirectory;
+
+    private long generation;
+
+    private final String baseName;
+
+    /**
+     * Constructs a {@link GenerationalArtifactStore} in the directory of the specified path and prepares the path
+     * storage ready for the new artifact. Each path produced by this store has the same filename as the specified path.
+     */
+    GenerationalArtifactStore(PathReference basePathReference) {
+        super(basePathReference);
+        this.baseDirectory = basePathReference.getParent();
+        this.baseName = basePathReference.getName();
+
+        final long recoveredGeneration = recoverLastGeneration(this.baseDirectory);
+        this.generation = recoveredGeneration == -1 ? 0 : recoveredGeneration;
+
+        PathReference currentPathReference = getGenerationPath(this.generation, this.baseDirectory, this.baseName);
+        if (recoveredGeneration == -1) {
+            currentPathReference.getParent().createDirectory();
+            currentPathReference.delete(true);
+        }
+    }
+
+    private static long recoverLastGeneration(PathReference baseDirectory) {
+        long lastGeneration = -1;
+        File file = baseDirectory.toFile();
+        String[] children = file.list();
+        if (children != null) {
+            for (String child : children) {
+                try {
+                    long childGeneration = Long.parseLong(child);
+                    if (childGeneration > lastGeneration) {
+                        lastGeneration = childGeneration;
+                    }
+                } catch (NumberFormatException ignored) {
+                }
+            }
+        }
+        return lastGeneration;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public PathReference getCurrentPath() {
+        synchronized (this.monitor) {
+            return getGenerationPath(this.generation);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void save() {
+        synchronized (this.monitor) {
+            if (this.generation != 0) {
+                getSavedPath().delete(true);
+            }
+            this.generation++;
+            super.save();
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void restore() {
+        synchronized (this.monitor) {
+            super.restore();
+            this.generation--;
+        }
+    }
+
+    protected PathReference getSavedPath() {
+        return getGenerationPath(this.generation - 1);
+    }
+
+    private PathReference getGenerationPath(long generation) {
+        return getGenerationPath(generation, this.baseDirectory, this.baseName);
+    }
+
+    private static PathReference getGenerationPath(long generation, PathReference baseDirectory, String baseName) {
+        return baseDirectory.newChild(Long.toString(generation)).newChild(baseName);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/InstallArtifactDAGSingletonFactory.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/InstallArtifactDAGSingletonFactory.java
new file mode 100644
index 0000000..02d29c0
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/InstallArtifactDAGSingletonFactory.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2011 EclipseSource
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.util.common.DirectedAcyclicGraph;
+import org.eclipse.virgo.util.common.ThreadSafeDirectedAcyclicGraph;
+
+/**
+ * {@link InstallArtifactDAGSingletonFactory} is used to create the graph of
+ * {@link InstallArtifact InstallArtifacts}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations of this interface must be thread safe.
+ * 
+ */
+final class InstallArtifactDAGSingletonFactory {
+
+	private static final DirectedAcyclicGraph<InstallArtifact> DAG = new ThreadSafeDirectedAcyclicGraph<InstallArtifact>();
+
+	public static DirectedAcyclicGraph<InstallArtifact> createInstance() {
+		return DAG;
+	}
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/InstallArtifactRefreshHandler.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/InstallArtifactRefreshHandler.java
new file mode 100644
index 0000000..f6cafa7
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/InstallArtifactRefreshHandler.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+
+
+/**
+ * A <code>InstallArtifactRefreshHandler</code> is used to handle the refresh of an
+ * {@link InstallArtifact}.
+ * 
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Implementations <strong>must</strong> be thread-safe.
+ *
+ */
+public interface InstallArtifactRefreshHandler {
+    
+    /**
+     * Handles refresh of the supplied {@link InstallArtifact}.
+     * 
+     * @param installArtifact The <code>InstallArtifact</code> to refresh
+     * @return <code>true</code> if the refresh was successful, otherwise <code>false</code>.
+     */
+    boolean refresh(InstallArtifact installArtifact);
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/LoggingInstallArtifactLifecycleListener.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/LoggingInstallArtifactLifecycleListener.java
new file mode 100644
index 0000000..26f28f1
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/LoggingInstallArtifactLifecycleListener.java
@@ -0,0 +1,167 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+
+import org.eclipse.virgo.nano.deployer.api.core.DeployerLogEvents;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifactLifecycleListener;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+
+/**
+ * {@link LoggingInstallArtifactLifecycleListener} listens for lifecycle events for {@link InstallArtifact
+ * InstallArtifacts} and logs messages.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+final class LoggingInstallArtifactLifecycleListener implements InstallArtifactLifecycleListener {
+
+    private final EventLogger eventLogger;
+
+    public LoggingInstallArtifactLifecycleListener(EventLogger eventLogger) {
+        this.eventLogger = eventLogger;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onInstallFailed(InstallArtifact installArtifact) {
+        logEvent(DeployerLogEvents.INSTALL_FAILED, installArtifact);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onInstalled(InstallArtifact installArtifact) {
+        logEvent(DeployerLogEvents.INSTALLED, installArtifact);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onInstalling(InstallArtifact installArtifact) {
+        logEvent(DeployerLogEvents.INSTALLING, installArtifact);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onResolveFailed(InstallArtifact installArtifact) {
+
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onResolved(InstallArtifact installArtifact) {
+
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onResolving(InstallArtifact installArtifact) {
+
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onStartFailed(InstallArtifact installArtifact, Throwable cause) {
+        logEvent(DeployerLogEvents.START_FAILED, installArtifact, cause);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onStartAborted(InstallArtifact installArtifact) {
+        logEvent(DeployerLogEvents.START_ABORTED, installArtifact);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onStarted(InstallArtifact installArtifact) {
+        logEvent(DeployerLogEvents.STARTED, installArtifact);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onStarting(InstallArtifact installArtifact) {
+        logEvent(DeployerLogEvents.STARTING, installArtifact);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onStopFailed(InstallArtifact installArtifact, Throwable cause) {
+        logEvent(DeployerLogEvents.STOP_FAILED, installArtifact, cause);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onStopped(InstallArtifact installArtifact) {
+        logEvent(DeployerLogEvents.STOPPED, installArtifact);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onStopping(InstallArtifact installArtifact) {
+        logEvent(DeployerLogEvents.STOPPING, installArtifact);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onUnresolved(InstallArtifact installArtifact) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onUninstallFailed(InstallArtifact installArtifact, Throwable cause) {
+        logEvent(DeployerLogEvents.UNINSTALL_FAILED, installArtifact, cause);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onUninstalled(InstallArtifact installArtifact) {
+        logEvent(DeployerLogEvents.UNINSTALLED, installArtifact);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onUninstalling(InstallArtifact installArtifact) {
+        logEvent(DeployerLogEvents.UNINSTALLING, installArtifact);
+    }
+
+    private void logEvent(DeployerLogEvents event, InstallArtifact installArtifact) {
+        this.eventLogger.log(event, installArtifact.getType(), installArtifact.getName(), installArtifact.getVersion());
+    }
+
+    private void logEvent(DeployerLogEvents event, InstallArtifact installArtifact, Throwable cause) {
+        if (cause == null) {
+            logEvent(event, installArtifact);
+        } else {
+            this.eventLogger.log(event, cause, installArtifact.getType(), installArtifact.getName(), installArtifact.getVersion());
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/ParPlanInstallArtifact.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/ParPlanInstallArtifact.java
new file mode 100644
index 0000000..ff521eb
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/ParPlanInstallArtifact.java
@@ -0,0 +1,290 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.virgo.kernel.artifact.ArtifactSpecification;
+import org.eclipse.virgo.kernel.artifact.fs.ArtifactFS;
+import org.eclipse.virgo.kernel.artifact.fs.ArtifactFSEntry;
+import org.eclipse.virgo.kernel.artifact.plan.PlanDescriptor.Provisioning;
+import org.eclipse.virgo.nano.deployer.api.core.DeployerLogEvents;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactIdentity;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactIdentityDeterminer;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactStorage;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifactGraphFactory;
+import org.eclipse.virgo.kernel.install.artifact.ScopeServiceRepository;
+import org.eclipse.virgo.kernel.install.artifact.internal.scoping.ArtifactIdentityScoper;
+import org.eclipse.virgo.kernel.install.artifact.internal.scoping.ScopeNameFactory;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.eclipse.virgo.nano.shim.scope.ScopeFactory;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.util.common.GraphNode;
+import org.eclipse.virgo.util.math.OrderedPair;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * {@link ParPlanInstallArtifact} is an {@link InstallArtifact} for a PAR file.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+final class ParPlanInstallArtifact extends StandardPlanInstallArtifact {
+
+    private static final ArrayList<ArtifactSpecification> EMPTY_ARTIFACT_SPECIFICATION_LIST = new ArrayList<ArtifactSpecification>();
+
+    private static final String META_INF_PATH = "//META-INF";
+
+    private final Object monitor = new Object();
+
+    private final InstallArtifactGraphFactory bundleInstallArtifactGraphFactory;
+
+    private final InstallArtifactGraphFactory configInstallArtifactGraphFactory;
+
+    private final ArtifactStorageFactory artifactStorageFactory;
+
+    private final ArtifactIdentityDeterminer artifactIdentityDeterminer;
+
+    private final List<GraphNode<InstallArtifact>> childInstallArtifacts;
+
+    private final InstallArtifactGraphFactory planInstallArtifactGraphFactory;
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(ParPlanInstallArtifact.class);
+
+    public ParPlanInstallArtifact(@NonNull ArtifactIdentity identity, @NonNull ArtifactStorage artifactStorage,
+        @NonNull ArtifactStateMonitor artifactStateMonitor, @NonNull ScopeServiceRepository scopeServiceRepository,
+        @NonNull ScopeFactory scopeFactory, @NonNull EventLogger eventLogger, @NonNull InstallArtifactGraphFactory bundleInstallArtifactGraphFactory,
+        @NonNull InstallArtifactRefreshHandler refreshHandler, String repositoryName,
+        @NonNull InstallArtifactGraphFactory configInstallArtifactGraphFactory, @NonNull ArtifactStorageFactory artifactStorageFactory,
+        @NonNull ArtifactIdentityDeterminer artifactIdentityDeterminer, @NonNull InstallArtifactGraphFactory planInstallArtifactGraphFactory)
+        throws DeploymentException {
+        super(identity, true, true, Provisioning.AUTO, artifactStorage, artifactStateMonitor, scopeServiceRepository, scopeFactory, eventLogger,
+            refreshHandler, repositoryName, EMPTY_ARTIFACT_SPECIFICATION_LIST);
+
+        this.artifactStorageFactory = artifactStorageFactory;
+        this.configInstallArtifactGraphFactory = configInstallArtifactGraphFactory;
+
+        this.bundleInstallArtifactGraphFactory = bundleInstallArtifactGraphFactory;
+        this.planInstallArtifactGraphFactory = planInstallArtifactGraphFactory;
+        this.artifactIdentityDeterminer = artifactIdentityDeterminer;
+
+        List<OrderedPair<ArtifactIdentity, ArtifactFSEntry>> childArtifacts = findChildArtifacts(artifactStorage.getArtifactFS());
+        this.childInstallArtifacts = createChildInstallArtifacts(childArtifacts);
+    }
+
+    private List<OrderedPair<ArtifactIdentity, ArtifactFSEntry>> findChildArtifacts(ArtifactFS artifactFS) throws DeploymentException {
+
+        List<OrderedPair<ArtifactIdentity, ArtifactFSEntry>> childArtifacts = new ArrayList<OrderedPair<ArtifactIdentity, ArtifactFSEntry>>();
+
+        ArtifactFSEntry entry = artifactFS.getEntry("/");
+        ArtifactFSEntry[] children = entry.getChildren();
+        if (children.length == 0) {
+            throw new DeploymentException("Failed to find child artifacts in par " + artifactFS);
+        }
+
+        String scopeName = ScopeNameFactory.createScopeName(this.getName(), this.getVersion());
+
+        for (ArtifactFSEntry child : children) {
+            String name = child.getPath();
+            if (!META_INF_PATH.equals(name)) {
+                ArtifactIdentity artifactIdentity = this.artifactIdentityDeterminer.determineIdentity(child.getArtifactFS().getFile(), scopeName);
+                if (artifactIdentity != null) {
+                    ArtifactIdentity scopedIdentity = ArtifactIdentityScoper.scopeArtifactIdentity(artifactIdentity);
+                    childArtifacts.add(new OrderedPair<ArtifactIdentity, ArtifactFSEntry>(scopedIdentity, child));
+                } else {
+                    LOGGER.warn("Skipping entry " + name + " as it is not of a recognized type");
+                }
+            }
+        }
+
+        return childArtifacts;
+    }
+
+    List<GraphNode<InstallArtifact>> createChildInstallArtifacts(List<OrderedPair<ArtifactIdentity, ArtifactFSEntry>> childArtifacts)
+        throws DeploymentException {
+
+        List<GraphNode<InstallArtifact>> childInstallArtifacts = new ArrayList<GraphNode<InstallArtifact>>();
+
+        for (OrderedPair<ArtifactIdentity, ArtifactFSEntry> childArtifact : childArtifacts) {
+
+            GraphNode<InstallArtifact> subGraph = null;
+
+            ArtifactIdentity identity = childArtifact.getFirst();
+            ArtifactFSEntry artifactFs = childArtifact.getSecond();
+
+            ArtifactStorage childArtifactStorage = createArtifactStorage(artifactFs, identity);
+
+            if (ArtifactIdentityDeterminer.BUNDLE_TYPE.equals(identity.getType())) {
+                subGraph = this.bundleInstallArtifactGraphFactory.constructInstallArtifactGraph(identity, childArtifactStorage, null, null);
+            } else if (ArtifactIdentityDeterminer.CONFIGURATION_TYPE.equals(identity.getType())) {
+                subGraph = this.configInstallArtifactGraphFactory.constructInstallArtifactGraph(identity, childArtifactStorage, null, null);
+            } else if (ArtifactIdentityDeterminer.PLAN_TYPE.equals(identity.getType())) {
+                subGraph = this.planInstallArtifactGraphFactory.constructInstallArtifactGraph(identity, childArtifactStorage, null, null);
+            }
+
+            if (subGraph == null) {
+                LOGGER.warn("Skipping " + identity + " as " + identity.getType() + " artifacts are not supported within a PAR");
+            } else {
+                childInstallArtifacts.add(subGraph);
+            }
+        }
+
+        return childInstallArtifacts;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void beginInstall() throws DeploymentException {
+        super.beginInstall();
+
+        List<GraphNode<InstallArtifact>> children;
+        synchronized (this.monitor) {
+            children = new ArrayList<GraphNode<InstallArtifact>>(this.childInstallArtifacts);
+        }
+
+        for (GraphNode<InstallArtifact> child : children) {
+            ((AbstractInstallArtifact) child.getValue()).beginInstall();
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setGraph(GraphNode<InstallArtifact> graph) throws DeploymentException {
+        synchronized (this.monitor) {
+            super.setGraph(graph);
+            List<GraphNode<InstallArtifact>> children = graph.getChildren();
+            for (GraphNode<InstallArtifact> child : this.childInstallArtifacts) {
+                // Add any children that are not already present.
+                if (!isChildPresent(children, child)) {
+                    graph.addChild(child);
+                }
+            }
+        }
+    }
+
+    private static boolean isChildPresent(List<GraphNode<InstallArtifact>> children, GraphNode<InstallArtifact> newChild) {
+        InstallArtifact newChildValue = newChild.getValue();
+        for (GraphNode<InstallArtifact> child : children) {
+            InstallArtifact childValue = child.getValue();
+            if (equalIdentities(childValue, newChildValue)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private static boolean equalIdentities(InstallArtifact ia1, InstallArtifact ia2) {
+        ArtifactIdentity id1 = ((AbstractInstallArtifact) ia1).getIdentity();
+        ArtifactIdentity id2 = ((AbstractInstallArtifact) ia2).getIdentity();
+        return id1.equals(id2);
+    }
+
+    private ArtifactStorage createArtifactStorage(ArtifactFSEntry artifactFSEntry, ArtifactIdentity artifactIdentity) {
+        ArtifactStorage innerStorage = this.artifactStorageFactory.create(artifactFSEntry.getArtifactFS().getFile(), artifactIdentity);
+        ArtifactStorage outerStorage = this.artifactStorage;
+        return new DelegatingArtifactStorage(innerStorage, outerStorage);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean refresh(String symbolicName) throws DeploymentException {
+        return super.refresh(symbolicName);
+    }
+    
+    @Override
+    protected boolean doRefresh(String symbolicName) throws DeploymentException {
+        InstallArtifact childToRefresh = findChild(symbolicName);
+
+        if (childToRefresh == null) {
+            this.eventLogger.log(DeployerLogEvents.REFRESH_REQUEST_FAILED, symbolicName, getType(), getName(), getVersion());
+            throw new DeploymentException("Refresh failed: child '" + symbolicName + "' not found in " + getType() + "(" + getName() + ", "
+                + getVersion() + ")");
+        }
+        return childToRefresh.refresh();
+    }
+
+    private InstallArtifact findChild(String symbolicName) {
+        InstallArtifact childToRefresh = null;
+        List<GraphNode<InstallArtifact>> children = getGraph().getChildren();
+        for (GraphNode<InstallArtifact> child : children) {
+            InstallArtifact childInstallArtifact = child.getValue();
+            String childName = childInstallArtifact.getName();
+            if (childName.equals(symbolicName) || childName.equals(ScopeNameFactory.createScopeName(getName(), getVersion()) + "-" + symbolicName)) {
+                childToRefresh = childInstallArtifact;
+                break;
+            }
+        }
+        return childToRefresh;
+    }
+
+    private static final class DelegatingArtifactStorage implements ArtifactStorage {
+
+        private final ArtifactStorage delegate;
+
+        private final ArtifactStorage sourceStorage;
+
+        private DelegatingArtifactStorage(ArtifactStorage delegate, ArtifactStorage sourceStorage) {
+            this.delegate = delegate;
+            this.sourceStorage = sourceStorage;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public void delete() {
+            this.delegate.delete();
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public ArtifactFS getArtifactFS() {
+            return this.delegate.getArtifactFS();
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public void synchronize() {
+            this.sourceStorage.synchronize();
+            this.delegate.synchronize();
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public void synchronize(URI sourceUri) {
+            this.delegate.synchronize(sourceUri);
+        }
+
+        public void rollBack() {
+            this.delegate.rollBack();
+            this.sourceStorage.rollBack();
+        }
+
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/ParPlanInstallArtifactFactory.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/ParPlanInstallArtifactFactory.java
new file mode 100644
index 0000000..3058642
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/ParPlanInstallArtifactFactory.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactIdentity;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactIdentityDeterminer;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactStorage;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifactGraphFactory;
+import org.eclipse.virgo.kernel.install.artifact.ScopeServiceRepository;
+import org.eclipse.virgo.kernel.install.artifact.internal.bundle.BundleInstallArtifactGraphFactory;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.eclipse.virgo.nano.shim.scope.ScopeFactory;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.osgi.framework.BundleContext;
+
+/**
+ * A factory for creating {@link ParPlanInstallArtifact} instances.
+ * 
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ * 
+ */
+final class ParPlanInstallArtifactFactory {
+
+    private final EventLogger eventLogger;
+
+    private final BundleContext bundleContext;
+
+    private final BundleInstallArtifactGraphFactory bundleInstallArtifactGraphFactory;
+
+    private final ScopeServiceRepository scopeServiceRepository;
+
+    private final ScopeFactory scopeFactory;
+
+    private final InstallArtifactRefreshHandler refreshHandler;
+
+    private final InstallArtifactGraphFactory configInstallArtifactGraphFactory;
+
+    private final ArtifactStorageFactory artifactStorageFactory;
+    
+    private final ArtifactIdentityDeterminer artifactIdentityDeterminer;
+
+    private final InstallArtifactGraphFactory planInstallArtifactGraphFactory;
+
+    ParPlanInstallArtifactFactory(EventLogger eventLogger, BundleContext bundleContext,
+        BundleInstallArtifactGraphFactory bundleInstallArtifactTreeFactory, ScopeServiceRepository scopeServiceRepository, ScopeFactory scopeFactory,
+        InstallArtifactRefreshHandler refreshHandler, ConfigInstallArtifactGraphFactory configInstallArtifactGraphFactory,
+        ArtifactStorageFactory artifactStorageFactory, ArtifactIdentityDeterminer artifactIdentityDeterminer, PlanInstallArtifactGraphFactory planInstallArtifactGraphFactory) {
+        this.eventLogger = eventLogger;
+        this.bundleContext = bundleContext;
+        this.bundleInstallArtifactGraphFactory = bundleInstallArtifactTreeFactory;
+        this.scopeServiceRepository = scopeServiceRepository;
+        this.scopeFactory = scopeFactory;
+        this.refreshHandler = refreshHandler;
+        this.configInstallArtifactGraphFactory = configInstallArtifactGraphFactory;
+        this.artifactStorageFactory = artifactStorageFactory;
+        this.artifactIdentityDeterminer = artifactIdentityDeterminer;
+        this.planInstallArtifactGraphFactory = planInstallArtifactGraphFactory;
+    }
+
+    ParPlanInstallArtifact createParPlanInstallArtifact(@NonNull ArtifactIdentity artifactIdentity, @NonNull ArtifactStorage artifactStorage, String repositoryName) throws DeploymentException {
+        ArtifactStateMonitor artifactStateMonitor = new StandardArtifactStateMonitor(this.bundleContext);
+        return new ParPlanInstallArtifact(artifactIdentity, artifactStorage, artifactStateMonitor, scopeServiceRepository, scopeFactory, eventLogger,
+            bundleInstallArtifactGraphFactory, refreshHandler, repositoryName, this.configInstallArtifactGraphFactory,
+            this.artifactStorageFactory, this.artifactIdentityDeterminer, this.planInstallArtifactGraphFactory);
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/PlanInstallArtifactGraphFactory.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/PlanInstallArtifactGraphFactory.java
new file mode 100644
index 0000000..462146a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/PlanInstallArtifactGraphFactory.java
@@ -0,0 +1,153 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution (PlanInstallArtifactTreeFactory)
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import static org.eclipse.virgo.kernel.install.artifact.ArtifactIdentityDeterminer.PAR_TYPE;
+import static org.eclipse.virgo.kernel.install.artifact.ArtifactIdentityDeterminer.PLAN_TYPE;
+
+import java.io.InputStream;
+import java.util.Locale;
+import java.util.Map;
+
+import org.eclipse.virgo.kernel.artifact.plan.PlanDescriptor;
+import org.eclipse.virgo.kernel.artifact.plan.PlanDescriptor.Provisioning;
+import org.eclipse.virgo.kernel.artifact.plan.PlanReader;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactIdentity;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactIdentityDeterminer;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactStorage;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifactGraphFactory;
+import org.eclipse.virgo.kernel.install.artifact.ScopeServiceRepository;
+import org.eclipse.virgo.kernel.install.artifact.internal.bundle.BundleInstallArtifactGraphFactory;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.eclipse.virgo.nano.shim.scope.ScopeFactory;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.util.common.DirectedAcyclicGraph;
+import org.eclipse.virgo.util.common.GraphNode;
+import org.eclipse.virgo.util.io.IOUtils;
+import org.osgi.framework.BundleContext;
+
+/**
+ * {@link PlanInstallArtifactGraphFactory} is an {@link InstallArtifactGraphFactory} for plan {@link InstallArtifact
+ * InstallArtifacts}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+final class PlanInstallArtifactGraphFactory extends AbstractArtifactGraphFactory {
+
+    private static final String PROVISIONING_PROPERTY_NAME = "org.eclipse.virgo.kernel.provisioning";
+
+    private final BundleContext bundleContext;
+
+    private final ScopeServiceRepository scopeServiceRepository;
+
+    private final ScopeFactory scopeFactory;
+
+    private final EventLogger eventLogger;
+
+    private final InstallArtifactRefreshHandler refreshHandler;
+
+    private final ParPlanInstallArtifactFactory parFactory;
+
+    public PlanInstallArtifactGraphFactory(@NonNull BundleContext bundleContext, @NonNull ScopeServiceRepository scopeServiceRepository,
+        @NonNull ScopeFactory scopeFactory, @NonNull EventLogger eventLogger,
+        @NonNull BundleInstallArtifactGraphFactory bundleInstallArtifactGraphFactory, @NonNull InstallArtifactRefreshHandler refreshHandler,
+        @NonNull ConfigInstallArtifactGraphFactory configInstallArtifactGraphFactory, @NonNull ArtifactStorageFactory artifactStorageFactory,
+        @NonNull ArtifactIdentityDeterminer artifactIdentityDeterminer, @NonNull DirectedAcyclicGraph<InstallArtifact> dag) {
+        super(dag);
+        this.bundleContext = bundleContext;
+        this.scopeServiceRepository = scopeServiceRepository;
+        this.scopeFactory = scopeFactory;
+        this.eventLogger = eventLogger;
+        this.refreshHandler = refreshHandler;
+
+        this.parFactory = new ParPlanInstallArtifactFactory(eventLogger, bundleContext, bundleInstallArtifactGraphFactory, scopeServiceRepository,
+            scopeFactory, refreshHandler, configInstallArtifactGraphFactory, artifactStorageFactory, artifactIdentityDeterminer, this);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public GraphNode<InstallArtifact> constructInstallArtifactGraph(ArtifactIdentity identity, ArtifactStorage artifactStorage,
+        Map<String, String> deploymentProperties, String repositoryName) throws DeploymentException {
+        String type = identity.getType();
+        if (PLAN_TYPE.equalsIgnoreCase(type)) {
+            return createPlanGraph(identity, artifactStorage, getPlanDescriptor(artifactStorage), repositoryName, deploymentProperties);
+        } else if (PAR_TYPE.equalsIgnoreCase(type)) {
+            return createParGraph(identity, artifactStorage, repositoryName);
+        } else {
+            return null;
+        }
+    }
+
+    private GraphNode<InstallArtifact> createParGraph(ArtifactIdentity artifactIdentity, ArtifactStorage artifactStorage, String repositoryName)
+        throws DeploymentException {
+
+        ParPlanInstallArtifact parArtifact = this.parFactory.createParPlanInstallArtifact(artifactIdentity, artifactStorage, repositoryName);
+        return constructAssociatedGraphNode(parArtifact);
+    }
+
+    /**
+     * @throws DeploymentException
+     */
+    private PlanDescriptor getPlanDescriptor(ArtifactStorage artifactStorage) throws DeploymentException {
+        InputStream in = null;
+        try {
+            in = artifactStorage.getArtifactFS().getEntry("").getInputStream();
+            PlanDescriptor planDescriptor = new PlanReader().read(in);
+            return planDescriptor;
+        } finally {
+            IOUtils.closeQuietly(in);
+        }
+    }
+
+    private GraphNode<InstallArtifact> createPlanGraph(ArtifactIdentity artifactIdentity, ArtifactStorage artifactStorage,
+        PlanDescriptor planDescriptor, String repositoryName, Map<String, String> deploymentProperties) throws DeploymentException {
+
+        Provisioning resultantProvisioning = determinePlanProvisioning(planDescriptor, getParentProvisioning(deploymentProperties));
+
+        StandardPlanInstallArtifact planInstallArtifact = new StandardPlanInstallArtifact(artifactIdentity, planDescriptor.getAtomic(),
+            planDescriptor.getScoped(), resultantProvisioning, artifactStorage, new StandardArtifactStateMonitor(this.bundleContext),
+            this.scopeServiceRepository, this.scopeFactory, this.eventLogger, this.refreshHandler, repositoryName,
+            planDescriptor.getArtifactSpecifications());
+
+        return constructAssociatedGraphNode(planInstallArtifact);
+    }
+
+    private Provisioning getParentProvisioning(Map<String, String> deploymentProperties) {
+        Provisioning parentProvisioning = Provisioning.AUTO;
+        if (deploymentProperties != null) {
+            String provisioningProperty = deploymentProperties.get(PROVISIONING_PROPERTY_NAME);
+            if (provisioningProperty != null) {
+                parentProvisioning = Provisioning.valueOf(provisioningProperty.toUpperCase(Locale.ENGLISH));
+                if (parentProvisioning == Provisioning.INHERIT) {
+                    parentProvisioning = Provisioning.AUTO;
+                }
+            }
+        }
+        return parentProvisioning;
+    }
+
+    private Provisioning determinePlanProvisioning(PlanDescriptor planDescriptor, Provisioning parentProvisioning) {
+        Provisioning planProvisioningSpec = planDescriptor.getProvisioning();
+        Provisioning resultantProvisioning = planProvisioningSpec == Provisioning.INHERIT ? parentProvisioning : planProvisioningSpec;
+        return resultantProvisioning;
+    }
+
+}
+
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/PlanMemberCollector.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/PlanMemberCollector.java
new file mode 100644
index 0000000..ec56eee
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/PlanMemberCollector.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.PlanInstallArtifact;
+import org.eclipse.virgo.util.common.GraphNode;
+import org.eclipse.virgo.util.common.GraphNode.DirectedAcyclicGraphVisitor;
+
+/**
+ * A simple helper class that can be used to collect all of the members of a plan. Collection is performed by visiting
+ * the entire graph beneath the plan.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ * 
+ */
+final class PlanMemberCollector {
+
+    /**
+     * Collects all of the members of the given <code>plan</code>, including any nested plans and their members. Note that the
+     * supplied <code>plan</code> will not be included in the returned <code>List</code>.
+     * 
+     * @param plan the plan for which the members are to be collected
+     * @return all the members of the plan, not including the plan itself
+     */
+    List<InstallArtifact> collectPlanMembers(PlanInstallArtifact plan) {
+        ArtifactCollectingGraphVisitor visitor = new ArtifactCollectingGraphVisitor(plan);
+        plan.getGraph().visit(visitor);
+        return visitor.getMembers();
+    }
+
+    private static final class ArtifactCollectingGraphVisitor implements DirectedAcyclicGraphVisitor<InstallArtifact> {
+
+        private final InstallArtifact root;
+
+        private final List<InstallArtifact> members = new ArrayList<InstallArtifact>();
+
+        private final Object monitor = new Object();
+
+        /**
+         * @param root
+         */
+        public ArtifactCollectingGraphVisitor(InstallArtifact root) {
+            this.root = root;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public boolean visit(GraphNode<InstallArtifact> node) {
+            InstallArtifact artifact = node.getValue();
+
+            if (!root.equals(artifact)) {
+                synchronized (this.monitor) {
+                    this.members.add(artifact);
+                }
+            }
+
+            return true;
+        }
+
+        List<InstallArtifact> getMembers() {
+            synchronized (this.monitor) {
+                return new ArrayList<InstallArtifact>(this.members);
+            }
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/PlanScoper.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/PlanScoper.java
new file mode 100644
index 0000000..6e72f3a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/PlanScoper.java
@@ -0,0 +1,159 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.osgi.framework.Version;
+
+
+import org.eclipse.virgo.kernel.artifact.fs.ArtifactFS;
+import org.eclipse.virgo.nano.deployer.api.core.DeployerLogEvents;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.deployer.api.core.FatalDeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.BundleInstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.ScopeServiceRepository;
+import org.eclipse.virgo.kernel.install.artifact.internal.scoping.Scoper;
+import org.eclipse.virgo.kernel.install.artifact.internal.scoping.Scoper.DuplicateBundleSymbolicNameException;
+import org.eclipse.virgo.kernel.install.artifact.internal.scoping.Scoper.DuplicateExportException;
+import org.eclipse.virgo.kernel.install.artifact.internal.scoping.Scoper.UnsupportedBundleManifestVersionException;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+
+/**
+ * {@link ApplicationScoper} provides scoping of bundle manifests and Spring services for {@link MultiBundleApplication}
+ * s.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is not thread safe.
+ * 
+ */
+final class PlanScoper {
+
+    private static final String SCOPE_SEPARATOR = "-";
+
+    private List<InstallArtifact> scopeMembers;
+
+    private final EventLogger eventLogger;
+
+    private final Scoper scoper;
+
+    private final ServiceScoper serviceScoper;
+
+    private final String scopeName;
+
+    private final Version scopeVersion;
+
+    /**
+     * Create a new {@link PlanScoper}.
+     * 
+     * @param scopeMembers the items to be scoped
+     * @param name the scope name
+     * @param version the scope version
+     * @param scopeServiceRepository the {@link StandardScopeServiceRepository}
+     * @param eventLogger an {@link EventLogger}
+     * @throws DeploymentException
+     */
+    public PlanScoper(List<InstallArtifact> scopeMembers, String name, Version version, ScopeServiceRepository scopeServiceRepository,
+        EventLogger eventLogger) throws DeploymentException {
+        this.scopeMembers = scopeMembers;
+        this.scopeName = createScopeName(name, version);
+        this.scopeVersion = version;
+        this.scoper = new Scoper(getBundleManifests(), this.scopeName);
+        this.serviceScoper = new ServiceScoper(this.scopeName, scopeServiceRepository, eventLogger);
+        this.eventLogger = eventLogger;
+    }
+
+    /**
+     * Get the application scope name.
+     * 
+     * @return the application scope name
+     */
+    String getScopeName() {
+        return this.scopeName;
+    }
+
+    private String createScopeName(String name, Version version) {
+        String scopeName = name + SCOPE_SEPARATOR + versionToShortString(version);
+        return scopeName;
+    }
+
+    private List<BundleManifest> getBundleManifests() throws DeploymentException {
+        List<BundleManifest> bundleManifests = new ArrayList<BundleManifest>();
+        for (InstallArtifact scopeMember : this.scopeMembers) {
+            if (scopeMember instanceof BundleInstallArtifact) {
+                BundleInstallArtifact bundleInstallArtifact = (BundleInstallArtifact) scopeMember;
+                try {
+                    bundleManifests.add(bundleInstallArtifact.getBundleManifest());
+                } catch (IOException e) {
+                    throw new DeploymentException("Cannot access bundle manifest for scoping", e);
+                }
+            }
+        }
+        return bundleManifests;
+    }
+
+    /**
+     * Scope the application.
+     * 
+     * @throws DeploymentException
+     */
+    void scope() throws DeploymentException {
+        try {
+            // Transform the modules' bundle manifests to scope the OSGi
+            // application.
+            this.scoper.scope();
+        } catch (UnsupportedBundleManifestVersionException ubmve) {
+            // This represents a failure to upgrade the manifest.
+            throw new FatalDeploymentException("Cannot scope a bundle which does not specify a bundle manifest version of at least "
+                + ubmve.getLowestSupportedVersion());
+        } catch (DuplicateBundleSymbolicNameException dbsne) {
+            this.eventLogger.log(DeployerLogEvents.DUPLICATE_BSN_IN_SCOPE, dbsne, this.scopeName, this.scopeVersion, dbsne.getBundleSymbolicName());
+            throw new DeploymentException("More than one bundle in scope '" + this.scopeName + "' version '" + this.scopeVersion
+                + "' has bundle symbolic name '" + dbsne.getBundleSymbolicName() + "'");
+        } catch (DuplicateExportException dee) {
+            String packageName = dee.getPackageName();
+            String exporters = dee.getExporters();
+            this.eventLogger.log(DeployerLogEvents.DUPLICATE_PACKAGE_DURING_SCOPING, dee, this.scopeName, this.scopeVersion, packageName, exporters);
+            throw new DeploymentException("Package '" + packageName + "' exported by more than one bundle [" + exporters + "] in scope '"
+                + this.scopeName + "' version '" + this.scopeVersion + "'");
+        }
+        this.serviceScoper.scope(getBundleArtifacts());
+    }
+
+    private Set<ArtifactFS> getBundleArtifacts() {
+        Set<ArtifactFS> bundleArtifacts = new HashSet<ArtifactFS>();
+        for (InstallArtifact scopeMember : this.scopeMembers) {
+            if (scopeMember instanceof BundleInstallArtifact) {
+                ArtifactFS artifactFS = scopeMember.getArtifactFS();
+                bundleArtifacts.add(artifactFS);
+            }
+        }
+        return bundleArtifacts;
+    }
+
+    private static String versionToShortString(Version version) {
+        String result = version.toString();
+        while (result.endsWith(".0")) {
+            result = result.substring(0, result.length() - 2);
+        }
+        return result;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/RefreshEngine.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/RefreshEngine.java
new file mode 100644
index 0000000..152fd6c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/RefreshEngine.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import org.eclipse.virgo.kernel.artifact.fs.ArtifactFS;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactIdentity;
+
+
+public interface RefreshEngine {
+
+    void refresh(ArtifactIdentity artifactIdentity, ArtifactFS artifactFS) throws RefreshException;
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/RefreshException.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/RefreshException.java
new file mode 100644
index 0000000..220564c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/RefreshException.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+
+public class RefreshException extends DeploymentException {
+
+    private static final long serialVersionUID = -7828141025340833008L;
+
+    public RefreshException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    public RefreshException(String message) {
+        super(message);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/ServiceScoper.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/ServiceScoper.java
new file mode 100644
index 0000000..33ef2c8
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/ServiceScoper.java
@@ -0,0 +1,194 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.jar.JarFile;
+
+import org.eclipse.virgo.kernel.artifact.fs.ArtifactFS;
+import org.eclipse.virgo.kernel.artifact.fs.ArtifactFSEntry;
+import org.eclipse.virgo.kernel.install.artifact.ScopeServiceRepository;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.util.io.IOUtils;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifestFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.util.xml.XmlValidationModeDetector;
+
+/**
+ * Generates the service model in the {@link StandardScopeServiceRepository} for a bundle in a given scope.
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Not thread safe.
+ * 
+ */
+final class ServiceScoper {
+
+    private static final String SPRING_CONFIG_DIR = "META-INF/spring/";
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private final XmlValidationModeDetector xmlValidationModeDetector = new XmlValidationModeDetector();
+
+    private final String scopeName;
+
+    private final ScopeServiceRepository repository;
+
+    private final EventLogger eventLogger;
+
+    /**
+     * Creates a new <code>ServiceScoper</code> for the supplied scope name.
+     * 
+     * @param scopeName supplied
+     * @param scopeServiceRepository the {@link StandardScopeServiceRepository}.
+     * @param eventLogger logger for events
+     */
+    public ServiceScoper(String scopeName, ScopeServiceRepository scopeServiceRepository, EventLogger eventLogger) {
+        this.scopeName = scopeName;
+        this.repository = scopeServiceRepository;
+        this.eventLogger = eventLogger;
+    }
+
+    /**
+     * Scopes the application's services.
+     * 
+     * @param modules set of stored artifacts to search for configurations
+     * @throws DeploymentException if configuration files or manifests are not well-formed
+     */
+    public void scope(Set<ArtifactFS> modules) throws DeploymentException {
+        Map<ArtifactFS, List<ArtifactFSEntry>> configFiles = new HashMap<ArtifactFS, List<ArtifactFSEntry>>();
+        for (ArtifactFS moduleData : modules) {
+            configFiles.put(moduleData, findConfigFiles(moduleData));
+        }
+        doScope(configFiles);
+    }
+
+    private List<ArtifactFSEntry> findConfigFiles(ArtifactFS bundleData) throws DeploymentException {
+        List<ArtifactFSEntry> configFiles = new ArrayList<ArtifactFSEntry>();
+
+        ArtifactFSEntry entry = bundleData.getEntry(SPRING_CONFIG_DIR);
+        if (entry.exists()) {
+            try {
+                configFiles.addAll(findConfigFiles(bundleData, entry));
+            } catch (IOException e) {
+                throw new DeploymentException("Unable to read Spring config files.", e);
+            }
+        }
+
+        return configFiles;
+    }
+
+    private List<ArtifactFSEntry> findConfigFiles(ArtifactFS bundleData, ArtifactFSEntry entry) throws IOException {
+        ArtifactFSEntry[] children = entry.getChildren();
+        List<ArtifactFSEntry> configFiles = new ArrayList<ArtifactFSEntry>();
+        for (ArtifactFSEntry e : children) {
+            if (e.isDirectory()) {
+                configFiles.addAll(findConfigFiles(bundleData, e));
+            } else if (e.getPath().endsWith(".xml")) {
+                try {
+                    InputStream is = e.getInputStream();
+                    int validationMode;
+                    try {
+                        validationMode = xmlValidationModeDetector.detectValidationMode(is);
+                    } finally {
+                        IOUtils.closeQuietly(is);
+                    }
+                    if (validationMode != XmlValidationModeDetector.VALIDATION_DTD) {
+                        configFiles.add(e);
+                    } else {
+                        logger.debug("Skipping entry '{}' as it uses a DTD.", e);
+                    }
+                } catch (IOException ioe) {
+                    logger.debug("Unexpected error detecting validation mode of entry '{}'", ioe, e);
+                    configFiles.add(e);
+                }
+            }
+        }
+        return configFiles;
+    }
+
+    /**
+     * Re-scope the service exports and service references of the given {@link ArtifactFS}.
+     * 
+     * @param bundleData the {@link ArtifactFS} to be re-scoped.
+     * @throws DeploymentException
+     */
+    public void rescope(ArtifactFS bundleData) throws DeploymentException {
+        Map<ArtifactFS, List<ArtifactFSEntry>> configFiles = new HashMap<ArtifactFS, List<ArtifactFSEntry>>();
+        configFiles.put(bundleData, findConfigFiles(bundleData));
+        doScope(configFiles);
+    }
+
+    /**
+     * Updates the {@link StandardScopeServiceRepository} with the service information from the given config files.
+     * 
+     * @param scopeName the name of the scope.
+     * @param configFiles the config files to scope.
+     * @throws DeploymentException
+     */
+    private void doScope(Map<ArtifactFS, List<ArtifactFSEntry>> configFiles) throws DeploymentException {
+        SpringConfigServiceModelScanner scanner = new SpringConfigServiceModelScanner(this.scopeName, this.repository, this.eventLogger);
+        Map<ArtifactFS, BundleManifest> manifests = loadBundleManifests(configFiles.keySet());
+        for (Entry<ArtifactFS, List<ArtifactFSEntry>> entry : configFiles.entrySet()) {
+            BundleManifest bundleManifest = manifests.get(entry.getKey());
+            for (ArtifactFSEntry configFile : entry.getValue()) {
+                InputStream is = configFile.getInputStream();
+                try {
+                    scanner.scanConfigFile(bundleManifest.getBundleSymbolicName().getSymbolicName(), bundleManifest.getBundleVersion(),
+                        configFile.getPath(), is);
+                } finally {
+                    IOUtils.closeQuietly(is);
+                }
+            }
+        }
+    }
+
+    private Map<ArtifactFS, BundleManifest> loadBundleManifests(Collection<ArtifactFS> modules) throws DeploymentException {
+        Map<ArtifactFS, BundleManifest> result = new HashMap<ArtifactFS, BundleManifest>();
+        for (ArtifactFS module : modules) {
+            if (!result.containsKey(module)) {
+                BundleManifest manifest = loadManifest(module);
+                result.put(module, manifest);
+            }
+        }
+        return result;
+    }
+
+    private BundleManifest loadManifest(ArtifactFS compositeArtifactFS) throws DeploymentException {
+        ArtifactFSEntry entry = compositeArtifactFS.getEntry(JarFile.MANIFEST_NAME);
+        Reader reader = null;
+        try {
+            reader = new InputStreamReader(entry.getInputStream(), UTF_8);
+            return BundleManifestFactory.createBundleManifest(reader);
+        } catch (IOException ex) {
+            throw new DeploymentException("Error reading MANIFEST.MF from '" + compositeArtifactFS + "'", ex);
+        } finally {
+            IOUtils.closeQuietly(reader);
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/SpringConfigServiceModelScanner.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/SpringConfigServiceModelScanner.java
new file mode 100644
index 0000000..c46f7e0
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/SpringConfigServiceModelScanner.java
@@ -0,0 +1,221 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Dictionary;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.Set;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeployerLogEvents;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.deployer.api.core.FatalDeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.ScopeServiceRepository;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.osgi.framework.Version;
+import org.springframework.util.StringUtils;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+/**
+ * Utility class for parsing Spring config files and populating a {@link StandardScopeServiceRepository}.
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.
+ * 
+ */
+final class SpringConfigServiceModelScanner {
+
+    private static final String ATTRIBUTE_REF = "ref";
+
+    private static final String ATTRIBUTE_INTERFACE = "interface";
+
+    private static final String ELEMENT_VALUE = "value";
+
+    private static final String ELEMENT_INTERFACES = "interfaces";
+
+    private static final String ATTRIBUTE_VALUE = ELEMENT_VALUE;
+
+    private static final String ATTRIBUTE_KEY = "key";
+
+    private static final String ELEMENT_ENTRY = "entry";
+
+    private static final String ELEMENT_SERVICE_PROPERTIES = "service-properties";
+
+    private static final String SPRING_DM_NAMESPACE = "http://www.springframework.org/schema/osgi";
+
+    private static final String SPRING_BEANS_NAMESPACE = "http://www.springframework.org/schema/beans";
+
+    private static final String ELEMENT_SERVICE = "service";
+
+    private static final String BEAN_NAME_PROPERTY = "org.eclipse.gemini.blueprint.bean.name";
+
+    private final EventLogger eventLogger;
+
+    private final ScopeServiceRepository repository;
+
+    private final DocumentBuilder documentBuilder;
+
+    private final String scopeName;
+
+    public SpringConfigServiceModelScanner(String scopeName, ScopeServiceRepository repository, EventLogger eventLogger) {
+        this.scopeName = scopeName;
+        this.repository = repository;
+        this.eventLogger = eventLogger;
+        this.documentBuilder = createDocumentBuilder();
+    }
+
+    public void scanConfigFile(String bundleSymbolicName, Version bundleVersion, String configFileName, InputStream stream) throws DeploymentException {
+        Document doc = parseConfigFile(bundleSymbolicName, bundleVersion, configFileName, stream);
+        doScopeServices(doc.getDocumentElement().getChildNodes());
+    }
+
+    private void doScopeServices(NodeList childNodes) {
+        for (int x = 0; x < childNodes.getLength(); x++) {
+            Node node = childNodes.item(x);
+            if (isServiceElement(node)) {
+                parseServiceElement((Element) node);
+            }
+            doScopeServices(node.getChildNodes());
+        }
+    }
+
+    private void parseServiceElement(Element elem) {
+        String[] types = extractInterfaces(elem);
+        Dictionary<String, Object> properties = extractServiceProperties(elem);
+        this.repository.recordService(this.scopeName, types, properties);
+    }
+
+    /**
+     * Extracts all the interfaces from the supplied <code>reference</code> or <code>service</code> {@link Element}.
+     * 
+     * @param e the <code>Element</code> to parse.
+     * @return the interfaces.
+     */
+    private String[] extractInterfaces(Element e) {
+        Set<String> exportedInterfaces = new HashSet<String>();
+        String iface = StringUtils.trimWhitespace(e.getAttribute(ATTRIBUTE_INTERFACE));
+        if (StringUtils.hasText(iface)) {
+            exportedInterfaces.add(iface);
+        } else {
+            NodeList children = e.getChildNodes();
+            for (int y = 0; y < children.getLength(); y++) {
+                Node child = children.item(y);
+                if (child instanceof Element) {
+                    if (isInterfacesElement(child)) {
+                        Element elem = (Element) child;
+                        NodeList intChildren = elem.getChildNodes();
+                        for (int i = 0; i < intChildren.getLength(); i++) {
+                            Node intChild = intChildren.item(i);
+                            if (isValueElement(intChild)) {
+                                exportedInterfaces.add(StringUtils.trimWhitespace(intChild.getTextContent()));
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return exportedInterfaces.toArray(new String[exportedInterfaces.size()]);
+    }
+
+    private Dictionary<String, Object> extractServiceProperties(Element elem) {
+        NodeList servicePropertiesElems = elem.getElementsByTagNameNS(SPRING_DM_NAMESPACE, ELEMENT_SERVICE_PROPERTIES);
+        Dictionary<String, Object> p = null;
+        if (servicePropertiesElems.getLength() > 0) {
+            p = new Hashtable<String, Object>();
+            Node item = servicePropertiesElems.item(0);
+            readServiceProperties((Element) item, p);
+        }
+        p = addStandardServiceProperties(elem, p);
+        return p;
+    }
+
+    private Dictionary<String, Object> addStandardServiceProperties(Element elem, Dictionary<String, Object> p) {
+        // The only standard service property in the Spring DM reference manual is "bean name".
+        String beanName = StringUtils.trimWhitespace(elem.getAttribute(ATTRIBUTE_REF));
+        if (StringUtils.hasText(beanName)) {
+            if (p == null) {
+                p = new Hashtable<String, Object>();
+            }
+            p.put(BEAN_NAME_PROPERTY, beanName);
+        }
+        return p;
+    }
+
+    private void readServiceProperties(Element servicePropertiesElement, Dictionary<String, Object> serviceProperties) {
+        NodeList childNodes = servicePropertiesElement.getChildNodes();
+        for (int y = 0; y < childNodes.getLength(); y++) {
+            Node child = childNodes.item(y);
+            if (isEntryElement(child)) {
+                Element entry = (Element) child;
+                serviceProperties.put(entry.getAttribute(ATTRIBUTE_KEY), entry.getAttribute(ATTRIBUTE_VALUE));
+            }
+        }
+    }
+
+    private Document parseConfigFile(String bundleSymbolicName, Version bundleVersion, String configFileName, InputStream stream) throws DeploymentException {
+        try {
+            return this.documentBuilder.parse(new InputSource(stream));
+        } catch (SAXException ex) {
+            this.eventLogger.log(DeployerLogEvents.CONFIG_FILE_ERROR, ex, configFileName, bundleSymbolicName, bundleVersion);
+            throw new DeploymentException("Error parsing configuration file '" + configFileName + "'.", ex);
+        } catch (IOException ex) {
+            throw new FatalDeploymentException("Error accessing configuration file '" + configFileName + "'.", ex);
+        }
+    }
+
+    /**
+     * Creates a {@link DocumentBuilder}.
+     * 
+     * @return the <code>DocumentBuilder</code>.
+     */
+    private DocumentBuilder createDocumentBuilder() {
+        try {
+            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+            dbf.setNamespaceAware(true);
+            return dbf.newDocumentBuilder();
+        } catch (ParserConfigurationException e) {
+            throw new FatalDeploymentException("Unable to create DocumentBuilder - JAXP parser configuration error.", e);
+        }
+    }
+
+    private boolean isValueElement(Node node) {
+        return SPRING_BEANS_NAMESPACE.equals(node.getNamespaceURI()) && ELEMENT_VALUE.equals(node.getLocalName())
+            && node.getNodeType() == Node.ELEMENT_NODE;
+    }
+
+    private boolean isInterfacesElement(Node node) {
+        return SPRING_DM_NAMESPACE.equals(node.getNamespaceURI()) && ELEMENT_INTERFACES.equals(node.getLocalName())
+            && node.getNodeType() == Node.ELEMENT_NODE;
+    }
+
+    private boolean isServiceElement(Node node) {
+        return SPRING_DM_NAMESPACE.equals(node.getNamespaceURI()) && ELEMENT_SERVICE.equals(node.getLocalName())
+            && node.getNodeType() == Node.ELEMENT_NODE;
+    }
+
+    private boolean isEntryElement(Node node) {
+        return SPRING_BEANS_NAMESPACE.equals(node.getNamespaceURI()) && ELEMENT_ENTRY.equals(node.getLocalName())
+            && node.getNodeType() == Node.ELEMENT_NODE;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/StandardArtifactIdentityDeterminer.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/StandardArtifactIdentityDeterminer.java
new file mode 100644
index 0000000..91b1612
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/StandardArtifactIdentityDeterminer.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+* Copyright (c) 2008, 2010 VMware Inc.
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*   VMware Inc. - initial contribution
+*******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import java.io.File;
+import java.util.Set;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.eclipse.virgo.kernel.install.artifact.ArtifactIdentity;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactIdentityDeterminer;
+import org.eclipse.virgo.repository.ArtifactBridge;
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+import org.eclipse.virgo.repository.ArtifactGenerationException;
+
+/**
+* {@link StandardArtifactIdentityDeterminer} is a {@link ArtifactIdentityDeterminer} that can determine basic kernel artifact
+* identities.
+* <p />
+*
+* <strong>Concurrent Semantics</strong><br />
+*
+* This class is thread safe.
+*
+*/
+final class StandardArtifactIdentityDeterminer implements ArtifactIdentityDeterminer {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(StandardArtifactIdentityDeterminer.class);
+
+    private final Set<ArtifactBridge> bridges;
+
+    public StandardArtifactIdentityDeterminer(Set<ArtifactBridge> bridges) {
+        this.bridges = bridges;
+    }
+
+    public ArtifactIdentity determineIdentity(File file, String scopeName) {
+        ArtifactDescriptor artifactDescriptor = null;
+        for (ArtifactBridge artifactBridge : this.bridges) {
+            try {
+                artifactDescriptor = artifactBridge.generateArtifactDescriptor(file);
+            } catch (ArtifactGenerationException e) {
+                LOGGER.error(String.format("Error occurred while determining the identity of an Artifact '%s' with the bridge '%s'.", file,
+                    artifactBridge.getClass().getSimpleName()), e);
+                return null;
+            }
+            if (artifactDescriptor != null) {
+                break;
+            }
+        }
+
+        if (artifactDescriptor == null) {
+            return null;
+        }
+
+        return new ArtifactIdentity(artifactDescriptor.getType(), artifactDescriptor.getName(), artifactDescriptor.getVersion(), scopeName);
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/StandardArtifactStateMonitor.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/StandardArtifactStateMonitor.java
new file mode 100644
index 0000000..aaead17
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/StandardArtifactStateMonitor.java
@@ -0,0 +1,413 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactState;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifactLifecycleListener;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact.State;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+
+import org.eclipse.virgo.kernel.osgi.framework.OsgiFrameworkUtils;
+import org.eclipse.virgo.kernel.osgi.framework.OsgiServiceHolder;
+
+/**
+ * {@link StandardArtifactStateMonitor} logs {@link InstallArtifact} state changes and notifies
+ * {@link InstallArtifactLifecycleListener InstallArtifactLifecycleListeners}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+public class StandardArtifactStateMonitor implements ArtifactStateMonitor {
+
+    private static final ArrayList<OsgiServiceHolder<InstallArtifactLifecycleListener>> EMPTY_LISTENER_HOLDER_LIST = new ArrayList<OsgiServiceHolder<InstallArtifactLifecycleListener>>();
+
+    private final BundleContext bundleContext;
+
+    private final Bundle bundle;
+
+    private final ArtifactState artifactState;
+
+    private StandardArtifactStateMonitor(BundleContext bundleContext, ArtifactState artifactState) {
+        this.bundleContext = bundleContext;
+        this.bundle = this.bundleContext.getBundle();
+        this.artifactState = artifactState;
+    }
+
+    public StandardArtifactStateMonitor(BundleContext bundleContext) {
+        this(bundleContext, new ArtifactState());
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public State getState() {
+        return this.artifactState.getState();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void setState(State state) {
+        switch (state) {
+            case ACTIVE:
+                this.artifactState.setActive();
+                break;
+            case INITIAL:
+                this.artifactState.setInitial();
+                break;
+            case INSTALLED:
+                this.artifactState.setInstalled();
+                break;
+            case INSTALLING:
+                this.artifactState.setInstalling();
+                break;
+            case RESOLVED:
+                this.artifactState.setResolved();
+                break;
+            case RESOLVING:
+                this.artifactState.setResolving();
+                break;
+            case STARTING:
+                this.artifactState.setStarting();
+                break;
+            case STOPPING:
+                this.artifactState.setStopping();
+                break;
+            case UNINSTALLED:
+                this.artifactState.setUninstalled();
+                break;
+            case UNINSTALLING:
+                this.artifactState.setUninstalling();
+                break;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onInstalling(InstallArtifact installArtifact) throws DeploymentException {
+        State state = this.artifactState.getState();
+        if (state.equals(State.INITIAL)) {
+            if (this.artifactState.setInstalling()) {
+                List<OsgiServiceHolder<InstallArtifactLifecycleListener>> listenerHolders = getListenerHolders();
+                try {
+                    for (InstallArtifactLifecycleListener listener : getListeners(listenerHolders)) {
+                        listener.onInstalling(installArtifact);
+                    }
+                } finally {
+                    ungetListeners(listenerHolders);
+                }
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onInstallFailed(InstallArtifact installArtifact) throws DeploymentException {
+        State state = this.artifactState.getState();
+        if (state.equals(State.INSTALLING)) {
+            if (this.artifactState.setInitial()) {
+                List<OsgiServiceHolder<InstallArtifactLifecycleListener>> listenerHolders = getListenerHolders();
+                try {
+                    for (InstallArtifactLifecycleListener listener : getListeners(listenerHolders)) {
+                        listener.onInstallFailed(installArtifact);
+                    }
+                } finally {
+                    ungetListeners(listenerHolders);
+                }
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onInstalled(InstallArtifact installArtifact) throws DeploymentException {
+        State state = this.artifactState.getState();
+        if (state.equals(State.INITIAL) || state.equals(State.INSTALLING)) {
+            if (this.artifactState.setInstalled()) {
+                List<OsgiServiceHolder<InstallArtifactLifecycleListener>> listenerHolders = getListenerHolders();
+                try {
+                    for (InstallArtifactLifecycleListener listener : getListeners(listenerHolders)) {
+                        listener.onInstalled(installArtifact);
+                    }
+                } finally {
+                    ungetListeners(listenerHolders);
+                }
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onResolving(InstallArtifact installArtifact) throws DeploymentException {
+        State state = this.artifactState.getState();
+        if (state.equals(State.INITIAL) || state.equals(State.INSTALLING) || state.equals(State.INSTALLED)) {
+            if (this.artifactState.setResolving()) {
+                List<OsgiServiceHolder<InstallArtifactLifecycleListener>> listenerHolders = getListenerHolders();
+                try {
+                    for (InstallArtifactLifecycleListener listener : getListeners(listenerHolders)) {
+                        listener.onResolving(installArtifact);
+                    }
+                } finally {
+                    ungetListeners(listenerHolders);
+                }
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onResolveFailed(InstallArtifact installArtifact) throws DeploymentException {
+        State state = this.artifactState.getState();
+        if (state.equals(State.INITIAL) || state.equals(State.INSTALLING) || state.equals(State.INSTALLED) || state.equals(State.RESOLVING) || state.equals(State.STOPPING)) {
+            if (this.artifactState.setInstalled()) {
+                List<OsgiServiceHolder<InstallArtifactLifecycleListener>> listenerHolders = getListenerHolders();
+                try {
+                    for (InstallArtifactLifecycleListener listener : getListeners(listenerHolders)) {
+                        listener.onResolveFailed(installArtifact);
+                    }
+                } finally {
+                    ungetListeners(listenerHolders);
+                }
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onResolved(InstallArtifact installArtifact) throws DeploymentException {
+        State state = this.artifactState.getState();
+        if (state.equals(State.INITIAL) || state.equals(State.INSTALLING) || state.equals(State.INSTALLED) || state.equals(State.RESOLVING) || state.equals(State.STOPPING)) {
+            if (this.artifactState.setResolved()) {
+                List<OsgiServiceHolder<InstallArtifactLifecycleListener>> listenerHolders = getListenerHolders();
+                try {
+                    for (InstallArtifactLifecycleListener listener : getListeners(listenerHolders)) {
+                        listener.onResolved(installArtifact);
+                    }
+                } finally {
+                    ungetListeners(listenerHolders);
+                }
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean onStarting(InstallArtifact installArtifact) throws DeploymentException {
+        boolean stateChanged = this.artifactState.setStarting();
+        if (stateChanged) {
+            List<OsgiServiceHolder<InstallArtifactLifecycleListener>> listenerHolders = getListenerHolders();
+            try {
+                for (InstallArtifactLifecycleListener listener : getListeners(listenerHolders)) {
+                    listener.onStarting(installArtifact);
+                }
+            } finally {
+                ungetListeners(listenerHolders);
+            }
+        }
+        return stateChanged;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onStartFailed(InstallArtifact installArtifact, Throwable cause) throws DeploymentException {
+        List<OsgiServiceHolder<InstallArtifactLifecycleListener>> listenerHolders = getListenerHolders();
+        try {
+            for (InstallArtifactLifecycleListener listener : getListeners(listenerHolders)) {
+                listener.onStartFailed(installArtifact, cause);
+            }
+        } finally {
+            ungetListeners(listenerHolders);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onStartAborted(InstallArtifact installArtifact) throws DeploymentException {
+        List<OsgiServiceHolder<InstallArtifactLifecycleListener>> listenerHolders = getListenerHolders();
+        try {
+            for (InstallArtifactLifecycleListener listener : getListeners(listenerHolders)) {
+                listener.onStartAborted(installArtifact);
+            }
+        } finally {
+            ungetListeners(listenerHolders);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onStarted(InstallArtifact installArtifact) throws DeploymentException {
+        if (this.artifactState.setActive()) {
+            List<OsgiServiceHolder<InstallArtifactLifecycleListener>> listenerHolders = getListenerHolders();
+            try {
+                for (InstallArtifactLifecycleListener listener : getListeners(listenerHolders)) {
+                    listener.onStarted(installArtifact);
+                }
+            } finally {
+                ungetListeners(listenerHolders);
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onStopping(InstallArtifact installArtifact) {
+        if (this.artifactState.setStopping()) {
+            List<OsgiServiceHolder<InstallArtifactLifecycleListener>> listenerHolders = getListenerHolders();
+            try {
+                for (InstallArtifactLifecycleListener listener : getListeners(listenerHolders)) {
+                    listener.onStopping(installArtifact);
+                }
+            } finally {
+                ungetListeners(listenerHolders);
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onStopFailed(InstallArtifact installArtifact, Throwable cause) throws DeploymentException {
+        if (this.artifactState.setActive()) {
+            List<OsgiServiceHolder<InstallArtifactLifecycleListener>> listenerHolders = getListenerHolders();
+            try {
+                for (InstallArtifactLifecycleListener listener : getListeners(listenerHolders)) {
+                    listener.onStopFailed(installArtifact, cause);
+                }
+            } finally {
+                ungetListeners(listenerHolders);
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onStopped(InstallArtifact installArtifact) {
+        if (this.artifactState.setResolved()) {
+            List<OsgiServiceHolder<InstallArtifactLifecycleListener>> listenerHolders = getListenerHolders();
+            try {
+                for (InstallArtifactLifecycleListener listener : getListeners(listenerHolders)) {
+                    listener.onStopped(installArtifact);
+                }
+            } finally {
+                ungetListeners(listenerHolders);
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onUnresolved(InstallArtifact installArtifact) throws DeploymentException {
+        if (this.artifactState.setInstalled()) {
+            List<OsgiServiceHolder<InstallArtifactLifecycleListener>> listenerHolders = getListenerHolders();
+            try {
+                for (InstallArtifactLifecycleListener listener : getListeners(listenerHolders)) {
+                    listener.onUnresolved(installArtifact);
+                }
+            } finally {
+                ungetListeners(listenerHolders);
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onUninstalling(InstallArtifact installArtifact) throws DeploymentException {
+        if (this.artifactState.setUninstalling()) {
+            List<OsgiServiceHolder<InstallArtifactLifecycleListener>> listenerHolders = getListenerHolders();
+            try {
+                for (InstallArtifactLifecycleListener listener : getListeners(listenerHolders)) {
+                    listener.onUninstalling(installArtifact);
+                }
+            } finally {
+                ungetListeners(listenerHolders);
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onUninstallFailed(InstallArtifact installArtifact, Throwable cause) throws DeploymentException {
+        if (this.artifactState.setResolved()) {
+            List<OsgiServiceHolder<InstallArtifactLifecycleListener>> listenerHolders = getListenerHolders();
+            try {
+                for (InstallArtifactLifecycleListener listener : getListeners(listenerHolders)) {
+                    listener.onUninstallFailed(installArtifact, cause);
+                }
+            } finally {
+                ungetListeners(listenerHolders);
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onUninstalled(InstallArtifact installArtifact) throws DeploymentException {
+        if (this.artifactState.setUninstalled()) {
+            List<OsgiServiceHolder<InstallArtifactLifecycleListener>> listenerHolders = getListenerHolders();
+            try {
+                for (InstallArtifactLifecycleListener listener : getListeners(listenerHolders)) {
+                    listener.onUninstalled(installArtifact);
+                }
+            } finally {
+                ungetListeners(listenerHolders);
+            }
+        }
+    }
+
+    private List<OsgiServiceHolder<InstallArtifactLifecycleListener>> getListenerHolders() {
+        // Avoid InvalidStateException if our bundle is stopped, typically during shutdown.
+        return this.bundle.getState() != Bundle.RESOLVED ? OsgiFrameworkUtils.getServices(this.bundleContext, InstallArtifactLifecycleListener.class)
+            : EMPTY_LISTENER_HOLDER_LIST;
+    }
+
+    private List<InstallArtifactLifecycleListener> getListeners(List<OsgiServiceHolder<InstallArtifactLifecycleListener>> listenerHolders) {
+        List<InstallArtifactLifecycleListener> listeners;
+        listeners = new ArrayList<InstallArtifactLifecycleListener>(listenerHolders.size());
+
+        for (OsgiServiceHolder<InstallArtifactLifecycleListener> listenerHolder : listenerHolders) {
+            listeners.add(listenerHolder.getService());
+        }
+        return listeners;
+    }
+
+    private void ungetListeners(List<OsgiServiceHolder<InstallArtifactLifecycleListener>> listenerHolders) {
+        for (OsgiServiceHolder<InstallArtifactLifecycleListener> listenerHolder : listenerHolders) {
+            this.bundleContext.ungetService(listenerHolder.getServiceReference());
+        }
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/StandardArtifactStorage.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/StandardArtifactStorage.java
new file mode 100644
index 0000000..22e00c6
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/StandardArtifactStorage.java
@@ -0,0 +1,135 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import java.io.IOException;
+import java.net.URI;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Locale;
+
+import org.eclipse.virgo.kernel.artifact.fs.ArtifactFS;
+import org.eclipse.virgo.kernel.artifact.fs.ArtifactFSFactory;
+import org.eclipse.virgo.nano.deployer.api.core.DeployerLogEvents;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactStorage;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.util.io.JarUtils;
+import org.eclipse.virgo.util.io.PathReference;
+
+final class StandardArtifactStorage implements ArtifactStorage {
+
+    private static final String DEPLOYER_UNPACK_BUNDLES_TRUE = "true";
+
+    private static final List<String> CONSTANT_PATH_EXTENSIONS = Arrays.asList("par", "zip");
+
+    private static final List<String> ALWAYS_UNPACKED_EXTENSIONS = Arrays.asList("par", "zip");
+
+    private static final List<String> CONFIGURABLY_UNPACKED_EXTENSIONS = Arrays.asList("jar", "war");
+
+    private final PathReference sourcePathReference;
+
+    private final ArtifactFSFactory artifactFSFactory;
+
+    private final EventLogger eventLogger;
+
+    private final boolean unpackBundles;
+
+    private final ArtifactStore pathGenerator;
+
+    public StandardArtifactStorage(PathReference sourcePathReference, PathReference baseStagingPathReference, ArtifactFSFactory artifactFSFactory,
+        EventLogger eventLogger, String unpackBundlesOption) {
+        this.sourcePathReference = sourcePathReference;
+
+        this.artifactFSFactory = artifactFSFactory;
+
+        this.eventLogger = eventLogger;
+
+        this.unpackBundles = unpackBundlesOption == null || DEPLOYER_UNPACK_BUNDLES_TRUE.equalsIgnoreCase(unpackBundlesOption);
+
+        this.pathGenerator = CONSTANT_PATH_EXTENSIONS.contains(getFileExtension(sourcePathReference)) ? new FileMovingArtifactStore(
+            baseStagingPathReference) : new GenerationalArtifactStore(baseStagingPathReference);
+
+        PathReference currentPathReference = this.pathGenerator.getCurrentPath();
+        currentPathReference.delete(true);
+        synchronize(this.sourcePathReference);
+    }
+
+    @Override
+    public void synchronize() {
+        this.pathGenerator.save();
+        synchronize(this.sourcePathReference);
+    }
+
+    @Override
+    public ArtifactFS getArtifactFS() {
+        return this.artifactFSFactory.create(this.pathGenerator.getCurrentPath().toFile());
+    }
+
+    @Override
+    public void synchronize(URI sourceUri) {
+        this.pathGenerator.save();
+        synchronize(new PathReference(sourceUri));
+    }
+
+    @Override
+    public void rollBack() {
+        this.pathGenerator.restore();
+    }
+
+    @Override
+    public void delete() {
+        PathReference currentPathReference = this.pathGenerator.getCurrentPath();
+        currentPathReference.delete(true);
+    }
+
+    private void synchronize(PathReference normalizedSourcePathReference) {
+        PathReference currentPathReference = this.pathGenerator.getCurrentPath();
+
+        if (normalizedSourcePathReference != null && !normalizedSourcePathReference.isDirectory() && needsUnpacking(normalizedSourcePathReference)) {
+            try {
+                JarUtils.unpackTo(normalizedSourcePathReference, currentPathReference);
+            } catch (IOException e) {
+                this.eventLogger.log(DeployerLogEvents.JAR_UNPACK_ERROR, e, normalizedSourcePathReference);
+                throw new RuntimeException(String.format("Exception unpacking '%s'", normalizedSourcePathReference), e);
+            }
+        } else if (normalizedSourcePathReference != null) {
+            normalizedSourcePathReference.copy(currentPathReference, true);
+        } else {
+            currentPathReference.createDirectory();
+        }
+    }
+
+    private boolean needsUnpacking(PathReference pathReference) {
+        String fileExtension = getFileExtension(pathReference);
+        if (fileExtension == null) {
+            return false;
+        }
+        // Always unpack .par/.zip. Unpack .jar/.war if and only if kernel property deployer.unpackBundles is either not
+        // specified or is "true"
+        return ALWAYS_UNPACKED_EXTENSIONS.contains(fileExtension) || this.unpackBundles && CONFIGURABLY_UNPACKED_EXTENSIONS.contains(fileExtension);
+    }
+
+    private static String getFileExtension(PathReference pathReference) {
+        if (pathReference == null) {
+            return null;
+        }
+        String name = pathReference.getName();
+        String fileName = name.toLowerCase(Locale.ENGLISH);
+
+        int dotLocation = fileName.lastIndexOf('.');
+        if (dotLocation == -1) {
+            return null;
+        }
+        return fileName.substring(dotLocation + 1);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/StandardArtifactStorageFactory.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/StandardArtifactStorageFactory.java
new file mode 100644
index 0000000..60d50ca
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/StandardArtifactStorageFactory.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.virgo.kernel.artifact.fs.ArtifactFSFactory;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactIdentity;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactStorage;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.util.io.PathReference;
+
+/**
+ * Standard implementation of {@link ArtifactStorage} that creates storage locations using a nested directory structure
+ * of the form scope/type/name/version.
+ * 
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe
+ * 
+ */
+public final class StandardArtifactStorageFactory implements ArtifactStorageFactory {
+
+    private static final String DEPLOYER_STAGING_DIRECTORY = "s";
+
+    private final PathReference workDirectory;
+
+    private final ArtifactFSFactory artifactFSFactory;
+
+    private final EventLogger eventLogger;
+
+    private final String unpackBundles;
+
+    private final Object monitor = new Object();
+
+    private final Map<PathReference, Long> uniqueId = new HashMap<PathReference, Long>();
+
+    public StandardArtifactStorageFactory(PathReference workDirectory, ArtifactFSFactory artifactFSFactory, EventLogger eventLogger,
+        String unpackBundles) {
+        this.workDirectory = workDirectory;
+        this.artifactFSFactory = artifactFSFactory;
+        this.eventLogger = eventLogger;
+        this.unpackBundles = unpackBundles;
+        this.workDirectory.newChild(DEPLOYER_STAGING_DIRECTORY).delete(true);
+    }
+
+    public ArtifactStorage create(File file, ArtifactIdentity artifactIdentity) {
+        PathReference sourcePathReference = new PathReference(file);
+        PathReference stagingPathReference = createStagingPathReference(artifactIdentity, file.getName());
+
+        return new StandardArtifactStorage(sourcePathReference, stagingPathReference, this.artifactFSFactory, this.eventLogger, this.unpackBundles);
+    }
+
+    public ArtifactStorage createDirectoryStorage(ArtifactIdentity artifactIdentity, String directoryName) {
+        PathReference stagingPathReference = createStagingPathReference(artifactIdentity, directoryName);
+        stagingPathReference.createDirectory();
+
+        return new StandardArtifactStorage(null, stagingPathReference, this.artifactFSFactory, this.eventLogger, this.unpackBundles);
+    }
+
+    private PathReference createStagingPathReference(ArtifactIdentity artifactIdentity, String name) {
+        PathReference scopeDir = this.workDirectory.newChild(DEPLOYER_STAGING_DIRECTORY).newChild(normalizeScopeName(artifactIdentity.getScopeName()));
+        return createNextChild(scopeDir).newChild(name);
+    }
+
+    private String normalizeScopeName(String scopeName) {
+        return scopeName == null ? "global" : scopeName;
+    }
+
+    private PathReference createNextChild(PathReference scopeDir) {
+        synchronized (this.monitor) {
+            Long uniqueId = this.uniqueId.get(scopeDir);
+            uniqueId = uniqueId == null ? 0L : uniqueId + 1;
+            this.uniqueId.put(scopeDir, uniqueId);
+            return scopeDir.newChild(uniqueId.toString());
+        }
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/StandardConfigInstallArtifact.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/StandardConfigInstallArtifact.java
new file mode 100644
index 0000000..a590ce8
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/StandardConfigInstallArtifact.java
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+
+import java.io.IOException;
+import java.util.Properties;
+
+import org.eclipse.virgo.nano.core.AbortableSignal;
+import org.eclipse.virgo.nano.deployer.api.config.ConfigurationDeployer;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactIdentity;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactStorage;
+import org.eclipse.virgo.kernel.install.artifact.ConfigInstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+
+/**
+ * {@link StandardConfigInstallArtifact} is an {@link InstallArtifact} for a configuration properties file.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+final class StandardConfigInstallArtifact extends AbstractInstallArtifact implements ConfigInstallArtifact {
+
+    private final StartEngine startEngine;
+
+    private final RefreshEngine refreshEngine;
+
+    private final StopEngine stopEngine;
+
+    private final ConfigurationDeployer configurationDeployer;
+
+    StandardConfigInstallArtifact(@NonNull ArtifactIdentity identity, 
+    			@NonNull ArtifactStorage artifactStorage, 
+    			@NonNull StartEngine startEngine,
+    			@NonNull RefreshEngine refreshEngine, 
+    			@NonNull StopEngine stopEngine, 
+    			@NonNull ArtifactStateMonitor artifactStateMonitor,
+    			String repositoryName, 
+    			EventLogger eventLogger, ConfigurationDeployer configurationDeployer) throws DeploymentException {
+        super(identity, artifactStorage, artifactStateMonitor, repositoryName, eventLogger);
+
+        this.startEngine = startEngine;
+        this.refreshEngine = refreshEngine;
+        this.stopEngine = stopEngine;
+        this.configurationDeployer = configurationDeployer;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected void doStop() throws DeploymentException {
+        this.stopEngine.stop(getIdentity(), getArtifactFS());
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean doRefresh() throws DeploymentException {
+        this.refreshEngine.refresh(getIdentity(), getArtifactFS());
+        return true;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected void doUninstall() throws DeploymentException {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected final void doStart(AbortableSignal signal) throws DeploymentException {
+        try {
+            this.startEngine.start(getIdentity(), getArtifactFS());
+            signalSuccessfulCompletion(signal);
+        } catch (DeploymentException e) {
+            signalFailure(signal, e);
+            throw e;
+        } catch (RuntimeException e) {
+            signalFailure(signal, e);
+            throw e;
+        }
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public Properties getProperties() throws IOException {
+        return this.configurationDeployer.getConfiguration(getName());
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/StandardInstallArtifactGraphInclosure.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/StandardInstallArtifactGraphInclosure.java
new file mode 100644
index 0000000..9ceed44
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/StandardInstallArtifactGraphInclosure.java
@@ -0,0 +1,132 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import java.io.File;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeployerLogEvents;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactIdentity;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactStorage;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifactGraphFactory;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifactGraphInclosure;
+import org.eclipse.virgo.kernel.install.artifact.internal.scoping.ArtifactIdentityScoper;
+import org.eclipse.virgo.kernel.osgi.framework.OsgiFrameworkUtils;
+import org.eclipse.virgo.kernel.osgi.framework.OsgiServiceHolder;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.util.common.GraphNode;
+import org.osgi.framework.BundleContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * {@link StandardInstallArtifactGraphInclosure} is a default implementation of {@link InstallArtifactGraphInclosure}
+ * that can create with bundles, configuration files, and plans.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+public final class StandardInstallArtifactGraphInclosure implements InstallArtifactGraphInclosure {
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private final EventLogger eventLogger;
+
+    private final BundleContext bundleContext;
+
+    private final ArtifactStorageFactory artifactStorageFactory;
+
+    public StandardInstallArtifactGraphInclosure(@NonNull ArtifactStorageFactory artifactStorageFactory, @NonNull BundleContext bundleContext,
+        @NonNull EventLogger eventLogger) {
+        this.artifactStorageFactory = artifactStorageFactory;
+        this.eventLogger = eventLogger;
+        this.bundleContext = bundleContext;
+    }
+
+    public GraphNode<InstallArtifact> constructGraphNode(ArtifactIdentity identity, File artifact, Map<String, String> properties,
+        String repositoryName) throws DeploymentException {
+        if (!artifact.exists()) {
+            throw new DeploymentException(artifact + " does not exist");
+        }
+        ArtifactIdentity scopedIdentity = ArtifactIdentityScoper.scopeArtifactIdentity(identity);
+        ArtifactStorage artifactStorage = this.artifactStorageFactory.create(artifact, scopedIdentity);
+        try {
+            return constructInstallArtifactGraph(scopedIdentity, properties, artifactStorage, repositoryName);
+        } catch (DeploymentException e) {
+            artifactStorage.delete();
+            throw e;
+        }
+    }
+
+    private GraphNode<InstallArtifact> constructInstallArtifactGraph(ArtifactIdentity identity, Map<String, String> deploymentProperties,
+        ArtifactStorage artifactStorage, String repositoryName) throws DeploymentException {
+        GraphNode<InstallArtifact> graph = null;
+        List<OsgiServiceHolder<InstallArtifactGraphFactory>> iatfHolders = OsgiFrameworkUtils.getServices(this.bundleContext,
+            InstallArtifactGraphFactory.class);
+
+        for (OsgiServiceHolder<InstallArtifactGraphFactory> iatfHolder : iatfHolders) {
+
+            InstallArtifactGraphFactory iatf = iatfHolder.getService();
+            try {
+                if (iatf != null) {
+                    graph = iatf.constructInstallArtifactGraph(identity, artifactStorage, deploymentProperties, repositoryName);
+                    if (graph != null) {
+                        break;
+                    }
+                }
+            } finally {
+                this.bundleContext.ungetService(iatfHolder.getServiceReference());
+            }
+        }
+
+        if (graph == null) {
+            this.eventLogger.log(DeployerLogEvents.MISSING_ARTIFACT_FACTORY, identity.getType(), identity.getName(), identity.getVersion());
+            throw new DeploymentException("Cannot create InstallArtifact for '" + identity + "'");
+        }
+        return graph;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public GraphNode<InstallArtifact> recoverInstallGraph(ArtifactIdentity artifactIdentity, File artifact) {
+        ArtifactStorage artifactStorage = null;
+        try {
+            artifactStorage = this.artifactStorageFactory.create(artifact, artifactIdentity);
+            GraphNode<InstallArtifact> installArtifactGraph = constructInstallArtifactGraph(artifactIdentity, null, artifactStorage, null);
+
+            return installArtifactGraph;
+        } catch (RuntimeException e) {
+            if (artifactStorage != null) {
+                artifactStorage.delete();
+            }
+            this.logger.error(String.format("An error occurred during recovery of artefact '%s'", artifact), e);
+            throw e;
+        } catch (DeploymentException e) {
+            if (artifactStorage != null) {
+                artifactStorage.delete();
+            }
+            this.logger.warn(String.format("An error occurred during recovery of artefact '%s'", artifact), e);
+            return null;
+        }
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/StandardInstallArtifactRefreshHandler.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/StandardInstallArtifactRefreshHandler.java
new file mode 100644
index 0000000..6e39d06
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/StandardInstallArtifactRefreshHandler.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.environment.InstallEnvironment;
+import org.eclipse.virgo.kernel.install.environment.InstallEnvironmentFactory;
+import org.eclipse.virgo.kernel.install.pipeline.Pipeline;
+import org.eclipse.virgo.kernel.osgi.framework.UnableToSatisfyBundleDependenciesException;
+import org.eclipse.virgo.util.common.GraphNode;
+
+
+/**
+ * A helper class for handling refresh of an {@link InstallArtifact}. When an <code>InstallArtifact</code>
+ * is refreshed, its graph is passed through the refresh {@link Pipeline}.
+
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Thread-safe
+ *
+ */
+final class StandardInstallArtifactRefreshHandler implements InstallArtifactRefreshHandler {
+    
+    private final InstallEnvironmentFactory installEnvironmentFactory;
+    
+    private final Pipeline refreshPipeline;
+
+    StandardInstallArtifactRefreshHandler(InstallEnvironmentFactory installEnvironmentFactory, Pipeline refreshPipeline) {
+        this.installEnvironmentFactory = installEnvironmentFactory;
+        this.refreshPipeline = refreshPipeline;
+    }
+    
+    public boolean refresh(InstallArtifact installArtifact) {
+        GraphNode<InstallArtifact> graph = installArtifact.getGraph();
+        
+        boolean refreshed = true;
+        InstallEnvironment installEnvironment = this.installEnvironmentFactory.createInstallEnvironment(installArtifact);
+        try {
+            this.refreshPipeline.process(graph, installEnvironment);
+        } catch (UnableToSatisfyBundleDependenciesException utsbde) {
+            refreshed = false;
+        } catch (DeploymentException de) {
+            refreshed = false;
+        } finally {
+            installEnvironment.destroy();
+        }
+        return refreshed;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/StandardPlanInstallArtifact.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/StandardPlanInstallArtifact.java
new file mode 100644
index 0000000..c6f9750
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/StandardPlanInstallArtifact.java
@@ -0,0 +1,239 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.virgo.kernel.artifact.ArtifactSpecification;
+import org.eclipse.virgo.kernel.artifact.plan.PlanDescriptor.Provisioning;
+import org.eclipse.virgo.nano.core.AbortableSignal;
+import org.eclipse.virgo.nano.deployer.api.core.DeployerLogEvents;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.deployer.core.internal.AbortableSignalJunction;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactIdentity;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactStorage;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.PlanInstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.ScopeServiceRepository;
+import org.eclipse.virgo.kernel.install.artifact.internal.scoping.ArtifactIdentityScoper;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.eclipse.virgo.nano.shim.scope.Scope;
+import org.eclipse.virgo.nano.shim.scope.ScopeFactory;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.util.common.GraphNode;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * {@link StandardPlanInstallArtifact} is the standard implementation of {@link PlanInstallArtifact}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+public class StandardPlanInstallArtifact extends AbstractInstallArtifact implements PlanInstallArtifact {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(StandardPlanInstallArtifact.class);
+
+    private final Object monitor = new Object();
+
+    private final ScopeServiceRepository scopeServiceRepository;
+
+    private final ScopeFactory scopeFactory;
+
+    private final InstallArtifactRefreshHandler refreshHandler;
+
+    private final boolean atomic;
+
+    private final boolean scoped;
+
+    private final Provisioning provisioning;
+
+    private final List<ArtifactSpecification> artifactSpecifications;
+
+    protected final EventLogger eventLogger;
+
+    private Scope applicationScope;
+
+    protected StandardPlanInstallArtifact(@NonNull ArtifactIdentity artifactIdentity, boolean atomic, boolean scoped,
+        @NonNull Provisioning provisioning, @NonNull ArtifactStorage artifactStorage, @NonNull ArtifactStateMonitor artifactStateMonitor,
+        @NonNull ScopeServiceRepository scopeServiceRepository, @NonNull ScopeFactory scopeFactory, @NonNull EventLogger eventLogger,
+        @NonNull InstallArtifactRefreshHandler refreshHandler, String repositoryName, List<ArtifactSpecification> artifactSpecifications)
+        throws DeploymentException {
+        super(artifactIdentity, artifactStorage, artifactStateMonitor, repositoryName, eventLogger);
+
+        policeNestedScopes(artifactIdentity, scoped, eventLogger);
+
+        this.scopeServiceRepository = scopeServiceRepository;
+        this.scopeFactory = scopeFactory;
+        this.eventLogger = eventLogger;
+        this.refreshHandler = refreshHandler;
+        this.atomic = atomic;
+        this.scoped = scoped;
+        if (provisioning == Provisioning.INHERIT) {
+            throw new IllegalArgumentException("A plan's provisoning behaviour may not be set to INHERIT");
+        }
+        this.provisioning = provisioning;
+        this.artifactSpecifications = artifactSpecifications;
+    }
+
+    private void policeNestedScopes(ArtifactIdentity artifactIdentity, boolean scoped, EventLogger eventLogger) throws DeploymentException {
+        if (artifactIdentity.getScopeName() != null && scoped) {
+            eventLogger.log(DeployerLogEvents.NESTED_SCOPES_NOT_SUPPORTED, artifactIdentity.getType(),
+                ArtifactIdentityScoper.getUnscopedName(artifactIdentity), artifactIdentity.getVersion(), artifactIdentity.getScopeName());
+            throw new DeploymentException("Nested scope detected", true);
+        }
+    }
+
+    protected final List<GraphNode<InstallArtifact>> getChildrenSnapshot() {
+        List<GraphNode<InstallArtifact>> children = new ArrayList<GraphNode<InstallArtifact>>();
+        synchronized (this.monitor) {
+            children.addAll(getGraph().getChildren());
+        }
+        return children;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected final void doStart(AbortableSignal signal) throws DeploymentException {
+        List<GraphNode<InstallArtifact>> children = getChildrenSnapshot();
+        int numChildren = children.size();
+
+        // The SignalJunction constructor will drive the signal if numChildren == 0.
+        AbortableSignalJunction signalJunction = new AbortableSignalJunction(signal, numChildren);
+
+        LOGGER.debug("Created {} that will notify {} to track start of {}", new Object[] { signalJunction, signal, this });
+
+        List<AbortableSignal> subSignals = signalJunction.getSignals();
+
+        for (int childIndex = 0; childIndex < numChildren && !signalJunction.failed(); childIndex++) {
+            InstallArtifact childArtifact = children.get(childIndex).getValue();
+            AbortableSignal subSignal = subSignals.get(childIndex);
+
+            LOGGER.debug("Starting {} with signal {} from {}", new Object[] { childArtifact, subSignal, signalJunction });
+
+            childArtifact.start(subSignal);
+        }
+
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected final void doStop() throws DeploymentException {
+        DeploymentException firstFailure = null;
+        for (GraphNode<InstallArtifact> child : getChildrenSnapshot()) {
+            try {
+                child.getValue().stop();
+            } catch (DeploymentException e) {
+                firstFailure = e;
+            }
+        }
+        if (firstFailure != null) {
+            throw firstFailure;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected final void doUninstall() throws DeploymentException {
+        deScope(); // TODO this was placed here in copying from the old deployer, but it is insufficient. Need to
+        // consider stop/start/stop etc. for package and service scoping.
+
+        DeploymentException firstFailure = null;
+        for (GraphNode<InstallArtifact> child : getChildrenSnapshot()) {
+            getGraph().removeChild(child);
+            // Avoid uninstalling shared child
+            if (!inUse(child)) {
+                try {
+                    child.getValue().uninstall();
+                } catch (DeploymentException e) {
+                    firstFailure = e;
+                }
+            }
+        }
+        if (firstFailure != null) {
+            throw firstFailure;
+        }
+    }
+
+    private boolean inUse(GraphNode<InstallArtifact> child) {
+        AbstractInstallArtifact installArtifact = (AbstractInstallArtifact) child.getValue();
+        boolean isTopLevelDeployed = installArtifact.getTopLevelDeployed();
+        return isTopLevelDeployed || !child.getParents().isEmpty();
+    }
+
+    public void scope() throws DeploymentException {
+        if (isScoped()) {
+            List<InstallArtifact> scopeMembers = new PlanMemberCollector().collectPlanMembers(this);
+            PlanScoper planScoper = new PlanScoper(scopeMembers, getName(), getVersion(), this.scopeServiceRepository, this.eventLogger);
+            String scopeName = planScoper.getScopeName();
+
+            synchronized (this.monitor) {
+                this.applicationScope = this.scopeFactory.getApplicationScope(scopeName);
+                // TODO Do we really need to hold this lock while we're driving the planScoper?
+                planScoper.scope();
+            }
+        }
+    }
+
+    private void deScope() {
+        synchronized (this.monitor) {
+            if (this.applicationScope != null) {
+                this.scopeFactory.destroyApplicationScope(this.applicationScope);
+                this.scopeServiceRepository.clearScope(this.applicationScope.getScopeName());
+                this.applicationScope = null;
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean refreshScope() {
+        return this.refreshHandler.refresh(this);
+    }
+
+    @Override
+    public boolean refresh() throws DeploymentException {
+        this.eventLogger.log(DeployerLogEvents.INSTALL_ARTIFACT_REFRESH_NOT_SUPPORTED, getType(), getName(), getVersion(), getType());
+        return false;
+    }
+
+    public final boolean isAtomic() {
+        return this.atomic;
+    }
+
+    public final boolean isScoped() {
+        return this.scoped;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Provisioning getProvisioning() {
+        return this.provisioning;
+    }
+
+    public final List<ArtifactSpecification> getArtifactSpecifications() {
+        return this.artifactSpecifications;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/StandardScopeServiceRepository.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/StandardScopeServiceRepository.java
new file mode 100644
index 0000000..eac4f54
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/StandardScopeServiceRepository.java
@@ -0,0 +1,162 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.osgi.framework.Constants;
+import org.osgi.framework.Filter;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.InvalidSyntaxException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.util.StringUtils;
+
+import org.eclipse.virgo.kernel.install.artifact.ScopeServiceRepository;
+import org.eclipse.virgo.util.math.Sets;
+
+/**
+ * Tracks the service model for a given named scope. The service model of a named scope defines the set of services that
+ * are statically known to be published by bundles in that named scope. Typically, this reflects the metadata derived
+ * from Spring DM configuration files.
+ * 
+ * <p/>
+ * 
+ * The service model information is used to determine which service lookups are automatically application scoped.
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+final class StandardScopeServiceRepository implements ScopeServiceRepository {
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private final Map<String, List<Service>> scopeServices = new HashMap<String, List<Service>>();
+
+    private final Object monitor = new Object();
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void recordService(String scopeName, String[] types, Dictionary<String, Object> properties) {
+        if (logger.isDebugEnabled()) {
+            logger.debug("Adding service to scope '{}' with service types '{}' and properties '{}'", new Object[] { scopeName,
+                StringUtils.arrayToCommaDelimitedString(types), dictionaryToCommaSeparatedString(properties) });
+        }
+
+        synchronized (this.monitor) {
+            if (properties == null) {
+                properties = new Hashtable<String, Object>();
+            }
+            setStandardProperties(types, properties);
+            List<Service> servicesForScope = this.scopeServices.get(scopeName);
+            if (servicesForScope == null) {
+                servicesForScope = new ArrayList<Service>();
+                this.scopeServices.put(scopeName, servicesForScope);
+            }
+            servicesForScope.add(new Service(types, properties));
+        }
+    }
+
+    private static String dictionaryToCommaSeparatedString(Dictionary<String, Object> properties) {
+        StringBuffer propsString = new StringBuffer();
+        if (properties != null) {
+            Enumeration<String> keys = properties.keys();
+            for (int i = 0; keys.hasMoreElements(); i++) {
+                if (i > 0) {
+                    propsString.append(", ");
+                }
+                String key = keys.nextElement();
+                propsString.append(key + "=" + properties.get(key).toString());
+            }
+        }
+        return propsString.toString();
+    }
+
+    private void setStandardProperties(String[] types, Dictionary<String, Object> properties) {
+        if (properties.get(Constants.OBJECTCLASS) == null) {
+            properties.put(Constants.OBJECTCLASS, types);
+        }
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public boolean scopeHasMatchingService(String scopeName, String type, String filter) throws InvalidSyntaxException {
+        synchronized (this.monitor) {
+            List<Service> servicesForScope = this.scopeServices.get(scopeName);
+            boolean matches = false;
+            if (servicesForScope != null) {
+                Filter f = (filter == null ? null : FrameworkUtil.createFilter(filter));
+                for (Service service : servicesForScope) {
+                    if (service.matches(type, f)) {
+                        matches = true;
+                        break;
+                    }
+                }
+            }
+            return matches;
+        }
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void clearScope(String scopeName) {
+        synchronized (this.monitor) {
+            this.scopeServices.remove(scopeName);
+
+        }
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public Set<String> knownScopes() {
+        Set<String> scopes = new HashSet<String>();
+        synchronized (this.monitor) {
+            scopes.addAll(this.scopeServices.keySet());
+        }
+        return scopes;
+    }
+
+    private static final class Service {
+
+        private final Set<String> types;
+
+        private final Dictionary<String, Object> properties;
+
+        public Service(String[] types, Dictionary<String, Object> properties) {
+            this.types = Sets.asSet(types);
+            this.properties = properties;
+        }
+
+        public boolean matches(String type, Filter filter) {
+            if (type == null || this.types.contains(type)) {
+                return filter == null || filter.match(this.properties);
+            } else {
+                return false;
+            }
+        }
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/StartEngine.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/StartEngine.java
new file mode 100644
index 0000000..5037eb8
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/StartEngine.java
@@ -0,0 +1,21 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import org.eclipse.virgo.kernel.artifact.fs.ArtifactFS;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactIdentity;
+
+
+interface StartEngine {
+
+    void start(ArtifactIdentity artifactIdentity, ArtifactFS artifactFS) throws StartException;
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/StartException.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/StartException.java
new file mode 100644
index 0000000..ed85e34
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/StartException.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+
+public class StartException extends DeploymentException {
+
+    private static final long serialVersionUID = -6772961656579791059L;
+
+    public StartException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    public StartException(String message) {
+        super(message);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/StopEngine.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/StopEngine.java
new file mode 100644
index 0000000..cb7488a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/StopEngine.java
@@ -0,0 +1,21 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import org.eclipse.virgo.kernel.artifact.fs.ArtifactFS;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactIdentity;
+
+
+public interface StopEngine {
+
+    void stop(ArtifactIdentity artifactIdentity, ArtifactFS artifactFS) throws StopException;
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/StopException.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/StopException.java
new file mode 100644
index 0000000..9049566
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/StopException.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+
+public class StopException extends DeploymentException {
+
+    private static final long serialVersionUID = -1125558729622608583L;
+
+    public StopException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    public StopException(String message) {
+        super(message);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/bundle/BundleDriver.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/bundle/BundleDriver.java
new file mode 100644
index 0000000..931c758
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/bundle/BundleDriver.java
@@ -0,0 +1,109 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal.bundle;
+
+import java.io.File;
+
+import org.osgi.framework.Bundle;
+
+
+import org.eclipse.virgo.nano.core.AbortableSignal;
+import org.eclipse.virgo.nano.core.Signal;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactState;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+
+/**
+ * {@link BundleDriver} monitors the state of a bundle and updates an associated {@link ArtifactState}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations of this class must be thread safe.
+ * 
+ */
+public interface BundleDriver {
+
+    /**
+     * Set the bundle associated with this {@link BundleDriver}. If a bundle has already been set, do nothing.
+     * 
+     * @param bundle the {@link Bundle} to be associated
+     */
+    void setBundle(Bundle bundle);
+
+    /**
+     * Starts the bundle associated with this {@link BundleDriver} and drives the given {@link Signal} when the start, including any
+     * asynchronous processing, completes either successfully or unsuccessfully.
+     * <p/>
+     * If the start does not involve asynchronous processing, drives the given <code>Signal</code> before returning.
+     * <p/>
+     * Note that the given <code>Signal</code> may be driven before this method returns, after the method has returned,
+     * or possibly never if there is asynchronous processing which never completes. The caller must ensure that the
+     * given <code>Signal</code> is ready to be driven <i>before</i> calling this method.
+     * <p/>
+     * If the caller is not interested in being signalled, it should pass a <code>null</code> <code>Signal</code>.
+     * <p/>
+     * Note: this method behaves as specified above when called multiple times on the same <code>InstallArtifact</code>
+     * with any combination of the same or distinct or <code>null</code> <code>Signals</code>.
+     * 
+     * @param signal an <code>AbortableSignal</code> that is ready to be driven or <code>null</code> if no signalling is required
+     * @throws DeploymentException 
+     */
+    void start(AbortableSignal signal) throws DeploymentException;
+    
+    /**
+     * Updates the bundle associated with this {@link BundleDriver} to the given file or directory using the given {@link BundleManifest} which
+     * could, for example, result from transforming the updated artifact.
+     * 
+     * @param manifest the <code>BundleManifest</code>
+     * @param location the <code>File</code>
+     * @return <code>true</code> if and only if the bundle was successfully updated
+     * @throws DeploymentException if the update failed
+     */
+    boolean update(BundleManifest manifest, File location) throws DeploymentException;
+
+    /**
+     * Performs a refresh packages operation specifying the bundle associated with this {@link BundleDriver} and
+     * waits, for a period of time, for the operation to complete before returning.
+     * 
+     * @throws DeploymentException if the refresh failed
+     */
+    void refreshBundle() throws DeploymentException;
+
+    /**
+     * Stops the bundle associated with this {@link BundleDriver}. If the bundle is already stopped, does nothing.
+     * 
+     * @throws DeploymentException if stopping the bundle fails
+     */
+    void stop() throws DeploymentException;
+
+    /**
+     * Uninstalls the bundle associated with this {@link BundleDriver}.
+     * 
+     * @throws DeploymentException if uninstalling the bundle fails
+     */
+    void uninstall() throws DeploymentException;
+
+    /**
+     * Push the thread context including any application trace name and thread context class loader. The caller is
+     * responsible for calling <code>popThreadContext</code>.
+     */
+    void pushThreadContext();
+
+    /**
+     * Pop a previously pushed thread context.
+     */
+    void popThreadContext();
+
+    void trackStart(AbortableSignal signal);
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/bundle/BundleDriverBundleListener.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/bundle/BundleDriverBundleListener.java
new file mode 100644
index 0000000..ee72ccf
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/bundle/BundleDriverBundleListener.java
@@ -0,0 +1,110 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal.bundle;
+
+import java.util.Set;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleEvent;
+import org.osgi.framework.SynchronousBundleListener;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.internal.ArtifactStateMonitor;
+import org.eclipse.virgo.kernel.install.artifact.internal.StandardArtifactStateMonitor;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.eclipse.virgo.util.math.ConcurrentHashSet;
+
+/**
+ * {@link BundleDriverBundleListener} listens for bundle events and notifies the bundle's {@link StandardArtifactStateMonitor}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+final class BundleDriverBundleListener implements SynchronousBundleListener {
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private final StandardBundleInstallArtifact installArtifact;
+
+    private final Bundle bundle;
+
+    private final ArtifactStateMonitor artifactStateMonitor;
+
+    private final Set<Bundle> solicitedStartBundleSet = new ConcurrentHashSet<Bundle>();
+
+    public BundleDriverBundleListener(@NonNull StandardBundleInstallArtifact installArtifact, @NonNull Bundle bundle,
+        @NonNull ArtifactStateMonitor artifactStateMonitor) {
+        this.installArtifact = installArtifact;
+        this.bundle = bundle;
+        this.artifactStateMonitor = artifactStateMonitor;
+    }
+
+    void addSolicitedStart(Bundle bundle) {
+        this.solicitedStartBundleSet.add(bundle);
+    }
+
+    void removeSolicitedStart(Bundle bundle) {
+        this.solicitedStartBundleSet.remove(bundle);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void bundleChanged(BundleEvent event) {
+        if (event.getBundle() == this.bundle) {
+            try {
+                switch (event.getType()) {
+                    case BundleEvent.RESOLVED:
+                        artifactStateMonitor.onResolved(this.installArtifact);
+                        break;
+                    case BundleEvent.LAZY_ACTIVATION:
+                        break;
+                    case BundleEvent.STARTING:
+                        artifactStateMonitor.onStarting(this.installArtifact);
+                        break;
+                    case BundleEvent.STARTED:
+                        if (!this.solicitedStartBundleSet.contains(this.bundle)) {
+                            /*
+                             * Track an unsolicited start of the install artifact so that its state transitions are performed
+                             * correctly. Solicited starts are tracked by the solicitor.
+                             */
+                            this.installArtifact.trackStart();
+                        }
+                        break;
+                    case BundleEvent.STOPPING:
+                        artifactStateMonitor.onStopping(this.installArtifact);
+                        break;
+                    case BundleEvent.STOPPED:
+                        artifactStateMonitor.onStopped(this.installArtifact);
+                        break;
+                    case BundleEvent.UNRESOLVED:
+                        artifactStateMonitor.onUnresolved(this.installArtifact);
+                        break;
+                    case BundleEvent.UNINSTALLED:
+                        artifactStateMonitor.onUninstalled(this.installArtifact);
+                        break;
+                    default:
+                        break;
+                }
+            } catch (DeploymentException e) {
+                logger.error(String.format("listener for bundle %s threw DeploymentException", this.bundle), e);
+                throw new RuntimeException("percolated listener exception", e);
+            }
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/bundle/BundleDriverFactory.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/bundle/BundleDriverFactory.java
new file mode 100644
index 0000000..323bf44
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/bundle/BundleDriverFactory.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal.bundle;
+
+import org.eclipse.virgo.nano.core.BundleStarter;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactIdentity;
+import org.eclipse.virgo.kernel.install.artifact.internal.ArtifactStateMonitor;
+import org.eclipse.virgo.nano.shim.serviceability.TracingService;
+import org.osgi.framework.BundleContext;
+
+import org.eclipse.virgo.kernel.osgi.framework.OsgiFramework;
+import org.eclipse.virgo.kernel.osgi.framework.PackageAdminUtil;
+
+
+/**
+ * A factory for creating {@link BundleDriver} instances.
+ * 
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Thread-safe
+ *
+ */
+final class BundleDriverFactory {
+    
+    private final OsgiFramework osgiFramework;
+    
+    private final BundleContext regionBundleContext;
+    
+    private final BundleStarter bundleStarter;
+    
+    private final TracingService tracingService;
+    
+    private final PackageAdminUtil packageAdminUtil;
+    
+    public BundleDriverFactory(OsgiFramework osgiFramework, BundleContext regionBundleContext, BundleStarter bundleStarter,
+        TracingService tracingService, PackageAdminUtil packageAdminUtil) {
+        this.osgiFramework = osgiFramework;
+        this.regionBundleContext = regionBundleContext;
+        this.bundleStarter = bundleStarter;
+        this.tracingService = tracingService;
+        this.packageAdminUtil = packageAdminUtil;
+    }
+
+    StandardBundleDriver createBundleDriver(ArtifactIdentity identity, ArtifactStateMonitor artifactStateMonitor) {
+        return new StandardBundleDriver(this.osgiFramework, this.regionBundleContext, this.bundleStarter, this.tracingService, this.packageAdminUtil, identity.getScopeName(), artifactStateMonitor);
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/bundle/BundleDriverManifestTransformer.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/bundle/BundleDriverManifestTransformer.java
new file mode 100644
index 0000000..71c7139
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/bundle/BundleDriverManifestTransformer.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal.bundle;
+
+import org.eclipse.virgo.kernel.osgi.framework.ManifestTransformer;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+
+/**
+ * {@link BundleDriverManifestTransformer} is a {@link ManifesTransformer} that transforms a bundle manifest by replacing it with an in-memory version.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * This class is thread safe.
+ *
+ */
+final class BundleDriverManifestTransformer implements ManifestTransformer {
+
+    private final BundleManifest bundleManifest;
+
+    public BundleDriverManifestTransformer(BundleManifest bundleManifest) {
+        this.bundleManifest = bundleManifest;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public BundleManifest transform(BundleManifest bundleManifest) {
+        return this.bundleManifest;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/bundle/BundleInstallArtifactFactory.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/bundle/BundleInstallArtifactFactory.java
new file mode 100644
index 0000000..ece49d8
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/bundle/BundleInstallArtifactFactory.java
@@ -0,0 +1,118 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal.bundle;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.util.jar.JarFile;
+
+import org.eclipse.virgo.kernel.artifact.fs.ArtifactFS;
+import org.eclipse.virgo.kernel.artifact.fs.ArtifactFSEntry;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactIdentity;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactIdentityDeterminer;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactStorage;
+import org.eclipse.virgo.kernel.install.artifact.BundleInstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.internal.ArtifactStateMonitor;
+import org.eclipse.virgo.kernel.install.artifact.internal.InstallArtifactRefreshHandler;
+import org.eclipse.virgo.kernel.install.artifact.internal.StandardArtifactStateMonitor;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifestFactory;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Version;
+
+/**
+ * A factory for creating {@link BundleInstallArtifact} instances.
+ * 
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ * 
+ */
+final class BundleInstallArtifactFactory {
+
+    private static final Version DEFAULT_BUNDLE_VERSION = Version.emptyVersion;
+
+    private final BundleContext kernelBundleContext;
+
+    private final InstallArtifactRefreshHandler refreshHandler;
+
+    private final BundleDriverFactory bundleDriverFactory;
+
+    private final EventLogger eventLogger;
+
+    private final ArtifactIdentityDeterminer identityDeterminer;
+
+    BundleInstallArtifactFactory(BundleContext kernelBundleContext, InstallArtifactRefreshHandler refreshHandler,
+        BundleDriverFactory bundleDriverFactory, EventLogger eventLogger, ArtifactIdentityDeterminer identityDeterminer) {
+        this.kernelBundleContext = kernelBundleContext;
+        this.refreshHandler = refreshHandler;
+        this.bundleDriverFactory = bundleDriverFactory;
+        this.eventLogger = eventLogger;
+        this.identityDeterminer = identityDeterminer;
+    }
+
+    BundleInstallArtifact createBundleInstallArtifact(ArtifactIdentity identity, ArtifactStorage artifactStorage, String repositoryName)
+        throws DeploymentException {
+
+        ArtifactStateMonitor artifactStateMonitor = new StandardArtifactStateMonitor(this.kernelBundleContext);
+
+        StandardBundleDriver bundleDriver = this.bundleDriverFactory.createBundleDriver(identity, artifactStateMonitor);
+
+        BundleManifest bundleManifest = retrieveArtifactFSManifest(artifactStorage.getArtifactFS());
+
+        StandardBundleInstallArtifact bundleInstallArtifact = new StandardBundleInstallArtifact(identity, bundleManifest, artifactStorage,
+            bundleDriver, artifactStateMonitor, this.refreshHandler, repositoryName, this.eventLogger, this.identityDeterminer);
+
+        // TODO: need to set identity version from bundleManifest etc. Best to use supertype method.
+
+        bundleDriver.setInstallArtifact(bundleInstallArtifact);
+
+        return bundleInstallArtifact;
+    }
+
+    private BundleManifest retrieveArtifactFSManifest(ArtifactFS artifactFS) throws DeploymentException {
+        ArtifactFSEntry manifestEntry = artifactFS.getEntry(JarFile.MANIFEST_NAME);
+        if (manifestEntry != null && manifestEntry.exists()) {
+            try (Reader manifestReader = new InputStreamReader(manifestEntry.getInputStream(), UTF_8)) {
+                return BundleManifestFactory.createBundleManifest(manifestReader);
+            } catch (IOException ioe) {
+                throw new DeploymentException("Failed to read manifest for bundle from " + artifactFS, ioe);
+            }
+        } else {
+            return BundleManifestFactory.createBundleManifest();
+        }
+    }
+
+    static Version getVersionFromManifest(BundleManifest bundleManifest) {
+        Version version = bundleManifest.getBundleVersion();
+        return (version == null ? DEFAULT_BUNDLE_VERSION : version);
+    }
+
+    private static String getNameFromManifest(BundleManifest bundleManifest) {
+        return bundleManifest.getBundleSymbolicName().getSymbolicName();
+    }
+
+    static String determineName(BundleManifest bundleManifest, ArtifactFS artifactFS) {
+        String name = getNameFromManifest(bundleManifest);
+        if (name == null) {
+            name = artifactFS.getFile().getName();
+        }
+        return name;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/bundle/BundleInstallArtifactGraphFactory.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/bundle/BundleInstallArtifactGraphFactory.java
new file mode 100644
index 0000000..46a1fb5
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/bundle/BundleInstallArtifactGraphFactory.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution (BundleInstallArtifactTreeFactory)
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal.bundle;
+
+import java.util.Map;
+
+import org.eclipse.virgo.nano.core.BundleStarter;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactIdentity;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactIdentityDeterminer;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactStorage;
+import org.eclipse.virgo.kernel.install.artifact.BundleInstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifactGraphFactory;
+import org.eclipse.virgo.kernel.install.artifact.internal.AbstractArtifactGraphFactory;
+import org.eclipse.virgo.kernel.install.artifact.internal.InstallArtifactRefreshHandler;
+import org.eclipse.virgo.kernel.osgi.framework.OsgiFramework;
+import org.eclipse.virgo.kernel.osgi.framework.PackageAdminUtil;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.eclipse.virgo.nano.shim.serviceability.TracingService;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.util.common.DirectedAcyclicGraph;
+import org.eclipse.virgo.util.common.GraphNode;
+import org.osgi.framework.BundleContext;
+
+/**
+ * {@link BundleInstallArtifactGraphFactory} is an {@link InstallArtifactGraphFactory} for {@link BundleInstallArtifact
+ * BundleInstallArtifacts}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+public final class BundleInstallArtifactGraphFactory extends AbstractArtifactGraphFactory {
+
+    private final BundleInstallArtifactFactory bundleArtifactFactory;
+    public BundleInstallArtifactGraphFactory(@NonNull OsgiFramework osgiFramework, @NonNull BundleContext kernelBundleContext,
+        @NonNull InstallArtifactRefreshHandler refreshHandler, @NonNull BundleStarter bundleStarter, @NonNull TracingService tracingService,
+        @NonNull PackageAdminUtil packageAdminUtil, @NonNull BundleContext regionBundleContext, EventLogger eventLogger, ArtifactIdentityDeterminer identityDeterminer,
+        @NonNull DirectedAcyclicGraph<InstallArtifact> dag) {
+
+    		super(dag);
+        BundleDriverFactory bundleDriverFactory = new BundleDriverFactory(osgiFramework, regionBundleContext, bundleStarter, tracingService,
+            packageAdminUtil);
+
+        this.bundleArtifactFactory = new BundleInstallArtifactFactory(kernelBundleContext, refreshHandler, bundleDriverFactory, eventLogger, identityDeterminer);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public GraphNode<InstallArtifact> constructInstallArtifactGraph(ArtifactIdentity identity, ArtifactStorage artifactStorage, Map<String, String> deploymentProperties,
+        String repositoryName) throws DeploymentException {
+        if (ArtifactIdentityDeterminer.BUNDLE_TYPE.equalsIgnoreCase(identity.getType())) {
+            BundleInstallArtifact bundleInstallArtifact = this.bundleArtifactFactory.createBundleInstallArtifact(identity, artifactStorage, repositoryName);
+
+            if (deploymentProperties != null) {
+                bundleInstallArtifact.getDeploymentProperties().putAll(deploymentProperties);
+            }
+
+            return constructAssociatedGraphNode(bundleInstallArtifact);
+        } else {
+            return null;
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/bundle/BundleThreadContextManager.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/bundle/BundleThreadContextManager.java
new file mode 100644
index 0000000..343e79f
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/bundle/BundleThreadContextManager.java
@@ -0,0 +1,140 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal.bundle;
+
+import java.util.concurrent.BlockingDeque;
+import java.util.concurrent.LinkedBlockingDeque;
+
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.eclipse.virgo.nano.shim.serviceability.TracingService;
+import org.osgi.framework.Bundle;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.eclipse.virgo.kernel.osgi.framework.BundleClassLoaderUnavailableException;
+import org.eclipse.virgo.kernel.osgi.framework.OsgiFramework;
+
+/**
+ * {@link BundleThreadContextManager} is a utility used by {@link StandardBundleDriver} to manage the thread context
+ * relating to a bundle.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * TODO Document concurrent semantics of BundleThreadContextManager
+ * 
+ */
+final class BundleThreadContextManager {
+
+    private static final class ApplicationTraceNameStackThreadLocal extends ThreadLocal<BlockingDeque<String>> {
+
+        @Override
+        protected BlockingDeque<String> initialValue() {
+            return new LinkedBlockingDeque<String>();
+        }
+    }
+
+    private static final class ContextClassLoaderStackThreadLocal extends ThreadLocal<BlockingDeque<ClassLoader>> {
+
+        @Override
+        protected BlockingDeque<ClassLoader> initialValue() {
+            return new LinkedBlockingDeque<ClassLoader>();
+        }
+    }
+
+    private static final String WRAPPED_NULL = "WRAPPED_NULL";
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private final Object monitor = new Object();
+
+    private final OsgiFramework osgi;
+
+    private final Bundle threadContextBundle;
+
+    private final String scopeName;
+
+    private final TracingService tracingService;
+
+    private final ThreadLocal<BlockingDeque<ClassLoader>> contextClassLoaderStack = new ContextClassLoaderStackThreadLocal();
+
+    private final ThreadLocal<BlockingDeque<String>> applicationTraceNameStack = new ApplicationTraceNameStackThreadLocal();
+
+    /**
+     * @param osgi
+     * @param threadContextBundle the bundle whose class loader is to be used as a TCCL
+     * @param scopeName
+     * @param tracingService
+     */
+    public BundleThreadContextManager(@NonNull OsgiFramework osgi, @NonNull Bundle threadContextBundle, String scopeName,
+        @NonNull TracingService tracingService) {
+        this.osgi = osgi;
+        this.threadContextBundle = threadContextBundle;
+        this.scopeName = scopeName;
+        this.tracingService = tracingService;
+    }
+
+    public void pushThreadContext() {
+        synchronized (this.monitor) {
+            pushThreadContextClassLoader();
+            this.applicationTraceNameStack.get().push(wrapNull(this.tracingService.getCurrentApplicationName()));
+            this.tracingService.setCurrentApplicationName(this.scopeName);
+        }
+    }
+
+    private String wrapNull(String string) {
+        return string != null ? string : WRAPPED_NULL;
+    }
+
+    private String unwrapNull(String string) {
+        return WRAPPED_NULL.equals(string) ? null : string;
+    }
+
+    public void popThreadContext() {
+        synchronized (this.monitor) {
+            popThreadContextClassLoader();
+            this.tracingService.setCurrentApplicationName(unwrapNull(this.applicationTraceNameStack.get().pop()));
+        }
+    }
+
+    private void pushThreadContextClassLoader() {
+        Thread currentThread = Thread.currentThread();
+        ClassLoader oldContextClassLoader = currentThread.getContextClassLoader();
+        this.contextClassLoaderStack.get().push(oldContextClassLoader);
+
+        int state = this.threadContextBundle.getState();
+
+        if (state != Bundle.INSTALLED && state != Bundle.UNINSTALLED) {
+            ClassLoader newContextClassLoader = null;
+            try {
+                newContextClassLoader = this.osgi.getBundleClassLoader(this.threadContextBundle);
+            } catch (BundleClassLoaderUnavailableException bclue) {
+                this.logger.info("Bundle class loader not available, it may not be resolved");
+            }
+            if (newContextClassLoader != null) {
+                currentThread.setContextClassLoader(newContextClassLoader);
+                this.logger.info("Thread context class loader '{}' pushed and set to '{}'", oldContextClassLoader, newContextClassLoader);
+            } else {
+                this.logger.info("Thread context class loader not found for bundle '{}'", this.threadContextBundle.getSymbolicName());
+            }
+        }
+    }
+
+    private void popThreadContextClassLoader() {
+        Thread currentThread = Thread.currentThread();
+        ClassLoader oldContextClassLoader = currentThread.getContextClassLoader();
+        ClassLoader newContextClassLoader = this.contextClassLoaderStack.get().pop();
+        currentThread.setContextClassLoader(newContextClassLoader);
+        this.logger.info("Thread context class loader '{}' popped and set to '{}'", oldContextClassLoader, newContextClassLoader);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/bundle/StandardBundleDriver.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/bundle/StandardBundleDriver.java
new file mode 100644
index 0000000..8257b1f
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/bundle/StandardBundleDriver.java
@@ -0,0 +1,320 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal.bundle;
+
+import java.io.File;
+
+import org.eclipse.virgo.nano.core.AbortableSignal;
+import org.eclipse.virgo.nano.core.BundleStarter;
+import org.eclipse.virgo.nano.core.BundleUtils;
+import org.eclipse.virgo.nano.core.KernelException;
+import org.eclipse.virgo.nano.core.Signal;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactState;
+import org.eclipse.virgo.kernel.install.artifact.BundleInstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.PlanInstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.internal.ArtifactStateMonitor;
+import org.eclipse.virgo.kernel.osgi.framework.OsgiFramework;
+import org.eclipse.virgo.kernel.osgi.framework.PackageAdminUtil;
+import org.eclipse.virgo.nano.serviceability.Assert;
+import org.eclipse.virgo.nano.shim.serviceability.TracingService;
+import org.eclipse.virgo.util.common.GraphNode;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.BundleListener;
+
+/**
+ * {@link StandardBundleDriver} monitors the state of a bundle and keeps the associated {@link ArtifactState} up to
+ * date.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+final class StandardBundleDriver implements BundleDriver {
+
+    private static final String SYNTHETIC_CONTEXT_SUFFIX = "-synthetic.context";
+
+    private final Object monitor = new Object();
+
+    private final BundleStarter bundleStarter;
+
+    private final TracingService tracingService;
+
+    private final PackageAdminUtil packageAdminUtil;
+
+    private final BundleContext bundleContext;
+
+    private final OsgiFramework osgi;
+
+    private final ArtifactStateMonitor artifactStateMonitor;
+
+    private volatile BundleThreadContextManager threadContextManager;
+
+    private volatile StandardBundleInstallArtifact installArtifact;
+
+    private volatile BundleDriverBundleListener bundleListener;
+
+    private Bundle bundle;
+
+    private final String applicationTraceName;
+
+    /**
+     * Creates a {@link StandardBundleDriver} for the given {@link Bundle} and {@link ArtifactState}.
+     * 
+     * @param osgiFramework framework
+     * @param bundleContext context
+     * @param bundleStarter to start bundles
+     * @param tracingService to trace bundle operations
+     * @param packageAdminUtil utilities for package administration
+     */
+    StandardBundleDriver(OsgiFramework osgiFramework, BundleContext bundleContext, BundleStarter bundleStarter, TracingService tracingService,
+        PackageAdminUtil packageAdminUtil, String scopeName, ArtifactStateMonitor artifactStateMonitor) {
+        this.osgi = osgiFramework;
+        this.bundleContext = bundleContext;
+        this.tracingService = tracingService;
+        this.packageAdminUtil = packageAdminUtil;
+        this.bundleStarter = bundleStarter;
+        this.applicationTraceName = scopeName;
+        this.artifactStateMonitor = artifactStateMonitor;
+    }
+
+    public void setInstallArtifact(StandardBundleInstallArtifact installArtifact) {
+        this.installArtifact = installArtifact;
+    }
+
+    public void setBundle(Bundle bundle) {
+        BundleListener bundleListener = null;
+
+        synchronized (this.monitor) {
+            if (this.bundle == null) {
+                this.bundle = bundle;
+                if (this.bundle != null) {
+                    this.bundleListener = new BundleDriverBundleListener(this.installArtifact, this.bundle, this.artifactStateMonitor);
+                    bundleListener = this.bundleListener;
+                }
+            }
+        }
+
+        if (bundleListener != null) {
+            this.bundleContext.addBundleListener(bundleListener);
+        }
+    }
+
+    public void syncStart() throws KernelException {
+        pushThreadContext();
+        try {
+            this.bundleStarter.start(obtainLocalBundle(), null);
+        } catch (BundleException be) {
+            throw new KernelException("BundleException", be);
+        } finally {
+            popThreadContext();
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void pushThreadContext() {
+        ensureThreadContextManager();
+        this.threadContextManager.pushThreadContext();
+    }
+
+    public void popThreadContext() {
+        this.threadContextManager.popThreadContext();
+    }
+
+    private void ensureThreadContextManager() {
+        synchronized (this.monitor) {
+            if (this.threadContextManager == null) {
+                this.threadContextManager = new BundleThreadContextManager(this.osgi, getThreadContextBundle(), this.applicationTraceName,
+                    this.tracingService);
+            }
+        }
+    }
+
+    private Bundle getThreadContextBundle() {
+        if (this.installArtifact != null) {
+            PlanInstallArtifact scopedAncestor = this.installArtifact.getScopedAncestor();
+            if (scopedAncestor != null) {
+                String syntheticContextBundleSymbolicName = this.installArtifact.getScopeName() + SYNTHETIC_CONTEXT_SUFFIX;
+                for (GraphNode<InstallArtifact> scopedPlanChild : scopedAncestor.getGraph().getChildren()) {
+                    InstallArtifact scopedPlanChildArtifact = scopedPlanChild.getValue();
+                    if (scopedPlanChildArtifact instanceof BundleInstallArtifact
+                        && syntheticContextBundleSymbolicName.equals(scopedPlanChildArtifact.getName())) {
+                        BundleInstallArtifact syntheticContextBundleArtifact = (BundleInstallArtifact) scopedPlanChildArtifact;
+                        return syntheticContextBundleArtifact.getBundle();
+                    }
+                }
+            }
+        }
+        return this.bundle;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void start(AbortableSignal signal) throws DeploymentException {
+        Bundle bundle = obtainLocalBundle();
+
+        if (!BundleUtils.isFragmentBundle(bundle)) {
+            pushThreadContext();
+            try {
+                startBundle(bundle, signal);
+            } catch (DeploymentException e) {
+                signalFailure(signal, e);
+                throw e;
+            } catch (RuntimeException e) {
+                signalFailure(signal, e);
+                throw e;
+            } finally {
+                popThreadContext();
+            }
+        } else {
+            signalSuccessfulCompletion(signal);
+        }
+
+    }
+
+    private void startBundle(Bundle bundle, AbortableSignal signal) throws DeploymentException {
+        this.bundleListener.addSolicitedStart(bundle);
+        try {
+            this.bundleStarter.start(bundle, signal);
+        } catch (BundleException e) {
+            throw new DeploymentException("BundleException", e);
+        } finally {
+            this.bundleListener.removeSolicitedStart(bundle);
+        }
+    }
+
+    protected static void signalFailure(Signal signal, Throwable e) {
+        if (signal != null) {
+            signal.signalFailure(e);
+        }
+    }
+
+    private static void signalSuccessfulCompletion(Signal signal) {
+        if (signal != null) {
+            signal.signalSuccessfulCompletion();
+        }
+    }
+
+    public void syncStart(int options) throws KernelException {
+        Bundle bundle = obtainLocalBundle();
+
+        if (!BundleUtils.isFragmentBundle(bundle)) {
+            pushThreadContext();
+            try {
+                this.bundleStarter.start(obtainLocalBundle(), options, null);
+            } catch (BundleException be) {
+                throw new KernelException("BundleException", be);
+            } finally {
+                popThreadContext();
+            }
+        }
+    }
+
+    private Bundle obtainLocalBundle() {
+        synchronized (this.monitor) {
+            if (this.bundle == null) {
+                throw new IllegalStateException("bundle not set");
+            }
+            return this.bundle;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean update(BundleManifest bundleManifest, File location) throws DeploymentException {
+        updateBundle(bundleManifest, location);
+        refreshBundle();
+        return true;
+    }
+
+    private void updateBundle(BundleManifest bundleManifest, File location) throws DeploymentException {
+        if (!isFragment(bundleManifest)) {
+            Bundle bundle = obtainLocalBundle();
+            Assert.isTrue(bundle.getState() == Bundle.INSTALLED || bundle.getState() == Bundle.RESOLVED,
+                "A bundle cannot be updated unless is in INSTALLED or RESOLVED state");
+            try {
+                this.osgi.update(bundle, new BundleDriverManifestTransformer(bundleManifest), location);
+            } catch (BundleException e) {
+                throw new DeploymentException("Failed to update bundle '" + bundle + "'.", e);
+            }
+        }
+    }
+
+    private static boolean isFragment(BundleManifest bundleManifest) {
+        return bundleManifest.getFragmentHost().getBundleSymbolicName() != null;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void refreshBundle() throws DeploymentException {
+        Bundle bundle = obtainLocalBundle();
+        this.packageAdminUtil.synchronouslyRefreshPackages(new Bundle[] { bundle });
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void stop() throws DeploymentException {
+        pushThreadContext();
+        try {
+            obtainLocalBundle().stop();
+        } catch (BundleException e) {
+            throw new DeploymentException("stop failed", e);
+        } finally {
+            popThreadContext();
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void uninstall() throws DeploymentException {
+        Bundle bundle = obtainLocalBundle();
+
+        pushThreadContext();
+        try {
+            bundle.uninstall();
+        } catch (BundleException e) {
+            throw new DeploymentException("uninstall failed", e);
+        } finally {
+            popThreadContext();
+        }
+
+        BundleListener localBundleListener = this.bundleListener;
+        this.bundleListener = null;
+
+        if (localBundleListener != null) {
+            this.bundleContext.removeBundleListener(localBundleListener);
+        }
+
+        this.packageAdminUtil.synchronouslyRefreshPackages(new Bundle[] { bundle });
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void trackStart(AbortableSignal signal) {
+        this.bundleStarter.trackStart(obtainLocalBundle(), signal);
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/bundle/StandardBundleInstallArtifact.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/bundle/StandardBundleInstallArtifact.java
new file mode 100644
index 0000000..f021d39
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/bundle/StandardBundleInstallArtifact.java
@@ -0,0 +1,579 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal.bundle;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+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.Reader;
+import java.net.URI;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.virgo.kernel.artifact.fs.ArtifactFSEntry;
+import org.eclipse.virgo.kernel.deployer.core.internal.BlockingAbortableSignal;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactIdentity;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactIdentityDeterminer;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactStorage;
+import org.eclipse.virgo.kernel.install.artifact.BundleInstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.PlanInstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.internal.AbstractInstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.internal.ArtifactStateMonitor;
+import org.eclipse.virgo.kernel.install.artifact.internal.InstallArtifactRefreshHandler;
+import org.eclipse.virgo.kernel.install.artifact.internal.scoping.ArtifactIdentityScoper;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiBundle;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.nano.core.AbortableSignal;
+import org.eclipse.virgo.nano.deployer.api.core.DeployerLogEvents;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.eclipse.virgo.util.common.GraphNode;
+import org.eclipse.virgo.util.io.FileCopyUtils;
+import org.eclipse.virgo.util.io.IOUtils;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifestFactory;
+import org.eclipse.virgo.util.osgi.manifest.BundleSymbolicName;
+import org.eclipse.virgo.util.osgi.manifest.ExportedPackage;
+import org.osgi.framework.Bundle;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * {@link StandardBundleInstallArtifact} is the default implementation of {@link BundleInstallArtifact}.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * This class is thread safe.
+ *
+ */
+final class StandardBundleInstallArtifact extends AbstractInstallArtifact implements BundleInstallArtifact {
+
+    private static final String DEFAULTED_BSN = "org-eclipse-virgo-kernel-DefaultedBSN";
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private static final String MANIFEST_ENTRY_NAME = "META-INF/MANIFEST.MF";
+
+    private static final String EQUINOX_SYSTEM_BUNDLE_NAME = "org.eclipse.osgi";
+
+    private static final String RESERVED_SYSTEM_BUNDLE_NAME = "system.bundle";
+
+    private static final long REFRESH_RESTART_WAIT_PERIOD = 60;
+
+    private final Object monitor = new Object();
+
+    private final ArtifactStorage artifactStorage;
+
+    private final BundleDriver bundleDriver;
+
+    private final InstallArtifactRefreshHandler refreshHandler;
+
+    private final ArtifactIdentityDeterminer identityDeterminer;
+
+    private BundleManifest bundleManifest;
+
+    private QuasiBundle quasiBundle;
+
+    private Bundle cachedBundle;
+
+    private File cachedBundleFile;
+
+    /**
+     * Construct a {@link StandardBundleInstallArtifact} with the given type and {@link ArtifactStorage}, none of which
+     * may be <code>null</code>.
+     *
+     * @param artifactIdentifier
+     * @param bundleManifest
+     * @param artifactStorage the bundle artifact storage
+     * @param bundleDriver a {@link BundleDriver} for manipulating the bundle
+     * @param artifactStateMonitor
+     * @param refreshHandler
+     * @param repositoryName
+     * @param eventLogger
+     * @param identityDeterminer
+     */
+    public StandardBundleInstallArtifact(@NonNull ArtifactIdentity artifactIdentifier, @NonNull BundleManifest bundleManifest,
+        @NonNull ArtifactStorage artifactStorage, @NonNull BundleDriver bundleDriver, @NonNull ArtifactStateMonitor artifactStateMonitor,
+        @NonNull InstallArtifactRefreshHandler refreshHandler, String repositoryName, EventLogger eventLogger,
+        ArtifactIdentityDeterminer identityDeterminer) {
+        super(artifactIdentifier, artifactStorage, artifactStateMonitor, repositoryName, eventLogger);
+
+        this.artifactStorage = artifactStorage;
+        this.bundleManifest = bundleManifest;
+
+        this.bundleDriver = bundleDriver;
+        this.refreshHandler = refreshHandler;
+
+        this.identityDeterminer = identityDeterminer;
+
+        synchronizeBundleSymbolicNameWithIdentity();
+    }
+
+    private void synchronizeBundleSymbolicNameWithIdentity() {
+        BundleManifest bundleManifest = this.bundleManifest;
+        BundleSymbolicName bundleSymbolicName = bundleManifest.getBundleSymbolicName();
+        if (!getName().equals(bundleSymbolicName.getSymbolicName())) {
+            bundleSymbolicName.setSymbolicName(getName());
+            bundleManifest.setHeader(DEFAULTED_BSN, "true");
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public BundleManifest getBundleManifest() throws IOException {
+        synchronized (this.monitor) {
+            if (this.bundleManifest == null) {
+                this.bundleManifest = getManifestFromArtifactFS();
+            }
+            return this.bundleManifest;
+        }
+    }
+
+    private BundleManifest getManifestFromArtifactFS() throws IOException {
+        ArtifactFSEntry manifestEntry = this.artifactStorage.getArtifactFS().getEntry(MANIFEST_ENTRY_NAME);
+        if (manifestEntry != null && manifestEntry.exists()) {
+            try (Reader manifestReader = new InputStreamReader(manifestEntry.getInputStream(), UTF_8)) {
+                return BundleManifestFactory.createBundleManifest(manifestReader);
+            }
+        } else {
+            return BundleManifestFactory.createBundleManifest();
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public QuasiBundle getQuasiBundle() {
+        synchronized (this.monitor) {
+            return this.quasiBundle;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void setQuasiBundle(QuasiBundle quasiBundle) {
+        synchronized (this.monitor) {
+            this.quasiBundle = quasiBundle;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Bundle getBundle() {
+        synchronized (this.monitor) {
+            return this.quasiBundle == null ? this.cachedBundle : this.quasiBundle.getBundle();
+        }
+    }
+
+    private File getBundleFile() {
+        synchronized (this.monitor) {
+            return this.quasiBundle == null ? this.cachedBundleFile : this.quasiBundle.getBundleFile();
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public State getState() {
+        // Before returning the state, ensure any bundle is set into the bundle state monitor.
+        monitorBundle();
+        State state = super.getState();
+        // avoid exposing inappropriate states for fragments
+        return (isFragment() && (state == State.STARTING || state == State.ACTIVE || state == State.STOPPING)) ? State.RESOLVED : state;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void endInstall() throws DeploymentException {
+        monitorBundle();
+        super.endInstall();
+        cacheAndDelete();
+    }
+
+    private void monitorBundle() {
+        synchronized (this.monitor) {
+            Bundle bundle = getBundle();
+            if (bundle != null) {
+                this.bundleDriver.setBundle(bundle);
+            }
+        }
+    }
+
+    /**
+     * Cache the <code>Bundle</code> contained within the <code>quasiBundle</code> and set the <code>quasiBundle</code>
+     * instance to <code>null</code>.  This is a fix for this PR: https://bugs.eclipse.org/bugs/show_bug.cgi?id=424872
+     */
+    private void cacheAndDelete() {
+        synchronized (this.monitor) {
+            if (this.quasiBundle == null) {
+                return;
+            }
+            this.cachedBundle = this.quasiBundle.getBundle();
+            this.cachedBundleFile = this.quasiBundle.getBundleFile();
+            this.quasiBundle = null;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void pushThreadContext() {
+        this.bundleDriver.pushThreadContext();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void popThreadContext() {
+        this.bundleDriver.popThreadContext();
+    }
+
+    /**
+     * Track an unsolicited start of the bundle.
+     */
+    void trackStart() {
+        AbortableSignal signal = createStateMonitorSignal(null);
+        this.bundleDriver.trackStart(signal);
+    }
+
+    @Override
+    public void beginInstall() throws DeploymentException {
+        if (isFragmentOnSystemBundle()) {
+            throw new DeploymentException("Deploying fragments of the system bundle is not supported");
+        }
+        super.beginInstall();
+    }
+
+    private boolean isFragment() {
+        return this.bundleManifest.getFragmentHost().getBundleSymbolicName() != null;
+    }
+
+    private boolean isFragmentOnSystemBundle() {
+        String fragmentHost = this.bundleManifest.getFragmentHost().getBundleSymbolicName();
+        if (fragmentHost != null) {
+            return fragmentHost.equals(EQUINOX_SYSTEM_BUNDLE_NAME) || fragmentHost.equals(RESERVED_SYSTEM_BUNDLE_NAME);
+        }
+        return false;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void start(AbortableSignal signal) throws DeploymentException {
+        if (!hasStartingParent()) {
+            topLevelStart();
+        }
+        /*
+         * Do not call super.start(signal) as it is essential that the starting event is driven under the bundle
+         * lifecycle event so the listeners see a suitable bundle state.
+         */
+        pushThreadContext();
+        try {
+            driveDoStart(signal);
+        } finally {
+            popThreadContext();
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected void doStart(AbortableSignal signal) throws DeploymentException {
+        this.bundleDriver.start(signal);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void stop() throws DeploymentException {
+        if (this.getBundle().getState() == Bundle.ACTIVE && shouldStop()) {
+            /*
+             * Do not call super.stop() as it is essential that stopping and stopped events are driven under the bundle
+             * lifecycle events so the listeners see a suitable bundle state, however we must ensure that we ignore
+             * requests if the bundle is already stopping to prevent stop being performed more than once.
+             */
+            pushThreadContext();
+            try {
+                doStop();
+            } catch (DeploymentException e) {
+                getStateMonitor().onStopFailed(this, e);
+            } finally {
+                popThreadContext();
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected void doStop() throws DeploymentException {
+        this.bundleDriver.stop();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void uninstall() throws DeploymentException {
+        super.uninstall();
+    }
+
+    @Override
+    protected void doUninstall() throws DeploymentException {
+        this.bundleDriver.uninstall();
+    }
+
+    private boolean isScoped() {
+        return this.getScopeName() != null;
+    }
+
+    private boolean stopBundleIfNecessary() throws DeploymentException {
+        int bundleState = this.getBundle().getState();
+        boolean stopBundle = bundleState == Bundle.STARTING || bundleState == Bundle.ACTIVE;
+
+        if (stopBundle) {
+            stop();
+            return true;
+        }
+        return false;
+    }
+
+    private boolean completeUpdateAndRefresh(boolean startRequired) {
+        try {
+            boolean refreshed = this.bundleDriver.update(bundleManifest, this.artifactStorage.getArtifactFS().getFile());
+            if (refreshed) {
+                if (startRequired) {
+                    BlockingAbortableSignal blockingSignal = new BlockingAbortableSignal(true);
+                    start(blockingSignal);
+                    try {
+                        refreshed = blockingSignal.checkComplete();
+                    } catch (DeploymentException e) {
+                        refreshed = false;
+                    }
+                }
+            }
+            return refreshed;
+        } catch (Exception e) {
+            return false;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean doRefresh() throws DeploymentException {
+        BundleManifest currentBundleManifest;
+
+        synchronized (this.monitor) {
+            currentBundleManifest = this.bundleManifest;
+        }
+
+        BundleManifest newBundleManifest;
+
+        try {
+            newBundleManifest = getManifestFromArtifactFS();
+        } catch (IOException ioe) {
+            throw new DeploymentException("Failed to read new bundle manifest during refresh", ioe);
+        }
+
+        ArtifactIdentity newIdentity = this.identityDeterminer.determineIdentity(this.artifactStorage.getArtifactFS().getFile(), getScopeName());
+
+        if (newIdentity == null) {
+            throw new DeploymentException("Failed to determine new identity during refresh");
+        }
+
+        newIdentity = ArtifactIdentityScoper.scopeArtifactIdentity(newIdentity);
+        if (!isNameAndVersionUnchanged(newIdentity)) {
+            return false;
+        }
+
+        /*
+         * To avoid this module's bundle from being stopped and started by each of update and refresh packages, stop it
+         * if necessary and restart it later if we had to stop it.
+         */
+        boolean bundleStopped = stopBundleIfNecessary();
+
+        synchronized (this.monitor) {
+            this.bundleManifest = newBundleManifest;
+        }
+
+        synchronizeBundleSymbolicNameWithIdentity();
+
+        if (!refreshScope()) {
+            synchronized (this.monitor) {
+                this.bundleManifest = currentBundleManifest;
+            }
+            startIfNecessary(bundleStopped);
+            return false;
+        }
+
+        if (isScoped() && !isExportPackageUnchanged(currentBundleManifest, newBundleManifest)) {
+            this.eventLogger.log(DeployerLogEvents.CANNOT_REFRESH_BUNDLE_AS_SCOPED_AND_EXPORTS_CHANGED, getName(), getVersion());
+            synchronized (this.monitor) {
+                this.bundleManifest = currentBundleManifest;
+            }
+            startIfNecessary(bundleStopped);
+            return false;
+        }
+
+        boolean refreshSuccessful = completeUpdateAndRefresh(bundleStopped);
+
+        if (!refreshSuccessful) {
+            synchronized (this.monitor) {
+                this.bundleManifest = currentBundleManifest;
+            }
+            startIfNecessary(bundleStopped);
+        }
+        return refreshSuccessful;
+    }
+
+    private void startIfNecessary(boolean bundleStopped) throws DeploymentException {
+        if (bundleStopped) {
+            BlockingAbortableSignal signal = new BlockingAbortableSignal(true);
+            start(signal);
+            signal.awaitCompletion(REFRESH_RESTART_WAIT_PERIOD);
+        }
+    }
+
+    private boolean isExportPackageUnchanged(BundleManifest currentBundleManifest, BundleManifest newBundleManifest) {
+        Set<ExportedPackage> previousExportedPackageSet = getExportedPackageSet(currentBundleManifest.getExportPackage().getExportedPackages());
+        Set<ExportedPackage> newExportedPackageSet = getExportedPackageSet(newBundleManifest.getExportPackage().getExportedPackages());
+        return newExportedPackageSet.equals(previousExportedPackageSet);
+    }
+
+    private boolean isNameAndVersionUnchanged(ArtifactIdentity newIdentity) {
+        if (newIdentity.getName().equals(getName()) && newIdentity.getVersion().equals(getVersion())) {
+            return true;
+        }
+
+        this.eventLogger.log(DeployerLogEvents.CANNOT_REFRESH_BUNDLE_IDENTITY_CHANGED, getName(), getVersion(), newIdentity.getName(),
+            newIdentity.getVersion());
+        return false;
+    }
+
+    // TODO DAG - think what to do with shared subgraphs.
+    // If this bundle belongs to a plan, run the subtree of any scoped plan containing the bundle through the refresh
+    // subpipeline.
+    private boolean refreshScope() {
+        boolean refreshed;
+
+        PlanInstallArtifact scopedAncestor = getScopedAncestor();
+
+        if (scopedAncestor != null) {
+            refreshed = scopedAncestor.refreshScope();
+        } else {
+            refreshed = this.refreshHandler.refresh(this);
+        }
+        return refreshed;
+    }
+
+    PlanInstallArtifact getScopedAncestor() {
+        // If the bundle belongs to a scoped plan, that plan may be found by searching up any line of ancestors.
+        List<GraphNode<InstallArtifact>> ancestors = getGraph().getParents();
+
+        while (!ancestors.isEmpty()) {
+            GraphNode<InstallArtifact> ancestor = ancestors.get(0);
+            InstallArtifact ancestorArtifact = ancestor.getValue();
+            PlanInstallArtifact planAncestor = (PlanInstallArtifact) ancestorArtifact;
+            if (planAncestor.isScoped()) {
+                return planAncestor;
+            } else {
+                ancestor = ancestors.get(0);
+                ancestors = ancestor.getParents();
+            }
+        }
+
+        return null;
+    }
+
+    private Set<ExportedPackage> getExportedPackageSet(List<ExportedPackage> exportedPackages) {
+        Set<ExportedPackage> packageExports = new HashSet<ExportedPackage>();
+        for (ExportedPackage exportPackage : exportedPackages) {
+            packageExports.add(exportPackage);
+        }
+        return packageExports;
+    }
+
+    public void deleteEntry(String targetPath) {
+        deleteEntry(getBundleFile(), targetPath);
+        getArtifactFS().getEntry(targetPath).delete();
+    }
+
+    private void deleteEntry(File root, String path) {
+        if (root.isDirectory()) {
+            File f = new File(root, path);
+            if (f.exists() && !f.delete()) {
+                logger.warn("Unable to delete resource at {}", path);
+            }
+        } else {
+            logger.warn("Unable to delete resource in non-directory location at {}", root.getAbsolutePath());
+        }
+    }
+
+    public void updateEntry(URI inputPath, String targetPath) {
+        updateEntry(getBundleFile(), inputPath, targetPath);
+        updateEntry(getArtifactFS().getEntry(targetPath), inputPath);
+    }
+
+    private void updateEntry(ArtifactFSEntry entry, URI inputPath) {
+        doUpdate(inputPath, entry.getOutputStream(), entry.getArtifactFS().getFile().getAbsolutePath() + File.separatorChar + entry.getPath());
+    }
+
+    private void updateEntry(File root, URI inputPath, String targetPath) {
+        try {
+            if (root.isDirectory()) {
+                FileOutputStream out = null;
+                try {
+                    out = new FileOutputStream(new File(root, targetPath));
+                    doUpdate(inputPath, out, targetPath);
+                } finally {
+                    IOUtils.closeQuietly(out);
+                }
+            } else {
+                logger.warn("Unable to update resource in non-directory location at {}", root.getAbsolutePath());
+            }
+        } catch (Exception e) {
+            logger.warn("Unable to update resource at {} with resource at {}", targetPath, inputPath.toASCIIString());
+        }
+    }
+
+    private void doUpdate(URI input, OutputStream output, String targetPath) {
+        try {
+            InputStream in = input.toURL().openStream();
+            FileCopyUtils.copy(in, output);
+        } catch (Exception e) {
+            logger.warn("Unable to update resource at {} with resource at {}", targetPath, input.toASCIIString());
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/scoping/ArtifactIdentityScoper.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/scoping/ArtifactIdentityScoper.java
new file mode 100644
index 0000000..84d33b3
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/scoping/ArtifactIdentityScoper.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal.scoping;
+
+import org.eclipse.virgo.kernel.install.artifact.ArtifactIdentity;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactIdentityDeterminer;
+
+
+/**
+ * <code>ArifactIdentityScoper</code> is used to scope {@link ArtifactIdentity} instances.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Thread-safe.
+ *
+ */
+public class ArtifactIdentityScoper {
+    
+    private static final String SCOPE_SEPARATOR = "-";
+    
+    /**
+     * Scopes the supplied <code>ArtifactIdentity</code>.
+     * 
+     * @param artifactIdentity The <code>ArtifactIdentity</code> to scope
+     * @return The scoped <code>ArtifactIdentity</code>
+     */
+    public static ArtifactIdentity scopeArtifactIdentity(ArtifactIdentity artifactIdentity) {
+        
+        String scopeName = artifactIdentity.getScopeName();
+        
+        if (scopeName != null && !ArtifactIdentityDeterminer.CONFIGURATION_TYPE.equals(artifactIdentity.getType())) {
+            String scopedName = scopeName + SCOPE_SEPARATOR + artifactIdentity.getName();
+            return new ArtifactIdentity(artifactIdentity.getType(), scopedName, artifactIdentity.getVersion(), scopeName);
+        } else {
+            return artifactIdentity;
+        }
+    }
+    
+    /**
+     * Returns the unscoped name of the supplied <code>identity</code>.
+     * @param identity The <code>ArtifactIdentity</code> for which the unscoped name is required
+     * @return The unscoped name
+     */
+    public static String getUnscopedName(ArtifactIdentity identity) {
+        String scopeName = identity.getScopeName();
+        String name = identity.getName();
+
+        if (scopeName != null && name.length() > (scopeName.length() + SCOPE_SEPARATOR.length())) {
+            return name.substring(scopeName.length() + 1);
+        }
+
+        return name;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/scoping/ScopeNameFactory.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/scoping/ScopeNameFactory.java
new file mode 100644
index 0000000..65b476b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/scoping/ScopeNameFactory.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal.scoping;
+
+import org.osgi.framework.Version;
+
+
+/**
+ * A factory for creating scope names.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Thread-safe.
+ *
+ */
+public class ScopeNameFactory {
+    
+    private static final String SCOPE_SEPARATOR = "-";
+    
+    public static String createScopeName(String name, Version version) {
+        String scopeName = name + SCOPE_SEPARATOR + versionToShortString(version);
+        return scopeName;        
+    }
+    
+    private static String versionToShortString(Version version) {
+        String result = version.toString();
+        while (result.endsWith(".0")) {
+            result = result.substring(0, result.length() - 2);
+        }
+        return result;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/scoping/Scoper.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/scoping/Scoper.java
new file mode 100644
index 0000000..8a841b2
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/scoping/Scoper.java
@@ -0,0 +1,421 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal.scoping;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.osgi.framework.Version;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifestFactory;
+import org.eclipse.virgo.util.osgi.manifest.BundleSymbolicName;
+import org.eclipse.virgo.util.osgi.manifest.DynamicImportPackage;
+import org.eclipse.virgo.util.osgi.manifest.DynamicallyImportedPackage;
+import org.eclipse.virgo.util.osgi.manifest.ExportedPackage;
+import org.eclipse.virgo.util.osgi.manifest.FragmentHost;
+import org.eclipse.virgo.util.osgi.manifest.ImportedBundle;
+import org.eclipse.virgo.util.osgi.manifest.ImportedPackage;
+import org.eclipse.virgo.util.osgi.manifest.RequiredBundle;
+
+/**
+ * {@link Scoper} is a utility class for scoping a set of bundles.
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is not thread safe.
+ * 
+ */
+public class Scoper {
+
+    private static final String BUNDLE_SYMBOLIC_NAME_ATTRIBUTE_NAME = "bundle-symbolic-name";
+
+    public static final String SCOPE_SEPARATOR = "-";
+
+    private static final int BUNDLE_MANIFEST_VERSION_FOR_OSGI_R4 = 2;
+
+    private static final String SCOPING_ATTRIBUTE_NAME = "module_scope";
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private final List<BundleManifest> bundleManifests;
+
+    private final String scopeName;
+
+    private final String scopePrefix;
+
+    // Map of unscoped package name to package version for all the packages exported by the bundles.
+    private final Map<String, Version> exportedPackages = new HashMap<String, Version>();
+
+    // Map of unscoped bundle symbolic name to bundle version for all the bundles.
+    private final Map<String, Version> bundles = new HashMap<String, Version>();
+
+    /**
+     * @param bundleManifests the manifests of the bundles to be scoped
+     * @param scopeName the name of the scope to be created
+     */
+    public Scoper(List<BundleManifest> bundleManifests, String scopeName) {
+        this.bundleManifests = bundleManifests;
+        this.scopeName = scopeName;
+        this.scopePrefix = scopeName + "-";
+    }
+
+    /**
+     * Scope the bundles by transforming their metadata. This involves adding a mandatory matching attribute to exports
+     * and any corresponding imports and adding a prefix to each bundle's bundle symbolic name and any corresponding
+     * require bundle statements and matching attributes. The value of the mandatory matching attribute and the prefix
+     * are uniquely determined by the application name and version.
+     * 
+     * Scoping also checks for ambiguities which could lead to unexpected wirings and throws an exception if these
+     * checks fail. Specifically, each package exported by the bundles must be exported only once and no two bundles may
+     * have the same bundle symbolic name.
+     * @throws UnsupportedBundleManifestVersionException 
+     * @throws DuplicateExportException 
+     * @throws DuplicateBundleSymbolicNameException 
+     */
+    public void scope() throws UnsupportedBundleManifestVersionException, DuplicateExportException, DuplicateBundleSymbolicNameException {
+        scopeReferents();
+        scopeReferences();
+    }
+
+    /**
+     * Determine which packages are exported by the bundles and scope these exports and determine the bundles' symbolic
+     * names and scope them.
+     */
+    private void scopeReferents() throws UnsupportedBundleManifestVersionException, DuplicateExportException, DuplicateBundleSymbolicNameException {
+        for (BundleManifest bundleManifest : this.bundleManifests) {
+            scopeBundleReferents(bundleManifest, true);
+        }
+    }
+
+    /**
+     * Scope the referents of the given bundle.
+     * 
+     * @param bundleManifest
+     * @throws UnsupportedBundleManifestVersionException
+     * @throws DuplicateExportException
+     * @throws DuplicateBundleSymbolicNameException
+     */
+    private void scopeBundleReferents(BundleManifest bundleManifest, boolean allowDuplicates) throws UnsupportedBundleManifestVersionException,
+        DuplicateExportException, DuplicateBundleSymbolicNameException {
+        logger.debug("Bundle manifest before scoping:\n{}", bundleManifest);
+
+        // OSGi R4 features are essential for scoping.
+        if (bundleManifest.getBundleManifestVersion() < BUNDLE_MANIFEST_VERSION_FOR_OSGI_R4) {
+
+            throw new UnsupportedBundleManifestVersionException();
+        }
+
+        for (ExportedPackage exportedPackage : bundleManifest.getExportPackage().getExportedPackages()) {
+            scopeExportedPackage(exportedPackage, allowDuplicates);
+        }
+        setModuleScope(bundleManifest);
+        
+        try {            
+            String symbolicName = bundleManifest.getBundleSymbolicName().getSymbolicName();
+            if (symbolicName.startsWith(this.scopeName)) {
+                symbolicName = symbolicName.substring(this.scopeName.length() + 1);
+            }
+            this.bundles.put(symbolicName, bundleManifest.getBundleVersion());
+        } catch (StringIndexOutOfBoundsException e) {
+            throw e;
+        }
+    }
+
+    private void setModuleScope(BundleManifest bundleManifest) {
+        bundleManifest.setModuleScope(this.scopeName);
+    }
+
+    /**
+     * Scope the given package export.
+     * 
+     * @param exportedPackage the package export to be scoped
+     * @param allowDuplicates true if and only if duplicated exports should be allowed
+     */
+    private void scopeExportedPackage(ExportedPackage exportedPackage, boolean allowDuplicates) throws DuplicateExportException,
+        UnsupportedBundleManifestVersionException {
+        exportedPackage.getAttributes().put(SCOPING_ATTRIBUTE_NAME, this.scopeName);
+        exportedPackage.getMandatory().add(SCOPING_ATTRIBUTE_NAME);
+
+        Version packageVersion = exportedPackage.getVersion();
+
+        if (this.exportedPackages.containsKey(exportedPackage.getPackageName())) {
+            if (!allowDuplicates) {
+                diagnoseDuplicateExport(exportedPackage.getPackageName());
+            }
+        } else {
+            this.exportedPackages.put(exportedPackage.getPackageName(), packageVersion);
+        }
+    }
+
+    /**
+     * @param packageName
+     */
+    private void diagnoseDuplicateExport(String packageName) throws DuplicateExportException, UnsupportedBundleManifestVersionException {
+        StringBuffer exporters = new StringBuffer();
+        boolean first = true;
+        for (BundleManifest bundleManifest : this.bundleManifests) {
+            // OSGi R4 features are essential for scoping.
+            if (bundleManifest.getBundleManifestVersion() < BUNDLE_MANIFEST_VERSION_FOR_OSGI_R4) {
+                throw new UnsupportedBundleManifestVersionException();
+            }
+            for (ExportedPackage exportedPackage : bundleManifest.getExportPackage().getExportedPackages()) {
+                if (packageName.equals(exportedPackage.getPackageName())) {
+                    if (!first) {
+                        exporters.append(", ");
+                    }
+                    first = false;
+                    exporters.append(getUnscopedSymbolicName(bundleManifest));
+                    exporters.append(" ");
+                    exporters.append(bundleManifest.getBundleVersion());
+                }
+            }
+        }
+
+        throw new DuplicateExportException(packageName, exporters.toString());
+    }
+
+    /**
+     * Get the bundle symbolic name of the given bundle manifest prior to scoping.
+     * 
+     * @param bundleManifest the bundle manifest
+     * @return the unscoped bundle symbolic name
+     */
+    public static String getUnscopedSymbolicName(BundleManifest bundleManifest) {
+        String symbolicName = null;
+        BundleSymbolicName bundleSymbolicName = bundleManifest.getBundleSymbolicName();
+        if (bundleSymbolicName != null) {
+            symbolicName = bundleSymbolicName.getSymbolicName();
+            String moduleScope = bundleManifest.getModuleScope();
+            if (moduleScope != null) {
+                String scopeName = moduleScope + SCOPE_SEPARATOR;
+                if (symbolicName.startsWith(scopeName)) {
+                    symbolicName = symbolicName.substring(scopeName.length());
+                }
+            }
+        }
+        return symbolicName;
+    }
+
+    public String getUnscopedSymbolicName(String bundleSymbolicName) {
+        String symbolicName = null;
+        if (bundleSymbolicName != null) {
+            symbolicName = bundleSymbolicName;
+            if (symbolicName.startsWith(this.scopePrefix)) {
+                symbolicName = symbolicName.substring(this.scopePrefix.length());
+            }
+        }
+        return symbolicName;
+    }
+
+    public String getScopedSymbolicName(String bundleSymbolicName) {
+        String symbolicName = getUnscopedSymbolicName(bundleSymbolicName);
+        if (this.bundles.containsKey(symbolicName)) {
+            return this.scopePrefix + symbolicName;
+        }
+        return bundleSymbolicName;
+    }
+
+    /**
+     * Scope the corresponding imports and dynamic imports and scope the corresponding require-bundle and imports and
+     * dynamic imports.
+     */
+    private void scopeReferences() {
+        for (BundleManifest bundleManifest : this.bundleManifests) {
+            scopeBundleReferences(bundleManifest);
+        }
+    }
+
+    /**
+     * Scope the references of the given bundle.
+     * 
+     * @param bundleManifest
+     */
+    private void scopeBundleReferences(BundleManifest bundleManifest) {
+        for (ImportedPackage importedPackage : bundleManifest.getImportPackage().getImportedPackages()) {
+            scopeImportedPackage(importedPackage);
+        }
+        scopeDynamicImports(bundleManifest);        
+        scopeImportBundle(bundleManifest);
+        scopeRequireBundle(bundleManifest);
+        scopeFragmentHost(bundleManifest);
+
+        logger.debug("Bundle manifest after scoping:\n{}", bundleManifest);
+    }
+
+	private void scopeDynamicImports(BundleManifest bundleManifest) {
+		DynamicImportPackage unscopedList = BundleManifestFactory.createBundleManifest().getDynamicImportPackage();        
+        List<DynamicallyImportedPackage> dynamicallyImportedPackages = bundleManifest.getDynamicImportPackage().getDynamicallyImportedPackages();
+        for (DynamicallyImportedPackage dynamicallyImportedPackage : dynamicallyImportedPackages) {
+            scopeDynamicallyImportedPackage(dynamicallyImportedPackage);            
+            addUnscopedDynamicallyImportedPackage(unscopedList, dynamicallyImportedPackage);
+        }		
+		dynamicallyImportedPackages.addAll(unscopedList.getDynamicallyImportedPackages());
+	}
+	
+	private void addUnscopedDynamicallyImportedPackage(DynamicImportPackage unscopedList, DynamicallyImportedPackage dynamicallyImportedPackage) {
+		unscopedList.addDynamicallyImportedPackage(dynamicallyImportedPackage.getPackageName());
+        List<DynamicallyImportedPackage> unscopedDynamicallyImportedPackages = unscopedList.getDynamicallyImportedPackages();
+        DynamicallyImportedPackage unscopedDIP = unscopedDynamicallyImportedPackages.get(unscopedDynamicallyImportedPackages.size()-1);
+        Map<String, String> attributes = unscopedDIP.getAttributes();
+        attributes.putAll(dynamicallyImportedPackage.getAttributes());
+        attributes.remove(SCOPING_ATTRIBUTE_NAME);          
+	}
+
+    /**
+     * Scope the given package import.
+     * 
+     * @param importedPackage the package import to be scoped
+     */
+    private void scopeImportedPackage(ImportedPackage importedPackage) {
+        Version exportedVersion = this.exportedPackages.get(importedPackage.getPackageName());
+        if (exportedVersion != null) {
+            VersionRange importVersionRange = importedPackage.getVersion();
+            if (importVersionRange.includes(exportedVersion)) {
+                importedPackage.getAttributes().put(SCOPING_ATTRIBUTE_NAME, this.scopeName);
+                if (importedPackage.getAttributes().containsKey(BUNDLE_SYMBOLIC_NAME_ATTRIBUTE_NAME)) {
+                    String symbolicName = importedPackage.getAttributes().get(BUNDLE_SYMBOLIC_NAME_ATTRIBUTE_NAME);
+                    if (this.bundles.containsKey(symbolicName)) {
+                        importedPackage.getAttributes().put(BUNDLE_SYMBOLIC_NAME_ATTRIBUTE_NAME, this.scopePrefix + symbolicName);
+                    }
+                }
+            } else {
+                logger.warn(
+                    "Import of package '{}' was not scoped to scope '{}' as its version range did not include the version of the scoped export of the package",
+                    importedPackage.getPackageName(), this.scopeName);
+            }
+        }
+    }
+
+    private void scopeDynamicallyImportedPackage(DynamicallyImportedPackage dynamicallyImportedPackage) {
+        dynamicallyImportedPackage.getAttributes().put(SCOPING_ATTRIBUTE_NAME, this.scopeName);
+        if (dynamicallyImportedPackage.getAttributes().containsKey(BUNDLE_SYMBOLIC_NAME_ATTRIBUTE_NAME)) {
+            String symbolicName = dynamicallyImportedPackage.getAttributes().get(BUNDLE_SYMBOLIC_NAME_ATTRIBUTE_NAME);
+            if (this.bundles.containsKey(symbolicName)) {
+                dynamicallyImportedPackage.getAttributes().put(BUNDLE_SYMBOLIC_NAME_ATTRIBUTE_NAME, this.scopePrefix + symbolicName);
+            }
+        }
+    }
+
+    /**
+     * Scope the given require bundle.
+     * 
+     * @param bundleManifest the bundle manifest to be scoped
+     */
+    private void scopeRequireBundle(BundleManifest bundleManifest) {
+        List<RequiredBundle> requiredBundles = bundleManifest.getRequireBundle().getRequiredBundles();
+        for (RequiredBundle requiredBundle : requiredBundles) {
+            String requiredBundleSymbolicName = requiredBundle.getBundleSymbolicName();
+            if (this.bundles.containsKey(requiredBundleSymbolicName)) {
+                Version version = this.bundles.get(requiredBundleSymbolicName);
+                VersionRange requiredVersionRange = requiredBundle.getBundleVersion();
+                if (requiredVersionRange.includes(version)) {
+                    requiredBundle.setBundleSymbolicName(this.scopePrefix + requiredBundleSymbolicName);
+                }
+            }
+        }
+    }
+    
+    /**
+     * Scope the manifest's Import-Bundle header
+     * 
+     * @param bundleManifest the bundle manifest to be scoped
+     */
+    private void scopeImportBundle(BundleManifest bundleManifest) {
+        List<ImportedBundle> importedBundles = bundleManifest.getImportBundle().getImportedBundles();
+        for (ImportedBundle importedBundle : importedBundles) {
+            String importedBundleSymbolicName = importedBundle.getBundleSymbolicName();
+            if (this.bundles.containsKey(importedBundleSymbolicName)) {
+                Version version = this.bundles.get(importedBundleSymbolicName);
+                VersionRange versionRange = importedBundle.getVersion();
+                if (versionRange.includes(version)) {
+                    importedBundle.setBundleSymbolicName(this.scopePrefix + importedBundleSymbolicName);
+                }
+            }
+        }
+    }
+
+    /**
+     * Scope any reference to one of the scoped bundles by a fragment host header.
+     * 
+     * @param bundleManifest the bundle manifest to be scoped for fragment host
+     */
+    private void scopeFragmentHost(BundleManifest bundleManifest) {
+        FragmentHost fragmentHost = bundleManifest.getFragmentHost();
+        String bundleSymbolicName = fragmentHost.getBundleSymbolicName();
+        if (bundleSymbolicName != null) {
+            if (this.bundles.containsKey(bundleSymbolicName)) {
+                fragmentHost.setBundleSymbolicName(this.scopePrefix + bundleSymbolicName);
+            }
+        }
+    }
+
+    public static class DuplicateExportException extends Exception {
+
+        private static final long serialVersionUID = -6672058951941449763L;
+
+        private final String packageName;
+
+        private final String exporters;
+
+        private DuplicateExportException(String packageName, String exporters) {
+            this.packageName = packageName;
+            this.exporters = exporters;
+        }
+
+        public String getPackageName() {
+            return this.packageName;
+        }
+
+        public String getExporters() {
+            return this.exporters;
+        }
+    }
+
+    public static class UnsupportedBundleManifestVersionException extends Exception {
+
+        private static final long serialVersionUID = -282020071571817876L;
+
+        UnsupportedBundleManifestVersionException() {
+            super("Cannot scope a bundle which does not specify a bundle manifest version of at least " + BUNDLE_MANIFEST_VERSION_FOR_OSGI_R4);
+        }
+
+        /**
+         * Returns the lowest bundle manifest version for which scoping is supported
+         * 
+         * @return the lowest bundle manifest version for which scoping is supported
+         */
+        public int getLowestSupportedVersion() {
+            return BUNDLE_MANIFEST_VERSION_FOR_OSGI_R4;
+        }
+    }
+
+    public static class DuplicateBundleSymbolicNameException extends Exception {
+
+        private static final long serialVersionUID = -4228236795055040322L;
+
+        private final String bundleSymbolicName;
+
+        public DuplicateBundleSymbolicNameException(String bundleSymbolicName) {
+            this.bundleSymbolicName = bundleSymbolicName;
+        }
+
+        public String getBundleSymbolicName() {
+            return this.bundleSymbolicName;
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/environment/InstallEnvironment.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/environment/InstallEnvironment.java
new file mode 100644
index 0000000..15b35a7
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/environment/InstallEnvironment.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.environment;
+
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiFramework;
+import org.eclipse.virgo.repository.Repository;
+
+/**
+ * An <code>InstallEnvironment</code> encapsulates the environment in which an install pipeline runs.
+ * 
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations <strong>must</strong> be thread-safe.
+ * 
+ */
+public interface InstallEnvironment {
+
+    /**
+     * Returns the {@link Repository} which the install pipeline should use to satisfy dependencies.
+     * 
+     * @return a <code>Repository</code>
+     */
+    Repository getRepository();
+
+    /**
+     * Returns the <code>InstallLog</code> for this <code>InstallEnvironment</code>.
+     * 
+     * @return the environment's install log.
+     */
+    InstallLog getInstallLog();
+
+    /**
+     * Returns the tree's OSGi state. This a side-state, i.e. manipulating this state will not affect the OSGi
+     * framework's global state. If the state is not available, for instance because the tree is not being installed or
+     * modified, then returns <code>null</code>.
+     * 
+     * @return an OSGi state or <code>null</code>
+     */
+    QuasiFramework getQuasiFramework();
+
+    /**
+     * Delete any resources associated with this {@link InstallEnvironment}.
+     */
+    void destroy();
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/environment/InstallEnvironmentFactory.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/environment/InstallEnvironmentFactory.java
new file mode 100644
index 0000000..d203777
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/environment/InstallEnvironmentFactory.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.environment;
+
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+
+/**
+ * {@link InstallEnvironmentFactory} is used to create {@link InstallEnvironment InstallEnvironments}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations of this interface must be thread safe.
+ * 
+ */
+public interface InstallEnvironmentFactory {
+
+    /**
+     * Returns a new {@link InstallEnvironment}.
+     * 
+     * @param installArtifact the root {@link InstallArtifact} being installed
+     * @return an <code>InstallEnvironment</code>
+     */
+    InstallEnvironment createInstallEnvironment(InstallArtifact installArtifact);
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/environment/InstallLog.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/environment/InstallLog.java
new file mode 100644
index 0000000..9a688b7
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/environment/InstallLog.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.environment;
+
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.medic.eventlog.LogEvent;
+
+/**
+ * An <code>InstallLog</code> is associated with an {@link InstallEnvironment} and can be used to log work that is
+ * performed within that environment for diagnostic purposes.
+ * 
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations <strong>must</strong> be thread-safe.
+ * 
+ */
+public interface InstallLog extends EventLogger {
+
+    /**
+     * Logs an entry in the log from the supplied source. The message may be in String format form with the supplied
+     * arguments being applied to the message
+     * 
+     * @param source The entry's source
+     * @param message The entry's message
+     * @param arguments The message's arguments
+     */
+    void log(Object source, String message, String... arguments);
+
+    /**
+     * Logs the given {@link Throwable}. The implementation logs with three implicit inserts consisting of the type,
+     * name, and version of the root install artifact being processed plus the given additional inserts.
+     * 
+     * @param logEvent the log event message to be issued
+     * @param cause the cause of the failure
+     * @param insert additional inserts for the log event message
+     */
+    void logFailure(LogEvent logEvent, Throwable cause, Object... insert);
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/environment/internal/StandardInstallEnvironment.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/environment/internal/StandardInstallEnvironment.java
new file mode 100644
index 0000000..b4aa90f
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/environment/internal/StandardInstallEnvironment.java
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.environment.internal;
+
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiFramework;
+
+import org.eclipse.virgo.kernel.install.environment.InstallEnvironment;
+import org.eclipse.virgo.kernel.install.environment.InstallLog;
+import org.eclipse.virgo.repository.Repository;
+
+
+/**
+ * {@link StandardInstallEnvironment} is the default {@link InstallEnvironment} implementation.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * This class is thread safe.
+ *
+ */
+final class StandardInstallEnvironment implements InstallEnvironment {
+    
+    private final Repository repository;
+    
+    private final InstallLog installLog;
+    
+    private final QuasiFramework quasiFramework;
+
+    public StandardInstallEnvironment(Repository repository, InstallLog installLog, QuasiFramework quasiFramework) {
+        this.repository = repository;
+        this.installLog = installLog;
+        this.quasiFramework = quasiFramework;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public Repository getRepository() {
+        return this.repository;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public InstallLog getInstallLog() {
+        return this.installLog;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public QuasiFramework getQuasiFramework() {
+        return this.quasiFramework;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public void destroy() {
+        this.quasiFramework.destroy();
+    }
+    
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/environment/internal/StandardInstallEnvironmentFactory.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/environment/internal/StandardInstallEnvironmentFactory.java
new file mode 100644
index 0000000..c2cae45
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/environment/internal/StandardInstallEnvironmentFactory.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.environment.internal;
+
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiFrameworkFactory;
+
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.environment.InstallEnvironment;
+import org.eclipse.virgo.kernel.install.environment.InstallEnvironmentFactory;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+
+/**
+ * {@link StandardInstallEnvironmentFactory} is the default implementation of {@link InstallEnvironmentFactory}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+final class StandardInstallEnvironmentFactory implements InstallEnvironmentFactory {
+
+    private final QuasiFrameworkFactory quasiFrameworkFactory;
+
+    private final EventLogger eventLogger;
+
+    StandardInstallEnvironmentFactory(QuasiFrameworkFactory quasiFrameworkFactory, EventLogger eventLogger) {
+        this.quasiFrameworkFactory = quasiFrameworkFactory;
+        this.eventLogger = eventLogger;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public InstallEnvironment createInstallEnvironment(InstallArtifact installArtifact) {
+        return new StandardInstallEnvironment(null, new StandardInstallLog(this.eventLogger, installArtifact), this.quasiFrameworkFactory.create());
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/environment/internal/StandardInstallLog.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/environment/internal/StandardInstallLog.java
new file mode 100644
index 0000000..4fc4fd0
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/environment/internal/StandardInstallLog.java
@@ -0,0 +1,107 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.environment.internal;
+
+import java.util.Arrays;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.environment.InstallLog;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.medic.eventlog.Level;
+import org.eclipse.virgo.medic.eventlog.LogEvent;
+
+/**
+ * {@link StandardInstallLog} is the default implementation of {@link InstallLog}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+public final class StandardInstallLog implements InstallLog {
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private final EventLogger eventLogger;
+
+    private final InstallArtifact installArtifact;
+
+    public StandardInstallLog(EventLogger eventLogger, InstallArtifact installArtifact) {
+        this.eventLogger = eventLogger;
+        this.installArtifact = installArtifact;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void log(Object source, String message, String... arguments) {
+        doLog(source, message, arguments);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void log(LogEvent event, Object... inserts) {
+        this.eventLogger.log(event, inserts);
+        doLog(event, "event log message issued", stringify(inserts));
+    }
+
+    public void log(String code, Level level, Object... inserts) {
+        throw new UnsupportedOperationException();
+    }
+
+    public void log(String code, Level level, Throwable throwable, Object... inserts) {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void log(LogEvent event, Throwable throwable, Object... inserts) {
+        this.eventLogger.log(event, throwable, inserts);
+        String[] stringInserts = new String[inserts.length + 1];
+        stringInserts[0] = throwable.getMessage();
+        System.arraycopy(stringify(inserts), 0, stringInserts, 1, inserts.length);
+
+        doLog(event, "event log message issued", stringInserts);
+    }
+
+    private void doLog(Object source, String message, String... arguments) {
+        String[] stringInserts = new String[arguments.length + 1];
+        stringInserts[arguments.length] = source.toString();
+        System.arraycopy(arguments, 0, stringInserts, 0, arguments.length);
+        logger.debug(message + " (source '{}')", Arrays.toString(stringInserts));
+    }
+
+    private String[] stringify(Object[] inserts) {
+        String[] strings = new String[inserts.length];
+        for (int i = 0; i < inserts.length; i++) {
+            if (inserts[i] != null) {
+                strings[i] = inserts[i].toString();
+            } else {
+                strings[i] = null;
+            }
+        }
+        return strings;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void logFailure(LogEvent logEvent, Throwable cause, Object... insert) {
+        this.eventLogger.log(logEvent, cause, this.installArtifact.getType(), this.installArtifact.getName(), this.installArtifact.getVersion(), insert);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/Pipeline.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/Pipeline.java
new file mode 100644
index 0000000..8d95d8b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/Pipeline.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.pipeline;
+
+import org.eclipse.virgo.kernel.install.pipeline.stage.PipelineStage;
+
+/**
+ * {@link Pipeline} is a series of pipeline stages used by the kernel to transform artifacts during installation and
+ * update.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+public interface Pipeline extends PipelineStage {
+
+    /**
+     * Adds the given {@link PipelineStage} to the end of this {@link Pipeline}.
+     * <p/>
+     * Adding a stage which is a {@link Pipeline} produces a nested pipeline.
+     * <p/>
+     * Adding a stage that is already in the pipeline is not an error: when the pipeline runs, the stage will run each
+     * time it is encountered.
+     * <p/>
+     * Adding a stage while running a stage of the pipeline is not an error.
+     * <p/>
+     * This method does not check for an invalid pipeline being constructed. For example, nesting a pipeline inside
+     * itself can result in a StackOverflowError when the pipeline runs. As another example, this method may be used to
+     * extend a pipeline indefinitely as it runs and this can eventually throw OutOfMemoryError. If
+     * <code>Pipeline</code> needs to become an external interface, some checks should be added.
+     * 
+     * @param stage the <code>PipeLineStage</code> to add
+     * @return this <code>Pipeline</code> (for method chaining)
+     */
+    Pipeline appendStage(PipelineStage stage);
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/PipelineFactory.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/PipelineFactory.java
new file mode 100644
index 0000000..85208b2
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/PipelineFactory.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.pipeline;
+
+import org.eclipse.virgo.kernel.install.pipeline.stage.PipelineStage;
+
+/**
+ * {@link PipelineFactory} may be used to create {@link Pipeline Pipelines}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations of this interface must be thread safe.
+ * 
+ */
+public interface PipelineFactory {
+
+    /**
+     * Create a {@link Pipeline} with no stages.
+     * 
+     * @return a <code>Pipeline</code>
+     */
+    Pipeline create();
+
+    /**
+     * Create a {@link org.eclipse.virgo.kernel.install.pipeline.internal.CompensatingPipeline CompensatingPipeline} with the given compensation {@link PipelineStage}.
+     * 
+     * @param compensation the PipelineStage to run if a stage of the pipeline throws an exception
+     * @return the <code>CompensatingPipeline</code>
+     */
+    Pipeline createCompensatingPipeline(PipelineStage compensation);
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/internal/CompensatingPipeline.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/internal/CompensatingPipeline.java
new file mode 100644
index 0000000..4243e59
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/internal/CompensatingPipeline.java
@@ -0,0 +1,99 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.pipeline.internal;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.eclipse.virgo.kernel.osgi.framework.UnableToSatisfyBundleDependenciesException;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeployerLogEvents;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.environment.InstallEnvironment;
+import org.eclipse.virgo.kernel.install.pipeline.Pipeline;
+import org.eclipse.virgo.kernel.install.pipeline.stage.PipelineStage;
+import org.eclipse.virgo.util.common.GraphNode;
+
+/**
+ * {@link CompensatingPipeline} is a {@link Pipeline} which runs like any other pipeline but if one of its stages throws
+ * an exception, it runs a compensation <code>PipelineStage</code> and then re-throws the exception.
+ * <p />
+ * For example, consider the following pipeline:
+ * 
+ * <pre>
+ * P = beginX -&gt; X1 -&gt; X2 -&gt; X3 -&gt; endX
+ * </pre>
+ * 
+ * and suppose we need to drive a failure event using a pipeline stage failX when any of X1, X2, X3 throw an exception.
+ * Then we can use a <code>CompensatingPipeline</code> to produce the required behaviour:
+ * 
+ * <pre>
+ * P' = beginX -&gt; CompensatingPipeline(X1 -&gt; X2 -&gt; X3, failX) -&gt; endX
+ * </pre>
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+final class CompensatingPipeline extends StandardPipeline {
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private final PipelineStage compensation;
+
+    /**
+     * Create a {@link CompensatingPipeline} with no pipeline stages and a given compensation stage.
+     * @param compensation stage for compensation
+     */
+    public CompensatingPipeline(PipelineStage compensation) {
+        super();
+        this.compensation = compensation;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected void doProcessGraph(GraphNode<InstallArtifact> installGraph, InstallEnvironment installEnvironment) throws DeploymentException,
+        UnableToSatisfyBundleDependenciesException {
+        try {
+            super.doProcessGraph(installGraph, installEnvironment);
+        } catch (DeploymentException de) {
+            compensate(installGraph, installEnvironment, de);
+            throw de;
+        } catch (UnableToSatisfyBundleDependenciesException utsbde) {
+            compensate(installGraph, installEnvironment, utsbde);
+            throw utsbde;
+        } catch (RuntimeException re) {
+            compensate(installGraph, installEnvironment, re);
+            throw re;
+        }
+    }
+
+    private void compensate(GraphNode<InstallArtifact> installGraph, InstallEnvironment installEnvironment, Exception e) {
+        try {
+            if (!(e instanceof DeploymentException) || !((DeploymentException)e).isDiagnosed()) {
+                installEnvironment.getInstallLog().logFailure(DeployerLogEvents.INSTALL_FAILURE, e);
+            } else {
+                installEnvironment.getInstallLog().logFailure(DeployerLogEvents.INSTALL_FAILURE, null);
+            }
+            this.compensation.process(installGraph, installEnvironment);
+        } catch (Exception ex) {
+            logger.warn(String.format("exception thrown while compensating for '%s'", e.getMessage()), ex);
+        }
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/internal/StandardPipeline.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/internal/StandardPipeline.java
new file mode 100644
index 0000000..f00e86c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/internal/StandardPipeline.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.pipeline.internal;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.environment.InstallEnvironment;
+import org.eclipse.virgo.kernel.install.pipeline.Pipeline;
+import org.eclipse.virgo.kernel.install.pipeline.stage.AbstractPipelineStage;
+import org.eclipse.virgo.kernel.install.pipeline.stage.PipelineStage;
+import org.eclipse.virgo.kernel.osgi.framework.UnableToSatisfyBundleDependenciesException;
+import org.eclipse.virgo.util.common.GraphNode;
+
+/**
+ * {@link StandardPipeline} is the default implementation of {@link Pipeline}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+class StandardPipeline extends AbstractPipelineStage implements Pipeline {
+
+    private final Object monitor = new Object();
+
+    private final List<PipelineStage> stageList = new ArrayList<PipelineStage>();
+
+    /**
+     * {@inheritDoc}
+     */
+    public Pipeline appendStage(PipelineStage stage) {
+        synchronized (this.monitor) {
+            this.stageList.add(stage);
+        }
+        return this;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    protected void doProcessGraph(GraphNode<InstallArtifact> installGraph, InstallEnvironment installEnvironment) throws DeploymentException,
+        UnableToSatisfyBundleDependenciesException {
+        for (int i = 0; i < numStages(); i++) {
+            PipelineStage nextStage;
+            synchronized (this.monitor) {
+                nextStage = this.stageList.get(i);
+            }
+            nextStage.process(installGraph, installEnvironment);
+        }
+    }
+
+    private int numStages() {
+        synchronized (this.monitor) {
+            return this.stageList.size();
+        }
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/internal/StandardPipelineFactory.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/internal/StandardPipelineFactory.java
new file mode 100644
index 0000000..52bb0c8
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/internal/StandardPipelineFactory.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.pipeline.internal;
+
+import org.eclipse.virgo.kernel.install.pipeline.Pipeline;
+import org.eclipse.virgo.kernel.install.pipeline.PipelineFactory;
+import org.eclipse.virgo.kernel.install.pipeline.stage.PipelineStage;
+
+/**
+ * {@link StandardPipelineFactory} is the default implementation of {@link PipelineFactory}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+public class StandardPipelineFactory implements PipelineFactory {
+
+    /**
+     * {@inheritDoc}
+     */
+    public Pipeline create() {
+        return new StandardPipeline();
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public Pipeline createCompensatingPipeline(PipelineStage compensation) {
+        return new CompensatingPipeline(compensation);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/AbstractPipelineStage.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/AbstractPipelineStage.java
new file mode 100644
index 0000000..c60c930
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/AbstractPipelineStage.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.pipeline.stage;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.environment.InstallEnvironment;
+import org.eclipse.virgo.kernel.install.environment.InstallLog;
+import org.eclipse.virgo.kernel.osgi.framework.UnableToSatisfyBundleDependenciesException;
+import org.eclipse.virgo.util.common.GraphNode;
+
+/**
+ * {@link AbstractPipelineStage} is a common base class for {@link PipelineStage} implementations.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+public abstract class AbstractPipelineStage implements PipelineStage {
+
+    /**
+     * {@inheritDoc}
+     */
+    public final void process(GraphNode<InstallArtifact> installGraph, InstallEnvironment installEnvironment) throws DeploymentException,
+        UnableToSatisfyBundleDependenciesException {
+        InstallLog installLog = installEnvironment.getInstallLog();
+        installLog.log(this, "process entry with installGraph '%s'", installGraph.toString());
+        try {
+            doProcessGraph(installGraph, installEnvironment);
+        } catch (DeploymentException de) {
+            installLog.log(this, "process exit with installGraph '%s', exception '%s' thrown", installGraph.toString(), de.toString());
+            throw de;
+        } catch (UnableToSatisfyBundleDependenciesException utsbde) {
+            installLog.log(this, "process exit with installGraph '%s', exception '%s' thrown", installGraph.toString(), utsbde.toString());
+            throw utsbde;
+        } catch (RuntimeException re) {
+            installLog.log(this, "process exit with installGraph '%s', exception '%s' thrown", installGraph.toString(), re.toString());
+            throw re;
+        } 
+        installLog.log(this, "process exit with installGraph '%s'", installGraph.toString());
+    }
+
+    /**
+     * Processes the given install graph in the context of the given {@link InstallEnvironment}. The default
+     * implementation simply calls the <code>doProcessNode</code> method for each node in the graph. If a different
+     * behaviour is required, the subclass should override this method.
+     * 
+     * @param installGraph the graph to be processed
+     * @param installEnvironment the <code>InstallEnvironment</code> in the context of which to do the processing
+     * @throws {@link UnableToSatisfyBundleDependenciesException} if a bundle's dependencies cannot be satisfied
+     * @throws DeploymentException if a failure occurs
+     */
+    protected void doProcessGraph(GraphNode<InstallArtifact> installGraph, InstallEnvironment installEnvironment) throws DeploymentException,
+        UnableToSatisfyBundleDependenciesException {
+        InstallArtifact value = installGraph.getValue();
+        doProcessNode(value, installEnvironment);
+        for (GraphNode<InstallArtifact> child : installGraph.getChildren()) {
+            doProcessGraph(child, installEnvironment);
+        }
+    }
+
+    /**
+     * Processes the given {@link InstallArtifact} in the context of the given {@link InstallEnvironment}. Subclasses
+     * should override this method if they do not override the doProcessGraph method.
+     * 
+     * @param installArtifact the graph node to be processed
+     * @param installEnvironment the <code>InstallEnvironment</code> in the context of which to do the processing
+     * @throws DeploymentException if a failure occurs
+     */
+    protected void doProcessNode(InstallArtifact installArtifact, InstallEnvironment installEnvironment) throws DeploymentException {
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/Operator.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/Operator.java
new file mode 100644
index 0000000..cd52666
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/Operator.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.pipeline.stage;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.environment.InstallEnvironment;
+
+
+/**
+ * {@link Operator} is a kernel extension interface used to perform point-wise operations on install tree nodes.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations of this class must be thread safe.
+ * 
+ */
+public interface Operator {
+
+    /**
+     * Operates on the given {@link InstallArtifact}.
+     * 
+     * @param installArtifact the <code>InstallArtifact</code> to normalize
+     * @param installEnvironment the <code>InstallEnvironment</code>
+     * @throws DeploymentException if the operation fails
+     */
+    void operate(InstallArtifact installArtifact, InstallEnvironment installEnvironment) throws DeploymentException;
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/PipelineStage.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/PipelineStage.java
new file mode 100644
index 0000000..321ab21
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/PipelineStage.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.pipeline.stage;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.environment.InstallEnvironment;
+import org.eclipse.virgo.kernel.install.pipeline.Pipeline;
+import org.eclipse.virgo.kernel.osgi.framework.UnableToSatisfyBundleDependenciesException;
+import org.eclipse.virgo.util.common.GraphNode;
+
+/**
+ * {@link PipelineStage} is a stage of a {@link Pipeline}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations of this interface must be thread safe.
+ * 
+ */
+public interface PipelineStage {
+
+    /**
+     * Pass the given install graph through this pipeline stage.
+     * 
+     * @param installGraph the graph to be processed
+     * @param installEnvironment the processing environment common to all stages in a pipeline
+     * @throws DeploymentException if a failure occurred
+     * @throws UnableToSatisfyBundleDependenciesException if a bundle's dependencies cannot be satisfied
+     */
+    void process(GraphNode<InstallArtifact> installGraph, InstallEnvironment installEnvironment) throws DeploymentException, UnableToSatisfyBundleDependenciesException;
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/resolve/internal/CommitStage.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/resolve/internal/CommitStage.java
new file mode 100644
index 0000000..b36cf4c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/resolve/internal/CommitStage.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.pipeline.stage.resolve.internal;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.environment.InstallEnvironment;
+import org.eclipse.virgo.kernel.install.pipeline.stage.PipelineStage;
+import org.eclipse.virgo.util.common.GraphNode;
+import org.osgi.framework.BundleException;
+
+/**
+ * {@link CommitStage} is a {@link PipelineStage} which commits the changes in the side state.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+public final class CommitStage implements PipelineStage {
+    
+    /**
+     * {@inheritDoc}
+     */
+    public void process(GraphNode<InstallArtifact> installGraph, InstallEnvironment installEnvironment) throws DeploymentException {
+        try {
+            installEnvironment.getQuasiFramework().commit();
+        } catch (BundleException e) {
+            throw new DeploymentException("commit failed", e);
+        }
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/resolve/internal/QuasiInstallStage.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/resolve/internal/QuasiInstallStage.java
new file mode 100644
index 0000000..30a8d4c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/resolve/internal/QuasiInstallStage.java
@@ -0,0 +1,119 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.pipeline.stage.resolve.internal;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+
+import org.eclipse.virgo.kernel.artifact.plan.PlanDescriptor.Provisioning;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.BundleInstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.PlanInstallArtifact;
+import org.eclipse.virgo.kernel.install.environment.InstallEnvironment;
+import org.eclipse.virgo.kernel.install.environment.InstallLog;
+import org.eclipse.virgo.kernel.install.pipeline.stage.PipelineStage;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiBundle;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiFramework;
+import org.eclipse.virgo.util.common.GraphNode;
+import org.eclipse.virgo.util.common.GraphNode.DirectedAcyclicGraphVisitor;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+import org.osgi.framework.BundleException;
+
+/**
+ * {@link QuasiInstallStage} is a {@link PipelineStage} which installs the bundle artifacts of the install graph in the
+ * side state.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+public final class QuasiInstallStage implements PipelineStage {
+
+    /**
+     * {@inheritDoc}
+     */
+    public void process(GraphNode<InstallArtifact> installGraph, InstallEnvironment installEnvironment) throws DeploymentException {
+        QuasiFramework quasiFramework = installEnvironment.getQuasiFramework();
+        installGraph.visit(new InstallVisitor(quasiFramework, installEnvironment.getInstallLog()));
+    }
+
+    private static class InstallVisitor implements DirectedAcyclicGraphVisitor<InstallArtifact> {
+
+        private final QuasiFramework quasiFramework;
+
+        private final InstallLog installLog;
+
+        public InstallVisitor(QuasiFramework quasiFramework, InstallLog installLog) {
+            this.quasiFramework = quasiFramework;
+            this.installLog = installLog;
+        }
+
+        public boolean visit(GraphNode<InstallArtifact> graph) {
+            InstallArtifact installArtifact = graph.getValue();
+            if (installArtifact instanceof BundleInstallArtifact) {
+                Provisioning provisioning = getProvisioning(graph);
+                BundleInstallArtifact bundleInstallArtifact = (BundleInstallArtifact) installArtifact;
+                try {
+                    BundleManifest bundleManifest = bundleInstallArtifact.getBundleManifest();
+                    File location = bundleInstallArtifact.getArtifactFS().getFile();
+                    QuasiBundle quasiBundle = this.quasiFramework.install(location.toURI(), bundleManifest);
+                    quasiBundle.setProvisioning(provisioning);
+                    bundleInstallArtifact.setQuasiBundle(quasiBundle);
+                } catch (IOException e) {
+                    this.installLog.log(bundleInstallArtifact, "failed to read bundle manifest", e.getMessage());
+                    throw new RuntimeException("failed to read bundle manifest", e);
+                } catch (BundleException e) {
+                    this.installLog.log(bundleInstallArtifact, "failed to install bundle in side state", e.getMessage());
+                    throw new RuntimeException("failed to install bundle in side state", e);
+                }
+            }
+            return true;
+        }
+
+        /**
+         * Returns the provisioning behaviour for the given install artifact node. If the artifact has no parents, then
+         * this is AUTO. If the artifact has at least one parent, then its provisioning behaviour is AUTO unless all its
+         * parents are plans with provisioning behaviour DISABLED, in which case its provisioning behaviour is DISABLED.
+         * 
+         * @param artifactGraphNode the {@link GraphNode} of the install artifact
+         * @return the {@link Provisioning} of the given install artifact node
+         */
+        private Provisioning getProvisioning(GraphNode<InstallArtifact> artifactGraphNode) {
+            Provisioning provisioning;
+            List<GraphNode<InstallArtifact>> parents = artifactGraphNode.getParents();
+            if (parents.isEmpty()) {
+                provisioning = Provisioning.AUTO;
+            } else {
+                boolean allParentsDisabled = true;
+                for (GraphNode<InstallArtifact> parent : parents) {
+                    InstallArtifact parentInstallArtifact = parent.getValue();
+                    if (parentInstallArtifact instanceof PlanInstallArtifact) {
+                        if (((PlanInstallArtifact) parentInstallArtifact).getProvisioning() == Provisioning.AUTO) {
+                            allParentsDisabled = false;
+                        }
+                    } else {
+                        allParentsDisabled = false; // in case other kinds of parents are introduced
+                    }
+                }
+                provisioning = allParentsDisabled ? Provisioning.DISABLED : Provisioning.AUTO;
+            }
+            return provisioning;
+        }
+
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/resolve/internal/QuasiResolveStage.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/resolve/internal/QuasiResolveStage.java
new file mode 100644
index 0000000..8040cea
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/resolve/internal/QuasiResolveStage.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.pipeline.stage.resolve.internal;
+
+import java.util.List;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.environment.InstallEnvironment;
+import org.eclipse.virgo.kernel.install.pipeline.stage.PipelineStage;
+import org.eclipse.virgo.kernel.osgi.framework.UnableToSatisfyBundleDependenciesException;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiFramework;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiResolutionFailure;
+import org.eclipse.virgo.util.common.GraphNode;
+
+/**
+ * {@link QuasiResolveStage} is a {@link PipelineStage} which attempts to resolve the side state.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+public final class QuasiResolveStage implements PipelineStage {
+
+    /**
+     * {@inheritDoc}
+     */
+    public void process(GraphNode<InstallArtifact> installGraph, InstallEnvironment installEnvironment) throws DeploymentException,
+        UnableToSatisfyBundleDependenciesException {
+        QuasiFramework quasiFramework = installEnvironment.getQuasiFramework();
+        List<QuasiResolutionFailure> resolutionFailures = quasiFramework.resolve();
+        if (!resolutionFailures.isEmpty()) {
+            QuasiResolutionFailure failure = resolutionFailures.get(0);
+            throw new UnableToSatisfyBundleDependenciesException(failure.getUnresolvedQuasiBundle().getSymbolicName(),
+                failure.getUnresolvedQuasiBundle().getVersion(), failure.getDescription());
+        }
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/resolve/internal/ResolveStage.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/resolve/internal/ResolveStage.java
new file mode 100644
index 0000000..18b17e7
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/resolve/internal/ResolveStage.java
@@ -0,0 +1,102 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.pipeline.stage.resolve.internal;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.BundleInstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.environment.InstallEnvironment;
+import org.eclipse.virgo.kernel.install.pipeline.stage.PipelineStage;
+import org.eclipse.virgo.kernel.osgi.framework.UnableToSatisfyBundleDependenciesException;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiFramework;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiFrameworkFactory;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiResolutionFailure;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.eclipse.virgo.util.common.GraphNode;
+import org.eclipse.virgo.util.common.GraphNode.DirectedAcyclicGraphVisitor;
+import org.osgi.framework.Bundle;
+import org.osgi.service.packageadmin.PackageAdmin;
+
+/**
+ * {@link ResolveStage} is a {@link PipelineStage} which resolves the bundles committed from an install graph in the OSGi
+ * framework.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+@SuppressWarnings("deprecation")
+public final class ResolveStage implements PipelineStage {
+
+    private final PackageAdmin packageAdmin;
+
+    private final QuasiFrameworkFactory quasiFrameworkFactory;
+
+    public ResolveStage(@NonNull PackageAdmin packageAdmin, @NonNull QuasiFrameworkFactory quasiFrameworkFactory) {
+        this.packageAdmin = packageAdmin;
+        this.quasiFrameworkFactory = quasiFrameworkFactory;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void process(GraphNode<InstallArtifact> installGraph, InstallEnvironment installEnvironment) throws DeploymentException,
+        UnableToSatisfyBundleDependenciesException {
+        BundleFinderVisitor visitor = new BundleFinderVisitor();
+        installGraph.visit(visitor);
+        Bundle[] bundles = visitor.getBundles();
+        boolean resolved = this.packageAdmin.resolveBundles(bundles);
+        if (!resolved) {
+            diagnoseResolutionFailure(bundles);
+        }
+    }
+
+    private static class BundleFinderVisitor implements DirectedAcyclicGraphVisitor<InstallArtifact> {
+
+        private final List<Bundle> bundles = new ArrayList<Bundle>();
+
+        public boolean visit(GraphNode<InstallArtifact> graph) {
+            InstallArtifact installArtifact = graph.getValue();
+            if (installArtifact instanceof BundleInstallArtifact) {
+                BundleInstallArtifact bundleInstallArtifact = (BundleInstallArtifact) installArtifact;
+                Bundle bundle = bundleInstallArtifact.getBundle();
+                this.bundles.add(bundle);
+            }
+            return true;
+        }
+
+        public Bundle[] getBundles() {
+            return this.bundles.toArray(new Bundle[0]);
+        }
+
+    }
+
+    private void diagnoseResolutionFailure(Bundle[] bundles) throws UnableToSatisfyBundleDependenciesException {
+        QuasiFramework quasiFramework = this.quasiFrameworkFactory.create();
+        for (Bundle bundle : bundles) {
+            if (bundle.getState() == Bundle.INSTALLED) {
+                List<QuasiResolutionFailure> resolutionFailures = quasiFramework.diagnose(bundle.getBundleId());
+                if (!resolutionFailures.isEmpty()) {
+                    QuasiResolutionFailure failure = resolutionFailures.get(0);
+                    throw new UnableToSatisfyBundleDependenciesException(failure.getUnresolvedQuasiBundle().getSymbolicName(),
+                        failure.getUnresolvedQuasiBundle().getVersion(), failure.getDescription());
+                }
+            }
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/transform/Transformer.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/transform/Transformer.java
new file mode 100644
index 0000000..545831d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/transform/Transformer.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.pipeline.stage.transform;
+
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.environment.InstallEnvironment;
+import org.eclipse.virgo.kernel.install.pipeline.stage.transform.internal.TransformationStage;
+import org.eclipse.virgo.util.common.GraphNode;
+
+
+/**
+ * A <code>Transformer</code> is driven during the {@link TransformationStage} of deployment.
+ * <p />
+ * A <code>Transformer</code> can be contributed to the transformation stage of deployment by
+ * publishing it as an OSGi service.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Implementations <strong>must</strong> be thread-safe.
+ *
+ */
+public interface Transformer {
+    void transform(GraphNode<InstallArtifact> installGraph, InstallEnvironment installEnvironment) throws DeploymentException;
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/transform/internal/BundleInstallArtifactGatheringGraphVisitor.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/transform/internal/BundleInstallArtifactGatheringGraphVisitor.java
new file mode 100644
index 0000000..241b9a0
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/transform/internal/BundleInstallArtifactGatheringGraphVisitor.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.pipeline.stage.transform.internal;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.virgo.kernel.install.artifact.BundleInstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.util.common.GraphNode;
+import org.eclipse.virgo.util.common.GraphNode.DirectedAcyclicGraphVisitor;
+
+public final class BundleInstallArtifactGatheringGraphVisitor implements DirectedAcyclicGraphVisitor<InstallArtifact> {
+
+    private final Set<BundleInstallArtifact> childBundles = new HashSet<BundleInstallArtifact>();
+
+    public boolean visit(GraphNode<InstallArtifact> graph) {
+        InstallArtifact artifact = graph.getValue();
+
+        if (artifact instanceof BundleInstallArtifact) {
+            this.childBundles.add((BundleInstallArtifact) artifact);
+        }
+
+        return true;
+    }
+
+    public Set<BundleInstallArtifact> getChildBundles() {
+        return this.childBundles;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/transform/internal/ScopedPlanIdentifyingGraphVisitor.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/transform/internal/ScopedPlanIdentifyingGraphVisitor.java
new file mode 100644
index 0000000..2a44eb1
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/transform/internal/ScopedPlanIdentifyingGraphVisitor.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.pipeline.stage.transform.internal;
+
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.PlanInstallArtifact;
+import org.eclipse.virgo.util.common.GraphNode;
+import org.eclipse.virgo.util.common.GraphNode.ExceptionThrowingDirectedAcyclicGraphVisitor;
+
+final class ScopedPlanIdentifyingDirectedAcyclicGraphVisitor implements ExceptionThrowingDirectedAcyclicGraphVisitor<InstallArtifact, DeploymentException> {
+
+    private final ScopedPlanInstallArtifactProcessor planProcessor;
+    
+    ScopedPlanIdentifyingDirectedAcyclicGraphVisitor(ScopedPlanInstallArtifactProcessor planProcessor) {
+
+        this.planProcessor = planProcessor;
+    }
+
+    public boolean visit(GraphNode<InstallArtifact> graph) throws DeploymentException {
+        if (isScopedPlan(graph.getValue())) {
+            this.planProcessor.processScopedPlanInstallArtifact(graph);                
+            return false;
+        }
+        return true;
+    }
+
+    private boolean isScopedPlan(InstallArtifact installArtifact) {
+        boolean scopedPlan = false;
+
+        if (installArtifact instanceof PlanInstallArtifact) {
+            scopedPlan = ((PlanInstallArtifact) installArtifact).isScoped();
+        }
+
+        return scopedPlan;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/transform/internal/ScopedPlanInstallArtifactProcessor.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/transform/internal/ScopedPlanInstallArtifactProcessor.java
new file mode 100644
index 0000000..1b3dac0
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/transform/internal/ScopedPlanInstallArtifactProcessor.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.pipeline.stage.transform.internal;
+
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.util.common.GraphNode;
+
+
+/**
+ * A <code>ScopedPlanInstallArtifactProcessor</code> is called by a
+ * {@link ScopedPlanIdentifyingDirectedAcyclicGraphVisitor} for each scoped plan that
+ * it finds.
+ * 
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Implementations <strong>must</strong> be thread-safe.
+ *
+ */
+interface ScopedPlanInstallArtifactProcessor {
+    
+    /**
+     * Process the supplied <code>plan</code>
+     * @param plan the plan to process
+     * @throws DeploymentException if a failure occurs during plan processing
+     */
+    void processScopedPlanInstallArtifact(GraphNode<InstallArtifact> plan) throws DeploymentException;
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/transform/internal/ScopingTransformer.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/transform/internal/ScopingTransformer.java
new file mode 100644
index 0000000..fe4973d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/transform/internal/ScopingTransformer.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.pipeline.stage.transform.internal;
+
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.internal.StandardPlanInstallArtifact;
+import org.eclipse.virgo.kernel.install.environment.InstallEnvironment;
+import org.eclipse.virgo.kernel.install.pipeline.stage.transform.Transformer;
+import org.eclipse.virgo.util.common.GraphNode;
+
+
+/**
+ * A {@link Transformer} implementation that is responsible for scoping
+ * artifacts in an install graph.
+ * 
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Thread-safe.
+ *
+ */
+public class ScopingTransformer implements Transformer, ScopedPlanInstallArtifactProcessor {
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void transform(GraphNode<InstallArtifact> installGraph, InstallEnvironment installEnvironment) throws DeploymentException {
+        ScopedPlanIdentifyingDirectedAcyclicGraphVisitor planIdentifyingVisitor = new ScopedPlanIdentifyingDirectedAcyclicGraphVisitor(this);
+        installGraph.visit(planIdentifyingVisitor);
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void processScopedPlanInstallArtifact(GraphNode<InstallArtifact> planGraph) throws DeploymentException {
+        InstallArtifact value = planGraph.getValue();
+        if (value instanceof StandardPlanInstallArtifact) {
+            ((StandardPlanInstallArtifact)value).scope();
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/transform/internal/SyntheticContextBundleCreatingTransformer.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/transform/internal/SyntheticContextBundleCreatingTransformer.java
new file mode 100644
index 0000000..5db3ad2
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/transform/internal/SyntheticContextBundleCreatingTransformer.java
@@ -0,0 +1,164 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.pipeline.stage.transform.internal;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import java.util.List;
+import java.util.Set;
+import java.util.jar.JarFile;
+
+import org.eclipse.virgo.kernel.artifact.fs.ArtifactFS;
+import org.eclipse.virgo.kernel.artifact.fs.ArtifactFSEntry;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactIdentity;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactIdentityDeterminer;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactStorage;
+import org.eclipse.virgo.kernel.install.artifact.BundleInstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifactGraphFactory;
+import org.eclipse.virgo.kernel.install.artifact.PlanInstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.internal.ArtifactStorageFactory;
+import org.eclipse.virgo.kernel.install.artifact.internal.scoping.ScopeNameFactory;
+import org.eclipse.virgo.kernel.install.environment.InstallEnvironment;
+import org.eclipse.virgo.kernel.install.pipeline.stage.transform.Transformer;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.deployer.api.core.FatalDeploymentException;
+import org.eclipse.virgo.util.common.GraphNode;
+import org.eclipse.virgo.util.io.IOUtils;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifestFactory;
+import org.eclipse.virgo.util.osgi.manifest.ImportBundle;
+import org.osgi.framework.Version;
+
+/**
+ * A {@link Transformer} implementation that examines the install graph and, for each scoped plan found within the graph,
+ * adds a synthetic context bundle to the plan.
+ * 
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ * 
+ */
+final class SyntheticContextBundleCreatingTransformer implements Transformer, ScopedPlanInstallArtifactProcessor {
+
+    private static final int SYNTHETIC_BUNDLE_MANIFEST_VERSION = 2;
+
+    private static final String SYNTHETIC_CONTEXT_SUFFIX = "-synthetic.context";
+
+    private final InstallArtifactGraphFactory installArtifactGraphFactory;
+
+    private final ArtifactStorageFactory artifactStorageFactory;
+
+    SyntheticContextBundleCreatingTransformer(InstallArtifactGraphFactory installArtifactGraphFactory, ArtifactStorageFactory artifactStorageFactory) {
+        this.installArtifactGraphFactory = installArtifactGraphFactory;
+        this.artifactStorageFactory = artifactStorageFactory;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void transform(GraphNode<InstallArtifact> installGraph, InstallEnvironment installEnvironment) throws DeploymentException {
+        installGraph.visit(new ScopedPlanIdentifyingDirectedAcyclicGraphVisitor(this));
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     */
+    public void processScopedPlanInstallArtifact(GraphNode<InstallArtifact> graph) throws DeploymentException {
+        if (!syntheticContextExists(graph)) {
+            Set<BundleInstallArtifact> childBundles = getBundlesInScope(graph);
+
+            PlanInstallArtifact planArtifact = (PlanInstallArtifact) graph.getValue();
+            
+            String scopeName = determineSyntheticContextScopeName(planArtifact);
+            
+            String name = scopeName + SYNTHETIC_CONTEXT_SUFFIX;
+            Version version = planArtifact.getVersion();
+            
+            ArtifactIdentity identity = new ArtifactIdentity(ArtifactIdentityDeterminer.BUNDLE_TYPE, name, version, scopeName);
+                        
+            BundleManifest syntheticContextBundleManifest = createSyntheticContextBundleManifest(identity, childBundles);
+            
+            ArtifactStorage artifactStorage = this.artifactStorageFactory.createDirectoryStorage(identity, name + ".jar");
+            writeSyntheticContextBundle(syntheticContextBundleManifest, artifactStorage.getArtifactFS());
+            
+            GraphNode<InstallArtifact> syntheticContextBundle = this.installArtifactGraphFactory.constructInstallArtifactGraph(
+                identity, artifactStorage, null, null);
+            graph.addChild(syntheticContextBundle);
+        }
+    }
+
+    private boolean syntheticContextExists(GraphNode<InstallArtifact> plan) {
+        PlanInstallArtifact planInstallArtifact = (PlanInstallArtifact) plan.getValue();
+        String syntheticContextBundleSymbolicName = determineSyntheticContextScopeName(planInstallArtifact) + SYNTHETIC_CONTEXT_SUFFIX;
+        List<GraphNode<InstallArtifact>> children = plan.getChildren();
+        for (GraphNode<InstallArtifact> child : children) {
+            if (syntheticContextBundleSymbolicName.equals(child.getValue().getName())) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private Set<BundleInstallArtifact> getBundlesInScope(GraphNode<InstallArtifact> plan) {
+        BundleInstallArtifactGatheringGraphVisitor visitor = new BundleInstallArtifactGatheringGraphVisitor();
+        plan.visit(visitor);
+        return visitor.getChildBundles();
+    }
+
+    private void writeSyntheticContextBundle(BundleManifest syntheticContextBundleManifest, ArtifactFS artifactFS) {                
+        ArtifactFSEntry entry = artifactFS.getEntry(JarFile.MANIFEST_NAME);
+        Writer manifestWriter = new OutputStreamWriter(entry.getOutputStream(), UTF_8);
+        try {
+            syntheticContextBundleManifest.write(manifestWriter);
+        } catch (IOException ioe) {
+            throw new FatalDeploymentException("Failed to write out synthetic context's manifest", ioe);
+        } finally {
+            IOUtils.closeQuietly(manifestWriter);
+        }
+    }
+
+    private BundleManifest createSyntheticContextBundleManifest(ArtifactIdentity identity, Set<BundleInstallArtifact> childBundles) {
+        BundleManifest bundleManifest = BundleManifestFactory.createBundleManifest();
+
+        bundleManifest.setBundleVersion(identity.getVersion());
+        bundleManifest.setBundleManifestVersion(SYNTHETIC_BUNDLE_MANIFEST_VERSION);
+
+        bundleManifest.getBundleSymbolicName().setSymbolicName(identity.getName());
+
+        bundleManifest.setModuleScope(identity.getScopeName());
+
+        addImportForEachChildBundle(bundleManifest, childBundles);
+
+        return bundleManifest;
+    }
+
+    private String determineSyntheticContextScopeName(PlanInstallArtifact plan) {
+        return ScopeNameFactory.createScopeName(plan.getName(), plan.getVersion());        
+    }
+
+    private void addImportForEachChildBundle(BundleManifest bundleManifest, Set<BundleInstallArtifact> childBundles) {
+        ImportBundle importBundle = bundleManifest.getImportBundle();
+
+        for (BundleInstallArtifact bundle : childBundles) {
+            String symbolicName = bundle.getName();
+            importBundle.addImportedBundle(symbolicName);
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/transform/internal/TransformationStage.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/transform/internal/TransformationStage.java
new file mode 100644
index 0000000..4f0ed18
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/transform/internal/TransformationStage.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.pipeline.stage.transform.internal;
+
+import java.util.List;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.environment.InstallEnvironment;
+import org.eclipse.virgo.kernel.install.pipeline.stage.AbstractPipelineStage;
+import org.eclipse.virgo.kernel.install.pipeline.stage.transform.Transformer;
+import org.eclipse.virgo.kernel.osgi.framework.OsgiFrameworkUtils;
+import org.eclipse.virgo.kernel.osgi.framework.OsgiServiceHolder;
+import org.eclipse.virgo.kernel.osgi.framework.UnableToSatisfyBundleDependenciesException;
+import org.eclipse.virgo.util.common.GraphNode;
+import org.osgi.framework.BundleContext;
+
+/**
+ * A pipeline stage that drives {@link Transformer Transformers}. Transformers are retrieved from the OSGi service
+ * registry and are driven in the order defined by their service ranking and service id.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ * 
+ */
+public final class TransformationStage extends AbstractPipelineStage {
+
+    private final BundleContext bundleContext;
+
+    public TransformationStage(BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    protected void doProcessGraph(GraphNode<InstallArtifact> installGraph, InstallEnvironment installEnvironment) throws DeploymentException,
+        UnableToSatisfyBundleDependenciesException {
+        List<OsgiServiceHolder<Transformer>> services = OsgiFrameworkUtils.getServices(this.bundleContext, Transformer.class);
+        for (OsgiServiceHolder<Transformer> transformerHolder : services) {
+            transformerHolder.getService().transform(installGraph, installEnvironment);
+            this.bundleContext.ungetService(transformerHolder.getServiceReference());
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/transform/internal/UserInstalledTaggingTransformer.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/transform/internal/UserInstalledTaggingTransformer.java
new file mode 100644
index 0000000..562100d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/transform/internal/UserInstalledTaggingTransformer.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.pipeline.stage.transform.internal;
+
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.environment.InstallEnvironment;
+import org.eclipse.virgo.kernel.install.pipeline.stage.transform.Transformer;
+import org.eclipse.virgo.util.common.GraphNode;
+
+/**
+ * An implementation of {@link Transformer} that marks an {@link InstallArtifact} as having been user installed. This is
+ * done by setting a property with a key of <code>user.installed</code> and a value of <code>true</code>.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+public class UserInstalledTaggingTransformer implements Transformer {
+
+    private static final String USER_INSTALLED = "user.installed";
+
+    /**
+     * {@inheritDoc}
+     */
+    public void transform(GraphNode<InstallArtifact> installGraph, InstallEnvironment installEnvironment) throws DeploymentException {
+        installGraph.getValue().setProperty(USER_INSTALLED, Boolean.TRUE.toString());
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/visit/Visitor.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/visit/Visitor.java
new file mode 100644
index 0000000..5b0b400
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/visit/Visitor.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.pipeline.stage.visit;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.environment.InstallEnvironment;
+import org.eclipse.virgo.kernel.install.pipeline.stage.Operator;
+
+
+/**
+ * {@link Visitor} is a kernel extension interface used to visit the nodes of an install tree.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations of this class must be thread safe.
+ * 
+ */
+public interface Visitor extends Operator {
+    
+    public interface Visitation {
+        void visit(InstallArtifact installArtifact, InstallEnvironment installEnvironment) throws DeploymentException;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/visit/internal/VisitationStage.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/visit/internal/VisitationStage.java
new file mode 100644
index 0000000..731347e
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/pipeline/stage/visit/internal/VisitationStage.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.pipeline.stage.visit.internal;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.environment.InstallEnvironment;
+import org.eclipse.virgo.kernel.install.pipeline.stage.AbstractPipelineStage;
+import org.eclipse.virgo.kernel.install.pipeline.stage.visit.Visitor;
+import org.eclipse.virgo.kernel.osgi.framework.UnableToSatisfyBundleDependenciesException;
+import org.eclipse.virgo.util.common.GraphNode;
+
+/**
+ * {@link VisitationStage} is is a pipeline stage that drives {@link Visitor Visitors}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+public final class VisitationStage extends AbstractPipelineStage {
+
+    private final Visitor visitation;
+
+    private final boolean preOrder;
+
+    public VisitationStage(Visitor visitation) {
+        this(visitation, true);
+    }
+
+    public VisitationStage(Visitor visitation, boolean preOrder) {
+        this.visitation = visitation;
+        this.preOrder = preOrder;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void doProcessNode(InstallArtifact installArtifact, InstallEnvironment installEnvironment) throws DeploymentException {
+        this.visitation.operate(installArtifact, installEnvironment);
+    }
+
+    @Override
+    protected void doProcessGraph(GraphNode<InstallArtifact> installGraph, InstallEnvironment installEnvironment) throws DeploymentException,
+        UnableToSatisfyBundleDependenciesException {
+        if (this.preOrder) {
+            super.doProcessGraph(installGraph, installEnvironment);
+        } else {
+            // Traverse in postorder.
+            InstallArtifact value = installGraph.getValue();
+            for (GraphNode<InstallArtifact> child : installGraph.getChildren()) {
+                doProcessGraph(child, installEnvironment);
+            }
+            doProcessNode(value, installEnvironment);
+        }
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/management/ManagementExporter.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/management/ManagementExporter.java
new file mode 100644
index 0000000..660fce8
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/management/ManagementExporter.java
@@ -0,0 +1,101 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.management;
+
+import java.lang.management.ManagementFactory;
+
+import javax.management.MBeanServer;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.DisposableBean;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.context.ApplicationContext;
+
+/**
+ * Exports an object for management. It is useful to keep a handle to this exporter in order to {@link #unExport()} the
+ * object passed in. In the case where this class is created as part of a Spring bean definition, the object will be
+ * automatically exported and unExported in line with the lifecycle of the {@link ApplicationContext};
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ * 
+ * @param <T> The type of the object to export for management
+ * 
+ */
+public class ManagementExporter<T> implements InitializingBean, DisposableBean {
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private final MBeanServer server = ManagementFactory.getPlatformMBeanServer();
+
+    private final T object;
+
+    private final ObjectName name;
+
+    /**
+     * Create a {@link ManagementExporter}
+     * 
+     * @param object The object to export
+     * @param name The name to export the object to
+     */
+    public ManagementExporter(T object, String name) {
+        this.object = object;
+        this.name = createObjectName(name);
+    }
+
+    private ObjectName createObjectName(String name) {
+        try {
+            return new ObjectName(name);
+        } catch (MalformedObjectNameException e) {
+            throw new RuntimeException("Could not convert String '" + name + "' to ObjectName", e);
+        }
+    }
+
+    /**
+     * Export the object
+     */
+    public void export() {
+        afterPropertiesSet();
+    }
+
+    /**
+     * Unexport the object
+     */
+    public void unExport() {
+        destroy();
+    }
+
+    public void afterPropertiesSet() {
+        try {
+            logger.debug("Registering object {} with name {} for management", object, name);
+            server.registerMBean(object, name);
+        } catch (Exception e) {
+            logger.error("Unable to register object {} with name {} for management", object, name);
+            throw new RuntimeException(e);
+        }
+    }
+
+    public void destroy() {
+        try {
+            logger.debug("Unregistering bean {} with name {} from management", object, name);
+            server.unregisterMBean(name);
+        } catch (Exception e) {
+            logger.warn("Unable to unregister bean {} with name {} from management", object, name);
+        }
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/management/SystemDump.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/management/SystemDump.java
new file mode 100644
index 0000000..3182c7a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/management/SystemDump.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.management;
+
+import javax.management.MXBean;
+
+/**
+ * <p>
+ * Defines the operations available on the exported control for generation dumps on demand
+ * </p>
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Implementations of this class should be thread safe
+ *
+ */
+@MXBean
+public interface SystemDump {
+
+    /**
+     * Generate a system dump now, must not require or wait for any exception to be thrown.
+     */
+    public void generateDump();
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/management/internal/StandardSystemDump.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/management/internal/StandardSystemDump.java
new file mode 100644
index 0000000..c6a530d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/management/internal/StandardSystemDump.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.management.internal;
+
+import org.eclipse.virgo.kernel.management.SystemDump;
+import org.eclipse.virgo.medic.dump.DumpGenerator;
+
+/**
+ * 
+ * This class is an MBean allowing the system state to be dumped out on demand. Standard implementation of
+ * <code>DumpControl</code>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe
+ * 
+ */
+public class StandardSystemDump implements SystemDump {
+
+    private final DumpGenerator dumpGenerator;
+
+    public StandardSystemDump(DumpGenerator dumpGenerator) {
+        this.dumpGenerator = dumpGenerator;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void generateDump() {
+        this.dumpGenerator.generateDump("manual");
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/management/internal/system/AbstractMultiBeanSystemManagementExporter.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/management/internal/system/AbstractMultiBeanSystemManagementExporter.java
new file mode 100644
index 0000000..a1f6072
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/management/internal/system/AbstractMultiBeanSystemManagementExporter.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.management.internal.system;
+
+import java.lang.management.ManagementFactory;
+import java.util.List;
+
+import javax.management.MBeanServer;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * A base implementation of the {@SystemManagementExporter} interface that allows you to
+ * export multiple beans in an automated fashion with consistent naming.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe. All sub-implementations should be threadsafe as well.
+ * 
+ * @param <T> Type of beans exported
+ */
+public abstract class AbstractMultiBeanSystemManagementExporter<T> implements SystemManagementExporter {
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private final MBeanServer server = ManagementFactory.getPlatformMBeanServer();
+
+    public void register(String managementDomain) {
+        for (T bean : getBeans()) {
+            try {
+                server.registerMBean(bean, getObjectName(managementDomain, bean));
+            } catch (Exception e) {
+                logger.warn("Unable to register system information {} for management", getName(bean));
+            }
+        }
+    }
+
+    public void unregister(String managementDomain) {
+        for (T bean : getBeans()) {
+            try {
+                server.unregisterMBean(getObjectName(managementDomain, bean));
+            } catch (Exception e) {
+                logger.warn("Unable to unregister system information {} from management", getName(bean));
+            }
+        }
+    }
+
+    abstract List<T> getBeans();
+
+    abstract ObjectName getObjectName(String managementDomain, T bean) throws MalformedObjectNameException, NullPointerException;
+
+    abstract String getName(T bean);
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/management/internal/system/AbstractSystemManagementExporter.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/management/internal/system/AbstractSystemManagementExporter.java
new file mode 100644
index 0000000..471a463
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/management/internal/system/AbstractSystemManagementExporter.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.management.internal.system;
+
+import java.lang.management.ManagementFactory;
+
+import javax.management.MBeanServer;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * A base implementation of the {@SystemManagementExporter} interface that allows you to
+ * export a single bean in an automated fashion with consistent naming.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.  All sub-implementations should be threadsafe as well.
+ * 
+ * @param <T> Type of bean exported
+ */
+public abstract class AbstractSystemManagementExporter<T> implements SystemManagementExporter {
+
+    private static final String OBJECT_NAME_PATTERN = "%s:category=System Information,type=%s";
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private final MBeanServer server = ManagementFactory.getPlatformMBeanServer();
+
+    public void register(String managementDomain) {
+        try {
+            server.registerMBean(getBean(), getObjectName(managementDomain));
+        } catch (Exception e) {
+            logger.warn("Unable to register system information {} for management", getName());
+        }
+    }
+
+    public void unregister(String managementDomain) {
+        try {
+            server.unregisterMBean(getObjectName(managementDomain));
+        } catch (Exception e) {
+            logger.warn("Unable to unregister system information {} from management", getName());
+        }
+    }
+
+    private ObjectName getObjectName(String managementDomain) throws MalformedObjectNameException, NullPointerException {
+        return new ObjectName(String.format(OBJECT_NAME_PATTERN, managementDomain, getName()));
+    }
+
+    abstract T getBean();
+
+    abstract String getName();
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/management/internal/system/ClassLoadingSystemManagementExporter.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/management/internal/system/ClassLoadingSystemManagementExporter.java
new file mode 100644
index 0000000..722992e
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/management/internal/system/ClassLoadingSystemManagementExporter.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.management.internal.system;
+
+import java.lang.management.ClassLoadingMXBean;
+import java.lang.management.ManagementFactory;
+
+/**
+ * An implementation that exports the ClassLoading bean.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Threadsafe.
+ *
+ */
+public class ClassLoadingSystemManagementExporter extends AbstractSystemManagementExporter<ClassLoadingMXBean> {
+
+	private static final String CLASS_LOADING = "Class Loading";
+
+	@Override
+	ClassLoadingMXBean getBean() {
+		return ManagementFactory.getClassLoadingMXBean();
+	}
+
+	@Override
+	String getName() {
+		return CLASS_LOADING;
+	}
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/management/internal/system/EnvironmentVariablesSystemManagementExporter.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/management/internal/system/EnvironmentVariablesSystemManagementExporter.java
new file mode 100644
index 0000000..2732829
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/management/internal/system/EnvironmentVariablesSystemManagementExporter.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.management.internal.system;
+
+import java.util.Map;
+
+import javax.management.Attribute;
+import javax.management.AttributeList;
+import javax.management.AttributeNotFoundException;
+import javax.management.DynamicMBean;
+import javax.management.InvalidAttributeValueException;
+import javax.management.MBeanAttributeInfo;
+import javax.management.MBeanConstructorInfo;
+import javax.management.MBeanException;
+import javax.management.MBeanInfo;
+import javax.management.MBeanNotificationInfo;
+import javax.management.MBeanOperationInfo;
+import javax.management.ReflectionException;
+
+/**
+ * An implementation that exports the starting environment variables.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Threadsafe.
+ *
+ */
+public class EnvironmentVariablesSystemManagementExporter extends
+        AbstractSystemManagementExporter<EnvironmentVariablesSystemManagementExporter.EnvironmentVariablesMBean> {
+
+	private static final String ENVIRONMENT_VARIABLES = "Environment Variables";
+
+	@Override
+	EnvironmentVariablesMBean getBean() {
+		return new EnvironmentVariablesMBean();
+	}
+
+	@Override
+	String getName() {
+		return ENVIRONMENT_VARIABLES;
+	}
+
+	public /*TODO: was private but Eclipse 3.5 objected */ static class EnvironmentVariablesMBean implements DynamicMBean {
+
+		private final Map<String, String> environmentVariables = System.getenv();
+
+		public Object getAttribute(String name) {
+			return environmentVariables.get(name);
+		}
+
+		public AttributeList getAttributes(String[] names) {
+			AttributeList attributeList = new AttributeList();
+			for (String name : names) {
+				attributeList.add(new Attribute(name, getAttribute(name)));
+			}
+			return attributeList;
+		}
+
+		public MBeanInfo getMBeanInfo() {
+			MBeanAttributeInfo[] infos = new MBeanAttributeInfo[environmentVariables.size()];
+
+			int i = 0;
+			for (String name : environmentVariables.keySet()) {
+				infos[i++] = new MBeanAttributeInfo(name, "java.lang.String", "", true, false, false);
+			}
+
+			return new MBeanInfo(this.getClass().getCanonicalName(), "", infos, new MBeanConstructorInfo[0], new MBeanOperationInfo[0],
+			        new MBeanNotificationInfo[0]);
+		}
+
+		public Object invoke(String method, Object[] arguments, String[] argumentTypes) throws MBeanException, ReflectionException {
+			throw new UnsupportedOperationException();
+		}
+
+		public void setAttribute(Attribute attribute) throws AttributeNotFoundException, InvalidAttributeValueException, MBeanException,
+		        ReflectionException {
+			throw new UnsupportedOperationException();
+		}
+
+		public AttributeList setAttributes(AttributeList attributes) {
+			throw new UnsupportedOperationException();
+		}
+
+	}
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/management/internal/system/GarbageCollectorSystemManagementExporter.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/management/internal/system/GarbageCollectorSystemManagementExporter.java
new file mode 100644
index 0000000..76f42fe
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/management/internal/system/GarbageCollectorSystemManagementExporter.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.management.internal.system;
+
+import java.lang.management.GarbageCollectorMXBean;
+import java.lang.management.ManagementFactory;
+import java.util.List;
+
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+
+/**
+ * An implementation that exports the Garbage Collector beans.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Threadsafe.
+ *
+ */
+public class GarbageCollectorSystemManagementExporter extends AbstractMultiBeanSystemManagementExporter<GarbageCollectorMXBean> {
+
+	private static final String OBJECT_NAME_PATTERN = "%s:category=System Information,type=Garbage Collector,name=%s";
+
+	@Override
+	List<GarbageCollectorMXBean> getBeans() {
+		return ManagementFactory.getGarbageCollectorMXBeans();
+	}
+
+	@Override
+	ObjectName getObjectName(String managementDomain, GarbageCollectorMXBean bean) throws MalformedObjectNameException, NullPointerException {
+		return new ObjectName(String.format(OBJECT_NAME_PATTERN, managementDomain, getName(bean)));
+	}
+
+	@Override
+	String getName(GarbageCollectorMXBean bean) {
+		return bean.getName();
+	}
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/management/internal/system/JmxSystemExporter.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/management/internal/system/JmxSystemExporter.java
new file mode 100644
index 0000000..686845e
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/management/internal/system/JmxSystemExporter.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.management.internal.system;
+
+import java.util.Set;
+
+import org.osgi.framework.BundleContext;
+
+public class JmxSystemExporter {
+
+	private final String managementDomain;
+	
+	private final Set<SystemManagementExporter> exporters;
+	
+	public JmxSystemExporter(BundleContext context, Set<SystemManagementExporter> exporters) {
+		this.managementDomain = context.getProperty("org.eclipse.virgo.kernel.management.domain");
+		this.exporters = exporters;
+	}
+
+	public void initialize() {
+		for (SystemManagementExporter exporter : exporters) {
+			exporter.register(managementDomain);
+		}
+	}
+
+	public void destroy() {
+		for (SystemManagementExporter exporter : exporters) {
+			exporter.unregister(managementDomain);
+		}
+	}
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/management/internal/system/MemoryPoolSystemManagementExporter.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/management/internal/system/MemoryPoolSystemManagementExporter.java
new file mode 100644
index 0000000..a288f75
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/management/internal/system/MemoryPoolSystemManagementExporter.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.management.internal.system;
+
+import java.lang.management.ManagementFactory;
+import java.lang.management.MemoryPoolMXBean;
+import java.util.List;
+
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+
+/**
+ * An implementation that exports the Memory Pool beans
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Threadsafe.
+ *
+ */
+public class MemoryPoolSystemManagementExporter extends AbstractMultiBeanSystemManagementExporter<MemoryPoolMXBean> {
+
+	private static final String OBJECT_NAME_PATTERN = "%s:category=System Information,type=Memory Pool,name=%s";
+
+	@Override
+	List<MemoryPoolMXBean> getBeans() {
+		return ManagementFactory.getMemoryPoolMXBeans();
+	}
+
+	@Override
+	ObjectName getObjectName(String managementDomain, MemoryPoolMXBean bean) throws MalformedObjectNameException, NullPointerException {
+		return new ObjectName(String.format(OBJECT_NAME_PATTERN, managementDomain, getName(bean)));
+	}
+
+	@Override
+	String getName(MemoryPoolMXBean bean) {
+		return bean.getName();
+	}
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/management/internal/system/MemorySystemManagementExporter.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/management/internal/system/MemorySystemManagementExporter.java
new file mode 100644
index 0000000..f09d3a1
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/management/internal/system/MemorySystemManagementExporter.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.management.internal.system;
+
+import java.lang.management.ManagementFactory;
+import java.lang.management.MemoryMXBean;
+
+/**
+ * An implementation that exports the Memory bean
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Threadsafe.
+ *
+ */
+public class MemorySystemManagementExporter extends AbstractSystemManagementExporter<MemoryMXBean> {
+
+	private static final String MEMORY = "Memory";
+
+	@Override
+    MemoryMXBean getBean() {
+	    return ManagementFactory.getMemoryMXBean();
+    }
+
+	@Override
+    String getName() {
+	    return MEMORY;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/management/internal/system/OperatingSystemManagementExporter.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/management/internal/system/OperatingSystemManagementExporter.java
new file mode 100644
index 0000000..f8707f4
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/management/internal/system/OperatingSystemManagementExporter.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.management.internal.system;
+
+import java.lang.management.ManagementFactory;
+import java.lang.management.OperatingSystemMXBean;
+
+/**
+ * An implementation that exports the Operating System bean
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Threadsafe.
+ * 
+ */
+public class OperatingSystemManagementExporter extends AbstractSystemManagementExporter<OperatingSystemMXBean> {
+
+	private static final String OPERATING_SYSTEM = "Operating System";
+
+	@Override
+	OperatingSystemMXBean getBean() {
+		return ManagementFactory.getOperatingSystemMXBean();
+	}
+
+	@Override
+	String getName() {
+		return OPERATING_SYSTEM;
+	}
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/management/internal/system/RuntimeSystemManagementExporter.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/management/internal/system/RuntimeSystemManagementExporter.java
new file mode 100644
index 0000000..c3251c2
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/management/internal/system/RuntimeSystemManagementExporter.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.management.internal.system;
+
+import java.lang.management.ManagementFactory;
+import java.lang.management.RuntimeMXBean;
+
+/**
+ * An implementation that exports the Runtime bean
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Threadsafe.
+ *
+ */
+public class RuntimeSystemManagementExporter extends AbstractSystemManagementExporter<RuntimeMXBean> {
+
+	private static final String RUNTIME = "Runtime";
+	
+	@Override
+    RuntimeMXBean getBean() {
+	    return ManagementFactory.getRuntimeMXBean();
+    }
+
+	@Override
+    String getName() {
+	    return RUNTIME;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/management/internal/system/SystemManagementExporter.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/management/internal/system/SystemManagementExporter.java
new file mode 100644
index 0000000..2ca73ff
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/management/internal/system/SystemManagementExporter.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.management.internal.system;
+
+/**
+ * An interface that encapsulates exporting beans for system management.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Implementations should be thread safe.
+ *
+ */
+public interface SystemManagementExporter {
+
+	void register(String managementDomain);
+	
+	void unregister(String managementDomain);
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/management/internal/system/ThreadingSystemManagementExporter.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/management/internal/system/ThreadingSystemManagementExporter.java
new file mode 100644
index 0000000..e5f97e8
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/management/internal/system/ThreadingSystemManagementExporter.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.management.internal.system;
+
+import java.lang.management.ManagementFactory;
+import java.lang.management.ThreadMXBean;
+
+/**
+ * An implementation that exports the Thread bean
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Threadsafe
+ *
+ */
+public class ThreadingSystemManagementExporter extends AbstractSystemManagementExporter<ThreadMXBean> {
+
+	private static final String THREADING = "Threading";
+
+	@Override
+    ThreadMXBean getBean() {
+	    return ManagementFactory.getThreadMXBean();
+    }
+
+	@Override
+    String getName() {
+	    return THREADING;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/module/Component.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/module/Component.java
new file mode 100644
index 0000000..7e263c4
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/module/Component.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.module;
+
+/**
+ * {@link Component} is an abstraction of a Spring bean which is not bound to Spring types.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread safe.
+ * 
+ */
+public interface Component {
+    
+    /**
+     * Returns this component's name.
+     * 
+     * @return the component name
+     */
+    String getName();
+    
+    /**
+     * Returns this component's concrete type as a class name.
+     * 
+     * @return the name of the component's type
+     */
+    String getType();
+    
+    /**
+     * Returns whether this component is a prototype.
+     * 
+     * @return <code>true</code> if and only if this component is a prototype
+     */
+    boolean isPrototype();
+    
+    /**
+     * Returns whether this component is a singleton.
+     * 
+     * @return <code>true</code> if and only if this component is a singleton
+     */
+    boolean isSingleton();
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/module/ComponentClassLoadingException.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/module/ComponentClassLoadingException.java
new file mode 100644
index 0000000..b7d8c8b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/module/ComponentClassLoadingException.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.module;
+
+/**
+ * {@link ComponentClassLoadingException} is thrown when a bean could not be created since its class cannot be loaded.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread safe.
+ * 
+ */
+public final class ComponentClassLoadingException extends ComponentException {
+
+    private static final long serialVersionUID = 8914671915110743419L;
+
+    private final String beanClassName;
+
+    private final ClassLoader classLoader;
+
+    public ComponentClassLoadingException(String beanName, Throwable cause, String beanClassName, ClassLoader classLoader) {
+        super(beanName, cause);
+        this.beanClassName = beanClassName;
+        this.classLoader = classLoader;
+    }
+
+    public String getBeanClassName() {
+        return beanClassName;
+    }
+
+    public ClassLoader getClassLoader() {
+        return classLoader;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/module/ComponentException.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/module/ComponentException.java
new file mode 100644
index 0000000..2b89fce
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/module/ComponentException.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.module;
+
+/**
+ * {@link ComponentException} is thrown when a bean could not be created. <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread safe.
+ * 
+ */
+public abstract class ComponentException extends Exception {
+
+    private static final long serialVersionUID = 2389586771459082654L;
+
+    private final String beanName;
+
+    /**
+     * Construct a {@link ComponentException} with the given bean name caused by the given exception.
+     * 
+     * @param beanName the name of the bean that could not be created
+     * @param cause the exception used to construct this exception
+     */
+    public ComponentException(String beanName, Throwable cause) {
+        super("Could not create bean '" + beanName + "'", cause);
+        this.beanName = beanName;
+    }
+
+    /**
+     * @return the name of the bean that could not be created.
+     */
+    public String getBeanName() {
+        return beanName;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/module/InvalidComponentPropertyException.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/module/InvalidComponentPropertyException.java
new file mode 100644
index 0000000..26e0aec
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/module/InvalidComponentPropertyException.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.module;
+
+
+/**
+ * {@link InvalidComponentPropertyException} is thrown when a bean could not be created since the bean does have a particular
+ * property. <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread safe.
+ * 
+ */
+public final class InvalidComponentPropertyException extends ComponentException {
+
+    private static final long serialVersionUID = 6920347784034413774L;
+
+    private final String propertyName;
+
+    private final Class<?> beanClass;
+
+    public InvalidComponentPropertyException(String beanName, Throwable cause, String propertyName, Class<?> beanClass) {
+        super(beanName, cause);
+        this.propertyName = propertyName;
+        this.beanClass = beanClass;
+    }
+
+    public String getPropertyName() {
+        return propertyName;
+    }
+
+    public Class<?> getBeanClass() {
+        return beanClass;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/module/KernelModuleContextAccessorFactory.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/module/KernelModuleContextAccessorFactory.java
new file mode 100644
index 0000000..fd9bc5a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/module/KernelModuleContextAccessorFactory.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.module;
+
+import org.eclipse.virgo.kernel.module.internal.KernelModuleContextAccessor;
+
+/**
+ * {@link KernelModuleContextAccessorFactory} is used to construct {@link ModuleContextAccessor} instances for the
+ * kernel.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread safe.
+ */
+public class KernelModuleContextAccessorFactory {
+    
+    public static ModuleContextAccessor create() {
+        return new KernelModuleContextAccessor();
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/module/ModuleContext.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/module/ModuleContext.java
new file mode 100644
index 0000000..ba31811
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/module/ModuleContext.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.module;
+
+/**
+ * {@link ModuleContext} is the kernel standard interface to application contexts. Its purpose is to isolate the kernel
+ * and server code from Spring DM and Spring application context related types which vary by Spring DM and Spring
+ * release and which are multiply loaded.
+ * 
+ * Eventually, this interface should be able to extend an OSGi standard ModuleContext type. For this reason, this
+ * interface talks about 'components' rather than 'beans'.
+ * 
+ */
+public interface ModuleContext {
+    
+    /**
+     * Return a user-friendly name for this {@link ModuleContext}.
+     * 
+     * @return a user-friendly name for this <code>ModuleContext</code>
+     */
+    String getDisplayName();
+    
+    /**
+     * Return the names of all the named components in this <code>ModuleContext</code>.
+     * 
+     * @return an array of component names in this <code>ModuleContext</code>
+     */
+    String[] getComponentNames();
+
+    /**
+     * Return the component instance with the given name.
+     * @param componentName the name of the component to retrieve
+     * @return an instance of the component
+     * @throws NoSuchComponentException if the module does not contain a component with the given name
+     */
+    Component getComponent(String componentName) throws NoSuchComponentException;
+
+    /**
+     * Return the application context underpinning this <code>ModuleContext</code>. <p /> This method must be used with
+     * extreme caution. Any attempt to cast the return value may result in a class cast exception if the wrong type is
+     * used.
+     * 
+     * @return the <code>ApplicationContext</code> underpinning this <code>ModuleContext</code>
+     */
+    Object getApplicationContext();
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/module/ModuleContextAccessor.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/module/ModuleContextAccessor.java
new file mode 100644
index 0000000..49a16be
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/module/ModuleContextAccessor.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.module;
+
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.osgi.framework.Bundle;
+
+
+/**
+ * {@link ModuleContextAccessor} is the kernel standard interface to for accessing {@link ModuleContext ModuleContexts}.
+ * 
+ */
+public interface ModuleContextAccessor {
+
+    /**
+     * Returns the {@link ModuleContext} associated with the given {@link Bundle} or <code>null</code> if there is no such <code>ModuleContext</code>.
+     * 
+     * @param bundle the <code>Bundle</code> whose <code>ModuleContext</code> is required
+     * @return a <code>ModuleContext</code> or <code>null</code> if there is no <code>ModuleContext</code> associated with the given <code>Bundle</code>
+     */
+    ModuleContext getModuleContext(@NonNull Bundle bundle);
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/module/ModuleContextEvent.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/module/ModuleContextEvent.java
new file mode 100644
index 0000000..2475fe1
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/module/ModuleContextEvent.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.module;
+
+import org.osgi.framework.Bundle;
+
+
+/**
+ * {@link ModuleContextEvent} is the root of a hierarchy of events related to {@link ModuleContext ModuleContexts}.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * This class is thread safe.
+ *
+ */
+public abstract class ModuleContextEvent {
+    
+    private final ModuleContext moduleContext;
+    
+    private final Bundle bundle;
+
+    protected ModuleContextEvent(ModuleContext moduleContext, Bundle bundle) {
+        this.moduleContext = moduleContext;
+        this.bundle = bundle;
+    }
+
+    
+    /**
+     * Get the {@link ModuleContext} associated with this event.
+     * 
+     * @return the <code>ModuleContext</code> associated with this event 
+     */
+    public ModuleContext getModuleContext() {
+        return moduleContext;
+    }
+
+    
+    /**
+     * Get the {@link Bundle} associated with this event.
+     * 
+     * @return the <code>Bundle</code> associated with this event 
+     */
+    public Bundle getBundle() {
+        return bundle;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/module/ModuleContextEventListener.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/module/ModuleContextEventListener.java
new file mode 100644
index 0000000..8cde73d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/module/ModuleContextEventListener.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.module;
+
+/**
+ * {@link ModuleContextEventListener} is used to listen for events relating to {@link ModuleContext ModuleContexts}. <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations of this interface must be thread safe.
+ * 
+ */
+public interface ModuleContextEventListener {
+    
+    /**
+     * Notify this listener of the given {@link ModuleContextEvent}.
+     * 
+     * @param moduleContextEvent the {@link ModuleContextEventListener}
+     */
+    void onEvent(ModuleContextEvent moduleContextEvent);
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/module/ModuleContextEventPublisher.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/module/ModuleContextEventPublisher.java
new file mode 100644
index 0000000..89a267a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/module/ModuleContextEventPublisher.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.module;
+
+/**
+ * {@link ModuleContextEventPublisher} is used to publish {@link ModuleContextEvent ModuleContextEvents} to
+ * {@link ModuleContextEventListener ModuleContextEventListeners}. <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations of this class must be thread safe.
+ * 
+ */
+public interface ModuleContextEventPublisher extends ModuleContextEventListener {
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/module/ModuleContextFailedEvent.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/module/ModuleContextFailedEvent.java
new file mode 100644
index 0000000..51a651f
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/module/ModuleContextFailedEvent.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.module;
+
+import org.osgi.framework.Bundle;
+
+
+/**
+ * {@link ModuleContextFailedEvent} is used to notify failure to construct a {@link ModuleContext}.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * This class is thread safe.
+ *
+ */
+public final class ModuleContextFailedEvent extends ModuleContextEvent {
+
+    private final Throwable failureCause;
+
+    public ModuleContextFailedEvent(ModuleContext moduleContext, Bundle bundle, Throwable failureCause) {
+        super(moduleContext, bundle);
+        this.failureCause = failureCause;
+    }
+    
+    /**
+     * Get the cause of the failure associated with this event.
+     * 
+     * @return the {@link Throwable} cause
+     */
+    public Throwable getFailureCause() {
+        return failureCause;
+    }
+    
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/module/NoSuchComponentException.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/module/NoSuchComponentException.java
new file mode 100644
index 0000000..3a4d964
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/module/NoSuchComponentException.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.module;
+
+
+
+/**
+ * {@link NoSuchComponentException} is thrown when a component could not be found. <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread safe.
+ * 
+ */
+public final class NoSuchComponentException extends Exception {
+
+    private static final long serialVersionUID = -5201368574907781998L;
+
+    public NoSuchComponentException(String message) {
+        super(message);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/module/PropertyTypeMismatchException.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/module/PropertyTypeMismatchException.java
new file mode 100644
index 0000000..51e8c2d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/module/PropertyTypeMismatchException.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.module;
+
+/**
+ * {@link PropertyTypeMismatchException} is thrown when a bean could not be created since a value of the wrong type was passed to it. <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread safe.
+ * 
+ */
+public final class PropertyTypeMismatchException extends ComponentException {
+
+    private static final long serialVersionUID = -1625186095560002162L;
+    
+    private final Class<?> requiredClass;
+    
+    private final Object value;
+
+    /**
+     * @param beanName of bean in which mismatch occurs
+     * @param cause Throwable causing detection
+     * @param requiredClass class expected of the value
+     * @param value actual value supplied
+     */
+    public PropertyTypeMismatchException(String beanName, Throwable cause, Class<?> requiredClass, Object value) {
+        super(beanName, cause);
+        this.requiredClass = requiredClass;
+        this.value = value;
+    }
+    
+    /**
+     * @return the class required by the value
+     */
+    public Class<?> getRequiredClass() {
+        return requiredClass;
+    }
+
+    
+    /**
+     * @return the actual value supplied
+     */
+    public Object getValue() {
+        return value;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/module/internal/KernelModuleContextAccessor.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/module/internal/KernelModuleContextAccessor.java
new file mode 100644
index 0000000..d01e1ff
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/module/internal/KernelModuleContextAccessor.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.module.internal;
+
+import java.util.Collection;
+
+import org.eclipse.virgo.nano.serviceability.Assert;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+import org.springframework.context.ApplicationContext;
+import org.eclipse.gemini.blueprint.context.ConfigurableOsgiBundleApplicationContext;
+
+import org.eclipse.virgo.kernel.module.ModuleContext;
+import org.eclipse.virgo.kernel.module.ModuleContextAccessor;
+
+/**
+ * {@link KernelModuleContextAccessor} accesses {@link ModuleContext ModuleContexts} in the kernel region.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread safe.
+ * 
+ */
+public final class KernelModuleContextAccessor implements ModuleContextAccessor {
+
+    /**
+     * {@inheritDoc}
+     */
+    public ModuleContext getModuleContext(@NonNull Bundle bundle) {
+        BundleContext bundleContext = bundle.getBundleContext();
+        // The bundle must have a bundle context in order to have a module context.
+        if (bundleContext != null) {
+            String symbolicName = bundle.getSymbolicName();
+            try {
+                Collection<ServiceReference<ApplicationContext>> refs = bundleContext.getServiceReferences(ApplicationContext.class,
+                    "(Bundle-SymbolicName=" + symbolicName + ")");
+                if (refs.size() != 0) {
+                    for (ServiceReference<ApplicationContext> ref : refs) {
+                        Object service = bundleContext.getService(ref);
+                        try {
+                            // Avoid non-kernel region application contexts.
+                            if (service instanceof ApplicationContext) {
+                                ApplicationContext appCtx = (ApplicationContext) service;
+                                if (appCtx instanceof ConfigurableOsgiBundleApplicationContext) {
+                                    if (bundleContext == ((ConfigurableOsgiBundleApplicationContext) appCtx).getBundleContext()) {
+                                        return new ModuleContextWrapper((ConfigurableOsgiBundleApplicationContext) appCtx);
+                                    }
+                                }
+                            }
+                        } finally {
+                            bundleContext.ungetService(ref);
+                        }
+                    }
+                }
+            } catch (InvalidSyntaxException e) {
+                Assert.isFalse(true, "Unexpected exception %s", e.getMessage());
+            }
+        }
+        return null;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/module/internal/ModuleContextWrapper.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/module/internal/ModuleContextWrapper.java
new file mode 100644
index 0000000..e1e0e80
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/module/internal/ModuleContextWrapper.java
@@ -0,0 +1,101 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.module.internal;
+
+import org.springframework.beans.BeansException;
+import org.springframework.context.ConfigurableApplicationContext;
+
+import org.eclipse.virgo.kernel.module.Component;
+import org.eclipse.virgo.kernel.module.ModuleContext;
+import org.eclipse.virgo.kernel.module.NoSuchComponentException;
+
+/**
+ * {@link ModuleContextWrapper} wraps a {@link ConfigurableApplicationContext} to provide an equivalent {@link ModuleContext}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread safe.
+ * 
+ */
+final class ModuleContextWrapper implements ModuleContext {
+
+    private final ConfigurableApplicationContext appCtx;
+
+    ModuleContextWrapper(ConfigurableApplicationContext appCtx) {
+        this.appCtx = appCtx;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Object getApplicationContext() {
+        return this.appCtx;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Component getComponent(final String componentName) throws NoSuchComponentException {
+        try {
+            final Object component = this.appCtx.getBean(componentName);
+            return new Component() {
+
+                /**
+                 * {@inheritDoc}
+                 */
+                public String getName() {
+                    return componentName;
+                }
+
+                /**
+                 * {@inheritDoc}
+                 */
+                public String getType() {
+                    return component.getClass().getName();
+                }
+
+                /**
+                 * {@inheritDoc}
+                 */
+                public boolean isPrototype() {
+                    return ModuleContextWrapper.this.appCtx.getBeanFactory().isPrototype(componentName);
+                }
+
+                /**
+                 * {@inheritDoc}
+                 */
+                public boolean isSingleton() {
+                    return ModuleContextWrapper.this.appCtx.getBeanFactory().isSingleton(componentName);
+                }
+
+            };
+        } catch (BeansException e) {
+            throw new NoSuchComponentException(e.getMessage());
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String[] getComponentNames() {
+        return this.appCtx.getBeanDefinitionNames();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getDisplayName() {
+        return this.appCtx.getDisplayName();
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/module/internal/StandardModuleContextEventPublisher.java b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/module/internal/StandardModuleContextEventPublisher.java
new file mode 100644
index 0000000..75ff0e1
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/module/internal/StandardModuleContextEventPublisher.java
@@ -0,0 +1,130 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.module.internal;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.virgo.nano.core.FatalKernelException;
+import org.eclipse.virgo.kernel.module.ModuleContextEvent;
+import org.eclipse.virgo.kernel.module.ModuleContextEventListener;
+import org.eclipse.virgo.kernel.module.ModuleContextEventPublisher;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceEvent;
+import org.osgi.framework.ServiceListener;
+import org.osgi.framework.ServiceReference;
+
+
+/**
+ * {@link StandardModuleContextEventPublisher} is the default implementation of {@link ModuleContextEventPublisher}. It
+ * maintains a collection of {@link ModuleContextEventListener ModuleContextEventListeners} and publishes events to
+ * those listeners. <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+final class StandardModuleContextEventPublisher implements ModuleContextEventPublisher {
+    
+    private static final String SERVICE_TYPE_PROPERTY_KEY = "objectclass";
+    
+    private final Object monitor = new Object();
+    
+    private Set<ModuleContextEventListener> listeners = new HashSet<ModuleContextEventListener>();
+
+    private final BundleContext bundleContext;
+    
+    @SuppressWarnings("unchecked")
+    StandardModuleContextEventPublisher(BundleContext bundleContext) {
+        synchronized (this.monitor) {
+            this.bundleContext = bundleContext;
+            try {
+                ServiceReference<ModuleContextEventListener>[] allServiceReferences = (ServiceReference<ModuleContextEventListener>[]) bundleContext.getAllServiceReferences(ModuleContextEventListener.class.getName(), null);
+                if (allServiceReferences != null) {
+                    for (ServiceReference<ModuleContextEventListener> serviceReference : allServiceReferences) {
+                        registerListener(serviceReference);
+                    }
+                }
+                bundleContext.addServiceListener(new ListenerListener(), "(" + SERVICE_TYPE_PROPERTY_KEY + "=" + ModuleContextEventListener.class.getName() + ")");
+            } catch (InvalidSyntaxException e) {
+                throw new FatalKernelException("Invalid filter", e);
+            }
+        }
+    }
+    
+    /**
+     * Register a listener.
+     * 
+     * @param serviceReference the listener service
+     */
+    private void registerListener(ServiceReference<ModuleContextEventListener> serviceReference) {
+        synchronized (this.monitor) {
+            this.listeners.add((ModuleContextEventListener)this.bundleContext.getService(serviceReference));
+        }
+    }
+    
+    /**
+     * Deregisters a listener.
+     * 
+     * @param serviceReference the listener service
+     */
+    public void deregisterListener(ServiceReference<ModuleContextEventListener> serviceReference) {
+        synchronized (this.monitor) {
+            this.listeners.remove((ModuleContextEventListener)this.bundleContext.getService(serviceReference));
+            this.bundleContext.ungetService(serviceReference);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onEvent(ModuleContextEvent moduleContextEvent) {
+        // Publish event across a copy of the set of listeners to avoid making alien calls.
+        for (ModuleContextEventListener moduleContextEventListener : getListeners()) {
+            moduleContextEventListener.onEvent(moduleContextEvent);
+        }
+    }
+    
+    private Set<ModuleContextEventListener> getListeners() {
+        Set<ModuleContextEventListener> l = new HashSet<ModuleContextEventListener>();
+        synchronized (this.monitor) {
+            l.addAll(this.listeners);
+        }
+        return l;
+    }
+
+    /**
+     * Listener which drives register and deregister when listeners are registered and deregistered, respectively.
+     */
+    private class ListenerListener implements ServiceListener {
+
+        @SuppressWarnings("unchecked")
+        public void serviceChanged(ServiceEvent event) {
+            synchronized (StandardModuleContextEventPublisher.this.monitor) {
+                switch (event.getType()) {
+                    case ServiceEvent.REGISTERED:
+                        registerListener((ServiceReference<ModuleContextEventListener>) event.getServiceReference());
+                        break;
+                    case ServiceEvent.UNREGISTERING:
+                        deregisterListener((ServiceReference<ModuleContextEventListener>) event.getServiceReference());
+                        break;
+                    default:
+                        break;
+                }
+            }
+
+        }
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/resources/EventLogMessages.properties b/kernel/org.eclipse.virgo.kernel.deployer/src/main/resources/EventLogMessages.properties
new file mode 100644
index 0000000..4022e4b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/resources/EventLogMessages.properties
@@ -0,0 +1,65 @@
+#Deployer
+DE0000I = Installing {} '{}' version '{}'.
+DE0001I = Installed {} '{}' version '{}'.
+DE0002E = Installation of {} '{}' version '{}' failed.
+DE0003E = Install failed for {} '{}' version '{}'.
+DE0004I = Starting {} '{}' version '{}'.
+DE0005I = Started {} '{}' version '{}'.
+DE0006E = Start failed for {} '{}' version '{}'.
+DE0007I = Refreshing {} '{}' version '{}'.
+DE0008I = Refreshed {} '{}' version '{}'.
+DE0009E = Refresh failed for {} '{}' version '{}'.
+DE0010I = Stopping {} '{}' version '{}'.
+DE0011I = Stopped {} '{}' version '{}'.
+DE0012E = Stop failed for {} '{}' version '{}'.
+DE0013I = Uninstalling {} '{}' version '{}'.
+DE0014I = Uninstalled {} '{}' version '{}'.
+DE0015E = Uninstall failed for {} '{}' version '{}'.
+
+DE0050W = Cannot refresh {} '{}' version '{}' as refresh of {} artifacts is not supported.
+
+DE0060E = Cannot install scoped {} '{}' '{}' as it is being installed within scope '{}' and nested scopes are not supported.
+
+DE0070W = Cannot refresh bundle '{}' version '{}' as the identity would change. The new identity would have been '{}' version '{}'.
+DE0071W = Cannot refresh bundle '{}' version '{}' as it is scoped and refreshing would result in a change to its exported packages.
+
+DE0080E = Cannot install {} '{}' version '{}' as it was installed when {} '{}' version '{}' was installed.
+
+DE0090W = Watched repository '{}' could not be refreshed prior to bundle install.
+DE0091W = Unable to refresh any watched repositories prior to bundle install .
+
+DE0200E = Recovery of artifact from URI '{}' failed.
+
+DE0300E = Scope '{}' version '{}' exports package '{}' from more than one bundle: {}.
+DE0301E = Scope '{}' version '{}' has more than one bundle with symbolic name '{}'.
+DE0302E = Error parsing Spring configuration file '{}' in bundle '{}' version '{}'.
+
+DE0400W = Discarding bundle update location ({}) of bundle '{}' version '{}' so it will not interfere with refresh.
+DE0401E = Bundle '{}' version '{}' contains OSGi R4 manifest:\n{}\nomits bundle symbolic name.
+DE0402E = Bundle MANIFEST.MF not found in bundle '{}' version '{}'.
+
+DE0500E = Unable to install application from URI '{}'. Cannot satisfy constraints for bundle '{}' version '{}'. {}.
+DE0501E = Cannot deploy artifact from URI '{}'. Deployment of '{}' URIs is not supported.
+DE0502E = Start of {} '{}' version '{}' has taken longer than the configured timeout of '{}' seconds.
+DE0503E = Refresh failed as no artifact was deployed from URI '{}'.
+DE0504I = Refresh of artifact '{}' of {} '{}' version '{}' completed.
+DE0505E = Refresh of artifact '{}' of {} '{}' version '{}' failed.
+DE0506E = Cannot undeploy {} '{}' version '{}'. Artifact not found.
+DE0507E = Cannot refresh {} '{}' version '{}'. Artifact not found.
+DE0508I = Aborted start of {} '{}' version '{}'.
+
+DE0600E = File '{}' cannot be unpacked as a JAR.
+
+DE0700E = Cannot find {} '{}' version range '{}' in repository '{}'.
+DE0701E = Cannot determine the artifact identity of the file '{}'.
+DE0702E = Cannot find artifact factory for {} '{}' version '{}'.
+
+DE0800E = URI '{}' is not of the expected form repository:<type>/<name>/<version>.
+DE0801E = The version '{}' specified in URI '{}' is invalid.
+
+#Hot deployer
+HD0001I = Hot deployer processing '{}' event for file '{}'.
+HD0002E = Hot deploy failed for file '{}'.
+HD0003E = Hot re-deploy failed for file '{}'.
+HD0004E = Hot un-deploy failed for file '{}'.
+HD0005I = Hot deploy not performed because file '{}' is already deployed.
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/resources/META-INF/spring/api-context.xml b/kernel/org.eclipse.virgo.kernel.deployer/src/main/resources/META-INF/spring/api-context.xml
new file mode 100644
index 0000000..09df826
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/resources/META-INF/spring/api-context.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns:osgi="http://www.springframework.org/schema/osgi"
+	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
+		http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi-1.2.xsd">
+
+
+</beans>
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/resources/META-INF/spring/core-context.xml b/kernel/org.eclipse.virgo.kernel.deployer/src/main/resources/META-INF/spring/core-context.xml
new file mode 100644
index 0000000..fff5ca0
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/resources/META-INF/spring/core-context.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
+	
+	<bean id="moduleContextEventPublisher" class="org.eclipse.virgo.kernel.module.internal.StandardModuleContextEventPublisher">
+		<constructor-arg ref="bundleContext"/>
+	</bean>
+	
+</beans>
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/resources/META-INF/spring/deployer-context.xml b/kernel/org.eclipse.virgo.kernel.deployer/src/main/resources/META-INF/spring/deployer-context.xml
new file mode 100644
index 0000000..67ff50d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/resources/META-INF/spring/deployer-context.xml
@@ -0,0 +1,302 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<beans:beans xmlns="http://www.springframework.org/schema/osgi"

+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"

+	xsi:schemaLocation="http://www.springframework.org/schema/osgi  

+       http://www.springframework.org/schema/osgi/spring-osgi.xsd

+       http://www.springframework.org/schema/beans   

+       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

+

+	<service id="applicationDeployer" ref="pipelinedApplicationDeployer"

+		interface="org.eclipse.virgo.nano.deployer.api.core.ApplicationDeployer" />

+

+	<beans:bean id="recoveryLog"

+		class="org.eclipse.virgo.kernel.deployer.core.internal.recovery.DeployerRecoveryLog">

+		<beans:constructor-arg value="#{workArea.workDirectory}" />

+	</beans:bean>

+

+	<beans:bean id="deploymentListener"

+		class="org.eclipse.virgo.kernel.deployer.core.internal.recovery.DeployerRecoveryLogDeploymentListener">

+		<beans:constructor-arg ref="recoveryLog" />

+	</beans:bean>

+

+	<beans:bean id="artifactStorageFactory"

+		class="org.eclipse.virgo.kernel.install.artifact.internal.StandardArtifactStorageFactory">

+		<beans:constructor-arg value="#{workArea.workDirectory}" />

+		<beans:constructor-arg>

+			<beans:bean

+				class="org.eclipse.virgo.kernel.artifact.fs.StandardArtifactFSFactory" />

+		</beans:constructor-arg>

+		<beans:constructor-arg ref="eventLogger" />

+		<beans:constructor-arg value="#{kernelConfig.getProperty('deployer.unpackBundles')}" />

+	</beans:bean>

+

+	<beans:bean id="syntheticContextCreatingTransformer"

+		class="org.eclipse.virgo.kernel.install.pipeline.stage.transform.internal.SyntheticContextBundleCreatingTransformer">

+		<beans:constructor-arg ref="bundleInstallArtifactGraphFactory" />

+		<beans:constructor-arg ref="artifactStorageFactory" />

+	</beans:bean>

+

+	<beans:bean id="scopingTransformer"

+		class="org.eclipse.virgo.kernel.install.pipeline.stage.transform.internal.ScopingTransformer" />

+

+	<beans:bean id="bundleManifestVersionUpgrader"

+		class="org.eclipse.virgo.kernel.deployer.core.internal.ManifestUpgrader" />

+

+	<beans:bean id="planResolver"

+		class="org.eclipse.virgo.kernel.deployer.core.internal.PlanResolver">

+		<beans:constructor-arg ref="installArtifactGraphInclosure" />

+		<beans:constructor-arg ref="runtimeArtifactModel" />

+		<beans:constructor-arg ref="repository" />

+		<beans:constructor-arg ref="artifactIdentityDeterminer" />

+		<beans:constructor-arg ref="eventLogger" />

+	</beans:bean>

+

+	<beans:bean id="importExpandingTransformer"

+		class="org.eclipse.virgo.kernel.deployer.core.internal.ImportExpandingTransformer">

+		<beans:constructor-arg ref="importExpander" />

+	</beans:bean>

+

+	<beans:bean id="bundleDeploymentProperties"

+		class="org.eclipse.virgo.kernel.deployer.core.internal.BundleDeploymentPropertiesTransformer" />

+

+	<beans:bean id="userInstalledTaggingTransformer"

+		class="org.eclipse.virgo.kernel.install.pipeline.stage.transform.internal.UserInstalledTaggingTransformer" />

+

+	<service

+		interface="org.eclipse.virgo.kernel.install.pipeline.stage.transform.Transformer"

+		ref="planResolver" ranking="1000" />

+	<service

+		interface="org.eclipse.virgo.kernel.install.pipeline.stage.transform.Transformer"

+		ref="bundleManifestVersionUpgrader" ranking="2000" />

+	<service

+		interface="org.eclipse.virgo.kernel.install.pipeline.stage.transform.Transformer"

+		ref="bundleDeploymentProperties" ranking="2500" />

+	<service

+		interface="org.eclipse.virgo.kernel.install.pipeline.stage.transform.Transformer"

+		ref="userInstalledTaggingTransformer" ranking="2750" />

+	<service

+		interface="org.eclipse.virgo.kernel.install.pipeline.stage.transform.Transformer"

+		ref="syntheticContextCreatingTransformer" ranking="3000" />

+	<service

+		interface="org.eclipse.virgo.kernel.install.pipeline.stage.transform.Transformer"

+		ref="scopingTransformer" ranking="4000" />

+	<service

+		interface="org.eclipse.virgo.kernel.install.pipeline.stage.transform.Transformer"

+		ref="importExpandingTransformer" ranking="5000" />

+

+	<reference id="recoveryMonitor" interface="org.eclipse.virgo.nano.deployer.api.RecoveryMonitor" />

+

+	<service id="recoveryAgent" interface="org.osgi.service.event.EventHandler">

+		<service-properties>

+			<beans:entry key="event.topics" value="org/eclipse/virgo/kernel/*" />

+		</service-properties>

+		<beans:bean

+			class="org.eclipse.virgo.kernel.deployer.core.internal.recovery.RecoveryAgent">

+			<beans:constructor-arg ref="pipelinedApplicationDeployer" />

+			<beans:constructor-arg ref="recoveryLog" />

+			<beans:constructor-arg ref="eventLogger" />

+			<beans:constructor-arg ref="eventAdmin" />

+		</beans:bean>

+	</service>

+

+	<beans:bean id="mainPipeline" factory-bean="plumber"

+		factory-method="getMainPipeline" />

+	<beans:bean id="refreshSubpipeline" factory-bean="plumber"

+		factory-method="getRefreshSubpipeline" />

+

+	<beans:bean id="pipelinedApplicationDeployer"

+		class="org.eclipse.virgo.kernel.deployer.core.internal.PipelinedApplicationDeployer">

+		<beans:constructor-arg ref="mainPipeline" />

+		<beans:constructor-arg ref="installArtifactGraphInclosure" />

+		<beans:constructor-arg ref="artifactIdentityDeterminer" />

+		<beans:constructor-arg ref="installEnvironmentFactory" />

+		<beans:constructor-arg ref="runtimeArtifactModel" />

+		<beans:constructor-arg ref="deploymentListener" />

+		<beans:constructor-arg ref="eventLogger" />

+		<beans:constructor-arg ref="uriNormaliser" />

+		<beans:constructor-arg ref="deployerConfig" />

+		<beans:constructor-arg ref="bundleContext" />

+	</beans:bean>

+

+	<beans:bean id="stateCleanupListener"

+		class="org.eclipse.virgo.kernel.deployer.core.internal.StateCleanupInstallArtifactLifecycleListener">

+		<beans:constructor-arg ref="deploymentListener" />

+		<beans:constructor-arg ref="runtimeArtifactModel" />

+	</beans:bean>

+

+	<service ref="stateCleanupListener"

+		interface="org.eclipse.virgo.kernel.install.artifact.InstallArtifactLifecycleListener" />

+

+	<service ref="uriNormaliser"

+		interface="org.eclipse.virgo.nano.deployer.api.core.DeployUriNormaliser" />

+

+	<beans:bean id="uriNormaliser"

+		class="org.eclipse.virgo.kernel.deployer.core.internal.uri.CompoundDeployUriNormaliser">

+		<beans:constructor-arg>

+			<beans:list>

+				<beans:bean

+					class="org.eclipse.virgo.kernel.deployer.core.internal.uri.RepositoryDeployUriNormaliser">

+					<beans:constructor-arg ref="repository" />

+					<beans:constructor-arg ref="eventLogger" />

+				</beans:bean>

+				<beans:bean

+					class="org.eclipse.virgo.kernel.deployer.core.internal.uri.FileDeployUriNormaliser" />

+			</beans:list>

+		</beans:constructor-arg>

+	</beans:bean>

+

+	<beans:bean id="plumber"

+		class="org.eclipse.virgo.kernel.deployer.core.internal.Plumber">

+		<beans:constructor-arg ref="packageAdmin" />

+		<beans:constructor-arg ref="bundleContext" />

+		<beans:constructor-arg ref="pipelineFactory" />

+		<beans:constructor-arg ref="quasiFrameworkFactory" />

+	</beans:bean>

+

+	<beans:bean id="pipelineFactory"

+		class="org.eclipse.virgo.kernel.install.pipeline.internal.StandardPipelineFactory" />

+

+	<beans:bean id="installArtifactGraphInclosure"

+		class="org.eclipse.virgo.kernel.install.artifact.internal.StandardInstallArtifactGraphInclosure">

+		<beans:constructor-arg ref="artifactStorageFactory" />

+		<beans:constructor-arg ref="bundleContext" />

+		<beans:constructor-arg ref="eventLogger" />

+	</beans:bean>

+

+	<beans:bean id="installEnvironmentFactory"

+		class="org.eclipse.virgo.kernel.install.environment.internal.StandardInstallEnvironmentFactory">

+		<beans:constructor-arg ref="quasiFrameworkFactory" />

+		<beans:constructor-arg ref="eventLogger" />

+	</beans:bean>

+

+	<beans:bean id="runtimeArtifactModel"

+		class="org.eclipse.virgo.kernel.deployer.model.internal.StandardRuntimeArtifactModel">

+		<beans:constructor-arg ref="uriNormaliser" />

+	</beans:bean>

+

+	<service ref="runtimeArtifactModel"

+		interface="org.eclipse.virgo.kernel.deployer.model.RuntimeArtifactModel" />

+

+	<service ref="loggingListener"

+		interface="org.eclipse.virgo.kernel.install.artifact.InstallArtifactLifecycleListener" />

+

+	<beans:bean id="loggingListener"

+		class="org.eclipse.virgo.kernel.install.artifact.internal.LoggingInstallArtifactLifecycleListener">

+		<beans:constructor-arg ref="eventLogger" />

+	</beans:bean>

+

+	<reference id="kernelConfig" interface="org.eclipse.virgo.nano.core.KernelConfig"/>

+	

+	<beans:bean id="deployerConfig"

+		class="org.eclipse.virgo.kernel.deployer.core.internal.StandardDeployerConfiguration">

+		<beans:constructor-arg value="#{kernelConfig.getProperty('deployer.timeout')}" />

+		<beans:constructor-arg value="#{kernelConfig.getProperty('deployer.pickupDirectory')}" />

+		<beans:constructor-arg value="#{kernelConfig.getProperty('deployer.scanIntervalMillis')}" />

+	</beans:bean>

+

+	<service ref="deployerConfig"

+		interface="org.eclipse.virgo.nano.deployer.api.core.DeployerConfiguration" />

+

+	<beans:bean id="applicationDeploymentEventNotifier"

+		class="org.eclipse.virgo.kernel.deployer.core.event.ApplicationDeploymentEventNotifier">

+		<beans:constructor-arg ref="deploymentListeners" />

+	</beans:bean>

+

+	<set id="deploymentListeners"

+		interface="org.eclipse.virgo.kernel.deployer.core.event.DeploymentListener"

+		cardinality="0..N" />

+

+	<reference id="packageAdminUtil"

+		interface="org.eclipse.virgo.kernel.osgi.framework.PackageAdminUtil" />

+

+	<!--  scoping -->

+	<reference id="scopeFactory"

+		interface="org.eclipse.virgo.nano.shim.scope.ScopeFactory" />

+

+	<beans:bean id="scopeServiceRepository"

+		class="org.eclipse.virgo.kernel.install.artifact.internal.StandardScopeServiceRepository" />

+

+	<service ref="scopeServiceRepository"

+		interface="org.eclipse.virgo.kernel.install.artifact.ScopeServiceRepository" />

+

+	<!--  basic artifact identity determination -->

+	<service

+		interface="org.eclipse.virgo.kernel.install.artifact.ArtifactIdentityDeterminer">

+		<beans:bean

+			class="org.eclipse.virgo.kernel.install.artifact.internal.StandardArtifactIdentityDeterminer">

+			<beans:constructor-arg>

+				<set id="artifactBridges" interface="org.eclipse.virgo.repository.ArtifactBridge" />

+			</beans:constructor-arg>

+		</beans:bean>

+	</service>

+

+	<beans:bean id="artifactIdentityDeterminer"

+		class="org.eclipse.virgo.kernel.install.artifact.internal.DelegatingServiceRegistryBackedArtifactIdentityDeterminer"

+		init-method="init" destroy-method="destroy">

+		<beans:constructor-arg ref="bundleContext" />

+	</beans:bean>

+

+	<beans:bean id="refreshHandler"

+		class="org.eclipse.virgo.kernel.install.artifact.internal.StandardInstallArtifactRefreshHandler">

+		<beans:constructor-arg ref="installEnvironmentFactory" />

+		<beans:constructor-arg ref="refreshSubpipeline" />

+	</beans:bean>

+

+	<!--  basic artifact type factories -->

+	<beans:bean id="bundleInstallArtifactGraphFactory"

+		class="org.eclipse.virgo.kernel.install.artifact.internal.bundle.BundleInstallArtifactGraphFactory">

+		<beans:constructor-arg ref="osgiFramework" />

+		<beans:constructor-arg ref="bundleContext" />

+		<beans:constructor-arg ref="refreshHandler" />

+		<beans:constructor-arg ref="bundleStarter" />

+		<beans:constructor-arg ref="tracingService" />

+		<beans:constructor-arg ref="packageAdminUtil" />

+		<beans:constructor-arg ref="userBundleContext" />

+		<beans:constructor-arg ref="eventLogger" />

+		<beans:constructor-arg ref="artifactIdentityDeterminer" />

+		<beans:constructor-arg ref="installArtifactGraph" />

+	</beans:bean>

+	

+	<beans:bean id="installArtifactGraph"

+      class="org.eclipse.virgo.kernel.install.artifact.internal.InstallArtifactDAGSingletonFactory"

+      factory-method="createInstance"/>

+	

+	<reference id="userBundleContext" interface="org.osgi.framework.BundleContext" filter="(org.eclipse.virgo.kernel.regionContext=true)"/>

+

+	<service ref="bundleInstallArtifactGraphFactory"

+		interface="org.eclipse.virgo.kernel.install.artifact.InstallArtifactGraphFactory" />

+

+	<beans:bean id="configInstallArtifactGraphFactory"

+		class="org.eclipse.virgo.kernel.install.artifact.internal.ConfigInstallArtifactGraphFactory">

+		<beans:constructor-arg ref="bundleContext" />

+		<beans:constructor-arg ref="eventLogger" />

+		<beans:constructor-arg ref="installArtifactGraph" />

+	</beans:bean>

+

+	<service ref="configInstallArtifactGraphFactory"

+		interface="org.eclipse.virgo.kernel.install.artifact.InstallArtifactGraphFactory" />

+

+	<service

+		interface="org.eclipse.virgo.kernel.install.artifact.InstallArtifactGraphFactory">

+		<beans:bean

+			class="org.eclipse.virgo.kernel.install.artifact.internal.PlanInstallArtifactGraphFactory">

+			<beans:constructor-arg ref="bundleContext" />

+			<beans:constructor-arg ref="scopeServiceRepository" />

+			<beans:constructor-arg ref="scopeFactory" />

+			<beans:constructor-arg ref="eventLogger" />

+			<beans:constructor-arg ref="bundleInstallArtifactGraphFactory" />

+			<beans:constructor-arg ref="refreshHandler" />

+			<beans:constructor-arg ref="configInstallArtifactGraphFactory" />

+			<beans:constructor-arg ref="artifactStorageFactory" />

+			<beans:constructor-arg ref="artifactIdentityDeterminer" />

+			<beans:constructor-arg ref="installArtifactGraph" />

+		</beans:bean>

+	</service>

+

+	<service

+		interface="org.eclipse.virgo.kernel.install.artifact.InstallArtifactLifecycleListener">

+		<beans:bean

+			class="org.eclipse.virgo.kernel.install.artifact.internal.AtomicInstallArtifactLifecycleListener" />

+	</service>

+

+</beans:beans>

diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/resources/META-INF/spring/deployer-hot-context.xml b/kernel/org.eclipse.virgo.kernel.deployer/src/main/resources/META-INF/spring/deployer-hot-context.xml
new file mode 100644
index 0000000..966cf20
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/resources/META-INF/spring/deployer-hot-context.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans:beans xmlns="http://www.springframework.org/schema/osgi"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"
+	xsi:schemaLocation="http://www.springframework.org/schema/osgi  
+       http://www.springframework.org/schema/osgi/spring-osgi.xsd
+       http://www.springframework.org/schema/beans   
+       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
+
+	<beans:bean id="hotDeployer"
+		class="org.eclipse.virgo.kernel.deployer.hotenabler.HotDeployerEnabler"
+		destroy-method="stop">
+		<beans:constructor-arg ref="deployerConfig" />
+		<beans:constructor-arg ref="pipelinedApplicationDeployer" />
+		<beans:constructor-arg ref="eventLogger" />
+	</beans:bean>
+
+	<service id="hotDeployerService" ref="hotDeployer"
+		interface="org.osgi.service.event.EventHandler">
+		<service-properties>
+			<beans:entry key="event.topics" value="org/eclipse/virgo/kernel/deployer/recovery/*" />
+		</service-properties>
+	</service>
+
+</beans:beans>
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/resources/META-INF/spring/internal-osgi-context.xml b/kernel/org.eclipse.virgo.kernel.deployer/src/main/resources/META-INF/spring/internal-osgi-context.xml
new file mode 100644
index 0000000..862a616
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/resources/META-INF/spring/internal-osgi-context.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:osgi="http://www.springframework.org/schema/osgi"
+	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
+		http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi-1.2.xsd">
+
+	<!-- Configuration for OSGi services that the kernel depends on and provides 
+		to the framework. These services are not considered part of the kernel API. -->
+
+	<osgi:reference id="configAdmin"
+		interface="org.osgi.service.cm.ConfigurationAdmin" />
+
+	<osgi:reference id="eventLogger"
+		interface="org.eclipse.virgo.medic.eventlog.EventLogger" />
+
+	<osgi:reference id="dumpGenerator"
+		interface="org.eclipse.virgo.medic.dump.DumpGenerator" />
+
+	<osgi:reference id="packageAdmin"
+		interface="org.osgi.service.packageadmin.PackageAdmin" />
+
+	<osgi:reference id="repository"
+		interface="org.eclipse.virgo.repository.Repository" />
+
+	<osgi:reference id="scopeFactory"
+		interface="org.eclipse.virgo.nano.shim.scope.ScopeFactory" />
+
+	<osgi:reference id="shutdown"
+		interface="org.eclipse.virgo.nano.core.Shutdown" />
+
+	<osgi:reference id="tracingService"
+		interface="org.eclipse.virgo.nano.shim.serviceability.TracingService" />
+
+	<osgi:reference id="workArea"
+		interface="org.eclipse.virgo.kernel.services.work.WorkArea" />
+
+	<osgi:reference id="osgiFramework"
+		interface="org.eclipse.virgo.kernel.osgi.framework.OsgiFramework" />
+
+	<osgi:reference id="quasiFrameworkFactory"
+		interface="org.eclipse.virgo.kernel.osgi.quasi.QuasiFrameworkFactory" />
+
+	<osgi:reference id="eventAdmin" interface="org.osgi.service.event.EventAdmin" />
+
+	<osgi:reference id="bundleStarter"
+		interface="org.eclipse.virgo.nano.core.BundleStarter"
+		context-class-loader="unmanaged" />
+
+	<osgi:reference id="importExpander"
+		interface="org.eclipse.virgo.kernel.osgi.framework.ImportExpander" />
+
+	<!-- services -->
+	<osgi:service ref="moduleContextEventPublisher"
+		interface="org.eclipse.virgo.kernel.module.ModuleContextEventPublisher" />
+
+</beans>
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/resources/META-INF/spring/management-context.xml b/kernel/org.eclipse.virgo.kernel.deployer/src/main/resources/META-INF/spring/management-context.xml
new file mode 100644
index 0000000..4a9ad44
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/resources/META-INF/spring/management-context.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<beans xmlns="http://www.springframework.org/schema/beans"

+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:osgi="http://www.springframework.org/schema/osgi"

+	xsi:schemaLocation="

+			http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd

+			http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi.xsd">

+

+	<!-- Deployer -->

+	<bean class="org.eclipse.virgo.kernel.management.ManagementExporter">

+		<constructor-arg>
+			<bean class="org.eclipse.virgo.kernel.deployer.management.StandardDeployer">
+				<constructor-arg ref="pipelinedApplicationDeployer" />
+			</bean>
+		</constructor-arg>
+		<constructor-arg
+			value="#{kernelConfig.getProperty('domain')}:category=Control,type=Deployer" />
+	</bean>

+

+	<!-- RecoveryMonitor -->

+	<bean class="org.eclipse.virgo.kernel.management.ManagementExporter">

+		<constructor-arg ref="recoveryMonitor" />

+		<constructor-arg value="#{kernelConfig.getProperty('domain')}:category=Control,type=RecoveryMonitor" />

+	</bean>

+	

+	<osgi:reference id="kernelConfig" interface="org.eclipse.virgo.nano.core.KernelConfig"/>

+	

+	<osgi:reference id="recoveryMonitor" interface="org.eclipse.virgo.nano.deployer.api.RecoveryMonitor" />

+</beans>

diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/main/resources/META-INF/spring/serviceability-context.xml b/kernel/org.eclipse.virgo.kernel.deployer/src/main/resources/META-INF/spring/serviceability-context.xml
new file mode 100644
index 0000000..20e201f
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/main/resources/META-INF/spring/serviceability-context.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
+
+	<bean class="org.eclipse.virgo.nano.serviceability.dump.DumpCoordinator" factory-method="aspectOf">
+		<property name="bundleContext" ref="bundleContext"/>
+	</bean>
+</beans>
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/deployer/core/StubInstallArtifactLifecycleListener.java b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/deployer/core/StubInstallArtifactLifecycleListener.java
new file mode 100644
index 0000000..71574cf
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/deployer/core/StubInstallArtifactLifecycleListener.java
@@ -0,0 +1,275 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifactLifecycleListener;
+
+
+public final class StubInstallArtifactLifecycleListener implements InstallArtifactLifecycleListener {
+
+    private final AtomicInteger installingCount = new AtomicInteger();
+
+    private final AtomicInteger installFailedCount = new AtomicInteger();
+
+    private final AtomicInteger installedCount = new AtomicInteger();
+
+    private final AtomicInteger resolvingCount = new AtomicInteger();
+
+    private final AtomicInteger resolveFailedCount = new AtomicInteger();
+
+    private final AtomicInteger resolvedCount = new AtomicInteger();
+
+    private final AtomicInteger startingCount = new AtomicInteger();
+
+    private final AtomicInteger startFailedCount = new AtomicInteger();
+    
+    private final AtomicInteger startAbortedCount = new AtomicInteger();
+    
+    private final AtomicInteger startedCount = new AtomicInteger();
+
+    private final AtomicInteger stoppingCount = new AtomicInteger();
+
+    private final AtomicInteger stopFailedCount = new AtomicInteger();
+
+    private final AtomicInteger stoppedCount = new AtomicInteger();
+    
+    private final AtomicInteger unresolvedCount = new AtomicInteger();
+
+    private final AtomicInteger uninstallingCount = new AtomicInteger();
+
+    private final AtomicInteger uninstallFailedCount = new AtomicInteger();
+
+    private final AtomicInteger uninstalledCount = new AtomicInteger();
+
+    public void assertLifecycleCounts(int starting, int started, int stopping, int stopped) {
+        assertStartingCount(starting);
+        assertStartedCount(started);
+        assertStoppingCount(stopping);
+        assertStoppedCount(stopped);
+    }
+
+    public void assertLifecycleCounts(int installing, int installFailed, int installed, int resolving, int resolveFailed, int resolved, int starting,
+        int startFailed, int started, int stopping, int stopFailed, int stopped, int uninstalling, int uninstallFailed, int uninstalled) {
+        assertInstallingCount(installing);
+        assertInstallFailedCount(installFailed);
+        assertInstalledCount(installed);
+
+        assertResolvingCount(resolving);
+        assertResolvedFailedCount(resolveFailed);
+        assertResolvedCount(resolved);
+
+        assertStartingCount(starting);
+        assertStartFailedCount(startFailed);
+        assertStartedCount(started);
+
+        assertStoppingCount(stopping);
+        assertStopFailedCount(stopFailed);
+        assertStoppedCount(stopped);
+
+        assertUninstallingCount(uninstalling);
+        assertUninstallFailedCount(uninstallFailed);
+        assertUninstalledCount(uninstalled);
+    }
+
+    public void assertInstallingCount(int installing) {
+        assertEquals("Incorrect installing count", installing, this.installingCount.get());
+    }
+
+    public void assertInstallFailedCount(int installFailed) {
+        assertEquals("Incorrect install failed count", installFailed, this.installFailedCount.get());
+    }
+
+    public void assertInstalledCount(int installed) {
+        assertEquals("Incorrect installed count", installed, this.installedCount.get());
+    }
+
+    public void assertResolvingCount(int resolving) {
+        assertEquals("Incorrect resolving count", resolving, this.resolvingCount.get());
+    }
+
+    public void assertResolvedFailedCount(int resolveFailed) {
+        assertEquals("Incorrect resolve failed count", resolveFailed, this.resolveFailedCount.get());
+    }
+
+    public void assertResolvedCount(int resolved) {
+        assertEquals("Incorrect resolved count", resolved, this.resolvedCount.get());
+    }
+
+    public void assertStartingCount(int starting) {
+        assertEquals("Incorrect starting count", starting, this.startingCount.get());
+    }
+
+    public void assertStartFailedCount(int startFailed) {
+        assertEquals("Incorrect start failed count", startFailed, this.startFailedCount.get());
+    }
+
+    public void assertStartAbortedCount(int startAborted) {
+        assertEquals("Incorrect start abortion count", startAborted, this.startAbortedCount.get());
+    }
+
+    public void assertStartedCount(int started) {
+        assertEquals("Incorrect started count", started, this.startedCount.get());
+    }
+
+    public void assertStoppingCount(int stopping) {
+        assertEquals("Incorrect stopping count", stopping, this.stoppingCount.get());
+    }
+
+    public void assertStopFailedCount(int stopFailed) {
+        assertEquals("Incorrect stop failed count", stopFailed, this.stopFailedCount.get());
+    }
+
+    public void assertStoppedCount(int stopped) {
+        assertEquals("Incorrect stopped count", stopped, this.stoppedCount.get());
+    }
+    
+    public void assertUnresolvedCount(int unresolved) {
+        assertEquals("Incorrect unresolved count", unresolved, this.unresolvedCount.get());
+    }
+
+    public void assertUninstallingCount(int uninstalling) {
+        assertEquals("Incorrect uninstalling count", uninstalling, this.uninstallingCount.get());
+    }
+
+    public void assertUninstallFailedCount(int uninstallFailed) {
+        assertEquals("Incorrect uninstall failed count", uninstallFailed, this.uninstallFailedCount.get());
+    }
+
+    public void assertUninstalledCount(int uninstalled) {
+        assertEquals("Incorrect uninstalled count", uninstalled, this.uninstalledCount.get());
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onInstalling(InstallArtifact installArtifact) {
+        this.installingCount.incrementAndGet();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onInstallFailed(InstallArtifact installArtifact) {
+        this.installFailedCount.incrementAndGet();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onInstalled(InstallArtifact installArtifact) {
+        this.installedCount.incrementAndGet();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onResolving(InstallArtifact installArtifact) {
+        this.resolvingCount.incrementAndGet();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onResolveFailed(InstallArtifact installArtifact) {
+        this.resolveFailedCount.incrementAndGet();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onResolved(InstallArtifact installArtifact) {
+        this.resolvedCount.incrementAndGet();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onStarting(InstallArtifact installArtifact) {
+        this.startingCount.incrementAndGet();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onStartFailed(InstallArtifact installArtifact, Throwable cause) {
+        this.startFailedCount.incrementAndGet();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onStartAborted(InstallArtifact installArtifact) {
+        this.startAbortedCount.incrementAndGet();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onStarted(InstallArtifact installArtifact) {
+        this.startedCount.incrementAndGet();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onStopping(InstallArtifact installArtifact) {
+        this.stoppingCount.incrementAndGet();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onStopFailed(InstallArtifact installArtifact, Throwable cause) {
+        this.stopFailedCount.incrementAndGet();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onStopped(InstallArtifact installArtifact) {
+        this.stoppedCount.incrementAndGet();
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void onUnresolved(InstallArtifact installArtifact) {
+        this.unresolvedCount.incrementAndGet();
+    }
+    
+    /**
+     * {@inheritDoc}
+     */
+    public void onUninstalling(InstallArtifact installArtifact) {
+        this.uninstallingCount.incrementAndGet();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onUninstallFailed(InstallArtifact installArtifact, Throwable cause) {
+        this.uninstallFailedCount.incrementAndGet();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void onUninstalled(InstallArtifact installArtifact) {
+        this.uninstalledCount.incrementAndGet();
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/deployer/core/internal/AbortableSignalJunctionTests.java b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/deployer/core/internal/AbortableSignalJunctionTests.java
new file mode 100644
index 0000000..96de012
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/deployer/core/internal/AbortableSignalJunctionTests.java
@@ -0,0 +1,229 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core.internal;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.eclipse.virgo.nano.core.AbortableSignal;
+import org.junit.Before;
+import org.junit.Test;
+
+
+/**
+ */
+public class AbortableSignalJunctionTests {
+
+    private AbortableSignal signal;
+    
+    private boolean signalCompleted;
+
+    private boolean signalFailed;
+    
+    private boolean signalAborted;
+
+    @Before
+    public void setUp() {
+        this.signalCompleted = false;
+        this.signalFailed = false;
+        
+        this.signal = new AbortableSignal(){
+
+            public void signalFailure(Throwable cause) {
+                signalFailed = true;
+            }
+
+            public void signalSuccessfulCompletion() {
+                signalCompleted = true;
+            }
+            
+            public void signalAborted() {
+				signalAborted = true;
+			}
+
+        };
+    }
+
+    @Test
+    public void testEmptyJunction() {
+        new AbortableSignalJunction(this.signal, 0);
+        assertTrue(this.signalCompleted);
+        assertFalse(this.signalFailed);
+        assertFalse(this.signalAborted);
+    }
+    
+    @Test
+    public void testUnaryJunction() {
+        AbortableSignalJunction sj = new AbortableSignalJunction(this.signal, 1);
+        sj.getSignals().get(0).signalSuccessfulCompletion();
+        assertTrue(this.signalCompleted);
+        assertFalse(this.signalFailed);
+        assertFalse(this.signalAborted);
+    }
+    
+    @Test
+    public void testBinaryJunction() {
+        AbortableSignalJunction sj = new AbortableSignalJunction(this.signal, 2);
+        sj.getSignals().get(0).signalSuccessfulCompletion();
+        sj.getSignals().get(1).signalSuccessfulCompletion();
+        assertTrue(this.signalCompleted);
+        assertFalse(this.signalFailed);
+        assertFalse(this.signalAborted);
+    }
+    
+    @Test
+    public void testBinaryJunctionFail() {
+        AbortableSignalJunction sj = new AbortableSignalJunction(this.signal, 2);
+        sj.getSignals().get(0).signalFailure(new RuntimeException());
+        assertFalse(this.signalCompleted);
+        assertTrue(this.signalFailed);
+        assertFalse(this.signalAborted);
+    }
+    
+    @Test
+    public void testBinaryJunctionAbort() {
+        AbortableSignalJunction sj = new AbortableSignalJunction(this.signal, 2);
+        sj.getSignals().get(0).signalAborted();
+        assertFalse(this.signalCompleted);
+        assertFalse(this.signalFailed);
+        assertTrue(this.signalAborted);
+    }
+    
+    @Test
+    public void testNestedBinaryJunctionOrder1() {
+        AbortableSignalJunction top = new AbortableSignalJunction(this.signal, 2);
+        AbortableSignal top1 = top.getSignals().get(0);
+        AbortableSignal top2 = top.getSignals().get(1);
+        AbortableSignalJunction bottom = new AbortableSignalJunction(top2, 2);
+        AbortableSignal bottom1 = bottom.getSignals().get(0);
+        AbortableSignal bottom2 = bottom.getSignals().get(1);
+        top1.signalSuccessfulCompletion();
+        bottom1.signalSuccessfulCompletion();
+        bottom2.signalSuccessfulCompletion();
+        assertTrue(this.signalCompleted);
+        assertFalse(this.signalFailed);
+        assertFalse(this.signalAborted);
+    }
+    
+    @Test
+    public void testNestedBinaryJunctionOrder2() {
+        AbortableSignalJunction top = new AbortableSignalJunction(this.signal, 2);
+        AbortableSignal top1 = top.getSignals().get(0);
+        AbortableSignal top2 = top.getSignals().get(1);
+        AbortableSignalJunction bottom = new AbortableSignalJunction(top2, 2);
+        AbortableSignal bottom1 = bottom.getSignals().get(0);
+        AbortableSignal bottom2 = bottom.getSignals().get(1);
+        bottom1.signalSuccessfulCompletion();
+        top1.signalSuccessfulCompletion();
+        bottom2.signalSuccessfulCompletion();
+        assertTrue(this.signalCompleted);
+        assertFalse(this.signalFailed);
+        assertFalse(this.signalAborted);
+    }
+    
+    @Test
+    public void testNestedBinaryJunctionOrder3() {
+        AbortableSignalJunction top = new AbortableSignalJunction(this.signal, 2);
+        AbortableSignal top1 = top.getSignals().get(0);
+        AbortableSignal top2 = top.getSignals().get(1);
+        AbortableSignalJunction bottom = new AbortableSignalJunction(top2, 2);
+        AbortableSignal bottom1 = bottom.getSignals().get(0);
+        AbortableSignal bottom2 = bottom.getSignals().get(1);
+        bottom1.signalSuccessfulCompletion();
+        bottom2.signalSuccessfulCompletion();
+        top1.signalSuccessfulCompletion();
+        assertTrue(this.signalCompleted);
+        assertFalse(this.signalFailed);
+        assertFalse(this.signalAborted);
+    }
+    
+    @Test
+    public void testNestedBinaryJunctionOrder4() {
+        AbortableSignalJunction top = new AbortableSignalJunction(this.signal, 2);
+        AbortableSignal top1 = top.getSignals().get(0);
+        AbortableSignal top2 = top.getSignals().get(1);
+        AbortableSignalJunction bottom = new AbortableSignalJunction(top2, 2);
+        AbortableSignal bottom1 = bottom.getSignals().get(0);
+        AbortableSignal bottom2 = bottom.getSignals().get(1);
+        top1.signalSuccessfulCompletion();
+        bottom2.signalSuccessfulCompletion();
+        bottom1.signalSuccessfulCompletion();
+        assertTrue(this.signalCompleted);
+        assertFalse(this.signalFailed);
+        assertFalse(this.signalAborted);
+    }
+    
+    @Test
+    public void testNestedBinaryJunctionOrder5() {
+        AbortableSignalJunction top = new AbortableSignalJunction(this.signal, 2);
+        AbortableSignal top1 = top.getSignals().get(0);
+        AbortableSignal top2 = top.getSignals().get(1);
+        AbortableSignalJunction bottom = new AbortableSignalJunction(top2, 2);
+        AbortableSignal bottom1 = bottom.getSignals().get(0);
+        AbortableSignal bottom2 = bottom.getSignals().get(1);
+        bottom2.signalSuccessfulCompletion();
+        top1.signalSuccessfulCompletion();
+        bottom1.signalSuccessfulCompletion();
+        assertTrue(this.signalCompleted);
+        assertFalse(this.signalFailed);
+        assertFalse(this.signalAborted);
+    }
+    
+    @Test
+    public void testNestedBinaryJunctionOrder6() {
+        AbortableSignalJunction top = new AbortableSignalJunction(this.signal, 2);
+        AbortableSignal top1 = top.getSignals().get(0);
+        AbortableSignal top2 = top.getSignals().get(1);
+        AbortableSignalJunction bottom = new AbortableSignalJunction(top2, 2);
+        AbortableSignal bottom1 = bottom.getSignals().get(0);
+        AbortableSignal bottom2 = bottom.getSignals().get(1);
+        bottom2.signalSuccessfulCompletion();
+        bottom1.signalSuccessfulCompletion();
+        top1.signalSuccessfulCompletion();
+        assertTrue(this.signalCompleted);
+        assertFalse(this.signalFailed);
+        assertFalse(this.signalAborted);
+    }
+    
+    @Test
+    public void testNestedBinaryJunctionOrderFail() {
+        AbortableSignalJunction top = new AbortableSignalJunction(this.signal, 2);
+        AbortableSignal top1 = top.getSignals().get(0);
+        AbortableSignal top2 = top.getSignals().get(1);
+        AbortableSignalJunction bottom = new AbortableSignalJunction(top2, 2);
+        AbortableSignal bottom1 = bottom.getSignals().get(0);
+        AbortableSignal bottom2 = bottom.getSignals().get(1);
+        top1.signalSuccessfulCompletion();
+        bottom1.signalFailure(new RuntimeException());
+        bottom2.signalSuccessfulCompletion();
+        assertFalse(this.signalCompleted);
+        assertTrue(this.signalFailed);
+        assertFalse(this.signalAborted);
+    }
+    
+    @Test
+    public void testNestedBinaryJunctionOrderAbort() {
+        AbortableSignalJunction top = new AbortableSignalJunction(this.signal, 2);
+        AbortableSignal top1 = top.getSignals().get(0);
+        AbortableSignal top2 = top.getSignals().get(1);
+        AbortableSignalJunction bottom = new AbortableSignalJunction(top2, 2);
+        AbortableSignal bottom1 = bottom.getSignals().get(0);
+        AbortableSignal bottom2 = bottom.getSignals().get(1);
+        top1.signalSuccessfulCompletion();
+        bottom1.signalAborted();
+        bottom2.signalSuccessfulCompletion();
+        assertFalse(this.signalCompleted);
+        assertFalse(this.signalFailed);
+        assertTrue(this.signalAborted);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/deployer/core/internal/BundleDeploymentPropertiesTransformerTests.java b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/deployer/core/internal/BundleDeploymentPropertiesTransformerTests.java
new file mode 100644
index 0000000..3de4440
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/deployer/core/internal/BundleDeploymentPropertiesTransformerTests.java
@@ -0,0 +1,98 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core.internal;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.virgo.kernel.install.artifact.BundleInstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.util.common.DirectedAcyclicGraph;
+import org.eclipse.virgo.util.common.GraphNode;
+import org.eclipse.virgo.util.common.ThreadSafeDirectedAcyclicGraph;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifestFactory;
+import org.junit.Test;
+
+
+public class BundleDeploymentPropertiesTransformerTests {
+
+    @Test
+    public void testTransformWithWebContextPath() throws Exception {
+        BundleManifest manifest = BundleManifestFactory.createBundleManifest();
+        
+        Map<String, String> props = new HashMap<String, String>();
+        props.put("header:Web-ContextPath", "/foo");
+        
+        BundleInstallArtifact artifact = createMock(BundleInstallArtifact.class);
+        expect(artifact.getDeploymentProperties()).andReturn(props);
+        expect(artifact.getBundleManifest()).andReturn(manifest);
+        
+        replay(artifact);
+        DirectedAcyclicGraph<InstallArtifact> dag = new ThreadSafeDirectedAcyclicGraph<InstallArtifact>();
+        GraphNode<InstallArtifact> tree = dag.createRootNode(artifact);
+        
+        BundleDeploymentPropertiesTransformer transformer = new BundleDeploymentPropertiesTransformer();
+        transformer.transform(tree, null);
+        verify(artifact);
+        
+        assertEquals("/foo", manifest.getHeader("Web-ContextPath"));
+    }
+    
+    @Test
+    public void testTransformWithNullProperties() throws Exception {
+        BundleManifest manifest = BundleManifestFactory.createBundleManifest();
+        
+        BundleInstallArtifact artifact = createMock(BundleInstallArtifact.class);
+        expect(artifact.getDeploymentProperties()).andReturn(null);
+        
+        replay(artifact);
+        DirectedAcyclicGraph<InstallArtifact> dag = new ThreadSafeDirectedAcyclicGraph<InstallArtifact>();
+        GraphNode<InstallArtifact> tree = dag.createRootNode(artifact);
+        
+        BundleDeploymentPropertiesTransformer transformer = new BundleDeploymentPropertiesTransformer();
+        transformer.transform(tree, null);
+        verify(artifact);
+        
+        assertNull(manifest.getHeader("Web-ContextPath"));
+    }
+    
+    @Test
+    public void testTransformWithNonHeaderProperties() throws Exception {
+        BundleManifest manifest = BundleManifestFactory.createBundleManifest();
+        
+        Map<String, String> props = new HashMap<String, String>();
+        props.put("Web-ContextPath", "/foo");
+        
+        BundleInstallArtifact artifact = createMock(BundleInstallArtifact.class);
+        expect(artifact.getBundleManifest()).andReturn(manifest);
+        expect(artifact.getDeploymentProperties()).andReturn(props);
+        
+        replay(artifact);
+        DirectedAcyclicGraph<InstallArtifact> dag = new ThreadSafeDirectedAcyclicGraph<InstallArtifact>();
+        GraphNode<InstallArtifact> tree = dag.createRootNode(artifact);
+        
+        BundleDeploymentPropertiesTransformer transformer = new BundleDeploymentPropertiesTransformer();
+        transformer.transform(tree, null);
+        verify(artifact);
+        
+        assertNull(manifest.getHeader("Web-ContextPath"));
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/deployer/core/internal/DeployerBlockingSignalTests.java b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/deployer/core/internal/DeployerBlockingSignalTests.java
new file mode 100644
index 0000000..f7c6811
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/deployer/core/internal/DeployerBlockingSignalTests.java
@@ -0,0 +1,142 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core.internal;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.deployer.core.internal.BlockingSignal;
+import org.junit.Test;
+
+
+/**
+ */
+public class DeployerBlockingSignalTests {
+
+    private static final long TEST_PERIOD = 2; //Seconds
+
+    /**
+     * Test method for {@link org.eclipse.virgo.kernel.deployer.core.internal.BlockingSignal#awaitCompletion(long)}.
+     * @throws DeploymentException 
+     */
+    @Test
+    public void testAwaitCompletionBlock() throws DeploymentException {
+        BlockingSignal blockingSignal = new BlockingSignal(true);
+        long start = System.nanoTime();
+        boolean awaitCompletion = blockingSignal.awaitCompletion(TEST_PERIOD);
+        long finish = System.nanoTime();
+        assertFalse(awaitCompletion);
+        assertTrue(finish - start > TEST_PERIOD * 1000 * 1000);
+    }
+    
+    /**
+     * Test method for {@link org.eclipse.virgo.kernel.deployer.core.internal.BlockingSignal#awaitCompletion(long)}.
+     * @throws DeploymentException 
+     */
+    @Test
+    public void testAwaitCompletionBlockSucceed() throws DeploymentException {
+        BlockingSignal blockingSignal = new BlockingSignal(true);
+        long start = System.currentTimeMillis();
+        this.launchThread(blockingSignal, TEST_PERIOD/2);
+        boolean awaitCompletion = blockingSignal.awaitCompletion(TEST_PERIOD);
+        long finish = System.currentTimeMillis();
+        assertTrue(awaitCompletion);
+        assertTrue(finish - start < TEST_PERIOD * 1000);
+    }
+    
+    /**
+     * Test method for {@link org.eclipse.virgo.kernel.deployer.core.internal.BlockingSignal#awaitCompletion(long)}.
+     * @throws DeploymentException 
+     */
+    @Test
+    public void testAwaitCompletionNoBlock() throws DeploymentException {
+        BlockingSignal blockingSignal = new BlockingSignal(false);
+        long start = System.currentTimeMillis();
+        boolean awaitCompletion = blockingSignal.awaitCompletion(TEST_PERIOD);        
+        long finish = System.currentTimeMillis();
+        assertFalse(awaitCompletion);
+        assertTrue(finish - start < TEST_PERIOD * 1000);
+    }
+
+    /**
+     * Test method for {@link org.eclipse.virgo.kernel.deployer.core.internal.BlockingSignal#checkComplete()}.
+     * @throws DeploymentException 
+     */
+    @Test
+    public void testCheckCompleteBlockFast() throws DeploymentException {
+        BlockingSignal blockingSignal = new BlockingSignal(true);
+        long start = System.currentTimeMillis();
+        this.launchThread(blockingSignal, TEST_PERIOD/2);
+        boolean checkCompletion = blockingSignal.checkComplete();
+        long finish = System.currentTimeMillis();
+        assertTrue(checkCompletion);
+        assertTrue(finish - start < TEST_PERIOD * 1000);
+    }
+    
+    /**
+     * Test method for {@link org.eclipse.virgo.kernel.deployer.core.internal.BlockingSignal#checkComplete()}.
+     * @throws DeploymentException 
+     */
+    @Test
+    public void testCheckCompleteBlockSlow() throws DeploymentException {
+        BlockingSignal blockingSignal = new BlockingSignal(true);
+        long start = System.currentTimeMillis();
+        this.launchThread(blockingSignal, TEST_PERIOD + 1);
+        boolean checkCompletion = blockingSignal.checkComplete();
+        long finish = System.currentTimeMillis();
+        assertTrue(checkCompletion);
+        assertTrue(finish - start > TEST_PERIOD * 1000);
+    }
+    
+    /**
+     * Test method for {@link org.eclipse.virgo.kernel.deployer.core.internal.BlockingSignal#checkComplete()}.
+     * @throws DeploymentException 
+     */
+    @Test
+    public void testCheckCompleteNoBlock() throws DeploymentException {
+        BlockingSignal blockingSignal = new BlockingSignal(false);
+        long start = System.currentTimeMillis();
+        boolean checkCompletion = blockingSignal.checkComplete();      
+        long finish = System.currentTimeMillis();
+        assertFalse(checkCompletion);
+        assertTrue(finish - start < TEST_PERIOD * 1000);
+    }
+
+    
+    private void launchThread(BlockingSignal blockingSignal, long seconds) {
+        SignalSucceeder signalSucceeder = new SignalSucceeder(blockingSignal, seconds * 1000);
+        new Thread(signalSucceeder).start();
+    }
+
+    private static class SignalSucceeder implements Runnable{
+
+        private final long timeOut;
+        private final BlockingSignal blockingSignal;
+
+        public SignalSucceeder(BlockingSignal blockingSignal, long timeOut) {
+            this.blockingSignal = blockingSignal;
+            this.timeOut = timeOut;
+        }
+        
+        public void run() {
+            try {
+                Thread.sleep(this.timeOut);
+            } catch (InterruptedException e) {
+                System.out.println("Sleep interupted");
+            }
+            this.blockingSignal.signalSuccessfulCompletion();
+        }
+        
+    }
+    
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/deployer/core/internal/DescopingBundleManifestTests.java b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/deployer/core/internal/DescopingBundleManifestTests.java
new file mode 100644
index 0000000..4791103
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/deployer/core/internal/DescopingBundleManifestTests.java
@@ -0,0 +1,275 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core.internal;
+
+import java.io.IOException;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Version;
+
+import static org.easymock.EasyMock.*;
+
+import org.eclipse.virgo.kernel.deployer.core.internal.DescopingBundleManifest;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+
+public class DescopingBundleManifestTests {
+
+    private BundleManifest descopingBundleManifest;
+
+    private BundleManifest mockBundleManifest;
+
+    @Before
+    public void setup() {
+        this.mockBundleManifest = createMock(BundleManifest.class);
+        this.descopingBundleManifest = new DescopingBundleManifest(this.mockBundleManifest);
+    }
+
+    @Test
+    public void testBundleActivationPolicy() {
+        expect(this.mockBundleManifest.getBundleActivationPolicy()).andReturn(null);
+        replay(this.mockBundleManifest);
+        this.descopingBundleManifest.getBundleActivationPolicy();
+        verify(this.mockBundleManifest);
+    }
+
+    @Test
+    public void testBundleClasspath() {
+        expect(this.mockBundleManifest.getBundleClasspath()).andReturn(null);
+        replay(this.mockBundleManifest);
+        this.descopingBundleManifest.getBundleClasspath();
+        verify(this.mockBundleManifest);
+    }
+
+    @Test
+    public void testBundleDescription() {
+        expect(this.mockBundleManifest.getBundleDescription()).andReturn(null);
+        replay(this.mockBundleManifest);
+        this.descopingBundleManifest.getBundleDescription();
+        verify(this.mockBundleManifest);
+    }
+
+    @Test
+    public void testBundleManifestVersion() {
+        expect(this.mockBundleManifest.getBundleManifestVersion()).andReturn(0);
+        replay(this.mockBundleManifest);
+        this.descopingBundleManifest.getBundleManifestVersion();
+        verify(this.mockBundleManifest);
+    }
+
+    @Test
+    public void testBundleName() {
+        expect(this.mockBundleManifest.getBundleName()).andReturn(null);
+        replay(this.mockBundleManifest);
+        this.descopingBundleManifest.getBundleName();
+        verify(this.mockBundleManifest);
+    }
+
+    @Test
+    public void testBundleSymbolicName() {
+        expect(this.mockBundleManifest.getBundleSymbolicName()).andReturn(null);
+        expect(this.mockBundleManifest.getModuleScope()).andReturn(null);
+        replay(this.mockBundleManifest);
+        this.descopingBundleManifest.getBundleSymbolicName();
+        verify(this.mockBundleManifest);
+    }
+
+    @Test
+    public void testBundleUpdateLocation() {
+        expect(this.mockBundleManifest.getBundleUpdateLocation()).andReturn(null);
+        replay(this.mockBundleManifest);
+        this.descopingBundleManifest.getBundleUpdateLocation();
+        verify(this.mockBundleManifest);
+    }
+
+    @Test
+    public void testBundleVersion() {
+        expect(this.mockBundleManifest.getBundleVersion()).andReturn(null);
+        replay(this.mockBundleManifest);
+        this.descopingBundleManifest.getBundleVersion();
+        verify(this.mockBundleManifest);
+    }
+
+    @Test
+    public void testDynamicImportPackage() {
+        expect(this.mockBundleManifest.getDynamicImportPackage()).andReturn(null);
+        replay(this.mockBundleManifest);
+        this.descopingBundleManifest.getDynamicImportPackage();
+        verify(this.mockBundleManifest);
+    }
+
+    @Test
+    public void testExportPackage() {
+        expect(this.mockBundleManifest.getExportPackage()).andReturn(null);
+        replay(this.mockBundleManifest);
+        this.descopingBundleManifest.getExportPackage();
+        verify(this.mockBundleManifest);
+    }
+
+    @Test
+    public void testFragmentHost() {
+        expect(this.mockBundleManifest.getFragmentHost()).andReturn(null);
+        replay(this.mockBundleManifest);
+        this.descopingBundleManifest.getFragmentHost();
+        verify(this.mockBundleManifest);
+    }
+
+    @Test
+    public void testHeader() {
+        expect(this.mockBundleManifest.getHeader(isA(String.class))).andReturn(null);
+        replay(this.mockBundleManifest);
+        this.descopingBundleManifest.getHeader("");
+        verify(this.mockBundleManifest);
+    }
+
+    @Test
+    public void testImportBundle() {
+        expect(this.mockBundleManifest.getImportBundle()).andReturn(null);
+        replay(this.mockBundleManifest);
+        this.descopingBundleManifest.getImportBundle();
+        verify(this.mockBundleManifest);
+    }
+
+    @Test
+    public void testImportLibrary() {
+        expect(this.mockBundleManifest.getImportLibrary()).andReturn(null);
+        replay(this.mockBundleManifest);
+        this.descopingBundleManifest.getImportLibrary();
+        verify(this.mockBundleManifest);
+    }
+
+    @Test
+    public void testImportPackage() {
+        expect(this.mockBundleManifest.getImportPackage()).andReturn(null);
+        replay(this.mockBundleManifest);
+        this.descopingBundleManifest.getImportPackage();
+        verify(this.mockBundleManifest);
+    }
+
+    @Test
+    public void testModuleScope() {
+        expect(this.mockBundleManifest.getModuleScope()).andReturn(null);
+        replay(this.mockBundleManifest);
+        this.descopingBundleManifest.getModuleScope();
+        verify(this.mockBundleManifest);
+    }
+
+    @Test
+    public void testModuleType() {
+        expect(this.mockBundleManifest.getModuleType()).andReturn(null);
+        replay(this.mockBundleManifest);
+        this.descopingBundleManifest.getModuleType();
+        verify(this.mockBundleManifest);
+    }
+
+    @Test
+    public void testRequireBundle() {
+        expect(this.mockBundleManifest.getRequireBundle()).andReturn(null);
+        replay(this.mockBundleManifest);
+        this.descopingBundleManifest.getRequireBundle();
+        verify(this.mockBundleManifest);
+    }
+
+    @Test
+    public void testSetBundleDescription() {
+        this.mockBundleManifest.setBundleDescription(isA(String.class));
+        expectLastCall();
+        replay(this.mockBundleManifest);
+        this.descopingBundleManifest.setBundleDescription("");
+        verify(this.mockBundleManifest);
+    }
+
+    @Test
+    public void testSetBundleManifestVersion() {
+        this.mockBundleManifest.setBundleManifestVersion(eq(0));
+        expectLastCall();
+        replay(this.mockBundleManifest);
+        this.descopingBundleManifest.setBundleManifestVersion(0);
+        verify(this.mockBundleManifest);
+    }
+
+    @Test
+    public void testSetBundleName() {
+        this.mockBundleManifest.setBundleName(isA(String.class));
+        expectLastCall();
+        replay(this.mockBundleManifest);
+        this.descopingBundleManifest.setBundleName("");
+        verify(this.mockBundleManifest);
+    }
+
+    @Test
+    public void testSetBundleUpdateLocation() throws MalformedURLException {
+        this.mockBundleManifest.setBundleUpdateLocation(isA(URL.class));
+        expectLastCall();
+        replay(this.mockBundleManifest);
+        this.descopingBundleManifest.setBundleUpdateLocation(new URL("http://blah"));
+        verify(this.mockBundleManifest);
+    }
+
+    @Test
+    public void testSetBundleVersion() {
+        this.mockBundleManifest.setBundleVersion(isA(Version.class));
+        expectLastCall();
+        replay(this.mockBundleManifest);
+        this.descopingBundleManifest.setBundleVersion(Version.emptyVersion);
+        verify(this.mockBundleManifest);
+    }
+
+    @Test
+    public void testSetHeader() {
+        this.mockBundleManifest.setHeader(isA(String.class), isA(String.class));
+        expectLastCall();
+        replay(this.mockBundleManifest);
+        this.descopingBundleManifest.setHeader("", "");
+        verify(this.mockBundleManifest);
+    }
+
+    @Test
+    public void testSetModuleScope() {
+        this.mockBundleManifest.setModuleScope(isA(String.class));
+        expectLastCall();
+        replay(this.mockBundleManifest);
+        this.descopingBundleManifest.setModuleScope("");
+        verify(this.mockBundleManifest);
+    }
+
+    @Test
+    public void testSetModuleType() {
+        this.mockBundleManifest.setModuleType(isA(String.class));
+        expectLastCall();
+        replay(this.mockBundleManifest);
+        this.descopingBundleManifest.setModuleType("");
+        verify(this.mockBundleManifest);
+    }
+
+    @Test
+    public void testToDictionary() {
+        expect(this.mockBundleManifest.toDictionary()).andReturn(null);
+        replay(this.mockBundleManifest);
+        this.descopingBundleManifest.toDictionary();
+        verify(this.mockBundleManifest);
+    }
+    
+    @Test
+    public void testWrite() throws IOException {
+        this.mockBundleManifest.write(isA(Writer.class));
+        expectLastCall();
+        replay(this.mockBundleManifest);
+        this.descopingBundleManifest.write(new StringWriter());
+        verify(this.mockBundleManifest);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/deployer/core/internal/ExistingNodeLocatorTests.java b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/deployer/core/internal/ExistingNodeLocatorTests.java
new file mode 100644
index 0000000..fd587a9
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/deployer/core/internal/ExistingNodeLocatorTests.java
@@ -0,0 +1,197 @@
+/*******************************************************************************
+ * Copyright (c) 2012 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core.internal;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.easymock.EasyMock;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.util.common.GraphNode;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Version;
+
+public class ExistingNodeLocatorTests {
+
+    private static final String TEST_SCOPE_NAME = "scope";
+
+    private static final Version TEST_VERSION = Version.emptyVersion;
+
+    private static final String TEST_NAME = "name";
+
+    private static final String TEST_TYPE = "type";
+
+    private InstallArtifact installArtifact;
+
+    @Before
+    public void setUp() throws Exception {
+        this.installArtifact = EasyMock.createMock(InstallArtifact.class);
+        EasyMock.expect(this.installArtifact.getType()).andReturn(TEST_TYPE).anyTimes();
+        EasyMock.expect(this.installArtifact.getName()).andReturn(TEST_NAME).anyTimes();
+        EasyMock.expect(this.installArtifact.getVersion()).andReturn(TEST_VERSION).anyTimes();
+        EasyMock.expect(this.installArtifact.getScopeName()).andReturn(TEST_SCOPE_NAME).anyTimes();
+        EasyMock.replay(this.installArtifact);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        EasyMock.verify(this.installArtifact);
+        EasyMock.reset(this.installArtifact);
+    }
+
+    @Test
+    public void testMatch() {
+        ExistingNodeLocator visitor = new ExistingNodeLocator(TEST_TYPE, TEST_NAME,
+            VersionRange.createExactRange(TEST_VERSION), TEST_SCOPE_NAME);
+        assertFound(visitor);
+    }
+
+    @Test
+    public void testTypeMismatch() {
+        ExistingNodeLocator visitor = new ExistingNodeLocator("a", TEST_NAME, VersionRange.createExactRange(TEST_VERSION),
+            TEST_SCOPE_NAME);
+        assertNotFound(visitor);
+    }
+
+    @Test
+    public void testNameMismatch() {
+        ExistingNodeLocator visitor = new ExistingNodeLocator(TEST_TYPE, "a", VersionRange.createExactRange(TEST_VERSION),
+            TEST_SCOPE_NAME);
+        assertNotFound(visitor);
+    }
+
+    @Test
+    public void testVersionMismatch() {
+        ExistingNodeLocator visitor = new ExistingNodeLocator(TEST_TYPE, TEST_NAME, new VersionRange("[1,1]"),
+            TEST_SCOPE_NAME);
+        assertNotFound(visitor);
+    }
+
+    @Test
+    public void testNonNullScopeNameMismatch() {
+        ExistingNodeLocator visitor = new ExistingNodeLocator(TEST_TYPE, TEST_NAME,
+            VersionRange.createExactRange(TEST_VERSION), "a");
+        assertNotFound(visitor);
+    }
+
+    @Test
+    public void testNullScopeNameMismatch() {
+        ExistingNodeLocator visitor = new ExistingNodeLocator(TEST_TYPE, TEST_NAME,
+            VersionRange.createExactRange(TEST_VERSION), null);
+        assertNotFound(visitor);
+    }
+ 
+    @Test
+    public void testNullScopeNameMismatchAgainstNull() {
+        this.installArtifact = EasyMock.createMock(InstallArtifact.class);
+        EasyMock.expect(this.installArtifact.getType()).andReturn(TEST_TYPE).anyTimes();
+        EasyMock.expect(this.installArtifact.getName()).andReturn(TEST_NAME).anyTimes();
+        EasyMock.expect(this.installArtifact.getVersion()).andReturn(TEST_VERSION).anyTimes();
+        EasyMock.expect(this.installArtifact.getScopeName()).andReturn(null).anyTimes();
+        EasyMock.replay(this.installArtifact);
+
+        ExistingNodeLocator visitor = new ExistingNodeLocator(TEST_TYPE, TEST_NAME,
+            VersionRange.createExactRange(TEST_VERSION), TEST_SCOPE_NAME);
+        assertNotFound(visitor);
+    }
+    
+    @Test
+    public void testNullScopeNameMatchAgainstNull() {
+        this.installArtifact = EasyMock.createMock(InstallArtifact.class);
+        EasyMock.expect(this.installArtifact.getType()).andReturn(TEST_TYPE).anyTimes();
+        EasyMock.expect(this.installArtifact.getName()).andReturn(TEST_NAME).anyTimes();
+        EasyMock.expect(this.installArtifact.getVersion()).andReturn(TEST_VERSION).anyTimes();
+        EasyMock.expect(this.installArtifact.getScopeName()).andReturn(null).anyTimes();
+        EasyMock.replay(this.installArtifact);
+
+        ExistingNodeLocator visitor = new ExistingNodeLocator(TEST_TYPE, TEST_NAME,
+            VersionRange.createExactRange(TEST_VERSION), null);
+        assertFound(visitor);
+    }
+    
+    private void assertFound(ExistingNodeLocator visitor) {
+        TestGraphNode node = new TestGraphNode(this.installArtifact);
+        visitor.visit(node);
+        GraphNode<InstallArtifact> foundNode = visitor.getFoundNode();
+        assertEquals(node, foundNode);
+    }
+ 
+    private void assertNotFound(ExistingNodeLocator visitor) {
+        TestGraphNode node = new TestGraphNode(this.installArtifact);
+        visitor.visit(node);
+        GraphNode<InstallArtifact> foundNode = visitor.getFoundNode();
+        assertNull(foundNode);
+    }
+
+    private static class TestGraphNode implements GraphNode<InstallArtifact> {
+
+        private final InstallArtifact installArtifact;
+
+        TestGraphNode(InstallArtifact installArtifact) {
+            this.installArtifact = installArtifact;
+        }
+
+        @Override
+        public InstallArtifact getValue() {
+            return this.installArtifact;
+        }
+
+        @Override
+        public List<GraphNode<InstallArtifact>> getChildren() {
+            return new ArrayList<GraphNode<InstallArtifact>>();
+        }
+
+        @Override
+        public void addChild(GraphNode<InstallArtifact> child) {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public boolean removeChild(GraphNode<InstallArtifact> child) {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public List<GraphNode<InstallArtifact>> getParents() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public void visit(org.eclipse.virgo.util.common.GraphNode.DirectedAcyclicGraphVisitor<InstallArtifact> visitor) {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public <E extends Exception> void visit(
+            org.eclipse.virgo.util.common.GraphNode.ExceptionThrowingDirectedAcyclicGraphVisitor<InstallArtifact, E> visitor) throws E {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public int size() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public boolean isRootNode() {
+            throw new UnsupportedOperationException();
+        }
+
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/deployer/core/internal/ImportExpandingTransformerTests.java b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/deployer/core/internal/ImportExpandingTransformerTests.java
new file mode 100644
index 0000000..584b2ff
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/deployer/core/internal/ImportExpandingTransformerTests.java
@@ -0,0 +1,180 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core.internal;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.expectLastCall;
+import static org.easymock.EasyMock.isA;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.reset;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.BundleInstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.environment.InstallEnvironment;
+import org.eclipse.virgo.kernel.install.environment.InstallLog;
+import org.eclipse.virgo.kernel.osgi.framework.ImportMergeException;
+import org.eclipse.virgo.kernel.osgi.framework.UnableToSatisfyDependenciesException;
+import org.eclipse.virgo.kernel.osgi.framework.UnableToSatisfyLibraryDependenciesException;
+import org.eclipse.virgo.util.common.DirectedAcyclicGraph;
+import org.eclipse.virgo.util.common.ThreadSafeDirectedAcyclicGraph;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifestFactory;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Version;
+
+/**
+ */
+// TODO Improve the tests to check that the right number of bundles is passed to expandImports
+// TODO Improve the tests to check that bundles in scoped plans are processed as a group
+public class ImportExpandingTransformerTests {
+
+    private BundleInstallArtifact bundleIinstallArtifact;
+
+    private InstallEnvironment installEnvironment;
+
+    private BundleManifest bundleManifest;
+
+    private org.eclipse.virgo.kernel.osgi.framework.ImportExpander importExpander;
+
+    private InstallLog installLog;
+
+	private DirectedAcyclicGraph<InstallArtifact> dag;
+
+    @Before
+    public void setUp() throws Exception {
+    		this.dag = new ThreadSafeDirectedAcyclicGraph<InstallArtifact>();
+        this.bundleIinstallArtifact = createMock(BundleInstallArtifact.class);
+        this.installEnvironment = createMock(InstallEnvironment.class);
+        this.importExpander = createMock(org.eclipse.virgo.kernel.osgi.framework.ImportExpander.class);
+        this.installLog = createMock(InstallLog.class);
+        this.bundleManifest = BundleManifestFactory.createBundleManifest();
+    }
+
+    @After
+    public void tearDown() {
+        resetMocks();
+    }
+
+    private void replayMocks() {
+        replay(this.bundleIinstallArtifact, this.installEnvironment, this.importExpander, this.installLog);
+    }
+
+    private void verifyMocks() {
+        verify(this.bundleIinstallArtifact, this.installEnvironment, this.importExpander, this.installLog);
+    }
+
+    private void resetMocks() {
+        reset(this.bundleIinstallArtifact, this.installEnvironment, this.importExpander, this.installLog);
+    }
+
+    @SuppressWarnings("unchecked")
+    @Test
+    public void testNormalCase() throws DeploymentException, IOException, ImportMergeException, UnableToSatisfyDependenciesException {
+
+        this.bundleManifest.getImportLibrary().addImportedLibrary("lib");
+
+        expect(this.bundleIinstallArtifact.getBundleManifest()).andReturn(this.bundleManifest);
+        expect(this.importExpander.expandImports(isA(List.class))).andReturn(null);
+        expect(this.installEnvironment.getInstallLog()).andReturn(this.installLog);
+        this.installLog.log(isA(Object.class), isA(String.class), isA(String.class));
+        expectLastCall();
+
+        replayMocks();
+
+        ImportExpandingTransformer importExpander = new ImportExpandingTransformer(this.importExpander);
+        importExpander.transform(this.dag.createRootNode(bundleIinstallArtifact), installEnvironment);
+
+        verifyMocks();
+    }
+
+    @Test
+    public void testBundleManifestIOException() throws Exception {
+
+        this.bundleManifest.getImportLibrary().addImportedLibrary("lib");
+
+        expect(this.bundleIinstallArtifact.getBundleManifest()).andThrow(new IOException());
+        expect(this.installEnvironment.getInstallLog()).andReturn(this.installLog);
+        this.installLog.log(isA(Object.class), isA(String.class), isA(String.class));
+        expectLastCall();
+
+        replayMocks();
+
+        ImportExpandingTransformer importExpander = new ImportExpandingTransformer(this.importExpander);
+        try {
+            importExpander.transform(this.dag.createRootNode(bundleIinstallArtifact), installEnvironment);
+        } catch (DeploymentException e) {
+            assertTrue(e.getCause() instanceof IOException);
+        }
+
+        verifyMocks();
+    }
+
+    @SuppressWarnings("unchecked")
+    @Test
+    public void testImportMergeException() throws Exception {
+
+        this.bundleManifest.getImportLibrary().addImportedLibrary("lib");
+
+        expect(this.bundleIinstallArtifact.getBundleManifest()).andReturn(this.bundleManifest);
+        expect(this.importExpander.expandImports(isA(List.class))).andThrow(new ImportMergeException("pkg", "src1", "src2"));
+        expect(this.installEnvironment.getInstallLog()).andReturn(this.installLog);
+        this.installLog.log(isA(Object.class), isA(String.class), isA(String.class), isA(String.class), isA(String.class));
+        expectLastCall();
+
+        replayMocks();
+
+        ImportExpandingTransformer importExpander = new ImportExpandingTransformer(this.importExpander);
+        try {
+            importExpander.transform(this.dag.createRootNode(bundleIinstallArtifact), installEnvironment);
+        } catch (DeploymentException e) {
+            assertTrue(e.getCause() instanceof ImportMergeException);
+        }
+
+        verifyMocks();
+    }
+
+    @SuppressWarnings("unchecked")
+    @Test
+    public void testUnableToSatisfyDependenciesException() throws Exception {
+
+        this.bundleManifest.getImportLibrary().addImportedLibrary("lib");
+
+        expect(this.bundleIinstallArtifact.getBundleManifest()).andReturn(this.bundleManifest);       
+        expect(this.importExpander.expandImports(isA(List.class))).andThrow(
+            new UnableToSatisfyLibraryDependenciesException("sym", new Version("0"), "fail"));
+        expect(this.installEnvironment.getInstallLog()).andReturn(this.installLog);
+        this.installLog.log(isA(Object.class), isA(String.class), isA(String.class), isA(String.class));
+        expectLastCall();
+
+        replayMocks();
+
+        ImportExpandingTransformer importExpander = new ImportExpandingTransformer(this.importExpander);
+        try {
+            importExpander.transform(this.dag.createRootNode(bundleIinstallArtifact), installEnvironment);
+        } catch (DeploymentException e) {
+            assertTrue(e.getCause() instanceof UnableToSatisfyLibraryDependenciesException);
+        }
+
+        verifyMocks();
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/deployer/core/internal/ManifestUpgraderTests.java b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/deployer/core/internal/ManifestUpgraderTests.java
new file mode 100644
index 0000000..bda432f
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/deployer/core/internal/ManifestUpgraderTests.java
@@ -0,0 +1,171 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core.internal;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import java.io.IOException;
+import java.net.URL;
+
+import org.junit.Test;
+import org.osgi.framework.Version;
+
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiFramework;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.deployer.core.internal.ManifestUpgrader;
+import org.eclipse.virgo.kernel.install.artifact.BundleInstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.environment.InstallEnvironment;
+import org.eclipse.virgo.kernel.install.environment.InstallLog;
+import org.eclipse.virgo.repository.Repository;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+import org.eclipse.virgo.util.osgi.manifest.internal.StandardBundleManifest;
+
+public class ManifestUpgraderTests {
+
+    private static final String BUNDLE_SYMBOLIC_NAME = "testBundleName";
+
+    private static final Version BUNDLE_VERSION = Version.emptyVersion;
+
+    private final ManifestUpgrader upgrader = new ManifestUpgrader();
+
+    private final BundleInstallArtifact installArtifact = createMock(BundleInstallArtifact.class);
+
+    private final InstallEnvironment installEnvironment = new StubInstallEnvironment();
+
+    @Test
+    public void notBundleInstallArtifact() throws DeploymentException {
+        this.upgrader.operate(null, null);
+
+        InstallArtifact mock = createMock(InstallArtifact.class);
+        replay(mock);
+        this.upgrader.operate(mock, this.installEnvironment);
+        verify(mock);
+    }
+
+    @Test(expected = DeploymentException.class)
+    public void noAppManifest() throws DeploymentException, IOException {
+        expect(this.installArtifact.getBundleManifest()).andThrow(new IOException());
+        expect(this.installArtifact.getName()).andReturn(BUNDLE_SYMBOLIC_NAME);
+        expect(this.installArtifact.getVersion()).andReturn(BUNDLE_VERSION);
+        replay(this.installArtifact);
+        this.upgrader.operate(this.installArtifact, this.installEnvironment);
+    }
+
+    @Test
+    public void noUpgradeManifest() throws IOException, DeploymentException {
+        BundleManifest bundleManifest = new StandardBundleManifest(null);
+        bundleManifest.setBundleManifestVersion(2);
+        bundleManifest.getBundleSymbolicName().setSymbolicName(BUNDLE_SYMBOLIC_NAME);
+        expect(this.installArtifact.getBundleManifest()).andReturn(bundleManifest);
+        replay(this.installArtifact);
+        this.upgrader.operate(this.installArtifact, this.installEnvironment);
+        verify(this.installArtifact);
+    }
+
+    @Test
+    public void upgradeManifest() throws IOException, DeploymentException {
+        BundleManifest bundleManifest = new StandardBundleManifest(null);
+        bundleManifest.getBundleSymbolicName().setSymbolicName(BUNDLE_SYMBOLIC_NAME);
+        expect(this.installArtifact.getBundleManifest()).andReturn(bundleManifest);
+        replay(this.installArtifact);
+        this.upgrader.operate(this.installArtifact, this.installEnvironment);
+        verify(this.installArtifact);
+        assertEquals(2, bundleManifest.getBundleManifestVersion());
+        assertEquals(BUNDLE_SYMBOLIC_NAME, bundleManifest.getBundleSymbolicName().getSymbolicName());
+    }
+
+    @Test
+    public void upgradeManifestNoSymbolicName() throws IOException, DeploymentException {
+        BundleManifest bundleManifest = new StandardBundleManifest(null);
+        expect(this.installArtifact.getBundleManifest()).andReturn(bundleManifest);
+        expect(this.installArtifact.getName()).andReturn(BUNDLE_SYMBOLIC_NAME);
+        replay(this.installArtifact);
+        this.upgrader.operate(this.installArtifact, this.installEnvironment);
+        verify(this.installArtifact);
+        assertEquals(2, bundleManifest.getBundleManifestVersion());
+        assertEquals(BUNDLE_SYMBOLIC_NAME, bundleManifest.getBundleSymbolicName().getSymbolicName());
+    }
+
+    @Test(expected = DeploymentException.class)
+    public void invalidManifest() throws IOException, DeploymentException {
+        BundleManifest bundleManifest = new StandardBundleManifest(null);
+        bundleManifest.setBundleManifestVersion(2);
+        expect(this.installArtifact.getBundleManifest()).andReturn(bundleManifest);
+        expect(this.installArtifact.getName()).andReturn(BUNDLE_SYMBOLIC_NAME);
+        expect(this.installArtifact.getVersion()).andReturn(BUNDLE_VERSION);
+        replay(this.installArtifact);
+        this.upgrader.operate(this.installArtifact, this.installEnvironment);
+    }
+
+    @Test
+    public void validManifest() throws IOException, DeploymentException {
+        BundleManifest bundleManifest = new StandardBundleManifest(null);
+        bundleManifest.setBundleManifestVersion(2);
+        bundleManifest.getBundleSymbolicName().setSymbolicName(BUNDLE_SYMBOLIC_NAME);
+        expect(this.installArtifact.getBundleManifest()).andReturn(bundleManifest);
+        replay(this.installArtifact);
+        this.upgrader.operate(this.installArtifact, this.installEnvironment);
+        verify(this.installArtifact);
+    }
+
+    @Test
+    public void bundleUpdateLocation() throws IOException, DeploymentException {
+        BundleManifest bundleManifest = new StandardBundleManifest(null);
+        bundleManifest.setBundleUpdateLocation(new URL("file:///"));
+        expect(this.installArtifact.getBundleManifest()).andReturn(bundleManifest);
+        expect(this.installArtifact.getName()).andReturn(BUNDLE_SYMBOLIC_NAME).anyTimes();
+        expect(this.installArtifact.getVersion()).andReturn(BUNDLE_VERSION).anyTimes();
+        replay(this.installArtifact);
+        this.upgrader.operate(this.installArtifact, this.installEnvironment);
+        verify(this.installArtifact);
+        assertNull(bundleManifest.getBundleUpdateLocation());
+    }
+
+    @Test
+    public void noBundleUpdateLocation() throws IOException, DeploymentException {
+        BundleManifest bundleManifest = new StandardBundleManifest(null);
+        bundleManifest.setBundleManifestVersion(2);
+        bundleManifest.getBundleSymbolicName().setSymbolicName(BUNDLE_SYMBOLIC_NAME);
+        expect(this.installArtifact.getBundleManifest()).andReturn(bundleManifest);
+        replay(this.installArtifact);
+        this.upgrader.operate(this.installArtifact, this.installEnvironment);
+        verify(this.installArtifact);
+    }
+
+    private static class StubInstallEnvironment implements InstallEnvironment {
+
+        public InstallLog getInstallLog() {
+            return createMock(InstallLog.class);
+        }
+
+        public QuasiFramework getQuasiFramework() {
+            throw new UnsupportedOperationException();
+        }
+
+        public Repository getRepository() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public void destroy() {
+            throw new UnsupportedOperationException();
+        }
+
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/deployer/core/internal/PipelinedApplicationDeployerTests.java b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/deployer/core/internal/PipelinedApplicationDeployerTests.java
new file mode 100644
index 0000000..1494786
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/deployer/core/internal/PipelinedApplicationDeployerTests.java
@@ -0,0 +1,149 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core.internal;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.createNiceMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.reset;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeployUriNormaliser;
+import org.eclipse.virgo.nano.deployer.api.core.DeployerConfiguration;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.deployer.core.internal.event.DeploymentListener;
+import org.eclipse.virgo.kernel.deployer.model.RuntimeArtifactModel;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactIdentityDeterminer;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifactGraphInclosure;
+import org.eclipse.virgo.kernel.install.environment.InstallEnvironmentFactory;
+import org.eclipse.virgo.kernel.install.pipeline.Pipeline;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class PipelinedApplicationDeployerTests {
+
+    private PipelinedApplicationDeployer pipelinedApplicationDeployer;
+
+    private Pipeline pipeline;
+
+    private InstallArtifactGraphInclosure installArtifactTreeInclosure;
+
+    private ArtifactIdentityDeterminer artifactIdentityDeterminer;
+
+    private InstallEnvironmentFactory installEnvironmentFactory;
+
+    private RuntimeArtifactModel ram;
+
+    private DeploymentListener deploymentListener;
+
+    private EventLogger eventLogger;
+
+    private DeployUriNormaliser normaliser;
+
+    private DeployerConfiguration deployerConfiguration;
+
+    private InstallArtifact installArtifact;
+
+    private final StubBundleContext stubBundleContext = new StubBundleContext();
+
+    @Before
+    public void setup() {
+        this.pipeline = createMock(Pipeline.class);
+        this.installArtifactTreeInclosure = createMock(InstallArtifactGraphInclosure.class);
+        this.artifactIdentityDeterminer = createMock(ArtifactIdentityDeterminer.class);
+        this.installEnvironmentFactory = createMock(InstallEnvironmentFactory.class);
+        this.ram = createMock(RuntimeArtifactModel.class);
+        this.deploymentListener = createMock(DeploymentListener.class);
+        this.eventLogger = createNiceMock(EventLogger.class);
+        this.normaliser = createMock(DeployUriNormaliser.class);
+        this.deployerConfiguration = createMock(DeployerConfiguration.class);
+        this.installArtifact = createMock(InstallArtifact.class);
+        expect(this.deployerConfiguration.getDeploymentTimeoutSeconds()).andReturn(5);
+    }
+
+    @After
+    public void tearDown() {
+        resetMocks();
+    }
+
+    private void startTests() {
+        replay(this.pipeline, this.installArtifactTreeInclosure, this.installEnvironmentFactory, this.ram, this.deploymentListener, this.eventLogger,
+            this.normaliser, this.deployerConfiguration, this.installArtifact);
+        this.pipelinedApplicationDeployer = new PipelinedApplicationDeployer(this.pipeline, this.installArtifactTreeInclosure,
+            this.artifactIdentityDeterminer, this.installEnvironmentFactory, this.ram, this.deploymentListener, this.eventLogger, this.normaliser,
+            this.deployerConfiguration, this.stubBundleContext);
+    }
+
+    private void verifyMocks() {
+        verify(this.pipeline, this.installArtifactTreeInclosure, this.installEnvironmentFactory, this.ram, this.deploymentListener, this.eventLogger,
+            this.normaliser, this.deployerConfiguration, this.installArtifact);
+    }
+
+    private void resetMocks() {
+        reset(this.pipeline, this.installArtifactTreeInclosure, this.installEnvironmentFactory, this.ram, this.deploymentListener, this.eventLogger,
+            this.normaliser, this.deployerConfiguration, this.installArtifact);
+    }
+
+    @Test
+    public void testIsdeployedFalse() throws URISyntaxException, DeploymentException {
+        URI testURI = new URI("foo");
+        expect(this.normaliser.normalise(testURI)).andReturn(null);
+        this.startTests();
+        boolean result = this.pipelinedApplicationDeployer.isDeployed(testURI);
+        this.verifyMocks();
+        assertFalse(result);
+    }
+
+    @Test
+    public void testIsdeployedFalse2() throws URISyntaxException, DeploymentException {
+        URI testURI = new URI("foo");
+        expect(this.normaliser.normalise(testURI)).andReturn(testURI);
+        expect(this.ram.get(testURI)).andReturn(null);
+        this.startTests();
+        boolean result = this.pipelinedApplicationDeployer.isDeployed(testURI);
+        this.verifyMocks();
+        assertFalse(result);
+    }
+
+    @Test
+    public void testIsdeployedSucsess() throws Exception {
+        URI testURI = new URI("foo");
+        expect(this.normaliser.normalise(testURI)).andReturn(testURI);
+        expect(this.ram.get(testURI)).andReturn(this.installArtifact);
+        this.startTests();
+        boolean result = this.pipelinedApplicationDeployer.isDeployed(testURI);
+        this.verifyMocks();
+        assertTrue(result);
+    }
+
+    @Test
+    public void testIsdeployedFail() throws URISyntaxException, DeploymentException {
+        URI testURI = new URI("foo");
+        expect(this.normaliser.normalise(testURI)).andThrow(new DeploymentException("fail"));
+        this.startTests();
+        boolean result = this.pipelinedApplicationDeployer.isDeployed(testURI);
+        this.verifyMocks();
+        assertFalse(result);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/deployer/core/internal/recovery/DeployerRecoveryLogTests.java b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/deployer/core/internal/recovery/DeployerRecoveryLogTests.java
new file mode 100644
index 0000000..a40b29a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/deployer/core/internal/recovery/DeployerRecoveryLogTests.java
@@ -0,0 +1,109 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core.internal.recovery;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.net.URI;
+import java.util.Map;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentOptions;
+import org.eclipse.virgo.kernel.deployer.core.internal.recovery.DeployerRecoveryLog;
+import org.eclipse.virgo.util.io.PathReference;
+
+public class DeployerRecoveryLogTests {
+
+    private PathReference deployArea = new PathReference("build/deployArea");
+
+    @Before
+    public void cleanup() {
+        deployArea.delete(true);
+        deployArea.createDirectory();
+    }
+
+    @Test
+    public void emptyLog() {
+        DeployerRecoveryLog log = new DeployerRecoveryLog(deployArea);
+        assertTrue(log.getRecoveryState().isEmpty());
+    }
+
+    @Test
+    public void recovery() {
+        DeployerRecoveryLog log = new DeployerRecoveryLog(deployArea);
+
+        // all true
+        URI app1 = new File("app/one").toURI();
+        log.add(app1, new DeploymentOptions(true, true, true));
+
+        // all false
+        URI app2 = new File("app/two").toURI();
+        log.add(app2, new DeploymentOptions(false, false, false));
+
+        URI app3 = new File("app/three").toURI();
+        log.add(app3, new DeploymentOptions(false, false, true));
+
+        URI app4 = new File("app/four").toURI();
+        log.add(app4, new DeploymentOptions(false, true, true));
+
+        log = new DeployerRecoveryLog(deployArea);
+
+        Map<URI, DeploymentOptions> recoveryState = log.getRecoveryState();
+        assertEquals(4, recoveryState.size());
+
+        // boolean recoverable, boolean deployerOwned, boolean synchronous
+        DeploymentOptions deploymentOptions = recoveryState.remove(app1);
+        assertNotNull(deploymentOptions);
+        assertTrue(deploymentOptions.getRecoverable());
+        assertTrue(deploymentOptions.getDeployerOwned());
+        assertTrue(deploymentOptions.getSynchronous());
+
+        deploymentOptions = recoveryState.remove(app2);
+        assertNotNull(deploymentOptions);
+        assertFalse(deploymentOptions.getRecoverable());
+        assertFalse(deploymentOptions.getDeployerOwned());
+        assertFalse(deploymentOptions.getSynchronous());
+
+        deploymentOptions = recoveryState.remove(app3);
+        assertNotNull(deploymentOptions);
+        assertFalse(deploymentOptions.getRecoverable());
+        assertFalse(deploymentOptions.getDeployerOwned());
+        assertTrue(deploymentOptions.getSynchronous());
+
+        deploymentOptions = recoveryState.remove(app4);
+        assertNotNull(deploymentOptions);
+        assertFalse(deploymentOptions.getRecoverable());
+        assertTrue(deploymentOptions.getDeployerOwned());
+        assertTrue(deploymentOptions.getSynchronous());
+
+        assertTrue(recoveryState.isEmpty());
+    }
+
+    @Test
+    public void rewrite() {
+        DeployerRecoveryLog log = new DeployerRecoveryLog(deployArea);
+        URI app1 = new File("app/one").toURI();
+        for (int i = 0; i < 100; i++) {
+            log.add(app1, new DeploymentOptions(true, true, true));
+            if (i < 99) {
+                log.remove(app1);
+            }
+        }
+        assertEquals(1, log.getRecoveryState().size());
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/deployer/core/internal/uri/RepositoryDeployUriNormalizerTests.java b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/deployer/core/internal/uri/RepositoryDeployUriNormalizerTests.java
new file mode 100644
index 0000000..410b934
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/deployer/core/internal/uri/RepositoryDeployUriNormalizerTests.java
@@ -0,0 +1,231 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.core.internal.uri;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import java.net.URI;
+import java.util.List;
+import java.util.Set;
+
+import org.junit.Test;
+import org.osgi.framework.Version;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeployerLogEvents;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.deployer.core.internal.uri.RepositoryDeployUriNormaliser;
+import org.eclipse.virgo.medic.eventlog.Level;
+import org.eclipse.virgo.medic.test.eventlog.LoggedEvent;
+import org.eclipse.virgo.medic.test.eventlog.MockEventLogger;
+import org.eclipse.virgo.repository.Attribute;
+import org.eclipse.virgo.repository.Repository;
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+
+public class RepositoryDeployUriNormalizerTests {
+
+    private static final String REPO_NAME = "a repo";
+
+    private static final String BUNDLE_VERSION = "6";
+
+    private static final VersionRange BUNDLE_VERSION_RANGE = VersionRange.createExactRange(new Version(BUNDLE_VERSION));
+
+    private static final String BUNDLE_SYMBOLIC_NAME = "foo";
+
+    private static final String BUNDLE_TYPE = "bundle";
+
+    private static final String REPO_URI = "repository:" + BUNDLE_TYPE + "/" + BUNDLE_SYMBOLIC_NAME + "/" + BUNDLE_VERSION;
+
+    private static final URI NORMALISED = URI.create("normalised://normal");
+
+    private final Repository repository = createMock(Repository.class);
+
+    private final MockEventLogger eventLogger = new MockEventLogger();
+
+    private final RepositoryDeployUriNormaliser normaliser = new RepositoryDeployUriNormaliser(repository, eventLogger);
+
+    private final RepositoryAwareArtifactDescriptor artifactDescriptor = new StubArtifactDescriptor();
+
+    @Test
+    public void normaliseUriWithVersion() throws DeploymentException {
+        URI uri = URI.create("repository:bundle/foo/1.0.0");
+
+        expect(repository.get(BUNDLE_TYPE, BUNDLE_SYMBOLIC_NAME, new VersionRange("[1.0.0,1.0.0]"))).andReturn(artifactDescriptor);
+
+        replay(this.repository);
+
+        URI normalised = this.normaliser.normalise(uri);
+
+        verify(this.repository);
+
+        assertEquals(NORMALISED, normalised);
+
+        assertEquals(0, this.eventLogger.getLoggedEvents().size());
+    }
+
+    @Test
+    public void normaliseUriWithoutVersion() throws DeploymentException {
+        URI uri = URI.create("repository:bundle/foo");
+
+        expect(repository.get(BUNDLE_TYPE, BUNDLE_SYMBOLIC_NAME, VersionRange.NATURAL_NUMBER_RANGE)).andReturn(artifactDescriptor);
+
+        replay(this.repository);
+
+        URI normalised = this.normaliser.normalise(uri);
+
+        verify(this.repository);
+
+        assertEquals(NORMALISED, normalised);
+
+        assertEquals(0, this.eventLogger.getLoggedEvents().size());
+    }
+
+    @Test(expected = DeploymentException.class)
+    public void normaliseMalformedUri() throws DeploymentException {
+        URI uri = URI.create("repository:bundle");
+
+        replay(this.repository);
+        URI normalised = null;
+        try {
+            normalised = this.normaliser.normalise(uri);
+        } finally {
+            verify(this.repository);
+
+            assertNull(normalised);
+
+            assertEquals(1, this.eventLogger.getLoggedEvents().size());
+            assertEquals(uri, this.eventLogger.getLoggedEvents().get(0).getInserts()[0]);
+            assertEquals(DeployerLogEvents.REPOSITORY_DEPLOYMENT_URI_MALFORMED.getEventCode(), this.eventLogger.getLoggedEvents().get(0).getCode());
+            assertEquals(Level.ERROR, this.eventLogger.getLoggedEvents().get(0).getLevel());
+        }
+    }
+
+    @Test(expected = DeploymentException.class)
+    public void normaliseUriWithInvalidVersion() throws DeploymentException {
+        URI uri = URI.create("repository:bundle/foo/6-7");
+
+        replay(this.repository);
+        URI normalised = null;
+        try {
+            normalised = this.normaliser.normalise(uri);
+        } finally {
+            verify(this.repository);
+
+            assertNull(normalised);
+
+            assertEquals(1, this.eventLogger.getLoggedEvents().size());
+            assertEquals("6-7", this.eventLogger.getLoggedEvents().get(0).getInserts()[0]);
+            assertEquals(uri, this.eventLogger.getLoggedEvents().get(0).getInserts()[1]);
+            assertEquals(DeployerLogEvents.REPOSITORY_DEPLOYMENT_INVALID_VERSION.getEventCode(), this.eventLogger.getLoggedEvents().get(0).getCode());
+            assertEquals(Level.ERROR, this.eventLogger.getLoggedEvents().get(0).getLevel());
+        }
+    }
+
+    @Test(expected = DeploymentException.class)
+    public void normaliseUriOfNonExistentArtifact() throws DeploymentException {
+        URI uri = URI.create(REPO_URI);
+
+        expect(repository.getName()).andReturn(REPO_NAME);
+        expect(repository.get(BUNDLE_TYPE, BUNDLE_SYMBOLIC_NAME, BUNDLE_VERSION_RANGE)).andReturn(null);
+
+        replay(this.repository);
+
+        try {
+            this.normaliser.normalise(uri);
+        } finally {
+            List<LoggedEvent> loggedEvents = this.eventLogger.getLoggedEvents();
+            assertEquals(1, loggedEvents.size());
+            LoggedEvent loggedEvent = loggedEvents.get(0);
+            assertEquals(Level.ERROR, loggedEvent.getLevel());
+            assertEquals(DeployerLogEvents.ARTIFACT_NOT_FOUND.getEventCode(), loggedEvent.getCode());
+            
+            Object[] inserts = loggedEvent.getInserts();
+            assertEquals(4, inserts.length);
+            
+            Object type = inserts[0];
+            assertEquals(BUNDLE_TYPE, type);
+            
+            Object name = inserts[1];
+            assertEquals(BUNDLE_SYMBOLIC_NAME, name);
+            
+            Object versionRange = inserts[2];
+            assertEquals(BUNDLE_VERSION_RANGE, versionRange);
+            
+            Object repoName = inserts[3];
+            assertEquals(REPO_NAME, repoName);
+        }
+    }
+
+    private static final class StubArtifactDescriptor implements RepositoryAwareArtifactDescriptor {
+
+        /**
+         * {@inheritDoc}
+         */
+        public Set<Attribute> getAttribute(String name) {
+            throw new UnsupportedOperationException();
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public Set<Attribute> getAttributes() {
+            throw new UnsupportedOperationException();
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public String getFilename() {
+            throw new UnsupportedOperationException();
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public String getName() {
+            throw new UnsupportedOperationException();
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public String getRepositoryName() {
+            throw new UnsupportedOperationException();
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public String getType() {
+            throw new UnsupportedOperationException();
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public URI getUri() {
+            return NORMALISED;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public Version getVersion() {
+            throw new UnsupportedOperationException();
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/deployer/hotenabler/HotDeployerTests.java b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/deployer/hotenabler/HotDeployerTests.java
new file mode 100644
index 0000000..608b5b0
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/deployer/hotenabler/HotDeployerTests.java
@@ -0,0 +1,123 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.hotenabler;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.expectLastCall;
+import static org.easymock.EasyMock.isA;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertTrue;
+
+import java.net.URI;
+import java.util.Map;
+
+import org.eclipse.virgo.nano.deployer.api.core.ApplicationDeployer;
+import org.eclipse.virgo.nano.deployer.api.core.DeployerConfiguration;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentOptions;
+import org.eclipse.virgo.medic.test.eventlog.MockEventLogger;
+import org.eclipse.virgo.util.io.PathReference;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.service.event.Event;
+
+/**
+ */
+public class HotDeployerTests {
+
+    private static final PathReference PICKUP_DIR = new PathReference("build/pickup");
+
+    private ApplicationDeployer deployer;
+
+    @Before
+    public void setUp() {
+        PICKUP_DIR.createDirectory();
+    }
+
+    @After
+    public void cleanUp() {
+        PICKUP_DIR.delete(true);
+    }
+
+    @Test
+    public void deploy() throws Exception {
+        PathReference sourceFile = new PathReference("src/test/resources/test/dummy.txt");
+        assertTrue(sourceFile.exists());
+
+        this.deployer = createMock(ApplicationDeployer.class);
+        DeploymentIdentity deploymentIdentity = new DeploymentIdentity() {
+
+            private static final long serialVersionUID = 1L;
+
+            public String getType() {
+                return null;
+            }
+
+            public String getSymbolicName() {
+                return null;
+            }
+
+            public String getVersion() {
+                return null;
+            }
+
+        };
+        this.deployer.deploy(isA(URI.class), isA(DeploymentOptions.class));
+        expectLastCall().andReturn(deploymentIdentity);
+        replay(this.deployer);
+
+        DeployerConfiguration deployerConfiguration = createMock(DeployerConfiguration.class);
+        expect(deployerConfiguration.getDeploymentPickupDirectory()).andReturn(new PathReference("build/pickup"));
+        expect(deployerConfiguration.getScanIntervalMillis()).andReturn(1000);
+
+        replay(deployerConfiguration);
+
+        HotDeployerEnabler enabler = new HotDeployerEnabler(deployerConfiguration, this.deployer, new MockEventLogger());
+        enabler.handleEvent(new Event("org/eclipse/virgo/kernel/deployer/recovery/COMPLETED", (Map<String, ?>)null));
+
+        try {
+            // Deployer.start() is asynchronous: sleep long
+            // enough for it to have started up
+            Thread.sleep(2000);
+        } catch (InterruptedException ie) {
+
+        }
+
+        PathReference copy = sourceFile.copy(PICKUP_DIR);
+        pauseOnCreate(copy, 4000, 4000);
+        enabler.stop();
+
+        verify(this.deployer);
+    }
+
+    private void pauseOnCreate(PathReference pr, long pause, long timeout) {
+        long start = System.currentTimeMillis();
+
+        while (!pr.exists() && System.currentTimeMillis() - start < timeout) {
+            sleep(100);
+        }
+        if (pr.exists()) {
+            sleep(pause);
+        }
+    }
+
+    private void sleep(long millis) {
+        try {
+            Thread.sleep(millis);
+        } catch (InterruptedException e) {
+
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/deployer/model/internal/StandardRuntimeArtifactModelTests.java b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/deployer/model/internal/StandardRuntimeArtifactModelTests.java
new file mode 100644
index 0000000..b9814c0
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/deployer/model/internal/StandardRuntimeArtifactModelTests.java
@@ -0,0 +1,200 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.model.internal;
+
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Iterator;
+import java.util.Set;
+
+import org.eclipse.virgo.kernel.artifact.fs.ArtifactFS;
+import org.eclipse.virgo.nano.core.AbortableSignal;
+import org.eclipse.virgo.nano.deployer.api.core.DeployUriNormaliser;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.eclipse.virgo.kernel.deployer.core.internal.StandardDeploymentIdentity;
+import org.eclipse.virgo.kernel.deployer.model.DuplicateDeploymentIdentityException;
+import org.eclipse.virgo.kernel.deployer.model.DuplicateFileNameException;
+import org.eclipse.virgo.kernel.deployer.model.DuplicateLocationException;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.util.common.GraphNode;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Version;
+
+/**
+ * 
+ * StandardRuntimeArtifactModelTests
+ * <p />
+ */
+public class StandardRuntimeArtifactModelTests {
+
+    private final InstallArtifact stubInstallArtifact = new StubInstallArtifact();
+    
+    private final DeploymentIdentity deploymentIdentity = new StandardDeploymentIdentity(stubInstallArtifact.getType(), stubInstallArtifact.getName(), stubInstallArtifact.getVersion().toString());
+    
+    private StandardRuntimeArtifactModel standardRuntimeArtifactModel; 
+    
+    private URI testURI;
+    
+    @Before
+    public void setUp() throws URISyntaxException, DuplicateFileNameException, DuplicateLocationException, DuplicateDeploymentIdentityException, DeploymentException{
+        this.testURI =  new URI("file:/foo/test.bar");
+        this.standardRuntimeArtifactModel = new StandardRuntimeArtifactModel(new DeployUriNormaliser(){
+
+            @Override
+            public URI normalise(URI uri) throws DeploymentException {
+                return uri;
+            }
+            
+        });
+
+        this.standardRuntimeArtifactModel.add(this.testURI, this.stubInstallArtifact);
+    }
+
+    @Test
+    public void testGetInstallArtifactByDeploymentIdentity() {
+        assertEquals(this.stubInstallArtifact, this.standardRuntimeArtifactModel.get(this.deploymentIdentity));
+    }
+    
+    @Test
+    public void testGetInstallArtifactByLocation() {
+        assertEquals(this.stubInstallArtifact, this.standardRuntimeArtifactModel.get(this.testURI));
+    }
+    
+    @Test
+    public void testGetLocationByDeploymentIdentity() {
+        URI location = this.standardRuntimeArtifactModel.getLocation(this.deploymentIdentity);
+        assertEquals("file", location.getScheme());
+        if (File.separator.equals("/")) {
+            assertEquals(this.testURI, location);
+            assertEquals("/foo/test.bar", location.getPath());
+        } else {
+            assertTrue(location.getPath().endsWith("\\foo\\test.bar"));
+        }
+    }
+    
+    @Test
+    public void testDelete() throws DeploymentException {
+        assertEquals(this.stubInstallArtifact, this.standardRuntimeArtifactModel.get(this.deploymentIdentity));
+        this.standardRuntimeArtifactModel.delete(this.deploymentIdentity);
+        assertNull(this.standardRuntimeArtifactModel.get(this.deploymentIdentity));
+    }
+    
+    @Test
+    public void testisGCRoot() {
+        assertTrue(this.standardRuntimeArtifactModel.isGCRoot(this.stubInstallArtifact));
+        assertFalse(this.standardRuntimeArtifactModel.isGCRoot(new StubInstallArtifact()));
+    }
+    
+
+    @Test
+    public void testGCRootIterator() {
+        Iterator<InstallArtifact> iterator = this.standardRuntimeArtifactModel.iterator();
+        assertTrue(iterator.hasNext());
+        assertEquals(this.stubInstallArtifact, iterator.next());
+        assertFalse(iterator.hasNext());
+    }
+    
+    @Test
+    public void testDirectoryDeletion() throws DeploymentException, IOException, DuplicateFileNameException, DuplicateLocationException, DuplicateDeploymentIdentityException {
+        // Reset state first.
+        this.standardRuntimeArtifactModel.delete(this.deploymentIdentity);
+        assertNull(this.standardRuntimeArtifactModel.get(this.deploymentIdentity));
+        
+        // Now deploy a file, delete it, and then get the deployed artifact.
+        File dir = new File("build/StandardRuntimeArtifactModelTest.dir/");
+        dir.mkdir();
+        URI uri = dir.toURI();
+        this.standardRuntimeArtifactModel.add(uri, this.stubInstallArtifact);
+        assertEquals(this.stubInstallArtifact, this.standardRuntimeArtifactModel.get(uri));
+        
+        assertTrue(dir.delete());
+        
+        assertEquals(this.stubInstallArtifact, this.standardRuntimeArtifactModel.get(uri));
+
+    }
+    
+    private static class StubInstallArtifact implements InstallArtifact {
+
+        public GraphNode<InstallArtifact> getGraph() {
+            return null;
+        }
+
+        public void stop() throws DeploymentException {
+        }
+
+        public void start() throws DeploymentException {
+            start(null);
+        }
+
+        public void start(AbortableSignal signal) throws DeploymentException {
+        }
+
+        public void uninstall() throws DeploymentException {
+        }
+
+        public ArtifactFS getArtifactFS() {
+            throw new UnsupportedOperationException();
+        }
+
+        public String getName() {
+            return("test-name");
+        }
+
+        public String getRepositoryName() {
+            return("test-repository");
+        }
+
+        public State getState() {
+            throw new UnsupportedOperationException();
+        }
+
+        public String getType() {
+            return("test-type");
+        }
+
+        public Version getVersion() {
+            return Version.emptyVersion;
+        }
+
+        public boolean refresh() {
+            throw new UnsupportedOperationException();
+        }
+
+        public String getProperty(String name) {
+            throw new UnsupportedOperationException();
+        }
+
+        public Set<String> getPropertyNames() {
+            throw new UnsupportedOperationException();
+        }
+
+        public String setProperty(String name, String value) {
+            throw new UnsupportedOperationException();
+        }
+
+        public String getScopeName() {
+            return null;
+        }
+    }
+    
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/AbstractInstallArtifactTests.java b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/AbstractInstallArtifactTests.java
new file mode 100644
index 0000000..93b5aa1
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/AbstractInstallArtifactTests.java
@@ -0,0 +1,226 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.net.URI;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.virgo.kernel.artifact.fs.ArtifactFS;
+import org.eclipse.virgo.nano.core.AbortableSignal;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.util.common.DirectedAcyclicGraph;
+import org.eclipse.virgo.util.common.ThreadSafeDirectedAcyclicGraph;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactIdentity;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactStorage;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact.State;
+import org.eclipse.virgo.medic.test.eventlog.MockEventLogger;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Version;
+
+/**
+ */
+public class AbstractInstallArtifactTests {
+
+    private static final String PROPERTY_NAME = "name";
+
+    private static final String PROPERTY_VALUE = "value";
+
+    private static final String PROPERTY_VALUE_2 = "value2";
+
+    private StubInstallArtifact installArtifact;
+    
+    private StubArtifactStateMonitor artifactStateMonitor;
+
+    @Before
+    public void setUp() throws Exception {
+        this.artifactStateMonitor = new StubArtifactStateMonitor();
+        DirectedAcyclicGraph<InstallArtifact> dag = new ThreadSafeDirectedAcyclicGraph<InstallArtifact>();
+        this.installArtifact = new StubInstallArtifact(artifactStateMonitor);
+        this.installArtifact.setGraph(dag.createRootNode(installArtifact));
+    }
+
+    @After
+    public void tearDown() throws Exception {
+    }
+
+    @Test
+    public void testGetProperty() {
+        assertNull(this.installArtifact.getProperty(PROPERTY_NAME));
+
+        this.installArtifact.setProperty(PROPERTY_NAME, PROPERTY_VALUE);
+        assertEquals(PROPERTY_VALUE, this.installArtifact.getProperty(PROPERTY_NAME));
+    }
+
+    @Test
+    public void testGetPropertyNames() {
+        assertEquals(0, this.installArtifact.getPropertyNames().size());
+
+        this.installArtifact.setProperty(PROPERTY_NAME, PROPERTY_VALUE);
+        Set<String> expectedNames = new HashSet<String>();
+        expectedNames.add(PROPERTY_NAME);
+        assertEquals(expectedNames, this.installArtifact.getPropertyNames());
+    }
+
+    @Test
+    public void testSetProperty() {
+        assertNull(this.installArtifact.setProperty(PROPERTY_NAME, PROPERTY_VALUE));
+        assertEquals(PROPERTY_VALUE, this.installArtifact.setProperty(PROPERTY_NAME, PROPERTY_VALUE_2));
+    }
+
+    @Test
+    public void testStart() throws DeploymentException {
+        this.artifactStateMonitor.setState(State.RESOLVED);
+        this.installArtifact.start(new StubAbortableSignal());
+
+        assertEquals(0, this.installArtifact.doRefreshCount);
+        assertEquals(1, this.installArtifact.doStartCount);
+        assertEquals(0, this.installArtifact.doStopCount);
+        assertEquals(0, this.installArtifact.doUninstallCount);
+    }
+
+    @Test
+    public void testStartWhenAlreadyStarted() throws DeploymentException {
+        this.artifactStateMonitor.setState(State.ACTIVE);
+        this.installArtifact.start(new StubAbortableSignal());
+
+        assertEquals(0, this.installArtifact.doRefreshCount);
+        assertEquals(0, this.installArtifact.doStartCount);
+        assertEquals(0, this.installArtifact.doStopCount);
+        assertEquals(0, this.installArtifact.doUninstallCount);
+    }
+
+    @Test
+    public void testStop() throws DeploymentException {
+        this.artifactStateMonitor.setState(State.ACTIVE);
+        this.installArtifact.stop();
+
+        assertEquals(0, this.installArtifact.doRefreshCount);
+        assertEquals(0, this.installArtifact.doStartCount);
+        assertEquals(1, this.installArtifact.doStopCount);
+        assertEquals(0, this.installArtifact.doUninstallCount);
+    }
+
+    @Test
+    public void testStopWhenNotStarted() throws DeploymentException {
+        this.artifactStateMonitor.setState(State.INSTALLED);
+        this.installArtifact.stop();
+
+        assertEquals(0, this.installArtifact.doRefreshCount);
+        assertEquals(0, this.installArtifact.doStartCount);
+        assertEquals(0, this.installArtifact.doStopCount);
+        assertEquals(0, this.installArtifact.doUninstallCount);
+    }
+
+    @Test
+    public void testRefresh() throws DeploymentException {
+        this.artifactStateMonitor.setState(State.ACTIVE);
+        assertTrue(this.installArtifact.refresh());
+
+        assertEquals(1, this.installArtifact.doRefreshCount);
+        assertEquals(0, this.installArtifact.doStartCount);
+        assertEquals(0, this.installArtifact.doStopCount);
+        assertEquals(0, this.installArtifact.doUninstallCount);
+    }
+
+    @Test
+    public void testUninstall() throws DeploymentException {
+        this.artifactStateMonitor.setState(State.ACTIVE);
+        this.installArtifact.uninstall();
+
+        assertEquals(0, this.installArtifact.doRefreshCount);
+        assertEquals(0, this.installArtifact.doStartCount);
+        assertEquals(1, this.installArtifact.doStopCount);
+        assertEquals(1, this.installArtifact.doUninstallCount);
+    }
+    
+    private static final class StubInstallArtifact extends AbstractInstallArtifact {
+
+        public StubInstallArtifact(ArtifactStateMonitor artifactStateMonitor) {
+            super(new ArtifactIdentity("type", "name", Version.emptyVersion, null), new StubArtifactStorage(), artifactStateMonitor, null, new MockEventLogger());
+        }
+
+        private int doStopCount = 0;
+        
+        private int doStartCount = 0;
+        
+        private int doUninstallCount = 0;
+
+        private int doRefreshCount = 0;
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        protected void doStop() throws DeploymentException {
+            this.doStopCount++;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        protected void doUninstall() throws DeploymentException {
+            this.doUninstallCount++;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        protected void doStart(AbortableSignal signal) throws DeploymentException {
+            this.doStartCount++;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        protected boolean doRefresh() throws DeploymentException {
+            this.doRefreshCount++;
+            return true;
+        }
+
+    }
+    
+    
+    
+    
+    
+    static class StubArtifactStorage implements ArtifactStorage {
+
+        public void delete() {
+        }
+
+        public ArtifactFS getArtifactFS() {
+            return null;
+        }
+
+        public void synchronize() {
+        }
+
+        public void synchronize(URI sourceUri) {
+        }
+
+        public void rollBack() {
+        }
+
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/ArtifactStateMonitorTests.java b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/ArtifactStateMonitorTests.java
new file mode 100644
index 0000000..96f58e1
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/ArtifactStateMonitorTests.java
@@ -0,0 +1,150 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.BundleContext;
+
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.deployer.core.StubInstallArtifactLifecycleListener;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifactLifecycleListener;
+import org.eclipse.virgo.kernel.install.artifact.internal.StandardArtifactStateMonitor;
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+
+/**
+ */
+public class ArtifactStateMonitorTests {
+
+    BundleContext bundleContext;
+
+    ArtifactStateMonitor asm;
+
+    StubInstallArtifactLifecycleListener listener;
+
+    @Before
+    public void setUp() {
+        this.bundleContext = new StubBundleContext();
+        this.asm = new StandardArtifactStateMonitor(this.bundleContext);
+        this.listener = new StubInstallArtifactLifecycleListener();
+        this.bundleContext.registerService(InstallArtifactLifecycleListener.class.getName(), this.listener, null);
+    }
+
+    @Test
+    public void testInstalling() throws DeploymentException {
+        this.listener.assertLifecycleCounts(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+        this.asm.onInstalling(null);
+        this.listener.assertLifecycleCounts(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+    }
+
+    @Test
+    public void testInstallFailed() throws DeploymentException {
+        // Set INSTALLING before failing install so state actually changes to INITIAL.
+        this.asm.onInstalling(null);
+        this.listener.assertLifecycleCounts(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+        this.asm.onInstallFailed(null);
+        this.listener.assertLifecycleCounts(1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+    }
+
+    @Test
+    public void testInstalled() throws DeploymentException {
+        this.listener.assertLifecycleCounts(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+        this.asm.onInstalled(null);
+        this.listener.assertLifecycleCounts(0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+    }
+
+    @Test
+    public void testResolving() throws DeploymentException {
+        this.listener.assertLifecycleCounts(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+        this.asm.onResolving(null);
+        this.listener.assertLifecycleCounts(0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+    }
+
+    @Test
+    public void testResolveFailed() throws DeploymentException {
+        this.listener.assertLifecycleCounts(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+        this.asm.onResolveFailed(null);
+        this.listener.assertLifecycleCounts(0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+    }
+
+    @Test
+    public void testResolved() throws DeploymentException {
+        this.listener.assertLifecycleCounts(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+        this.asm.onResolved(null);
+        this.listener.assertLifecycleCounts(0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+    }
+
+    @Test
+    public void testStarting() throws DeploymentException {
+        this.listener.assertLifecycleCounts(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+        this.asm.onStarting(null);
+        this.listener.assertLifecycleCounts(0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+    }
+
+    @Test
+    public void testStartFailed() throws DeploymentException {
+        this.listener.assertLifecycleCounts(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+        this.asm.onStartFailed(null, null);
+        this.listener.assertLifecycleCounts(0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0);
+    }
+
+    @Test
+    public void testStarted() throws DeploymentException {
+        this.listener.assertLifecycleCounts(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+        this.asm.onStarted(null);
+        this.listener.assertLifecycleCounts(0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0);
+    }
+    
+    @Test
+    public void testStopping() {
+        this.listener.assertLifecycleCounts(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+        this.asm.onStopping(null);
+        this.listener.assertLifecycleCounts(0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0);
+    }
+
+    @Test
+    public void testStopFailed() throws DeploymentException {
+        this.listener.assertLifecycleCounts(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+        this.asm.onStopFailed(null, null);
+        this.listener.assertLifecycleCounts(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0);
+    }
+
+    @Test
+    public void testStopped() {
+        this.listener.assertLifecycleCounts(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+        this.asm.onStopped(null);
+        this.listener.assertLifecycleCounts(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0);
+    }
+    
+    @Test
+    public void testUninstalling() throws DeploymentException {
+        this.listener.assertLifecycleCounts(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+        this.asm.onUninstalling(null);
+        this.listener.assertLifecycleCounts(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0);
+    }
+
+    @Test
+    public void testUninstallFailed() throws DeploymentException {
+        this.listener.assertLifecycleCounts(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+        this.asm.onUninstallFailed(null, null);
+        this.listener.assertLifecycleCounts(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0);
+    }
+
+    @Test
+    public void testUninstalled() throws DeploymentException {
+        this.listener.assertLifecycleCounts(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+        this.asm.onUninstalled(null);
+        this.listener.assertLifecycleCounts(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/AtomicInstallArtifactLifecycleListenerTests.java b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/AtomicInstallArtifactLifecycleListenerTests.java
new file mode 100644
index 0000000..4b47043
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/AtomicInstallArtifactLifecycleListenerTests.java
@@ -0,0 +1,389 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.virgo.kernel.artifact.ArtifactSpecification;
+import org.eclipse.virgo.kernel.artifact.fs.ArtifactFS;
+import org.eclipse.virgo.kernel.artifact.plan.PlanDescriptor.Provisioning;
+import org.eclipse.virgo.nano.core.AbortableSignal;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.PlanInstallArtifact;
+import org.eclipse.virgo.util.common.DirectedAcyclicGraph;
+import org.eclipse.virgo.util.common.GraphNode;
+import org.eclipse.virgo.util.common.ThreadSafeDirectedAcyclicGraph;
+import org.junit.Test;
+import org.osgi.framework.Version;
+
+public class AtomicInstallArtifactLifecycleListenerTests {
+
+    private static enum Methods {
+        ASYNC_START, //
+        START, //
+        STOP, //
+        UNINSTALL
+    }
+
+    private final AtomicInstallArtifactLifecycleListener listener = new AtomicInstallArtifactLifecycleListener();
+
+    private final StubInstallArtifact oneAtomicNoTree = new StubInstallArtifact(true);
+
+    private final StubInstallArtifact oneNonAtomicNoTree = new StubInstallArtifact(false);
+
+    private final StubInstallArtifact oneAtomic = makeChain(new StubInstallArtifact(true));
+
+    private final StubInstallArtifact oneNonAtomic = makeChain(new StubInstallArtifact(false));
+
+    private final StubInstallArtifact twoNonAtomic = makeChain(new StubInstallArtifact(false), new StubInstallArtifact(false));
+
+    private final StubInstallArtifact oneNonAtomicOneAtomic = makeChain(new StubInstallArtifact(true), new StubInstallArtifact(false));
+
+    private final StubInstallArtifact twoNonAtomicOneAtomic = makeChain(new StubInstallArtifact(true), new StubInstallArtifact(false),
+        new StubInstallArtifact(false));
+
+    private final StubInstallArtifact oneNonAtomicOneAtomicOneNonAtomic = makeChain(new StubInstallArtifact(false), new StubInstallArtifact(true),
+        new StubInstallArtifact(false));
+
+    @Test
+    public void onStarting() throws DeploymentException {
+        listener.onStarting(oneAtomicNoTree);
+        assertMethodCalls(oneAtomicNoTree);
+
+        listener.onStarting(oneNonAtomicNoTree);
+        assertMethodCalls(oneNonAtomicNoTree);
+
+        listener.onStarting(oneAtomic);
+        assertMethodCalls(oneAtomic);
+
+        listener.onStarting(oneNonAtomic);
+        assertMethodCalls(oneNonAtomic);
+
+        listener.onStarting(twoNonAtomic);
+        assertMethodCalls(twoNonAtomic);
+        assertMethodCalls(getParent(twoNonAtomic));
+
+        listener.onStarting(oneNonAtomicOneAtomic);
+        assertMethodCalls(oneNonAtomicOneAtomic);
+        assertMethodCalls(getParent(oneNonAtomicOneAtomic), Methods.START);
+
+        listener.onStarting(twoNonAtomicOneAtomic);
+        assertMethodCalls(twoNonAtomicOneAtomic);
+        assertMethodCalls(getParent(twoNonAtomicOneAtomic));
+        assertMethodCalls(getParent(getParent(twoNonAtomicOneAtomic)));
+
+        listener.onStarting(oneNonAtomicOneAtomicOneNonAtomic);
+        assertMethodCalls(oneNonAtomicOneAtomicOneNonAtomic);
+        assertMethodCalls(getParent(oneNonAtomicOneAtomicOneNonAtomic), Methods.START);
+        assertMethodCalls(getParent(getParent(oneNonAtomicOneAtomicOneNonAtomic)));
+    }
+
+    @Test
+    public void onStartFailed() throws DeploymentException {
+        listener.onStartFailed(oneAtomicNoTree, null);
+        assertMethodCalls(oneAtomicNoTree);
+
+        listener.onStartFailed(oneNonAtomicNoTree, null);
+        assertMethodCalls(oneNonAtomicNoTree);
+
+        listener.onStartFailed(oneAtomic, null);
+        assertMethodCalls(oneAtomic);
+
+        listener.onStartFailed(oneNonAtomic, null);
+        assertMethodCalls(oneNonAtomic);
+
+        listener.onStartFailed(twoNonAtomic, null);
+        assertMethodCalls(twoNonAtomic);
+        assertMethodCalls(getParent(twoNonAtomic));
+
+        listener.onStartFailed(oneNonAtomicOneAtomic, null);
+        assertMethodCalls(oneNonAtomicOneAtomic);
+        assertMethodCalls(getParent(oneNonAtomicOneAtomic), Methods.STOP);
+
+        listener.onStartFailed(twoNonAtomicOneAtomic, null);
+        assertMethodCalls(twoNonAtomicOneAtomic);
+        assertMethodCalls(getParent(twoNonAtomicOneAtomic));
+        assertMethodCalls(getParent(getParent(twoNonAtomicOneAtomic)));
+
+        listener.onStartFailed(oneNonAtomicOneAtomicOneNonAtomic, null);
+        assertMethodCalls(oneNonAtomicOneAtomicOneNonAtomic);
+        assertMethodCalls(getParent(oneNonAtomicOneAtomicOneNonAtomic), Methods.STOP);
+        assertMethodCalls(getParent(getParent(oneNonAtomicOneAtomicOneNonAtomic)));
+    }
+
+    @Test
+    public void onStopped() {
+        listener.onStopped(oneAtomicNoTree);
+        assertMethodCalls(oneAtomicNoTree);
+
+        listener.onStopped(oneNonAtomicNoTree);
+        assertMethodCalls(oneNonAtomicNoTree);
+
+        listener.onStopped(oneAtomic);
+        assertMethodCalls(oneAtomic);
+
+        listener.onStopped(oneNonAtomic);
+        assertMethodCalls(oneNonAtomic);
+
+        listener.onStopped(twoNonAtomic);
+        assertMethodCalls(twoNonAtomic);
+        assertMethodCalls(getParent(twoNonAtomic));
+
+        listener.onStopped(oneNonAtomicOneAtomic);
+        assertMethodCalls(oneNonAtomicOneAtomic);
+        assertMethodCalls(getParent(oneNonAtomicOneAtomic), Methods.STOP);
+
+        listener.onStopped(twoNonAtomicOneAtomic);
+        assertMethodCalls(twoNonAtomicOneAtomic);
+        assertMethodCalls(getParent(twoNonAtomicOneAtomic));
+        assertMethodCalls(getParent(getParent(twoNonAtomicOneAtomic)));
+
+        listener.onStopped(oneNonAtomicOneAtomicOneNonAtomic);
+        assertMethodCalls(oneNonAtomicOneAtomicOneNonAtomic);
+        assertMethodCalls(getParent(oneNonAtomicOneAtomicOneNonAtomic), Methods.STOP);
+        assertMethodCalls(getParent(getParent(oneNonAtomicOneAtomicOneNonAtomic)));
+    }
+
+    @Test
+    public void onUninstalled() throws DeploymentException {
+        listener.onUninstalled(oneAtomicNoTree);
+        assertMethodCalls(oneAtomicNoTree);
+
+        listener.onUninstalled(oneNonAtomicNoTree);
+        assertMethodCalls(oneNonAtomicNoTree);
+
+        listener.onUninstalled(oneAtomic);
+        assertMethodCalls(oneAtomic);
+
+        listener.onUninstalled(oneNonAtomic);
+        assertMethodCalls(oneNonAtomic);
+
+        listener.onUninstalled(twoNonAtomic);
+        assertMethodCalls(twoNonAtomic);
+        assertMethodCalls(getParent(twoNonAtomic));
+
+        listener.onUninstalled(oneNonAtomicOneAtomic);
+        assertMethodCalls(oneNonAtomicOneAtomic);
+        assertMethodCalls(getParent(oneNonAtomicOneAtomic), Methods.UNINSTALL);
+
+        listener.onUninstalled(twoNonAtomicOneAtomic);
+        assertMethodCalls(twoNonAtomicOneAtomic);
+        assertMethodCalls(getParent(twoNonAtomicOneAtomic));
+        assertMethodCalls(getParent(getParent(twoNonAtomicOneAtomic)));
+
+        listener.onUninstalled(oneNonAtomicOneAtomicOneNonAtomic);
+        assertMethodCalls(oneNonAtomicOneAtomicOneNonAtomic);
+        assertMethodCalls(getParent(oneNonAtomicOneAtomicOneNonAtomic), Methods.UNINSTALL);
+        assertMethodCalls(getParent(getParent(oneNonAtomicOneAtomicOneNonAtomic)));
+    }
+
+    private StubInstallArtifact getParent(StubInstallArtifact artifact) {
+        GraphNode<InstallArtifact> tree = artifact.getGraph();
+        if (tree != null) {
+        		List<GraphNode<InstallArtifact>> parents = tree.getParents();
+            // TODO DAG: when the Tree is generalised to a DAG, this testcase can assume the DAG is still a tree in structure because the testcase constructs the tree.
+            // TODO DAG Test case uses tree. -> get first parent.
+            if (!parents.isEmpty()) {
+            		GraphNode<InstallArtifact> parent = tree.getParents().get(0);
+                return (StubInstallArtifact) parent.getValue();
+            }
+        }
+        return null;
+    }
+
+    private void assertMethodCalls(StubInstallArtifact artifact, Methods... methods) {
+        List<Methods> calledMethods = Arrays.asList(methods);
+        if (calledMethods.contains(Methods.START)) {
+            assertTrue(artifact.getStartCalled());
+        } else {
+            assertFalse(artifact.getStartCalled());
+        }
+
+        if (calledMethods.contains(Methods.STOP)) {
+            assertTrue(artifact.getStopCalled());
+        } else {
+            assertFalse(artifact.getStopCalled());
+        }
+
+        if (calledMethods.contains(Methods.UNINSTALL)) {
+            assertTrue(artifact.getUninstallCalled());
+        } else {
+            assertFalse(artifact.getUninstallCalled());
+        }
+    }
+
+    /**
+     * Create a chain (linear tree) behind a list of values:
+     * 
+     * <pre>
+     * makeChain([a,b,c])
+     * </pre>
+     * 
+     * produces
+     * 
+     * <pre>
+     * (a)->(b)->(c)
+     * </pre>
+     * 
+     * and returns <code><em>c</em></code>, the value of the last node (with tree attached).
+     * 
+     * @param installArtifactArray array of values to be in nodes of chain tree
+     * @return value (with tree attached) at last leaf of chain tree
+     */
+    private final static StubInstallArtifact makeChain(StubInstallArtifact... installArtifactArray) {
+        DirectedAcyclicGraph<InstallArtifact> dag = new ThreadSafeDirectedAcyclicGraph<InstallArtifact>();
+        GraphNode<InstallArtifact> graph = null;
+        for (StubInstallArtifact installArtifact : installArtifactArray) {
+            GraphNode<InstallArtifact> leaf = dag.createRootNode(installArtifact);
+			if (graph == null) {
+				graph = leaf;
+			} else {
+                graph.addChild(leaf);
+                graph = leaf;
+            }
+			installArtifact.setGraph(graph);
+        }
+        
+        if(graph == null){
+        		return null;
+        }
+        return (StubInstallArtifact) graph.getValue();
+    }
+
+    private static class StubInstallArtifact implements PlanInstallArtifact {
+
+        private final boolean atomic;
+
+        private volatile GraphNode<InstallArtifact> graph;
+
+        private volatile boolean startCalled = false;
+
+        private volatile boolean stopCalled = false;
+
+        private volatile boolean uninstallCalled = false;
+
+        public StubInstallArtifact(boolean atomic) {
+            this.atomic = atomic;
+        }
+
+        public boolean getStartCalled() {
+            return startCalled;
+        }
+
+        public boolean getStopCalled() {
+            return stopCalled;
+        }
+
+        public boolean getUninstallCalled() {
+            return uninstallCalled;
+        }
+
+        public GraphNode<InstallArtifact> getGraph() {
+            return this.graph;
+        }
+
+        public void setGraph(GraphNode<InstallArtifact> graph) {
+            this.graph = graph;
+        }
+
+        public void stop() throws DeploymentException {
+            this.stopCalled = true;
+        }
+
+        public void start() throws DeploymentException {
+            start(null);
+        }
+
+        public void start(AbortableSignal signal) throws DeploymentException {
+            this.startCalled = true;
+        }
+
+        public void uninstall() throws DeploymentException {
+            this.uninstallCalled = true;
+        }
+
+        public boolean isAtomic() {
+            return this.atomic;
+        }
+
+        public ArtifactFS getArtifactFS() {
+            throw new UnsupportedOperationException();
+        }
+
+        public String getName() {
+            throw new UnsupportedOperationException();
+        }
+
+        public String getRepositoryName() {
+            throw new UnsupportedOperationException();
+        }
+
+        public State getState() {
+            throw new UnsupportedOperationException();
+        }
+
+        public String getType() {
+            throw new UnsupportedOperationException();
+        }
+
+        public Version getVersion() {
+            throw new UnsupportedOperationException();
+        }
+
+        public boolean refresh() {
+            throw new UnsupportedOperationException();
+        }
+
+        public List<ArtifactSpecification> getArtifactSpecifications() {
+            throw new UnsupportedOperationException();
+        }
+
+        public boolean isScoped() {
+            throw new UnsupportedOperationException();
+        }
+
+        public boolean refresh(String symbolicName) throws DeploymentException {
+            throw new UnsupportedOperationException();
+        }
+
+        public boolean refreshScope() {
+            throw new UnsupportedOperationException();
+        }
+
+        public String getProperty(String name) {
+            throw new UnsupportedOperationException();
+        }
+
+        public Set<String> getPropertyNames() {
+            throw new UnsupportedOperationException();
+        }
+
+        public String setProperty(String name, String value) {
+            throw new UnsupportedOperationException();
+        }
+
+        public String getScopeName() {
+            return null;
+        }
+
+        public Provisioning getProvisioning() {
+            throw new UnsupportedOperationException();
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/FileMovingArtifactStoreTests.java b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/FileMovingArtifactStoreTests.java
new file mode 100644
index 0000000..2b5c57c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/FileMovingArtifactStoreTests.java
@@ -0,0 +1,160 @@
+/*******************************************************************************
+ * Copyright (c) 2012 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+
+import org.eclipse.virgo.util.io.PathReference;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+
+public class FileMovingArtifactStoreTests {
+
+    private static final String TEST_PATH = "build/fileMovingArtifactStoreTests/";
+
+    private static final String TEST_FILENAME = "some.jar";
+
+    private ArtifactStore artifactHistory;
+
+    @Before
+    public void setUp() throws Exception {
+        PathReference basePathReference = new PathReference(TEST_PATH + TEST_FILENAME);
+        basePathReference.delete(true);
+        this.artifactHistory = new FileMovingArtifactStore(basePathReference);
+    }
+
+    @Test
+    public void testGetCurrentPathReference() {
+        PathReference c = this.artifactHistory.getCurrentPath();
+        checkPath(c);
+    }
+
+    @Test
+    public void testStash() {
+        PathReference original = this.artifactHistory.getCurrentPath();
+        this.artifactHistory.save();
+        PathReference c = this.artifactHistory.getCurrentPath();
+        checkPath(c);
+        assertTrue(original.equals(c));
+    }
+
+    @Test
+    public void testUnstash() {
+        PathReference original = this.artifactHistory.getCurrentPath();
+        this.artifactHistory.save();
+        this.artifactHistory.restore();
+        PathReference c = this.artifactHistory.getCurrentPath();
+        checkPath(c);
+        assertTrue(original.equals(c));
+    }
+
+    @Test
+    public void testRepeatedStash() {
+        PathReference original = this.artifactHistory.getCurrentPath();
+        this.artifactHistory.save();
+        PathReference next = this.artifactHistory.getCurrentPath();
+        this.artifactHistory.save();
+        PathReference last = this.artifactHistory.getCurrentPath();
+        checkPath(last);
+        assertTrue(original.equals(next));
+        assertTrue(original.equals(last));
+    }
+
+    @Test
+    public void testFileDeletionOnUnstash() {
+        this.artifactHistory.save();
+        PathReference c = this.artifactHistory.getCurrentPath();
+        c.createFile();
+        assertTrue(c.exists());
+        this.artifactHistory.restore();
+        assertFalse(c.exists());
+    }
+
+    @Test
+    public void testDirectoryDeletionOnUnstash() {
+        this.artifactHistory.save();
+        PathReference c = this.artifactHistory.getCurrentPath();
+        c.createDirectory();
+        assertTrue(c.exists());
+        this.artifactHistory.restore();
+        assertFalse(c.exists());
+    }
+
+    @Test
+    public void testFileDeletionOnDoubleStash() {
+        PathReference c = this.artifactHistory.getCurrentPath();
+        c.createFile();
+        assertTrue(c.exists());
+        this.artifactHistory.save();
+        assertFalse(c.exists());
+        this.artifactHistory.save();
+        assertFalse(c.exists());
+    }
+
+    @Test
+    public void testDirectoryDeletionOnDoubleStash() {
+        PathReference c = this.artifactHistory.getCurrentPath();
+        c.createDirectory();
+        assertTrue(c.exists());
+        this.artifactHistory.save();
+        assertFalse(c.exists());
+        this.artifactHistory.save();
+        assertFalse(c.exists());
+    }
+
+    @Test(expected = IllegalStateException.class)
+    public void testBadUnstash() {
+        this.artifactHistory.restore();
+    }
+
+    @Test(expected = IllegalStateException.class)
+    public void testDoubleUnstash() {
+        this.artifactHistory.save();
+        this.artifactHistory.save();
+        this.artifactHistory.restore();
+        this.artifactHistory.restore();
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testNullConstructorPath() {
+        new FileMovingArtifactStore(null);
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testEmptyConstructorPath() {
+        new FileMovingArtifactStore(new PathReference(""));
+    }
+
+    @Test
+    @Ignore("review the inactive / failing test")
+    // TODO - review the (from the beginning) inactive test
+    public void testDirectorylessConstructorPath() {
+        ArtifactStore ph = new FileMovingArtifactStore(new PathReference("a"));
+        assertEquals("a", ph.getCurrentPath().getName());
+    }
+
+    private void checkPath(PathReference c) {
+        File file = c.toFile();
+        assertTrue(file.toURI().toString().indexOf(TEST_PATH) != -1);
+        assertEquals(TEST_FILENAME, c.getName());
+        assertFalse(c.exists());
+        PathReference parent = c.getParent();
+        assertTrue(parent.isDirectory());
+        assertTrue(parent.exists());
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/GenerationalArtifactStoreTests.java b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/GenerationalArtifactStoreTests.java
new file mode 100644
index 0000000..aae8f7f
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/GenerationalArtifactStoreTests.java
@@ -0,0 +1,230 @@
+/*******************************************************************************
+ * Copyright (c) 2012 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+
+import org.eclipse.virgo.util.io.PathReference;
+import org.junit.Before;
+import org.junit.Test;
+
+public class GenerationalArtifactStoreTests {
+    
+    private static final String TEST_PATH = "build/generationalArtifactStoreTests/";
+    
+    private static final String TEST_FILENAME = "some.jar";
+    
+    private ArtifactStore artifactStore;
+
+    @Before
+    public void setUp() throws Exception {
+        (new PathReference(TEST_PATH)).delete(true);
+        this.artifactStore = new GenerationalArtifactStore(new PathReference(TEST_PATH + TEST_FILENAME));
+    }
+
+    @Test
+    public void testGetCurrentPathReference() {
+        PathReference c = this.artifactStore.getCurrentPath();
+        checkPath(c);
+    }
+
+    @Test
+    public void testStash() {
+        PathReference original = this.artifactStore.getCurrentPath();
+        this.artifactStore.save();
+        PathReference c = this.artifactStore.getCurrentPath();
+        checkPath(c);
+        assertFalse(original.equals(c));
+    }
+
+    @Test
+    public void testUnstash() {
+        PathReference original = this.artifactStore.getCurrentPath();
+        this.artifactStore.save();
+        this.artifactStore.restore();
+        PathReference c = this.artifactStore.getCurrentPath();
+        checkPath(c);
+        assertTrue(original.equals(c));
+
+    }
+    
+    @Test
+    public void testRepeatedStash() {
+        PathReference original = this.artifactStore.getCurrentPath();
+        this.artifactStore.save();
+        PathReference next = this.artifactStore.getCurrentPath();
+        this.artifactStore.save();
+        PathReference last = this.artifactStore.getCurrentPath();
+        checkPath(last);
+        assertFalse(original.equals(next));
+        assertFalse(original.equals(last));
+    }
+    
+    @Test
+    public void testFileDeletionOnUnstash() {
+        this.artifactStore.save();
+        PathReference c = this.artifactStore.getCurrentPath();
+        c.createFile();
+        assertTrue(c.exists());
+        this.artifactStore.restore();
+        assertFalse(c.exists());
+    }
+
+    @Test
+    public void testDirectoryDeletionOnUnstash() {
+        this.artifactStore.save();
+        PathReference c = this.artifactStore.getCurrentPath();
+        c.createDirectory();
+        assertTrue(c.exists());
+        this.artifactStore.restore();
+        assertFalse(c.exists());
+    }
+
+    @Test
+    public void testFileDeletionOnDoubleStash() {
+        PathReference c = this.artifactStore.getCurrentPath();
+        c.createFile();
+        assertTrue(c.exists());
+        this.artifactStore.save();
+        assertTrue(c.exists());
+        this.artifactStore.save();
+        assertFalse(c.exists());
+    }
+    
+    @Test
+    public void testDirectoryDeletionOnDoubleStash() {
+        PathReference c = this.artifactStore.getCurrentPath();
+        c.createDirectory();
+        assertTrue(c.exists());
+        this.artifactStore.save();
+        assertTrue(c.exists());
+        this.artifactStore.save();
+        assertFalse(c.exists());
+    }
+    
+    @Test(expected=IllegalStateException.class)
+    public void testBadUnstash() {
+        this.artifactStore.restore();
+    }
+
+    @Test(expected=IllegalStateException.class)
+    public void testDoubleUnstash() {
+        this.artifactStore.save();
+        this.artifactStore.save();
+        this.artifactStore.restore();
+        this.artifactStore.restore();
+    }
+    
+    @Test(expected=IllegalArgumentException.class)
+    public void testNullConstructorPath() {
+        new GenerationalArtifactStore(null);
+    }
+    
+    @Test(expected=IllegalArgumentException.class)
+    public void testEmptyConstructorPath() {
+        new GenerationalArtifactStore(new PathReference(""));
+    }
+    
+    @Test
+    public void testFileRecovery() {
+        PathReference p1 = this.artifactStore.getCurrentPath();
+        p1.createFile();
+        assertTrue(p1.exists());
+        
+        this.artifactStore.save();
+        PathReference p2 = this.artifactStore.getCurrentPath();
+        p2.createFile();
+        assertTrue(p1.exists());
+        assertTrue(p2.exists());
+        
+        this.artifactStore.save();
+        PathReference p3 = this.artifactStore.getCurrentPath();
+        p3.createFile();
+        assertFalse(p1.exists());
+        assertTrue(p2.exists());
+        assertTrue(p3.exists());
+        
+        this.artifactStore.save();
+        PathReference p4 = this.artifactStore.getCurrentPath();
+        p4.createFile();
+        assertFalse(p1.exists());
+        assertFalse(p2.exists());
+        assertTrue(p3.exists());
+        assertTrue(p4.exists());
+        
+        ArtifactStore newArtifactStore = new GenerationalArtifactStore(new PathReference(TEST_PATH + TEST_FILENAME));
+        PathReference p = newArtifactStore.getCurrentPath();
+        assertEquals(p4, p);
+        assertFalse(p1.exists());
+        assertFalse(p2.exists());
+        assertTrue(p3.exists());
+        assertTrue(p4.exists());
+    }
+    
+    @Test
+    public void testDirectoryRecovery() {
+        PathReference p1 = this.artifactStore.getCurrentPath();
+        p1.createDirectory();
+        assertTrue(p1.exists());
+        
+        this.artifactStore.save();
+        PathReference p2 = this.artifactStore.getCurrentPath();
+        p2.createDirectory();
+        assertTrue(p1.exists());
+        assertTrue(p2.exists());
+        
+        this.artifactStore.save();
+        PathReference p3 = this.artifactStore.getCurrentPath();
+        p3.createDirectory();
+        assertFalse(p1.exists());
+        assertTrue(p2.exists());
+        assertTrue(p3.exists());
+        
+        this.artifactStore.save();
+        PathReference p4 = this.artifactStore.getCurrentPath();
+        p4.createDirectory();
+        assertFalse(p1.exists());
+        assertFalse(p2.exists());
+        assertTrue(p3.exists());
+        assertTrue(p4.exists());
+        
+        ArtifactStore newArtifactStore = new GenerationalArtifactStore(new PathReference(TEST_PATH + TEST_FILENAME));
+        PathReference p = newArtifactStore.getCurrentPath();
+        assertEquals(p4, p);
+        assertFalse(p1.exists());
+        assertFalse(p2.exists());
+        assertTrue(p3.exists());
+        assertTrue(p4.exists());
+    }
+       
+    public void testDirectorylessConstructorPath() {
+        ArtifactStore ph = new GenerationalArtifactStore(new PathReference("a"));
+        assertEquals("a", ph.getCurrentPath().getName());
+    }
+
+
+    private void checkPath(PathReference c) {
+        File file = c.toFile();
+        assertTrue(file.toURI().toString().indexOf(TEST_PATH) != -1);
+        assertEquals(TEST_FILENAME, c.getName());
+        assertFalse(c.exists());
+        PathReference parent = c.getParent();
+        assertTrue(parent.isDirectory());
+        assertTrue(parent.exists());
+    }
+
+}
+
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/PlanMemberCollectorTests.java b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/PlanMemberCollectorTests.java
new file mode 100644
index 0000000..3ebccd4
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/PlanMemberCollectorTests.java
@@ -0,0 +1,111 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import static org.easymock.EasyMock.createNiceMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.List;
+
+import org.eclipse.virgo.kernel.install.artifact.BundleInstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.PlanInstallArtifact;
+import org.eclipse.virgo.util.common.DirectedAcyclicGraph;
+import org.eclipse.virgo.util.common.GraphNode;
+import org.eclipse.virgo.util.common.ThreadSafeDirectedAcyclicGraph;
+import org.junit.Test;
+
+
+/**
+ */
+public class PlanMemberCollectorTests {
+
+    private final PlanMemberCollector collector = new PlanMemberCollector();
+    
+    @Test
+    public void rootPlanIsNotIncludedInTheCollection() {
+        PlanInstallArtifact plan = createNiceMock(PlanInstallArtifact.class);
+
+        DirectedAcyclicGraph<InstallArtifact> dag = new ThreadSafeDirectedAcyclicGraph<InstallArtifact>();
+        GraphNode<InstallArtifact> graph = dag.createRootNode(plan);
+
+        expect(plan.getGraph()).andReturn(graph);
+        
+        replay(plan);
+        
+        List<InstallArtifact> members = this.collector.collectPlanMembers(plan);
+        assertNotNull(members);
+        assertEquals(0, members.size());
+    }
+    
+    @Test
+    public void singleLevelPlan() {
+        PlanInstallArtifact plan = createNiceMock(PlanInstallArtifact.class);
+        DirectedAcyclicGraph<InstallArtifact> dag = new ThreadSafeDirectedAcyclicGraph<InstallArtifact>();
+        GraphNode<InstallArtifact> tree = dag.createRootNode(plan);
+        
+        BundleInstallArtifact bundle1 = createNiceMock(BundleInstallArtifact.class);
+        tree.addChild(dag.createRootNode(bundle1));
+        
+        BundleInstallArtifact bundle2 = createNiceMock(BundleInstallArtifact.class);
+        tree.addChild(dag.createRootNode(bundle2));
+        
+        expect(plan.getGraph()).andReturn(tree);
+        
+        replay(plan);
+        
+        List<InstallArtifact> members = this.collector.collectPlanMembers(plan);
+        assertNotNull(members);
+        assertEquals(2, members.size());
+        assertTrue(members.contains(bundle1));
+        assertTrue(members.contains(bundle2));
+    }
+    
+    @Test
+    public void nestedPlan() {
+        PlanInstallArtifact plan = createNiceMock(PlanInstallArtifact.class);
+        DirectedAcyclicGraph<InstallArtifact> dag = new ThreadSafeDirectedAcyclicGraph<InstallArtifact>();
+        GraphNode<InstallArtifact> tree = dag.createRootNode(plan);
+
+        expect(plan.getGraph()).andReturn(tree);
+        
+        BundleInstallArtifact bundle1 = createNiceMock(BundleInstallArtifact.class);
+        tree.addChild(dag.createRootNode(bundle1));
+        
+        BundleInstallArtifact bundle2 = createNiceMock(BundleInstallArtifact.class);
+        tree.addChild(dag.createRootNode(bundle2));
+        
+        PlanInstallArtifact nestedPlan = createNiceMock(PlanInstallArtifact.class);
+        GraphNode<InstallArtifact> nestedTree = dag.createRootNode(nestedPlan);
+        expect(nestedPlan.getGraph()).andReturn(nestedTree);
+        
+        BundleInstallArtifact bundle3 = createNiceMock(BundleInstallArtifact.class);
+        nestedTree.addChild(dag.createRootNode(bundle3));
+        
+        tree.addChild(nestedTree);
+        
+        replay(plan, nestedPlan);
+        
+        List<InstallArtifact> members = this.collector.collectPlanMembers(plan);
+        assertNotNull(members);
+        assertEquals(4, members.size());
+        assertTrue(members.contains(bundle1));
+        assertTrue(members.contains(bundle2));
+        assertTrue(members.contains(nestedPlan));
+        assertTrue(members.contains(bundle3));
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/ScopeServiceRepositoryTests.java b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/ScopeServiceRepositoryTests.java
new file mode 100644
index 0000000..8a82280
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/ScopeServiceRepositoryTests.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.io.Serializable;
+import java.util.Dictionary;
+import java.util.Hashtable;
+
+import org.eclipse.virgo.kernel.install.artifact.ScopeServiceRepository;
+import org.junit.Test;
+
+
+/**
+ */
+public class ScopeServiceRepositoryTests {
+
+    private static final String TEST_SCOPE = "test";
+
+    @Test
+    public void testServiceWithSingleTypeNoFilter() throws Exception {
+        ScopeServiceRepository repository = new StandardScopeServiceRepository();
+        repository.recordService(TEST_SCOPE, new String[]{String.class.getName()}, null);
+        assertTrue(repository.scopeHasMatchingService(TEST_SCOPE, String.class.getName(), null));
+        assertFalse(repository.scopeHasMatchingService(TEST_SCOPE, Integer.class.getName(), null));
+    }
+    
+    @Test
+    public void testServiceWithSingleTypeFiltered() throws Exception {
+        ScopeServiceRepository repository = new StandardScopeServiceRepository();
+        Dictionary<String, Object> p = new Hashtable<String, Object>();
+        p.put("foo", "bar");
+        repository.recordService(TEST_SCOPE, new String[]{String.class.getName()}, p);
+        assertTrue(repository.scopeHasMatchingService(TEST_SCOPE, String.class.getName(), "(foo=bar)"));
+        assertFalse(repository.scopeHasMatchingService(TEST_SCOPE, Integer.class.getName(), "(foo=bar)"));
+    }
+    
+    @Test
+    public void testServiceWithMultiTypeNoFilter() throws Exception {
+        ScopeServiceRepository repository = new StandardScopeServiceRepository();
+        repository.recordService(TEST_SCOPE, new String[]{String.class.getName(), Serializable.class.getName()}, null);
+        assertTrue(repository.scopeHasMatchingService(TEST_SCOPE, String.class.getName(), null));
+        assertTrue(repository.scopeHasMatchingService(TEST_SCOPE, Serializable.class.getName(), null));
+        assertFalse(repository.scopeHasMatchingService(TEST_SCOPE, Integer.class.getName(), null));
+    }
+    
+    @Test
+    public void testServiceWithMultiTypeFilter() throws Exception {
+        ScopeServiceRepository repository = new StandardScopeServiceRepository();
+        Dictionary<String, Object> p = new Hashtable<String, Object>();
+        p.put("foo", "bar");
+        repository.recordService(TEST_SCOPE, new String[]{String.class.getName(), Serializable.class.getName()}, p);
+        assertTrue(repository.scopeHasMatchingService(TEST_SCOPE, String.class.getName(), "(foo=bar)"));
+        assertTrue(repository.scopeHasMatchingService(TEST_SCOPE, Serializable.class.getName(), "(foo=bar)"));
+        assertFalse(repository.scopeHasMatchingService(TEST_SCOPE, Integer.class.getName(), "(foo=bar)"));
+    }
+    
+    @Test
+    public void testClearScope() throws Exception {
+        ScopeServiceRepository repository = new StandardScopeServiceRepository();
+        repository.recordService(TEST_SCOPE, new String[]{String.class.getName()}, null);
+        assertTrue(repository.scopeHasMatchingService(TEST_SCOPE, String.class.getName(), null));
+        repository.clearScope(TEST_SCOPE);
+        assertFalse(repository.scopeHasMatchingService(TEST_SCOPE, String.class.getName(), null));
+    }
+    
+    @Test
+    public void testNullNameWithObjectClassFilter() throws Exception {
+        ScopeServiceRepository repository = new StandardScopeServiceRepository();
+        repository.recordService(TEST_SCOPE, new String[]{String.class.getName()}, null);
+        assertTrue(repository.scopeHasMatchingService(TEST_SCOPE, null, "(objectClass=java.lang.String)"));
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/SpringConfigServiceModelScannerTests.java b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/SpringConfigServiceModelScannerTests.java
new file mode 100644
index 0000000..639e262
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/SpringConfigServiceModelScannerTests.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.io.Serializable;
+
+import org.junit.Test;
+import org.osgi.framework.Version;
+import org.springframework.core.io.ClassPathResource;
+
+
+import org.eclipse.virgo.kernel.install.artifact.ScopeServiceRepository;
+import org.eclipse.virgo.kernel.install.artifact.internal.SpringConfigServiceModelScanner;
+import org.eclipse.virgo.kernel.install.artifact.internal.StandardScopeServiceRepository;
+import org.eclipse.virgo.medic.test.eventlog.MockEventLogger;
+
+/**
+ */
+public class SpringConfigServiceModelScannerTests {
+
+    private static final String TEST_SCOPE = "test";
+
+    @Test
+    public void testServicesRegistered() throws Exception {
+
+        ScopeServiceRepository repository = new StandardScopeServiceRepository();
+        String location = "scoping/simpleService.xml";
+        run(repository, location);
+        assertTrue(repository.scopeHasMatchingService(TEST_SCOPE, Serializable.class.getName(), null));
+        assertFalse(repository.scopeHasMatchingService(TEST_SCOPE, Integer.class.getName(), null));
+    }
+
+    @Test
+    public void testComplexService() throws Exception {
+
+        ScopeServiceRepository repository = new StandardScopeServiceRepository();
+        String location = "scoping/complexService.xml";
+        run(repository, location);
+        assertTrue(repository.scopeHasMatchingService(TEST_SCOPE, Serializable.class.getName(), null));
+        assertTrue(repository.scopeHasMatchingService(TEST_SCOPE, Serializable.class.getName(), "(foo=bar)"));
+        assertTrue(repository.scopeHasMatchingService(TEST_SCOPE, Appendable.class.getName(), null));
+        assertTrue(repository.scopeHasMatchingService(TEST_SCOPE, Appendable.class.getName(), "(foo=bar)"));
+        assertTrue(repository.scopeHasMatchingService(TEST_SCOPE, Appendable.class.getName(), "(org.eclipse.gemini.blueprint.bean.name=service)"));
+    }
+
+    private final void run(ScopeServiceRepository repository, String configLocation) throws Exception {
+        ClassPathResource resource = new ClassPathResource(configLocation);
+        SpringConfigServiceModelScanner scanner = new SpringConfigServiceModelScanner(TEST_SCOPE, repository, new MockEventLogger());
+        scanner.scanConfigFile("bundle", Version.emptyVersion, configLocation, resource.getInputStream());
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/StandardArtifactIdentityDeterminerTests.java b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/StandardArtifactIdentityDeterminerTests.java
new file mode 100644
index 0000000..f5011a0
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/StandardArtifactIdentityDeterminerTests.java
@@ -0,0 +1,107 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import org.eclipse.virgo.kernel.install.artifact.ArtifactIdentity;
+import org.eclipse.virgo.repository.ArtifactBridge;
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+import org.eclipse.virgo.repository.ArtifactGenerationException;
+import org.junit.Test;
+import org.osgi.framework.Version;
+
+import java.io.File;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.LinkedHashSet;
+
+import static org.easymock.EasyMock.*;
+import static org.junit.Assert.*;
+
+public class StandardArtifactIdentityDeterminerTests {
+
+    private static final File TEST_FILE = new File("test");
+
+    @Test
+    public void identityWithoutBridge() {
+        ArtifactIdentity identity = new StandardArtifactIdentityDeterminer(Collections.<ArtifactBridge>emptySet()).determineIdentity(TEST_FILE, null);
+        assertNull(identity);
+    }
+
+    @Test
+    public void identityFromBridge() throws ArtifactGenerationException {
+        ArtifactDescriptor artifactDescriptor = createArtifactDescriptorMock();
+        ArtifactBridge bridge = createArtifactBridgeMock(artifactDescriptor);
+
+        checkIdentityDeterminer(bridge);
+
+        verify(artifactDescriptor, bridge);
+    }
+
+    @Test
+    public void identityFromBridgeThrowingException() throws ArtifactGenerationException {
+        ArtifactDescriptor artifactDescriptor = createArtifactDescriptorMock();
+        ArtifactBridge interestedBridge = createArtifactBridgeMock(artifactDescriptor);
+
+        ArtifactBridge throwingBridge = createMock(ArtifactBridge.class);
+        expect(throwingBridge.generateArtifactDescriptor(new File("test"))).andThrow(new ArtifactGenerationException("Illegal argument"));
+
+        replay(throwingBridge);
+
+        assertNull(new StandardArtifactIdentityDeterminer(new LinkedHashSet<ArtifactBridge>(Arrays.asList(throwingBridge, interestedBridge))).determineIdentity(new File("test"), null));
+    }
+
+    @Test
+    public void identityFromSeveralBridges() throws ArtifactGenerationException {
+        ArtifactDescriptor artifactDescriptor = createArtifactDescriptorMock();
+        ArtifactBridge interestedBridge = createArtifactBridgeMock(artifactDescriptor);
+
+        ArtifactBridge throwingBridge = createMock(ArtifactBridge.class);
+
+        ArtifactBridge uninterestedBridge = createMock(ArtifactBridge.class);
+        expect(uninterestedBridge.generateArtifactDescriptor(TEST_FILE)).andReturn(null);
+
+        replay(throwingBridge, uninterestedBridge);
+
+        checkIdentityDeterminer(uninterestedBridge,  interestedBridge, throwingBridge);
+
+        verify(artifactDescriptor, throwingBridge, interestedBridge, uninterestedBridge);
+    }
+
+    private ArtifactDescriptor createArtifactDescriptorMock() throws ArtifactGenerationException {
+        ArtifactDescriptor artifactDescriptor = createMock(ArtifactDescriptor.class);
+        expect(artifactDescriptor.getType()).andReturn("foo");
+        expect(artifactDescriptor.getName()).andReturn("bar");
+        expect(artifactDescriptor.getVersion()).andReturn(new Version(1, 2, 3));
+
+        replay(artifactDescriptor);
+
+        return artifactDescriptor;
+    }
+
+    private ArtifactBridge createArtifactBridgeMock(ArtifactDescriptor descriptor) throws ArtifactGenerationException {
+        ArtifactBridge bridge = createMock(ArtifactBridge.class);
+        expect(bridge.generateArtifactDescriptor(new File("test"))).andReturn(descriptor);
+
+        replay(bridge);
+
+        return bridge;
+    }
+
+    private void checkIdentityDeterminer(ArtifactBridge... bridges) {
+        ArtifactIdentity artifactIdentity = new StandardArtifactIdentityDeterminer(new LinkedHashSet<ArtifactBridge>(Arrays.asList(bridges))).determineIdentity(TEST_FILE, null);
+        assertNotNull(artifactIdentity);
+        assertEquals("foo", artifactIdentity.getType());
+        assertEquals("bar", artifactIdentity.getName());
+        assertEquals(new Version(1, 2, 3), artifactIdentity.getVersion());
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/StandardInstallArtifactGraphInclosureTests.java b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/StandardInstallArtifactGraphInclosureTests.java
new file mode 100644
index 0000000..05ce729
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/StandardInstallArtifactGraphInclosureTests.java
@@ -0,0 +1,255 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution (StandardInstalArtifactTreeInclosureTests.java)
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.reset;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.virgo.kernel.artifact.fs.StandardArtifactFSFactory;
+import org.eclipse.virgo.kernel.artifact.plan.PlanDescriptor.Provisioning;
+import org.eclipse.virgo.nano.core.BundleStarter;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactIdentity;
+import org.eclipse.virgo.kernel.install.artifact.BundleInstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifactGraphFactory;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifactGraphInclosure;
+import org.eclipse.virgo.kernel.install.artifact.internal.bundle.BundleInstallArtifactGraphFactory;
+import org.eclipse.virgo.kernel.install.environment.InstallEnvironmentFactory;
+import org.eclipse.virgo.kernel.install.pipeline.Pipeline;
+import org.eclipse.virgo.kernel.osgi.framework.OsgiFramework;
+import org.eclipse.virgo.kernel.osgi.framework.PackageAdminUtil;
+import org.eclipse.virgo.nano.shim.serviceability.TracingService;
+import org.eclipse.virgo.medic.test.eventlog.MockEventLogger;
+import org.eclipse.virgo.repository.ArtifactBridge;
+import org.eclipse.virgo.repository.Repository;
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+import org.eclipse.virgo.util.common.GraphNode;
+import org.eclipse.virgo.util.common.ThreadSafeDirectedAcyclicGraph;
+import org.eclipse.virgo.util.io.PathReference;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Version;
+
+public class StandardInstallArtifactGraphInclosureTests {
+
+    private static final String PROVISIONING_PROPERTY_NAME = "org.eclipse.virgo.kernel.provisioning";
+
+    private static final String TEST_BUNDLE_REPOSITORY_NAME = "testBundleRepositoryName";
+
+    private final InstallEnvironmentFactory installEnvironmentFactory = createMock(InstallEnvironmentFactory.class);
+
+    private final Pipeline refreshPipeline = createMock(Pipeline.class);
+
+    private InstallArtifactGraphInclosure installArtifactFactory;
+
+    private URI bundleURI;
+
+    private OsgiFramework osgiFramework;
+
+    private BundleStarter bundleStarter;
+
+    private TracingService tracingService;
+
+    private PackageAdminUtil packageAdminUtil;
+
+    private Repository repository;
+
+    private RepositoryAwareArtifactDescriptor artifactDescriptor;
+
+    private final ArtifactStorageFactory artifactStorageFactory = new StandardArtifactStorageFactory(
+        new PathReference("build/work/deployer.staging"), new StandardArtifactFSFactory(), new MockEventLogger(), "true");
+
+    private Set<ArtifactBridge> testArtifactBridges = new HashSet<ArtifactBridge>();
+
+    private ThreadSafeDirectedAcyclicGraph<InstallArtifact> dag = new ThreadSafeDirectedAcyclicGraph<InstallArtifact>();
+
+    @Before
+    public void setUp() {
+        this.bundleURI = new File("src/test/resources/artifacts/simple.jar").toURI();
+        this.osgiFramework = createMock(OsgiFramework.class);
+        this.bundleStarter = createMock(BundleStarter.class);
+        this.tracingService = createMock(TracingService.class);
+        this.packageAdminUtil = createMock(PackageAdminUtil.class);
+        this.repository = createMock(Repository.class);
+        this.artifactDescriptor = createMock(RepositoryAwareArtifactDescriptor.class);
+        this.testArtifactBridges.add(new StubArtifactBridge("bundle", ".jar"));
+    }
+
+    private void replayMocks() {
+        replay(this.osgiFramework, this.bundleStarter, this.tracingService, this.packageAdminUtil, this.repository, this.artifactDescriptor);
+    }
+
+    private void verifyMocks() {
+        verify(this.osgiFramework, this.bundleStarter, this.tracingService, this.packageAdminUtil, this.repository, this.artifactDescriptor);
+    }
+
+    private void resetMocks() {
+        reset(this.osgiFramework, this.bundleStarter, this.tracingService, this.packageAdminUtil, this.repository, this.artifactDescriptor);
+    }
+
+    @Test
+    public void testBundle() throws DeploymentException, IOException {
+        StubBundleContext bundleContext = new StubBundleContext();
+        StubBundleContext userRegionBundleContext = new StubBundleContext();
+        expect(this.osgiFramework.getBundleContext()).andReturn(bundleContext).anyTimes();
+
+        replayMocks();
+
+        StandardInstallArtifactRefreshHandler refreshHelper = new StandardInstallArtifactRefreshHandler(installEnvironmentFactory, refreshPipeline);
+
+        bundleContext.registerService(InstallArtifactGraphFactory.class.getName(), new BundleInstallArtifactGraphFactory(this.osgiFramework,
+            bundleContext, refreshHelper, this.bundleStarter, this.tracingService, this.packageAdminUtil, userRegionBundleContext,
+            new MockEventLogger(), null, dag), null);
+
+        this.installArtifactFactory = new StandardInstallArtifactGraphInclosure(this.artifactStorageFactory, bundleContext, new MockEventLogger());
+
+        Map<String, String> properties = determineDeploymentProperties(Collections.<String, String> emptyMap(), Provisioning.AUTO);
+
+        File artifact = new File(this.bundleURI);
+        ArtifactIdentity identity = new ArtifactIdentity("bundle", "a", new Version(1, 2, 3), null);
+
+        GraphNode<InstallArtifact> installGraph = this.installArtifactFactory.constructGraphNode(identity, artifact, properties,
+            TEST_BUNDLE_REPOSITORY_NAME);
+
+        InstallArtifact installArtifact = installGraph.getValue();
+        assertNotNull(installArtifact);
+        assertEquals(TEST_BUNDLE_REPOSITORY_NAME, installArtifact.getRepositoryName());
+        assertTrue(installArtifact instanceof BundleInstallArtifact);
+        BundleInstallArtifact bundleInstallArtifact = (BundleInstallArtifact) installArtifact;
+        assertEquals("a", bundleInstallArtifact.getBundleManifest().getBundleSymbolicName().getSymbolicName());
+
+        verifyMocks();
+        resetMocks();
+    }
+
+    private Map<String, String> determineDeploymentProperties(Map<String, String> properties, Provisioning parentProvisioning) {
+        Map<String, String> deploymentProperties = new HashMap<String, String>(properties);
+        deploymentProperties.put(PROVISIONING_PROPERTY_NAME, parentProvisioning.toString());
+        return deploymentProperties;
+    }
+
+    @Test
+    public void testBundleImplicitTypeAndVersion() throws DeploymentException, IOException {
+        StubBundleContext bundleContext = new StubBundleContext();
+        StubBundleContext userRegionBundleContext = new StubBundleContext();
+        expect(this.osgiFramework.getBundleContext()).andReturn(bundleContext).anyTimes();
+
+        replayMocks();
+
+        StandardArtifactIdentityDeterminer artifactIdentityDeterminer = new StandardArtifactIdentityDeterminer(testArtifactBridges);
+
+        StandardInstallArtifactRefreshHandler refreshHelper = new StandardInstallArtifactRefreshHandler(installEnvironmentFactory, refreshPipeline);
+
+        bundleContext.registerService(InstallArtifactGraphFactory.class.getName(), new BundleInstallArtifactGraphFactory(this.osgiFramework,
+            bundleContext, refreshHelper, this.bundleStarter, this.tracingService, this.packageAdminUtil, userRegionBundleContext,
+            new MockEventLogger(), null, dag), null);
+
+        this.installArtifactFactory = new StandardInstallArtifactGraphInclosure(this.artifactStorageFactory, bundleContext, new MockEventLogger());
+
+        File bundle = new File(this.bundleURI);
+        GraphNode<InstallArtifact> installArtifactGraph = this.installArtifactFactory.constructGraphNode(
+            artifactIdentityDeterminer.determineIdentity(bundle, null), bundle, null, null);
+        checkBundleImplicitTypeAndVersion(installArtifactGraph.getValue());
+
+        verifyMocks();
+        resetMocks();
+    }
+
+    @Test
+    public void testNoBSNBundleImplicitTypeAndVersion() throws DeploymentException, URISyntaxException {
+        StubBundleContext bundleContext = new StubBundleContext();
+        StubBundleContext userRegionBundleContext = new StubBundleContext();
+        expect(this.osgiFramework.getBundleContext()).andReturn(bundleContext).anyTimes();
+
+        replayMocks();
+
+        StandardArtifactIdentityDeterminer artifactIdentityDeterminer = new StandardArtifactIdentityDeterminer(testArtifactBridges);
+
+        StandardInstallArtifactRefreshHandler refreshHelper = new StandardInstallArtifactRefreshHandler(installEnvironmentFactory, refreshPipeline);
+
+        bundleContext.registerService(InstallArtifactGraphFactory.class.getName(), new BundleInstallArtifactGraphFactory(this.osgiFramework,
+            bundleContext, refreshHelper, this.bundleStarter, this.tracingService, this.packageAdminUtil, userRegionBundleContext,
+            new MockEventLogger(), null, dag), null);
+
+        this.installArtifactFactory = new StandardInstallArtifactGraphInclosure(this.artifactStorageFactory, bundleContext, new MockEventLogger());
+
+        File bundle = new File("src/test/resources/artifacts/nobsn.jar");
+        GraphNode<InstallArtifact> installArtifactGraph = this.installArtifactFactory.constructGraphNode(
+            artifactIdentityDeterminer.determineIdentity(bundle, null), bundle, null, null);
+        InstallArtifact installArtifact = installArtifactGraph.getValue();
+        assertNotNull(installArtifact);
+        assertTrue(installArtifact instanceof BundleInstallArtifact);
+        assertEquals("nobsn", installArtifact.getName());
+        assertEquals(new Version("0"), installArtifact.getVersion());
+
+        verifyMocks();
+        resetMocks();
+    }
+
+    @Test
+    public void testRecoverBundleImplicitTypeAndVersion() throws DeploymentException, IOException {
+        StubBundleContext bundleContext = new StubBundleContext();
+        StubBundleContext userRegionBundleContext = new StubBundleContext();
+        expect(this.osgiFramework.getBundleContext()).andReturn(bundleContext).anyTimes();
+
+        replayMocks();
+
+        StandardInstallArtifactRefreshHandler refreshHelper = new StandardInstallArtifactRefreshHandler(installEnvironmentFactory, refreshPipeline);
+
+        StandardArtifactIdentityDeterminer artifactIdentityDeterminer = new StandardArtifactIdentityDeterminer(testArtifactBridges);
+
+        bundleContext.registerService(InstallArtifactGraphFactory.class.getName(), new BundleInstallArtifactGraphFactory(this.osgiFramework,
+            bundleContext, refreshHelper, this.bundleStarter, this.tracingService, this.packageAdminUtil, userRegionBundleContext,
+            new MockEventLogger(), null, dag), null);
+
+        this.installArtifactFactory = new StandardInstallArtifactGraphInclosure(this.artifactStorageFactory, bundleContext, new MockEventLogger());
+
+        File bundle = new File(this.bundleURI);
+        GraphNode<InstallArtifact> installArtifactGraph = this.installArtifactFactory.constructGraphNode(
+            artifactIdentityDeterminer.determineIdentity(bundle, null), bundle, null, null);
+
+        checkBundleImplicitTypeAndVersion(installArtifactGraph.getValue());
+        
+        GraphNode<InstallArtifact> recoveredInstallGraph = this.installArtifactFactory.recoverInstallGraph(artifactIdentityDeterminer.determineIdentity(bundle, null), new File(this.bundleURI));
+        checkBundleImplicitTypeAndVersion(recoveredInstallGraph.getValue());
+
+        verifyMocks();
+        resetMocks();
+    }
+
+    private void checkBundleImplicitTypeAndVersion(InstallArtifact installArtifact) throws IOException {
+        assertNotNull(installArtifact);
+        assertTrue(installArtifact instanceof BundleInstallArtifact);
+        BundleInstallArtifact bundleInstallArtifact = (BundleInstallArtifact) installArtifact;
+        assertEquals("simple", bundleInstallArtifact.getBundleManifest().getBundleSymbolicName().getSymbolicName());
+        assertEquals(new Version("0"), bundleInstallArtifact.getBundleManifest().getBundleVersion());
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/StubAbortableSignal.java b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/StubAbortableSignal.java
new file mode 100644
index 0000000..e369c1f
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/StubAbortableSignal.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import org.eclipse.virgo.nano.core.AbortableSignal;
+
+class StubAbortableSignal implements AbortableSignal {
+
+    private volatile boolean complete = false;
+    
+    private volatile boolean aborted = false;
+    
+    private volatile Throwable cause = null;
+
+    /**
+     * {@inheritDoc}
+     */
+    public void signalSuccessfulCompletion() {
+        this.complete = true;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void signalFailure(Throwable t) {
+        this.complete = true;
+        this.cause = t;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+	public void signalAborted() {
+        this.complete = true;
+        this.aborted = true;
+	}
+    
+    public boolean isComplete() {
+        return this.complete;
+    }
+    
+    public boolean isAborted() {
+        return this.aborted;
+    }
+    
+    public Throwable getCause() {
+        return this.cause;
+    }
+    
+}
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/StubArtifactBridge.java b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/StubArtifactBridge.java
new file mode 100644
index 0000000..48308a5
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/StubArtifactBridge.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import java.io.File;
+import java.net.URI;
+import java.util.Set;
+
+import org.osgi.framework.Version;
+
+import org.eclipse.virgo.repository.ArtifactBridge;
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+import org.eclipse.virgo.repository.ArtifactGenerationException;
+import org.eclipse.virgo.repository.Attribute;
+
+
+/**
+ * <p>
+ * TODO Document StubArtifactBridge
+ * </p>
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * TODO Document concurrent semantics of StubArtifactBridge
+ *
+ */
+public class StubArtifactBridge implements ArtifactBridge {
+
+    private final String planType;
+    
+    private final String[] matchs;
+
+    public StubArtifactBridge(String planType, String... matchs) {
+        this.planType = planType;
+        this.matchs = matchs;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public ArtifactDescriptor generateArtifactDescriptor(File artifactFile) throws ArtifactGenerationException {
+        boolean matched = false;
+        final String fileName = artifactFile.getName();
+
+        for(String ending : this.matchs){
+            if(fileName.endsWith(ending)){
+                matched = true;
+                break;
+            }
+        }
+        
+        if(matched){
+            return new ArtifactDescriptor() {
+                
+                public Version getVersion() {
+                    return Version.emptyVersion;
+                }
+                
+                public URI getUri() {
+                    return null;
+                }
+                
+                public String getType() {
+                    return planType;
+                }
+                
+                public String getName() {
+                    return fileName.substring(0, fileName.lastIndexOf('.'));
+                }
+                
+                public String getFilename() {
+                    return fileName;
+                }
+                
+                public Set<Attribute> getAttributes() {
+                    return null;
+                }
+                
+                public Set<Attribute> getAttribute(String name) {
+                    return null;
+                }
+            };
+            } 
+        return null;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/StubArtifactStateMonitor.java b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/StubArtifactStateMonitor.java
new file mode 100644
index 0000000..2bb93a3
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/StubArtifactStateMonitor.java
@@ -0,0 +1,164 @@
+/*
+ * This file is part of the Eclipse Virgo project.
+ *
+ * Copyright (c) 2011 copyright_holder
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    cgfrost - initial contribution
+ */
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact.State;
+
+/**
+ * TODO Document StubArtifactStateMonitor
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ * TODO Document concurrent semantics of StubArtifactStateMonitor
+ */
+public class StubArtifactStateMonitor implements ArtifactStateMonitor {
+
+    private State myState = State.RESOLVED;
+    
+    /** 
+     * {@inheritDoc}
+     */
+    public State getState() {
+        return this.myState;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void setState(State state) {
+        this.myState = state;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void onInstalling(InstallArtifact installArtifact) throws DeploymentException {
+
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void onInstallFailed(InstallArtifact installArtifact) throws DeploymentException {
+
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void onInstalled(InstallArtifact installArtifact) throws DeploymentException {
+
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void onResolving(InstallArtifact installArtifact) throws DeploymentException {
+
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void onResolveFailed(InstallArtifact installArtifact) throws DeploymentException {
+
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void onResolved(InstallArtifact installArtifact) throws DeploymentException {
+
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public boolean onStarting(InstallArtifact installArtifact) throws DeploymentException {
+        return false;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void onStartFailed(InstallArtifact installArtifact, Throwable cause) throws DeploymentException {
+
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void onStartAborted(InstallArtifact installArtifact) throws DeploymentException {
+
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void onStarted(InstallArtifact installArtifact) throws DeploymentException {
+
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void onStopping(InstallArtifact installArtifact) {
+
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void onStopFailed(InstallArtifact installArtifact, Throwable cause) throws DeploymentException {
+
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void onStopped(InstallArtifact installArtifact) {
+
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void onUnresolved(InstallArtifact installArtifact) throws DeploymentException {
+
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void onUninstalling(InstallArtifact installArtifact) throws DeploymentException {
+
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void onUninstallFailed(InstallArtifact installArtifact, Throwable cause) throws DeploymentException {
+
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void onUninstalled(InstallArtifact installArtifact) throws DeploymentException {
+
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/StubEventLogger.java b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/StubEventLogger.java
new file mode 100644
index 0000000..bf278a1
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/StubEventLogger.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.medic.eventlog.Level;
+import org.eclipse.virgo.medic.eventlog.LogEvent;
+
+public class StubEventLogger implements EventLogger {
+
+    public void log(LogEvent logEvent, Object... inserts) {
+    }
+
+    public void log(String code, Level level, Object... inserts) {
+    }
+
+    public void log(LogEvent logEvent, Throwable throwable, Object... inserts) {
+    }
+
+    public void log(String code, Level level, Throwable throwable, Object... inserts) {
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/StubInstallArtifactRefreshHandler.java b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/StubInstallArtifactRefreshHandler.java
new file mode 100644
index 0000000..04f2868
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/StubInstallArtifactRefreshHandler.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal;
+
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.internal.InstallArtifactRefreshHandler;
+
+
+/**
+ */
+public class StubInstallArtifactRefreshHandler implements InstallArtifactRefreshHandler {
+    
+    private final List<InstallArtifact> refreshedArtifacts = new ArrayList<InstallArtifact>();
+    
+    private Map<InstallArtifact, Boolean> refreshOutcomes = new HashMap<InstallArtifact, Boolean>();
+
+    /** 
+     * {@inheritDoc}
+     */
+    public boolean refresh(InstallArtifact installArtifact) {
+        Boolean refreshed = this.refreshOutcomes.get(installArtifact);
+        
+        if (refreshed == null) {
+            throw new IllegalStateException("No refresh outcome set for install artifact '" + installArtifact + "'");
+        }
+        
+        this.refreshedArtifacts.add(installArtifact);
+        
+        return refreshed;
+    }
+    
+    public void setRefreshOutcome(InstallArtifact artifact, boolean refreshSuccessful) {
+        this.refreshOutcomes.put(artifact, refreshSuccessful);
+    }
+    
+    public void assertRefreshed(InstallArtifact installArtifact) {
+        assertTrue(this.refreshedArtifacts.contains(installArtifact));
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/bundle/StandardBundleInstallArtifactTests.java b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/bundle/StandardBundleInstallArtifactTests.java
new file mode 100644
index 0000000..bd38d6f
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/bundle/StandardBundleInstallArtifactTests.java
@@ -0,0 +1,178 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.artifact.internal.bundle;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.isA;
+import static org.easymock.EasyMock.isNull;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.net.URI;
+
+import org.eclipse.virgo.kernel.artifact.fs.ArtifactFS;
+import org.eclipse.virgo.kernel.artifact.fs.internal.DirectoryArtifactFS;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactIdentity;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactIdentityDeterminer;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactStorage;
+import org.eclipse.virgo.kernel.install.artifact.BundleInstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.internal.ArtifactStateMonitor;
+import org.eclipse.virgo.kernel.install.artifact.internal.StandardArtifactStateMonitor;
+import org.eclipse.virgo.kernel.install.artifact.internal.StubInstallArtifactRefreshHandler;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiBundle;
+import org.eclipse.virgo.medic.test.eventlog.MockEventLogger;
+import org.eclipse.virgo.test.stubs.framework.StubBundle;
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+import org.eclipse.virgo.util.common.DirectedAcyclicGraph;
+import org.eclipse.virgo.util.common.ThreadSafeDirectedAcyclicGraph;
+import org.eclipse.virgo.util.io.IOUtils;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifestFactory;
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+
+/**
+ */
+public class StandardBundleInstallArtifactTests {
+
+    private final BundleDriver bundleDriver = createMock(BundleDriver.class);
+    
+    private final ArtifactIdentityDeterminer identityDeterminer = createMock(ArtifactIdentityDeterminer.class);
+
+    private final StubInstallArtifactRefreshHandler refreshHandler = new StubInstallArtifactRefreshHandler();
+
+    private final File bundleFile = new File("src/test/resources/org/eclipse/virgo/kernel/install/artifact/internal/sbiat-bundle");
+
+    private final BundleContext bundleContext = new StubBundleContext();
+
+    private final ArtifactStateMonitor artifactStateMonitor = new StandardArtifactStateMonitor(this.bundleContext);
+
+    private BundleInstallArtifact createInstallArtifact(ArtifactStorage artifactStorage, ArtifactStateMonitor artifactStateMonitor)
+        throws IOException {
+        FileReader reader = null;
+        try {
+            reader = new FileReader(new File(bundleFile, "META-INF/MANIFEST.MF"));
+            BundleManifest bundleManifest = BundleManifestFactory.createBundleManifest(reader);
+            return new StandardBundleInstallArtifact(new ArtifactIdentity(ArtifactIdentityDeterminer.BUNDLE_TYPE,
+                bundleManifest.getBundleSymbolicName().getSymbolicName(), bundleManifest.getBundleVersion(), null), bundleManifest, artifactStorage,
+                bundleDriver, artifactStateMonitor, this.refreshHandler, null, new MockEventLogger(), identityDeterminer);
+        } finally {
+            IOUtils.closeQuietly(reader);
+        }
+    }
+
+    protected ArtifactStorage createArtifactStorage() {
+        return new ArtifactStorage() {
+
+            private final ArtifactFS artifactFS = new DirectoryArtifactFS(bundleFile);
+
+            public void synchronize(URI sourceUri) {
+            }
+
+            public void synchronize() {
+            }
+
+            public ArtifactFS getArtifactFS() {
+                return this.artifactFS;
+            }
+
+            public void delete() {
+            }
+
+            public void rollBack() {
+            }
+        };
+    }
+
+    @Test
+    public void updateAndRefreshWhenNotPartOfAPlan() throws IOException, DeploymentException {
+        
+        StandardBundleInstallArtifact artifact = (StandardBundleInstallArtifact) createInstallArtifact(createArtifactStorage(), artifactStateMonitor);
+        
+        ArtifactIdentity identity = new ArtifactIdentity(artifact.getType(), artifact.getName(), artifact.getVersion(), artifact.getScopeName());
+        expect(this.identityDeterminer.determineIdentity(isA(File.class), (String)isNull())).andReturn(identity);
+        replay(this.identityDeterminer);
+
+        QuasiBundle quasiBundle = createMock(QuasiBundle.class);
+        StubBundle bundle = new StubBundle();
+        bundle.setState(Bundle.INSTALLED);
+        expect(quasiBundle.getBundle()).andReturn(bundle);
+        replay(quasiBundle);
+
+        artifact.setQuasiBundle(quasiBundle);
+
+        DirectedAcyclicGraph<InstallArtifact> dag = new ThreadSafeDirectedAcyclicGraph<InstallArtifact>();
+        artifact.setGraph(dag.createRootNode(artifact));
+
+        expect(this.bundleDriver.update(isA(BundleManifest.class), isA(File.class))).andReturn(true);
+        this.bundleDriver.refreshBundle();
+        replay(this.bundleDriver);
+
+        this.refreshHandler.setRefreshOutcome(artifact, true);
+        assertTrue(artifact.refresh());
+        this.refreshHandler.assertRefreshed(artifact);
+    }
+
+    @Test
+    public void testDeploymentProperties() throws Exception {
+        BundleInstallArtifact installArtifact = createInstallArtifact(createArtifactStorage(), artifactStateMonitor);
+
+        installArtifact.getDeploymentProperties().put("foo", "bar");
+        assertEquals("bar", installArtifact.getDeploymentProperties().get("foo"));
+    }
+
+    @Test
+    public void endInstallShouldNullQuasiBundleReference() throws IOException, DeploymentException {
+
+       StandardBundleInstallArtifact uut = (StandardBundleInstallArtifact) createInstallArtifact(createArtifactStorage(), artifactStateMonitor);
+       QuasiBundle quasiBundle = createMock(QuasiBundle.class);
+       expect(quasiBundle.getBundle()).andReturn(null).anyTimes();
+       expect(quasiBundle.getBundleFile()).andReturn(null);
+
+       uut.setQuasiBundle(quasiBundle);
+
+       replay(quasiBundle);
+       uut.endInstall();
+       verify(quasiBundle);
+
+       assertNull(uut.getQuasiBundle());
+    }
+
+    @Test
+    public void endInstallShouldStoreBundleReference() throws IOException, DeploymentException {
+
+       StandardBundleInstallArtifact uut = (StandardBundleInstallArtifact) createInstallArtifact(createArtifactStorage(), artifactStateMonitor);
+       QuasiBundle quasiBundle = createMock(QuasiBundle.class);
+       StubBundle stubBundle = new StubBundle();
+       expect(quasiBundle.getBundle()).andReturn(stubBundle).anyTimes();
+       expect(quasiBundle.getBundleFile()).andReturn(null);
+
+       uut.setQuasiBundle(quasiBundle);
+
+       replay(quasiBundle);
+       uut.endInstall();
+       verify(quasiBundle);
+
+       assertEquals(stubBundle, uut.getBundle());
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/scoping/ScoperTests.java b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/scoping/ScoperTests.java
new file mode 100755
index 0000000..6f573d3
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/artifact/internal/scoping/ScoperTests.java
@@ -0,0 +1,112 @@
+
+package org.eclipse.virgo.kernel.install.artifact.internal.scoping;
+
+import java.io.File;
+import java.io.FileReader;
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.Assert;
+
+import org.eclipse.virgo.kernel.install.artifact.internal.scoping.Scoper.DuplicateBundleSymbolicNameException;
+import org.eclipse.virgo.kernel.install.artifact.internal.scoping.Scoper.DuplicateExportException;
+import org.eclipse.virgo.kernel.install.artifact.internal.scoping.Scoper.UnsupportedBundleManifestVersionException;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifestFactory;
+import org.eclipse.virgo.util.osgi.manifest.DynamicImportPackage;
+import org.eclipse.virgo.util.osgi.manifest.DynamicallyImportedPackage;
+import org.eclipse.virgo.util.osgi.manifest.ExportPackage;
+import org.eclipse.virgo.util.osgi.manifest.ExportedPackage;
+import org.eclipse.virgo.util.osgi.manifest.ImportPackage;
+import org.eclipse.virgo.util.osgi.manifest.ImportedPackage;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class ScoperTests {
+
+    private static final String SCOPE_NAME = "test_scope";
+
+    private static BundleManifest manifest = null;
+
+    private static BundleManifest unscopedManifest = null;
+
+    private static List<BundleManifest> bundleManifests = new ArrayList<BundleManifest>();
+
+    private static final File bundleFile = new File("src/test/resources/scoping/bundles/bug331767");
+
+    private static final Object SCOPING_ATTRIBUTE_NAME = "module_scope";
+
+    @BeforeClass
+    public static void setUpBeforeClass() throws Exception {
+        try (FileReader reader = new FileReader(new File(bundleFile, "META-INF/MANIFEST.MF"))) {
+            manifest = BundleManifestFactory.createBundleManifest(reader);
+            reader.close();
+            unscopedManifest = BundleManifestFactory.createBundleManifest(manifest.toDictionary());
+            bundleManifests.add(manifest);
+        }
+    }
+
+    @AfterClass
+    public static void tearDownAfterClass() throws Exception {
+    }
+
+    @Test
+    public void testScoping() throws UnsupportedBundleManifestVersionException, DuplicateExportException, DuplicateBundleSymbolicNameException {
+        Scoper scoper = new Scoper(bundleManifests, SCOPE_NAME);
+        scoper.scope();
+        checkImports();
+        checkDynamicImports();
+        checkExports();
+    }
+
+    private void checkImports() {
+        ImportPackage importPackage = manifest.getImportPackage();
+        ImportPackage unscopedImportPackage = unscopedManifest.getImportPackage();
+        List<ImportedPackage> ipList = importPackage.getImportedPackages();
+        List<ImportedPackage> uipList = unscopedImportPackage.getImportedPackages();
+        for (int i = 0; i < ipList.size(); i++) {
+            Assert.assertTrue(ipList.get(i).getPackageName().equals(uipList.get(i).getPackageName()));
+            Assert.assertTrue(ipList.get(i).getVersion().equals(uipList.get(i).getVersion()));
+            for (String scopedAttribute : uipList.get(i).getAttributes().keySet()) {
+                Assert.assertTrue(ipList.get(i).getAttributes().containsKey(scopedAttribute));
+            }
+            Assert.assertTrue(ipList.get(i).getAttributes().containsKey(SCOPING_ATTRIBUTE_NAME));
+            Assert.assertTrue(uipList.get(i).getAttributes().size() + 1 == ipList.get(i).getAttributes().size());
+        }
+    }
+
+    private void checkDynamicImports() {
+        DynamicImportPackage dynamicImportPackage = manifest.getDynamicImportPackage();
+        DynamicImportPackage unscopedDynamicImportPackage = unscopedManifest.getDynamicImportPackage();
+        List<DynamicallyImportedPackage> dipList = dynamicImportPackage.getDynamicallyImportedPackages();
+        List<DynamicallyImportedPackage> udipList = unscopedDynamicImportPackage.getDynamicallyImportedPackages();
+        for (int i = 0; i < udipList.size(); i++) {
+            Assert.assertTrue(dipList.get(i).getPackageName().equals(udipList.get(i).getPackageName()));
+            Assert.assertTrue(dipList.get(i).getVersion().equals(udipList.get(i).getVersion()));
+            for (String scopedAttribute : udipList.get(i).getAttributes().keySet()) {
+                Assert.assertTrue(dipList.get(i).getAttributes().containsKey(scopedAttribute));
+            }
+            Assert.assertTrue(dipList.get(i).getAttributes().containsKey(SCOPING_ATTRIBUTE_NAME));
+            Assert.assertTrue(udipList.get(i).getAttributes().size() + 1 == dipList.get(i).getAttributes().size());
+        }
+        Assert.assertTrue(dipList.size() == udipList.size() * 2);
+    }
+
+    private void checkExports() {
+        ExportPackage exportPackage = manifest.getExportPackage();
+        ExportPackage unscopedExportPackage = unscopedManifest.getExportPackage();
+        List<ExportedPackage> epList = exportPackage.getExportedPackages();
+        List<ExportedPackage> uepList = unscopedExportPackage.getExportedPackages();
+        for (int i = 0; i < epList.size(); i++) {
+            Assert.assertTrue(epList.get(i).getPackageName().equals(uepList.get(i).getPackageName()));
+            Assert.assertTrue(epList.get(i).getVersion().equals(uepList.get(i).getVersion()));
+            for (String scopedAttribute : uepList.get(i).getAttributes().keySet()) {
+                Assert.assertTrue(epList.get(i).getAttributes().containsKey(scopedAttribute));
+            }
+            Assert.assertTrue(epList.get(i).getAttributes().containsKey(SCOPING_ATTRIBUTE_NAME));
+            Assert.assertTrue(uepList.get(i).getAttributes().size() + 1 == epList.get(i).getAttributes().size());
+        }
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/environment/internal/StandardInstallEnvironmentTests.java b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/environment/internal/StandardInstallEnvironmentTests.java
new file mode 100644
index 0000000..235b3c8
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/environment/internal/StandardInstallEnvironmentTests.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.environment.internal;
+
+import static org.easymock.EasyMock.createMock;
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiFramework;
+
+import org.eclipse.virgo.kernel.install.environment.InstallEnvironment;
+import org.eclipse.virgo.kernel.install.environment.InstallLog;
+import org.eclipse.virgo.kernel.install.environment.internal.StandardInstallEnvironment;
+import org.eclipse.virgo.repository.Repository;
+
+/**
+ */
+public class StandardInstallEnvironmentTests {
+    
+    private Repository repository = createMock(Repository.class);
+
+    private InstallLog installLog = createMock(InstallLog.class);
+    
+    private QuasiFramework quasiFramework = createMock(QuasiFramework.class);
+    
+    @Test
+    public void testStandardInstallEnvironment() {
+        InstallEnvironment ie = new StandardInstallEnvironment(this.repository, this.installLog, this.quasiFramework);
+        assertEquals(this.repository, ie.getRepository());
+        assertEquals(this.installLog, ie.getInstallLog());
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/pipeline/AbstractPipelineStageTests.java b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/pipeline/AbstractPipelineStageTests.java
new file mode 100644
index 0000000..88ae8be
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/pipeline/AbstractPipelineStageTests.java
@@ -0,0 +1,103 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.pipeline;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.expectLastCall;
+import static org.easymock.EasyMock.isA;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.reset;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.environment.InstallEnvironment;
+import org.eclipse.virgo.kernel.install.environment.InstallLog;
+import org.eclipse.virgo.kernel.install.pipeline.stage.AbstractPipelineStage;
+import org.eclipse.virgo.kernel.install.pipeline.stage.PipelineStage;
+import org.eclipse.virgo.kernel.osgi.framework.UnableToSatisfyBundleDependenciesException;
+import org.eclipse.virgo.util.common.DirectedAcyclicGraph;
+import org.eclipse.virgo.util.common.GraphNode;
+import org.eclipse.virgo.util.common.ThreadSafeDirectedAcyclicGraph;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ */
+public class AbstractPipelineStageTests {
+    
+    private boolean processed;
+    
+    private GraphNode<InstallArtifact> installGraph;
+    
+    private InstallEnvironment installEnvironment;
+    
+    private InstallLog installLog;
+    
+    private final class TestPipelineStage extends AbstractPipelineStage {
+
+        @Override
+        protected void doProcessGraph(GraphNode<InstallArtifact> installGraph, InstallEnvironment installEnvironment) {
+            AbstractPipelineStageTests.this.processed = true;
+        }
+        
+        public String toString() {
+            return "stage";
+        }
+        
+    }
+    
+    @Before
+    public void setUp() {
+        this.processed = false;
+        DirectedAcyclicGraph<InstallArtifact> dag = new ThreadSafeDirectedAcyclicGraph<InstallArtifact>();
+        this.installGraph = dag.createRootNode(null);
+        this.installEnvironment = createMock(InstallEnvironment.class);
+        this.installLog = createMock(InstallLog.class);
+    }
+    
+    private void replayMocks() {
+        replay(this.installEnvironment, this.installLog);
+    }
+    
+    private void verifyMocks() {
+        verify(this.installEnvironment, this.installLog);
+    }
+    
+    private void resetMocks() {
+        reset(this.installEnvironment, this.installLog);
+    }
+
+    @Test
+    public void testAbstractPipelineStage() throws DeploymentException, UnableToSatisfyBundleDependenciesException {
+        
+        expect(this.installEnvironment.getInstallLog()).andReturn(this.installLog);
+        this.installLog.log(isA(PipelineStage.class), isA(String.class), isA(String.class));
+        expectLastCall().times(2);
+        
+        replayMocks();
+        
+        PipelineStage ps = new TestPipelineStage();
+        assertEquals(false, this.processed);
+        ps.process(installGraph, installEnvironment);
+        assertEquals(true, this.processed);
+        
+        verifyMocks();
+        resetMocks();
+    }
+    
+    
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/pipeline/internal/CompensatingPipelineTests.java b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/pipeline/internal/CompensatingPipelineTests.java
new file mode 100644
index 0000000..6a8d847
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/pipeline/internal/CompensatingPipelineTests.java
@@ -0,0 +1,358 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.pipeline.internal;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.expectLastCall;
+import static org.easymock.EasyMock.isA;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.reset;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.environment.InstallEnvironment;
+import org.eclipse.virgo.kernel.install.environment.InstallLog;
+import org.eclipse.virgo.kernel.install.pipeline.Pipeline;
+import org.eclipse.virgo.kernel.install.pipeline.stage.AbstractPipelineStage;
+import org.eclipse.virgo.kernel.install.pipeline.stage.PipelineStage;
+import org.eclipse.virgo.kernel.osgi.framework.UnableToSatisfyBundleDependenciesException;
+import org.eclipse.virgo.medic.eventlog.LogEvent;
+import org.eclipse.virgo.util.common.DirectedAcyclicGraph;
+import org.eclipse.virgo.util.common.GraphNode;
+import org.eclipse.virgo.util.common.ThreadSafeDirectedAcyclicGraph;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ */
+public class CompensatingPipelineTests {
+
+    private GraphNode<InstallArtifact> installGraph;
+
+    private InstallEnvironment installEnvironment;
+
+    private InstallLog installLog;
+
+    private List<PipelineStage> stageTrace;
+
+    private class GoodPipelineStage extends AbstractPipelineStage {
+
+        @Override
+        protected void doProcessGraph(GraphNode<InstallArtifact> installGraph, InstallEnvironment installEnvironment) {
+            CompensatingPipelineTests.this.stageTrace.add(this);
+        }
+
+        public String toString() {
+            return "stage";
+        }
+
+    }
+
+    private class DeploymentExceptionPipelineStage extends AbstractPipelineStage {
+
+        @Override
+        protected void doProcessGraph(GraphNode<InstallArtifact> installGraph, InstallEnvironment installEnvironment) throws DeploymentException {
+            CompensatingPipelineTests.this.stageTrace.add(this);
+            throw new DeploymentException("failed");
+        }
+
+        public String toString() {
+            return "DeploymentExceptionPipelineStage";
+        }
+
+    }
+
+    private class UnableToSatisfyBundleDependenciesExceptionPipelineStage extends AbstractPipelineStage {
+
+        @Override
+        protected void doProcessGraph(GraphNode<InstallArtifact> installGraph, InstallEnvironment installEnvironment)
+            throws UnableToSatisfyBundleDependenciesException {
+            CompensatingPipelineTests.this.stageTrace.add(this);
+            throw new UnableToSatisfyBundleDependenciesException("failed", null, null);
+        }
+
+        public String toString() {
+            return "UnableToSatisfyBundleDependenciesException";
+        }
+
+    }
+
+    private class RuntimeExceptionPipelineStage extends AbstractPipelineStage {
+
+        @Override
+        protected void doProcessGraph(GraphNode<InstallArtifact> installGraph, InstallEnvironment installEnvironment) {
+            CompensatingPipelineTests.this.stageTrace.add(this);
+            throw new RuntimeException("failed");
+        }
+
+        public String toString() {
+            return "RuntimeException";
+        }
+
+    }
+
+    private class CompensationStage extends AbstractPipelineStage {
+
+        @Override
+        protected void doProcessGraph(GraphNode<InstallArtifact> installGraph, InstallEnvironment installEnvironment) {
+            CompensatingPipelineTests.this.stageTrace.add(this);
+        }
+
+        public String toString() {
+            return "compensation";
+        }
+
+    }
+
+    @Before
+    public void setUp() {
+    		DirectedAcyclicGraph<InstallArtifact> dag = new ThreadSafeDirectedAcyclicGraph<InstallArtifact>();
+        this.installGraph = dag.createRootNode(null);
+        this.installEnvironment = createMock(InstallEnvironment.class);
+        this.installLog = createMock(InstallLog.class);
+        this.stageTrace = new ArrayList<PipelineStage>();
+    }
+
+    private void replayMocks() {
+        replay(this.installEnvironment, this.installLog);
+    }
+
+    private void verifyMocks() {
+        verify(this.installEnvironment, this.installLog);
+    }
+
+    private void resetMocks() {
+        reset(this.installEnvironment, this.installLog);
+    }
+
+    @Test
+    public void testEmptyPipeline() throws DeploymentException, UnableToSatisfyBundleDependenciesException {
+
+        expect(this.installEnvironment.getInstallLog()).andReturn(this.installLog);
+        this.installLog.log(isA(PipelineStage.class), isA(String.class), isA(String.class));
+        expectLastCall().times(2);
+
+        replayMocks();
+
+        List<PipelineStage> expectedStageTrace = new ArrayList<PipelineStage>();
+
+        Pipeline p = new CompensatingPipeline(new CompensationStage());
+        p.process(installGraph, installEnvironment);
+
+        assertEquals(expectedStageTrace, this.stageTrace);
+
+        verifyMocks();
+        resetMocks();
+
+    }
+
+    @Test
+    public void testSimplePipeline() throws DeploymentException, UnableToSatisfyBundleDependenciesException {
+
+        expect(this.installEnvironment.getInstallLog()).andReturn(this.installLog).anyTimes();
+        this.installLog.log(isA(PipelineStage.class), isA(String.class), isA(String.class));
+        expectLastCall().times(6);
+
+        replayMocks();
+
+        List<PipelineStage> expectedStageTrace = new ArrayList<PipelineStage>();
+
+        Pipeline p = new CompensatingPipeline(new CompensationStage());
+
+        PipelineStage ps1 = new GoodPipelineStage();
+        p.appendStage(ps1);
+        expectedStageTrace.add(ps1);
+
+        PipelineStage ps2 = new GoodPipelineStage();
+        p.appendStage(ps2);
+        expectedStageTrace.add(ps2);
+
+        p.process(installGraph, installEnvironment);
+
+        assertEquals(expectedStageTrace, this.stageTrace);
+
+        verifyMocks();
+        resetMocks();
+
+    }
+
+    @Test
+    public void testEarlyDeploymentException() throws Exception {
+
+        expect(this.installEnvironment.getInstallLog()).andReturn(this.installLog).anyTimes();
+        this.installLog.log(isA(PipelineStage.class), isA(String.class), isA(String.class));
+        expectLastCall().anyTimes();
+        this.installLog.log(isA(PipelineStage.class), isA(String.class), isA(String.class), isA(String.class));
+        expectLastCall().anyTimes();
+        this.installLog.logFailure(isA(LogEvent.class), isA(Throwable.class));
+        expectLastCall().anyTimes();
+
+        replayMocks();
+
+        List<PipelineStage> expectedStageTrace = new ArrayList<PipelineStage>();
+
+        CompensationStage compensation = new CompensationStage();
+        Pipeline p = new CompensatingPipeline(compensation);
+
+        PipelineStage ps1 = new DeploymentExceptionPipelineStage();
+        p.appendStage(ps1);
+        expectedStageTrace.add(ps1);
+
+        PipelineStage ps2 = new GoodPipelineStage();
+        p.appendStage(ps2);
+
+        expectedStageTrace.add(compensation);
+
+        try {
+            p.process(installGraph, installEnvironment);
+            assertTrue(false);
+        } catch (DeploymentException e) {
+        }
+
+        assertEquals(expectedStageTrace, this.stageTrace);
+
+        verifyMocks();
+        resetMocks();
+
+    }
+    
+    @Test
+    public void testLateDeploymentException() throws Exception {
+
+        expect(this.installEnvironment.getInstallLog()).andReturn(this.installLog).anyTimes();
+        this.installLog.log(isA(PipelineStage.class), isA(String.class), isA(String.class));
+        expectLastCall().anyTimes();
+        this.installLog.log(isA(PipelineStage.class), isA(String.class), isA(String.class), isA(String.class));
+        expectLastCall().anyTimes();
+        this.installLog.logFailure(isA(LogEvent.class), isA(Throwable.class));
+        expectLastCall().anyTimes();
+
+
+        replayMocks();
+
+        List<PipelineStage> expectedStageTrace = new ArrayList<PipelineStage>();
+
+        CompensationStage compensation = new CompensationStage();
+        Pipeline p = new CompensatingPipeline(compensation);
+
+        PipelineStage ps1 = new GoodPipelineStage();
+        p.appendStage(ps1);
+        expectedStageTrace.add(ps1);
+
+        PipelineStage ps2 = new DeploymentExceptionPipelineStage();
+        p.appendStage(ps2);
+        expectedStageTrace.add(ps2);
+
+        expectedStageTrace.add(compensation);
+
+        try {
+            p.process(installGraph, installEnvironment);
+            assertTrue(false);
+        } catch (DeploymentException e) {
+        }
+
+        assertEquals(expectedStageTrace, this.stageTrace);
+
+        verifyMocks();
+        resetMocks();
+
+    }
+    
+    @Test
+    public void testUnableToSatisfyBundleDependenciesException() throws Exception {
+
+        expect(this.installEnvironment.getInstallLog()).andReturn(this.installLog).anyTimes();
+        this.installLog.log(isA(PipelineStage.class), isA(String.class), isA(String.class));
+        expectLastCall().anyTimes();
+        this.installLog.log(isA(PipelineStage.class), isA(String.class), isA(String.class), isA(String.class));
+        expectLastCall().anyTimes();
+        this.installLog.logFailure(isA(LogEvent.class), isA(Throwable.class));
+        expectLastCall().anyTimes();
+
+        replayMocks();
+
+        List<PipelineStage> expectedStageTrace = new ArrayList<PipelineStage>();
+
+        CompensationStage compensation = new CompensationStage();
+        Pipeline p = new CompensatingPipeline(compensation);
+
+        PipelineStage ps1 = new UnableToSatisfyBundleDependenciesExceptionPipelineStage();
+        p.appendStage(ps1);
+        expectedStageTrace.add(ps1);
+
+        PipelineStage ps2 = new GoodPipelineStage();
+        p.appendStage(ps2);
+
+        expectedStageTrace.add(compensation);
+
+        try {
+            p.process(installGraph, installEnvironment);
+            assertTrue(false);
+        } catch (UnableToSatisfyBundleDependenciesException e) {
+        }
+
+        assertEquals(expectedStageTrace, this.stageTrace);
+
+        verifyMocks();
+        resetMocks();
+
+    }
+    
+    @Test
+    public void testRuntimeException() throws Exception {
+
+        expect(this.installEnvironment.getInstallLog()).andReturn(this.installLog).anyTimes();
+        this.installLog.log(isA(PipelineStage.class), isA(String.class), isA(String.class));
+        expectLastCall().anyTimes();
+        this.installLog.log(isA(PipelineStage.class), isA(String.class), isA(String.class), isA(String.class));
+        expectLastCall().anyTimes();
+        this.installLog.logFailure(isA(LogEvent.class), isA(Throwable.class));
+        expectLastCall().anyTimes();
+
+        replayMocks();
+
+        List<PipelineStage> expectedStageTrace = new ArrayList<PipelineStage>();
+
+        CompensationStage compensation = new CompensationStage();
+        Pipeline p = new CompensatingPipeline(compensation);
+
+        PipelineStage ps1 = new RuntimeExceptionPipelineStage();
+        p.appendStage(ps1);
+        expectedStageTrace.add(ps1);
+
+        PipelineStage ps2 = new GoodPipelineStage();
+        p.appendStage(ps2);
+
+        expectedStageTrace.add(compensation);
+
+        try {
+            p.process(installGraph, installEnvironment);
+            assertTrue(false);
+        } catch (RuntimeException e) {
+        }
+
+        assertEquals(expectedStageTrace, this.stageTrace);
+
+        verifyMocks();
+        resetMocks();
+
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/pipeline/internal/StandardPipelineTests.java b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/pipeline/internal/StandardPipelineTests.java
new file mode 100644
index 0000000..88acf71
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/pipeline/internal/StandardPipelineTests.java
@@ -0,0 +1,269 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.pipeline.internal;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.expectLastCall;
+import static org.easymock.EasyMock.isA;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.reset;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.environment.InstallEnvironment;
+import org.eclipse.virgo.kernel.install.environment.InstallLog;
+import org.eclipse.virgo.kernel.install.pipeline.Pipeline;
+import org.eclipse.virgo.kernel.install.pipeline.stage.AbstractPipelineStage;
+import org.eclipse.virgo.kernel.install.pipeline.stage.PipelineStage;
+import org.eclipse.virgo.kernel.osgi.framework.UnableToSatisfyBundleDependenciesException;
+import org.eclipse.virgo.util.common.DirectedAcyclicGraph;
+import org.eclipse.virgo.util.common.GraphNode;
+import org.eclipse.virgo.util.common.ThreadSafeDirectedAcyclicGraph;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ */
+public class StandardPipelineTests {
+
+    private GraphNode<InstallArtifact> installGraph;
+
+    private InstallEnvironment installEnvironment;
+
+    private InstallLog installLog;
+
+    private List<PipelineStage> stageTrace;
+
+    private class TestPipelineStage extends AbstractPipelineStage {
+
+        @Override
+        protected void doProcessGraph(GraphNode<InstallArtifact> installGraph, InstallEnvironment installEnvironment) {
+            StandardPipelineTests.this.stageTrace.add(this);
+        }
+
+        public String toString() {
+            return "stage";
+        }
+
+    }
+
+    private class SelfModifyingPipelineStage extends TestPipelineStage {
+
+        private final Pipeline pipeline;
+
+        private final PipelineStage extraStage;
+
+        public SelfModifyingPipelineStage(Pipeline pipeline, PipelineStage extraStage) {
+            this.pipeline = pipeline;
+            this.extraStage = extraStage;
+        }
+
+        @Override
+        protected void doProcessGraph(GraphNode<InstallArtifact> installGraph, InstallEnvironment installEnvironment) {
+            super.doProcessGraph(installGraph, installEnvironment);
+            this.pipeline.appendStage(this.extraStage);
+        }
+
+    }
+
+    @Before
+    public void setUp() {
+    		DirectedAcyclicGraph<InstallArtifact> dag = new ThreadSafeDirectedAcyclicGraph<InstallArtifact>();
+        this.installGraph = dag.createRootNode(null);
+        this.installEnvironment = createMock(InstallEnvironment.class);
+        this.installLog = createMock(InstallLog.class);
+        this.stageTrace = new ArrayList<PipelineStage>();
+    }
+
+    private void replayMocks() {
+        replay(this.installEnvironment, this.installLog);
+    }
+
+    private void verifyMocks() {
+        verify(this.installEnvironment, this.installLog);
+    }
+
+    private void resetMocks() {
+        reset(this.installEnvironment, this.installLog);
+    }
+
+    @Test
+    public void testEmptyPipeline() throws DeploymentException, UnableToSatisfyBundleDependenciesException {
+
+        expect(this.installEnvironment.getInstallLog()).andReturn(this.installLog);
+        this.installLog.log(isA(PipelineStage.class), isA(String.class), isA(String.class));
+        expectLastCall().times(2);
+
+        replayMocks();
+
+        Pipeline p = new StandardPipeline();
+        p.process(installGraph, installEnvironment);
+
+        verifyMocks();
+        resetMocks();
+
+    }
+
+    @Test
+    public void testSimplePipeline() throws DeploymentException, UnableToSatisfyBundleDependenciesException {
+
+        expect(this.installEnvironment.getInstallLog()).andReturn(this.installLog).anyTimes();
+        this.installLog.log(isA(PipelineStage.class), isA(String.class), isA(String.class));
+        expectLastCall().times(6);
+
+        replayMocks();
+
+        List<PipelineStage> expectedStageTrace = new ArrayList<PipelineStage>();
+
+        Pipeline p = new StandardPipeline();
+
+        PipelineStage ps1 = new TestPipelineStage();
+        p.appendStage(ps1);
+        expectedStageTrace.add(ps1);
+
+        PipelineStage ps2 = new TestPipelineStage();
+        p.appendStage(ps2);
+        expectedStageTrace.add(ps2);
+
+        p.process(installGraph, installEnvironment);
+
+        assertEquals(expectedStageTrace, this.stageTrace);
+
+        verifyMocks();
+        resetMocks();
+
+    }
+
+    @Test
+    public void testPipelineWithDuplicatedStage() throws DeploymentException, UnableToSatisfyBundleDependenciesException {
+
+        expect(this.installEnvironment.getInstallLog()).andReturn(this.installLog).anyTimes();
+        this.installLog.log(isA(PipelineStage.class), isA(String.class), isA(String.class));
+        expectLastCall().times(8);
+
+        replayMocks();
+
+        List<PipelineStage> expectedStageTrace = new ArrayList<PipelineStage>();
+
+        Pipeline p = new StandardPipeline();
+
+        PipelineStage ps1 = new TestPipelineStage();
+        p.appendStage(ps1);
+        expectedStageTrace.add(ps1);
+
+        PipelineStage ps2 = new TestPipelineStage();
+        p.appendStage(ps2);
+        expectedStageTrace.add(ps2);
+
+        p.appendStage(ps1);
+        expectedStageTrace.add(ps1);
+
+        p.process(installGraph, installEnvironment);
+
+        assertEquals(expectedStageTrace, this.stageTrace);
+
+        verifyMocks();
+        resetMocks();
+
+    }
+
+    @Test
+    public void testNestedPipeline() throws DeploymentException, UnableToSatisfyBundleDependenciesException {
+
+        expect(this.installEnvironment.getInstallLog()).andReturn(this.installLog).anyTimes();
+        this.installLog.log(isA(PipelineStage.class), isA(String.class), isA(String.class));
+        expectLastCall().times(14);
+
+        replayMocks();
+
+        List<PipelineStage> expectedStageTrace = new ArrayList<PipelineStage>();
+
+        Pipeline child1 = new StandardPipeline();
+
+        PipelineStage ps1 = new TestPipelineStage();
+        child1.appendStage(ps1);
+        expectedStageTrace.add(ps1);
+
+        PipelineStage ps2 = new TestPipelineStage();
+        child1.appendStage(ps2);
+        expectedStageTrace.add(ps2);
+
+        Pipeline child2 = new StandardPipeline();
+
+        PipelineStage ps3 = new TestPipelineStage();
+        child2.appendStage(ps3);
+        expectedStageTrace.add(ps3);
+
+        PipelineStage ps4 = new TestPipelineStage();
+        child2.appendStage(ps4);
+        expectedStageTrace.add(ps4);
+        
+        Pipeline parent = new StandardPipeline();
+        parent.appendStage(child1);
+        parent.appendStage(child2);
+
+        parent.process(installGraph, installEnvironment);
+
+        assertEquals(expectedStageTrace, this.stageTrace);
+
+        verifyMocks();
+        resetMocks();
+
+    }
+
+    @Test
+    public void testSelfModifyingPipeline() throws DeploymentException, UnableToSatisfyBundleDependenciesException {
+
+        expect(this.installEnvironment.getInstallLog()).andReturn(this.installLog).anyTimes();
+        this.installLog.log(isA(PipelineStage.class), isA(String.class), isA(String.class));
+        expectLastCall().times(12);
+
+        replayMocks();
+
+        List<PipelineStage> expectedStageTrace = new ArrayList<PipelineStage>();
+
+        Pipeline p = new StandardPipeline();
+
+        PipelineStage ps1 = new TestPipelineStage();
+        p.appendStage(ps1);
+        expectedStageTrace.add(ps1);
+
+        PipelineStage ps4 = new TestPipelineStage();
+        PipelineStage ps2 = new SelfModifyingPipelineStage(p, ps4);
+        p.appendStage(ps2);
+        expectedStageTrace.add(ps2);
+
+        PipelineStage ps5 = new TestPipelineStage();
+        PipelineStage ps3 = new SelfModifyingPipelineStage(p, ps5);
+        p.appendStage(ps3);
+        expectedStageTrace.add(ps3);
+
+        expectedStageTrace.add(ps4);
+        expectedStageTrace.add(ps5);
+
+        p.process(installGraph, installEnvironment);
+
+        assertEquals(expectedStageTrace, this.stageTrace);
+
+        verifyMocks();
+        resetMocks();
+
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/pipeline/stage/transform/TransformationStageTests.java b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/pipeline/stage/transform/TransformationStageTests.java
new file mode 100644
index 0000000..eca654a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/pipeline/stage/transform/TransformationStageTests.java
@@ -0,0 +1,100 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.pipeline.stage.transform;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.expectLastCall;
+import static org.easymock.EasyMock.isA;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.environment.InstallEnvironment;
+import org.eclipse.virgo.kernel.install.environment.InstallLog;
+import org.eclipse.virgo.kernel.install.pipeline.stage.PipelineStage;
+import org.eclipse.virgo.kernel.install.pipeline.stage.transform.internal.TransformationStage;
+import org.eclipse.virgo.kernel.osgi.framework.UnableToSatisfyBundleDependenciesException;
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+import org.eclipse.virgo.util.common.GraphNode;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.ServiceRegistration;
+
+/**
+ * TODO Document TransformationStageTests
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * TODO Document concurrent semantics of TransformationStageTests
+ * 
+ */
+public class TransformationStageTests {
+
+    private GraphNode<InstallArtifact> installGraph;
+
+    private InstallEnvironment installEnvironment;
+
+    private Transformer transformer1;
+    
+    private Transformer transformer2;
+
+    private InstallLog installLog;
+
+    private PipelineStage transformationStage;
+
+    private StubBundleContext bundleContext = new StubBundleContext();
+
+    @SuppressWarnings("unchecked")
+    @Before
+    public void setUp() {        
+        this.installGraph = createMock(GraphNode.class);
+        this.transformer1 = createMock(Transformer.class);
+        this.transformer2 = createMock(Transformer.class);
+        this.transformationStage = new TransformationStage(bundleContext);
+        this.installEnvironment = createMock(InstallEnvironment.class);
+        this.installLog = createMock(InstallLog.class);
+
+        expect(this.installEnvironment.getInstallLog()).andReturn(this.installLog).anyTimes();
+        this.installLog.log(isA(Object.class), isA(String.class), isA(String.class));
+        expectLastCall().anyTimes();
+    }
+
+    @Test
+    public void transformation() throws DeploymentException, UnableToSatisfyBundleDependenciesException {
+        this.transformer1.transform(this.installGraph, this.installEnvironment);
+        this.transformer2.transform(this.installGraph, this.installEnvironment);
+        this.transformer2.transform(this.installGraph, this.installEnvironment);
+
+        replay(this.transformer1, this.transformer2, this.installEnvironment, this.installLog);
+        
+        this.transformationStage.process(this.installGraph, this.installEnvironment);
+        
+        ServiceRegistration<Transformer> registration1 = this.bundleContext.registerService(Transformer.class, this.transformer1, null);
+        ServiceRegistration<Transformer> registration2= this.bundleContext.registerService(Transformer.class, this.transformer2, null);
+        
+        this.transformationStage.process(this.installGraph, this.installEnvironment);
+        
+        registration1.unregister();
+        
+        this.transformationStage.process(this.installGraph, this.installEnvironment);
+        
+        registration2.unregister();
+        
+        this.transformationStage.process(this.installGraph, this.installEnvironment);
+        
+        verify(this.transformer1, this.transformer2, this.installEnvironment, this.installLog);        
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/pipeline/stage/transform/internal/SyntheticContextBundleCreatingTransformerTests.java b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/pipeline/stage/transform/internal/SyntheticContextBundleCreatingTransformerTests.java
new file mode 100644
index 0000000..0be2c51
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/pipeline/stage/transform/internal/SyntheticContextBundleCreatingTransformerTests.java
@@ -0,0 +1,202 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.pipeline.stage.transform.internal;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.eq;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.isA;
+import static org.easymock.EasyMock.isNull;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+import java.util.jar.JarFile;
+
+import org.eclipse.virgo.kernel.artifact.fs.StandardArtifactFSFactory;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactIdentity;
+import org.eclipse.virgo.kernel.install.artifact.ArtifactStorage;
+import org.eclipse.virgo.kernel.install.artifact.BundleInstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifactGraphFactory;
+import org.eclipse.virgo.kernel.install.artifact.PlanInstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.internal.ArtifactStorageFactory;
+import org.eclipse.virgo.kernel.install.artifact.internal.StandardArtifactStorageFactory;
+import org.eclipse.virgo.kernel.install.artifact.internal.scoping.ScopeNameFactory;
+import org.eclipse.virgo.kernel.install.environment.InstallEnvironment;
+import org.eclipse.virgo.kernel.install.pipeline.stage.transform.Transformer;
+import org.eclipse.virgo.medic.test.eventlog.MockEventLogger;
+import org.eclipse.virgo.util.common.DirectedAcyclicGraph;
+import org.eclipse.virgo.util.common.GraphNode;
+import org.eclipse.virgo.util.common.ThreadSafeDirectedAcyclicGraph;
+import org.eclipse.virgo.util.io.PathReference;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifestFactory;
+import org.eclipse.virgo.util.osgi.manifest.ImportedBundle;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Version;
+
+/**
+ */
+public final class SyntheticContextBundleCreatingTransformerTests {
+
+    private final InstallArtifactGraphFactory installArtifactGraphFactory = createMock(InstallArtifactGraphFactory.class);
+
+    private final InstallEnvironment installEnvironment = createMock(InstallEnvironment.class);
+
+    private final ArtifactStorageFactory artifactStorageFactory = new StandardArtifactStorageFactory(new PathReference("build/work"),
+        new StandardArtifactFSFactory(), new MockEventLogger(), "true");
+
+    private final Transformer transformer = new SyntheticContextBundleCreatingTransformer(this.installArtifactGraphFactory,
+        this.artifactStorageFactory);
+
+    private DirectedAcyclicGraph<InstallArtifact> dag;
+
+    @Before
+    public void createGraph() {
+        this.dag = new ThreadSafeDirectedAcyclicGraph<InstallArtifact>();
+        new PathReference("build/work/staging/plan-name-1").delete(true);
+    }
+
+    @SuppressWarnings("unchecked")
+    @Test
+    public void basicSyntheticContextCreation() throws DeploymentException, FileNotFoundException, IOException {
+        GraphNode<InstallArtifact> planInstallGraph = createMockPlan(true, new Version(1, 0, 0), "plan-name", "bundle1", "bundle2", "bundle3");
+        InstallArtifact syntheticContextInstallArtifact = createMock(InstallArtifact.class);
+
+        File syntheticBundleDir = new File("build/work/s/plan-name-1/0/0/plan-name-1-synthetic.context.jar").getAbsoluteFile();
+        expect(
+            this.installArtifactGraphFactory.constructInstallArtifactGraph(eq(new ArtifactIdentity("bundle", "plan-name-1-synthetic.context",
+                new Version(1, 0, 0), ScopeNameFactory.createScopeName("plan-name", new Version(1, 0, 0)))), isA(ArtifactStorage.class),
+                (Map<String, String>) isNull(), (String) isNull())).andReturn(this.dag.createRootNode(syntheticContextInstallArtifact));
+
+        replay(this.installEnvironment, this.installArtifactGraphFactory);
+
+        this.transformer.transform(planInstallGraph, this.installEnvironment);
+
+        verify(this.installEnvironment, this.installArtifactGraphFactory);
+
+        File manifest = new File(syntheticBundleDir, JarFile.MANIFEST_NAME);
+        assertTrue(manifest.exists());
+
+        assertBundlesImported(manifest, "bundle1", "bundle2", "bundle3");
+    }
+
+    @SuppressWarnings("unchecked")
+    @Test
+    public void nestedPlanSyntheticContextCreation() throws DeploymentException, FileNotFoundException, IOException {
+        GraphNode<InstallArtifact> rootPlanInstallGraph = createMockPlan(true, new Version(1, 0, 0), "plan-name", "bundle1");
+        rootPlanInstallGraph.addChild(createMockPlan(true, new Version(1, 0, 0), "nested-plan", "bundle2", "bundle3"));
+
+        InstallArtifact syntheticContextInstallArtifact = createMock(InstallArtifact.class);
+
+        File syntheticBundleDir = new File("build/work/s/plan-name-1/0/0/plan-name-1-synthetic.context.jar").getAbsoluteFile();
+        expect(
+            this.installArtifactGraphFactory.constructInstallArtifactGraph(eq(new ArtifactIdentity("bundle", "plan-name-1-synthetic.context",
+                new Version(1, 0, 0), ScopeNameFactory.createScopeName("plan-name", new Version(1, 0, 0)))), isA(ArtifactStorage.class),
+                (Map<String, String>) isNull(), (String) isNull())).andReturn(this.dag.createRootNode(syntheticContextInstallArtifact));
+
+        replay(this.installEnvironment, this.installArtifactGraphFactory);
+
+        this.transformer.transform(rootPlanInstallGraph, this.installEnvironment);
+
+        verify(this.installEnvironment, this.installArtifactGraphFactory);
+
+        File manifest = new File(syntheticBundleDir, JarFile.MANIFEST_NAME);
+        assertTrue(manifest.exists());
+
+        assertBundlesImported(manifest, "bundle1", "bundle2", "bundle3");
+    }
+
+    @SuppressWarnings("unchecked")
+    @Test
+    public void syntheticContextOnlyCreatedForScopedPlans() throws DeploymentException, FileNotFoundException, IOException {
+        GraphNode<InstallArtifact> rootPlanInstallGraph = createMockPlan(false, new Version(1, 0, 0), "plan-name", "bundle1");
+        rootPlanInstallGraph.addChild(createMockPlan(true, new Version(1, 0, 0), "nested-plan", "bundle2", "bundle3"));
+
+        InstallArtifact syntheticContextInstallArtifact = createMock(InstallArtifact.class);
+
+        File syntheticBundleDir = new File("build/work/s/nested-plan-1/0/0/nested-plan-1-synthetic.context.jar").getAbsoluteFile();
+        expect(
+            this.installArtifactGraphFactory.constructInstallArtifactGraph(eq(new ArtifactIdentity("bundle", "nested-plan-1-synthetic.context",
+                new Version(1, 0, 0), ScopeNameFactory.createScopeName("nested-plan", new Version(1, 0, 0)))), isA(ArtifactStorage.class),
+                (Map<String, String>) isNull(), (String) isNull())).andReturn(this.dag.createRootNode(syntheticContextInstallArtifact));
+
+        replay(this.installEnvironment, this.installArtifactGraphFactory);
+
+        this.transformer.transform(rootPlanInstallGraph, this.installEnvironment);
+
+        verify(this.installEnvironment, this.installArtifactGraphFactory);
+
+        File manifest = new File(syntheticBundleDir, JarFile.MANIFEST_NAME);
+        assertTrue(manifest.exists());
+
+        assertBundlesImported(manifest, "bundle2", "bundle3");
+    }
+
+    private void assertBundlesImported(File manifestFile, String... symbolicNames) throws FileNotFoundException, IOException {
+        try (FileReader fileReader = new FileReader(manifestFile)) {
+            BundleManifest bundleManifest = BundleManifestFactory.createBundleManifest(fileReader);
+            List<ImportedBundle> importedBundles = bundleManifest.getImportBundle().getImportedBundles();
+            assertEquals(symbolicNames.length, importedBundles.size());
+
+            for (String symbolicName : symbolicNames) {
+                assertBundleImported(importedBundles, symbolicName);
+            }
+        }
+    }
+
+    private void assertBundleImported(List<ImportedBundle> importedBundles, String symbolicName) {
+        for (ImportedBundle importedBundle : importedBundles) {
+            if (symbolicName.equals(importedBundle.getBundleSymbolicName())) {
+                return;
+            }
+        }
+        fail("No import for symbolic name '" + symbolicName + "' was found among imported bundles " + importedBundles);
+    }
+
+    private InstallArtifact createMockBundleInstallArtifact(String symbolicName) {
+        InstallArtifact bundle = createMock(BundleInstallArtifact.class);
+        expect(bundle.getName()).andReturn(symbolicName).anyTimes();
+        replay(bundle);
+        return bundle;
+    }
+
+    private GraphNode<InstallArtifact> createMockPlan(boolean scoped, Version version, String name, String... bundleSymbolicNames) {
+        PlanInstallArtifact plan = createMock(PlanInstallArtifact.class);
+
+        expect(plan.isScoped()).andReturn(scoped).anyTimes();
+        expect(plan.getVersion()).andReturn(version).anyTimes();
+        expect(plan.getName()).andReturn(name).anyTimes();
+
+        replay(plan);
+
+        GraphNode<InstallArtifact> installTree = this.dag.createRootNode(plan);
+
+        for (String bundleSymbolicName : bundleSymbolicNames) {
+            InstallArtifact bundle = createMockBundleInstallArtifact(bundleSymbolicName);
+            installTree.addChild(this.dag.createRootNode(bundle));
+        }
+        return installTree;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/pipeline/stage/transform/internal/UserInstalledTaggingTransformerTests.java b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/pipeline/stage/transform/internal/UserInstalledTaggingTransformerTests.java
new file mode 100644
index 0000000..aca68a6
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/java/org/eclipse/virgo/kernel/install/pipeline/stage/transform/internal/UserInstalledTaggingTransformerTests.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.install.pipeline.stage.transform.internal;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.eq;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.environment.InstallEnvironment;
+import org.eclipse.virgo.util.common.GraphNode;
+import org.junit.Test;
+
+public class UserInstalledTaggingTransformerTests {
+
+    private final UserInstalledTaggingTransformer transformer = new UserInstalledTaggingTransformer();
+
+    @SuppressWarnings("unchecked")
+    @Test
+    public void test() throws DeploymentException {
+        InstallEnvironment installEnvironment = createMock(InstallEnvironment.class);
+        GraphNode<InstallArtifact> installGraph = createMock(GraphNode.class);
+        InstallArtifact installArtifact = createMock(InstallArtifact.class);
+
+        expect(installGraph.getValue()).andReturn(installArtifact);
+        expect(installArtifact.setProperty(eq("user.installed"), eq("true"))).andReturn(null);
+
+        replay(installEnvironment, installGraph, installArtifact);
+
+        this.transformer.transform(installGraph, installEnvironment);
+
+        verify(installEnvironment, installGraph, installArtifact);
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/artefacts/exploded/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/artefacts/exploded/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/artefacts/exploded/META-INF/MANIFEST.MF
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/artefacts/exploded/META-INF/web/index.jsp b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/artefacts/exploded/META-INF/web/index.jsp
new file mode 100644
index 0000000..8102008
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/artefacts/exploded/META-INF/web/index.jsp
@@ -0,0 +1,12 @@
+<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
+	pageEncoding="ISO-8859-1"%>
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Hello Web!</title>
+</head>
+<body>
+<p>Hello Web!</p>
+</body>
+</html>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/artefacts/exploded/somefile.txt b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/artefacts/exploded/somefile.txt
new file mode 100644
index 0000000..c57eff5
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/artefacts/exploded/somefile.txt
@@ -0,0 +1 @@
+Hello World!
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/artefacts/exploded/somefolder/.gitignore b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/artefacts/exploded/somefolder/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/artefacts/exploded/somefolder/.gitignore
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/artifacts/malformed-application-context.jar b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/artifacts/malformed-application-context.jar
new file mode 100644
index 0000000..ea524f8
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/artifacts/malformed-application-context.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/artifacts/nobsn.jar b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/artifacts/nobsn.jar
new file mode 100644
index 0000000..032a7df
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/artifacts/nobsn.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/artifacts/rawfile b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/artifacts/rawfile
new file mode 100644
index 0000000..93a4a0b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/artifacts/rawfile
@@ -0,0 +1 @@
+rawfile
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/artifacts/simple.jar b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/artifacts/simple.jar
new file mode 100644
index 0000000..7efafc1
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/artifacts/simple.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/artifacts/simple/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/artifacts/simple/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..f976ff0
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/artifacts/simple/META-INF/MANIFEST.MF
@@ -0,0 +1,4 @@
+Manifest-Version: 1.0

+Created-By: 1.6.0_07 (Apple Inc.)

+Bundle-SymbolicName: test

+

diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/artifacts/simple/test/rawfile b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/artifacts/simple/test/rawfile
new file mode 100644
index 0000000..93a4a0b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/artifacts/simple/test/rawfile
@@ -0,0 +1 @@
+rawfile
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/artifacts/test.properties b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/artifacts/test.properties
new file mode 100644
index 0000000..efc73ad
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/artifacts/test.properties
@@ -0,0 +1 @@
+a=b
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/but/but.B.after.jar b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/but/but.B.after.jar
new file mode 100644
index 0000000..1059cb7
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/but/but.B.after.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/but/but.B.before.jar b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/but/but.B.before.jar
new file mode 100644
index 0000000..e2e0249
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/but/but.B.before.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/but/but.C.jar b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/but/but.C.jar
new file mode 100644
index 0000000..e30aeba
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/but/but.C.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/cloning/app/1.0/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/cloning/app/1.0/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..a1bb768
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/cloning/app/1.0/META-INF/MANIFEST.MF
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: com.springsource.app
+Bundle-Version: 1.0
+Import-Package: org.hibernate;version="[3.2.5,3.2.5]",org.springframework.orm.hibernate;version="2.5.3"
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/cloning/hibernate/3.2.5/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/cloning/hibernate/3.2.5/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..4a044c8
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/cloning/hibernate/3.2.5/META-INF/MANIFEST.MF
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: org.hibernate.clone
+Bundle-Version: 3.2.5
+Export-Package: org.hibernate;version="3.2.5"
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/cloning/hibernate/3.2.6/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/cloning/hibernate/3.2.6/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..2b5b9d4
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/cloning/hibernate/3.2.6/META-INF/MANIFEST.MF
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: org.hibernate.clone
+Bundle-Version: 3.2.6
+Export-Package: org.hibernate;version="3.2.6"
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/cloning/spring/2.5.3/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/cloning/spring/2.5.3/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..e4aa5be
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/cloning/spring/2.5.3/META-INF/MANIFEST.MF
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: org.springframework.clone
+Bundle-Version: 2.5.3
+Export-Package: org.springframework.orm.hibernate;version="2.5.3";uses:="org.hibernate"
+Import-Package: org.hibernate
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/config/BundleUpdateTests/repository.properties b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/config/BundleUpdateTests/repository.properties
new file mode 100644
index 0000000..945bc8b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/config/BundleUpdateTests/repository.properties
@@ -0,0 +1,7 @@
+bundles.type=external
+bundles.searchPattern=../{bundle}/target/classes
+
+ivy-cache-bundles.type=external
+ivy-cache-bundles.searchPattern=../${ivy.cache::ivy-cache}/repository/{org}/{name}/{version}/{bundle}.jar
+
+chain=bundles,ivy-cache-bundles
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/dat/one/bundle/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/dat/one/bundle/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..e550bfa
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/dat/one/bundle/META-INF/MANIFEST.MF
@@ -0,0 +1 @@
+Manifest-Version: 1
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/dat/two/bundle/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/dat/two/bundle/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..e550bfa
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/dat/two/bundle/META-INF/MANIFEST.MF
@@ -0,0 +1 @@
+Manifest-Version: 1
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/debug.options b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/debug.options
new file mode 100644
index 0000000..847eb36
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/debug.options
@@ -0,0 +1,4 @@
+org.eclipse.osgi/resolver/debug=true
+org.eclipse.osgi/resolver/wiring=true
+org.eclipse.osgi/resolver/imports=true
+org.eclipse.osgi/eclipseadaptor/debug/platformadmin/resolver=true
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/different-hash-test/jar1.jar b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/different-hash-test/jar1.jar
new file mode 100644
index 0000000..15f1858
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/different-hash-test/jar1.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/different-hash-test/jar2.jar b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/different-hash-test/jar2.jar
new file mode 100644
index 0000000..945bb17
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/different-hash-test/jar2.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/different-hash-test/jar2a.jar b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/different-hash-test/jar2a.jar
new file mode 100644
index 0000000..945bb17
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/different-hash-test/jar2a.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/dummy/other/ignore.txt b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/dummy/other/ignore.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/dummy/other/ignore.txt
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/dummy/other/jar2.jar b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/dummy/other/jar2.jar
new file mode 100644
index 0000000..ecd3eac
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/dummy/other/jar2.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/exploded/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/exploded/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..9a0adaa
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/exploded/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Bundle-SymbolicName: org.eclipse.virgo.server.exploded
+Bundle-Version: 1.2.3
+
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/export-same-package/root-a/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/export-same-package/root-a/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..78a0991
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/export-same-package/root-a/META-INF/MANIFEST.MF
@@ -0,0 +1,4 @@
+Bundle-SymbolicName: bundleA
+Bundle-Version: 1.0
+Bundle-ManifestVersion: 2
+Export-Package: com.foo
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/export-same-package/root-b/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/export-same-package/root-b/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..e489459
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/export-same-package/root-b/META-INF/MANIFEST.MF
@@ -0,0 +1,4 @@
+Bundle-SymbolicName: bundleB
+Bundle-Version: 1.0
+Bundle-ManifestVersion: 2
+Export-Package: com.foo
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/faulty/imp/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/faulty/imp/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..f15776d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/faulty/imp/META-INF/MANIFEST.MF
@@ -0,0 +1,5 @@
+Manifest-Version: 1
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: faulty.imp
+Bundle-Version: 1.2.3
+Import-Package: foo.bar
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/file-system-searcher/a/1/a1.txt b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/file-system-searcher/a/1/a1.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/file-system-searcher/a/1/a1.txt
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/file-system-searcher/a/1/z/a1z.txt b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/file-system-searcher/a/1/z/a1z.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/file-system-searcher/a/1/z/a1z.txt
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/file-system-searcher/a/1/z/file.wont.be.found b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/file-system-searcher/a/1/z/file.wont.be.found
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/file-system-searcher/a/1/z/file.wont.be.found
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/file-system-searcher/b/1/b1.txt b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/file-system-searcher/b/1/b1.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/file-system-searcher/b/1/b1.txt
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/file-system-searcher/b/1/file.wont.be.found b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/file-system-searcher/b/1/file.wont.be.found
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/file-system-searcher/b/1/file.wont.be.found
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/file-system-searcher/c/1/c1.txt b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/file-system-searcher/c/1/c1.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/file-system-searcher/c/1/c1.txt
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/file-system-searcher/c/c.txt b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/file-system-searcher/c/c.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/file-system-searcher/c/c.txt
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/invalid/bundle/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/invalid/bundle/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..4f019d7
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/invalid/bundle/META-INF/MANIFEST.MF
@@ -0,0 +1,2 @@
+Bundle-SymbolicName: org.eclipse.virgo.server.invalid
+Import-Package: org.springframework.core
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/jars/dummy.jar b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/jars/dummy.jar
new file mode 100644
index 0000000..7ab5fb3
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/jars/dummy.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/jars/mockbundle.jar b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/jars/mockbundle.jar
new file mode 100644
index 0000000..37fe003
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/jars/mockbundle.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/libraries/exploded/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/libraries/exploded/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..d1a0ac6
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/libraries/exploded/META-INF/MANIFEST.MF
@@ -0,0 +1,2 @@
+Library-SymbolicName: org.exploded
+Library-Version: 1.2.3
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/libraries/exploded/bundle.jar b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/libraries/exploded/bundle.jar
new file mode 100644
index 0000000..f11d1ab
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/libraries/exploded/bundle.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/libraries/spring-instrumented.libd b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/libraries/spring-instrumented.libd
new file mode 100644
index 0000000..1d46865
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/libraries/spring-instrumented.libd
@@ -0,0 +1,4 @@
+Library-SymbolicName: org.springframework.instrumented
+Library-Version: 2.5.1
+Import-Bundle: org.springframework.core.instrumented;version=2.5.2,
+ org.springframework.beans.instrumented;version=2.5.2
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/libraries/spring.libd b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/libraries/spring.libd
new file mode 100644
index 0000000..4288bbe
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/libraries/spring.libd
@@ -0,0 +1,5 @@
+Library-SymbolicName: org.springframework
+Library-Name: Spring framework
+Library-Description: description
+Library-Version: 2.5.1
+Import-Bundle: org.springframework.bundle.spring.core;version=2.5.1,org.springframework.bundle.spring.beans;version=2.5.1
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/manifests/invalid-import-package.MF b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/manifests/invalid-import-package.MF
new file mode 100644
index 0000000..40d36d5
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/manifests/invalid-import-package.MF
@@ -0,0 +1,11 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Hotel Booking Service Implementation
+Bundle-SymbolicName: org.springframework.booking.internal
+Import-Package: org.springframework.booking.domain,
+ org.springframework.booking.service,
+Export-Package: org.springframework.booking.internal
+Import-Library: javax_persistence;version="1.0.0",
+ org.springframework_spring;version="2.5.3",
+ org_hibernate;version="3.2.6.ga" 
+ 
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/multi-bundle-application-tests/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/multi-bundle-application-tests/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..20f5886
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/multi-bundle-application-tests/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Application-SymbolicName: org.eclipse.virgo.kernel.deployer.app.MultiBundleApplicationTestApp
+Application-Version: 1.0.0
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/multi-bundle-application-tests/one.jar b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/multi-bundle-application-tests/one.jar
new file mode 100644
index 0000000..9445d6b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/multi-bundle-application-tests/one.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/multi-bundle-application-tests/two.jar b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/multi-bundle-application-tests/two.jar
new file mode 100644
index 0000000..c009ee0
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/multi-bundle-application-tests/two.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/multi-root/root-a/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/multi-root/root-a/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..44b6250
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/multi-root/root-a/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Bundle-SymbolicName: multi.root
+Bundle-Version: 1.0
+Test: A
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/multi-root/root-b/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/multi-root/root-b/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..b9c297c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/multi-root/root-b/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Bundle-SymbolicName: multi.root
+Bundle-Version: 1.0
+Test: B
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/org/eclipse/virgo/kernel/install/artifact/internal/sbiat-bundle/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/org/eclipse/virgo/kernel/install/artifact/internal/sbiat-bundle/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..baf8217
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/org/eclipse/virgo/kernel/install/artifact/internal/sbiat-bundle/META-INF/MANIFEST.MF
@@ -0,0 +1 @@
+Bundle-SymbolicName: sbiat-bundle
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/repository-configuration/duplicate-repository-in-chain.properties b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/repository-configuration/duplicate-repository-in-chain.properties
new file mode 100644
index 0000000..6f11ef6
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/repository-configuration/duplicate-repository-in-chain.properties
@@ -0,0 +1,7 @@
+bundles-ext.type=external
+bundles-ext.searchPattern=repository/bundles/ext/*.jar
+
+bundles-usr.type=external
+bundles-usr.searchPattern=repository/bundles/usr/*.jar
+
+chain=bundles-ext,bundles-usr,bundles-ext,bundles-usr
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/repository-configuration/missing-chain.properties b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/repository-configuration/missing-chain.properties
new file mode 100644
index 0000000..f0cb96a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/repository-configuration/missing-chain.properties
@@ -0,0 +1,2 @@
+bundles-ext.type=external
+bundles-ext.searchPattern=repository/bundles/ext/*.jar
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/repository-configuration/missing-repositories.properties b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/repository-configuration/missing-repositories.properties
new file mode 100644
index 0000000..15803a7
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/repository-configuration/missing-repositories.properties
@@ -0,0 +1 @@
+chain=bundles-ext,bundles-usr,libraries-ext,libraries-usr,managed-repo,watched-repo,remote-repo
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/repository-configuration/repository.properties b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/repository-configuration/repository.properties
new file mode 100644
index 0000000..92dbf4b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/repository-configuration/repository.properties
@@ -0,0 +1,12 @@
+bundles-ext.type=external
+bundles-ext.searchPattern=repository/bundles/ext/*.jar
+
+watched-repo.type=watched
+watched-repo.watchDirectory=repository/watched
+watched-repo.watchInterval=5
+
+remote-repo.type=remote
+remote-repo.uri=http://localhost:8080/org.eclipse.virgo.repository/foo
+remote-repo.indexRefreshInterval=5
+
+chain=bundles-ext,watched-repo,remote-repo
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/repository-populator-tests/corrupt-jar-test/a.jar b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/repository-populator-tests/corrupt-jar-test/a.jar
new file mode 100644
index 0000000..f647f27
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/repository-populator-tests/corrupt-jar-test/a.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/repository-populator-tests/corrupt-jar-test/b.jar b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/repository-populator-tests/corrupt-jar-test/b.jar
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/repository-populator-tests/corrupt-jar-test/b.jar
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/repository-populator-tests/corrupt-jar-test/c.jar b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/repository-populator-tests/corrupt-jar-test/c.jar
new file mode 100644
index 0000000..a20a1aa
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/repository-populator-tests/corrupt-jar-test/c.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/repository-populator-tests/malformed-manifest-test/a/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/repository-populator-tests/malformed-manifest-test/a/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..421e9b5
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/repository-populator-tests/malformed-manifest-test/a/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Bundle-SymbolicName: a
+Export-Package: com.foo.a
+Bundle-ManifestVersion: 2
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/repository-populator-tests/malformed-manifest-test/b/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/repository-populator-tests/malformed-manifest-test/b/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..d6227b6
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/repository-populator-tests/malformed-manifest-test/b/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Bundle-SymbolicName: b
+Export-Package: com.foo.b;@$%,,
+Bundle-ManifestVersion: 2
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/repository-populator-tests/malformed-manifest-test/c/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/repository-populator-tests/malformed-manifest-test/c/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..f93fa1f
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/repository-populator-tests/malformed-manifest-test/c/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Bundle-SymbolicName: c
+Export-Package: com.foo.c
+Bundle-ManifestVersion: 2
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/scoping/bundles/bug331767/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/scoping/bundles/bug331767/META-INF/MANIFEST.MF
new file mode 100755
index 0000000..0412e07
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/scoping/bundles/bug331767/META-INF/MANIFEST.MF
@@ -0,0 +1,16 @@
+Manifest-Version: 1.0
+Export-Package: bug331767;version="1.0.0";uses:="org.osgi.fra
+ mework",foo.test;version="0.4.1"
+Import-Package: foo.test;version="0.4.1"
+Require-Bundle: foobundle;visibility:=reexport
+Import-Library: javax_persistence;version="1.0.0"
+Bundle-Classpath: .
+Bundle-Name: Dynamic Import Problem
+Created-By: Apache Maven
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+DynamicImport-Package: *,*;testattr=test
+Bundle-Version: 1.0.0
+Build-Jdk: 1.6.0_20
+Bundle-Activator: bug331767.Activator
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: BUNDLEbug331767
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/scoping/complexService.xml b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/scoping/complexService.xml
new file mode 100644
index 0000000..9afe0b4
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/scoping/complexService.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:osgi="http://www.springframework.org/schema/osgi"
+	xsi:schemaLocation="
+		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
+		http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi.xsd">
+	<osgi:service ref="service">
+		<osgi:interfaces>
+			<value>java.io.Serializable</value>
+			<value>java.lang.Appendable</value>
+		</osgi:interfaces>
+		<osgi:service-properties>
+			<entry key="foo" value="bar"/>
+			<entry key="boo" value="baz"/>
+		</osgi:service-properties>
+	</osgi:service>
+	<bean id="service" class="java.lang.StringBuffer" />
+</beans>
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/scoping/simpleService.xml b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/scoping/simpleService.xml
new file mode 100644
index 0000000..74aa011
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/scoping/simpleService.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns:osgi="http://www.springframework.org/schema/osgi"
+	xsi:schemaLocation="
+		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
+		http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi.xsd">
+
+	<osgi:service ref="service" interface="java.io.Serializable" />
+
+	<bean id="service" class="java.lang.String"/>
+	
+</beans>
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/test/dummy.txt b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/test/dummy.txt
new file mode 100644
index 0000000..9f26b63
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/test/dummy.txt
@@ -0,0 +1 @@
+Foo
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/unit.test.subsystem/subsystem.xml b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/unit.test.subsystem/subsystem.xml
new file mode 100644
index 0000000..55ccdf4
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/src/test/resources/unit.test.subsystem/subsystem.xml
@@ -0,0 +1,4 @@
+<subsystem name="unit.test.subsystem" description="Unit test subsystem descriptor">
+        <bundle symbolic-name="bundle1"/>
+        <bundle symbolic-name="bundle2"/>
+</subsystem>
diff --git a/kernel/org.eclipse.virgo.kernel.deployer/template.mf b/kernel/org.eclipse.virgo.kernel.deployer/template.mf
new file mode 100644
index 0000000..7f4accb
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.deployer/template.mf
@@ -0,0 +1,31 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Virgo Kernel Deployer
+Bundle-SymbolicName: org.eclipse.virgo.kernel.deployer
+Bundle-Version: ${version}
+Import-Template:
+ org.eclipse.virgo.kernel.*;version="${version:[=.=.=, =.+1)}",
+ org.eclipse.virgo.nano.*;version="${version:[=.=.=, =.+1)}",
+ org.eclipse.virgo.util.*;version="${version:[=.=.=, =.+1)}",
+ org.eclipse.virgo.repository.*;version="${version:[=.=.=, =.+1)}",
+ org.eclipse.virgo.medic.*;version="${version:[=.=.=, =.+1)}",
+ org.slf4j.*;version="${slf4jVersion:[=.=.=, +1)}",
+ org.aspectj.*;version="${aspectjVersion:[=.=.=, +1)}",
+ org.springframework.*;version="${springframeworkVersion:[2.5.6, +1)}",
+ org.eclipse.gemini.blueprint.*;version="${geminiBlueprintVersion:[=.=.=, +1]}",
+ org.osgi.framework.*;version="0",
+ org.eclipse.osgi.*;version="0",
+ org.osgi.service.*;version="0",
+ org.osgi.service.cm.*;version="0",
+ org.osgi.util.tracker.*;version="0",
+ org.eclipse.equinox.region.*;version="${equinoxRegionExportedPackageVersion:[=.=.=, =.+1)}",
+ javax.management.*;version="0",
+ javax.xml.*;version="0",
+ org.xml.*;version="0",
+ org.w3c.*;version="0"
+Excluded-Imports:
+ org.eclipse.virgo.kernel.equinox.*,
+ org.eclipse.virgo.nano.deployer.hotenabler
+Excluded-Exports:
+ org.eclipse.virgo.nano.deployer.*,
+ *.internal.*
diff --git a/kernel/org.eclipse.virgo.kernel.dmfragment/.settings/org.eclipse.virgo.ide.bundlor.core.prefs b/kernel/org.eclipse.virgo.kernel.dmfragment/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
new file mode 100644
index 0000000..f5210c6
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.dmfragment/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
@@ -0,0 +1,3 @@
+#Mon Jul 06 09:06:52 BST 2009

+org.eclipse.virgo.ide.bundlor.core.template.properties.files=../build.properties;../build.versions

+eclipse.preferences.version=1

diff --git a/kernel/org.eclipse.virgo.kernel.dmfragment/.settings/org.eclipse.wst.common.project.facet.core.xml b/kernel/org.eclipse.virgo.kernel.dmfragment/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..dae763d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.dmfragment/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<faceted-project>

+  <installed facet="org.eclipse.virgo.server.bundle" version="1.0"/>

+</faceted-project>

diff --git a/kernel/org.eclipse.virgo.kernel.dmfragment/.settings/org.springframework.ide.eclipse.beans.core.prefs b/kernel/org.eclipse.virgo.kernel.dmfragment/.settings/org.springframework.ide.eclipse.beans.core.prefs
new file mode 100644
index 0000000..b8bf5a6
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.dmfragment/.settings/org.springframework.ide.eclipse.beans.core.prefs
@@ -0,0 +1,3 @@
+#Mon Jul 06 16:49:15 BST 2009

+eclipse.preferences.version=1

+org.springframework.ide.eclipse.beans.core.ignoreMissingNamespaceHandler=false

diff --git a/kernel/org.eclipse.virgo.kernel.dmfragment/.springBeans b/kernel/org.eclipse.virgo.kernel.dmfragment/.springBeans
new file mode 100644
index 0000000..9b08bae
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.dmfragment/.springBeans
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<beansProjectDescription>

+	<version>1</version>

+	<pluginVersion><![CDATA[2.2.5.200906231226-RC1]]></pluginVersion>

+	<configSuffixes>

+		<configSuffix><![CDATA[xml]]></configSuffix>

+	</configSuffixes>

+	<enableImports><![CDATA[false]]></enableImports>

+	<configs>

+		<config>src/main/resources/META-INF/spring/extender/kernel-dmfragment-context.xml</config>

+	</configs>

+	<configSets>

+	</configSets>

+</beansProjectDescription>

diff --git a/kernel/org.eclipse.virgo.kernel.dmfragment/src/main/java/org/eclipse/virgo/kernel/dmfragment/ModuleBeanFactoryPostProcessor.java b/kernel/org.eclipse.virgo.kernel.dmfragment/src/main/java/org/eclipse/virgo/kernel/dmfragment/ModuleBeanFactoryPostProcessor.java
new file mode 100644
index 0000000..18c7441
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.dmfragment/src/main/java/org/eclipse/virgo/kernel/dmfragment/ModuleBeanFactoryPostProcessor.java
@@ -0,0 +1,26 @@
+/*******************************************************************************

+ * Copyright (c) 2008, 2010 VMware Inc.

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ *

+ * Contributors:

+ *   VMware Inc. - initial contribution

+ *******************************************************************************/

+

+package org.eclipse.virgo.kernel.dmfragment;

+

+import org.osgi.framework.BundleContext;

+import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;

+

+/**

+ * <strong>Concurrent Semantics</strong><br />

+ * 

+ * Implementations must be thread-safe.

+ * 

+ */

+public interface ModuleBeanFactoryPostProcessor {

+

+    void postProcess(BundleContext bundleContext, ConfigurableListableBeanFactory beanFactory);

+}

diff --git a/kernel/org.eclipse.virgo.kernel.dmfragment/src/main/java/org/eclipse/virgo/kernel/dmfragment/internal/ApplicationContextShutdownBean.java b/kernel/org.eclipse.virgo.kernel.dmfragment/src/main/java/org/eclipse/virgo/kernel/dmfragment/internal/ApplicationContextShutdownBean.java
new file mode 100644
index 0000000..432fc17
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.dmfragment/src/main/java/org/eclipse/virgo/kernel/dmfragment/internal/ApplicationContextShutdownBean.java
@@ -0,0 +1,58 @@
+/*******************************************************************************

+ * Copyright (c) 2008, 2010 VMware Inc.

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ *

+ * Contributors:

+ *   VMware Inc. - initial contribution

+ *******************************************************************************/

+

+package org.eclipse.virgo.kernel.dmfragment.internal;

+

+import org.slf4j.Logger;

+import org.slf4j.LoggerFactory;

+import org.springframework.beans.factory.BeanFactoryUtils;

+import org.springframework.context.ApplicationContext;

+import org.springframework.context.ApplicationEvent;

+import org.springframework.context.ApplicationListener;

+import org.springframework.context.event.ApplicationContextEvent;

+import org.springframework.context.event.ContextClosedEvent;

+import org.eclipse.gemini.blueprint.service.importer.support.OsgiServiceProxyFactoryBean;

+

+/**

+ * {@link ApplicationContextShutdownBean} manages the shutting down of application contexts in the dm Server. In

+ * particular it is responsible for ensuring that Spring DM service proxies do not hold up application context shutdown.

+ * <p />

+ * 

+ * <strong>Concurrent Semantics</strong><br />

+ * 

+ * This class is thread safe.

+ * 

+ */

+// Note that this class must not implement ApplicationListener<ContextClosedEvent> since it needs to work with Spring

+// 2.5.x as well as Spring 3 and beyond.

+final class ApplicationContextShutdownBean implements ApplicationListener<ApplicationEvent> {

+

+    private static final Logger logger = LoggerFactory.getLogger(ApplicationContextShutdownBean.class);

+

+    /**

+     * {@inheritDoc}

+     */

+    public void onApplicationEvent(ApplicationEvent event) {

+        if (event instanceof ContextClosedEvent) {

+            logger.info("Processing ContextClosedEvent '{}'", event);

+            ApplicationContext applicationContext = ((ApplicationContextEvent) event).getApplicationContext();

+            disableServiceProxyRetry(applicationContext);

+        }

+    }

+

+    static void disableServiceProxyRetry(ApplicationContext applicationContext) {

+        for (OsgiServiceProxyFactoryBean proxyBean : BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext,

+            OsgiServiceProxyFactoryBean.class, true, false).values()) {

+            logger.info("Setting timeout to 0 for proxy '{}' of application context '{}'", proxyBean, applicationContext);

+            proxyBean.setTimeout(0);

+        }

+    }

+}

diff --git a/kernel/org.eclipse.virgo.kernel.dmfragment/src/main/java/org/eclipse/virgo/kernel/dmfragment/internal/ApplicationContextShutdownBeanPostProcessor.java b/kernel/org.eclipse.virgo.kernel.dmfragment/src/main/java/org/eclipse/virgo/kernel/dmfragment/internal/ApplicationContextShutdownBeanPostProcessor.java
new file mode 100644
index 0000000..28c148e
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.dmfragment/src/main/java/org/eclipse/virgo/kernel/dmfragment/internal/ApplicationContextShutdownBeanPostProcessor.java
@@ -0,0 +1,31 @@
+/*******************************************************************************

+ * Copyright (c) 2008, 2010 VMware Inc.

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ *

+ * Contributors:

+ *   VMware Inc. - initial contribution

+ *******************************************************************************/

+

+package org.eclipse.virgo.kernel.dmfragment.internal;

+

+import org.eclipse.virgo.kernel.dmfragment.ModuleBeanFactoryPostProcessor;

+import org.osgi.framework.BundleContext;

+import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;

+

+

+

+final class ApplicationContextShutdownBeanPostProcessor implements ModuleBeanFactoryPostProcessor{

+

+    private static final String APPLICATION_CONTEXT_SHUTDOWN_BEAN_NAME = "org.eclipse.virgo.server.applicationContextShutdownBean";

+    

+    /** 

+     * {@inheritDoc}

+     */

+    public void postProcess(BundleContext bundleContext, ConfigurableListableBeanFactory beanFactory) {

+        beanFactory.registerSingleton(APPLICATION_CONTEXT_SHUTDOWN_BEAN_NAME, new ApplicationContextShutdownBean());

+    }

+

+}

diff --git a/kernel/org.eclipse.virgo.kernel.dmfragment/src/main/java/org/eclipse/virgo/kernel/dmfragment/internal/ContextClassLoaderPostProcessor.java b/kernel/org.eclipse.virgo.kernel.dmfragment/src/main/java/org/eclipse/virgo/kernel/dmfragment/internal/ContextClassLoaderPostProcessor.java
new file mode 100644
index 0000000..6f280be
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.dmfragment/src/main/java/org/eclipse/virgo/kernel/dmfragment/internal/ContextClassLoaderPostProcessor.java
@@ -0,0 +1,68 @@
+/*******************************************************************************

+ * Copyright (c) 2008, 2010 VMware Inc.

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ *

+ * Contributors:

+ *   VMware Inc. - initial contribution

+ *******************************************************************************/

+

+package org.eclipse.virgo.kernel.dmfragment.internal;

+

+import java.util.HashSet;

+import java.util.Set;

+

+import org.eclipse.virgo.kernel.dmfragment.ModuleBeanFactoryPostProcessor;

+import org.osgi.framework.BundleContext;

+import org.springframework.beans.MutablePropertyValues;

+import org.springframework.beans.factory.config.BeanDefinition;

+import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;

+import org.eclipse.gemini.blueprint.extender.OsgiBeanFactoryPostProcessor;

+import org.eclipse.gemini.blueprint.service.importer.support.ImportContextClassLoaderEnum;

+import org.eclipse.gemini.blueprint.service.importer.support.OsgiServiceCollectionProxyFactoryBean;

+import org.eclipse.gemini.blueprint.service.importer.support.OsgiServiceProxyFactoryBean;

+

+

+/**

+ * {@link OsgiBeanFactoryPostProcessor} that ensures that all service references are in unmanaged mode for thread

+ * context class loader propagation.<p/>

+ * 

+ * <strong>Concurrent Semantics</strong><br />

+ * 

+ * Threadsafe.

+ * 

+ */

+final class ContextClassLoaderPostProcessor implements ModuleBeanFactoryPostProcessor {

+

+    private static final String PROPERTY_CONTEXT_CLASS_LOADER = "importContextClassLoader";

+

+    private static final Set<String> IMPORTER_CLASS_NAMES = createImportClassNames();

+

+    /**

+     * {@inheritDoc}

+     */

+    public void postProcess(BundleContext bundleContext, ConfigurableListableBeanFactory beanFactory) {

+        String[] beanDefinitionNames = beanFactory.getBeanDefinitionNames();

+        for (String name : beanDefinitionNames) {

+            BeanDefinition beanDefinition = beanFactory.getBeanDefinition(name);

+            if (isServiceImportDefinition(beanDefinition)) {

+                MutablePropertyValues propertyValues = beanDefinition.getPropertyValues();

+                propertyValues.addPropertyValue(PROPERTY_CONTEXT_CLASS_LOADER, ImportContextClassLoaderEnum.UNMANAGED);

+            }

+        }

+    }

+

+    private static Set<String> createImportClassNames() {

+        Set<String> names = new HashSet<String>();

+        names.add(OsgiServiceProxyFactoryBean.class.getName());

+        names.add(OsgiServiceCollectionProxyFactoryBean.class.getName());

+        return names;

+    }

+

+    private boolean isServiceImportDefinition(BeanDefinition beanDefinition) {

+        return IMPORTER_CLASS_NAMES.contains(beanDefinition.getBeanClassName());

+    }

+

+}

diff --git a/kernel/org.eclipse.virgo.kernel.dmfragment/src/main/java/org/eclipse/virgo/kernel/dmfragment/internal/KernelAnnotationMBeanExporter.java b/kernel/org.eclipse.virgo.kernel.dmfragment/src/main/java/org/eclipse/virgo/kernel/dmfragment/internal/KernelAnnotationMBeanExporter.java
new file mode 100644
index 0000000..73b4084
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.dmfragment/src/main/java/org/eclipse/virgo/kernel/dmfragment/internal/KernelAnnotationMBeanExporter.java
@@ -0,0 +1,39 @@
+/*******************************************************************************

+ * Copyright (c) 2008, 2010 VMware Inc.

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ *

+ * Contributors:

+ *   VMware Inc. - initial contribution

+ *******************************************************************************/

+

+package org.eclipse.virgo.kernel.dmfragment.internal;

+

+import javax.management.MBeanException;

+import javax.management.modelmbean.ModelMBean;

+

+import org.eclipse.virgo.nano.shim.serviceability.TracingService;

+import org.springframework.jmx.export.annotation.AnnotationMBeanExporter;

+

+

+/**

+ * An extension of {@link AnnotationMBeanExporter} that exports Kernel-specific MBeans.

+ * 

+ * <strong>Concurrent Semantics</strong><br />

+ * As thread-safe as <code>MBeanExporter</code>.

+ */

+final class KernelAnnotationMBeanExporter extends AnnotationMBeanExporter {

+

+    private final TracingService tracingService;

+

+    KernelAnnotationMBeanExporter(TracingService tracingService) {

+        this.tracingService = tracingService;

+    }

+

+    @Override

+    protected ModelMBean createModelMBean() throws MBeanException {

+        return new KernelModelMBean(this.tracingService, this.tracingService.getCurrentApplicationName());

+    }

+}

diff --git a/kernel/org.eclipse.virgo.kernel.dmfragment/src/main/java/org/eclipse/virgo/kernel/dmfragment/internal/KernelExtensionConfiguringOsgiPostProcessor.java b/kernel/org.eclipse.virgo.kernel.dmfragment/src/main/java/org/eclipse/virgo/kernel/dmfragment/internal/KernelExtensionConfiguringOsgiPostProcessor.java
new file mode 100644
index 0000000..61b045a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.dmfragment/src/main/java/org/eclipse/virgo/kernel/dmfragment/internal/KernelExtensionConfiguringOsgiPostProcessor.java
@@ -0,0 +1,49 @@
+/*******************************************************************************

+ * Copyright (c) 2008, 2010 VMware Inc.

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ *

+ * Contributors:

+ *   VMware Inc. - initial contribution

+ *******************************************************************************/

+

+package org.eclipse.virgo.kernel.dmfragment.internal;

+

+import java.util.List;

+import java.util.concurrent.CopyOnWriteArrayList;

+

+import org.eclipse.virgo.kernel.dmfragment.ModuleBeanFactoryPostProcessor;

+import org.osgi.framework.BundleContext;

+import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;

+import org.eclipse.gemini.blueprint.extender.OsgiBeanFactoryPostProcessor;

+

+

+/**

+ * {@link OsgiBeanFactoryPostProcessor} implementation that plugs in Server extensions implementation when needed.<p/>

+ * 

+ * <strong>Concurrent Semantics</strong><br />

+ * 

+ * Threadsafe.

+ * 

+ */

+final class KernelExtensionConfiguringOsgiPostProcessor implements OsgiBeanFactoryPostProcessor {

+

+    private final List<ModuleBeanFactoryPostProcessor> postProcessors = new CopyOnWriteArrayList<ModuleBeanFactoryPostProcessor>();

+

+    KernelExtensionConfiguringOsgiPostProcessor(List<ModuleBeanFactoryPostProcessor> defaultPostProcessors) {

+        this.postProcessors.addAll(defaultPostProcessors);

+

+    }

+

+    /**

+     * {@inheritDoc}

+     */

+    public void postProcessBeanFactory(BundleContext bundleContext, ConfigurableListableBeanFactory beanFactory) {

+        for (ModuleBeanFactoryPostProcessor postProcessor : this.postProcessors) {

+            postProcessor.postProcess(bundleContext, beanFactory);

+        }

+    }

+

+}

diff --git a/kernel/org.eclipse.virgo.kernel.dmfragment/src/main/java/org/eclipse/virgo/kernel/dmfragment/internal/KernelLoadTimeWeaver.java b/kernel/org.eclipse.virgo.kernel.dmfragment/src/main/java/org/eclipse/virgo/kernel/dmfragment/internal/KernelLoadTimeWeaver.java
new file mode 100644
index 0000000..50c48ee
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.dmfragment/src/main/java/org/eclipse/virgo/kernel/dmfragment/internal/KernelLoadTimeWeaver.java
@@ -0,0 +1,97 @@
+/*******************************************************************************

+ * Copyright (c) 2008, 2010 VMware Inc.

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ *

+ * Contributors:

+ *   VMware Inc. - initial contribution

+ *******************************************************************************/

+

+package org.eclipse.virgo.kernel.dmfragment.internal;

+

+import java.lang.instrument.ClassFileTransformer;

+

+import org.osgi.framework.Bundle;

+import org.osgi.framework.BundleContext;

+import org.osgi.framework.ServiceReference;

+import org.springframework.beans.factory.BeanClassLoaderAware;

+import org.springframework.instrument.classloading.LoadTimeWeaver;

+import org.eclipse.gemini.blueprint.util.BundleDelegatingClassLoader;

+

+import org.eclipse.virgo.kernel.osgi.framework.InstrumentableClassLoader;

+import org.eclipse.virgo.kernel.osgi.framework.OsgiFramework;

+

+/**

+ * {@link LoadTimeWeaver} implementation that plugs into the {@link InstrumentableClassLoader

+ * InstrumentableClassLoaders} created for all installed bundles.<p/>

+ * 

+ * <strong>Concurrent Semantics</strong><br />

+ * 

+ * Threadsafe.

+ * 

+ */

+final class KernelLoadTimeWeaver implements LoadTimeWeaver, BeanClassLoaderAware {

+

+    private volatile InstrumentableClassLoader instrumentableClassLoader;

+

+    /**

+     * {@inheritDoc}

+     */

+    public void addTransformer(ClassFileTransformer transformer) {

+        this.instrumentableClassLoader.addClassFileTransformer(transformer);

+    }

+

+    /**

+     * {@inheritDoc}

+     */

+    public ClassLoader getInstrumentableClassLoader() {

+        return (ClassLoader) this.instrumentableClassLoader;

+    }

+

+    /**

+     * {@inheritDoc}

+     */

+    public ClassLoader getThrowawayClassLoader() {

+        return this.instrumentableClassLoader.createThrowAway();

+    }

+

+    /**

+     * {@inheritDoc}

+     */

+    public void setBeanClassLoader(ClassLoader classLoader) {

+        InstrumentableClassLoader instrumentableClassLoader = null;

+        if (classLoader instanceof InstrumentableClassLoader) {

+            instrumentableClassLoader = (InstrumentableClassLoader) classLoader;

+        } else if (classLoader instanceof BundleDelegatingClassLoader) {

+            Bundle bundle = ((BundleDelegatingClassLoader) classLoader).getBundle();

+            ClassLoader bundleClassLoader = getBundleClassLoader(bundle);

+            if (bundleClassLoader instanceof InstrumentableClassLoader) {

+                instrumentableClassLoader = (InstrumentableClassLoader) bundleClassLoader;

+            }

+        }

+        if (instrumentableClassLoader == null) {

+            throw new IllegalStateException("ClassLoader '" + classLoader + "' is not instrumentable.");

+        }

+        this.instrumentableClassLoader = instrumentableClassLoader;

+    }

+

+    /**

+     * Gets the {@link ClassLoader} for the supplied {@link Bundle}.

+     * 

+     * @param bundle the <code>Bundle</code>.

+     * @return the <code>Bundles</code> <code>ClassLoader</code>.

+     */

+    private ClassLoader getBundleClassLoader(Bundle bundle) {

+        BundleContext bundleContext = bundle.getBundleContext();

+        ServiceReference<OsgiFramework> serviceReference = bundleContext.getServiceReference(OsgiFramework.class);

+        try {

+            OsgiFramework framework = bundleContext.getService(serviceReference);

+            return framework.getBundleClassLoader(bundle);

+        } finally {

+            bundleContext.ungetService(serviceReference);

+        }

+    }

+

+}

diff --git a/kernel/org.eclipse.virgo.kernel.dmfragment/src/main/java/org/eclipse/virgo/kernel/dmfragment/internal/KernelMBeanExporter.java b/kernel/org.eclipse.virgo.kernel.dmfragment/src/main/java/org/eclipse/virgo/kernel/dmfragment/internal/KernelMBeanExporter.java
new file mode 100644
index 0000000..77da2f4
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.dmfragment/src/main/java/org/eclipse/virgo/kernel/dmfragment/internal/KernelMBeanExporter.java
@@ -0,0 +1,40 @@
+/*******************************************************************************

+ * Copyright (c) 2008, 2010 VMware Inc.

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ *

+ * Contributors:

+ *   VMware Inc. - initial contribution

+ *******************************************************************************/

+

+package org.eclipse.virgo.kernel.dmfragment.internal;

+

+import javax.management.MBeanException;

+import javax.management.modelmbean.ModelMBean;

+

+import org.eclipse.virgo.nano.shim.serviceability.TracingService;

+import org.springframework.jmx.export.MBeanExporter;

+

+

+/**

+ * An extension of {@link MBeanExporter} that exports Server-specific MBeans.

+ * 

+ * <strong>Concurrent Semantics</strong><br />

+ * As thread-safe as <code>MBeanExporter</code>.

+ * 

+ */

+final class KernelMBeanExporter extends MBeanExporter {

+

+    private final TracingService tracingService;

+

+    KernelMBeanExporter(TracingService tracingService) {

+        this.tracingService = tracingService;

+    }

+

+    @Override

+    protected ModelMBean createModelMBean() throws MBeanException {

+        return new KernelModelMBean(this.tracingService, this.tracingService.getCurrentApplicationName());

+    }

+}

diff --git a/kernel/org.eclipse.virgo.kernel.dmfragment/src/main/java/org/eclipse/virgo/kernel/dmfragment/internal/KernelModelMBean.java b/kernel/org.eclipse.virgo.kernel.dmfragment/src/main/java/org/eclipse/virgo/kernel/dmfragment/internal/KernelModelMBean.java
new file mode 100644
index 0000000..d4164fd
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.dmfragment/src/main/java/org/eclipse/virgo/kernel/dmfragment/internal/KernelModelMBean.java
@@ -0,0 +1,50 @@
+/*******************************************************************************

+ * Copyright (c) 2008, 2010 VMware Inc.

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ *

+ * Contributors:

+ *   VMware Inc. - initial contribution

+ *******************************************************************************/

+

+package org.eclipse.virgo.kernel.dmfragment.internal;

+

+import javax.management.MBeanException;

+import javax.management.ReflectionException;

+import javax.management.RuntimeOperationsException;

+

+import org.eclipse.virgo.nano.shim.serviceability.TracingService;

+import org.springframework.jmx.export.SpringModelMBean;

+

+

+/**

+ * An extension of {@link SpringModelMBean} that acts as a Server-specific MBeans.

+ * 

+ * <strong>Concurrent Semantics</strong><br />

+ * As thread-safe as <code>SpringModelMBean</code>.

+ */

+final class KernelModelMBean extends SpringModelMBean {

+

+    private final TracingService tracingService;

+

+    private final String applicationName;

+

+    public KernelModelMBean(TracingService tracingService, String applicationName) throws RuntimeOperationsException, MBeanException {

+        this.tracingService = tracingService;

+        this.applicationName = applicationName;

+    }

+

+    @Override

+    public Object invoke(String opName, Object[] opArgs, String[] sig) throws MBeanException, ReflectionException {

+        String originalApplicationName = this.tracingService.getCurrentApplicationName();

+

+        try {

+            this.tracingService.setCurrentApplicationName(this.applicationName);

+            return super.invoke(opName, opArgs, sig);

+        } finally {

+            this.tracingService.setCurrentApplicationName(originalApplicationName);

+        }

+    }

+}

diff --git a/kernel/org.eclipse.virgo.kernel.dmfragment/src/main/java/org/eclipse/virgo/kernel/dmfragment/internal/KernelOsgiApplicationContextCreator.java b/kernel/org.eclipse.virgo.kernel.dmfragment/src/main/java/org/eclipse/virgo/kernel/dmfragment/internal/KernelOsgiApplicationContextCreator.java
new file mode 100644
index 0000000..1caa8ff
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.dmfragment/src/main/java/org/eclipse/virgo/kernel/dmfragment/internal/KernelOsgiApplicationContextCreator.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.dmfragment.internal;
+
+import org.osgi.framework.BundleContext;
+import org.eclipse.gemini.blueprint.context.DelegatedExecutionOsgiBundleApplicationContext;
+import org.eclipse.gemini.blueprint.context.support.OsgiBundleXmlApplicationContext;
+import org.eclipse.gemini.blueprint.extender.support.DefaultOsgiApplicationContextCreator;
+
+/**
+ * {@link KernelOsgiApplicationContextCreator} creates user region application contexts.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread safe.
+ */
+final class KernelOsgiApplicationContextCreator extends DefaultOsgiApplicationContextCreator {
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public DelegatedExecutionOsgiBundleApplicationContext createApplicationContext(BundleContext bundleContext) throws Exception {
+        DelegatedExecutionOsgiBundleApplicationContext applicationContext = super.createApplicationContext(bundleContext);
+        if (applicationContext instanceof OsgiBundleXmlApplicationContext) {
+            OsgiBundleXmlApplicationContext osgiBundleXmlApplicationContext = (OsgiBundleXmlApplicationContext) applicationContext;
+            osgiBundleXmlApplicationContext.setContextClassLoaderProvider(new KernelOsgiContextClassLoaderProvider(osgiBundleXmlApplicationContext.getBundle()));
+        }
+        return applicationContext;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.dmfragment/src/main/java/org/eclipse/virgo/kernel/dmfragment/internal/KernelOsgiContextClassLoaderProvider.java b/kernel/org.eclipse.virgo.kernel.dmfragment/src/main/java/org/eclipse/virgo/kernel/dmfragment/internal/KernelOsgiContextClassLoaderProvider.java
new file mode 100644
index 0000000..693375c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.dmfragment/src/main/java/org/eclipse/virgo/kernel/dmfragment/internal/KernelOsgiContextClassLoaderProvider.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.dmfragment.internal;
+
+import org.osgi.framework.Bundle;
+import org.eclipse.gemini.blueprint.context.support.ContextClassLoaderProvider;
+import org.eclipse.gemini.blueprint.util.BundleDelegatingClassLoader;
+
+/**
+ * {@link KernelOsgiContextClassLoaderProvider} preserves any existing thread context class loader and uses the bundle
+ * to load classes otherwise.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread safe.
+ */
+final class KernelOsgiContextClassLoaderProvider implements ContextClassLoaderProvider {
+
+    private final BundleDelegatingClassLoader bundleClassLoader;
+
+    KernelOsgiContextClassLoaderProvider(Bundle bundle) {
+        this.bundleClassLoader = BundleDelegatingClassLoader.createBundleClassLoaderFor(bundle);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public ClassLoader getContextClassLoader() {
+        ClassLoader tccl = Thread.currentThread().getContextClassLoader();
+        return tccl == null ? this.bundleClassLoader : tccl;
+    }
+
+}
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.dmfragment/src/main/java/org/eclipse/virgo/kernel/dmfragment/internal/LoadTimeWeaverPostProcessor.java b/kernel/org.eclipse.virgo.kernel.dmfragment/src/main/java/org/eclipse/virgo/kernel/dmfragment/internal/LoadTimeWeaverPostProcessor.java
new file mode 100644
index 0000000..33fe91e
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.dmfragment/src/main/java/org/eclipse/virgo/kernel/dmfragment/internal/LoadTimeWeaverPostProcessor.java
@@ -0,0 +1,38 @@
+/*******************************************************************************

+ * Copyright (c) 2008, 2010 VMware Inc.

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ *

+ * Contributors:

+ *   VMware Inc. - initial contribution

+ *******************************************************************************/

+

+package org.eclipse.virgo.kernel.dmfragment.internal;

+

+import static org.springframework.context.ConfigurableApplicationContext.LOAD_TIME_WEAVER_BEAN_NAME;

+

+import org.eclipse.virgo.kernel.dmfragment.ModuleBeanFactoryPostProcessor;

+import org.osgi.framework.BundleContext;

+import org.slf4j.Logger;

+import org.slf4j.LoggerFactory;

+import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;

+import org.springframework.beans.factory.support.AbstractBeanDefinition;

+

+

+final class LoadTimeWeaverPostProcessor implements ModuleBeanFactoryPostProcessor {

+

+    private final Logger logger = LoggerFactory.getLogger(this.getClass());

+

+    public void postProcess(BundleContext bundleContext, ConfigurableListableBeanFactory beanFactory) {

+        if (beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {

+            AbstractBeanDefinition ltwBean = (AbstractBeanDefinition) beanFactory.getBeanDefinition(LOAD_TIME_WEAVER_BEAN_NAME);

+            ltwBean.setBeanClass(KernelLoadTimeWeaver.class);

+            logger.info("Found load-time weaver bean for bundle '{}'. Switching to ServerLoadTimeWeaver.", bundleContext.getBundle());

+        } else {

+            logger.info("Load-time weaving not enabled for bundle '{}',", bundleContext.getBundle());

+        }

+    }

+

+}

diff --git a/kernel/org.eclipse.virgo.kernel.dmfragment/src/main/java/org/eclipse/virgo/kernel/dmfragment/internal/MBeanExporterPostProcessor.java b/kernel/org.eclipse.virgo.kernel.dmfragment/src/main/java/org/eclipse/virgo/kernel/dmfragment/internal/MBeanExporterPostProcessor.java
new file mode 100644
index 0000000..94535fd
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.dmfragment/src/main/java/org/eclipse/virgo/kernel/dmfragment/internal/MBeanExporterPostProcessor.java
@@ -0,0 +1,61 @@
+/*******************************************************************************

+ * Copyright (c) 2008, 2010 VMware Inc.

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ *

+ * Contributors:

+ *   VMware Inc. - initial contribution

+ *******************************************************************************/

+

+package org.eclipse.virgo.kernel.dmfragment.internal;

+

+import org.eclipse.virgo.kernel.dmfragment.ModuleBeanFactoryPostProcessor;

+import org.eclipse.virgo.nano.shim.serviceability.TracingService;

+import org.osgi.framework.BundleContext;

+import org.slf4j.Logger;

+import org.slf4j.LoggerFactory;

+import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;

+import org.springframework.beans.factory.support.AbstractBeanDefinition;

+import org.springframework.jmx.export.MBeanExporter;

+import org.springframework.jmx.export.annotation.AnnotationMBeanExporter;

+

+

+final class MBeanExporterPostProcessor implements ModuleBeanFactoryPostProcessor {

+

+    private final Logger logger = LoggerFactory.getLogger(this.getClass());

+

+    private final TracingService tracingService;

+

+    public MBeanExporterPostProcessor(TracingService tracingService) {

+        this.tracingService = tracingService;

+    }

+

+    /**

+     * {@inheritDoc}

+     */

+    public void postProcess(BundleContext bundleContext, ConfigurableListableBeanFactory beanFactory) {

+        boolean foundExporter = false;

+        String[] beanDefinitionNames = beanFactory.getBeanDefinitionNames();

+        for (String beanDefinitionName : beanDefinitionNames) {

+            AbstractBeanDefinition definition = (AbstractBeanDefinition) beanFactory.getBeanDefinition(beanDefinitionName);

+            if (MBeanExporter.class.getName().equals(definition.getBeanClassName())) {

+                definition.setBeanClass(KernelMBeanExporter.class);

+                definition.getConstructorArgumentValues().addGenericArgumentValue(this.tracingService);

+                foundExporter = true;

+            } else if (AnnotationMBeanExporter.class.getName().equals(definition.getBeanClassName())) {

+                definition.setBeanClass(KernelAnnotationMBeanExporter.class);

+                definition.getConstructorArgumentValues().addGenericArgumentValue(this.tracingService);

+                foundExporter = true;

+            }

+        }

+        if (foundExporter) {

+            logger.info("Found MBean exporter bean for bundle '{}'. Switching to ServerMBeanExporter or ServerAnnotationMBeanExporter.",

+                bundleContext.getBundle());

+        } else {

+            logger.info("MBean exporting not enabled for bundle '{}',", bundleContext.getBundle());

+        }

+    }

+

+}

diff --git a/kernel/org.eclipse.virgo.kernel.dmfragment/src/main/java/org/eclipse/virgo/kernel/dmfragment/internal/ServiceProxyRetryDisablingBundleListener.java b/kernel/org.eclipse.virgo.kernel.dmfragment/src/main/java/org/eclipse/virgo/kernel/dmfragment/internal/ServiceProxyRetryDisablingBundleListener.java
new file mode 100644
index 0000000..da37881
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.dmfragment/src/main/java/org/eclipse/virgo/kernel/dmfragment/internal/ServiceProxyRetryDisablingBundleListener.java
@@ -0,0 +1,66 @@
+/*******************************************************************************

+ * Copyright (c) 2008, 2010 VMware Inc.

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ *

+ * Contributors:

+ *   VMware Inc. - initial contribution

+ *******************************************************************************/

+

+package org.eclipse.virgo.kernel.dmfragment.internal;

+

+import org.osgi.framework.BundleContext;

+import org.osgi.framework.BundleEvent;

+import org.osgi.framework.InvalidSyntaxException;

+import org.osgi.framework.ServiceReference;

+import org.osgi.framework.SynchronousBundleListener;

+import org.slf4j.Logger;

+import org.slf4j.LoggerFactory;

+import org.springframework.context.ApplicationContext;

+import org.eclipse.gemini.blueprint.service.importer.support.OsgiServiceProxyFactoryBean;

+

+/**

+ * A {@link SynchronousBundleListener} that reacts to a {@link BundleEvent#STOPPING STOPPING} event for the system

+ * bundle. Upon such an event being received the listener retrieves all {@link ApplicationContext ApplicationContexts}

+ * from the service registry and disables retry on any {@link OsgiServiceProxyFactoryBean OsgiServiceProxyFactoryBeans}

+ * which they contain.

+ * <p />

+ * 

+ * <strong>Concurrent Semantics</strong><br />

+ * 

+ * Thread-safe.

+ * 

+ * 

+ * @see ApplicationContextShutdownBean#disableServiceProxyRetry(ApplicationContext)

+ */

+class ServiceProxyRetryDisablingBundleListener implements SynchronousBundleListener {

+

+    private final Logger logger = LoggerFactory.getLogger(this.getClass());

+

+    ServiceProxyRetryDisablingBundleListener(BundleContext bundleContext) {

+        bundleContext.addBundleListener(this);

+    }

+

+    public void bundleChanged(BundleEvent event) {

+        if (event.getBundle().getBundleId() == 0 && event.getType() == BundleEvent.STOPPING) {

+            BundleContext bundleContext = event.getBundle().getBundleContext();

+            try {

+                ServiceReference<?>[] applicationContextServiceReferences = event.getBundle().getBundleContext().getAllServiceReferences(

+                    ApplicationContext.class.getName(), null);

+

+                for (ServiceReference<?> applicationContextServiceReference : applicationContextServiceReferences) {

+                    Object service = bundleContext.getService(applicationContextServiceReference);

+                    if (service instanceof ApplicationContext) {

+                        ApplicationContext applicationContext = (ApplicationContext) service;

+                        ApplicationContextShutdownBean.disableServiceProxyRetry(applicationContext);

+                        bundleContext.ungetService(applicationContextServiceReference);

+                    }

+                }

+            } catch (InvalidSyntaxException ise) {

+                logger.error("Failed to retrieve all application contexts from service registry", ise);

+            }

+        }

+    }

+}

diff --git a/kernel/org.eclipse.virgo.kernel.dmfragment/src/main/resources/META-INF/spring/extender/kernel-dmfragment-context.xml b/kernel/org.eclipse.virgo.kernel.dmfragment/src/main/resources/META-INF/spring/extender/kernel-dmfragment-context.xml
new file mode 100644
index 0000000..1d4f3e0
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.dmfragment/src/main/resources/META-INF/spring/extender/kernel-dmfragment-context.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

+	xmlns="http://www.springframework.org/schema/beans"

+	xmlns:osgi="http://www.springframework.org/schema/osgi"

+	xsi:schemaLocation="http://www.springframework.org/schema/osgi  

+       http://www.springframework.org/schema/osgi/spring-osgi.xsd

+       http://www.springframework.org/schema/beans   

+       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

+		

+	<osgi:reference id="tracingService" interface="org.eclipse.virgo.nano.shim.serviceability.TracingService"/>

+

+	<bean id="serverExtensionConfigurer" class="org.eclipse.virgo.kernel.dmfragment.internal.KernelExtensionConfiguringOsgiPostProcessor">

+		<constructor-arg>

+			<list>

+				<bean class="org.eclipse.virgo.kernel.dmfragment.internal.ContextClassLoaderPostProcessor"/>

+				<bean class="org.eclipse.virgo.kernel.dmfragment.internal.LoadTimeWeaverPostProcessor"/>	

+				<bean class="org.eclipse.virgo.kernel.dmfragment.internal.MBeanExporterPostProcessor">

+					<constructor-arg ref="tracingService"/>

+				</bean>

+				<bean class="org.eclipse.virgo.kernel.dmfragment.internal.ApplicationContextShutdownBeanPostProcessor"/>	

+			</list>

+		</constructor-arg>

+	</bean>

+	

+	<osgi:service ref="serverExtensionConfigurer" interface="org.eclipse.gemini.blueprint.extender.OsgiBeanFactoryPostProcessor" />

+

+	<bean id="taskExecutor" class="org.eclipse.virgo.kernel.agent.dm.ContextPropagatingTaskExecutor">

+		<constructor-arg value="region-dm-" />

+		<constructor-arg value="15" />		

+		<constructor-arg ref="bundleContext"/>

+	</bean>

+	

+	<alias alias="shutdownTaskExecutor" name="taskExecutor"/>

+	

+	<bean id="serviceProxyRetryDisabler" class="org.eclipse.virgo.kernel.dmfragment.internal.ServiceProxyRetryDisablingBundleListener">

+ 	    <constructor-arg ref="bundleContext"/>

+ 	</bean>

+ 	

+ 	<bean id="applicationContextCreator" class="org.eclipse.virgo.kernel.dmfragment.internal.KernelOsgiApplicationContextCreator" />

+	

+</beans>

diff --git a/kernel/org.eclipse.virgo.kernel.dmfragment/template.mf b/kernel/org.eclipse.virgo.kernel.dmfragment/template.mf
new file mode 100644
index 0000000..2566f08
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.dmfragment/template.mf
@@ -0,0 +1,21 @@
+Manifest-Version: 1.0

+Bundle-ManifestVersion: 2

+Bundle-Name: Virgo Kernel User Region OSGi Spring DM Fragment

+Fragment-Host: org.eclipse.gemini.blueprint.extender

+Bundle-SymbolicName: org.eclipse.virgo.kernel.dmfragment

+Bundle-Version: ${version}

+Import-Package:

+ org.eclipse.virgo.kernel.agent.dm;version="${version:[=.=.=, =.+1)}",

+ org.eclipse.virgo.nano.shim.serviceability;version="${version:[=.=.=, =.+1)}"

+Import-Template:

+ org.eclipse.virgo.kernel.*;version="${version:[=.=.=, =.+1)}",

+ org.eclipse.virgo.medic.*;version="${version:[=.=.=, =.+1)}",

+ org.slf4j.*;version="${slf4jVersion:[=.=.=, +1)}",

+ org.aspectj.*;version="${aspectjVersion:[=.=.=, +1)}",

+ javax.management.*;version="0",

+ org.osgi.framework.*;version="0",

+ org.springframework.*;version="${springframeworkVersion:[2.5.6, +1)}"

+Excluded-Imports:

+ org.eclipse.gemini.blueprint.*

+Excluded-Exports:

+ org.eclipse.virgo.kernel.dmfragment.internal.*

diff --git a/kernel/org.eclipse.virgo.kernel.equinox.extensions/.settings/org.eclipse.virgo.ide.bundlor.core.prefs b/kernel/org.eclipse.virgo.kernel.equinox.extensions/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
new file mode 100644
index 0000000..809c0b6
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.equinox.extensions/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
@@ -0,0 +1,5 @@
+#Wed Nov 04 14:40:56 GMT 2009
+org.eclipse.virgo.ide.bundlor.core.bundlor.generated.manifest.autoformatting=true
+org.eclipse.virgo.ide.bundlor.core.byte.code.scanning=true
+org.eclipse.virgo.ide.bundlor.core.template.properties.files=
+eclipse.preferences.version=1
diff --git a/kernel/org.eclipse.virgo.kernel.equinox.extensions/.settings/org.eclipse.wst.common.project.facet.core.xml b/kernel/org.eclipse.virgo.kernel.equinox.extensions/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..92aa290
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.equinox.extensions/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+  <installed facet="org.eclipse.virgo.server.bundle" version="1.0"/>
+</faceted-project>
diff --git a/kernel/org.eclipse.virgo.kernel.equinox.extensions/.settings/org.springframework.ide.eclipse.core.prefs b/kernel/org.eclipse.virgo.kernel.equinox.extensions/.settings/org.springframework.ide.eclipse.core.prefs
new file mode 100644
index 0000000..87bcfa1
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.equinox.extensions/.settings/org.springframework.ide.eclipse.core.prefs
@@ -0,0 +1,68 @@
+#Mon Dec 06 11:34:13 GMT 2010
+eclipse.preferences.version=1
+org.springframework.ide.eclipse.core.builders.enable.aopreferencemodelbuilder=true
+org.springframework.ide.eclipse.core.builders.enable.beanmetadatabuilder=true
+org.springframework.ide.eclipse.core.builders.enable.osgibundleupdater=false
+org.springframework.ide.eclipse.core.enable.project.preferences=false
+org.springframework.ide.eclipse.core.validator.enable.com.springsource.server.ide.manifest.core.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.enable.com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.enable.com.springsource.sts.server.quickfix.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.enable.org.springframework.ide.eclipse.beans.core.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.enable.org.springframework.ide.eclipse.core.springvalidator=false
+org.springframework.ide.eclipse.core.validator.enable.org.springframework.ide.eclipse.webflow.core.validator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.applicationSymbolicNameRule-com.springsource.server.ide.manifest.core.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.applicationVersionRule-com.springsource.server.ide.manifest.core.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleActivationPolicyRule-com.springsource.server.ide.manifest.core.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleActivatorRule-com.springsource.server.ide.manifest.core.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleManifestVersionRule-com.springsource.server.ide.manifest.core.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleSymbolicNameRule-com.springsource.server.ide.manifest.core.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleVersionRule-com.springsource.server.ide.manifest.core.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.exportPackageRule-com.springsource.server.ide.manifest.core.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.importRule-com.springsource.server.ide.manifest.core.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.parsingProblemsRule-com.springsource.server.ide.manifest.core.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.requireBundleRule-com.springsource.server.ide.manifest.core.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.AvoidDriverManagerDataSource-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.ImportElementsAtTopRulee-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.ParentBeanSpecifiesAbstractClassRule-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.RefElementRule-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.TooManyBeansInFileRule-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.UnnecessaryValueElementRule-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.UseBeanInheritance-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.legacyxmlusage.jndiobjectfactory-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.importBundleVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.importLibraryVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.importPackageVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.requireBundleVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.autowire.autowire-org.springframework.ide.eclipse.beans.core.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanAlias-org.springframework.ide.eclipse.beans.core.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanClass-org.springframework.ide.eclipse.beans.core.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanConstructorArgument-org.springframework.ide.eclipse.beans.core.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanDefinition-org.springframework.ide.eclipse.beans.core.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanDefinitionHolder-org.springframework.ide.eclipse.beans.core.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanFactory-org.springframework.ide.eclipse.beans.core.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanInitDestroyMethod-org.springframework.ide.eclipse.beans.core.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanProperty-org.springframework.ide.eclipse.beans.core.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanReference-org.springframework.ide.eclipse.beans.core.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.methodOverride-org.springframework.ide.eclipse.beans.core.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.parsingProblems-org.springframework.ide.eclipse.beans.core.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.requiredProperty-org.springframework.ide.eclipse.beans.core.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.toolAnnotation-org.springframework.ide.eclipse.beans.core.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.core.springClasspath-org.springframework.ide.eclipse.core.springvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.action-org.springframework.ide.eclipse.webflow.core.validator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.actionstate-org.springframework.ide.eclipse.webflow.core.validator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.attribute-org.springframework.ide.eclipse.webflow.core.validator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.attributemapper-org.springframework.ide.eclipse.webflow.core.validator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.beanaction-org.springframework.ide.eclipse.webflow.core.validator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.evaluationaction-org.springframework.ide.eclipse.webflow.core.validator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.evaluationresult-org.springframework.ide.eclipse.webflow.core.validator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.exceptionhandler-org.springframework.ide.eclipse.webflow.core.validator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.import-org.springframework.ide.eclipse.webflow.core.validator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.inputattribute-org.springframework.ide.eclipse.webflow.core.validator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.mapping-org.springframework.ide.eclipse.webflow.core.validator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.outputattribute-org.springframework.ide.eclipse.webflow.core.validator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.set-org.springframework.ide.eclipse.webflow.core.validator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.state-org.springframework.ide.eclipse.webflow.core.validator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.subflowstate-org.springframework.ide.eclipse.webflow.core.validator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.transition-org.springframework.ide.eclipse.webflow.core.validator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.variable-org.springframework.ide.eclipse.webflow.core.validator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.webflowstate-org.springframework.ide.eclipse.webflow.core.validator=false
diff --git a/kernel/org.eclipse.virgo.kernel.equinox.extensions/.springBeans b/kernel/org.eclipse.virgo.kernel.equinox.extensions/.springBeans
new file mode 100644
index 0000000..8058887
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.equinox.extensions/.springBeans
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beansProjectDescription>
+	<version>1</version>
+	<pluginVersion><![CDATA[2.2.6.200908051215-RELEASE]]></pluginVersion>
+	<configSuffixes>
+		<configSuffix><![CDATA[xml]]></configSuffix>
+	</configSuffixes>
+	<enableImports><![CDATA[false]]></enableImports>
+	<configs>
+	</configs>
+	<configSets>
+	</configSets>
+</beansProjectDescription>
diff --git a/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/main/java/org/eclipse/virgo/kernel/equinox/extensions/EquinoxLauncherConfiguration.java b/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/main/java/org/eclipse/virgo/kernel/equinox/extensions/EquinoxLauncherConfiguration.java
new file mode 100644
index 0000000..656678d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/main/java/org/eclipse/virgo/kernel/equinox/extensions/EquinoxLauncherConfiguration.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.equinox.extensions;
+
+import java.net.URI;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ */
+public final class EquinoxLauncherConfiguration {
+
+    private final Map<String, String> frameworkProperties = new HashMap<String, String>();
+    
+    private URI profilePath;
+
+    private URI installPath;
+
+    private URI configPath;
+
+    private boolean clean = false;
+
+    public URI getProfilePath() {
+        return profilePath;
+    }
+
+    public void setProfilePath(URI profilePath) {
+        this.profilePath = profilePath;
+    }
+
+    public URI getInstallPath() {
+        return installPath;
+    }
+
+    public void setInstallPath(URI installPath) {
+        this.installPath = installPath;
+    }
+
+    public URI getConfigPath() {
+        return configPath;
+    }
+
+    public void setConfigPath(URI configPath) {
+        this.configPath = configPath;
+    }
+
+    public boolean isClean() {
+        return clean;
+    }
+
+    public void setClean(boolean clean) {
+        this.clean = clean;
+    }
+
+    public void setFrameworkProperty(String key, String value) {
+        this.frameworkProperties.put(key, value);
+    }
+    
+    public Map<String, String> getFrameworkProperties() {
+        return this.frameworkProperties;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/main/java/org/eclipse/virgo/kernel/equinox/extensions/ExtendedEquinoxLauncher.java b/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/main/java/org/eclipse/virgo/kernel/equinox/extensions/ExtendedEquinoxLauncher.java
new file mode 100644
index 0000000..1376c50
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/main/java/org/eclipse/virgo/kernel/equinox/extensions/ExtendedEquinoxLauncher.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.equinox.extensions;
+
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.core.runtime.adaptor.LocationManager;
+import org.eclipse.osgi.baseadaptor.HookRegistry;
+import org.eclipse.osgi.framework.internal.core.Constants;
+import org.eclipse.osgi.framework.internal.core.FrameworkProperties;
+import org.eclipse.osgi.launch.Equinox;
+import org.eclipse.virgo.kernel.equinox.extensions.hooks.ExtensionsHookConfigurator;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.launch.Framework;
+
+
+/**
+ */
+public final class ExtendedEquinoxLauncher {
+
+    private static final String PROP_CONTEXT_BOOTDELEGATION = "osgi.context.bootdelegation";
+    private static final String PROP_COMPATIBILITY_BOOTDELEGATION = "osgi.compatibility.bootdelegation";
+
+    /**
+     * Equinox-specific property to control clean startup.
+     */
+    private static final String PROP_OSGI_CLEAN = "osgi.clean";
+
+    /**
+     * Equinox-specific property for setting the parent <code>ClassLoader</code>.
+     */
+    private static final String PROP_OSGI_PARENT_CLASSLOADER = "osgi.parentClassloader";
+
+    public static Equinox launch(EquinoxLauncherConfiguration config) throws BundleException {
+        try {
+            Field f = FrameworkProperties.class.getDeclaredField("properties");
+            f.setAccessible(true);
+            f.set(null, null);
+        } catch (Exception e) {
+            System.out.println("Unable to reset Equinox FrameworkProperties");
+            e.printStackTrace(System.out);
+        }
+        
+        Map<String, String> configuration = populateConfiguration(config);        
+        Equinox equinox = new Equinox(configuration);      
+        equinox.start();
+        equinox.getBundleContext().registerService(Framework.class.getName(), equinox, null);
+
+        return equinox;
+    }
+
+    private static Map<String, String> populateConfiguration(EquinoxLauncherConfiguration config) {
+        Map<String, String> configuration = new HashMap<String, String>();
+        configuration.putAll(config.getFrameworkProperties());
+
+        mergeListProperty(configuration, HookRegistry.PROP_HOOK_CONFIGURATORS_INCLUDE, ExtensionsHookConfigurator.class.getName());
+
+        configuration.put(PROP_OSGI_PARENT_CLASSLOADER, "fwk");
+        configuration.put(PROP_CONTEXT_BOOTDELEGATION, "false");
+        configuration.put(PROP_COMPATIBILITY_BOOTDELEGATION, "false");
+        if (config.getProfilePath() != null) {
+            configuration.put(Constants.OSGI_JAVA_PROFILE, config.getProfilePath().toString());
+        }
+        configuration.put(Constants.OSGI_JAVA_PROFILE_BOOTDELEGATION, Constants.OSGI_BOOTDELEGATION_OVERRIDE);
+        configuration.put(LocationManager.PROP_CONFIG_AREA, config.getConfigPath().toString());
+        configuration.put(LocationManager.PROP_INSTALL_AREA, config.getInstallPath().toString());
+        configuration.put(PROP_OSGI_CLEAN, Boolean.toString(config.isClean()));
+        return configuration;
+    }
+    
+    private static void mergeListProperty(Map<String, String> properties, String key, String value) {
+        String existingValue = properties.get(key);
+        if (existingValue != null) {
+            properties.put(key, existingValue + "," + value);
+        } else {
+            properties.put(key, value);
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/main/java/org/eclipse/virgo/kernel/equinox/extensions/hooks/BundleFileClosingBundleFileWrapperFactoryHook.java b/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/main/java/org/eclipse/virgo/kernel/equinox/extensions/hooks/BundleFileClosingBundleFileWrapperFactoryHook.java
new file mode 100644
index 0000000..0b0626d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/main/java/org/eclipse/virgo/kernel/equinox/extensions/hooks/BundleFileClosingBundleFileWrapperFactoryHook.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.equinox.extensions.hooks;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.osgi.baseadaptor.BaseData;
+import org.eclipse.osgi.baseadaptor.bundlefile.BundleFile;
+import org.eclipse.osgi.baseadaptor.hooks.BundleFileWrapperFactoryHook;
+
+
+/**
+ * A {@link BundleFileWrapperFactoryHook} that keeps track of {@link BundleFile BundleFiles} and,
+ * when instructed to clean up, ensures that they are closed.
+ * 
+ * <p />
+ * 
+ * This is a workaround for Equinox bug 290389. Unfortunately when working with nested frameworks
+ * the suggested workaround of calling PackageAdmin.refreshPackages does not work for the
+ * child framework's composite bundle.
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Thread-safe.
+ *
+ */
+public final class BundleFileClosingBundleFileWrapperFactoryHook implements BundleFileWrapperFactoryHook {
+    
+    private final Object monitor = new Object();
+    
+    private final List<BundleFile> bundleFiles = new ArrayList<BundleFile>();
+    
+    private static final BundleFileClosingBundleFileWrapperFactoryHook INSTANCE = new BundleFileClosingBundleFileWrapperFactoryHook();
+    
+    private BundleFileClosingBundleFileWrapperFactoryHook() {
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public BundleFile wrapBundleFile(BundleFile bundleFile, Object content, BaseData data, boolean base) throws IOException {
+        synchronized (this.monitor) {
+            this.bundleFiles.add(bundleFile);
+        }
+        return null;
+    }
+    
+    public void cleanup() {
+        List<BundleFile> localBundleFiles;
+        synchronized (this.monitor) {
+            localBundleFiles = new ArrayList<BundleFile>(this.bundleFiles);
+            this.bundleFiles.clear();
+        }
+        for (BundleFile bundleFile : localBundleFiles) {
+            try {
+                bundleFile.close();
+            } catch (IOException ignored) {
+            }
+        }
+    }
+    
+    public static BundleFileClosingBundleFileWrapperFactoryHook getInstance() {
+        return INSTANCE;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/main/java/org/eclipse/virgo/kernel/equinox/extensions/hooks/BundleFileWrapper.java b/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/main/java/org/eclipse/virgo/kernel/equinox/extensions/hooks/BundleFileWrapper.java
new file mode 100644
index 0000000..c8c53f5
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/main/java/org/eclipse/virgo/kernel/equinox/extensions/hooks/BundleFileWrapper.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.equinox.extensions.hooks;
+
+import org.eclipse.osgi.baseadaptor.bundlefile.BundleFile;
+
+/**
+ * A <code>BundleFileWrapper</code> implementation can be plugged into the {@link PluggableBundleFileWrapperFactoryHook}
+ * at runtime. It will be called to wrap each {@BundleFile BundleFile} that is subsequently accessed by
+ * Equinox.<p />
+ * 
+ * <strong>Concurrent Semantics</strong><br /> Implementations <strong>must</strong> be thread-safe.
+ * 
+ */
+public interface BundleFileWrapper {
+
+    /**
+     * Provides an opportunity to wrap the supplied {@link BundleFile}. If the wrapper does not wish to wrap the
+     * supplied <code>BundleFile</code> then <code>null</code> must be returned.
+     * 
+     * @param bundleFile The <code>BundleFile</code> to be wrapped
+     * @return The wrapped <code>BundleFile</code>, or <code>null</code> if the no wrapping is required.
+     */
+    BundleFile wrapBundleFile(BundleFile bundleFile);
+}
diff --git a/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/main/java/org/eclipse/virgo/kernel/equinox/extensions/hooks/ClassLoaderCreator.java b/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/main/java/org/eclipse/virgo/kernel/equinox/extensions/hooks/ClassLoaderCreator.java
new file mode 100644
index 0000000..21913ab
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/main/java/org/eclipse/virgo/kernel/equinox/extensions/hooks/ClassLoaderCreator.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.equinox.extensions.hooks;
+
+import org.eclipse.osgi.baseadaptor.BaseData;
+import org.eclipse.osgi.baseadaptor.loader.BaseClassLoader;
+import org.eclipse.osgi.framework.adaptor.BundleProtectionDomain;
+import org.eclipse.osgi.framework.adaptor.ClassLoaderDelegate;
+
+
+/**
+ * A <code>ClassLoaderCreator</code> is used to create an Equinox {@link BaseClassLoader} for a {@link org.osgi.framework.Bundle Bundle}.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Implementations must be thread-safe.
+ *
+ */
+public interface ClassLoaderCreator {
+
+    public BaseClassLoader createClassLoader(ClassLoader parent, ClassLoaderDelegate delegate, BundleProtectionDomain domain, BaseData data, String[] bundleclasspath);
+}
diff --git a/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/main/java/org/eclipse/virgo/kernel/equinox/extensions/hooks/ExtendedBundleFileWrapperFactoryHook.java b/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/main/java/org/eclipse/virgo/kernel/equinox/extensions/hooks/ExtendedBundleFileWrapperFactoryHook.java
new file mode 100644
index 0000000..ca5c798
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/main/java/org/eclipse/virgo/kernel/equinox/extensions/hooks/ExtendedBundleFileWrapperFactoryHook.java
@@ -0,0 +1,201 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.equinox.extensions.hooks;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.JarURLConnection;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.Enumeration;
+import java.util.jar.JarFile;
+
+import org.eclipse.osgi.baseadaptor.BaseData;
+import org.eclipse.osgi.baseadaptor.bundlefile.BundleEntry;
+import org.eclipse.osgi.baseadaptor.bundlefile.BundleFile;
+import org.eclipse.osgi.baseadaptor.hooks.BundleFileWrapperFactoryHook;
+
+/**
+ * A {@link BundleFileWrapperFactoryHook} implementation that wraps {@link BundleFile BundleFiles} to ensure that all
+ * returned resource {@link URL URLs} have a <code>file:</code> protocol, not a <code>bundleresource:</code>
+ * protocol as is the Equinox default.
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * This class is <strong>thread-safe</strong>.
+ * 
+ */
+final class ExtendedBundleFileWrapperFactoryHook implements BundleFileWrapperFactoryHook {
+
+    /**
+     * {@inheritDoc}
+     */
+    public BundleFile wrapBundleFile(BundleFile bundleFile, Object content, BaseData data, boolean base) throws IOException {
+        return new FileResourceEnforcingBundleFile(bundleFile);
+    }
+
+    /**
+     * A concrete extension of {@link BundleFile} that ensures that all resource {@link URL URLs} returned have a
+     * <code>file:</code> protocol, not a <code>bundleresource:</code> protocol as is the Equinox default.
+     * <p>
+     * <strong>Concurrent Semantics</strong><br />
+     * As thread-safe as the encapsulated <code>BundleFile</code> instance.
+     * 
+     */
+    private static class FileResourceEnforcingBundleFile extends BundleFile {
+
+        private final BundleFile bundleFile;
+
+        private FileResourceEnforcingBundleFile(BundleFile bundleFile) {
+            this.bundleFile = bundleFile;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public void close() throws IOException {
+            this.bundleFile.close();
+
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public boolean containsDir(String dir) {
+            return this.bundleFile.containsDir(dir);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public BundleEntry getEntry(String path) {
+            BundleEntry entry = this.bundleFile.getEntry(path);
+            return entry;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public Enumeration<String> getEntryPaths(String path) {
+            Enumeration<String> paths = this.bundleFile.getEntryPaths(path);
+            return paths;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public File getFile(String path, boolean nativeCode) {
+            return this.bundleFile.getFile(path, nativeCode);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public void open() throws IOException {
+            this.bundleFile.open();
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public File getBaseFile() {
+            return this.bundleFile.getBaseFile();
+        }
+
+        /**
+         * Locates the resource in the BundleFile identified by the supplied path and, if found, returns a
+         * <code>file</code> protocol URL for the resource.
+         * 
+         * @return a <code>file</code> protocol URL for the resource
+         */
+        @Override
+        public URL getResourceURL(String path, long hostBundleID, int index) {
+            return doGetResourceURL(path);
+        }
+
+        /**
+         * Locates the resource in the BundleFile identified by the supplied path and, if found, returns a
+         * <code>file</code> protocol URL for the resource.
+         * 
+         * @return a <code>file</code> protocol URL for the resource
+         */
+        @Override
+        public URL getResourceURL(String path, long hostBundleID) {
+            return doGetResourceURL(path);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public URL getResourceURL(String path, BaseData hostData, int index) {
+            return doGetResourceURL(path);
+        }
+
+        private URL doGetResourceURL(String path) {
+            BundleEntry entry = getEntry(path);
+            if (entry != null) {
+                return getLocalURLForEntry(entry);
+            } else {
+                return null;
+            }
+        }
+
+        private URL getLocalURLForEntry(BundleEntry entry) {
+            URL url = entry.getLocalURL();
+            URLConnection connection = null;
+            try {
+                connection = url.openConnection();
+                connection.setDefaultUseCaches(false);
+                connection.setUseCaches(false);
+            } catch (Exception e) {
+                
+            }
+            if (!"jar".equals(url.getProtocol()) || doesJarEntryReallyExist(connection)) {
+                return url;
+            } else {
+                return null;
+            }
+        }
+
+        private boolean doesJarEntryReallyExist(URLConnection connection) {
+            boolean entryExists = false;
+            JarFile jarFile = null;
+            try {
+                if (connection != null && connection instanceof JarURLConnection) {
+                    JarURLConnection jarURLConnection = (JarURLConnection) connection;
+                    jarFile = jarURLConnection.getJarFile();
+                    String entryName = jarURLConnection.getEntryName();
+                    if (entryName != null && jarFile != null && jarFile.getEntry(entryName) != null) {
+                    	entryExists = true;
+                    }
+                }
+            } catch (IOException ioe) {
+                entryExists = false;
+            } finally {
+            	if (jarFile != null) {
+            		try {
+            			jarFile.close();
+            		} catch (IOException ignored) {
+            		}
+            	}
+            }
+            return entryExists;
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/main/java/org/eclipse/virgo/kernel/equinox/extensions/hooks/ExtensionsHookConfigurator.java b/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/main/java/org/eclipse/virgo/kernel/equinox/extensions/hooks/ExtensionsHookConfigurator.java
new file mode 100644
index 0000000..0281320
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/main/java/org/eclipse/virgo/kernel/equinox/extensions/hooks/ExtensionsHookConfigurator.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.equinox.extensions.hooks;
+
+import org.eclipse.osgi.baseadaptor.HookConfigurator;
+import org.eclipse.osgi.baseadaptor.HookRegistry;
+
+/**
+ * Configures Equinox hooks with which its runtime behaviour is customised.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Thread-safe.
+ *
+ */
+public class ExtensionsHookConfigurator implements HookConfigurator {        
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void addHooks(HookRegistry hookRegistry) {
+        hookRegistry.addClassLoadingHook(PluggableClassLoadingHook.getInstance());
+        hookRegistry.addBundleFileWrapperFactoryHook(new ExtendedBundleFileWrapperFactoryHook());
+        hookRegistry.addBundleFileWrapperFactoryHook(BundleFileClosingBundleFileWrapperFactoryHook.getInstance());
+        hookRegistry.addBundleFileWrapperFactoryHook(PluggableBundleFileWrapperFactoryHook.getInstance());
+        hookRegistry.addClassLoaderDelegateHook(PluggableDelegatingClassLoaderDelegateHook.getInstance());
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/main/java/org/eclipse/virgo/kernel/equinox/extensions/hooks/MetaInfResourceClassLoaderDelegateHook.java b/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/main/java/org/eclipse/virgo/kernel/equinox/extensions/hooks/MetaInfResourceClassLoaderDelegateHook.java
new file mode 100644
index 0000000..b92ea32
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/main/java/org/eclipse/virgo/kernel/equinox/extensions/hooks/MetaInfResourceClassLoaderDelegateHook.java
@@ -0,0 +1,368 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.equinox.extensions.hooks;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.net.URL;
+import java.util.Collection;
+import java.util.Enumeration;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.WeakHashMap;
+
+import org.eclipse.osgi.framework.adaptor.BundleClassLoader;
+import org.eclipse.osgi.framework.adaptor.BundleData;
+import org.eclipse.osgi.framework.adaptor.ClassLoaderDelegateHook;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleEvent;
+import org.osgi.framework.BundleListener;
+import org.osgi.service.packageadmin.ExportedPackage;
+import org.osgi.service.packageadmin.PackageAdmin;
+
+/**
+ * A {@link ClassLoaderDelegateHook} which in {@link #postFindResource} and {@link #postFindResources} propagates the
+ * attempt to get <code>META-INF</code> resource(s) to the principle bundle's dependencies, unless the request is being
+ * driven through Spring DM's DelgatedNamespaceHandlerResolver.
+ * 
+ * <p />
+ * 
+ * The list of a bundle's dependencies are cached to avoid determining the dependencies every time. A bundle's entry in
+ * the cached is cleared whenever an <code>UNRESOLVED</code> event is received for the bundle. <code>UNRESOLVED</code>
+ * events are fired both during uninstall and during {@link PackageAdmin#refreshPackages(Bundle[]) refreshPackages}
+ * processing.
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ * 
+ */
+@SuppressWarnings("deprecation")
+public class MetaInfResourceClassLoaderDelegateHook implements ClassLoaderDelegateHook {
+
+    private static final String SPRINGDM_DELEGATED_NAMESPACE_HANDLER_RESOLVER_CLASS_NAME = "org.springframework.osgi.context.support.DelegatedNamespaceHandlerResolver";
+
+    private static final String SPRINGDM_DELEGATED_ENTITY_RESOLVER_CLASS_NAME = "org.springframework.osgi.context.support.DelegatedEntityResolver";
+
+    private static final String BLUEPRINT_DELEGATED_NAMESPACE_HANDLER_RESOLVER_CLASS_NAME = "org.eclipse.gemini.blueprint.context.support.DelegatedNamespaceHandlerResolver";
+
+    private static final String BLUEPRINT_DELEGATED_ENTITY_RESOLVER_CLASS_NAME = "org.eclipse.gemini.blueprint.context.support.ChainedEntityResolver";
+
+    private static final String EXCLUDED_RESOURCE_MANIFEST = "MANIFEST.MF";
+
+    private static final String EXCLUDED_RESOURCE_SPRING_DIR = "spring";
+
+    private static final String EXCLUDED_RESOURCE_BLUEPRINT_DIR = "blueprint";
+
+    private static final String EXCLUDED_RESOURCE_SPRING_DIR_SUFFIX = ".xml";
+
+    private final BundleContext systemBundleContext;
+
+    private final PackageAdmin packageAdmin;
+
+    private final ThreadLocal<Object> resourceSearchInProgress = new ThreadLocal<Object>();
+
+    private final Object SEARCH_IN_PROGRESS_MARKER = new Object();
+
+    private final Object monitor = new Object();
+
+    private final WeakHashMap<Bundle, Set<Bundle>> dependenciesCache = new WeakHashMap<Bundle, Set<Bundle>>();
+
+    private final BundleListener cacheClearingBundleListener = new CacheClearingBundleListener();
+
+    /**
+     * Create a new hook that will use the supplied <code>systemBundleContext</code> to lookup bundles, and the supplied
+     * <code>packageAdmin</code> to determine a bundle's dependencies.
+     * 
+     * @param systemBundleContext the {@link BundleContext} of the system bundle
+     * @param packageAdmin the {@link PackageAdmin} to use to determine a bundle's dependencies
+     */
+    public MetaInfResourceClassLoaderDelegateHook(BundleContext systemBundleContext, PackageAdmin packageAdmin) {
+        this.systemBundleContext = systemBundleContext;
+        this.packageAdmin = packageAdmin;
+    }
+
+    public void init() {
+        this.systemBundleContext.addBundleListener(this.cacheClearingBundleListener);
+    }
+
+    public void destroy() {
+        this.systemBundleContext.removeBundleListener(this.cacheClearingBundleListener);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public URL postFindResource(String name, BundleClassLoader classLoader, BundleData data) throws FileNotFoundException {
+        if (this.resourceSearchInProgress.get() == null && isDelegatedResource(name)) {
+            try {
+                this.resourceSearchInProgress.set(SEARCH_IN_PROGRESS_MARKER);
+
+                Bundle[] bundles = getDependencyBundles(classLoader.getBundle());
+                for (Bundle dependency : bundles) {
+                    try {
+                        int state = dependency.getState();
+                        if (state == Bundle.ACTIVE || state == Bundle.RESOLVED) {
+                            URL resource = dependency.getResource(name);
+                            if (resource != null) {
+                                return resource;
+                            }
+                        } else {
+                            removeDependency(classLoader.getBundle(), dependency);
+                        }
+                    } catch (IllegalStateException ise) {
+                        // Dependency now UNINSTALLED
+                        removeDependency(classLoader.getBundle(), dependency);
+                    }
+                }
+            } finally {
+                this.resourceSearchInProgress.set(null);
+            }
+        }
+        return null;
+
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Enumeration<URL> postFindResources(String name, BundleClassLoader classLoader, BundleData data) throws FileNotFoundException {
+        if (this.resourceSearchInProgress.get() == null && isDelegatedResource(name)) {
+            try {
+                this.resourceSearchInProgress.set(SEARCH_IN_PROGRESS_MARKER);
+
+                Set<URL> found = new HashSet<URL>();
+                Bundle[] bundles = getDependencyBundles(classLoader.getBundle());
+                for (Bundle dependency : bundles) {
+                    try {
+                        int state = dependency.getState();
+                        if (state == Bundle.RESOLVED || state == Bundle.ACTIVE) {
+                            addAll(found, dependency.getResources(name));
+                        } else {
+                            removeDependency(classLoader.getBundle(), dependency);
+                        }
+                    } catch (IOException ignored) {
+                    } catch (IllegalStateException ise) {
+                        // Dependency now UNINSTALLED
+                        removeDependency(classLoader.getBundle(), dependency);
+                    }
+                }
+
+                if (!found.isEmpty()) {
+                    return new IteratorEnumerationAdaptor<URL>(found.iterator());
+                }
+            } finally {
+                this.resourceSearchInProgress.set(null);
+            }
+        }
+
+        return null;
+    }
+
+    private boolean isDelegatedResource(String name) {
+        return isMetaInfResource(name) && !isDelegatedResolverCall();
+    }
+
+    /**
+     * Queries whether or not the supplied resource name is a META-INF resource.
+     * 
+     * @param name the resource name.
+     * @return <code>true</code> if the resource is a META-INF resource.
+     */
+    private boolean isMetaInfResource(String name) {
+        if (!name.startsWith("/META-INF") && !name.startsWith("META-INF")) {
+            return false;
+        }
+        if (name.contains(EXCLUDED_RESOURCE_MANIFEST)) {
+            return false;
+        }
+        if ((name.contains(EXCLUDED_RESOURCE_SPRING_DIR) || name.contains(EXCLUDED_RESOURCE_BLUEPRINT_DIR))
+            && name.endsWith(EXCLUDED_RESOURCE_SPRING_DIR_SUFFIX)) {
+            return false;
+        }
+        return true;
+    }
+
+    private boolean isDelegatedResolverCall() {
+        Class<?>[] stackTrace = new SecurityManagerExecutionStackAccessor().getExecutionStack();
+        return isSpringDmDelegatedResolverCall(stackTrace) || isBlueprintDelegatedResolverCall(stackTrace);
+    }
+
+    private static final class SecurityManagerExecutionStackAccessor extends SecurityManager {
+
+        public Class<?>[] getExecutionStack() {
+            Class<?>[] classes = super.getClassContext();
+            Class<?>[] executionStack = new Class<?>[classes.length - 1];
+
+            System.arraycopy(classes, 1, executionStack, 0, executionStack.length);
+
+            return executionStack;
+        }
+    }
+
+    private boolean isSpringDmDelegatedResolverCall(Class<?>[] stackTrace) {
+        return isDelegatedResolverCall(stackTrace, SPRINGDM_DELEGATED_NAMESPACE_HANDLER_RESOLVER_CLASS_NAME,
+            SPRINGDM_DELEGATED_ENTITY_RESOLVER_CLASS_NAME);
+    }
+
+    private boolean isBlueprintDelegatedResolverCall(Class<?>[] stackTrace) {
+        return isDelegatedResolverCall(stackTrace, BLUEPRINT_DELEGATED_NAMESPACE_HANDLER_RESOLVER_CLASS_NAME,
+            BLUEPRINT_DELEGATED_ENTITY_RESOLVER_CLASS_NAME);
+    }
+
+    private boolean isDelegatedResolverCall(Class<?>[] stackTrace, String namespaceResolver, String entityResolver) {
+        for (Class<?> clazz : stackTrace) {
+            String className = clazz.getName();
+            if (namespaceResolver.equals(className) || entityResolver.equals(className)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private void addAll(Collection<URL> target, Enumeration<URL> source) {
+        while (source != null && source.hasMoreElements()) {
+            target.add(source.nextElement());
+        }
+    }
+
+    private Bundle[] getDependencyBundles(Bundle bundle) {
+        synchronized (this.monitor) {
+            Set<Bundle> dependencies = this.dependenciesCache.get(bundle);
+            if (dependencies != null) {
+                return dependencies.toArray(new Bundle[dependencies.size()]);
+            }
+        }
+
+        Set<Bundle> dependencies = determineDependencies(bundle);
+        synchronized (this.monitor) {
+            this.dependenciesCache.put(bundle, dependencies);
+            return dependencies.toArray(new Bundle[dependencies.size()]);
+        }
+    }
+
+    private void removeDependency(Bundle bundle, Bundle dependency) {
+        synchronized (this.monitor) {
+            Set<Bundle> dependencies = this.dependenciesCache.get(bundle);
+            if (dependencies != null) {
+                dependencies.remove(dependency);
+            }
+        }
+    }
+
+    private Set<Bundle> determineDependencies(Bundle bundle) {
+        Set<Bundle> bundles = new HashSet<Bundle>();
+        for (Bundle candidate : this.systemBundleContext.getBundles()) {
+            if (!candidate.equals(bundle)) {
+                ExportedPackage[] exportedPackages = getExportedPackages(candidate);
+                if (exportedPackages != null) {
+                    for (ExportedPackage exportedPackage : exportedPackages) {
+                        Bundle[] importingBundles = exportedPackage.getImportingBundles();
+                        if (importingBundles != null) {
+                            for (Bundle importer : importingBundles) {
+                                if (importer.equals(bundle)) {
+                                    bundles.add(candidate);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return bundles;
+    }
+
+    protected ExportedPackage[] getExportedPackages(Bundle bundle) {
+        return this.packageAdmin.getExportedPackages(bundle);
+    }
+
+    private static class IteratorEnumerationAdaptor<T> implements Enumeration<T> {
+
+        private final Iterator<T> iterator;
+
+        private IteratorEnumerationAdaptor(Iterator<T> iterator) {
+            this.iterator = iterator;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public boolean hasMoreElements() {
+            return this.iterator.hasNext();
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public T nextElement() {
+            return this.iterator.next();
+        }
+    }
+
+    private final class CacheClearingBundleListener implements BundleListener {
+
+        /**
+         * {@inheritDoc}
+         */
+        public void bundleChanged(BundleEvent event) {
+            if (BundleEvent.UNRESOLVED == event.getType()) {
+                synchronized (monitor) {
+                    dependenciesCache.remove(event.getBundle());
+                }
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Class<?> postFindClass(String name, BundleClassLoader classLoader, BundleData data) throws ClassNotFoundException {
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String postFindLibrary(String name, BundleClassLoader classLoader, BundleData data) {
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Class<?> preFindClass(String name, BundleClassLoader classLoader, BundleData data) throws ClassNotFoundException {
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String preFindLibrary(String name, BundleClassLoader classLoader, BundleData data) throws FileNotFoundException {
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public URL preFindResource(String name, BundleClassLoader classLoader, BundleData data) throws FileNotFoundException {
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Enumeration<URL> preFindResources(String name, BundleClassLoader classLoader, BundleData data) throws FileNotFoundException {
+        return null;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/main/java/org/eclipse/virgo/kernel/equinox/extensions/hooks/PluggableBundleFileWrapperFactoryHook.java b/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/main/java/org/eclipse/virgo/kernel/equinox/extensions/hooks/PluggableBundleFileWrapperFactoryHook.java
new file mode 100644
index 0000000..500dc65
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/main/java/org/eclipse/virgo/kernel/equinox/extensions/hooks/PluggableBundleFileWrapperFactoryHook.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.equinox.extensions.hooks;
+
+import java.io.IOException;
+
+import org.eclipse.osgi.baseadaptor.BaseData;
+import org.eclipse.osgi.baseadaptor.bundlefile.BundleFile;
+import org.eclipse.osgi.baseadaptor.hooks.BundleFileWrapperFactoryHook;
+
+
+/**
+ * A {@link BundleFileWrapperFactoryHook} into which a {@link BundleFileWrapper} implementation can be plugged. The {@link BundleFileWrapper}
+ * implementation is called to wrap {@link BundleFile BundleFiles} during bundle installation and update.
+ *
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Thread-safe.
+ *
+ */
+public class PluggableBundleFileWrapperFactoryHook implements BundleFileWrapperFactoryHook {
+    
+    private volatile BundleFileWrapper wrapper;
+    
+    private final Object monitor = new Object();
+    
+    private static final PluggableBundleFileWrapperFactoryHook INSTANCE =  new PluggableBundleFileWrapperFactoryHook();
+    
+    private PluggableBundleFileWrapperFactoryHook() {
+        
+    }
+
+    public static PluggableBundleFileWrapperFactoryHook getInstance() {
+        return INSTANCE;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public BundleFile wrapBundleFile(BundleFile bundleFile, Object content, BaseData data, boolean base) throws IOException {
+        synchronized(this.monitor) {
+            if (wrapper != null) {
+                return wrapper.wrapBundleFile(bundleFile);
+            } else {
+                return null;
+            }
+        }
+    }
+    
+    public void setBundleFileWrapper(BundleFileWrapper wrapper) {
+        synchronized(this.monitor) {
+            this.wrapper = wrapper;
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/main/java/org/eclipse/virgo/kernel/equinox/extensions/hooks/PluggableClassLoadingHook.java b/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/main/java/org/eclipse/virgo/kernel/equinox/extensions/hooks/PluggableClassLoadingHook.java
new file mode 100644
index 0000000..804fb3d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/main/java/org/eclipse/virgo/kernel/equinox/extensions/hooks/PluggableClassLoadingHook.java
@@ -0,0 +1,122 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.equinox.extensions.hooks;
+
+import java.security.ProtectionDomain;
+import java.util.ArrayList;
+
+import org.eclipse.osgi.baseadaptor.BaseData;
+import org.eclipse.osgi.baseadaptor.bundlefile.BundleEntry;
+import org.eclipse.osgi.baseadaptor.hooks.ClassLoadingHook;
+import org.eclipse.osgi.baseadaptor.loader.BaseClassLoader;
+import org.eclipse.osgi.baseadaptor.loader.ClasspathEntry;
+import org.eclipse.osgi.baseadaptor.loader.ClasspathManager;
+import org.eclipse.osgi.framework.adaptor.BundleProtectionDomain;
+import org.eclipse.osgi.framework.adaptor.ClassLoaderDelegate;
+
+/**
+ * A {@link ClassLoadingHook} into which a {@link ClassLoaderCreator} can be plugged to provide a custom class loader
+ * for a bundle.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ * 
+ */
+public final class PluggableClassLoadingHook implements ClassLoadingHook {
+
+    private static final PluggableClassLoadingHook INSTANCE = new PluggableClassLoadingHook();
+
+    private final Object monitor = new Object();
+
+    private volatile ClassLoaderCreator creator;
+
+    private ClassLoader bundleClassLoaderParent;
+
+    private PluggableClassLoadingHook() {
+
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean addClassPathEntry(ArrayList<ClasspathEntry> cpEntries, String cp, ClasspathManager hostmanager, BaseData sourcedata, ProtectionDomain sourcedomain) {
+        return false;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public BaseClassLoader createClassLoader(ClassLoader parent, ClassLoaderDelegate delegate, BundleProtectionDomain domain, BaseData data,
+        String[] bundleclasspath) {
+        if (this.creator != null) {
+            return this.creator.createClassLoader(parent, delegate, domain, data, bundleclasspath);
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String findLibrary(BaseData data, String libName) {
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public ClassLoader getBundleClassLoaderParent() {
+        synchronized (this.monitor) {
+            return this.bundleClassLoaderParent;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void initializedClassLoader(BaseClassLoader baseClassLoader, BaseData data) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public byte[] processClass(String name, byte[] classbytes, ClasspathEntry classpathEntry, BundleEntry entry, ClasspathManager manager) {
+        return null;
+    }
+
+    public void setClassLoaderCreator(ClassLoaderCreator creator) {
+        synchronized (this.monitor) {
+            this.creator = creator;
+        }
+    }
+
+    /**
+     * @return singleton
+     */
+    public static PluggableClassLoadingHook getInstance() {
+        return INSTANCE;
+    }
+
+    /**
+     * Sets the class loader to be used as the parent of bundle class loaders.
+     * 
+     * @param bundleClassLoaderParent the class loader to be used
+     */
+    public void setBundleClassLoaderParent(ClassLoader bundleClassLoaderParent) {
+        synchronized (this.monitor) {
+            this.bundleClassLoaderParent = bundleClassLoaderParent;
+        }
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/main/java/org/eclipse/virgo/kernel/equinox/extensions/hooks/PluggableDelegatingClassLoaderDelegateHook.java b/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/main/java/org/eclipse/virgo/kernel/equinox/extensions/hooks/PluggableDelegatingClassLoaderDelegateHook.java
new file mode 100644
index 0000000..8c40e53
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/main/java/org/eclipse/virgo/kernel/equinox/extensions/hooks/PluggableDelegatingClassLoaderDelegateHook.java
@@ -0,0 +1,137 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.equinox.extensions.hooks;
+
+import java.io.FileNotFoundException;
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.eclipse.osgi.framework.adaptor.BundleClassLoader;
+import org.eclipse.osgi.framework.adaptor.BundleData;
+import org.eclipse.osgi.framework.adaptor.ClassLoaderDelegateHook;
+
+
+/**
+ * A pluggable {@link ClassLoaderDelegateHook} into which one or more <code>ClassLoaderDelegateHook</code>
+ * can be plugged.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Thread-safe.
+ *
+ */
+public class PluggableDelegatingClassLoaderDelegateHook implements ClassLoaderDelegateHook {
+    
+    private final List<ClassLoaderDelegateHook> delegates = new CopyOnWriteArrayList<ClassLoaderDelegateHook>();
+    
+    private static final PluggableDelegatingClassLoaderDelegateHook INSTANCE = new PluggableDelegatingClassLoaderDelegateHook();
+    
+    private PluggableDelegatingClassLoaderDelegateHook() {
+    }
+    
+    public static PluggableDelegatingClassLoaderDelegateHook getInstance() {
+        return INSTANCE;
+    }
+    
+    public void addDelegate(ClassLoaderDelegateHook delegate) {
+        this.delegates.add(delegate);
+    }
+    
+    public void removeDelegate(ClassLoaderDelegateHook delegate) {
+        this.delegates.remove(delegate);
+    }
+    
+    public Class<?> postFindClass(String name, BundleClassLoader classLoader, BundleData data) throws ClassNotFoundException {
+        for (ClassLoaderDelegateHook delegate : this.delegates) {
+            Class<?> clazz = delegate.postFindClass(name, classLoader, data);    
+            if (clazz != null) {
+                return clazz;
+            } 
+        }
+        return null;
+    }
+
+    public String postFindLibrary(String name, BundleClassLoader classLoader, BundleData data) {
+        for (ClassLoaderDelegateHook delegate : this.delegates) {
+            String library = delegate.postFindLibrary(name, classLoader, data);    
+            if (library != null) {
+                return library;
+            }        
+        }
+        return null;
+    }
+
+    public URL postFindResource(String name, BundleClassLoader classLoader, BundleData data) throws FileNotFoundException {
+        for (ClassLoaderDelegateHook delegate : this.delegates) {
+            URL resource = delegate.postFindResource(name, classLoader, data);    
+            if (resource != null) {
+                return resource;
+            }        
+        }
+        return null;
+    }
+
+    public Enumeration<URL> postFindResources(String name, BundleClassLoader classLoader, BundleData data) throws FileNotFoundException {
+        for (ClassLoaderDelegateHook delegate : this.delegates) {
+            Enumeration<URL> resources = delegate.postFindResources(name, classLoader, data);    
+            if (resources != null) {
+                return resources;
+            }        
+        }
+        return null;
+    }
+
+    public Class<?> preFindClass(String name, BundleClassLoader classLoader, BundleData data) throws ClassNotFoundException {
+        for (ClassLoaderDelegateHook delegate : this.delegates) {
+            Class<?> clazz = delegate.preFindClass(name, classLoader, data);    
+            if (clazz != null) {
+                return clazz;
+            }        
+        }
+        return null;
+    }
+
+    public String preFindLibrary(String name, BundleClassLoader classLoader, BundleData data) throws FileNotFoundException {
+        for (ClassLoaderDelegateHook delegate : this.delegates) {
+            String library = delegate.preFindLibrary(name, classLoader, data);    
+            if (library != null) {
+                return library;
+            }        
+        }
+        return null;
+    }
+
+    public URL preFindResource(String name, BundleClassLoader classLoader, BundleData data) throws FileNotFoundException {
+        for (ClassLoaderDelegateHook delegate : this.delegates) {
+            URL resource = delegate.preFindResource(name, classLoader, data);    
+            if (resource != null) {
+                return resource;
+            }        
+        }
+        return null;
+    }
+
+    public Enumeration<URL> preFindResources(String name, BundleClassLoader classLoader, BundleData data) throws FileNotFoundException {
+        for (ClassLoaderDelegateHook delegate : this.delegates) {
+            Enumeration<URL> resources = delegate.preFindResources(name, classLoader, data);    
+            if (resources != null) {
+                return resources;
+            }        
+        }
+        return null;
+    }
+    
+    
+}
diff --git a/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/main/resources/.gitignore b/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/main/resources/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/main/resources/.gitignore
diff --git a/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/main/resources/about.html b/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/main/resources/about.html
new file mode 100644
index 0000000..c258ef5
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/main/resources/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>June 5, 2006</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/test/java/org/eclipse/virgo/kernel/equinox/extensions/hooks/MetaInfResourceClassLoaderDelegateHookTests.java b/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/test/java/org/eclipse/virgo/kernel/equinox/extensions/hooks/MetaInfResourceClassLoaderDelegateHookTests.java
new file mode 100644
index 0000000..b082f7e
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/test/java/org/eclipse/virgo/kernel/equinox/extensions/hooks/MetaInfResourceClassLoaderDelegateHookTests.java
@@ -0,0 +1,147 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.equinox.extensions.hooks;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.FileNotFoundException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Vector;
+
+import org.eclipse.osgi.framework.adaptor.BundleClassLoader;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Version;
+import org.osgi.service.packageadmin.ExportedPackage;
+
+import org.eclipse.virgo.kernel.equinox.extensions.hooks.MetaInfResourceClassLoaderDelegateHook;
+import org.eclipse.virgo.test.stubs.framework.StubBundle;
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+
+
+/**
+ */
+@SuppressWarnings("deprecation")
+public class MetaInfResourceClassLoaderDelegateHookTests {
+    
+    private final BundleClassLoader classLoader = createMock(BundleClassLoader.class);
+    
+    private final StubBundle principleBundle = new StubBundle(3L, "principle", new Version(1, 0, 0), "");
+    
+    private final StubBundle installedBundleOne = new StubBundle(1L, "one", new Version(1, 0, 0), "");
+    
+    private final StubBundle installedBundleTwo = new StubBundle(2L, "two", new Version(1, 0, 0), "");
+    
+    private final StubBundleContext principleBundleContext = new StubBundleContext(this.principleBundle);
+    
+    private final UnitTestMetaInfResourceClassLoaderDelegateHook hook = new UnitTestMetaInfResourceClassLoaderDelegateHook(this.principleBundleContext);
+    
+    @Before
+    public void initialise() {
+        this.principleBundle.setBundleContext(this.principleBundleContext);
+
+        expect(this.classLoader.getBundle()).andReturn(this.principleBundle).anyTimes();
+        replay(this.classLoader);
+        
+        this.installedBundleOne.setState(Bundle.ACTIVE);
+        this.installedBundleTwo.setState(Bundle.RESOLVED);
+        
+        this.principleBundleContext.addInstalledBundle(this.installedBundleOne);
+        this.principleBundleContext.addInstalledBundle(this.installedBundleTwo);
+    }
+    
+    @Test
+    public void findResourceWithNoExportedPackages() throws FileNotFoundException {
+        assertNull(hook.postFindResource("META-INF/the.resource", classLoader, null));
+    }
+    
+    @Test
+    public void findResourcesWithNoExportedPackages() throws FileNotFoundException {
+        assertNull(hook.postFindResources("META-INF/the.resource", classLoader, null));
+    }
+    
+    @Test
+    public void findResource() throws FileNotFoundException, MalformedURLException {
+        ExportedPackage exportedPackage = createMock(ExportedPackage.class);
+        expect(exportedPackage.getImportingBundles()).andReturn(new Bundle[] {this.principleBundle});
+        replay(exportedPackage);
+        
+        hook.exportedPackages.put(this.installedBundleTwo, new ExportedPackage[] {exportedPackage});
+        
+        URL resourceUrl = new URL("file:/resource");
+        this.installedBundleTwo.addResource("META-INF/the.resource", resourceUrl);
+        
+        assertEquals(resourceUrl, this.hook.postFindResource("META-INF/the.resource", this.classLoader, null));
+    }
+    
+    @Test
+    public void findResources() throws FileNotFoundException, MalformedURLException {
+        ExportedPackage exportedPackage = createMock(ExportedPackage.class);
+        expect(exportedPackage.getImportingBundles()).andReturn(new Bundle[] {this.principleBundle}).anyTimes();
+        replay(exportedPackage);
+        
+        hook.exportedPackages.put(this.installedBundleTwo, new ExportedPackage[] {exportedPackage});
+        hook.exportedPackages.put(this.installedBundleOne, new ExportedPackage[] {exportedPackage});
+        
+        URL resourceUrlOne = new URL("file:/resource/one");
+        URL resourceUrlTwo = new URL("file:/resource/two");
+        
+        this.installedBundleOne.addResources("META-INF/the.resource", createEnumeration(resourceUrlOne));
+        this.installedBundleTwo.addResources("META-INF/the.resource", createEnumeration(resourceUrlTwo));
+        
+        Enumeration<?> postFindResources = this.hook.postFindResources("META-INF/the.resource", this.classLoader, null);
+        assertNotNull(postFindResources);
+        
+        List<URL> results = new ArrayList<URL>();
+        while (postFindResources.hasMoreElements()) {
+            results.add((URL)postFindResources.nextElement());
+        }
+        
+        assertEquals(2, results.size());
+        assertTrue(results.contains(resourceUrlOne));
+        assertTrue(results.contains(resourceUrlTwo));
+    }
+    
+    private Enumeration<URL> createEnumeration(URL url) {
+        Vector<URL> vector = new Vector<URL>();
+        vector.add(url);
+        return vector.elements();
+    }
+        
+    private static final class UnitTestMetaInfResourceClassLoaderDelegateHook extends MetaInfResourceClassLoaderDelegateHook {
+        
+        public UnitTestMetaInfResourceClassLoaderDelegateHook(BundleContext systemBundleContext) {
+            super(systemBundleContext, null);
+        }
+
+        private final Map<Bundle, ExportedPackage[]> exportedPackages = new HashMap<Bundle, ExportedPackage[]>();
+
+        @Override
+        protected ExportedPackage[] getExportedPackages(Bundle bundle) {
+            return this.exportedPackages.get(bundle);
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/test/java/org/eclipse/virgo/kernel/equinox/extensions/hooks/PluggableClassLoadingHookTests.java b/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/test/java/org/eclipse/virgo/kernel/equinox/extensions/hooks/PluggableClassLoadingHookTests.java
new file mode 100644
index 0000000..76e7b5e
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/test/java/org/eclipse/virgo/kernel/equinox/extensions/hooks/PluggableClassLoadingHookTests.java
@@ -0,0 +1,102 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.equinox.extensions.hooks;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.osgi.baseadaptor.BaseData;
+import org.eclipse.osgi.baseadaptor.loader.BaseClassLoader;
+import org.eclipse.osgi.framework.adaptor.BundleProtectionDomain;
+import org.eclipse.osgi.framework.adaptor.ClassLoaderDelegate;
+import org.eclipse.osgi.launch.Equinox;
+import org.eclipse.virgo.kernel.equinox.extensions.EquinoxLauncherConfiguration;
+import org.eclipse.virgo.kernel.equinox.extensions.ExtendedEquinoxLauncher;
+import org.eclipse.virgo.kernel.equinox.extensions.hooks.ClassLoaderCreator;
+import org.eclipse.virgo.kernel.equinox.extensions.hooks.PluggableClassLoadingHook;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+
+
+/**
+ */
+public class PluggableClassLoadingHookTests {
+
+    private Equinox osgi;
+
+    private BundleContext context;
+
+    @Before
+    public void setUp() throws BundleException {
+        EquinoxLauncherConfiguration config = new EquinoxLauncherConfiguration();
+        config.setConfigPath(new File("build/config").toURI());
+        config.setInstallPath(new File("build/install").toURI());
+
+        this.osgi = ExtendedEquinoxLauncher.launch(config);
+        this.context = osgi.getBundleContext();
+    }
+    
+    @After
+    public void after() throws BundleException {
+        if(this.osgi != null) {
+            this.osgi.stop();
+        }
+    }
+
+    @Test
+    public void testAddClassLoaderCreator() throws Exception {
+        final List<BaseData> baseDatas = new ArrayList<BaseData>();
+        
+        ClassLoaderCreator creator = new ClassLoaderCreator() {
+
+            public BaseClassLoader createClassLoader(ClassLoader parent, ClassLoaderDelegate delegate, BundleProtectionDomain domain, BaseData data,
+                String[] bundleclasspath) {
+                baseDatas.add(data);
+                return null;
+            }
+            
+        };
+        
+        PluggableClassLoadingHook.getInstance().setClassLoaderCreator(creator);
+        this.context.registerService(ClassLoaderCreator.class.getName(), creator, null);
+        
+        Bundle b = this.context.installBundle(new File("src/test/resources/hooks/classloading/bundle").toURI().toString());
+        try {
+            b.loadClass("foo");
+            fail("shouldn't be able to load foo!");
+        } catch (ClassNotFoundException e) {
+            // expected
+            assertEquals(1, baseDatas.size());
+            assertEquals("hooks.classloading", baseDatas.get(0).getSymbolicName());
+        }
+    }
+    
+    @Test
+    public void testBundleClassLoaderParent() {
+        PluggableClassLoadingHook hook = PluggableClassLoadingHook.getInstance();
+        
+        assertNull(hook.getBundleClassLoaderParent());
+        
+        ClassLoader classLoader = getClass().getClassLoader();
+        hook.setBundleClassLoaderParent(classLoader);
+        assertEquals(classLoader, hook.getBundleClassLoaderParent());
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/test/java/org/eclipse/virgo/kernel/equinox/extensions/hooks/PluggableDelegatingClassLoaderDelegateHookTests.java b/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/test/java/org/eclipse/virgo/kernel/equinox/extensions/hooks/PluggableDelegatingClassLoaderDelegateHookTests.java
new file mode 100644
index 0000000..98aa8e6
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/test/java/org/eclipse/virgo/kernel/equinox/extensions/hooks/PluggableDelegatingClassLoaderDelegateHookTests.java
@@ -0,0 +1,122 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.equinox.extensions.hooks;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.reset;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import java.lang.reflect.Method;
+import java.net.URL;
+import java.util.Vector;
+
+import org.eclipse.osgi.framework.adaptor.BundleClassLoader;
+import org.eclipse.osgi.framework.adaptor.BundleData;
+import org.eclipse.osgi.framework.adaptor.ClassLoaderDelegateHook;
+import org.eclipse.virgo.kernel.equinox.extensions.hooks.PluggableDelegatingClassLoaderDelegateHook;
+import org.junit.Test;
+
+/**
+ * Tests for {@link PluggableDelegatingClassLoaderDelegateHook}
+ */
+public class PluggableDelegatingClassLoaderDelegateHookTests {
+    
+    private final ClassLoaderDelegateHook hook1 = createMock(ClassLoaderDelegateHook.class);
+    
+    private final ClassLoaderDelegateHook hook2 = createMock(ClassLoaderDelegateHook.class);
+    
+    private final PluggableDelegatingClassLoaderDelegateHook delegatingHook = PluggableDelegatingClassLoaderDelegateHook.getInstance();
+    
+    private final BundleClassLoader classLoader = createMock(BundleClassLoader.class);
+    
+    private final BundleData bundleData = createMock(BundleData.class);
+    
+    @Test
+    public void preFindClass() throws Exception {
+        performTest(ClassLoaderDelegateHook.class.getMethod("preFindClass", String.class, BundleClassLoader.class, BundleData.class), String.class);
+    }
+    
+    @Test
+    public void postFindClass() throws Exception {
+        performTest(ClassLoaderDelegateHook.class.getMethod("postFindClass", String.class, BundleClassLoader.class, BundleData.class), String.class);
+    }
+    
+    @Test
+    public void preFindResource() throws Exception {
+        performTest(ClassLoaderDelegateHook.class.getMethod("preFindResource", String.class, BundleClassLoader.class, BundleData.class), new URL("file:foo"));
+    }
+    
+    @Test
+    public void postFindResource() throws Exception {
+        performTest(ClassLoaderDelegateHook.class.getMethod("postFindResource", String.class, BundleClassLoader.class, BundleData.class), new URL("file:foo"));
+    }
+    
+    @Test
+    public void preFindLibrary() throws Exception {
+        performTest(ClassLoaderDelegateHook.class.getMethod("preFindLibrary", String.class, BundleClassLoader.class, BundleData.class), "library");
+    }
+    
+    @Test
+    public void postFindLibrary() throws Exception {
+        performTest(ClassLoaderDelegateHook.class.getMethod("postFindLibrary", String.class, BundleClassLoader.class, BundleData.class), "library");
+    }
+    
+    @Test
+    public void preFindResources() throws Exception {
+        performTest(ClassLoaderDelegateHook.class.getMethod("preFindResources", String.class, BundleClassLoader.class, BundleData.class), new Vector<URL>().elements());
+    }
+    
+    @Test
+    public void postFindResources() throws Exception {
+        performTest(ClassLoaderDelegateHook.class.getMethod("postFindResources", String.class, BundleClassLoader.class, BundleData.class), new Vector<URL>().elements());
+    }
+        
+    private void performTest(Method method, Object mockResult) throws Exception {
+        
+        Object result = method.invoke(this.delegatingHook, "foo", this.classLoader, bundleData);
+        assertNull(result);
+        
+        delegatingHook.addDelegate(hook1);
+        delegatingHook.addDelegate(hook2);
+        
+        expect(method.invoke(hook1, "foo", this.classLoader, this.bundleData)).andReturn(null);
+        expect(method.invoke(hook2, "foo", this.classLoader, this.bundleData)).andReturn(null);
+        
+        replay(hook1, hook2);
+        
+        result = method.invoke(this.delegatingHook, "foo", this.classLoader, bundleData);
+        assertNull(result);
+        
+        verify(hook1, hook2);
+        
+        reset(hook1, hook2);
+        
+        expect(method.invoke(hook1, "foo", this.classLoader, this.bundleData)).andReturn(mockResult);
+        
+        replay(hook1, hook2);
+        
+        result = method.invoke(this.delegatingHook, "foo", this.classLoader, bundleData);
+        assertEquals(mockResult, result);
+        
+        delegatingHook.removeDelegate(hook1);
+        delegatingHook.removeDelegate(hook2);
+        
+        result = method.invoke(this.delegatingHook, "foo", this.classLoader, bundleData);
+        assertNull(result);
+        
+        verify(hook1, hook2);
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/test/resources/hooks/classloading/bundle/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/test/resources/hooks/classloading/bundle/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..b018ed4
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.equinox.extensions/src/test/resources/hooks/classloading/bundle/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1
+Bundle-Manifest-Version: 2
+Bundle-SymbolicName: hooks.classloading
diff --git a/kernel/org.eclipse.virgo.kernel.equinox.extensions/template.mf b/kernel/org.eclipse.virgo.kernel.equinox.extensions/template.mf
new file mode 100644
index 0000000..092a037
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.equinox.extensions/template.mf
@@ -0,0 +1,16 @@
+Bundle-ManifestVersion: 2
+Bundle-Name: Equinox Specific OSGi Extensions
+Bundle-SymbolicName: org.eclipse.virgo.kernel.equinox.extensions
+Bundle-Version: ${version}
+Fragment-Host: org.eclipse.osgi; extension:=framework
+Excluded-Exports: 
+ *.internal.*,
+ org.eclipse.core.*,
+ org.eclipse.osgi.*,
+ org.osgi.framework.*,
+ org.osgi.service.*
+Excluded-Imports: 
+ org.eclipse.core.*;version="0",
+ org.eclipse.osgi.*;version="0",
+ org.osgi.framework.*;version="0",
+ org.osgi.service.*;version="0"
diff --git a/kernel/org.eclipse.virgo.kernel.kerneldmfragment/.settings/org.eclipse.virgo.ide.bundlor.core.prefs b/kernel/org.eclipse.virgo.kernel.kerneldmfragment/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
new file mode 100644
index 0000000..1409843
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.kerneldmfragment/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
@@ -0,0 +1,3 @@
+#Mon Jul 06 09:06:52 BST 2009
+org.eclipse.virgo.ide.bundlor.core.template.properties.files=../build.properties;../build.versions
+eclipse.preferences.version=1
diff --git a/kernel/org.eclipse.virgo.kernel.kerneldmfragment/.settings/org.eclipse.wst.common.project.facet.core.xml b/kernel/org.eclipse.virgo.kernel.kerneldmfragment/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..92aa290
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.kerneldmfragment/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+  <installed facet="org.eclipse.virgo.server.bundle" version="1.0"/>
+</faceted-project>
diff --git a/kernel/org.eclipse.virgo.kernel.kerneldmfragment/.settings/org.springframework.ide.eclipse.beans.core.prefs b/kernel/org.eclipse.virgo.kernel.kerneldmfragment/.settings/org.springframework.ide.eclipse.beans.core.prefs
new file mode 100644
index 0000000..e68da31
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.kerneldmfragment/.settings/org.springframework.ide.eclipse.beans.core.prefs
@@ -0,0 +1,3 @@
+#Mon Jul 06 16:49:15 BST 2009
+eclipse.preferences.version=1
+org.springframework.ide.eclipse.beans.core.ignoreMissingNamespaceHandler=false
diff --git a/kernel/org.eclipse.virgo.kernel.kerneldmfragment/.springBeans b/kernel/org.eclipse.virgo.kernel.kerneldmfragment/.springBeans
new file mode 100644
index 0000000..a151801
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.kerneldmfragment/.springBeans
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beansProjectDescription>
+	<version>1</version>
+	<pluginVersion><![CDATA[2.2.5.200906231226-RC1]]></pluginVersion>
+	<configSuffixes>
+		<configSuffix><![CDATA[xml]]></configSuffix>
+	</configSuffixes>
+	<enableImports><![CDATA[false]]></enableImports>
+	<configs>
+		<config>src/main/resources/META-INF/spring/extender/kernel-dmfragment-context.xml</config>
+	</configs>
+	<configSets>
+	</configSets>
+</beansProjectDescription>
diff --git a/kernel/org.eclipse.virgo.kernel.kerneldmfragment/src/main/resources/META-INF/spring/extender/kernel-dmfragment-context.xml b/kernel/org.eclipse.virgo.kernel.kerneldmfragment/src/main/resources/META-INF/spring/extender/kernel-dmfragment-context.xml
new file mode 100644
index 0000000..daad284
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.kerneldmfragment/src/main/resources/META-INF/spring/extender/kernel-dmfragment-context.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns="http://www.springframework.org/schema/beans"
+	xmlns:osgi="http://www.springframework.org/schema/osgi"
+	xsi:schemaLocation="http://www.springframework.org/schema/osgi  
+       http://www.springframework.org/schema/osgi/spring-osgi.xsd
+       http://www.springframework.org/schema/beans   
+       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
+	
+	<bean id="taskExecutor" class="org.eclipse.virgo.kernel.agent.dm.ContextPropagatingTaskExecutor">
+		<constructor-arg value="kernel-dm-" />
+		<constructor-arg value="15" />		
+		<constructor-arg ref="bundleContext"/>
+	</bean>
+	
+	<alias alias="shutdownTaskExecutor" name="taskExecutor"/>
+	
+</beans>
diff --git a/kernel/org.eclipse.virgo.kernel.kerneldmfragment/template.mf b/kernel/org.eclipse.virgo.kernel.kerneldmfragment/template.mf
new file mode 100644
index 0000000..d331f26
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.kerneldmfragment/template.mf
@@ -0,0 +1,9 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Virgo Kernel OSGi Spring DM Fragment
+Fragment-Host: org.eclipse.gemini.blueprint.extender
+Bundle-SymbolicName: org.eclipse.virgo.kernel.kerneldmfragment
+Bundle-Version: ${version}
+Import-Package: 
+ org.eclipse.virgo.kernel.agent.dm;version="${version:[=.=.=, =.+1)}",
+ org.eclipse.virgo.nano.shim.serviceability;version="${version:[=.=.=, =.+1)}"
diff --git a/kernel/org.eclipse.virgo.kernel.model/.settings/com.cenqua.clover.core.prefs b/kernel/org.eclipse.virgo.kernel.model/.settings/com.cenqua.clover.core.prefs
new file mode 100644
index 0000000..86ce032
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/.settings/com.cenqua.clover.core.prefs
@@ -0,0 +1,21 @@
+#Fri Sep 04 12:39:32 BST 2009
+block_filters=SourceDirective
+eclipse.preferences.version=1
+flush_interval=1000
+flush_policy=2
+include_filter=**/*.java
+init_string=target/clover/db/coverage.db
+init_string_default=false
+init_string_project_relative=true
+instrument_selected_source_folders=true
+instrumented_source_folder_patterns[0]=src/main/java\n**/*.java\n\nenabled
+instrumented_source_folder_patterns[1]=src/main/resources\n**/*.java\n\nenabled
+instrumented_source_folder_patterns[2]=src/test/java\n**/*.java\n\ndisabled
+instrumented_source_folder_patterns[3]=src/test/resources\n**/*.java\n\ndisabled
+output_root=.clover/bin
+output_root_same_as_project=true
+selected_test_source_folders[0]=src/test/java
+selected_test_source_folders[1]=src/test/resources
+should_qualify_java_lang=true
+test_include_filter=**/*Test.java,**/Test*.java
+test_source_folders=1
diff --git a/kernel/org.eclipse.virgo.kernel.model/.settings/org.eclipse.virgo.ide.bundlor.core.prefs b/kernel/org.eclipse.virgo.kernel.model/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
new file mode 100644
index 0000000..bf6d2f7
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
@@ -0,0 +1,3 @@
+#Mon Jul 06 09:08:03 BST 2009
+org.eclipse.virgo.ide.bundlor.core.template.properties.files=../build.properties;../build.versions
+eclipse.preferences.version=1
diff --git a/kernel/org.eclipse.virgo.kernel.model/.settings/org.eclipse.wst.common.project.facet.core.xml b/kernel/org.eclipse.virgo.kernel.model/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..92aa290
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+  <installed facet="org.eclipse.virgo.server.bundle" version="1.0"/>
+</faceted-project>
diff --git a/kernel/org.eclipse.virgo.kernel.model/.settings/org.springframework.ide.eclipse.beans.core.prefs b/kernel/org.eclipse.virgo.kernel.model/.settings/org.springframework.ide.eclipse.beans.core.prefs
new file mode 100644
index 0000000..39218d3
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/.settings/org.springframework.ide.eclipse.beans.core.prefs
@@ -0,0 +1,3 @@
+#Tue Sep 08 09:58:14 BST 2009
+eclipse.preferences.version=1
+org.springframework.ide.eclipse.beans.core.ignoreMissingNamespaceHandler=false
diff --git a/kernel/org.eclipse.virgo.kernel.model/.springBeans b/kernel/org.eclipse.virgo.kernel.model/.springBeans
new file mode 100644
index 0000000..34b281c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/.springBeans
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beansProjectDescription>
+	<version>1</version>
+	<pluginVersion><![CDATA[2.3.0.200912170948-RELEASE]]></pluginVersion>
+	<configSuffixes>
+		<configSuffix><![CDATA[xml]]></configSuffix>
+	</configSuffixes>
+	<enableImports><![CDATA[false]]></enableImports>
+	<configs>
+	</configs>
+	<configSets>
+	</configSets>
+</beansProjectDescription>
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/Artifact.java b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/Artifact.java
new file mode 100644
index 0000000..67bbff3
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/Artifact.java
@@ -0,0 +1,104 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model;
+
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.equinox.region.Region;
+import org.osgi.framework.Version;
+
+/**
+ * Represents an artifact in the runtime model of this system. Acts as a generic interface that delegates to more
+ * specific functionality in the running system. In all likelihood, there should be very few sub-interfaces of this
+ * interface but quite a few implementations of this interface.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations must be threadsafe
+ * 
+ */
+public interface Artifact {
+
+    /**
+     * Start this {@link Artifact}
+     */
+    void start();
+
+    /**
+     * Stop this {@link Artifact}
+     */
+    void stop();
+
+    /**
+     * Update and refresh the contents of this {@link Artifact}
+     * @return true if the refresh is successful, false if refresh is not performed
+     */
+    boolean refresh();
+
+    /**
+     * Uninstall this {@link Artifact}
+     */
+    void uninstall();
+
+    /**
+     * Get the type of this {@link Artifact}
+     * 
+     * @return The type of this {@link Artifact}
+     */
+    String getType();
+
+    /**
+     * Get the name of this {@link Artifact}
+     * 
+     * @return The name of this {@link Artifact}
+     */
+    String getName();
+
+    /**
+     * Get the {@link Version} of this {@link Artifact}
+     * 
+     * @return The {@link Version} of this {@link Artifact}
+     */
+    Version getVersion();
+    
+    /**
+     * Get the {@link Region} of this {@link Artifact} or <code>null</code> if this artifact does not belong in a region
+     * 
+     * @return the {@link Region} of this {@link Artifact} or <code>null</code> if this artifact does not belong in a region
+     */
+    Region getRegion();
+
+    /**
+     * Get the state of this {@link Artifact}
+     * 
+     * @return The state of this {@link Artifact}
+     */
+    ArtifactState getState();
+
+    /**
+     * Get the {@link Artifact}s that this {@link Artifact} depends on. The dependency can be of any kind and will be
+     * determined by the type of {@link Artifact} represented.
+     * 
+     * @return This {@link Artifact}'s dependents
+     */
+    Set<Artifact> getDependents();
+
+    /**
+     * Get this {@link Artifact}'s properties. This map is free to hold any properties contributed by any collaborator.
+     * 
+     * @return This {@link Artifact}'s properties
+     */
+    Map<String, String> getProperties();
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/ArtifactState.java b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/ArtifactState.java
new file mode 100644
index 0000000..ab2443f
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/ArtifactState.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model;
+
+/**
+ * The states that an {@link Artifact} can be in
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+public enum ArtifactState {
+
+    INITIAL, //
+    INSTALLING, //
+    INSTALLED, //
+    RESOLVING, //
+    RESOLVED, //
+    STARTING, //
+    ACTIVE, //
+    STOPPING, //
+    UNINSTALLING, //
+    UNINSTALLED
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/BundleArtifact.java b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/BundleArtifact.java
new file mode 100644
index 0000000..3dac353
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/BundleArtifact.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model;
+
+/**
+ * Represents a bundle artifact (an artifact that is an OSGi Bundle) in the runtime model of this system. Acts as a
+ * generic interface that delegates to more specific functionality in the running system. In all likelihood, there
+ * should be very few sub-interfaces of this interface but quite a few implementations of this interface.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations must be threadsafe
+ * 
+ */
+public interface BundleArtifact extends Artifact {
+
+    /**
+     * Update an entry within this bundle. If the target path does not already exist, creates a new entry at that
+     * location.
+     * 
+     * @param inputPath The path to read update from
+     * @param targetPath The bundle relative path to write the update to
+     */
+    void updateEntry(String inputPath, String targetPath);
+
+    /**
+     * Delete an entry in a bundle
+     * 
+     * @param targetPath The bundle relative path to delete
+     */
+    void deleteEntry(String targetPath);
+
+    
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/CompositeArtifact.java b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/CompositeArtifact.java
new file mode 100644
index 0000000..1140d36
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/CompositeArtifact.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model;
+
+/**
+ * Represents a composite artifact (an artifact that contains other artifacts) in the runtime model of this system. Acts
+ * as a generic interface that delegates to more specific functionality in the running system. In all likelihood, there
+ * should be very few sub-interfaces of this interface but quite a few implementations of this interface.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations must be threadsafe
+ * 
+ */
+public interface CompositeArtifact extends Artifact {
+
+    /**
+     * Get whether this @{link CompositeArtifact} is scoped or not
+     * 
+     * @return Whether this {@link CompositeArtifact} is scoped or not
+     */
+    boolean isScoped();
+
+    /**
+     * Get whether this @{link CompositeArtifact} is atomic or not
+     * 
+     * @return Whether this {@link CompositeArtifact} is atomic or not
+     */
+    boolean isAtomic();
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/RuntimeArtifactRepository.java b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/RuntimeArtifactRepository.java
new file mode 100644
index 0000000..e361387
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/RuntimeArtifactRepository.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model;
+
+import java.util.Set;
+
+import org.eclipse.equinox.region.Region;
+import org.osgi.framework.Version;
+
+/**
+ * A single in-memory repository with representations of all artifacts in the running system. Operations are generally
+ * executed against the artifacts themselves rather than the repository.
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations must be threadsafe
+ * 
+ */
+public interface RuntimeArtifactRepository {
+
+    /**
+     * Add an {@link Artifact} to this repository
+     * 
+     * @param artifact The {@link Artifact} to add
+     * @return <code>true</code> if this repository did not already contain the specified {@link Artifact}
+     * @see Set
+     */
+    boolean add(Artifact artifact);
+
+    /**
+     * Remove an {@link Artifact} from this repository. If the artifact is a bundle, it is only removed if the bundle is
+     * in the user region.
+     * 
+     * @param artifact The {@link Artifact} to remove
+     * @return <code>true</code> if this repository contained the specified {@link Artifact}
+     */
+    boolean remove(Artifact artifact);
+
+    /**
+     * Remove an {@link Artifact} from this repository. If the artifact is a bundle, it is only removed if the bundle is
+     * in the user region.
+     * 
+     * @param type The type of the {@link Artifact} to remove
+     * @param name The name of the {@link Artifact} to remove
+     * @param version The {@link Version} of the {@link Artifact} to remove
+     * @param region The {@link Region} to remove the {@link Artifact} from
+     * @return <code>true</code> if this repository contained the specified {@link Artifact}
+     */
+    boolean remove(String type, String name, Version version, Region region);
+
+    /**
+     * Returns the entire collection of {@link Artifact}s contained within this repository. The returned collection
+     * should not be mutated by this repository when it changes. Only a subsequent call to this method will show changes
+     * to the contents of the repository.
+     * 
+     * @return The entire collection of artifacts contained within this repository
+     */
+    Set<Artifact> getArtifacts();
+
+    /**
+     * Gets a specific {@link Artifact} from this repository. 
+     * 
+     * @param type The type of the {@link Artifact} to get
+     * @param name The name of the {@link Artifact} to get
+     * @param version The {@link Version} of the {@link Artifact} to get
+     * @param region The {@link Region} to get the {@link Artifact} from or null if the artifact has no region or the region isn't known
+     * @return The {@link Artifact} represented by this type, name, and version if it is in the repository, otherwise
+     *         <code>null</code>
+     */
+    Artifact getArtifact(String type, String name, Version version, Region region);
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/AbstractArtifact.java b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/AbstractArtifact.java
new file mode 100644
index 0000000..1c2bbf5
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/AbstractArtifact.java
@@ -0,0 +1,181 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model.internal;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.equinox.region.Region;
+import org.eclipse.virgo.kernel.model.Artifact;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Filter;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.Version;
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * An abstract implementation of {@link Artifact} that all implementations should extend.
+ * <p/>
+ * Implements {@link #getDependents()} by delegating to {@link DependencyDeterminer} found in the service registry. The
+ * appropriate {@link DependencyDeterminer} is located by finding a a service with the property
+ * <code>artifactType</code> with the a value equal to the value of {@link #getType()}.
+ * <p />
+ * {@link #equals(Object)} and {@link #hashCode()} are also implemented to guarantee that equality is based on the type,
+ * name, and version of the artifact.
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe and all subclasses should be threadsafe
+ * 
+ * @see DependencyDeterminer
+ */
+public abstract class AbstractArtifact implements Artifact {
+
+    private static final String FILTER_FORMAT = "(&(objectClass=%s)(artifactType=%s))";
+
+    private final String type;
+
+    private final String name;
+
+    private final Version version;
+
+    private final ServiceTracker<DependencyDeterminer, DependencyDeterminer> dependencyDeterminerTracker;
+
+    private final Region region;
+
+    public AbstractArtifact(@NonNull BundleContext bundleContext, @NonNull String type, @NonNull String name, @NonNull Version version, @NonNull Region region) {
+        this.type = type;
+        this.name = name;
+        this.version = version;
+        this.region = region;
+
+        Filter filter;
+        try {
+            filter = bundleContext.createFilter(String.format(FILTER_FORMAT, DependencyDeterminer.class.getCanonicalName(), type));
+        } catch (InvalidSyntaxException e) {
+            throw new RuntimeException(String.format("Cannot create Service Registry filter for a DependencyDeterminer of type '%s'", type), e);
+        }
+        this.dependencyDeterminerTracker = new ServiceTracker<DependencyDeterminer, DependencyDeterminer>(bundleContext, filter, null);
+        this.dependencyDeterminerTracker.open();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public final String getType() {
+        return this.type;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public final String getName() {
+        return this.name;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public final Version getVersion() {
+        return this.version;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public final Region getRegion() {
+        return this.region;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public final Set<Artifact> getDependents() {
+        Set<Artifact> dependents = new HashSet<Artifact>();
+
+        Object[] dependencyDeterminers = this.dependencyDeterminerTracker.getServices();
+        if (dependencyDeterminers != null) {
+            for (Object dependencyDeterminer : dependencyDeterminers) {
+                dependents.addAll(((DependencyDeterminer) dependencyDeterminer).getDependents(this));
+            }
+        }
+
+        return Collections.unmodifiableSet(dependents);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Map<String, String> getProperties() {
+        return Collections.<String, String> emptyMap();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public final int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((name == null) ? 0 : name.hashCode());
+        result = prime * result + ((region == null) ? 0 : region.hashCode());
+        result = prime * result + ((type == null) ? 0 : type.hashCode());
+        result = prime * result + ((version == null) ? 0 : version.hashCode());
+        return result;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public final boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (!(obj instanceof AbstractArtifact))
+            return false;
+        AbstractArtifact other = (AbstractArtifact) obj;
+        if (name == null) {
+            if (other.name != null)
+                return false;
+        } else if (!name.equals(other.name))
+            return false;
+        if (region == null) {
+            if (other.region != null)
+                return false;
+        } else if (!region.equals(other.region))
+            return false;
+        if (type == null) {
+            if (other.type != null)
+                return false;
+        } else if (!type.equals(other.type))
+            return false;
+        if (version == null) {
+            if (other.version != null)
+                return false;
+        } else if (!version.equals(other.version))
+            return false;
+        return true;
+    }
+
+    @Override
+    public String toString() {
+        return String.format("type: %s, name: %s, version: %s, region: " + (this.region == null ? "?" : this.region.getName()), this.type, this.name,
+            this.version.toString());
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/ArtifactRepositoryListener.java b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/ArtifactRepositoryListener.java
new file mode 100644
index 0000000..0d59444
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/ArtifactRepositoryListener.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model.internal;
+
+import org.eclipse.virgo.kernel.model.Artifact;
+
+/**
+ * A listener for changes in the {@link NotifyingRuntimeArtifactRepository}
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations must be threadsafe
+ * 
+ * @see NotifyingRuntimeArtifactRepository
+ */
+public interface ArtifactRepositoryListener {
+
+    /**
+     * Called when an {@link Artifact} is added to the repository
+     * 
+     * @param artifact The {@link Artifact} that was added to the repository
+     */
+    void added(Artifact artifact);
+
+    /**
+     * Called when an {@link Artifact} is removed from the repository
+     * 
+     * @param artifact The {@link Artifact} that was removed from the repository
+     */
+    void removed(Artifact artifact);
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/DependencyDeterminer.java b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/DependencyDeterminer.java
new file mode 100644
index 0000000..8a3ee57
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/DependencyDeterminer.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model.internal;
+
+import java.util.Set;
+
+import org.eclipse.virgo.kernel.model.Artifact;
+
+
+/**
+ * Interface used to provide the values of the dependents of a given {@link Artifact}. Implementations of this interface
+ * should be registered in the OSGi Service Registry with a service property of <code>artifactType</code>. The value of
+ * this property should indicate which type of artifact this {@link DependencyDeterminer} can be used for.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations should be threadsafe
+ * 
+ * @see AbstractArtifact
+ */
+public interface DependencyDeterminer {
+
+    /**
+     * Returns the collection of dependent {@link Artifact}s for a given root {@link Artifact}. Note that the artifacts
+     * that are returned from this determiner should already be contained in the {@link org.eclipse.virgo.kernel.model.RuntimeArtifactRepository RuntimeArtifactRepository}. The
+     * single instance of this may need to be injected into the {@link DependencyDeterminer} implementation.
+     * 
+     * @param rootArtifact The {@link Artifact} to find dependents for
+     * @return The collection of dependent {@link Artifact}s
+     */
+    Set<Artifact> getDependents(Artifact rootArtifact);
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/NotifyingRuntimeArtifactRepository.java b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/NotifyingRuntimeArtifactRepository.java
new file mode 100644
index 0000000..131bd27
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/NotifyingRuntimeArtifactRepository.java
@@ -0,0 +1,130 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model.internal;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.equinox.region.Region;
+import org.eclipse.virgo.kernel.model.Artifact;
+import org.eclipse.virgo.kernel.model.RuntimeArtifactRepository;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.osgi.framework.Version;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Implementation of {@link RuntimeArtifactRepository} that notifies a collection of listeners that a change has
+ * happened to this repository.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ * @see ArtifactRepositoryListener
+ */
+public final class NotifyingRuntimeArtifactRepository implements RuntimeArtifactRepository {
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private final Object monitor = new Object();
+
+    private final Set<Artifact> artifacts = new HashSet<Artifact>();
+
+    private final List<ArtifactRepositoryListener> listeners;
+
+    public NotifyingRuntimeArtifactRepository(ArtifactRepositoryListener... listeners) {
+        this.listeners = Arrays.asList(listeners);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean add(@NonNull Artifact artifact) {
+        synchronized (this.monitor) {
+            boolean result = this.artifacts.add(artifact);
+            if (result) {
+                for (ArtifactRepositoryListener listener : listeners) {
+                    try {
+                        listener.added(artifact);
+                    } catch (Exception e) {
+                        logger.error(String.format("Exception calling added() on listener '%s'", listener.toString()), e);
+                    }
+                }
+            }
+            return result;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean remove(@NonNull Artifact artifact) {
+        synchronized (this.monitor) {
+            boolean result = this.artifacts.remove(artifact);
+            if (result) {
+                for (ArtifactRepositoryListener listener : listeners) {
+                    try {
+                        listener.removed(artifact);
+                    } catch (Exception e) {
+                        logger.error(String.format("Exception calling removed() on listener '%s'", listener.toString()), e);
+                    }
+                }
+            }
+            return result;
+        }
+    }
+    
+    /**
+     * {@inheritDoc}
+     */
+    public boolean remove(@NonNull String type, @NonNull String name, @NonNull Version version, @NonNull Region region) {
+        synchronized (this.monitor) {
+            Artifact artifact = getArtifact(type, name, version, region);
+            if(artifact != null){
+                return remove(artifact);
+            } else {
+                return false;
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Set<Artifact> getArtifacts() {
+        synchronized (this.monitor) {
+            return new HashSet<Artifact>(this.artifacts);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Artifact getArtifact(@NonNull String type, @NonNull String name, @NonNull Version version, @NonNull Region region) {
+        synchronized (this.monitor) {
+            for (Artifact artifact : this.artifacts) {
+                if (artifact.getType().equals(type) && 
+                    artifact.getName().equals(name) && 
+                    artifact.getVersion().equals(version) &&
+                    artifact.getRegion().getName().equals(region.getName())){
+                    return artifact;
+                }
+            }
+            return null;
+        }
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/SpringContextAccessor.java b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/SpringContextAccessor.java
new file mode 100644
index 0000000..006ec27
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/SpringContextAccessor.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.virgo.kernel.model.internal;
+
+import org.osgi.framework.Bundle;
+
+/**
+ * SpringContextAccessor 
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ * TODO Document concurrent semantics of SpringContextAccessor
+ */
+public interface SpringContextAccessor {
+
+    /**
+     * Inspects the service registry to find out if the {@link Bundle} registers 
+     * a service for a Spring ApplicationContext, must be able to handle multiple 
+     * instances of the Spring framework running in the OSGi framework.
+     * 
+     * @param bundle to inspect
+     * @return true if Spring found
+     */
+    public boolean isSpringPowered(Bundle bundle);
+
+}
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/StandardSpringContextAccessor.java b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/StandardSpringContextAccessor.java
new file mode 100644
index 0000000..e24d66b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/StandardSpringContextAccessor.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * This file is part of the Eclipse Virgo project.
+ *
+ * Copyright (c) 2011 copyright_holder
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    cgfrost - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model.internal;
+
+import org.eclipse.virgo.nano.serviceability.Assert;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * StandardSpringContextAccessor avoids issues of multiple Spring frameworks 
+ * being present by not using any spring types.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread-safe
+ */
+public class StandardSpringContextAccessor implements SpringContextAccessor {
+    
+    private static final String APPLICATION_CONTEXT_CLASS_NAME = "org.springframework.context.ApplicationContext";
+    
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean isSpringPowered(@NonNull Bundle bundle){
+        BundleContext bundleContext = bundle.getBundleContext();
+        if (bundleContext != null) {
+            String symbolicName = bundle.getSymbolicName();
+            try {
+                ServiceReference<?>[] refs = bundleContext.getAllServiceReferences(APPLICATION_CONTEXT_CLASS_NAME, "(Bundle-SymbolicName=" + symbolicName + ")");
+                if (refs != null && refs.length > 0) {
+                    return true;
+                }
+            } catch (InvalidSyntaxException e) {
+                Assert.isFalse(true, "Unexpected exception %s", e.getMessage());
+            }
+        }
+        return false;      
+    }
+    
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/bundle/BundleDependencyDeterminer.java b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/bundle/BundleDependencyDeterminer.java
new file mode 100644
index 0000000..aac4aba
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/bundle/BundleDependencyDeterminer.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model.internal.bundle;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.equinox.region.RegionDigraph;
+import org.eclipse.virgo.kernel.model.Artifact;
+import org.eclipse.virgo.kernel.model.RuntimeArtifactRepository;
+import org.eclipse.virgo.kernel.model.internal.DependencyDeterminer;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiBundle;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiExportPackage;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiFramework;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiFrameworkFactory;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiImportPackage;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiRequiredBundle;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+
+/**
+ * Implementation of {@link DependencyDeterminer} that returns the dependents of a {@link org.osgi.framework.Bundle
+ * Bundle}. The dependents consist of any bundle that has been wired to as a result of <code>Import-Package</code>.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+public final class BundleDependencyDeterminer implements DependencyDeterminer {
+
+    private final QuasiFrameworkFactory quasiFrameworkFactory;
+
+    private final RuntimeArtifactRepository artifactRepository;
+
+    private final RegionDigraph regionDigraph;
+
+    public BundleDependencyDeterminer(@NonNull QuasiFrameworkFactory quasiFrameworkFactory, @NonNull RuntimeArtifactRepository artifactRepository,
+        @NonNull RegionDigraph regionDigraph) {
+        this.quasiFrameworkFactory = quasiFrameworkFactory;
+        this.artifactRepository = artifactRepository;
+        this.regionDigraph = regionDigraph;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Set<Artifact> getDependents(Artifact rootArtifact) {
+        if (!rootArtifact.getType().equalsIgnoreCase("bundle")) {
+            return Collections.<Artifact> emptySet();
+        }
+
+        QuasiBundle rootBundle = getBundle(rootArtifact);
+        if (rootBundle == null) {
+            return Collections.<Artifact> emptySet();
+        }
+
+        Set<Artifact> artifacts = new HashSet<Artifact>();
+        for (QuasiImportPackage importPackage : rootBundle.getImportPackages()) {
+            QuasiExportPackage provider = importPackage.getProvider();
+            if (provider != null) {
+                QuasiBundle bundle = provider.getExportingBundle();
+                addDependentBundle(artifacts, bundle);
+            }
+        }
+
+        addDependents(artifacts, rootBundle.getHosts());
+        
+        List<QuasiRequiredBundle> requiredBundles = rootBundle.getRequiredBundles();
+        if (requiredBundles != null) {
+            for (QuasiRequiredBundle requiredBundle : requiredBundles) {
+                addDependentBundle(artifacts, requiredBundle.getProvider());
+            }
+        }
+
+        return artifacts;
+    }
+
+    public void addDependents(Set<Artifact> artifacts, List<QuasiBundle> dependents) {
+        if (dependents != null) {
+            for (QuasiBundle dependent : dependents) {
+                addDependentBundle(artifacts, dependent);
+            }
+        }
+    }
+
+    public void addDependentBundle(Set<Artifact> artifacts, QuasiBundle bundle) {
+        if (bundle != null) {
+            Artifact artifact = artifactRepository.getArtifact(NativeBundleArtifact.TYPE, bundle.getSymbolicName(), bundle.getVersion(),
+                this.regionDigraph.getRegion(bundle.getBundleId()));
+            artifacts.add(artifact);
+        }
+    }
+
+    private QuasiBundle getBundle(Artifact artifact) {
+        QuasiFramework framework = quasiFrameworkFactory.create();
+        for (QuasiBundle bundle : framework.getBundles()) {
+            if (artifact.getName().equals(bundle.getSymbolicName()) && artifact.getVersion().equals(bundle.getVersion())
+                && artifact.getRegion().getName().equals(this.regionDigraph.getRegion(bundle.getBundleId()).getName())) {
+                return bundle;
+            }
+        }
+        return null;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/bundle/ModelBundleListener.java b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/bundle/ModelBundleListener.java
new file mode 100644
index 0000000..c3bac28
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/bundle/ModelBundleListener.java
@@ -0,0 +1,98 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model.internal.bundle;
+
+import org.eclipse.equinox.region.Region;
+import org.eclipse.equinox.region.RegionDigraph;
+import org.eclipse.virgo.kernel.model.Artifact;
+import org.eclipse.virgo.kernel.model.ArtifactState;
+import org.eclipse.virgo.kernel.model.RuntimeArtifactRepository;
+import org.eclipse.virgo.kernel.model.internal.SpringContextAccessor;
+import org.eclipse.virgo.kernel.osgi.framework.PackageAdminUtil;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleEvent;
+import org.osgi.framework.BundleListener;
+import org.osgi.framework.SynchronousBundleListener;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Implementation of {@link BundleListener} that notices {@link BundleEvent#INSTALLED} and
+ * {@link BundleEvent#UNINSTALLED} events to add and remove respectively {@link Artifact}s from the
+ * {@link RuntimeArtifactRepository}
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+final class ModelBundleListener implements SynchronousBundleListener {
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private final BundleContext bundleContext;
+
+    private final RuntimeArtifactRepository artifactRepository;
+
+    private final PackageAdminUtil packageAdminUtil;
+
+    private final RegionDigraph regionDigraph;
+
+    private final SpringContextAccessor springContextAccessor;
+
+    public ModelBundleListener(@NonNull BundleContext bundleContext, @NonNull RuntimeArtifactRepository artifactRepository, @NonNull PackageAdminUtil packageAdminUtil, @NonNull RegionDigraph regionDigraph, @NonNull SpringContextAccessor springContextAccessor) {
+        this.bundleContext = bundleContext;
+        this.artifactRepository = artifactRepository;
+        this.packageAdminUtil = packageAdminUtil;
+        this.regionDigraph = regionDigraph;
+        this.springContextAccessor = springContextAccessor;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void bundleChanged(BundleEvent event) {
+        if (BundleEvent.INSTALLED == event.getType()) {
+            processInstalled(event);
+        } else if (BundleEvent.UNINSTALLED == event.getType()) {
+            processUninstalled(event);
+        }
+    }
+
+    private void processInstalled(BundleEvent event) {
+        Bundle bundle = event.getBundle();
+        Region region = this.regionDigraph.getRegion(bundle);
+        logger.info("Processing installed event for bundle '{}:{}' in region '{}'", new Object[] {bundle.getSymbolicName(), bundle.getVersion().toString(), region.getName()});
+        this.artifactRepository.add(new NativeBundleArtifact(this.bundleContext, this.packageAdminUtil, bundle, region, this.springContextAccessor));
+    }
+
+    private void processUninstalled(BundleEvent event) {
+        Bundle bundle = event.getBundle();
+        for (Artifact artifact : this.artifactRepository.getArtifacts()) {
+            if (artifact.getType().equals(NativeBundleArtifact.TYPE) && 
+                artifact.getName().equals(bundle.getSymbolicName()) && 
+                artifact.getVersion().equals(bundle.getVersion()) ){
+                if(artifact instanceof NativeBundleArtifact){
+                    NativeBundleArtifact bundleArtifact = (NativeBundleArtifact) artifact;
+                    if(ArtifactState.UNINSTALLED == bundleArtifact.getState()){
+                        this.artifactRepository.remove(bundleArtifact);
+                        logger.info("Processing uninstalled event for bundle '{}:{}' from region '{}'", new Object[] {bundleArtifact.getName(), bundleArtifact.getVersion().toString(), bundleArtifact.getRegion().getName()});
+                    }
+                }
+            }
+        }
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/bundle/ModelBundleListenerInitializer.java b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/bundle/ModelBundleListenerInitializer.java
new file mode 100644
index 0000000..7fe3688
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/bundle/ModelBundleListenerInitializer.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model.internal.bundle;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+
+import org.eclipse.equinox.region.RegionDigraph;
+import org.eclipse.virgo.kernel.model.RuntimeArtifactRepository;
+import org.eclipse.virgo.kernel.model.internal.SpringContextAccessor;
+import org.eclipse.virgo.kernel.osgi.framework.PackageAdminUtil;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleListener;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * An initializer responsible for registering a {@link ModelBundleListener} and enumerating any existing {@link Bundle}
+ * objects from the OSGi Framework.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread safe
+ * 
+ * @see ModelBundleListener
+ */
+public final class ModelBundleListenerInitializer {
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private final RuntimeArtifactRepository artifactRepository;
+
+    private final PackageAdminUtil packageAdminUtil;
+
+    private final BundleContext kernelBundleContext;
+
+    private final BundleListener bundleListener;
+
+    private final RegionDigraph regionDigraph;
+
+    private final SpringContextAccessor springContextAccessor;
+
+    public ModelBundleListenerInitializer(@NonNull RuntimeArtifactRepository artifactRepository, @NonNull PackageAdminUtil packageAdminUtil, @NonNull BundleContext kernelBundleContext, @NonNull RegionDigraph regionDigraph, @NonNull SpringContextAccessor springContextAccessor) {
+        this.artifactRepository = artifactRepository;
+        this.packageAdminUtil = packageAdminUtil;
+        this.kernelBundleContext = kernelBundleContext;
+        this.bundleListener = new ModelBundleListener(kernelBundleContext, artifactRepository, packageAdminUtil, regionDigraph, springContextAccessor);
+        this.regionDigraph = regionDigraph;
+        this.springContextAccessor = springContextAccessor;
+    }
+
+    /**
+     * Registers a {@link BundleListener} with the OSGi framework. Enumerates any existing {@link Bundle}s that exist
+     * in the user region.
+     */
+    @PostConstruct
+    public void initialize() {
+        BundleContext systemBundleContext = getSystemBundleContext();
+        // Register the listener with the system bundle context to see all bundles in all regions.
+       systemBundleContext.addBundleListener(this.bundleListener);
+        // Find bundles that the listener has almost certainly missed.
+        for (Bundle bundle : systemBundleContext.getBundles()) {
+            try {
+                this.artifactRepository.add(new NativeBundleArtifact(this.kernelBundleContext, this.packageAdminUtil, bundle, this.regionDigraph.getRegion(bundle), this.springContextAccessor));
+            } catch (Exception e) {
+                this.logger.error(String.format("Exception adding bundle '%s:%s' to the repository", bundle.getSymbolicName(),
+                    bundle.getVersion().toString()), e);
+            }
+        }
+    }
+
+    private BundleContext getSystemBundleContext() {
+        BundleContext systemBundleContext = this.kernelBundleContext.getBundle(0L).getBundleContext();
+        return systemBundleContext;
+    }
+
+    /**
+     * Unregisters the listener from the OSGi framework
+     */
+    @PreDestroy
+    public void destroy() {
+        getSystemBundleContext().removeBundleListener(this.bundleListener);
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/bundle/NativeBundleArtifact.java b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/bundle/NativeBundleArtifact.java
new file mode 100644
index 0000000..e8e0c25
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/bundle/NativeBundleArtifact.java
@@ -0,0 +1,145 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model.internal.bundle;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.equinox.region.Region;
+import org.eclipse.virgo.kernel.model.Artifact;
+import org.eclipse.virgo.kernel.model.ArtifactState;
+import org.eclipse.virgo.kernel.model.internal.AbstractArtifact;
+import org.eclipse.virgo.kernel.model.internal.SpringContextAccessor;
+import org.eclipse.virgo.kernel.osgi.framework.PackageAdminUtil;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Implementation of {@link Artifact} that delegates to an OSGi native bundle, this is in comparison 
+ * to a {@link DeployerBundleArtifact} which delegates to a Kernel {@link InstallArtifact}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+final class NativeBundleArtifact extends AbstractArtifact {
+
+    static final String TYPE = "bundle";
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private final PackageAdminUtil packageAdminUtil;
+
+    private final Bundle bundle;
+
+    private final SpringContextAccessor springContextAccessor;
+    
+    public NativeBundleArtifact(@NonNull BundleContext bundleContext, @NonNull PackageAdminUtil packageAdminUtil, @NonNull Bundle bundle, @NonNull Region region, @NonNull SpringContextAccessor springContextAccessor) {
+        super(bundleContext, TYPE, bundle.getSymbolicName(), bundle.getVersion(), region);
+        this.packageAdminUtil = packageAdminUtil;
+        this.bundle = bundle;
+        this.springContextAccessor = springContextAccessor;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public ArtifactState getState() {
+        return mapBundleState(this.bundle.getState());
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Map<String, String> getProperties() {
+        Map<String, String> properties = new HashMap<String, String>();
+        properties.put("Bundle Id", String.valueOf(this.bundle.getBundleId()));
+        properties.put("Spring", String.valueOf(this.springContextAccessor.isSpringPowered(bundle)));
+        return Collections.unmodifiableMap(properties);
+    }
+    
+    /**
+     * {@inheritDoc}
+     */
+    public boolean refresh() {
+        try {
+            this.bundle.update();
+            this.packageAdminUtil.synchronouslyRefreshPackages(new Bundle[] { this.bundle });
+            return true;
+        } catch (BundleException e) {
+            logger.error("Unable to update bundle '{}:{}'", this.bundle.getSymbolicName(), this.bundle.getVersion());
+            throw new RuntimeException(String.format("Unable to update bundle '%s:%s'", this.bundle.getSymbolicName(), this.bundle.getVersion()), e);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void start() {
+        try {
+            this.bundle.start();
+        } catch (BundleException e) {
+            logger.error("Unable to start bundle '{}:{}'", this.bundle.getSymbolicName(), this.bundle.getVersion());
+            throw new RuntimeException(String.format("Unable to start bundle '%s:%s'", this.bundle.getSymbolicName(), this.bundle.getVersion()), e);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void stop() {
+        try {
+            this.bundle.stop();
+        } catch (BundleException e) {
+            logger.error("Unable to stop bundle '{}:{}'", this.bundle.getSymbolicName(), this.bundle.getVersion());
+            throw new RuntimeException(String.format("Unable to stop bundle '%s:%s'", this.bundle.getSymbolicName(), this.bundle.getVersion()), e);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void uninstall() {
+        try {
+            this.bundle.uninstall();
+        } catch (BundleException e) {
+            logger.error("Unable to uninstall bundle '{}:{}'", this.bundle.getSymbolicName(), this.bundle.getVersion());
+            throw new RuntimeException(String.format("Unable to uninstall bundle '%s:%s'", this.bundle.getSymbolicName(), this.bundle.getVersion()), e);
+        }
+    }
+
+    static ArtifactState mapBundleState(int state) {
+        if (Bundle.UNINSTALLED == state) {
+            return ArtifactState.UNINSTALLED;
+        } else if (Bundle.INSTALLED == state) {
+            return ArtifactState.INSTALLED;
+        } else if (Bundle.RESOLVED == state) {
+            return ArtifactState.RESOLVED;
+        } else if (Bundle.STARTING == state) {
+            return ArtifactState.STARTING;
+        } else if (Bundle.STOPPING == state) {
+            return ArtifactState.STOPPING;
+        } else if (Bundle.ACTIVE == state) {
+            return ArtifactState.ACTIVE;
+        } else {
+            throw new IllegalArgumentException(String.format("Unknown bundle state '%d'", state));
+        }
+    }
+    
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/configurationadmin/ConfigurationArtifact.java b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/configurationadmin/ConfigurationArtifact.java
new file mode 100644
index 0000000..1d612c4
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/configurationadmin/ConfigurationArtifact.java
@@ -0,0 +1,122 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model.internal.configurationadmin;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.equinox.region.Region;
+import org.eclipse.virgo.kernel.model.Artifact;
+import org.eclipse.virgo.kernel.model.ArtifactState;
+import org.eclipse.virgo.kernel.model.internal.AbstractArtifact;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Version;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * Implementation of {@link Artifact} that delegates to a Configuration Admin {@link Configuration}
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+final class ConfigurationArtifact extends AbstractArtifact {
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    static final String TYPE = "configuration";
+
+    private final ConfigurationAdmin configurationAdmin;
+
+    private final String pid;
+
+    public ConfigurationArtifact(@NonNull BundleContext bundleContext, @NonNull ConfigurationAdmin configurationAdmin, @NonNull String pid, @NonNull Region region) {
+        super(bundleContext, TYPE, pid, Version.emptyVersion, region);
+        this.configurationAdmin = configurationAdmin;
+        this.pid = pid;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public ArtifactState getState() {
+        return ArtifactState.ACTIVE;
+    }
+    
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public Map<String, String> getProperties() {
+        Map<String, String> properties = new HashMap<String, String>(super.getProperties());
+        try {
+            Configuration configuration = this.configurationAdmin.getConfiguration(this.pid, null);
+            properties.put("Pid", configuration.getPid());
+            String factoryPid = configuration.getFactoryPid();
+            if(factoryPid != null){
+            	properties.put("Factory Pid", factoryPid);
+            }
+            String bundleLocation = configuration.getBundleLocation();
+            if(bundleLocation != null){
+            	properties.put("Bound to Bundle", bundleLocation);
+            }
+        } catch (IOException ignored) {
+            // Default to superclass behaviour
+        } catch (IllegalStateException e){
+        	properties.put("ERROR", "Configuration has been deleted");
+        }
+        return properties;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean refresh() {
+        return false;
+        // Do nothing for a Configuration
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void start() {
+        // Do nothing for a Configuration
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void stop() {
+        // Do nothing for a Configuration
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void uninstall() {
+        try {
+            this.configurationAdmin.getConfiguration(this.pid, null).delete();
+        } catch (IOException e) {
+            logger.error("Unable to delete configuration for '{}'", this.pid);
+            throw new RuntimeException(String.format("Unable to delete configuration for '%s'", this.pid), e);
+        }
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/configurationadmin/ModelConfigurationListener.java b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/configurationadmin/ModelConfigurationListener.java
new file mode 100644
index 0000000..61e189b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/configurationadmin/ModelConfigurationListener.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model.internal.configurationadmin;
+
+import org.eclipse.virgo.kernel.model.Artifact;
+import org.eclipse.virgo.kernel.model.RuntimeArtifactRepository;
+import org.eclipse.equinox.region.Region;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Version;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.cm.ConfigurationEvent;
+import org.osgi.service.cm.ConfigurationListener;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * Implementation of {@link ConfigurationListener} that notices {@link ConfigurationEvent#CM_UPDATED} and
+ * {@link ConfigurationEvent#CM_DELETED} events to add and remove respectively {@link Artifact}s from the
+ * {@link RuntimeArtifactRepository}
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+final class ModelConfigurationListener implements ConfigurationListener {
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private final RuntimeArtifactRepository artifactRepository;
+
+    private final BundleContext bundleContext;
+
+    private final ConfigurationAdmin configurationAdmin;
+
+    private final Region independentRegion;
+
+    public ModelConfigurationListener(@NonNull RuntimeArtifactRepository artifactRepository, @NonNull BundleContext bundleContext, @NonNull ConfigurationAdmin configurationAdmin, @NonNull Region independentRegion) {
+        this.artifactRepository = artifactRepository;
+        this.bundleContext = bundleContext;
+        this.configurationAdmin = configurationAdmin;
+        this.independentRegion = independentRegion;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void configurationEvent(ConfigurationEvent event) {
+        if (ConfigurationEvent.CM_UPDATED == event.getType()) {
+            processUpdate(event);
+        } else if (ConfigurationEvent.CM_DELETED == event.getType()) {
+            processDelete(event);
+        }
+    }
+
+    private void processUpdate(ConfigurationEvent event) {
+        logger.info("Processing update event for '{}'", event.getPid());
+        this.artifactRepository.add(createArtifact(event));
+    }
+
+    private void processDelete(ConfigurationEvent event) {
+        logger.info("Processing delete event for '{}'", event.getPid());
+
+        Artifact artifact = this.artifactRepository.getArtifact(ConfigurationArtifact.TYPE, event.getPid(), Version.emptyVersion, independentRegion);
+        if (artifact instanceof ConfigurationArtifact) {
+            this.artifactRepository.remove(ConfigurationArtifact.TYPE, event.getPid(), Version.emptyVersion, independentRegion);
+        }
+    }
+
+    private ConfigurationArtifact createArtifact(ConfigurationEvent event) {
+        return new ConfigurationArtifact(this.bundleContext, this.configurationAdmin, event.getPid(), independentRegion);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/configurationadmin/ModelConfigurationListenerInitializer.java b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/configurationadmin/ModelConfigurationListenerInitializer.java
new file mode 100644
index 0000000..3714ed9
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/configurationadmin/ModelConfigurationListenerInitializer.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model.internal.configurationadmin;
+
+import java.io.IOException;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+
+import org.eclipse.equinox.region.Region;
+import org.eclipse.virgo.kernel.model.RuntimeArtifactRepository;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.eclipse.virgo.util.osgi.ServiceRegistrationTracker;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.cm.ConfigurationListener;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * An initializer responsible for registering a {@link ModelConfigurationListener} and enumerating any existing
+ * {@link Configuration} objects from {@link ConfigurationAdmin}
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ * @see ModelConfigurationListener
+ */
+public final class ModelConfigurationListenerInitializer {
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private final ServiceRegistrationTracker registrationTracker = new ServiceRegistrationTracker();
+
+    private final RuntimeArtifactRepository artifactRepository;
+
+    private final BundleContext bundleContext;
+
+    private final ConfigurationAdmin configurationAdmin;
+
+    private final Region globalRegion;
+
+    public ModelConfigurationListenerInitializer(@NonNull RuntimeArtifactRepository artifactRepository, @NonNull BundleContext bundleContext, @NonNull ConfigurationAdmin configurationAdmin, @NonNull Region globalRegion) {
+        this.artifactRepository = artifactRepository;
+        this.bundleContext = bundleContext;
+        this.configurationAdmin = configurationAdmin;
+        this.globalRegion = globalRegion;
+    }
+
+    /**
+     * Registers a {@link ModelConfigurationListener} with the service registry. Enumerates any existing
+     * {@link Configuration} objects that exist from {@link ConfigurationAdmin}.
+     * 
+     * @throws IOException
+     * @throws InvalidSyntaxException
+     */
+    @PostConstruct
+    public void initialize() throws IOException, InvalidSyntaxException {
+        ModelConfigurationListener configurationListener = new ModelConfigurationListener(artifactRepository, bundleContext, configurationAdmin, globalRegion);
+        this.registrationTracker.track(this.bundleContext.registerService(ConfigurationListener.class.getCanonicalName(), configurationListener, null));
+        Configuration[] configurations = this.configurationAdmin.listConfigurations(null);
+        if (configurations != null) {
+            for (Configuration configuration : configurations) {
+                try {
+                    this.artifactRepository.add(new ConfigurationArtifact(bundleContext, configurationAdmin, configuration.getPid(), globalRegion));
+                } catch (Exception e) {
+                    logger.error(String.format("Exception adding configuration '%s' to the repository", configuration.getPid()), e);
+                }
+            }
+        }
+    }
+
+    /**
+     * Unregisters the listener from the service registry
+     */
+    @PreDestroy
+    public void destroy() {
+        this.registrationTracker.unregisterAll();
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/deployer/DeployerArtifact.java b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/deployer/DeployerArtifact.java
new file mode 100644
index 0000000..b7bb852
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/deployer/DeployerArtifact.java
@@ -0,0 +1,152 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model.internal.deployer;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.equinox.region.Region;
+import org.eclipse.virgo.nano.core.BlockingAbortableSignal;
+import org.eclipse.virgo.nano.core.FailureSignalledException;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact.State;
+import org.eclipse.virgo.kernel.model.Artifact;
+import org.eclipse.virgo.kernel.model.ArtifactState;
+import org.eclipse.virgo.kernel.model.internal.AbstractArtifact;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.osgi.framework.BundleContext;
+
+/**
+ * Implementation of {@link Artifact} that delegates to a Kernel {@link InstallArtifact}
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+class DeployerArtifact extends AbstractArtifact {
+
+    private final InstallArtifact installArtifact;
+    
+    public DeployerArtifact(@NonNull BundleContext bundleContext, @NonNull InstallArtifact installArtifact, Region region) {
+        super(bundleContext, installArtifact.getType(), installArtifact.getName(), installArtifact.getVersion(), region);
+        this.installArtifact = installArtifact;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public final ArtifactState getState() {
+        return mapInstallArtifactState(this.installArtifact.getState());
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public final void start() {
+        try {
+            BlockingAbortableSignal signal = new BlockingAbortableSignal();
+            this.installArtifact.start(signal);
+            try {
+                if (!signal.awaitCompletion(5, TimeUnit.MINUTES)) {
+                	if(signal.isAborted()){
+                		throw new RuntimeException("Started aborted");
+                	} else {
+                		throw new RuntimeException("Started failed");
+                	}
+                }
+            } catch (FailureSignalledException fse) {
+                throw new RuntimeException(fse.getCause());
+            }
+        } catch (DeploymentException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public final void stop() {
+        try {
+            this.installArtifact.stop();
+        } catch (DeploymentException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public final void uninstall() {
+        try {
+            this.installArtifact.uninstall();
+        } catch (DeploymentException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public final boolean refresh() {
+        try {
+            return this.installArtifact.refresh();
+        } catch (DeploymentException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Map<String, String> getProperties() {
+        Set<String> propertyNames = this.installArtifact.getPropertyNames();
+        Map<String, String> result = new HashMap<String, String>(propertyNames.size());
+        for (String propertyName : propertyNames) {
+            String propertyValue = this.installArtifact.getProperty(propertyName);
+            // The property may have been deleted concurrently.
+            if (propertyValue != null) {
+                result.put(propertyName, propertyValue);
+            }
+        }
+        return Collections.unmodifiableMap(result);
+    }
+
+    private ArtifactState mapInstallArtifactState(State state) {
+        if (State.INITIAL == state) {
+            return ArtifactState.INITIAL;
+        } else if (State.INSTALLING == state) {
+            return ArtifactState.INSTALLING;
+        } else if (State.INSTALLED == state) {
+            return ArtifactState.INSTALLED;
+        } else if (State.RESOLVING == state) {
+            return ArtifactState.RESOLVING;
+        } else if (State.RESOLVED == state) {
+            return ArtifactState.RESOLVED;
+        } else if (State.STARTING == state) {
+            return ArtifactState.STARTING;
+        } else if (State.ACTIVE == state) {
+            return ArtifactState.ACTIVE;
+        } else if (State.STOPPING == state) {
+            return ArtifactState.STOPPING;
+        } else if (State.UNINSTALLING == state) {
+            return ArtifactState.UNINSTALLING;
+        } else {
+            return ArtifactState.UNINSTALLED;
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/deployer/DeployerBundleArtifact.java b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/deployer/DeployerBundleArtifact.java
new file mode 100644
index 0000000..bf18e8f
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/deployer/DeployerBundleArtifact.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model.internal.deployer;
+
+import java.net.URI;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.equinox.region.Region;
+import org.eclipse.virgo.kernel.install.artifact.BundleInstallArtifact;
+import org.eclipse.virgo.kernel.model.BundleArtifact;
+import org.eclipse.virgo.kernel.model.internal.SpringContextAccessor;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+
+final class DeployerBundleArtifact extends DeployerArtifact implements BundleArtifact {
+
+    private final BundleInstallArtifact installArtifact;
+    
+    private SpringContextAccessor springContextAccessor;
+
+    public DeployerBundleArtifact(@NonNull BundleContext bundleContext, @NonNull BundleInstallArtifact installArtifact, @NonNull Region region, @NonNull SpringContextAccessor springContextAccessor) {
+        super(bundleContext, installArtifact, region);
+        this.installArtifact = installArtifact;
+        this.springContextAccessor = springContextAccessor;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void deleteEntry(String targetPath) {
+        this.installArtifact.deleteEntry(targetPath);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void updateEntry(String inputPath, String targetPath) {
+        this.installArtifact.updateEntry(URI.create(inputPath), targetPath);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public final Map<String, String> getProperties() {
+        Map<String, String> parentProperties = super.getProperties();
+        Map<String, String> properties = new HashMap<String, String>();
+        properties.putAll(parentProperties);
+        Bundle bundle = this.installArtifact.getBundle();
+        properties.put("Bundle Id", String.valueOf(bundle.getBundleId()));
+        properties.put("Spring", String.valueOf(this.springContextAccessor.isSpringPowered(bundle)));
+        return Collections.unmodifiableMap(properties);
+    }
+    
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/deployer/DeployerCompositeArtifact.java b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/deployer/DeployerCompositeArtifact.java
new file mode 100644
index 0000000..9d2685a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/deployer/DeployerCompositeArtifact.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model.internal.deployer;
+
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.osgi.framework.BundleContext;
+
+import org.eclipse.virgo.kernel.install.artifact.PlanInstallArtifact;
+import org.eclipse.virgo.kernel.model.CompositeArtifact;
+import org.eclipse.equinox.region.Region;
+
+/**
+ * Implementation of {@link CompositeArtifact} that delegates to a Kernel {@link PlanInstallArtifact}
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+final class DeployerCompositeArtifact extends DeployerArtifact implements CompositeArtifact {
+
+    private final PlanInstallArtifact installArtifact;
+
+    public DeployerCompositeArtifact(@NonNull BundleContext bundleContext, @NonNull PlanInstallArtifact installArtifact, @NonNull Region region) {
+        super(bundleContext, installArtifact, region);
+        this.installArtifact = installArtifact;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isAtomic() {
+        return this.installArtifact.isAtomic();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isScoped() {
+        return this.installArtifact.isScoped();
+    }
+
+    /**
+     * Gets the underlying {@link PlanInstallArtifact} encapsulated by this {@link DeployerCompositeArtifact}
+     * 
+     * @return The underlying {@link PlanInstallArtifact}
+     */
+    PlanInstallArtifact getInstallArtifact() {
+        return this.installArtifact;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/deployer/DeployerCompositeArtifactDependencyDeterminer.java b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/deployer/DeployerCompositeArtifactDependencyDeterminer.java
new file mode 100644
index 0000000..69627ab
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/deployer/DeployerCompositeArtifactDependencyDeterminer.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model.internal.deployer;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.equinox.region.Region;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.model.Artifact;
+import org.eclipse.virgo.kernel.model.RuntimeArtifactRepository;
+import org.eclipse.virgo.kernel.model.internal.DependencyDeterminer;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.eclipse.virgo.util.common.GraphNode;
+
+/**
+ * Implementation of {@link DependencyDeterminer} that returns the dependent of a <code>Plan</code>. The dependents
+ * consist of the artifacts specified in the plan.
+ * <p />
+ * This class makes the assumption that the children of a composite artifact will always be in the same region as the parent.
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+public final class DeployerCompositeArtifactDependencyDeterminer implements DependencyDeterminer {
+
+    private final RuntimeArtifactRepository artifactRepository;
+    
+    private final Region globalRegion;
+    
+    private final Region userRegion;
+
+    public DeployerCompositeArtifactDependencyDeterminer(@NonNull RuntimeArtifactRepository artifactRepository, @NonNull Region userRegion, @NonNull Region globalRegion) {
+        this.artifactRepository = artifactRepository;
+        this.userRegion = userRegion;
+        this.globalRegion = globalRegion;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Set<Artifact> getDependents(Artifact rootArtifact) {
+        if (!(rootArtifact instanceof DeployerCompositeArtifact)) {
+            return Collections.<Artifact> emptySet();
+        }
+
+        final Set<Artifact> dependents = new HashSet<Artifact>();
+        List<GraphNode<InstallArtifact>> children = ((DeployerCompositeArtifact) rootArtifact).getInstallArtifact().getGraph().getChildren();
+        for (GraphNode<InstallArtifact> child : children) {
+            InstallArtifact artifact = child.getValue();
+            if(artifact.getType().equalsIgnoreCase("bundle")){
+                dependents.add(this.artifactRepository.getArtifact(artifact.getType(), artifact.getName(), artifact.getVersion(), this.userRegion));
+            }else{
+                dependents.add(this.artifactRepository.getArtifact(artifact.getType(), artifact.getName(), artifact.getVersion(), this.globalRegion));
+            }
+        }
+
+        return dependents;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/deployer/DeployerConfigArtifact.java b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/deployer/DeployerConfigArtifact.java
new file mode 100644
index 0000000..fbccfa5
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/deployer/DeployerConfigArtifact.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model.internal.deployer;
+
+import java.io.IOException;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+import org.eclipse.equinox.region.Region;
+import org.eclipse.virgo.kernel.install.artifact.ConfigInstallArtifact;
+import org.osgi.framework.BundleContext;
+
+
+/**
+ * {@link DeployerConfigArtifact} is a {@link DeployerArtifact} that understands
+ * a configuration install artifact's properties.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread safe.
+ */
+final class DeployerConfigArtifact extends DeployerArtifact {
+
+    private final ConfigInstallArtifact configInstallArtifact;
+
+    public DeployerConfigArtifact(BundleContext bundleContext, ConfigInstallArtifact configInstallArtifact, Region region) {
+        super(bundleContext, configInstallArtifact, region);
+        this.configInstallArtifact = configInstallArtifact;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public Map<String, String> getProperties() {
+        Map<String, String> properties = new HashMap<String, String>(super.getProperties());
+        try {
+            Properties props = this.configInstallArtifact.getProperties();
+            Enumeration<Object> keys = props.keys();
+            while (keys.hasMoreElements()) {
+                Object key = keys.nextElement();
+                if (key instanceof String) {
+                    Object value = props.get(key);
+                    if (value instanceof String) {
+                        properties.put((String)key, (String)value);
+                    }
+                }
+            }
+        } catch (IOException ignored) {
+            // Default to superclass behaviour
+        }
+        return properties;
+    }
+
+   
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/deployer/ModelInstallArtifactLifecycleListener.java b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/deployer/ModelInstallArtifactLifecycleListener.java
new file mode 100644
index 0000000..0d29aef
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/deployer/ModelInstallArtifactLifecycleListener.java
@@ -0,0 +1,150 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model.internal.deployer;
+
+import org.eclipse.equinox.region.RegionDigraph;
+import org.eclipse.equinox.region.Region;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.BundleInstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.ConfigInstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifactLifecycleListener;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifactLifecycleListenerSupport;
+import org.eclipse.virgo.kernel.install.artifact.PlanInstallArtifact;
+import org.eclipse.virgo.kernel.model.Artifact;
+import org.eclipse.virgo.kernel.model.BundleArtifact;
+import org.eclipse.virgo.kernel.model.RuntimeArtifactRepository;
+import org.eclipse.virgo.kernel.model.internal.SpringContextAccessor;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.osgi.framework.BundleContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Implementation of {@link InstallArtifactLifecycleListener} that notices
+ * {@link InstallArtifactLifecycleListener#onInstalling(InstallArtifact)} and
+ * {@link InstallArtifactLifecycleListener#onUninstalled(InstallArtifact)} calls to add and remove respectively
+ * {@link Artifact}s from the {@link RuntimeArtifactRepository}
+ * <p />
+ * An existing artifact with the same type, name, and version as the incoming artifact is not replaced except in the
+ * case of a bundle. An existing {@link BundleArtifact} is replaced by an incoming {@link DeployerBundleArtifact}. This
+ * prevents the RAM being corrupted if an attempt it made to install an artifact which belongs to an existing install
+ * tree. See {@link TreeRestrictingInstallArtifactLifecycleListener}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+class ModelInstallArtifactLifecycleListener extends InstallArtifactLifecycleListenerSupport {
+
+    private static final String USER_REGION_NAME = "org.eclipse.virgo.region.user";
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private final RuntimeArtifactRepository artifactRepository;
+
+    private final BundleContext bundleContext;
+
+    private final RegionDigraph regionDigraph;
+
+    private final Region globalRegion;
+
+    private final SpringContextAccessor springContextAccessor;
+
+    public ModelInstallArtifactLifecycleListener(@NonNull BundleContext bundleContext, @NonNull RuntimeArtifactRepository artifactRepository,
+        @NonNull RegionDigraph regionDigraph, @NonNull Region globalRegion, @NonNull SpringContextAccessor springContextAccessor) {
+        this.bundleContext = bundleContext;
+        this.artifactRepository = artifactRepository;
+        this.regionDigraph = regionDigraph;
+        this.springContextAccessor = springContextAccessor;
+        this.globalRegion = globalRegion;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void onInstalling(InstallArtifact installArtifact) throws DeploymentException {
+        logEvent("installing", installArtifact);
+        if (installArtifact instanceof PlanInstallArtifact) {
+            addPlan((PlanInstallArtifact) installArtifact);
+        } else if (installArtifact instanceof BundleInstallArtifact) {
+            addOrReplaceBundle((BundleInstallArtifact) installArtifact);
+        } else if (installArtifact instanceof ConfigInstallArtifact) {
+            addConfiguration((ConfigInstallArtifact) installArtifact);
+        } else {
+            addArtifact(installArtifact);
+        }
+    }
+
+    private void addConfiguration(ConfigInstallArtifact configInstallArtifact) {
+        this.artifactRepository.add(new DeployerConfigArtifact(this.bundleContext, configInstallArtifact, this.globalRegion));
+    }
+
+    private void addPlan(PlanInstallArtifact planInstallArtifact) {
+        this.artifactRepository.add(new DeployerCompositeArtifact(this.bundleContext, planInstallArtifact, this.globalRegion));
+    }
+
+    private void addOrReplaceBundle(BundleInstallArtifact bundleInstallArtifact) {
+        Artifact existingBundleArtifact = this.artifactRepository.getArtifact(bundleInstallArtifact.getType(), bundleInstallArtifact.getName(),
+            bundleInstallArtifact.getVersion(), getRegion(USER_REGION_NAME));
+        if (!(existingBundleArtifact instanceof DeployerBundleArtifact)) {
+            remove(bundleInstallArtifact);
+            this.artifactRepository.add(new DeployerBundleArtifact(this.bundleContext, bundleInstallArtifact, getRegion(USER_REGION_NAME),
+                this.springContextAccessor));
+        }
+    }
+
+    private void addArtifact(InstallArtifact installArtifact) {
+        this.artifactRepository.add(new DeployerArtifact(this.bundleContext, installArtifact, this.globalRegion));
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void onInstallFailed(InstallArtifact installArtifact) throws DeploymentException {
+        logEvent("install failed", installArtifact);
+        remove(installArtifact);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void onUninstalled(InstallArtifact installArtifact) throws DeploymentException {
+        logEvent("uninstalled", installArtifact);
+        remove(installArtifact);
+    }
+
+    private void logEvent(String event, InstallArtifact installArtifact) {
+        this.logger.info("Processing " + event + " event for {} '{}' version '{}'", installArtifact.getType(), installArtifact.getName(),
+            installArtifact.getVersion().toString());
+    }
+
+    private void remove(InstallArtifact installArtifact) {
+        if (installArtifact instanceof BundleInstallArtifact) {
+            this.artifactRepository.remove(installArtifact.getType(), installArtifact.getName(), installArtifact.getVersion(),
+                getRegion(USER_REGION_NAME));
+        } else {
+            this.artifactRepository.remove(installArtifact.getType(), installArtifact.getName(), installArtifact.getVersion(), this.globalRegion);
+        }
+    }
+
+    private Region getRegion(String name) {
+        return this.regionDigraph.getRegion(name);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/deployer/ModelInstallArtifactLifecycleListenerInitializer.java b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/deployer/ModelInstallArtifactLifecycleListenerInitializer.java
new file mode 100644
index 0000000..6de71a0
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/internal/deployer/ModelInstallArtifactLifecycleListenerInitializer.java
@@ -0,0 +1,111 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model.internal.deployer;
+
+import javax.annotation.PostConstruct;
+
+import org.eclipse.equinox.region.RegionDigraph;
+import org.eclipse.equinox.region.Region;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.eclipse.virgo.kernel.deployer.model.RuntimeArtifactModel;
+import org.eclipse.virgo.kernel.install.artifact.BundleInstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifactLifecycleListener;
+import org.eclipse.virgo.kernel.install.artifact.PlanInstallArtifact;
+import org.eclipse.virgo.kernel.model.RuntimeArtifactRepository;
+import org.eclipse.virgo.kernel.model.internal.SpringContextAccessor;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.eclipse.virgo.util.osgi.ServiceRegistrationTracker;
+import org.osgi.framework.BundleContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * An initializer responsible for registering a {@link ModelInstallArtifactLifecycleListener} and enumerating any
+ * existing {@link InstallArtifact} objects from the Kernel deployer
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread safe.
+ * 
+ * @see ModelInstallArtifactLifecycleListener
+ */
+public final class ModelInstallArtifactLifecycleListenerInitializer {
+
+    private static final String USER_REGION_NAME = "org.eclipse.virgo.region.user";
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private final RuntimeArtifactRepository artifactRepository;
+
+    private final BundleContext bundleContext;
+
+    private final RuntimeArtifactModel runtimeArtifactModel;
+
+    private final ServiceRegistrationTracker registrationTracker = new ServiceRegistrationTracker();
+
+    private final RegionDigraph regionDigraph;
+
+    private final Region globalRegion;
+    
+    private final SpringContextAccessor springContextAccessor;
+
+    public ModelInstallArtifactLifecycleListenerInitializer(@NonNull RuntimeArtifactRepository artifactRepository, @NonNull BundleContext bundleContext, @NonNull RuntimeArtifactModel runtimeArtifactModel, @NonNull RegionDigraph regionDigraph, @NonNull Region globalRegion, @NonNull SpringContextAccessor springContextAccessor) {
+        this.artifactRepository = artifactRepository;
+        this.bundleContext = bundleContext;
+        this.runtimeArtifactModel = runtimeArtifactModel;
+        this.regionDigraph = regionDigraph;
+        this.globalRegion = globalRegion;
+        this.springContextAccessor = springContextAccessor;
+    }
+
+    /**
+     * Registers a {@link ModelInstallArtifactLifecycleListener} with the service registry. Enumerates any existing
+     * {@link InstallArtifact} objects that exist from the Kernel deployer
+     */
+    @PostConstruct
+    public void initialize() {
+        ModelInstallArtifactLifecycleListener listener = new ModelInstallArtifactLifecycleListener(this.bundleContext, this.artifactRepository, this.regionDigraph, this.globalRegion, this.springContextAccessor);
+        this.registrationTracker.track(this.bundleContext.registerService(InstallArtifactLifecycleListener.class.getCanonicalName(), listener, null));
+        for (DeploymentIdentity deploymentIdentity : this.runtimeArtifactModel.getDeploymentIdentities()) {
+            InstallArtifact installArtifact = this.runtimeArtifactModel.get(deploymentIdentity);
+            try {
+                if (installArtifact instanceof PlanInstallArtifact) {
+                    this.artifactRepository.add(new DeployerCompositeArtifact(this.bundleContext, (PlanInstallArtifact) installArtifact, this.globalRegion));
+                } else if (installArtifact instanceof BundleInstallArtifact) {
+                    this.artifactRepository.remove(installArtifact.getType(), installArtifact.getName(), installArtifact.getVersion(), getRegion(USER_REGION_NAME));
+                    BundleInstallArtifact bundleInstallArtifact = (BundleInstallArtifact) installArtifact;
+                    this.artifactRepository.add(new DeployerBundleArtifact(this.bundleContext, bundleInstallArtifact, getRegion(USER_REGION_NAME), this.springContextAccessor));
+                } else {
+                    this.artifactRepository.remove(installArtifact.getType(), installArtifact.getName(), installArtifact.getVersion(), null);
+                    this.artifactRepository.add(new DeployerArtifact(this.bundleContext, installArtifact, this.globalRegion));
+                }
+            } catch (Exception e) {
+                logger.error(String.format("Exception adding deployer artifact '%s:%s' to the repository", installArtifact.getName(),
+                    installArtifact.getVersion().toString()), e);
+            }
+        }
+    }
+
+    /**
+     * Unregisters the listener from the service registry
+     */
+    public void destroy() {
+        this.registrationTracker.unregisterAll();
+    }
+    
+    private Region getRegion(String name){
+        return this.regionDigraph.getRegion(name);
+    }
+    
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/management/ManageableArtifact.java b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/management/ManageableArtifact.java
new file mode 100644
index 0000000..12abf07
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/management/ManageableArtifact.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model.management;
+
+import java.util.Map;
+
+import javax.management.MXBean;
+import javax.management.ObjectName;
+
+import org.eclipse.equinox.region.Region;
+import org.osgi.framework.Version;
+
+/**
+ * Represents an artifact in the runtime model of this system. Acts as a generic interface that delegates to the richer
+ * {@Artifact} type and translates types that are JMX-unfriendly to types that are JMX-friendly.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations must be threadsafe
+ * 
+ */
+@MXBean
+public interface ManageableArtifact {
+
+    /**
+     * Start this {@link ManageableArtifact}
+     */
+    void start();
+
+    /**
+     * Stop this {@link ManageableArtifact}
+     */
+    void stop();
+
+    /**
+     * Update and refresh the contents of this {@link ManageableArtifact}
+     * @return true if refresh is successful, false if refresh is not done
+     */
+    boolean refresh();
+
+    /**
+     * Uninstall this {@link ManageableArtifact}
+     */
+    void uninstall();
+
+    /**
+     * Get the {@link ManageableArtifact}s that this {@link ManageableArtifact} depends on. The dependency can be of any
+     * kind and will be determined by the type of {@link ManageableArtifact} represented.
+     * 
+     * @return This {@link ManageableArtifact}'s dependents
+     */
+    ObjectName[] getDependents();
+
+    /**
+     * Get the type of this {@link ManageableArtifact}
+     * 
+     * @return The type of this {@link ManageableArtifact}
+     */
+    String getType();
+
+    /**
+     * Get the name of this {@link ManageableArtifact}
+     * 
+     * @return The name of this {@link ManageableArtifact}
+     */
+    String getName();
+
+    /**
+     * Get the {@link Version} of this {@link ManageableArtifact}
+     * 
+     * @return The @{link Version} of this {@link ManageableArtifact}
+     */
+    String getVersion();
+
+    /**
+     * Get the state of this {@link ManageableArtifact}
+     * 
+     * @return The state of this {@link ManageableArtifact}
+     */
+    String getState();
+    
+    /**
+     * Get the {@link Region} of this {@link ManageableArtifact} or the empty string if this artifact does not belong in a region
+     * 
+     * @return the {@link Region} of this {@link ManageableArtifact} or the enpty string if this artifact does not belong in a region
+     */
+    String getRegion();
+
+    /**
+     * Get this {@link ManageableArtifact}'s properties. This map is free to hold any properties contributed by any
+     * collaborator.
+     * 
+     * @return This {@link ManageableArtifact}'s properties
+     */
+    Map<String, String> getProperties();
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/management/ManageableBundleArtifact.java b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/management/ManageableBundleArtifact.java
new file mode 100644
index 0000000..5d96905
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/management/ManageableBundleArtifact.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model.management;
+
+import javax.management.MXBean;
+
+/**
+ * Represents a bundle artifact (an artifact that represents an OSGi bundle) in the runtime model of this system. Acts
+ * as a generic interface that delegates to the richer {@BundleArtifact} type and translates types that
+ * are JMX-unfriendly to types that are JMX-friendly.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations must be threadsafe
+ * 
+ */
+@MXBean
+public interface ManageableBundleArtifact extends ManageableArtifact {
+
+    /**
+     * Update an entry within this bundle. If the target path does not already exist, creates a new entry at that
+     * location.
+     * 
+     * @param inputPath The path to read update from
+     * @param targetPath The bundle relative path to write the update to
+     */
+    void updateEntry(String inputPath, String targetPath);
+
+    /**
+     * Delete an entry in a bundle
+     * 
+     * @param targetPath The bundle relative path to delete
+     */
+    void deleteEntry(String targetPath);
+    
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/management/ManageableCompositeArtifact.java b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/management/ManageableCompositeArtifact.java
new file mode 100644
index 0000000..5de87ff
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/management/ManageableCompositeArtifact.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model.management;
+
+import javax.management.MXBean;
+
+/**
+ * Represents a composite artifact (an artifact that contains other artifacts) in the runtime model of this system. Acts
+ * as a generic interface that delegates to the richer {@CompositeArtifact} type and translates
+ * types that are JMX-unfriendly to types that are JMX-friendly.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations must be threadsafe
+ * 
+ */
+@MXBean
+public interface ManageableCompositeArtifact extends ManageableArtifact {
+
+    /**
+     * Get whether this @{link ManageableCompositeArtifact} is scoped or not
+     * 
+     * @return Whether this {@link ManageableCompositeArtifact} is scoped or not
+     */
+    boolean isScoped();
+
+    /**
+     * Get whether this @{link ManageableCompositeArtifact} is atomic or not
+     * 
+     * @return Whether this {@link ManageableCompositeArtifact} is atomic or not
+     */
+    boolean isAtomic();
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/management/RuntimeArtifactModelObjectNameCreator.java b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/management/RuntimeArtifactModelObjectNameCreator.java
new file mode 100644
index 0000000..d42a54d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/management/RuntimeArtifactModelObjectNameCreator.java
@@ -0,0 +1,111 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model.management;
+
+import javax.management.ObjectName;
+
+import org.eclipse.equinox.region.Region;
+import org.eclipse.virgo.kernel.model.Artifact;
+import org.eclipse.virgo.kernel.model.internal.AbstractArtifact;
+import org.osgi.framework.Version;
+
+/**
+ * An strategy interface for creating object names based on an input {@link Artifact}
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations must be threadsafe
+ * 
+ */
+public interface RuntimeArtifactModelObjectNameCreator {
+
+    /**
+     * Create an ArtifactModel {@link ObjectName} based on an input {@link Artifact}. Names generated from equal (
+     * {@link AbstractArtifact#equals(Object)}) {@link Artifact}s should be equal as well.
+     * 
+     * @param artifact The artifact to generate an {@link ObjectName} for
+     * @return The {@link ObjectName} for the {@link Artifact}
+     */
+    ObjectName createArtifactModel(Artifact artifact);
+
+    /**
+     * Creates an ArtifactModel {@link ObjectName} based on an input type, name, version, and region.
+     * 
+     * @param type The type of the object to create an @{link ObjectName} for
+     * @param name The name of the object to create an @{link ObjectName} for
+     * @param version The version of the object to create an @{link ObjectName} for
+     * @param region The {@link Region} of the object to create an @{link ObjectName} for
+     * @return An {@link ObjectName} for the runtime artifact represented by this type, name, version, and region
+     */
+    ObjectName createArtifactModel(String type, String name, Version version, Region region);
+
+    /**
+     * Creates a query {@link ObjectName} that can be used to enumerate all of the artifacts in the runtime artifact models
+     * for both user and kernel regions
+     *
+     * @return An {@link ObjectName} that can be used for querying
+     */
+    ObjectName createAllArtifactsQuery();
+
+    /**
+     * Creates a query {@link ObjectName} that can be used to enumerate all of the artifacts of a given type in the
+     * runtime artifact model
+     * 
+     * @param type The type of artifacts to query for
+     * @return An {@link ObjectName} that can be used for querying
+     */
+    ObjectName createArtifactsOfTypeQuery(String type);
+
+    /**
+     * Creates a query {@link ObjectName} that can be used to enumerate all of the versions of a given artifact type and
+     * name in the runtime artifact model
+     * 
+     * @param type The type of artifacts to query for
+     * @param name The name of artifacts to query for
+     * @return An {@link ObjectName} that can be used for querying
+     */
+    ObjectName createArtifactVersionsQuery(String type, String name);
+
+    /**
+     * Gets the type of an artifact identified by an {@link ObjectName}
+     * 
+     * @param objectName The identifying {@link ObjectName}
+     * @return The type of the artifact
+     */
+    //String getType(ObjectName objectName);
+
+    /**
+     * Gets the name of an artifact identified by an {@link ObjectName}
+     * 
+     * @param objectName The identifying {@link ObjectName}
+     * @return The name of the artifact
+     */
+    String getName(ObjectName objectName);
+
+    /**
+     * Gets the version of an artifact identified by an {@link ObjectName}
+     * 
+     * @param objectName The identifying {@link ObjectName}
+     * @return The version of the artifact
+     */
+    String getVersion(ObjectName objectName);
+
+    /**
+     * Gets the version of an artifact identified by an {@link ObjectName}
+     * 
+     * @param objectName The identifying {@link ObjectName}
+     * @return The version of the artifact
+     */
+    String getRegion(ObjectName objectName);
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/management/internal/DefaultRuntimeArtifactModelObjectNameCreator.java b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/management/internal/DefaultRuntimeArtifactModelObjectNameCreator.java
new file mode 100644
index 0000000..141aa1c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/management/internal/DefaultRuntimeArtifactModelObjectNameCreator.java
@@ -0,0 +1,135 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model.management.internal;
+
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+
+import org.eclipse.equinox.region.Region;
+import org.eclipse.virgo.kernel.model.Artifact;
+import org.eclipse.virgo.kernel.model.management.RuntimeArtifactModelObjectNameCreator;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.osgi.framework.Version;
+
+/**
+ * The default implementation of {@link RuntimeArtifactModelObjectNameCreator}. This implementation creates names based
+ * on the following pattern:
+ * <p />
+ * <code>&lt;domain&gt;:type=ArtifactModel,artifact-type=&lt;type&gt;,name=&lt;name&gt;,version=&lt;version&gt;,region=&lt;region&gt;</code>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+public final class DefaultRuntimeArtifactModelObjectNameCreator implements RuntimeArtifactModelObjectNameCreator {
+
+    private static final String ALL_ARTIFACTS_FORMAT = "%s:type=ArtifactModel,*";
+
+    private static final String ARTIFACTS_OF_TYPE_FORMAT = "%s:type=ArtifactModel,artifact-type=%s,*";
+
+    private static final String ARTIFACTS_OF_TYPE_AND_NAME_FORMAT = "%s:type=ArtifactModel,artifact-type=%s,name=%s,*";
+    
+    private static final String ARTIFACT_FORMAT = "%s:type=ArtifactModel,artifact-type=%s,name=%s,version=%s,region=%s";
+
+    private static final String KEY_NAME = "name";
+
+    private static final String KEY_VERSION = "version";
+
+    private static final String KEY_REGION = "region";
+    
+    private static final String NULL_REGION_NAME = "global";
+
+    private final String domain;
+
+    public DefaultRuntimeArtifactModelObjectNameCreator(String domain) {
+        this.domain = domain;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public ObjectName createArtifactModel(@NonNull Artifact artifact) {
+        return createArtifactModel(artifact.getType(), artifact.getName(), artifact.getVersion(), artifact.getRegion());
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public ObjectName createArtifactModel(String type, String name, Version version, Region region) {
+        return createObjectName(String.format(ARTIFACT_FORMAT, this.domain, this.quoteValueIfNeeded(type), this.quoteValueIfNeeded(name), this.quoteValueIfNeeded(version.toString()), this.quoteValueIfNeeded(getRegionName(region))));
+    }
+
+    private String getRegionName(Region region) {
+        return region == null ? NULL_REGION_NAME : region.getName();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public ObjectName createArtifactsOfTypeQuery(String type) {
+        return createObjectName(String.format(ARTIFACTS_OF_TYPE_FORMAT, this.domain, this.quoteValueIfNeeded(type)));
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public ObjectName createArtifactVersionsQuery(String type, String name) {
+        return createObjectName(String.format(ARTIFACTS_OF_TYPE_AND_NAME_FORMAT, this.domain, this.quoteValueIfNeeded(type), this.quoteValueIfNeeded(name)));
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public ObjectName createAllArtifactsQuery() {
+        return createObjectName(String.format(ALL_ARTIFACTS_FORMAT, this.domain));
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+	public String getRegion(ObjectName objectName) {
+		return objectName.getKeyProperty(KEY_REGION);
+	}
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getName(ObjectName objectName) {
+        return objectName.getKeyProperty(KEY_NAME);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getVersion(ObjectName objectName) {
+        return objectName.getKeyProperty(KEY_VERSION);
+    }
+    
+    private String quoteValueIfNeeded(String value){
+    	if(value.contains(":") || value.contains(",") || value.contains("=") || value.contains("\"")){
+    		value = String.format("%s%s%s", "\"", value.replace("\"", "\\\""), "\"");
+    	}
+    	return value;
+    }
+
+    private ObjectName createObjectName(String objectName) {
+        try {
+            return new ObjectName(objectName);
+        } catch (MalformedObjectNameException e) {
+            throw new RuntimeException(String.format("Unable to create object name '%s'", objectName), e);
+        } catch (NullPointerException e) {
+            throw new RuntimeException(String.format("Unable to create object name '%s'", objectName), e);
+        }
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/management/internal/DelegatingManageableArtifact.java b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/management/internal/DelegatingManageableArtifact.java
new file mode 100644
index 0000000..795465c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/management/internal/DelegatingManageableArtifact.java
@@ -0,0 +1,139 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model.management.internal;
+
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import javax.management.ObjectName;
+
+import org.eclipse.virgo.kernel.model.Artifact;
+import org.eclipse.virgo.kernel.model.management.ManageableArtifact;
+import org.eclipse.virgo.kernel.model.management.RuntimeArtifactModelObjectNameCreator;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+
+
+/**
+ * Implementation of {@link ManageableArtifact} that delegates to an {@link Artifact} for all methods and translates
+ * types that are JMX-unfriendly to types that are JMX-friendly
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ * @see Artifact
+ */
+class DelegatingManageableArtifact implements ManageableArtifact {
+    
+    private final RuntimeArtifactModelObjectNameCreator artifactObjectNameCreator;
+
+    private final Artifact artifact;
+
+    public DelegatingManageableArtifact(@NonNull RuntimeArtifactModelObjectNameCreator artifactObjectNameCreator, @NonNull Artifact artifact) {
+        this.artifactObjectNameCreator = artifactObjectNameCreator;
+        this.artifact = artifact;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public final ObjectName[] getDependents() {
+        return convertToObjectNames(this.artifact.getDependents());
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public final String getName() {
+        return this.artifact.getName();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public final String getState() {
+        return this.artifact.getState().toString();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public final String getType() {
+        return this.artifact.getType();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public final String getVersion() {
+        return this.artifact.getVersion().toString();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getRegion() {
+        return this.artifact.getRegion().getName();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public final boolean refresh() {
+        return this.artifact.refresh();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public final void start() {
+        this.artifact.start();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public final void stop() {
+        this.artifact.stop();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public final void uninstall() {
+        this.artifact.uninstall();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public final Map<String, String> getProperties() {
+        return this.artifact.getProperties();
+    }
+
+    /**
+     * Convert a collection of {@link Artifact}s to a collection of {@link ObjectName}s
+     * 
+     * @param artifacts The {@link Artifact}s to convert
+     * @return The {@link ObjectName}s converted to
+     */
+    private final ObjectName[] convertToObjectNames(Set<Artifact> artifacts) {
+        Set<ObjectName> objectNames = new HashSet<ObjectName>(artifacts.size());
+        for (Artifact artifact : artifacts) {
+        	objectNames.add(artifactObjectNameCreator.createArtifactModel(artifact));
+        }
+        ObjectName[] objectNamesArray = new ObjectName[objectNames.size()];
+		return objectNames.toArray(objectNamesArray);
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/management/internal/DelegatingManageableBundleArtifact.java b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/management/internal/DelegatingManageableBundleArtifact.java
new file mode 100644
index 0000000..8de5551
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/management/internal/DelegatingManageableBundleArtifact.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model.management.internal;
+
+import org.eclipse.virgo.kernel.model.BundleArtifact;
+import org.eclipse.virgo.kernel.model.management.ManageableBundleArtifact;
+import org.eclipse.virgo.kernel.model.management.RuntimeArtifactModelObjectNameCreator;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+
+
+/**
+ * Implementation of {@link ManageableBundleArtifact} that delegates to a {@link BundleArtifact} for all methods and
+ * translates types that are JMX-unfriendly to types that are JMX-friendly
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ * @see BundleArtifact
+ */
+final class DelegatingManageableBundleArtifact extends DelegatingManageableArtifact implements ManageableBundleArtifact {
+
+    private final BundleArtifact bundleArtifact;
+
+    public DelegatingManageableBundleArtifact(@NonNull RuntimeArtifactModelObjectNameCreator artifactObjectNameCreator, @NonNull BundleArtifact bundleArtifact) {
+        super(artifactObjectNameCreator, bundleArtifact);
+        this.bundleArtifact = bundleArtifact;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void deleteEntry(String targetPath) {
+        this.bundleArtifact.deleteEntry(targetPath);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void updateEntry(String inputPath, String targetPath) {
+        this.bundleArtifact.updateEntry(inputPath, targetPath);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/management/internal/DelegatingManageableCompositeArtifact.java b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/management/internal/DelegatingManageableCompositeArtifact.java
new file mode 100644
index 0000000..996d8ed
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/management/internal/DelegatingManageableCompositeArtifact.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model.management.internal;
+
+import org.eclipse.virgo.kernel.model.CompositeArtifact;
+import org.eclipse.virgo.kernel.model.management.ManageableCompositeArtifact;
+import org.eclipse.virgo.kernel.model.management.RuntimeArtifactModelObjectNameCreator;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+
+
+/**
+ * Implementation of {@link ManageableCompositeArtifact} that delegates to an {@link CompositeArtifact} for all methods
+ * and translates types that are JMX-unfriendly to types that are JMX-friendly
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ * @see CompositeArtifact
+ */
+final class DelegatingManageableCompositeArtifact extends DelegatingManageableArtifact implements ManageableCompositeArtifact {
+
+    private final CompositeArtifact planArtifact;
+
+    public DelegatingManageableCompositeArtifact(@NonNull RuntimeArtifactModelObjectNameCreator artifactObjectNameCreator, @NonNull CompositeArtifact planArtifact) {
+        super(artifactObjectNameCreator, planArtifact);
+        this.planArtifact = planArtifact;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isAtomic() {
+        return this.planArtifact.isAtomic();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isScoped() {
+        return this.planArtifact.isScoped();
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/management/internal/JmxArtifactRepositoryListener.java b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/management/internal/JmxArtifactRepositoryListener.java
new file mode 100644
index 0000000..20293e5
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/main/java/org/eclipse/virgo/kernel/model/management/internal/JmxArtifactRepositoryListener.java
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model.management.internal;
+
+import java.lang.management.ManagementFactory;
+import java.util.Set;
+
+import javax.management.InstanceAlreadyExistsException;
+import javax.management.InstanceNotFoundException;
+import javax.management.MBeanRegistrationException;
+import javax.management.MBeanServer;
+import javax.management.NotCompliantMBeanException;
+import javax.management.ObjectName;
+
+import org.eclipse.virgo.kernel.model.Artifact;
+import org.eclipse.virgo.kernel.model.BundleArtifact;
+import org.eclipse.virgo.kernel.model.CompositeArtifact;
+import org.eclipse.virgo.kernel.model.internal.ArtifactRepositoryListener;
+import org.eclipse.virgo.kernel.model.management.RuntimeArtifactModelObjectNameCreator;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * An implementation of {@link ArtifactRepositoryListener} that notices creation and deletion of {@link Artifact}s and
+ * adds and removes respectively MBeans from the JMX MBeanServer
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+public class JmxArtifactRepositoryListener implements ArtifactRepositoryListener {
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private final MBeanServer server = ManagementFactory.getPlatformMBeanServer();
+
+    private final RuntimeArtifactModelObjectNameCreator artifactObjectNameCreator;
+
+    public JmxArtifactRepositoryListener(@NonNull RuntimeArtifactModelObjectNameCreator artifactObjectNameCreator) {
+        this.artifactObjectNameCreator = artifactObjectNameCreator;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void added(Artifact artifact) {
+        ObjectName objectName = getModelObjectName(artifact);
+
+        try {
+            if (artifact instanceof CompositeArtifact) {
+                this.server.registerMBean(new DelegatingManageableCompositeArtifact(this.artifactObjectNameCreator, (CompositeArtifact) artifact), objectName);
+            } else if (artifact instanceof BundleArtifact) {
+                this.server.registerMBean(new DelegatingManageableBundleArtifact(this.artifactObjectNameCreator, (BundleArtifact) artifact), objectName);
+            } else {
+                this.server.registerMBean(new DelegatingManageableArtifact(this.artifactObjectNameCreator, artifact), objectName);
+            }
+        } catch (InstanceAlreadyExistsException e) {
+            logger.error(String.format("Unable to register '%s'", objectName.toString()), e);
+        } catch (MBeanRegistrationException e) {
+            logger.error(String.format("Unable to register '%s'", objectName.toString()), e);
+        } catch (NotCompliantMBeanException e) {
+            logger.error(String.format("Unable to register '%s'", objectName.toString()), e);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void removed(Artifact artifact) {
+        ObjectName objectName = getModelObjectName(artifact);
+        
+        try {
+            this.server.unregisterMBean(objectName);
+        } catch (MBeanRegistrationException e) {
+            logger.error(String.format("Unable to unregister '%s'", objectName.toString()), e);
+        } catch (InstanceNotFoundException e) {
+            logger.error(String.format("Unable to unregister '%s'", objectName.toString()), e);
+        }
+    }
+
+    public void destroy() {
+        Set<ObjectName> objectNames = this.server.queryNames(this.artifactObjectNameCreator.createAllArtifactsQuery(), null);
+        for (ObjectName objectName : objectNames) {
+            try {
+                this.server.unregisterMBean(objectName);
+            } catch (MBeanRegistrationException e) {
+                // Swallow exception to allow others to proceed
+            } catch (InstanceNotFoundException e) {
+                // Swallow exception to allow others to proceed
+            }
+        }
+    }
+    
+    private ObjectName getModelObjectName(Artifact artifact){
+        ObjectName objectName;
+        objectName = this.artifactObjectNameCreator.createArtifactModel(artifact);
+        return objectName;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/main/resources/META-INF/spring/module-context.xml b/kernel/org.eclipse.virgo.kernel.model/src/main/resources/META-INF/spring/module-context.xml
new file mode 100644
index 0000000..47c6a48
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/main/resources/META-INF/spring/module-context.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<beans xmlns="http://www.springframework.org/schema/beans" xmlns:osgi="http://www.springframework.org/schema/osgi" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"

+	xsi:schemaLocation="

+				http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd

+				http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd

+				http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi.xsd">

+

+	<bean class="org.eclipse.virgo.kernel.model.internal.bundle.ModelBundleListenerInitializer">

+		<constructor-arg ref="artifactRepository"/>

+		<constructor-arg ref="packageAdminUtil"/>

+		<constructor-arg ref="bundleContext"/>

+		<constructor-arg ref="regionDigraph"/>

+		<constructor-arg ref="springContextAccessor" />

+	</bean>

+

+	<bean class="org.eclipse.virgo.kernel.model.internal.configurationadmin.ModelConfigurationListenerInitializer">

+		<constructor-arg ref="artifactRepository"/>

+		<constructor-arg ref="bundleContext"/>

+		<constructor-arg ref="configurationAdmin"/>

+		<constructor-arg ref="globalRegion"/>

+	</bean>

+

+	<bean class="org.eclipse.virgo.kernel.model.internal.deployer.ModelInstallArtifactLifecycleListenerInitializer">

+		<constructor-arg ref="artifactRepository"/>

+		<constructor-arg ref="bundleContext"/>

+		<constructor-arg ref="runtimeArtifactModel"/>

+		<constructor-arg ref="regionDigraph"/>

+		<constructor-arg ref="globalRegion"/>

+		<constructor-arg ref="springContextAccessor" />

+	</bean>

+

+	<bean id="bundleDependencyDeterminer" class="org.eclipse.virgo.kernel.model.internal.bundle.BundleDependencyDeterminer">

+		<constructor-arg ref="quasiFrameworkFactory"/>

+		<constructor-arg ref="artifactRepository"/>

+		<constructor-arg ref="regionDigraph"/>

+	</bean>

+

+	<bean id="deployerCompositeArtifactDependencyDeterminer" class="org.eclipse.virgo.kernel.model.internal.deployer.DeployerCompositeArtifactDependencyDeterminer">

+		<constructor-arg ref="artifactRepository"/>

+		<constructor-arg ref="userRegion"/>

+		<constructor-arg ref="globalRegion"/>

+	</bean>

+

+	<bean id="artifactRepository" class="org.eclipse.virgo.kernel.model.internal.NotifyingRuntimeArtifactRepository">

+		<constructor-arg ref="artifactRepositoryListener"/>

+	</bean>

+

+	<bean id="artifactRepositoryListener" class="org.eclipse.virgo.kernel.model.management.internal.JmxArtifactRepositoryListener" destroy-method="destroy">

+		<constructor-arg ref="runtimeArtifactModelObjectNameCreator"/>

+	</bean>

+	

+	<bean id="springContextAccessor" class="org.eclipse.virgo.kernel.model.internal.StandardSpringContextAccessor" />

+

+	<bean id="runtimeArtifactModelObjectNameCreator" class="org.eclipse.virgo.kernel.model.management.internal.DefaultRuntimeArtifactModelObjectNameCreator">

+		<constructor-arg value="#{kernelConfig.getProperty('domain')}"/>

+	</bean>

+	

+	<osgi:reference id="kernelConfig" interface="org.eclipse.virgo.nano.core.KernelConfig"/>

+

+	<context:annotation-config/>

+

+</beans>

diff --git a/kernel/org.eclipse.virgo.kernel.model/src/main/resources/META-INF/spring/osgi-context.xml b/kernel/org.eclipse.virgo.kernel.model/src/main/resources/META-INF/spring/osgi-context.xml
new file mode 100644
index 0000000..55ae6d4
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/main/resources/META-INF/spring/osgi-context.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<beans:beans

+		xmlns="http://www.springframework.org/schema/osgi" 

+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

+		xmlns:beans="http://www.springframework.org/schema/beans" 

+		xmlns:osgi-compendium="http://www.springframework.org/schema/osgi-compendium"

+		xsi:schemaLocation="

+				http://www.springframework.org/schema/osgi-compendium http://www.springframework.org/schema/osgi-compendium/spring-osgi-compendium-1.2.xsd

+				http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi-1.2.xsd

+				http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

+

+	<service ref="artifactRepository" interface="org.eclipse.virgo.kernel.model.RuntimeArtifactRepository"/>

+	

+	<service ref="bundleDependencyDeterminer" interface="org.eclipse.virgo.kernel.model.internal.DependencyDeterminer">

+		<service-properties>

+			<beans:entry key="artifactType" value="bundle"/>

+		</service-properties>

+	</service>

+

+	<service ref="deployerCompositeArtifactDependencyDeterminer" interface="org.eclipse.virgo.kernel.model.internal.DependencyDeterminer">

+		<service-properties>

+			<beans:entry key="artifactType" value="plan"/>

+		</service-properties>

+	</service>

+

+	<service ref="deployerCompositeArtifactDependencyDeterminer" interface="org.eclipse.virgo.kernel.model.internal.DependencyDeterminer">

+		<service-properties>

+			<beans:entry key="artifactType" value="par"/>

+		</service-properties>

+	</service>

+	

+	<service ref="runtimeArtifactModelObjectNameCreator" interface="org.eclipse.virgo.kernel.model.management.RuntimeArtifactModelObjectNameCreator"/>

+

+	<reference id="packageAdminUtil" interface="org.eclipse.virgo.kernel.osgi.framework.PackageAdminUtil"/>

+

+	<reference id="configurationAdmin" interface="org.osgi.service.cm.ConfigurationAdmin"/>

+	

+	<reference id="quasiFrameworkFactory" interface="org.eclipse.virgo.kernel.osgi.quasi.QuasiFrameworkFactory"/>

+	

+	<reference id="runtimeArtifactModel" interface="org.eclipse.virgo.kernel.deployer.model.RuntimeArtifactModel"/>

+	

+	<reference id="regionDigraph" interface="org.eclipse.equinox.region.RegionDigraph" />

+	

+	<reference id="globalRegion" interface="org.eclipse.equinox.region.Region" filter="(org.eclipse.virgo.kernel.region.name=global)" />

+	

+	<reference id="userRegion" interface="org.eclipse.equinox.region.Region" filter="(org.eclipse.virgo.kernel.region.name=org.eclipse.virgo.region.user)" />

+

+</beans:beans>

diff --git a/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/StubArtifactRepository.java b/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/StubArtifactRepository.java
new file mode 100644
index 0000000..832236f
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/StubArtifactRepository.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.equinox.region.Region;
+import org.osgi.framework.Version;
+
+public class StubArtifactRepository implements RuntimeArtifactRepository {
+
+    private final Set<Artifact> artifacts = new HashSet<Artifact>();
+
+    public boolean add(Artifact artifact) {
+        return this.artifacts.add(artifact);
+    }
+
+    public boolean remove(Artifact artifact) {
+        return this.remove(artifact.getType(), artifact.getName(), artifact.getVersion(), artifact.getRegion());
+    }
+
+    public boolean remove(String type, String name, Version version, Region region) {
+        return this.artifacts.remove(getArtifact(type, name, version, region));
+    }
+
+    public Set<Artifact> getArtifacts() {
+        return this.artifacts;
+    }
+
+    public Artifact getArtifact(String type, String name, Version version, Region region) {
+        for (Artifact artifact : this.artifacts) {
+            if (artifact.getType().equals(type) && artifact.getName().equals(name) && artifact.getVersion().equals(version) && artifact.getRegion().equals(region)) {
+                return artifact;
+            }
+        }
+        return null;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/StubCompositeArtifact.java b/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/StubCompositeArtifact.java
new file mode 100644
index 0000000..2c1d64f
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/StubCompositeArtifact.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model;
+
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.equinox.region.Region;
+import org.eclipse.virgo.test.stubs.region.StubRegion;
+import org.osgi.framework.Version;
+
+public class StubCompositeArtifact implements CompositeArtifact {
+
+    private final String name;
+    
+    private final String type;
+    
+    private final Region region;
+    
+    public StubCompositeArtifact() {
+        this("test-type", "test-name", new StubRegion("test-region", null));
+    }
+
+    public StubCompositeArtifact(String type, String name, Region region) {
+        this.type = type;
+        this.name = name;
+        this.region = region;
+    }
+    
+    public Set<Artifact> getDependents() {
+        throw new UnsupportedOperationException();
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public ArtifactState getState() {
+        throw new UnsupportedOperationException();
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public Version getVersion() {
+        return Version.emptyVersion;
+    }
+
+    public Region getRegion() {
+        return this.region;
+    }
+
+    public boolean refresh() {
+        throw new UnsupportedOperationException();
+    }
+
+    public void start() {
+        throw new UnsupportedOperationException();
+    }
+
+    public void stop() {
+        throw new UnsupportedOperationException();
+    }
+
+    public void uninstall() {
+        throw new UnsupportedOperationException();
+    }
+
+    public boolean isAtomic() {
+        throw new UnsupportedOperationException();
+    }
+
+    public boolean isScoped() {
+        throw new UnsupportedOperationException();
+    }
+
+    public Map<String, String> getProperties() {
+        throw new UnsupportedOperationException();
+    }
+    
+    @Override
+    public String toString() {
+    	return "StubCompositeRegion type:" + this.type + " name:" + this.name + " region:" + this.region.getName();
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/StubSpringContextAccessor.java b/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/StubSpringContextAccessor.java
new file mode 100644
index 0000000..a3b07ba
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/StubSpringContextAccessor.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model;
+
+import org.eclipse.virgo.kernel.model.internal.SpringContextAccessor;
+import org.osgi.framework.Bundle;
+
+/**
+ * Stub impl
+ */
+public class StubSpringContextAccessor implements SpringContextAccessor {
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean isSpringPowered(Bundle bundle) {
+        return false;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/internal/AbztractArtifactTests.java b/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/internal/AbztractArtifactTests.java
new file mode 100644
index 0000000..4340041
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/internal/AbztractArtifactTests.java
@@ -0,0 +1,160 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model.internal;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+
+import java.util.Dictionary;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.Set;
+
+import org.eclipse.equinox.region.Region;
+import org.eclipse.virgo.kernel.model.Artifact;
+import org.eclipse.virgo.kernel.model.ArtifactState;
+import org.eclipse.virgo.kernel.model.StubCompositeArtifact;
+import org.eclipse.virgo.nano.serviceability.Assert.FatalAssertionException;
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+import org.eclipse.virgo.test.stubs.region.StubRegion;
+import org.eclipse.virgo.test.stubs.support.TrueFilter;
+import org.junit.Test;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Version;
+
+public class AbztractArtifactTests {
+
+    private final StubBundleContext bundleContext;
+
+    private final AbstractArtifact artifact;
+
+    private final StubRegion region = new StubRegion("test-region", null);
+
+    {
+        bundleContext = new StubBundleContext();
+        String filterString = String.format("(&(objectClass=%s)(artifactType=test-type))", DependencyDeterminer.class.getCanonicalName());
+        bundleContext.addFilter(filterString, new TrueFilter(filterString));
+        artifact = new StubArtifact(bundleContext, "test-type", "test-name", Version.emptyVersion, region);
+    }
+
+    @Test(expected = FatalAssertionException.class)
+    public void nullBundleContext() {
+        new StubArtifact(null, "type", "name", Version.emptyVersion, region);
+    }
+
+    @Test(expected = FatalAssertionException.class)
+    public void nullType() {
+        new StubArtifact(new StubBundleContext(), null, "name", Version.emptyVersion, region);
+    }
+
+    @Test(expected = FatalAssertionException.class)
+    public void nullName() {
+        new StubArtifact(new StubBundleContext(), "type", null, Version.emptyVersion, region);
+    }
+
+    @Test(expected = FatalAssertionException.class)
+    public void nullVersion() {
+        new StubArtifact(new StubBundleContext(), "type", "name", null, region);
+    }
+
+    @Test(expected = FatalAssertionException.class)
+    public void nullRegion() {
+        new StubArtifact(new StubBundleContext(), "type", "name", Version.emptyVersion, null);
+    }
+
+    @Test(expected = RuntimeException.class)
+    public void badFilter() {
+        new StubArtifact(new StubBundleContext(), "type", "name", Version.emptyVersion, region);
+    }
+
+    @Test
+    public void getType() {
+        assertEquals("test-type", artifact.getType());
+    }
+
+    @Test
+    public void getName() {
+        assertEquals("test-name", artifact.getName());
+    }
+
+    @Test
+    public void getVersion() {
+        assertEquals(Version.emptyVersion, artifact.getVersion());
+    }
+
+    @Test
+    public void getRegion() {
+        assertEquals("test-region", artifact.getRegion().getName());
+    }
+
+    @Test
+    public void getDependents() {
+        assertEquals(0, artifact.getDependents().size());
+
+        DependencyDeterminer determiner = createMock(DependencyDeterminer.class);
+        Dictionary<String, String> properties = new Hashtable<String, String>();
+        properties.put("artifactType", "test-type");
+        bundleContext.registerService(DependencyDeterminer.class.getCanonicalName(), determiner, properties);
+
+        expect(determiner.getDependents(artifact)).andReturn(getArtifacts());
+        replay(determiner);
+        assertEquals(3, artifact.getDependents().size());
+        verify(determiner);
+    }
+    
+    @Test
+    public void getProperties() {
+        assertEquals(0, artifact.getProperties().size());
+    }
+
+    private Set<Artifact> getArtifacts() {
+        Set<Artifact> artifacts = new HashSet<Artifact>();
+        for (int i = 0; i < 3; i++) {
+            artifacts.add(new StubCompositeArtifact());
+        }
+        return artifacts;
+    }
+
+    private static class StubArtifact extends AbstractArtifact {
+
+        public StubArtifact(BundleContext bundleContext) {
+            super(bundleContext, "test-type", "test-name", Version.emptyVersion, new StubRegion("test-region", null));
+        }
+
+        public StubArtifact(BundleContext bundleContext, String type, String name, Version version, Region region) {
+            super(bundleContext, type, name, version, region);
+        }
+
+        public ArtifactState getState() {
+            throw new UnsupportedOperationException();
+        }
+
+        public boolean refresh() {
+            throw new UnsupportedOperationException();
+        }
+
+        public void start() {
+            throw new UnsupportedOperationException();
+        }
+
+        public void stop() {
+            throw new UnsupportedOperationException();
+        }
+
+        public void uninstall() {
+            throw new UnsupportedOperationException();
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/internal/NotifyingArtifactRepositoryTests.java b/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/internal/NotifyingArtifactRepositoryTests.java
new file mode 100644
index 0000000..8863602
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/internal/NotifyingArtifactRepositoryTests.java
@@ -0,0 +1,124 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model.internal;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Set;
+
+import org.eclipse.equinox.region.Region;
+import org.eclipse.virgo.kernel.model.Artifact;
+import org.eclipse.virgo.kernel.model.StubCompositeArtifact;
+import org.eclipse.virgo.test.stubs.region.StubRegion;
+import org.junit.Test;
+import org.osgi.framework.Version;
+
+
+public class NotifyingArtifactRepositoryTests {
+
+    private final NotifyingRuntimeArtifactRepository artifactRepository = new NotifyingRuntimeArtifactRepository();
+
+    @Test
+    public void add() {
+        StubCompositeArtifact artifact = new StubCompositeArtifact();
+        assertTrue(this.artifactRepository.add(artifact));
+        assertFalse(this.artifactRepository.add(artifact));
+    }
+
+    @Test
+    public void remove() {
+        StubCompositeArtifact artifact = new StubCompositeArtifact();
+        assertTrue(this.artifactRepository.add(artifact));
+        assertTrue(this.artifactRepository.remove(artifact.getType(), artifact.getName(), artifact.getVersion(), artifact.getRegion()));
+        assertFalse(this.artifactRepository.remove(artifact.getType(), artifact.getName(), artifact.getVersion(), artifact.getRegion()));
+    }
+
+    @Test
+    public void listeners() {
+        StubArtifactRepositoryListener listener1 = new StubArtifactRepositoryListener(true);
+        StubArtifactRepositoryListener listener2 = new StubArtifactRepositoryListener(false);
+        NotifyingRuntimeArtifactRepository artifactRepository = new NotifyingRuntimeArtifactRepository(listener1, listener2);
+        StubCompositeArtifact artifact = new StubCompositeArtifact();
+        artifactRepository.add(artifact);
+        artifactRepository.remove(artifact.getType(), artifact.getName(), artifact.getVersion(), artifact.getRegion());
+        assertTrue(listener1.getAdded());
+        assertTrue(listener2.getAdded());
+        assertTrue(listener1.getRemoved());
+        assertTrue(listener2.getRemoved());
+    }
+
+    @Test
+    public void getArtifacts() {
+        this.artifactRepository.add(new StubCompositeArtifact());
+        Set<Artifact> artifacts1 = this.artifactRepository.getArtifacts();
+        assertEquals(1, artifacts1.size());
+        Set<Artifact> artifacts2 = this.artifactRepository.getArtifacts();
+        assertNotSame(artifacts1, artifacts2);
+    }
+    
+    @Test 
+    public void getArtifact(){
+        Region stubRegion1 = new StubRegion("test-region1", null);
+        Region stubRegion2 = new StubRegion("test-region2", null);
+        Artifact stubArtifact = new StubCompositeArtifact("foo", "bar", stubRegion1);
+        Artifact stubArtifact2 = new StubCompositeArtifact("foo2", "bar2", stubRegion2);
+        this.artifactRepository.add(stubArtifact);
+        this.artifactRepository.add(stubArtifact2);
+        Artifact retrieved = this.artifactRepository.getArtifact("foo", "bar", new Version("0.1.0"), stubRegion1);
+        assertNull(retrieved);
+        retrieved = this.artifactRepository.getArtifact("foo", "bar", Version.emptyVersion, stubRegion1);
+        assertEquals(stubArtifact, retrieved);
+        retrieved = this.artifactRepository.getArtifact("foo", "bar", Version.emptyVersion, stubRegion2);
+        assertNull(retrieved);
+        retrieved = this.artifactRepository.getArtifact("foo2", "bar2", Version.emptyVersion, stubRegion2);
+        assertEquals(stubArtifact2, retrieved);
+    }
+    
+    private static class StubArtifactRepositoryListener implements ArtifactRepositoryListener {
+
+        private final boolean throwException;
+
+        private volatile boolean added = false;
+
+        private volatile boolean removed = false;
+
+        public StubArtifactRepositoryListener(boolean throwException) {
+            this.throwException = throwException;
+        }
+
+        public void added(Artifact artifact) {
+            this.added = true;
+            if (throwException) {
+                throw new RuntimeException();
+            }
+        }
+
+        public void removed(Artifact artifact) {
+            this.removed = true;
+            if (throwException) {
+                throw new RuntimeException();
+            }
+        }
+
+        public boolean getAdded() {
+            return added;
+        }
+
+        public boolean getRemoved() {
+            return removed;
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/internal/StandardSpringContextAccessorTests.java b/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/internal/StandardSpringContextAccessorTests.java
new file mode 100644
index 0000000..1d84aaf
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/internal/StandardSpringContextAccessorTests.java
@@ -0,0 +1,99 @@
+/*******************************************************************************
+ * This file is part of the Eclipse Virgo project.
+ *
+ * Copyright (c) 2011 copyright_holder
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    cgfrost - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model.internal;
+
+import static org.easymock.EasyMock.createNiceMock;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.Map;
+
+import org.eclipse.virgo.nano.serviceability.Assert.FatalAssertionException;
+import org.eclipse.virgo.test.stubs.framework.StubBundle;
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+import org.eclipse.virgo.test.stubs.framework.StubFilter;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.Version;
+import org.springframework.context.ApplicationContext;
+
+public class StandardSpringContextAccessorTests {
+    
+    private static final String FILTER = "(Bundle-SymbolicName=test-bundle)";
+
+    private final StandardSpringContextAccessor standardSpringContextAccessor = new StandardSpringContextAccessor();
+
+    private StubBundle bundle;
+    
+    private StubBundleContext bundleContext;
+    
+    @Before
+    public void setUp(){
+        this.bundle = new StubBundle("test-bundle", Version.emptyVersion);
+        this.bundleContext = new StubBundleContext(bundle);
+        this.bundle.setBundleContext(this.bundleContext);
+        this.bundleContext.addFilter(FILTER, new TestFilter());
+    }
+
+    @Test(expected = FatalAssertionException.class)
+    public void testNullBundle(){
+        this.standardSpringContextAccessor.isSpringPowered(null);
+    }
+    
+    @Test
+    public void testSpringPowered(){
+        Dictionary<String, String> properties = new Hashtable<String, String>();
+        properties.put("Bundle-SymbolicName", "test-bundle");
+        this.bundleContext.registerService(ApplicationContext.class, createNiceMock(ApplicationContext.class), properties);
+        assertTrue(this.standardSpringContextAccessor.isSpringPowered(this.bundle));
+    }
+
+    @Test
+    public void testNotSpringPowered(){
+        assertFalse(this.standardSpringContextAccessor.isSpringPowered(this.bundle));
+    }
+    
+    private class TestFilter implements StubFilter {
+
+        @Override
+        public boolean match(ServiceReference<?> reference) {
+            return true;
+        }
+
+        @Override
+        public boolean match(Dictionary<String, ?> dictionary) {
+            return true;
+        }
+
+        @Override
+        public boolean matchCase(Dictionary<String, ?> dictionary) {
+            return true;
+        }
+
+        @Override
+        public boolean matches(Map<String, ?> map) {
+            return true;
+        }
+
+        @Override
+        public String getFilterString() {
+            return FILTER;
+        }
+        
+    }
+    
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/internal/bundle/BundleDependencyDeterminerTests.java b/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/internal/bundle/BundleDependencyDeterminerTests.java
new file mode 100644
index 0000000..e2ab475
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/internal/bundle/BundleDependencyDeterminerTests.java
@@ -0,0 +1,287 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model.internal.bundle;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.reset;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.equinox.region.Region;
+import org.eclipse.equinox.region.RegionDigraph;
+import org.eclipse.virgo.kernel.model.Artifact;
+import org.eclipse.virgo.kernel.model.BundleArtifact;
+import org.eclipse.virgo.kernel.model.RuntimeArtifactRepository;
+import org.eclipse.virgo.kernel.model.StubArtifactRepository;
+import org.eclipse.virgo.kernel.model.StubCompositeArtifact;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiBundle;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiExportPackage;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiFramework;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiFrameworkFactory;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiImportPackage;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiRequiredBundle;
+import org.eclipse.virgo.nano.serviceability.Assert.FatalAssertionException;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Version;
+
+public class BundleDependencyDeterminerTests {
+
+    private static final String BUNDLE_TYPE = "bundle";
+
+    private static final Version TEST_BUNDLE_VERSION = Version.emptyVersion;
+
+    private static final String TEST_BUNDLE_NAME = "bundle";
+
+    private static final String EXPORTING_BUNDLE_NAME = "exportingBundle";
+
+    private static final String HOST_BUNDLE_NAME = "hostBundle";
+
+    private static final String REQUIRED_BUNDLE_NAME = "requiredBundle";
+
+    private static final String REGION_A_NAME = "regionA-name";
+
+    private static final String REGION_B_NAME = "regionB-name";
+
+    private static final long BUNDLE_1_ID = 10l;
+
+    private static final long BUNDLE_2_ID = 100l;
+
+    private static final long EXPORTING_BUNDLE_ID = 2l;
+
+    private static final long HOST_BUNDLE_ID = 3l;
+
+    private static final long REQUIRED_BUNDLE_ID = 4l;
+
+    private final QuasiFrameworkFactory quasiFrameworkFactory = createMock(QuasiFrameworkFactory.class);
+
+    private final RuntimeArtifactRepository artifactRepository = new StubArtifactRepository();
+
+    private final RegionDigraph regionDigraph = createMock(RegionDigraph.class);
+
+    private final Region regionA = createMock(Region.class);
+
+    private final Region regionB = createMock(Region.class);
+
+    private final BundleDependencyDeterminer determiner = new BundleDependencyDeterminer(quasiFrameworkFactory, artifactRepository, regionDigraph);
+
+    private QuasiBundle bundle1;
+
+    private QuasiBundle bundle2;
+
+    @Before
+    public void setUp() {
+        reset(quasiFrameworkFactory, regionDigraph);
+    }
+
+    @Test(expected = FatalAssertionException.class)
+    public void nullFactory() {
+        new BundleDependencyDeterminer(null, artifactRepository, regionDigraph);
+    }
+
+    @Test(expected = FatalAssertionException.class)
+    public void nullRepository() {
+        new BundleDependencyDeterminer(quasiFrameworkFactory, null, regionDigraph);
+    }
+
+    @Test(expected = FatalAssertionException.class)
+    public void nullRegionDigraph() {
+        new BundleDependencyDeterminer(quasiFrameworkFactory, artifactRepository, null);
+    }
+
+    @Test
+    public void unknownBundle() {
+        QuasiFramework framework = createMock(QuasiFramework.class);
+        replay(quasiFrameworkFactory, regionDigraph, framework);
+
+        Set<Artifact> dependents = this.determiner.getDependents(new StubCompositeArtifact("bar", "foo", regionB));
+        assertEquals(Collections.<Artifact> emptySet(), dependents);
+
+        verify(quasiFrameworkFactory, regionDigraph, framework);
+    }
+
+    @Test
+    public void bundleFromDifferentRegion() {
+        setTestBundleExpectations();
+        QuasiFramework framework = createMock(QuasiFramework.class);
+        expect(quasiFrameworkFactory.create()).andReturn(framework);
+        expect(framework.getBundles()).andReturn(getTestBundleSet());
+
+        expect(bundle2.getHosts()).andReturn(null).anyTimes();
+        expect(bundle2.getRequiredBundles()).andReturn(null).anyTimes();
+
+        expect(regionDigraph.getRegion(BUNDLE_1_ID)).andReturn(regionA);
+        expect(regionDigraph.getRegion(BUNDLE_2_ID)).andReturn(regionB);
+        expect(regionB.getName()).andReturn(REGION_B_NAME).anyTimes();
+
+        expect(bundle2.getImportPackages()).andReturn(new ArrayList<QuasiImportPackage>());
+
+        BundleArtifact bundleArtifact = createMockBundleArtifact(TEST_BUNDLE_NAME, TEST_BUNDLE_VERSION, regionB);
+
+        replay(bundleArtifact, quasiFrameworkFactory, regionDigraph, framework, bundle1, bundle2, regionB);
+
+        Set<Artifact> dependents = this.determiner.getDependents(bundleArtifact);
+        assertEquals(Collections.<Artifact> emptySet(), dependents);
+
+        verify(bundleArtifact, quasiFrameworkFactory, regionDigraph, framework, bundle1, bundle2, regionB);
+    }
+
+    private void setTestBundleExpectations() {
+        this.bundle1 = createMockQuasiBundle(TEST_BUNDLE_NAME, TEST_BUNDLE_VERSION, BUNDLE_1_ID);
+        this.bundle2 = createMockQuasiBundle(TEST_BUNDLE_NAME, TEST_BUNDLE_VERSION, BUNDLE_2_ID);
+    }
+
+    private static QuasiBundle createMockQuasiBundle(String bundleSymbolicName, Version bundleVersion, long bundleId) {
+        QuasiBundle quasiBundle = createMock(QuasiBundle.class);
+        expect(quasiBundle.getSymbolicName()).andReturn(bundleSymbolicName).anyTimes();
+        expect(quasiBundle.getVersion()).andReturn(bundleVersion).anyTimes();
+        expect(quasiBundle.getBundleId()).andReturn(bundleId).anyTimes();
+        return quasiBundle;
+    }
+
+    private static BundleArtifact createMockBundleArtifact(String bundleSymbolicName, Version bundleVersion, Region region) {
+        BundleArtifact bundleArtifact = createMock(BundleArtifact.class);
+        expect(bundleArtifact.getType()).andReturn(BUNDLE_TYPE).anyTimes();
+        expect(bundleArtifact.getName()).andReturn(bundleSymbolicName).anyTimes();
+        expect(bundleArtifact.getVersion()).andReturn(bundleVersion).anyTimes();
+        expect(bundleArtifact.getRegion()).andReturn(region).anyTimes();
+        return bundleArtifact;
+    }
+
+    @Test
+    public void bundleWithImport() {
+        setTestBundleExpectations();
+        QuasiFramework framework = createMock(QuasiFramework.class);
+        expect(quasiFrameworkFactory.create()).andReturn(framework);
+        expect(framework.getBundles()).andReturn(getTestBundleSet());
+
+        QuasiImportPackage importedPackage = createMock(QuasiImportPackage.class);
+        QuasiExportPackage provider = createMock(QuasiExportPackage.class);
+        QuasiBundle exporter = createMockQuasiBundle(EXPORTING_BUNDLE_NAME, TEST_BUNDLE_VERSION, EXPORTING_BUNDLE_ID);
+        expect(provider.getExportingBundle()).andReturn(exporter);
+        expect(importedPackage.getProvider()).andReturn(provider);
+        ArrayList<QuasiImportPackage> b = new ArrayList<QuasiImportPackage>();
+        b.add(importedPackage);
+        expect(bundle1.getImportPackages()).andReturn(b);
+        expect(bundle1.getHosts()).andReturn(new ArrayList<QuasiBundle>());
+        expect(bundle1.getRequiredBundles()).andReturn(new ArrayList<QuasiRequiredBundle>());
+
+        expect(regionDigraph.getRegion(BUNDLE_1_ID)).andReturn(regionA);
+        expect(regionDigraph.getRegion(EXPORTING_BUNDLE_ID)).andReturn(regionB);
+        expect(regionA.getName()).andReturn(REGION_A_NAME).anyTimes();
+        expect(regionB.getName()).andReturn(REGION_B_NAME).anyTimes();
+
+        BundleArtifact bundleArtifact = createMockBundleArtifact(TEST_BUNDLE_NAME, TEST_BUNDLE_VERSION, regionA);
+        BundleArtifact exporterArtifact = createMockBundleArtifact(EXPORTING_BUNDLE_NAME, TEST_BUNDLE_VERSION, regionB);
+
+        this.artifactRepository.add(exporterArtifact);
+
+        replay(bundleArtifact, quasiFrameworkFactory, regionDigraph, framework, bundle1, bundle2, regionA, regionB, importedPackage, provider,
+            exporter, exporterArtifact);
+
+        Set<Artifact> dependents = this.determiner.getDependents(bundleArtifact);
+        Set<Artifact> expected = new HashSet<Artifact>();
+        expected.add(exporterArtifact);
+        assertEquals(expected, dependents);
+
+        verify(bundleArtifact, quasiFrameworkFactory, regionDigraph, framework, bundle1, bundle2, regionA, regionB, importedPackage, provider,
+            exporter, exporterArtifact);
+    }
+
+    @Test
+    public void bundleWithHost() {
+        setTestBundleExpectations();
+        QuasiFramework framework = createMock(QuasiFramework.class);
+        expect(quasiFrameworkFactory.create()).andReturn(framework);
+        expect(framework.getBundles()).andReturn(getTestBundleSet());
+
+        expect(bundle1.getImportPackages()).andReturn(new ArrayList<QuasiImportPackage>());
+        ArrayList<QuasiBundle> b = new ArrayList<QuasiBundle>();
+        QuasiBundle host = createMockQuasiBundle(HOST_BUNDLE_NAME, TEST_BUNDLE_VERSION, HOST_BUNDLE_ID);
+        b.add(host);
+        expect(bundle1.getHosts()).andReturn(b);
+        expect(bundle1.getRequiredBundles()).andReturn(new ArrayList<QuasiRequiredBundle>());
+
+        expect(regionDigraph.getRegion(BUNDLE_1_ID)).andReturn(regionA);
+        expect(regionDigraph.getRegion(HOST_BUNDLE_ID)).andReturn(regionB);
+        expect(regionA.getName()).andReturn(REGION_A_NAME).anyTimes();
+        expect(regionB.getName()).andReturn(REGION_B_NAME).anyTimes();
+
+        BundleArtifact bundleArtifact = createMockBundleArtifact(TEST_BUNDLE_NAME, TEST_BUNDLE_VERSION, regionA);
+        BundleArtifact hostArtifact = createMockBundleArtifact(HOST_BUNDLE_NAME, TEST_BUNDLE_VERSION, regionB);
+
+        this.artifactRepository.add(hostArtifact);
+
+        replay(bundleArtifact, quasiFrameworkFactory, regionDigraph, framework, bundle1, bundle2, regionA, regionB, host, hostArtifact);
+
+        Set<Artifact> dependents = this.determiner.getDependents(bundleArtifact);
+        Set<Artifact> expected = new HashSet<Artifact>();
+        expected.add(hostArtifact);
+        assertEquals(expected, dependents);
+
+        verify(bundleArtifact, quasiFrameworkFactory, regionDigraph, framework, bundle1, bundle2, regionA, regionB, host, hostArtifact);
+    }
+
+    @Test
+    public void bundleRequiringAnotherBundle() {
+        setTestBundleExpectations();
+        QuasiFramework framework = createMock(QuasiFramework.class);
+        expect(quasiFrameworkFactory.create()).andReturn(framework);
+        expect(framework.getBundles()).andReturn(getTestBundleSet());
+
+        expect(bundle1.getImportPackages()).andReturn(new ArrayList<QuasiImportPackage>());
+        ArrayList<QuasiRequiredBundle> b = new ArrayList<QuasiRequiredBundle>();
+        QuasiBundle required = createMockQuasiBundle(REQUIRED_BUNDLE_NAME, TEST_BUNDLE_VERSION, REQUIRED_BUNDLE_ID);
+        expect(bundle1.getHosts()).andReturn(new ArrayList<QuasiBundle>());
+        QuasiRequiredBundle requiredBundle = createMock(QuasiRequiredBundle.class);
+        expect(requiredBundle.getProvider()).andReturn(required);
+        b.add(requiredBundle);
+        expect(bundle1.getRequiredBundles()).andReturn(b);
+
+        expect(regionDigraph.getRegion(BUNDLE_1_ID)).andReturn(regionA);
+        expect(regionDigraph.getRegion(REQUIRED_BUNDLE_ID)).andReturn(regionB);
+        expect(regionA.getName()).andReturn(REGION_A_NAME).anyTimes();
+        expect(regionB.getName()).andReturn(REGION_B_NAME).anyTimes();
+
+        BundleArtifact bundleArtifact = createMockBundleArtifact(TEST_BUNDLE_NAME, TEST_BUNDLE_VERSION, regionA);
+        BundleArtifact requiredArtifact = createMockBundleArtifact(REQUIRED_BUNDLE_NAME, TEST_BUNDLE_VERSION, regionB);
+
+        this.artifactRepository.add(requiredArtifact);
+
+        replay(bundleArtifact, quasiFrameworkFactory, regionDigraph, framework, bundle1, bundle2, regionA, regionB, requiredBundle, required,
+            requiredArtifact);
+
+        Set<Artifact> dependents = this.determiner.getDependents(bundleArtifact);
+        Set<Artifact> expected = new HashSet<Artifact>();
+        expected.add(requiredArtifact);
+        assertEquals(expected, dependents);
+
+        verify(bundleArtifact, quasiFrameworkFactory, regionDigraph, framework, bundle1, bundle2, regionA, regionB, requiredBundle, required,
+            requiredArtifact);
+    }
+
+    private List<QuasiBundle> getTestBundleSet() {
+        List<QuasiBundle> bundles = new ArrayList<QuasiBundle>();
+        bundles.add(bundle1);
+        bundles.add(bundle2);
+        return bundles;
+    }
+
+}
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/internal/bundle/ModelBundleListenerInitializerTests.java b/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/internal/bundle/ModelBundleListenerInitializerTests.java
new file mode 100644
index 0000000..51480f8
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/internal/bundle/ModelBundleListenerInitializerTests.java
@@ -0,0 +1,110 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model.internal.bundle;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+
+import org.eclipse.equinox.region.RegionDigraph;
+import org.eclipse.virgo.kernel.model.StubArtifactRepository;
+import org.eclipse.virgo.kernel.model.StubSpringContextAccessor;
+import org.eclipse.virgo.kernel.model.internal.DependencyDeterminer;
+import org.eclipse.virgo.kernel.osgi.framework.PackageAdminUtil;
+import org.eclipse.virgo.nano.serviceability.Assert.FatalAssertionException;
+import org.eclipse.virgo.test.stubs.framework.StubBundle;
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+import org.eclipse.virgo.test.stubs.region.StubRegion;
+import org.eclipse.virgo.test.stubs.support.TrueFilter;
+import org.junit.Test;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.Version;
+
+public class ModelBundleListenerInitializerTests {
+
+    private final StubArtifactRepository artifactRepository = new StubArtifactRepository();
+    
+    private final StubRegion region = new StubRegion("test-region", null);
+
+    private final PackageAdminUtil packageAdminUtil = createMock(PackageAdminUtil.class);
+
+    private final StubSpringContextAccessor springContextAccessor = new StubSpringContextAccessor();
+    
+    private final StubBundleContext bundleContext;
+
+    private final StubBundleContext systemBundleContext;
+
+    private final RegionDigraph regionDigraph = createMock(RegionDigraph.class);
+
+    {
+        StubBundle bundle = new StubBundle();
+        this.bundleContext = (StubBundleContext) bundle.getBundleContext();
+        StubBundle stubSystemBundle = new StubBundle(0L, "org.osgi.framework", new Version("0"), "loc");
+        this.systemBundleContext = (StubBundleContext) stubSystemBundle.getBundleContext();
+        this.bundleContext.addInstalledBundle(stubSystemBundle);
+        this.systemBundleContext.addInstalledBundle(bundle);
+        String filterString = String.format("(&(objectClass=%s)(artifactType=bundle))", DependencyDeterminer.class.getCanonicalName());
+        this.bundleContext.addFilter(filterString, new TrueFilter(filterString));
+        expect(regionDigraph.getRegion(bundle)).andReturn(region).anyTimes();
+    }
+
+    private final ModelBundleListenerInitializer initializer = new ModelBundleListenerInitializer(this.artifactRepository, this.packageAdminUtil, this.bundleContext, this.regionDigraph, this.springContextAccessor);
+
+    @Test(expected = FatalAssertionException.class)
+    public void nullArtifactRepository() {
+        new ModelBundleListenerInitializer(null, packageAdminUtil, bundleContext, regionDigraph, this.springContextAccessor);
+    }
+
+    @Test(expected = FatalAssertionException.class)
+    public void nullPackageAdminUtil() {
+        new ModelBundleListenerInitializer(artifactRepository, null, bundleContext, regionDigraph, this.springContextAccessor);
+    }
+
+    @Test(expected = FatalAssertionException.class)
+    public void nullKernelBundleContext() {
+        new ModelBundleListenerInitializer(artifactRepository, packageAdminUtil, null, regionDigraph, this.springContextAccessor);
+    }
+
+    @Test(expected = FatalAssertionException.class)
+    public void nullRegionDigraph() {
+        new ModelBundleListenerInitializer(artifactRepository, packageAdminUtil, bundleContext, null, this.springContextAccessor);
+    }
+
+    @Test(expected = FatalAssertionException.class)
+    public void nullSpringContextAccessor() {
+        new ModelBundleListenerInitializer(artifactRepository, packageAdminUtil, bundleContext, regionDigraph, null);
+    }
+
+    @Test
+    public void initialize() throws IOException, InvalidSyntaxException {
+        replay(this.regionDigraph);
+        assertEquals(0, this.systemBundleContext.getBundleListeners().size());
+        this.initializer.initialize();
+        assertEquals(1, this.systemBundleContext.getBundleListeners().size());
+        assertEquals(1, this.artifactRepository.getArtifacts().size());
+        verify(this.regionDigraph);
+    }
+
+    @Test
+    public void destroy() throws IOException, InvalidSyntaxException {
+        replay(this.regionDigraph);
+        this.initializer.initialize();
+        assertEquals(1, this.systemBundleContext.getBundleListeners().size());
+        this.initializer.destroy();
+        assertEquals(0, this.systemBundleContext.getBundleListeners().size());
+        verify(this.regionDigraph);
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/internal/bundle/ModelBundleListenerTests.java b/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/internal/bundle/ModelBundleListenerTests.java
new file mode 100644
index 0000000..f5cd060
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/internal/bundle/ModelBundleListenerTests.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model.internal.bundle;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.isA;
+import static org.easymock.EasyMock.replay;
+import static org.junit.Assert.assertEquals;
+
+import org.eclipse.equinox.region.RegionDigraph;
+import org.eclipse.virgo.kernel.model.StubArtifactRepository;
+import org.eclipse.virgo.kernel.model.StubSpringContextAccessor;
+import org.eclipse.virgo.kernel.model.internal.DependencyDeterminer;
+import org.eclipse.virgo.kernel.osgi.framework.PackageAdminUtil;
+import org.eclipse.virgo.nano.serviceability.Assert.FatalAssertionException;
+import org.eclipse.virgo.test.stubs.framework.StubBundle;
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+import org.eclipse.virgo.test.stubs.region.StubRegion;
+import org.eclipse.virgo.test.stubs.support.TrueFilter;
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleEvent;
+
+public class ModelBundleListenerTests {
+
+    private final StubArtifactRepository artifactRepository = new StubArtifactRepository();
+
+    private final PackageAdminUtil packageAdminUtil = createMock(PackageAdminUtil.class);
+    
+    private final StubSpringContextAccessor springContextAccessor = new StubSpringContextAccessor();
+
+    private final StubBundleContext bundleContext;
+    
+    private final RegionDigraph regionDigraph = createMock(RegionDigraph.class);
+    
+    private final StubRegion region = new StubRegion("test-region", null);
+
+    {
+        this.bundleContext = new StubBundleContext();
+        String filterString = String.format("(&(objectClass=%s)(artifactType=bundle))", DependencyDeterminer.class.getCanonicalName());
+        this.bundleContext.addFilter(filterString, new TrueFilter(filterString));
+        expect(regionDigraph.getRegion(isA(Bundle.class))).andReturn(region).anyTimes();
+    }
+
+    private final ModelBundleListener listener = new ModelBundleListener(this.bundleContext, this.artifactRepository, this.packageAdminUtil, this.regionDigraph, this.springContextAccessor);
+
+    @Test(expected = FatalAssertionException.class)
+    public void nullBundleContext() {
+        new ModelBundleListener(null, artifactRepository, packageAdminUtil, regionDigraph, this.springContextAccessor);
+    }
+
+    @Test(expected = FatalAssertionException.class)
+    public void nullArtifactRepository() {
+        new ModelBundleListener(bundleContext, null, packageAdminUtil, regionDigraph, this.springContextAccessor);
+    }
+
+    @Test(expected = FatalAssertionException.class)
+    public void nullPackageAdminUtil() {
+        new ModelBundleListener(bundleContext, artifactRepository, null, regionDigraph, this.springContextAccessor);
+    }
+    
+    @Test(expected = FatalAssertionException.class)
+    public void nullRegionDigraph() {
+        new ModelBundleListener(bundleContext, artifactRepository, packageAdminUtil, null, this.springContextAccessor);
+    }
+    
+    @Test(expected = FatalAssertionException.class)
+    public void nullSpringContextAccessor() {
+        new ModelBundleListener(bundleContext, artifactRepository, packageAdminUtil, regionDigraph, null);
+    }
+
+    @Test
+    public void installed() {
+        replay(regionDigraph);
+        assertEquals(0, this.artifactRepository.getArtifacts().size());
+        BundleEvent event1 = new BundleEvent(BundleEvent.INSTALLED, new StubBundle().setBundleContext(this.bundleContext));
+        this.listener.bundleChanged(event1);
+        assertEquals(1, this.artifactRepository.getArtifacts().size());
+        BundleEvent event2 = new BundleEvent(BundleEvent.INSTALLED, new StubBundle().setBundleContext(this.bundleContext));
+        this.listener.bundleChanged(event2);
+        assertEquals(1, this.artifactRepository.getArtifacts().size());
+    }
+
+    @Test
+    public void uninstalled() {
+        replay(regionDigraph);
+        StubBundle myBundle = new StubBundle().setBundleContext(this.bundleContext);
+        BundleEvent event1 = new BundleEvent(BundleEvent.INSTALLED, myBundle);
+        this.listener.bundleChanged(event1);
+        assertEquals(1, this.artifactRepository.getArtifacts().size());
+        myBundle.setState(Bundle.UNINSTALLED);
+        BundleEvent event2 = new BundleEvent(BundleEvent.UNINSTALLED, myBundle);
+        this.listener.bundleChanged(event2);
+        assertEquals(0, this.artifactRepository.getArtifacts().size());
+        BundleEvent event3 = new BundleEvent(BundleEvent.UNINSTALLED, myBundle);
+        this.listener.bundleChanged(event3);
+        assertEquals(0, this.artifactRepository.getArtifacts().size());
+    }
+
+    @Test
+    public void unknownEventType() {
+        replay(regionDigraph);
+        BundleEvent event = new BundleEvent(-1, new StubBundle().setBundleContext(this.bundleContext));
+        this.listener.bundleChanged(event);
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/internal/bundle/NativeBundleArtifactTests.java b/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/internal/bundle/NativeBundleArtifactTests.java
new file mode 100644
index 0000000..94cb6f5
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/internal/bundle/NativeBundleArtifactTests.java
@@ -0,0 +1,132 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model.internal.bundle;
+
+import static org.easymock.EasyMock.aryEq;
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+
+import org.eclipse.equinox.region.Region;
+import org.eclipse.virgo.kernel.model.ArtifactState;
+import org.eclipse.virgo.kernel.model.StubSpringContextAccessor;
+import org.eclipse.virgo.kernel.model.internal.AbstractArtifact;
+import org.eclipse.virgo.kernel.model.internal.DependencyDeterminer;
+import org.eclipse.virgo.kernel.osgi.framework.PackageAdminUtil;
+import org.eclipse.virgo.nano.serviceability.Assert.FatalAssertionException;
+import org.eclipse.virgo.test.stubs.framework.StubBundle;
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+import org.eclipse.virgo.test.stubs.support.TrueFilter;
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleException;
+
+public class NativeBundleArtifactTests {
+
+    private final PackageAdminUtil packageAdminUtil = createMock(PackageAdminUtil.class);
+
+    private final StubBundle bundle = new StubBundle();
+
+    private final StubBundleContext bundleContext;
+    
+    private final StubSpringContextAccessor springContextAccessor = new StubSpringContextAccessor();
+    
+    private final Region region = createMock(Region.class);
+
+    {
+        this.bundleContext = (StubBundleContext) bundle.getBundleContext();
+        String filterString = String.format("(&(objectClass=%s)(artifactType=bundle))", DependencyDeterminer.class.getCanonicalName());
+        bundleContext.addFilter(filterString, new TrueFilter(filterString));
+        expect(this.region.getName()).andReturn("test.region").anyTimes();
+    }
+
+    private final AbstractArtifact artifact = new NativeBundleArtifact(this.bundleContext, this.packageAdminUtil, this.bundle, this.region, this.springContextAccessor);
+
+    @Test(expected = FatalAssertionException.class)
+    public void nullBundleContext() {
+        new NativeBundleArtifact(null, packageAdminUtil, bundle, this.region, this.springContextAccessor);
+    }
+
+    @Test(expected = FatalAssertionException.class)
+    public void nullPackageAdminUtil() {
+        new NativeBundleArtifact(bundleContext, null, bundle, this.region, this.springContextAccessor);
+    }
+
+    @Test(expected = FatalAssertionException.class)
+    public void nullBundle() {
+        new NativeBundleArtifact(bundleContext, packageAdminUtil, null, this.region, this.springContextAccessor);
+    }
+
+    @Test(expected = FatalAssertionException.class)
+    public void nullRegion() {
+        new NativeBundleArtifact(bundleContext, packageAdminUtil, bundle, null, this.springContextAccessor);
+    }
+
+    @Test(expected = FatalAssertionException.class)
+    public void nullSpringContextAccessor() {
+        new NativeBundleArtifact(bundleContext, packageAdminUtil, bundle, this.region, null);
+    }
+
+    @Test
+    public void getState() {
+        this.bundle.setState(Bundle.UNINSTALLED);
+        assertEquals(ArtifactState.UNINSTALLED, this.artifact.getState());
+        this.bundle.setState(Bundle.INSTALLED);
+        assertEquals(ArtifactState.INSTALLED, this.artifact.getState());
+        this.bundle.setState(Bundle.RESOLVED);
+        assertEquals(ArtifactState.RESOLVED, this.artifact.getState());
+        this.bundle.setState(Bundle.STARTING);
+        assertEquals(ArtifactState.STARTING, this.artifact.getState());
+        this.bundle.setState(Bundle.STOPPING);
+        assertEquals(ArtifactState.STOPPING, this.artifact.getState());
+        this.bundle.setState(Bundle.ACTIVE);
+        assertEquals(ArtifactState.ACTIVE, this.artifact.getState());
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void illegalState() {
+        this.bundle.setState(10000);
+        this.artifact.getState();
+    }
+
+    @Test
+    public void updateAndRefresh() {
+        this.packageAdminUtil.synchronouslyRefreshPackages(aryEq(new Bundle[] { this.bundle }));
+        replay(this.packageAdminUtil);
+        this.artifact.refresh();
+        verify(this.packageAdminUtil);
+    }
+
+    @Test
+    public void start() throws BundleException {
+        this.bundle.setState(Bundle.RESOLVED);
+        this.artifact.start();
+        assertEquals(Bundle.ACTIVE, this.bundle.getState());
+    }
+
+    @Test
+    public void stop() throws BundleException {
+        this.bundle.setState(Bundle.ACTIVE);
+        this.artifact.stop();
+        assertEquals(Bundle.RESOLVED, this.bundle.getState());
+
+    }
+
+    @Test
+    public void uninstall() throws BundleException {
+        this.bundle.setState(Bundle.ACTIVE);
+        this.artifact.uninstall();
+        assertEquals(Bundle.UNINSTALLED, this.bundle.getState());
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/internal/configurationadmin/ConfgurationArtifactTests.java b/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/internal/configurationadmin/ConfgurationArtifactTests.java
new file mode 100644
index 0000000..8b4d953
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/internal/configurationadmin/ConfgurationArtifactTests.java
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model.internal.configurationadmin;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import java.io.IOException;
+
+import org.eclipse.virgo.kernel.model.ArtifactState;
+import org.eclipse.virgo.kernel.model.internal.DependencyDeterminer;
+import org.eclipse.virgo.nano.serviceability.Assert.FatalAssertionException;
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+import org.eclipse.virgo.test.stubs.region.StubRegion;
+import org.eclipse.virgo.test.stubs.service.cm.StubConfigurationAdmin;
+import org.eclipse.virgo.test.stubs.support.TrueFilter;
+import org.junit.Test;
+import org.osgi.framework.InvalidSyntaxException;
+
+public class ConfgurationArtifactTests {
+
+    private final StubBundleContext bundleContext;
+    {
+        bundleContext = new StubBundleContext();
+        String filterString = String.format("(&(objectClass=%s)(artifactType=configuration))", DependencyDeterminer.class.getCanonicalName());
+        bundleContext.addFilter(filterString, new TrueFilter(filterString));
+    }
+
+    private final StubConfigurationAdmin configurationAdmin = new StubConfigurationAdmin();
+    
+    private final StubRegion region = new StubRegion("test-region", null);
+
+    private final ConfigurationArtifact artifact = new ConfigurationArtifact(bundleContext, configurationAdmin, "test-pid", region);
+
+    @Test(expected = FatalAssertionException.class)
+    public void nullBundleContext() {
+        new ConfigurationArtifact(null, configurationAdmin, "test-pid", region);
+    }
+
+    @Test(expected = FatalAssertionException.class)
+    public void nullConfigurationAdmin() {
+        new ConfigurationArtifact(bundleContext, null, "test-pid", region);
+    }
+
+    @Test(expected = FatalAssertionException.class)
+    public void nullArtifactRepository() {
+        new ConfigurationArtifact(bundleContext, configurationAdmin, null, region);
+    }
+
+    @Test(expected = FatalAssertionException.class)
+    public void nullRegion() {
+        new ConfigurationArtifact(bundleContext, configurationAdmin, "test-pid", null);
+    }
+
+    @Test
+    public void getState() {
+        assertEquals(ArtifactState.ACTIVE, this.artifact.getState());
+    }
+
+    @Test
+    public void updateAndRefresh() {
+        this.artifact.refresh();
+    }
+
+    @Test
+    public void start() {
+        this.artifact.start();
+    }
+
+    @Test
+    public void stop() {
+        this.artifact.stop();
+    }
+
+    @Test
+    public void uninstall() throws IOException, InvalidSyntaxException {
+        this.configurationAdmin.createConfiguration("test-pid").addProperty("key", "value");
+        assertEquals(1, this.configurationAdmin.listConfigurations(null).length);
+        this.artifact.uninstall();
+        assertNull(this.configurationAdmin.listConfigurations(null));
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/internal/configurationadmin/ModelConfigurationListenerInitializerTests.java b/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/internal/configurationadmin/ModelConfigurationListenerInitializerTests.java
new file mode 100644
index 0000000..6cb3421
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/internal/configurationadmin/ModelConfigurationListenerInitializerTests.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model.internal.configurationadmin;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+
+import org.junit.Test;
+import org.osgi.framework.InvalidSyntaxException;
+
+
+import org.eclipse.virgo.kernel.model.StubArtifactRepository;
+import org.eclipse.virgo.kernel.model.internal.DependencyDeterminer;
+import org.eclipse.virgo.kernel.model.internal.configurationadmin.ModelConfigurationListenerInitializer;
+import org.eclipse.virgo.nano.serviceability.Assert.FatalAssertionException;
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+import org.eclipse.virgo.test.stubs.region.StubRegion;
+import org.eclipse.virgo.test.stubs.service.cm.StubConfigurationAdmin;
+import org.eclipse.virgo.test.stubs.support.TrueFilter;
+
+public class ModelConfigurationListenerInitializerTests {
+
+    private final StubArtifactRepository artifactRepository = new StubArtifactRepository();
+
+    private final StubBundleContext bundleContext = new StubBundleContext();
+    {
+        String filterString = String.format("(&(objectClass=%s)(artifactType=configuration))", DependencyDeterminer.class.getCanonicalName());
+        this.bundleContext.addFilter(filterString, new TrueFilter(filterString));
+    }
+
+    private final StubRegion region = new StubRegion("test-region", null);
+
+    private final StubConfigurationAdmin configurationAdmin = new StubConfigurationAdmin();
+
+    private final ModelConfigurationListenerInitializer initializer = new ModelConfigurationListenerInitializer(artifactRepository, bundleContext, configurationAdmin, region);
+
+    @Test(expected = FatalAssertionException.class)
+    public void nullArtifactRepository() {
+        new ModelConfigurationListenerInitializer(null, bundleContext, configurationAdmin, region);
+    }
+
+    @Test(expected = FatalAssertionException.class)
+    public void nullBundleContext() {
+        new ModelConfigurationListenerInitializer(artifactRepository, null, configurationAdmin, region);
+    }
+
+    @Test(expected = FatalAssertionException.class)
+    public void nullConfigurationAdmin() {
+        new ModelConfigurationListenerInitializer(artifactRepository, bundleContext, null, region);
+    }
+
+    @Test(expected = FatalAssertionException.class)
+    public void nullRegion() {
+        new ModelConfigurationListenerInitializer(artifactRepository, bundleContext, configurationAdmin, null);
+    }
+
+    @Test
+    public void initialize() throws IOException, InvalidSyntaxException {
+        this.configurationAdmin.createConfiguration("test-pid").addProperty("key", "value");
+        assertEquals(0, this.bundleContext.getServiceRegistrations().size());
+        this.initializer.initialize();
+        assertEquals(1, this.bundleContext.getServiceRegistrations().size());
+        assertEquals(1, this.artifactRepository.getArtifacts().size());
+    }
+
+    @Test
+    public void destroy() throws IOException, InvalidSyntaxException {
+        this.initializer.initialize();
+        assertEquals(1, this.bundleContext.getServiceRegistrations().size());
+        this.initializer.destroy();
+        assertEquals(0, this.bundleContext.getServiceRegistrations().size());
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/internal/configurationadmin/ModelConfigurationListenerTests.java b/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/internal/configurationadmin/ModelConfigurationListenerTests.java
new file mode 100644
index 0000000..e0f1cc1
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/internal/configurationadmin/ModelConfigurationListenerTests.java
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model.internal.configurationadmin;
+
+import static org.junit.Assert.assertEquals;
+
+import org.eclipse.virgo.kernel.model.StubArtifactRepository;
+import org.eclipse.virgo.kernel.model.internal.DependencyDeterminer;
+import org.eclipse.virgo.nano.serviceability.Assert.FatalAssertionException;
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+import org.eclipse.virgo.test.stubs.framework.StubServiceRegistration;
+import org.eclipse.virgo.test.stubs.region.StubRegion;
+import org.eclipse.virgo.test.stubs.service.cm.StubConfigurationAdmin;
+import org.eclipse.virgo.test.stubs.support.TrueFilter;
+import org.junit.Test;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.cm.ConfigurationEvent;
+
+public class ModelConfigurationListenerTests {
+
+    private final StubArtifactRepository artifactRepository = new StubArtifactRepository();
+
+    private final StubBundleContext bundleContext;
+    {
+        this.bundleContext = new StubBundleContext();
+        String filterString = String.format("(&(objectClass=%s)(artifactType=configuration))", DependencyDeterminer.class.getCanonicalName());
+        this.bundleContext.addFilter(filterString, new TrueFilter(filterString));
+    }
+
+    private final ServiceReference<ConfigurationAdmin> reference = new StubServiceRegistration<ConfigurationAdmin>(bundleContext, ConfigurationAdmin.class.getCanonicalName()).getReference();
+
+    private final StubConfigurationAdmin configurationAdmin = new StubConfigurationAdmin();
+
+    private final StubRegion region = new StubRegion("test-region", null);
+    
+    private final ModelConfigurationListener listener = new ModelConfigurationListener(artifactRepository, bundleContext, configurationAdmin, region);
+
+    @Test(expected = FatalAssertionException.class)
+    public void nullArtifactRepository() {
+        new ModelConfigurationListener(null, bundleContext, configurationAdmin, region);
+    }
+
+    @Test(expected = FatalAssertionException.class)
+    public void nullBundleContext() {
+        new ModelConfigurationListener(artifactRepository, null, configurationAdmin, region);
+    }
+
+    @Test(expected = FatalAssertionException.class)
+    public void nullConfigurationAdmin() {
+        new ModelConfigurationListener(artifactRepository, bundleContext, null, region);
+    }
+
+    @Test(expected = FatalAssertionException.class)
+    public void nullRegion() {
+        new ModelConfigurationListener(artifactRepository, bundleContext, configurationAdmin, null);
+    }
+
+    @Test
+    public void added() {
+        ConfigurationEvent event = new ConfigurationEvent(this.reference, ConfigurationEvent.CM_UPDATED, null, "test");
+        this.listener.configurationEvent(event);
+        assertEquals(1, this.artifactRepository.getArtifacts().size());
+    }
+
+    @Test
+    public void updated() {
+        ConfigurationEvent event1 = new ConfigurationEvent(this.reference, ConfigurationEvent.CM_UPDATED, null, "test");
+        this.listener.configurationEvent(event1);
+        ConfigurationEvent event2 = new ConfigurationEvent(this.reference, ConfigurationEvent.CM_UPDATED, null, "test");
+        this.listener.configurationEvent(event2);
+        assertEquals(1, this.artifactRepository.getArtifacts().size());
+    }
+
+    @Test
+    public void deleted() {
+        ConfigurationEvent event1 = new ConfigurationEvent(this.reference, ConfigurationEvent.CM_UPDATED, null, "test");
+        this.listener.configurationEvent(event1);
+        ConfigurationEvent event2 = new ConfigurationEvent(this.reference, ConfigurationEvent.CM_DELETED, null, "test");
+        this.listener.configurationEvent(event2);
+        assertEquals(0, this.artifactRepository.getArtifacts().size());
+    }
+
+    @Test
+    public void deletedNonExistant() {
+        ConfigurationEvent event = new ConfigurationEvent(this.reference, ConfigurationEvent.CM_DELETED, null, "test");
+        this.listener.configurationEvent(event);
+        assertEquals(0, this.artifactRepository.getArtifacts().size());
+    }
+
+    @Test
+    public void unknownEventType() {
+        ConfigurationEvent event = new ConfigurationEvent(this.reference, 3, null, "test");
+        this.listener.configurationEvent(event);
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/internal/deployer/DeployerArtifactTests.java b/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/internal/deployer/DeployerArtifactTests.java
new file mode 100644
index 0000000..cb1e505
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/internal/deployer/DeployerArtifactTests.java
@@ -0,0 +1,204 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model.internal.deployer;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.eq;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.expectLastCall;
+import static org.easymock.EasyMock.getCurrentArguments;
+import static org.easymock.EasyMock.notNull;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.junit.Test;
+import org.osgi.framework.Version;
+import org.easymock.IAnswer;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact.State;
+import org.eclipse.virgo.kernel.model.ArtifactState;
+import org.eclipse.virgo.kernel.model.internal.DependencyDeterminer;
+import org.eclipse.virgo.kernel.model.internal.deployer.DeployerArtifact;
+import org.eclipse.virgo.nano.core.AbortableSignal;
+import org.eclipse.virgo.nano.core.KernelException;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.serviceability.Assert.FatalAssertionException;
+import org.eclipse.virgo.kernel.stubs.StubInstallArtifact;
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+import org.eclipse.virgo.test.stubs.region.StubRegion;
+import org.eclipse.virgo.test.stubs.support.TrueFilter;
+
+public class DeployerArtifactTests {
+
+    private final StubBundleContext bundleContext = new StubBundleContext();
+    {
+        String filterString = String.format("(&(objectClass=%s)(artifactType=bundle))", DependencyDeterminer.class.getCanonicalName());
+        bundleContext.addFilter(filterString, new TrueFilter(filterString));
+    }
+
+    private final StubRegion region = new StubRegion("test-region", null);
+    
+    private final DeployerArtifact artifact = new DeployerArtifact(bundleContext, new StubInstallArtifact("bundle"), region);
+
+    @Test(expected = FatalAssertionException.class)
+    public void testNullBundleContext() {
+        new DeployerArtifact(null, new StubInstallArtifact("bundle"), region);
+    }
+
+    @Test(expected = FatalAssertionException.class)
+    public void testNullInstallArtifact() {
+        new DeployerArtifact(this.bundleContext, null, region);
+    }
+
+    @Test(expected = FatalAssertionException.class)
+    public void testNullRegion() {
+        new DeployerArtifact(this.bundleContext, new StubInstallArtifact("bundle"), null);
+    }
+
+    @Test
+    public void getState() {
+        InstallArtifact installArtifact = createMock(InstallArtifact.class);
+
+        expect(installArtifact.getType()).andReturn("bundle");
+        expect(installArtifact.getName()).andReturn("test");
+        expect(installArtifact.getVersion()).andReturn(Version.emptyVersion);
+
+        expect(installArtifact.getState()).andReturn(State.INITIAL);
+        expect(installArtifact.getState()).andReturn(State.INSTALLING);
+        expect(installArtifact.getState()).andReturn(State.INSTALLED);
+        expect(installArtifact.getState()).andReturn(State.RESOLVING);
+        expect(installArtifact.getState()).andReturn(State.RESOLVED);
+        expect(installArtifact.getState()).andReturn(State.STARTING);
+        expect(installArtifact.getState()).andReturn(State.ACTIVE);
+        expect(installArtifact.getState()).andReturn(State.STOPPING);
+        expect(installArtifact.getState()).andReturn(State.UNINSTALLING);
+        expect(installArtifact.getState()).andReturn(State.UNINSTALLED);
+        replay(installArtifact);
+
+        DeployerArtifact artifact1 = new DeployerArtifact(bundleContext, installArtifact, region);
+
+        assertEquals(ArtifactState.INITIAL, artifact1.getState());
+        assertEquals(ArtifactState.INSTALLING, artifact1.getState());
+        assertEquals(ArtifactState.INSTALLED, artifact1.getState());
+        assertEquals(ArtifactState.RESOLVING, artifact1.getState());
+        assertEquals(ArtifactState.RESOLVED, artifact1.getState());
+        assertEquals(ArtifactState.STARTING, artifact1.getState());
+        assertEquals(ArtifactState.ACTIVE, artifact1.getState());
+        assertEquals(ArtifactState.STOPPING, artifact1.getState());
+        assertEquals(ArtifactState.UNINSTALLING, artifact1.getState());
+        assertEquals(ArtifactState.UNINSTALLED, artifact1.getState());
+
+        verify(installArtifact);
+    }
+
+    @Test
+    public void startSuccessful() throws KernelException, DeploymentException {
+    	InstallArtifact installArtifact = createMock(InstallArtifact.class);
+
+        expect(installArtifact.getType()).andReturn("bundle");
+        expect(installArtifact.getName()).andReturn("test-bundle");
+        expect(installArtifact.getVersion()).andReturn(new Version("1.0.0"));
+        installArtifact.start((AbortableSignal) notNull());
+        expectLastCall().andAnswer(new IAnswer<Object>() {
+            public Object answer() {
+                AbortableSignal signal = (AbortableSignal) getCurrentArguments()[0];
+                signal.signalSuccessfulCompletion();
+                return null;
+            }
+        });
+        replay(installArtifact);
+        
+        DeployerArtifact artifact = new DeployerArtifact(bundleContext, installArtifact, region);
+        artifact.start();
+
+        verify(installArtifact);
+    }
+
+    @Test(expected = RuntimeException.class)
+    public void startAborted() throws KernelException, DeploymentException {
+    	InstallArtifact installArtifact = createMock(InstallArtifact.class);
+    	
+    	expect(installArtifact.getType()).andReturn("bundle");
+    	expect(installArtifact.getName()).andReturn("test-bundle");
+    	expect(installArtifact.getVersion()).andReturn(new Version("1.0.0"));
+    	installArtifact.start((AbortableSignal) notNull());
+    	expectLastCall().andAnswer(new IAnswer<Object>() {
+    		public Object answer() {
+    			AbortableSignal signal = (AbortableSignal) getCurrentArguments()[0];
+    			signal.signalAborted();
+    			return null;
+    		}
+    	});
+    	replay(installArtifact);
+    	
+        DeployerArtifact artifact = new DeployerArtifact(bundleContext, installArtifact, region);
+    	artifact.start();
+    }
+
+    @Test
+    public void stop() throws DeploymentException {
+    	InstallArtifact installArtifact = createMock(InstallArtifact.class);
+
+    	expect(installArtifact.getType()).andReturn("bundle");
+    	expect(installArtifact.getName()).andReturn("test-bundle");
+    	expect(installArtifact.getVersion()).andReturn(new Version("1.0.0"));
+    	installArtifact.stop();
+    	replay(installArtifact);
+
+    	DeployerArtifact artifact = new DeployerArtifact(bundleContext, installArtifact, region);
+        artifact.stop();
+
+        verify(installArtifact);
+    }
+
+    @Test
+    public void uninstall() throws DeploymentException {
+        this.artifact.uninstall();
+    }
+
+    @Test
+    public void updateAndRefresh() throws DeploymentException {
+        this.artifact.refresh();
+    }
+
+    @Test
+    public void getProperties() throws DeploymentException {
+    	InstallArtifact installArtifact = createMock(InstallArtifact.class);
+
+    	expect(installArtifact.getType()).andReturn("bundle");
+    	expect(installArtifact.getName()).andReturn("test-bundle");
+    	expect(installArtifact.getVersion()).andReturn(new Version("1.0.0"));
+        Set<String> names = new HashSet<String>(Arrays.asList("foo", "bar", "deleted"));
+    	expect(installArtifact.getPropertyNames()).andReturn(names);
+    	expect(installArtifact.getProperty(eq("foo"))).andReturn("FOO");
+    	expect(installArtifact.getProperty(eq("bar"))).andReturn("BAR");
+		expect(installArtifact.getProperty(eq("deleted"))).andReturn(null);
+
+		replay(installArtifact);
+
+    	DeployerArtifact artifact = new DeployerArtifact(bundleContext, installArtifact, region);
+        Map<String, String> properties = artifact.getProperties();
+
+        assertEquals("null values should be omitted.", 2, properties.size());
+        assertEquals("FOO", properties.get("foo"));
+        assertEquals("BAR", properties.get("bar"));
+
+        verify(installArtifact);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/internal/deployer/DeployerBundleArtifactTests.java b/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/internal/deployer/DeployerBundleArtifactTests.java
new file mode 100644
index 0000000..3ffc8b3
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/internal/deployer/DeployerBundleArtifactTests.java
@@ -0,0 +1,131 @@
+package org.eclipse.virgo.kernel.model.internal.deployer;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.eq;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.notNull;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+
+import java.net.URI;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.virgo.kernel.install.artifact.BundleInstallArtifact;
+import org.eclipse.virgo.kernel.model.StubSpringContextAccessor;
+import org.eclipse.virgo.kernel.model.internal.DependencyDeterminer;
+import org.eclipse.virgo.kernel.model.internal.SpringContextAccessor;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.serviceability.Assert.FatalAssertionException;
+import org.eclipse.virgo.test.stubs.framework.StubBundle;
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+import org.eclipse.virgo.test.stubs.region.StubRegion;
+import org.eclipse.virgo.test.stubs.support.TrueFilter;
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.Version;
+
+public class DeployerBundleArtifactTests {
+
+    private final StubBundleContext bundleContext = new StubBundleContext();
+    {
+        String filterString = String.format("(&(objectClass=%s)(artifactType=bundle))", DependencyDeterminer.class.getCanonicalName());
+        bundleContext.addFilter(filterString, new TrueFilter(filterString));
+    }
+
+	private final StubRegion region = new StubRegion("test-region", null);
+
+	private SpringContextAccessor springContextAccessor = new StubSpringContextAccessor();
+
+	@Test(expected = FatalAssertionException.class)
+	public void testNullBundleContext() {
+		BundleInstallArtifact installArtifact = createMock(BundleInstallArtifact.class);
+		new DeployerBundleArtifact(null, installArtifact, region, springContextAccessor);
+	}
+
+	@Test(expected = FatalAssertionException.class)
+	public void testNullInstallArtifact() {
+		new DeployerBundleArtifact(bundleContext, null, region, springContextAccessor);
+	}
+	
+	@Test(expected = FatalAssertionException.class)
+	public void testNullRegion() {
+		BundleInstallArtifact installArtifact = createMock(BundleInstallArtifact.class);
+		new DeployerBundleArtifact(bundleContext, installArtifact, null, springContextAccessor);
+	}
+	
+	@Test(expected = FatalAssertionException.class)
+	public void testNullSpringContextAccessor() {
+		BundleInstallArtifact installArtifact = createMock(BundleInstallArtifact.class);
+		new DeployerBundleArtifact(bundleContext, installArtifact, region, null);
+	}
+
+    @Test
+    public void deleteEntry() throws DeploymentException {
+		BundleInstallArtifact installArtifact = createMock(BundleInstallArtifact.class);
+
+    	expect(installArtifact.getType()).andReturn("bundle");
+    	expect(installArtifact.getName()).andReturn("test-bundle");
+    	expect(installArtifact.getVersion()).andReturn(new Version("1.0.0"));
+    	installArtifact.deleteEntry("foo");
+    	replay(installArtifact);
+
+    	DeployerBundleArtifact artifact = new DeployerBundleArtifact(bundleContext, installArtifact, region, springContextAccessor);
+        artifact.deleteEntry("foo");
+
+        verify(installArtifact);
+    }
+
+    @Test
+    public void updateEntry() throws DeploymentException {
+    	BundleInstallArtifact installArtifact = createMock(BundleInstallArtifact.class);
+    	
+    	expect(installArtifact.getType()).andReturn("bundle");
+    	expect(installArtifact.getName()).andReturn("test-bundle");
+    	expect(installArtifact.getVersion()).andReturn(new Version("1.0.0"));
+    	installArtifact.updateEntry((URI) notNull(), eq("bar"));
+    	replay(installArtifact);
+    	
+    	DeployerBundleArtifact artifact = new DeployerBundleArtifact(bundleContext, installArtifact, region, springContextAccessor);
+    	artifact.updateEntry("foo", "bar");
+    	
+    	verify(installArtifact);
+    }
+
+    @Test
+    public void getProperties() throws DeploymentException {
+    	BundleInstallArtifact installArtifact = createMock(BundleInstallArtifact.class);
+
+    	expect(installArtifact.getType()).andReturn("bundle");
+    	expect(installArtifact.getName()).andReturn("test-bundle");
+    	expect(installArtifact.getVersion()).andReturn(new Version("1.0.0"));
+		Set<String> names = new HashSet<String>(Arrays.asList("foo", "bar", "deleted"));
+    	expect(installArtifact.getPropertyNames()).andReturn(names);
+    	expect(installArtifact.getProperty(eq("foo"))).andReturn("FOO");
+    	expect(installArtifact.getProperty(eq("bar"))).andReturn("BAR");
+		expect(installArtifact.getProperty(eq("deleted"))).andReturn(null);
+		Bundle bundle = new StubBundle();
+		expect(installArtifact.getBundle()).andReturn(bundle);
+
+		SpringContextAccessor springContextAccessor = createMock(SpringContextAccessor.class);
+		expect(springContextAccessor.isSpringPowered((Bundle) notNull())).andReturn(true);
+
+		replay(installArtifact, springContextAccessor);
+
+        DeployerBundleArtifact artifact = new DeployerBundleArtifact(bundleContext, installArtifact, region, springContextAccessor);
+        Map<String, String> properties = artifact.getProperties();
+
+        assertEquals("null values should be omitted.", 4, properties.size());
+        assertEquals("FOO", properties.get("foo"));
+        assertEquals("BAR", properties.get("bar"));
+
+        assertEquals("" + bundle.getBundleId(), properties.get("Bundle Id"));
+        assertEquals("true", properties.get("Spring"));
+
+        verify(installArtifact, springContextAccessor);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/internal/deployer/DeployerCompositeArtifactDependencyDeterminerTests.java b/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/internal/deployer/DeployerCompositeArtifactDependencyDeterminerTests.java
new file mode 100644
index 0000000..12c9195
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/internal/deployer/DeployerCompositeArtifactDependencyDeterminerTests.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model.internal.deployer;
+
+import static org.junit.Assert.assertEquals;
+
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.model.RuntimeArtifactRepository;
+import org.eclipse.virgo.kernel.model.StubArtifactRepository;
+import org.eclipse.virgo.kernel.model.StubCompositeArtifact;
+import org.eclipse.virgo.kernel.model.internal.DependencyDeterminer;
+import org.eclipse.virgo.kernel.stubs.StubInstallArtifact;
+import org.eclipse.virgo.kernel.stubs.StubPlanInstallArtifact;
+import org.eclipse.virgo.nano.serviceability.Assert.FatalAssertionException;
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+import org.eclipse.virgo.test.stubs.region.StubRegion;
+import org.eclipse.virgo.test.stubs.support.TrueFilter;
+import org.eclipse.virgo.util.common.DirectedAcyclicGraph;
+import org.eclipse.virgo.util.common.ThreadSafeDirectedAcyclicGraph;
+import org.junit.Test;
+
+public class DeployerCompositeArtifactDependencyDeterminerTests {
+
+    private final RuntimeArtifactRepository artifactRepository = new StubArtifactRepository();
+
+    private final StubBundleContext bundleContext;
+    {
+        this.bundleContext = new StubBundleContext();
+        String filterString = String.format("(&(objectClass=%s)(artifactType=plan))", DependencyDeterminer.class.getCanonicalName());
+        this.bundleContext.addFilter(filterString, new TrueFilter(filterString));
+    }
+
+    private final StubRegion region1 = new StubRegion("test-region1", null);
+    
+    private final StubRegion region2 = new StubRegion("test-region2", null);
+    
+    private final DeployerCompositeArtifactDependencyDeterminer determiner = new DeployerCompositeArtifactDependencyDeterminer(artifactRepository, region1, region2);
+
+    @Test(expected = FatalAssertionException.class)
+    public void nullRepository() {
+        new DeployerCompositeArtifactDependencyDeterminer(null, region1, region2);
+    }
+
+    @Test(expected = FatalAssertionException.class)
+    public void nullUserRegion() {
+        new DeployerCompositeArtifactDependencyDeterminer(artifactRepository, null, region2);
+    }
+
+    @Test(expected = FatalAssertionException.class)
+    public void nullGlobalRegion() {
+        new DeployerCompositeArtifactDependencyDeterminer(artifactRepository, region1, null);
+    }
+
+    @Test
+    public void nonCompositeArtifact() {
+        assertEquals(0, this.determiner.getDependents(new StubCompositeArtifact()).size());
+    }
+
+    @Test
+    public void success() {
+    	DirectedAcyclicGraph<InstallArtifact> dag = new ThreadSafeDirectedAcyclicGraph<InstallArtifact>();
+        StubPlanInstallArtifact installArtifact = new StubPlanInstallArtifact(dag);
+        installArtifact.getGraph().addChild(dag.createRootNode(new StubInstallArtifact()));
+		DeployerCompositeArtifact artifact = new DeployerCompositeArtifact(bundleContext, installArtifact, region1);
+        assertEquals(1, this.determiner.getDependents(artifact).size());
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/internal/deployer/DeployerCompositeArtifactTests.java b/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/internal/deployer/DeployerCompositeArtifactTests.java
new file mode 100644
index 0000000..b847633
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/internal/deployer/DeployerCompositeArtifactTests.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model.internal.deployer;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+
+import org.junit.Test;
+
+import org.eclipse.virgo.kernel.model.internal.DependencyDeterminer;
+import org.eclipse.virgo.kernel.model.internal.deployer.DeployerArtifact;
+import org.eclipse.virgo.kernel.model.internal.deployer.DeployerCompositeArtifact;
+import org.eclipse.virgo.nano.serviceability.Assert.FatalAssertionException;
+import org.eclipse.virgo.kernel.stubs.StubPlanInstallArtifact;
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+import org.eclipse.virgo.test.stubs.region.StubRegion;
+import org.eclipse.virgo.test.stubs.support.TrueFilter;
+
+public class DeployerCompositeArtifactTests {
+
+    private final StubBundleContext bundleContext = new StubBundleContext();
+    {
+        String filterString = String.format("(&(objectClass=%s)(artifactType=plan))", DependencyDeterminer.class.getCanonicalName());
+        bundleContext.addFilter(filterString, new TrueFilter(filterString));
+    }
+
+    private final StubRegion region = new StubRegion("test-region", null);
+    
+    private final DeployerCompositeArtifact artifact = new DeployerCompositeArtifact(bundleContext, new StubPlanInstallArtifact(), region);
+
+    @Test(expected = FatalAssertionException.class)
+    public void testNullBundleContext() {
+        new DeployerArtifact(null, new StubPlanInstallArtifact(), region);
+    }
+
+    @Test(expected = FatalAssertionException.class)
+    public void testNullInstallArtifact() {
+        new DeployerArtifact(this.bundleContext, null, region);
+    }
+
+    @Test(expected = FatalAssertionException.class)
+    public void testRegion() {
+        new DeployerArtifact(this.bundleContext, new StubPlanInstallArtifact(), null);
+    }
+
+    @Test
+    public void isAtomic() {
+        assertFalse(this.artifact.isAtomic());
+    }
+
+    @Test
+    public void isScoped() {
+        assertFalse(this.artifact.isScoped());
+    }
+
+    @Test
+    public void getInstallArtifact() {
+        assertNotNull(this.artifact.getInstallArtifact());
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/internal/deployer/ModelInstallArtifactLifecycleListenerInitializerTests.java b/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/internal/deployer/ModelInstallArtifactLifecycleListenerInitializerTests.java
new file mode 100644
index 0000000..56e626c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/internal/deployer/ModelInstallArtifactLifecycleListenerInitializerTests.java
@@ -0,0 +1,148 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model.internal.deployer;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.isA;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.reset;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+
+import org.eclipse.equinox.region.RegionDigraph;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.eclipse.virgo.kernel.deployer.model.RuntimeArtifactModel;
+import org.eclipse.virgo.kernel.model.StubArtifactRepository;
+import org.eclipse.virgo.kernel.model.StubSpringContextAccessor;
+import org.eclipse.virgo.kernel.model.internal.DependencyDeterminer;
+import org.eclipse.virgo.nano.serviceability.Assert.FatalAssertionException;
+import org.eclipse.virgo.kernel.stubs.StubInstallArtifact;
+import org.eclipse.virgo.kernel.stubs.StubPlanInstallArtifact;
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+import org.eclipse.virgo.test.stubs.region.StubRegion;
+import org.eclipse.virgo.test.stubs.support.TrueFilter;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.Version;
+
+public class ModelInstallArtifactLifecycleListenerInitializerTests {
+
+    private final StubArtifactRepository artifactRepository = new StubArtifactRepository();
+
+    private final RuntimeArtifactModel runtimeArtifactModel = createMock(RuntimeArtifactModel.class);
+    
+    private final RegionDigraph regionDigraph = createMock(RegionDigraph.class);
+
+    private final StubSpringContextAccessor springContextAccessor = new StubSpringContextAccessor();
+    
+    private final StubRegion region = new StubRegion("test-region", null);
+    
+    private final StubBundleContext bundleContext;
+    {
+        this.bundleContext = new StubBundleContext();
+        String filterString1 = String.format("(&(objectClass=%s)(artifactType=bundle))", DependencyDeterminer.class.getCanonicalName());
+        this.bundleContext.addFilter(filterString1, new TrueFilter(filterString1));
+        String filterString2 = String.format("(&(objectClass=%s)(artifactType=plan))", DependencyDeterminer.class.getCanonicalName());
+        this.bundleContext.addFilter(filterString2, new TrueFilter(filterString2));
+    }
+
+    private final ModelInstallArtifactLifecycleListenerInitializer initializer = new ModelInstallArtifactLifecycleListenerInitializer(artifactRepository, bundleContext, runtimeArtifactModel, regionDigraph, region, springContextAccessor);
+
+    @Before
+    public void setUp(){
+        reset(this.regionDigraph);
+        expect(this.regionDigraph.getRegion("global")).andReturn(region).anyTimes();
+        replay(this.regionDigraph);
+    }
+    
+    @Test(expected = FatalAssertionException.class)
+    public void nullArtifactRepository() {
+        new ModelInstallArtifactLifecycleListenerInitializer(null, bundleContext, runtimeArtifactModel, regionDigraph, region, springContextAccessor);
+    }
+
+    @Test(expected = FatalAssertionException.class)
+    public void nullBundleContext() {
+        new ModelInstallArtifactLifecycleListenerInitializer(artifactRepository, null, runtimeArtifactModel, regionDigraph, region, springContextAccessor);
+    }
+    
+    @Test(expected = FatalAssertionException.class)
+    public void nullRuntimeArtifactModel() {
+        new ModelInstallArtifactLifecycleListenerInitializer(artifactRepository, bundleContext, null, regionDigraph, region, springContextAccessor);
+    }
+    
+    @Test(expected = FatalAssertionException.class)
+    public void nullRegionDigraph() {
+        new ModelInstallArtifactLifecycleListenerInitializer(artifactRepository, bundleContext, runtimeArtifactModel, null, region, springContextAccessor);
+    }
+    
+    @Test(expected = FatalAssertionException.class)
+    public void nullRegion() {
+        new ModelInstallArtifactLifecycleListenerInitializer(artifactRepository, bundleContext, runtimeArtifactModel, regionDigraph, null, springContextAccessor);
+    }
+    
+    @Test(expected = FatalAssertionException.class)
+    public void nullSpringContextAccessor() {
+        new ModelInstallArtifactLifecycleListenerInitializer(artifactRepository, bundleContext, runtimeArtifactModel, regionDigraph, region, null);
+    }
+
+    @Test
+    public void initialize() throws IOException, InvalidSyntaxException {
+        expect(this.runtimeArtifactModel.getDeploymentIdentities()).andReturn(new DeploymentIdentity[] { new StubDeploymentIdentity("plan"), new StubDeploymentIdentity("bundle") });
+        expect(this.runtimeArtifactModel.get(isA(DeploymentIdentity.class))).andReturn(new StubInstallArtifact("bundle"));
+        expect(this.runtimeArtifactModel.get(isA(DeploymentIdentity.class))).andReturn(new StubPlanInstallArtifact());
+        replay(this.runtimeArtifactModel);
+        assertEquals(0, this.bundleContext.getServiceRegistrations().size());
+        this.initializer.initialize();
+        assertEquals(1, this.bundleContext.getServiceRegistrations().size());
+        assertEquals(2, this.artifactRepository.getArtifacts().size());
+        verify(this.runtimeArtifactModel);
+    }
+
+    @Test
+    public void destroy() throws IOException, InvalidSyntaxException {
+        expect(this.runtimeArtifactModel.getDeploymentIdentities()).andReturn(new DeploymentIdentity[0]);
+        replay(this.runtimeArtifactModel);
+        this.initializer.initialize();
+        assertEquals(1, this.bundleContext.getServiceRegistrations().size());
+        this.initializer.destroy();
+        assertEquals(0, this.bundleContext.getServiceRegistrations().size());
+        verify(this.runtimeArtifactModel);
+    }
+
+    private static class StubDeploymentIdentity implements DeploymentIdentity {
+
+        private static final long serialVersionUID = 1L;
+
+        private final String type;
+
+        public StubDeploymentIdentity(String type) {
+            this.type = type;
+        }
+
+        public String getSymbolicName() {
+            return "test";
+        }
+
+        public String getType() {
+            return this.type;
+        }
+
+        public String getVersion() {
+            return Version.emptyVersion.toString();
+        }
+
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/internal/deployer/ModelInstallArtifactLifecycleListenerTests.java b/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/internal/deployer/ModelInstallArtifactLifecycleListenerTests.java
new file mode 100644
index 0000000..88b4a68
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/internal/deployer/ModelInstallArtifactLifecycleListenerTests.java
@@ -0,0 +1,135 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model.internal.deployer;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.reset;
+import static org.junit.Assert.assertEquals;
+
+import org.eclipse.equinox.region.RegionDigraph;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.model.StubArtifactRepository;
+import org.eclipse.virgo.kernel.model.StubSpringContextAccessor;
+import org.eclipse.virgo.kernel.model.internal.DependencyDeterminer;
+import org.eclipse.virgo.nano.serviceability.Assert.FatalAssertionException;
+import org.eclipse.virgo.kernel.stubs.StubInstallArtifact;
+import org.eclipse.virgo.kernel.stubs.StubPlanInstallArtifact;
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+import org.eclipse.virgo.test.stubs.region.StubRegion;
+import org.eclipse.virgo.test.stubs.support.TrueFilter;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ModelInstallArtifactLifecycleListenerTests {
+
+    private final StubArtifactRepository artifactRepository = new StubArtifactRepository();
+    
+    private final RegionDigraph regionDigraph = createMock(RegionDigraph.class);
+
+    private final StubSpringContextAccessor springContextAccessor = new StubSpringContextAccessor();
+
+    private final StubRegion region = new StubRegion("test-region", null);
+    
+    private final StubBundleContext bundleContext;
+    {
+        this.bundleContext = new StubBundleContext();
+        String filterString1 = String.format("(&(objectClass=%s)(artifactType=bundle))", DependencyDeterminer.class.getCanonicalName());
+        this.bundleContext.addFilter(filterString1, new TrueFilter(filterString1));
+        String filterString2 = String.format("(&(objectClass=%s)(artifactType=plan))", DependencyDeterminer.class.getCanonicalName());
+        this.bundleContext.addFilter(filterString2, new TrueFilter(filterString2));
+    }
+
+    private final ModelInstallArtifactLifecycleListener listener = new ModelInstallArtifactLifecycleListener(bundleContext, artifactRepository, regionDigraph, region, springContextAccessor);
+
+    @Before
+    public void setUp(){
+        reset(this.regionDigraph);
+        expect(this.regionDigraph.getRegion("global")).andReturn(region).anyTimes();
+        replay(this.regionDigraph);
+    }
+    
+    @Test(expected = FatalAssertionException.class)
+    public void nullBundleContext() {
+        new ModelInstallArtifactLifecycleListener(null, artifactRepository, regionDigraph, region, springContextAccessor);
+    }
+
+    @Test(expected = FatalAssertionException.class)
+    public void nullArtifactRepository() {
+        new ModelInstallArtifactLifecycleListener(bundleContext, null, regionDigraph, region, springContextAccessor);
+    }
+    
+    @Test(expected = FatalAssertionException.class)
+    public void nullRegionDigraph() {
+        new ModelInstallArtifactLifecycleListener(bundleContext, artifactRepository, null, region, springContextAccessor);
+    }
+    
+    @Test(expected = FatalAssertionException.class)
+    public void nullRegion() {
+        new ModelInstallArtifactLifecycleListener(bundleContext, artifactRepository, regionDigraph, null, springContextAccessor);
+    }
+    
+    @Test(expected = FatalAssertionException.class)
+    public void nullSpringContextAccessor() {
+        new ModelInstallArtifactLifecycleListener(bundleContext, artifactRepository, regionDigraph, region, null);
+    }
+
+    @Test
+    public void installing() throws DeploymentException {
+        checkNumberOfArtifacts(0);
+        
+        StubInstallArtifact bundleInstallArtifact = new StubInstallArtifact("bundle");
+        this.listener.onInstalling(bundleInstallArtifact);
+        checkNumberOfArtifacts(1);
+        
+        this.listener.onInstalling(bundleInstallArtifact);
+        checkNumberOfArtifacts(1);
+        
+        StubPlanInstallArtifact planInstallArtifact = new StubPlanInstallArtifact();
+        this.listener.onInstalling(planInstallArtifact);
+        checkNumberOfArtifacts(2);
+        
+        this.listener.onInstalling(planInstallArtifact);
+        checkNumberOfArtifacts(2);
+    }
+    
+    @Test
+    public void installFailed() throws DeploymentException {
+        checkNumberOfArtifacts(0);
+        
+        InstallArtifact bundleInstallArtifact = new StubInstallArtifact("bundle");
+        this.listener.onInstalling(bundleInstallArtifact);
+        checkNumberOfArtifacts(1);
+        
+        this.listener.onInstallFailed(bundleInstallArtifact);
+        checkNumberOfArtifacts(0);
+    }
+
+    @Test
+    public void uninstalled() throws DeploymentException {
+        InstallArtifact bundleInstallArtifact = new StubInstallArtifact("bundle");
+        this.listener.onInstalling(bundleInstallArtifact);
+        checkNumberOfArtifacts(1);
+        
+        this.listener.onUninstalled(bundleInstallArtifact);
+        checkNumberOfArtifacts(0);
+        
+        this.listener.onUninstalled(bundleInstallArtifact);
+        checkNumberOfArtifacts(0);
+    }
+    
+    private void checkNumberOfArtifacts(int expectedNumberOfArtifacts) {
+        assertEquals(expectedNumberOfArtifacts, this.artifactRepository.getArtifacts().size());
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/management/internal/DefaultArtifactObjectNameCreatorTests.java b/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/management/internal/DefaultArtifactObjectNameCreatorTests.java
new file mode 100644
index 0000000..cb105e0
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/management/internal/DefaultArtifactObjectNameCreatorTests.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model.management.internal;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import javax.management.ObjectName;
+
+import org.eclipse.virgo.kernel.model.StubCompositeArtifact;
+import org.eclipse.virgo.kernel.model.management.internal.DefaultRuntimeArtifactModelObjectNameCreator;
+import org.eclipse.virgo.nano.serviceability.Assert.FatalAssertionException;
+import org.junit.Test;
+
+
+public class DefaultArtifactObjectNameCreatorTests {
+
+    private final DefaultRuntimeArtifactModelObjectNameCreator creator = new DefaultRuntimeArtifactModelObjectNameCreator("test-domain");
+    
+    @Test(expected = FatalAssertionException.class)
+    public void nullArtifactModelArtifact() {
+        creator.createArtifactModel(null);
+    }
+
+    @Test
+    public void successArtifactModel() {
+        ObjectName objectName = creator.createArtifactModel(new StubCompositeArtifact());
+        assertNotNull(objectName);
+        assertEquals("test-domain:artifact-type=test-type,name=test-name,region=test-region,type=ArtifactModel,version=0.0.0", objectName.getCanonicalName());
+    }
+
+    @Test
+ 	public void createArtifactsOfTypeQuery() throws Exception {
+ 		ObjectName artifactsOfTypeQuery = creator.createArtifactsOfTypeQuery("test-type");
+ 		assertNotNull(artifactsOfTypeQuery);
+ 		assertEquals("test-domain:artifact-type=test-type,type=ArtifactModel,*", artifactsOfTypeQuery.getCanonicalName());
+ 	}
+
+    @Test
+ 	public void createArtifactsOfTypeQueryQuoting() throws Exception {
+ 		ObjectName artifactsOfTypeQuery = creator.createArtifactsOfTypeQuery("test:type");
+ 		assertNotNull(artifactsOfTypeQuery);
+ 		assertEquals("test-domain:artifact-type=\"test:type\",type=ArtifactModel,*", artifactsOfTypeQuery.getCanonicalName());
+ 	}
+
+     @Test
+ 	public void artifactVersionQuery() throws Exception {
+ 		ObjectName artifactsVersionQuery = creator.createArtifactVersionsQuery("test-type", "test-name");
+ 		assertNotNull(artifactsVersionQuery);
+ 		assertEquals("test-domain:artifact-type=test-type,name=test-name,type=ArtifactModel,*", artifactsVersionQuery.getCanonicalName());
+ 	}
+
+     @Test
+ 	public void allArtifactsQuery() throws Exception {
+ 		ObjectName artifactsQuery = creator.createAllArtifactsQuery();
+ 		assertNotNull(artifactsQuery);
+ 		assertEquals("test-domain:type=ArtifactModel,*", artifactsQuery.getCanonicalName());
+ 	}
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/management/internal/DelegatingManageableArtifactTests.java b/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/management/internal/DelegatingManageableArtifactTests.java
new file mode 100644
index 0000000..3d132a0
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/management/internal/DelegatingManageableArtifactTests.java
@@ -0,0 +1,99 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model.management.internal;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.isA;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+
+import org.eclipse.virgo.kernel.model.Artifact;
+import org.eclipse.virgo.kernel.model.ArtifactState;
+import org.eclipse.virgo.kernel.model.StubCompositeArtifact;
+import org.eclipse.virgo.kernel.model.management.RuntimeArtifactModelObjectNameCreator;
+import org.eclipse.virgo.kernel.model.management.internal.DelegatingManageableArtifact;
+import org.eclipse.virgo.nano.serviceability.Assert.FatalAssertionException;
+import org.eclipse.virgo.test.stubs.region.StubRegion;
+import org.junit.Test;
+import org.osgi.framework.Version;
+
+
+public class DelegatingManageableArtifactTests {
+
+    @Test(expected = FatalAssertionException.class)
+    public void nullCreator() {
+        new DelegatingManageableArtifact(null, new StubCompositeArtifact());
+    }
+
+    @Test(expected = FatalAssertionException.class)
+    public void nullArtifact() {
+        new DelegatingManageableArtifact(createMock(RuntimeArtifactModelObjectNameCreator.class), null);
+    }
+
+    @Test
+    public void success() throws MalformedObjectNameException, NullPointerException {
+        RuntimeArtifactModelObjectNameCreator creator = createMock(RuntimeArtifactModelObjectNameCreator.class);
+        Artifact artifact = createMock(Artifact.class);
+
+        DelegatingManageableArtifact manageableArtifact = new DelegatingManageableArtifact(creator, artifact);
+
+        expect(artifact.getDependents()).andReturn(getArtifacts());
+        expect(creator.createArtifactModel(isA(Artifact.class))).andReturn(new ObjectName("domain:key=value1,region=global"));
+        expect(creator.createArtifactModel(isA(Artifact.class))).andReturn(new ObjectName("domain:key=value2,region=global"));
+        expect(creator.createArtifactModel(isA(Artifact.class))).andReturn(new ObjectName("domain:key=value3,region=global"));
+        expect(creator.createArtifactModel(isA(Artifact.class))).andReturn(new ObjectName("domain:key=value3,region=other"));
+        expect(artifact.getName()).andReturn("test-name");
+        expect(artifact.getState()).andReturn(ArtifactState.ACTIVE);
+        expect(artifact.getRegion()).andReturn(new StubRegion("test-region", null));
+        expect(artifact.getType()).andReturn("test-type");
+        expect(artifact.getVersion()).andReturn(Version.emptyVersion);
+        expect(artifact.getProperties()).andReturn(Collections.<String, String> emptyMap());
+        expect(artifact.refresh()).andReturn(true);
+        artifact.start();
+        artifact.stop();
+        artifact.uninstall();
+        replay(creator, artifact);
+
+        assertEquals(4, manageableArtifact.getDependents().length);
+        manageableArtifact.getName();
+        assertEquals("ACTIVE", manageableArtifact.getState());
+        assertEquals("test-region", manageableArtifact.getRegion());
+        assertEquals("test-type", manageableArtifact.getType());
+        assertEquals("0.0.0", manageableArtifact.getVersion());
+        assertEquals(0, manageableArtifact.getProperties().size());
+        assertTrue(manageableArtifact.refresh());
+        manageableArtifact.start();
+        manageableArtifact.stop();
+        manageableArtifact.uninstall();
+
+        verify(creator, artifact);
+    }
+
+    private Set<Artifact> getArtifacts() {
+        Set<Artifact> artifacts = new HashSet<Artifact>();
+        for (int i = 0; i < 3; i++) {
+            artifacts.add(new StubCompositeArtifact());
+        }
+        artifacts.add(new StubCompositeArtifact("foo", "bar", new StubRegion("global", null)));
+        return artifacts;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/management/internal/DelegatingManageableCompositeArtifactTests.java b/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/management/internal/DelegatingManageableCompositeArtifactTests.java
new file mode 100644
index 0000000..29caea3
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/management/internal/DelegatingManageableCompositeArtifactTests.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model.management.internal;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertTrue;
+
+import javax.management.MalformedObjectNameException;
+
+import org.eclipse.virgo.kernel.model.CompositeArtifact;
+import org.eclipse.virgo.kernel.model.StubCompositeArtifact;
+import org.eclipse.virgo.kernel.model.management.RuntimeArtifactModelObjectNameCreator;
+import org.eclipse.virgo.kernel.model.management.internal.DelegatingManageableCompositeArtifact;
+import org.eclipse.virgo.nano.serviceability.Assert.FatalAssertionException;
+import org.junit.Test;
+
+
+public class DelegatingManageableCompositeArtifactTests {
+
+    @Test(expected = FatalAssertionException.class)
+    public void nullCreator() {
+        new DelegatingManageableCompositeArtifact(null, new StubCompositeArtifact());
+    }
+
+    @Test(expected = FatalAssertionException.class)
+    public void nullArtifact() {
+        new DelegatingManageableCompositeArtifact(createMock(RuntimeArtifactModelObjectNameCreator.class), null);
+    }
+
+    @Test
+    public void success() throws MalformedObjectNameException, NullPointerException {
+        RuntimeArtifactModelObjectNameCreator creator = createMock(RuntimeArtifactModelObjectNameCreator.class);
+        CompositeArtifact artifact = createMock(CompositeArtifact.class);
+
+        DelegatingManageableCompositeArtifact manageablePlanArtifact = new DelegatingManageableCompositeArtifact(creator, artifact);
+
+        expect(artifact.isAtomic()).andReturn(true);
+        expect(artifact.isScoped()).andReturn(true);
+        replay(creator, artifact);
+
+        assertTrue(manageablePlanArtifact.isAtomic());
+        assertTrue(manageablePlanArtifact.isScoped());
+
+        verify(creator, artifact);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/management/internal/JmxArtifactRepositoryListenerTests.java b/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/management/internal/JmxArtifactRepositoryListenerTests.java
new file mode 100644
index 0000000..6672e99
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/test/java/org/eclipse/virgo/kernel/model/management/internal/JmxArtifactRepositoryListenerTests.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.model.management.internal;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.isA;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+
+import java.lang.management.ManagementFactory;
+
+import javax.management.MBeanServer;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+
+import org.eclipse.virgo.kernel.model.Artifact;
+import org.eclipse.virgo.kernel.model.StubCompositeArtifact;
+import org.eclipse.virgo.kernel.model.management.RuntimeArtifactModelObjectNameCreator;
+import org.eclipse.virgo.kernel.model.management.internal.JmxArtifactRepositoryListener;
+import org.eclipse.virgo.nano.serviceability.Assert.FatalAssertionException;
+import org.junit.Test;
+
+
+public class JmxArtifactRepositoryListenerTests {
+
+    private final MBeanServer server = ManagementFactory.getPlatformMBeanServer();
+
+    private final RuntimeArtifactModelObjectNameCreator creator = createMock(RuntimeArtifactModelObjectNameCreator.class);
+
+    private final JmxArtifactRepositoryListener listener = new JmxArtifactRepositoryListener(creator);
+
+    @Test(expected = FatalAssertionException.class)
+    public void nullCreator() {
+        new JmxArtifactRepositoryListener(null);
+    }
+
+    @Test
+    public void added() throws MalformedObjectNameException, NullPointerException {
+        expect(this.creator.createArtifactModel(isA(Artifact.class))).andReturn(new ObjectName("test:key=1"));
+        replay(creator);
+
+        int initial = this.server.getMBeanCount();
+        this.listener.added(new StubCompositeArtifact());
+        assertEquals(initial + 1, (int) this.server.getMBeanCount());
+        verify(creator);
+    }
+
+    @Test
+    public void removed() throws MalformedObjectNameException, NullPointerException {
+        expect(this.creator.createArtifactModel(isA(Artifact.class))).andReturn(new ObjectName("test:key=1")).times(2);
+        replay(creator);
+
+        this.listener.added(new StubCompositeArtifact());
+        int initial = this.server.getMBeanCount();
+        this.listener.removed(new StubCompositeArtifact());
+        assertEquals(initial - 1, (int) this.server.getMBeanCount());
+        verify(creator);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.model/src/test/resources/.gitignore b/kernel/org.eclipse.virgo.kernel.model/src/test/resources/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/src/test/resources/.gitignore
diff --git a/kernel/org.eclipse.virgo.kernel.model/template.mf b/kernel/org.eclipse.virgo.kernel.model/template.mf
new file mode 100644
index 0000000..6d2a481
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.model/template.mf
@@ -0,0 +1,21 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Virgo Kernel Runtime Artifact Model
+Bundle-SymbolicName: org.eclipse.virgo.kernel.model
+Bundle-Version: ${version}
+Import-Template:
+ org.eclipse.virgo.kernel.*;version="${version:[=.=.=, =.+1)}",
+ org.eclipse.virgo.nano.*;version="${version:[=.=.=, =.+1)}",
+ org.eclipse.virgo.util.*;version="${version:[=.=.=, =.+1)}",
+ org.eclipse.virgo.medic.*;version="${version:[=.=.=, =.+1)}",
+ org.aspectj.*;version="${aspectjVersion:[=.=.=, +1)}",
+ org.springframework.*;version="${springframeworkVersion:[2.5.6, +1)}",
+ javax.annotation.*;version="0",
+ javax.management.*;version="0",
+ org.osgi.framework.*;version="0",
+ org.osgi.service.cm.*;version="0",
+ org.osgi.util.tracker.*;version="0",
+ org.eclipse.equinox.region.*;version="${equinoxRegionExportedPackageVersion:[=.=.=, =.+1)}",
+ org.slf4j.*;version="${slf4jVersion:[=.=.=, +1)}"
+Excluded-Exports:
+ *.internal.*
diff --git a/kernel/org.eclipse.virgo.kernel.osgi/.settings/org.eclipse.virgo.ide.bundlor.core.prefs b/kernel/org.eclipse.virgo.kernel.osgi/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
new file mode 100644
index 0000000..c94ef47
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.osgi/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
@@ -0,0 +1,3 @@
+#Fri Aug 07 16:08:57 BST 2009
+org.eclipse.virgo.ide.bundlor.core.template.properties.files=../build.properties;../build.versions
+eclipse.preferences.version=1
diff --git a/kernel/org.eclipse.virgo.kernel.osgi/.settings/org.eclipse.wst.common.project.facet.core.xml b/kernel/org.eclipse.virgo.kernel.osgi/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..92aa290
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.osgi/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+  <installed facet="org.eclipse.virgo.server.bundle" version="1.0"/>
+</faceted-project>
diff --git a/kernel/org.eclipse.virgo.kernel.osgi/.settings/org.springframework.ide.eclipse.core.prefs b/kernel/org.eclipse.virgo.kernel.osgi/.settings/org.springframework.ide.eclipse.core.prefs
new file mode 100644
index 0000000..aadbe76
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.osgi/.settings/org.springframework.ide.eclipse.core.prefs
@@ -0,0 +1,67 @@
+#Mon Aug 10 10:45:21 BST 2009
+eclipse.preferences.version=1
+org.springframework.ide.eclipse.core.builders.enable.aopreferencemodelbuilder=true
+org.springframework.ide.eclipse.core.builders.enable.beanmetadatabuilder=true
+org.springframework.ide.eclipse.core.builders.enable.osgibundleupdater=true
+org.springframework.ide.eclipse.core.enable.project.preferences=false
+org.springframework.ide.eclipse.core.validator.enable.com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.enable.com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.enable.com.springsource.sts.server.quickfix.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.enable.org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.enable.org.springframework.ide.eclipse.core.springvalidator=false
+org.springframework.ide.eclipse.core.validator.enable.org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.applicationSymbolicNameRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.applicationVersionRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleActivationPolicyRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleActivatorRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleManifestVersionRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleNameRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleSymbolicNameRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleVersionRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.exportPackageRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.importRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.parsingProblemsRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.requireBundleRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.AvoidDriverManagerDataSource-com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.ImportElementsAtTopRulee-com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.ParentBeanSpecifiesAbstractClassRule-com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.RefElementRule-com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.TooManyBeansInFileRule-com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.UnnecessaryValueElementRule-com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.UseBeanInheritance-com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.legacyxmlusage.jndiobjectfactory-com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.importBundleVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.importLibraryVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.importPackageVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.requireBundleVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanAlias-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanClass-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanConstructorArgument-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanDefinition-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanDefinitionHolder-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanFactory-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanInitDestroyMethod-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanProperty-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanReference-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.methodOverride-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.parsingProblems-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.requiredProperty-org.springframework.ide.eclipse.beans.core.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.core.springClasspath-org.springframework.ide.eclipse.core.springvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.action-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.actionstate-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.attribute-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.attributemapper-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.beanaction-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.evaluationaction-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.evaluationresult-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.exceptionhandler-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.import-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.inputattribute-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.mapping-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.outputattribute-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.set-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.state-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.subflowstate-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.transition-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.variable-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.webflowstate-org.springframework.ide.eclipse.webflow.core.validator=true
diff --git a/kernel/org.eclipse.virgo.kernel.osgi/.springBeans b/kernel/org.eclipse.virgo.kernel.osgi/.springBeans
new file mode 100644
index 0000000..6c6cb5a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.osgi/.springBeans
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beansProjectDescription>
+	<version>1</version>
+	<pluginVersion><![CDATA[2.5.0.201010221000-RELEASE]]></pluginVersion>
+	<configSuffixes>
+		<configSuffix><![CDATA[xml]]></configSuffix>
+	</configSuffixes>
+	<enableImports><![CDATA[false]]></enableImports>
+	<configs>
+	</configs>
+	<configSets>
+	</configSets>
+</beansProjectDescription>
diff --git a/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/BundleClassLoaderUnavailableException.java b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/BundleClassLoaderUnavailableException.java
new file mode 100644
index 0000000..26811e1
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/BundleClassLoaderUnavailableException.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.osgi.framework;
+
+import org.osgi.framework.Bundle;
+
+/**
+ * Exception signalling that the <code>ClassLoader</code> for a {@link Bundle} is not available.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Threadsafe.
+ *
+ */
+public final class BundleClassLoaderUnavailableException extends RuntimeException {
+
+	private static final long serialVersionUID = 4014635817682252026L;
+
+	public BundleClassLoaderUnavailableException() {
+		super();
+	}
+
+	public BundleClassLoaderUnavailableException(String message, Throwable cause) {
+		super(message, cause);
+	}
+
+	public BundleClassLoaderUnavailableException(String message) {
+		super(message);
+	}
+
+	public BundleClassLoaderUnavailableException(Throwable cause) {
+		super(cause);
+	}
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/ExtendedClassNotFoundException.java b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/ExtendedClassNotFoundException.java
new file mode 100644
index 0000000..2bb5fca
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/ExtendedClassNotFoundException.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.osgi.framework;
+
+/**
+ * An extension to {@link ClassNotFoundException} that provides access to the ClassLoader that
+ * attempted the class load. 
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * <strong>Thread-safe</strong>
+ * 
+ */
+public class ExtendedClassNotFoundException extends ClassNotFoundException {
+
+    private static final long serialVersionUID = 6045566593339869456L;
+
+    // Do not attempt to serialise the class loader as it is probably not serialisable.
+    private final transient ClassLoader classLoader;
+
+    public ExtendedClassNotFoundException(ClassLoader classLoader, ClassNotFoundException cause) {
+        super(cause.getMessage() + " in " + classLoader, cause);
+        this.classLoader = classLoader;
+    }
+
+    public ClassLoader getClassLoader() {
+        return this.classLoader;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/ExtendedNoClassDefFoundError.java b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/ExtendedNoClassDefFoundError.java
new file mode 100644
index 0000000..1620b3d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/ExtendedNoClassDefFoundError.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.osgi.framework;
+
+/**
+ * An extension to {@link NoClassDefFoundError} that provides access to the ClassLoader that attempted
+ * the class load. 
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * <strong>Thread-safe</strong>
+ * 
+ */
+public class ExtendedNoClassDefFoundError extends NoClassDefFoundError {
+
+    private static final long serialVersionUID = 4573722090207901849L;
+
+    private final ClassLoader classLoader;
+
+    public ExtendedNoClassDefFoundError(ClassLoader classLoader, NoClassDefFoundError cause) {
+        super(cause.getMessage() + " in " + classLoader);
+        this.classLoader = classLoader;
+        initCause(cause);
+    }
+
+    public ClassLoader getClassLoader() {
+        return this.classLoader;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/ImportExpander.java b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/ImportExpander.java
new file mode 100644
index 0000000..7ab1033
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/ImportExpander.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.osgi.framework;
+
+import java.util.List;
+
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+
+/**
+ * {@link ImportExpander} is an interface for expanding library and bundle imports into package imports and propagating
+ * promoted imports across a collection of bundles. <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations of this interface should be thread safe.
+ * 
+ */
+public interface ImportExpander {
+
+    public interface ImportPromotionVector {
+    }
+
+    /**
+     * Modifies the supplied {@link BundleManifest bundle manifests} by replacing all of the <code>Import-Library</code>
+     * and <code>Import-Bundle</code> header entries with the equivalent <code>Import-Package</code> header entries and
+     * propagating promoted imports across the supplied bundle manifests.
+     * 
+     * @param bundleManifests the manifests to perform <code>Import-Library</code> and <code>Import-Bundle</code>
+     *        expansion upon.
+     * @return vector of imports promoted
+     * @throws UnableToSatisfyDependenciesException if a manifest's dependencies cannot be satisfied
+     * @throws ImportMergeException if there was a clash between some of the imports being merged
+     */
+    ImportPromotionVector expandImports(List<BundleManifest> bundleManifests) throws UnableToSatisfyDependenciesException, ImportMergeException;
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/ImportMergeException.java b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/ImportMergeException.java
new file mode 100644
index 0000000..fa03770
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/ImportMergeException.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.osgi.framework;
+
+
+/**
+ * {@link ImportMergeException} is thrown when conflicting imports are detected.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is immutable and therefore thread safe.
+ * 
+ */
+public class ImportMergeException extends OsgiFrameworkException {
+
+    private static final long serialVersionUID = 56985682345987L;
+
+    private final String conflictingPackageName;
+
+    private final String sources;
+
+    /**
+     * Creates a new <code>ImportMergeException</code> with the supplied error message.
+     * @param conflictingPackageName of package where conflicting merges meet
+     * @param sources conflicting imports
+     * @param message The reason (String) for merge failure
+     */
+    public ImportMergeException(String conflictingPackageName, String sources, String message) {
+        super("cannot merge imports of package '" + conflictingPackageName + "' from sources '" + sources + "' because of " + message);
+        this.conflictingPackageName = conflictingPackageName;
+        this.sources = sources;
+    }
+
+    /**
+     * Get the name of the package that failed to merge.
+     * 
+     * @return the name of the package that failed to merge
+     */
+    public final String getConflictingPackageName() {
+        return this.conflictingPackageName;
+    }
+
+    /**
+     * Get the sources of the package that failed to merge.
+     * 
+     * @return the sources of the package that failed to merge
+     */
+    public final String getSources() {
+        return this.sources;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/InstrumentableClassLoader.java b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/InstrumentableClassLoader.java
new file mode 100644
index 0000000..49001c1
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/InstrumentableClassLoader.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.osgi.framework;
+
+import java.lang.instrument.ClassFileTransformer;
+
+/**
+ * Provides an interface onto <code>ClassLoaders</code> that support the use of {@link ClassFileTransformer
+ * ClassFileTransformers} for load-time weaving.<p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations <strong>must</strong> be threadsafe.
+ * 
+ */
+public interface InstrumentableClassLoader {
+
+    /**
+     * Adds the supplied {@link ClassFileTransformer} to the {@link ClassLoader}. All subsequent class loads will pass
+     * through the newly added <code>ClassFileTransformer</code>.
+     * 
+     * @param transformer the <code>ClassFileTransformer</code>.
+     */
+    void addClassFileTransformer(ClassFileTransformer transformer);
+
+    /**
+     * Creates a throw away {@link ClassLoader} that can be used to explore and introspect on types that will be loaded
+     * by this <code>ClassLoader</code>.
+     * 
+     * @return the throw away <code>ClassLoader</code>.
+     */
+    ClassLoader createThrowAway();
+
+    /**
+     * Queries whether this <code>ClassLoader</code> has been {@link #addClassFileTransformer(ClassFileTransformer)
+     * instrumented}.
+     * 
+     * @return <code>true</code> if instrumented, otherwise <code>false</code>.
+     */
+    boolean isInstrumented();
+
+    /**
+     * Gets the number of {@link ClassFileTransformer ClassFileTransformers} that have been added to this
+     * <code>ClassLoader</code>.
+     * 
+     * @return the number of <code>ClassFileTransformers</code>.
+     */
+    int getClassFileTransformerCount();
+}
diff --git a/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/ManifestTransformer.java b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/ManifestTransformer.java
new file mode 100644
index 0000000..e20c4db
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/ManifestTransformer.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.osgi.framework;
+
+import org.osgi.framework.Bundle;
+
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+
+/**
+ * A ManifestTransformer can be used to return a transformed {@link BundleManifest} for a {@link Bundle}. <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations <strong>must</strong> be thread-safe.
+ * 
+ */
+public interface ManifestTransformer {
+
+    /**
+     * Transform the supplied manifest, e.g. by expanding any Import-Library and Import-Bundle headers.
+     * 
+     * @param bundleManifest the manifest to transform
+     * @return The transformed manifest, or the original manifest if no transformation is required.
+     */
+    public BundleManifest transform(BundleManifest bundleManifest);
+}
diff --git a/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/OsgiConfiguration.java b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/OsgiConfiguration.java
new file mode 100644
index 0000000..ad7e528
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/OsgiConfiguration.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.osgi.framework;
+
+/**
+ * Configuration data for an {@link OsgiFramework}.
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br/>
+ * 
+ * Implementations <strong>must</strong> be threadsafe.
+ * 
+ */
+public interface OsgiConfiguration {
+
+    /**
+     * Whether or not the console is enabled
+     * 
+     * @return <code>true</code> if the console is enabled, otherwise <code>false</code>.
+     */
+    boolean isConsoleEnabled();
+
+    /**
+     * Returns the port upon which the console should listen
+     * 
+     * @return the console's port
+     */
+    int getConsolePort();
+}
diff --git a/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/OsgiFramework.java b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/OsgiFramework.java
new file mode 100644
index 0000000..d924cc5
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/OsgiFramework.java
@@ -0,0 +1,103 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.osgi.framework;
+
+import java.io.File;
+import java.util.jar.Manifest;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+import org.osgi.service.packageadmin.PackageAdmin;
+
+/**
+ * <code>OsgiFramework</code> defines a basic abstraction for interacting with various OSGi implementations in a
+ * server-independent manner.
+ * <p/>
+ * 
+ * Implementations <strong>must</strong> make themselves available in the OSGi service registry under the
+ * <code>OsgiFramework</code> class names.
+ * 
+ */
+@SuppressWarnings("deprecation")
+public interface OsgiFramework {
+
+    /**
+     * Name of the {@link Manifest} entry defining the scope of a bundle.
+     */
+    public static String HEADER_MODULE_SCOPE = "Module-Scope";
+
+    /**
+     * Gets the {@link BundleContext} of the system {@link Bundle}.
+     * 
+     * @return the system <code>BundleContext</code>.
+     */
+    BundleContext getBundleContext();
+
+    /**
+     * Gets the {@link ClassLoader} for the supplied {@link Bundle}.
+     * 
+     * @param bundle the <code>Bundle</code>.
+     * @return the <code>ClassLoader</code>.
+     */
+    ClassLoader getBundleClassLoader(Bundle bundle);
+
+    /**
+     * Returns true if the class with the given name will be loaded via boot delegation by the underlying OSGi framework
+     * 
+     * @param className The class name
+     * @return Whether the underlying framework considers the class to be boot delegated.
+     */
+    boolean isBootDelegated(String className);
+
+    /**
+     * Returns all of the supplied bundle's direct dependencies. A bundle's direct dependencies are the bundles to which
+     * its package imports have been wired. Equivalent to calling <code>getDirectDependencies(bundle, false)</code>.
+     * 
+     * @param bundle The bundle for which the direct dependencies are required
+     * @return the supplied bundle's direct dependencies
+     */
+    Bundle[] getDirectDependencies(Bundle bundle);
+
+    /**
+     * Returns all of the supplied bundle's direct dependencies, optionally including the fragments, if any, of each
+     * direct dependency in the returned array. A bundle's direct dependencies are the bundles to which its package
+     * imports have been wired.
+     * 
+     * @param bundle The bundle for which the direct dependencies are required
+     * @param includeFragments <code>true</code> if fragments of bundles to which package imports have been wired should
+     *        be included in the returned array
+     * @return the supplied bundle's direct dependencies
+     */
+    Bundle[] getDirectDependencies(Bundle bundle, boolean includeFragments);
+
+    /**
+     * Refreshes the supplied {@link Bundle}. Reloads all contents, and refreshes the packages.
+     * 
+     * @param bundle the <code>Bundle</code> to refresh.
+     * @throws BundleException if there is an error during refresh.
+     * @see PackageAdmin#refreshPackages(Bundle[])
+     */
+    void refresh(Bundle bundle) throws BundleException;
+
+    /**
+     * Updates the supplied <code>Bundle</code> from the supplied file or directory using the supplied
+     * <code>ManifestTransformer</code> to transformer the <code>Bundle</code>'s manifest as it is updated.
+     * 
+     * @param bundle the bundle to update
+     * @param manifestTransformer the manifest transformer to apply to the bundle's manifest
+     * @param location the file or directory containing the updated bundle contents
+     * 
+     * @throws BundleException if the bundle fails to update
+     */
+    void update(Bundle bundle, ManifestTransformer manifestTransformer, File location) throws BundleException;
+}
diff --git a/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/OsgiFrameworkException.java b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/OsgiFrameworkException.java
new file mode 100644
index 0000000..9c0cb2b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/OsgiFrameworkException.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.osgi.framework;
+
+/**
+ * Signals a generic error in the OSGi Framework subsystem.<p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.
+ * 
+ */
+public class OsgiFrameworkException extends RuntimeException {
+
+    private static final long serialVersionUID = -2615790102302563284L;
+
+    /**
+     * Creates a new <code>OsgiFrameworkException</code>.
+     */
+    public OsgiFrameworkException() {
+        super();
+    }
+
+    /**
+     * Creates a new <code>OsgiFrameworkException</code>.
+     * 
+     * @param message the error message.
+     * @param cause the root cause.
+     */
+    public OsgiFrameworkException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    /**
+     * Creates a new <code>OsgiFrameworkException</code>.
+     * 
+     * @param message the error message.
+     */
+    public OsgiFrameworkException(String message) {
+        super(message);
+    }
+
+    /**
+     * Creates a new <code>OsgiFrameworkException</code>.
+     * 
+     * @param cause the root cause.
+     */
+    public OsgiFrameworkException(Throwable cause) {
+        super(cause);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/OsgiFrameworkLogEvents.java b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/OsgiFrameworkLogEvents.java
new file mode 100644
index 0000000..501c87e
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/OsgiFrameworkLogEvents.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.osgi.framework;
+
+import org.eclipse.virgo.nano.serviceability.LogEventDelegate;
+import org.eclipse.virgo.medic.eventlog.Level;
+import org.eclipse.virgo.medic.eventlog.LogEvent;
+
+/**
+ * {@link LogEvent} for the OSGi provisioning bundle.
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.
+ * 
+ */
+public enum OsgiFrameworkLogEvents implements LogEvent {
+
+    REGION_IMPORTS_PARSE_FAILED(1, Level.ERROR), //
+    REGION_IMPORT_NO_MATCH(2, Level.WARNING), //
+    // 3 has been moved to the user region bundle and is unused here.
+    // 4 has been moved to the user region bundle and is unused here. 
+    USER_REGION_CONFIGURATION_UNAVAILABLE(10, Level.ERROR),
+    OSGI_CONSOLE_PORT(100, Level.INFO), //
+    OSGI_CONSOLE_PORT_IN_USE(101, Level.ERROR);
+
+    private static final String PREFIX = "OF";
+
+    private final LogEventDelegate delegate;
+
+    private OsgiFrameworkLogEvents(int code, Level level) {
+        this.delegate = new LogEventDelegate(PREFIX, code, level);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getEventCode() {
+        return this.delegate.getEventCode();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Level getLevel() {
+        return this.delegate.getLevel();
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/OsgiFrameworkUtils.java b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/OsgiFrameworkUtils.java
new file mode 100644
index 0000000..97d6067
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/OsgiFrameworkUtils.java
@@ -0,0 +1,200 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.osgi.framework;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * Utility methods for working the OSGi framework and {@link Bundle Bundles}.
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.
+ * 
+ */
+public final class OsgiFrameworkUtils {
+
+    private static final String HEADER_MODULE_SCOPE = "Module-Scope";
+
+    /**
+     * Gets the scope for the supplied {@link Bundle}.
+     * 
+     * @param bundle the <code>Bundle</code>.
+     * @return the scope, or <code>null</code> if no scope is specified.
+     */
+    public static String getScopeName(Bundle bundle) {
+        return (String) bundle.getHeaders().get(HEADER_MODULE_SCOPE);
+    }
+
+    /**
+     * Queries whether the supplied {@link Bundle} is scoped.
+     * 
+     * @param bundle the <code>Bundle</code>.
+     * @return <code>true</code> if the <code>Bundle</code> is scoped, otherwise <code>false</code>.
+     */
+    public static boolean isScoped(Bundle bundle) {
+        String scope = getScopeName(bundle);
+        return scope != null && scope.length() > 0;
+    }
+
+    /**
+     * Queries whether both supplied {@link Bundle Bundles} are in the same scope.
+     * 
+     * @param a the first <code>Bundle</code>.
+     * @param b the second <code>Bundle</code>.
+     * @return <code>true</code> if both <code>Bundles</code> are in the same scope.
+     */
+    public static boolean sameScope(Bundle a, Bundle b) {
+        String scopeA = getScopeName(a);
+        if (scopeA == null || scopeA.length() == 0) {
+            return false;
+        } else {
+            return scopeA.equals(getScopeName(b));
+        }
+    }
+
+    /**
+     * Indicates whether or not the supplied {@link Bundle} is active.
+     * 
+     * @param bundle The bundle to query
+     * @return <code>true</code> if the supplied bundle is active, otherwise <code>false</code>.
+     * @see Bundle#getState()
+     * @see Bundle#ACTIVE
+     */
+    public static boolean isBundleActive(Bundle bundle) {
+        return bundle.getState() == Bundle.ACTIVE;
+    }
+
+    @SuppressWarnings("unchecked")
+    public static <T> OsgiServiceHolder<T> getService(BundleContext bundleContext, Class<T> clazz) {
+        final ServiceReference<T> reference = (ServiceReference<T>) bundleContext.getServiceReference(clazz.getName());
+        if (reference != null) {
+            final T service = (T) bundleContext.getService(reference);
+            return new StandardOsgiServiceHolder<T>(service, reference);
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Returns an ordered list of {@link OsgiServiceHolder OsgiServiceHolders}, one for each service in the service
+     * registry which was published under the supplied <code>serviceType</code>. The service lookup is performed using
+     * the supplied <code>bundleContext</code>.
+     * <p/>
+     * The ordering of the <code>OsgiServiceHolder</code>s is determined by the
+     * {@link ServiceReference#compareTo(Object) ordering} of the encapsulated {@link ServiceReference
+     * ServiceReferences}.
+     * <p/>
+     * @param bundleContext in which to lookup services
+     * @param serviceType of service to look for
+     * @param <T> of service
+     * @return list of {@link OsgiServiceHolder}s
+     */
+    @SuppressWarnings("unchecked")
+    public static <T> List<OsgiServiceHolder<T>> getServices(BundleContext bundleContext, Class<T> serviceType) {
+        List<OsgiServiceHolder<T>> serviceHolders = new ArrayList<OsgiServiceHolder<T>>();
+        try {
+            ServiceReference<T>[] serviceReferences = (ServiceReference<T>[]) bundleContext.getServiceReferences(serviceType.getName(), null);
+            if (serviceReferences != null) {
+                for (ServiceReference<T> serviceReference : serviceReferences) {
+                    T service = (T) bundleContext.getService(serviceReference);
+                    if (service != null) {
+                        serviceHolders.add(new StandardOsgiServiceHolder<T>(service, serviceReference));
+                    }
+                }
+                Collections.sort(serviceHolders);
+            }
+        } catch (InvalidSyntaxException ise) {
+            throw new OsgiFrameworkException(ise);
+        }
+
+        return serviceHolders;
+    }
+
+    private static class StandardOsgiServiceHolder<T> implements OsgiServiceHolder<T>, Comparable<OsgiServiceHolder<?>> {
+
+        private final T service;
+
+        private final ServiceReference<T> serviceReference;
+
+        private StandardOsgiServiceHolder(T service, ServiceReference<T> serviceReference) {
+            this.service = service;
+            this.serviceReference = serviceReference;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public T getService() {
+            return this.service;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public ServiceReference<T> getServiceReference() {
+            return this.serviceReference;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public int compareTo(OsgiServiceHolder<?> o) {
+            return this.serviceReference.compareTo(o.getServiceReference());
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public int hashCode() {
+            final int prime = 31;
+            int result = 1;
+            result = prime * result + (this.serviceReference == null ? 0 : this.serviceReference.hashCode());
+            return result;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public boolean equals(Object obj) {
+            if (this == obj) {
+                return true;
+            }
+            if (obj == null) {
+                return false;
+            }
+            if (getClass() != obj.getClass()) {
+                return false;
+            }
+            StandardOsgiServiceHolder<?> other = (StandardOsgiServiceHolder<?>) obj;
+            if (this.serviceReference == null) {
+                if (other.serviceReference != null) {
+                    return false;
+                }
+            } else if (!this.serviceReference.equals(other.serviceReference)) {
+                return false;
+            }
+            return true;
+        }
+
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/OsgiServiceHolder.java b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/OsgiServiceHolder.java
new file mode 100644
index 0000000..690dd29
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/OsgiServiceHolder.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.osgi.framework;
+
+import org.osgi.framework.ServiceReference;
+
+/**
+ * An <code>OsgiServiceHolder</code> holds a service retrieved from the OSGi service registry and a
+ * <code>ServiceReference</code> for the held service.
+ * <p />
+ * An <code>OsgiServiceHolder</code> is {@link Comparable} and uses the encapsulated {@link ServiceReference}. to
+ * determine its ordering.
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations must be thread-safe.
+ * 
+ * @param <T> Type of service to hold
+ */
+public interface OsgiServiceHolder<T> extends Comparable<OsgiServiceHolder<?>> {
+
+    T getService();
+
+    ServiceReference<T> getServiceReference();
+}
diff --git a/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/PackageAdminUtil.java b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/PackageAdminUtil.java
new file mode 100644
index 0000000..8f55050
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/PackageAdminUtil.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.osgi.framework;
+
+import org.osgi.framework.Bundle;
+
+/**
+ * {@link PackageAdminUtil} provides utilities relating to {@link org.osgi.service.packageadmin.PackageAdmin PackageAdmin}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations of this class must be thread safe.
+ * 
+ */
+public interface PackageAdminUtil {    
+    /**
+     * Synchronously drives refresh packages for the given bundles.
+     *  
+     * @param bundles The bundles to refresh.
+     */
+    void synchronouslyRefreshPackages(Bundle[] bundles);
+}
diff --git a/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/ServiceUtils.java b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/ServiceUtils.java
new file mode 100644
index 0000000..cdf32cf
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/ServiceUtils.java
@@ -0,0 +1,119 @@
+/*******************************************************************************
+ * Copyright (c) 2012 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.osgi.framework;
+
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+import org.osgi.framework.BundleContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * {@link ServiceUtils} is a collection of OSGi service utilities for use by the kernel.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread safe
+ */
+public class ServiceUtils {
+
+    public static final String PROPERTY_KERNEL_STARTUP_WAIT_LIMIT = "org.eclipse.virgo.kernel.startup.wait.limit";
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(ServiceUtils.class);
+
+    private static final int DEFAULT_STARTUP_WAIT_LIMIT = 180; // 3 minutes
+
+    private static volatile int maxSecondsWaitForService = DEFAULT_STARTUP_WAIT_LIMIT;
+
+    private static volatile long maxMillisWaitForService = 0;
+
+    private static final Object monitor = new Object();
+
+    /**
+     * Wait for a service of the given class but throw a TimeoutException if this takes longer than the number of
+     * seconds configured in the framework property org.eclipse.virgo.kernel.startup.wait.limit.
+     */
+    public static <T> T getPotentiallyDelayedService(BundleContext context, Class<T> serviceClass) throws TimeoutException, InterruptedException {
+        T service = null;
+        OsgiServiceHolder<T> serviceHolder;
+        long millisWaited = 0;
+        while (service == null && millisWaited <= getInitialisedWaitLimit(context)) {
+            try {
+                serviceHolder = OsgiFrameworkUtils.getService(context, serviceClass);
+                if (serviceHolder != null) {
+                    service = serviceHolder.getService();
+                } else {
+                    millisWaited += sleepABitMore();
+                }
+            } catch (IllegalStateException e) {
+            }
+        }
+        if (service == null) {
+            throw new TimeoutException(serviceClass.getName());
+        }
+        return service;
+    }
+
+    private static long getInitialisedWaitLimit(BundleContext context) {
+        if (maxMillisWaitForService == 0) {
+            synchronized (monitor) {
+                if (maxMillisWaitForService == 0) {
+                    maxSecondsWaitForService = readBundleStartupWaitLimit(context);
+                    maxMillisWaitForService = TimeUnit.SECONDS.toMillis(maxSecondsWaitForService);
+                }
+            }
+        }
+        return maxMillisWaitForService;
+    }
+
+    /**
+     * Returns the service wait limit in seconds. This method will only return the correct value after
+     * getInitialisedWaitLimit has been called, for instance after TimeoutException has been thrown from
+     * getPotentiallyDelayedService.
+     * 
+     * @return the service wait limit in seconds or 0 if this has not been initialised
+     */
+    public static long getWaitLimitSeconds() {
+        return maxSecondsWaitForService;
+    }
+
+    private static int readBundleStartupWaitLimit(BundleContext context) {
+        String waitLimitProperty = readFrameworkProperty(PROPERTY_KERNEL_STARTUP_WAIT_LIMIT, context);
+        if (!hasText(waitLimitProperty)) {
+            return DEFAULT_STARTUP_WAIT_LIMIT;
+        }
+
+        try {
+            return Integer.parseInt(waitLimitProperty);
+        } catch (NumberFormatException e) {
+            LOGGER.warn("Could not parse property {} with value '{}'. Using default limit {} seconds", new Object[] {
+                PROPERTY_KERNEL_STARTUP_WAIT_LIMIT, waitLimitProperty, DEFAULT_STARTUP_WAIT_LIMIT });
+            return DEFAULT_STARTUP_WAIT_LIMIT;
+        }
+    }
+
+    private static String readFrameworkProperty(String propertyKey, BundleContext context) {
+        return context.getProperty(propertyKey);
+    }
+
+    private static boolean hasText(String string) {
+        return (string != null && !string.trim().isEmpty());
+    }
+
+    private static long sleepABitMore() throws InterruptedException {
+        long before = System.currentTimeMillis();
+        Thread.sleep(100);
+        return System.currentTimeMillis() - before;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/UnableToSatisfyBundleDependenciesException.java b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/UnableToSatisfyBundleDependenciesException.java
new file mode 100644
index 0000000..a28aa63
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/UnableToSatisfyBundleDependenciesException.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.osgi.framework;
+
+import org.eclipse.osgi.service.resolver.ResolverError;
+import org.eclipse.osgi.service.resolver.State;
+import org.osgi.framework.Version;
+
+/**
+ * Signals an error resolving the dependencies of a bundle during installation.<p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.
+ * 
+ */
+public class UnableToSatisfyBundleDependenciesException extends UnableToSatisfyDependenciesException {
+
+    private static final long serialVersionUID = -4291846255969729124L;
+
+    private static final String BUNDLE_ENTITY = "bundle";
+
+    private final State state;
+    
+    private final ResolverError[] resolverErrors;
+
+    /**
+     * Creates a new <code>UnableToSatisfyBundleDependenciesException</code>.
+     * 
+     * @param symbolicName the symbolic name of the bundle.
+     * @param version the bundle version.
+     * @param failureDescription a description of the failure.
+     */
+    public UnableToSatisfyBundleDependenciesException(String symbolicName, Version version, String failureDescription) {
+        super(BUNDLE_ENTITY, symbolicName, version, failureDescription);
+        this.state = null;
+        this.resolverErrors = null;
+    }
+
+    /**
+     * Creates a new <code>UnableToSatisfyBundleDependenciesException</code>.
+     * 
+     * @param symbolicName the symbolic name of the bundle.
+     * @param version the bundle version.
+     * @param failureDescription a description of the failure.
+     * @param state of bundle
+     * @param resolverErrors a possibly empty array of {@linkplain ResolverError}s.
+     */
+    public UnableToSatisfyBundleDependenciesException(String symbolicName, Version version, String failureDescription, State state, ResolverError[] resolverErrors) {
+        super(BUNDLE_ENTITY, symbolicName, version, failureDescription);
+        this.state = state;
+        this.resolverErrors = resolverErrors.clone();
+    }
+    
+    /** 
+     * {@inheritDoc}
+     */
+    public final State getState() {
+        return this.state;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public final ResolverError[] getResolverErrors() {
+        return this.resolverErrors.clone();
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/UnableToSatisfyDependenciesException.java b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/UnableToSatisfyDependenciesException.java
new file mode 100644
index 0000000..cbd21f2
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/UnableToSatisfyDependenciesException.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.osgi.framework;
+
+import org.eclipse.osgi.service.resolver.ResolverError;
+import org.eclipse.osgi.service.resolver.State;
+import org.osgi.framework.Version;
+
+/**
+ * Signals an error resolving the dependencies of a bundle or library during installation.<p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ * 
+ */
+@SuppressWarnings("serial")
+public abstract class UnableToSatisfyDependenciesException extends Exception {
+
+    private final String symbolicName;
+
+    private final Version version;
+
+    private final String failureDescription;
+
+    /**
+     * Creates a new <code>UnableToSatisfyDependenciesException</code>.
+     * 
+     * @param symbolicName the symbolic name of the entity that failed to install.
+     * @param version the version of the entity that failed to install.
+     * @param failureDescription the description of the dependency satisfaction problem.
+     */
+    protected UnableToSatisfyDependenciesException(String entity, String symbolicName, Version version, String failureDescription) {
+        super(formatMessage(entity, symbolicName, version, failureDescription));
+        this.symbolicName = symbolicName;
+        this.version = version;
+        this.failureDescription = failureDescription;
+    }
+
+    /**
+     * @return the symbolic name of the entity that failed to install.
+     */
+    public String getSymbolicName() {
+        return this.symbolicName;
+    }
+
+    /**
+     * @return the version of the entity that failed to install.
+     */
+    public Version getVersion() {
+        return this.version;
+    }
+
+    /**
+     * @return the full description of the dependencies that could not be satisfied.
+     */
+    public String getFailureDescription() {
+        return this.failureDescription;
+    }
+
+    /**
+     * Creates a formatted message to describe the dependency failure.
+     */
+    private static String formatMessage(String entity, String symbolicName, Version version, String failureDescription) {
+        return "Unable to satisfy dependencies of " + entity + " '" + symbolicName + "' at version '" + version + "': " + failureDescription;
+    }
+    
+    /**
+     * Get any {@link State} associated with this exception.
+     * 
+     * @return either <code>null</code> or a <code>State</code>
+     */
+    public State getState() {
+        return null;
+    }
+    
+    /**
+     * Get any {@link ResolverError}s associated with this exception.
+     * 
+     * @return either <code>null</code> or a possibly empty array of <code>ResolverError</code>s
+     */
+    public ResolverError[] getResolverErrors() {
+        return null;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/UnableToSatisfyLibraryDependenciesException.java b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/UnableToSatisfyLibraryDependenciesException.java
new file mode 100644
index 0000000..669a443
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/UnableToSatisfyLibraryDependenciesException.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.osgi.framework;
+
+import org.osgi.framework.Version;
+
+/**
+ * Signals an error resolving the dependencies of a library during installation.<p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.
+ * 
+ */
+public class UnableToSatisfyLibraryDependenciesException extends UnableToSatisfyDependenciesException {
+
+    private static final long serialVersionUID = -2705837902792185894L;
+
+    private static final String LIBRARY_ENTITY = "library";
+
+    /**
+     * Creates a new <code>UnableToSatisfyLibraryDependenciesException</code>.
+     * 
+     * @param symbolicName the library symbolic name.
+     * @param version the library version.
+     * @param failureDescription a description of the failure.
+     */
+    public UnableToSatisfyLibraryDependenciesException(String symbolicName, Version version, String failureDescription) {
+        super(LIBRARY_ENTITY, symbolicName, version, failureDescription);
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/UnableToSatisfyPlanDependenciesException.java b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/UnableToSatisfyPlanDependenciesException.java
new file mode 100644
index 0000000..781df44
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/UnableToSatisfyPlanDependenciesException.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.osgi.framework;
+
+import org.osgi.framework.Version;
+
+/**
+ * Signals an error resolving the dependencies of a plan during installation.
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.
+ * 
+ */
+public class UnableToSatisfyPlanDependenciesException extends UnableToSatisfyDependenciesException {
+
+    private static final long serialVersionUID = 903287709449316407L;
+
+    private static final String PLAN_ENTITY = "plan";
+
+    public UnableToSatisfyPlanDependenciesException(String symbolicName, Version version, String failureDescription) {
+        super(PLAN_ENTITY, symbolicName, version, failureDescription);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/support/AbstractOsgiFramework.java b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/support/AbstractOsgiFramework.java
new file mode 100644
index 0000000..9052b7e
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/support/AbstractOsgiFramework.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.osgi.framework.support;
+
+import org.eclipse.virgo.kernel.osgi.framework.OsgiFramework;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.service.packageadmin.PackageAdmin;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * Base implementation of {@link OsgiFramework}.
+ * <p/>
+ * 
+ * Core start and stop logic is handled by this base implementation. In particular, the requirement to self publish as
+ * services in the service registration under <code>BundleInstaller</code> and <code>OsgiFramework</code> is handled.
+ * <p/>
+ *  
+ * <strong>Concurrent Semantics</strong><br/>
+ * 
+ * Implementation is thread safe.
+ * 
+ */
+@SuppressWarnings("deprecation")
+public abstract class AbstractOsgiFramework implements OsgiFramework {
+
+    public static final String DIRECTIVE_SEPARATOR = ";";
+
+    public static final boolean DIRECTIVE_PUBLISH_CONTEXT_DEFAULT = true;
+
+    protected final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private final PackageAdmin packageAdmin;
+
+    private final BundleContext bundleContext;
+
+
+    protected AbstractOsgiFramework(BundleContext context, PackageAdmin packageAdmin) {
+        this.bundleContext = context;
+        this.packageAdmin = packageAdmin;
+    }
+
+    public Bundle getClassBundle(Class<?> cls) {
+        if (this.packageAdmin != null) {
+            return this.packageAdmin.getBundle(cls);
+        } else {
+            return null;
+        }
+    }
+    
+    /**
+     * Gets the {@link PackageAdmin} service.
+     * 
+     * @return the <code>PackageAdmin</code> service.
+     */
+    protected final PackageAdmin getPackageAdmin() {
+        return this.packageAdmin;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public BundleContext getBundleContext() {
+        return this.bundleContext;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/support/ImmutableOsgiConfiguration.java b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/support/ImmutableOsgiConfiguration.java
new file mode 100644
index 0000000..3b349f2
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/framework/support/ImmutableOsgiConfiguration.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.osgi.framework.support;
+
+import org.eclipse.virgo.kernel.osgi.framework.OsgiConfiguration;
+
+/**
+ * Abstract implementation of {@link OsgiConfiguration}.
+ * 
+ * <strong>Concurrent Semantics</strong><br/>
+ * 
+ * Thread-safe.
+ * 
+ */
+public final class ImmutableOsgiConfiguration implements OsgiConfiguration {
+
+    private final boolean consoleEnabled;
+
+    private final int consolePort;
+
+    /**
+     * Creates a new <code>OsgiConfiguration</code> with the repository search paths.
+     * @param consoleEnabled whether console is enabled
+     * @param consolePort port number for console
+     */
+    public ImmutableOsgiConfiguration(boolean consoleEnabled, int consolePort) {
+        this.consoleEnabled = consoleEnabled;
+        this.consolePort = consolePort;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isConsoleEnabled() {
+        return this.consoleEnabled;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public int getConsolePort() {
+        return this.consolePort;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/quasi/QuasiBundle.java b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/quasi/QuasiBundle.java
new file mode 100644
index 0000000..ebb790b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/quasi/QuasiBundle.java
@@ -0,0 +1,161 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.osgi.quasi;
+
+import java.io.File;
+import java.util.List;
+
+import org.eclipse.equinox.region.Region;
+import org.eclipse.virgo.kernel.artifact.plan.PlanDescriptor.Provisioning;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.Version;
+
+/**
+ * {@link QuasiBundle} is a representation of a bundle in a {@link QuasiFramework}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations of this class must be thread safe.
+ * 
+ */
+public interface QuasiBundle {
+
+    /**
+     * Returns this {@link QuasiBundle}'s symbolic name. If this <code>QuasiBundle</code> does not have a symbolic name,
+     * returns <code>null</code>.
+     * 
+     * @return a bundle symbolic name String or <code>null</code> if this <code>QuasiBundle</code> does not have a
+     *         symbolic name
+     */
+    String getSymbolicName();
+
+    /**
+     * Returns this {@link QuasiBundle}'s bundle version.
+     * 
+     * @return a {@link Version}, which is never <code>null</code>
+     */
+    Version getVersion();
+
+    /**
+     * Returns whether this {@link QuasiBundle} was resolved in its {@link QuasiFramework}.
+     * 
+     * @return <code>true</code> if and only if this <code>QuasiBundle</code> is resolved
+     */
+    boolean isResolved();
+
+    /**
+     * Uninstalls this {@link QuasiBundle} from its {@link QuasiFramework}. This does not modify any committed
+     * {@link Bundle} in the OSGi framework.
+     * @throws BundleException 
+     */
+    void uninstall() throws BundleException;
+
+    /**
+     * If this {@link QuasiBundle} has been successfully committed, returns the corresponding {@link Bundle} in the OSGi
+     * framework. If this {@link QuasiBundle} has not been successfully committed, returns <code>null</code>.
+     * 
+     * @return a <code>Bundle</code> or <code>null</code>
+     */
+    Bundle getBundle();
+
+    /**
+     * Returns the numeric id of this QuasiBundle. Typically a QuasiBundle will only have a numeric id if it represents
+     * a bundle that is present in a QuasiFramework as the framework assigns the ids. -1 is returned if the id is not
+     * known.
+     * 
+     * @return the numeric id of this QuasiBundle
+     */
+    long getBundleId();
+
+    /**
+     * Returns the location of the file or directory that the bundle that this QuasiBundle represents was installed from.
+     * 
+     * @return the location of the file or directory the bundle was installed from
+     */
+    String getBundleLocation();
+    
+    /**
+     * Return the Region containing this bundle
+     * 
+     * @return The region this bundle belongs to
+     */
+    Region getRegion();
+    
+    /**
+     * Returns all fragments known to this QuasiBundle (regardless resolution status).
+     * 
+     * @return an array of QuasiBundle containing all known fragments
+     */
+    List<QuasiBundle> getFragments();
+
+    /**
+     * Returns the potential hosts for this QuasiBundle. null is returned if this QuasiBundle is not a fragment.
+     * 
+     * @return the host QuasiBundles for this QuasiBundle or null.
+     */
+    List<QuasiBundle> getHosts();
+
+    /**
+     * Returns an array of QuasiExportPackage defined by the Export-Package clauses. All QuasiExportPackage are returned
+     * even if they have not been selected by the resolver as an exporter of the package.
+     * 
+     * @return an array of QuasiExportPackage
+     */
+    List<QuasiExportPackage> getExportPackages();
+
+    /**
+     * Returns an array of {@link QuasiImportPackage} defined by the Import-Package clause of this QuasiBundle.
+     * 
+     * @return an array of QuasiImportPackage
+     */
+    List<QuasiImportPackage> getImportPackages();
+
+    /**
+     * Returns an array of {@link QuasiRequiredBundle} defined by the Require-Bundle clause of this QuasiBundle.
+     * 
+     * @return an array of QuasiRequiredBundle
+     */
+    List<QuasiRequiredBundle> getRequiredBundles();
+
+    /**
+     * A utility method that returns all QuasiBundle which depend on this bundle. A bundle depends on another bundle if
+     * it requires the bundle, imports a package which is exported by that bundle, is a fragment to the bundle or is the
+     * host of the bundle.
+     * 
+     * @return all QuasiBundle(s) which depend on this bundle.
+     */
+    List<QuasiBundle> getDependents();
+
+    /**
+     * Returns the actual filesystem location of this QuasiBundle
+     * 
+     * @return The file that is represented by this QuasiBundle
+     */
+    File getBundleFile();
+
+    /**
+     * Sets the provisioning behaviour required for this bundle.
+     * 
+     * @param provisioning the required provisioning behaviour, either Provisioning.AUTO or Provisioning.DISABLED
+     */
+    void setProvisioning(Provisioning provisioning);
+
+    /**
+     * Returns the provisioning behaviour required for this bundle.
+     * 
+     * @return Provisioning.AUTO or Provisioning.DISABLED
+     */
+    Provisioning getProvisioning();
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/quasi/QuasiExportPackage.java b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/quasi/QuasiExportPackage.java
new file mode 100644
index 0000000..dc3e366
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/quasi/QuasiExportPackage.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.osgi.quasi;
+
+import java.util.List;
+
+import org.osgi.framework.Version;
+
+/**
+ * {@link QuasiExportPackage} is a representation of an exported package
+ * from a {@link QuasiBundle}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations of this interface must be thread safe.
+ * 
+ */
+public interface QuasiExportPackage extends QuasiParameterised {
+	
+	/**
+	 * 
+	 * @return the name of the package being exported
+	 */
+	public String getPackageName();
+
+	/**
+	 * 
+	 * @return the <code>Version</code> that the package is exported at.
+	 */
+	public Version getVersion();
+	
+	/**
+	 * 
+	 * @return the {@link QuasiBundle} that provides this <code>QuasiExportPackage</code>
+	 */
+	public QuasiBundle getExportingBundle();
+	
+	/**
+	 * 
+	 * @return The a list {@link QuasiImportPackage}s that are consuming this export
+	 */
+	public List<QuasiImportPackage> getConsumers();
+}
diff --git a/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/quasi/QuasiFramework.java b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/quasi/QuasiFramework.java
new file mode 100644
index 0000000..987ebaa
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/quasi/QuasiFramework.java
@@ -0,0 +1,109 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.virgo.kernel.osgi.quasi;
+
+import java.net.URI;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.equinox.region.Region;
+import org.eclipse.osgi.service.resolver.State;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+import org.osgi.framework.BundleException;
+
+/**
+ * {@link QuasiFramework} is a snapshot of the OSGi framework state into which bundles can be installed and resolved
+ * and, in the normal case, committed into the OSGi framework.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations of this class must be thread safe.
+ * 
+ */
+public interface QuasiFramework {
+
+    /**
+     * Installs a bundle into this {@link QuasiFramework} using the given {@link URI} and {@link BundleManifest} and
+     * returns a {@link QuasiBundle}.
+     * 
+     * @param location a <code>URI</code> to the bundle's contents
+     * @param bundleManifest the <code>BundleManifest</code> to be used for the bundle, regardless of any manifest at
+     *        the location
+     * @return a <code>QuasiBundle</code>
+     * @throws BundleException if the bundle could not be installed
+     */
+    QuasiBundle install(URI location, BundleManifest bundleManifest) throws BundleException;
+
+    /**
+     * Returns a list of {@link QuasiBundle} that represent all the bundles currently installed in this {@link QuasiFramework}.
+     * 
+     * @return a non<code>null</code> list of <code>QuasiBundle</code>
+     */
+    List<QuasiBundle> getBundles();
+
+    /**
+     * Returns a {@link QuasiBundle} with the given bundle id.
+     * 
+     * @param bundleId 
+     * @return <code>QuasiBundle</code> or <code>null</code> if the id is not known.
+     */
+    QuasiBundle getBundle(long bundleId);
+
+    /**
+     * Return the set of {@link Region} present in this {@link QuasiFramework}.
+     * 
+     * @return the set of regions present in this framework
+     */
+    Set<Region> getRegions();
+    
+    /**
+     * Attempts to resolve the {@link QuasiBundle QuasiBundles} that have been installed in this {@link QuasiFramework}.
+     * <p/>
+     * If all the bundles can be resolved, returns an empty list. If some of the bundles cannot be resolved, returns a
+     * list of {@link QuasiResolutionFailure QuasiResolutionFailures}.
+     * 
+     * @return a non<code>null</code> list of <code>QuasiResolutionFailure</code>, which is empty if resolution succeeded
+     */
+    List<QuasiResolutionFailure> resolve();    
+    
+    /**
+     * Diagnoses failures to resolve of the {@link QuasiBundle} given.
+     * <p/>
+     * If the bundle can be resolved, returns null otherwise a {@link QuasiResolutionFailure} is returned.
+     * @param bundleId identifier (in the {@link State}) of bundle to diagnose
+     * 
+     * @return a non<code>null</code> list of <code>QuasiResolutionFailure</code>, which is empty if resolution succeeded
+     */
+    List<QuasiResolutionFailure> diagnose(long bundleId);
+
+    
+    /**
+     * Attempts to resolve any unresolved {@link QuasiBundle QuasiBundles} in this {@link QuasiFramework} and then
+     * commits the contents of this {@link QuasiFramework} by installing each of its <code>QuasiBundles</code> into the
+     * OSGi framework.
+     * <p/>
+     * If any unresolved <code>QuasiBundles</code> cannot be resolved, {@link BundleException} is thrown.
+     * <p/>
+     * If a <code>QuasiBundle</code> fails to install, any <code>QuasiBundles</code> which have been installed are
+     * uninstalled and <code>BundleException</code> is thrown.
+     * <p/>
+     * 
+     * @throws BundleException if the contents could not be resolved and installed
+     */
+    void commit() throws BundleException;
+
+    /**
+     * Delete any resources associated with this {@link QuasiFramework}.
+     */
+    void destroy();
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/quasi/QuasiFrameworkFactory.java b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/quasi/QuasiFrameworkFactory.java
new file mode 100644
index 0000000..ad5033e
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/quasi/QuasiFrameworkFactory.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.osgi.quasi;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.zip.ZipException;
+
+/**
+ * {@link QuasiFrameworkFactory} is used to create {@link QuasiFramework QuasiFrameworks}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations of this class must be thread safe.
+ * 
+ */
+public interface QuasiFrameworkFactory {
+
+    /**
+     * Creates a {@link QuasiFramework} from the current OSGi framework state.
+     * 
+     * @return the <code>QuasiFramework</code>, which is never <code>null</code>
+     */
+    QuasiFramework create();
+
+    /**
+     * Creates a {@link QuasiFramework} from a dump in the given directory.
+     * 
+     * @param stateDump a {@link File} containing the dump directory
+     * @return the <code>QuasiFramework</code>, which is never <code>null</code>
+     * @throws ZipException when unzipping
+     * @throws IOException when reading
+     */
+    QuasiFramework create(File stateDump)  throws ZipException, IOException ;
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/quasi/QuasiImportPackage.java b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/quasi/QuasiImportPackage.java
new file mode 100644
index 0000000..205499b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/quasi/QuasiImportPackage.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.osgi.quasi;
+
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+
+/**
+ * <p>
+ * {@link QuasiImportPackage} is a representation of a imported package from a {@link QuasiBundle}.
+ * </p>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations of this interface must be thread safe.
+ * 
+ */
+public interface QuasiImportPackage extends QuasiParameterised {
+
+    /**
+     * The name of the package being imported.
+     * 
+     * @return The package name
+     */
+    public String getPackageName();
+
+    /**
+     * The version range that the exporting package must be within to satisfy this <code>QuasiImportPackage</code>.
+     * 
+     * @return The {@link VersionRange} constraint
+     */
+    public VersionRange getVersionConstraint();
+
+    /**
+     * Returns whether or not this import is resolved.
+     * 
+     * @return true if this import is resolved
+     */
+    public boolean isResolved();
+
+    /**
+     * If this import is resolved, return the {@link QuasiExportPackage} that satisfies it. If this import is not
+     * resolved or if it is resolved but is an optional import that was not satisfied, return null.
+     * 
+     * @return any <code>QuasiExportPackage</code> that satisfies this import.
+     */
+    public QuasiExportPackage getProvider();
+
+    /**
+     * The {@link QuasiBundle} that specifies this import package.
+     * 
+     * @return The specifying <code>QuasiBundle</code>.
+     */
+    public QuasiBundle getImportingBundle();
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/quasi/QuasiPackageResolutionFailure.java b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/quasi/QuasiPackageResolutionFailure.java
new file mode 100644
index 0000000..64a27f0
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/quasi/QuasiPackageResolutionFailure.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.osgi.quasi;
+
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+
+/**
+ * {@link QuasiPackageResolutionFailure} describes a failure to resolve a package import of a {@link QuasiBundle} in a
+ * {@link QuasiFramework}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations of this class are thread safe.
+ * 
+ */
+public interface QuasiPackageResolutionFailure extends QuasiResolutionFailure {
+
+    String getPackage();
+
+    VersionRange getPackageVersionRange();
+
+    String getPackageBundleSymbolicName();
+
+    VersionRange getPackageBundleVersionRange();
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/quasi/QuasiPackageUsesResolutionFailure.java b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/quasi/QuasiPackageUsesResolutionFailure.java
new file mode 100644
index 0000000..7f1e45d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/quasi/QuasiPackageUsesResolutionFailure.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.osgi.quasi;
+
+/**
+ * {@link QuasiPackageUsesResolutionFailure} describes a failure to resolve a package import of a {@link QuasiBundle} in
+ * a {@link QuasiFramework} because of a user constraint.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations of this class are thread safe.
+ * 
+ */
+public interface QuasiPackageUsesResolutionFailure extends QuasiPackageResolutionFailure {
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/quasi/QuasiParameterised.java b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/quasi/QuasiParameterised.java
new file mode 100644
index 0000000..34d7bdb
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/quasi/QuasiParameterised.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.osgi.quasi;
+
+import java.util.Map;
+
+/**
+ * {@link QuasiParameterised} provides access to the attributes and directives of a header.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations of this class must be thread safe.
+ * 
+ */
+public interface QuasiParameterised {
+
+    /**
+     * Returns the directives for a header.
+     * 
+     * @return a map containing the directives
+     */
+    Map<String, Object> getDirectives();
+
+    /**
+     * Returns the attributes for a header.
+     * 
+     * @return a map containing the attributes
+     */
+    Map<String, Object> getAttributes();
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/quasi/QuasiRequiredBundle.java b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/quasi/QuasiRequiredBundle.java
new file mode 100644
index 0000000..fd20cfb
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/quasi/QuasiRequiredBundle.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.osgi.quasi;
+
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+
+/**
+ * <p>
+ * {@link QuasiRequiredBundle} is a representation of a bundle required from another bundle in a {@link QuasiFramework}.
+ * </p>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations of this class must be thread safe.
+ * 
+ */
+public interface QuasiRequiredBundle extends QuasiParameterised {
+
+    /**
+     * @return The symbolic name of the Bundle required.
+     */
+    public String getRequiredBundleName();
+
+    /**
+     * The version range that must be satisfied by any matching bundles.
+     * 
+     * @return the <code>VersionRange</code> constraint
+     */
+    public VersionRange getVersionConstraint();
+
+    /**
+     * Returns whether this require bundle is resolved.
+     * 
+     * @return true if this require bundle is resolved
+     */
+    public boolean isResolved();
+
+    /**
+     * If this require bundle is resolved, return any specific {@link QuasiBundle} that satisfies it. If this require
+     * bundle is not resolved or if it is resolved but is optional and was not satisfied, return null.
+     * 
+     * @return any <code>QuasiBundle</code> that satisfies this <code>QuasiRequiredBundle</code>.
+     */
+    public QuasiBundle getProvider();
+
+    /**
+     * The {@link QuasiBundle} that specifies this <code>QuasiRequiredBundle</code> clause.
+     * 
+     * @return The requiring QuasiBundle.
+     */
+    public QuasiBundle getRequiringBundle();
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/quasi/QuasiResolutionFailure.java b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/quasi/QuasiResolutionFailure.java
new file mode 100644
index 0000000..20841c5
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/quasi/QuasiResolutionFailure.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.osgi.quasi;
+
+
+/**
+ * {@link QuasiResolutionFailure} describes a failure to resolve a {@link QuasiBundle} in a {@link QuasiFramework}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations of this class are thread safe.
+ * 
+ */
+public interface QuasiResolutionFailure {
+    
+    /**
+     * Gets a human readable description of the failure.
+     * 
+     * @return a human readable String
+     */
+    String getDescription();
+    
+    /**
+     * Gets the unresolved {@link QuasiBundle}.
+     * 
+     * @return the unresolved <code>QuasiBundle</code>
+     */
+    QuasiBundle getUnresolvedQuasiBundle();
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/region/GlobalRegion.java b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/region/GlobalRegion.java
new file mode 100644
index 0000000..ce58e86
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.osgi/src/main/java/org/eclipse/virgo/kernel/osgi/region/GlobalRegion.java
@@ -0,0 +1,209 @@
+/*******************************************************************************
+ * Copyright (c) 2011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.osgi.region;
+
+import java.io.InputStream;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.equinox.region.Region;
+import org.eclipse.equinox.region.RegionDigraph;
+import org.eclipse.equinox.region.RegionDigraph.FilteredRegion;
+import org.eclipse.equinox.region.RegionDigraphVisitor;
+import org.eclipse.equinox.region.RegionFilter;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.Version;
+
+/**
+ * {@link GlobalRegion} is an implementation of {@link Region} which acts as a place holder for all artifacts that are not bundles
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread safe.
+ */
+final class GlobalRegion implements Region {
+
+    private final String regionName;
+    
+    private static final String UNSUPPORTED_OPERATION_MESSAGE = "Bundle operations are not support on the Independent Region";
+
+    
+    public GlobalRegion(String regionName) {
+        this.regionName = regionName;
+    }
+    
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String getName() {
+        return regionName;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void addBundle(Bundle bundle) throws BundleException {
+        throw new UnsupportedOperationException(UNSUPPORTED_OPERATION_MESSAGE);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void addBundle(long bundleId) {
+        throw new UnsupportedOperationException(UNSUPPORTED_OPERATION_MESSAGE);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Bundle installBundle(String location, InputStream input) throws BundleException {
+        throw new UnsupportedOperationException(UNSUPPORTED_OPERATION_MESSAGE);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Bundle installBundle(String location) throws BundleException {
+        throw new UnsupportedOperationException(UNSUPPORTED_OPERATION_MESSAGE);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Bundle getBundle(@NonNull String symbolicName, @NonNull Version version) {
+        throw new UnsupportedOperationException(UNSUPPORTED_OPERATION_MESSAGE);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void connectRegion(Region headRegion, RegionFilter filter) throws BundleException {
+        throw new UnsupportedOperationException(UNSUPPORTED_OPERATION_MESSAGE);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public RegionDigraph getRegionDigraph(){
+        return null;
+    }
+    
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean contains(Bundle bundle) {
+        return false;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean contains(long bundleId) {
+        return false;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void removeBundle(Bundle bundle) {
+        //no-op
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void removeBundle(long bundleId) {
+        //no-op
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Set<Long> getBundleIds() {
+        return new HashSet<Long>();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Set<FilteredRegion> getEdges() {
+        return new HashSet<RegionDigraph.FilteredRegion>();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void visitSubgraph(RegionDigraphVisitor visitor) {
+        //no-op
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String toString() {
+        return getName();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + regionName.hashCode();
+        return result;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (!(obj instanceof GlobalRegion)) {
+            return false;
+        }
+        GlobalRegion other = (GlobalRegion) obj;
+        return this.regionName.equals(other.regionName);
+    }
+    
+	@Override
+	public Bundle installBundleAtLocation(String arg0, InputStream arg1)
+			throws BundleException {
+		throw new UnsupportedOperationException(UNSUPPORTED_OPERATION_MESSAGE);
+	}
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.osgi/src/main/resources/META-INF/spring/configuration-context.xml b/kernel/org.eclipse.virgo.kernel.osgi/src/main/resources/META-INF/spring/configuration-context.xml
new file mode 100644
index 0000000..17e5153
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.osgi/src/main/resources/META-INF/spring/configuration-context.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns:osgi="http://www.springframework.org/schema/osgi"
+	xmlns:context="http://www.springframework.org/schema/context"
+	xmlns:osgi-compendium="http://www.springframework.org/schema/osgi-compendium"
+	xsi:schemaLocation="http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi-1.2.xsd
+		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
+		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
+		http://www.springframework.org/schema/osgi-compendium http://www.springframework.org/schema/osgi-compendium/spring-osgi-compendium-1.2.xsd">
+
+	<osgi-compendium:cm-properties id="kernelConfig" persistent-id="org.eclipse.virgo.kernel"/>
+	
+	<context:property-placeholder properties-ref="kernelConfig"/>
+	
+</beans>
diff --git a/kernel/org.eclipse.virgo.kernel.osgi/src/main/resources/META-INF/spring/internal-osgi-context.xml b/kernel/org.eclipse.virgo.kernel.osgi/src/main/resources/META-INF/spring/internal-osgi-context.xml
new file mode 100644
index 0000000..190aabf
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.osgi/src/main/resources/META-INF/spring/internal-osgi-context.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:osgi="http://www.springframework.org/schema/osgi"
+	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
+		http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi-1.2.xsd">
+
+	<!--
+		Configuration for OSGi services that the kernel depends on and
+		provides to the framework. These services are not considered part of
+		the kernel API.
+	-->
+
+	<osgi:reference id="eventLogger"
+		interface="org.eclipse.virgo.medic.eventlog.EventLogger" />
+
+	<osgi:reference id="shutdown" interface="org.eclipse.virgo.nano.core.Shutdown"/>
+
+	<osgi:reference id="packageAdmin"
+		interface="org.osgi.service.packageadmin.PackageAdmin" />
+
+	<osgi:reference id="repository"
+		interface="org.eclipse.virgo.repository.Repository" />
+
+	<osgi:reference id="eventAdmin" interface="org.osgi.service.event.EventAdmin" />
+
+	<osgi:reference id="configAdmin"
+		interface="org.osgi.service.cm.ConfigurationAdmin" />
+
+	<osgi:reference id="eventLoggerFactory"
+		interface="org.eclipse.virgo.medic.eventlog.EventLoggerFactory" />
+
+</beans>
diff --git a/kernel/org.eclipse.virgo.kernel.osgi/src/main/resources/META-INF/spring/osgi-framework-context.xml b/kernel/org.eclipse.virgo.kernel.osgi/src/main/resources/META-INF/spring/osgi-framework-context.xml
new file mode 100644
index 0000000..226c564
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.osgi/src/main/resources/META-INF/spring/osgi-framework-context.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+	xmlns:osgi="http://www.springframework.org/schema/osgi"
+	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
+		http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi-1.2.xsd">
+	
+	<osgi:service ref="globalRegion" interface="org.eclipse.equinox.region.Region" >
+		<osgi:service-properties>
+			<entry key="org.eclipse.virgo.kernel.region.name" value="global"/>
+		</osgi:service-properties>
+	</osgi:service>
+	
+	<bean id="globalRegion" class="org.eclipse.virgo.kernel.osgi.region.GlobalRegion">
+		<constructor-arg name="regionName" value="global" />
+	</bean>
+	
+</beans>
diff --git a/kernel/org.eclipse.virgo.kernel.osgi/src/test/java/org/eclipse/virgo/kernel/osgi/region/GlobalRegionTests.java b/kernel/org.eclipse.virgo.kernel.osgi/src/test/java/org/eclipse/virgo/kernel/osgi/region/GlobalRegionTests.java
new file mode 100644
index 0000000..4b1745e
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.osgi/src/test/java/org/eclipse/virgo/kernel/osgi/region/GlobalRegionTests.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.osgi.region;
+
+import junit.framework.Assert;
+
+import org.eclipse.equinox.region.Region;
+import org.eclipse.virgo.nano.serviceability.Assert.FatalAssertionException;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Version;
+
+public class GlobalRegionTests {
+
+    private static final Version TEST_VERSION = Version.emptyVersion;
+
+    private static final String TEST_BUNDLE_SYMBOLIC_NAME = "a";
+
+    private static final String TEST_REGION_NAME = "test.region";
+
+    private Region region;
+
+    @Before
+    public void setUp() throws Exception {
+        this.region = new GlobalRegion(TEST_REGION_NAME);
+    }
+
+    @Test
+    public void testGetName() {
+        Assert.assertEquals(TEST_REGION_NAME, this.region.getName());
+    }
+    
+    @Test(expected=UnsupportedOperationException.class)
+    public void testGetBundle() throws UnsupportedOperationException {
+       this.region.getBundle(TEST_BUNDLE_SYMBOLIC_NAME, TEST_VERSION);
+    }
+    
+    @Test(expected=FatalAssertionException.class)
+    public void testGetBundleWithNullSymbolicName() throws UnsupportedOperationException {
+       this.region.getBundle(null, TEST_VERSION);
+    }
+    
+    @Test(expected=FatalAssertionException.class)
+    public void testGetBundleWithNullVersion() throws UnsupportedOperationException {
+       this.region.getBundle(TEST_BUNDLE_SYMBOLIC_NAME, null);
+    }
+
+    // Other tests could be added in due course, but the point of adding this test was really to pin down bug 341012
+}
diff --git a/kernel/org.eclipse.virgo.kernel.osgi/src/test/resources/.gitignore b/kernel/org.eclipse.virgo.kernel.osgi/src/test/resources/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.osgi/src/test/resources/.gitignore
diff --git a/kernel/org.eclipse.virgo.kernel.osgi/template.mf b/kernel/org.eclipse.virgo.kernel.osgi/template.mf
new file mode 100644
index 0000000..b03f252
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.osgi/template.mf
@@ -0,0 +1,25 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Virgo Kernel OSGi integration
+Bundle-SymbolicName: org.eclipse.virgo.kernel.osgi
+Bundle-Version: ${version}
+Excluded-Exports:
+ *.internal.*
+Excluded-Imports:
+ org.eclipse.virgo.kernel.services.repository.internal.*,
+ org.eclipse.virgo.repository.internal
+Import-Template:
+ org.eclipse.virgo.kernel.*;version="${version:[=.=.=, =.+1)}",
+ org.eclipse.virgo.nano.*;version="${version:[=.=.=, =.+1)}",
+ org.eclipse.virgo.medic.*;version="${version:[=.=.=, =.+1)}",
+ org.eclipse.virgo.repository.*;version="${version:[=.=.=, =.+1)}",
+ org.eclipse.virgo.util.*;version="${version:[=.=.=, =.+1)}",
+ org.aspectj.*;version="${aspectjVersion:[=.=.=, +1)}",
+ org.eclipse.osgi.*;version="0",
+ org.eclipse.equinox.region.*;version="${equinoxRegionExportedPackageVersion:[=.=.=, =.+1)}",
+ org.osgi.framework.*;version="0",
+ org.osgi.service.*;version="0",
+ org.osgi.util.*;version="0",
+ org.slf4j.*;version="${slf4jVersion:[=.=.=, +1)}",
+ org.springframework.*;version="${springframeworkVersion:[2.5.6, +1)}",
+ javax.management;version="0"
diff --git a/kernel/org.eclipse.virgo.kernel.services/.settings/org.eclipse.wst.common.project.facet.core.xml b/kernel/org.eclipse.virgo.kernel.services/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..92aa290
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.services/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+  <installed facet="org.eclipse.virgo.server.bundle" version="1.0"/>
+</faceted-project>
diff --git a/kernel/org.eclipse.virgo.kernel.services/.settings/org.springframework.ide.eclipse.core.prefs b/kernel/org.eclipse.virgo.kernel.services/.settings/org.springframework.ide.eclipse.core.prefs
new file mode 100644
index 0000000..fb7dc20
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.services/.settings/org.springframework.ide.eclipse.core.prefs
@@ -0,0 +1,67 @@
+#Mon Aug 03 11:32:32 BST 2009
+eclipse.preferences.version=1
+org.springframework.ide.eclipse.core.builders.enable.aopreferencemodelbuilder=true
+org.springframework.ide.eclipse.core.builders.enable.beanmetadatabuilder=true
+org.springframework.ide.eclipse.core.builders.enable.osgibundleupdater=true
+org.springframework.ide.eclipse.core.enable.project.preferences=false
+org.springframework.ide.eclipse.core.validator.enable.com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.enable.com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.enable.com.springsource.sts.server.quickfix.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.enable.org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.enable.org.springframework.ide.eclipse.core.springvalidator=false
+org.springframework.ide.eclipse.core.validator.enable.org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.applicationSymbolicNameRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.applicationVersionRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleActivationPolicyRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleActivatorRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleManifestVersionRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleNameRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleSymbolicNameRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleVersionRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.exportPackageRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.importRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.parsingProblemsRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.requireBundleRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.AvoidDriverManagerDataSource-com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.ImportElementsAtTopRulee-com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.ParentBeanSpecifiesAbstractClassRule-com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.RefElementRule-com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.TooManyBeansInFileRule-com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.UnnecessaryValueElementRule-com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.UseBeanInheritance-com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.legacyxmlusage.jndiobjectfactory-com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.importBundleVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.importLibraryVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.importPackageVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.requireBundleVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanAlias-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanClass-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanConstructorArgument-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanDefinition-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanDefinitionHolder-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanFactory-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanInitDestroyMethod-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanProperty-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanReference-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.methodOverride-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.parsingProblems-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.requiredProperty-org.springframework.ide.eclipse.beans.core.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.core.springClasspath-org.springframework.ide.eclipse.core.springvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.action-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.actionstate-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.attribute-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.attributemapper-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.beanaction-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.evaluationaction-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.evaluationresult-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.exceptionhandler-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.import-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.inputattribute-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.mapping-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.outputattribute-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.set-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.state-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.subflowstate-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.transition-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.variable-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.webflowstate-org.springframework.ide.eclipse.webflow.core.validator=true
diff --git a/kernel/org.eclipse.virgo.kernel.services/.springBeans b/kernel/org.eclipse.virgo.kernel.services/.springBeans
new file mode 100644
index 0000000..618a258
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.services/.springBeans
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beansProjectDescription>
+	<version>1</version>
+	<pluginVersion><![CDATA[2.2.8.200911091054-RELEASE]]></pluginVersion>
+	<configSuffixes>
+		<configSuffix><![CDATA[xml]]></configSuffix>
+	</configSuffixes>
+	<enableImports><![CDATA[false]]></enableImports>
+	<configs>
+	</configs>
+	<configSets>
+	</configSets>
+</beansProjectDescription>
diff --git a/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/concurrent/ExecutorServiceDelegate.java b/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/concurrent/ExecutorServiceDelegate.java
new file mode 100644
index 0000000..2de4862
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/concurrent/ExecutorServiceDelegate.java
@@ -0,0 +1,151 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.services.concurrent;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.ThreadPoolExecutor;
+
+import org.eclipse.virgo.nano.shim.serviceability.TracingService;
+
+
+/**
+ * Delegate object that encapsulates common operations for {@link ExecutorService} implementations.
+ * <p/>
+ * Each {@link ExecutorService} should maintain its own instance of <code>ExecutorServiceDelegate</code>.
+ * 
+ * <strong>Concurrent Semantics</strong><br/>
+ * 
+ * Threadsafe.
+ * 
+ */
+final class ExecutorServiceDelegate {
+
+    private final ApplicationNameAccessor accessor;
+
+    private final Object monitor = new Object();
+
+    private long totalExecutionTime;
+
+    public ExecutorServiceDelegate(TracingService tracingService) {
+        this.accessor = new ApplicationNameAccessor(tracingService);
+    }
+
+    /**
+     * Gets an estimate of the average amount of time spent processing successful tasks.
+     * @param completedTaskCount 
+     * @return the estimate of time spent.
+     * @see ThreadPoolExecutor#getCompletedTaskCount()
+     */
+    public long getAverageExecutionTime(long completedTaskCount) {
+        synchronized (this.monitor) {
+            return completedTaskCount == 0 ? this.totalExecutionTime : this.totalExecutionTime / completedTaskCount;
+        }
+    }
+
+    /**
+     * Gets an estimate of the total amount of time spent processing successful tasks.
+     * 
+     * @return the estimate of time spent.
+     * @see ThreadPoolExecutor#getCompletedTaskCount()
+     */
+    public long getExecutionTime() {
+        synchronized (this.monitor) {
+            return this.totalExecutionTime;
+        }
+    }
+
+    /**
+     * Creates a {@link Runnable} wrapper that gathers execution statistics for the supplied {@link Runnable}.
+     * 
+     * @param delegate the <code>Runnable</code> to gather the statistics for.
+     * @return the wrapper.
+     */
+    public Runnable decorate(Runnable delegate) {
+        return new KernelRunnable(delegate);
+    }
+
+    /**
+     * Simple {@link Runnable} that tracks execution statistics for another, wrapped <code>Runnable</code> instance.
+     * <p/>
+     * 
+     * <strong>Concurrent Semantics</strong><br/>
+     * 
+     * Threadsafe.
+     * 
+     */
+    private class KernelRunnable implements Runnable {
+
+        private final Runnable delegate;
+
+        private final String applicationName;
+
+        /**
+         * @param delegate
+         */
+        public KernelRunnable(Runnable delegate) {
+            this.delegate = delegate;
+            this.applicationName = accessor.getCurrentApplicationName();
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public void run() {
+            long timeBefore = System.currentTimeMillis();
+            accessor.setCurrentApplicationName(this.applicationName);
+            try {
+                this.delegate.run();
+            } finally {
+                accessor.setCurrentApplicationName(null);
+                ExecutorServiceDelegate outer = ExecutorServiceDelegate.this;
+                long time = System.currentTimeMillis() - timeBefore;
+                synchronized (outer.monitor) {
+                    outer.totalExecutionTime += time;
+                }
+            }
+        }
+    }
+
+    /**
+     * Wrapper around {@link TracingService} that handles the service proxy disappearing.
+     * <p/>
+     * 
+     * <strong>Concurrent Semantics</strong><br />
+     * 
+     * Threadsafe.
+     * 
+     */
+    private static class ApplicationNameAccessor {
+
+        private final TracingService tracingService;
+
+        public ApplicationNameAccessor(TracingService tracingService) {
+            this.tracingService = tracingService;
+        }
+
+        /**
+         * @return application name
+         * @see TracingService#getCurrentApplicationName()
+         */
+        public String getCurrentApplicationName() {
+            return this.tracingService.getCurrentApplicationName();
+        }
+
+        /**
+         * @param applicationName 
+         * @see TracingService#setCurrentApplicationName(String)
+         */
+        public void setCurrentApplicationName(String applicationName) {
+            this.tracingService.setCurrentApplicationName(applicationName);
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/concurrent/ExecutorServiceInfo.java b/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/concurrent/ExecutorServiceInfo.java
new file mode 100644
index 0000000..66393c3
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/concurrent/ExecutorServiceInfo.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.services.concurrent;
+
+import javax.management.MXBean;
+
+/**
+ * <p>
+ * Anything that wants to expose information through the service registry about executor services must implement this
+ * interface.
+ * </p>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations <strong>must</strong> be threadsafe.
+ * 
+ */
+@MXBean
+public interface ExecutorServiceInfo {
+
+    /**
+     * Gets the average execution time of all executed tasks in mili seconds.
+     * 
+     * @return the average execution time.
+     */
+    long getAverageExecutionTime();
+
+    /**
+     * Gets the total time spent executing tasks in mili seconds.
+     * 
+     * @return the total execution time.
+     */
+    long getExecutionTime();
+
+    /**
+     * Gets the number of active tasks within this executor.
+     * 
+     * @return the active task count.
+     */
+    int getActiveCount();
+
+    /**
+     * Gets the current total capacity of the pool.
+     * 
+     * @return the current pool size.
+     */
+    int getPoolSize();
+
+    /**
+     * Gets the largest size the pool has ever reached.
+     * 
+     * @return the largest pool size.
+     */
+    int getLargestPoolSize();
+
+    /**
+     * Gets the maximum pool size.
+     * 
+     * @return the maximum pool size.
+     */
+    int getMaximumPoolSize();
+
+    /**
+     * Gets the type of the pool.
+     * 
+     * @return the pool type name.
+     */
+    String getTypeName();
+}
diff --git a/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/concurrent/ExecutorServiceStatistics.java b/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/concurrent/ExecutorServiceStatistics.java
new file mode 100644
index 0000000..ae61b51
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/concurrent/ExecutorServiceStatistics.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.services.concurrent;
+
+import java.util.concurrent.ExecutorService;
+
+/**
+ * Extension to {@link ExecutorService} that exposes useful metrics. <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations <strong>must</strong> provide for threadsafe access to metrics. However, the timeliness of metric
+ * updates need not be guaranteed.
+ * 
+ */
+public interface ExecutorServiceStatistics {
+
+    /**
+     * Gets the average execution time of all executed tasks.
+     * 
+     * @return the average execution time.
+     */
+    long getAverageExecutionTime();
+
+    /**
+     * Gets the total time spend executing tasks.
+     * 
+     * @return the total execution time.
+     */
+    long getExecutionTime();
+
+    /**
+     * Gets the number of active tasks.
+     * 
+     * @return the active task count.
+     */
+    int getActiveCount();
+
+    /**
+     * Gets current size of the pool.
+     * 
+     * @return the current pool size.
+     */
+    int getPoolSize();
+
+    /**
+     * Gets the largest size the pool has ever reached.
+     * 
+     * @return the largest pool size.
+     */
+    int getLargestPoolSize();
+
+    /**
+     * Gets the maximum pool size.
+     * 
+     * @return the maximum pool size.
+     */
+    int getMaximumPoolSize();
+
+    /**
+     * Gets the name of the pool.
+     * 
+     * @return the pool name.
+     */
+    String getPoolName();
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/concurrent/KernelExecutorService.java b/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/concurrent/KernelExecutorService.java
new file mode 100644
index 0000000..ca6e906
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/concurrent/KernelExecutorService.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.services.concurrent;
+
+import java.util.concurrent.ExecutorService;
+
+/**
+ * Extension to {@link ExecutorService} that provides access to metrics about the <code>Executor</code>.<p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Semantics defined in {@link ExecutorService} and {@link ExecutorServiceStatistics}.
+ * 
+ */
+public interface KernelExecutorService extends ExecutorService, ExecutorServiceStatistics {
+
+   
+}
diff --git a/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/concurrent/KernelScheduledExecutorService.java b/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/concurrent/KernelScheduledExecutorService.java
new file mode 100644
index 0000000..6a79782
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/concurrent/KernelScheduledExecutorService.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.services.concurrent;
+
+import java.util.concurrent.ScheduledExecutorService;
+
+
+/**
+ * Extension to {@link ScheduledExecutorService} that provides access to metrics about the <code>Executor</code>.<p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Semantics defined in {@link ScheduledExecutorService} and {@link ExecutorServiceStatistics}.
+ * 
+ */
+public interface KernelScheduledExecutorService extends ScheduledExecutorService, ExecutorServiceStatistics {
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/concurrent/KernelScheduledThreadPoolExecutor.java b/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/concurrent/KernelScheduledThreadPoolExecutor.java
new file mode 100644
index 0000000..c28f0cc
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/concurrent/KernelScheduledThreadPoolExecutor.java
@@ -0,0 +1,101 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.services.concurrent;
+
+import static org.eclipse.virgo.kernel.services.concurrent.ThreadPoolUtils.createThreadFactory;
+import static org.eclipse.virgo.kernel.services.concurrent.ThreadPoolUtils.determineHandler;
+
+import java.util.concurrent.RejectedExecutionHandler;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.concurrent.ThreadPoolExecutor;
+
+import org.eclipse.virgo.nano.shim.serviceability.TracingService;
+
+
+/**
+ * Extension of {@link ScheduledThreadPoolExecutor} that handles kernel thread decoration.
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.
+ * 
+ */
+public final class KernelScheduledThreadPoolExecutor extends ScheduledThreadPoolExecutor implements KernelScheduledExecutorService {
+
+    private final ExecutorServiceDelegate delegate;
+
+    private final String poolName;
+
+    /**
+     * Creates a new <code>KernelScheduledThreadPoolExecutor</code>.
+     * 
+     * @param corePoolSize the number of threads in the pool.
+     * @param poolName the name of the pool.
+     * @param tracingService the kernel tracing service
+     * @see ScheduledThreadPoolExecutor#ScheduledThreadPoolExecutor(int, RejectedExecutionHandler)
+     */
+    public KernelScheduledThreadPoolExecutor(int corePoolSize, String poolName, TracingService tracingService) {
+        this(corePoolSize, poolName, tracingService, null);
+    }
+    
+    /**
+     * Creates a new <code>KernelScheduledThreadPoolExecutor</code>.
+     * 
+     * @param corePoolSize the number of threads in the pool.
+     * @param poolName the name of the pool.
+     * @param tracingService the kernel tracing service
+     * @param handler the {@link RejectedExecutionHandler}.
+     * @see ScheduledThreadPoolExecutor#ScheduledThreadPoolExecutor(int, RejectedExecutionHandler)
+     */
+    public KernelScheduledThreadPoolExecutor(int corePoolSize, String poolName, TracingService tracingService, RejectedExecutionHandler handler) {
+        super(corePoolSize, createThreadFactory(poolName), determineHandler(handler));
+        this.poolName = poolName;
+        this.delegate = new ExecutorServiceDelegate(tracingService);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void execute(Runnable command) {
+        super.execute(this.delegate.decorate(command));
+    }
+
+    /**
+     * Gets an estimate of the average amount of time spent processing successful tasks.
+     * 
+     * @return the estimate of time spent.
+     * @see ThreadPoolExecutor#getCompletedTaskCount()
+     */
+    public long getAverageExecutionTime() {
+        return this.delegate.getAverageExecutionTime(getCompletedTaskCount());
+    }
+
+    /**
+     * Gets an estimate of the total amount of time spent processing successful tasks.
+     * 
+     * @return the estimate of time spent.
+     * @see ThreadPoolExecutor#getCompletedTaskCount()
+     */
+    public long getExecutionTime() {
+        return this.delegate.getExecutionTime();
+    }
+
+    /**
+     * Get the unique name of the Pool used in this executor service
+     * 
+     * {@inheritDoc}
+     */
+    public String getPoolName() {
+        return this.poolName;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/concurrent/KernelThreadPoolExecutor.java b/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/concurrent/KernelThreadPoolExecutor.java
new file mode 100644
index 0000000..220b6b3
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/concurrent/KernelThreadPoolExecutor.java
@@ -0,0 +1,114 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.services.concurrent;
+
+import static org.eclipse.virgo.kernel.services.concurrent.ThreadPoolUtils.createThreadFactory;
+import static org.eclipse.virgo.kernel.services.concurrent.ThreadPoolUtils.determineHandler;
+
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.RejectedExecutionHandler;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.virgo.nano.shim.serviceability.TracingService;
+
+/**
+ * Extension of {@link ThreadPoolExecutor} that handles kernel thread decoration.
+ * <p/>
+ * The implementation of ThreadPoolExecutor changed in Java 7 so that getCompletedTaskCount includes tasks that failed
+ * with an exception, unlike Java 6 which excludes such tasks from the count. {@link KernelThreadPoolExecutor} class
+ * inherits this Java version specific behaviour.
+ * 
+ * <strong>Concurrent Semantics</strong><br/>
+ * 
+ * Thread-safe.
+ * 
+ */
+public final class KernelThreadPoolExecutor extends ThreadPoolExecutor implements KernelExecutorService {
+
+    private final ExecutorServiceDelegate delegate;
+
+    private final String poolName;
+
+    /**
+     * Creates a new <code>ServerThreadPoolExecutor</code>.
+     * 
+     * @param corePoolSize the core size of the pool.
+     * @param maximumPoolSize the maximum size of the pool.
+     * @param keepAliveTime the thread keep alive time.
+     * @param unit the {@link TimeUnit} for the keep alive time.
+     * @param workQueue the work queue.
+     * @param poolName the name of the thread pool.
+     * @param tracingService
+     */
+    public KernelThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue,
+        String poolName, TracingService tracingService) {
+        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, poolName, tracingService, null);
+    }
+
+    /**
+     * Creates a new <code>ServerThreadPoolExecutor</code>.
+     * 
+     * @param corePoolSize the core size of the pool.
+     * @param maximumPoolSize the maximum size of the pool.
+     * @param keepAliveTime the thread keep alive time.
+     * @param unit the {@link TimeUnit} for the keep alive time.
+     * @param workQueue the work queue.
+     * @param poolName the name of the thread pool.
+     * @param tracingService the kernel tracing service.
+     * @param handler the rejected execution handler. May be <code>null</code>.
+     */
+    public KernelThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue,
+        String poolName, TracingService tracingService, RejectedExecutionHandler handler) {
+        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, createThreadFactory(poolName), determineHandler(handler));
+        this.poolName = poolName;
+        this.delegate = new ExecutorServiceDelegate(tracingService);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void execute(Runnable command) {
+        Runnable decorated = this.delegate.decorate(command);
+        super.execute(decorated);
+    }
+
+    /**
+     * Gets an estimate of the average amount of time spent processing successful tasks.
+     * 
+     * @return the estimate of time spent.
+     * @see ThreadPoolExecutor#getCompletedTaskCount()
+     */
+    public long getAverageExecutionTime() {
+        return this.delegate.getAverageExecutionTime(getCompletedTaskCount());
+    }
+
+    /**
+     * Gets an estimate of the total amount of time spent processing successful tasks.
+     * 
+     * @return the estimate of time spent.
+     * @see ThreadPoolExecutor#getCompletedTaskCount()
+     */
+    public long getExecutionTime() {
+        return this.delegate.getExecutionTime();
+    }
+
+    /**
+     * Get the unique name of the Pool used in this executor service
+     * 
+     * {@inheritDoc}
+     */
+    public String getPoolName() {
+        return this.poolName;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/concurrent/NamedThreadFactory.java b/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/concurrent/NamedThreadFactory.java
new file mode 100644
index 0000000..cb07395
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/concurrent/NamedThreadFactory.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.services.concurrent;
+
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * {@link ThreadFactory} implementation that delegates to the {@link ThreadManager}. Automatic naming of threads in the
+ * pool is handled by this class.<p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.
+ * 
+ */
+final class NamedThreadFactory implements ThreadFactory {
+
+    private final String poolName;
+
+    private final AtomicInteger threadCount = new AtomicInteger(1);
+
+    /**
+     * Creates a new <code>ThreadManagerPoolThreadFactory</code>.
+     * 
+     * @param poolName the name of the thread pool.
+     */
+    public NamedThreadFactory(String poolName) {
+        this.poolName = poolName;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Thread newThread(Runnable r) {
+        return new Thread(r, this.poolName + "-thread-" + this.threadCount.getAndIncrement());
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/concurrent/PersistentThreadLocal.java b/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/concurrent/PersistentThreadLocal.java
new file mode 100644
index 0000000..8b918a7
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/concurrent/PersistentThreadLocal.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.services.concurrent;
+
+/**
+ * Marker interface to signify that a {@link ThreadLocal} should not be cleared.<p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * N/A
+ * 
+ */
+interface PersistentThreadLocal {
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/concurrent/ThreadPoolUtils.java b/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/concurrent/ThreadPoolUtils.java
new file mode 100644
index 0000000..ad7d631
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/concurrent/ThreadPoolUtils.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.services.concurrent;
+
+import java.util.concurrent.RejectedExecutionHandler;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.ThreadPoolExecutor.AbortPolicy;
+
+/**
+ */
+public final class ThreadPoolUtils {
+
+    private static final RejectedExecutionHandler DEFAULT_HANDLER = new AbortPolicy();
+
+    public static ThreadFactory createThreadFactory(String poolName) {
+        return new NamedThreadFactory(poolName);
+    }
+
+    static RejectedExecutionHandler determineHandler(RejectedExecutionHandler handler) {
+        return (handler == null ? DEFAULT_HANDLER : handler);
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/concurrent/diagnostics/ConcurrentLogEvents.java b/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/concurrent/diagnostics/ConcurrentLogEvents.java
new file mode 100644
index 0000000..41a5444
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/concurrent/diagnostics/ConcurrentLogEvents.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.services.concurrent.diagnostics;
+
+import org.eclipse.virgo.medic.eventlog.Level;
+import org.eclipse.virgo.medic.eventlog.LogEvent;
+
+/**
+ * {@link LogEvent} for the concurrent subsystem.
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.
+ * 
+ */
+public enum ConcurrentLogEvents implements LogEvent {
+
+    DEADLOCK_DETECTED(0, Level.ERROR);
+
+    private static final String PREFIX = "CC";
+    
+    private final int code;
+    
+    private final Level level;
+
+    private ConcurrentLogEvents(int code, Level level) {
+        this.code = code;
+        this.level = level;        
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getEventCode() {
+        return String.format("%s%04d%1.1s", PREFIX, this.code, this.level);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Level getLevel() {
+        return this.level;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/concurrent/management/ExecutorServiceExporter.java b/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/concurrent/management/ExecutorServiceExporter.java
new file mode 100644
index 0000000..1fd3278
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/concurrent/management/ExecutorServiceExporter.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.services.concurrent.management;
+
+import org.eclipse.virgo.kernel.services.concurrent.ExecutorServiceStatistics;
+
+/**
+ * A utility to encapsulate the management exporting of a {@link ExecutorServiceStatistics} object
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations should be threadsafe
+ * 
+ */
+public interface ExecutorServiceExporter {
+
+    void export(ExecutorServiceStatistics executorService);
+}
diff --git a/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/concurrent/management/JmxExecutorServiceExporter.java b/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/concurrent/management/JmxExecutorServiceExporter.java
new file mode 100644
index 0000000..18b13f1
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/concurrent/management/JmxExecutorServiceExporter.java
@@ -0,0 +1,79 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.services.concurrent.management;
+
+import java.lang.management.ManagementFactory;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.management.JMException;
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+
+import org.eclipse.virgo.kernel.services.concurrent.ExecutorServiceInfo;
+import org.eclipse.virgo.kernel.services.concurrent.ExecutorServiceStatistics;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * Implementation of {@link ExecutorServiceExporter} that exports to JMX
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threasafe
+ * 
+ */
+public class JmxExecutorServiceExporter implements ExecutorServiceExporter {
+
+    private static final String OBJECT_NAME_PATTERN = "%s:type=Executor Service,name=%s";
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private final MBeanServer server = ManagementFactory.getPlatformMBeanServer();
+
+    private final Set<ObjectName> exportedExecutorServices = new HashSet<ObjectName>();
+
+    private final String managementDomain;
+
+    public JmxExecutorServiceExporter(String managementDomain) {
+        this.managementDomain = managementDomain;
+    }
+
+    public void export(ExecutorServiceStatistics executorService) {
+        try {
+            ObjectName name = new ObjectName(String.format(OBJECT_NAME_PATTERN, this.managementDomain, executorService.getPoolName()));
+            ExecutorServiceInfo info = new StandardExecutorServiceInfo(executorService);
+            this.server.registerMBean(info, name);
+
+            synchronized (this.exportedExecutorServices) {
+                this.exportedExecutorServices.add(name);
+            }
+        } catch (JMException e) {
+            this.logger.warn(String.format("Unable to register executor service %s for management", executorService), e);
+        }
+    }
+
+    public void destroy() {
+        synchronized (this.exportedExecutorServices) {
+            for (ObjectName exportedExecutorService : this.exportedExecutorServices) {
+                try {
+                    this.server.unregisterMBean(exportedExecutorService);
+                } catch (JMException e) {
+                    this.logger.warn(String.format("Unable to unregister executor service %s from management", exportedExecutorService), e);
+                }
+            }
+        }
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/concurrent/management/StandardExecutorServiceInfo.java b/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/concurrent/management/StandardExecutorServiceInfo.java
new file mode 100644
index 0000000..15e02ac
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/concurrent/management/StandardExecutorServiceInfo.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.services.concurrent.management;
+
+import java.lang.ref.Reference;
+import java.lang.ref.WeakReference;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.ScheduledExecutorService;
+
+import org.eclipse.virgo.kernel.services.concurrent.ExecutorServiceInfo;
+import org.eclipse.virgo.kernel.services.concurrent.ExecutorServiceStatistics;
+
+
+/**
+ * Standard implementation of {@link ExecutorServiceInfo}. Maintains a {@link WeakReference} to the underlying
+ * {@link ExecutorServiceStatistics} to prevent pinning the executor in memory.<p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.
+ * 
+ */
+public class StandardExecutorServiceInfo implements ExecutorServiceInfo {
+
+    private final Reference<ExecutorServiceStatistics> managedExecutorService;
+
+    /**
+     * Constructor that deals with figuring out what kind of service there is and setting the references accordingly.
+     * 
+     * @param service the {@link ExecutorServiceStatistics} being exposed.
+     */
+    public StandardExecutorServiceInfo(ExecutorServiceStatistics service) {
+        this.managedExecutorService = new WeakReference<ExecutorServiceStatistics>(service);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public long getAverageExecutionTime() {
+        ExecutorServiceStatistics executorService = this.managedExecutorService.get();
+        return executorService == null ? -1 : executorService.getAverageExecutionTime();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public long getExecutionTime() {
+        ExecutorServiceStatistics executorService = this.managedExecutorService.get();
+        return executorService == null ? -1 : executorService.getExecutionTime();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public int getPoolSize() {
+        ExecutorServiceStatistics executorService = this.managedExecutorService.get();
+        return executorService == null ? -1 : executorService.getPoolSize();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public int getLargestPoolSize() {
+        ExecutorServiceStatistics executorService = this.managedExecutorService.get();
+        return executorService == null ? -1 : executorService.getLargestPoolSize();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getTypeName() {
+        ExecutorServiceStatistics executorService = this.managedExecutorService.get();
+        if(executorService == null) {
+            return null;
+        } else {
+            return (executorService instanceof ScheduledExecutorService ? ScheduledExecutorService.class.getSimpleName() : ExecutorService.class.getSimpleName());
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public int getActiveCount() {
+        ExecutorServiceStatistics executorService = this.managedExecutorService.get();
+        return executorService == null ? -1 : executorService.getActiveCount();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public int getMaximumPoolSize() {
+        ExecutorServiceStatistics executorService = this.managedExecutorService.get();
+        return executorService == null ? -1 : executorService.getMaximumPoolSize();
+    }
+
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/concurrent/monitor/DeadlockAnalyser.java b/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/concurrent/monitor/DeadlockAnalyser.java
new file mode 100644
index 0000000..bd10167
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/concurrent/monitor/DeadlockAnalyser.java
@@ -0,0 +1,234 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.services.concurrent.monitor;
+
+import java.lang.Thread.State;
+import java.lang.management.ManagementFactory;
+import java.lang.management.ThreadInfo;
+import java.lang.management.ThreadMXBean;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Analyses any deadlocks present in the VM and creates a description of the cycles.
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.
+ * 
+ */
+public class DeadlockAnalyser {
+
+    /**
+     * Result when there are no deadlocks.
+     */
+    private static final Deadlock[] NULL_RESULT = new Deadlock[0];
+
+    /**
+     * The VM {@link ThreadMXBean}.
+     */
+    private final ThreadMXBean threadBean = ManagementFactory.getThreadMXBean();
+
+    /**
+     * Identifies deadlocks in the currently running {@link Thread Threads}.
+     * 
+     * @return the deadlocks; never <code>null</code>.
+     */
+    public Deadlock[] findDeadlocks() {
+        long[] deadlockedThreads = this.threadBean.findMonitorDeadlockedThreads();
+        if (deadlockedThreads == null || deadlockedThreads.length == 0) {
+            return NULL_RESULT;
+        }
+
+        Map<Long, ThreadInfo> threadInfoMap = createThreadInfoMap(deadlockedThreads);
+        Set<LinkedHashSet<ThreadInfo>> cycles = calculateCycles(threadInfoMap);
+        Set<LinkedHashSet<ThreadInfo>> chains = calculateCycleDeadlockChains(threadInfoMap, cycles);
+        cycles.addAll(chains);
+        return createDeadlockDescriptions(cycles);
+    }
+
+    /**
+     * Creates {@link Deadlock} objects for each cycle in the supplied set.
+     * 
+     * @param cycles the cycles.
+     * @return the <code>Deadlocks</code>.
+     */
+    private Deadlock[] createDeadlockDescriptions(Set<LinkedHashSet<ThreadInfo>> cycles) {
+        Deadlock[] result = new Deadlock[cycles.size()];
+        int count = 0;
+        for (Set<ThreadInfo> cycle : cycles) {
+            ThreadInfo[] asArray = cycle.toArray(new ThreadInfo[cycle.size()]);
+            Deadlock d = new Deadlock(asArray);
+            result[count++] = d;
+        }
+        return result;
+    }
+
+    /**
+     * Calculates the cycles in the supplied {@link ThreadInfo} map. A cycle is represented as a {@link LinkedHashSet}
+     * of <code>ThreadInfo</code> objects. The order of the items in the <code>LinkedHashSet</code> reflects cycle
+     * order.
+     * 
+     * @param threadInfoMap the <code>ThreadInfo</code> map.
+     * @return all the cycles.
+     */
+    private Set<LinkedHashSet<ThreadInfo>> calculateCycles(Map<Long, ThreadInfo> threadInfoMap) {
+        Set<LinkedHashSet<ThreadInfo>> cycles = new HashSet<LinkedHashSet<ThreadInfo>>();
+        for (Map.Entry<Long, ThreadInfo> entry : threadInfoMap.entrySet()) {
+            LinkedHashSet<ThreadInfo> cycle = new LinkedHashSet<ThreadInfo>();
+
+            ThreadInfo t = entry.getValue();
+            while (!cycle.contains(t)) {
+                cycle.add(t);
+                t = threadInfoMap.get(t.getLockOwnerId());
+            }
+            if (!cycles.contains(cycle)) {
+                cycles.add(cycle);
+            }
+        }
+
+        return cycles;
+    }
+
+    /**
+     * Calculates deadlock chains where the deadlock occurs from a chain of threads waiting on some lock that is part of
+     * a deadlock cycle. A cycle is represented as a {@link LinkedHashSet} of <code>ThreadInfo</code> objects. The order
+     * of the items in the <code>LinkedHashSet</code> reflects chain order.
+     * 
+     * @param threadInfoMap the <code>ThreadInfo</code> map.
+     * @param cycles the known deadlock cycles.
+     * @return the deadlock chains.
+     */
+    private Set<LinkedHashSet<ThreadInfo>> calculateCycleDeadlockChains(Map<Long, ThreadInfo> threadInfoMap, Set<LinkedHashSet<ThreadInfo>> cycles) {
+        ThreadInfo[] allThreads = this.threadBean.getThreadInfo(this.threadBean.getAllThreadIds());
+        Set<LinkedHashSet<ThreadInfo>> deadlockChain = new HashSet<LinkedHashSet<ThreadInfo>>();
+        Set<Long> knownDeadlockedThreads = threadInfoMap.keySet();
+        for (ThreadInfo threadInfo : allThreads) {
+            State state = threadInfo.getThreadState();
+            if (state == State.BLOCKED && !knownDeadlockedThreads.contains(threadInfo.getThreadId())) {
+                for (LinkedHashSet<ThreadInfo> cycle : cycles) {
+                    if (cycle.contains(threadInfoMap.get(threadInfo.getLockOwnerId()))) {
+                        LinkedHashSet<ThreadInfo> chain = new LinkedHashSet<ThreadInfo>();
+                        ThreadInfo node = threadInfo;
+                        while (!chain.contains(node)) {
+                            chain.add(node);
+                            node = threadInfoMap.get(node.getLockOwnerId());
+                        }
+                        deadlockChain.add(chain);
+                    }
+                }
+            }
+        }
+        return deadlockChain;
+    }
+
+    /**
+     * Creates a mapping of <code>ThreadId +> ThreadInfo</code> for the deadlocked threads.
+     * 
+     * @param threadIds the deadlocked thread ids
+     * @return the mapping.
+     */
+    private Map<Long, ThreadInfo> createThreadInfoMap(long[] threadIds) {
+        ThreadInfo[] threadInfos = this.threadBean.getThreadInfo(threadIds);
+
+        Map<Long, ThreadInfo> threadInfoMap = new HashMap<Long, ThreadInfo>();
+        for (ThreadInfo threadInfo : threadInfos) {
+            threadInfoMap.put(threadInfo.getThreadId(), threadInfo);
+        }
+        return threadInfoMap;
+    }
+
+    /**
+     * Describes a deadlock of two or more threads.
+     * 
+     */
+    public static final class Deadlock {
+
+        private final ThreadInfo[] members;
+
+        private final String description;
+
+        private final Set<Long> memberIds;
+
+        /**
+         * Creates a new {@link Deadlock}.
+         * 
+         * @param members the members of the deadlock in cycle order.
+         */
+        private Deadlock(ThreadInfo[] members) {
+            this.members = members;
+            this.memberIds = new HashSet<Long>(members.length);
+            StringBuilder sb = new StringBuilder();
+            for (int x = 0; x < members.length; x++) {
+                ThreadInfo ti = members[x];
+                sb.append(ti.getThreadName());
+                if (x < members.length) {
+                    sb.append(" > ");
+                }
+
+                if (x == members.length - 1) {
+                    sb.append(ti.getLockOwnerName());
+                }
+                this.memberIds.add(ti.getThreadId());
+            }
+            this.description = sb.toString();
+        }
+
+        /**
+         * Gets the members of the deadlock in cycle order.
+         * 
+         * @return the members of the deadlock.
+         */
+        public ThreadInfo[] getMembers() {
+            return this.members.clone();
+        }
+
+        @Override
+        public String toString() {
+            return this.description;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public int hashCode() {
+            final int prime = 31;
+            int result = 1;
+            result = prime * result + this.memberIds.hashCode();
+            return result;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public boolean equals(Object obj) {
+            if (this == obj) {
+                return true;
+            }
+            if (obj == null) {
+                return false;
+            }
+            if (getClass() != obj.getClass()) {
+                return false;
+            }
+            final Deadlock other = (Deadlock) obj;
+            return other.memberIds.equals(this.memberIds);
+        }
+
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/concurrent/monitor/DeadlockMonitor.java b/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/concurrent/monitor/DeadlockMonitor.java
new file mode 100644
index 0000000..0304dac
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/concurrent/monitor/DeadlockMonitor.java
@@ -0,0 +1,130 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.services.concurrent.monitor;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.virgo.kernel.services.concurrent.diagnostics.ConcurrentLogEvents;
+import org.eclipse.virgo.kernel.services.concurrent.monitor.DeadlockAnalyser.Deadlock;
+import org.eclipse.virgo.medic.dump.DumpGenerator;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.util.math.Sets;
+
+/**
+ * Monitors all running {@link Thread Threads} and triggers a dump when a deadlock is detected.
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.
+ * 
+ */
+final class DeadlockMonitor {
+
+    private static final int PERIOD = 10;
+
+    private static final TimeUnit UNIT = TimeUnit.SECONDS;
+
+    private final ScheduledExecutorService executorService;
+
+    private final DumpGenerator dumpGenerator;
+
+    private final EventLogger eventLogger;
+
+    private volatile ScheduledFuture<?> future;
+
+    /**
+     * Creates a new <code>DeadlockMonitor</code>.
+     * 
+     * @param executorService the <code>ScheduledExecutorService</code>
+     * @param dumpGenerator the @{link {@link DumpGenerator} to trigger a dump.
+     * @param eventLogger 
+     */
+    public DeadlockMonitor(ScheduledExecutorService executorService, DumpGenerator dumpGenerator, EventLogger eventLogger) {
+        this.executorService = executorService;
+        this.dumpGenerator = dumpGenerator;
+        this.eventLogger = eventLogger;
+    }
+
+    /**
+     * Starts the deadlock monitor.
+     */
+    public void start() {
+        this.future = this.executorService.scheduleAtFixedRate(new DeadlockMonitorTask(this.dumpGenerator, this.eventLogger), PERIOD, PERIOD, UNIT);
+    }
+
+    /**
+     * Stops the deadlock monitor.
+     */
+    public void stop() {
+        if (this.executorService != null) {
+            this.executorService.shutdown();
+        }
+
+        if (this.future != null) {
+            this.future.cancel(true);
+        }
+    }
+
+    /**
+     * Task for monitoring threads for deadlocks.
+     * <p/>
+     */
+    private static class DeadlockMonitorTask implements Runnable {
+
+        private final DeadlockAnalyser analyser = new DeadlockAnalyser();
+
+        private final EventLogger eventLogger;
+
+        private final Set<Deadlock> lastSeenDeadlocks = new HashSet<Deadlock>();
+
+        private final Object monitor = new Object();
+
+        private final DumpGenerator dumpGenerator;
+
+        /**
+         * Creates a new <code>DeadlockMonitorTask</code>.
+         * 
+         * @param dumpGenerator the {@link DumpGenerator} to use.
+         * @param eventLogger 
+         */
+        public DeadlockMonitorTask(DumpGenerator dumpGenerator, EventLogger eventLogger) {
+            this.dumpGenerator = dumpGenerator;
+            this.eventLogger = eventLogger;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public void run() {
+            synchronized (this.monitor) {
+                Deadlock[] deadlocks = this.analyser.findDeadlocks();
+                if (deadlocks != null && deadlocks.length > 0) {
+                    Set<Deadlock> asSet = Sets.asSet(deadlocks);
+                    if (!asSet.equals(this.lastSeenDeadlocks)) {
+                        this.eventLogger.log(ConcurrentLogEvents.DEADLOCK_DETECTED);
+                        this.dumpGenerator.generateDump("deadlock");
+                        this.lastSeenDeadlocks.clear();
+                        this.lastSeenDeadlocks.addAll(asSet);
+                    }
+                } else {
+                    this.lastSeenDeadlocks.clear();
+                }
+            }
+        }
+
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/internal/KernelServicesLogEvents.java b/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/internal/KernelServicesLogEvents.java
new file mode 100644
index 0000000..803c14d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/internal/KernelServicesLogEvents.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.services.internal;
+
+import org.eclipse.virgo.nano.serviceability.LogEventDelegate;
+import org.eclipse.virgo.medic.eventlog.Level;
+import org.eclipse.virgo.medic.eventlog.LogEvent;
+
+/**
+ * Defines all the {@link LogEvent LogEvents} for the kernel services bundle.
+ * 
+ * <strong>Concurrent Semantics</strong><br/>
+ * 
+ * Implementation is immutable.
+ * 
+ */
+public enum KernelServicesLogEvents implements LogEvent {
+
+    KERNEL_REPOSITORY_CHAIN_EMPTY(1, Level.INFO), //
+    
+    KERNEL_REPOSITORY_CHAIN_ENTRY_NOT_VALID(2, Level.ERROR);
+
+    private static final String PREFIX = "KS";
+
+    private final LogEventDelegate delegate;
+
+    private KernelServicesLogEvents(int code, Level level) {
+        this.delegate = new LogEventDelegate(PREFIX, code, level);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getEventCode() {
+        return this.delegate.getEventCode();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Level getLevel() {
+        return this.delegate.getLevel();
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/repository/internal/EmptyRepository.java b/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/repository/internal/EmptyRepository.java
new file mode 100644
index 0000000..12b80b2
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/repository/internal/EmptyRepository.java
@@ -0,0 +1,107 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.services.repository.internal;
+
+import java.util.Collections;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.virgo.repository.Query;
+import org.eclipse.virgo.repository.Repository;
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+
+/**
+ * TODO Document EmptyRepository
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * TODO Document concurrent semantics of EmptyRepository
+ * 
+ */
+public class EmptyRepository implements Repository {
+
+    private static final Query EMPTY_QUERY = new EmptyQuery();
+
+    /**
+     * {@inheritDoc}
+     */
+    public Query createQuery(String key, String value) {
+        return EMPTY_QUERY;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Query createQuery(String key, String value, Map<String, Set<String>> properties) {
+        return EMPTY_QUERY;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public RepositoryAwareArtifactDescriptor get(String type, String name, VersionRange versionRange) {
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getName() {
+        return "empty";
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void stop() {
+    }
+
+    private static final class EmptyQuery implements Query {
+
+        /**
+         * {@inheritDoc}
+         */
+        public Query addFilter(String name, String value) {
+            return this;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public Query addFilter(String name, String value, Map<String, Set<String>> properties) {
+            return this;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+         public Query setVersionRangeFilter(VersionRange versionRange) {
+             return this;
+         }
+
+         /**
+          * {@inheritDoc}
+          */
+         public Query setVersionRangeFilter(VersionRange versionRange, VersionRangeMatchingStrategy strategy) {
+             return this;
+         }
+
+        /**
+         * {@inheritDoc}
+         */
+        public Set<RepositoryAwareArtifactDescriptor> run() {
+            return Collections.<RepositoryAwareArtifactDescriptor> emptySet();
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/repository/internal/RepositoryFactoryBean.java b/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/repository/internal/RepositoryFactoryBean.java
new file mode 100644
index 0000000..aef1406
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/repository/internal/RepositoryFactoryBean.java
@@ -0,0 +1,109 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.services.repository.internal;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+
+import org.springframework.beans.factory.FactoryBean;
+
+import org.eclipse.virgo.kernel.services.internal.KernelServicesLogEvents;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.repository.ArtifactBridge;
+import org.eclipse.virgo.repository.Repository;
+import org.eclipse.virgo.repository.RepositoryCreationException;
+import org.eclipse.virgo.repository.RepositoryFactory;
+import org.eclipse.virgo.repository.configuration.PropertiesRepositoryConfigurationReader;
+import org.eclipse.virgo.repository.configuration.RepositoryConfiguration;
+import org.eclipse.virgo.repository.configuration.RepositoryConfigurationException;
+import org.eclipse.virgo.util.math.OrderedPair;
+
+public final class RepositoryFactoryBean implements FactoryBean<Repository> {
+
+    private final Properties repositoryProperties;
+
+    private final EventLogger eventLogger;
+
+    private final RepositoryFactory repositoryFactory;
+
+    private volatile Repository repository;
+
+    private final File workDirectory;
+
+    private final Set<ArtifactBridge> artifactBridges;
+
+    private final String mBeanDomain;
+
+    public RepositoryFactoryBean(Properties repositoryProperties, EventLogger eventLogger, RepositoryFactory repositoryFactory, File workDirectory,
+        Set<ArtifactBridge> artifactBridges, String mBeanDomain) {
+        this.repositoryProperties = repositoryProperties;
+        this.eventLogger = eventLogger;
+        this.repositoryFactory = repositoryFactory;
+        this.workDirectory = workDirectory;
+        this.artifactBridges = artifactBridges;
+        this.mBeanDomain = mBeanDomain;
+    }
+
+    public Repository getObject() throws Exception {
+        if (this.repository == null) {
+            this.repository = createRepository();
+        }
+        return this.repository;
+    }
+
+    public Class<? extends Repository> getObjectType() {
+        return Repository.class;
+    }
+
+    public boolean isSingleton() {
+        return true;
+    }
+    
+    public void destroy() {
+        Repository localRepository = this.repository;
+        if (localRepository != null) {
+            this.repository = null;
+            localRepository.stop();
+        }
+    }
+
+    private Repository createRepository() throws RepositoryConfigurationException, RepositoryCreationException {
+
+        PropertiesRepositoryConfigurationReader configurationReader = new PropertiesRepositoryConfigurationReader(this.workDirectory,
+            this.artifactBridges, this.eventLogger, this.mBeanDomain);
+
+        OrderedPair<Map<String, RepositoryConfiguration>, List<String>> configurations = configurationReader.readConfiguration(this.repositoryProperties);
+        Map<String, RepositoryConfiguration> configurationMap = configurations.getFirst();
+        List<String> chainList = configurations.getSecond();
+
+        if (chainList.isEmpty()) {
+            this.eventLogger.log(KernelServicesLogEvents.KERNEL_REPOSITORY_CHAIN_EMPTY);
+            return new EmptyRepository(); // no chain
+        }
+
+        List<RepositoryConfiguration> repositoryConfigurationChain = new ArrayList<RepositoryConfiguration>(chainList.size());
+        for (String repositoryName : chainList) {
+            RepositoryConfiguration repositoryConfiguration = configurationMap.get(repositoryName);
+
+            if (repositoryConfiguration == null) {
+                this.eventLogger.log(KernelServicesLogEvents.KERNEL_REPOSITORY_CHAIN_ENTRY_NOT_VALID, repositoryName);
+                throw new RepositoryConfigurationException("Cannot resolve repository '" + repositoryName + "' in chain.");
+            }
+            repositoryConfigurationChain.add(repositoryConfiguration);
+        }
+        return repositoryFactory.createRepository(repositoryConfigurationChain);
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/work/StandardWorkArea.java b/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/work/StandardWorkArea.java
new file mode 100644
index 0000000..f36e74b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/work/StandardWorkArea.java
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.services.work;
+
+import java.io.File;
+
+import org.osgi.framework.Bundle;
+
+import org.eclipse.virgo.util.io.PathReference;
+
+/**
+ * Standard implementation of {@link WorkArea}.
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br/>
+ * 
+ * Threadsafe.
+ * 
+ */
+final class StandardWorkArea implements WorkArea {
+
+    private static final String KERNEL_PREFIX = "org.eclipse.virgo.kernel.";
+
+    private final PathReference workDirectory;
+
+    private final Bundle owner;
+
+    /**
+     * Creates a new <code>StandardWorkAreaManager</code>.
+     * 
+     * @param workDirectory the root work directory
+     * @param owner the owning <code>Bundle</code>
+     */
+    public StandardWorkArea(File workDirectory, Bundle owner) {
+        this.owner = owner;
+        this.workDirectory = new PathReference(workDirectory).newChild(createOwnerDirectoryName(owner));
+        this.workDirectory.createDirectory();
+    }
+
+    private String createOwnerDirectoryName(Bundle owner) {
+        String ownerSymbolicName = owner.getSymbolicName();
+        if (ownerSymbolicName.startsWith(KERNEL_PREFIX)) {
+            // Give kernel bundles short work area names to reduce path name lengths on Windows.
+            return ownerSymbolicName.substring(KERNEL_PREFIX.length());
+        } else {
+            return String.format("%s_%s", ownerSymbolicName, owner.getVersion());
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Bundle getOwner() {
+        return this.owner;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public PathReference getWorkDirectory() {
+        return this.workDirectory;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/work/WorkArea.java b/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/work/WorkArea.java
new file mode 100644
index 0000000..3a4bc47
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/work/WorkArea.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.services.work;
+
+import org.osgi.framework.Bundle;
+
+import org.eclipse.virgo.util.io.PathReference;
+
+/**
+ * Controls access to the work area.<p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations <strong>must</strong> be threadsafe.
+ * 
+ */
+public interface WorkArea {
+
+    /**
+     * Gets the {@link Bundle} that owns this section of the work area.
+     * @return the owning <code>Bundle</code>.
+     */
+    Bundle getOwner();
+    
+    /**
+     * Gets the work directory for this work area.
+     * 
+     * @return a {@link PathReference} to the work directory.
+     */
+    PathReference getWorkDirectory();
+}
diff --git a/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/work/WorkAreaServiceFactory.java b/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/work/WorkAreaServiceFactory.java
new file mode 100644
index 0000000..f056c76
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.services/src/main/java/org/eclipse/virgo/kernel/services/work/WorkAreaServiceFactory.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.services.work;
+
+import java.io.File;
+
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.ServiceFactory;
+import org.osgi.framework.ServiceRegistration;
+
+
+/**
+ * {@link ServiceFactory} that creates a {@link WorkArea} for a given {@link Bundle}. Bundles need only to import a
+ * <code>WorkArea</code> service in their module context file to get access to the correct work area location.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.
+ * 
+ */
+public final class WorkAreaServiceFactory implements ServiceFactory<WorkArea> {
+
+    private final File workDirectory;
+
+    public WorkAreaServiceFactory(@NonNull File workDirectory) {
+        this.workDirectory = workDirectory;
+    }
+
+    public WorkArea getService(Bundle bundle, ServiceRegistration<WorkArea> registration) {
+        return new StandardWorkArea(this.workDirectory, bundle);
+    }
+
+    public void ungetService(Bundle bundle, ServiceRegistration<WorkArea> registration, WorkArea service) {
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.services/src/main/resources/EventLogMessages.properties b/kernel/org.eclipse.virgo.kernel.services/src/main/resources/EventLogMessages.properties
new file mode 100644
index 0000000..ae8d78c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.services/src/main/resources/EventLogMessages.properties
@@ -0,0 +1,4 @@
+KS0001I = Kernel repository chain is empty.
+KS0002E = Cannot resolve repository chain entry '{}'.
+
+CC0000E = Deadlock detected. Generating dump.
diff --git a/kernel/org.eclipse.virgo.kernel.services/src/main/resources/META-INF/spring/concurrent-context.xml b/kernel/org.eclipse.virgo.kernel.services/src/main/resources/META-INF/spring/concurrent-context.xml
new file mode 100644
index 0000000..f9581b4
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.services/src/main/resources/META-INF/spring/concurrent-context.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<beans:beans xmlns="http://www.springframework.org/schema/osgi" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"

+	xmlns:util="http://www.springframework.org/schema/util"

+	xsi:schemaLocation="http://www.springframework.org/schema/osgi  

+       http://www.springframework.org/schema/osgi/spring-osgi.xsd

+       http://www.springframework.org/schema/util 

+       http://www.springframework.org/schema/util/spring-util-2.5.xsd

+       http://www.springframework.org/schema/beans   

+       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

+

+

+	<reference id="dumpGenerator" interface="org.eclipse.virgo.medic.dump.DumpGenerator"/>

+

+	<reference id="eventLogger" interface="org.eclipse.virgo.medic.eventlog.EventLogger"/>

+	

+	<reference id="tracingService" interface="org.eclipse.virgo.nano.shim.serviceability.TracingService" />

+	

+	<reference id="kernelConfig" interface="org.eclipse.virgo.nano.core.KernelConfig"/>

+

+	<beans:bean id="exporter" class="org.eclipse.virgo.kernel.services.concurrent.management.JmxExecutorServiceExporter" destroy-method="destroy">

+		<beans:constructor-arg value="#{kernelConfig.getProperty('domain')}"/>

+	</beans:bean>

+

+	<beans:bean id="deadlockMonitor" class="org.eclipse.virgo.kernel.services.concurrent.monitor.DeadlockMonitor" init-method="start" destroy-method="stop">

+		<beans:constructor-arg>

+			<beans:bean class="org.eclipse.virgo.kernel.services.concurrent.KernelScheduledThreadPoolExecutor">

+				<beans:constructor-arg value="1"/>

+				<beans:constructor-arg value="deadlock-monitor"/>

+				<beans:constructor-arg ref="tracingService"/>

+			</beans:bean>

+		</beans:constructor-arg>

+		<beans:constructor-arg ref="dumpGenerator"/>

+		<beans:constructor-arg ref="eventLogger"/>

+	</beans:bean>

+</beans:beans>

diff --git a/kernel/org.eclipse.virgo.kernel.services/src/main/resources/META-INF/spring/io-context.xml b/kernel/org.eclipse.virgo.kernel.services/src/main/resources/META-INF/spring/io-context.xml
new file mode 100644
index 0000000..90012d3
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.services/src/main/resources/META-INF/spring/io-context.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<beans:beans xmlns="http://www.springframework.org/schema/osgi"

+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

+	xmlns:beans="http://www.springframework.org/schema/beans"

+	xsi:schemaLocation="http://www.springframework.org/schema/osgi  

+       http://www.springframework.org/schema/osgi/spring-osgi.xsd

+       http://www.springframework.org/schema/beans   

+       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

+

+	<beans:bean id="workAreaFactory" class="org.eclipse.virgo.kernel.services.work.WorkAreaServiceFactory">

+		<beans:constructor-arg value="#{kernelConfig.getProperty('work.directory')}"/>

+	</beans:bean>

+	

+	<beans:bean id="kernelWorkArea" class="org.eclipse.virgo.kernel.services.work.StandardWorkArea">

+		<beans:constructor-arg value="#{kernelConfig.getProperty('work.directory')}"/>

+		<beans:constructor-arg value="#{bundleContext.bundle}"/>

+	</beans:bean>

+	

+	<service interface="org.eclipse.virgo.kernel.services.work.WorkArea" ref="workAreaFactory"/>

+	

+	<reference id="kernelConfig" interface="org.eclipse.virgo.nano.core.KernelConfig"/>

+	

+</beans:beans>

diff --git a/kernel/org.eclipse.virgo.kernel.services/src/main/resources/META-INF/spring/repository-context.xml b/kernel/org.eclipse.virgo.kernel.services/src/main/resources/META-INF/spring/repository-context.xml
new file mode 100644
index 0000000..58c43d2
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.services/src/main/resources/META-INF/spring/repository-context.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<beans xmlns="http://www.springframework.org/schema/beans"

+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

+	xmlns:osgi="http://www.springframework.org/schema/osgi"

+	xmlns:osgi-compendium="http://www.springframework.org/schema/osgi-compendium"

+	xsi:schemaLocation="http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi-1.2.xsd

+		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

+		http://www.springframework.org/schema/osgi-compendium http://www.springframework.org/schema/osgi-compendium/spring-osgi-compendium-1.2.xsd">

+

+	<bean id="repository" class="org.eclipse.virgo.kernel.services.repository.internal.RepositoryFactoryBean" destroy-method="destroy">

+		<constructor-arg>

+			<osgi-compendium:cm-properties persistent-id="org.eclipse.virgo.repository"/>

+		</constructor-arg>

+		<constructor-arg ref="eventLogger"/>

+		<constructor-arg ref="repositoryFactory"/>

+		<constructor-arg value="#{kernelConfig.getProperty('work.directory')}"/>

+		<constructor-arg >

+		<set>

+			<ref bean="bundleBridge"/>

+			<ref bean="libraryBridge"/>

+			<ref bean="parBridge"/>

+			<ref bean="planBridge"/>

+			<ref bean="propertiesBridge"/>

+		</set>

+		</constructor-arg>		

+		<constructor-arg value="#{kernelConfig.getProperty('domain')}"/>

+	</bean>

+	

+	<bean id="bundleBridge" class="org.eclipse.virgo.kernel.artifact.bundle.BundleBridge">

+		<constructor-arg ref="hashGenerator"/>

+	</bean>

+	<osgi:service ref="bundleBridge" interface="org.eclipse.virgo.repository.ArtifactBridge"/>

+	

+	<bean id="libraryBridge" class="org.eclipse.virgo.kernel.artifact.library.LibraryBridge">

+		<constructor-arg ref="hashGenerator"/>

+	</bean>

+	<osgi:service ref="libraryBridge" interface="org.eclipse.virgo.repository.ArtifactBridge"/>

+	

+	<bean id="parBridge" class="org.eclipse.virgo.kernel.artifact.par.ParBridge">

+		<constructor-arg ref="hashGenerator"/>

+	</bean>

+	<osgi:service ref="parBridge" interface="org.eclipse.virgo.repository.ArtifactBridge"/>

+	

+	<bean id="planBridge" class="org.eclipse.virgo.kernel.artifact.plan.PlanBridge">

+		<constructor-arg ref="hashGenerator"/>

+	</bean>

+	<osgi:service ref="planBridge" interface="org.eclipse.virgo.repository.ArtifactBridge"/>

+	

+	<bean id="propertiesBridge" class="org.eclipse.virgo.kernel.artifact.properties.PropertiesBridge">

+		<constructor-arg ref="hashGenerator"/>

+		<constructor-arg>

+		  <osgi:reference interface="org.osgi.service.cm.ConfigurationAdmin"/>

+		</constructor-arg>

+	</bean>

+	<osgi:service ref="propertiesBridge" interface="org.eclipse.virgo.repository.ArtifactBridge"/>

+	

+	<osgi:reference id="repositoryFactory" interface="org.eclipse.virgo.repository.RepositoryFactory" />

+	

+	<osgi:reference id="eventLogger" interface="org.eclipse.virgo.medic.eventlog.EventLogger" />

+	

+	<osgi:service ref="repository" interface="org.eclipse.virgo.repository.Repository"/>

+

+	<osgi:reference id="hashGenerator" interface="org.eclipse.virgo.repository.HashGenerator"/>

+	

+	<osgi:reference id="kernelConfig" interface="org.eclipse.virgo.nano.core.KernelConfig"/>

+

+</beans>

diff --git a/kernel/org.eclipse.virgo.kernel.services/src/test/java/org/eclipse/virgo/kernel/services/concurrent/AbstractExecutorTests.java b/kernel/org.eclipse.virgo.kernel.services/src/test/java/org/eclipse/virgo/kernel/services/concurrent/AbstractExecutorTests.java
new file mode 100644
index 0000000..3841900
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.services/src/test/java/org/eclipse/virgo/kernel/services/concurrent/AbstractExecutorTests.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.services.concurrent;
+
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
+
+import org.junit.Test;
+
+/**
+ */
+public abstract class AbstractExecutorTests {
+
+    /*
+     * Use Futures here so we can get the AssertionErrors back in the JUnit thread.
+     */
+
+    @Test public void testManuallyNamed() throws Throwable {
+        submitAndAssert(getNamed("TestPool"), new Runnable() {
+
+            public void run() {
+                assertTrue(Thread.currentThread().getName().startsWith("TestPool"));
+            }
+
+        });
+    }
+
+    @Test public void testThreadLocalCleared() throws Throwable {
+
+        final ThreadLocal<String> t = new ThreadLocal<String>();
+        this.getExecutor().execute(new Runnable() {
+
+            public void run() {
+                t.set("foo");
+            }
+
+        });
+
+        submitAndAssert(this.getExecutor(), new Runnable() {
+
+            public void run() {
+                assertNull("ThreadLocal should be null", t.get());
+            }
+
+        });
+
+    }
+
+    private void submitAndAssert(ExecutorService executor, Runnable task) throws Throwable {
+        Future<?> f = executor.submit(task);
+        assertFuture(f);
+    }
+
+    private void assertFuture(Future<?> future) throws Throwable {
+        try {
+            future.get();
+        } catch (ExecutionException ex) {
+            throw ex.getCause();
+        }
+    }
+
+    protected abstract ExecutorService getExecutor();
+
+    protected abstract ExecutorService getNamed(String name);
+}
diff --git a/kernel/org.eclipse.virgo.kernel.services/src/test/java/org/eclipse/virgo/kernel/services/concurrent/KernelScheduledThreadPoolExecutorTests.java b/kernel/org.eclipse.virgo.kernel.services/src/test/java/org/eclipse/virgo/kernel/services/concurrent/KernelScheduledThreadPoolExecutorTests.java
new file mode 100644
index 0000000..edf50bb
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.services/src/test/java/org/eclipse/virgo/kernel/services/concurrent/KernelScheduledThreadPoolExecutorTests.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.services.concurrent;
+
+import java.util.concurrent.ExecutorService;
+
+import org.eclipse.virgo.kernel.services.concurrent.KernelScheduledThreadPoolExecutor;
+import org.eclipse.virgo.nano.shim.serviceability.TracingService;
+
+
+/**
+ */
+public class KernelScheduledThreadPoolExecutorTests extends AbstractExecutorTests {
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected ExecutorService getExecutor() {
+        return getNamed("foo");
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected ExecutorService getNamed(String name) {
+        return new KernelScheduledThreadPoolExecutor(1, name, new StubTracingService());
+    }
+
+    private static final class StubTracingService implements TracingService {
+
+        public String getCurrentApplicationName() {
+            return null;
+        }
+
+        public void setCurrentApplicationName(String applicationName) {
+        }
+
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.services/src/test/java/org/eclipse/virgo/kernel/services/concurrent/KernelThreadPoolExecutorTests.java b/kernel/org.eclipse.virgo.kernel.services/src/test/java/org/eclipse/virgo/kernel/services/concurrent/KernelThreadPoolExecutorTests.java
new file mode 100644
index 0000000..44faa0a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.services/src/test/java/org/eclipse/virgo/kernel/services/concurrent/KernelThreadPoolExecutorTests.java
@@ -0,0 +1,110 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.services.concurrent;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.virgo.kernel.services.concurrent.KernelThreadPoolExecutor;
+import org.eclipse.virgo.nano.shim.serviceability.TracingService;
+import org.junit.Test;
+
+/**
+ * Note that this class used to test the value of getCompletedTaskCount after an execution which failed with an
+ * exception, but the implementation of ThreadPoolExecutor changed in Java 7 so that getCompletedTaskCount included
+ * tasks that failed with an exception. So the test was removed.
+ */
+public class KernelThreadPoolExecutorTests extends AbstractExecutorTests {
+
+    private final BlockingQueue<Runnable> queue = new LinkedBlockingQueue<Runnable>();
+
+    private final StubTracingService tracingService = new StubTracingService();
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected KernelThreadPoolExecutor getExecutor() {
+        return getNamed(null);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected KernelThreadPoolExecutor getNamed(String name) {
+        return new KernelThreadPoolExecutor(1, 1, 5, TimeUnit.SECONDS, this.queue, name, this.tracingService);
+    }
+
+    @Test
+    public void statisticsOnSuccess() throws InterruptedException {
+        final CountDownLatch latch = new CountDownLatch(1);
+
+        KernelThreadPoolExecutor executor = getExecutor();
+        executor.execute(new Runnable() {
+
+            public void run() {
+                try {
+                    Thread.sleep(300);
+                } catch (InterruptedException e) {
+                    e.printStackTrace();
+                } finally {
+                    latch.countDown();
+                }
+            }
+
+        });
+        latch.await();
+        Thread.sleep(100);
+        assertEquals(1, executor.getCompletedTaskCount());
+        assertTrue(executor.getAverageExecutionTime() > 0);
+        assertTrue(executor.getExecutionTime() > 0);
+    }
+
+    @Test
+    public void traceNamePropagated() throws InterruptedException {
+        this.tracingService.setCurrentApplicationName("foo");
+        final CountDownLatch latch = new CountDownLatch(1);
+
+        KernelThreadPoolExecutor executor = getExecutor();
+        executor.execute(new Runnable() {
+
+            public void run() {
+                if ("foo".equals(tracingService.getCurrentApplicationName())) {
+                    latch.countDown();
+                }
+            }
+
+        });
+        boolean result = latch.await(2, TimeUnit.SECONDS);
+        assertTrue(result);
+    }
+
+    private static final class StubTracingService implements TracingService {
+
+        private String applicationName;
+
+        public String getCurrentApplicationName() {
+            return applicationName;
+        }
+
+        public void setCurrentApplicationName(String applicationName) {
+            this.applicationName = applicationName;
+        }
+
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.services/src/test/java/org/eclipse/virgo/kernel/services/concurrent/management/JmxExecutorServiceExporterTests.java b/kernel/org.eclipse.virgo.kernel.services/src/test/java/org/eclipse/virgo/kernel/services/concurrent/management/JmxExecutorServiceExporterTests.java
new file mode 100644
index 0000000..b2f1dba
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.services/src/test/java/org/eclipse/virgo/kernel/services/concurrent/management/JmxExecutorServiceExporterTests.java
@@ -0,0 +1,110 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.services.concurrent.management;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.fail;
+
+import java.lang.management.ManagementFactory;
+
+import javax.management.InstanceNotFoundException;
+import javax.management.MBeanServer;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectInstance;
+import javax.management.ObjectName;
+
+import org.eclipse.virgo.kernel.services.concurrent.ExecutorServiceStatistics;
+import org.eclipse.virgo.kernel.services.concurrent.management.JmxExecutorServiceExporter;
+import org.junit.Test;
+
+
+
+/**
+ */
+public class JmxExecutorServiceExporterTests {
+
+    @Test
+    public void testExportAndDestroy() throws Exception {
+        JmxExecutorServiceExporter exporter = new JmxExecutorServiceExporter("domain");
+        ExecutorServiceStatistics stats = new DummyStatistics();
+        exporter.export(stats);
+        
+        MBeanServer server = ManagementFactory.getPlatformMBeanServer();
+        ObjectInstance instance = getInstance(server);
+        assertNotNull(instance);
+        
+        exporter.destroy();
+        try {
+            getInstance(server);
+            fail("Instance should've been unregistered");
+        } catch (Exception e) {
+        }
+        
+    }
+
+    private ObjectInstance getInstance(MBeanServer server) throws InstanceNotFoundException, MalformedObjectNameException {
+        return server.getObjectInstance(new ObjectName("domain:type=Executor Service,name=dummy"));
+    }
+    
+    private static class DummyStatistics implements ExecutorServiceStatistics {
+
+        /** 
+         * {@inheritDoc}
+         */
+        public int getActiveCount() {
+            return 0;
+        }
+
+        /** 
+         * {@inheritDoc}
+         */
+        public long getAverageExecutionTime() {
+            return 0;
+        }
+
+        /** 
+         * {@inheritDoc}
+         */
+        public long getExecutionTime() {
+            return 0;
+        }
+
+        /** 
+         * {@inheritDoc}
+         */
+        public int getLargestPoolSize() {
+            return 0;
+        }
+
+        /** 
+         * {@inheritDoc}
+         */
+        public int getMaximumPoolSize() {
+            return 0;
+        }
+
+        /** 
+         * {@inheritDoc}
+         */
+        public String getPoolName() {
+            return "dummy";
+        }
+
+        /** 
+         * {@inheritDoc}
+         */
+        public int getPoolSize() {
+            return 0;
+        }
+        
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.services/src/test/java/org/eclipse/virgo/kernel/services/concurrent/monitor/DeadlockAnalyserTests.java b/kernel/org.eclipse.virgo.kernel.services/src/test/java/org/eclipse/virgo/kernel/services/concurrent/monitor/DeadlockAnalyserTests.java
new file mode 100644
index 0000000..4f52af4
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.services/src/test/java/org/eclipse/virgo/kernel/services/concurrent/monitor/DeadlockAnalyserTests.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.services.concurrent.monitor;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import org.eclipse.virgo.kernel.services.concurrent.monitor.DeadlockAnalyser;
+import org.eclipse.virgo.kernel.services.concurrent.monitor.DeadlockAnalyser.Deadlock;
+import org.junit.Test;
+
+
+/**
+ */
+public class DeadlockAnalyserTests {
+
+    @Test public void deadlocks() {
+        DeadlockAnalyser da = new DeadlockAnalyser();
+        Deadlock[] before = da.findDeadlocks();
+
+        DeadlockCreatorMBean dc = new DeadlockCreator();
+        dc.createDeadlock(2, 0);
+        dc.createDeadlock(3, 0);
+        dc.createDeadlock(4, 2);
+
+        Deadlock[] deadlocks = da.findDeadlocks();
+        assertNotNull(deadlocks);
+        assertEquals(5 + before.length, deadlocks.length);
+        boolean seen2 = false;
+        boolean seen3 = false;
+        boolean seen4 = false;
+        for (Deadlock deadlock : deadlocks) {
+            switch (deadlock.getMembers().length) {
+                case 2:
+                    seen2 = true;
+                    break;
+                case 3:
+                    seen3 = true;
+                    break;
+                case 4:
+                    seen4 = true;
+                    break;
+            }
+        }
+        assertTrue(seen2);
+        assertTrue(seen3);
+        assertTrue(seen4);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.services/src/test/java/org/eclipse/virgo/kernel/services/concurrent/monitor/DeadlockCreator.java b/kernel/org.eclipse.virgo.kernel.services/src/test/java/org/eclipse/virgo/kernel/services/concurrent/monitor/DeadlockCreator.java
new file mode 100644
index 0000000..6eff409
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.services/src/test/java/org/eclipse/virgo/kernel/services/concurrent/monitor/DeadlockCreator.java
@@ -0,0 +1,124 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.services.concurrent.monitor;
+
+import java.lang.Thread.State;
+import java.util.concurrent.CountDownLatch;
+
+/**
+ */
+public class DeadlockCreator implements DeadlockCreatorMBean {
+
+    public Thread[] createDeadlock(int threadCount, int extraneousCount) {
+        CountDownLatch latch = new CountDownLatch(threadCount);
+        Object[] monitors = new Object[threadCount];
+
+        for (int x = 0; x < threadCount; x++) {
+            monitors[x] = new Object();
+        }
+
+        Thread[] threads = new Thread[threadCount];
+        for (int x = 0; x < threadCount; x++) {
+            int f = x;
+            int s = x == threadCount - 1 ? 0 : x + 1;
+            threads[x] = new Thread(new DeadlockRunnable(latch, monitors[f], monitors[s]));
+            threads[x].start();
+        }
+        try {
+            latch.await();
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+        awaitBlocking(threads);
+
+        Thread[] extraneous = new Thread[extraneousCount];
+        for (int x = 0; x < extraneousCount; x++) {
+            extraneous[x] = new Thread(new ExtraneousRunnable(monitors[0]));
+            extraneous[x].start();
+        }
+        awaitBlocking(extraneous);
+        return threads;
+    }
+
+    void awaitBlocking(Thread[] threads) {
+        for (Thread thread : threads) {
+            while (thread.getState() != State.BLOCKED) {
+                try {
+                    Thread.sleep(30);
+                } catch (InterruptedException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
+    static final class DeadlockRunnable implements Runnable {
+
+        private final CountDownLatch latch;
+
+        private final Object first;
+
+        private final Object second;
+
+        /**
+         * @param latch
+         * @param first
+         * @param second
+         */
+        public DeadlockRunnable(CountDownLatch latch, Object first, Object second) {
+            this.latch = latch;
+            this.first = first;
+            this.second = second;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public void run() {
+            synchronized (this.first) {
+                this.latch.countDown();
+                try {
+                    this.latch.await();
+                } catch (InterruptedException e) {
+                    e.printStackTrace();
+                }
+                synchronized (this.second) {
+
+                }
+            }
+        }
+
+    }
+
+    static final class ExtraneousRunnable implements Runnable {
+
+        private final Object monitor;
+
+        /**
+         * @param monitor
+         */
+        public ExtraneousRunnable(Object monitor) {
+            this.monitor = monitor;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public void run() {
+            synchronized (this.monitor) {
+
+            }
+        }
+
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.services/src/test/java/org/eclipse/virgo/kernel/services/concurrent/monitor/DeadlockCreatorMBean.java b/kernel/org.eclipse.virgo.kernel.services/src/test/java/org/eclipse/virgo/kernel/services/concurrent/monitor/DeadlockCreatorMBean.java
new file mode 100644
index 0000000..9a5df93
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.services/src/test/java/org/eclipse/virgo/kernel/services/concurrent/monitor/DeadlockCreatorMBean.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.services.concurrent.monitor;
+
+/**
+ */
+public interface DeadlockCreatorMBean {
+
+    Thread[] createDeadlock(int threadCount, int extraneousCount);
+}
diff --git a/kernel/org.eclipse.virgo.kernel.services/src/test/java/org/eclipse/virgo/kernel/services/repository/internal/EmptyRepositoryTests.java b/kernel/org.eclipse.virgo.kernel.services/src/test/java/org/eclipse/virgo/kernel/services/repository/internal/EmptyRepositoryTests.java
new file mode 100644
index 0000000..bd64eb7
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.services/src/test/java/org/eclipse/virgo/kernel/services/repository/internal/EmptyRepositoryTests.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.services.repository.internal;
+
+import org.eclipse.virgo.kernel.services.repository.internal.EmptyRepository;
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+
+/**
+ */
+public class EmptyRepositoryTests {
+
+    @Test
+    public void testContract() {
+        EmptyRepository repo = new EmptyRepository();
+        assertNotNull(repo.createQuery(null, null));
+        assertNotNull(repo.createQuery(null, null, null));
+        assertNotNull(repo.getName());
+        assertNull(repo.get(null, null, null));
+        assertNotNull(repo.createQuery(null, null).run());
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.services/src/test/java/org/eclipse/virgo/kernel/services/repository/internal/RepositoryFactoryBeanTests.java b/kernel/org.eclipse.virgo.kernel.services/src/test/java/org/eclipse/virgo/kernel/services/repository/internal/RepositoryFactoryBeanTests.java
new file mode 100644
index 0000000..6b98568
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.services/src/test/java/org/eclipse/virgo/kernel/services/repository/internal/RepositoryFactoryBeanTests.java
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.services.repository.internal;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.isA;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.util.Collections;
+import java.util.List;
+import java.util.Properties;
+
+import org.junit.Test;
+
+import org.eclipse.virgo.kernel.services.repository.internal.RepositoryFactoryBean;
+import org.eclipse.virgo.medic.test.eventlog.MockEventLogger;
+import org.eclipse.virgo.repository.ArtifactBridge;
+import org.eclipse.virgo.repository.Repository;
+import org.eclipse.virgo.repository.RepositoryFactory;
+
+
+/**
+ */
+public class RepositoryFactoryBeanTests {
+
+    private static MockEventLogger mockEventLogger = new MockEventLogger();
+    
+    @Test
+    public void testCreateEmpty() throws Exception {
+        mockEventLogger.reinitialise();
+        Properties properties = new Properties();
+        RepositoryFactory factory = createMock(RepositoryFactory.class);
+        File work = new File("build");
+        
+        RepositoryFactoryBean bean = new RepositoryFactoryBean(properties, mockEventLogger, factory, work, Collections.<ArtifactBridge>emptySet(), null);
+        Repository r = bean.getObject();
+        assertNotNull(r);
+        assertTrue("Event KS0001I was not logged.", mockEventLogger.isLogged("KS0001I"));
+    }
+    
+    @SuppressWarnings("unchecked")
+    @Test
+    public void testCreate() throws Exception {
+        File work = new File("build");
+        mockEventLogger.reinitialise();
+        
+        Properties properties = new Properties();
+        properties.put("bundles.type", "external");
+        properties.put("bundles.searchPattern", "build/*.jar");
+        properties.put("chain", "bundles");
+        
+        RepositoryFactory factory = createMock(RepositoryFactory.class);
+        expect(factory.createRepository(isA(List.class))).andReturn(null);
+        replay(factory);
+        
+        RepositoryFactoryBean bean = new RepositoryFactoryBean(properties, mockEventLogger, factory, work, Collections.<ArtifactBridge>emptySet(), null);
+        bean.getObject();
+        
+        verify(factory);
+        assertFalse("Events were logged.", mockEventLogger.getCalled());
+    }
+    
+    @Test
+    public void testBasicContract() {
+        mockEventLogger.reinitialise();
+        Properties properties = new Properties();
+        RepositoryFactory factory = createMock(RepositoryFactory.class);
+        File work = new File("build");
+        
+        RepositoryFactoryBean bean = new RepositoryFactoryBean(properties, mockEventLogger, factory, work, Collections.<ArtifactBridge>emptySet(), null);
+        assertTrue(bean.isSingleton());
+        assertEquals(Repository.class, bean.getObjectType());
+        assertFalse("Events were logged.", mockEventLogger.getCalled());
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.services/src/test/java/org/eclipse/virgo/kernel/services/work/StandardWorkAreaTests.java b/kernel/org.eclipse.virgo.kernel.services/src/test/java/org/eclipse/virgo/kernel/services/work/StandardWorkAreaTests.java
new file mode 100644
index 0000000..e6f5bf4
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.services/src/test/java/org/eclipse/virgo/kernel/services/work/StandardWorkAreaTests.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.services.work;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Version;
+
+import org.eclipse.virgo.kernel.services.work.StandardWorkArea;
+import org.eclipse.virgo.test.stubs.framework.StubBundle;
+import org.eclipse.virgo.util.io.FileSystemUtils;
+import org.eclipse.virgo.util.io.PathReference;
+
+/**
+ */
+public class StandardWorkAreaTests {
+
+    private static final String WORK_DIR_NAME = "com.foo";
+
+    private static final String KERNEL_WORK_DIR_NAME = "bar";
+
+    private static final String KERNEL_BSN = "org.eclipse.virgo.kernel." + KERNEL_WORK_DIR_NAME;
+
+    @Before
+    public void before() {
+        FileSystemUtils.deleteRecursively(new File("./build/work", WORK_DIR_NAME));
+        FileSystemUtils.deleteRecursively(new File("./build/work", KERNEL_WORK_DIR_NAME));
+    }
+
+    @Test
+    public void nonNullWorkDirectory() {
+
+        StubBundle bundle = new StubBundle(WORK_DIR_NAME, Version.emptyVersion);
+
+        StandardWorkArea manager = new StandardWorkArea(new File("./build/work"), bundle);
+        PathReference workDir = manager.getWorkDirectory();
+
+        assertNotNull(workDir);
+        assertTrue("work dir does not exist", workDir.exists());
+        assertTrue(workDir.isDirectory());
+
+        assertTrue(new File("./build/work", WORK_DIR_NAME + "_" + Version.emptyVersion).exists());
+    }
+
+    @Test
+    public void kernelWorkDirectory() {
+        StubBundle bundle = new StubBundle(KERNEL_BSN, Version.emptyVersion);
+
+        StandardWorkArea manager = new StandardWorkArea(new File("./build/work"), bundle);
+        PathReference workDir = manager.getWorkDirectory();
+
+        assertNotNull(workDir);
+        assertTrue("work dir does not exist", workDir.exists());
+        assertTrue(workDir.isDirectory());
+
+        assertTrue(new File("./build/work", KERNEL_WORK_DIR_NAME).exists());
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.services/src/test/java/org/eclipse/virgo/kernel/services/work/WorkAreaServiceFactoryTests.java b/kernel/org.eclipse.virgo.kernel.services/src/test/java/org/eclipse/virgo/kernel/services/work/WorkAreaServiceFactoryTests.java
new file mode 100644
index 0000000..fafb7ff
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.services/src/test/java/org/eclipse/virgo/kernel/services/work/WorkAreaServiceFactoryTests.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.services.work;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.io.File;
+
+import org.junit.Test;
+import org.osgi.framework.Version;
+
+import org.eclipse.virgo.kernel.services.work.WorkArea;
+import org.eclipse.virgo.kernel.services.work.WorkAreaServiceFactory;
+import org.eclipse.virgo.test.stubs.framework.StubBundle;
+
+/**
+ */
+public class WorkAreaServiceFactoryTests {
+
+    @Test
+    public void testCreate() {
+        File work = new File("build");
+        WorkAreaServiceFactory factory = new WorkAreaServiceFactory(work);
+        
+        StubBundle bundle = new StubBundle("foo", new Version("1.0.0"));
+        
+        WorkArea service = (WorkArea) factory.getService(bundle, null);
+        assertNotNull(service);
+        assertEquals(bundle, service.getOwner());
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.services/src/test/resources/.gitignore b/kernel/org.eclipse.virgo.kernel.services/src/test/resources/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.services/src/test/resources/.gitignore
diff --git a/kernel/org.eclipse.virgo.kernel.services/template.mf b/kernel/org.eclipse.virgo.kernel.services/template.mf
new file mode 100644
index 0000000..e573e63
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.services/template.mf
@@ -0,0 +1,22 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Virgo Kernel Services
+Bundle-SymbolicName: org.eclipse.virgo.kernel.services
+Bundle-Version: ${version}
+Excluded-Exports:
+ *.internal.*
+Import-Template:
+ org.eclipse.virgo.kernel.*;version="${version:[=.=.=, =.+1)}",
+ org.eclipse.virgo.util.*;version="${version:[=.=.=, =.+1)}",
+ org.eclipse.virgo.nano.*;version="${version:[=.=.=, =.+1)}",
+ org.eclipse.virgo.repository.*;version="${version:[=.=.=, =.+1)}",
+ org.eclipse.virgo.medic.*;version="${version:[=.=.=, =.+1)}",
+ org.aspectj.*;version="${aspectjVersion:[=.=.=, +1)}",
+ org.slf4j.*;version="${slf4jVersion:[=.=.=, +1)}",
+ org.osgi.framework.*;version="0",
+ org.osgi.service.cm.*;version="0",
+ org.springframework.*;version="${springframeworkVersion:[2.5.6, +1)}",
+ javax.management.*;version="0",
+ javax.xml.*;version="0",
+ org.xml.*;version="0",
+ org.w3c.*;version="0"
diff --git a/kernel/org.eclipse.virgo.kernel.stubs/.settings/org.eclipse.wst.common.project.facet.core.xml b/kernel/org.eclipse.virgo.kernel.stubs/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..88ceb05
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.stubs/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+</faceted-project>
diff --git a/kernel/org.eclipse.virgo.kernel.stubs/.springBeans b/kernel/org.eclipse.virgo.kernel.stubs/.springBeans
new file mode 100644
index 0000000..8058887
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.stubs/.springBeans
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beansProjectDescription>
+	<version>1</version>
+	<pluginVersion><![CDATA[2.2.6.200908051215-RELEASE]]></pluginVersion>
+	<configSuffixes>
+		<configSuffix><![CDATA[xml]]></configSuffix>
+	</configSuffixes>
+	<enableImports><![CDATA[false]]></enableImports>
+	<configs>
+	</configs>
+	<configSets>
+	</configSets>
+</beansProjectDescription>
diff --git a/kernel/org.eclipse.virgo.kernel.stubs/src/main/java/org/eclipse/virgo/kernel/stubs/StubArtifactFS.java b/kernel/org.eclipse.virgo.kernel.stubs/src/main/java/org/eclipse/virgo/kernel/stubs/StubArtifactFS.java
new file mode 100644
index 0000000..cad4130
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.stubs/src/main/java/org/eclipse/virgo/kernel/stubs/StubArtifactFS.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.stubs;
+
+import java.io.File;
+import java.net.URI;
+
+import org.eclipse.virgo.kernel.artifact.fs.ArtifactFS;
+import org.eclipse.virgo.kernel.artifact.fs.ArtifactFSEntry;
+
+
+/**
+ * <code>StubArtifactFS</code> implements the {@link ArtifactFS} interface for testing.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * thread-safe
+ * 
+ */
+public class StubArtifactFS implements ArtifactFS {
+
+    private final URI sourceURI;
+
+    private final File location;
+
+    private final String name;
+
+    public StubArtifactFS(URI sourceURI, File location, String name) {
+        this.sourceURI = sourceURI;
+        this.location = location;
+        this.name = name;
+    }
+
+    public File getLocation() {
+        return this.location;
+    }
+
+    public String getName() {
+        return this.name;
+    }
+
+    public URI getSourceURI() {
+        return this.sourceURI;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public File getFile() {
+        return this.location;
+    }
+
+    public ArtifactFSEntry getEntry(String name) {
+        return null;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.stubs/src/main/java/org/eclipse/virgo/kernel/stubs/StubBundleInstallArtifact.java b/kernel/org.eclipse.virgo.kernel.stubs/src/main/java/org/eclipse/virgo/kernel/stubs/StubBundleInstallArtifact.java
new file mode 100644
index 0000000..cb14387
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.stubs/src/main/java/org/eclipse/virgo/kernel/stubs/StubBundleInstallArtifact.java
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.stubs;
+
+import java.io.IOException;
+import java.net.URI;
+import java.util.Collections;
+import java.util.Map;
+
+import org.osgi.framework.Bundle;
+
+import org.eclipse.virgo.kernel.install.artifact.ArtifactIdentityDeterminer;
+import org.eclipse.virgo.kernel.install.artifact.BundleInstallArtifact;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiBundle;
+
+import org.eclipse.virgo.kernel.artifact.fs.ArtifactFS;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+
+/**
+ * <code>StubBundleInstallArtifact</code> implements {@link BundleInstallArtifact} interface for testing.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * thread-safe
+ * 
+ */
+public class StubBundleInstallArtifact extends StubGraphAssociableInstallArtifact implements BundleInstallArtifact {
+
+    private final Bundle bundle;
+
+    private final BundleManifest bundleManifest;
+
+    private QuasiBundle quasiBundle;
+
+    public StubBundleInstallArtifact(ArtifactFS artifactFS, Bundle bundle, BundleManifest bundleManifest) {
+        super(artifactFS, ArtifactIdentityDeterminer.BUNDLE_TYPE, bundleManifest.getBundleSymbolicName().getSymbolicName(),
+            bundleManifest.getBundleVersion());
+        this.bundle = bundle;
+        this.bundleManifest = bundleManifest;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Bundle getBundle() {
+        return this.bundle;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public BundleManifest getBundleManifest() throws IOException {
+        return this.bundleManifest;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public QuasiBundle getQuasiBundle() {
+        return quasiBundle;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void setQuasiBundle(QuasiBundle quasiBundle) {
+        this.quasiBundle = quasiBundle;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Map<String, String> getDeploymentProperties() {
+        return Collections.<String, String> emptyMap();
+    }
+
+    public void deleteEntry(String targetPath) {
+    }
+
+    public void updateEntry(URI inputPath, String targetPath) {
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.stubs/src/main/java/org/eclipse/virgo/kernel/stubs/StubGraphAssociableInstallArtifact.java b/kernel/org.eclipse.virgo.kernel.stubs/src/main/java/org/eclipse/virgo/kernel/stubs/StubGraphAssociableInstallArtifact.java
new file mode 100644
index 0000000..3163c23
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.stubs/src/main/java/org/eclipse/virgo/kernel/stubs/StubGraphAssociableInstallArtifact.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.stubs;
+
+import org.eclipse.virgo.kernel.artifact.fs.ArtifactFS;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.GraphAssociableInstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.util.common.DirectedAcyclicGraph;
+import org.eclipse.virgo.util.common.GraphNode;
+import org.osgi.framework.Version;
+
+public class StubGraphAssociableInstallArtifact extends StubInstallArtifact implements GraphAssociableInstallArtifact {
+
+    public StubGraphAssociableInstallArtifact() {
+        super();
+    }
+
+    public StubGraphAssociableInstallArtifact(ArtifactFS artifactFS, String type, String name, Version version, InstallArtifact... children) {
+        super(artifactFS, type, name, version, children);
+    }
+
+    public StubGraphAssociableInstallArtifact(ArtifactFS artifactFS, String type, String name, Version version, String scopeName,
+        DirectedAcyclicGraph<InstallArtifact> dag, InstallArtifact... children) {
+        super(artifactFS, type, name, version, scopeName, dag, children);
+    }
+
+    public StubGraphAssociableInstallArtifact(ArtifactFS artifactFS, String type, String name, Version version, String scopeName,
+        InstallArtifact... children) {
+        super(artifactFS, type, name, version, scopeName, children);
+    }
+
+    public StubGraphAssociableInstallArtifact(ArtifactFS artifactFS, String type, String name, Version version, String scopeName) {
+        super(artifactFS, type, name, version, scopeName);
+    }
+
+    public StubGraphAssociableInstallArtifact(ArtifactFS artifactFS, String type, String name, Version version) {
+        super(artifactFS, type, name, version);
+    }
+
+    public StubGraphAssociableInstallArtifact(ArtifactFS artifactFS, String name, Version version) {
+        super(artifactFS, name, version);
+    }
+
+    public StubGraphAssociableInstallArtifact(String type) {
+        super(type);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setGraph(GraphNode<InstallArtifact> graph) throws DeploymentException {
+        throw new UnsupportedOperationException();
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.stubs/src/main/java/org/eclipse/virgo/kernel/stubs/StubInstallArtifact.java b/kernel/org.eclipse.virgo.kernel.stubs/src/main/java/org/eclipse/virgo/kernel/stubs/StubInstallArtifact.java
new file mode 100644
index 0000000..ba81aa0
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.stubs/src/main/java/org/eclipse/virgo/kernel/stubs/StubInstallArtifact.java
@@ -0,0 +1,157 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.stubs;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.virgo.kernel.artifact.fs.ArtifactFS;
+import org.eclipse.virgo.nano.core.AbortableSignal;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.eclipse.virgo.util.common.DirectedAcyclicGraph;
+import org.eclipse.virgo.util.common.GraphNode;
+import org.eclipse.virgo.util.common.ThreadSafeDirectedAcyclicGraph;
+import org.osgi.framework.Version;
+
+public class StubInstallArtifact implements InstallArtifact {
+
+    private final ArtifactFS artifactFS;
+
+    private final String name;
+
+    private final Version version;
+
+    private final String type;
+
+    private final Map<String, String> properties = new HashMap<String, String>();
+
+    private final GraphNode<InstallArtifact> graph;
+    
+    private final String scopeName;
+
+    public StubInstallArtifact() {
+        this(null, null, null, null);
+    }
+
+    public StubInstallArtifact(String type) {
+        this(null, type, null, null);
+    }
+
+    public StubInstallArtifact(ArtifactFS artifactFS, String name, Version version) {
+        this(artifactFS, null, name, version);
+    }
+
+    public StubInstallArtifact(ArtifactFS artifactFS, String type, String name, Version version) {
+        this(artifactFS, type, name, version, new InstallArtifact[0]);
+    }
+    
+    public StubInstallArtifact(ArtifactFS artifactFS, String type, String name, Version version, String scopeName) {
+        this(artifactFS, type, name, version, scopeName, new InstallArtifact[0]);
+    }
+
+    public StubInstallArtifact(ArtifactFS artifactFS, String type, String name, Version version, InstallArtifact... children) {
+        this(artifactFS, type, name, version, null, children);
+    } 
+
+    public StubInstallArtifact(ArtifactFS artifactFS, String type, String name, Version version, String scopeName, 
+			InstallArtifact... children) {
+        this(artifactFS, type, name, version, null, new ThreadSafeDirectedAcyclicGraph<InstallArtifact>(), children);
+    }
+
+    public StubInstallArtifact(ArtifactFS artifactFS, String type, String name, Version version, String scopeName,
+    			DirectedAcyclicGraph<InstallArtifact> dag, InstallArtifact... children) {
+        this.type = type == null ? "stub" : type;
+        this.name = name == null ? "the-stub" : name;
+        this.version = version == null ? Version.emptyVersion : version;
+        this.scopeName = scopeName;
+
+        this.artifactFS = artifactFS;
+
+        this.graph = dag.createRootNode(this);
+
+        for (InstallArtifact child : children) {
+            this.graph.addChild(dag.createRootNode(child));
+        }
+    }
+
+	public ArtifactFS getArtifactFS() {
+        return this.artifactFS;
+    }
+
+    public String getName() {
+        return this.name;
+    }
+
+    public State getState() {
+        throw new UnsupportedOperationException();
+    }
+
+    public String getType() {
+        return this.type;
+    }
+
+    public Version getVersion() {
+        return this.version;
+    }
+    
+    public String getScopeName() {
+        return this.scopeName;
+    }
+
+    public void stop() throws DeploymentException {
+    }
+
+    public void uninstall() throws DeploymentException {
+    }
+
+    public boolean refresh() {
+        return false;
+    }
+
+    public String getProperty(@NonNull String name) {
+        return this.properties.get(name);
+    }
+
+    public Set<String> getPropertyNames() {
+        HashSet<String> propertyNames = new HashSet<String>(this.properties.keySet());
+        return Collections.unmodifiableSet(propertyNames);
+    }
+
+    public String setProperty(String name, String value) {
+        return this.properties.put(name, value);
+    }
+
+    public String getRepositoryName() {
+        throw new UnsupportedOperationException();
+    }
+
+    public GraphNode<InstallArtifact> getGraph() {
+        return this.graph;
+    }
+
+    public void start() throws DeploymentException {
+        start(null);
+    }
+
+    public void start(AbortableSignal signal) throws DeploymentException {
+        if (signal != null) {
+            signal.signalSuccessfulCompletion();
+        }
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.stubs/src/main/java/org/eclipse/virgo/kernel/stubs/StubPlanInstallArtifact.java b/kernel/org.eclipse.virgo.kernel.stubs/src/main/java/org/eclipse/virgo/kernel/stubs/StubPlanInstallArtifact.java
new file mode 100644
index 0000000..eacee03
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.stubs/src/main/java/org/eclipse/virgo/kernel/stubs/StubPlanInstallArtifact.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.stubs;
+
+import java.util.List;
+
+import org.eclipse.virgo.kernel.artifact.ArtifactSpecification;
+import org.eclipse.virgo.kernel.artifact.plan.PlanDescriptor.Provisioning;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+
+import org.eclipse.virgo.kernel.install.artifact.InstallArtifact;
+import org.eclipse.virgo.kernel.install.artifact.PlanInstallArtifact;
+import org.eclipse.virgo.util.common.DirectedAcyclicGraph;
+
+public class StubPlanInstallArtifact extends StubGraphAssociableInstallArtifact implements PlanInstallArtifact {
+
+    public StubPlanInstallArtifact() {
+		super();
+	}
+
+	public StubPlanInstallArtifact(DirectedAcyclicGraph<InstallArtifact> dag) {
+    		super(null, null, null, null, null, dag);
+	}
+
+	public String getType() {
+        return "plan";
+    }
+
+    public boolean isAtomic() {
+        return false;
+    }
+
+    public boolean isScoped() {
+        return false;
+    }
+
+    public boolean refresh(String symbolicName) throws DeploymentException {
+        return false;
+    }
+
+    public boolean refreshScope() {
+        return false;
+    }
+
+    public List<ArtifactSpecification> getArtifactSpecifications() {
+        return null;
+    }
+
+    public Provisioning getProvisioning() {
+        return Provisioning.INHERIT;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.stubs/src/test/resources/suppresswarning/.gitignore b/kernel/org.eclipse.virgo.kernel.stubs/src/test/resources/suppresswarning/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.stubs/src/test/resources/suppresswarning/.gitignore
diff --git a/kernel/org.eclipse.virgo.kernel.stubs/template.mf b/kernel/org.eclipse.virgo.kernel.stubs/template.mf
new file mode 100644
index 0000000..51bcb00
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.stubs/template.mf
@@ -0,0 +1,10 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Virgo Kernel Unit Test Stubs
+Bundle-SymbolicName: org.eclipse.virgo.kernel.stubs
+Bundle-Version: ${version}
+Import-Template: 
+ org.eclipse.virgo.kernel.*;version="${version:[=.=.=, =.+1)}",
+ org.eclipse.virgo.nano.*;version="${version:[=.=.=, =.+1)}",
+ org.eclipse.virgo.util.*;version="${version:[=.=.=, =.+1)}",
+ org.osgi.framework.*;version="0"
diff --git a/kernel/org.eclipse.virgo.kernel.test/.settings/org.eclipse.wst.common.project.facet.core.xml b/kernel/org.eclipse.virgo.kernel.test/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..92aa290
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+  <installed facet="org.eclipse.virgo.server.bundle" version="1.0"/>
+</faceted-project>
diff --git a/kernel/org.eclipse.virgo.kernel.test/.springBeans b/kernel/org.eclipse.virgo.kernel.test/.springBeans
new file mode 100644
index 0000000..d079ca1
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/.springBeans
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beansProjectDescription>
+	<version>1</version>
+	<pluginVersion><![CDATA[2.2.4.RELEASE]]></pluginVersion>
+	<configSuffixes>
+		<configSuffix><![CDATA[xml]]></configSuffix>
+	</configSuffixes>
+	<enableImports><![CDATA[false]]></enableImports>
+	<configs>
+	</configs>
+	<configSets>
+	</configSets>
+</beansProjectDescription>
diff --git a/kernel/org.eclipse.virgo.kernel.test/build.xml b/kernel/org.eclipse.virgo.kernel.test/build.xml
new file mode 100644
index 0000000..dba457d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/build.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="org.eclipse.virgo.kernel.test">
+
+	<property file="${basedir}/../build.properties"/>
+	<property file="${basedir}/../build.versions"/>
+	<import file="${basedir}/../virgo-build/standard/default.xml"/>
+
+</project>
diff --git a/kernel/org.eclipse.virgo.kernel.test/ivy.xml b/kernel/org.eclipse.virgo.kernel.test/ivy.xml
new file mode 100644
index 0000000..ebf9e45
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/ivy.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ivy-module xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd" version="2.0">
+
+	<info organisation="${project.organisation}" module="${ant.project.name}"/>
+
+	<configurations>
+		<include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>
+	</configurations>
+
+	<publications>
+		<artifact name="${ant.project.name}"/>
+		<artifact name="${ant.project.name}-sources" type="src" ext="jar"/>
+	</publications>
+
+	<dependencies>
+		<!-- build -->
+		<dependency org="org.eclipse.virgo.mirrored" name="org.eclipse.equinox.cm" rev="${org.eclipse.equinox.cm}" conf="compile->runtime"/>
+
+		<dependency org="org.eclipse.gemini" name="org.eclipse.gemini.blueprint.core" rev="${org.eclipse.gemini.blueprint}" conf="compile->runtime"/>
+
+		<!-- testing -->
+		<dependency org="org.junit" name="com.springsource.org.junit" rev="${org.junit}" conf="test->runtime"/>
+		<dependency org="org.easymock" name="com.springsource.org.easymock" rev="${org.easymock}" conf="test->runtime"/>
+		
+		<dependency org="org.eclipse.virgo.mirrored" name="org.apache.felix.gogo.runtime" rev="${org.apache.felix.gogo.runtime}" conf="test->runtime"/>
+		<dependency org="org.eclipse.virgo.mirrored" name="org.apache.felix.gogo.command" rev="${org.apache.felix.gogo.command}" conf="test->runtime"/>
+		<dependency org="org.eclipse.virgo.mirrored" name="org.apache.felix.gogo.shell" rev="${org.apache.felix.gogo.shell}" conf="test->runtime"/>
+		<dependency org="org.eclipse.virgo.mirrored" name="org.apache.mina.core" rev="${org.apache.mina.core}" conf="test->runtime" />
+		<dependency org="org.eclipse.virgo.mirrored" name="org.apache.sshd.core" rev="${org.apache.sshd.core}" conf="test->runtime" />
+		
+		<dependency org="org.eclipse.virgo.mirrored" name="org.eclipse.equinox.ds" rev="${org.eclipse.equinox.ds}" conf="test->runtime"/>
+		<dependency org="org.eclipse.virgo.mirrored" name="org.eclipse.equinox.util" rev="${org.eclipse.equinox.util}" conf="test->runtime"/>
+		<dependency org="org.eclipse.virgo.mirrored" name="org.eclipse.osgi.services" rev="${org.eclipse.osgi.services}" conf="test->runtime"/>
+		<dependency org="org.eclipse.virgo.mirrored" name='org.eclipse.equinox.region' rev='${org.eclipse.equinox.region}' conf='test->runtime' />
+		<dependency org="org.eclipse.virgo.mirrored" name="org.eclipse.equinox.console" rev="${org.eclipse.equinox.console}" conf="test->runtime" />
+		<dependency org="org.eclipse.virgo.mirrored" name="org.eclipse.equinox.console.ssh" rev="${org.eclipse.equinox.console.ssh}" conf="test->runtime" />
+
+		<dependency org="org.eclipse.virgo.nano" name="org.eclipse.virgo.nano.core" rev="${org.eclipse.virgo.nano}" conf="test->compile"/>
+        <dependency org="org.eclipse.virgo.nano" name="org.eclipse.virgo.nano.management" rev="${org.eclipse.virgo.nano}" conf="test->compile"/>
+		<dependency org="org.eclipse.virgo.kernel" name="org.eclipse.virgo.kernel.osgi" rev="latest.integration" conf="test->compile"/>
+		<dependency org="org.eclipse.virgo.kernel" name="org.eclipse.virgo.kernel.deployer" rev="latest.integration" conf="test->compile"/>
+		<dependency org="org.eclipse.virgo.kernel" name="org.eclipse.virgo.shell.command" rev="latest.integration" conf="test->runtime"/>
+
+		<dependency org="org.eclipse.virgo.medic" name="org.eclipse.virgo.medic.core" rev="${org.eclipse.virgo.medic}" conf="test->runtime"/>
+		<dependency org="org.eclipse.virgo.medic" name="org.eclipse.virgo.medic.logbackcorefragment" rev="${org.eclipse.virgo.medic}" conf="test->runtime"/>
+		<dependency org="org.eclipse.virgo.medic" name="org.eclipse.virgo.medic.logbackclassicfragment" rev="${org.eclipse.virgo.medic}" conf="test->runtime"/>
+		<dependency org="org.eclipse.virgo.mirrored" name="ch.qos.logback.classic" rev="${ch.qos.logback.classic}" conf="test->runtime"/>
+		<dependency org="org.eclipse.virgo.mirrored" name="ch.qos.logback.core" rev="${ch.qos.logback.core}" conf="test->runtime"/>
+        <dependency org="org.eclipse.virgo.mirrored" name="ch.qos.logback.slf4j" rev="${ch.qos.logback.slf4j}" conf="test->runtime"/>
+
+		<dependency org="org.eclipse.virgo.repository" name="org.eclipse.virgo.repository" rev="${org.eclipse.virgo.repository}" conf="test->runtime"/>
+		
+		<dependency org="org.eclipse.virgo.test" name="org.eclipse.virgo.test.framework" rev="${org.eclipse.virgo.test}" conf="test->runtime"/>
+		<dependency org="org.eclipse.virgo.test" name="org.eclipse.virgo.test.launcher" rev="${org.eclipse.virgo.test}" conf="test->runtime"/>
+		<dependency org="org.eclipse.virgo.kernel" name="org.eclipse.virgo.kernel.equinox.extensions" rev="latest.integration" conf="test->runtime"/>
+		
+		<!--  the following conf should be test->runtime but for some reason that does not pull down the dependency -->
+		<dependency org="org.aspectj" name="com.springsource.org.aspectj.runtime" rev="${org.aspectj}" conf="test->runtime"/>
+		<dependency org="org.eclipse.virgo.mirrored" name="org.slf4j.nop" rev="${org.slf4j.nop}" conf="test->runtime"/>
+		<dependency org="org.eclipse.virgo.mirrored" name="org.slf4j.jcl" rev="${org.slf4j.jcl}" conf="test->runtime"/>
+		<dependency org="org.eclipse.virgo.mirrored" name="org.slf4j.jul" rev="${org.slf4j.jul}" conf="test->runtime"/>
+
+		<!-- Prevent Xerces from being on the classpath to work around Java bug 6723276 during integration testing -->
+		<exclude org="org.apache.xerces"/>
+        <exclude org="org.eclipse.osgi"/>
+
+		<!-- Allow Equinox to be upgraded point-wise before rippling -->
+		<override org="org.springframework" rev="${org.springframework}"/>
+		<override org="org.aspectj" rev="${org.aspectj}" />
+		<override org="org.eclipse.virgo.mirrored" module="org.eclipse.osgi" rev="${org.eclipse.osgi}"/>
+	</dependencies>
+
+</ivy-module>
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/main/java/.gitignore b/kernel/org.eclipse.virgo.kernel.test/src/main/java/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/main/java/.gitignore
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/main/resources/suppresswarning/.gitignore b/kernel/org.eclipse.virgo.kernel.test/src/main/resources/suppresswarning/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/main/resources/suppresswarning/.gitignore
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/java/org/eclipse/virgo/kernel/concurrent/test/ApplicationContextDependencyMonitorIntegrationTests.java b/kernel/org.eclipse.virgo.kernel.test/src/test/java/org/eclipse/virgo/kernel/concurrent/test/ApplicationContextDependencyMonitorIntegrationTests.java
new file mode 100644
index 0000000..91e600f
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/java/org/eclipse/virgo/kernel/concurrent/test/ApplicationContextDependencyMonitorIntegrationTests.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.concurrent.test;
+
+import static org.junit.Assert.assertTrue;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.Reader;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.virgo.nano.core.AbortableSignal;
+import org.eclipse.virgo.nano.core.BundleStarter;
+import org.eclipse.virgo.kernel.osgi.framework.OsgiFrameworkUtils;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiBundle;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiFramework;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiFrameworkFactory;
+import org.eclipse.virgo.kernel.test.AbstractKernelIntegrationTest;
+import org.eclipse.virgo.kernel.test.ManifestUtils;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifestFactory;
+import org.junit.Assert;
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.ServiceReference;
+
+/**
+ */
+public class ApplicationContextDependencyMonitorIntegrationTests extends AbstractKernelIntegrationTest {    
+
+    @Test 
+    public void testDependencyMonitoring() throws Exception {
+        QuasiFramework framework = OsgiFrameworkUtils.getService(this.context, QuasiFrameworkFactory.class).getService().create();
+        File file = new File("src/test/resources/QuickConsumer.jar");
+        Reader manifestReader = ManifestUtils.manifestReaderFromJar(file);
+        BundleManifest manifest = BundleManifestFactory.createBundleManifest(manifestReader);
+        manifestReader.close();
+        QuasiBundle quasiQuickConsumer = framework.install(file.toURI(), manifest);
+        framework.resolve();
+        framework.commit();
+        
+        Bundle quickConsumer = quasiQuickConsumer.getBundle();
+        
+        ServiceReference<BundleStarter> serviceReference = this.kernelContext.getServiceReference(BundleStarter.class);
+        BundleStarter bundleStarter = this.kernelContext.getService(serviceReference);
+        
+        final CountDownLatch latch = new CountDownLatch(1);
+        
+        bundleStarter.start(quickConsumer, new AbortableSignal() {
+            public void signalFailure(Throwable cause) {
+                cause.printStackTrace();
+            }
+
+            public void signalSuccessfulCompletion() {
+                latch.countDown();
+            }
+
+			public void signalAborted() {
+				new RuntimeException("Start aborted").printStackTrace();
+			}
+        });
+                       
+        assertTrue(latch.await(20, TimeUnit.SECONDS));
+       
+        // We need to sleep for a little while to give the
+        // log output sufficient time to make it out onto disk
+        try {
+            Thread.sleep(1000);
+        } catch (InterruptedException _) {
+        	// Ignore
+        }
+
+        File loggingOutput = new File("./target/serviceability/eventlog/eventlog.log");
+        Assert.assertTrue("The log file " + loggingOutput.getAbsolutePath() + " does not exist.", loggingOutput.exists());
+
+        BufferedReader reader = new BufferedReader(new FileReader(loggingOutput));
+
+        String line = reader.readLine();
+        List<String> logEntries = new ArrayList<String>();
+
+        while (line != null) {
+            logEntries.add(line);
+            line = reader.readLine();
+        }
+        
+        reader.close();
+
+        List<String> expectedResults = new ArrayList<String>(10);
+        expectedResults.add("KE0100W");
+        expectedResults.add("KE0101I");
+
+        for (String er : expectedResults) {
+            boolean entryFound = false;
+            for (String logEntry : logEntries) {
+                if (logEntry.contains(er)) {
+                    entryFound = true;
+                }
+            }
+            Assert.assertTrue("An entry containing " + er + " was not found in logging file " + loggingOutput.getAbsolutePath() + ".", entryFound);
+        }
+    }
+    
+}
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/java/org/eclipse/virgo/kernel/dm/test/ModuleBeanFactoryPostProcessorTests.java b/kernel/org.eclipse.virgo.kernel.test/src/test/java/org/eclipse/virgo/kernel/dm/test/ModuleBeanFactoryPostProcessorTests.java
new file mode 100644
index 0000000..4ef72ed
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/java/org/eclipse/virgo/kernel/dm/test/ModuleBeanFactoryPostProcessorTests.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.dm.test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+
+import org.eclipse.gemini.blueprint.context.support.OsgiBundleXmlApplicationContext;
+import org.eclipse.gemini.blueprint.service.importer.support.ImportContextClassLoaderEnum;
+import org.eclipse.gemini.blueprint.service.importer.support.OsgiServiceProxyFactoryBean;
+import org.eclipse.virgo.nano.core.BundleStarter;
+import org.eclipse.virgo.kernel.osgi.framework.OsgiFrameworkUtils;
+import org.eclipse.virgo.kernel.osgi.framework.OsgiServiceHolder;
+import org.eclipse.virgo.kernel.test.AbstractKernelIntegrationTest;
+import org.eclipse.virgo.kernel.test.TestSignal;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.ServiceReference;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ConfigurableApplicationContext;
+
+public class ModuleBeanFactoryPostProcessorTests extends AbstractKernelIntegrationTest {
+    
+    private OsgiServiceHolder<BundleStarter> bundleStarter;
+
+    @Before
+    public void before() {
+        this.bundleStarter = OsgiFrameworkUtils.getService(kernelContext, BundleStarter.class);
+    }
+    
+    @After
+    public void after() {
+        if(this.bundleStarter != null) {
+            this.kernelContext.ungetService(this.bundleStarter.getServiceReference());
+        }
+    }
+    @Test
+    public void testInbuiltPostProcessors() throws Exception {
+       Bundle bundle = this.context.installBundle(new File("src/test/resources/post-processors/inbuilt").toURI().toString());
+       TestSignal signal = new TestSignal();
+       
+       this.bundleStarter.getService().start(bundle, signal);
+       
+       signal.assertSuccessfulCompletionSignalled(5000);
+       
+       ServiceReference<?>[] serviceReferences = this.context.getServiceReferences(ApplicationContext.class.getName(), "(Bundle-SymbolicName=org.eclipse.virgo.kernel.dmfragment.test.inbuilt)");
+       assertNotNull(serviceReferences);
+       assertEquals(1, serviceReferences.length);
+       
+       OsgiBundleXmlApplicationContext applicationContext = (OsgiBundleXmlApplicationContext) this.context.getService(serviceReferences[0]);
+       
+       Object ltwBean = applicationContext.getBean(ConfigurableApplicationContext.LOAD_TIME_WEAVER_BEAN_NAME);
+       assertNotNull(ltwBean);
+       assertTrue(ltwBean.getClass().getName().startsWith("org.eclipse.virgo.kernel.dm")); // don't want direct class references because I want to avoid an import-package
+       
+       Object mbeanExporterBean = applicationContext.getBean("mbeanExporter");
+       assertNotNull(mbeanExporterBean);
+       assertTrue(mbeanExporterBean.getClass().getName().startsWith("org.eclipse.virgo.kernel.dm")); // don't want direct class references because I want to avoid an import-package
+       
+       OsgiServiceProxyFactoryBean referenceBean = (OsgiServiceProxyFactoryBean) applicationContext.getBean("&reference");
+       assertNotNull(referenceBean);
+       assertEquals(ImportContextClassLoaderEnum.UNMANAGED, referenceBean.getImportContextClassLoader());
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/java/org/eclipse/virgo/kernel/ffdc/test/FFDCServiceAspectTests.java b/kernel/org.eclipse.virgo.kernel.test/src/test/java/org/eclipse/virgo/kernel/ffdc/test/FFDCServiceAspectTests.java
new file mode 100644
index 0000000..2190346
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/java/org/eclipse/virgo/kernel/ffdc/test/FFDCServiceAspectTests.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.ffdc.test;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.File;
+
+import org.eclipse.virgo.kernel.test.AbstractKernelIntegrationTest;
+import org.junit.Ignore;
+import org.junit.Test;
+
+
+/**
+ */
+public class FFDCServiceAspectTests extends AbstractKernelIntegrationTest {
+
+    @Ignore("[DMS-2884] Cannot weave test projects in Ant yet")
+    @Test
+    //
+    public void ffdcAspectTriggersDump() {
+        int countBefore = dumpFileCount();
+        try {
+            new Foo().dodgy();
+        } catch (RuntimeException e) {
+            // ignore
+        }
+        int countAfter = dumpFileCount();
+        assertEquals(countBefore + 1, countAfter);
+    }
+
+    private int dumpFileCount() {
+        File dumpDir = new File("build/dumpfiles");
+        String[] list = dumpDir.list();
+        return (list == null ? 0 : list.length);
+    }
+
+    private static class Foo {
+
+        public void dodgy() {
+            throw new RuntimeException();
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/java/org/eclipse/virgo/kernel/osgi/test/QuasiFrameworkIntegrationTests.java b/kernel/org.eclipse.virgo.kernel.test/src/test/java/org/eclipse/virgo/kernel/osgi/test/QuasiFrameworkIntegrationTests.java
new file mode 100644
index 0000000..a52010f
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/java/org/eclipse/virgo/kernel/osgi/test/QuasiFrameworkIntegrationTests.java
@@ -0,0 +1,308 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.osgi.test;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.List;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.Version;
+
+import org.eclipse.virgo.kernel.osgi.framework.OsgiFrameworkUtils;
+import org.eclipse.virgo.kernel.osgi.framework.OsgiServiceHolder;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiBundle;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiExportPackage;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiFramework;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiFrameworkFactory;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiImportPackage;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiPackageResolutionFailure;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiRequiredBundle;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiResolutionFailure;
+import org.eclipse.virgo.kernel.test.AbstractKernelIntegrationTest;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifestFactory;
+import org.eclipse.virgo.util.osgi.manifest.RequireBundle;
+
+/**
+ */
+public class QuasiFrameworkIntegrationTests extends AbstractKernelIntegrationTest {
+
+    private static final String EXPORTER_BSN = "exporter";
+
+    private static final String IMPORTER_BSN = "importer";
+    
+    private static final String REQUIRING_BSN = "requirer";
+
+    private static final String IMPORTER_JAR_PATH = "src/test/resources/quasi/simpleimporter.jar";
+    
+    private static final String EXPORTER_JAR_PATH = "src/test/resources/quasi/simpleexporter.jar";
+
+    private static final String QUASI_TEST_PACKAGE = "quasi.test";
+
+    private static final Version BUNDLE_VERSION = new Version("2.3");
+
+    private QuasiFrameworkFactory quasiFrameworkFactory;
+
+    private QuasiFramework quasiFramework;
+
+    @Before
+    public void setUp() {
+        BundleContext bundleContext = this.framework.getBundleContext();
+        OsgiServiceHolder<QuasiFrameworkFactory> holder = OsgiFrameworkUtils.getService(bundleContext, QuasiFrameworkFactory.class);
+        this.quasiFrameworkFactory = holder.getService();
+        Assert.assertNotNull(this.quasiFrameworkFactory);
+        this.quasiFramework = this.quasiFrameworkFactory.create();
+        Assert.assertNotNull(this.quasiFramework);
+    }
+    
+    @After
+    public void tearDown() {
+        this.quasiFramework.destroy();
+    }
+
+    @Test
+    public void testInstall() throws Exception {
+        BundleManifest bundleManifest = getBundleManifest("test", BUNDLE_VERSION);
+
+        QuasiBundle quasiBundle = this.quasiFramework.install(new URI("test"), bundleManifest);
+        Assert.assertEquals("test", quasiBundle.getSymbolicName());
+        Assert.assertEquals(BUNDLE_VERSION, quasiBundle.getVersion());
+        Assert.assertFalse(quasiBundle.isResolved());
+        Assert.assertNull(quasiBundle.getBundle());
+        
+        long bundleId = quasiBundle.getBundleId();
+        Assert.assertFalse(bundleId == 0);
+        Assert.assertEquals(quasiBundle, this.quasiFramework.getBundle(bundleId));
+    }
+
+    @Test
+    public void testBasicResolve() throws Exception {
+        QuasiBundle exporterQuasiBundle = installExporterBundle();
+
+        List<QuasiResolutionFailure> resolutionFailures = this.quasiFramework.resolve();
+        Assert.assertNotNull(resolutionFailures);
+        Assert.assertEquals(0, resolutionFailures.size());
+        Assert.assertTrue(exporterQuasiBundle.isResolved());
+    }
+
+    @Test
+    public void testWiringResolve() throws Exception {
+        QuasiBundle importerQuasiBundle = installImporterBundle();
+        QuasiBundle exporterQuasiBundle = installExporterBundle();
+
+        List<QuasiResolutionFailure> resolutionFailures = this.quasiFramework.resolve();
+        Assert.assertNotNull(resolutionFailures);
+        Assert.assertEquals(0, resolutionFailures.size());
+        Assert.assertTrue(importerQuasiBundle.isResolved());
+        Assert.assertTrue(exporterQuasiBundle.isResolved());
+    }
+
+    @Test
+    public void testFailedResolve() throws Exception {
+        QuasiBundle importerQuasiBundle = installImporterBundle();
+
+        List<QuasiResolutionFailure> resolutionFailures = this.quasiFramework.resolve();
+        Assert.assertNotNull(resolutionFailures);
+        Assert.assertEquals(1, resolutionFailures.size());
+        QuasiResolutionFailure failure = resolutionFailures.get(0);
+        Assert.assertTrue(failure instanceof QuasiPackageResolutionFailure);
+        QuasiPackageResolutionFailure qprFailure = (QuasiPackageResolutionFailure) failure;
+        Assert.assertEquals(QUASI_TEST_PACKAGE, qprFailure.getPackage());
+        Assert.assertFalse(importerQuasiBundle.isResolved());
+    }
+
+    @Test
+    public void testPackageWiringExploration() throws Exception {
+        QuasiBundle importerQuasiBundle = installImporterBundle();
+        QuasiBundle exporterQuasiBundle = installExporterBundle();
+        
+        List<QuasiResolutionFailure> resolutionFailures = this.quasiFramework.resolve();
+        Assert.assertNotNull(resolutionFailures);
+        Assert.assertEquals(0, resolutionFailures.size());
+        Assert.assertTrue(importerQuasiBundle.isResolved());
+        Assert.assertTrue(exporterQuasiBundle.isResolved());
+        
+        checkGetBundles(importerQuasiBundle, exporterQuasiBundle);
+        
+        checkDependents(importerQuasiBundle, exporterQuasiBundle);
+        
+        QuasiImportPackage qip = checkImportPackages(importerQuasiBundle, exporterQuasiBundle);
+        
+        QuasiExportPackage qep = checkExportPackages(importerQuasiBundle, exporterQuasiBundle);
+        
+        checkConsumers(qep, qip);
+        
+        checkProvider(qip, qep);
+    }
+    
+    @Test
+    public void testRequiredBundleExploration() throws Exception {
+        QuasiBundle requiringQuasiBundle = installRequiringBundle();
+        QuasiBundle exporterQuasiBundle = installExporterBundle();
+        
+        List<QuasiResolutionFailure> resolutionFailures = this.quasiFramework.resolve();
+        Assert.assertNotNull(resolutionFailures);
+        Assert.assertEquals(0, resolutionFailures.size());
+        Assert.assertTrue(requiringQuasiBundle.isResolved());
+        Assert.assertTrue(exporterQuasiBundle.isResolved());
+        
+        checkGetBundles(requiringQuasiBundle, exporterQuasiBundle);
+        
+        List<QuasiRequiredBundle> requiredBundles = requiringQuasiBundle.getRequiredBundles();
+        Assert.assertEquals(1, requiredBundles.size());
+        QuasiRequiredBundle quasiRequiredBundle = requiredBundles.get(0);
+        QuasiBundle provider = quasiRequiredBundle.getProvider();
+        Assert.assertEquals(exporterQuasiBundle, provider);
+        
+    }
+
+    private void checkProvider(QuasiImportPackage qip, QuasiExportPackage qep) {
+        QuasiExportPackage provider = qip.getProvider();
+        Assert.assertEquals(qep, provider);
+    }
+
+    private void checkConsumers(QuasiExportPackage qep, QuasiImportPackage qip) {
+        List<QuasiImportPackage> consumers = qep.getConsumers();
+        Assert.assertEquals(1, consumers.size());
+        QuasiImportPackage consumer = consumers.get(0);
+        Assert.assertEquals(qip, consumer);
+    }
+
+    private QuasiImportPackage checkImportPackages(QuasiBundle importerQuasiBundle, QuasiBundle exporterQuasiBundle) {
+        List<QuasiImportPackage> exporterImportPackages = exporterQuasiBundle.getImportPackages();
+        Assert.assertEquals(0, exporterImportPackages.size());
+        
+        List<QuasiImportPackage> importPackages = importerQuasiBundle.getImportPackages();
+        Assert.assertEquals(1, importPackages.size());
+        QuasiImportPackage qip = importPackages.get(0);
+        Assert.assertEquals("quasi.test", qip.getPackageName());
+        return qip;
+    }
+
+    private QuasiExportPackage checkExportPackages(QuasiBundle importerQuasiBundle, QuasiBundle exporterQuasiBundle) {
+        Assert.assertEquals(0, importerQuasiBundle.getExportPackages().size());
+        
+        List<QuasiExportPackage> exportPackages = exporterQuasiBundle.getExportPackages();
+        Assert.assertEquals(1, exportPackages.size());
+        QuasiExportPackage qep = exportPackages.get(0);
+        Assert.assertEquals("quasi.test", qep.getPackageName());
+        return qep;
+    }
+
+    private void checkDependents(QuasiBundle importerQuasiBundle, QuasiBundle exporterQuasiBundle) {
+        List<QuasiBundle> dependents = exporterQuasiBundle.getDependents();
+        Assert.assertEquals(1, dependents.size());
+        Assert.assertEquals(importerQuasiBundle, dependents.get(0));
+    }
+
+    private void checkGetBundles(QuasiBundle importerQuasiBundle, QuasiBundle exporterQuasiBundle) {
+        List<QuasiBundle> quasiBundles = this.quasiFramework.getBundles();
+        
+        boolean foundImporter = false;
+        boolean foundExporter = false;
+        
+        for (QuasiBundle quasiBundle : quasiBundles) {
+            if (quasiBundle.equals(importerQuasiBundle)) {
+                foundImporter = true;
+            }
+            if (quasiBundle.equals(exporterQuasiBundle)) {
+                foundExporter = true;
+            }
+            
+        }
+        
+        Assert.assertTrue(foundImporter);
+        Assert.assertTrue(foundExporter);
+    }
+    
+    @Test
+    public void testCommit() throws Exception {
+        QuasiBundle importerQuasiBundle = installImporterBundle();
+        QuasiBundle exporterQuasiBundle = installExporterBundle();
+
+        List<QuasiResolutionFailure> resolutionFailures = this.quasiFramework.resolve();
+        Assert.assertNotNull(resolutionFailures);
+        Assert.assertEquals(0, resolutionFailures.size());
+        this.quasiFramework.commit();
+        
+        Assert.assertTrue(importerQuasiBundle.isResolved());
+        Bundle importerBundle = importerQuasiBundle.getBundle();
+        Assert.assertNotNull(importerBundle);
+        Assert.assertEquals(IMPORTER_BSN, importerBundle.getSymbolicName());
+        
+        Assert.assertTrue(exporterQuasiBundle.isResolved());
+        Bundle exporterBundle = exporterQuasiBundle.getBundle();
+        Assert.assertNotNull(exporterBundle);
+        Assert.assertEquals(EXPORTER_BSN, exporterBundle.getSymbolicName());
+        
+        // Tidy up since test methods may run in any order in Java 7 
+        importerBundle.uninstall();
+        exporterBundle.uninstall();
+    }
+    
+    private QuasiBundle installExporterBundle() throws BundleException, URISyntaxException {
+        QuasiBundle exporterQuasiBundle;
+        BundleManifest exporterBundleManifest = getBundleManifest(EXPORTER_BSN, BUNDLE_VERSION);
+        exporterBundleManifest.getExportPackage().addExportedPackage(QUASI_TEST_PACKAGE);
+
+        exporterQuasiBundle = this.quasiFramework.install(new URI(EXPORTER_JAR_PATH), exporterBundleManifest);
+        Assert.assertEquals(EXPORTER_BSN, exporterQuasiBundle.getSymbolicName());
+        Assert.assertEquals(BUNDLE_VERSION, exporterQuasiBundle.getVersion());
+        Assert.assertFalse(exporterQuasiBundle.isResolved());
+        Assert.assertNull(exporterQuasiBundle.getBundle());
+        return exporterQuasiBundle;
+    }
+
+    private QuasiBundle installImporterBundle() throws BundleException, URISyntaxException {
+        QuasiBundle importerQuasiBundle;
+        BundleManifest importerBundleManifest = getBundleManifest(IMPORTER_BSN, BUNDLE_VERSION);
+        importerBundleManifest.getImportPackage().addImportedPackage(QUASI_TEST_PACKAGE);
+
+        importerQuasiBundle = this.quasiFramework.install(new URI(IMPORTER_JAR_PATH), importerBundleManifest);
+        Assert.assertEquals(IMPORTER_BSN, importerQuasiBundle.getSymbolicName());
+        Assert.assertEquals(BUNDLE_VERSION, importerQuasiBundle.getVersion());
+        Assert.assertFalse(importerQuasiBundle.isResolved());
+        Assert.assertNull(importerQuasiBundle.getBundle());
+        return importerQuasiBundle;
+    }
+    
+    private QuasiBundle installRequiringBundle() throws BundleException, URISyntaxException {
+        QuasiBundle requiringQuasiBundle;
+        BundleManifest requiringBundleManifest = getBundleManifest(REQUIRING_BSN, BUNDLE_VERSION);
+        RequireBundle requireBundle = requiringBundleManifest.getRequireBundle();
+        requireBundle.addRequiredBundle(EXPORTER_BSN);
+
+        requiringQuasiBundle = this.quasiFramework.install(new URI(IMPORTER_JAR_PATH), requiringBundleManifest);
+        Assert.assertEquals(REQUIRING_BSN, requiringQuasiBundle.getSymbolicName());
+        Assert.assertEquals(BUNDLE_VERSION, requiringQuasiBundle.getVersion());
+        Assert.assertFalse(requiringQuasiBundle.isResolved());
+        Assert.assertNull(requiringQuasiBundle.getBundle());
+        return requiringQuasiBundle;
+    }
+
+    private BundleManifest getBundleManifest(String symbolicName, Version bundleVersion) {
+        BundleManifest bundleManifest;
+        bundleManifest = BundleManifestFactory.createBundleManifest();
+        bundleManifest.setBundleManifestVersion(2);
+        bundleManifest.getBundleSymbolicName().setSymbolicName(symbolicName);
+        bundleManifest.setBundleVersion(bundleVersion);
+        return bundleManifest;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/java/org/eclipse/virgo/kernel/osgi/test/QuasiFrameworkStateDumpIntegrationTests.java b/kernel/org.eclipse.virgo.kernel.test/src/test/java/org/eclipse/virgo/kernel/osgi/test/QuasiFrameworkStateDumpIntegrationTests.java
new file mode 100644
index 0000000..64942e1
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/java/org/eclipse/virgo/kernel/osgi/test/QuasiFrameworkStateDumpIntegrationTests.java
@@ -0,0 +1,130 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.osgi.test;
+
+import java.io.File;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.virgo.kernel.osgi.framework.OsgiFrameworkUtils;
+import org.eclipse.virgo.kernel.osgi.framework.OsgiServiceHolder;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiBundle;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiFramework;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiFrameworkFactory;
+import org.eclipse.virgo.kernel.test.AbstractKernelIntegrationTest;
+import org.eclipse.virgo.util.io.FileSystemUtils;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifestFactory;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.Version;
+
+/**
+ */
+public class QuasiFrameworkStateDumpIntegrationTests extends AbstractKernelIntegrationTest {
+
+    private static final String IMPORTER_BSN = "importer";
+
+    private static final String IMPORTER_JAR_PATH = "src/test/resources/quasi/simpleimporter.jar";
+
+    private static final String QUASI_TEST_PACKAGE = "quasi.test";
+
+    private static final Version BUNDLE_VERSION = new Version("2.3");
+
+    private QuasiFrameworkFactory quasiFrameworkFactory;
+
+    private QuasiFramework quasiFramework;
+
+    private File dumpDir;
+
+    @Before
+    public void setUp() {
+        BundleContext bundleContext = this.framework.getBundleContext();
+        OsgiServiceHolder<QuasiFrameworkFactory> holder = OsgiFrameworkUtils.getService(bundleContext, QuasiFrameworkFactory.class);
+        this.quasiFrameworkFactory = holder.getService();
+        Assert.assertNotNull(this.quasiFrameworkFactory);
+        this.quasiFramework = this.quasiFrameworkFactory.create();
+        Assert.assertNotNull(this.quasiFramework);
+        this.dumpDir = new File("build/serviceability/dump/");
+        if(this.dumpDir.exists()){
+        	FileSystemUtils.deleteRecursively(this.dumpDir);
+        }
+    	this.dumpDir.mkdirs();
+    }
+
+    @Test
+    public void testStateDump() throws Exception {
+
+        Set<File> oldFileSet = getDumpFiles();
+
+        installImporterBundle();
+        this.quasiFramework.resolve();
+
+        Set<File> newFileSet = getDumpFiles();
+        newFileSet.removeAll(oldFileSet);
+        Assert.assertEquals(1, newFileSet.size());
+
+        File dump = newFileSet.iterator().next();
+
+        QuasiFramework stateDump = this.quasiFrameworkFactory.create(dump);
+        List<QuasiBundle> bundles = stateDump.getBundles();
+        boolean found = false;
+        for (QuasiBundle quasiBundle : bundles) {
+            if (IMPORTER_BSN.equals(quasiBundle.getSymbolicName())) {
+                found = true;
+            }
+        }
+        Assert.assertTrue(found);
+
+    }
+
+    private Set<File> getDumpFiles() {
+        Set<File> oldFileSet = null;
+        {
+            File[] oldFiles = this.dumpDir.listFiles();
+            oldFileSet = new HashSet<File>();
+            for (File oldFile : oldFiles) {
+                oldFileSet.add(oldFile);
+            }
+        }
+        return oldFileSet;
+    }
+
+    private QuasiBundle installImporterBundle() throws BundleException, URISyntaxException {
+        QuasiBundle importerQuasiBundle;
+        BundleManifest importerBundleManifest = getBundleManifest(IMPORTER_BSN, BUNDLE_VERSION);
+        importerBundleManifest.getImportPackage().addImportedPackage(QUASI_TEST_PACKAGE);
+
+        importerQuasiBundle = this.quasiFramework.install(new URI(IMPORTER_JAR_PATH), importerBundleManifest);
+        Assert.assertEquals(IMPORTER_BSN, importerQuasiBundle.getSymbolicName());
+        Assert.assertEquals(BUNDLE_VERSION, importerQuasiBundle.getVersion());
+        Assert.assertFalse(importerQuasiBundle.isResolved());
+        Assert.assertNull(importerQuasiBundle.getBundle());
+        return importerQuasiBundle;
+    }
+
+    private BundleManifest getBundleManifest(String symbolicName, Version bundleVersion) {
+        BundleManifest bundleManifest;
+        bundleManifest = BundleManifestFactory.createBundleManifest();
+        bundleManifest.setBundleManifestVersion(2);
+        bundleManifest.getBundleSymbolicName().setSymbolicName(symbolicName);
+        bundleManifest.setBundleVersion(bundleVersion);
+        return bundleManifest;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/java/org/eclipse/virgo/kernel/osgi/test/RegionTests.java b/kernel/org.eclipse.virgo.kernel.test/src/test/java/org/eclipse/virgo/kernel/osgi/test/RegionTests.java
new file mode 100644
index 0000000..b225000
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/java/org/eclipse/virgo/kernel/osgi/test/RegionTests.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.osgi.test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import org.junit.Test;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+
+import org.eclipse.equinox.region.Region;
+import org.eclipse.virgo.kernel.test.AbstractKernelIntegrationTest;
+
+/**
+ */
+public class RegionTests extends AbstractKernelIntegrationTest {
+
+    @Test
+    public void testGetUserRegion() throws Exception {
+        ServiceReference<?>[] serviceReferences = lookupRegionServices("org.eclipse.virgo.region.user");
+        assertRegion(serviceReferences);
+    }
+
+    private void assertRegion(ServiceReference<?>[] serviceReferences) {
+        assertEquals(1, serviceReferences.length);
+        
+        Region userRegion = (Region) this.kernelContext.getService(serviceReferences[0]);
+        assertNotNull(userRegion);
+    }
+
+    private ServiceReference<?>[] lookupRegionServices(String name) throws InvalidSyntaxException {
+        return this.kernelContext.getServiceReferences(Region.class.getName(), String.format("(org.eclipse.virgo.kernel.region.name=%s)",name));
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/java/org/eclipse/virgo/kernel/osgicommand/helper/test/ClassLoadingHelperIntegrationTests.java b/kernel/org.eclipse.virgo.kernel.test/src/test/java/org/eclipse/virgo/kernel/osgicommand/helper/test/ClassLoadingHelperIntegrationTests.java
new file mode 100644
index 0000000..8072e3d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/java/org/eclipse/virgo/kernel/osgicommand/helper/test/ClassLoadingHelperIntegrationTests.java
@@ -0,0 +1,171 @@
+/*******************************************************************************

+ * Copyright (c) 2010 SAP AG

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ *

+ * Contributors:

+ *   Hristo Iliev, SAP AG - initial contribution

+ *******************************************************************************/

+package org.eclipse.virgo.kernel.osgicommand.helper.test;

+

+import static org.junit.Assert.assertFalse;

+import static org.junit.Assert.assertNotNull;

+import static org.junit.Assert.assertNull;

+import static org.junit.Assert.assertTrue;

+

+import java.util.Arrays;

+import java.util.List;

+import java.util.Map;

+

+import org.eclipse.virgo.shell.osgicommand.helper.ClassLoadingHelper;

+import org.eclipse.virgo.kernel.test.AbstractKernelIntegrationTest;

+import org.eclipse.virgo.test.framework.dmkernel.DmKernelTestRunner;

+import org.junit.Before;

+import org.junit.Test;

+import org.junit.runner.RunWith;

+import org.osgi.framework.Bundle;

+import org.osgi.framework.BundleContext;

+

+/**

+ * Class for integration testing {@link org.eclipse.virgo.shell.osgicommand.helper.ClassLoadingHelper}

+ */

+@RunWith(DmKernelTestRunner.class)

+public class ClassLoadingHelperIntegrationTests extends AbstractKernelIntegrationTest {

+    private static final String SHELL_COMMANDS_BUNDLE_NAME = "org.eclipse.virgo.shell.command";

+    private static final String CLASSLOADING_PACKAGE = "org.eclipse.virgo.shell.osgicommand.helper";

+

+    private static final String TEST_CLASS_NAME = ClassLoadingHelperIntegrationTests.class.getName();

+    private static final String TEST_CLASS_PACKAGE = ClassLoadingHelperIntegrationTests.class.getPackage().getName();

+

+    private static final String TEST_CLASS_NAME_PATH = TEST_CLASS_NAME.replace(".", "/");

+

+    private final String FRAMEWORK_CLASS_PACKAGE = BundleContext.class.getPackage().getName();

+    private final String FRAMEWORK_CLASS_NAME = BundleContext.class.getName();

+

+    private Bundle currentBundle = null;

+    private Bundle shellCommandsBundle = null;

+    private Bundle systemBundle = null;

+

+    private final String UNEXPORTED_ERROR_MESSAGE = "Package [%s] is reported as exported by [%s] with id [%s], but it is not";

+    private final String EXPORTED_ERROR_MESSAGE = "Package [%s] is reported as not exported by [%s] with id [%s], but it is";

+    private final String LOADED = "Class [%s] was loaded by by bundle [%s] with id [%s], but it should be available only in [%s]";

+    private final String NOT_LOADED = "Class [%s] was not loaded from bundle [%s] with id [%s]";

+

+    @Before

+    public void setUp() throws Exception {

+        // execute initialization code

+        super.setup();

+

+        for (Bundle bundle : context.getBundles()) {

+            if (SHELL_COMMANDS_BUNDLE_NAME.equals(bundle.getSymbolicName())) {

+               this.shellCommandsBundle = bundle; 

+            }

+        }

+        

+        assertNotNull("No bundles with symbolic name [" + SHELL_COMMANDS_BUNDLE_NAME + "] found in bundles " + Arrays.toString(context.getBundles()),

+                      this.shellCommandsBundle);

+

+        // get this bundle

+        this.currentBundle = context.getBundle();

+

+        // get the system bundle

+        this.systemBundle = context.getBundle(0);

+    }

+

+    @Test

+    public void testIsPackageExportedMethod() throws Exception {

+        // Check which bundles export CLASSLOADING_PACKAGE

+        assertTrue(String.format(EXPORTED_ERROR_MESSAGE, CLASSLOADING_PACKAGE, SHELL_COMMANDS_BUNDLE_NAME, shellCommandsBundle.getBundleId()),

+                   ClassLoadingHelper.isPackageExported(context, CLASSLOADING_PACKAGE, shellCommandsBundle));

+        assertFalse(String.format(UNEXPORTED_ERROR_MESSAGE, CLASSLOADING_PACKAGE, currentBundle.getSymbolicName(), currentBundle.getBundleId()),

+                    ClassLoadingHelper.isPackageExported(context, CLASSLOADING_PACKAGE, currentBundle));

+        assertFalse(String.format(UNEXPORTED_ERROR_MESSAGE, CLASSLOADING_PACKAGE, systemBundle.getSymbolicName(), systemBundle.getBundleId()),

+                    ClassLoadingHelper.isPackageExported(context, CLASSLOADING_PACKAGE, systemBundle));

+

+        // Check which bundles export CLASSLOADING_TEST_PACKAGE

+        assertFalse(String.format(UNEXPORTED_ERROR_MESSAGE, TEST_CLASS_PACKAGE, SHELL_COMMANDS_BUNDLE_NAME, shellCommandsBundle.getBundleId()),

+                    ClassLoadingHelper.isPackageExported(context, TEST_CLASS_PACKAGE, shellCommandsBundle));

+        assertTrue(String.format(EXPORTED_ERROR_MESSAGE, TEST_CLASS_PACKAGE, currentBundle.getSymbolicName(), currentBundle.getBundleId()),

+                   ClassLoadingHelper.isPackageExported(context, TEST_CLASS_PACKAGE, currentBundle));

+        assertFalse(String.format(UNEXPORTED_ERROR_MESSAGE, TEST_CLASS_PACKAGE, systemBundle.getSymbolicName(), systemBundle.getBundleId()),

+                    ClassLoadingHelper.isPackageExported(context, TEST_CLASS_PACKAGE, systemBundle));

+    }

+

+    @Test

+    public void testGetBundlesContainingResource() throws Exception {

+        final String CONTAINS_ERROR_MESSAGE = "Bundle [%s] is returned as bundle that contains the test class [%s]. The returned set of bundles is %s";

+        final String DOES_NOT_CONTAIN_ERROR_MESSAGE = "Bundle [%s] is not returned as bundle that contains the test class [%s]. The returned set of bundles is %s";

+        final String RESOURCE_NOT_FOUND = "Bundle [%s] is returned as bundle that contains the test class [%s], but the returned URLs [%s] doesn't seem to have it.";

+

+        // Check which bundles contain this class

+        Map<Bundle, List<String>> result = ClassLoadingHelper.getBundlesContainingResource(context, TEST_CLASS_NAME_PATH + ".class");

+        assertFalse(String.format(CONTAINS_ERROR_MESSAGE, SHELL_COMMANDS_BUNDLE_NAME, TEST_CLASS_NAME, Arrays.toString(result.keySet().toArray())),

+                    result.containsKey(shellCommandsBundle));

+        assertTrue(String.format(DOES_NOT_CONTAIN_ERROR_MESSAGE, currentBundle.getSymbolicName(), TEST_CLASS_NAME, Arrays.toString(result.keySet().toArray())),

+                   result.containsKey(currentBundle));

+

+        // Check the resources contained in the bundles

+        assertTrue(String.format(RESOURCE_NOT_FOUND, currentBundle.getSymbolicName(), TEST_CLASS_NAME, result.toString().contains(TEST_CLASS_NAME_PATH)),

+                   result.toString().contains(TEST_CLASS_NAME_PATH));

+    }

+

+    @Test

+    public void testGetBundlesLoadingClassMethod() throws Exception {

+        final String CAN_LOAD_ERROR_MESSAGE = "Bundle [%s] is returned as bundle that can load the test class [%s]. The returned set of bundles is %s";

+        final String CANNOT_LOAD_ERROR_MESSAGE = "Bundle [%s] is not returned as bundle that can load the test class [%s]. The returned set of bundles is %s";

+        final String ORIGINATING_ERROR_MESSAGE = "Bundle [%s] is returned as originating bundle for class [%s]. The returned set of bundles is %s";

+        final String NON_ORIGINATING_ERROR_MESSAGE = "Bundle [%s] is not returned as originating bundle for class [%s]. The returned set of bundles is %s";

+

+        // Check which bundles can load this class

+        Map<Bundle, Bundle> result = ClassLoadingHelper.getBundlesLoadingClass(context, TEST_CLASS_NAME);

+        assertFalse(String.format(CAN_LOAD_ERROR_MESSAGE, SHELL_COMMANDS_BUNDLE_NAME, TEST_CLASS_NAME, Arrays.toString(result.keySet().toArray())),

+                    result.containsKey(shellCommandsBundle));

+        assertFalse(String.format(ORIGINATING_ERROR_MESSAGE, SHELL_COMMANDS_BUNDLE_NAME, TEST_CLASS_NAME, Arrays.toString(result.values().toArray())),

+                    result.containsValue(shellCommandsBundle));

+        assertTrue(String.format(CANNOT_LOAD_ERROR_MESSAGE, currentBundle.getSymbolicName(), TEST_CLASS_NAME, Arrays.toString(result.keySet().toArray())),

+                   result.containsKey(currentBundle));

+        assertTrue(String.format(NON_ORIGINATING_ERROR_MESSAGE, currentBundle.getSymbolicName(), TEST_CLASS_NAME, Arrays.toString(result.values().toArray())),

+                   result.containsValue(currentBundle));

+

+        // Check how osgicommand bundle can load BundleContext

+        result = ClassLoadingHelper.getBundlesLoadingClass(context, FRAMEWORK_CLASS_NAME, SHELL_COMMANDS_BUNDLE_NAME);

+        assertTrue(String.format(CANNOT_LOAD_ERROR_MESSAGE, SHELL_COMMANDS_BUNDLE_NAME, FRAMEWORK_CLASS_NAME, Arrays.toString(result.keySet().toArray())),

+                   result.containsKey(shellCommandsBundle));

+        assertTrue(String.format(NON_ORIGINATING_ERROR_MESSAGE, systemBundle.getSymbolicName(), FRAMEWORK_CLASS_NAME, Arrays.toString(result.values().toArray())),

+                   result.containsValue(systemBundle));

+    }

+

+    @Test

+    public void testTryToLoadClassMethod() throws Exception {

+        assertNotNull(String.format(NOT_LOADED, TEST_CLASS_NAME, currentBundle.getSymbolicName(), currentBundle.getBundleId()),

+                      ClassLoadingHelper.tryToLoadClass(TEST_CLASS_NAME, currentBundle));

+        assertNull(String.format(LOADED, TEST_CLASS_NAME, SHELL_COMMANDS_BUNDLE_NAME, shellCommandsBundle.getBundleId(), currentBundle.getSymbolicName()),

+                   ClassLoadingHelper.tryToLoadClass(TEST_CLASS_NAME, shellCommandsBundle));

+    }

+

+    @Test

+    public void testExportAndLoad() throws Exception {

+        // Check TEST_CLASS_* export and load

+        assertFalse(String.format(UNEXPORTED_ERROR_MESSAGE, TEST_CLASS_PACKAGE, shellCommandsBundle.getSymbolicName(), shellCommandsBundle.getBundleId()),

+                    ClassLoadingHelper.isPackageExported(context, TEST_CLASS_PACKAGE, shellCommandsBundle));

+        assertNull(String.format(LOADED, TEST_CLASS_NAME, SHELL_COMMANDS_BUNDLE_NAME, shellCommandsBundle.getBundleId(), SHELL_COMMANDS_BUNDLE_NAME),

+                   ClassLoadingHelper.tryToLoadClass(TEST_CLASS_NAME, shellCommandsBundle));

+        assertTrue(String.format(EXPORTED_ERROR_MESSAGE, TEST_CLASS_PACKAGE, currentBundle.getSymbolicName(), currentBundle.getBundleId()),

+                   ClassLoadingHelper.isPackageExported(context, TEST_CLASS_PACKAGE, currentBundle));

+        assertNotNull(String.format(NOT_LOADED, TEST_CLASS_NAME, currentBundle.getSymbolicName(), currentBundle.getBundleId()),

+                      ClassLoadingHelper.tryToLoadClass(TEST_CLASS_NAME, currentBundle));

+

+        // Check FRAMEWORK_CLASS_* export and load

+        assertFalse(String.format(UNEXPORTED_ERROR_MESSAGE, FRAMEWORK_CLASS_PACKAGE, currentBundle.getSymbolicName(), currentBundle.getBundleId()),

+                    ClassLoadingHelper.isPackageExported(context, FRAMEWORK_CLASS_PACKAGE, currentBundle));

+        assertNotNull(String.format(NOT_LOADED, FRAMEWORK_CLASS_NAME, currentBundle.getSymbolicName(), currentBundle.getBundleId()),

+                      ClassLoadingHelper.tryToLoadClass(FRAMEWORK_CLASS_NAME, currentBundle));

+        assertTrue(String.format(EXPORTED_ERROR_MESSAGE, FRAMEWORK_CLASS_PACKAGE, systemBundle.getSymbolicName(), systemBundle.getBundleId()),

+                   ClassLoadingHelper.isPackageExported(context, FRAMEWORK_CLASS_PACKAGE, systemBundle));

+        assertNotNull(String.format(NOT_LOADED, FRAMEWORK_CLASS_NAME, currentBundle.getSymbolicName(), currentBundle.getBundleId()),

+                      ClassLoadingHelper.tryToLoadClass(FRAMEWORK_CLASS_NAME, systemBundle));

+    }

+}

+

diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/java/org/eclipse/virgo/kernel/osgicommand/management/test/ClassLoadingSupportMBeanTests.java b/kernel/org.eclipse.virgo.kernel.test/src/test/java/org/eclipse/virgo/kernel/osgicommand/management/test/ClassLoadingSupportMBeanTests.java
new file mode 100644
index 0000000..4833ff8
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/java/org/eclipse/virgo/kernel/osgicommand/management/test/ClassLoadingSupportMBeanTests.java
@@ -0,0 +1,119 @@
+/*******************************************************************************

+ * Copyright (c) 2011 SAP AG

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ *

+ * Contributors:

+ *    Hristo Iliev, SAP AG - initial contribution

+ ******************************************************************************/

+

+package org.eclipse.virgo.kernel.osgicommand.management.test;

+

+import org.eclipse.virgo.kernel.test.AbstractKernelIntegrationTest;

+import org.junit.Test;

+

+import javax.management.JMException;

+import javax.management.MBeanServer;

+import javax.management.ObjectName;

+import java.lang.management.ManagementFactory;

+import java.util.List;

+import java.util.Map;

+import java.util.Set;

+

+import static org.junit.Assert.assertEquals;

+import static org.junit.Assert.assertTrue;

+

+/**

+ * Test for testing Class loading support mBean

+ */

+public class ClassLoadingSupportMBeanTests extends AbstractKernelIntegrationTest {

+

+    private final MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();

+

+    private final ObjectName objectName;

+    {

+        try {

+            objectName = new ObjectName("org.eclipse.virgo.kernel:type=Classloading");

+        } catch (JMException jme) {

+            throw new RuntimeException(jme);

+        }

+    }

+

+    private static final String CLASS_NAME = ClassLoadingSupportMBeanTests.class.getName();

+    private static final String PACKAGE_NAME = ClassLoadingSupportMBeanTests.class.getPackage().getName();

+

+    private static final String CLASS_NAME_PATH = CLASS_NAME.replace(".", "/") + ".class";

+

+    private static final String SYSTEM_PACKAGE_NAME = "org.osgi.framework";

+

+

+    @Test

+    @SuppressWarnings("unchecked")

+    public void testGetBundlesContainingResource() throws JMException {

+        Map<List<String>, List<String>> result = (Map<List<String>, List<String>>) mBeanServer.invoke(objectName, "getBundlesContainingResource",

+                                                                                                      new Object[]{CLASS_NAME_PATH},

+                                                                                                      new String[]{String.class.getName()});

+        assertEquals("Incorrect number of bundles " + result + " contain the test class [" + CLASS_NAME_PATH + "]", 1, result.size());

+        assertTrue("Bundles " + result + " do not contain class [" + CLASS_NAME_PATH + "]",

+                   containsBundleSymbolicName(result.keySet(), super.context.getBundle().getSymbolicName()));

+        assertTrue("Bundle " + super.context.getBundle().getSymbolicName() + " does not contain resource [" + CLASS_NAME_PATH + "]",

+                   result.toString().contains(CLASS_NAME_PATH));

+    }

+

+    @Test

+    @SuppressWarnings("unchecked")

+    public void testGetBundlesLoadingClass() throws JMException {

+        Map<List<String>, List<String>> result = (Map<List<String>, List<String>>) mBeanServer.invoke(objectName, "getBundlesLoadingClass",

+                                                                                                      new Object[]{CLASS_NAME},

+                                                                                                      new String[]{String.class.getName()});

+        assertEquals("Incorrect number of bundles " + result + " can load the test class [" + CLASS_NAME + "]", 2, result.size());

+        assertTrue("Bundles " + result + " do not contain class [" + CLASS_NAME + "]",

+                   containsBundleSymbolicName(result.keySet(), super.context.getBundle().getSymbolicName()));

+    }

+

+    @Test

+    @SuppressWarnings("unchecked")

+    public void testGetBundlesExportingPackage() throws JMException {

+        List<List<String>> result = (List<List<String>>) mBeanServer.invoke(objectName, "getBundlesExportingPackage",

+                                                                            new Object[]{SYSTEM_PACKAGE_NAME},

+                                                                            new String[]{String.class.getName()});

+        assertEquals("No bundle " + result + " exports the test package [" + SYSTEM_PACKAGE_NAME + "]", 1, result.size());

+        assertEquals("System bundle [[" + result.get(0).get(0) + "] [" + result.get(0).get(1) + "]] does not contain test package [" + SYSTEM_PACKAGE_NAME + "]",

+                     "0", result.get(0).get(0));

+

+        result = (List<List<String>>) mBeanServer.invoke(objectName, "getBundlesExportingPackage",

+                                                         new Object[]{PACKAGE_NAME},

+                                                         new String[]{String.class.getName()});

+        assertEquals("At least one bundle " + result + " exports the test package [" + PACKAGE_NAME + "]", 0, result.size());

+    }

+

+    @Test

+    public void testTryToLoadClassFromBundleWithId() throws JMException {

+        long firstUserRegionBundleId = super.context.getBundles()[0].getBundleId();

+        String firstUserRegionBundleSN = super.context.getBundles()[0].getSymbolicName();

+

+        long testBundleId = super.context.getBundle().getBundleId();

+

+        boolean result = (Boolean) mBeanServer.invoke(objectName, "tryToLoadClassFromBundle",

+                                                      new Object[]{CLASS_NAME, testBundleId},

+                                                      new String[]{String.class.getName(), long.class.getName()});

+        assertTrue("This test bundle [" + testBundleId + "] cannot load [" + CLASS_NAME + "]", result);

+

+        result = (Boolean) mBeanServer.invoke(objectName, "tryToLoadClassFromBundle",

+                                              new Object[]{CLASS_NAME, firstUserRegionBundleId},

+                                              new String[]{String.class.getName(), long.class.getName()});

+        assertTrue("Bundle with ID [" + firstUserRegionBundleId + "] and symbolic name [" + firstUserRegionBundleSN +

+                   "] can load [" + CLASS_NAME + "]", result);

+    }

+

+    private boolean containsBundleSymbolicName(Set<List<String>> set, String bundleSymbolicName) {

+        for (List<String> bundleInformation : set) {

+            if (bundleInformation.get(1).equals(bundleSymbolicName)) {

+                return true;

+            }

+        }

+        return false;

+    }

+}

diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/java/org/eclipse/virgo/kernel/test/AbstractKernelIntegrationTest.java b/kernel/org.eclipse.virgo.kernel.test/src/test/java/org/eclipse/virgo/kernel/test/AbstractKernelIntegrationTest.java
new file mode 100644
index 0000000..d52a11f
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/java/org/eclipse/virgo/kernel/test/AbstractKernelIntegrationTest.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.test;
+
+import java.lang.management.ManagementFactory;
+
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+
+import org.eclipse.virgo.kernel.osgi.framework.OsgiFramework;
+import org.eclipse.virgo.test.framework.dmkernel.DmKernelTestRunner;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.runner.RunWith;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.ServiceReference;
+
+@RunWith(DmKernelTestRunner.class)
+public abstract class AbstractKernelIntegrationTest {
+    
+    protected volatile BundleContext kernelContext;
+   
+    protected volatile BundleContext context = FrameworkUtil.getBundle(AbstractKernelIntegrationTest.class).getBundleContext();
+
+    protected volatile OsgiFramework framework;
+
+    @Before
+    public void setup() {
+        ServiceReference<OsgiFramework> serviceReference = this.context.getServiceReference(OsgiFramework.class);
+        if (serviceReference != null) {
+            this.framework = this.context.getService(serviceReference);
+        }
+        
+        this.kernelContext = getKernelContext();
+    }
+
+    private BundleContext getKernelContext() {
+        return this.context.getBundle(0L).getBundleContext();
+    }
+
+    @BeforeClass
+    public static void awaitKernelStartup() throws Exception {
+    	MBeanServer platformMBeanServer = ManagementFactory.getPlatformMBeanServer();
+    	while (!"STARTED".equals(platformMBeanServer.getAttribute(new ObjectName("org.eclipse.virgo.kernel:type=KernelStatus"), "Status"))) {
+    		Thread.sleep(50);
+    	}
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/java/org/eclipse/virgo/kernel/test/ManifestUtils.java b/kernel/org.eclipse.virgo.kernel.test/src/test/java/org/eclipse/virgo/kernel/test/ManifestUtils.java
new file mode 100644
index 0000000..056950b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/java/org/eclipse/virgo/kernel/test/ManifestUtils.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.test;
+
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+
+import org.eclipse.virgo.util.io.FileCopyUtils;
+
+/**
+ * Utility class for extracting a {@link Reader} for manifest data in a JAR file and in exploded JAR directories.
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.
+ * 
+ */
+public final class ManifestUtils {
+
+    private static final String MANIFEST_DIRECTORY_LOCATION = "META-INF" + File.separator + "MANIFEST.MF";
+
+    private static final String MANIFEST_ENTRY = "META-INF/MANIFEST.MF";
+
+    /**
+     * Creates a {@link Reader} for the manifest in the supplied exploded JAR directory.
+     * 
+     * @param directory the exploded JAR directory.
+     * @return the <code>Reader</code> or <code>null</code> if the manifest cannot be found.
+     */
+    public static final Reader manifestReaderFromExplodedDirectory(File directory) {
+        if (directory == null || !directory.isDirectory()) {
+            throw new IllegalArgumentException("Must supply a valid directory");
+        }
+        try {
+            File manifestFile = new File(directory.getAbsolutePath() + File.separator + MANIFEST_DIRECTORY_LOCATION);
+            if (manifestFile.exists()) {
+                return new FileReader(manifestFile);
+            } else {
+                return null;
+            }
+        } catch (IOException e) {
+            throw new RuntimeException("Unable to read MANIFEST for exploded directory '" + directory.getAbsolutePath() + "'.", e);
+        }
+    }
+
+    /**
+     * Creates a {@link Reader} for the manifest in the supplied JAR file.
+     * 
+     * @param file the JAR file.
+     * @return the <code>Reader</code> or <code>null</code> if the manifest cannot be found.
+     */
+    public static final Reader manifestReaderFromJar(File file) {
+        JarFile jar = null;
+        try {
+            jar = new JarFile(file);
+            JarEntry entry = jar.getJarEntry(MANIFEST_ENTRY);
+            if (entry != null) {
+                StringWriter writer = new StringWriter();
+                FileCopyUtils.copy(new InputStreamReader(jar.getInputStream(entry)), writer);
+                jar.close();
+                return new StringReader(writer.toString());
+            } else {
+                return null;
+            }
+        } catch (Exception e) {
+            throw new RuntimeException("Cannot read MANIFEST.MF from jar '" + file.getAbsolutePath() + "'.", e);
+        } finally {
+            if (jar != null) {
+                try {
+                    jar.close();
+                } catch (IOException ioe) {
+                    throw new RuntimeException("Failed to close jar '" + file.getAbsolutePath() + "'.", ioe);
+                }
+            }
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/java/org/eclipse/virgo/kernel/test/ServiceUtilsTests.java b/kernel/org.eclipse.virgo.kernel.test/src/test/java/org/eclipse/virgo/kernel/test/ServiceUtilsTests.java
new file mode 100644
index 0000000..69acae7
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/java/org/eclipse/virgo/kernel/test/ServiceUtilsTests.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2012 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.test;
+
+import static org.eclipse.virgo.kernel.osgi.framework.ServiceUtils.getPotentiallyDelayedService;
+import static org.eclipse.virgo.kernel.osgi.framework.ServiceUtils.getWaitLimitSeconds;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import org.eclipse.virgo.nano.deployer.api.core.ApplicationDeployer;
+import org.junit.Test;
+
+
+/**
+ */
+public class ServiceUtilsTests extends AbstractKernelIntegrationTest {
+
+    @Test
+    public void testServiceUtils() throws Exception {
+        ApplicationDeployer service = getPotentiallyDelayedService(context, ApplicationDeployer.class);
+        assertNotNull("Application deployer service was not present", service);
+        assertEquals(181,getWaitLimitSeconds());
+        
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/java/org/eclipse/virgo/kernel/test/StandardBundleStarterSignallingTests.java b/kernel/org.eclipse.virgo.kernel.test/src/test/java/org/eclipse/virgo/kernel/test/StandardBundleStarterSignallingTests.java
new file mode 100644
index 0000000..303519a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/java/org/eclipse/virgo/kernel/test/StandardBundleStarterSignallingTests.java
@@ -0,0 +1,326 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.test;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+
+import org.eclipse.virgo.nano.core.AbortableSignal;
+import org.eclipse.virgo.nano.core.BundleStarter;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.ServiceReference;
+
+/**
+ */
+public class StandardBundleStarterSignallingTests extends AbstractKernelIntegrationTest {
+
+    private BundleStarter monitor;
+
+    @Before
+    public void before() {
+        ServiceReference<BundleStarter> serviceReference = this.kernelContext.getServiceReference(BundleStarter.class);
+        this.monitor = this.kernelContext.getService(serviceReference);
+        assertNotNull(this.monitor);    
+    }
+
+    @Test
+    public void signalSuccess() throws Exception {
+        Bundle bundle = installBundle(new File("src/test/resources/monitor/success"));
+        assertNotNull(bundle);        
+        TestSignal ts = new TestSignal();
+        this.monitor.start(bundle, ts);
+        while (!ts.isComplete()) {
+            Thread.sleep(100);
+        }
+        assertFalse(ts.isAborted());
+        assertNull(ts.getCause());
+    }
+
+    @Test
+    public void signalSuccessAwait() throws Exception {
+        Bundle bundle = installBundle(new File("src/test/resources/monitor/success"));
+        assertNotNull(bundle);        
+        bundle.start();
+        TestSignal ts = new TestSignal();
+        this.monitor.start(bundle, ts);
+        while (!ts.isComplete()) {
+            Thread.sleep(100);
+        }
+        assertFalse(ts.isAborted());
+        assertNull(ts.getCause());
+    }
+
+    @Test
+    public void signalFailure() throws Exception {
+        Bundle bundle = installBundle(new File("src/test/resources/monitor/failure"));
+        assertNotNull(bundle);        
+        TestSignal ts = new TestSignal();
+        this.monitor.start(bundle, ts);
+        while (!ts.isComplete()) {
+            Thread.sleep(100);
+        }
+        assertFalse(ts.isAborted());
+        assertNotNull(ts.getCause());
+    }
+
+    @Test
+    public void signalAbort() throws Exception {
+        Bundle bundle = installBundle(new File("src/test/resources/monitor/abort"));
+        assertNotNull(bundle);        
+        TestSignal ts = new TestSignal();
+        this.monitor.start(bundle, ts);
+        Thread.sleep(100);
+        bundle.stop();
+        while (!ts.isComplete()) {
+            Thread.sleep(100);
+        }
+        assertNull(ts.getCause());
+        assertTrue(ts.isAborted());
+    }
+
+    @Test
+    public void signalNonDm() throws Exception {
+        Bundle bundle = installBundle(new File("src/test/resources/monitor/nondm"));
+        assertNotNull(bundle);     
+        TestSignal ts = new TestSignal();
+        this.monitor.start(bundle, ts);
+        waitForComplete(ts, 1000);
+        assertTrue(ts.isComplete());
+        assertFalse(ts.isAborted());
+        assertNull(ts.getCause());
+    }
+
+    private void waitForComplete(TestSignal ts, long millisTotal) {
+        long countWaits = millisTotal/100;
+        if (countWaits > 0) {
+            while (!ts.isComplete()){
+                if (countWaits-- == 0) break;
+                try {
+                    Thread.sleep(100);
+                } catch (InterruptedException e) {
+                    continue;
+                }
+            }
+        }
+    }
+    
+    @Test
+    public void signalSuccessMultiple() throws Exception {
+        Bundle bundle = installBundle(new File("src/test/resources/monitor/success"));
+        assertNotNull(bundle);        
+        TestSignal ts1 = new TestSignal();
+        TestSignal ts2 = new TestSignal();
+        this.monitor.start(bundle, ts1);
+        this.monitor.start(bundle, ts2);
+        while (!ts1.isComplete()) {
+            Thread.sleep(100);
+        }
+        while(!ts2.isComplete()) {
+            Thread.sleep(100);
+        }
+        assertNull(ts1.getCause());
+        assertNull(ts2.getCause());
+    }
+    
+    @Test
+    public void signalSuccessMultipleWithGap() throws Exception {
+        Bundle bundle = installBundle(new File("src/test/resources/monitor/success"));
+        assertNotNull(bundle);        
+        TestSignal ts1 = new TestSignal();
+        this.monitor.start(bundle, ts1);
+        while (!ts1.isComplete()) {
+            Thread.sleep(100);
+        }
+        TestSignal ts2 = new TestSignal();
+        this.monitor.start(bundle, ts2);
+        while(!ts2.isComplete()) {
+            Thread.sleep(100);
+        }
+        assertNull(ts1.getCause());
+        assertNull(ts2.getCause());
+    }
+
+    @Test
+    public void signalSuccessAwaitMultiple() throws Exception {
+        Bundle bundle = installBundle(new File("src/test/resources/monitor/success"));
+        assertNotNull(bundle);        
+        bundle.start();
+        TestSignal ts1 = new TestSignal();
+        TestSignal ts2 = new TestSignal();
+        this.monitor.start(bundle, ts1);
+        this.monitor.start(bundle, ts2);
+        while (!ts1.isComplete()) {
+            Thread.sleep(100);
+        }
+        while(!ts2.isComplete()) {
+            Thread.sleep(100);
+        }
+        assertNull(ts1.getCause());
+        assertNull(ts2.getCause());
+    }
+
+    @Test
+    public void signalFailureMultiple() throws Exception {
+        Bundle bundle = installBundle(new File("src/test/resources/monitor/failure"));
+        assertNotNull(bundle);        
+        TestSignal ts1 = new TestSignal();
+        TestSignal ts2 = new TestSignal();
+        this.monitor.start(bundle, ts1);
+        this.monitor.start(bundle, ts2);
+        while (!ts1.isComplete()) {
+            Thread.sleep(100);
+        }
+        while(!ts2.isComplete()) {
+            Thread.sleep(100);
+        }
+        assertNotNull(ts1.getCause());
+        assertNotNull(ts2.getCause());
+    }
+    
+    @Test
+    public void signalFailureMultipleWithGap() throws Exception {
+        Bundle bundle = installBundle(new File("src/test/resources/monitor/failure"));
+        assertNotNull(bundle);        
+        TestSignal ts1 = new TestSignal();
+        this.monitor.start(bundle, ts1);
+        while (!ts1.isComplete()) {
+            Thread.sleep(100);
+        }
+        TestSignal ts2 = new TestSignal();
+        this.monitor.start(bundle, ts2);
+        while(!ts2.isComplete()) {
+            Thread.sleep(100);
+        }
+        assertNotNull(ts1.getCause());
+        assertNotNull(ts2.getCause());
+    }
+
+    @Test
+    public void signalNonDmMultiple() throws Exception {
+        Bundle bundle = installBundle(new File("src/test/resources/monitor/nondm"));
+        assertNotNull(bundle);        
+        TestSignal ts1 = new TestSignal();
+        TestSignal ts2 = new TestSignal();
+        this.monitor.start(bundle, ts1);
+        this.monitor.start(bundle, ts2);
+        while(!ts1.isComplete()) {
+            Thread.sleep(100);
+        }
+        assertNull(ts1.getCause());
+        while(!ts2.isComplete()) {
+            Thread.sleep(100);
+        }
+        assertNull(ts2.getCause());
+    }
+    
+    @Test
+    public void signalDelayedSuccessMultiple() throws Exception {
+        Bundle bundle = installBundle(new File("src/test/resources/monitor/delay"));
+        assertNotNull(bundle);        
+        TestSignal ts1 = new TestSignal();
+        TestSignal ts2 = new TestSignal();
+        this.monitor.start(bundle, ts1);
+        this.monitor.start(bundle, ts2);
+        while (!ts1.isComplete()) {
+            Thread.sleep(100);
+        }
+        while(!ts2.isComplete()) {
+            Thread.sleep(100);
+        }
+        assertNull(ts1.getCause());
+        assertNull(ts2.getCause());
+    }
+    
+    @Test
+    public void signalDelayedSuccessMultipleWithGap() throws Exception {
+        Bundle bundle = installBundle(new File("src/test/resources/monitor/delay"));
+        assertNotNull(bundle);        
+        TestSignal ts1 = new TestSignal();
+        this.monitor.start(bundle, ts1);
+        while (!ts1.isComplete()) {
+            Thread.sleep(100);
+        }
+        TestSignal ts2 = new TestSignal();
+        this.monitor.start(bundle, ts2);
+        while(!ts2.isComplete()) {
+            Thread.sleep(100);
+        }
+        assertNull(ts1.getCause());
+        assertNull(ts2.getCause());
+    }
+
+    @Test
+    public void signalDelayedSuccessAwaitMultiple() throws Exception {
+        Bundle bundle = installBundle(new File("src/test/resources/monitor/delay"));
+        assertNotNull(bundle);        
+        bundle.start();
+        TestSignal ts1 = new TestSignal();
+        TestSignal ts2 = new TestSignal();
+        this.monitor.start(bundle, ts1);
+        this.monitor.start(bundle, ts2);
+        while (!ts1.isComplete()) {
+            Thread.sleep(100);
+        }
+        while(!ts2.isComplete()) {
+            Thread.sleep(100);
+        }
+        assertNull(ts1.getCause());
+        assertNull(ts2.getCause());
+    }
+    
+    private Bundle installBundle(File bundleFile) throws BundleException {
+        return this.context.installBundle(bundleFile.toURI().toString());               
+    }
+    
+    private static class TestSignal implements AbortableSignal {
+
+        private volatile boolean complete = false;
+        
+        private volatile boolean aborted = false;
+        
+        private volatile Throwable cause = null;
+
+        public void signalSuccessfulCompletion() {
+            this.complete = true;
+        }
+
+        public void signalFailure(Throwable t) {
+            this.complete = true;
+            this.cause = t;
+        }
+        
+		public void signalAborted() {
+            this.complete = true;
+            this.aborted = true;
+		}
+        
+        public boolean isComplete() {
+            return this.complete;
+        }
+        
+        public boolean isAborted() {
+            return this.aborted;
+        }
+        
+        public Throwable getCause() {
+            return this.cause;
+        }
+        
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/java/org/eclipse/virgo/kernel/test/StandardBundleStarterTests.java b/kernel/org.eclipse.virgo.kernel.test/src/test/java/org/eclipse/virgo/kernel/test/StandardBundleStarterTests.java
new file mode 100644
index 0000000..07b5f1a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/java/org/eclipse/virgo/kernel/test/StandardBundleStarterTests.java
@@ -0,0 +1,111 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.test;
+
+import static org.junit.Assert.assertNotNull;
+
+import java.io.File;
+
+import org.eclipse.virgo.nano.core.BundleStarter;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.ServiceReference;
+
+
+/**
+ */
+public class StandardBundleStarterTests extends AbstractKernelIntegrationTest {
+
+    private BundleStarter monitor;
+
+    @Before
+    public void before() {
+        ServiceReference<BundleStarter> serviceReference = this.kernelContext.getServiceReference(BundleStarter.class);
+        this.monitor = this.kernelContext.getService(serviceReference);
+        assertNotNull(this.monitor);                
+    }
+
+    @Test
+    public void success() throws Exception {
+        Bundle bundle = this.context.installBundle(new File("src/test/resources/monitor/success").toURI().toString());
+        
+        TestSignal signal = new TestSignal();
+        
+        this.monitor.start(bundle, signal);
+        
+        signal.assertSuccessfulCompletionSignalled(5000);        
+    }
+    
+    @Test
+    public void successBlueprint() throws Exception {
+        Bundle bundle = this.context.installBundle(new File("src/test/resources/monitor-blueprint/success").toURI().toString());
+        
+        TestSignal signal = new TestSignal();
+        
+        this.monitor.start(bundle, signal);
+        
+        signal.assertSuccessfulCompletionSignalled(5000);        
+    }
+
+    @Test
+    public void failure() throws Exception {
+        Bundle bundle = this.context.installBundle(new File("src/test/resources/monitor/failure").toURI().toString());
+        
+        TestSignal signal = new TestSignal();
+        
+        this.monitor.start(bundle, signal);
+        
+        signal.assertFailureSignalled(5000);
+    }
+    
+    @Test
+    public void failureBlueprint() throws Exception {
+        Bundle bundle = this.context.installBundle(new File("src/test/resources/monitor-blueprint/failure").toURI().toString());
+        
+        TestSignal signal = new TestSignal();
+        
+        this.monitor.start(bundle, signal);
+        
+        signal.assertFailureSignalled(5000);
+    }
+
+    @Test
+    public void nonDm() throws Exception {
+        Bundle bundle = this.context.installBundle(new File("src/test/resources/monitor/nondm").toURI().toString());
+        TestSignal signal = new TestSignal();
+        
+        this.monitor.start(bundle, signal);
+        
+        signal.assertSuccessfulCompletionSignalled(5000);
+    }
+    
+    @Test
+    public void signalDelayedSuccess() throws Exception {
+        Bundle bundle = this.context.installBundle(new File("src/test/resources/monitor/delay").toURI().toString());
+        TestSignal signal = new TestSignal();
+        this.monitor.start(bundle, signal);
+        
+        signal.assertSuccessfulCompletionSignalled(20000);
+        
+    }
+    
+    @Test
+    public void signalDelayedSuccessBlueprint() throws Exception {
+        Bundle bundle = this.context.installBundle(new File("src/test/resources/monitor-blueprint/delay").toURI().toString());
+        TestSignal signal = new TestSignal();
+        this.monitor.start(bundle, signal);
+        
+        signal.assertSuccessfulCompletionSignalled(20000);
+        
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/java/org/eclipse/virgo/kernel/test/StandardKernelIntegrationTests.java b/kernel/org.eclipse.virgo.kernel.test/src/test/java/org/eclipse/virgo/kernel/test/StandardKernelIntegrationTests.java
new file mode 100644
index 0000000..3f68309
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/java/org/eclipse/virgo/kernel/test/StandardKernelIntegrationTests.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.test;
+
+import static org.junit.Assert.assertNotNull;
+
+import org.eclipse.virgo.nano.deployer.api.core.ApplicationDeployer;
+import org.junit.Test;
+import org.osgi.framework.ServiceReference;
+
+
+/**
+ */
+public class StandardKernelIntegrationTests extends AbstractKernelIntegrationTest {
+
+    @Test
+    public void testRunKernelBundle() throws Exception {
+        ServiceReference<ApplicationDeployer> serviceReference = context.getServiceReference(ApplicationDeployer.class);
+        assertNotNull("Application deployer service was not present", serviceReference);
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/java/org/eclipse/virgo/kernel/test/TestSignal.java b/kernel/org.eclipse.virgo.kernel.test/src/test/java/org/eclipse/virgo/kernel/test/TestSignal.java
new file mode 100644
index 0000000..abc6064
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/java/org/eclipse/virgo/kernel/test/TestSignal.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.test;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
+
+import org.eclipse.virgo.nano.core.AbortableSignal;
+
+public final class TestSignal implements AbortableSignal {
+    
+    private final AtomicReference<Throwable> causeReference = new AtomicReference<Throwable>(null);
+    
+    private final CountDownLatch completionLatch = new CountDownLatch(1);
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void signalFailure(Throwable cause) {
+        causeReference.set(cause);
+        completionLatch.countDown();
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void signalSuccessfulCompletion() {
+        completionLatch.countDown();
+    }
+
+	public void signalAborted() {
+        completionLatch.countDown();
+	}  
+    
+    public void assertSuccessfulCompletionSignalled(long msTimeout) throws InterruptedException {
+        assertTrue(completionLatch.await(msTimeout, TimeUnit.MILLISECONDS));
+        assertNull(causeReference.get());
+    }
+    
+    public void assertFailureSignalled(long msTimeout) throws InterruptedException {
+        assertTrue(completionLatch.await(msTimeout, TimeUnit.MILLISECONDS));
+        assertNotNull(causeReference.get());
+    }
+
+	public void assertsignalAborted(long msTimeout) throws InterruptedException {
+        assertTrue(completionLatch.await(msTimeout, TimeUnit.MILLISECONDS));
+        assertNull(causeReference.get());
+	}      
+}
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/resources/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..e94e520
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,32 @@
+Manifest-Version: 1.0

+Export-Package: org.eclipse.virgo.kernel.concurrent.test;version="3.0.

+ 0";uses:="org.eclipse.virgo.nano.core,org.eclipse.virgo.kernel.test

+ ,org.junit",org.eclipse.virgo.kernel.dm.test;version="3.0.0";uses:="o

+ rg.eclipse.virgo.kernel.test,org.junit",org.eclipse.virgo.kernel.ffdc

+ .test;version="3.0.0";uses:="org.eclipse.virgo.kernel.test,org.junit"

+ ,org.eclipse.virgo.kernel.osgi.test;version="3.0.0";uses:="org.eclips

+ e.virgo.kernel.test,org.junit",org.eclipse.virgo.kernel.osgicommand.h

+ elper.test;version="3.0.0";uses:="org.eclipse.virgo.kernel.test,org.j

+ unit,org.junit.runner",org.eclipse.virgo.kernel.test;version="3.0.0";

+ uses:="org.eclipse.virgo.nano.core,org.junit,org.junit.runner"

+Bundle-ClassPath: .,quasi/simpleexporter.jar,quasi/simpleimporter.jar,

+ QuickConsumer.jar,SlowService.jar,quasi/simpleexporter.jar,quasi/simp

+ leimporter.jar,QuickConsumer.jar,SlowService.jar

+Bundle-Version: 3.0.0

+Tool: Bundlor 1.0.0.RELEASE

+Bundle-Name: Virgo Kernel Test

+Bundle-ManifestVersion: 2

+Bundle-SymbolicName: org.eclipse.virgo.kernel.test

+Import-Package: javax.management;version="0",org.eclipse.virgo.nano.co

+ re;version="[3.0.0,4)",org.eclipse.virgo.nano.deployer.api.core;versi

+ on="[3.0.0,4)",org.eclipse.virgo.kernel.osgi.framework;version="[3.0.

+ 0,4)",org.eclipse.virgo.kernel.osgi.quasi;version="[3.0.0,4)",org.ecl

+ ipse.equinox.region;version="1",org.eclipse.virgo.shell.osgicommand.h

+ elper;version="[3.0.0,4)",org.eclipse.virgo.util.io;version="[3.0.0,4

+ )",org.eclipse.virgo.util.osgi.manifest;version="[3.0.0,4)",org.junit

+ ;version="[4.7.0,5)",org.junit.runner;version="[4.7.0,5)",org.osgi.fr

+ amework;version="0",org.springframework.context;version="[2.5.6,4.1)"

+ ,org.springframework.jmx.export;version="[2.5.6,4.1)",org.eclipse.gem

+ ini.blueprint.context.support;version="[1.0.0.RELEASE,2.1)",org.eclip

+ se.gemini.blueprint.service.importer.support;version="[1.0.0.RELEASE,

+ 2.1)"

diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/resources/META-INF/java-profile/java-server.profile b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/META-INF/java-profile/java-server.profile
new file mode 100644
index 0000000..c0c2236
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/META-INF/java-profile/java-server.profile
@@ -0,0 +1,213 @@
+org.osgi.framework.system.packages = \
+ javax.accessibility,\
+ javax.activation,\
+ javax.activation;version="1.1.1",\
+ javax.activity,\
+ javax.annotation,\
+ javax.annotation;version="1.0.0",\
+ javax.annotation;version="1.1.0",\
+ 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;version="2.0",\
+ javax.jws.soap,\
+ javax.jws.soap;version="2.0",\
+ 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.script;version="1.1",\
+ 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;version="1.0.1",\
+ javax.transaction;version="1.1.0",\
+ javax.transaction.xa,\
+ javax.transaction.xa;version="1.0.1",\
+ javax.transaction.xa;version="1.1.0",\
+ javax.xml,\
+ javax.xml;version="1.0.1",\
+ javax.xml.bind,\
+ javax.xml.bind;version="2.0",\
+ javax.xml.bind.annotation,\
+ javax.xml.bind.annotation;version="2.0",\
+ javax.xml.bind.annotation.adapters,\
+ javax.xml.bind.annotation.adapters;version="2.0",\
+ javax.xml.bind.attachment,\
+ javax.xml.bind.attachment;version="2.0",\
+ javax.xml.bind.helpers,\
+ javax.xml.bind.helpers;version="2.0",\
+ javax.xml.bind.util,\
+ javax.xml.bind.util;version="2.0",\
+ javax.xml.crypto,\
+ javax.xml.crypto;version="1.0",\
+ javax.xml.crypto.dom,\
+ javax.xml.crypto.dom;version="1.0",\
+ javax.xml.crypto.dsig,\
+ javax.xml.crypto.dsig;version="1.0",\
+ javax.xml.crypto.dsig.dom,\
+ javax.xml.crypto.dsig.dom;version="1.0",\
+ javax.xml.crypto.dsig.keyinfo,\
+ javax.xml.crypto.dsig.keyinfo;version="1.0",\
+ javax.xml.crypto.dsig.spec,\
+ javax.xml.crypto.dsig.spec;version="1.0",\
+ javax.xml.datatype,\
+ javax.xml.namespace,\
+ javax.xml.parsers,\
+ javax.xml.soap,\
+ javax.xml.soap;version="1.3.0",\
+ javax.xml.stream,\
+ javax.xml.stream;version="1.0.1",\
+ javax.xml.stream.events,\
+ javax.xml.stream.events;version="1.0.1",\
+ javax.xml.stream.util,\
+ javax.xml.stream.util;version="1.0.1",\
+ 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;version="2.1.1",\
+ javax.xml.ws.handler,\
+ javax.xml.ws.handler;version="2.1.1",\
+ javax.xml.ws.handler.soap,\
+ javax.xml.ws.handler.soap;version="2.1.1",\
+ javax.xml.ws.http,\
+ javax.xml.ws.http;version="2.1.1",\
+ javax.xml.ws.soap,\
+ javax.xml.ws.soap;version="2.1.1",\
+ javax.xml.ws.spi,\
+ javax.xml.ws.spi;version="2.1.1",\
+ javax.xml.ws.wsaddressing;version="2.1.1",\
+ javax.xml.xpath,\
+ org.eclipse.virgo.kernel.equinox.extensions,\
+ org.eclipse.virgo.kernel.equinox.extensions;version="3.7.0",\
+ org.eclipse.virgo.kernel.equinox.extensions.hooks,\
+ org.eclipse.virgo.kernel.equinox.extensions.hooks;version="3.7.0",\
+ 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.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
+org.osgi.framework.bootdelegation = \
+ org.eclipse.virgo.nano.authentication,\
+ com.sun.*,\
+ javax.xml.*,\
+ org.apache.xerces.jaxp.*,\
+ org.w3c.*,\
+ org.xml.*,\
+ sun.*
+org.osgi.framework.executionenvironment = \
+ OSGi/Minimum-1.0,\
+ OSGi/Minimum-1.1,\
+ J2SE-1.2,\
+ J2SE-1.3,\
+ J2SE-1.4,\
+ J2SE-1.5,\
+ JavaSE-1.6,\
+ JavaSE-1.7
+osgi.java.profile.name = Virgo-Java7
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/resources/META-INF/test.config.properties b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/META-INF/test.config.properties
new file mode 100644
index 0000000..a5a34c1
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/META-INF/test.config.properties
@@ -0,0 +1,83 @@
+launcher.bundles =\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.eclipse.equinox.region/${org.eclipse.equinox.region}/org.eclipse.equinox.region-${org.eclipse.equinox.region}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.slf4j.api/${org.slf4j.api}/org.slf4j.api-${org.slf4j.api}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.slf4j.jul/${org.slf4j.jul}/org.slf4j.jul-${org.slf4j.jul}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.slf4j.jcl/${org.slf4j.jcl}/org.slf4j.jcl-${org.slf4j.jcl}.jar@start,\
+ file:${ivy.cache}/repository/org.aspectj/com.springsource.org.aspectj.runtime/${org.aspectj}/com.springsource.org.aspectj.runtime-${org.aspectj}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.medic/org.eclipse.virgo.medic/${org.eclipse.virgo.medic}/org.eclipse.virgo.medic-${org.eclipse.virgo.medic}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.medic/org.eclipse.virgo.medic.logbackcorefragment/${org.eclipse.virgo.medic}/org.eclipse.virgo.medic.logbackcorefragment-${org.eclipse.virgo.medic}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.medic/org.eclipse.virgo.medic.logbackclassicfragment/${org.eclipse.virgo.medic}/org.eclipse.virgo.medic.logbackclassicfragment-${org.eclipse.virgo.medic}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/ch.qos.logback.core/${ch.qos.logback.core}/ch.qos.logback.core-${ch.qos.logback.core}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/ch.qos.logback.classic/${ch.qos.logback.classic}/ch.qos.logback.classic-${ch.qos.logback.classic}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/ch.qos.logback.slf4j/${ch.qos.logback.slf4j}/ch.qos.logback.slf4j-${ch.qos.logback.slf4j}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.eclipse.osgi.services/${org.eclipse.osgi.services}/org.eclipse.osgi.services-${org.eclipse.osgi.services}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.eclipse.equinox.cm/${org.eclipse.equinox.cm}/org.eclipse.equinox.cm-${org.eclipse.equinox.cm}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.medic/org.eclipse.virgo.medic.core/${org.eclipse.virgo.medic}/org.eclipse.virgo.medic.core-${org.eclipse.virgo.medic}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.util/org.eclipse.virgo.util.osgi/${org.eclipse.virgo.util}/org.eclipse.virgo.util.osgi-${org.eclipse.virgo.util}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.util/org.eclipse.virgo.util.osgi.manifest/${org.eclipse.virgo.util}/org.eclipse.virgo.util.osgi.manifest-${org.eclipse.virgo.util}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.eclipse.equinox.event/${org.eclipse.equinox.event}/org.eclipse.equinox.event-${org.eclipse.equinox.event}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.util/org.eclipse.virgo.util.common/${org.eclipse.virgo.util}/org.eclipse.virgo.util.common-${org.eclipse.virgo.util}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.util/org.eclipse.virgo.util.io/${org.eclipse.virgo.util}/org.eclipse.virgo.util.io-${org.eclipse.virgo.util}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.util/org.eclipse.virgo.util.jmx/${org.eclipse.virgo.util}/org.eclipse.virgo.util.jmx-${org.eclipse.virgo.util}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.util/org.eclipse.virgo.util.math/${org.eclipse.virgo.util}/org.eclipse.virgo.util.math-${org.eclipse.virgo.util}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.util/org.eclipse.virgo.util.parser.manifest/${org.eclipse.virgo.util}/org.eclipse.virgo.util.parser.manifest-${org.eclipse.virgo.util}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.util/org.eclipse.virgo.util.parser.launcher/${org.eclipse.virgo.util}/org.eclipse.virgo.util.parser.launcher-${org.eclipse.virgo.util}.jar@start,\
+ file:${ivy.cache}/repository/org.apache.commons/com.springsource.org.apache.commons.codec/1.3.0/com.springsource.org.apache.commons.codec-1.3.0.jar@start,\
+ file:${ivy.cache}/repository/org.apache.commons/com.springsource.org.apache.commons.httpclient/3.1.0/com.springsource.org.apache.commons.httpclient-3.1.0.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.repository/org.eclipse.virgo.repository/${org.eclipse.virgo.repository}/org.eclipse.virgo.repository-${org.eclipse.virgo.repository}.jar@start,\
+ file:${ivy.cache}/repository/org.springframework/org.springframework.aop/3.1.0.RELEASE/org.springframework.aop-3.1.0.RELEASE.jar,\
+ file:${ivy.cache}/repository/org.springframework/org.springframework.asm/3.1.0.RELEASE/org.springframework.asm-3.1.0.RELEASE.jar,\
+ file:${ivy.cache}/repository/org.springframework/org.springframework.expression/3.1.0.RELEASE/org.springframework.expression-3.1.0.RELEASE.jar,\
+ file:${ivy.cache}/repository/org.springframework/org.springframework.beans/3.1.0.RELEASE/org.springframework.beans-3.1.0.RELEASE.jar,\
+ file:${ivy.cache}/repository/org.springframework/org.springframework.core/3.1.0.RELEASE/org.springframework.core-3.1.0.RELEASE.jar,\
+ file:${ivy.cache}/repository/org.springframework/org.springframework.context/3.1.0.RELEASE/org.springframework.context-3.1.0.RELEASE.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.nano/org.eclipse.virgo.nano.core/${org.eclipse.virgo.nano}/org.eclipse.virgo.nano.core-${org.eclipse.virgo.nano}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.nano/org.eclipse.virgo.nano.deployer.api/${org.eclipse.virgo.nano}/org.eclipse.virgo.nano.deployer.api-${org.eclipse.virgo.nano}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.nano/org.eclipse.virgo.nano.deployer.hot/${org.eclipse.virgo.nano}/org.eclipse.virgo.nano.deployer.hot-${org.eclipse.virgo.nano}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.nano/org.eclipse.virgo.nano.management/${org.eclipse.virgo.nano}/org.eclipse.virgo.nano.management-${org.eclipse.virgo.nano}.jar@start,\
+ file:../org.eclipse.virgo.kernel.agent.dm/target/classes@start,\
+ file:${ivy.cache}/repository/org.eclipse.gemini/org.eclipse.gemini.blueprint.core/2.0.0.M02/org.eclipse.gemini.blueprint.core-2.0.0.M02.jar,\
+ file:${ivy.cache}/repository/org.eclipse.gemini/org.eclipse.gemini.blueprint.extender/2.0.0.M02/org.eclipse.gemini.blueprint.extender-2.0.0.M02.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.gemini/org.eclipse.gemini.blueprint.io/2.0.0.M02/org.eclipse.gemini.blueprint.io-2.0.0.M02.jar,\
+ file:${ivy.cache}/repository/org.aopalliance/com.springsource.org.aopalliance/1.0.0/com.springsource.org.aopalliance-1.0.0.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.eclipse.equinox.ds/${org.eclipse.equinox.ds}/org.eclipse.equinox.ds-${org.eclipse.equinox.ds}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.eclipse.equinox.util/${org.eclipse.equinox.util}/org.eclipse.equinox.util-${org.eclipse.equinox.util}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.apache.felix.gogo.runtime/${org.apache.felix.gogo.runtime}/org.apache.felix.gogo.runtime-${org.apache.felix.gogo.runtime}.jar@start,\
+ file:../org.eclipse.virgo.kernel.artifact/target/classes@start,\
+ file:../org.eclipse.virgo.kernel.services/target/classes@start,\
+ file:../org.eclipse.virgo.kernel.deployer/target/classes@start,\
+ file:../org.eclipse.virgo.kernel.model/target/classes@start,\
+ file:../org.eclipse.virgo.kernel.kerneldmfragment/target/classes,\
+ file:../org.eclipse.virgo.kernel.osgi/target/classes@start,\
+ file:../org.eclipse.virgo.kernel.userregionfactory/target/classes@start
+
+org.eclipse.virgo.test.properties.include=file:../build.versions,file:../user-ivy.properties
+
+#Equinox Configuration 
+osgi.parentClassloader=ext
+osgi.context.bootdelegation=false
+osgi.compatibility.bootdelegation=false
+osgi.clean=true
+osgi.configuration.area=target
+org.osgi.framework.bsnversion=multiple
+
+# osgi console support
+# osgi.console=2401
+osgi.console.enable.builtin=false
+osgi.console.ssh.useDefaultSecureStorage=true
+osgi.console.useConfigAdmin=true
+gosh.args=--nointeractive
+
+osgi.java.profile=file:src/test/resources/META-INF/java-profile/java-server.profile
+osgi.java.profile.bootdelegation=override
+osgi.hook.configurators.include=org.eclipse.virgo.kernel.equinox.extensions.hooks.ExtensionsHookConfigurator
+
+org.eclipse.virgo.kernel.home=target
+org.eclipse.virgo.kernel.domain=org.eclipse.virgo.kernel
+# Paths are relative to the current working directory
+org.eclipse.virgo.kernel.config=src/test/resources/config
+
+org.eclipse.virgo.medic.log.config.path=src/test/resources/config/serviceability.xml
+
+# Test value for ServiceUtilsTests
+org.eclipse.virgo.kernel.startup.wait.limit=181
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/resources/QuickConsumer.jar b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/QuickConsumer.jar
new file mode 100644
index 0000000..5d207fc
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/QuickConsumer.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/resources/SlowService.jar b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/SlowService.jar
new file mode 100644
index 0000000..4adb7a4
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/SlowService.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/resources/config/org.eclipse.virgo.kernel.properties b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/config/org.eclipse.virgo.kernel.properties
new file mode 100644
index 0000000..a1dcae0
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/config/org.eclipse.virgo.kernel.properties
@@ -0,0 +1,4 @@
+deployer.timeout=			300
+deployer.pickupDirectory=	target/pickup
+deployer.scanIntervalMillis=1000
+deployer.systemArtifacts=
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/resources/config/org.eclipse.virgo.kernel.userregion.properties b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/config/org.eclipse.virgo.kernel.userregion.properties
new file mode 100644
index 0000000..8f6cfea
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/config/org.eclipse.virgo.kernel.userregion.properties
@@ -0,0 +1,109 @@
+baseBundles =\
+ file:${ivy.cache}/repository/org.springframework/org.springframework.aop/3.1.0.RELEASE/org.springframework.aop-3.1.0.RELEASE.jar,\
+ file:${ivy.cache}/repository/org.springframework/org.springframework.asm/3.1.0.RELEASE/org.springframework.asm-3.1.0.RELEASE.jar,\
+ file:${ivy.cache}/repository/org.springframework/org.springframework.expression/3.1.0.RELEASE/org.springframework.expression-3.1.0.RELEASE.jar,\
+ file:${ivy.cache}/repository/org.springframework/org.springframework.beans/3.1.0.RELEASE/org.springframework.beans-3.1.0.RELEASE.jar,\
+ file:${ivy.cache}/repository/org.springframework/org.springframework.core/3.1.0.RELEASE/org.springframework.core-3.1.0.RELEASE.jar,\
+ file:${ivy.cache}/repository/org.springframework/org.springframework.context/3.1.0.RELEASE/org.springframework.context-3.1.0.RELEASE.jar,\
+ file:${ivy.cache}/repository/org.eclipse.gemini/org.eclipse.gemini.blueprint.core/2.0.0.M02/org.eclipse.gemini.blueprint.core-2.0.0.M02.jar,\
+ file:${ivy.cache}/repository/org.eclipse.gemini/org.eclipse.gemini.blueprint.extender/2.0.0.M02/org.eclipse.gemini.blueprint.extender-2.0.0.M02.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.gemini/org.eclipse.gemini.blueprint.io/2.0.0.M02/org.eclipse.gemini.blueprint.io-2.0.0.M02.jar,\
+ file:${ivy.cache}/repository/org.aopalliance/com.springsource.org.aopalliance/1.0.0/com.springsource.org.aopalliance-1.0.0.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.eclipse.equinox.ds/1.4.0.v20120112-1400/org.eclipse.equinox.ds-1.4.0.v20120112-1400.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.eclipse.equinox.util/1.0.300.v20111010-1614/org.eclipse.equinox.util-1.0.300.v20111010-1614.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.eclipse.osgi.services/3.3.0.v20120307-2102/org.eclipse.osgi.services-3.3.0.v20120307-2102.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.eclipse.equinox.cm/1.0.400.v20120319-2029/org.eclipse.equinox.cm-1.0.400.v20120319-2029.jar,\
+ file:../org.eclipse.virgo.kernel.agent.dm/target/classes@start,\
+ file:../org.eclipse.virgo.kernel.deployer.dm/target/classes@start,\
+ file:../org.eclipse.virgo.kernel.dmfragment/target/classes,\
+ file:../org.eclipse.virgo.kernel.userregion/target/classes@start,\
+ file:../org.eclipse.virgo.shell.command/target/classes@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.apache.mina.core/2.0.2.v201108120515/org.apache.mina.core-2.0.2.v201108120515.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.apache.felix.gogo.command/0.10.0.v201209301215/org.apache.felix.gogo.command-0.10.0.v201209301215.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.apache.felix.gogo.runtime/0.10.0.v201209301036/org.apache.felix.gogo.runtime-0.10.0.v201209301036.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.apache.felix.gogo.shell/0.10.0.v201211091412/org.apache.felix.gogo.shell-0.10.0.v201211091412.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.eclipse.equinox.console/1.0.100.v20121001-124408/org.eclipse.equinox.console-1.0.100.v20121001-124408.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.eclipse.equinox.console.ssh/1.0.0.v20120430-1356/org.eclipse.equinox.console.ssh-1.0.0.v20120430-1356.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.apache.sshd.core/0.5.0.v201108120515/org.apache.sshd.core-0.5.0.v201108120515.jar@start
+ 
+bundleImports = org.eclipse.osgi;bundle-version="0"
+
+packageImports =\
+ org.eclipse.virgo.kernel.artifact.*;version="0",\
+ org.eclipse.virgo.nano.core;version="0",\
+ org.eclipse.virgo.nano.deployer.api.*;version="0",\
+ org.eclipse.virgo.nano.deployer.api;version="0",\
+ org.eclipse.virgo.kernel.deployer.core.event;version="0",\
+ org.eclipse.virgo.kernel.install.*;version="0",\
+ org.eclipse.virgo.kernel.osgi.*;version="0",\
+ org.eclipse.virgo.kernel.model;version="0",\
+ org.eclipse.virgo.kernel.model.management;version="0",\
+ org.eclipse.virgo.kernel.module;version="0",\
+ org.eclipse.virgo.nano.serviceability;version="0",\
+ org.eclipse.virgo.nano.serviceability.*;version="0",\
+ org.eclipse.virgo.kernel.services.work;version="0",\
+ org.eclipse.virgo.nano.shim.*;version="0",\
+ org.eclipse.virgo.medic.*;version="0",\
+ org.eclipse.virgo.repository;version="0",\
+ org.eclipse.virgo.repository.*;version="0",\
+ org.eclipse.virgo.util.*;version="0",\
+ org.apache.commons.logging;version="[1.0.0,2.0.0)",\
+ org.apache.commons.logging.impl;version="[1.0.0,2.0.0)",\
+ org.aspectj.*;version="[1.6.5.RELEASE,2.0.0)",\
+ org.osgi.service.cm;version="0",\
+ org.osgi.service.event;version="0",\
+ org.osgi.service.log;version="0",\
+ org.osgi.service.http;version="0",\
+ org.eclipse.equinox.region;version="1",\
+ ch.qos.logback.*;version="[1.0.0,2.0.0)",\
+ org.slf4j;version="[1.6.4,2)",\
+ org.slf4j.helpers;version="[1.6.4,2)",\
+ org.slf4j.spi;version="[1.6.4,2)",\
+ org.junit;version="[4.7.0,5.0.0)",\
+ org.junit.runner;version="[4.7.0,5.0.0)",\
+ org.springframework.util;version="[2.5.6,4)"
+
+serviceImports =\
+ org.eclipse.equinox.region.Region,\
+ org.eclipse.equinox.region.RegionDigraph,\
+ org.eclipse.virgo.nano.deployer.api.core.ApplicationDeployer,\
+ org.eclipse.virgo.nano.deployer.api.core.DeployUriNormaliser,\
+ org.eclipse.virgo.kernel.install.artifact.ScopeServiceRepository,\
+ org.eclipse.virgo.kernel.services.work.WorkArea,\
+ org.eclipse.virgo.kernel.model.RuntimeArtifactRepository,\
+ org.eclipse.virgo.repository.ArtifactBridge,\
+ org.eclipse.virgo.kernel.shell.CommandExecutor,\
+ org.eclipse.virgo.repository.RepositoryFactory,\
+ org.eclipse.virgo.medic.eventlog.EventLoggerFactory,\
+ org.eclipse.virgo.repository.Repository,\
+ org.eclipse.virgo.nano.core.Shutdown,\
+ org.osgi.framework.hooks.resolver.ResolverHookFactory,\
+ org.osgi.service.cm.ConfigurationAdmin,\
+ org.osgi.service.event.EventAdmin,\
+ org.osgi.service.log.LogService,\
+ org.eclipse.virgo.medic.eventlog.EventLogger,\
+ org.eclipse.virgo.medic.dump.DumpGenerator,\
+ org.eclipse.virgo.nano.shim.scope.ScopeFactory,\
+ org.eclipse.virgo.nano.shim.serviceability.TracingService,\
+ org.eclipse.virgo.kernel.model.management.RuntimeArtifactModelObjectNameCreator,\
+ org.eclipse.osgi.service.resolver.PlatformAdmin,\
+ org.osgi.service.packageadmin.PackageAdmin,\
+ org.eclipse.virgo.nano.core.ConfigurationExporter
+
+serviceExports =\
+ org.eclipse.virgo.kernel.install.artifact.InstallArtifactLifecycleListener,\
+ org.eclipse.virgo.kernel.install.artifact.ArtifactTypeDeterminer,\
+ org.eclipse.virgo.kernel.install.pipeline.stage.transform.Transformer,\
+ org.eclipse.virgo.kernel.module.ModuleContextAccessor,\
+ org.eclipse.virgo.medic.dump.DumpContributor,\
+ org.eclipse.virgo.kernel.osgi.quasi.QuasiFrameworkFactory,\
+ org.eclipse.virgo.kernel.osgi.framework.OsgiFramework,\
+ org.eclipse.virgo.kernel.osgi.framework.ImportExpander,\
+ org.eclipse.virgo.kernel.osgi.framework.PackageAdminUtil,\
+ org.eclipse.equinox.region.Region,\
+ org.osgi.service.event.EventHandler,\
+ org.osgi.service.cm.ConfigurationListener,\
+ org.osgi.service.cm.ManagedService,\
+ org.osgi.service.cm.ManagedServiceFactory,\
+ org.osgi.framework.BundleContext,\
+ org.eclipse.virgo.nano.deployer.api.config.ConfigurationDeployer
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/resources/config/org.eclipse.virgo.medic.properties b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/config/org.eclipse.virgo.medic.properties
new file mode 100644
index 0000000..8b9e75a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/config/org.eclipse.virgo.medic.properties
@@ -0,0 +1,7 @@
+dump.root.directory=target/serviceability/dump
+log.wrapSysOut=true
+log.wrapSysErr=true
+log.dump.level=DEBUG
+log.dump.bufferSize=10000
+log.dump.pattern=[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-28.28thread %-64.64logger{64} %X{medic.eventCode} %msg %ex%n
+log.jul.consoleHandler=false
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/resources/config/org.eclipse.virgo.repository.properties b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/config/org.eclipse.virgo.repository.properties
new file mode 100644
index 0000000..b730b4f
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/config/org.eclipse.virgo.repository.properties
@@ -0,0 +1,14 @@
+bundles.type=external
+bundles.searchPattern=../{bundle}/target/classes
+
+ivy-cache-bundles.type=external
+ivy-cache-bundles.searchPattern=${user.home}/virgo-build-cache/ivy-cache/repository/{org}/{name}/{version}/{bundle}.jar
+
+ivy-cache-libraries.type=external
+ivy-cache-libraries.searchPattern=${user.home}/virgo-build-cache/ivy-cache/repository/{org}/{name}/{version}/{library}.libd
+
+src-test-resources.type=external
+src-test-resources.searchPattern=src/test/resources/*.jar
+
+
+chain=bundles,ivy-cache-bundles,ivy-cache-libraries,src-test-resources
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/resources/config/serviceability.xml b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/config/serviceability.xml
new file mode 100644
index 0000000..667c8a7
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/config/serviceability.xml
@@ -0,0 +1,59 @@
+<configuration>
+
+	<jmxConfigurator />
+
+	<contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"/>
+
+	<appender name="LOG_STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+			<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-24.24thread %msg %ex%n</Pattern>
+		</encoder>
+	</appender>
+
+	<appender name="LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<file>target/serviceability/log/log.log</file>
+		<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+			<FileNamePattern>target/serviceability/log/log_%i.log</FileNamePattern>
+			<MinIndex>1</MinIndex>
+			<MaxIndex>4</MaxIndex>
+		</rollingPolicy>
+		<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+			<MaxFileSize>10MB</MaxFileSize>
+		</triggeringPolicy>
+		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+			<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-24.24thread %msg %ex%n</Pattern>
+		</encoder>
+	</appender>
+
+	<appender name="EVENT_LOG_STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+			<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-24.24thread &lt;%X{medic.eventCode}&gt; %msg %ex%n</Pattern>
+		</encoder>
+	</appender>
+
+	<appender name="EVENT_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<file>target/serviceability/eventlog/eventlog.log</file>
+		<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+			<FileNamePattern>target/serviceability/eventlog/eventlog_%i.log</FileNamePattern>
+			<MinIndex>1</MinIndex>
+			<MaxIndex>4</MaxIndex>
+		</rollingPolicy>
+		<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+			<MaxFileSize>10MB</MaxFileSize>
+		</triggeringPolicy>
+		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+			<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-24.24thread &lt;%X{medic.eventCode}&gt; %msg %ex%n</Pattern>
+		</encoder>
+	</appender>
+
+	<logger level="INFO" name="org.eclipse.virgo.medic.eventlog.localized">
+		<appender-ref ref="EVENT_LOG_STDOUT" />
+		<appender-ref ref="EVENT_LOG_FILE" />
+	</logger>
+
+	<root level="INFO">
+		<!-- appender-ref ref="LOG_STDOUT" /-->
+		<appender-ref ref="LOG_FILE" />
+	</root>
+
+</configuration>
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/resources/initial-artifact-plan/com.springsource.kernel.test.userregion.springdm.plan b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/initial-artifact-plan/com.springsource.kernel.test.userregion.springdm.plan
new file mode 100644
index 0000000..9c7f8b0
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/initial-artifact-plan/com.springsource.kernel.test.userregion.springdm.plan
@@ -0,0 +1,10 @@
+<plan name="org.eclipse.virgo.kernel.test.userregion.springdm" version="3.0" scoped="false" atomic="false"
+                xmlns="http://www.springsource.org/schema/dm-server/plan"
+                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+                xsi:schemaLocation="
+                        http://www.springsource.org/schema/dm-server/plan 
+                        http://www.springsource.org/schema/dm-server/plan/springsource-dm-server-plan.xsd">
+
+        <artifact type="bundle" name="com.springsource.kernel.agent.dm" version="[3.0, 4.0)"/>
+        <artifact type="bundle" name="org.eclipse.virgo.kernel.deployer.dm" version="[3.0, 4.0)"/>
+</plan>
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor-blueprint/abort/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor-blueprint/abort/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..62bee5f
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor-blueprint/abort/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: unsatisfieable.service.reference
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor-blueprint/abort/OSGI-INF/blueprint/context.xml b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor-blueprint/abort/OSGI-INF/blueprint/context.xml
new file mode 100644
index 0000000..1b006e4
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor-blueprint/abort/OSGI-INF/blueprint/context.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
+       
+    <reference id="unsatisfied" interface="java.util.List"/>
+      
+</blueprint>
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor-blueprint/delay/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor-blueprint/delay/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..8026215
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor-blueprint/delay/META-INF/MANIFEST.MF
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0

+Bundle-Name: DelayBean Bundle

+Created-By: 1.5.0_13 (Apple Computer, Inc.)

+Bundle-SymbolicName: DelayBean

+Bundle-Version: 1.0.0

+

diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor-blueprint/delay/OSGI-INF/blueprint/delay-context.xml b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor-blueprint/delay/OSGI-INF/blueprint/delay-context.xml
new file mode 100644
index 0000000..130ac09
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor-blueprint/delay/OSGI-INF/blueprint/delay-context.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
+
+    <bean id="delayBean" class="delay.Bean"/>   
+      
+</blueprint>
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor-blueprint/delay/delay/Bean.class b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor-blueprint/delay/delay/Bean.class
new file mode 100644
index 0000000..ab7d971
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor-blueprint/delay/delay/Bean.class
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor-blueprint/failure/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor-blueprint/failure/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..0f93025
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor-blueprint/failure/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: monitor.failure
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor-blueprint/failure/OSGI-INF/blueprint/context.xml b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor-blueprint/failure/OSGI-INF/blueprint/context.xml
new file mode 100644
index 0000000..7caa4e1
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor-blueprint/failure/OSGI-INF/blueprint/context.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
+
+    <ba   
+      
+</blueprint>
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor-blueprint/success/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor-blueprint/success/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..199421b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor-blueprint/success/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: monitor.success
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor-blueprint/success/OSGI-INF/blueprint/context.xml b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor-blueprint/success/OSGI-INF/blueprint/context.xml
new file mode 100644
index 0000000..1074dca
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor-blueprint/success/OSGI-INF/blueprint/context.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
+
+</blueprint>
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor/abort/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor/abort/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..62bee5f
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor/abort/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: unsatisfieable.service.reference
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor/abort/META-INF/spring/context.xml b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor/abort/META-INF/spring/context.xml
new file mode 100644
index 0000000..2b3c899
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor/abort/META-INF/spring/context.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans:beans xmlns="http://www.springframework.org/schema/osgi"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns:beans="http://www.springframework.org/schema/beans"
+	xsi:schemaLocation="http://www.springframework.org/schema/osgi  
+       http://www.springframework.org/schema/osgi/spring-osgi.xsd
+       http://www.springframework.org/schema/beans   
+       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
+       
+       <reference id="unsatisfied" interface="java.util.List"/>
+      
+</beans:beans>
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor/delay/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor/delay/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..8026215
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor/delay/META-INF/MANIFEST.MF
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0

+Bundle-Name: DelayBean Bundle

+Created-By: 1.5.0_13 (Apple Computer, Inc.)

+Bundle-SymbolicName: DelayBean

+Bundle-Version: 1.0.0

+

diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor/delay/META-INF/spring/delay-context.xml b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor/delay/META-INF/spring/delay-context.xml
new file mode 100644
index 0000000..6dc43d8
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor/delay/META-INF/spring/delay-context.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans:beans xmlns="http://www.springframework.org/schema/osgi"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns:beans="http://www.springframework.org/schema/beans"
+	xmlns:util="http://www.springframework.org/schema/util"
+	xsi:schemaLocation="http://www.springframework.org/schema/osgi  
+       http://www.springframework.org/schema/osgi/spring-osgi.xsd
+       http://www.springframework.org/schema/util 
+       http://www.springframework.org/schema/util/spring-util-2.5.xsd
+       http://www.springframework.org/schema/beans   
+       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
+
+	<beans:bean id="delayBean" class="delay.Bean" />
+
+</beans:beans>
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor/delay/delay/Bean.class b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor/delay/delay/Bean.class
new file mode 100644
index 0000000..ab7d971
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor/delay/delay/Bean.class
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor/failure/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor/failure/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..0f93025
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor/failure/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: monitor.failure
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor/failure/META-INF/spring/context.xml b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor/failure/META-INF/spring/context.xml
new file mode 100644
index 0000000..ce29a3f
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor/failure/META-INF/spring/context.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans:beans xmlns="http://www.springframework.org/schema/osgi"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns:beans="http://www.springframework.org/schema/beans"
+	xsi:schemaLocation="http://www.springframework.org/schema/osgi  
+       http://www.springframework.org/schema/osgi/spring-osgi.xsd
+       http://www.springframework.org/schema/beans   
+       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
+       
+      <ba 
+</beans:beans>
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor/nondm/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor/nondm/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..c3b9ee1
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor/nondm/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: monitor.nondm
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor/success/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor/success/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..199421b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor/success/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: monitor.success
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor/success/META-INF/spring/context.xml b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor/success/META-INF/spring/context.xml
new file mode 100644
index 0000000..974f02f
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/monitor/success/META-INF/spring/context.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans:beans xmlns="http://www.springframework.org/schema/osgi"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns:beans="http://www.springframework.org/schema/beans"
+	xsi:schemaLocation="http://www.springframework.org/schema/osgi  
+       http://www.springframework.org/schema/osgi/spring-osgi.xsd
+       http://www.springframework.org/schema/beans   
+       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
+       
+      
+</beans:beans>
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/resources/post-processors/inbuilt/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/post-processors/inbuilt/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..a36fcef
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/post-processors/inbuilt/META-INF/MANIFEST.MF
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: org.eclipse.virgo.kernel.dmfragment.test.inbuilt
+Import-Package: org.eclipse.virgo.kernel.osgi.framework,
+ org.springframework.context.weaving
+
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/resources/post-processors/inbuilt/META-INF/spring/context.xml b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/post-processors/inbuilt/META-INF/spring/context.xml
new file mode 100644
index 0000000..465ad1d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/post-processors/inbuilt/META-INF/spring/context.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns="http://www.springframework.org/schema/beans"
+	xmlns:osgi="http://www.springframework.org/schema/osgi"
+	xmlns:context="http://www.springframework.org/schema/context"
+	xsi:schemaLocation="http://www.springframework.org/schema/osgi  
+       http://www.springframework.org/schema/osgi/spring-osgi.xsd
+       http://www.springframework.org/schema/beans   
+       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
+       http://www.springframework.org/schema/context
+       http://www.springframework.org/schema/context/spring-context-2.5.xsd">
+
+	<context:load-time-weaver/>
+	
+	<bean id="mbeanExporter" class="org.springframework.jmx.export.MBeanExporter"/>
+	
+	<osgi:reference id="reference" interface="org.eclipse.virgo.kernel.osgi.framework.OsgiFramework" context-class-loader="client"/>
+	
+</beans>
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/resources/quasi/simpleexporter.jar b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/quasi/simpleexporter.jar
new file mode 100644
index 0000000..3fb9c20
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/quasi/simpleexporter.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/resources/quasi/simpleimporter.jar b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/quasi/simpleimporter.jar
new file mode 100644
index 0000000..3fb9c20
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/quasi/simpleimporter.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/resources/sit-config/kernel.properties b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/sit-config/kernel.properties
new file mode 100644
index 0000000..904b062
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/sit-config/kernel.properties
@@ -0,0 +1,8 @@
+deployer.timeout=			300
+deployer.pickupDirectory=	target/pickup
+deployer.scanIntervalMillis=1000
+io.workDirectory=			target/work
+io.dumpDirectory=			target/serviceability/dump
+profile.name=				subsystem installation test
+profile.subsystems=			subsystem.installation.test
+profile.optionalSubsystems=
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/resources/sit-config/repository.properties b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/sit-config/repository.properties
new file mode 100644
index 0000000..1d2e9f0
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/sit-config/repository.properties
@@ -0,0 +1,13 @@
+bundles.type=external
+bundles.searchPattern=../{bundle}/target/classes
+
+ivy-cache-bundles.type=external
+ivy-cache-bundles.searchPattern=../${ivy.cache::ivy-cache}/repository/{org}/{name}/{version}/{bundle}.jar
+
+ivy-cache-libraries.type=external
+ivy-cache-libraries.searchPattern=../${ivy.cache::ivy-cache}/repository/{org}/{name}/{version}/{library}.libd
+
+src-test-resources-sitrepo.type=external
+src-test-resources-sitrepo.searchPattern=src/test/resources/sit-repo/{bundle}
+
+chain=src-test-resources-sitrepo,bundles,ivy-cache-bundles,ivy-cache-libraries
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/resources/sit-config/serviceability.xml b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/sit-config/serviceability.xml
new file mode 100644
index 0000000..1ebbacb
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/sit-config/serviceability.xml
@@ -0,0 +1,59 @@
+<configuration>
+
+	<jmxConfigurator />
+
+    <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"/>
+
+	<appender name="LOG_STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+			<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-24.24thread %msg %ex%n</Pattern>
+		</encoder>
+	</appender>
+
+	<appender name="LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<file>target/serviceability/log/log.log</file>
+		<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+			<FileNamePattern>target/serviceability/log/log_%i.log</FileNamePattern>
+			<MinIndex>1</MinIndex>
+			<MaxIndex>4</MaxIndex>
+		</rollingPolicy>
+		<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+			<MaxFileSize>10MB</MaxFileSize>
+		</triggeringPolicy>
+		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+			<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-24.24thread %msg %ex%n</Pattern>
+		</encoder>
+	</appender>
+
+	<appender name="EVENT_LOG_STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+			<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-24.24thread &lt;%X{medic.eventCode}&gt; %msg %ex%n</Pattern>
+		</encoder>
+	</appender>
+
+	<appender name="EVENT_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<file>target/serviceability/eventlog/eventlog.log</file>
+		<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+			<FileNamePattern>target/serviceability/eventlog/eventlog_%i.log</FileNamePattern>
+			<MinIndex>1</MinIndex>
+			<MaxIndex>4</MaxIndex>
+		</rollingPolicy>
+		<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+			<MaxFileSize>10MB</MaxFileSize>
+		</triggeringPolicy>
+		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+			<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-24.24thread &lt;%X{medic.eventCode}&gt; %msg %ex%n</Pattern>
+		</encoder>
+	</appender>
+
+	<logger name="org.eclipse.virgo.medic.eventlog.localized">
+		<appender-ref ref="EVENT_LOG_STDOUT" />
+		<appender-ref ref="EVENT_LOG_FILE" />
+	</logger>
+
+	<root level="WARN">
+		<appender-ref ref="LOG_STDOUT" />
+		<appender-ref ref="LOG_FILE" />
+	</root>
+
+</configuration>
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/resources/sit-repo/one/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/sit-repo/one/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..0b4b48c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/sit-repo/one/META-INF/MANIFEST.MF
@@ -0,0 +1,4 @@
+Manifest-Version: 1
+Bundle-ManifestVersion: 2
+Bundle-Version: 1.0
+Bundle-SymbolicName: sit.one
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/resources/sit-repo/subsystem-1.0.0.xml b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/sit-repo/subsystem-1.0.0.xml
new file mode 100644
index 0000000..27a0989
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/sit-repo/subsystem-1.0.0.xml
@@ -0,0 +1,4 @@
+<subsystem name="subsystem.installation.test" description="subsystem installation test subsystem">
+        <bundle symbolic-name="sit.one" version="[1.0,1.0]"/>
+        <bundle symbolic-name="sit.two" version="[1.0,3.0)"/>
+</subsystem>
diff --git a/kernel/org.eclipse.virgo.kernel.test/src/test/resources/sit-repo/two/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/sit-repo/two/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..f7c6b16
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/src/test/resources/sit-repo/two/META-INF/MANIFEST.MF
@@ -0,0 +1,4 @@
+Manifest-Version: 1
+Bundle-ManifestVersion: 2
+Bundle-Version: 1.0
+Bundle-SymbolicName: sit.two
diff --git a/kernel/org.eclipse.virgo.kernel.test/template.mf b/kernel/org.eclipse.virgo.kernel.test/template.mf
new file mode 100644
index 0000000..f9aff5d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.test/template.mf
@@ -0,0 +1,23 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Virgo Kernel Test
+Bundle-SymbolicName: org.eclipse.virgo.kernel.test
+Bundle-Version: ${version}
+Import-Template: 
+ org.eclipse.virgo.kernel.*;version="${version:[=.=.=, +1)}",
+ org.eclipse.virgo.nano.*;version="${version:[=.=.=, +1)}",
+ org.eclipse.virgo.util.*;version="${version:[=.=.=, +1)}",
+ javax.management.*;version="0",
+ org.easymock.*;version="${org.easymock:[=.=.=, +1)}",
+ org.junit.*;version="${org.junit:[=.=.=, +1)}",
+ org.eclipse.osgi.*;version="0",
+ org.osgi.*;version="0",
+ org.springframework.*;version="${springframeworkVersion:[2.5.6, +1)}",
+ org.eclipse.gemini.blueprint.*;version="${geminiBlueprintVersion:[=.=.=, +1)}"
+Excluded-Imports: 
+ subsystem.installation,
+ com.springsource,
+ org.eclipse.virgo.kernel.equinox.*,
+ org.eclipse.virgo.kernel.core,
+ org.eclipse.virgo.test.*
+Excluded-Exports: delay,quick,slow,test,config,quasi
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/.settings/org.eclipse.wst.common.project.facet.core.xml b/kernel/org.eclipse.virgo.kernel.userregion/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..92aa290
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+  <installed facet="org.eclipse.virgo.server.bundle" version="1.0"/>
+</faceted-project>
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/.settings/org.springframework.ide.eclipse.core.prefs b/kernel/org.eclipse.virgo.kernel.userregion/.settings/org.springframework.ide.eclipse.core.prefs
new file mode 100644
index 0000000..aadbe76
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/.settings/org.springframework.ide.eclipse.core.prefs
@@ -0,0 +1,67 @@
+#Mon Aug 10 10:45:21 BST 2009
+eclipse.preferences.version=1
+org.springframework.ide.eclipse.core.builders.enable.aopreferencemodelbuilder=true
+org.springframework.ide.eclipse.core.builders.enable.beanmetadatabuilder=true
+org.springframework.ide.eclipse.core.builders.enable.osgibundleupdater=true
+org.springframework.ide.eclipse.core.enable.project.preferences=false
+org.springframework.ide.eclipse.core.validator.enable.com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.enable.com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.enable.com.springsource.sts.server.quickfix.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.enable.org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.enable.org.springframework.ide.eclipse.core.springvalidator=false
+org.springframework.ide.eclipse.core.validator.enable.org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.applicationSymbolicNameRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.applicationVersionRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleActivationPolicyRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleActivatorRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleManifestVersionRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleNameRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleSymbolicNameRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleVersionRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.exportPackageRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.importRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.parsingProblemsRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.requireBundleRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.AvoidDriverManagerDataSource-com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.ImportElementsAtTopRulee-com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.ParentBeanSpecifiesAbstractClassRule-com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.RefElementRule-com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.TooManyBeansInFileRule-com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.UnnecessaryValueElementRule-com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.UseBeanInheritance-com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.legacyxmlusage.jndiobjectfactory-com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.importBundleVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.importLibraryVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.importPackageVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.requireBundleVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanAlias-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanClass-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanConstructorArgument-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanDefinition-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanDefinitionHolder-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanFactory-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanInitDestroyMethod-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanProperty-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanReference-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.methodOverride-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.parsingProblems-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.requiredProperty-org.springframework.ide.eclipse.beans.core.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.core.springClasspath-org.springframework.ide.eclipse.core.springvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.action-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.actionstate-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.attribute-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.attributemapper-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.beanaction-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.evaluationaction-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.evaluationresult-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.exceptionhandler-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.import-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.inputattribute-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.mapping-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.outputattribute-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.set-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.state-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.subflowstate-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.transition-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.variable-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.webflowstate-org.springframework.ide.eclipse.webflow.core.validator=true
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/.springBeans b/kernel/org.eclipse.virgo.kernel.userregion/.springBeans
new file mode 100644
index 0000000..4dbe37b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/.springBeans
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beansProjectDescription>
+	<version>1</version>
+	<pluginVersion><![CDATA[2.2.7.200910202224-RELEASE]]></pluginVersion>
+	<configSuffixes>
+		<configSuffix><![CDATA[xml]]></configSuffix>
+	</configSuffixes>
+	<enableImports><![CDATA[false]]></enableImports>
+	<configs>
+	</configs>
+	<configSets>
+	</configSets>
+</beansProjectDescription>
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/Activator.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/Activator.java
new file mode 100644
index 0000000..d7fe18b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/Activator.java
@@ -0,0 +1,359 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal;
+
+import static org.eclipse.virgo.kernel.osgi.framework.ServiceUtils.PROPERTY_KERNEL_STARTUP_WAIT_LIMIT;
+import static org.eclipse.virgo.kernel.osgi.framework.ServiceUtils.getPotentiallyDelayedService;
+import static org.eclipse.virgo.kernel.osgi.framework.ServiceUtils.getWaitLimitSeconds;
+
+import java.io.IOException;
+import java.util.Dictionary;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.Set;
+import java.util.concurrent.TimeoutException;
+
+import org.eclipse.equinox.region.RegionDigraph;
+import org.eclipse.osgi.service.resolver.PlatformAdmin;
+import org.eclipse.virgo.nano.core.ConfigurationExporter;
+import org.eclipse.virgo.nano.core.Shutdown;
+import org.eclipse.virgo.nano.deployer.api.config.ConfigurationDeployer;
+import org.eclipse.virgo.nano.deployer.api.core.ApplicationDeployer;
+import org.eclipse.virgo.nano.deployer.api.core.DeployUriNormaliser;
+import org.eclipse.virgo.kernel.install.artifact.ScopeServiceRepository;
+import org.eclipse.virgo.kernel.module.ModuleContextAccessor;
+import org.eclipse.virgo.kernel.osgi.framework.ImportExpander;
+import org.eclipse.virgo.kernel.osgi.framework.OsgiFramework;
+import org.eclipse.virgo.kernel.osgi.framework.OsgiFrameworkUtils;
+import org.eclipse.virgo.kernel.osgi.framework.PackageAdminUtil;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiFrameworkFactory;
+import org.eclipse.virgo.kernel.services.work.WorkArea;
+import org.eclipse.virgo.nano.shim.scope.ScopeFactory;
+import org.eclipse.virgo.kernel.userregion.internal.dump.StandardDumpExtractor;
+import org.eclipse.virgo.kernel.userregion.internal.equinox.EquinoxHookRegistrar;
+import org.eclipse.virgo.kernel.userregion.internal.equinox.EquinoxOsgiFramework;
+import org.eclipse.virgo.kernel.userregion.internal.equinox.StandardPackageAdminUtil;
+import org.eclipse.virgo.kernel.userregion.internal.equinox.TransformedManifestProvidingBundleFileWrapper;
+import org.eclipse.virgo.kernel.userregion.internal.importexpansion.ImportExpansionHandler;
+import org.eclipse.virgo.kernel.userregion.internal.management.StateDumpMXBeanExporter;
+import org.eclipse.virgo.kernel.userregion.internal.quasi.ResolutionFailureDetective;
+import org.eclipse.virgo.kernel.userregion.internal.quasi.StandardQuasiFrameworkFactory;
+import org.eclipse.virgo.kernel.userregion.internal.quasi.StandardResolutionFailureDetective;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.medic.eventlog.EventLoggerFactory;
+import org.eclipse.virgo.kernel.equinox.extensions.hooks.MetaInfResourceClassLoaderDelegateHook;
+import org.eclipse.virgo.repository.Repository;
+import org.eclipse.virgo.util.osgi.ServiceRegistrationTracker;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventConstants;
+import org.osgi.service.event.EventHandler;
+import org.osgi.service.packageadmin.ExportedPackage;
+import org.osgi.service.packageadmin.PackageAdmin;
+
+/**
+ * {@link BundleActivator} for the Equinox-specific OSGi integration
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ * 
+ */
+@SuppressWarnings("deprecation")
+public class Activator implements BundleActivator {
+
+    private static final long SYSTEM_BUNDLE_ID = 0;
+
+    private static final String PROPERTY_USER_REGION_ARTIFACTS = "initialArtifacts";
+
+    private static final String PROPERTY_USER_REGION_COMMANDLINE_ARTIFACTS = "commandLineArtifacts";
+
+    private static final String USER_REGION_CONFIGURATION_PID = "org.eclipse.virgo.kernel.userregion";
+
+    private static final String KERNEL_REGION_CONFIGURATION_PID = "org.eclipse.virgo.kernel";
+
+    private final ServiceRegistrationTracker registrationTracker = new ServiceRegistrationTracker();
+
+    private volatile EquinoxHookRegistrar hookRegistrar;
+
+    private StateDumpMXBeanExporter stateDumpMBeanExorter;
+    
+    private ConsoleConfigurationConvertor consoleConfigurationConvertor = null;
+
+    /**
+     * {@inheritDoc}
+     */
+    public void start(BundleContext context) throws Exception {
+        publishConfigurations(context);
+        ResolutionFailureDetective rfd = createResolutionFailureDetective(context);
+        Repository repository = getPotentiallyDelayedService(context, Repository.class);
+        PackageAdmin packageAdmin = getPotentiallyDelayedService(context, PackageAdmin.class);
+
+        EventLogger eventLogger = getPotentiallyDelayedService(context, EventLoggerFactory.class).createEventLogger(context.getBundle());
+
+        RegionDigraph regionDigraph = getPotentiallyDelayedService(context, RegionDigraph.class);
+
+        WorkArea workArea = getPotentiallyDelayedService(context, WorkArea.class);
+
+        ImportExpansionHandler importExpansionHandler = createImportExpansionHandler(context, packageAdmin, repository, eventLogger);
+        this.registrationTracker.track(context.registerService(ImportExpander.class.getName(), importExpansionHandler, null));
+
+        TransformedManifestProvidingBundleFileWrapper bundleTransformerHandler = createBundleTransformationHandler(importExpansionHandler);
+
+        OsgiFramework osgiFramework = createOsgiFramework(context, packageAdmin, bundleTransformerHandler);
+        this.registrationTracker.track(context.registerService(OsgiFramework.class.getName(), osgiFramework, null));
+
+        DumpExtractor dumpExtractor = new StandardDumpExtractor(workArea);
+        QuasiFrameworkFactory quasiFrameworkFactory = createQuasiFrameworkFactory(context, rfd, repository, bundleTransformerHandler, regionDigraph,
+            dumpExtractor);
+        this.registrationTracker.track(context.registerService(QuasiFrameworkFactory.class.getName(), quasiFrameworkFactory, null));
+
+        EquinoxHookRegistrar hookRegistrar = createHookRegistrar(context, packageAdmin, bundleTransformerHandler);
+        hookRegistrar.init();
+        this.hookRegistrar = hookRegistrar;
+
+        PackageAdminUtil packageAdminUtil = createPackageAdminUtil(context);
+        this.registrationTracker.track(context.registerService(PackageAdminUtil.class.getName(), packageAdminUtil, null));
+
+        scheduleRegistrationOfServiceScopingRegistryHooks(context, eventLogger);
+
+        Dictionary<String, Object> properties = new Hashtable<String, Object>();
+        properties.put(Constants.SERVICE_RANKING, Integer.MIN_VALUE);
+        this.registrationTracker.track(context.registerService(ModuleContextAccessor.class.getName(), new EmptyModuleContextAccessor(), properties));
+
+        scheduleInitialArtifactDeployerCreation(context, eventLogger);
+
+        context.registerService(ConfigurationDeployer.class, new UserRegionConfigurationDeployer(context), null);
+        initializeConsoleConfigurationConvertor(context);
+        this.stateDumpMBeanExorter = new StateDumpMXBeanExporter(quasiFrameworkFactory);
+    }
+
+    /**
+     * This method gets the kernel and user regions configurations from the kernel region and publishes them in the
+     * configuration admin in the user region.
+     * 
+     * @throws Exception
+     */
+    private void publishConfigurations(BundleContext context) throws Exception {
+        ConfigurationExporter configurationExporter = getPotentiallyDelayedService(context, ConfigurationExporter.class);
+        ConfigurationAdmin admin = getPotentiallyDelayedService(context, ConfigurationAdmin.class);
+
+        try {
+            publishConfigurationFromKernelRegion(configurationExporter.getUserRegionConfigurationProperties(),
+                admin.getConfiguration(USER_REGION_CONFIGURATION_PID));
+            publishConfigurationFromKernelRegion(configurationExporter.getKernelRegionConfigurationProperties(),
+                admin.getConfiguration(KERNEL_REGION_CONFIGURATION_PID));
+        } catch (IOException e) {
+            throw new RuntimeException("Failed to publish required configurations. Startup sequence can't continue", e);
+        }
+    }
+
+    private void publishConfigurationFromKernelRegion(Dictionary<String, Object> configurationProperties, Configuration config) throws IOException {
+        config.update(configurationProperties);
+    }
+
+    private ResolutionFailureDetective createResolutionFailureDetective(BundleContext context) {
+        PlatformAdmin platformAdmin = OsgiFrameworkUtils.getService(context, PlatformAdmin.class).getService();
+        return new StandardResolutionFailureDetective(platformAdmin);
+    }
+
+    private OsgiFramework createOsgiFramework(BundleContext context, PackageAdmin packageAdmin,
+        TransformedManifestProvidingBundleFileWrapper bundleTransformerHandler) {
+        return new EquinoxOsgiFramework(context, packageAdmin, bundleTransformerHandler);
+    }
+
+    private QuasiFrameworkFactory createQuasiFrameworkFactory(BundleContext bundleContext, ResolutionFailureDetective detective,
+        Repository repository, TransformedManifestProvidingBundleFileWrapper bundleTransformerHandler, RegionDigraph regionDigraph,
+        DumpExtractor dumpExtractor) {
+        return new StandardQuasiFrameworkFactory(bundleContext, detective, repository, bundleTransformerHandler, regionDigraph, dumpExtractor);
+    }
+
+    private TransformedManifestProvidingBundleFileWrapper createBundleTransformationHandler(ImportExpansionHandler importExpander) {
+        return new TransformedManifestProvidingBundleFileWrapper(importExpander);
+    }
+
+    private ImportExpansionHandler createImportExpansionHandler(BundleContext context, PackageAdmin packageAdmin, Repository repository,
+        EventLogger eventLogger) {
+
+        Set<String> packagesExportedBySystemBundle = new HashSet<String>(30);
+        ExportedPackage[] exportedPackages = packageAdmin.getExportedPackages(context.getBundle(SYSTEM_BUNDLE_ID));
+
+        for (ExportedPackage exportedPackage : exportedPackages) {
+            packagesExportedBySystemBundle.add(exportedPackage.getName());
+        }
+
+        return new ImportExpansionHandler(repository, context, packagesExportedBySystemBundle, eventLogger);
+    }
+
+    private EquinoxHookRegistrar createHookRegistrar(BundleContext context, PackageAdmin packageAdmin,
+        TransformedManifestProvidingBundleFileWrapper bundleFileWrapper) {
+        MetaInfResourceClassLoaderDelegateHook hook = new MetaInfResourceClassLoaderDelegateHook(context, packageAdmin);
+        return new EquinoxHookRegistrar(bundleFileWrapper, hook);
+    }
+
+    private PackageAdminUtil createPackageAdminUtil(BundleContext context) {
+        return new StandardPackageAdminUtil(context);
+    }
+
+    private void scheduleRegistrationOfServiceScopingRegistryHooks(final BundleContext context, EventLogger eventLogger) {
+        Runnable runnable = new ServiceScopingHookRegisteringRunnable(context, this.registrationTracker, eventLogger);
+        Thread thread = new Thread(runnable);
+        thread.setDaemon(true);
+        thread.start();
+    }
+
+    private void scheduleInitialArtifactDeployerCreation(BundleContext context, EventLogger eventLogger) {
+        KernelStartedAwaiter startedAwaiter = new KernelStartedAwaiter();
+
+        Dictionary<String, String> properties = new Hashtable<String, String>();
+        properties.put(EventConstants.EVENT_TOPIC, "org/eclipse/virgo/kernel/*");
+        this.registrationTracker.track(context.registerService(EventHandler.class.getName(), startedAwaiter, properties));
+
+        Runnable runnable = new InitialArtifactDeployerCreatingRunnable(context, eventLogger, this.registrationTracker, startedAwaiter);
+        Thread thread = new Thread(runnable);
+        thread.setDaemon(true);
+        thread.start();
+    }
+    
+    private void initializeConsoleConfigurationConvertor(BundleContext context) {
+    	consoleConfigurationConvertor = new ConsoleConfigurationConvertor(context);
+    	consoleConfigurationConvertor.start();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void stop(BundleContext context) throws Exception {
+        this.registrationTracker.unregisterAll();
+        
+        if (this.consoleConfigurationConvertor != null) {
+        	this.consoleConfigurationConvertor.stop();
+        }
+
+        StateDumpMXBeanExporter localStateDumpMBeanExporter = this.stateDumpMBeanExorter;
+        if (localStateDumpMBeanExporter != null) {
+            localStateDumpMBeanExporter.close();
+            this.stateDumpMBeanExorter = null;
+        }
+
+        EquinoxHookRegistrar hookRegistrar = this.hookRegistrar;
+        if (hookRegistrar != null) {
+            hookRegistrar.destroy();
+            this.hookRegistrar = null;
+        }
+        
+    }
+
+    private static final class ServiceScopingHookRegisteringRunnable implements Runnable {
+
+        private final EventLogger eventLogger;
+
+        private final BundleContext context;
+
+        private final ServiceRegistrationTracker registrationTracker;
+
+        public ServiceScopingHookRegisteringRunnable(BundleContext context, ServiceRegistrationTracker registrationTracker, EventLogger eventLogger) {
+            this.context = context;
+            this.registrationTracker = registrationTracker;
+            this.eventLogger = eventLogger;
+        }
+
+        public void run() {
+            ScopeFactory scopeFactory = OsgiFrameworkUtils.getService(context, ScopeFactory.class).getService();
+            Shutdown shutdown = OsgiFrameworkUtils.getService(context, Shutdown.class).getService();
+
+            try {
+                ScopeServiceRepository scopeServiceRepository = getPotentiallyDelayedService(context, ScopeServiceRepository.class);
+
+                ServiceScopingStrategy serviceScopingStrategy = new ServiceScopingStrategy(scopeFactory, scopeServiceRepository);
+
+                ServiceScopingRegistryHook serviceScopingRegistryHook = new ServiceScopingRegistryHook(serviceScopingStrategy);
+
+                this.registrationTracker.track(context.registerService(new String[] { "org.osgi.framework.hooks.service.FindHook",
+                    "org.osgi.framework.hooks.service.EventHook" }, serviceScopingRegistryHook, null));
+            } catch (TimeoutException te) {
+                this.eventLogger.log(UserRegionLogEvents.KERNEL_SERVICE_NOT_AVAILABLE, te, getWaitLimitSeconds(), PROPERTY_KERNEL_STARTUP_WAIT_LIMIT);
+                shutdown.immediateShutdown();
+            } catch (InterruptedException ie) {
+                this.eventLogger.log(UserRegionLogEvents.USERREGION_START_INTERRUPTED, ie);
+                shutdown.immediateShutdown();
+            }
+        }
+    }
+
+    private static final class InitialArtifactDeployerCreatingRunnable implements Runnable {
+
+        private final BundleContext context;
+
+        private final EventLogger eventLogger;
+
+        private final KernelStartedAwaiter startAwaiter;
+
+        private final ServiceRegistrationTracker registrationTracker;
+
+        public InitialArtifactDeployerCreatingRunnable(BundleContext context, EventLogger eventLogger,
+            ServiceRegistrationTracker registrationTracker, KernelStartedAwaiter startAwaiter) {
+            this.context = context;
+            this.eventLogger = eventLogger;
+            this.startAwaiter = startAwaiter;
+            this.registrationTracker = registrationTracker;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public void run() {
+            EventAdmin eventAdmin = OsgiFrameworkUtils.getService(context, EventAdmin.class).getService();
+            Shutdown shutdown = OsgiFrameworkUtils.getService(context, Shutdown.class).getService();
+
+            try {
+                DeployUriNormaliser uriNormaliser = getPotentiallyDelayedService(context, DeployUriNormaliser.class);
+                ApplicationDeployer deployer = getPotentiallyDelayedService(context, ApplicationDeployer.class);
+
+                Dictionary<String, Object> artifactConfiguration = getRegionArtifactConfiguration();
+
+                InitialArtifactDeployer initialArtifactDeployer = new InitialArtifactDeployer(this.startAwaiter, deployer,
+                    artifactConfiguration.get(PROPERTY_USER_REGION_ARTIFACTS), artifactConfiguration.get(PROPERTY_USER_REGION_COMMANDLINE_ARTIFACTS),
+                    uriNormaliser, eventAdmin, eventLogger, shutdown);
+                Dictionary<String, String> properties = new Hashtable<String, String>();
+                properties.put(EventConstants.EVENT_TOPIC, "org/eclipse/virgo/kernel/*");
+                this.registrationTracker.track(context.registerService(EventHandler.class.getName(), initialArtifactDeployer, properties));
+
+                initialArtifactDeployer.deployArtifacts();
+            } catch (TimeoutException te) {
+                this.eventLogger.log(UserRegionLogEvents.KERNEL_SERVICE_NOT_AVAILABLE, te, getWaitLimitSeconds(), PROPERTY_KERNEL_STARTUP_WAIT_LIMIT);
+                shutdown.immediateShutdown();
+            } catch (InterruptedException ie) {
+                this.eventLogger.log(UserRegionLogEvents.USERREGION_START_INTERRUPTED, ie);
+                shutdown.immediateShutdown();
+            }
+        }
+
+        private Dictionary<String, Object> getRegionArtifactConfiguration() {
+            ConfigurationAdmin configAdmin = OsgiFrameworkUtils.getService(this.context, ConfigurationAdmin.class).getService();
+            try {
+                Configuration config = configAdmin.getConfiguration(USER_REGION_CONFIGURATION_PID, null);
+                Dictionary<String, Object> properties = (Dictionary<String, Object>) config.getProperties();
+                return properties;
+            } catch (IOException ioe) {
+                throw new RuntimeException("Failed to read region artifact configuration", ioe);
+            }
+        }
+
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/ConsoleConfigurationConvertor.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/ConsoleConfigurationConvertor.java
new file mode 100755
index 0000000..fda46a3
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/ConsoleConfigurationConvertor.java
@@ -0,0 +1,167 @@
+package org.eclipse.virgo.kernel.userregion.internal;
+
+import java.io.IOException;
+import java.net.BindException;
+import java.net.ServerSocket;
+import java.util.Dictionary;
+import java.util.Hashtable;
+
+import org.eclipse.virgo.kernel.osgi.framework.OsgiFrameworkUtils;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.cm.ConfigurationException;
+import org.osgi.service.cm.ManagedService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ConsoleConfigurationConvertor {
+	private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private final BundleContext context;
+
+    private final ConfigurationAdmin configAdmin;
+
+    private ServiceRegistration<ManagedService> configuratorRegistration;
+
+    private static final String CONSOLE_PID = "osgi.console";
+
+    private static final String TELNET_PID = "osgi.console.telnet";
+
+    private static final String SSH_PID = "osgi.console.ssh";
+
+    private static final String TELNET_PORT = "telnet.port";
+
+    private static final String TELNET_HOST = "telnet.host";
+
+    private static final String TELNET_ENABLED = "telnet.enabled";
+
+    private static final String SSH_PORT = "ssh.port";
+
+    private static final String SSH_HOST = "ssh.host";
+
+    private static final String SSH_ENABLED = "ssh.enabled";
+
+    private static final String HOST = "host";
+
+    private static final String PORT = "port";
+
+    private static final String ENABLED = "enabled";
+    
+    private static final String TELNET_SERVICE = "telnet";
+    
+    private static final String SSH_SERVICE = "ssh";
+    
+    private static final Object monitor = new Object();
+	
+	ConsoleConfigurationConvertor (BundleContext context) {
+		this.context = context;
+		this.configAdmin = OsgiFrameworkUtils.getService(context, ConfigurationAdmin.class).getService();
+	}
+	
+	public void start() {
+		Dictionary<String, String> consoleProperties = new Hashtable<String, String>();
+        consoleProperties.put(Constants.SERVICE_PID, CONSOLE_PID);
+        synchronized (ConsoleConfigurationConvertor.monitor) {
+            this.configuratorRegistration = this.context.registerService(ManagedService.class, new ConsoleConfigurator(), consoleProperties);
+        }
+	}
+	
+	private void updateConfiguration(String pid, String host, String port, String enabled) {
+		boolean isPortAvailable;
+    	if (pid.contains(TELNET_SERVICE)) {
+    		isPortAvailable = checkPortAvailability(port, enabled, TELNET_SERVICE);
+    	} else {
+    		isPortAvailable = checkPortAvailability(port, enabled, SSH_SERVICE);
+    	}
+    	
+    	if(!isPortAvailable) {
+    		return;
+    	}
+    	
+        try {
+            Configuration configuration = this.configAdmin.getConfiguration(pid, null);
+            Dictionary<String, Object> properties = new Hashtable<String, Object>();
+            properties.put(HOST, host);
+            properties.put(PORT, port);
+            properties.put(ENABLED, enabled);
+            configuration.update(properties);
+        } catch (IOException e) {
+            String message = String.format("Unable to update configuration with pid '%s'", pid);
+            this.logger.error(message, e);
+        }
+	}
+	
+	public void stop() {
+    	deleteConfiguration(TELNET_PID);
+    	deleteConfiguration(SSH_PID);
+    	deleteConfiguration(CONSOLE_PID);
+    }
+
+    private void deleteConfiguration(String pid) {
+        try {
+  			Configuration configuration = configAdmin.getConfiguration(pid, null);
+			configuration.delete();
+    	} catch (IOException e) {
+			String message = String.format("Unable to delete configuration with pid: " + pid);
+            this.logger.error(message, e);
+		}
+    }
+    
+    private boolean checkPortAvailability(String portStr, String enabled, String service) {
+    	if ("false".equalsIgnoreCase(enabled)) {
+    		return true;
+    	}
+    	int port = Integer.parseInt(portStr);
+    	ServerSocket socket = null;
+    	try {
+    		socket = new ServerSocket(port);
+    		return true;
+    	} catch (BindException e) {
+    		String message = "Port " + port + " already in use; " + service + " access to console will not be available";
+    		this.logger.error(message, e);
+    	} catch (IOException e) {
+			// do nothing
+		} finally {
+    		if (socket != null) {
+    			try {
+					socket.close();
+				} catch (IOException e) {
+					// do nothing
+				}
+    		}
+    	}
+    	return false;
+    }
+	
+	class ConsoleConfigurator implements ManagedService {
+	    private Dictionary<String, String> properties;
+		@SuppressWarnings({ "unchecked", "rawtypes" })
+		@Override
+		public void updated(Dictionary props) throws ConfigurationException {
+			if (props != null) {
+                this.properties = props;
+                this.properties.put(Constants.SERVICE_PID, CONSOLE_PID);
+            } else {
+                return;
+            }
+            synchronized (ConsoleConfigurationConvertor.monitor) {
+                ConsoleConfigurationConvertor.this.configuratorRegistration.setProperties(this.properties);
+            }
+
+            String telnetHost = (String) this.properties.get(TELNET_HOST);
+            String telnetPort = (String) this.properties.get(TELNET_PORT);
+            String telnetEnabled = (String) this.properties.get(TELNET_ENABLED);
+            updateConfiguration(TELNET_PID, telnetHost, telnetPort, telnetEnabled);
+
+            String sshHost = (String) this.properties.get(SSH_HOST);
+            String sshPort = (String) this.properties.get(SSH_PORT);
+            String sshEnabled = (String) this.properties.get(SSH_ENABLED);
+            updateConfiguration(SSH_PID, sshHost, sshPort, sshEnabled);		
+		}
+	}
+}
+
+
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/DumpExtractor.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/DumpExtractor.java
new file mode 100644
index 0000000..f4e8edd
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/DumpExtractor.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.zip.ZipException;
+
+/**
+ * <p>
+ * DumpExtractor provides an interface for clients to obtain state dumps and region digraph dumps.
+ * </p>
+ * 
+ * <strong>Concurrent Semantics</strong><br/>
+ * 
+ * Implementations of this interface must be thread safe.
+ * 
+ */
+public interface DumpExtractor {
+
+	public final static String STATE_DUMP_FILE_NAME = "osgi.zip";
+	
+	public final static String REGION_DIGRAPH_FILE_NAME = "region.digraph";
+	
+    /**
+     * Returns an unzipped version of the state dump zip file from the given dump directory.
+     * 
+     * @param dumpDir dump directory
+     * @return the unzipped state dump file
+     * @throws ZipException when unzipping
+     * @throws IOException when reading
+     */
+    public File getStateDump(File dumpDir) throws ZipException, IOException;
+
+    /**
+     * Returns a region digraph dump file from the given dump directory.
+     * 
+     * @param dumpDir dump directory
+     * @return the region digraph dump file
+     * @throws IOException when reading
+     */
+    public File getRegionDigraphDump(File dumpDir) throws IOException;
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/EmptyModuleContextAccessor.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/EmptyModuleContextAccessor.java
new file mode 100644
index 0000000..3273871
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/EmptyModuleContextAccessor.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal;
+
+import org.osgi.framework.Bundle;
+
+import org.eclipse.virgo.kernel.module.ModuleContext;
+import org.eclipse.virgo.kernel.module.ModuleContextAccessor;
+
+public class EmptyModuleContextAccessor implements ModuleContextAccessor {
+	public ModuleContext getModuleContext(Bundle bundle) {	
+		return null;
+	}
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/InitialArtifactDeployer.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/InitialArtifactDeployer.java
new file mode 100644
index 0000000..69a4cec
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/InitialArtifactDeployer.java
@@ -0,0 +1,184 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal;
+
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventHandler;
+
+
+import org.eclipse.virgo.nano.core.Shutdown;
+import org.eclipse.virgo.nano.deployer.api.core.ApplicationDeployer;
+import org.eclipse.virgo.nano.deployer.api.core.DeployUriNormaliser;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentOptions;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.util.common.StringUtils;
+
+
+/**
+ * <code>InitialArtifactDeployer</code> is responsible for deploying the configured
+ * set of initial artifacts.
+ * 
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Thread-safe.
+ *
+ */
+final class InitialArtifactDeployer implements EventHandler {
+    
+    private static final String THREAD_NAME_SYSTEM_ARTIFACTS = "system-artifacts";
+
+	private static final String THREAD_NAME_USER_ARTIFACTS = "user-artifacts";
+
+	private static final DeploymentOptions ARTIFACT_DEPLOYMENT_OPTIONS = new DeploymentOptions(false, false, true);
+    
+    private static final String TOPIC_SYSTEM_ARTIFACTS_DEPLOYED = "org/eclipse/virgo/kernel/userregion/systemartifacts/DEPLOYED";
+    
+    private static final String TOPIC_USER_ARTIFACTS_DEPLOYED = "org/eclipse/virgo/kernel/userregion/userartifacts/DEPLOYED";    
+    
+    private final ApplicationDeployer deployer;
+    
+    private final DeployUriNormaliser uriNormaliser;
+    
+    private final EventAdmin eventAdmin;
+    
+    private final String systemArtifactsProperty;
+    
+    private final String userArtifactsProperty;
+    
+    private final EventLogger eventLogger;
+    
+    private final Shutdown shutdown;
+    
+    private final KernelStartedAwaiter startAwaiter;
+
+    InitialArtifactDeployer(KernelStartedAwaiter startAwaiter, ApplicationDeployer deployer, Object systemArtifactsProperty, Object userArtifactsProperty, DeployUriNormaliser uriNormaliser, EventAdmin eventAdmin, EventLogger eventLogger, Shutdown shutdown) {
+        this.deployer = deployer;
+        this.uriNormaliser = uriNormaliser;
+        this.eventAdmin = eventAdmin;
+        if (systemArtifactsProperty != null) {
+        	this.systemArtifactsProperty = systemArtifactsProperty.toString();
+        } else {
+        	this.systemArtifactsProperty = null;
+        }
+        if (userArtifactsProperty != null) {
+        	this.userArtifactsProperty = userArtifactsProperty.toString();
+        } else {
+        	this.userArtifactsProperty = null;
+        }
+        this.eventLogger = eventLogger;
+        this.shutdown = shutdown;
+        this.startAwaiter = startAwaiter;
+    }
+    
+    /** 
+     * {@inheritDoc}
+     */
+    public void handleEvent(Event event) {
+    	if (TOPIC_SYSTEM_ARTIFACTS_DEPLOYED.equals(event.getTopic())) {
+    	    this.eventLogger.log(UserRegionLogEvents.SYSTEM_ARTIFACTS_DEPLOYED);
+    		deployUserArtifacts();
+    	}
+    }
+    
+    void deployArtifacts() throws InterruptedException {
+        
+        this.startAwaiter.awaitKernelStarted();
+        
+    	List<URI> systemArtifacts = getSystemArtifacts();
+    	deployArtifacts(systemArtifacts, THREAD_NAME_SYSTEM_ARTIFACTS, TOPIC_SYSTEM_ARTIFACTS_DEPLOYED);    	
+    }
+    
+    private void deployUserArtifacts(){
+    	List<URI> userArtifacts = getUserArtifacts();
+    	deployArtifacts(userArtifacts, THREAD_NAME_USER_ARTIFACTS, TOPIC_USER_ARTIFACTS_DEPLOYED);
+    }
+    
+    private List<URI> getUserArtifacts() {    	
+    	return getRepositoryUrisForArtifacts(this.userArtifactsProperty);
+    }
+    
+    private List<URI> getSystemArtifacts() {
+    	return getRepositoryUrisForArtifacts(this.systemArtifactsProperty);
+    }
+    
+    private List<URI> getRepositoryUrisForArtifacts(String artifactsProperty) {
+    	String[] artifacts = StringUtils.commaDelimitedListToStringArray(artifactsProperty);
+        
+        List<URI> repositoryUris = new ArrayList<URI>();
+        
+        for (String artifact : artifacts) {
+            repositoryUris.add(URI.create(artifact.trim()));
+        }
+        
+        return repositoryUris;
+    }
+
+    private void deployArtifacts(List<URI> artifacts, String threadName, String completionEventTopic) {
+    	Runnable artifactDeployingRunnable = new ArtifactDeployingRunnable(artifacts, completionEventTopic);    	
+        Thread deployThread = new Thread(artifactDeployingRunnable, threadName);
+        deployThread.start();
+    }
+    
+    private final class ArtifactDeployingRunnable implements Runnable {
+    	
+    	private final List<URI> artifacts;
+    	
+    	private final String completionEventTopic;
+    	
+    	private ArtifactDeployingRunnable(List<URI> artifacts, String completionEventTopic) {
+    		this.artifacts = artifacts;
+    		this.completionEventTopic = completionEventTopic;
+    	}
+    	
+		public void run() {
+			try {
+				validateArtifacts();      
+				deployArtifacts();
+				eventAdmin.postEvent(new Event(this.completionEventTopic, (Map<String, ?>)null));
+			} catch (DeploymentException de) {
+				eventLogger.log(UserRegionLogEvents.INITIAL_ARTIFACT_DEPLOYMENT_FAILED);
+				shutdown.shutdown();
+			}
+		}
+		
+		private void deployArtifacts() throws DeploymentException {
+	        for (URI artifact : this.artifacts) {
+	            deployer.deploy(artifact, ARTIFACT_DEPLOYMENT_OPTIONS);
+	        }
+	    }
+		
+	    private void validateArtifacts() throws DeploymentException {
+	        boolean normaliseFailed = false;
+	        
+	        for (URI uri : this.artifacts) {
+	            try {
+	                uriNormaliser.normalise(uri);
+	            } catch (DeploymentException de) {
+	                normaliseFailed = true;
+	            }
+	        }
+	        
+	        if (normaliseFailed) {
+	            throw new DeploymentException("Validation of artifacts failed");
+	        }
+	    }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/KernelStartedAwaiter.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/KernelStartedAwaiter.java
new file mode 100644
index 0000000..66392ba
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/KernelStartedAwaiter.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal;
+
+import java.util.concurrent.CountDownLatch;
+
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventHandler;
+
+
+/**
+ * A helper class that awaits the <code>EventAdmin<code> event for the
+ * kernel having started.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Thread-safe.
+ *
+ */
+final class KernelStartedAwaiter implements EventHandler {
+    
+    private static final String TOPIC_KERNEL_STARTED = "org/eclipse/virgo/kernel/STARTED";
+    
+    private final CountDownLatch latch = new CountDownLatch(1);
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void handleEvent(Event event) {
+        if (TOPIC_KERNEL_STARTED.equals(event.getTopic())) {
+            this.latch.countDown();
+        }
+    }
+    
+    void awaitKernelStarted() throws InterruptedException {
+        this.latch.await();
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/ServiceScopingRegistryHook.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/ServiceScopingRegistryHook.java
new file mode 100644
index 0000000..b43ff15
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/ServiceScopingRegistryHook.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal;
+
+import java.util.Collection;
+import java.util.Iterator;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceEvent;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.hooks.service.EventHook;
+import org.osgi.framework.hooks.service.FindHook;
+
+/**
+ * Service registry hook that enforces the service scoping behaviour.
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.
+ * 
+ */
+@SuppressWarnings("deprecation")
+final class ServiceScopingRegistryHook implements FindHook, EventHook {
+
+	private final ServiceScopingStrategy serviceScopingStrategy;
+
+	public ServiceScopingRegistryHook(
+			ServiceScopingStrategy serviceScopingStrategy) {
+		this.serviceScopingStrategy = serviceScopingStrategy;
+	}
+
+	@SuppressWarnings("unchecked")
+	public void find(BundleContext context, String name, String filter,
+			boolean allServices,
+			@SuppressWarnings("rawtypes") Collection references) {
+		this.serviceScopingStrategy.scopeReferences(references, context, name,
+				filter);
+	}
+
+	@SuppressWarnings("rawtypes")
+	public void event(ServiceEvent event, Collection contexts) {
+		ServiceReference ref = event.getServiceReference();
+		for (Iterator iterator = contexts.iterator(); iterator.hasNext();) {
+			BundleContext context = (BundleContext) iterator.next();
+			if (!this.serviceScopingStrategy.isPotentiallyVisible(ref, context)) {
+				iterator.remove();
+			}
+		}
+	}
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/ServiceScopingStrategy.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/ServiceScopingStrategy.java
new file mode 100644
index 0000000..b3c752d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/ServiceScopingStrategy.java
@@ -0,0 +1,186 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+
+import org.eclipse.virgo.nano.shim.scope.Scope;
+import org.eclipse.virgo.nano.shim.scope.ScopeFactory;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.eclipse.virgo.kernel.install.artifact.ScopeServiceRepository;
+
+/**
+ * {@link ServiceScopingStrategy} encapsulates the service scoping algorithms used by {@link ServiceScopingRegistryHook}
+ * .
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread safe.
+ * 
+ */
+final class ServiceScopingStrategy {
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private final ScopeFactory scopeFactory;
+
+    private ScopeServiceRepository scopeServiceRepository;
+
+    public ServiceScopingStrategy(ScopeFactory scopeFactory, ScopeServiceRepository scopeServiceRepository) {
+        this.scopeFactory = scopeFactory;
+        this.scopeServiceRepository = scopeServiceRepository;
+    }
+
+    /**
+     * Returns true if and only the given service reference is potentially visible from the given bundle context. This
+     * is the case if and only if the service reference is in the same scope as the bundle context or the service
+     * reference is in the global scope.
+     * <p/>
+     * The given service reference may not be actually visible from the given bundle context if the given service
+     * reference is in the global scope, the given bundle context is scoped, and there is another service in the scope
+     * which shadows the given service reference.
+     */
+    boolean isPotentiallyVisible(ServiceReference<?> serviceReference, BundleContext consumingBundleContext) {
+        boolean matchesScope = true;
+        Scope serviceScope = getServiceScope(serviceReference);
+        if (serviceScope != null && !serviceScope.isGlobal()) {
+            Scope bundleScope = this.scopeFactory.getBundleScope(consumingBundleContext.getBundle());
+            if (!bundleScope.equals(serviceScope)) {
+                matchesScope = false;
+            }
+        }
+        return matchesScope;
+    }
+
+    /**
+     * Takes the given collection of service references and restricts the collection to the scope of the given bundle
+     * context. It is not sufficient simply to discard service references in non-matching scopes because the global
+     * scope may (see below) be searched after an application scope.
+     * <p/>
+     * The exact behaviour depends on the {@link ScopeServiceRepository} which models, with varying degrees of accuracy,
+     * the services which are published in a particular scope. One variation in accuracy is due to the fact that web
+     * bundles typically have their application context files in a directory other than <code>META-INF/spring</code> and
+     * this is not currently taken into account when the repository is built. Another variation is due to the fact that
+     * Spring DM supports a manifest header which specifies the directory containing application context files. Again
+     * this is not currently taken into account when the repository is built.
+     */
+    void scopeReferences(Collection<ServiceReference<?>> references, BundleContext consumingBundleContext, String className, String filter) {
+        Bundle consumingBundle = consumingBundleContext.getBundle();
+        Scope lookupScope = getLookupScope(consumingBundle, className, filter);
+        Scope consumerScope = getBundleScope(consumingBundle);
+        
+        /*
+         * If the consumer is scoped, look in the consumer's scope before looking in the global scope. This avoids wrongly using
+         * the global scope when the service model did not include services which are nevertheless present in the application scope.
+         * If some of the service references are in the consumer's scope, restrict the set to just those.
+         */
+        if (lookupScope.isGlobal() && !consumerScope.isGlobal()) {
+            Collection<ServiceReference<?>> scopedReferences = getScopedReferences(references, consumerScope);
+            if (!scopedReferences.isEmpty()) {
+                removeAllExcept(references, scopedReferences);
+                return;
+            }
+        }
+        restrictServicesToScope(references, lookupScope);
+    }
+
+    private void removeAllExcept(Collection<ServiceReference<?>> references, Collection<ServiceReference<?>> scopedReferences) {
+        /*
+         * The simple implementation of clearing references and then using addAll to add
+         * in scopedReferences is no good as the find hook is passed a shrinkable collection
+         * that does not support add or addAll.
+         */
+        Iterator<ServiceReference<?>> iterator = references.iterator();
+        while (iterator.hasNext()) {
+            ServiceReference<?> ref = iterator.next();
+            if (!scopedReferences.contains(ref)) {
+                iterator.remove();
+            }
+        }
+    }
+
+    private Collection<ServiceReference<?>> getScopedReferences(Collection<ServiceReference<?>> references, Scope scope) {
+        Collection<ServiceReference<?>> scopedReferences = new HashSet<ServiceReference<?>>();
+        logger.debug("References input to getScopedReferences: {}", references.size());
+        Iterator<ServiceReference<?>> iterator = references.iterator();
+        while (iterator.hasNext()) {
+            ServiceReference<?> ref = iterator.next();
+            Scope serviceScope = getServiceScope(ref);
+            if (scope.equals(serviceScope)) {
+                logger.debug("Adding {} ", ref);
+                scopedReferences.add(ref);
+            }
+        }
+        logger.debug("References output from getScopedReferences: {}", scopedReferences.size());
+        return scopedReferences;
+    }
+
+    private void restrictServicesToScope(Collection<ServiceReference<?>> references, Scope scope) {
+        logger.debug("Before filtering: {}", references.size());
+        Iterator<ServiceReference<?>> iterator = references.iterator();
+        while (iterator.hasNext()) {
+            ServiceReference<?> ref = (ServiceReference<?>) iterator.next();
+            Scope serviceScope = getServiceScope(ref);
+            if (!scope.equals(serviceScope)) {
+                logger.debug("Removing {} ", ref);
+                iterator.remove();
+            }
+        }
+        logger.debug("After filtering: {}", references.size());
+    }
+
+    /**
+     * Gets the {@link Scope} in which this lookup is being performed.
+     */
+    private Scope getLookupScope(Bundle consumer, String name, String filter) {
+        Scope consumerScope = getBundleScope(consumer);
+        /*
+         * The lookup scope is that of the consuming bundle unless the consuming bundle is in an application scope with
+         * no service matching the given name and filter in which case the lookup scope is global.
+         */
+        Scope lookupScope = !consumerScope.isGlobal() && !scopeHasMatchingService(consumerScope, name, filter) ? this.scopeFactory.getGlobalScope()
+            : consumerScope;
+        logger.debug("{} > {} [{}] ({})", new Object[] { lookupScope, name, filter, consumer });
+        return lookupScope;
+    }
+
+    private Scope getBundleScope(Bundle consumer) {
+        return this.scopeFactory.getBundleScope(consumer);
+    }
+
+    private boolean scopeHasMatchingService(Scope scope, String name, String filter) {
+        try {
+            return this.scopeServiceRepository.scopeHasMatchingService(scope.getScopeName(), name, filter);
+        } catch (InvalidSyntaxException e) {
+            logger.warn("Filter '{}' is not valid", e, filter);
+            return false;
+        }
+    }
+
+    private Scope getServiceScope(ServiceReference<?> ref) {
+        try {
+            return this.scopeFactory.getServiceScope(ref);
+        } catch (IllegalStateException ise) {
+            return null;
+        }
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/UserRegionConfigurationDeployer.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/UserRegionConfigurationDeployer.java
new file mode 100644
index 0000000..cec0e79
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/UserRegionConfigurationDeployer.java
@@ -0,0 +1,82 @@
+
+package org.eclipse.virgo.kernel.userregion.internal;
+
+import java.io.IOException;
+import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.Properties;
+
+import org.eclipse.virgo.nano.deployer.api.config.ConfigurationDeployer;
+import org.eclipse.virgo.kernel.osgi.framework.OsgiFrameworkUtils;
+import org.osgi.framework.BundleContext;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+
+/**
+ * This service is registered in the user region so that it has access to the configuration admin in the user region.
+ * The kernel region can use it as a proxy to access the configuration admin in the user region.
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread-safe.
+ */
+public class UserRegionConfigurationDeployer implements ConfigurationDeployer {
+
+    private ConfigurationAdmin configurationAdmin;
+
+    private Object monitor = new Object();
+
+    public UserRegionConfigurationDeployer(BundleContext context) {
+        this.configurationAdmin = OsgiFrameworkUtils.getService(context, ConfigurationAdmin.class).getService();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void publishConfiguration(String pid, Properties configurationProperties) throws IOException {
+        synchronized (monitor) {
+            Configuration configuration = this.configurationAdmin.getConfiguration(pid, null);
+            Dictionary<String, Object> properties = new Hashtable<String, Object>();
+            for (String prop : configurationProperties.stringPropertyNames()) {
+            	properties.put(prop, configurationProperties.get(prop));
+            }
+            configuration.update(properties);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void deleteConfiguration(String pid) throws IOException {
+        synchronized (monitor) {
+            Configuration configuration = this.configurationAdmin.getConfiguration(pid, null);
+            configuration.delete();
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Properties getConfiguration(String pid) throws IOException {
+        synchronized (monitor) {
+            Configuration configuration = this.configurationAdmin.getConfiguration(pid, null);
+            if (configuration != null) {
+                Properties properties = new Properties();
+                Dictionary<?, ?> props = configuration.getProperties();
+                Enumeration<?> keys = props.keys();
+                while (keys.hasMoreElements()) {
+                    Object key = keys.nextElement();
+                    Object value = props.get(key);
+                    properties.put(key, value);
+                }
+                return properties;
+            } else {
+                return null;
+            }
+        }
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/UserRegionLogEvents.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/UserRegionLogEvents.java
new file mode 100644
index 0000000..213c2f0
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/UserRegionLogEvents.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal;
+
+import org.eclipse.virgo.nano.serviceability.LogEventDelegate;
+import org.eclipse.virgo.medic.eventlog.Level;
+import org.eclipse.virgo.medic.eventlog.LogEvent;
+
+/**
+ * User region log events.
+ * <p />
+ * 
+ */
+public enum UserRegionLogEvents implements LogEvent {
+
+    SYSTEM_ARTIFACTS_DEPLOYED(1, Level.INFO), //
+    INITIAL_ARTIFACT_DEPLOYMENT_FAILED(2, Level.ERROR), //
+    SYSTEM_BUNDLE_OVERLAP(3, Level.WARNING), //
+    ALTERNATE_INSTRUMENTED_LIBRARY_FOUND(4, Level.WARNING),
+    KERNEL_SERVICE_NOT_AVAILABLE(5, Level.ERROR),
+    USERREGION_START_INTERRUPTED(6, Level.ERROR);
+    
+    private static final String PREFIX = "UR";
+
+    private final LogEventDelegate delegate;
+
+    private UserRegionLogEvents(int code, Level level) {
+        this.delegate = new LogEventDelegate(PREFIX, code, level);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getEventCode() {
+        return this.delegate.getEventCode();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Level getLevel() {
+        return this.delegate.getLevel();
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/dump/StandardDumpExtractor.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/dump/StandardDumpExtractor.java
new file mode 100644
index 0000000..f98ece3
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/dump/StandardDumpExtractor.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.dump;
+
+import java.io.File;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.util.zip.ZipException;
+
+import org.eclipse.virgo.kernel.services.work.WorkArea;
+import org.eclipse.virgo.kernel.userregion.internal.DumpExtractor;
+import org.eclipse.virgo.util.io.FileSystemUtils;
+import org.eclipse.virgo.util.io.PathReference;
+import org.eclipse.virgo.util.io.ZipUtils;
+
+/**
+ * <p>
+ * DumpStateExtractor can extract the OSGi state from a dump directory and place it in a staging location for use by
+ * clients of this class. It can also locate the region digraph dump in a dump directory.
+ * </p>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread safe.
+ * 
+ */
+public final class StandardDumpExtractor implements DumpExtractor {
+
+    private final File stagingDir;
+
+    /**
+     * @param workArea to extract dumps to
+     */
+    public StandardDumpExtractor(WorkArea workArea) {
+        this.stagingDir = workArea.getWorkDirectory().newChild("extracted-state-dumps").createDirectory().toFile();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public File getStateDump(File dump) throws ZipException, IOException {
+        File stateDumpZipFile = getDumpFile(dump, STATE_DUMP_FILE_NAME);
+
+        return unzip(stateDumpZipFile);
+    }
+
+    private File getDumpFile(File dumpDirectory, final String fileName) throws IOException {
+        if (dumpDirectory == null) {
+            throw new IllegalArgumentException("Requested dump cannot be null");
+        }
+        
+        File[] dumpFiles = FileSystemUtils.listFiles(dumpDirectory, new FilenameFilter() {
+
+            public boolean accept(File dir, String name) {
+                return name.equals(fileName);
+            }
+        });
+        if (dumpFiles.length != 1) {
+            throw new IOException(String.format("Exactly one dump file with name '%s' expected, found '%s'", fileName, dumpFiles.length));
+        }
+        return dumpFiles[0];
+    }
+
+    private File unzip(File stateDumpZipFile) throws IOException {
+        PathReference zipFile = new PathReference(stateDumpZipFile);
+        PathReference dest = new PathReference(this.stagingDir);
+        return new File(ZipUtils.unzipTo(zipFile, dest).toFile(), "state");
+    }
+
+    public File getRegionDigraphDump(File dump) throws IOException {
+        return getDumpFile(dump, REGION_DIGRAPH_FILE_NAME);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/equinox/EquinoxBootDelegationHelper.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/equinox/EquinoxBootDelegationHelper.java
new file mode 100644
index 0000000..b949106
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/equinox/EquinoxBootDelegationHelper.java
@@ -0,0 +1,101 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.equinox;
+
+import java.util.ArrayList;
+
+/**
+ * A helper class for determinining whether or not Equinox will load a class via boot delegation.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread-safe.
+ * 
+ */
+class EquinoxBootDelegationHelper {
+
+    private final String[] exactPackageNames;
+
+    private final String[] startsWithPackageNames;
+
+    private final boolean allPackagesAreBootDelegated;
+
+    /**
+     * Create a new BootDelegationHelper that will provide boot delegation information for the given Equinox OSGi
+     * Framework.
+     * 
+     * @param bootDelegationProperty The Equinox boot delegation property from which boot delegation information is to
+     *        be derived.
+     */
+    public EquinoxBootDelegationHelper(String bootDelegationProperty) {
+
+        boolean delegateAllPackages = false;
+        ArrayList<String> stemMatches = new ArrayList<String>();
+        ArrayList<String> exactMatches = new ArrayList<String>();
+
+        if (bootDelegationProperty != null && bootDelegationProperty.trim().length() > 0) {
+
+            String[] components = bootDelegationProperty.split(",");
+            for (String component : components) {
+                component = component.trim();
+                if (component.equals("*")) {
+                    delegateAllPackages = true;
+                } else if (component.length() > 2 && component.endsWith(".*")) {
+                    stemMatches.add(component.substring(0, component.length() - 2));
+                } else {
+                    exactMatches.add(component);
+                }
+            }
+        }
+
+        this.exactPackageNames = exactMatches.toArray(new String[exactMatches.size()]);
+        this.startsWithPackageNames = stemMatches.toArray(new String[stemMatches.size()]);
+        this.allPackagesAreBootDelegated = delegateAllPackages;
+    }
+
+    /**
+     * Returns true if the class with the given name will be loaded via boot delegation
+     * 
+     * @param className The name of the class
+     * @return Whether the class will be loaded via boot delegation.
+     */
+    public boolean isBootDelegated(String className) {
+        if (this.allPackagesAreBootDelegated) {
+            return true;
+        } else {
+            for (String packageStem : this.startsWithPackageNames) {
+                if (className.startsWith(packageStem)) {
+                    return true;
+                }
+            }
+            String packageName = determinePackageName(className);
+            if (packageName != null) {
+                for (String exactPackage : this.exactPackageNames) {
+                    if (packageName.equals(exactPackage)) {
+                        return true;
+                    }
+                }
+            }
+        }
+        return false;
+    }
+
+    private static String determinePackageName(String className) {
+        int dotIndex = className.lastIndexOf('.');
+
+        if (dotIndex == -1 || dotIndex == 0) {
+            return null;
+        } else {
+            return className.substring(0, dotIndex);
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/equinox/EquinoxHookRegistrar.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/equinox/EquinoxHookRegistrar.java
new file mode 100644
index 0000000..0bd099f
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/equinox/EquinoxHookRegistrar.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.equinox;
+
+import org.eclipse.osgi.framework.adaptor.ClassLoaderDelegateHook;
+
+import org.eclipse.virgo.kernel.equinox.extensions.hooks.BundleFileClosingBundleFileWrapperFactoryHook;
+import org.eclipse.virgo.kernel.equinox.extensions.hooks.PluggableBundleFileWrapperFactoryHook;
+import org.eclipse.virgo.kernel.equinox.extensions.hooks.PluggableClassLoadingHook;
+import org.eclipse.virgo.kernel.equinox.extensions.hooks.PluggableDelegatingClassLoaderDelegateHook;
+
+/**
+ * <code>EquinoxHookRegistrar</code> is responsible for registering
+ * the kernel's hooks with Equinox.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread-safe.
+ * 
+ */
+public final class EquinoxHookRegistrar  {
+
+    private final TransformedManifestProvidingBundleFileWrapper bundleFileWrapper;
+    
+    private final ClassLoaderDelegateHook metaInfResourceClassLoaderDelegateHook;
+
+    public EquinoxHookRegistrar(TransformedManifestProvidingBundleFileWrapper bundleFileWrapper, ClassLoaderDelegateHook metaInfResourceClassLoaderDelegateHook) {
+        this.bundleFileWrapper = bundleFileWrapper;
+        this.metaInfResourceClassLoaderDelegateHook = metaInfResourceClassLoaderDelegateHook;
+    }
+
+    public void init() {
+        PluggableClassLoadingHook.getInstance().setClassLoaderCreator(new KernelClassLoaderCreator());
+        PluggableBundleFileWrapperFactoryHook.getInstance().setBundleFileWrapper(this.bundleFileWrapper);
+        PluggableDelegatingClassLoaderDelegateHook.getInstance().addDelegate(this.metaInfResourceClassLoaderDelegateHook);
+    }
+    
+    public void destroy() throws Exception {
+        PluggableClassLoadingHook.getInstance().setClassLoaderCreator(null);
+        PluggableBundleFileWrapperFactoryHook.getInstance().setBundleFileWrapper(null);
+        PluggableDelegatingClassLoaderDelegateHook.getInstance().removeDelegate(this.metaInfResourceClassLoaderDelegateHook);
+        BundleFileClosingBundleFileWrapperFactoryHook.getInstance().cleanup();
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/equinox/EquinoxOsgiFramework.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/equinox/EquinoxOsgiFramework.java
new file mode 100644
index 0000000..06efd76
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/equinox/EquinoxOsgiFramework.java
@@ -0,0 +1,164 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.equinox;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.osgi.framework.internal.core.FrameworkProperties;
+import org.eclipse.osgi.service.resolver.PlatformAdmin;
+import org.eclipse.osgi.service.resolver.State;
+import org.eclipse.virgo.kernel.osgi.framework.ManifestTransformer;
+import org.eclipse.virgo.kernel.osgi.framework.OsgiFrameworkUtils;
+import org.eclipse.virgo.kernel.osgi.framework.OsgiServiceHolder;
+import org.eclipse.virgo.kernel.osgi.framework.support.AbstractOsgiFramework;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.packageadmin.PackageAdmin;
+
+/**
+ * Implementation of <code>OsgiFramework</code> using Equinox.
+ * 
+ */
+@SuppressWarnings("deprecation")
+public class EquinoxOsgiFramework extends AbstractOsgiFramework {
+    
+    private static final String FILE_SCHEME = "file:";
+    
+    private static final String REFERENCE_SCHEME = "reference:";
+
+    private final OsgiServiceHolder<PlatformAdmin> platformAdmin;
+
+    private final EquinoxBootDelegationHelper bootDelegationHelper;
+    
+    private final TransformedManifestProvidingBundleFileWrapper bundleTransformationHandler;
+
+
+    /**
+     * Creates a new <code>EquinoxOsgiFramework</code>.
+     * @param context execution context of bundle
+     * @param packageAdmin framework service for access to {@link State}
+     * @param bundleTransformationHandler wrapper for bundle manifest transformations
+     */
+    public EquinoxOsgiFramework(BundleContext context, PackageAdmin packageAdmin, TransformedManifestProvidingBundleFileWrapper bundleTransformationHandler) {
+        super(context, packageAdmin);
+        this.bootDelegationHelper = new EquinoxBootDelegationHelper(FrameworkProperties.getProperty(org.osgi.framework.Constants.FRAMEWORK_BOOTDELEGATION));
+        this.platformAdmin = OsgiFrameworkUtils.getService(context, PlatformAdmin.class);
+        this.bundleTransformationHandler = bundleTransformationHandler;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void refresh(Bundle bundle) throws BundleException {
+        ClassLoader cl = getBundleClassLoader(bundle);
+        List<Bundle> refreshBundles = new ArrayList<Bundle>();
+        if (cl instanceof KernelBundleClassLoader) {
+            KernelBundleClassLoader pbcl = (KernelBundleClassLoader) cl;
+            if (pbcl.isInstrumented()) {
+                Bundle[] dependencies = getDirectDependencies(bundle);
+                for (Bundle dependency : dependencies) {
+                    if (OsgiFrameworkUtils.sameScope(bundle, dependency)) {
+                        dependency.update();
+                        refreshBundles.add(dependency);
+                    }
+                }
+            }
+        }
+        bundle.update();
+        refreshBundles.add(bundle);
+        Bundle[] toRefresh = refreshBundles.toArray(new Bundle[refreshBundles.size()]);
+        getPackageAdmin().refreshPackages(toRefresh);
+    }
+
+    final void stop() {
+        if (this.platformAdmin != null) {
+            getBundleContext().ungetService(this.platformAdmin.getServiceReference());
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public ClassLoader getBundleClassLoader(Bundle bundle) {
+        return EquinoxUtils.getBundleClassLoader(bundle);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isBootDelegated(String className) {
+        if (this.bootDelegationHelper != null) {
+            return this.bootDelegationHelper.isBootDelegated(className);
+        }
+
+        throw new IllegalStateException("OsgiFramework must have been started prior to querying its boot delegation");
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Bundle[] getDirectDependencies(Bundle bundle, boolean includeFragments) {
+        BundleContext bundleContext = getBundleContext();
+        ServiceReference<PlatformAdmin> serviceRef = bundleContext.getServiceReference(PlatformAdmin.class);
+        try {
+            PlatformAdmin serverAdmin = (PlatformAdmin) bundleContext.getService(serviceRef);
+            return EquinoxUtils.getDirectDependencies(bundle, bundleContext, serverAdmin, includeFragments);
+        } finally {
+            bundleContext.ungetService(serviceRef);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Bundle[] getDirectDependencies(Bundle bundle) {
+        return getDirectDependencies(bundle, false);
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void update(Bundle bundle, ManifestTransformer manifestTransformer, File location) throws BundleException {
+        this.bundleTransformationHandler.pushManifestTransformer(manifestTransformer);
+        try {
+            bundle.update(openBundleStream(location));
+        } finally {
+            this.bundleTransformationHandler.popManifestTransformer();
+        }
+    }
+    
+    private InputStream openBundleStream(File location) throws BundleException {
+        String absoluteBundleUriString = getAbsoluteUriString(location);
+
+        try {
+            // Use the reference: scheme to obtain an InputStream for either a file or a directory.
+            return new URL(REFERENCE_SCHEME + absoluteBundleUriString).openStream();
+
+        } catch (MalformedURLException e) {
+            throw new BundleException("Invalid bundle URI '" + absoluteBundleUriString + "'", e);
+        } catch (IOException e) {
+            throw new BundleException("Invalid bundle at URI '" + absoluteBundleUriString + "'", e);
+        }
+    }
+
+    private String getAbsoluteUriString(File location) throws BundleException {
+        return FILE_SCHEME + location.getAbsolutePath();
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/equinox/EquinoxUtils.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/equinox/EquinoxUtils.java
new file mode 100644
index 0000000..1bc62f2
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/equinox/EquinoxUtils.java
@@ -0,0 +1,137 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.equinox;
+
+import java.lang.reflect.Method;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.osgi.framework.internal.core.BundleHost;
+import org.eclipse.osgi.internal.loader.BundleLoader;
+import org.eclipse.osgi.service.resolver.BundleDescription;
+import org.eclipse.osgi.service.resolver.ExportPackageDescription;
+import org.eclipse.osgi.service.resolver.PlatformAdmin;
+import org.eclipse.osgi.service.resolver.State;
+import org.eclipse.virgo.kernel.osgi.framework.BundleClassLoaderUnavailableException;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+
+/**
+ * Utility methods for working with Equinox internals.
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.
+ * 
+ */
+public final class EquinoxUtils {
+
+    /**
+     * Gets the {@link ClassLoader} for the supplied {@link Bundle}.
+     * 
+     * @param bundle the bundle.
+     * @return the bundle <code>ClassLoader</code>.
+     */
+    public static ClassLoader getBundleClassLoader(Bundle bundle) {
+        ClassLoader classLoader = null;
+        if (BundleHost.class.isAssignableFrom(bundle.getClass())) {
+            BundleHost bundleHost = (BundleHost) bundle;
+
+            Class<?>[] parmTypes = {};
+            Method checkLoaderMethod;
+            try {
+                checkLoaderMethod = BundleHost.class.getDeclaredMethod("checkLoader", parmTypes);
+                Object[] args = {};
+                checkLoaderMethod.setAccessible(true);
+                BundleLoader bundleLoader = (BundleLoader) checkLoaderMethod.invoke(bundleHost, args);
+
+                if (bundleLoader == null) {
+                    throw new IllegalStateException("Unable to access BundleLoader for bundle '" + bundle.getSymbolicName() + "'.");
+                }
+
+                Method createClassLoaderMethod = BundleLoader.class.getDeclaredMethod("createClassLoader", parmTypes);
+                createClassLoaderMethod.setAccessible(true);
+
+                classLoader = (ClassLoader) createClassLoaderMethod.invoke(bundleLoader, args);
+            } catch (Exception e) {
+                throw new BundleClassLoaderUnavailableException("Failed to get class loader for bundle '" + bundle
+                    + "' - possible resolution problem.", e);
+            }
+        }
+        return classLoader;
+    }
+
+    /**
+     * Gets all direct dependencies of the supplied {@link Bundle}.
+     * 
+     * @param bundle the <code>Bundle</code>.
+     * @param bundleContext the {@link BundleContext} to use for service access - typically the system
+     *        <code>BundleContext</code>.
+     * @param serverAdmin the {@link PlatformAdmin} service.
+     * @return the direct dependencies.
+     */
+    public static Bundle[] getDirectDependencies(Bundle bundle, BundleContext bundleContext, PlatformAdmin serverAdmin) {
+        return getDirectDependencies(bundle, bundleContext, serverAdmin, false);
+    }
+
+    /**
+     * Gets all direct dependencies of the supplied {@link Bundle}, optionally included fragments of the direct
+     * dependencies in the returned array.
+     * 
+     * @param bundle the <code>Bundle</code>.
+     * @param bundleContext the {@link BundleContext} to use for service access - typically the system
+     *        <code>BundleContext</code>.
+     * @param serverAdmin the {@link PlatformAdmin} service.
+     * @param includeFragments whether to include fragments or no
+     * @return an array of {@link Bundle}s which are direct dependencies
+     */
+    public static Bundle[] getDirectDependencies(Bundle bundle, BundleContext bundleContext, PlatformAdmin serverAdmin, boolean includeFragments) {
+        State state = serverAdmin.getState(false);
+
+        ExportPackageDescription[] exportPackageDescriptions = serverAdmin.getStateHelper().getVisiblePackages(state.getBundle(bundle.getBundleId()));
+
+        Set<Bundle> dependencies = new HashSet<Bundle>();
+
+        for (ExportPackageDescription exportPackageDescription : exportPackageDescriptions) {
+            BundleDescription bundleDescription = exportPackageDescription.getExporter();
+            if (bundleDescription.getBundleId() != bundle.getBundleId()) {
+                Bundle dependencyBundle = bundleContext.getBundle(bundleDescription.getBundleId());
+                // Handle an uninstalled dependent bundle gracefully.
+                if (dependencyBundle != null) {
+                    dependencies.add(dependencyBundle);
+                    if (includeFragments) {
+                        BundleDescription[] fragmentDescriptions = bundleDescription.getFragments();
+                        for (BundleDescription fragmentDescription : fragmentDescriptions) {
+                            Bundle fragment = bundleContext.getBundle(fragmentDescription.getBundleId());
+                            if (fragment != null) {
+                                dependencies.add(fragment);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        return dependencies.toArray(new Bundle[dependencies.size()]);
+    }
+
+    /**
+     * Queries whether the supplied {@link Bundle} is the system bundle.
+     * 
+     * @param bundle the <code>Bundle</code>.
+     * @return <code>true</code> if <code>bundle</code> is the system bundle, otherwise <code>false</code>.
+     */
+    public static boolean isSystemBundle(Bundle bundle) {
+        return bundle != null && bundle.getBundleId() == 0;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/equinox/KernelBundleClassLoader.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/equinox/KernelBundleClassLoader.java
new file mode 100644
index 0000000..3273473
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/equinox/KernelBundleClassLoader.java
@@ -0,0 +1,484 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.equinox;
+
+import java.io.IOException;
+import java.lang.instrument.ClassFileTransformer;
+import java.lang.instrument.IllegalClassFormatException;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.net.URL;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.security.ProtectionDomain;
+import java.sql.Driver;
+import java.sql.DriverManager;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.Vector;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.eclipse.osgi.baseadaptor.BaseData;
+import org.eclipse.osgi.baseadaptor.bundlefile.BundleEntry;
+import org.eclipse.osgi.baseadaptor.loader.ClasspathEntry;
+import org.eclipse.osgi.baseadaptor.loader.ClasspathManager;
+import org.eclipse.osgi.framework.adaptor.ClassLoaderDelegate;
+import org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader;
+import org.eclipse.osgi.service.resolver.PlatformAdmin;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.eclipse.virgo.kernel.osgi.framework.ExtendedClassNotFoundException;
+import org.eclipse.virgo.kernel.osgi.framework.ExtendedNoClassDefFoundError;
+import org.eclipse.virgo.kernel.osgi.framework.InstrumentableClassLoader;
+import org.eclipse.virgo.kernel.osgi.framework.OsgiFrameworkUtils;
+
+/**
+ * Extension to {@link DefaultClassLoader} that adds instrumentation support.
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * As threadsafe as <code>DefaultClassLoader</code>.
+ * 
+ */
+public final class KernelBundleClassLoader extends DefaultClassLoader implements InstrumentableClassLoader {
+
+    static {
+        try {
+            Method parallelCapableMethod = ClassLoader.class.getDeclaredMethod("registerAsParallelCapable", (Class[]) null);
+            parallelCapableMethod.setAccessible(true);
+            parallelCapableMethod.invoke(null, new Object[0]);
+        } catch (Throwable e) {
+            // must avoid failing in clinit
+        }
+    }
+
+    private static final String[] EXCLUDED_PACKAGES = new String[] { "java.", "javax.", "sun.", "oracle." };
+
+    private static final String HEADER_INSTRUMENT_PACKAGE = "Instrument-Package";
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(KernelBundleClassLoader.class);
+
+    private final List<ClassFileTransformer> classFileTransformers = new CopyOnWriteArrayList<ClassFileTransformer>();
+
+    private final String[] instrumentedPackages;
+
+    private final String[] classpath;
+
+    private final String bundleScope;
+
+    private final Set<Class<Driver>> loadedDriverClasses = new HashSet<Class<Driver>>();
+
+    private final Object monitor = new Object();
+
+    private volatile boolean instrumented;
+
+    /**
+     * Constructs a new <code>ServerBundleClassLoader</code>.
+     * 
+     * @param parent the parent <code>ClassLoader</code>.
+     * @param delegate the delegate for this ClassLoader</code>
+     * @param domain the domain for this ClassLoader</code>
+     * @param bundledata the bundledata for this ClassLoader</code>
+     * @param classpath the classpath for this ClassLoader</code>
+     */
+    KernelBundleClassLoader(ClassLoader parent, ClassLoaderDelegate delegate, ProtectionDomain domain, BaseData bundledata, String[] classpath) {
+        super(parent, delegate, domain, bundledata, classpath);
+        this.classpath = classpath;
+        this.bundleScope = OsgiFrameworkUtils.getScopeName(bundledata.getBundle());
+        this.instrumentedPackages = findInstrumentedPackages(bundledata.getBundle());
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void addClassFileTransformer(ClassFileTransformer transformer) {
+        this.instrumented = true;
+        synchronized (this.classFileTransformers) {
+            if (this.classFileTransformers.contains(transformer)) {
+                return;
+            }
+            this.classFileTransformers.add(transformer);
+        }
+        Bundle[] bundles = getDependencyBundles(false);
+        for (Bundle bundle : bundles) {
+            if (propagateInstrumentationTo(bundle)) {
+                ClassLoader bundleClassLoader = getBundleClassLoader(bundle);
+                if (bundleClassLoader instanceof KernelBundleClassLoader) {
+                    ((KernelBundleClassLoader) bundleClassLoader).addClassFileTransformer(transformer);
+                }
+            }
+        }
+    }
+
+    /**
+     * @param bundle
+     * @return
+     */
+    private ClassLoader getBundleClassLoader(Bundle bundle) {
+        return EquinoxUtils.getBundleClassLoader(bundle);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
+        try {
+            Class<?> loadedClass = super.loadClass(name, resolve);
+            storeClassIfDriver(loadedClass);
+            return loadedClass;
+        } catch (ClassNotFoundException e) {
+            throw new ExtendedClassNotFoundException(this, e);
+        } catch (NoClassDefFoundError e) {
+            throw new ExtendedNoClassDefFoundError(this, e);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isInstrumented() {
+        return this.instrumented;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public int getClassFileTransformerCount() {
+        return this.classFileTransformers.size();
+    }
+
+    /**
+     * Finds the explicit list of packages to include in instrumentation (if specified).
+     */
+    private String[] findInstrumentedPackages(Bundle bundle) {
+        String headerValue = (String) bundle.getHeaders().get(HEADER_INSTRUMENT_PACKAGE);
+        if (headerValue == null || headerValue.length() == 0) {
+            return new String[0];
+        } else {
+            String[] vals = headerValue.split(",");
+            String[] packageNames = new String[vals.length];
+            for (int x = 0; x < packageNames.length; x++) {
+                packageNames[x] = vals[x].trim();
+            }
+            return packageNames;
+        }
+    }
+
+    private boolean propagateInstrumentationTo(Bundle bundle) {
+        return !EquinoxUtils.isSystemBundle(bundle) && this.bundleScope != null && this.bundleScope.equals(OsgiFrameworkUtils.getScopeName(bundle));
+    }
+
+    private boolean shouldInstrument(String className) {
+        return includedForInstrumentation(className) && !excludedFromInstrumentation(className);
+    }
+
+    private boolean includedForInstrumentation(String className) {
+        if (this.instrumentedPackages.length == 0) {
+            return true;
+        }
+        for (String instrumentedPackage : this.instrumentedPackages) {
+            if (className.startsWith(instrumentedPackage)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private boolean excludedFromInstrumentation(String className) {
+        for (String excludedPackage : EXCLUDED_PACKAGES) {
+            if (className.startsWith(excludedPackage)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public ThrowAwayClassLoader createThrowAway() {
+        final ClasspathManager manager = new ClasspathManager(this.manager.getBaseData(), this.classpath, this);
+        manager.initialize();
+        return AccessController.doPrivileged(new PrivilegedAction<ThrowAwayClassLoader>() {
+
+            public ThrowAwayClassLoader run() {
+                return new ThrowAwayClassLoader(manager);
+            }
+        });
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Class<?> defineClass(String name, byte[] classbytes, ClasspathEntry classpathEntry, BundleEntry entry) {
+
+        byte[] transformedBytes = classbytes;
+        if (shouldInstrument(name)) {
+            for (ClassFileTransformer transformer : this.classFileTransformers) {
+                try {
+                    String transformName = name.replaceAll("\\.", "/");
+                    byte[] transform = transformer.transform(this, transformName, null, this.domain, transformedBytes);
+                    if (transform != null) {
+                        transformedBytes = transform;
+                    }
+                } catch (IllegalClassFormatException e) {
+                    throw new ClassFormatError("Error reading class from bundle entry '" + entry.getName() + "'. " + e.getMessage());
+                }
+            }
+        }
+        try {
+            Class<?> definedClass = super.defineClass(name, transformedBytes, classpathEntry, entry);
+            storeClassIfDriver(definedClass);
+            return definedClass;
+        } catch (NoClassDefFoundError e) {
+            throw new ExtendedNoClassDefFoundError(this, e);
+        }
+    }
+
+    /**
+     * @param definedClass
+     */
+    @SuppressWarnings("unchecked")
+    private void storeClassIfDriver(Class<?> candidateClass) {
+        if (Driver.class.isAssignableFrom(candidateClass)) {
+            synchronized (this.monitor) {
+                this.loadedDriverClasses.add((Class<Driver>) candidateClass);
+            }
+        }
+    }
+
+    @Override
+    public void close() {
+        clearJdbcDrivers();
+    }
+
+    private void clearJdbcDrivers() {
+        Set<Class<Driver>> localLoadedDriverClasses;
+        synchronized (this.monitor) {
+            localLoadedDriverClasses = new HashSet<Class<Driver>>(this.loadedDriverClasses);
+        }
+
+        synchronized (DriverManager.class) {
+            try { // Java 6
+                Field writeDriversField = DriverManager.class.getDeclaredField("writeDrivers");
+                writeDriversField.setAccessible(true);
+                Vector<?> writeDrivers = (Vector<?>) writeDriversField.get(null);
+
+                Iterator<?> driverElements = writeDrivers.iterator();
+
+                while (driverElements.hasNext()) {
+                    Object driverObj = driverElements.next();
+                    Field driverField = driverObj.getClass().getDeclaredField("driver");
+                    driverField.setAccessible(true);
+                    if (localLoadedDriverClasses.contains(driverField.get(driverObj).getClass())) {
+                        driverElements.remove();
+                    }
+                }
+
+                Vector<?> readDrivers = (Vector<?>) writeDrivers.clone();
+                Field readDriversField = DriverManager.class.getDeclaredField("readDrivers");
+                readDriversField.setAccessible(true);
+                readDriversField.set(null, readDrivers);
+                LOGGER.debug("Cleared JDBC drivers for " + this + " using Java 6 strategy");
+            } catch (Exception javaSixWayFailed) {
+                try { // Java 7
+                    Field registeredDriversField = DriverManager.class.getDeclaredField("registeredDrivers");
+                    registeredDriversField.setAccessible(true);
+                    CopyOnWriteArrayList<?> registeredDrivers = (CopyOnWriteArrayList<?>) registeredDriversField.get(null);
+
+                    Iterator<?> driverElements = registeredDrivers.iterator();
+                    List<Object> driverElementsToRemove = new ArrayList<Object>();
+
+                    while (driverElements.hasNext()) {
+                        Object driverObj = driverElements.next();
+                        Field driverField = driverObj.getClass().getDeclaredField("driver");
+                        driverField.setAccessible(true);
+                        if (localLoadedDriverClasses.contains(driverField.get(driverObj).getClass())) {
+                            driverElementsToRemove.add(driverObj);
+                        }
+                    }
+
+                    for (Object driverObj : driverElementsToRemove) {
+                        registeredDrivers.remove(driverObj);
+                    }
+                    LOGGER.debug("Cleared JDBC drivers for " + this + " using Java 7 strategy");
+                } catch (Exception e) {
+                    LOGGER.warn("Failure when clearing JDBC drivers for " + this, e);
+                }
+            }
+        }
+    }
+
+    @Override
+    public String toString() {
+        return String.format("%s: [bundle=%s]", getClass().getSimpleName(), this.delegate);
+    }
+
+    private Bundle[] getDependencyBundles(boolean includeDependenciesFragments) {
+        Bundle bundle = this.manager.getBaseData().getBundle();
+        BundleContext systemBundleContext = getBundleContext();
+        PlatformAdmin serverAdmin = getPlatformAdmin();
+        Bundle[] deps = EquinoxUtils.getDirectDependencies(bundle, systemBundleContext, serverAdmin, includeDependenciesFragments);
+        return deps;
+    }
+
+    /**
+     * Gets the {@link BundleContext} for this ClassLoader's {@link Bundle}.
+     * 
+     * @return the <code>BundleContext</code>.
+     */
+    private BundleContext getBundleContext() {
+        return this.manager.getBaseData().getAdaptor().getContext();
+    }
+
+    /**
+     * Gets the {@link PlatformAdmin} service.
+     * 
+     * @return the <code>PlatformAdmin</code> service.
+     */
+    private PlatformAdmin getPlatformAdmin() {
+        return this.manager.getBaseData().getAdaptor().getPlatformAdmin();
+    }
+
+    /**
+     * Throwaway classloader for OSGi bundles.
+     * <p/>
+     * 
+     * <strong>Concurrent Semantics</strong><br />
+     * 
+     * As threadsafe as {@link ClassLoader}.
+     * 
+     */
+    final class ThrowAwayClassLoader extends ClassLoader {
+
+        private final ConcurrentMap<String, Class<?>> loadedClasses = new ConcurrentHashMap<String, Class<?>>();
+
+        private final ClasspathManager manager;
+
+        /**
+         * @param manager
+         */
+        private ThrowAwayClassLoader(ClasspathManager manager) {
+            this.manager = manager;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
+            if (!shouldInstrument(name)) {
+                return KernelBundleClassLoader.this.loadClass(name, resolve);
+            }
+            Class<?> cls = KernelBundleClassLoader.this.findLoadedClass(name);
+            if (cls == null) {
+                cls = this.loadedClasses.get(name);
+                if (cls == null) {
+                    cls = findClassInternal(name, true);
+                    if (cls == null) {
+                        cls = KernelBundleClassLoader.this.loadClass(name, resolve);
+                    }
+                }
+            }
+            if (cls == null) {
+                throw new ClassNotFoundException(name);
+            }
+            if (resolve) {
+                resolveClass(cls);
+            }
+            // TODO review findbugs warning vs. failing tests in LoadTimeWeavingTests
+            this.loadedClasses.putIfAbsent(name, cls);
+            return cls;
+        }
+
+        /**
+         * Attempts to find a <code>Class</code> from the enclosing bundle.
+         * 
+         * @param name the name of the <code>Class</code>
+         * @param traverseDependencies should dependency bundles be checked for the class.
+         */
+        Class<?> findClassInternal(String name, boolean traverseDependencies) {
+            String path = name.replaceAll("\\.", "/").concat(".class");
+
+            BundleEntry entry = this.manager.findLocalEntry(path);
+            if (entry == null) {
+                if (traverseDependencies) {
+                    return findClassFromImport(name);
+                } else {
+                    return null;
+                }
+            }
+            byte[] bytes;
+            try {
+                bytes = entry.getBytes();
+            } catch (IOException e) {
+                bytes = null;
+            }
+            return bytes == null ? null : defineClass(name, bytes, 0, bytes.length);
+        }
+
+        /**
+         * Attempts to locate a <code>Class</code> from one of the imported bundles.
+         * 
+         * @param name the <code>Class</code> name.
+         * @return the located <code>Class</code>, or <code>null</code> if no <code>Class</code> can be found.
+         */
+        private Class<?> findClassFromImport(String name) {
+            Bundle[] deps = getDependencyBundles(false);
+            for (Bundle dep : deps) {
+                ClassLoader depClassLoader = getBundleClassLoader(dep);
+                if (depClassLoader instanceof KernelBundleClassLoader) {
+                    KernelBundleClassLoader pbcl = (KernelBundleClassLoader) depClassLoader;
+                    Class<?> loadedClass = pbcl.publicFindLoaded(name);
+                    if (loadedClass != null) {
+                        return loadedClass;
+                    }
+                    ThrowAwayClassLoader throwAway = pbcl.createThrowAway();
+                    Class<?> cls = throwAway.findClassInternal(name, false);
+                    if (cls != null) {
+                        return cls;
+                    }
+                }
+
+            }
+            return null;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public URL getResource(String name) {
+            return KernelBundleClassLoader.this.getResource(name);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public Enumeration<URL> getResources(String name) throws IOException {
+            return KernelBundleClassLoader.this.getResources(name);
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/equinox/KernelClassLoaderCreator.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/equinox/KernelClassLoaderCreator.java
new file mode 100644
index 0000000..d163e5b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/equinox/KernelClassLoaderCreator.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.equinox;
+
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+
+import org.eclipse.osgi.baseadaptor.BaseData;
+import org.eclipse.osgi.baseadaptor.loader.BaseClassLoader;
+import org.eclipse.osgi.framework.adaptor.BundleProtectionDomain;
+import org.eclipse.osgi.framework.adaptor.ClassLoaderDelegate;
+import org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader;
+
+import org.eclipse.virgo.kernel.equinox.extensions.hooks.ClassLoaderCreator;
+
+/**
+ * {@link ClassLoaderCreator} to replace the standard Equinox {@link DefaultClassLoader} with the
+ * {@link KernelBundleClassLoader}. <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.
+ * 
+ */
+final class KernelClassLoaderCreator implements ClassLoaderCreator {
+
+    /**
+     * Creates a {@link KernelBundleClassLoader} in place of the standard Equinox {@link DefaultClassLoader}.
+     */
+    public BaseClassLoader createClassLoader(final ClassLoader parent, final ClassLoaderDelegate delegate, final BundleProtectionDomain domain,
+        final BaseData data, final String[] bundleclasspath) {
+        return AccessController.doPrivileged(new PrivilegedAction<BaseClassLoader>() {
+            public BaseClassLoader run() {
+                return new KernelBundleClassLoader(parent, delegate, domain, data, bundleclasspath);
+            }
+        });
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/equinox/StandardPackageAdminUtil.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/equinox/StandardPackageAdminUtil.java
new file mode 100644
index 0000000..7846fa4
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/equinox/StandardPackageAdminUtil.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.equinox;
+
+import org.eclipse.osgi.framework.internal.core.PackageAdminImpl;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.service.packageadmin.PackageAdmin;
+
+import org.eclipse.virgo.kernel.osgi.framework.OsgiFrameworkUtils;
+import org.eclipse.virgo.kernel.osgi.framework.PackageAdminUtil;
+
+/**
+ * {@link StandardPackageAdminUtil} is the implementation of {@link PackageAdminUtil}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+@SuppressWarnings("deprecation")
+public final class StandardPackageAdminUtil implements PackageAdminUtil {
+
+    private final PackageAdmin packageAdmin;
+
+    public StandardPackageAdminUtil(BundleContext bundleContext) {
+        this.packageAdmin = OsgiFrameworkUtils.getService(bundleContext, PackageAdmin.class).getService();
+    }
+    
+    /** 
+     * {@inheritDoc}
+     */
+    public void synchronouslyRefreshPackages(Bundle[] bundles) {
+        ((PackageAdminImpl)this.packageAdmin).refreshPackages(bundles, true, null);        
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/equinox/TransformedManifestProvidingBundleFileWrapper.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/equinox/TransformedManifestProvidingBundleFileWrapper.java
new file mode 100644
index 0000000..0e67900
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/equinox/TransformedManifestProvidingBundleFileWrapper.java
@@ -0,0 +1,298 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.equinox;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.net.URL;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.Stack;
+import java.util.jar.JarFile;
+
+import org.eclipse.osgi.baseadaptor.BaseData;
+import org.eclipse.osgi.baseadaptor.bundlefile.BundleEntry;
+import org.eclipse.osgi.baseadaptor.bundlefile.BundleFile;
+import org.eclipse.virgo.kernel.equinox.extensions.hooks.BundleFileWrapper;
+import org.eclipse.virgo.kernel.osgi.framework.ImportExpander;
+import org.eclipse.virgo.kernel.osgi.framework.ManifestTransformer;
+import org.eclipse.virgo.kernel.osgi.framework.UnableToSatisfyDependenciesException;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifestFactory;
+
+/**
+ * A <code>BundleFileWrapper</code> implementation that wraps {@link BundleFile BundleFiles} and replaces the manifest in the
+ * <code>BundleFile</code> will one that has been transformed in memory.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread-safe.
+ * 
+ */
+public class TransformedManifestProvidingBundleFileWrapper implements BundleFileWrapper {
+    
+    private final ImportExpander importExpander;
+    
+    private final ThreadLocal<Stack<ManifestTransformer>> manifestTransformer;
+    
+    public TransformedManifestProvidingBundleFileWrapper(ImportExpander importExpander) {
+        this.manifestTransformer = new ManifestTransformerStackThreadLocal();
+        this.importExpander = importExpander;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public BundleFile wrapBundleFile(BundleFile bundleFile) {        
+        return new TransformedManifestProvidingBundleFile(bundleFile, this.importExpander);
+    }
+    
+    public void pushManifestTransformer(ManifestTransformer manifestTransformer) {
+        this.manifestTransformer.get().push(manifestTransformer);
+    }
+    
+    public void popManifestTransformer() {
+        this.manifestTransformer.get().pop();
+    }
+    
+    private static final class ManifestTransformerStackThreadLocal extends ThreadLocal<Stack<ManifestTransformer>> {
+
+        @Override
+        public Stack<ManifestTransformer> initialValue() {
+            return new Stack<ManifestTransformer>();
+        }
+    }
+
+    /**
+     * A concrete extension of {@link BundleFile} that intercepts attempts to access a bundle's manifest
+     * a returns a transform copy of the manifest that has, e.g. expanded any Import-Library and Import-Bundle
+     * headers into the corresponding Import-Package header entries.
+     * <p>
+     * <strong>Concurrent Semantics</strong><br />
+     * As thread-safe as the encapsulated <code>BundleFile</code> instance.
+     * 
+     */
+    private class TransformedManifestProvidingBundleFile extends BundleFile {
+
+        private final BundleFile bundleFile;
+        
+        private final ImportExpander importExpander;
+        
+        private volatile BundleEntry manifestEntry;
+        
+        private final Object monitor = new Object();
+
+        private TransformedManifestProvidingBundleFile(BundleFile bundleFile, ImportExpander importExpander) {
+            this.bundleFile = bundleFile;
+            this.importExpander = importExpander;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public void close() throws IOException {
+            this.bundleFile.close();
+
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public boolean containsDir(String dir) {
+            return this.bundleFile.containsDir(dir);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public BundleEntry getEntry(String path) { 
+            if (path.equals(JarFile.MANIFEST_NAME)) {
+                synchronized (monitor) {
+                    if (this.manifestEntry == null) {
+                        BundleEntry entry = this.bundleFile.getEntry(path);
+                        
+                        Stack<ManifestTransformer> manifestTransformers = TransformedManifestProvidingBundleFileWrapper.this.manifestTransformer.get();
+                        
+                        ManifestTransformer manifestTransformer;
+                        
+                        if (!manifestTransformers.isEmpty()) {
+                            manifestTransformer = manifestTransformers.peek();
+                        } else {
+                            manifestTransformer = null;
+                        }
+                                              
+                        BundleManifest originalManifest;
+                        
+                        if (entry != null) {
+                            try (InputStreamReader manifestReader = new InputStreamReader(entry.getInputStream(), UTF_8)) {
+                                originalManifest = BundleManifestFactory.createBundleManifest(manifestReader);
+                            } catch (IOException ioe) {
+                                throw new RuntimeException(ioe);
+                            }
+                        } else {
+                            originalManifest = BundleManifestFactory.createBundleManifest();
+                        } 
+                        
+                        BundleManifest transformedManifest = originalManifest;
+                        
+                        if (manifestTransformer != null) {
+                            transformedManifest = manifestTransformer.transform(originalManifest);                                                        
+                        }
+                        
+                        try {
+                            this.importExpander.expandImports(Collections.singletonList(transformedManifest));
+                        } catch (UnableToSatisfyDependenciesException utsde) {
+                            throw new RuntimeException(utsde);
+                        }
+                        
+                        try {
+                            this.manifestEntry = new TransformedManifestBundleEntry(transformedManifest);
+                        } catch (IOException e) {
+                            throw new RuntimeException(e);
+                        }                
+                    }
+                }
+                
+                return this.manifestEntry;
+            } else {
+                return this.bundleFile.getEntry(path);
+            }
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @SuppressWarnings({ "unchecked", "rawtypes" })
+        @Override
+        public Enumeration getEntryPaths(String path) {
+            return this.bundleFile.getEntryPaths(path);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public File getFile(String path, boolean nativeCode) {
+            return this.bundleFile.getFile(path, nativeCode);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public void open() throws IOException {
+            this.bundleFile.open();
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public File getBaseFile() {
+            return this.bundleFile.getBaseFile();
+        }
+
+        @Override
+        @SuppressWarnings("deprecation")
+        public URL getResourceURL(String path, long hostBundleID, int index) {
+            return this.bundleFile.getResourceURL(path, hostBundleID, index);
+        }
+
+        @Override
+        @SuppressWarnings("deprecation")
+        public URL getResourceURL(String path, long hostBundleID) {
+            return this.bundleFile.getResourceURL(path, hostBundleID);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public URL getResourceURL(String path, BaseData hostData, int index) {
+            return this.bundleFile.getResourceURL(path, hostData, index);
+        }
+    }
+    
+    private static class TransformedManifestBundleEntry extends BundleEntry {
+        
+        private final byte[] manifestBytes;
+        
+        private final long time;
+        
+        private TransformedManifestBundleEntry(BundleManifest transformedManifest) throws IOException {
+            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            transformedManifest.write(new OutputStreamWriter(baos, UTF_8));
+            
+            this.manifestBytes = baos.toByteArray();
+            
+            time = System.currentTimeMillis();
+        }
+
+        /** 
+         * {@inheritDoc}
+         */
+        @Override
+        public URL getFileURL() {
+            throw new UnsupportedOperationException();
+        }
+
+        /** 
+         * {@inheritDoc}
+         */
+        @Override
+        public InputStream getInputStream() throws IOException {                  
+            return new ByteArrayInputStream(this.manifestBytes); 
+        }
+
+        /** 
+         * {@inheritDoc}
+         */
+        @Override
+        public URL getLocalURL() {
+            throw new UnsupportedOperationException();
+        }
+
+        /** 
+         * {@inheritDoc}
+         */
+        @Override
+        public String getName() {
+            return "MANIFEST.MF";
+        }
+
+        /** 
+         * {@inheritDoc}
+         */
+        @Override
+        public long getSize() {
+            return this.manifestBytes.length;
+        }
+
+        /** 
+         * {@inheritDoc}
+         */
+        @Override
+        public long getTime() {
+            return this.time;
+        }       
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/equinox/UsesAnalyser.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/equinox/UsesAnalyser.java
new file mode 100644
index 0000000..fc6fe69
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/equinox/UsesAnalyser.java
@@ -0,0 +1,442 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.equinox;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.Map.Entry;
+
+import org.eclipse.osgi.service.resolver.BundleDescription;
+import org.eclipse.osgi.service.resolver.ExportPackageDescription;
+import org.eclipse.osgi.service.resolver.ImportPackageSpecification;
+import org.eclipse.osgi.service.resolver.ResolverError;
+import org.eclipse.osgi.service.resolver.State;
+import org.eclipse.osgi.service.resolver.VersionConstraint;
+import org.osgi.framework.Constants;
+
+import org.eclipse.virgo.util.math.Sets;
+
+/**
+ * Utility class for analysing uses failures in a given bundle.
+ * 
+ * <strong>Concurrent Semantics</strong><br/>
+ * thread-safe
+ * 
+ */
+public final class UsesAnalyser {
+
+    public AnalysedUsesConflict[] getUsesConflicts(State state, ResolverError usesError) {
+        VersionConstraint constraint = usesError.getUnsatisfiedConstraint();
+
+        List<AnalysedUsesConflict> analysedUsesConflicts = new ArrayList<AnalysedUsesConflict>();
+
+        if (constraint instanceof ImportPackageSpecification) {
+            ImportPackageSpecification rootImport = (ImportPackageSpecification) constraint;
+
+            /*
+             * Compute the exports visible from the failed bundle except via rootImport. This is the exports matching
+             * imports (except rootImport) of the failed bundle and the uses constraint closure of those exports. The
+             * uses constraint closure of an export is those packages which are visible through transitive uses starting
+             * with the export.
+             */
+            PackageSources visiblePackages = generateExportPackagesVisibleInFailedBundle(state, rootImport);
+
+            /*
+             * For each resolved export that satisfies rootImport, compute the uses constraint closure of the export and
+             * add any that conflict with visiblePackages to the resultant set of uses conflicts.
+             */
+            for (ExportPackageDescription exportPackage : getResolvedCandidateExports(state, rootImport)) {
+                PackageSources usedPackages = generateExportPackagesUsedViaExportPackage(state, exportPackage);
+                analysedUsesConflicts.addAll(findConflictingExports(usedPackages, visiblePackages));
+            }
+
+            if (analysedUsesConflicts.isEmpty()) {
+                // Be more aggressive by exploring unresolved exports that satisfy rootImport.
+                for (ExportPackageDescription exportPackage : getUnresolvedCandidateExports(state, rootImport)) {
+                    PackageSources usedPackages = generateExportPackagesUsedViaExportPackage(state, exportPackage);
+                    analysedUsesConflicts.addAll(findConflictingExports(usedPackages, visiblePackages));
+                }
+            }
+        }
+        return analysedUsesConflicts.toArray(new AnalysedUsesConflict[analysedUsesConflicts.size()]);
+    }
+
+    public ResolverError[] getUsesResolverErrors(State state, BundleDescription bundle) {
+        ResolverError[] errors = state.getResolverErrors(bundle);
+        if (errors != null) {
+            List<ResolverError> usesErrors = new ArrayList<ResolverError>(errors.length);
+            for (ResolverError re : errors) {
+                if (re.getType() == ResolverError.IMPORT_PACKAGE_USES_CONFLICT) {
+                    usesErrors.add(re);
+                }
+            }
+            return usesErrors.toArray(new ResolverError[usesErrors.size()]);
+        }
+        return null;
+    }
+
+    private List<AnalysedUsesConflict> findConflictingExports(PackageSources usedPackages, PackageSources directPackages) {
+        List<AnalysedUsesConflict> usesConflicts = new ArrayList<AnalysedUsesConflict>();
+        Set<String> packagesInCommon = Sets.<String> intersection(usedPackages.keySet(), directPackages.keySet());
+        for (String packageName : packagesInCommon) {
+            Set<SourcedPackage> allUsed = usedPackages.get(packageName);
+            Set<SourcedPackage> allWired = directPackages.get(packageName);
+
+            for (SourcedPackage sourcedPackage : allUsed) {
+                UsedBySourcedPackage usedSourced = (UsedBySourcedPackage) sourcedPackage;
+                if (!exportDescriptionOccursIn(usedSourced.getSource(), allWired)) {
+                    for (SourcedPackage sp : allWired) {
+                        usesConflicts.add(new AnalysedUsesConflict(usedSourced, sp));
+                    }
+                }
+            }
+        }
+        return usesConflicts;
+    }
+
+    private static final boolean exportDescriptionOccursIn(ExportPackageDescription source, Set<SourcedPackage> allWired) {
+        for (SourcedPackage w : allWired) {
+            if (w.getSource().equals(source))
+                return true;
+        }
+        return false;
+    }
+
+    private PackageSources generateExportPackagesUsedViaExportPackage(State state, ExportPackageDescription exportPackage) {
+        PackageSources usedPackages = constructEmptyPackageSources();
+        Set<String> knownPackages = new HashSet<String>();
+
+        addUsedImportedPackages(state, usedPackages, exportPackage, exportPackage, knownPackages);
+        return usedPackages;
+    }
+
+    private PackageSources generateExportPackagesVisibleInFailedBundle(State state, ImportPackageSpecification rootImport) {
+        PackageSources visiblePackages = getOtherImportedPackages(state, rootImport);
+
+        visiblePackages.putAll(computeUsesClosure(state, visiblePackages));
+
+        BundleDescription failedBundle = rootImport.getBundle();
+        visiblePackages.putAll(getExportedPackages(failedBundle));
+
+        return visiblePackages;
+    }
+
+    private PackageSources computeUsesClosure(State state, PackageSources packages) {
+        // Compute all the exports visible through transitive uses from directPackages
+        PackageSources additionalPackages = constructEmptyPackageSources();
+        Set<Entry<String, Set<SourcedPackage>>> keys = packages.entrySet();
+
+        Set<String> knownPackages = new HashSet<String>();
+
+        for (Entry<String, Set<SourcedPackage>> key : keys) {
+            for (SourcedPackage sp : key.getValue()) {
+                ExportPackageDescription source = sp.getSource();
+                addUsedImportedPackages(state, additionalPackages, source, source, knownPackages);
+            }
+        }
+        return additionalPackages;
+    }
+
+    private ExportPackageDescription[] getResolvedCandidateExports(State state, ImportPackageSpecification rootImport) {
+        List<ExportPackageDescription> exports = new ArrayList<ExportPackageDescription>();
+
+        BundleDescription[] bundles = state.getResolvedBundles();
+        if (bundles != null) {
+            for (BundleDescription bundle : bundles) {
+                for (ExportPackageDescription exportPackage : bundle.getExportPackages()) {
+                    if (rootImport.isSatisfiedBy(exportPackage)) {
+                        exports.add(exportPackage);
+                    }
+                }
+            }
+        }
+
+        return exports.toArray(new ExportPackageDescription[exports.size()]);
+    }
+
+    private ExportPackageDescription[] getUnresolvedCandidateExports(State state, ImportPackageSpecification rootImport) {
+        List<ExportPackageDescription> exports = new ArrayList<ExportPackageDescription>();
+
+        BundleDescription[] resolvedBundles = state.getResolvedBundles();
+
+        BundleDescription[] bundles = state.getBundles();
+        if (bundles != null) {
+            for (BundleDescription bundle : bundles) {
+                if (notInArray(bundle, resolvedBundles)) {
+                    for (ExportPackageDescription exportPackage : bundle.getExportPackages()) {
+                        if (rootImport.isSatisfiedBy(exportPackage)) {
+                            exports.add(exportPackage);
+                        }
+                    }
+                }
+            }
+        }
+
+        return exports.toArray(new ExportPackageDescription[exports.size()]);
+    }
+
+    private static final boolean notInArray(BundleDescription bundle, BundleDescription[] resolvedBundles) {
+        if (resolvedBundles == null)
+            return true;
+        for (BundleDescription b : resolvedBundles) {
+            if (b == bundle) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    private void addUsedImportedPackages(State state, PackageSources packages, ExportPackageDescription exportPackage,
+        ExportPackageDescription topDependency, Set<String> knownPackages) {
+        String[] packageNames = (String[]) exportPackage.getDirective(Constants.USES_DIRECTIVE);
+        if (packageNames != null) {
+            BundleDescription bundle = exportPackage.getExporter();
+
+            ExportPackageDescription[] allExports = bundle.getExportPackages();
+            ImportPackageSpecification[] allImports = bundle.getImportPackages();
+            ExportPackageDescription[] allResolvedImports = bundle.getResolvedImports();
+
+            for (String packageName : packageNames) {
+                ExportPackageDescription localExport = findExportPackageDescriptionInArray(allExports, packageName);
+                if (null != localExport) {
+                    packages.addPackageSource(packageName, new UsedBySourcedPackage(topDependency, localExport));
+                }
+
+                if (!knownPackages.contains(packageName)) {
+                    ExportPackageDescription localResolvedImport = findExportPackageDescriptionInArray(allResolvedImports, packageName);
+                    if (null != localResolvedImport) {
+                        knownPackages.add(packageName);
+                        packages.addPackageSource(packageName, new UsedBySourcedPackage(topDependency, localResolvedImport));
+                        addUsedImportedPackages(state, packages, localResolvedImport, topDependency, knownPackages);
+                    } else {
+                        ImportPackageSpecification anImport = findImportPackageSpecificationInArray(allImports, packageName);
+                        if (anImport != null) {
+                            ExportPackageDescription[] matchingExports = getCandidateExports(state, anImport);
+                            if (matchingExports.length != 0) {
+                                knownPackages.add(packageName);
+                                for (ExportPackageDescription matchingExport : matchingExports) {
+                                    packages.addPackageSource(packageName, new UsedBySourcedPackage(topDependency, matchingExport));
+                                    addUsedImportedPackages(state, packages, matchingExport, topDependency, knownPackages);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    private static final ImportPackageSpecification findImportPackageSpecificationInArray(ImportPackageSpecification[] allImports, String packageName) {
+        for (ImportPackageSpecification ips : allImports) {
+            if (packageName.equals(ips.getName())) {
+                return ips;
+            }
+        }
+        return null;
+    }
+
+    private static final ExportPackageDescription findExportPackageDescriptionInArray(ExportPackageDescription[] allExports, String packageName) {
+        for (ExportPackageDescription epd : allExports) {
+            if (packageName.equals(epd.getName())) {
+                return epd;
+            }
+        }
+        return null;
+    }
+
+    private PackageSources getOtherImportedPackages(State state, ImportPackageSpecification rootImport) {
+        BundleDescription bundle = rootImport.getBundle();
+
+        PackageSources packages = constructEmptyPackageSources();
+
+        ImportPackageSpecification[] importSpecifications = bundle.getImportPackages();
+        for (ImportPackageSpecification importSpecification : importSpecifications) {
+            if (rootImport != importSpecification) {
+                if (!Constants.RESOLUTION_OPTIONAL.equals(importSpecification.getDirective(Constants.RESOLUTION_DIRECTIVE))) {
+                    ExportPackageDescription[] exportPackages = getCandidateExports(state, importSpecification);
+                    for (ExportPackageDescription exportPackage : exportPackages) {
+                        packages.addPackageSource(exportPackage.getName(), new ImportedSourcedPackage(rootImport, exportPackage));
+                    }
+                }
+            }
+        }
+        return packages;
+    }
+
+    private ExportPackageDescription[] getCandidateExports(State state, ImportPackageSpecification importSpecification) {
+        ExportPackageDescription[] pkgs = getResolvedCandidateExports(state, importSpecification);
+        if (pkgs.length == 0)
+            pkgs = getUnresolvedCandidateExports(state, importSpecification);
+        return pkgs;
+    }
+
+    private PackageSources getExportedPackages(BundleDescription bundle) {
+        ExportPackageDescription[] packageArray = bundle.getExportPackages();
+        PackageSources packages = constructEmptyPackageSources();
+        if (packageArray != null)
+            for (ExportPackageDescription exportPackage : packageArray) {
+                packages.addPackageSource(exportPackage.getName(), new SourcedPackage(exportPackage));
+            }
+        return packages;
+    }
+
+    private final static String stringOf(ExportPackageDescription source) {
+        BundleDescription bundle = source.getSupplier();
+        StringBuilder sb = new StringBuilder("'");
+        sb.append(source.getName()).append("_").append(source.getVersion()).append("' in bundle ").append(stringOf(bundle));
+        return sb.toString();
+    }
+
+    private final static String stringOf(BundleDescription bundle) {
+        StringBuilder sb = new StringBuilder("'");
+        sb.append(bundle.getSymbolicName()).append("_").append(bundle.getVersion()).append("[").append(bundle.getBundleId()).append("]").append("'");
+        return sb.toString();
+    }
+
+    public static interface UsesViolation {
+
+        VersionConstraint getConstraint();
+
+        PossibleMatch[] getPossibleMatches();
+    }
+
+    public static interface PossibleMatch {
+
+        ExportPackageDescription getSupplier();
+
+        boolean isDependentConstraintMismatch();
+
+        DependentConstraintCollision[] getCollisions();
+    }
+
+    public static interface DependentConstraintCollision {
+
+        ImportPackageSpecification getConsumerConstraint();
+
+        ImportPackageSpecification getSupplierConstraint();
+
+        CollisionReason getCollisionReason();
+
+    }
+
+    public static enum CollisionReason {
+        DISJOINT_VERSION_RANGES, ATTRIBUTE_MISMATCH
+    }
+
+    private static class SourcedPackage {
+
+        private final ExportPackageDescription source;
+
+        public SourcedPackage(ExportPackageDescription source) {
+            this.source = source;
+        }
+
+        public String toString() {
+            return stringOf(this.source);
+        }
+
+        public ExportPackageDescription getSource() {
+            return this.source;
+        }
+    }
+
+    private static final class ImportedSourcedPackage extends SourcedPackage {
+
+        private final ImportPackageSpecification rootImport;
+
+        public ImportedSourcedPackage(ImportPackageSpecification rootImport, ExportPackageDescription source) {
+            super(source);
+            this.rootImport = rootImport;
+        }
+
+        public String toString() {
+            StringBuilder sb = new StringBuilder(super.toString());
+            sb.append(" imported by bundle ").append(stringOf(this.rootImport.getBundle()));
+            return sb.toString();
+        }
+    }
+
+    private static final class UsedBySourcedPackage extends SourcedPackage {
+
+        private final ExportPackageDescription usedBy;
+
+        public UsedBySourcedPackage(ExportPackageDescription usedBy, ExportPackageDescription source) {
+            super(source);
+            this.usedBy = usedBy;
+        }
+
+        public String toString() {
+            StringBuilder sb = new StringBuilder(super.toString());
+            sb.append(" used by ").append(stringOf(this.usedBy));
+            return sb.toString();
+        }
+
+        public ExportPackageDescription getUsedBy() {
+            return this.usedBy;
+        }
+    }
+
+    private interface PackageSources extends Map<String, Set<SourcedPackage>> {
+
+        public void addPackageSource(String packageName, SourcedPackage sourcedPackage);
+    }
+
+    private class PackageSourcesImpl extends HashMap<String, Set<SourcedPackage>> implements PackageSources {
+
+        private static final long serialVersionUID = 1L;
+        
+        public final void addPackageSource(String packageName, SourcedPackage sourcedPackage) {
+            Set<SourcedPackage> sourcedSet = get(packageName);
+            if (sourcedSet == null) {
+                sourcedSet = new HashSet<SourcedPackage>();
+                put(packageName, sourcedSet);
+            }
+            sourcedSet.add(sourcedPackage);
+        }
+    }
+
+    private PackageSources constructEmptyPackageSources() {
+        return new PackageSourcesImpl();
+    }
+
+    public static final class AnalysedUsesConflict {
+
+        private final UsedBySourcedPackage usedPackage;
+
+        private final SourcedPackage resolvedPackage;
+
+        private AnalysedUsesConflict(UsedBySourcedPackage used, SourcedPackage resolved) {
+            this.usedPackage = used;
+            this.resolvedPackage = resolved;
+        }
+
+        public String[] getConflictStatement() {
+            return new String[] { "package        " + this.usedPackage.toString(), "conflicts with " + this.resolvedPackage.toString() };
+        }
+
+        public ExportPackageDescription getConflictingPackage() {
+            return this.usedPackage == null ? null : this.usedPackage.getSource();
+        }
+
+        public ExportPackageDescription getUsesRootPackage() {
+            return this.usedPackage == null ? null : this.usedPackage.getUsedBy();
+        }
+
+        public ExportPackageDescription getPackage() {
+            return this.resolvedPackage == null ? null : this.resolvedPackage.getSource();
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/importexpansion/AbstractTrackedPackageImports.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/importexpansion/AbstractTrackedPackageImports.java
new file mode 100644
index 0000000..456eb84
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/importexpansion/AbstractTrackedPackageImports.java
@@ -0,0 +1,377 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.importexpansion;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.eclipse.virgo.kernel.osgi.framework.ImportMergeException;
+
+import org.eclipse.virgo.nano.serviceability.Assert;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+import org.eclipse.virgo.util.osgi.manifest.ImportedPackage;
+import org.eclipse.virgo.util.osgi.manifest.Resolution;
+
+/**
+ * {@link AbstractTrackedPackageImports} provides the general implementations of {@link TrackedPackageImports}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+abstract class AbstractTrackedPackageImports implements TrackedPackageImports {
+
+    protected static final String SOURCE_SEPARATOR = ", ";
+
+    private static final String VERSION_ATTRIBUTE_NAME = "version";
+
+    private static final String VERSION_ALTERNATE_ATTRIBUTE_NAME = "specification-version";
+
+    private static final String BUNDLE_VERSION_ATTRIBUTE_NAME = "bundle-version";
+
+    private static final Object tieMonitor = new Object(); // locking for hash clashes in isEquivalent
+
+    private final Object monitor = new Object();
+
+    /**
+     * The current merged package imports are held as a map of package name to {@link ImportedPackage}. Each package
+     * import contains one and only one imported package name which corresponds to the package name used to index the
+     * package import in the map. The map is valid if and only if mergeException is <code>null</code>.
+     */
+    protected final Map<String, ImportedPackage> mergedPackageImports = new HashMap<String, ImportedPackage>();
+
+    private ImportMergeException mergeException = null;
+
+    protected final List<TrackedPackageImports> sources = new ArrayList<TrackedPackageImports>();
+
+    /**
+     * Construct an {@link AbstractTrackedPackageImports} from the given package imports.
+     * 
+     * @param initialPackageImports a map of package name to {@link ImportedPackage}
+     */
+    AbstractTrackedPackageImports(Map<String, ImportedPackage> packageImports) {
+        this.mergedPackageImports.putAll(packageImports);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void merge(TrackedPackageImports importsToMerge) throws ImportMergeException {
+        synchronized (this.monitor) {
+            checkMergeException();
+            try {
+                // Add the new imports before merging so they are included in any diagnostics.
+                sources.add(importsToMerge);
+                doMerge(importsToMerge);
+            } catch (ImportMergeException e) {
+                this.mergeException = e;
+                throw e;
+            }
+        }
+    }
+
+    /**
+     * Merge the given package imports into this collection of package imports. If there is a conflict, issue
+     * diagnostics and throw {@link ImportMergeException}.
+     * <p />
+     * Pre-condition: the monitor is held and the current merged imports have no conflicts.
+     * 
+     * @param importsToMerge
+     * @throws ImportMergeException
+     */
+    private void doMerge(TrackedPackageImports importsToMerge) throws ImportMergeException {
+        List<ImportedPackage> mergedImportsToMerge = importsToMerge.getMergedImports();
+        for (ImportedPackage packageImportToMerge : mergedImportsToMerge) {
+            String pkg = packageImportToMerge.getPackageName();
+            ImportedPackage mergedPackageImport = this.mergedPackageImports.get(pkg);
+            if (mergedPackageImport == null) {
+                this.mergedPackageImports.put(pkg, packageImportToMerge);
+            } else {
+                mergePackageImport(mergedPackageImport, packageImportToMerge);
+            }
+        }
+
+    }
+
+    /**
+     * Merge the given source package import into the given target package import. Throw {@link ImportMergeException} if
+     * and only if there is a merge clash.
+     * 
+     * @param targetPackageImport the package import to be merged and updated
+     * @param sourceImportToMerge the package import to be merged in
+     * @throws ImportMergeException thrown if there is a merge clash
+     */
+    private void mergePackageImport(ImportedPackage targetPackageImport, ImportedPackage sourceImportToMerge) throws ImportMergeException {
+        mergeAttributes(targetPackageImport, sourceImportToMerge);
+        mergeDirectives(targetPackageImport, sourceImportToMerge);
+
+    }
+
+    /**
+     * Merge the attributes of the source package import into those of the target package import. Throw
+     * {@link ImportMergeException} if and only if there is a merge clash.
+     * 
+     * @param targetPackageImport the package import to be merged and updated
+     * @param sourceImportToMerge the package import to be merged in
+     * @throws ImportMergeException thrown if there is a merge clash
+     */
+    private void mergeAttributes(ImportedPackage targetPackageImport, ImportedPackage sourceImportToMerge) throws ImportMergeException {
+        Map<String, String> targetAttributes = targetPackageImport.getAttributes();
+        Map<String, String> sourceAttributes = sourceImportToMerge.getAttributes();
+
+        // Merge attributes before versions so, for example, conflicting bundle symbolic names take precedence over disjoint bundle version ranges.
+        for (Entry<String, String> sourceAttributeEntry : sourceAttributes.entrySet()) {
+            String sourceAttributeName = sourceAttributeEntry.getKey();
+            if (!isVersionAttribute(sourceAttributeName)) {
+                String sourceAttributeValue = sourceAttributeEntry.getValue();
+                String targetAttributeValue = targetAttributes.get(sourceAttributeName);
+                if (targetAttributeValue != null) {
+                    if (!targetAttributeValue.equals(sourceAttributeValue)) {
+                        throw new ImportMergeException(targetPackageImport.getPackageName(), getPackageSources(targetPackageImport),
+                            "conflicting values '" + sourceAttributeValue + "', '" + targetAttributeValue + "' of attribute '" + sourceAttributeName
+                            + "'");
+                    }
+                } else {
+                    targetAttributes.put(sourceAttributeName, sourceAttributeValue);
+                }
+            }
+        }
+        
+        mergeVersionRanges(targetPackageImport, sourceImportToMerge);
+
+        mergeBundleVersionRanges(targetPackageImport, sourceImportToMerge);
+    }
+
+    /**
+     * Merge the version ranges of the given source and target attributes and update the target attributes if necessary
+     * with the merged range. If the version ranges are disjoint, throw {@link ImportMergeException}.
+     * 
+     * @param targetPackageImport the package import to be merged and updated
+     * @param sourceAttributes
+     * @throws ImportMergeException
+     */
+    private void mergeVersionRanges(ImportedPackage targetPackageImport, ImportedPackage sourceImportToMerge) throws ImportMergeException {
+        Map<String, String> sourceAttributes = sourceImportToMerge.getAttributes();
+        VersionRange sourceVersionRange = getVersionRange(sourceAttributes);
+        if (sourceVersionRange != null) {
+            Map<String, String> targetAttributes = targetPackageImport.getAttributes();
+            VersionRange targetVersionRange = getVersionRange(targetAttributes);
+            VersionRange mergedVersionRange;
+            if (targetVersionRange == null) {
+                mergedVersionRange = sourceVersionRange;
+            } else {
+                mergedVersionRange = VersionRange.intersection(sourceVersionRange, targetVersionRange);
+                if (mergedVersionRange.isEmpty()) {
+                    throw new ImportMergeException(targetPackageImport.getPackageName(), getPackageSources(targetPackageImport),
+                        "disjoint package version ranges");
+                }
+            }
+            targetAttributes.put(VERSION_ATTRIBUTE_NAME, mergedVersionRange.toParseString());
+        }
+    }
+
+    /**
+     * Get the version range for the given attributes.
+     * 
+     * @param attributes the attributes which may specify a version range
+     * @return the version range or <code>null</code> if no version range is specified
+     */
+    private VersionRange getVersionRange(Map<String, String> attributes) {
+        String versionRangeString = attributes.get(VERSION_ATTRIBUTE_NAME);
+        if (versionRangeString == null) {
+            versionRangeString = attributes.get(VERSION_ALTERNATE_ATTRIBUTE_NAME);
+        }
+        return versionRangeString == null ? null : new VersionRange(versionRangeString);
+    }
+
+    /**
+     * Merge the bundle version ranges of the given source and target attributes and update the target attributes if
+     * necessary with the merged range. If the bundle version ranges are disjoint, throw {@link ImportMergeException}.
+     * 
+     * @param targetPackageImport the package import to be merged and updated
+     * @param sourceAttributes
+     * @throws ImportMergeException
+     */
+    private void mergeBundleVersionRanges(ImportedPackage targetPackageImport, ImportedPackage sourceImportToMerge) throws ImportMergeException {
+        VersionRange sourceVersionRange = sourceImportToMerge.getBundleVersion();
+
+        // Map<String, String> targetAttributes = targetPackageImport.getAttributes();
+        VersionRange targetVersionRange = targetPackageImport.getBundleVersion();
+        VersionRange mergedVersionRange;
+        if (targetVersionRange == null) {
+            mergedVersionRange = sourceVersionRange;
+        } else {
+            mergedVersionRange = VersionRange.intersection(sourceVersionRange, targetVersionRange);
+            if (mergedVersionRange.isEmpty()) {
+                throw new ImportMergeException(targetPackageImport.getPackageName(), getPackageSources(targetPackageImport),
+                    "disjoint bundle version ranges " + sourceVersionRange.toString() + " and " + targetVersionRange.toString());
+            }
+        }
+        targetPackageImport.setBundleVersion(mergedVersionRange);
+    }
+
+    /**
+     * Return <code>true</code> if and only if the given attribute name is that of a version or bundle version
+     * attribute.
+     * 
+     * @param attributeName the attribute name
+     * @return whether or not the given attribute name is that of a version or bundle version attribute
+     */
+    private boolean isVersionAttribute(String attributeName) {
+        return VERSION_ATTRIBUTE_NAME.equals(attributeName) || VERSION_ALTERNATE_ATTRIBUTE_NAME.equals(attributeName)
+            || BUNDLE_VERSION_ATTRIBUTE_NAME.equals(attributeName);
+    }
+
+    /**
+     * Merge the directives of the source package import into those of the target package import.
+     * 
+     * @param targetPackageImport
+     * @param sourceImportToMerge
+     */
+    private void mergeDirectives(ImportedPackage targetPackageImport, ImportedPackage sourceImportToMerge) {
+        if (targetPackageImport.getResolution() == Resolution.OPTIONAL && sourceImportToMerge.getResolution() == Resolution.MANDATORY) {
+            targetPackageImport.setResolution(Resolution.MANDATORY);
+        }
+    }
+
+    /**
+     * Get a string describing the sources of the package of the given package import. This should help in diagnosing
+     * the root cause of a conflicting merge.
+     * 
+     * @param pkg the package whose sources are required
+     * @return a string describing the given package's sources
+     */
+    private String getPackageSources(ImportedPackage packageImport) {
+        return getSources(packageImport.getPackageName());
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getSources(String pkg) {
+        synchronized (this.monitor) {
+            StringBuilder sourcesDescription = new StringBuilder();
+            boolean first = true;
+            String source = getSource(pkg);
+            if (source != null) {
+                sourcesDescription.append(source);
+                first = false;
+            }
+            for (TrackedPackageImports trackedPackageImports : this.sources) {
+                String sources = trackedPackageImports.getSources(pkg);
+                if (sources != null) {
+                    if (!first) {
+                        sourcesDescription.append(SOURCE_SEPARATOR);
+                    }
+                    sourcesDescription.append(sources);
+                    first = false;
+                }
+            }
+            return first ? null : sourcesDescription.toString();
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public final List<ImportedPackage> getMergedImports() throws ImportMergeException {
+        synchronized (this.monitor) {
+            checkMergeException();
+            List<ImportedPackage> mergedImports = new ArrayList<ImportedPackage>();
+            for (ImportedPackage packageImport : this.mergedPackageImports.values()) {
+                mergedImports.add(packageImport);
+            }
+            return mergedImports;
+        }
+    }
+
+    /**
+     * If a merge failure has occurred, re-throw the {@link ImportMergeException}.
+     * 
+     * @throws ImportMergeException
+     */
+    private void checkMergeException() throws ImportMergeException {
+        if (this.mergeException != null) {
+            throw this.mergeException;
+        }
+    }
+
+    /**
+     * Convert a given list of package imports with no duplicate package names to a map of package name to
+     * {@link PackageImport}.
+     * 
+     * @param importedPackages a list of <code>PackageImport</code>
+     * @return a map of package name to <code>PackageImport</code>
+     */
+    protected static Map<String, ImportedPackage> convertImportedPackageListToMap(List<ImportedPackage> importedPackages) {
+        Map<String, ImportedPackage> initialPackageImports = new HashMap<String, ImportedPackage>();
+        for (ImportedPackage importedPackage : importedPackages) {
+            Assert.isNull(initialPackageImports.put(importedPackage.getPackageName(), importedPackage),
+                "input packageImports must not contain duplicate items");
+        }
+
+        return initialPackageImports;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isEmpty() {
+        synchronized (this.monitor) {
+            return this.mergedPackageImports.isEmpty();
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isEquivalent(TrackedPackageImports otherTrackedPackageImports) {
+        if (otherTrackedPackageImports == null) {
+            return isEmpty();
+        }
+
+        Assert.isInstanceOf(AbstractTrackedPackageImports.class, otherTrackedPackageImports,
+            "otherTrackedPackageImports must be of type AbstractTrackedPackageImports");
+        AbstractTrackedPackageImports otherAbstractTrackedPackageImports = (AbstractTrackedPackageImports) otherTrackedPackageImports;
+        // Lock the object monitors in a predictable order to avoid deadlocks.
+        // Use hash to determine ordering, and tieMonitor (static monitor) when hashes coincide.
+        int thisHash = System.identityHashCode(this);
+        int otherHash = System.identityHashCode(otherTrackedPackageImports);
+        if (thisHash > otherHash) {
+            synchronized (this.monitor) {
+                synchronized (otherAbstractTrackedPackageImports.monitor) {
+                    return this.mergedPackageImports.equals(otherAbstractTrackedPackageImports.mergedPackageImports);
+                }
+            }
+        } else if (thisHash < otherHash) {
+            synchronized (otherAbstractTrackedPackageImports.monitor) {
+                synchronized (this.monitor) {
+                    return this.mergedPackageImports.equals(otherAbstractTrackedPackageImports.mergedPackageImports);
+                }
+            }
+        } else {
+            synchronized (tieMonitor) {
+                synchronized (otherAbstractTrackedPackageImports.monitor) {
+                    synchronized (this.monitor) {
+                        return this.mergedPackageImports.equals(otherAbstractTrackedPackageImports.mergedPackageImports);
+                    }
+                }
+            }
+        }
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/importexpansion/AdditionalTrackedPackageImports.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/importexpansion/AdditionalTrackedPackageImports.java
new file mode 100644
index 0000000..fdbecd2
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/importexpansion/AdditionalTrackedPackageImports.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.importexpansion;
+
+import java.util.List;
+
+import org.eclipse.virgo.util.osgi.manifest.ImportedPackage;
+
+/**
+ * {@link AdditionalTrackedPackageImports} is a {@link TrackedPackageImports} representing a collection of package
+ * imports to be added to one or more bundles from a given source.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+class AdditionalTrackedPackageImports extends AbstractTrackedPackageImports {
+
+    private final List<ImportedPackage> importedPackages;
+
+    private final String source;
+
+    /**
+     * Construct an {@link AdditionalTrackedPackageImports} with the given collection of package imports and the given
+     * source.
+     * 
+     * @param importedPackages the list of package imports
+     * @param source the source
+     */
+    AdditionalTrackedPackageImports(List<ImportedPackage> importedPackages, String source) {
+        super(convertImportedPackageListToMap(importedPackages));
+        this.importedPackages = importedPackages;
+        this.source = source;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getSource(String pkg) {
+        return !convertImportedPackageListToMap(this.importedPackages).containsKey(pkg) ? null : this.source;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/importexpansion/BundleManifestProcessor.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/importexpansion/BundleManifestProcessor.java
new file mode 100644
index 0000000..9e21d78
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/importexpansion/BundleManifestProcessor.java
@@ -0,0 +1,313 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.importexpansion;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.osgi.framework.Version;
+
+import org.eclipse.virgo.util.common.StringUtils;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifestFactory;
+import org.eclipse.virgo.util.osgi.manifest.ExportedPackage;
+import org.eclipse.virgo.util.osgi.manifest.ImportedPackage;
+
+/**
+ * Provides a number of helper methods for processing {@link BundleManifest BundleManifests}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread-safe
+ * 
+ */
+class BundleManifestProcessor {
+
+    private static final String BUNDLE_SYMBOLIC_NAME_ATTRIBUTE_NAME = "bundle-symbolic-name";
+
+    private static final String BUNDLE_VERSION_ATTRIBUTE_NAME = "bundle-version";
+
+    private static final String VERSION_ATTRIBUTE_NAME = "version";
+
+    /**
+     * Creates a {@link ImportedPackage} for each of the supplied {@link ExportedPackage ExportedPackages} and returns a
+     * {@link Result} containing them. The result also contains any warnings that were generated during the processing
+     * of the manifests.
+     * 
+     * @param packageExports the <code>ExportedPackages</code> to process
+     * @return a Result containing the package imports and any warnings
+     */
+    static List<ImportedPackage> createImportedPackageForEachExportedPackage(List<ExportedPackage> packageExports, String bundleSymbolicName,
+        String bundleVersion) {
+
+        BundleManifest manifest = BundleManifestFactory.createBundleManifest();
+
+        doCreateImportedPackageForEachExportedPackage(packageExports, bundleSymbolicName, bundleVersion, null, manifest);
+
+        return manifest.getImportPackage().getImportedPackages();
+    }
+
+    /**
+     * Creates a {@link ImportedPackage} for each of the supplied {@link ExportedPackage ExportedPackages} and returns a
+     * {@link Result} containing them. The result also contains any warnings that were generated during the processing
+     * of the manifests.
+     * 
+     * @param packageExports the <code>ExportedPackages</code> to process
+     * @return a Result containing the package imports and any warnings
+     */
+    static List<ImportedPackage> createImportedPackageForEachExportedPackageOfFragment(List<ExportedPackage> packageExports,
+        String bundleSymbolicName, VersionRange bundleVersionRange) {
+
+        BundleManifest manifest = BundleManifestFactory.createBundleManifest();
+
+        doCreateImportedPackageForEachExportedPackage(packageExports, bundleSymbolicName, null, bundleVersionRange, manifest);
+
+        return manifest.getImportPackage().getImportedPackages();
+    }
+
+    /**
+     * Creates a {@link ImportedPackage} for each package export found in the given {@link BundleManifest
+     * BundleManifests} and returns a {@link Result} containing the package imports. The result also contains any
+     * warnings that were generated during the processing of the manifests.
+     * 
+     * @param bundleManifests the bundle manifests to process
+     * @return a Result containing the package imports and any warnings
+     */
+    static Result<ImportedPackage[]> createImportedPackageForEachExportedPackage(BundleManifest[] bundleManifests) {
+
+        List<ImportedPackage> allImportedPackages = new ArrayList<ImportedPackage>();
+        List<Warning> warnings = new ArrayList<Warning>();
+
+        for (BundleManifest bundleManifest : bundleManifests) {
+            List<ExportedPackage> packageExports = bundleManifest.getExportPackage().getExportedPackages();
+            BundleManifest resultManifest = BundleManifestFactory.createBundleManifest();
+            doCreateImportedPackageForEachExportedPackage(packageExports, null, null, null, resultManifest);
+
+            List<ImportedPackage> packageImports = resultManifest.getImportPackage().getImportedPackages();
+
+            for (ImportedPackage packageImport : packageImports) {
+                String name = packageImport.getPackageName();
+                if (!containsImport(allImportedPackages, name)) {
+                    allImportedPackages.add(packageImport);
+                } else {
+                    warnings.add(new Warning(Code.DUPLICATE_PACKAGE_EXPORTS, name));
+                }
+            }
+        }
+
+        return new Result<ImportedPackage[]>(allImportedPackages.toArray(new ImportedPackage[allImportedPackages.size()]),
+            warnings.toArray(new Warning[warnings.size()]));
+    }
+
+    private static void doCreateImportedPackageForEachExportedPackage(List<ExportedPackage> packageExports, String bundleSymbolicName,
+        String version, VersionRange versionRange, BundleManifest bundleManifest) {
+        for (ExportedPackage packageExport : packageExports) {
+            String name = packageExport.getPackageName();
+            List<ImportedPackage> packageImports = bundleManifest.getImportPackage().getImportedPackages();
+            ImportedPackage packageImport = findImport(packageImports, name);
+            if (packageImport == null) {
+                packageImport = bundleManifest.getImportPackage().addImportedPackage(name);
+            }
+
+            List<String> mandatory = packageExport.getMandatory();
+            Map<String, String> attributes = new HashMap<String, String>();
+            if (mandatory != null) {
+                for (String attrName : mandatory) {
+                    if (packageExport.getAttributes().containsKey(attrName)) {
+                        attributes.put(attrName, packageExport.getAttributes().get(attrName));
+                    }
+                }
+            }
+
+            if (bundleSymbolicName != null) {
+                attributes.put(BUNDLE_SYMBOLIC_NAME_ATTRIBUTE_NAME, bundleSymbolicName);
+            }
+
+            if (StringUtils.hasText(version)) {
+                VersionRange vr;
+                try {
+                    vr = VersionRange.createExactRange(new Version(version));
+                } catch (IllegalArgumentException e) {
+                    vr = new VersionRange(version);
+                }
+                attributes.put(BUNDLE_VERSION_ATTRIBUTE_NAME, vr.toParseString());
+            }
+
+            /*
+             * If we are importing a fragment, use the supplied bundle version range and if this range is not exact, add
+             * an exact package version.
+             */
+            if (versionRange != null) {
+                // If the bundle version range is not all possible versions, add it as an attribute.
+                if (!(versionRange.isFloorInclusive() && !versionRange.isCeilingInclusive() && versionRange.getFloor().equals(Version.emptyVersion))) {
+                    attributes.put(BUNDLE_VERSION_ATTRIBUTE_NAME, versionRange.toParseString());
+                }
+                if (!versionRange.isExact()) {
+                    VersionRange packageVersionRange = VersionRange.createExactRange(packageExport.getVersion());
+                    attributes.put(VERSION_ATTRIBUTE_NAME, packageVersionRange.toParseString());
+                }
+            }
+
+            packageImport.getAttributes().putAll(attributes);
+        }
+    }
+
+    private static boolean containsImport(List<ImportedPackage> imports, String packageName) {
+        for (ImportedPackage packageImport : imports) {
+            if (packageImport.getPackageName().equals(packageName)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private static ImportedPackage findImport(List<ImportedPackage> imports, String packageName) {
+        for (ImportedPackage packageImport : imports) {
+            if (packageImport.getPackageName().equals(packageName)) {
+                return packageImport;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Encapsulates the output from bundle manifest processing processing along with any {@link Warning Warnings} that
+     * were generated during that processing.
+     * <p />
+     * 
+     * <strong>Concurrent Semantics</strong><br />
+     * Thread-safe.
+     * 
+     * @param <T> output type
+     */
+    public static class Result<T> {
+
+        private final T output;
+
+        private final Warning[] warnings;
+
+        private Result(T output, Warning[] warnings) {
+            this.output = output;
+            this.warnings = warnings;
+        }
+
+        /**
+         * Returns the output of this result
+         * 
+         * @return the output
+         */
+        public T getOutput() {
+            return this.output;
+        }
+
+        /**
+         * Returns any warnings generated while producing the result. If no warnings were generated an empty array will
+         * be returned.
+         * 
+         * @return any generated warnings
+         */
+        public Warning[] getWarnings() {
+            return this.warnings.clone();
+        }
+
+        /**
+         * Returns whether this result was successful. A result is deemed to be successful if it does not contain any
+         * warnings
+         * 
+         * @return <code>true</code> if the result is successful
+         */
+        public boolean success() {
+            return this.warnings.length == 0;
+        }
+    }
+
+    /**
+     * A Warning describes a problem that was encountered during BundleManifestHelper processing
+     * <p />
+     * 
+     * <strong>Concurrent Semantics</strong><br />
+     * Thread-safe.
+     * 
+     */
+    public static class Warning {
+
+        private final Code code;
+
+        private final String reason;
+
+        private Warning(Code code, String reason) {
+            this.code = code;
+            this.reason = reason;
+        }
+
+        /**
+         * Returns the {@link Code} that identifies the nature of this warning
+         * 
+         * @return the warning's code
+         */
+        public Code getCode() {
+            return this.code;
+        }
+
+        /**
+         * Returns the reason for the generation of this warning
+         * 
+         * @return the warning's reason
+         */
+        public String getReason() {
+            return this.reason;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public boolean equals(Object other) {
+            if (other == null) {
+                return false;
+            }
+
+            if (other == this) {
+                return true;
+            }
+
+            if (!(other instanceof Warning)) {
+                return false;
+            }
+
+            Warning that = (Warning) other;
+            return this.getCode().equals(that.getCode()) && this.getReason().equals(that.getReason());
+        }
+
+        @Override
+        public int hashCode() {
+            return this.code.hashCode();
+        }
+    }
+
+    /**
+     * Defines a unique code for each of the warnings that may be generated as a result of bundle manifest processing.
+     * <p />
+     * <strong>Concurrent Semantics</strong><br />
+     * Thread-safe.
+     * 
+     */
+    public enum Code {
+        /**
+         * More than one of the input {@link BundleManifest BundleManifests} exported the same package.
+         */
+        DUPLICATE_PACKAGE_EXPORTS;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/importexpansion/BundleTrackedPackageImports.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/importexpansion/BundleTrackedPackageImports.java
new file mode 100644
index 0000000..aee0593
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/importexpansion/BundleTrackedPackageImports.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.importexpansion;
+
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.virgo.kernel.osgi.framework.ImportMergeException;
+
+import org.eclipse.virgo.nano.serviceability.Assert;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+import org.eclipse.virgo.util.osgi.manifest.ImportedPackage;
+
+/**
+ * {@link BundleTrackedPackageImports} provides merging and tracking for package imports originating in bundle
+ * manifests.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+final class BundleTrackedPackageImports extends AbstractTrackedPackageImports {
+
+    private final BundleManifest bundleManifest;
+
+    /**
+     * Construct a {@link TrackedPackageImports} sourced from a bundle manifest.
+     * 
+     * @param importPackageHeader
+     */
+    BundleTrackedPackageImports(BundleManifest bundleManifest) {
+        super(getInitialImportedPackages(bundleManifest));
+        this.bundleManifest = bundleManifest;
+    }
+
+    /**
+     * Extract a map of package name to {@link ImportedPackage} from the given bundle manifest.
+     * <p />
+     * Each <code>ImportedPackage</code> in the map contains a single package name.
+     * 
+     * @param bundleManifest the bundle manifest containing the package imports
+     * @return a map of package name to {@link ImportedPackage}
+     */
+    private static Map<String, ImportedPackage> getInitialImportedPackages(BundleManifest bundleManifest) {
+        Assert.notNull(bundleManifest, "bundleManifest must be non-null");
+        List<ImportedPackage> importedPackages = bundleManifest.getImportPackage().getImportedPackages();
+        return convertImportedPackageListToMap(importedPackages);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getSource(String pkg) {
+        Assert.notNull(this.bundleManifest.getBundleSymbolicName(), "bundleManifest must have a symbolic name");
+        return !getInitialImportedPackages(this.bundleManifest).containsKey(pkg) ? null
+            : ((this.bundleManifest.getFragmentHost().getBundleSymbolicName() == null ? "bundle " : "fragment ") + this.bundleManifest.getBundleSymbolicName().getSymbolicName());
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public final void merge(TrackedPackageImports importsToMerge) throws ImportMergeException {
+        super.merge(importsToMerge);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/importexpansion/CollectingTrackedPackageImports.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/importexpansion/CollectingTrackedPackageImports.java
new file mode 100644
index 0000000..b5d1dcb
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/importexpansion/CollectingTrackedPackageImports.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.importexpansion;
+
+import java.util.ArrayList;
+
+import org.eclipse.virgo.util.osgi.manifest.ImportedPackage;
+
+
+/**
+ * {@link CollectingTrackedPackageImports} is used to merge up a series of {@link TrackedPackageImports}.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * This class is thread safe.
+ *
+ */
+class CollectingTrackedPackageImports extends AdditionalTrackedPackageImports {
+
+    private static final String SOURCE = "CollectingTrackedPackageImports";
+
+    CollectingTrackedPackageImports() {
+        super(new ArrayList<ImportedPackage>(), SOURCE);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/importexpansion/ContainingTrackedPackageImports.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/importexpansion/ContainingTrackedPackageImports.java
new file mode 100644
index 0000000..29fc37b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/importexpansion/ContainingTrackedPackageImports.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.importexpansion;
+
+import java.util.ArrayList;
+
+import org.eclipse.virgo.kernel.osgi.framework.ImportMergeException;
+import org.eclipse.virgo.util.osgi.manifest.ImportedPackage;
+
+/**
+ * {@link ContainingTrackedPackageImports} is used to collect a series of {@link TrackedPackageImports} into a
+ * containing source. Only contained <code>TrackedPackageImports</code> should be merged into the containing
+ * <code>ContainingTrackedPackageImports</code>.
+ * <p />
+ * The contained sources are wrapped in the containing source name to show the nesting.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+final class ContainingTrackedPackageImports extends AdditionalTrackedPackageImports {
+
+    private final String containingSource;
+
+    /**
+     * Construct a {@link ContainingTrackedPackageImports}.
+     * 
+     * @param containingSource
+     */
+    ContainingTrackedPackageImports(String containingSource) {
+        super(new ArrayList<ImportedPackage>(), containingSource);
+        this.containingSource = containingSource;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String getSources(String pkg) {
+        return this.containingSource + "(" + super.getSources(pkg) + ")";
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public final void merge(TrackedPackageImports importsToMerge) throws ImportMergeException {
+        super.merge(importsToMerge);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/importexpansion/EmptyTrackedPackageImports.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/importexpansion/EmptyTrackedPackageImports.java
new file mode 100644
index 0000000..32e289d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/importexpansion/EmptyTrackedPackageImports.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.importexpansion;
+
+import org.eclipse.virgo.kernel.osgi.framework.ImportMergeException;
+
+/**
+ * {@link EmptyTrackedPackageImports} is an immutable, empty collection of package imports.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is immutable and therefore thread safe.
+ * 
+ */
+final class EmptyTrackedPackageImports extends CollectingTrackedPackageImports {
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public final void merge(TrackedPackageImports importsToMerge) throws ImportMergeException {
+        throw new UnsupportedOperationException();
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/importexpansion/ImportExpansionHandler.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/importexpansion/ImportExpansionHandler.java
new file mode 100644
index 0000000..e82c16c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/importexpansion/ImportExpansionHandler.java
@@ -0,0 +1,564 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.importexpansion;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.osgi.framework.internal.core.BundleRepository;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Version;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.eclipse.virgo.kernel.osgi.framework.ImportExpander;
+import org.eclipse.virgo.kernel.osgi.framework.ImportMergeException;
+import org.eclipse.virgo.kernel.osgi.framework.UnableToSatisfyBundleDependenciesException;
+import org.eclipse.virgo.kernel.osgi.framework.UnableToSatisfyDependenciesException;
+
+import org.eclipse.virgo.kernel.artifact.bundle.BundleBridge;
+import org.eclipse.virgo.kernel.artifact.library.LibraryDefinition;
+import org.eclipse.virgo.nano.serviceability.Assert;
+import org.eclipse.virgo.kernel.userregion.internal.UserRegionLogEvents;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+import org.eclipse.virgo.repository.Attribute;
+import org.eclipse.virgo.repository.Repository;
+import org.eclipse.virgo.util.math.OrderedPair;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifestFactory;
+import org.eclipse.virgo.util.osgi.manifest.BundleSymbolicName;
+import org.eclipse.virgo.util.osgi.manifest.ExportedPackage;
+import org.eclipse.virgo.util.osgi.manifest.ImportedBundle;
+import org.eclipse.virgo.util.osgi.manifest.ImportedLibrary;
+import org.eclipse.virgo.util.osgi.manifest.ImportedPackage;
+import org.eclipse.virgo.util.osgi.manifest.Resolution;
+
+/**
+ * A helper class for handling the expansion of <code>Import-Library</code> and <code>Import-Bundle</code> headers in a
+ * bundle manifest into <code>Import-Package</code> header entries.
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * This class is <strong>thread-safe</strong>.
+ * 
+ */
+public final class ImportExpansionHandler implements ImportExpander {
+
+    private static final String IMPORT_SCOPE_APPLICATION = "application";
+
+    private static final String IMPORT_SCOPE_DIRECTIVE = "import-scope";
+
+    private static final String MISSING_BUNDLE_SYMBOLIC_NAME = "<bundle symbolic name not present>";
+
+    private static final String INSTRUMENTED_SUFFIX = ".instrumented";
+
+    private static final String SYNTHETIC_CONTEXT_SUFFIX = "-synthetic.context";
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private final Repository repository;
+
+    private final TrackedPackageImportsFactory trackedPackageImportsFactory = new StandardTrackedPackageImportsFactory();
+
+    private final BundleContext bundleContext;
+
+    private final Set<String> packagesExportedBySystemBundle;
+
+    private final EventLogger eventLogger;
+
+    public ImportExpansionHandler(Repository repository, Set<String> packagesExportedBySystemBundle, EventLogger eventLogger) {
+        this(repository, null, packagesExportedBySystemBundle, eventLogger);
+    }
+
+    public ImportExpansionHandler(Repository repository, BundleContext bundleContext, Set<String> packagesExportedBySystemBundle,
+        EventLogger eventLogger) {
+        this.repository = repository;
+        this.bundleContext = bundleContext;
+        this.packagesExportedBySystemBundle = packagesExportedBySystemBundle;
+        this.eventLogger = eventLogger;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @throws ImportMergeException
+     */
+    public ImportPromotionVector expandImports(List<BundleManifest> bundleManifests) throws UnableToSatisfyDependenciesException,
+        ImportMergeException {
+        StandardImportPromotionVector importPromotionVector = new StandardImportPromotionVector(this.trackedPackageImportsFactory);
+        TrackedPackageImports packageImportsToBePromoted = this.trackedPackageImportsFactory.createCollector();
+
+        for (BundleManifest bundleManifest : bundleManifests) {
+            TrackedPackageImports bundlePackageImportsToBePromoted = this.trackedPackageImportsFactory.createCollector();
+
+            detectPromotedPackageImports(bundleManifest, bundlePackageImportsToBePromoted);
+
+            expandImportsIfNecessary(bundleManifest, bundlePackageImportsToBePromoted, bundleManifests);
+            if (!bundlePackageImportsToBePromoted.isEmpty()) {
+                packageImportsToBePromoted.merge(bundlePackageImportsToBePromoted);
+                BundleSymbolicName bundleSymbolicNameHeader = bundleManifest.getBundleSymbolicName();
+                Assert.notNull(bundleSymbolicNameHeader, "Bundle-SymbolicName must be present for import promotion tracking");
+                importPromotionVector.put(bundleSymbolicNameHeader.getSymbolicName(), bundlePackageImportsToBePromoted);
+            }
+        }
+
+        mergePromotedImports(packageImportsToBePromoted, bundleManifests);
+        return importPromotionVector;
+    }
+
+    /**
+     * Detect package imports with application import scope and add these to the package imports to be promoted.
+     */
+    private void detectPromotedPackageImports(BundleManifest bundleManifest, TrackedPackageImports bundlePackageImportsToBePromoted) {
+        List<ImportedPackage> importedPackages = bundleManifest.getImportPackage().getImportedPackages();
+        List<ImportedPackage> importedPackagesToPromote = new ArrayList<ImportedPackage>();
+        for (ImportedPackage importedPackage : importedPackages) {
+            if (IMPORT_SCOPE_APPLICATION.equals(importedPackage.getDirectives().get(IMPORT_SCOPE_DIRECTIVE))) {
+                importedPackagesToPromote.add(importedPackage);
+            }
+        }
+        TrackedPackageImports trackedPackageImportsToPromote = this.trackedPackageImportsFactory.create(importedPackagesToPromote,
+            "Import-Package in '" + bundleManifest.getBundleSymbolicName().getSymbolicName() + "' version '" + bundleManifest.getBundleVersion()
+                + "'");
+        bundlePackageImportsToBePromoted.merge(trackedPackageImportsToPromote);
+    }
+
+    private void mergePromotedImports(TrackedPackageImports importsToBemerged, List<BundleManifest> bundleManifests) throws ImportMergeException {
+        for (BundleManifest bundleManifest : bundleManifests) {
+            mergePromotedImports(importsToBemerged, bundleManifest);
+        }
+    }
+
+    private void mergePromotedImports(TrackedPackageImports importsToBemerged, BundleManifest bundleManifest) throws ImportMergeException {
+        BundleSymbolicName bundleSymbolicNameHeader = bundleManifest.getBundleSymbolicName();
+        if (bundleSymbolicNameHeader.getSymbolicName() == null || !bundleSymbolicNameHeader.getSymbolicName().endsWith(SYNTHETIC_CONTEXT_SUFFIX)) {
+            mergeImports(importsToBemerged, bundleManifest);
+        }
+    }
+
+    /**
+     * @param importsToBemerged
+     * @param bundleManifest
+     */
+    private void mergeImports(TrackedPackageImports importsToBemerged, BundleManifest bundleManifest) throws ImportMergeException {
+        TrackedPackageImports bundleTrackedPackageImports = this.trackedPackageImportsFactory.create(bundleManifest);
+        bundleTrackedPackageImports.merge(importsToBemerged);
+        setMergedImports(bundleManifest, bundleTrackedPackageImports);
+    }
+
+    private boolean expandImportsIfNecessary(BundleManifest manifest, TrackedPackageImports packageImportsToBePromoted,
+        List<BundleManifest> bundleManifests) throws UnableToSatisfyDependenciesException {
+        boolean expanded = false;
+
+        List<ImportedBundle> directlyImportedBundles = manifest.getImportBundle().getImportedBundles();
+        List<ImportedLibrary> importedLibraries = manifest.getImportLibrary().getImportedLibraries();
+
+        if (directlyImportedBundles.size() > 0 || importedLibraries.size() > 0) {
+            this.logger.info("Import-Library and/or Import-Bundle header found. Original manifest: \n{}", manifest);
+            expandImports(importedLibraries, directlyImportedBundles, manifest, packageImportsToBePromoted, bundleManifests);
+            this.logger.info("Updated manifest: \n{}", manifest);
+            expanded = true;
+        }
+        return expanded;
+    }
+
+    UnableToSatisfyBundleDependenciesException createExceptionForMissingLibrary(String name, VersionRange versionRange, BundleManifest bundleManifest) {
+        String description = String.format("A library with the name '%s' and a version within the range '%s' could not be found", name, versionRange);
+        BundleSymbolicName bundleSymbolicName = bundleManifest.getBundleSymbolicName();
+        return new UnableToSatisfyBundleDependenciesException(bundleSymbolicName != null ? bundleSymbolicName.getSymbolicName()
+            : MISSING_BUNDLE_SYMBOLIC_NAME, bundleManifest.getBundleVersion(), description);
+    }
+
+    @SuppressWarnings("unchecked")
+    void expandImports(List<ImportedLibrary> libraryImports, List<ImportedBundle> directlyImportedBundles, BundleManifest bundleManifest)
+        throws UnableToSatisfyDependenciesException {
+        expandImports(libraryImports, directlyImportedBundles, bundleManifest, this.trackedPackageImportsFactory.createCollector(),
+            Collections.EMPTY_LIST);
+    }
+
+    void expandImports(List<ImportedLibrary> libraryImports, List<ImportedBundle> directlyImportedBundles, BundleManifest bundleManifest,
+        List<BundleManifest> bundleManifests) throws UnableToSatisfyDependenciesException {
+        expandImports(libraryImports, directlyImportedBundles, bundleManifest, this.trackedPackageImportsFactory.createCollector(), bundleManifests);
+    }
+
+    private void expandImports(List<ImportedLibrary> libraryImports, List<ImportedBundle> directlyImportedBundles, BundleManifest bundleManifest,
+        TrackedPackageImports packageImportsToBePromoted, List<BundleManifest> bundleManifests) throws UnableToSatisfyDependenciesException {
+        Assert.notNull(libraryImports, "Library imports must be non-null");
+        Assert.notNull(directlyImportedBundles, "Direct bundle imports must be non-null");
+
+        mergeImports(
+            getAdditionalPackageImports(libraryImports, directlyImportedBundles, bundleManifest, packageImportsToBePromoted, bundleManifests),
+            bundleManifest);
+
+        bundleManifest.getImportBundle().getImportedBundles().clear();
+        bundleManifest.getImportLibrary().getImportedLibraries().clear();
+    }
+
+    /**
+     * The bundle with the given bundle manifest imports the given list of libraries and the given list of bundles.
+     * Dereference these imports and return a collection of the corresponding {@link TrackedPackageImports}. Any
+     * promoted imports are added to the given <code>TrackedPackageImports</code> of imports to be promoted.
+     * 
+     * @param importedLibraries
+     * @param directlyImportedBundles
+     * @param bundleManifest
+     * @param bundleRepository
+     * @param packageImportsToBePromoted
+     * @return
+     * @throws UnableToSatisfyDependenciesException
+     * @throws UnableToSatisfyBundleDependenciesException
+     */
+    private TrackedPackageImports getAdditionalPackageImports(List<ImportedLibrary> importedLibraries, List<ImportedBundle> directlyImportedBundles,
+        BundleManifest bundleManifest, TrackedPackageImports packageImportsToBePromoted, List<BundleManifest> additionalManifests)
+        throws UnableToSatisfyDependenciesException, UnableToSatisfyBundleDependenciesException {
+        TrackedPackageImports additionalPackageImports = this.trackedPackageImportsFactory.createCollector();
+        TrackedPackageImports libraryPackageImports = getLibraryPackageImports(importedLibraries, packageImportsToBePromoted, bundleManifest,
+            additionalManifests);
+        additionalPackageImports.merge(libraryPackageImports);
+        for (ImportedBundle directlyImportedBundle : directlyImportedBundles) {
+            additionalPackageImports.merge(getBundlePackageImports(directlyImportedBundle, packageImportsToBePromoted, bundleManifest,
+                additionalManifests));
+        }
+        return additionalPackageImports;
+    }
+
+    /**
+     * Get a {@link TrackedPackageImports} instance representing the package imports that correspond to the given bundle
+     * import. The imported bundle is looked up in the given {@link BundleRepository} and, if it is not found,
+     * {@link UnableToSatisfiedBundleDependenciesException} is thrown. If the bundle import is to be promoted, then the
+     * result is also merged into the given <code>TrackedPackageImports</code> instance representing the package imports
+     * to be promoted.
+     * 
+     * @param importedBundle
+     * @param bundleRepository
+     * @param packageImportsToBePromoted
+     * @param importingBundle
+     * @return
+     * @throws UnableToSatisfyBundleDependenciesException
+     */
+    private TrackedPackageImports getBundlePackageImports(ImportedBundle importedBundle, TrackedPackageImports packageImportsToBePromoted,
+        BundleManifest importingBundle, List<BundleManifest> additionalManifests) throws UnableToSatisfyBundleDependenciesException {
+        String bundleSymbolicName = importedBundle.getBundleSymbolicName();
+        VersionRange importVersionRange = importedBundle.getVersion();
+        boolean mandatory = importedBundle.getResolution().equals(Resolution.MANDATORY);
+        if (bundleSymbolicName.equals(importingBundle.getBundleSymbolicName().getSymbolicName())
+            && importVersionRange.includes(importingBundle.getBundleVersion())) {
+            throw new UnableToSatisfyBundleDependenciesException(importingBundle.getBundleSymbolicName().getSymbolicName(),
+                importingBundle.getBundleVersion(), "Import-Bundle must not import the importing bundle");
+        }
+
+        OrderedPair<BundleManifest, Boolean> bundleManifestHolder = findBundle(bundleSymbolicName, importVersionRange, additionalManifests);
+        if (bundleManifestHolder != null && bundleManifestHolder.getFirst() != null) {
+            return createTrackedPackageImportsFromImportedBundle(bundleManifestHolder, importedBundle.isApplicationImportScope(),
+                packageImportsToBePromoted);
+        } else if (mandatory) {
+            throw new UnableToSatisfyBundleDependenciesException(
+                importingBundle.getBundleSymbolicName() != null ? importingBundle.getBundleSymbolicName().getSymbolicName()
+                    : MISSING_BUNDLE_SYMBOLIC_NAME, importingBundle.getBundleVersion(), "Import-Bundle with symbolic name '" + bundleSymbolicName
+                    + "' in version range '" + importVersionRange + "' could not be satisfied");
+        } else {
+            return this.trackedPackageImportsFactory.createEmpty();
+        }
+    }
+
+    /**
+     * Return the {@link TrackedPackageImports} corresponding to importing the given {@link BundleManifest} and, if
+     * appropriate, merge them into the given imports to be promoted.
+     * 
+     * @param bundleManifest
+     * @param promoteExports
+     * @param packageImportsToBePromoted
+     * @return
+     */
+    private TrackedPackageImports createTrackedPackageImportsFromImportedBundle(OrderedPair<BundleManifest, Boolean> bundleManifest,
+        boolean promoteExports, TrackedPackageImports packageImportsToBePromoted) {
+        TrackedPackageImports bundlePackageImports = createPackageImportsFromPackageExports(bundleManifest, promoteExports);
+        if (promoteExports) {
+            packageImportsToBePromoted.merge(bundlePackageImports);
+        }
+        return bundlePackageImports;
+    }
+
+    /**
+     * Create a {@link TrackedPackageImports} instance corresponding to the given package exports from the given bundle
+     * manifest.
+     * <p />
+     * Importing fragment bundles is not encouraged but sometimes it's the only way out when reusing poorly packaged
+     * bundles. Packages exported by a fragment are imported with the host's bundle symbolic name, an exact range
+     * matching only the exported package version, and a bundle version range corresponding to that of the fragment host
+     * header. Since the generated imports do not include a bundle version matching attribute with a value of the form
+     * [v,v], there is a risk that the package import will wire to the wrong version of the host. This risk seems very
+     * small and not worth the extra complexity of matching up hosts and fragments (some of which would need searching
+     * for in the repository) during import expansion.
+     * 
+     */
+    private TrackedPackageImports createPackageImportsFromPackageExports(OrderedPair<BundleManifest, Boolean> bundleManifestHolder,
+        boolean promoteExports) {
+        BundleManifest bundleManifest = bundleManifestHolder.getFirst();
+        List<ExportedPackage> exportedPackages = bundleManifest.getExportPackage().getExportedPackages();
+        if (exportedPackages.isEmpty()) {
+            return this.trackedPackageImportsFactory.createEmpty();
+        }
+        String bundleVersion = bundleManifest.getBundleVersion().toString();
+        String bundleSymbolicName = bundleManifest.getBundleSymbolicName().getSymbolicName();
+
+        List<ImportedPackage> packageImports;
+
+        if (bundleManifest.getFragmentHost().getBundleSymbolicName() != null) {
+            bundleSymbolicName = bundleManifest.getFragmentHost().getBundleSymbolicName();
+            packageImports = BundleManifestProcessor.createImportedPackageForEachExportedPackageOfFragment(exportedPackages, bundleSymbolicName,
+                bundleManifest.getFragmentHost().getBundleVersion());
+        } else {
+            packageImports = BundleManifestProcessor.createImportedPackageForEachExportedPackage(exportedPackages, bundleSymbolicName, bundleVersion);
+        }
+
+        if (promoteExports) {
+            tagImportsAsPromoted(packageImports);
+        }
+
+        if (bundleManifestHolder.getSecond()) {
+            diagnoseSystemBundleOverlap(packageImports, bundleSymbolicName, bundleVersion);
+        }
+
+        return this.trackedPackageImportsFactory.create(packageImports, "Import-Bundle '" + bundleManifest.getBundleSymbolicName().getSymbolicName()
+            + "' version '" + bundleManifest.getBundleVersion() + "'");
+    }
+
+    private void tagImportsAsPromoted(List<ImportedPackage> packageImports) {
+        for (ImportedPackage importedPackage : packageImports) {
+            importedPackage.getDirectives().put(IMPORT_SCOPE_DIRECTIVE, IMPORT_SCOPE_APPLICATION);
+        }
+    }
+
+    /**
+     * Check whether the packages imported by importing a bundle are exported by the system bundle and, if they are,
+     * issue a warning.
+     * 
+     * @param importedPackages the imported packages
+     * @param bundleSymbolicNameString the symbolic name of the imported bundle
+     * @param bundleVersion the version of the imported bundle
+     */
+    private void diagnoseSystemBundleOverlap(List<ImportedPackage> importedPackages, String bundleSymbolicNameString, String bundleVersion) {
+        Set<String> overlap = new HashSet<String>();
+        for (ImportedPackage importedPackage : importedPackages) {
+            String packageName = importedPackage.getPackageName();
+            if (this.packagesExportedBySystemBundle.contains(packageName)) {
+                overlap.add(packageName);
+            }
+        }
+        if (!overlap.isEmpty()) {
+            StringBuilder imports = new StringBuilder();
+            boolean first = true;
+            for (ImportedPackage packageImport : importedPackages) {
+                if (!first) {
+                    imports.append(",");
+                }
+                first = false;
+                imports.append(packageImport.getPackageName());
+            }
+            this.eventLogger.log(UserRegionLogEvents.SYSTEM_BUNDLE_OVERLAP, bundleSymbolicNameString, bundleVersion, overlap.toString(),
+                imports.toString());
+        }
+    }
+
+    /**
+     * Get a {@link TrackedPackageImports} instance representing the package imports that correspond to the given
+     * library imports. Each imported library is looked up in the given {@link BundleRepository} and, if it is not
+     * found, {@link UnableToSatisfiedBundleDependenciesException} is thrown. If any package imports are to be promoted,
+     * then the result is also merged into the given <code>TrackedPackageImports</code> instance representing the
+     * package imports to be promoted.
+     * 
+     * @param importedLibraries
+     * @param bundleRepository
+     * @param packageImportsToBePromoted
+     * @param importingBundle
+     * @return
+     * @throws UnableToSatisfyBundleDependenciesException
+     */
+    private TrackedPackageImports getLibraryPackageImports(List<ImportedLibrary> importedLibraries, TrackedPackageImports packageImportsToBePromoted,
+        BundleManifest importingBundle, List<BundleManifest> additionalManifests) throws UnableToSatisfyBundleDependenciesException {
+        TrackedPackageImports allLibraryPackageImports = this.trackedPackageImportsFactory.createCollector();
+        for (ImportedLibrary importedLibrary : importedLibraries) {
+            VersionRange libraryVersionRange = importedLibrary.getVersion();
+            String libraryName = importedLibrary.getLibrarySymbolicName();
+
+            ArtifactDescriptor libraryArtefact = findArtifactDescriptorForLibrary(libraryName, libraryVersionRange);
+
+            if (libraryArtefact != null) {
+
+                if (!libraryName.endsWith(INSTRUMENTED_SUFFIX) && libraryArtefact.getName().endsWith(INSTRUMENTED_SUFFIX)) {
+                    this.eventLogger.log(UserRegionLogEvents.ALTERNATE_INSTRUMENTED_LIBRARY_FOUND, importingBundle.getBundleSymbolicName(),
+                        libraryName, libraryVersionRange.toString(), libraryArtefact.getName());
+                }
+
+                Version libraryVersion = libraryArtefact.getVersion();
+                TrackedPackageImports libraryPackageImports = this.trackedPackageImportsFactory.createContainer("Import-Library '"
+                    + importedLibrary.getLibrarySymbolicName() + "' version '" + libraryVersion + "'");
+
+                Set<Attribute> importedBundles = libraryArtefact.getAttribute("Import-Bundle");
+
+                for (Attribute importedBundle : importedBundles) {
+                    String bundleSymbolicName = importedBundle.getValue();
+                    Map<String, Set<String>> properties = importedBundle.getProperties();
+                    Set<String> versionSet = properties.get("version");
+                    VersionRange bundleVersionRange;
+                    if (versionSet != null && !versionSet.isEmpty()) {
+                        bundleVersionRange = new VersionRange(versionSet.iterator().next());
+                    } else {
+                        bundleVersionRange = VersionRange.NATURAL_NUMBER_RANGE;
+                    }
+                    OrderedPair<BundleManifest, Boolean> bundleManifest = findBundle(bundleSymbolicName, bundleVersionRange, additionalManifests);
+                    if (bundleManifest.getFirst() != null) {
+                        boolean applicationImportScope = false;
+                        Set<String> importScopeSet = properties.get(IMPORT_SCOPE_DIRECTIVE);
+                        if (importScopeSet != null && !importScopeSet.isEmpty()) {
+                            applicationImportScope = IMPORT_SCOPE_APPLICATION.equals(importScopeSet.iterator().next());
+                        }
+                        libraryPackageImports.merge(createTrackedPackageImportsFromImportedBundle(bundleManifest, applicationImportScope,
+                            packageImportsToBePromoted));
+                    } else {
+                        Resolution importedBundleResolution = Resolution.MANDATORY;
+                        Set<String> resolutionSet = properties.get("resolution");
+                        if (resolutionSet != null && !resolutionSet.isEmpty()) {
+                            importedBundleResolution = Resolution.valueOf(resolutionSet.iterator().next().toUpperCase(Locale.ENGLISH));
+                        }
+
+                        if (importedBundleResolution.equals(Resolution.MANDATORY)) {
+                            throw new UnableToSatisfyBundleDependenciesException(
+                                importingBundle.getBundleSymbolicName() != null ? importingBundle.getBundleSymbolicName().getSymbolicName()
+                                    : MISSING_BUNDLE_SYMBOLIC_NAME, importingBundle.getBundleVersion(), "Imported library '" + libraryName
+                                    + "' version '" + libraryVersion + "' contains Import-Bundle for bundle '" + bundleSymbolicName
+                                    + "' in version range '" + bundleVersionRange + "' which could not be satisfied");
+                        }
+                    }
+                }
+                allLibraryPackageImports.merge(libraryPackageImports);
+            } else if (importedLibrary.getResolution().equals(Resolution.MANDATORY)) {
+                throw createExceptionForMissingLibrary(libraryName, libraryVersionRange, importingBundle);
+            }
+        }
+        return allLibraryPackageImports;
+    }
+
+    /**
+     * Set the package imports of the given {@link BundleManifest} to the merged imports of the given
+     * {@link TrackedPackageImports}.
+     * 
+     * @param bundleManifest the bundle manifest to be modified
+     * @param bundleTrackedPackageImports the <code>TrackedPackageImports</code> containing the merged imports
+     */
+    private void setMergedImports(BundleManifest bundleManifest, TrackedPackageImports bundleTrackedPackageImports) {
+        bundleManifest.getImportPackage().getImportedPackages().clear();
+        bundleManifest.getImportPackage().getImportedPackages().addAll(bundleTrackedPackageImports.getMergedImports());
+    }
+
+    /**
+     * Find the bundle with the given symbolic name and version range in the given bundle repository. If the given
+     * scoper is non-null, scope the symbolic name before searching the repository. Return the {@link BundleDefinition}
+     * of the bundle if it was found.
+     * 
+     * @param bundleSymbolicName
+     * @param versionRange
+     * @param bundleRepository
+     * @param scoper
+     * @return
+     */
+    private OrderedPair<BundleManifest, Boolean> findBundle(String bundleSymbolicName, VersionRange versionRange,
+        List<BundleManifest> additionalManifests) {
+
+        boolean diagnose = false;
+
+        // prefer bundles from the supplied list
+        BundleManifest bundleManifest = findMatchingManifest(bundleSymbolicName, versionRange, additionalManifests);
+
+        if (bundleManifest == null && this.bundleContext != null) {
+            Bundle[] installedBundles = this.bundleContext.getBundles();
+            for (Bundle bundle : installedBundles) {
+                if (bundleSymbolicName.equals(bundle.getSymbolicName()) && versionRange.includes(bundle.getVersion())) {
+                    bundleManifest = getBundleManifest(bundle);
+                    if (bundleManifest != null) {
+                        diagnose = true;
+                        break;
+                    }
+                }
+            }
+        }
+
+        if (bundleManifest == null) {
+            ArtifactDescriptor artefact = findArtifactDescriptorForBundle(bundleSymbolicName, versionRange);
+            if (artefact != null) {
+                diagnose = true;
+                bundleManifest = BundleManifestFactory.createBundleManifest(BundleBridge.convertToDictionary(artefact));
+            }
+        }
+
+        if (bundleManifest != null) {
+            this.logger.info("Found definition for bundle with symbolic name '{}' and version range '{}': {}", new Object[] { bundleSymbolicName,
+                versionRange, bundleManifest });
+        } else {
+            this.logger.info("Could not find definition for bundle with symbolic name '{}' and version range '{}'", bundleSymbolicName, versionRange);
+        }
+
+        return new OrderedPair<BundleManifest, Boolean>(bundleManifest, diagnose);
+    }
+
+    /**
+     * Finds the manifest in the supplied list that matches the given bundle symbolic name and version range. If no
+     * match is found, null is returned. If many matches are found, the one with the highest version range is selected.
+     */
+    private BundleManifest findMatchingManifest(String bundleSymbolicName, VersionRange versionRange, List<BundleManifest> additionalManifests) {
+        Version selectedVersion = null;
+        BundleManifest selectedManifest = null;
+
+        for (final BundleManifest manifest : additionalManifests) {
+            BundleSymbolicName bsn = manifest.getBundleSymbolicName();
+            if (bsn != null && bundleSymbolicName.equals(bsn.getSymbolicName())) {
+                Version version = manifest.getBundleVersion();
+                if (versionRange.includes(version)) {
+                    if (selectedVersion == null || version.compareTo(selectedVersion) > 0) {
+                        selectedVersion = version;
+                        selectedManifest = manifest;
+                    }
+                }
+            }
+        }
+        return selectedManifest;
+    }
+
+    private ArtifactDescriptor findArtifactDescriptorForBundle(String bundleSymbolicName, VersionRange versionRange) {
+        return this.repository.get(BundleBridge.BRIDGE_TYPE, bundleSymbolicName, versionRange);
+    }
+
+    private ArtifactDescriptor findArtifactDescriptorForLibrary(String librarySymbolicName, VersionRange versionRange) {
+        return this.repository.get(LibraryDefinition.LIBRARY_TYPE, librarySymbolicName, versionRange);
+    }
+
+    /**
+     * Get a {@link BundleDefinition} for the given {@link Bundle}. If a definition cannot be created, return
+     * <code>null</code>.
+     * 
+     * @param bundle the bundle whose definition is required
+     * @return the bundle definition or <code>null</code> if no definition can be created
+     */
+    private BundleManifest getBundleManifest(Bundle bundle) {
+        return BundleManifestFactory.createBundleManifest(bundle.getHeaders());
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/importexpansion/StandardImportPromotionVector.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/importexpansion/StandardImportPromotionVector.java
new file mode 100644
index 0000000..8a0c2de
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/importexpansion/StandardImportPromotionVector.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.importexpansion;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.eclipse.virgo.kernel.osgi.framework.ImportExpander.ImportPromotionVector;
+
+/**
+ * {@link StandardImportPromotionVector} maintains a vector of promoted TrackedPackageImports indexed by bundle symbolic
+ * name.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+public class StandardImportPromotionVector implements ImportPromotionVector {
+    
+    private final TrackedPackageImportsFactory trackedPackageImportsFactory;
+
+    private final Map<String, TrackedPackageImports> imports = new ConcurrentHashMap<String, TrackedPackageImports>();
+
+    private final Object monitor = new Object();
+    
+    /**
+     * Construct a {@link StandardImportPromotionVector} with the given {@link TrackedPackageImportsFactory}.
+     * 
+     * @param trackedPackageImportsFactory a {@link TrackedPackageImportsFactory}
+     */
+    StandardImportPromotionVector(TrackedPackageImportsFactory trackedPackageImportsFactory) {
+        this.trackedPackageImportsFactory = trackedPackageImportsFactory;
+    }
+
+    /**
+     * Add the given {@link TrackedPackageImports} at the index of the given bundle symbolic name.
+     * <p />
+     * Any entry at the given index is replaced.
+     * 
+     * @param bundleSymbolicName the index into the vector
+     * @param promotedImports the promoted imports to be added at the given index
+     */
+    void put(String bundleSymbolicName, TrackedPackageImports promotedImports) {
+        synchronized (this.monitor) {
+            this.imports.put(bundleSymbolicName, promotedImports);
+        }
+    }
+
+    /**
+     * Get the {@link TrackedPackageImports} at the index of the given bundle symbolic name.
+     * 
+     * @param bundleSymbolicName the index into the vector
+     * @return the promoted imports at the given index or <code>null</code> if there are no such promoted imports
+     */
+    TrackedPackageImports get(String bundleSymbolicName) {
+        return this.imports.get(bundleSymbolicName);
+    }
+
+    /**
+     * Get a merged form of the promoted imports in this vector.
+     * 
+     * @return a merged {@link TrackedPackageImports}
+     */
+    TrackedPackageImports getPromotedImports() {
+        synchronized (this.monitor) {
+            TrackedPackageImports merged = this.trackedPackageImportsFactory.createCollector();
+            for (TrackedPackageImports promotedImports : this.imports.values()) {
+                merged.merge(promotedImports);
+            }
+            return merged;
+        }
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/importexpansion/StandardTrackedPackageImportsFactory.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/importexpansion/StandardTrackedPackageImportsFactory.java
new file mode 100644
index 0000000..89386cd
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/importexpansion/StandardTrackedPackageImportsFactory.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.importexpansion;
+
+import java.util.List;
+
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+import org.eclipse.virgo.util.osgi.manifest.ImportedPackage;
+
+/**
+ * {@link StandardTrackedPackageImportsFactory} provides a standard way of creating {@link TrackedPackageImports}
+ * instances.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+public final class StandardTrackedPackageImportsFactory implements TrackedPackageImportsFactory {
+
+    private static final EmptyTrackedPackageImports EMPTY_TRACKED_PACKAGE_IMPORTS = new EmptyTrackedPackageImports();
+
+    /**
+     * {@inheritDoc}
+     */
+    public TrackedPackageImports create(BundleManifest bundleManifest) {
+        return new BundleTrackedPackageImports(bundleManifest);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public TrackedPackageImports create(List<ImportedPackage> importedPackages, String source) {
+        return new AdditionalTrackedPackageImports(importedPackages, source);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public TrackedPackageImports createCollector() {
+        return new CollectingTrackedPackageImports();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public TrackedPackageImports createContainer(String containingSource) {
+        return new ContainingTrackedPackageImports(containingSource);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public TrackedPackageImports createEmpty() {
+        return EMPTY_TRACKED_PACKAGE_IMPORTS;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/importexpansion/TrackedPackageImports.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/importexpansion/TrackedPackageImports.java
new file mode 100644
index 0000000..7863a32
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/importexpansion/TrackedPackageImports.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.importexpansion;
+
+import java.util.List;
+
+import org.eclipse.virgo.kernel.osgi.framework.ImportMergeException;
+import org.eclipse.virgo.util.osgi.manifest.ImportedPackage;
+
+/**
+ * {@link TrackedPackageImports} is a collection of package imports which supports merging. Merge conflicts result in an
+ * {@link ImportMergeException} being thrown which can be tracked back to its sources for diagnosis of the reason for the
+ * clash.
+ * <p />
+ * Various implementations of <code>TrackedPackageImports</code> are available and instance of these should be created
+ * using the {@link TrackedPackageImportsFactory} interface.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations of this class must be thread safe.
+ * 
+ * @see TrackedPackageImportsFactory
+ */
+public interface TrackedPackageImports {
+
+    /**
+     * Merge the given package imports into this collection of package imports. If there is a conflict, issue
+     * diagnostics and throw {@link ImportMergeException}.
+     * <p />
+     * A merge conflict is caused by disjoint version ranges or incompatible matching attributes.
+     * 
+     * @param importsToMerge the package imports to be merged
+     * @throws ImportMergeException thrown if and only if there is a conflict
+     */
+    void merge(TrackedPackageImports importsToMerge) throws ImportMergeException;
+
+    /**
+     * Determine whether there are any merged imports.
+     * 
+     * @return <code>true</code> if and only if there are merged imports
+     */
+    boolean isEmpty();
+
+    /**
+     * Determine whether or not this {@link TrackedPackageImports} has equivalent merged imports to the given
+     * {@link TrackedPackageImports}. The sources of the merged imports are disregarded in this comparison.
+     * 
+     * @param otherTrackedPackageImports
+     * @return <code>true</code> if and only if this and the given {@link TrackedPackageImports} have equivalent
+     *         merged imports
+     */
+    boolean isEquivalent(TrackedPackageImports otherTrackedPackageImports);
+
+    /**
+     * Get the merged package imports. If there has been a conflict, throw {@link ImportMergeException}.
+     * 
+     * @return the merged package imports
+     * @throws ImportMergeException thrown if and only if there has been a conflict
+     */
+    List<ImportedPackage> getMergedImports() throws ImportMergeException;
+
+    /**
+     * Get any sources of the given package in this merged collection. Return <code>null</code> if there are no
+     * sources in this collection.
+     * 
+     * @param pkg the name of the package whose sources are required
+     * @return a description of the sources in this collection or <code>null</code> if there are no sources in this
+     *         collection
+     */
+    String getSources(String pkg);
+
+    /**
+     * If the given package name was in the original collection, return the source of this {@link TrackedPackageImports}.
+     * Otherwise return <code>null</code>.
+     * 
+     * @param pkg the name of the package whose source is required
+     * @return a description of this source or <code>null</code> if the given package was not in the original
+     *         collection
+     */
+    String getSource(String pkg);
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/importexpansion/TrackedPackageImportsFactory.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/importexpansion/TrackedPackageImportsFactory.java
new file mode 100644
index 0000000..ed339b2
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/importexpansion/TrackedPackageImportsFactory.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.importexpansion;
+
+import java.util.List;
+
+import org.eclipse.virgo.kernel.osgi.framework.ImportMergeException;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+import org.eclipse.virgo.util.osgi.manifest.ImportedPackage;
+
+/**
+ * {@link TrackedPackageImportsFactory} is an interface for creating {@link TrackedPackageImports} instances.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations of this interface must be thread safe.
+ * 
+ * @see TrackedPackageImports
+ */
+public interface TrackedPackageImportsFactory {
+
+    /**
+     * Create a {@link TrackedPackageImports} from the given {@link BundleManifest}.
+     * <p />
+     * This is typically used to take the imports of a bundle and merge in imports from other sources.
+     * 
+     * @param bundleManifest the bundle manifest
+     * @return a <code>TrackedPackageImports</code> instance
+     */
+    TrackedPackageImports create(BundleManifest bundleManifest);
+
+    /**
+     * Create a {@link TrackedPackageImports} from the given list of {@link ImportedPackage}s and given source.
+     * <p />
+     * This is typically used to represent a collection of imports which are to be added to one or more bundles.
+     * 
+     * @param importedPackages a list of <code>ImportedPackage</code>s which must not contain duplicate packages
+     * @param source the source of the given package imports
+     * @return a <code>TrackedPackageImports</code> instance
+     */
+    TrackedPackageImports create(List<ImportedPackage> importedPackages, String source);
+
+    /**
+     * Create a {@link TrackedPackageImports} with no {@link ImportedPackage}s of its own.
+     * <p />
+     * This is typically used to gather together a collection of imports from multiple sources which are then to be
+     * added to one or more bundles.
+     * 
+     * @return a <code>TrackedPackageImports</code> instance
+     */
+    TrackedPackageImports createCollector();
+
+    /**
+     * Create a <i>container</i> {@link TrackedPackageImports} which contains any {@link ImportedPackage}s which are
+     * subsequently merged into it but which has no {@link ImportedPackage}s of its own. If the container is involved in
+     * producing an {@link ImportMergeException}, the sources of the {@link ImportedPackage}s merged into the container
+     * are wrapped in the given containing source.
+     * <p />
+     * This is typically used for named groups of imports such as the group of package imports corresponding to a
+     * library (in which case the name of the group could be the library name).
+     * @param containingSource 
+     * @return a <code>TrackedPackageImports</code> instance
+     */
+    TrackedPackageImports createContainer(String containingSource);
+    
+    /**
+     * Create an empty, immutable {@link TrackedPackageImports}.
+     * 
+     * @return a <code>TrackedPackageImports</code> instance
+     */
+    TrackedPackageImports createEmpty();
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/management/JMXQuasiBundle.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/management/JMXQuasiBundle.java
new file mode 100644
index 0000000..69f4fc4
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/management/JMXQuasiBundle.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2012 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.virgo.kernel.userregion.internal.management;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiBundle;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiExportPackage;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiImportPackage;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiRequiredBundle;
+
+/**
+ * 
+ *
+ */
+public final class JMXQuasiBundle extends JMXQuasiMinimalBundle{
+
+	private final QuasiBundle quasiBundle;
+
+	protected JMXQuasiBundle(QuasiBundle quasiBundle) {
+		super(quasiBundle);
+		this.quasiBundle = quasiBundle;
+	}
+	
+	public final JMXQuasiWire[] getProvidedWires() {
+		List<QuasiExportPackage> exportPackages = this.quasiBundle.getExportPackages();
+		List<JMXQuasiWire> wires = new ArrayList<JMXQuasiWire>();
+		for (QuasiExportPackage quasiExportPackage : exportPackages) {
+			List<QuasiImportPackage> consumers = quasiExportPackage.getConsumers();
+			for (QuasiImportPackage quasiImportPackage : consumers) {
+				if(quasiImportPackage != null){
+					wires.add(new JMXQuasiWire(quasiImportPackage));
+				}
+			}
+		}
+		List<QuasiBundle> fragments = this.quasiBundle.getFragments();
+		if(fragments != null && fragments.size() > 0){
+			for (QuasiBundle fragment : fragments) {
+				wires.add(new JMXQuasiWire(this.quasiBundle, fragment));
+			}
+		}
+		return wires.toArray(new JMXQuasiWire[wires.size()]);
+	}
+	
+	public final JMXQuasiWire[] getRequiredWires() {
+		List<QuasiImportPackage> importPackages = this.quasiBundle.getImportPackages();
+		List<JMXQuasiWire> wires = new ArrayList<JMXQuasiWire>();
+		for (QuasiImportPackage quasiImportPackage : importPackages) {
+			if(quasiImportPackage != null){
+				wires.add(new JMXQuasiWire(quasiImportPackage));
+			}
+		}
+		List<QuasiRequiredBundle> requiredBundles = this.quasiBundle.getRequiredBundles();
+		if(requiredBundles != null && requiredBundles.size() > 0){
+			for (QuasiRequiredBundle quasiRequiredBundle : requiredBundles) {
+				wires.add(new JMXQuasiWire(quasiRequiredBundle, this.quasiBundle));
+			}
+		}
+		List<QuasiBundle> hosts = this.quasiBundle.getHosts();
+		if(hosts != null && hosts.size() > 0){
+			for (QuasiBundle host : hosts) {
+				wires.add(new JMXQuasiWire(host, this.quasiBundle));
+			}
+		}
+		return wires.toArray(new JMXQuasiWire[wires.size()]);
+	}
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/management/JMXQuasiMinimalBundle.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/management/JMXQuasiMinimalBundle.java
new file mode 100644
index 0000000..e187c2e
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/management/JMXQuasiMinimalBundle.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.virgo.kernel.userregion.internal.management;
+
+import java.util.List;
+
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiBundle;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiExportPackage;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiImportPackage;
+
+/**
+ * 
+ *
+ */
+public class JMXQuasiMinimalBundle {
+
+	private final QuasiBundle quasiBundle;
+
+	public JMXQuasiMinimalBundle(QuasiBundle quasiBundle) {
+		this.quasiBundle = quasiBundle;
+	}
+
+	public final long getIdentifier(){
+		return this.quasiBundle.getBundleId();
+	}
+	
+	public final String getSymbolicName(){
+		return this.quasiBundle.getSymbolicName();
+	}
+	
+	public final String getVersion() {
+		return this.quasiBundle.getVersion().toString();
+	}
+	
+	public final String getState() {
+		if(this.quasiBundle.isResolved()){
+			return "RESOLVED";
+		}
+		return "UNRESOLVED";
+	}
+	
+	public final String getRegion() {
+		return this.quasiBundle.getRegion().getName();
+	}
+	
+	public final String getLocation() {
+		return this.quasiBundle.getBundleLocation();
+	}
+	
+	public final boolean getFragment() {
+		return this.quasiBundle.getFragments() != null && this.quasiBundle.getFragments().size() > 0;
+	}
+	
+	public final String[] getExportedPackages() {
+		List<QuasiExportPackage> exportPackages = this.quasiBundle.getExportPackages();
+		String[] packages = new String[exportPackages.size()];
+		int i = 0;
+		for (QuasiExportPackage quasiExportPackage : exportPackages) {
+			packages[i] = quasiExportPackage.getPackageName() + ";" + quasiExportPackage.getVersion().toString();
+			i++;
+		}
+		return packages;
+	}
+	
+	public final String[] getImportedPackages() {
+		List<QuasiImportPackage> importPackages = this.quasiBundle.getImportPackages();
+		String[] packages = new String[importPackages.size()];
+		int i = 0;
+		for (QuasiImportPackage quasiImportPackage : importPackages) {
+			packages[i] = quasiImportPackage.getPackageName() + ";" + quasiImportPackage.getVersionConstraint().toString();
+			i++;
+		}
+		return packages;
+	}
+	
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/management/JMXQuasiResolutionFailure.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/management/JMXQuasiResolutionFailure.java
new file mode 100644
index 0000000..5046136
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/management/JMXQuasiResolutionFailure.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2012 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.virgo.kernel.userregion.internal.management;
+
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiResolutionFailure;
+
+/**
+ * 
+ *
+ */
+public class JMXQuasiResolutionFailure {
+
+	private final QuasiResolutionFailure quasiResolutionFailure;
+
+	public JMXQuasiResolutionFailure(QuasiResolutionFailure quasiResolutionFailure) {
+		this.quasiResolutionFailure = quasiResolutionFailure;
+	}
+	
+	public long getIdentifier(){
+		return this.quasiResolutionFailure.getUnresolvedQuasiBundle().getBundleId();
+	}
+	
+	public String getSymbolicName(){
+		return this.quasiResolutionFailure.getUnresolvedQuasiBundle().getSymbolicName();
+	}
+	
+	public String getVersion(){
+		return this.quasiResolutionFailure.getUnresolvedQuasiBundle().getVersion().toString();
+	}
+	
+	public String getDescription(){
+		return this.quasiResolutionFailure.getDescription();
+	}
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/management/JMXQuasiStateDump.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/management/JMXQuasiStateDump.java
new file mode 100644
index 0000000..18e20aa
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/management/JMXQuasiStateDump.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2012 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.virgo.kernel.userregion.internal.management;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.zip.ZipException;
+
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiBundle;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiFramework;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiFrameworkFactory;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiResolutionFailure;
+
+/**
+ *   
+ * MBean that allows for the exploration of state dumps using the QuasiFramework
+ */
+public class JMXQuasiStateDump implements StateDumpMXBean {
+	
+	private final QuasiFrameworkFactory quasiFrameworkFactory;
+
+	public JMXQuasiStateDump(QuasiFrameworkFactory quasiFrameworkFactory) {
+		this.quasiFrameworkFactory = quasiFrameworkFactory;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public JMXQuasiResolutionFailure[] getUnresolvedBundleFailures(String dumpFile) {
+		QuasiFramework quasiFramework = this.getQuasiFramework(dumpFile);
+		List<JMXQuasiResolutionFailure> fails = new ArrayList<JMXQuasiResolutionFailure>();
+		List<QuasiBundle> bundles = quasiFramework.getBundles();
+		for (QuasiBundle quasiBundle : bundles) {
+			if(!quasiBundle.isResolved()){
+				List<QuasiResolutionFailure> diagnoses = quasiFramework.diagnose(quasiBundle.getBundleId());
+				if(diagnoses != null){
+					for (QuasiResolutionFailure quasiResolutionFailure : diagnoses) {
+						if(quasiResolutionFailure != null){
+							fails.add(new JMXQuasiResolutionFailure(quasiResolutionFailure));
+						}
+					}
+				}
+			}
+		}
+		return fails.toArray(new JMXQuasiResolutionFailure[fails.size()]);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public JMXQuasiMinimalBundle[] listBundles(String dumpFile) {
+		QuasiFramework quasiFramework = this.getQuasiFramework(dumpFile);
+		List<QuasiBundle> bundles = quasiFramework.getBundles();
+		List<JMXQuasiMinimalBundle> jmxBundles = new ArrayList<JMXQuasiMinimalBundle>();
+		for (QuasiBundle minimalBundleMXBean : bundles) {
+			jmxBundles.add(new JMXQuasiMinimalBundle(minimalBundleMXBean));
+		}
+		return jmxBundles.toArray(new JMXQuasiMinimalBundle[jmxBundles.size()]);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public JMXQuasiBundle getBundle(String dumpFile, long bundleId) {
+		if(bundleId < 0){
+			return null;
+		}
+		QuasiFramework quasiFramework = this.getQuasiFramework(dumpFile);
+		QuasiBundle quasiBundle = quasiFramework.getBundle(bundleId);
+		return new JMXQuasiBundle(quasiBundle);
+	}
+
+	private QuasiFramework getQuasiFramework(String dumpFile){
+		File dumpDir = new File(dumpFile);
+		if(dumpDir.exists() && dumpDir.isDirectory()){
+			try {
+				return this.quasiFrameworkFactory.create(dumpDir);
+			} catch (ZipException e) {
+				throw new RuntimeException("Unable to extract the state dump: " + e.getMessage(), e);
+			} catch (IOException e) {
+				throw new RuntimeException("Error reading the state dump: " + e.getMessage(), e);
+			}
+		}
+		throw new RuntimeException("Not a valid dump directory: " + dumpFile);
+	}
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/management/JMXQuasiWire.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/management/JMXQuasiWire.java
new file mode 100644
index 0000000..2c36aa2
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/management/JMXQuasiWire.java
@@ -0,0 +1,137 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2012 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.virgo.kernel.userregion.internal.management;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.eclipse.osgi.service.resolver.BundleDescription;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiBundle;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiExportPackage;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiImportPackage;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiRequiredBundle;
+
+public class JMXQuasiWire {
+
+	private final String namespace;
+	
+	private final long providerId;
+	
+	private final long requirerId;
+	
+	private final Map<String, String> bundleCapabilityAttributes;
+	
+	private final Map<String, String> bundleCapabilityDirectives;
+	
+	private final Map<String, String> bundleRequirementAttributes;
+	
+	private final Map<String, String> bundleRequirementDirectives;
+	
+	public JMXQuasiWire(QuasiImportPackage quasiImportPackage) {
+		this.namespace = BundleDescription.PACKAGE_NAMESPACE;
+		this.requirerId = quasiImportPackage.getImportingBundle().getBundleId();
+		QuasiExportPackage provider = quasiImportPackage.getProvider();
+		if(provider != null){
+			this.providerId = quasiImportPackage.getProvider().getExportingBundle().getBundleId();
+			this.bundleCapabilityAttributes = this.stringifyMap(provider.getAttributes());
+			this.bundleCapabilityDirectives = this.stringifyMap(provider.getDirectives());
+		}else{
+			this.providerId = -1l;
+			this.bundleCapabilityAttributes = new HashMap<String, String>();
+			this.bundleCapabilityDirectives = new HashMap<String, String>();
+		}
+		this.bundleRequirementAttributes = this.stringifyMap(quasiImportPackage.getAttributes());
+		this.bundleRequirementDirectives = this.stringifyMap(quasiImportPackage.getDirectives());
+	}
+	
+	public JMXQuasiWire(QuasiBundle provider, QuasiBundle requirer) {
+		this.namespace = BundleDescription.HOST_NAMESPACE;
+		this.providerId = provider.getBundleId();
+		this.requirerId = requirer.getBundleId();
+		this.bundleCapabilityAttributes = new HashMap<String, String>();
+		this.bundleCapabilityDirectives = new HashMap<String, String>();
+		this.bundleRequirementAttributes = this.getProperties(new String[]{"host", provider.getSymbolicName()}, new String[]{"bundle-version", provider.getVersion().toString()});
+		this.bundleRequirementDirectives = new HashMap<String, String>();
+	}
+
+	public JMXQuasiWire(QuasiRequiredBundle provider,QuasiBundle requirer) {
+		this.namespace = BundleDescription.BUNDLE_NAMESPACE;
+		QuasiBundle quasiProvider = provider.getProvider();
+		if(quasiProvider == null){
+			this.providerId = -1l;
+		}else{
+			this.providerId = quasiProvider.getBundleId();
+		}
+		this.requirerId = requirer.getBundleId();
+		this.bundleCapabilityAttributes = this.stringifyMap(provider.getAttributes());
+		this.bundleCapabilityDirectives = this.stringifyMap(provider.getDirectives());
+		this.bundleRequirementAttributes = this.getProperties(new String[]{"Required-Bundle", provider.getRequiredBundleName()}, new String[]{"Version-Constraint", provider.getVersionConstraint().toString()});
+		this.bundleRequirementDirectives = new HashMap<String, String>();
+	}
+
+	public final long getRequirerBundleId(){
+		return this.requirerId;
+	}
+	
+	public final long getProviderBundleId(){
+		return this.providerId;
+	}
+	
+	public final String getNamespace(){
+		return this.namespace;
+	}
+	
+	public final Map<String, String> getBundleCapabilityAttributes(){
+		return this.bundleCapabilityAttributes;
+	}
+
+	public final Map<String, String> getBundleCapabilityDirectives(){
+		return this.bundleCapabilityDirectives;
+	}
+	
+	public final Map<String, String> getBundleRequirementAttributes(){
+		return this.bundleRequirementAttributes;
+	}
+	
+	public final Map<String, String> getBundleRequirementDirectives(){
+		return this.bundleRequirementDirectives;
+	}
+	
+	private Map<String, String> stringifyMap(Map<String, Object> map){
+		Map<String, String> properties = new HashMap<String, String>();
+		for(Entry<String, Object> entry: map.entrySet()){
+			if(entry.getValue().getClass().isArray()){
+				Object[] valueArray = (Object[]) entry.getValue();
+				StringBuilder builder = new StringBuilder();
+				for (int i = 0; i < valueArray.length; i++) {
+					builder.append(valueArray[i].toString());
+					if(i < valueArray.length -1){
+						builder.append(", ");
+					}
+				}
+				properties.put(entry.getKey(), builder.toString());
+			}else{
+				properties.put(entry.getKey(), entry.getValue().toString());
+			}
+		}
+		return properties;
+	}
+	
+	private Map<String, String> getProperties(String[]... strings){
+		Map<String, String> properties = new HashMap<String, String>();
+		for (int i = 0; i < strings.length; i++) {
+			properties.put(strings[i][0], strings[i][1]);
+		}
+		return properties;
+	}
+	
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/management/StateDumpMXBean.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/management/StateDumpMXBean.java
new file mode 100644
index 0000000..69be167
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/management/StateDumpMXBean.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2012 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.virgo.kernel.userregion.internal.management;
+
+import javax.management.MXBean;
+
+/**
+ * 
+ * Implementations should be thread safe
+ *
+ */
+@MXBean
+public interface StateDumpMXBean {
+
+	public JMXQuasiResolutionFailure[] getUnresolvedBundleFailures(String dumpFile);
+
+	public JMXQuasiMinimalBundle[] listBundles(String dumpFile);
+	
+	public JMXQuasiBundle getBundle(String dumpFile, long bundleId);
+	
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/management/StateDumpMXBeanExporter.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/management/StateDumpMXBeanExporter.java
new file mode 100644
index 0000000..7a824a2
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/management/StateDumpMXBeanExporter.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2012 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.virgo.kernel.userregion.internal.management;
+
+import java.lang.management.ManagementFactory;
+
+import javax.management.MBeanServer;
+import javax.management.ObjectInstance;
+import javax.management.ObjectName;
+
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiFrameworkFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * 
+ *
+ */
+public class StateDumpMXBeanExporter {
+    private final Logger logger = LoggerFactory.getLogger(StateDumpMXBeanExporter.class);
+
+    private static final String DOMAIN = "org.eclipse.virgo.kernel";
+    
+    private final MBeanServer server = ManagementFactory.getPlatformMBeanServer();
+
+	private ObjectInstance registeredMBean;
+
+    /**
+     * 
+     * @param serverHome
+     */
+	public StateDumpMXBeanExporter(QuasiFrameworkFactory quasiFrameworkFactory) {
+		try {
+			ObjectName dumpMBeanName = new ObjectName(String.format("%s:type=Medic,name=StateDumpInspector", DOMAIN));
+			registeredMBean = this.server.registerMBean(new JMXQuasiStateDump(quasiFrameworkFactory), dumpMBeanName);
+		} catch (Exception e) {
+			logger.error("Unable to register the DumpInspectorMBean", e);
+		} 
+	}
+	
+	/**
+	 * 
+	 */
+	public void close(){
+		ObjectInstance localRegisteredMBean = this.registeredMBean;
+		if(localRegisteredMBean != null){
+			try {
+				this.server.unregisterMBean(localRegisteredMBean.getObjectName());
+				this.registeredMBean = null;
+			} catch (Exception e) {
+				logger.error("Unable to unregister MBean", e);
+			} 
+		}
+	}
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/quasi/BundleDescriptionComparator.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/quasi/BundleDescriptionComparator.java
new file mode 100644
index 0000000..0eb4ef1
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/quasi/BundleDescriptionComparator.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.quasi;
+
+import java.io.Serializable;
+import java.util.Comparator;
+
+import org.eclipse.osgi.service.resolver.BundleDescription;
+
+class BundleDescriptionComparator implements Comparator<BundleDescription>, Serializable {
+    
+    private static final long serialVersionUID = 1360592459106362605L;
+
+    public int compare(BundleDescription bd1, BundleDescription bd2) {
+        int comparison = bd1.getSymbolicName().compareTo(bd2.getSymbolicName());
+        
+        if (comparison == 0) {
+            comparison = bd1.getVersion().compareTo(bd2.getVersion());
+        }
+        
+        return comparison;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/quasi/DependencyCalculator.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/quasi/DependencyCalculator.java
new file mode 100644
index 0000000..045b2d6
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/quasi/DependencyCalculator.java
@@ -0,0 +1,429 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.quasi;
+
+import java.io.File;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Dictionary;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicLong;
+
+import org.eclipse.equinox.region.Region;
+import org.eclipse.equinox.region.RegionDigraph.FilteredRegion;
+import org.eclipse.equinox.region.RegionFilter;
+import org.eclipse.osgi.service.resolver.BundleDelta;
+import org.eclipse.osgi.service.resolver.BundleDescription;
+import org.eclipse.osgi.service.resolver.BundleSpecification;
+import org.eclipse.osgi.service.resolver.ExportPackageDescription;
+import org.eclipse.osgi.service.resolver.HostSpecification;
+import org.eclipse.osgi.service.resolver.ImportPackageSpecification;
+import org.eclipse.osgi.service.resolver.ResolverError;
+import org.eclipse.osgi.service.resolver.State;
+import org.eclipse.osgi.service.resolver.StateDelta;
+import org.eclipse.osgi.service.resolver.StateObjectFactory;
+import org.eclipse.osgi.service.resolver.VersionConstraint;
+import org.eclipse.osgi.service.resolver.VersionRange;
+import org.eclipse.virgo.kernel.artifact.bundle.BundleBridge;
+import org.eclipse.virgo.kernel.osgi.framework.UnableToSatisfyBundleDependenciesException;
+import org.eclipse.virgo.kernel.osgi.framework.UnableToSatisfyDependenciesException;
+import org.eclipse.virgo.kernel.userregion.internal.quasi.ResolutionFailureDetective.ResolverErrorsHolder;
+import org.eclipse.virgo.medic.dump.DumpGenerator;
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+import org.eclipse.virgo.repository.Attribute;
+import org.eclipse.virgo.repository.Query;
+import org.eclipse.virgo.repository.Repository;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.Version;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Calculates the dependencies of a given set of {@link BundleDescription BundleDescriptions}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.
+ * 
+ */
+public final class DependencyCalculator {
+
+    // The following literal must match ResolutionDumpContributor.RESOLUTION_STATE_KEY from kernel core.
+    private static final String RESOLUTION_STATE_KEY = "resolution.state";
+
+    private static final String REGION_LOCATION_DELIMITER = "@";
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private final ResolutionFailureDetective detective;
+
+    private final AtomicLong nextBundleId = new AtomicLong(System.currentTimeMillis());
+
+    private final Repository repository;
+
+    private final Object monitor = new Object();
+
+    private final StateObjectFactory stateObjectFactory;
+
+    private final DumpGenerator dumpGenerator;
+
+    private Region coregion;
+
+    public DependencyCalculator(StateObjectFactory stateObjectFactory, ResolutionFailureDetective detective, Repository repository,
+        BundleContext bundleContext) {
+        this.repository = repository;
+        this.detective = detective;
+        this.stateObjectFactory = stateObjectFactory;
+        this.dumpGenerator = bundleContext.getService(bundleContext.getServiceReference(DumpGenerator.class));
+    }
+
+    /**
+     * Calculates the dependencies of the supplied set of {@link BundleDescription bundles}.
+     * <p/>
+     * 
+     * Callers must supply a {@link State} against which dependency satisfaction is executed. The supplied State is
+     * destructively modified during constraint satisfaction so it <strong>must</strong> not be the system state.
+     * <p/>
+     * 
+     * In a successful invocation, any new bundles that need to be installed are returned, and the supplied
+     * <code>State</code> is transformed to reflect the newly resolved state of the supplied bundles. Callers can query
+     * the <code>State</code> to find the fully wiring graph of the supplied bundles after successful constraint
+     * satisfaction.
+     * <p/>
+     * 
+     * If diagnostics are forced, then an {@link UnableToSatisfyDependenciesException} is thrown if the constraints
+     * cannot be satisfied. If diagnostics are not forced, then either an
+     * <code>UnableToSatisfyDependenciesException</code> is thrown or the new bundles that need to be installed are
+     * returned depending on whether cloning some bundles may improve the chances of satisfying the constraints.
+     * 
+     * @param state the <code>State</code> to satisfy against.
+     * @param coregion the coregion containing the side-state bundles
+     * @param bundles the bundles to calculate dependencies for
+     * @param disabledProvisioningBundles a subset of bundles which should not have their dependencies provisioned
+     * @return an array of descriptions of bundles that need to be added to the state to satisfy constraints.
+     * @throws BundleException
+     * @throws UnableToSatisfyDependenciesException
+     */
+    public BundleDescription[] calculateDependencies(State state, Region coregion, BundleDescription[] bundles,
+        BundleDescription[] disabledProvisioningBundles) throws BundleException, UnableToSatisfyDependenciesException {
+        this.logger.info("Calculating missing dependencies of bundle(s) '{}'", (Object[]) bundles);
+        synchronized (this.monitor) {
+            this.coregion = coregion;
+            try {
+                doSatisfyConstraints(bundles, state, disabledProvisioningBundles);
+
+                StateDelta delta = state.resolve(bundles);
+
+                for (BundleDescription description : bundles) {
+                    if (!description.isResolved()) {
+                        generateDump(state);
+
+                        ResolverErrorsHolder reh = new ResolverErrorsHolder();
+                        String failure = this.detective.generateFailureDescription(state, description, reh);
+
+                        ResolverError[] resolverErrors = reh.getResolverErrors();
+                        if (resolverErrors != null) {
+                            for (ResolverError resolverError : resolverErrors) {
+                                if (resolverError.getType() == ResolverError.IMPORT_PACKAGE_USES_CONFLICT) {
+                                    VersionConstraint unsatisfiedConstraint = resolverError.getUnsatisfiedConstraint();
+                                    if (unsatisfiedConstraint instanceof ImportPackageSpecification) {
+                                        ImportPackageSpecification importPackageSpecification = (ImportPackageSpecification) unsatisfiedConstraint;
+                                        this.logger.debug("Uses conflict: package '{}' version '{}' bundle '{}' version '{}'", new Object[] {
+                                            importPackageSpecification.getName(), importPackageSpecification.getVersionRange(),
+                                            importPackageSpecification.getBundleSymbolicName(), importPackageSpecification.getBundleVersionRange() });
+                                    }
+                                }
+                            }
+                        }
+
+                        throw new UnableToSatisfyBundleDependenciesException(description.getSymbolicName(), description.getVersion(), failure, state,
+                            reh.getResolverErrors());
+                    }
+                }
+
+                BundleDelta[] deltas = delta.getChanges(BundleDelta.ADDED, false);
+                Set<BundleDescription> newBundles = new HashSet<BundleDescription>();
+
+                for (BundleDelta bundleDelta : deltas) {
+                    newBundles.add(bundleDelta.getBundle());
+                }
+
+                Set<BundleDescription> dependenciesSet = getNewTransitiveDependencies(new HashSet<BundleDescription>(Arrays.asList(bundles)),
+                    newBundles);
+
+                List<BundleDescription> dependencies = new ArrayList<BundleDescription>(dependenciesSet);
+                this.logger.info("The dependencies of '{}' are '{}'", Arrays.toString(bundles), dependencies);
+
+                Collections.sort(dependencies, new BundleDescriptionComparator());
+
+                BundleDescription[] dependencyDescriptions = dependencies.toArray(new BundleDescription[dependencies.size()]);
+                return dependencyDescriptions;
+            } finally {
+                this.coregion = null;
+            }
+        }
+    }
+
+    private Set<BundleDescription> getNewTransitiveDependencies(Set<BundleDescription> dependingBundles, Collection<BundleDescription> newBundles) {
+        Set<BundleDescription> transitiveDependencies = new HashSet<BundleDescription>();
+
+        while (!dependingBundles.isEmpty()) {
+            Set<BundleDescription> newDependencies = new HashSet<BundleDescription>();
+            for (BundleDescription bundle : dependingBundles) {
+                newDependencies.addAll(getNewImmediateDependencies(bundle, newBundles));
+            }
+
+            // Next time round the loop, check new dependencies that we haven't already processed
+            newDependencies.removeAll(transitiveDependencies);
+            dependingBundles = newDependencies;
+
+            transitiveDependencies.addAll(newDependencies);
+        }
+        return transitiveDependencies;
+    }
+
+    private Set<BundleDescription> getNewImmediateDependencies(BundleDescription bundle, Collection<BundleDescription> newBundles) {
+        Set<BundleDescription> immediateDependencies = new HashSet<BundleDescription>();
+        immediateDependencies.addAll(Arrays.asList(bundle.getFragments()));
+        immediateDependencies.addAll(Arrays.asList(bundle.getResolvedRequires()));
+        immediateDependencies.addAll(getPackageProviders(bundle));
+
+        HostSpecification hostSpecification = bundle.getHost();
+        if (hostSpecification != null) {
+            for (BundleDescription host : hostSpecification.getHosts()) {
+                immediateDependencies.add(host);
+            }
+        }
+        immediateDependencies.retainAll(newBundles);
+        return immediateDependencies;
+    }
+
+    private Set<BundleDescription> getPackageProviders(BundleDescription bundleDescription) {
+        Set<BundleDescription> packageProviders = new HashSet<BundleDescription>();
+        ExportPackageDescription[] resolvedImports = bundleDescription.getResolvedImports();
+        for (ExportPackageDescription resolvedImport : resolvedImports) {
+            packageProviders.add(resolvedImport.getExporter());
+        }
+        return packageProviders;
+    }
+
+    private void doSatisfyConstraints(BundleDescription description, State state, BundleDescription[] disabledProvisioningDescriptions)
+        throws BundleException {
+        doSatisfyConstraints(new BundleDescription[] { description }, state, disabledProvisioningDescriptions);
+    }
+
+    private void doSatisfyConstraints(BundleDescription[] descriptions, State state, BundleDescription[] disabledProvisioningDescriptions)
+        throws BundleException {
+
+        VersionConstraint[] unsatisfiedConstraints = findUnsatisfiedConstraints(descriptions, state);
+
+        List<BundleDescription> constraintsSatisfiers = new ArrayList<BundleDescription>();
+
+        for (VersionConstraint versionConstraint : unsatisfiedConstraints) {
+            BundleDescription unsatisfiedBundle = versionConstraint.getBundle();
+            boolean found = false;
+            for (BundleDescription description : descriptions) {
+                if (description == unsatisfiedBundle) {
+                    found = true;
+                }
+            }
+            if (found) {
+                if (provision(unsatisfiedBundle, disabledProvisioningDescriptions)) {
+                    if (versionConstraint instanceof ImportPackageSpecification) {
+                        satisfyImportPackage((ImportPackageSpecification) versionConstraint, state, constraintsSatisfiers);
+                    } else if (versionConstraint instanceof BundleSpecification) {
+                        satisfyRequireBundle(versionConstraint, state, constraintsSatisfiers);
+                    } else if (versionConstraint instanceof HostSpecification) {
+                        satisfyFragmentHost(versionConstraint, state, constraintsSatisfiers);
+                    }
+                }
+            }
+        }
+
+        for (BundleDescription description : descriptions) {
+            if (provision(description, disabledProvisioningDescriptions)) {
+                satisfyFragments(description, state, constraintsSatisfiers);
+            }
+        }
+
+        Collections.sort(constraintsSatisfiers, new BundleDescriptionComparator());
+
+        for (BundleDescription constraintSatisfier : constraintsSatisfiers) {
+            if (!isBundlePresentInState(constraintSatisfier.getName(), constraintSatisfier.getVersion(), state)) {
+                state.addBundle(constraintSatisfier);
+                this.coregion.addBundle(constraintSatisfier.getBundleId());
+                doSatisfyConstraints(constraintSatisfier, state, disabledProvisioningDescriptions);
+            }
+        }
+    }
+
+    private boolean provision(BundleDescription bundleDescription, BundleDescription[] disabledProvisioningDescriptions) {
+        boolean provision = true;
+        for (BundleDescription disabledProvisioningDescription : disabledProvisioningDescriptions) {
+            if (disabledProvisioningDescription == bundleDescription) {
+                provision = false;
+            }
+        }
+        return provision;
+    }
+
+    private void satisfyFragments(BundleDescription description, State state, List<BundleDescription> constraintSatisfiers) throws BundleException {
+        Set<? extends ArtifactDescriptor> fragmentArtefacts = this.repository.createQuery("type", BundleBridge.BRIDGE_TYPE).addFilter(
+            "Fragment-Host", description.getSymbolicName()).run();
+        for (ArtifactDescriptor fragmentArtefact : fragmentArtefacts) {
+            addBundle(fragmentArtefact, state, constraintSatisfiers);
+        }
+    }
+
+    private void satisfyFragmentHost(VersionConstraint constraint, State state, List<BundleDescription> constraintSatisfiers) throws BundleException {
+        Set<? extends ArtifactDescriptor> hostArtefacts = this.repository.createQuery("type", BundleBridge.BRIDGE_TYPE).addFilter(
+            "Bundle-SymbolicName", constraint.getName()).run();
+        for (ArtifactDescriptor hostArtefact : hostArtefacts) {
+            addBundle(hostArtefact, state, constraintSatisfiers);
+        }
+    }
+
+    private void satisfyRequireBundle(VersionConstraint constraint, State state, List<BundleDescription> constraintSatisfiers) throws BundleException {
+        Set<? extends ArtifactDescriptor> requiredBundleArtefacts = this.repository.createQuery("type", BundleBridge.BRIDGE_TYPE).addFilter(
+            "Bundle-SymbolicName", constraint.getName()).run();
+        for (ArtifactDescriptor requiredBundleArtefact : requiredBundleArtefacts) {
+            addBundle(requiredBundleArtefact, state, constraintSatisfiers);
+        }
+    }
+
+    private void satisfyImportPackage(ImportPackageSpecification constraint, State state, List<BundleDescription> constraintSatisfiers)
+        throws BundleException {
+        VersionRange packageVersionRange = constraint.getVersionRange();
+        Query query = this.repository.createQuery("type", BundleBridge.BRIDGE_TYPE);
+        boolean loosePackageVersionRange = false;
+        if (packageVersionRange != null && packageVersionRange.getMaximum().equals(packageVersionRange.getMinimum())) {
+            Map<String, Set<String>> properties = new HashMap<String, Set<String>>();
+            properties.put("version", new HashSet<String>(Arrays.asList(packageVersionRange.getMaximum().toString())));
+            query.addFilter("Export-Package", constraint.getName(), properties);
+        } else {
+            query.addFilter("Export-Package", constraint.getName());
+            loosePackageVersionRange = packageVersionRange != null;
+        }
+
+        String bundleSymbolicName = constraint.getBundleSymbolicName();
+        if (bundleSymbolicName != null) {
+            query.addFilter("Bundle-SymbolicName", bundleSymbolicName);
+        }
+
+        VersionRange bundleVersionRange = constraint.getBundleVersionRange();
+        boolean looseBundleVersionRange = false;
+        if (bundleVersionRange != null && bundleVersionRange.getMaximum().equals(bundleVersionRange.getMinimum())) {
+            query.addFilter("Bundle-Version", bundleVersionRange.getMaximum().toString());
+        } else {
+            looseBundleVersionRange = bundleVersionRange != null;
+        }
+
+        Set<? extends ArtifactDescriptor> packageExportingArtefacts = query.run();
+
+        for (ArtifactDescriptor packageExportingArtefact : packageExportingArtefacts) {
+            if ((!loosePackageVersionRange || packageVersionInRange(packageExportingArtefact, packageVersionRange, constraint.getName()))
+                && (!looseBundleVersionRange || bundleVersionInRange(packageExportingArtefact, bundleVersionRange))) {
+                addBundle(packageExportingArtefact, state, constraintSatisfiers);
+            }
+        }
+    }
+
+    private boolean packageVersionInRange(ArtifactDescriptor packageExportingArtefact, VersionRange packageVersionRange, String packageName) {
+        for (Attribute attribute : packageExportingArtefact.getAttribute("Export-Package")) {
+            if (attribute.getValue().equals(packageName)) {
+                Set<String> versions = attribute.getProperties().get("version");
+                Version version = new org.osgi.framework.Version(versions == null || versions.isEmpty() ? "0" : versions.iterator().next());
+                if (packageVersionRange.isIncluded(version)) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    private boolean bundleVersionInRange(ArtifactDescriptor packageExportingArtefact, VersionRange bundleVersionRange) {
+        return bundleVersionRange.isIncluded(packageExportingArtefact.getVersion());
+    }
+
+    private void addBundle(ArtifactDescriptor artefact, State state, List<BundleDescription> constraintSatisfiers) throws BundleException {
+        if (!isBundlePresentInState(artefact.getName(), artefact.getVersion(), state)) {
+            BundleDescription description = createBundleDescription(artefact, state);
+            constraintSatisfiers.add(description);
+        }
+    }
+
+    private boolean isBundlePresentInState(String bundleSymbolicName, Version version, State state) {
+        BundleDescription[] bundleDescriptions = state.getBundles(bundleSymbolicName);
+        for (BundleDescription bundleDescription : bundleDescriptions) {
+            if (bundleDescription.getVersion().equals(version)) {
+                long bundleId = bundleDescription.getBundleId();
+                if (bundleId == 0L || this.coregion.contains(bundleId)) {
+                    return true;
+                }
+                // XXX Refactoring required here. This temporary code only traverses the coregion and user region.
+                Set<FilteredRegion> edges = this.coregion.getEdges();
+                Iterator<FilteredRegion> iterator = edges.iterator();
+                // Bug 377392: cope with the unexpected case of a coregion with no edges.
+                if (iterator.hasNext()) {
+                    FilteredRegion edge = iterator.next();
+                    Region userRegion = edge.getRegion();
+                    RegionFilter filter = edge.getFilter();
+                    if (filter.isAllowed(bundleDescription) && userRegion.contains(bundleId)) {
+                        return true;
+                    }
+                }
+            }
+
+        }
+        return false;
+    }
+
+    private BundleDescription createBundleDescription(ArtifactDescriptor artifact, State state) throws BundleException {
+        Dictionary<String, String> manifest = BundleBridge.convertToDictionary(artifact);
+        try {
+            URI uri = artifact.getUri();
+            String installLocation = "file".equals(uri.getScheme()) ? new File(uri).getAbsolutePath() : uri.toString();
+            BundleDescription bundleDescription = this.stateObjectFactory.createBundleDescription(state, manifest, this.coregion.getName()
+                + REGION_LOCATION_DELIMITER + installLocation, this.nextBundleId.getAndIncrement());
+            this.coregion.addBundle(bundleDescription.getBundleId());
+            return bundleDescription;
+        } catch (RuntimeException e) {
+            throw new BundleException("Unable to read bundle at '" + artifact.getUri() + "'", e);
+        } catch (BundleException be) {
+            throw new BundleException("Failed to create BundleDescriptor for artifact at '" + artifact.getUri() + "'", be);
+        }
+    }
+
+    private VersionConstraint[] findUnsatisfiedConstraints(BundleDescription[] bundles, State state) {
+        return state.getStateHelper().getUnsatisfiedLeaves(bundles);
+    }
+
+    private void generateDump(State state) {
+        Map<String, Object> context = new HashMap<String, Object>();
+        context.put(RESOLUTION_STATE_KEY, state);
+        this.dumpGenerator.generateDump("resolutionFailure", context);
+    }
+
+    public long getNextBundleId() {
+        return this.nextBundleId.getAndIncrement();
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/quasi/GenericQuasiResolutionFailure.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/quasi/GenericQuasiResolutionFailure.java
new file mode 100644
index 0000000..3199533
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/quasi/GenericQuasiResolutionFailure.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.quasi;
+
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiBundle;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiResolutionFailure;
+
+class GenericQuasiResolutionFailure implements QuasiResolutionFailure {
+
+    private final String description;
+
+    private final QuasiBundle quasiBundle;
+
+    public GenericQuasiResolutionFailure(QuasiBundle quasiBundle, String description) {
+        this.description = description;
+        this.quasiBundle = quasiBundle;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getDescription() {
+        return this.description;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public QuasiBundle getUnresolvedQuasiBundle() {
+        return this.quasiBundle;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/quasi/PackageQuasiResolutionFailure.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/quasi/PackageQuasiResolutionFailure.java
new file mode 100644
index 0000000..512a373
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/quasi/PackageQuasiResolutionFailure.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.quasi;
+
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiBundle;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiPackageResolutionFailure;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+
+/**
+ * <p>
+ * TODO Document PackageQuasiResolutionFailure
+ * </p>
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * TODO Document concurrent semantics of PackageQuasiResolutionFailure
+ *
+ */
+class PackageQuasiResolutionFailure extends GenericQuasiResolutionFailure implements QuasiPackageResolutionFailure {
+
+    private final String bundleSymbolicName;
+
+    private final VersionRange bundleVersionRange;
+
+    private final String pkg;
+
+    private final VersionRange pkgVersionRange;
+
+    public PackageQuasiResolutionFailure(String description, QuasiBundle quasiBundle, String pkg,
+        VersionRange pkgVersionRange, String bundleSymbolicName, VersionRange bundleVersionRange) {
+        super(quasiBundle, description);
+        this.bundleSymbolicName = bundleSymbolicName;
+        this.bundleVersionRange = bundleVersionRange;
+        this.pkg = pkg;
+        this.pkgVersionRange = pkgVersionRange;
+    }
+
+    public String getPackageBundleSymbolicName() {
+        return this.bundleSymbolicName;
+    }
+
+    public VersionRange getPackageBundleVersionRange() {
+        return this.bundleVersionRange;
+    }
+
+    public String getPackage() {
+        return this.pkg;
+    }
+
+    public VersionRange getPackageVersionRange() {
+        return this.pkgVersionRange;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/quasi/PackageUsesQuasiResolutionFailure.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/quasi/PackageUsesQuasiResolutionFailure.java
new file mode 100644
index 0000000..4226ac6
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/quasi/PackageUsesQuasiResolutionFailure.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.quasi;
+
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiBundle;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiPackageUsesResolutionFailure;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+
+/**
+ * <p>
+ * TODO Document PackageUsesQuasiResolutionFailure
+ * </p>
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * TODO Document concurrent semantics of PackageUsesQuasiResolutionFailure
+ *
+ */
+class PackageUsesQuasiResolutionFailure extends PackageQuasiResolutionFailure implements QuasiPackageUsesResolutionFailure {
+
+    public PackageUsesQuasiResolutionFailure(String description, QuasiBundle quasiBundle, String pkg,
+        VersionRange pkgVersionRange, String bundleSymbolicName, VersionRange bundleVersionRange) {
+        super(description, quasiBundle, pkg, pkgVersionRange, bundleSymbolicName, bundleVersionRange);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/quasi/ResolutionFailureDetective.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/quasi/ResolutionFailureDetective.java
new file mode 100644
index 0000000..24aefe7
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/quasi/ResolutionFailureDetective.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.quasi;
+
+import org.eclipse.osgi.service.resolver.BundleDescription;
+import org.eclipse.osgi.service.resolver.ResolverError;
+import org.eclipse.osgi.service.resolver.State;
+
+/**
+ * 
+ */
+public interface ResolutionFailureDetective {
+
+    String generateFailureDescription(State state, BundleDescription bundleDescription, ResolverErrorsHolder resolverErrors);
+
+    public static class ResolverErrorsHolder {
+
+        private ResolverError[] resolverErrors = null;
+
+        void setResolverErrors(ResolverError[] resolverErrors) {
+            this.resolverErrors = resolverErrors;
+        }
+
+        public ResolverError[] getResolverErrors() {
+            // Prevent findbugs complaining by returning a copy of this object's internal state.
+            ResolverError[] copy = new ResolverError[this.resolverErrors.length];
+            System.arraycopy(this.resolverErrors, 0, copy, 0, this.resolverErrors.length);
+            return copy;
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StandardQuasiBundle.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StandardQuasiBundle.java
new file mode 100644
index 0000000..7dc435b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StandardQuasiBundle.java
@@ -0,0 +1,351 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.quasi;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.equinox.region.Region;
+import org.eclipse.osgi.baseadaptor.BaseData;
+import org.eclipse.osgi.framework.adaptor.BundleData;
+import org.eclipse.osgi.framework.internal.core.BundleHost;
+import org.eclipse.osgi.service.resolver.BundleDescription;
+import org.eclipse.osgi.service.resolver.BundleSpecification;
+import org.eclipse.osgi.service.resolver.ExportPackageDescription;
+import org.eclipse.osgi.service.resolver.HostSpecification;
+import org.eclipse.osgi.service.resolver.ImportPackageSpecification;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.Version;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.eclipse.virgo.kernel.artifact.plan.PlanDescriptor.Provisioning;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiBundle;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiExportPackage;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiImportPackage;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiRequiredBundle;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+
+/**
+ * {@link StandardQuasiBundle} is the default implementation of {@link QuasiBundle}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+final class StandardQuasiBundle implements QuasiBundle {
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+    
+    private final BundleDescription bundleDescription;
+
+    private final BundleManifest bundleManifest;
+
+    private volatile Bundle bundle = null;
+
+    private final String bsn;
+
+    private Version bv;
+
+	private final Region region;
+
+    private volatile Provisioning provisioning = Provisioning.AUTO;
+
+    /**
+     * Constructs an unresolved, uncommitted {@link QuasiBundle} with the given {@link BundleDescription}.
+     * 
+     * @param bundleDescription the <code>BundleDescription</code> for this <code>QuasiBundle</code>
+     * @param bundleManifest
+     * @param region the <code>Region</code> this bundle belongs to
+     */
+    public StandardQuasiBundle(BundleDescription bundleDescription, BundleManifest bundleManifest, Region region) {
+        this.bundleDescription = bundleDescription;
+        this.bundleManifest = bundleManifest;
+		this.region = region;
+        this.bsn = bundleDescription.getSymbolicName();
+        this.bv = bundleDescription.getVersion();
+    }
+
+    BundleDescription getBundleDescription() {
+        return this.bundleDescription;
+    }
+
+    BundleManifest getBundleManifest() {
+        return this.bundleManifest;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getSymbolicName() {
+        return this.bundleDescription.getSymbolicName();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Version getVersion() {
+        return this.bundleDescription.getVersion();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isResolved() {
+        return this.bundleDescription.isResolved();
+    }
+
+    /**
+     * {@inheritDoc}
+     * @throws BundleException 
+     */
+    public void uninstall() {
+    	Bundle bundle = this.getBundle();
+    	this.bundle = null;
+    	if(bundle != null){
+        	this.region.removeBundle(bundle);                
+        	try {
+                bundle.uninstall();
+            } catch (BundleException e) {
+                this.logger.error("Uninstall of '{}' failed", e, this);
+            }
+    	}
+    }
+
+    public void setBundle(Bundle bundle) {
+        this.bundle = bundle;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Bundle getBundle() {
+    	if(this.bundle == null){
+    		return this.region.getBundle(this.bsn, this.bv);
+    	}
+        return this.bundle;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public long getBundleId() {
+        return this.bundleDescription.getBundleId();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+	public String getBundleLocation() {
+		Bundle bundle = this.getBundle();
+		if(bundle == null){
+			return this.bundleDescription.getLocation();
+		}
+		return bundle.getLocation();
+	}
+	
+    /**
+     * {@inheritDoc}
+     */
+	public Region getRegion() {
+		return this.region;
+	}
+
+    /**
+     * {@inheritDoc}
+     */
+    public List<QuasiBundle> getFragments() {
+        BundleDescription[] fragments = this.bundleDescription.getFragments();
+        return this.wrapBundleDescriptions(fragments);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public List<QuasiBundle> getHosts() {
+        HostSpecification hostSpecification = this.bundleDescription.getHost();
+        return hostSpecification == null ? null : this.wrapBundleDescriptions(hostSpecification.getHosts());
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public List<QuasiExportPackage> getExportPackages() {
+        ExportPackageDescription[] exportPackages = this.bundleDescription.getExportPackages();
+        return this.wrapExportPackageDescriptions(exportPackages);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public List<QuasiImportPackage> getImportPackages() {
+        return this.wrapImportPackageSpecifications(this.bundleDescription.getImportPackages());
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public List<QuasiRequiredBundle> getRequiredBundles() {
+        return this.wrapBundleSpecificationsAsRequiredBundles(this.bundleDescription.getRequiredBundles());
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public List<QuasiBundle> getDependents() {
+        BundleDescription[] dependents = this.bundleDescription.getDependents();
+        return this.wrapBundleDescriptions(dependents);
+    }
+
+    /**
+     * Utility method to wrap a list of {@link BundleDescription} in QuasiBundle.
+     * 
+     * @param bundleDescriptions
+     * @return
+     */
+    private List<QuasiBundle> wrapBundleDescriptions(BundleDescription[] bundleDescriptions) {
+        List<QuasiBundle> quasiBundles = new ArrayList<QuasiBundle>();
+        for (BundleDescription bundleDescription : bundleDescriptions) {
+			Region bundleRegion = this.region.getRegionDigraph().getRegion(bundleDescription.getBundleId());
+			quasiBundles.add(new StandardQuasiBundle(bundleDescription, null, bundleRegion));
+        }
+        return Collections.unmodifiableList(quasiBundles);
+    }
+
+    /**
+     * Utility method to wrap a list of {@link BundleDescription} in QuasiBundle.
+     * 
+     * @param bundleDescriptions
+     * @return
+     */
+    private List<QuasiRequiredBundle> wrapBundleSpecificationsAsRequiredBundles(BundleSpecification[] bundleDescriptions) {
+        List<QuasiRequiredBundle> quasiRequiredBundles = new ArrayList<QuasiRequiredBundle>();
+        for (BundleSpecification bundleSpecification : bundleDescriptions) {
+            quasiRequiredBundles.add(new StandardQuasiRequiredBundle(bundleSpecification, this));
+        }
+        return Collections.unmodifiableList(quasiRequiredBundles);
+    }
+
+    /**
+     * Utility method to wrap a list of {@link BundleDescription} in {@link QuasiExportPackage}.
+     * 
+     * @param exportPackageDescriptions
+     * @param quasiBundle
+     * @return
+     */
+    private List<QuasiExportPackage> wrapExportPackageDescriptions(ExportPackageDescription[] exportPackageDescriptions) {
+        List<QuasiExportPackage> quasiExportPackages = new ArrayList<QuasiExportPackage>();
+        for (ExportPackageDescription exportPackageDescription : exportPackageDescriptions) {
+            quasiExportPackages.add(new StandardQuasiExportPackage(exportPackageDescription, this));
+        }
+        return Collections.unmodifiableList(quasiExportPackages);
+    }
+
+    /**
+     * Utility method to wrap a list of {@link BundleDescription} in {@link QuasiImportPackage}.
+     * 
+     * @param bundleDescriptions
+     * @return
+     */
+    private List<QuasiImportPackage> wrapImportPackageSpecifications(ImportPackageSpecification[] importPackageSpecifications) {
+        List<QuasiImportPackage> quasiImportPackages = new ArrayList<QuasiImportPackage>();
+        for (ImportPackageSpecification importPackageSpecification : importPackageSpecifications) {
+            quasiImportPackages.add(new StandardQuasiImportPackage(importPackageSpecification, this));
+        }
+        return Collections.unmodifiableList(quasiImportPackages);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String toString() {
+        return "QuasiBundle(" + getRegion().getName() + "[" + getSymbolicName() + ", " + getVersion() + "])";
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((bsn == null) ? 0 : bsn.hashCode());
+        result = prime * result + ((bv == null) ? 0 : bv.hashCode());
+        return result;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        StandardQuasiBundle other = (StandardQuasiBundle) obj;
+        if (bsn == null) {
+            if (other.bsn != null)
+                return false;
+        } else if (!bsn.equals(other.bsn))
+            return false;
+        if (bv == null) {
+            if (other.bv != null)
+                return false;
+        } else if (!bv.equals(other.bv))
+            return false;
+        return true;
+    }
+
+    public File getBundleFile() {
+        if (bundle instanceof BundleHost) {
+            BundleHost bh = (BundleHost) bundle;
+            BundleData bundleData = bh.getBundleData();
+            if (bundleData instanceof BaseData) {
+                File file = ((BaseData) bundleData).getBundleFile().getBaseFile();
+                return file;
+            }
+        }
+        return null;
+    }
+    
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public void setProvisioning(Provisioning provisioning) {
+        if (provisioning == null) {
+            throw new IllegalArgumentException("null not a valid provisioning behaviour for a QuasiBundle");
+        }
+        if (provisioning == Provisioning.INHERIT) {
+            throw new IllegalArgumentException("INHERIT is not a valid provisioning behaviour for a QuasiBundle");
+        }
+        this.provisioning = provisioning;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public Provisioning getProvisioning() {
+        return this.provisioning;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StandardQuasiExportPackage.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StandardQuasiExportPackage.java
new file mode 100644
index 0000000..34f84c7
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StandardQuasiExportPackage.java
@@ -0,0 +1,144 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.quasi;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.equinox.region.Region;
+import org.eclipse.osgi.service.resolver.BundleDescription;
+import org.eclipse.osgi.service.resolver.ExportPackageDescription;
+import org.eclipse.osgi.service.resolver.ImportPackageSpecification;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiBundle;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiExportPackage;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiImportPackage;
+import org.osgi.framework.Version;
+
+/**
+ * {@link StandardQuasiExportPackage} is the default implementation of {@link QuasiExportPackage}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+public class StandardQuasiExportPackage extends StandardQuasiParameterised implements QuasiExportPackage {
+
+    private final ExportPackageDescription exportPackageDescription;
+
+    private final QuasiBundle exporter;
+
+    public StandardQuasiExportPackage(ExportPackageDescription exportPackageDescription, QuasiBundle exporter) {
+        super(exportPackageDescription);
+        this.exportPackageDescription = exportPackageDescription;
+        this.exporter = exporter;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getPackageName() {
+        return this.exportPackageDescription.getName();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Version getVersion() {
+        return this.exportPackageDescription.getVersion();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public QuasiBundle getExportingBundle() {
+        return this.exporter;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public List<QuasiImportPackage> getConsumers() {
+        List<QuasiImportPackage> consumers = new ArrayList<QuasiImportPackage>();
+        BundleDescription[] dependents = this.exportPackageDescription.getExporter().getDependents();
+        for (BundleDescription dependentBundle : dependents) {
+        	ImportPackageSpecification importPackageSpecification = findImportingPackageSpecification(dependentBundle);
+            if(importPackageSpecification != null){
+            	addConsumer(dependentBundle, importPackageSpecification, consumers);
+            }
+        }
+        return consumers;
+    }
+
+    private ImportPackageSpecification findImportingPackageSpecification(BundleDescription dependentBundle) {
+        ImportPackageSpecification[] importedPackages = dependentBundle.getImportPackages();
+        for (ImportPackageSpecification importedPackage : importedPackages) {
+            if (this.exportPackageDescription.equals(importedPackage.getSupplier())) {
+                return importedPackage;
+            }
+        }
+        return null;
+    }
+
+    private void addConsumer(BundleDescription dependentBundle, ImportPackageSpecification dependentImportPackage, List<QuasiImportPackage> consumers) {
+    	Region region = this.exporter.getRegion().getRegionDigraph().getRegion(dependentBundle.getBundleId());
+    	StandardQuasiBundle importingBundle = new StandardQuasiBundle(dependentBundle, null, region);
+		consumers.add(new StandardQuasiImportPackage(dependentImportPackage, importingBundle));
+    }
+    
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public String toString() {
+        return "StandardQuasiExportPackage(" + getPackageName() + ", " + getVersion().toString() + ", " + super.toString() +")";
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((exportPackageDescription == null) ? 0 : exportPackageDescription.hashCode());
+        result = prime * result + ((exporter == null) ? 0 : exporter.hashCode());
+        return result;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        StandardQuasiExportPackage other = (StandardQuasiExportPackage) obj;
+        if (exportPackageDescription == null) {
+            if (other.exportPackageDescription != null)
+                return false;
+        } else if (!exportPackageDescription.equals(other.exportPackageDescription))
+            return false;
+        if (exporter == null) {
+            if (other.exporter != null)
+                return false;
+        } else if (!exporter.equals(other.exporter))
+            return false;
+        return true;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StandardQuasiFramework.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StandardQuasiFramework.java
new file mode 100644
index 0000000..d10d1c6
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StandardQuasiFramework.java
@@ -0,0 +1,510 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.quasi;
+
+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.ArrayList;
+import java.util.Collections;
+import java.util.Dictionary;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.equinox.region.Region;
+import org.eclipse.equinox.region.RegionDigraph;
+import org.eclipse.equinox.region.RegionFilter;
+import org.eclipse.osgi.service.resolver.BundleDescription;
+import org.eclipse.osgi.service.resolver.ImportPackageSpecification;
+import org.eclipse.osgi.service.resolver.PlatformAdmin;
+import org.eclipse.osgi.service.resolver.ResolverError;
+import org.eclipse.osgi.service.resolver.State;
+import org.eclipse.osgi.service.resolver.StateObjectFactory;
+import org.eclipse.osgi.service.resolver.VersionConstraint;
+import org.eclipse.virgo.kernel.artifact.plan.PlanDescriptor.Provisioning;
+import org.eclipse.virgo.kernel.osgi.framework.ManifestTransformer;
+import org.eclipse.virgo.kernel.osgi.framework.UnableToSatisfyDependenciesException;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiBundle;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiFramework;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiResolutionFailure;
+import org.eclipse.virgo.kernel.userregion.internal.equinox.TransformedManifestProvidingBundleFileWrapper;
+import org.eclipse.virgo.kernel.userregion.internal.quasi.ResolutionFailureDetective.ResolverErrorsHolder;
+import org.eclipse.virgo.nano.core.FatalKernelException;
+import org.eclipse.virgo.repository.Repository;
+import org.eclipse.virgo.util.common.StringUtils;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.Constants;
+import org.osgi.framework.hooks.resolver.ResolverHookFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * {@link StandardQuasiFramework} is the default implementation of {@link QuasiFramework}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+final class StandardQuasiFramework implements QuasiFramework {
+
+    private static final BundleDescription[] EMPTY_BUNDLE_DESCRIPTION_ARRAY = new BundleDescription[0];
+
+    private final RegionFilter TOP;
+
+    private static final String REGION_LOCATION_DELIMITER = "@";
+
+    private static final String COREGION_SUFFIX = ".coregion";
+
+    private static final String REFERENCE_SCHEME = "reference:";
+
+    private static final String FILE_SCHEME = "file:";
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private final Object monitor = new Object();
+
+    private final State state;
+
+    private final StateObjectFactory stateObjectFactory;
+
+    /*
+     * Track the bundles which are explicitly installed. These are input to the resolve method.
+     */
+    private final List<StandardQuasiBundle> installedQuasiBundles = new ArrayList<StandardQuasiBundle>();
+
+    private volatile BundleDescription[] otherBundles;
+
+    private final ResolutionFailureDetective detective;
+
+    private final BundleContext bundleContext;
+
+    private final DependencyCalculator dependencyCalculator;
+
+    private final TransformedManifestProvidingBundleFileWrapper bundleTransformationHandler;
+
+    private final RegionDigraph regionDigraph;
+
+    private Region coregion;
+
+    private final Region userRegion;
+
+    StandardQuasiFramework(BundleContext bundleContext, State state, PlatformAdmin platformAdmin, ResolutionFailureDetective detective,
+        Repository repository, TransformedManifestProvidingBundleFileWrapper bundleTransformationHandler, RegionDigraph regionDigraph) {
+        TOP = regionDigraph.createRegionFilterBuilder().allowAll(RegionFilter.VISIBLE_ALL_NAMESPACE).build();
+        this.bundleContext = bundleContext;
+        this.state = state;
+        this.stateObjectFactory = platformAdmin.getFactory();
+        this.detective = detective;
+        this.bundleTransformationHandler = bundleTransformationHandler;
+        this.regionDigraph = regionDigraph;
+        this.userRegion = regionDigraph.getRegion("org.eclipse.virgo.region.user");
+        this.coregion = regionDigraph.getRegion(this.userRegion.getName() + COREGION_SUFFIX);
+        setResolverHookFactory();
+
+        this.dependencyCalculator = new DependencyCalculator(platformAdmin.getFactory(), this.detective, repository, this.bundleContext);
+    }
+
+    private void setResolverHookFactory() {
+        /*
+         * Create a resolver hook factory for the region digraph. If the region digraph is live, this will create a hook
+         * factory equivalent to the live hook factory. If the region digraph is disconnected (a reconstituted copy of a
+         * live region digraph), this will produce a hook factory independent of the live hook factory.
+         */
+        ResolverHookFactory resolverHookFactory = this.regionDigraph.getResolverHookFactory();
+        this.state.setResolverHookFactory(resolverHookFactory);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public QuasiBundle install(URI location, BundleManifest bundleManifest) throws BundleException {
+        synchronized (this.monitor) {
+            createCoregionIfNecessary();
+            StandardQuasiBundle qb = doInstall(location, bundleManifest);
+            this.installedQuasiBundles.add(qb);
+            return qb;
+        }
+    }
+
+    private void createCoregionIfNecessary() {
+        synchronized (this.monitor) {
+            if (this.coregion == null) {
+                try {
+                    this.coregion = this.regionDigraph.createRegion(this.userRegion.getName() + COREGION_SUFFIX);
+                    this.userRegion.connectRegion(this.coregion, TOP);
+                    this.coregion.connectRegion(this.userRegion, TOP);
+                } catch (BundleException e) {
+                    // should never happen
+                    throw new FatalKernelException("Failed to create coregion", e);
+                }
+            }
+        }
+    }
+
+    private StandardQuasiBundle doInstall(URI location, BundleManifest bundleManifest) throws BundleException {
+        try {
+            Dictionary<String, String> manifest = bundleManifest.toDictionary();
+            String installLocation = "file".equals(location.getScheme()) ? new File(location).getAbsolutePath() : location.toString();
+            BundleDescription bundleDescription = this.stateObjectFactory.createBundleDescription(this.state, manifest, this.coregion.getName() + REGION_LOCATION_DELIMITER + installLocation, nextBundleId());
+            this.state.addBundle(bundleDescription);
+            this.coregion.addBundle(bundleDescription.getBundleId());
+            return new StandardQuasiBundle(bundleDescription, bundleManifest, this.regionDigraph.getRegion(bundleDescription.getBundleId()));
+        } catch (RuntimeException e) {
+            throw new BundleException("Unable to read bundle at '" + location + "'", e);
+        }
+    }
+
+    /**
+     * @return
+     */
+    private long nextBundleId() {
+        return this.dependencyCalculator.getNextBundleId();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public List<QuasiBundle> getBundles() {
+        BundleDescription[] bundleDescriptions = this.state.getBundles();
+        List<QuasiBundle> result = new ArrayList<QuasiBundle>();
+        QuasiBundle quasiBundle;
+        for (BundleDescription bundleDescription : bundleDescriptions) {
+            quasiBundle = new StandardQuasiBundle(bundleDescription, null, this.regionDigraph.getRegion(bundleDescription.getBundleId()));
+            result.add(quasiBundle);
+        }
+        return Collections.unmodifiableList(result);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public QuasiBundle getBundle(long bundleId) {
+        QuasiBundle quasiBundle = null;
+        BundleDescription bundleDescription = this.state.getBundle(bundleId);
+        if (bundleDescription != null) {
+            quasiBundle = new StandardQuasiBundle(bundleDescription, null, this.regionDigraph.getRegion(bundleId));
+        }
+        return quasiBundle;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Set<Region> getRegions(){
+    	return this.regionDigraph.getRegions();
+    }
+    
+    /**
+     * {@inheritDoc}
+     */
+    public List<QuasiResolutionFailure> resolve() {
+        synchronized (this.monitor) {
+            BundleDescription[] bundles = getBundleDescriptionArray();
+            BundleDescription[] disabledProvisioningBundles = getDisabledProvisioningBundleDescriptionArray();
+            BundleDescription[] dependencies = getDependencies(bundles, disabledProvisioningBundles);
+
+            this.otherBundles = dependencies;
+
+            List<QuasiResolutionFailure> failures = getFailures();
+            if (!failures.isEmpty()) {
+                this.otherBundles = null;
+            }
+
+            return failures;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public List<QuasiResolutionFailure> diagnose(long bundleId) {
+        BundleDescription bundleDescription = this.state.getBundle(bundleId);
+        ResolverErrorsHolder reh = new ResolverErrorsHolder();
+        String failureDescription = this.detective.generateFailureDescription(this.state, bundleDescription, reh);
+        return this.processResolverErrors(reh.getResolverErrors(), new StandardQuasiBundle(bundleDescription, null, this.regionDigraph.getRegion(bundleId)), failureDescription);
+    }
+
+    private BundleDescription[] getDependencies(BundleDescription[] bundles, BundleDescription[] disabledProvisioningBundles) {
+        createCoregionIfNecessary();
+        try {
+            return this.dependencyCalculator.calculateDependencies(this.state, this.coregion, bundles, disabledProvisioningBundles);
+        } catch (BundleException e) {
+            return EMPTY_BUNDLE_DESCRIPTION_ARRAY;
+        } catch (UnableToSatisfyDependenciesException utsde) {
+            return EMPTY_BUNDLE_DESCRIPTION_ARRAY;
+        }
+    }
+
+    private List<QuasiResolutionFailure> getFailures() {
+        List<QuasiResolutionFailure> failures = new ArrayList<QuasiResolutionFailure>();
+        ResolverErrorsHolder reh;
+        String failureDescription;
+        for (StandardQuasiBundle quasiBundle : this.installedQuasiBundles) {
+            if (!quasiBundle.isResolved()) {
+                reh = new ResolverErrorsHolder();
+                failureDescription = this.detective.generateFailureDescription(this.state, quasiBundle.getBundleDescription(), reh);
+                failures.addAll(this.processResolverErrors(reh.getResolverErrors(), quasiBundle, failureDescription));
+            }
+        }
+        return failures;
+    }
+
+    private List<QuasiResolutionFailure> processResolverErrors(ResolverError[] resolverErrors, QuasiBundle quasiBundle, String failureDescription) {
+        List<QuasiResolutionFailure> processedResolverErrors = new ArrayList<QuasiResolutionFailure>();
+        boolean added = false;
+        if (resolverErrors != null) {
+            for (ResolverError resolverError : resolverErrors) {
+                if (resolverError.getType() == ResolverError.IMPORT_PACKAGE_USES_CONFLICT) {
+                    VersionConstraint unsatisfiedConstraint = resolverError.getUnsatisfiedConstraint();
+                    if (unsatisfiedConstraint instanceof ImportPackageSpecification) {
+                        processedResolverErrors.add(createPackagesUsesResolutionFailure(quasiBundle, failureDescription, unsatisfiedConstraint));
+                        added = true;
+                    }
+                } else if (resolverError.getType() == ResolverError.MISSING_IMPORT_PACKAGE) {
+                    VersionConstraint unsatisfiedConstraint = resolverError.getUnsatisfiedConstraint();
+                    if (unsatisfiedConstraint instanceof ImportPackageSpecification) {
+                        processedResolverErrors.add(createPackageResolutionFailure(quasiBundle, failureDescription, unsatisfiedConstraint));
+                        added = true;
+                    }
+                }
+            }
+        }
+        if (!added) {
+            processedResolverErrors.add(new GenericQuasiResolutionFailure(quasiBundle, failureDescription));
+        }
+        return processedResolverErrors;
+    }
+
+    private PackageQuasiResolutionFailure createPackageResolutionFailure(QuasiBundle quasiBundle, String failureDescription,
+        VersionConstraint unsatisfiedConstraint) {
+        ImportPackageSpecification importPackageSpecification = (ImportPackageSpecification) unsatisfiedConstraint;
+        String pkgName = importPackageSpecification.getName();
+        VersionRange pkgVersionRange = convertVersionRange(importPackageSpecification.getVersionRange());
+        String bundleSymbolicName = importPackageSpecification.getBundleSymbolicName();
+        VersionRange bundleVersionRange = convertVersionRange(importPackageSpecification.getBundleVersionRange());
+        long bundleId = importPackageSpecification.getBundle().getBundleId();
+        this.logger.debug("Missing import: package '{}' version '{}' bundle '{}' version '{}' id '{}'", new Object[] { pkgName, pkgVersionRange,
+            bundleSymbolicName, bundleVersionRange, bundleId });
+        return new PackageQuasiResolutionFailure(failureDescription, quasiBundle, pkgName, pkgVersionRange, bundleSymbolicName, bundleVersionRange);
+    }
+
+    private PackageUsesQuasiResolutionFailure createPackagesUsesResolutionFailure(QuasiBundle quasiBundle, String failureDescription,
+        VersionConstraint unsatisfiedConstraint) {
+        ImportPackageSpecification importPackageSpecification = (ImportPackageSpecification) unsatisfiedConstraint;
+        String pkgName = importPackageSpecification.getName();
+        VersionRange pkgVersionRange = convertVersionRange(importPackageSpecification.getVersionRange());
+        String bundleSymbolicName = importPackageSpecification.getBundleSymbolicName();
+        VersionRange bundleVersionRange = convertVersionRange(importPackageSpecification.getBundleVersionRange());
+        long bundleId = importPackageSpecification.getBundle().getBundleId();
+        this.logger.debug("Uses conflict: package '{}' version '{}' bundle '{}' version '{}' id '{}'", new Object[] { pkgName, pkgVersionRange,
+            bundleSymbolicName, bundleVersionRange, bundleId });
+        return new PackageUsesQuasiResolutionFailure(failureDescription, quasiBundle, pkgName, pkgVersionRange, bundleSymbolicName,
+            bundleVersionRange);
+    }
+
+    private static VersionRange convertVersionRange(org.eclipse.osgi.service.resolver.VersionRange versionRange) {
+        return new VersionRange(versionRange.toString());
+    }
+
+    private BundleDescription[] getBundleDescriptionArray() {
+        BundleDescription[] bd;
+        int n = this.installedQuasiBundles.size();
+        bd = new BundleDescription[n];
+        for (int i = 0; i < n; i++) {
+            bd[i] = this.installedQuasiBundles.get(i).getBundleDescription();
+        }
+        return bd;
+    }
+
+    private BundleDescription[] getDisabledProvisioningBundleDescriptionArray() {
+        ArrayList<BundleDescription> disabledProvisioningBundleDescriptions = new ArrayList<BundleDescription>();
+        int n = this.installedQuasiBundles.size();
+        for (int i = 0; i < n; i++) {
+            StandardQuasiBundle quasiBundle = this.installedQuasiBundles.get(i);
+            if (quasiBundle.getProvisioning() == Provisioning.DISABLED) {
+                disabledProvisioningBundleDescriptions.add(quasiBundle.getBundleDescription());
+            }
+        }
+        return disabledProvisioningBundleDescriptions.toArray(EMPTY_BUNDLE_DESCRIPTION_ARRAY);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void commit() throws BundleException {
+        synchronized (this.monitor) {
+            if (this.otherBundles == null) {
+                List<QuasiResolutionFailure> failures = resolve();
+                if (!failures.isEmpty()) {
+                    throw new BundleException("Commit resolution failed: '" + failures.toString() + "'");
+                }
+            } else {
+                try {
+                    Set<Long> installedQuasiBundles = installQuasiBundles();
+                    List<Bundle> installedDependencies = installOtherBundles(installedQuasiBundles);
+                    startBundles(installedDependencies);
+                } catch (BundleException e) {
+                    uninstallQuasiBundles();
+                    throw e;
+                }
+            }
+        }
+    }
+
+    private void startBundles(List<Bundle> bundles) throws BundleException {
+        for (Bundle bundle : bundles) {
+            startBundle(bundle);
+        }
+    }
+
+    private void startBundle(Bundle bundle) throws BundleException {
+        String fragmentHostHeader = (String) bundle.getHeaders().get(Constants.FRAGMENT_HOST);
+        if (!StringUtils.hasText(fragmentHostHeader)) {
+            try {
+                bundle.start();
+            } catch (BundleException be) {
+                throw new BundleException("Failed to start bundle '" + bundle.getSymbolicName() + "' version '" + bundle.getVersion() + "'", be);
+            }
+        }
+    }
+
+    private List<Bundle> installOtherBundles(Set<Long> installedQuasiBundles) throws BundleException {
+        List<Bundle> installedBundles = new ArrayList<Bundle>();
+        for (BundleDescription otherBundle : otherBundles) {
+            if (!installedQuasiBundles.contains(otherBundle.getBundleId())) {
+                try {
+                    Bundle bundle = installBundleDescription(otherBundle);
+                    installedBundles.add(bundle);
+                } catch (BundleException e) {
+                    for (Bundle bundle : installedBundles) {
+                        try {
+                            bundle.uninstall();
+                        } catch (BundleException be) {
+                            this.logger.error("Uninstall of '{}' failed", be, bundle);
+                        }
+                    }
+                    throw e;
+                }
+            }
+        }
+        return installedBundles;
+    }
+
+    private Set<Long> installQuasiBundles() throws BundleException {
+        Set<Long> installed = new HashSet<Long>();
+        for (StandardQuasiBundle quasiBundle : this.installedQuasiBundles) {
+            BundleDescription description = quasiBundle.getBundleDescription();
+            String location = description.getLocation();
+            ManifestTransformer manifestTransformer = new QuasiManifestTransformer(quasiBundle.getBundleManifest());
+            this.bundleTransformationHandler.pushManifestTransformer(manifestTransformer);
+
+            try {
+                URI locationUri = new File(stripRegionTag(location)).toURI();
+                Bundle bundle = doInstallBundleInternal(locationUri.toString());
+                quasiBundle.setBundle(bundle);
+                installed.add(description.getBundleId());
+            } finally {
+                this.bundleTransformationHandler.popManifestTransformer();
+            }
+
+        }
+        return installed;
+    }
+
+    private String stripRegionTag(String location) {
+        int atPos = location.indexOf(REGION_LOCATION_DELIMITER);
+        if (atPos != -1) {
+            return location.substring(atPos + 1);
+        }
+        return location;
+    }
+
+    private static final class QuasiManifestTransformer implements ManifestTransformer {
+
+        private final BundleManifest bundleManifest;
+
+        public QuasiManifestTransformer(BundleManifest bundleManifest) {
+            this.bundleManifest = bundleManifest;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public BundleManifest transform(BundleManifest bundleManifest) {
+            return this.bundleManifest;
+        }
+    }
+
+    private Bundle installBundleDescription(BundleDescription description) throws BundleException {
+        String location = stripRegionTag(description.getLocation());
+        String installLocation = location.startsWith("http:") ? location : new File(location).toURI().toString();
+        return doInstallBundleInternal(installLocation);
+    }
+
+    private Bundle doInstallBundleInternal(String location) throws BundleException {
+        return this.userRegion.installBundle(location, openBundleStream(location));
+    }
+
+    private InputStream openBundleStream(String location) throws BundleException {
+        String absoluteBundleUriString = getAbsoluteUriString(location);
+
+        try {
+            // Use the reference: scheme to obtain an InputStream for either a file or a directory.
+            return new URL(REFERENCE_SCHEME + absoluteBundleUriString).openStream();
+
+        } catch (MalformedURLException e) {
+            throw new BundleException("Invalid bundle URI '" + absoluteBundleUriString + "'", e);
+        } catch (IOException e) {
+            throw new BundleException("Invalid bundle at URI '" + absoluteBundleUriString + "'", e);
+        }
+    }
+
+    private String getAbsoluteUriString(String bundleUriString) throws BundleException {
+
+        if (!bundleUriString.startsWith(FILE_SCHEME)) {
+            throw new BundleException("'" + bundleUriString + "' which did not start with '" + FILE_SCHEME + "'");
+        }
+
+        String filePath = bundleUriString.substring(FILE_SCHEME.length());
+
+        return FILE_SCHEME + new File(filePath).getAbsolutePath();
+    }
+
+    private void uninstallQuasiBundles() {
+        for (StandardQuasiBundle quasiBundle : this.installedQuasiBundles) {
+            quasiBundle.uninstall();
+        }
+    }
+
+    @Override
+    public void destroy() {
+        Region coregionCopy;
+        synchronized (this.monitor) {
+            coregionCopy = this.coregion;
+            this.coregion = null;
+        }
+        if (coregionCopy != null) {
+            this.regionDigraph.removeRegion(coregionCopy);
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StandardQuasiFrameworkFactory.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StandardQuasiFrameworkFactory.java
new file mode 100644
index 0000000..92ccc2d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StandardQuasiFrameworkFactory.java
@@ -0,0 +1,195 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.quasi;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.zip.ZipException;
+
+import org.eclipse.equinox.region.RegionDigraph;
+import org.eclipse.equinox.region.RegionDigraphPersistence;
+import org.eclipse.osgi.internal.baseadaptor.StateManager;
+import org.eclipse.osgi.service.resolver.PlatformAdmin;
+import org.eclipse.osgi.service.resolver.State;
+import org.eclipse.osgi.service.resolver.StateObjectFactory;
+import org.eclipse.virgo.kernel.osgi.framework.OsgiFrameworkUtils;
+import org.eclipse.virgo.kernel.osgi.framework.OsgiServiceHolder;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiFramework;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiFrameworkFactory;
+import org.eclipse.virgo.kernel.userregion.internal.DumpExtractor;
+import org.eclipse.virgo.kernel.userregion.internal.equinox.TransformedManifestProvidingBundleFileWrapper;
+import org.eclipse.virgo.repository.Repository;
+import org.eclipse.virgo.util.io.FileSystemUtils;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * {@link StandardQuasiFrameworkFactory} is the default implementation of {@link QuasiFrameworkFactory}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+public final class StandardQuasiFrameworkFactory implements QuasiFrameworkFactory {
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private final BundleContext bundleContext;
+
+    private final PlatformAdmin platformAdmin;
+
+    private final StateManager stateManager;
+
+    private final ResolutionFailureDetective detective;
+
+    private final Repository repository;
+
+    private final TransformedManifestProvidingBundleFileWrapper bundleTransformationHandler;
+
+    private final RegionDigraph regionDigraph;
+
+    private final DumpExtractor dumpExtractor;
+
+    public StandardQuasiFrameworkFactory(BundleContext bundleContext, ResolutionFailureDetective detective, Repository repository,
+        TransformedManifestProvidingBundleFileWrapper bundleTransformationHandler, RegionDigraph regionDigraph, DumpExtractor dumpExtractor) {
+        this.bundleContext = bundleContext;
+        this.platformAdmin = getPlatformAdminService(bundleContext);
+        this.detective = detective;
+        this.repository = repository;
+        ServiceReference<PlatformAdmin> platformAdminServiceReference = bundleContext.getServiceReference(PlatformAdmin.class);
+        this.stateManager = (StateManager) bundleContext.getService(platformAdminServiceReference);
+        this.bundleTransformationHandler = bundleTransformationHandler;
+        this.regionDigraph = regionDigraph;
+        this.dumpExtractor = dumpExtractor;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public QuasiFramework create() {
+        return new StandardQuasiFramework(this.bundleContext, createState(), this.platformAdmin, this.detective, this.repository,
+            this.bundleTransformationHandler, this.regionDigraph);
+    }
+    
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public QuasiFramework create(File dumpDirName) throws ZipException, IOException {
+        return create(this.dumpExtractor.getStateDump(dumpDirName), this.dumpExtractor.getRegionDigraphDump(dumpDirName));
+    }
+
+    private QuasiFramework create(File stateDump, File regionDigraphDump) {
+        return new StandardQuasiFramework(this.bundleContext, readStateDump(stateDump), this.platformAdmin, this.detective, this.repository,
+            this.bundleTransformationHandler, readRegionDigraphDump(regionDigraphDump));
+    }
+
+    private RegionDigraph readRegionDigraphDump(File regionDigraphDump) {
+        RegionDigraphPersistence regionDigraphPersistence = this.regionDigraph.getRegionDigraphPersistence();
+        RegionDigraph digraph;
+        try {
+            InputStream input = new FileInputStream(regionDigraphDump);
+            try {
+                digraph = regionDigraphPersistence.load(input);
+            } finally {
+                input.close();
+            }
+        } catch (Exception e) {
+            throw new RuntimeException("Unable to read region digraph dump", e);
+        }
+        return digraph;
+    }
+
+    @SuppressWarnings("deprecation")
+    private State createState() {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+
+        State state;
+
+        try {
+            this.platformAdmin.getFactory().writeState(this.stateManager.getSystemState(), baos);
+            state = this.platformAdmin.getFactory().readState(new ByteArrayInputStream(baos.toByteArray()));
+        } catch (IOException ioe) {
+            throw new RuntimeException("Failed to create a copy of the OSGi state", ioe);
+        }
+
+        if (state.getResolver() == null) {
+            state.setResolver(this.platformAdmin.createResolver());
+        }
+
+        if (!state.isResolved()) {
+            state.resolve(true);
+        }
+
+        return state;
+    }
+
+    private State readStateDump(File outdir) {
+        State state = null;
+
+        try {
+            StateObjectFactory sof = this.platformAdmin.getFactory();
+            state = sof.readState(outdir);
+        } catch (IOException e) {
+            throw new RuntimeException("Unable to read resolver state", e);
+        } finally {
+            try { // delete all state files written to this directory
+                if (outdir.isDirectory()) {
+                    for (String filename : FileSystemUtils.list(outdir)) {
+                        File file = new File(outdir, filename);
+                        if (!file.delete()) {
+                            this.logger.warn("Temporary file '{}' not deleted", file.getAbsolutePath());
+                        }
+                    }
+                }
+            } finally {
+                if (!outdir.delete() && outdir.exists()) {
+                    this.logger.warn("Temporary state directory '{}' was not removed after use.", outdir.getAbsolutePath());
+                }
+            }
+        }
+
+        if (state.getResolver() == null) {
+            state.setResolver(this.platformAdmin.createResolver());
+        }
+
+        if (!state.isResolved()) {
+            state.resolve(true);
+        }
+
+        return state;
+    }
+
+    /**
+     * Gets the {@link PlatformAdmin} service.
+     * 
+     * @param bundleContext the {@link BundleContext} to use for lookup.
+     * @return the <code>PlatformAdmin</code> service.
+     */
+    private static PlatformAdmin getPlatformAdminService(BundleContext bundleContext) {
+        OsgiServiceHolder<PlatformAdmin> service = OsgiFrameworkUtils.getService(bundleContext, PlatformAdmin.class);
+        PlatformAdmin platformAdmin = service.getService();
+        if (platformAdmin == null) {
+            throw new IllegalStateException("Unable to locate PlatformAdmin service");
+        }
+        return platformAdmin;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StandardQuasiImportPackage.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StandardQuasiImportPackage.java
new file mode 100644
index 0000000..1db57f4
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StandardQuasiImportPackage.java
@@ -0,0 +1,165 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.quasi;
+
+import static org.osgi.framework.Constants.RESOLUTION_DIRECTIVE;
+import static org.osgi.framework.Constants.RESOLUTION_MANDATORY;
+import static org.osgi.framework.Constants.RESOLUTION_OPTIONAL;
+
+import org.eclipse.osgi.service.resolver.BaseDescription;
+import org.eclipse.osgi.service.resolver.BundleDescription;
+import org.eclipse.osgi.service.resolver.ExportPackageDescription;
+import org.eclipse.osgi.service.resolver.ImportPackageSpecification;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiBundle;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiExportPackage;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiImportPackage;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+
+/**
+ * {@link StandardQuasiImportPackage} is the default implementation of {@link QuasiImportPackage}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+public class StandardQuasiImportPackage extends StandardQuasiParameterised implements QuasiImportPackage {
+
+    private final ImportPackageSpecification importPackageSpecification;
+
+    private final QuasiBundle importingBundle;
+
+    public StandardQuasiImportPackage(ImportPackageSpecification importPackageSpecification, QuasiBundle importingBundle) {
+        super(importPackageSpecification);
+        this.importPackageSpecification = importPackageSpecification;
+        this.importingBundle = importingBundle;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getPackageName() {
+        return this.importPackageSpecification.getName();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public VersionRange getVersionConstraint() {
+        org.eclipse.osgi.service.resolver.VersionRange resolverVersionRange = this.importPackageSpecification.getVersionRange();
+        VersionRange versionRange;
+        if (resolverVersionRange == null) {
+            versionRange = new VersionRange(null); // The range of all possible versions
+        } else {
+            versionRange = new VersionRange(resolverVersionRange.toString());
+        }
+        return versionRange;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public QuasiBundle getImportingBundle() {
+        return this.importingBundle;
+    }
+
+    public boolean isOptional() {
+        Object resolutionObject = this.importPackageSpecification.getDirective(RESOLUTION_DIRECTIVE);
+        if (resolutionObject == null) {
+            resolutionObject = RESOLUTION_MANDATORY;
+        }
+        return resolutionObject.equals(RESOLUTION_OPTIONAL);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public QuasiExportPackage getProvider() {
+        QuasiExportPackage provider = null;
+        if (isResolved()) {
+            ExportPackageDescription providerDescription = getProviderDescription();
+            if (providerDescription != null) {
+                provider = constructProvider(providerDescription);
+            }
+        }
+        return provider;
+    }
+
+    private QuasiExportPackage constructProvider(ExportPackageDescription providerDescription) {
+        BundleDescription exporter = providerDescription.getExporter();
+		StandardQuasiBundle quasiExporter = new StandardQuasiBundle(exporter, null, this.importingBundle.getRegion().getRegionDigraph().getRegion(exporter.getBundleId()));
+        return new StandardQuasiExportPackage(providerDescription, quasiExporter);
+    }
+
+    private ExportPackageDescription getProviderDescription() {        
+        BaseDescription supplier = this.importPackageSpecification.getSupplier();
+        if (supplier instanceof ExportPackageDescription) {
+            return (ExportPackageDescription) supplier;
+        }
+        
+        return null;
+    }    
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isResolved() {
+        return this.importPackageSpecification.isResolved();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String toString() {
+        return "StandardQuasiImportPackage(" + getPackageName() + ", " + getVersionConstraint().toString() + ", " + super.toString() + ")";
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((importPackageSpecification == null) ? 0 : importPackageSpecification.hashCode());
+        result = prime * result + ((importingBundle == null) ? 0 : importingBundle.hashCode());
+        return result;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        StandardQuasiImportPackage other = (StandardQuasiImportPackage) obj;
+        if (importPackageSpecification == null) {
+            if (other.importPackageSpecification != null)
+                return false;
+        } else if (!importPackageSpecification.equals(other.importPackageSpecification))
+            return false;
+        if (importingBundle == null) {
+            if (other.importingBundle != null)
+                return false;
+        } else if (!importingBundle.equals(other.importingBundle))
+            return false;
+        return true;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StandardQuasiParameterised.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StandardQuasiParameterised.java
new file mode 100644
index 0000000..45edd3e
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StandardQuasiParameterised.java
@@ -0,0 +1,123 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.quasi;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.osgi.service.resolver.ExportPackageDescription;
+import org.eclipse.osgi.service.resolver.ImportPackageSpecification;
+import org.eclipse.osgi.service.resolver.VersionRange;
+
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiParameterised;
+import org.eclipse.virgo.util.common.StringUtils;
+
+/**
+ * {@link StandardQuasiParameterised} is the default implementation of {@link QuasiParameterised}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+public class StandardQuasiParameterised implements QuasiParameterised {
+
+    private static final String VERSION_ATTRIBUTE = "version";
+    
+    private static final String BUNDLE_SYMBOLIC_NAME_ATTRIBUTE = "bundle-symbolic-name";
+    
+    private static final String BUNDLE_VERSION_ATTRIBUTE = "bundle-version";
+    
+    private final Map<String, Object> attributes;
+
+    private final Map<String, Object> directives;
+
+    
+    /**
+     * Will specifically add attributes for version, bundle-version
+     * 
+     * @param importPackageSpecification
+     */
+    public StandardQuasiParameterised(ImportPackageSpecification importPackageSpecification) {
+        this.attributes = normalise(importPackageSpecification.getAttributes());
+        this.directives = normalise(importPackageSpecification.getDirectives());
+        VersionRange bundleVersionRange = importPackageSpecification.getBundleVersionRange();
+        if(bundleVersionRange != null) {
+            this.attributes.put(BUNDLE_VERSION_ATTRIBUTE, bundleVersionRange);
+        }
+        String bundleSymbolicName = importPackageSpecification.getBundleSymbolicName();
+        if(StringUtils.hasLength(bundleSymbolicName)) {
+            this.attributes.put(BUNDLE_SYMBOLIC_NAME_ATTRIBUTE, bundleSymbolicName);
+        }
+        VersionRange versionRange = importPackageSpecification.getVersionRange();
+        if(versionRange != null) {
+            this.attributes.put(VERSION_ATTRIBUTE, versionRange);
+        }
+    }
+
+    public StandardQuasiParameterised(ExportPackageDescription exportPackageDescription) {
+        this.attributes = normalise(exportPackageDescription.getAttributes());
+        this.directives = normalise(exportPackageDescription.getDirectives());    
+    }
+
+    /**
+     * Coerce the given map into an immutable map of String to String.
+     */
+    private static Map<String, Object> normalise(final Map<String, Object> map) {
+        if (map!=null) {
+            return new HashMap<String, Object>(map);
+        }
+        return new HashMap<String, Object>();
+    }
+
+    public Map<String, Object> getAttributes() {
+        return this.attributes;
+    }
+
+    public Map<String, Object> getDirectives() {
+        return this.directives;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String toString() {
+        StringBuilder result = new StringBuilder("[");
+        boolean first = true;
+        if (this.directives != null) {
+            for (String directiveName : this.directives.keySet()) {
+                if (!first) {
+                    result.append(", ");
+                }
+                first = false;
+                result.append(directiveName);
+                result.append(":=");
+                result.append(this.directives.get(directiveName));
+            }
+        }
+        if (this.attributes != null) {
+            for (String attributeName : this.attributes.keySet()) {
+                if (!first) {
+                    result.append(", ");
+                }
+                first = false;
+                result.append(attributeName);
+                result.append("=");
+                result.append(this.attributes.get(attributeName));
+            }
+        }
+        result.append("]");
+        return result.toString();
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StandardQuasiRequiredBundle.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StandardQuasiRequiredBundle.java
new file mode 100644
index 0000000..155df1b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StandardQuasiRequiredBundle.java
@@ -0,0 +1,108 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.quasi;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.osgi.service.resolver.BundleDescription;
+import org.eclipse.osgi.service.resolver.BundleSpecification;
+
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiBundle;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiRequiredBundle;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+
+/**
+ * {@link StandardQuasiRequiredBundle} is the default implementation of {@link QuasiRequiredBundle}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+final class StandardQuasiRequiredBundle implements QuasiRequiredBundle {
+
+    private final BundleSpecification bundleSpecification;
+
+    private final QuasiBundle requiringBundle;
+
+    public StandardQuasiRequiredBundle(BundleSpecification bundleSpecification, QuasiBundle requiringBundle) {
+        this.bundleSpecification = bundleSpecification;
+        this.requiringBundle = requiringBundle;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getRequiredBundleName() {
+        return this.bundleSpecification.getName();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public VersionRange getVersionConstraint() {
+        org.eclipse.osgi.service.resolver.VersionRange resolverVersionRange = this.bundleSpecification.getVersionRange();
+        VersionRange versionRange;
+        if (resolverVersionRange == null) {
+            versionRange = new VersionRange(null); // The range of all possible versions
+        } else {
+            versionRange = new VersionRange(resolverVersionRange.toString());
+        }
+        return versionRange;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public QuasiBundle getRequiringBundle() {
+        return this.requiringBundle;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public QuasiBundle getProvider() {
+        if (isResolved()) {
+            BundleDescription supplier = this.bundleSpecification.getSupplier().getSupplier();
+			return new StandardQuasiBundle(supplier, null, this.requiringBundle.getRegion().getRegionDigraph().getRegion(supplier.getBundleId()));
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isResolved() {
+        return this.bundleSpecification.isResolved();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Map<String, Object> getAttributes() {
+        Map<String, Object> attributes = new HashMap<String, Object>();
+        return Collections.unmodifiableMap(attributes);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Map<String, Object> getDirectives() {
+        Map<String, Object> directives = new HashMap<String, Object>();
+        return Collections.unmodifiableMap(directives);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StandardResolutionFailureDetective.java b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StandardResolutionFailureDetective.java
new file mode 100644
index 0000000..c1271fd
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StandardResolutionFailureDetective.java
@@ -0,0 +1,431 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.quasi;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.osgi.service.resolver.BundleDescription;
+import org.eclipse.osgi.service.resolver.ExportPackageDescription;
+import org.eclipse.osgi.service.resolver.ImportPackageSpecification;
+import org.eclipse.osgi.service.resolver.PlatformAdmin;
+import org.eclipse.osgi.service.resolver.ResolverError;
+import org.eclipse.osgi.service.resolver.State;
+import org.eclipse.osgi.service.resolver.VersionConstraint;
+import org.eclipse.osgi.service.resolver.VersionRange;
+import org.eclipse.virgo.kernel.userregion.internal.equinox.UsesAnalyser;
+import org.eclipse.virgo.kernel.userregion.internal.equinox.UsesAnalyser.AnalysedUsesConflict;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.Constants;
+
+/**
+ * Helper class that analyses resolution failures and generates a human-readable failure description.
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br/>
+ * 
+ * Threadsafe.
+ * 
+ */
+public final class StandardResolutionFailureDetective implements ResolutionFailureDetective {
+
+    private final UsesAnalyser usesAnalyser = new UsesAnalyser();
+
+    private final PlatformAdmin platformAdmin;
+
+    /**
+     * Constructor for a new {@link ResolutionFailureDetective}.
+     * 
+     * @param platformAdmin the {@link org.eclipse.osgi.launch.Equinox Equinox} {@link PlatformAdmin} service.
+     */
+    public StandardResolutionFailureDetective(PlatformAdmin platformAdmin) {
+        this.platformAdmin = platformAdmin;
+    }
+
+    /**
+     * Generates a description of all the resolver errors for the supplied {@link Bundle} in the supplied {@link State}.
+     */
+    public String generateFailureDescription(State state, BundleDescription bundleDescription, ResolverErrorsHolder resolverErrorsHolder) {
+
+        StringBuilder sb = new StringBuilder();
+        sb.append("Cannot resolve: ").append(bundleDescription.getSymbolicName()).append("\n");
+
+        // these resolver errors are for all unresolved bundles in the state:
+        ResolverError[] resolverErrors = gatherResolverErrors(bundleDescription, state);
+        resolverErrorsHolder.setResolverErrors(resolverErrors);
+        if (resolverErrors.length > 0) {
+            indent(sb, 1);
+            sb.append("Resolver report:\n");
+
+            for (ResolverError resolverError : resolverErrors) {
+                indent(sb, 2);
+                formatResolverError(resolverError, sb, state);
+                sb.append("\n");
+            }
+        } else {
+            VersionConstraint[] unsatisfiedLeaves = this.platformAdmin.getStateHelper().getUnsatisfiedLeaves(
+                new BundleDescription[] { bundleDescription });
+            if (unsatisfiedLeaves.length > 0) {
+                indent(sb, 1);
+                sb.append("Unsatisfied leaf constraints:\n");
+
+                for (VersionConstraint versionConstraint : unsatisfiedLeaves) {
+                    if (!isOptional(versionConstraint)) {
+                        indent(sb, 2);
+                        formatConstraint(versionConstraint, sb);
+                        sb.append("\n");
+                    }
+                }
+            }
+        }
+
+        return sb.toString();
+
+    }
+
+    /**
+     * List all the resolver errors in the given state starting with those of the given bundle.
+     */
+    private ResolverError[] gatherResolverErrors(BundleDescription bundleDescription, State state) {
+        Set<ResolverError> resolverErrors = new LinkedHashSet<ResolverError>();
+        Collections.addAll(resolverErrors, state.getResolverErrors(bundleDescription));
+        BundleDescription[] bundles = state.getBundles();
+        for (BundleDescription bd : bundles) {
+            if (bd != bundleDescription && !bd.isResolved()) {
+                Collections.addAll(resolverErrors, state.getResolverErrors(bd));
+            }
+        }
+        return resolverErrors.toArray(new ResolverError[resolverErrors.size()]);
+    }
+
+    /**
+     * Finds the member of <code>candidates</code> that is the nearest match to <code>match</code>.
+     * 
+     * @param match the string to match against.
+     * @param candidates the candidates to search.
+     * @return the nearest match.
+     */
+    private String nearestMatch(String match) {
+        Set<String> candidates = gatherExports();
+        int nearestDistance = Integer.MAX_VALUE;
+        String nearestMatch = null;
+
+        for (String candidate : candidates) {
+            int distance = calculateStringDistance(match, candidate);
+            if (distance < nearestDistance) {
+                nearestDistance = distance;
+                nearestMatch = candidate;
+            }
+        }
+
+        return nearestMatch;
+    }
+
+    /**
+     * Calculate the distance between the given two Strings according to the Levenshtein algorithm.
+     * 
+     * @param s1 the first String
+     * @param s2 the second String
+     * @return the distance value
+     */
+    private final static int calculateStringDistance(String s1, String s2) {
+        if (s1.isEmpty()) {
+            return s2.length();
+        }
+        if (s2.isEmpty()) {
+            return s1.length();
+        }
+
+        final int s2len = s2.length();
+        final int s1len = s1.length();
+
+        int d[][] = new int[s1len + 1][s2len + 1];
+
+        for (int i = 0; i <= s1len; i++) {
+            d[i][0] = i;
+        }
+        for (int j = 0; j <= s2len; j++) {
+            d[0][j] = j;
+        }
+
+        for (int i = 1; i <= s1len; i++) {
+            char s_i = s1.charAt(i - 1);
+            for (int j = 1; j <= s2len; j++) {
+                int cost;
+                char t_j = s2.charAt(j - 1);
+                if (Character.toLowerCase(s_i) == Character.toLowerCase(t_j)) {
+                    cost = 0;
+                } else {
+                    cost = 1;
+                }
+                d[i][j] = Math.min(Math.min(d[i - 1][j] + 1, d[i][j - 1] + 1), d[i - 1][j - 1] + cost);
+            }
+        }
+
+        return d[s1len][s2len];
+    }
+
+    /**
+     * Gathers all the package exports.
+     * 
+     * @return the exported packages.
+     */
+    private Set<String> gatherExports() {
+        State state = this.platformAdmin.getState(false);
+        ExportPackageDescription[] exportedPackages = state.getExportedPackages();
+        Set<String> exports = new HashSet<String>(exportedPackages.length);
+        for (ExportPackageDescription epd : exportedPackages) {
+            exports.add(epd.getName());
+        }
+        return exports;
+    }
+
+    private void formatResolverError(ResolverError resolverError, StringBuilder sb, State state) {
+        if (resolverError.getType() == ResolverError.IMPORT_PACKAGE_USES_CONFLICT) {
+            formatUsesConflict(resolverError, sb, state);
+        } else if (resolverError.getType() == ResolverError.MISSING_FRAGMENT_HOST) {
+            formatMissingFragment(resolverError, sb);
+        } else if (resolverError.getType() == ResolverError.FRAGMENT_CONFLICT) {
+            formatFragmentConflict(resolverError, sb, state);
+        } else {
+            formatBasicResolverError(resolverError, sb);
+        }
+    }
+
+    private void formatBasicResolverError(ResolverError resolverError, StringBuilder sb) {
+        sb.append(this.getTypeDescription(resolverError.getType()));
+        formatResolverErrorData(resolverError, sb);
+        formatResolverErrorUnsatisfiedConstraint(resolverError, sb);
+    }
+
+    private void formatResolverErrorUnsatisfiedConstraint(ResolverError resolverError, StringBuilder sb) {
+        VersionConstraint unsatisfiedConstraint = resolverError.getUnsatisfiedConstraint();
+        if (unsatisfiedConstraint != null) {
+            formatMissingConstraintWithAttributes(resolverError, sb, unsatisfiedConstraint);
+        } else {
+            sb.append(" In bundle <").append(resolverError.getBundle()).append(">");
+        }
+    }
+
+    private void formatMissingFragment(ResolverError resolverError, StringBuilder sb) {
+        sb.append(this.getTypeDescription(resolverError.getType()));
+        sb.append(" The affected fragment is ").append(resolverError.getBundle()).append(".");
+        formatResolverErrorData(resolverError, sb);
+        formatResolverErrorUnsatisfiedConstraint(resolverError, sb);
+    }
+
+    private void formatResolverErrorData(ResolverError resolverError, StringBuilder sb) {
+        String data = resolverError.getData();
+        if (data != null) {
+            sb.append(" Resolver error data <").append(data).append(">.");
+        }
+    }
+
+    private void formatUsesConflict(ResolverError resolverError, StringBuilder sb, State state) {
+        VersionConstraint unsatisfiedConstraint = resolverError.getUnsatisfiedConstraint();
+        BundleDescription bundle = resolverError.getBundle();
+        sb.append("Uses violation: <").append(unsatisfiedConstraint).append("> in bundle <").append(bundle).append("[").append(bundle.getBundleId()).append(
+            "]").append(">\n");
+
+        AnalysedUsesConflict[] usesConflicts = this.usesAnalyser.getUsesConflicts(state, resolverError);
+        if (usesConflicts == null || usesConflicts.length == 0) {
+            indent(sb, 3);
+            sb.append(" Resolver reported uses conflict for import");
+            formatConstraintAttributes(sb, unsatisfiedConstraint);
+        } else {
+            formatConflictsFound(sb, usesConflicts);
+        }
+    }
+
+    private void formatMissingConstraintWithAttributes(ResolverError resolverError, StringBuilder sb, VersionConstraint unsatisfiedConstraint) {
+        sb.append(" Caused by missing constraint in bundle <").append(resolverError.getBundle()).append(">\n");
+        indent(sb, 3);
+        sb.append(" constraint: <").append(unsatisfiedConstraint).append(">");
+
+        formatConstraintAttributes(sb, unsatisfiedConstraint);
+    }
+
+    private void formatConstraintAttributes(StringBuilder sb, VersionConstraint unsatisfiedConstraint) {
+        if (unsatisfiedConstraint instanceof ImportPackageSpecification) {
+            ImportPackageSpecification importPackageSpecification = (ImportPackageSpecification) unsatisfiedConstraint;
+            formatConstrainedBundleAttributes(sb, importPackageSpecification);
+            Map<?, ?> attributes = importPackageSpecification.getAttributes();
+            if (attributes != null && !attributes.isEmpty()) {
+                sb.append("\n");
+                indent(sb, 3);
+                sb.append("with attributes ").append(attributes).append("\n");
+            }
+        }
+    }
+
+    private void formatConstrainedBundleAttributes(StringBuilder sb, ImportPackageSpecification importPackageSpecification) {
+        String bundleSymbolicName = importPackageSpecification.getBundleSymbolicName();
+        if (null != bundleSymbolicName) {
+            sb.append(" constrained to bundle <").append(bundleSymbolicName).append(">");
+            VersionRange versionRange = importPackageSpecification.getBundleVersionRange();
+            if (null != versionRange) {
+                sb.append(" constrained bundle version range \"").append(versionRange).append("\"");
+            }
+        }
+    }
+
+    private void formatConflictsFound(StringBuilder sb, AnalysedUsesConflict[] usesConflicts) {
+        indent(sb, 3);
+        sb.append("Found conflicts:\n");
+        for (AnalysedUsesConflict conflict : usesConflicts) {
+            for (String line : conflict.getConflictStatement()) {
+                indent(sb, 4);
+                sb.append(line).append("\n");
+            }
+        }
+    }
+
+    private void formatFragmentConflict(ResolverError resolverError, StringBuilder sb, State state) {
+        formatMissingFragment(resolverError, sb);
+        List<BundleDescription> possibleHosts = findPossibleHosts(resolverError.getUnsatisfiedConstraint().getBundle().getHost(), state);
+        if (!possibleHosts.isEmpty()) {
+            sb.append("\n");
+            indent(sb, 3);
+            sb.append("Possible hosts:\n");
+            for (BundleDescription possibleHost : possibleHosts) {
+                indent(sb, 4);
+                sb.append(possibleHost).append(" ").append(possibleHost.isResolved() ? "(resolved)" : "(not resolved)").append("\n");
+            }
+            indent(sb, 3);
+            sb.append("Constraint conflict:\n");
+            indent(sb, 4);
+            sb.append(resolverError.getUnsatisfiedConstraint());
+        }
+    }
+
+    private List<BundleDescription> findPossibleHosts(VersionConstraint hostSpecification, State state) {
+        List<BundleDescription> possibleHosts = new ArrayList<BundleDescription>();
+
+        BundleDescription[] bundles = state.getBundles(hostSpecification.getName());
+        if (bundles != null) {
+            for (BundleDescription bundle : bundles) {
+                if (hostSpecification.getVersionRange().isIncluded(bundle.getVersion())) {
+                    possibleHosts.add(bundle);
+                }
+            }
+        }
+
+        return possibleHosts;
+    }
+
+    private void formatConstraint(VersionConstraint versionConstraint, StringBuilder sb) {
+        String constraintInformation = versionConstraint.toString();
+        String bundleInQuestion = versionConstraint.getBundle().toString();
+        sb.append("Bundle: ").append(bundleInQuestion).append(" - ").append(constraintInformation);
+        if (versionConstraint instanceof ImportPackageSpecification) {
+            sb.append("\n");
+            indent(sb, 3);
+            sb.append("Did you mean: '").append(nearestMatch(versionConstraint.getName())).append("'?");
+        }
+    }
+
+    private boolean isOptional(VersionConstraint versionConstraint) {
+        if (versionConstraint instanceof ImportPackageSpecification) {
+            ImportPackageSpecification ips = (ImportPackageSpecification) versionConstraint;
+            return !ImportPackageSpecification.RESOLUTION_STATIC.equals(ips.getDirective(Constants.RESOLUTION_DIRECTIVE));
+        }
+        return false;
+    }
+
+    /**
+     * Indent the supplied {@link StringBuilder} to the supplied <code>level</code>.
+     * 
+     * @param out the <code>StringBuilder</code> to indent.
+     * @param level the indentation level.
+     */
+    private void indent(StringBuilder out, int level) {
+        for (int n = 0; n < level; n++) {
+            out.append("    ");
+        }
+    }
+
+    /**
+     * Provides a human readable string for any type of equinox resolver error. Errors are defined in
+     * {@link org.eclipse.osgi.service.resolver.ResolverError}
+     * 
+     * @param type
+     * @return
+     */
+    private String getTypeDescription(int type) {
+        switch (type) {
+            case ResolverError.MISSING_IMPORT_PACKAGE:
+                return "An Import-Package could not be resolved.";
+
+            case ResolverError.MISSING_REQUIRE_BUNDLE:
+                return "A Require-Bundle could not be resolved.";
+
+            case ResolverError.MISSING_FRAGMENT_HOST:
+                return "A Fragment-Host could not be resolved.";
+
+            case ResolverError.SINGLETON_SELECTION:
+                return "The bundle could not be resolved because another singleton bundle was selected.";
+
+            case ResolverError.FRAGMENT_CONFLICT:
+                return "The fragment could not be resolved because of a constraint conflict with a host, possibly because the host is already resolved.";
+
+            case ResolverError.IMPORT_PACKAGE_USES_CONFLICT:
+                return "An Import-Package could not be resolved because of a uses directive conflict.";
+
+            case ResolverError.REQUIRE_BUNDLE_USES_CONFLICT:
+                return "A Require-Bundle could not be resolved because of a uses directive conflict.";
+
+            case ResolverError.IMPORT_PACKAGE_PERMISSION:
+                return "An Import-Package could not be resolved because the importing bundle does not have the correct permissions to import the package.";
+
+            case ResolverError.EXPORT_PACKAGE_PERMISSION:
+                return "An Import-Package could not be resolved because no exporting bundle has the correct permissions to export the package.";
+
+            case ResolverError.REQUIRE_BUNDLE_PERMISSION:
+                return "A Require-Bundle could not be resolved because the requiring bundle does not have the correct permissions to require the bundle.";
+
+            case ResolverError.PROVIDE_BUNDLE_PERMISSION:
+                return "A Require-Bundle could not be resolved because no bundle with the required symbolic name has the correct permissions to provied the required symbolic name.";
+
+            case ResolverError.HOST_BUNDLE_PERMISSION:
+                return "A Fragment-Host could not be resolved because no bundle with the required symbolic name has the correct permissions to host a fragment.";
+
+            case ResolverError.FRAGMENT_BUNDLE_PERMISSION:
+                return "A Fragment-Host could not be resolved because the fragment bundle does not have the correct permissions to be a fragment.";
+
+            case ResolverError.PLATFORM_FILTER:
+                return "A bundle could not be resolved because a platform filter did not match the runtime environment.";
+
+            case ResolverError.MISSING_EXECUTION_ENVIRONMENT:
+                return "A bundle could not be resolved because the required execution enviroment did not match the runtime environment.";
+
+            case ResolverError.MISSING_GENERIC_CAPABILITY:
+                return "A bundle could not be resolved because the required generic capability could not be resolved.";
+
+            case ResolverError.NO_NATIVECODE_MATCH:
+                return "A bundle could not be resolved because no match was found for the native code specification.";
+
+            case ResolverError.INVALID_NATIVECODE_PATHS:
+                return "A bundle could not be resolved because the matching native code paths are invalid.";
+
+            case ResolverError.DISABLED_BUNDLE:
+                return "A bundle could not be resolved because the bundle was disabled.";
+
+            default:
+                return "Unknown Error.";
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/main/resources/EventLogMessages.properties b/kernel/org.eclipse.virgo.kernel.userregion/src/main/resources/EventLogMessages.properties
new file mode 100644
index 0000000..e5aa3c5
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/main/resources/EventLogMessages.properties
@@ -0,0 +1,7 @@
+#Enter log event codes to short messages - XX9999(E,W,I) = This is the short code
+UR0001I = User region ready.
+UR0002E = User region failed while deploying initial artifacts. Shutting down.
+UR0003W = Detected Import-Bundle of bundle '{}' version '{}' which exports packages {} that are exported by the system bundle: consider importing the packages explicitly. For example, use Import-Package: {}.
+UR0004W = Bundle '{}' imports library '{}' version '{}' but an instrumented library '{}' will be used instead.
+UR0005E = Kernel service unavailable to userregion within {} seconds ({}). Shutting down.
+UR0006E = Userregion interrupted during startup. Shutting down.
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/InitialArtifactDeployerTests.java b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/InitialArtifactDeployerTests.java
new file mode 100644
index 0000000..71bf317
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/InitialArtifactDeployerTests.java
@@ -0,0 +1,159 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.reset;
+import static org.easymock.EasyMock.verify;
+
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.junit.Test;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+
+
+import org.eclipse.virgo.nano.core.Shutdown;
+import org.eclipse.virgo.nano.deployer.api.core.ApplicationDeployer;
+import org.eclipse.virgo.nano.deployer.api.core.DeployUriNormaliser;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentOptions;
+import org.eclipse.virgo.kernel.userregion.internal.InitialArtifactDeployer;
+import org.eclipse.virgo.kernel.userregion.internal.KernelStartedAwaiter;
+import org.eclipse.virgo.medic.test.eventlog.MockEventLogger;
+
+public class InitialArtifactDeployerTests {
+	
+	private static final Map<String, ?> NULL_PROPERTIES = (Map<String, ?>)null;
+
+    private ApplicationDeployer deployer = createMock(ApplicationDeployer.class);
+	
+	private KernelStartedAwaiter startedAwaiter = new KernelStartedAwaiter();
+	
+	private StubEventAdmin eventAdmin = new StubEventAdmin();
+	
+	private MockEventLogger eventLogger = new MockEventLogger();
+	
+	private Shutdown shutdown = createMock(Shutdown.class);
+	
+	@Test
+	public void basicEventingWithNoArtifactDeployment() throws InterruptedException {
+		replay(this.deployer);
+		
+		InitialArtifactDeployer initialArtifactDeployer = new InitialArtifactDeployer(this.startedAwaiter, this.deployer, "", "", new StubDeployUriNormaliser(), this.eventAdmin, this.eventLogger, this.shutdown);
+		this.startedAwaiter.handleEvent(new Event("org/eclipse/virgo/kernel/STARTED", NULL_PROPERTIES));
+		
+		initialArtifactDeployer.deployArtifacts();
+		
+		Event eventSystemArtifactsDeployed = new Event("org/eclipse/virgo/kernel/userregion/systemartifacts/DEPLOYED", NULL_PROPERTIES);
+		this.eventAdmin.awaitPostingOfEvent(eventSystemArtifactsDeployed);
+		
+		initialArtifactDeployer.handleEvent(eventSystemArtifactsDeployed);
+		this.eventAdmin.awaitPostingOfEvent(new Event("org/eclipse/virgo/kernel/userregion/userartifacts/DEPLOYED", NULL_PROPERTIES));
+		
+		verify(this.deployer);
+	}
+	
+	@Test
+	public void artifactDeployment() throws DeploymentException, InterruptedException {		
+		
+		InitialArtifactDeployer initialArtifactDeployer = new InitialArtifactDeployer(this.startedAwaiter, this.deployer, "repository:alpha/bravo/1, repository:alpha/bravo/2", "repository:charlie/delta,repository:echo/foxtrot/2", new StubDeployUriNormaliser(), this.eventAdmin, this.eventLogger, this.shutdown);				
+		
+		expect(this.deployer.deploy(URI.create("repository:alpha/bravo/1"), new DeploymentOptions(false, false, true))).andReturn(null);		
+		expect(this.deployer.deploy(URI.create("repository:alpha/bravo/2"), new DeploymentOptions(false, false, true))).andReturn(null);
+		replay(this.deployer);
+		
+		this.startedAwaiter.handleEvent(new Event("org/eclipse/virgo/kernel/STARTED", NULL_PROPERTIES));
+		initialArtifactDeployer.deployArtifacts();
+		
+		Event eventSystemArtifactsDeployed = new Event("org/eclipse/virgo/kernel/userregion/systemartifacts/DEPLOYED", NULL_PROPERTIES);
+		this.eventAdmin.awaitPostingOfEvent(eventSystemArtifactsDeployed);
+
+		verify(this.deployer);
+		
+		reset(this.deployer);
+		
+		expect(this.deployer.deploy(URI.create("repository:charlie/delta"), new DeploymentOptions(false, false, true))).andReturn(null);		
+		expect(this.deployer.deploy(URI.create("repository:echo/foxtrot/2"), new DeploymentOptions(false, false, true))).andReturn(null);
+		
+		replay(this.deployer);
+		
+		initialArtifactDeployer.handleEvent(eventSystemArtifactsDeployed);
+		this.eventAdmin.awaitPostingOfEvent(new Event("org/eclipse/virgo/kernel/userregion/userartifacts/DEPLOYED", NULL_PROPERTIES));
+		
+		verify(this.deployer);
+	}
+	
+	@Test
+	public void failedDeploymentLogsMessageAndTriggersShutdown() throws DeploymentException, InterruptedException {
+		InitialArtifactDeployer initialArtifactDeployer = new InitialArtifactDeployer(this.startedAwaiter, this.deployer, "repository:alpha/bravo/1", null, new StubDeployUriNormaliser(), this.eventAdmin, this.eventLogger, this.shutdown);				
+		
+		expect(this.deployer.deploy(URI.create("repository:alpha/bravo/1"), new DeploymentOptions(false, false, true))).andThrow(new DeploymentException("Deployment failed"));
+		replay(this.deployer);
+		
+		this.shutdown.shutdown();
+		replay(this.shutdown);
+		
+		this.startedAwaiter.handleEvent(new Event("org/eclipse/virgo/kernel/STARTED", NULL_PROPERTIES));
+		
+		initialArtifactDeployer.deployArtifacts();
+		
+		while (!this.eventLogger.isLogged("UR0002E")) {
+			Thread.sleep(100);
+		}
+		
+		Thread.sleep(100);
+		
+		verify(this.deployer, this.shutdown);
+	}
+	
+	private final class StubEventAdmin implements EventAdmin {
+		
+		private final List<Event> postedEvents = new ArrayList<Event>();
+		
+		private final List<Event> sentEvents = new ArrayList<Event>();
+		
+		private final Object monitor = new Object();
+
+		public void postEvent(Event event) {
+			synchronized (this.monitor) {
+				this.postedEvents.add(event);
+			}
+		}
+
+		public void sendEvent(Event event) {
+			synchronized (this.monitor) {
+				this.sentEvents.add(event);
+			}			
+		}		
+		
+		public void awaitPostingOfEvent(Event event) {
+			boolean eventSent = false;
+			while (!eventSent) {				
+				synchronized (this.monitor) {
+					eventSent = this.postedEvents.contains(event);
+				}
+			}
+		}
+	}
+	
+	private static final class StubDeployUriNormaliser implements DeployUriNormaliser {
+		public URI normalise(URI uri) throws DeploymentException {
+			return uri;
+		}
+	}		
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/ServiceScopingStrategyTests.java b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/ServiceScopingStrategyTests.java
new file mode 100644
index 0000000..db56c75
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/ServiceScopingStrategyTests.java
@@ -0,0 +1,253 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.eq;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Collection;
+import java.util.HashSet;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+
+import org.eclipse.virgo.kernel.install.artifact.ScopeServiceRepository;
+
+import org.eclipse.virgo.nano.shim.scope.Scope;
+import org.eclipse.virgo.nano.shim.scope.ScopeFactory;
+import org.eclipse.virgo.kernel.userregion.internal.ServiceScopingStrategy;
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+
+/**
+ */
+public class ServiceScopingStrategyTests {
+
+    private static final String SCOPE_NAME = "application scope";
+
+    private static final String CLASS_NAME = "Class";
+
+    private static final String FILTER = "Filter";
+
+    private ServiceScopingStrategy serviceScopingStrategy;
+
+    private ScopeFactory scopeFactory;
+
+    private ScopeServiceRepository scopeServiceRepository;
+
+    private Scope globalScope;
+
+    private ServiceReference<?> unscopedServiceReference;
+
+    private StubBundleContext unscopedBundleContext;
+
+    private Scope appScope;
+
+    private ServiceReference<?> scopedServiceReference;
+
+    private StubBundleContext scopedBundleContext;
+
+    @Before
+    public void setUp() throws Exception {
+        this.scopeFactory = createMock(ScopeFactory.class);
+        this.scopeServiceRepository = createMock(ScopeServiceRepository.class);
+        this.serviceScopingStrategy = new ServiceScopingStrategy(this.scopeFactory, this.scopeServiceRepository);
+
+        this.globalScope = createMock(Scope.class);
+        expect(this.globalScope.isGlobal()).andReturn(true).anyTimes();
+        expect(this.scopeFactory.getGlobalScope()).andReturn(this.globalScope).anyTimes();
+
+        this.appScope = createMock(Scope.class);
+        expect(this.appScope.isGlobal()).andReturn(false).anyTimes();
+        expect(this.appScope.getScopeName()).andReturn(SCOPE_NAME).anyTimes();
+
+        replay(this.globalScope, this.appScope);
+    }
+
+    private void setUpScopedBundleContext() {
+        this.scopedBundleContext = new StubBundleContext();
+        expect(this.scopeFactory.getBundleScope(eq(this.scopedBundleContext.getBundle()))).andReturn(this.appScope).anyTimes();
+    }
+
+    private void setUpScopedServiceReference() {
+        this.scopedServiceReference = createMock(ServiceReference.class);
+        expect(this.scopeFactory.getServiceScope(eq(this.scopedServiceReference))).andReturn(this.appScope).anyTimes();
+    }
+
+    private void setUpUnscopedBundleContext() {
+        this.unscopedBundleContext = new StubBundleContext();
+        expect(this.scopeFactory.getBundleScope(eq(this.unscopedBundleContext.getBundle()))).andReturn(this.globalScope).anyTimes();
+    }
+
+    private void setUpUnscopedServiceReference() {
+        this.unscopedServiceReference = createMock(ServiceReference.class);
+        expect(this.scopeFactory.getServiceScope(eq(this.unscopedServiceReference))).andReturn(this.globalScope).anyTimes();
+    }
+
+    @After
+    public void tearDown() {
+        verify(this.globalScope, this.appScope);
+    }
+
+    @Test
+    public void testMatchesScopeUnscopedServiceUnscopedApplication() {
+        setUpUnscopedServiceReference();
+        setUpUnscopedBundleContext();
+        replay(this.scopeFactory, this.scopeServiceRepository, this.unscopedServiceReference);
+        assertTrue(this.serviceScopingStrategy.isPotentiallyVisible(this.unscopedServiceReference, this.unscopedBundleContext));
+        verify(this.scopeFactory, this.scopeServiceRepository, this.unscopedServiceReference);
+    }
+
+    @Test
+    public void testMatchesScopeScopedServiceScopedApplication() {
+        setUpScopedServiceReference();
+        setUpScopedBundleContext();
+        replay(this.scopeFactory, this.scopeServiceRepository, this.scopedServiceReference);
+        assertTrue(this.serviceScopingStrategy.isPotentiallyVisible(this.scopedServiceReference, this.scopedBundleContext));
+        verify(this.scopeFactory, this.scopeServiceRepository, this.scopedServiceReference);
+    }
+
+    @Test
+    public void testMatchesScopeScopedServiceUnscopedApplication() {
+        setUpScopedServiceReference();
+        setUpUnscopedBundleContext();
+        replay(this.scopeFactory, this.scopeServiceRepository, this.scopedServiceReference);
+        assertFalse(this.serviceScopingStrategy.isPotentiallyVisible(this.scopedServiceReference, this.unscopedBundleContext));
+        verify(this.scopeFactory, this.scopeServiceRepository, this.scopedServiceReference);
+    }
+
+    @Test
+    public void testMatchesScopeUnscopedServiceScopedApplication() {
+        setUpUnscopedServiceReference();
+        setUpScopedBundleContext();
+        replay(this.scopeFactory, this.scopeServiceRepository, this.unscopedServiceReference);
+        assertTrue(this.serviceScopingStrategy.isPotentiallyVisible(this.unscopedServiceReference, this.scopedBundleContext));
+        verify(this.scopeFactory, this.scopeServiceRepository, this.unscopedServiceReference);
+    }
+
+    @Test
+    public void testScopeReferencesUnscopedServiceUnscopedApplication() throws InvalidSyntaxException {
+        setUpUnscopedServiceReference();
+        setUpUnscopedBundleContext();
+        expect(this.scopeServiceRepository.scopeHasMatchingService(eq(SCOPE_NAME), eq(CLASS_NAME), eq(FILTER))).andReturn(false).anyTimes();
+        replay(this.scopeFactory, this.scopeServiceRepository, this.unscopedServiceReference);
+
+        Collection<ServiceReference<?>> references = new ShrinkableSet(this.unscopedServiceReference);
+        this.serviceScopingStrategy.scopeReferences(references, this.unscopedBundleContext, CLASS_NAME, FILTER);
+        assertTrue(references.contains(this.unscopedServiceReference));
+
+        verify(this.scopeFactory, this.scopeServiceRepository, this.unscopedServiceReference);
+    }
+
+    @Test
+    public void testScopeReferencesScopedServiceUnscopedApplication() throws InvalidSyntaxException {
+        setUpScopedServiceReference();
+        setUpUnscopedBundleContext();
+        expect(this.scopeServiceRepository.scopeHasMatchingService(eq(SCOPE_NAME), eq(CLASS_NAME), eq(FILTER))).andReturn(false).anyTimes();
+        replay(this.scopeFactory, this.scopeServiceRepository, this.scopedServiceReference);
+
+        Collection<ServiceReference<?>> references = new ShrinkableSet(this.scopedServiceReference);
+        this.serviceScopingStrategy.scopeReferences(references, this.unscopedBundleContext, CLASS_NAME, FILTER);
+        assertFalse(references.contains(this.unscopedServiceReference));
+
+        verify(this.scopeFactory, this.scopeServiceRepository, this.scopedServiceReference);
+    }
+
+    @Test
+    public void testScopeReferencesScopedServiceInModelScopedApplication() throws InvalidSyntaxException {
+        setUpScopedServiceReference();
+        setUpScopedBundleContext();
+        expect(this.scopeServiceRepository.scopeHasMatchingService(eq(SCOPE_NAME), eq(CLASS_NAME), eq(FILTER))).andReturn(true).anyTimes();
+        replay(this.scopeFactory, this.scopeServiceRepository, this.scopedServiceReference);
+
+        Collection<ServiceReference<?>> references = new ShrinkableSet(this.scopedServiceReference);
+        this.serviceScopingStrategy.scopeReferences(references, this.scopedBundleContext, CLASS_NAME, FILTER);
+        assertTrue(references.contains(this.scopedServiceReference));
+
+        verify(this.scopeFactory, this.scopeServiceRepository, this.scopedServiceReference);
+    }
+
+    @Test
+    public void testScopeReferencesScopedServiceNotInModelScopedApplication() throws InvalidSyntaxException {
+        setUpScopedServiceReference();
+        setUpScopedBundleContext();
+        expect(this.scopeServiceRepository.scopeHasMatchingService(eq(SCOPE_NAME), eq(CLASS_NAME), eq(FILTER))).andReturn(false).anyTimes();
+        replay(this.scopeFactory, this.scopeServiceRepository, this.scopedServiceReference);
+
+        Collection<ServiceReference<?>> references = new ShrinkableSet(this.scopedServiceReference);
+        this.serviceScopingStrategy.scopeReferences(references, this.scopedBundleContext, CLASS_NAME, FILTER);
+        assertTrue(references.contains(this.scopedServiceReference));
+
+        verify(this.scopeFactory, this.scopeServiceRepository, this.scopedServiceReference);
+    }
+
+    @Test
+    public void testScopeReferencesUnscopedUnshadowedServiceScopedApplication() throws InvalidSyntaxException {
+        setUpUnscopedServiceReference();
+        setUpScopedBundleContext();
+        expect(this.scopeServiceRepository.scopeHasMatchingService(eq(SCOPE_NAME), eq(CLASS_NAME), eq(FILTER))).andReturn(false).anyTimes();
+        replay(this.scopeFactory, this.scopeServiceRepository, this.unscopedServiceReference);
+
+        Collection<ServiceReference<?>> references = new ShrinkableSet(this.unscopedServiceReference);
+        this.serviceScopingStrategy.scopeReferences(references, this.scopedBundleContext, CLASS_NAME, FILTER);
+        assertTrue(references.contains(this.unscopedServiceReference));
+
+        verify(this.scopeFactory, this.scopeServiceRepository, this.unscopedServiceReference);
+    }
+
+    @Test
+    public void testScopeReferencesUnscopedShadowedServiceScopedApplication() throws InvalidSyntaxException {
+        setUpUnscopedServiceReference();
+        setUpScopedBundleContext();
+        expect(this.scopeServiceRepository.scopeHasMatchingService(eq(SCOPE_NAME), eq(CLASS_NAME), eq(FILTER))).andReturn(true).anyTimes();
+        replay(this.scopeFactory, this.scopeServiceRepository, this.unscopedServiceReference);
+
+        Collection<ServiceReference<?>> references = new ShrinkableSet(this.unscopedServiceReference);
+        this.serviceScopingStrategy.scopeReferences(references, this.scopedBundleContext, CLASS_NAME, FILTER);
+        assertFalse(references.contains(this.unscopedServiceReference));
+
+        verify(this.scopeFactory, this.scopeServiceRepository, this.unscopedServiceReference);
+    }
+    
+    /**
+     * This test uses a collection that does not support addition in order to place the
+     * same constraints on the implementation as the service registry find hook.
+     */
+    private static final class ShrinkableSet extends HashSet<ServiceReference<?>> {
+
+        private static final long serialVersionUID = 1L;
+
+        public ShrinkableSet(ServiceReference<?> e) {
+            super();
+            super.add(e);
+        }
+
+        @Override
+        public boolean add(ServiceReference<?> e) {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public boolean addAll(Collection<? extends ServiceReference<?>> c) {
+            throw new UnsupportedOperationException();
+        }
+        
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/equinox/AbstractOsgiFrameworkLaunchingTests.java b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/equinox/AbstractOsgiFrameworkLaunchingTests.java
new file mode 100644
index 0000000..d563988
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/equinox/AbstractOsgiFrameworkLaunchingTests.java
@@ -0,0 +1,237 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.equinox;
+
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.net.URI;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+
+import org.eclipse.equinox.internal.region.StandardRegionDigraph;
+import org.eclipse.equinox.region.Region;
+import org.eclipse.equinox.region.RegionDigraph;
+import org.eclipse.osgi.launch.Equinox;
+import org.eclipse.osgi.service.resolver.PlatformAdmin;
+import org.eclipse.virgo.kernel.artifact.bundle.BundleBridge;
+import org.eclipse.virgo.kernel.artifact.library.LibraryBridge;
+import org.eclipse.virgo.kernel.equinox.extensions.EquinoxLauncherConfiguration;
+import org.eclipse.virgo.kernel.equinox.extensions.ExtendedEquinoxLauncher;
+import org.eclipse.virgo.kernel.equinox.extensions.hooks.PluggableClassLoadingHook;
+import org.eclipse.virgo.kernel.osgi.framework.ImportExpander;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiFramework;
+import org.eclipse.virgo.kernel.services.repository.internal.RepositoryFactoryBean;
+import org.eclipse.virgo.kernel.services.work.WorkArea;
+import org.eclipse.virgo.kernel.userregion.internal.DumpExtractor;
+import org.eclipse.virgo.kernel.userregion.internal.dump.StandardDumpExtractor;
+import org.eclipse.virgo.kernel.userregion.internal.importexpansion.ImportExpansionHandler;
+import org.eclipse.virgo.kernel.userregion.internal.quasi.StandardQuasiFrameworkFactory;
+import org.eclipse.virgo.kernel.userregion.internal.quasi.StandardResolutionFailureDetective;
+import org.eclipse.virgo.medic.dump.DumpGenerator;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.medic.test.eventlog.MockEventLogger;
+import org.eclipse.virgo.repository.ArtifactBridge;
+import org.eclipse.virgo.repository.Repository;
+import org.eclipse.virgo.repository.RepositoryFactory;
+import org.eclipse.virgo.repository.internal.RepositoryBundleActivator;
+import org.eclipse.virgo.util.io.FileSystemUtils;
+import org.eclipse.virgo.util.io.PathReference;
+import org.junit.After;
+import org.junit.Before;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.packageadmin.ExportedPackage;
+import org.osgi.service.packageadmin.PackageAdmin;
+
+@SuppressWarnings("deprecation")
+public abstract class AbstractOsgiFrameworkLaunchingTests {
+
+    protected EquinoxOsgiFramework framework;
+
+    protected PlatformAdmin platformAdmin;
+
+    protected Repository repository;
+
+    private RepositoryBundleActivator repositoryBundleActivator;
+
+    private BundleContext bundleContext;
+
+    private ServiceRegistration<Repository> repositoryRegistration;
+
+    private ServiceRegistration<EventLogger> eventLoggerRegistration;
+
+    private ServiceRegistration<DumpGenerator> dumpGeneratorRegistration;
+
+    private ServiceRegistration<RegionDigraph> regionDigraphRegistration;
+
+    private Equinox equinox;
+
+    protected QuasiFramework quasiFramework;
+
+    private ThreadLocal<Region> threadLocal;
+
+    @Before
+    public void setUp() throws Exception {
+
+        final File workDir = new File("build/work");
+
+        if (workDir.exists()) {
+            assertTrue(FileSystemUtils.deleteRecursively(new File("build/work")));
+        }
+
+        // Uncomment this line to enable Equinox debugging
+        // FrameworkProperties.setProperty("osgi.debug", "src/test/resources/debug.options");
+
+        // Uncomment thils line to enable Equinox console
+        // FrameworkProperties.setProperty("osgi.console", "2401");
+        EquinoxLauncherConfiguration launcherConfiguration = new EquinoxLauncherConfiguration();
+        launcherConfiguration.setClean(true);
+        URI targetURI = new File("./build").toURI();
+        launcherConfiguration.setConfigPath(targetURI);
+        launcherConfiguration.setInstallPath(targetURI);
+
+        equinox = ExtendedEquinoxLauncher.launch(launcherConfiguration);
+
+        this.bundleContext = equinox.getBundleContext();
+
+        DumpGenerator dumpGenerator = new DumpGenerator() {
+
+            public void generateDump(String cause, Throwable... throwables) {
+            }
+
+            public void generateDump(String cause, Map<String, Object> context, Throwable... throwables) {
+            }
+
+        };
+
+        this.threadLocal = new ThreadLocal<Region>();
+        RegionDigraph regionDigraph = new StandardRegionDigraph(this.bundleContext, this.threadLocal);
+
+        Region userRegion = regionDigraph.createRegion("org.eclipse.virgo.region.user");
+        userRegion.addBundle(this.bundleContext.getBundle());
+
+        final EventLogger mockEventLogger = new MockEventLogger();
+
+        eventLoggerRegistration = bundleContext.registerService(EventLogger.class, mockEventLogger, null);
+        dumpGeneratorRegistration = bundleContext.registerService(DumpGenerator.class, dumpGenerator, null);
+        regionDigraphRegistration = bundleContext.registerService(RegionDigraph.class, regionDigraph, null);
+
+        this.repositoryBundleActivator = new RepositoryBundleActivator();
+        this.repositoryBundleActivator.start(bundleContext);
+
+        ServiceReference<RepositoryFactory> repositoryFactoryServiceReference = bundleContext.getServiceReference(RepositoryFactory.class);
+        RepositoryFactory repositoryFactory = bundleContext.getService(repositoryFactoryServiceReference);
+
+        Properties repositoryProperties = new Properties();
+
+        try (InputStream properties = new FileInputStream(new File(getRepositoryConfigDirectory(), "repository.properties"))) {
+            repositoryProperties.load(properties);
+        }
+
+        Set<ArtifactBridge> artifactBridges = new HashSet<ArtifactBridge>();
+        artifactBridges.add(new BundleBridge(new StubHashGenerator()));
+        artifactBridges.add(new LibraryBridge(new StubHashGenerator()));
+
+        RepositoryFactoryBean bean = new RepositoryFactoryBean(repositoryProperties, mockEventLogger, repositoryFactory, new File("build/work"),
+            artifactBridges, null);
+        repository = bean.getObject();
+
+        repositoryRegistration = bundleContext.registerService(Repository.class, repository, null);
+
+        ServiceReference<PlatformAdmin> platformAdminServiceReference = bundleContext.getServiceReference(PlatformAdmin.class);
+        this.platformAdmin = (PlatformAdmin) bundleContext.getService(platformAdminServiceReference);
+
+        ServiceReference<PackageAdmin> packageAdminServiceReference = bundleContext.getServiceReference(PackageAdmin.class);
+        PackageAdmin packageAdmin = (PackageAdmin) bundleContext.getService(packageAdminServiceReference);
+
+        ImportExpander importExpander = createImportExpander(packageAdmin);
+        TransformedManifestProvidingBundleFileWrapper bundleFileWrapper = new TransformedManifestProvidingBundleFileWrapper(importExpander);
+        this.framework = new EquinoxOsgiFramework(equinox.getBundleContext(), packageAdmin, bundleFileWrapper);
+
+        PluggableClassLoadingHook.getInstance().setClassLoaderCreator(new KernelClassLoaderCreator());
+        StandardResolutionFailureDetective detective = new StandardResolutionFailureDetective(platformAdmin);
+
+        WorkArea workArea = new WorkArea() {
+
+            @Override
+            public Bundle getOwner() {
+                return bundleContext.getBundle();
+            }
+
+            @Override
+            public PathReference getWorkDirectory() {
+                return new PathReference(new File("build/work"));
+            }
+        };
+        DumpExtractor dumpExtractor = new StandardDumpExtractor(workArea);
+        this.quasiFramework = new StandardQuasiFrameworkFactory(bundleContext, detective, repository, bundleFileWrapper, regionDigraph, dumpExtractor).create();
+    }
+
+    private ImportExpander createImportExpander(PackageAdmin packageAdmin) {
+        Set<String> packagesExportedBySystemBundle = new HashSet<String>(30);
+        ExportedPackage[] exportedPackages = packageAdmin.getExportedPackages(bundleContext.getBundle(0));
+
+        for (ExportedPackage exportedPackage : exportedPackages) {
+            packagesExportedBySystemBundle.add(exportedPackage.getName());
+        }
+
+        return new ImportExpansionHandler(repository, bundleContext, packagesExportedBySystemBundle, new MockEventLogger());
+    }
+
+    @After
+    public void stop() throws Exception {
+
+        if (this.repositoryRegistration != null) {
+            this.repositoryRegistration.unregister();
+            this.repositoryRegistration = null;
+        }
+
+        if (this.dumpGeneratorRegistration != null) {
+            this.dumpGeneratorRegistration.unregister();
+            this.dumpGeneratorRegistration = null;
+        }
+
+        if (this.regionDigraphRegistration != null) {
+            this.regionDigraphRegistration.unregister();
+            this.regionDigraphRegistration = null;
+        }
+
+        if (this.eventLoggerRegistration != null) {
+            this.eventLoggerRegistration.unregister();
+            this.eventLoggerRegistration = null;
+        }
+
+        if (this.repositoryBundleActivator != null) {
+            this.repositoryBundleActivator.stop(this.bundleContext);
+            this.repositoryBundleActivator = null;
+        }
+
+        if (this.framework != null) {
+            this.framework.stop();
+            this.framework = null;
+        }
+
+        if (this.equinox != null) {
+            this.equinox.stop();
+            this.equinox.waitForStop(30000);
+        }
+    }
+
+    protected abstract String getRepositoryConfigDirectory();
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/equinox/BundleInstallationTests.java b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/equinox/BundleInstallationTests.java
new file mode 100644
index 0000000..180fe88
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/equinox/BundleInstallationTests.java
@@ -0,0 +1,203 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.equinox;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.Reader;
+import java.net.URI;
+
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleException;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiBundle;
+import org.eclipse.virgo.util.io.IOUtils;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifestFactory;
+
+/**
+ */
+public class BundleInstallationTests extends AbstractOsgiFrameworkLaunchingTests {
+
+    @Override
+    protected String getRepositoryConfigDirectory() {
+        return new File("src/test/resources/config/BundleInstallationTests").getAbsolutePath();
+    }
+
+    @Test(expected = BundleException.class)
+    public void testFailedInstall() throws Exception {
+        installBundle("fail.parent");
+    }
+
+    @Test
+    public void testInstallFragHost() throws Exception {
+        Bundle bundle = installBundle("frag.host");
+        assertNotNull(bundle);
+        assertEquals(Bundle.INSTALLED, bundle.getState());
+
+        Bundle[] bundles = this.framework.getBundleContext().getBundles();
+        boolean foundChild = false;
+        for (Bundle b : bundles) {
+            if ("frag.child".equals(b.getSymbolicName())) {
+                foundChild = true;
+                break;
+            }
+        }
+        assertTrue(foundChild);
+    }
+
+    @Test
+    public void testInstallFragChild() throws Exception {
+        Bundle bundle = installBundle("frag.child");
+        assertNotNull(bundle);
+        assertEquals(Bundle.RESOLVED, bundle.getState());
+    }
+
+    @Test
+    public void testInstallBundleWithNoDependencies() throws Exception {
+        Bundle bundle = installBundle("org.eclipse.virgo.server.mock.bundle");
+        assertNotNull(bundle);
+        bundle.start();
+        assertEquals(Bundle.ACTIVE, bundle.getState());
+    }
+
+    @Test
+    public void testInstallBundleWithMultipleDependencies() throws Exception {
+        Bundle bundle = installBundle("install.three");
+        assertNotNull(bundle);
+        bundle.start();
+        assertEquals(Bundle.ACTIVE, bundle.getState());
+    }
+
+    @Test
+    public void testInstallBundleWithTransitiveDependencies() throws Exception {
+        Bundle bundle = installBundle("install.four");
+        assertNotNull(bundle);
+        assertEquals(Bundle.RESOLVED, bundle.getState());
+    }
+
+    @Test
+    public void testInstallBundleWithRequireBundle() throws Exception {
+        Bundle bundle = installBundle("install.five");
+        assertNotNull(bundle);
+        assertEquals(Bundle.RESOLVED, bundle.getState());
+    }
+
+    @Test
+    public void testInstallBundleWithCircle() throws Exception {
+        Bundle bundle = installBundle("install.six");
+        assertNotNull(bundle);
+        assertEquals(Bundle.RESOLVED, bundle.getState());
+    }
+
+    @Test
+    public void platform170() throws Exception {
+        Bundle b = installBundle(new File("./src/test/resources/platform170/simpleosgiservice-1.0.0.jar"));
+        b.start();
+
+        b = installBundle(new File("./src/test/resources/platform170/simpleosgiservice-2.0.0.jar"));
+        b.start();
+
+        b = installBundle(new File("./src/test/resources/platform170/simpleosgiapp-1.0.0.jar"));
+        b.start();
+
+        assertEquals(Bundle.ACTIVE, b.getState());
+    }
+
+    @Test
+    public void testInstallWithOptionalImportNotSatisfied() throws Exception {
+        Bundle b = installBundle("install.optional.ns");
+        b.start();
+        assertEquals(Bundle.ACTIVE, b.getState());
+    }
+
+    @Test
+    public void testInstallWithOptionalImportWithNotSatisfiedDependencyInOptional() throws Exception {
+        Bundle b = installBundle("install.optional.dep.bundle");
+        b.start();
+        assertEquals(Bundle.ACTIVE, b.getState());
+    }
+
+    @Test
+    public void testMultipleOptionsChoosesOnlyOneOption() throws Exception {
+        Bundle b = installBundle("install.multi.bundle");
+        b.start();
+        assertEquals(Bundle.ACTIVE, b.getState());
+        Bundle[] bundles = b.getBundleContext().getBundles();
+        for (Bundle bundle : bundles) {
+            if ("install.multi.a".equals(bundle.getSymbolicName())) {
+                fail("Bundle install.multi.a should not have been installed into the framework");
+            }
+        }
+    }
+
+    @Test
+    public void testSatisfyAgainstBundleNotInRepo() throws Exception {
+        installBundle(new File("./src/test/resources/bit/standalone"));
+        Bundle bundle = installBundle("install.six");
+        bundle.start();
+        assertEquals(Bundle.ACTIVE, bundle.getState());
+    }
+
+    @Test(expected = BundleException.class)
+    public void testFailedDueToMissingImport() throws Exception {
+        installBundle("install.error.import");
+    }
+
+    @Test
+    public void testUnresolvableFragmentIsIgnored() throws Exception {
+        Bundle b = installBundle("fragments.unresolvable.host");
+        b.start();
+        assertEquals(Bundle.ACTIVE, b.getState());
+    }
+
+    @Test(expected = BundleException.class)
+    public void testFailDueToUses() throws Exception {
+        installBundle("install.uses.hibernate325");
+        installBundle("install.uses.hibernate326");
+        Bundle b = installBundle("install.uses.spring");
+        b.start();
+
+        assertEquals(Bundle.ACTIVE, b.getState());
+
+        installBundle("install.uses.bundle");
+    }
+
+    private Bundle installBundle(String symbolicName) throws BundleException, IOException {
+        URI bundleLocation = this.repository.get("bundle", symbolicName, VersionRange.NATURAL_NUMBER_RANGE).getUri();
+        File bundleFile = new File(bundleLocation);
+        return installBundle(bundleFile);
+    }
+
+    private Bundle installBundle(File bundleFile) throws BundleException, IOException {
+        Reader manifest = null;
+        try {
+            if (bundleFile.isDirectory()) {
+                manifest = ManifestUtils.manifestReaderFromExplodedDirectory(bundleFile);
+            } else {
+                manifest = ManifestUtils.manifestReaderFromJar(bundleFile);
+            }
+
+            QuasiBundle quasiBundle = this.quasiFramework.install(bundleFile.toURI(), BundleManifestFactory.createBundleManifest(manifest));
+            this.quasiFramework.resolve();
+            this.quasiFramework.commit();
+            return quasiBundle.getBundle();
+        } finally {
+            IOUtils.closeQuietly(manifest);
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/equinox/BundleUpdateTests.java b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/equinox/BundleUpdateTests.java
new file mode 100644
index 0000000..2defaf1
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/equinox/BundleUpdateTests.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.equinox;
+
+import static org.junit.Assert.assertNotNull;
+
+import java.io.File;
+
+import org.junit.Ignore;
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+
+import org.eclipse.virgo.util.io.PathReference;
+
+/**
+ */
+public class BundleUpdateTests extends AbstractOsgiFrameworkLaunchingTests {
+    
+    @Override
+    protected String getRepositoryConfigDirectory() {
+        return new File("src/test/resources/config/BundleUpdateTests").getAbsolutePath();
+    }
+
+    /*
+     * This test checks the behaviour of class loading during a bundle update operation. The test passes on Mac OS X, but
+     * it seems unlikely to pass on some other operating systems. The basic question is how can classes be loaded from the
+     * old version of a bundle after the bundle has been updated if install by reference is used.
+     * 
+     * The test installs two bundles but.B and but.C and starts but.C. but.C loads class but.A which is exported
+     * by but.B and listens synchronously for an update event for bundle but.B. This test method overwrites bundle but.B
+     * and issues an update for the bundle. The new version of but.B contains a new version of class but.A.
+     * 
+     * The old version of bundle but.B also contains a class but.B which depends on the class but.A. The new version
+     * of bundle but.B contains a new version of class but.B which depends on the new version of but.A and which will fail
+     * if it is loaded with the old version of but.A.
+     * 
+     * When the synchronous bundle listener in bundle but.C is notified of the update of bundle but.B, it loads the class
+     * but.B. This will succeed if it is loads the old version of the class but will fail if it loads the new version of the
+     * class.
+     */
+    @Test
+    @Ignore("See DMS-2886")
+    public void testUpdate() throws Exception {
+        PathReference bBeforeSrc = new PathReference("src/test/resources/but/but.B.before.jar");
+        PathReference b = new PathReference("build/but.B.jar");
+        b.delete();
+        bBeforeSrc.copy(b);
+        Bundle bBundle = this.framework.getBundleContext().installBundle(b.toFile().toURI().toString());
+        assertNotNull(bBundle);
+        
+        PathReference cSrc = new PathReference("src/test/resources/but/but.C.jar");
+        PathReference c = new PathReference("build/but.C.jar");
+        c.delete();
+        cSrc.copy(c);
+        Bundle cBundle = this.framework.getBundleContext().installBundle(c.toFile().toURI().toString());
+        assertNotNull(cBundle);
+        cBundle.start();
+        
+        PathReference bAfterSrc = new PathReference("src/test/resources/but/but.B.after.jar");
+        b.delete();
+        bAfterSrc.copy(b);
+        bBundle.update();
+        
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/equinox/EquinoxBootDelegationHelperTests.java b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/equinox/EquinoxBootDelegationHelperTests.java
new file mode 100644
index 0000000..a1db742
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/equinox/EquinoxBootDelegationHelperTests.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.equinox;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.eclipse.virgo.kernel.userregion.internal.equinox.EquinoxBootDelegationHelper;
+import org.junit.Test;
+
+
+/**
+ */
+public class EquinoxBootDelegationHelperTests {
+
+    @Test public void isBootDelegated() {
+        EquinoxBootDelegationHelper helper = new EquinoxBootDelegationHelper("a.b.c.*, d.e.f");
+
+        assertFalse(helper.isBootDelegated("g.h.MyClass"));
+        assertTrue(helper.isBootDelegated("d.e.f.MyClass"));
+        assertFalse(helper.isBootDelegated("d.e.f.g.MyClass"));
+        assertTrue(helper.isBootDelegated("a.b.c.d.MyClass"));
+
+        // I believe there's a bug in Equinox which we need to mirror. The boot delegation is
+        // specified as (e.g.) org.eclipse.virgo.server.osgi.* which should mean that all classes that
+        // reside in a subpackage of org.eclipse.virgo.server.osgi are boot delegated but those
+        // that reside directly in org.eclipse.virgo.server.osgi are not boot delegated. However,
+        // Equinox treats org.eclipse.virgo.server.osgi.* as meaning that everything in
+        // org.eclipse.virgo.server.osgi and its subpackages is boot delegated.
+        assertTrue(helper.isBootDelegated("a.b.c.MyClass"));
+        assertFalse(helper.isBootDelegated("d.e.MyClass"));
+        assertFalse(helper.isBootDelegated("a.b.MyClass"));
+    }
+
+    @Test public void testDelegationOfAllPackages() {
+        EquinoxBootDelegationHelper helper = new EquinoxBootDelegationHelper("a.b.c.*, *");
+        assertTrue(helper.isBootDelegated("d.e.f.MyClass"));
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/equinox/EquinoxOsgiFrameworkTests.java b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/equinox/EquinoxOsgiFrameworkTests.java
new file mode 100644
index 0000000..f052769
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/equinox/EquinoxOsgiFrameworkTests.java
@@ -0,0 +1,103 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.equinox;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.lang.instrument.ClassFileTransformer;
+import java.lang.instrument.IllegalClassFormatException;
+import java.security.ProtectionDomain;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleException;
+import org.eclipse.virgo.kernel.osgi.framework.BundleClassLoaderUnavailableException;
+import org.eclipse.virgo.kernel.osgi.framework.InstrumentableClassLoader;
+import org.eclipse.virgo.kernel.userregion.internal.equinox.EquinoxOsgiFramework;
+import org.eclipse.virgo.kernel.userregion.internal.equinox.KernelBundleClassLoader;
+
+/**
+ */
+public class EquinoxOsgiFrameworkTests extends AbstractOsgiFrameworkLaunchingTests {
+
+    @Override
+    protected String getRepositoryConfigDirectory() {
+        return new File("src/test/resources/config/EquinoxOsgiFrameworkTests").getAbsolutePath();
+    }
+
+    @Test
+    public void testStartAndStop() throws Exception {
+        assertNotNull(this.framework.getBundleContext());
+        assertEquals(Bundle.ACTIVE, this.framework.getBundleContext().getBundle().getState());
+    }
+
+    @Test
+    public void testGetClassBundle() throws Exception {
+        Class<?> c = this.framework.getBundleContext().getBundle().loadClass("org.osgi.framework.Bundle");
+        assertNotNull(c);
+        Bundle b = this.framework.getClassBundle(c);
+        assertNotNull(b);
+        assertEquals(0, b.getBundleId());
+    }
+
+    @Test(expected = BundleClassLoaderUnavailableException.class)
+    public void testGetClassLoaderFromUnresolved() throws Exception {
+        Bundle faultyBundle = this.framework.getBundleContext().installBundle(new File("src/test/resources/EquinoxOsgiFrameworkTests/faulty").toURI().toString());
+        assertEquals(Bundle.INSTALLED, faultyBundle.getState());
+        this.framework.getBundleClassLoader(faultyBundle);
+    }
+
+    @Test
+    public void testLoadClassAndGetClassLoader() throws Exception {
+        Bundle bundle = installSpringCore(this.framework);
+        assertEquals("incorrect bundle loaded", "org.springframework.core", bundle.getSymbolicName());
+        Class<?> cls = bundle.loadClass("org.springframework.core.JdkVersion");
+        assertNotNull(cls);
+        assertTrue(cls.getClassLoader() instanceof KernelBundleClassLoader);
+        assertTrue("classloader is screwed", cls.getClassLoader().toString().contains("org.springframework.core"));
+    }
+
+    @Test
+    public void testAddClassFileTransformer() throws Exception {
+        Bundle bundle = installSpringCore(this.framework);
+        ClassLoader bundleClassLoader = this.framework.getBundleClassLoader(bundle);
+        assertNotNull(bundleClassLoader);
+        InstrumentableClassLoader icl = (InstrumentableClassLoader) bundleClassLoader;
+        final AtomicInteger count = new AtomicInteger(0);
+        icl.addClassFileTransformer(new ClassFileTransformer() {
+
+            public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain,
+                byte[] classfileBuffer) throws IllegalClassFormatException {
+                count.incrementAndGet();
+                return null;
+            }
+
+        });
+        bundle.loadClass("org.springframework.core.JdkVersion");
+        assertEquals(1, count.get());
+    }
+
+    /**
+     * @param osgi
+     * @return
+     * @throws BundleException
+     */
+    private Bundle installSpringCore(EquinoxOsgiFramework osgi) throws BundleException {
+        osgi.getBundleContext().installBundle("file:///" + new File(System.getProperty("user.home") + "/.gradle/caches/modules-2/files-2.1/org.eclipse.virgo.mirrored/org.apache.commons.logging/1.2.0/16f574f7c054451477d7fc9d1f294e22b70a8eba/org.apache.commons.logging-1.2.0.jar").getAbsolutePath());
+        osgi.getBundleContext().installBundle("file:///" + new File(System.getProperty("user.home") + "/.gradle/caches/modules-2/files-2.1/org.eclipse.virgo.mirrored/org.apache.commons.codec/1.10.0/8aff50e99bd7e53f8c4f5fe45c2a63f1d47dd19c/org.apache.commons.codec-1.10.0.jar").getAbsolutePath());
+        return osgi.getBundleContext().installBundle("file:///" + new File(System.getProperty("user.home") + "/.gradle/caches/modules-2/files-2.1/org.eclipse.virgo.mirrored/org.springframework.core/4.2.9.RELEASE/1c660c77b174384012745d391694de1d56f2c19a/org.springframework.core-4.2.9.RELEASE.jar").getAbsolutePath());
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/equinox/KernelBundleClassLoaderTests.java b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/equinox/KernelBundleClassLoaderTests.java
new file mode 100644
index 0000000..c6fcffb
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/equinox/KernelBundleClassLoaderTests.java
@@ -0,0 +1,110 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.equinox;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.net.URL;
+import java.util.Enumeration;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleException;
+
+import org.eclipse.virgo.kernel.osgi.framework.UnableToSatisfyDependenciesException;
+
+/**
+ *
+ */
+public class KernelBundleClassLoaderTests extends AbstractOsgiFrameworkLaunchingTests {
+
+    private Bundle dependant;
+    
+    @Override
+    protected String getRepositoryConfigDirectory() {
+        return new File("src/test/resources/config/KernelBundleClassLoaderTests").getAbsolutePath();
+    }
+
+	/**
+	 * Test method for {@link org.eclipse.virgo.kernel.userregion.internal.equinox.KernelBundleClassLoader#getResources(java.lang.String)}.
+	 * @throws UnableToSatisfyDependenciesException 
+	 * @throws Exception 
+	 */
+	@Test
+	public void testGetResourcesStringFromBundle() throws Exception {
+        Enumeration<URL> resources = this.dependant.getResources("/META-INF/GET_ME");
+        
+        assertNotNull(resources);
+        assertTrue(resources.hasMoreElements());
+        assertTrue(resources.nextElement().getPath().endsWith("bundlefile!/META-INF/GET_ME"));
+        
+	}
+
+	/**
+	 * Test method for {@link org.eclipse.virgo.kernel.userregion.internal.equinox.KernelBundleClassLoader#getResource(java.lang.String)}.
+	 * @throws UnableToSatisfyDependenciesException 
+	 * @throws Exception 
+	 */
+	@Test
+	public void testGetResourceStringFromBundle() throws Exception {
+        URL resource = this.dependant.getResource("/META-INF/GET_ME");
+
+        assertNotNull(resource);
+        assertTrue(resource.getPath().endsWith("bundlefile!/META-INF/GET_ME"));
+	}
+
+	/**
+	 * Test method for {@link org.eclipse.virgo.kernel.userregion.internal.equinox.KernelBundleClassLoader#getResources(java.lang.String)}.
+	 * @throws UnableToSatisfyDependenciesException 
+	 * @throws Exception 
+	 */
+	@Test
+	public void testGetResourcesStringFromBundleClassLoader() throws Exception {
+        Bundle bundle = this.dependant;
+        ClassLoader loader = this.framework.getBundleClassLoader(bundle);
+        Enumeration<URL> resources = loader.getResources("/META-INF/GET_ME");
+        
+        assertNotNull(resources);
+        assertTrue(resources.hasMoreElements());
+        assertTrue(resources.nextElement().getPath().endsWith("bundlefile!/META-INF/GET_ME"));
+        
+	}
+
+	/**
+	 * Test method for {@link org.eclipse.virgo.kernel.userregion.internal.equinox.KernelBundleClassLoader#getResource(java.lang.String)}.
+	 * @throws UnableToSatisfyDependenciesException 
+	 * @throws Exception 
+	 */
+	@Test
+	public void testGetResourceStringFromBundleClassLoader() throws Exception {
+        ClassLoader loader = this.framework.getBundleClassLoader(this.dependant);
+        URL resource = loader.getResource("/META-INF/GET_ME");
+
+        assertNotNull(resource);
+        assertTrue(resource.getPath().endsWith("bundlefile!/META-INF/GET_ME"));
+	}
+	
+
+	@Before
+	public void installDependant() throws BundleException {
+	    this.dependant = this.framework.getBundleContext().installBundle(new File("src/test/resources/KernelBundleClassLoaderTests/dependant.jar").toURI().toString());
+	}
+	
+	@After
+	public void uninstallDependant() throws BundleException {
+	    this.dependant.uninstall();
+	}
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/equinox/LoadTimeWeavingTests.java b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/equinox/LoadTimeWeavingTests.java
new file mode 100644
index 0000000..5570fa0
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/equinox/LoadTimeWeavingTests.java
@@ -0,0 +1,131 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.equinox;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertSame;
+
+import java.io.File;
+import java.lang.instrument.ClassFileTransformer;
+import java.lang.instrument.IllegalClassFormatException;
+import java.security.ProtectionDomain;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.eclipse.virgo.kernel.userregion.internal.equinox.KernelBundleClassLoader;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+
+
+/**
+ */
+public class LoadTimeWeavingTests extends AbstractOsgiFrameworkLaunchingTests {
+
+    private static final String DOMAIN_TYPE_NAME = "ltw.domain.DomainType";
+
+    private static final String A_TYPE_NAME = "app.a.A";
+
+    private static final String B_TYPE_NAME = "app.b.B";
+
+    private Bundle emBundle;
+
+    private Bundle includeBundle;
+    
+    @Override
+    protected String getRepositoryConfigDirectory() {
+        return new File("src/test/resources/config/LoadTimeWeavingTests").getAbsolutePath();
+    }
+    
+    @Before
+    public void setUp() throws Exception {
+        super.setUp();        
+        
+        this.framework.getBundleContext().installBundle(new File("src/test/resources/ltw/ltw-domain.jar").toURI().toString());
+        this.includeBundle = this.framework.getBundleContext().installBundle(new File("src/test/resources/ltw/ltw-include.jar").toURI().toString());
+        this.emBundle = this.framework.getBundleContext().installBundle(new File("src/test/resources/ltw/ltw-em.jar").toURI().toString());
+    }
+
+    @Test public void instrumentPackageIncludes() throws ClassNotFoundException {
+        KernelBundleClassLoader incClassLoader = (KernelBundleClassLoader) this.framework.getBundleClassLoader(this.includeBundle);
+        assertNotNull(incClassLoader);
+
+        ClassLoader throwAway = incClassLoader.createThrowAway();
+        assertEquals(throwAway, throwAway.loadClass(A_TYPE_NAME).getClassLoader());
+        assertEquals(incClassLoader, throwAway.loadClass(B_TYPE_NAME).getClassLoader());
+    }
+
+    @Test public void throwawayAcrossBundles() throws ClassNotFoundException {
+        KernelBundleClassLoader emClassLoader = (KernelBundleClassLoader) this.framework.getBundleClassLoader(this.emBundle);
+        assertNotNull(emClassLoader);
+        ClassLoader throwAway = emClassLoader.createThrowAway();
+        Class<?> domainTypeClass = throwAway.loadClass(DOMAIN_TYPE_NAME);
+        assertNotNull(domainTypeClass);
+        assertNotSame(emClassLoader.loadClass(DOMAIN_TYPE_NAME), domainTypeClass);
+        assertSame(domainTypeClass, throwAway.loadClass(DOMAIN_TYPE_NAME));
+    }
+
+    @Test public void weaveAcrossBundles() throws ClassNotFoundException {
+        KernelBundleClassLoader emClassLoader = (KernelBundleClassLoader) this.framework.getBundleClassLoader(this.emBundle);
+        assertNotNull(emClassLoader);
+        final AtomicInteger counter = new AtomicInteger(0);
+        emClassLoader.addClassFileTransformer(new ClassFileTransformer() {
+
+            public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain,
+                byte[] classfileBuffer) throws IllegalClassFormatException {
+                counter.incrementAndGet();
+                return null;
+            }
+
+        });
+        Class<?> domainTypeClass = emClassLoader.loadClass(DOMAIN_TYPE_NAME);
+        assertNotNull(domainTypeClass);
+        assertEquals(1, counter.get());
+    }
+
+    @Test public void testRefreshWithNoPropagation() throws Exception {
+        Class<?> before = this.emBundle.loadClass(DOMAIN_TYPE_NAME);
+        this.framework.refresh(this.emBundle);        
+        waitUntilResolved(3000);
+        assertSame(this.emBundle.loadClass(DOMAIN_TYPE_NAME), before);
+    }
+
+    @Test public void testRefreshWithPropagation() throws Exception {
+        KernelBundleClassLoader emClassLoader = (KernelBundleClassLoader) this.framework.getBundleClassLoader(this.emBundle);
+        emClassLoader.addClassFileTransformer(new ClassFileTransformer() {
+
+            public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain,
+                byte[] classfileBuffer) throws IllegalClassFormatException {
+                return null;
+            }
+
+        });
+        Class<?> before = this.emBundle.loadClass(DOMAIN_TYPE_NAME);
+        this.framework.refresh(this.emBundle);
+        waitUntilResolved(3000);
+        assertNotSame(this.emBundle.loadClass(DOMAIN_TYPE_NAME), before);
+    }
+
+    private void waitUntilResolved(int maxWaitInMillis) {
+        boolean resolved = this.emBundle.getState() == Bundle.RESOLVED;
+        while (!resolved && maxWaitInMillis>0) {
+            try {
+                Thread.sleep(50); maxWaitInMillis-=50;
+            } catch (InterruptedException e) {
+                continue;
+            }
+            resolved = this.emBundle.getState() == Bundle.RESOLVED;
+        }
+    }
+}
+
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/equinox/ManifestUtils.java b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/equinox/ManifestUtils.java
new file mode 100644
index 0000000..4820342
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/equinox/ManifestUtils.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.equinox;
+
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+
+import org.eclipse.virgo.util.io.FileCopyUtils;
+
+/**
+ * Utility class for extracting a {@link Reader} for manifest data in a JAR file and in exploded JAR directories.
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.
+ * 
+ */
+public final class ManifestUtils {
+
+    private static final String MANIFEST_DIRECTORY_LOCATION = "META-INF" + File.separator + "MANIFEST.MF";
+
+    private static final String MANIFEST_ENTRY = "META-INF/MANIFEST.MF";
+
+    /**
+     * Creates a {@link Reader} for the manifest in the supplied exploded JAR directory.
+     * 
+     * @param directory the exploded JAR directory.
+     * @return the <code>Reader</code> or <code>null</code> if the manifest cannot be found.
+     */
+    public static final Reader manifestReaderFromExplodedDirectory(File directory) {
+        if (directory == null || !directory.isDirectory()) {
+            throw new IllegalArgumentException("Must supply a valid directory");
+        }
+        try {
+            File manifestFile = new File(directory.getAbsolutePath() + File.separator + MANIFEST_DIRECTORY_LOCATION);
+            if (manifestFile.exists()) {
+                return new FileReader(manifestFile);
+            } else {
+                return null;
+            }
+        } catch (IOException e) {
+            throw new RuntimeException("Unable to read MANIFEST for exploded directory '" + directory.getAbsolutePath() + "'.", e);
+        }
+    }
+
+    /**
+     * Creates a {@link Reader} for the manifest in the supplied JAR file.
+     * 
+     * @param file the JAR file.
+     * @return the <code>Reader</code> or <code>null</code> if the manifest cannot be found.
+     */
+    public static final Reader manifestReaderFromJar(File file) {
+        JarFile jar = null;
+        try {
+            jar = new JarFile(file);
+            JarEntry entry = jar.getJarEntry(MANIFEST_ENTRY);
+            if (entry != null) {
+                StringWriter writer = new StringWriter();
+                FileCopyUtils.copy(new InputStreamReader(jar.getInputStream(entry)), writer);
+                jar.close();
+                return new StringReader(writer.toString());
+            } else {
+                return null;
+            }
+        } catch (Exception e) {
+            throw new RuntimeException("Cannot read MANIFEST.MF from jar '" + file.getAbsolutePath() + "'.", e);
+        } finally {
+            if (jar != null) {
+                try {
+                    jar.close();
+                } catch (IOException ioe) {
+                    throw new RuntimeException("Failed to close jar '" + file.getAbsolutePath() + "'.", ioe);
+                }
+            }
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/equinox/StubHashGenerator.java b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/equinox/StubHashGenerator.java
new file mode 100644
index 0000000..375d3d3
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/equinox/StubHashGenerator.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.equinox;
+
+import java.io.File;
+
+import org.eclipse.virgo.repository.HashGenerator;
+import org.eclipse.virgo.repository.builder.ArtifactDescriptorBuilder;
+
+public class StubHashGenerator implements HashGenerator {
+
+    public void generateHash(ArtifactDescriptorBuilder artifactDescriptorBuilder, File artifactFile) {
+        // Do nothing
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/equinox/TestUtils.java b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/equinox/TestUtils.java
new file mode 100644
index 0000000..00e7d6c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/equinox/TestUtils.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.equinox;
+
+import java.io.File;
+
+/**
+ */
+public class TestUtils {
+
+    public static boolean deleteRecursively(File root) {
+        if (root.exists()) {
+            if (root.isDirectory()) {
+                File[] children = root.listFiles();
+                if (children == null) {
+					throw new IllegalStateException("Failed to list files in '" + root + "'.");
+				}
+                for (File file : children) {
+                    deleteRecursively(file);
+                }
+            }
+            return root.delete();
+        }
+        return false;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/equinox/UsesAnalyserTests.java b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/equinox/UsesAnalyserTests.java
new file mode 100644
index 0000000..047ae0e
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/equinox/UsesAnalyserTests.java
@@ -0,0 +1,162 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.equinox;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.io.File;
+
+import org.eclipse.osgi.internal.baseadaptor.StateManager;
+import org.eclipse.osgi.service.resolver.ResolverError;
+import org.eclipse.osgi.service.resolver.State;
+import org.eclipse.virgo.kernel.userregion.internal.equinox.UsesAnalyser;
+import org.eclipse.virgo.kernel.userregion.internal.equinox.UsesAnalyser.AnalysedUsesConflict;
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleException;
+
+import org.osgi.framework.Version;
+
+
+/**
+ */
+public class UsesAnalyserTests extends AbstractOsgiFrameworkLaunchingTests {
+
+    @Override
+    protected String getRepositoryConfigDirectory() {
+        return new File("src/test/resources/config/UsesAnalyserTests").getAbsolutePath();
+    }
+
+    @Test
+    public void testDependentConstraints() throws Exception {
+        Bundle p = install("dependent/bundles/p");
+        install("dependent/bundles/q");
+        install("dependent/bundles/r1");
+        install("dependent/bundles/r2");
+        install("dependent/bundles/s1");
+        install("dependent/bundles/s2");
+
+        try {
+            p.start();
+        } catch (BundleException ex) {
+        }
+
+        State systemState = ((StateManager) this.platformAdmin).getSystemState();
+        
+        UsesAnalyser analyser = new UsesAnalyser();
+        
+        ResolverError[] resolverErrors = analyser.getUsesResolverErrors(systemState, systemState.getBundle(p.getBundleId()));
+        assertNotNull("No uses errors found for bundle '" + p + "'.", resolverErrors);
+        
+        AnalysedUsesConflict[] usesConflicts = analyser.getUsesConflicts(systemState, resolverErrors[0]);
+        assertNotNull("No conflicts found for bundle '" + p + "'.", usesConflicts);
+        printUsesConflicts(usesConflicts);
+ 
+        assertEquals("No, or more than one conflict discovered.", 1, usesConflicts.length);
+        
+        assertEquals("q",usesConflicts[0].getUsesRootPackage().getName());
+
+        assertEquals("r",usesConflicts[0].getPackage().getName());
+        assertEquals(new Version("1.1.0"), usesConflicts[0].getPackage().getVersion());
+
+        assertEquals("r",usesConflicts[0].getConflictingPackage().getName());
+        assertEquals(new Version("1.0.0"), usesConflicts[0].getConflictingPackage().getVersion());
+    }
+    
+    @Test
+    public void testInstallOrder() throws Exception {
+        install("install/bundles/s1");
+        install("install/bundles/s2");
+        Bundle q = install("install/bundles/q");
+        install("install/bundles/r1");
+        q.start();
+
+        Bundle p = install("install/bundles/p");
+        install("install/bundles/r2");
+        try {
+            p.start();
+        } catch (BundleException ex) {
+        }
+
+        State systemState = ((StateManager) this.platformAdmin).getSystemState();
+        UsesAnalyser analyser = new UsesAnalyser();
+        
+        ResolverError[] resolverErrors = analyser.getUsesResolverErrors(systemState, systemState.getBundle(p.getBundleId()));
+        assertNotNull("No uses errors found for bundle '" + p + "'.", resolverErrors);
+
+        AnalysedUsesConflict[] usesConflicts = analyser.getUsesConflicts(systemState, resolverErrors[0]);
+
+        assertNotNull("No conflicts found for bundle '" + p + "'.", usesConflicts);
+        printUsesConflicts(usesConflicts);
+
+        assertEquals("No, or more than one conflict discovered.", 1, usesConflicts.length);
+
+        assertEquals("q",usesConflicts[0].getUsesRootPackage().getName());
+
+        assertEquals("r",usesConflicts[0].getPackage().getName());
+        assertEquals(new Version("1.1.0"), usesConflicts[0].getPackage().getVersion());
+
+        assertEquals("r",usesConflicts[0].getConflictingPackage().getName());
+        assertEquals(new Version("1.0.0"), usesConflicts[0].getConflictingPackage().getVersion());
+        
+    }
+    
+    @Test 
+    public void transitiveUsesConstraint() throws Exception {
+        install("transitiveconstraint/tmD.jar");
+        install("transitiveconstraint/tmC.jar");
+        install("transitiveconstraint/tmB.jar");
+        Bundle a = install("transitiveconstraint/tmA.jar");
+        try {
+            a.start();
+        } catch (BundleException ignored) {
+        }
+
+        State systemState = ((StateManager) this.platformAdmin).getSystemState();
+        UsesAnalyser analyser = new UsesAnalyser();
+        
+        ResolverError[] resolverErrors = analyser.getUsesResolverErrors(systemState, systemState.getBundle(a.getBundleId()));
+        assertNotNull("No uses errors found for bundle '" + a + "'.", resolverErrors);
+
+        AnalysedUsesConflict[] usesConflicts = analyser.getUsesConflicts(systemState, resolverErrors[0]);
+
+        assertNotNull("No conflicts found for bundle '" + a + "'.", usesConflicts);
+        printUsesConflicts(usesConflicts);
+
+        assertEquals("No, or more than one conflict discovered.", 1, usesConflicts.length);
+
+        assertEquals("p",usesConflicts[0].getUsesRootPackage().getName());
+
+        assertEquals("r",usesConflicts[0].getPackage().getName());
+        assertEquals(new Version("1.0.0"), usesConflicts[0].getPackage().getVersion());
+
+        assertEquals("r",usesConflicts[0].getConflictingPackage().getName());
+        assertEquals(new Version("0.0.0"), usesConflicts[0].getConflictingPackage().getVersion());
+    }
+
+    private static final void printUsesConflicts(AnalysedUsesConflict[] usesConflicts) {
+        int count = 0;
+        for (AnalysedUsesConflict a : usesConflicts) {
+            System.out.println("AnalysedUsesConflict element " + (count++));
+            for (String s : a.getConflictStatement()) {
+                System.out.println("  " + s);
+            }
+        }
+    }
+
+    private Bundle install(String subPath) throws BundleException {
+        String fullPath = "src/test/resources/uat/" + subPath;
+        String location = "reference:file:/" + new File(fullPath).getAbsolutePath();
+        return this.framework.getBundleContext().installBundle(location);
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/importexpansion/ImportExpansionHandlerTests.java b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/importexpansion/ImportExpansionHandlerTests.java
new file mode 100644
index 0000000..caf45cc
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/importexpansion/ImportExpansionHandlerTests.java
@@ -0,0 +1,814 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.importexpansion;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.virgo.kernel.artifact.bundle.BundleBridge;
+import org.eclipse.virgo.kernel.artifact.library.LibraryBridge;
+import org.eclipse.virgo.kernel.osgi.framework.UnableToSatisfyBundleDependenciesException;
+import org.eclipse.virgo.kernel.osgi.framework.UnableToSatisfyDependenciesException;
+import org.eclipse.virgo.kernel.userregion.internal.equinox.StubHashGenerator;
+import org.eclipse.virgo.medic.test.eventlog.LoggedEvent;
+import org.eclipse.virgo.medic.test.eventlog.MockEventLogger;
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+import org.eclipse.virgo.repository.ArtifactGenerationException;
+import org.eclipse.virgo.repository.Attribute;
+import org.eclipse.virgo.repository.Query;
+import org.eclipse.virgo.repository.Repository;
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifestFactory;
+import org.eclipse.virgo.util.osgi.manifest.ImportedBundle;
+import org.eclipse.virgo.util.osgi.manifest.ImportedLibrary;
+import org.eclipse.virgo.util.osgi.manifest.ImportedPackage;
+import org.eclipse.virgo.util.osgi.manifest.Resolution;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Version;
+
+/**
+ */
+public class ImportExpansionHandlerTests {
+
+    private StubRepository repository = new StubRepository();
+
+    private static Set<String> packagesExportedBySystemBundle = new HashSet<String>();
+
+    static {
+        packagesExportedBySystemBundle.add("javax.crypto.spec");
+        packagesExportedBySystemBundle.add("javax.imageio");
+        packagesExportedBySystemBundle.add("javax.imageio.event");
+    }
+
+    @Before
+    public void populateRepository() throws ArtifactGenerationException {
+        BundleBridge bundleBridge = new BundleBridge(new StubHashGenerator());
+        LibraryBridge libraryBridge = new LibraryBridge(new StubHashGenerator());
+
+        this.repository.addArtifactDescriptor(bundleBridge.generateArtifactDescriptor(new File(System.getProperty("user.home") + "/.gradle/caches/modules-2/files-2.1/org.eclipse.virgo.mirrored/org.springframework.core/4.2.9.RELEASE/1c660c77b174384012745d391694de1d56f2c19a/org.springframework.core-4.2.9.RELEASE.jar")));
+        this.repository.addArtifactDescriptor(bundleBridge.generateArtifactDescriptor(new File(System.getProperty("user.home") + "/.gradle/caches/modules-2/files-2.1/org.eclipse.virgo.mirrored/org.springframework.beans/4.2.9.RELEASE/6895116b764a2820b829cef9dd1b3833b7cdfcaa/org.springframework.beans-4.2.9.RELEASE.jar")));
+        this.repository.addArtifactDescriptor(bundleBridge.generateArtifactDescriptor(new File("src/test/resources/silht/bundles/fragmentOne")));
+        this.repository.addArtifactDescriptor(bundleBridge.generateArtifactDescriptor(new File("src/test/resources/silht/bundles/fragmentTwo")));
+        this.repository.addArtifactDescriptor(bundleBridge.generateArtifactDescriptor(new File("src/test/resources/silht/bundles/fragmentThree")));
+        this.repository.addArtifactDescriptor(bundleBridge.generateArtifactDescriptor(new File("src/test/resources/silht/bundles/noexports")));
+        this.repository.addArtifactDescriptor(bundleBridge.generateArtifactDescriptor(new File("src/test/resources/silht/bundles/fragmentwithnoexports")));
+        this.repository.addArtifactDescriptor(bundleBridge.generateArtifactDescriptor(new File("src/test/resources/silht/bundles/host")));
+        this.repository.addArtifactDescriptor(bundleBridge.generateArtifactDescriptor(new File("src/test/resources/silht/bundles/overlapper")));
+        this.repository.addArtifactDescriptor(bundleBridge.generateArtifactDescriptor(new File("src/test/resources/silht/bundles/multi-version-export")));
+        this.repository.addArtifactDescriptor(libraryBridge.generateArtifactDescriptor(new File("src/test/resources/silht/libraries/spring.libd")));
+        this.repository.addArtifactDescriptor(libraryBridge.generateArtifactDescriptor(new File("src/test/resources/silht/libraries/com.foo.libd")));
+        this.repository.addArtifactDescriptor(libraryBridge.generateArtifactDescriptor(new File("src/test/resources/silht/libraries/missing.optional.bundle.libd")));
+    }
+
+    @Test
+    public void basicImportBundle() throws UnableToSatisfyDependenciesException {
+        List<Object> mocks = new ArrayList<Object>();
+
+        ImportedBundle bundleImport = createAndStoreMock(ImportedBundle.class, mocks);
+        expect(bundleImport.getBundleSymbolicName()).andReturn("org.springframework.core").atLeastOnce();
+        expect(bundleImport.getVersion()).andReturn(new VersionRange("[4.2,5)")).atLeastOnce();
+        expect(bundleImport.isApplicationImportScope()).andReturn(false).atLeastOnce();
+        expect(bundleImport.getResolution()).andReturn(Resolution.MANDATORY).atLeastOnce();
+
+        ImportExpansionHandler handler = new ImportExpansionHandler(repository, packagesExportedBySystemBundle, new MockEventLogger());
+
+        replayMocks(mocks);
+
+        BundleManifest bundleManifest = BundleManifestFactory.createBundleManifest();
+
+        handler.expandImports(new ArrayList<ImportedLibrary>(), Arrays.asList(new ImportedBundle[] { bundleImport }), bundleManifest);
+
+        verifyMocks(mocks);
+
+        assertTrue(bundleManifest.getImportPackage().getImportedPackages().size() > 19);
+
+        List<ImportedPackage> packageImports = bundleManifest.getImportPackage().getImportedPackages();
+        for (ImportedPackage packageImport : packageImports) {
+            Map<String, String> attributes = packageImport.getAttributes();
+            assertTrue("org.springframework.core".equals(attributes.get("bundle-symbolic-name")));
+            assertEquals(new VersionRange("[4.2.9.RELEASE,4.2.9.RELEASE]"), new VersionRange(attributes.get("bundle-version")));
+        }
+    }
+
+    @Test
+    public void basicImportLibrary() throws UnableToSatisfyDependenciesException {
+
+        List<Object> mocks = new ArrayList<Object>();
+
+        ImportedLibrary libraryImport = createAndStoreMock(ImportedLibrary.class, mocks);
+
+        expect(libraryImport.getLibrarySymbolicName()).andReturn("org.springframework").atLeastOnce();
+        expect(libraryImport.getVersion()).andReturn(new VersionRange("[4.2,5)")).atLeastOnce();
+        expect(libraryImport.getResolution()).andReturn(Resolution.MANDATORY).anyTimes();
+
+        ImportExpansionHandler handler = new ImportExpansionHandler(repository, packagesExportedBySystemBundle, new MockEventLogger());
+
+        replayMocks(mocks);
+
+        BundleManifest bundleManifest = BundleManifestFactory.createBundleManifest();
+
+        handler.expandImports(Arrays.asList(new ImportedLibrary[] { libraryImport }), Arrays.asList(new ImportedBundle[0]), bundleManifest);
+
+        verifyMocks(mocks);
+
+        assertTrue(bundleManifest.getImportPackage().getImportedPackages().size() > 33);
+
+        List<ImportedPackage> packageImports = bundleManifest.getImportPackage().getImportedPackages();
+        for (ImportedPackage packageImport : packageImports) {
+            Map<String, String> attributes = packageImport.getAttributes();
+            if (packageImport.getPackageName().startsWith("org.springframework.beans")) {
+                assertTrue("org.springframework.beans".equals(attributes.get("bundle-symbolic-name")));
+            } else {
+                assertTrue("org.springframework.core".equals(attributes.get("bundle-symbolic-name")));
+            }
+            assertEquals(new VersionRange("[4.2.9.RELEASE,4.2.9.RELEASE]"), new VersionRange(attributes.get("bundle-version")));
+        }
+
+    }
+
+    @Test
+    public void basicImportFragmentBundle() throws UnableToSatisfyDependenciesException {
+        List<Object> mocks = new ArrayList<Object>();
+
+        ImportedBundle bundleImport = createAndStoreMock(ImportedBundle.class, mocks);
+        expect(bundleImport.getBundleSymbolicName()).andReturn("com.foo.fragment.one").atLeastOnce();
+        expect(bundleImport.getVersion()).andReturn(new VersionRange("[1,1]")).atLeastOnce();
+        expect(bundleImport.isApplicationImportScope()).andReturn(false).atLeastOnce();
+        expect(bundleImport.getResolution()).andReturn(Resolution.MANDATORY).anyTimes();
+
+        ImportExpansionHandler handler = new ImportExpansionHandler(repository, packagesExportedBySystemBundle, new MockEventLogger());
+
+        replayMocks(mocks);
+
+        BundleManifest bundleManifest = BundleManifestFactory.createBundleManifest();
+
+        handler.expandImports(Arrays.asList(new ImportedLibrary[0]), Arrays.asList(new ImportedBundle[] { bundleImport }), bundleManifest);
+
+        verifyMocks(mocks);
+
+        assertEquals(1, bundleManifest.getImportPackage().getImportedPackages().size());
+
+        ImportedPackage packageImport = bundleManifest.getImportPackage().getImportedPackages().get(0);
+        Map<String, String> attributes = packageImport.getAttributes();
+        assertEquals("com.foo.host", attributes.get("bundle-symbolic-name"));
+        assertEquals(new VersionRange("[1.0, 2.0)"), new VersionRange(attributes.get("bundle-version")));
+        assertEquals("com.foo.host", packageImport.getPackageName());
+    }
+
+    @Test
+    public void basicImportFragmentBundleSpecifyingExactBundleVersionRange() throws UnableToSatisfyDependenciesException {
+        List<Object> mocks = new ArrayList<Object>();
+
+        ImportedBundle bundleImport = createAndStoreMock(ImportedBundle.class, mocks);
+        expect(bundleImport.getBundleSymbolicName()).andReturn("com.foo.fragment.two").atLeastOnce();
+        expect(bundleImport.getVersion()).andReturn(new VersionRange("[3,3]")).atLeastOnce();
+        expect(bundleImport.isApplicationImportScope()).andReturn(false).atLeastOnce();
+        expect(bundleImport.getResolution()).andReturn(Resolution.MANDATORY).anyTimes();
+
+        ImportExpansionHandler handler = new ImportExpansionHandler(repository, packagesExportedBySystemBundle, new MockEventLogger());
+
+        replayMocks(mocks);
+
+        BundleManifest bundleManifest = BundleManifestFactory.createBundleManifest();
+
+        handler.expandImports(Arrays.asList(new ImportedLibrary[0]), Arrays.asList(new ImportedBundle[] { bundleImport }), bundleManifest);
+
+        verifyMocks(mocks);
+    }
+
+    @Test
+    public void basicImportFragmentBundleWithNoFragmentHostBundleVersion() throws UnableToSatisfyDependenciesException {
+        List<Object> mocks = new ArrayList<Object>();
+
+        ImportedBundle bundleImport = createAndStoreMock(ImportedBundle.class, mocks);
+        expect(bundleImport.getBundleSymbolicName()).andReturn("com.foo.fragment.three").atLeastOnce();
+        expect(bundleImport.getVersion()).andReturn(new VersionRange("[0,3]")).atLeastOnce();
+        expect(bundleImport.isApplicationImportScope()).andReturn(false).atLeastOnce();
+        expect(bundleImport.getResolution()).andReturn(Resolution.MANDATORY).anyTimes();
+
+        ImportExpansionHandler handler = new ImportExpansionHandler(repository, packagesExportedBySystemBundle, new MockEventLogger());
+
+        replayMocks(mocks);
+
+        BundleManifest bundleManifest = BundleManifestFactory.createBundleManifest();
+
+        handler.expandImports(Arrays.asList(new ImportedLibrary[0]), Arrays.asList(new ImportedBundle[] { bundleImport }), bundleManifest);
+
+        verifyMocks(mocks);
+
+        assertEquals(1, bundleManifest.getImportPackage().getImportedPackages().size());
+
+        ImportedPackage packageImport = bundleManifest.getImportPackage().getImportedPackages().get(0);
+        Map<String, String> attributes = packageImport.getAttributes();
+        assertEquals("com.foo.host", attributes.get("bundle-symbolic-name"));
+        assertEquals(new VersionRange("0"), new VersionRange(attributes.get("bundle-version")));
+        assertEquals("com.foo.fragment.three", packageImport.getPackageName());
+        assertEquals(VersionRange.createExactRange(new Version("1")), packageImport.getVersion());
+    }
+
+    @Test(expected = UnableToSatisfyBundleDependenciesException.class)
+    public void importLibraryReferringToNonExistentBundle() throws UnableToSatisfyDependenciesException, IOException {
+
+        List<Object> mocks = new ArrayList<Object>();
+
+        ImportedLibrary libraryImport = createAndStoreMock(ImportedLibrary.class, mocks);
+
+        expect(libraryImport.getLibrarySymbolicName()).andReturn("bad.bundle").atLeastOnce();
+        expect(libraryImport.getVersion()).andReturn(new VersionRange("[9,9]")).atLeastOnce();
+        expect(libraryImport.getResolution()).andReturn(Resolution.MANDATORY).anyTimes();
+
+        ImportExpansionHandler handler = new ImportExpansionHandler(repository, packagesExportedBySystemBundle, new MockEventLogger());
+
+        replayMocks(mocks);
+
+        BundleManifest bundleManifest = BundleManifestFactory.createBundleManifest(new StringReader(
+            "Manifest-Version: 1.0\nBundle-SymbolicName: test.bundle"));
+
+        handler.expandImports(Arrays.asList(new ImportedLibrary[] { libraryImport }), Arrays.asList(new ImportedBundle[0]), bundleManifest);
+    }
+
+    @Test
+    public void optionalImportBundle() throws UnableToSatisfyDependenciesException {
+        List<Object> mocks = new ArrayList<Object>();
+
+        ImportedBundle bundleImport = createAndStoreMock(ImportedBundle.class, mocks);
+        expect(bundleImport.getBundleSymbolicName()).andReturn("org.springframework.dosnt.exist").atLeastOnce();
+        expect(bundleImport.getVersion()).andReturn(new VersionRange("[6.5,7.0)")).atLeastOnce();
+        expect(bundleImport.isApplicationImportScope()).andReturn(false).anyTimes();
+        expect(bundleImport.getResolution()).andReturn(Resolution.OPTIONAL).anyTimes();
+
+        ImportExpansionHandler handler = new ImportExpansionHandler(repository, packagesExportedBySystemBundle, new MockEventLogger());
+
+        replayMocks(mocks);
+
+        BundleManifest bundleManifest = BundleManifestFactory.createBundleManifest();
+
+        handler.expandImports(Arrays.asList(new ImportedLibrary[0]), Arrays.asList(new ImportedBundle[] { bundleImport }), bundleManifest);
+
+        verifyMocks(mocks);
+
+        assertTrue("" + bundleManifest.getImportPackage().getImportedPackages().size(),
+            bundleManifest.getImportPackage().getImportedPackages().size() == 0);
+    }
+
+    @Test
+    public void optionalImportLibrary() throws UnableToSatisfyDependenciesException {
+
+        List<Object> mocks = new ArrayList<Object>();
+
+        ImportedLibrary libraryImport = createAndStoreMock(ImportedLibrary.class, mocks);
+
+        expect(libraryImport.getLibrarySymbolicName()).andReturn("org.springframework.dosnt.exist").atLeastOnce();
+        expect(libraryImport.getVersion()).andReturn(new VersionRange("[6.5,7.0)")).atLeastOnce();
+        expect(libraryImport.getResolution()).andReturn(Resolution.OPTIONAL).atLeastOnce();
+
+        ImportExpansionHandler handler = new ImportExpansionHandler(repository, packagesExportedBySystemBundle, new MockEventLogger());
+
+        replayMocks(mocks);
+
+        BundleManifest bundleManifest = BundleManifestFactory.createBundleManifest();
+
+        handler.expandImports(Arrays.asList(new ImportedLibrary[] { libraryImport }), Arrays.asList(new ImportedBundle[0]), bundleManifest);
+
+        verifyMocks(mocks);
+
+        assertTrue(bundleManifest.getImportPackage().getImportedPackages().size() == 0);
+    }
+
+    @Test(expected = UnableToSatisfyDependenciesException.class)
+    public void optionalImportLibraryException() throws UnableToSatisfyDependenciesException {
+
+        List<Object> mocks = new ArrayList<Object>();
+
+        ImportedLibrary libraryImport = createAndStoreMock(ImportedLibrary.class, mocks);
+
+        expect(libraryImport.getLibrarySymbolicName()).andReturn("org.springframework.dosnt.exist").atLeastOnce();
+        expect(libraryImport.getVersion()).andReturn(new VersionRange("[6.5,7.0)")).atLeastOnce();
+        expect(libraryImport.getResolution()).andReturn(Resolution.MANDATORY).atLeastOnce();
+
+        ImportExpansionHandler handler = new ImportExpansionHandler(repository, packagesExportedBySystemBundle, new MockEventLogger());
+
+        replayMocks(mocks);
+
+        BundleManifest bundleManifest = BundleManifestFactory.createBundleManifest();
+
+        handler.expandImports(Arrays.asList(new ImportedLibrary[] { libraryImport }), Arrays.asList(new ImportedBundle[0]), bundleManifest);
+    }
+
+    /**
+     * Test the expansion of the following import:
+     *
+     * Import-Library: com.foo;bundle-version="[1.0,2.0)"
+     *
+     * @throws UnableToSatisfyDependenciesException
+     */
+    @Test
+    public void importLibraryWithFragment() throws UnableToSatisfyDependenciesException {
+        List<Object> mocks = new ArrayList<Object>();
+
+        ImportedLibrary libraryImport = createAndStoreMock(ImportedLibrary.class, mocks);
+        expect(libraryImport.getLibrarySymbolicName()).andReturn("com.foo").atLeastOnce();
+        expect(libraryImport.getVersion()).andReturn(new VersionRange("[1.0,2.0)")).atLeastOnce();
+        expect(libraryImport.getResolution()).andReturn(Resolution.MANDATORY).anyTimes();
+
+        ImportExpansionHandler handler = new ImportExpansionHandler(repository, packagesExportedBySystemBundle, new MockEventLogger());
+
+        replayMocks(mocks);
+
+        BundleManifest bundleManifest = BundleManifestFactory.createBundleManifest();
+        handler.expandImports(Arrays.asList(new ImportedLibrary[] { libraryImport }), Arrays.asList(new ImportedBundle[0]), bundleManifest);
+
+        verifyMocks(mocks);
+
+        assertImported(bundleManifest, Arrays.asList(new String[] { "com.foo.host", "com.foo.host.a", "com.foo.host.b", "com.foo.fragment.two" }),
+            Arrays.asList(new String[] { "1.5.0", "1.0.0", "1.0.0", "1.0.0" }));
+    }
+
+    @Test(expected = UnableToSatisfyDependenciesException.class)
+    public void incompatibleBundleVersions() throws UnableToSatisfyDependenciesException {
+        List<Object> mocks = new ArrayList<Object>();
+
+        ImportedLibrary libraryImport1 = createAndStoreMock(ImportedLibrary.class, mocks);
+        expect(libraryImport1.getLibrarySymbolicName()).andReturn("org.springframework").atLeastOnce();
+        expect(libraryImport1.getVersion()).andReturn(new VersionRange("[2.5,3.0)")).atLeastOnce();
+        expect(libraryImport1.getResolution()).andReturn(Resolution.MANDATORY).atLeastOnce();
+
+        ImportedLibrary libraryImport2 = createAndStoreMock(ImportedLibrary.class, mocks);
+        expect(libraryImport2.getLibrarySymbolicName()).andReturn("org.springframework").atLeastOnce();
+        expect(libraryImport2.getVersion()).andReturn(new VersionRange("[2.0,2.5)")).atLeastOnce();
+        expect(libraryImport2.getResolution()).andReturn(Resolution.MANDATORY).atLeastOnce();
+
+        ImportExpansionHandler handler = new ImportExpansionHandler(repository, packagesExportedBySystemBundle, new MockEventLogger());
+
+        replayMocks(mocks);
+
+        BundleManifest bundleManifest = BundleManifestFactory.createBundleManifest();
+        try {
+            handler.expandImports(Arrays.asList(new ImportedLibrary[] { libraryImport1, libraryImport2 }), Arrays.asList(new ImportedBundle[0]),
+                bundleManifest);
+        } catch (UnableToSatisfyDependenciesException e) {
+            throw e;
+        }
+    }
+
+    @Test(expected = UnableToSatisfyDependenciesException.class)
+    public void incompatibleIntersection() throws UnableToSatisfyDependenciesException {
+        List<Object> mocks = new ArrayList<Object>();
+
+        ImportedLibrary libraryImport1 = createAndStoreMock(ImportedLibrary.class, mocks);
+        expect(libraryImport1.getLibrarySymbolicName()).andReturn("com.intersect.one").atLeastOnce();
+        expect(libraryImport1.getVersion()).andReturn(new VersionRange("[1.0,2.0)")).atLeastOnce();
+        expect(libraryImport1.getResolution()).andReturn(Resolution.MANDATORY).atLeastOnce();
+
+        ImportedLibrary libraryImport2 = createAndStoreMock(ImportedLibrary.class, mocks);
+        expect(libraryImport2.getLibrarySymbolicName()).andReturn("com.intersect.two").atLeastOnce();
+        expect(libraryImport2.getVersion()).andReturn(new VersionRange("[1.0,2.0)")).atLeastOnce();
+        expect(libraryImport2.getResolution()).andReturn(Resolution.MANDATORY).atLeastOnce();
+
+        ImportExpansionHandler handler = new ImportExpansionHandler(repository, packagesExportedBySystemBundle, new MockEventLogger());
+
+        replayMocks(mocks);
+
+        BundleManifest bundleManifest = BundleManifestFactory.createBundleManifest();
+        try {
+            handler.expandImports(Arrays.asList(new ImportedLibrary[] { libraryImport1, libraryImport2 }), Arrays.asList(new ImportedBundle[0]),
+                bundleManifest);
+        } catch (UnableToSatisfyDependenciesException e) {
+            throw e;
+        }
+    }
+
+    public void disjointImportedPackageAndImportedLibraryVersionRanges() throws UnableToSatisfyDependenciesException, IOException {
+        List<Object> mocks = new ArrayList<Object>();
+
+        ImportedLibrary libraryImport = createAndStoreMock(ImportedLibrary.class, mocks);
+        expect(libraryImport.getLibrarySymbolicName()).andReturn("org.springframework").atLeastOnce();
+        expect(libraryImport.getVersion()).andReturn(new VersionRange("[2.5,3.0)")).atLeastOnce();
+        expect(libraryImport.getResolution()).andReturn(Resolution.MANDATORY).atLeastOnce();
+
+        ImportExpansionHandler handler = new ImportExpansionHandler(repository, packagesExportedBySystemBundle, new MockEventLogger());
+
+        replayMocks(mocks);
+
+        BundleManifest bundleManifest = BundleManifestFactory.createBundleManifest(new StringReader(
+            "Bundle-SymbolicName: B\nImport-Package: org.springframework.core;version=\"[1,2]\""));
+        handler.expandImports(Arrays.asList(new ImportedLibrary[] { libraryImport }), Arrays.asList(new ImportedBundle[0]), bundleManifest);
+    }
+
+    public void disjointImportedPackageAndImportedBundleVersionRanges() throws UnableToSatisfyDependenciesException, IOException {
+        List<Object> mocks = new ArrayList<Object>();
+
+        ImportedBundle bundleImport = createAndStoreMock(ImportedBundle.class, mocks);
+        expect(bundleImport.getBundleSymbolicName()).andReturn("org.springframework.bundle.spring.core").atLeastOnce();
+        expect(bundleImport.getVersion()).andReturn(new VersionRange("[2.5,3.0)")).atLeastOnce();
+        expect(bundleImport.getResolution()).andReturn(Resolution.MANDATORY).atLeastOnce();
+        expect(bundleImport.isApplicationImportScope()).andReturn(false);
+
+        ImportExpansionHandler handler = new ImportExpansionHandler(repository, packagesExportedBySystemBundle, new MockEventLogger());
+
+        replayMocks(mocks);
+
+        BundleManifest bundleManifest = BundleManifestFactory.createBundleManifest(new StringReader(
+            "Bundle-SymbolicName: B\nImport-Package: org.springframework.core;version=\"[1,2]\""));
+        handler.expandImports(Arrays.asList(new ImportedLibrary[0]), Arrays.asList(new ImportedBundle[] { bundleImport }), bundleManifest);
+    }
+
+    @Test
+    public void packageImportAndImportedBundleVersionRangeIntersection() throws UnableToSatisfyDependenciesException, IOException {
+        List<Object> mocks = new ArrayList<Object>();
+
+        ImportedBundle bundleImport = createAndStoreMock(ImportedBundle.class, mocks);
+        expect(bundleImport.getBundleSymbolicName()).andReturn("org.springframework.core").atLeastOnce();
+        expect(bundleImport.getVersion()).andReturn(new VersionRange("[4.2,5)")).atLeastOnce();
+        expect(bundleImport.getResolution()).andReturn(Resolution.MANDATORY).atLeastOnce();
+        expect(bundleImport.isApplicationImportScope()).andReturn(false);
+
+        ImportExpansionHandler handler = new ImportExpansionHandler(repository, packagesExportedBySystemBundle, new MockEventLogger());
+
+        replayMocks(mocks);
+
+        BundleManifest bundleManifest = BundleManifestFactory.createBundleManifest(new StringReader(
+            "Manifest-Version: 1.0, Bundle-SymbolicName: B\nImport-Package: org.springframework.core;version=\"[4.5,4.6)\""));
+        handler.expandImports(Arrays.asList(new ImportedLibrary[0]), Arrays.asList(new ImportedBundle[] { bundleImport }), bundleManifest);
+
+        verifyMocks(mocks);
+
+        assertTrue(bundleManifest.getImportPackage().getImportedPackages().size() > 19);
+    }
+
+    @Test
+    public void packageImportAndImportedLibraryVersionRangeIntersection() throws UnableToSatisfyDependenciesException, IOException {
+        List<Object> mocks = new ArrayList<Object>();
+
+        ImportedLibrary libraryImport = createAndStoreMock(ImportedLibrary.class, mocks);
+        expect(libraryImport.getLibrarySymbolicName()).andReturn("org.springframework").atLeastOnce();
+        expect(libraryImport.getVersion()).andReturn(new VersionRange("[4.2,5)")).atLeastOnce();
+
+        ImportExpansionHandler handler = new ImportExpansionHandler(repository, packagesExportedBySystemBundle, new MockEventLogger());
+
+        replayMocks(mocks);
+
+        BundleManifest bundleManifest = BundleManifestFactory.createBundleManifest(new StringReader(
+            "Manifest-Version: 1.0\nBundle-SymbolicName: B\nImport-Package: org.springframework.core;version=\"[4.5,4.6)\""));
+        handler.expandImports(Arrays.asList(new ImportedLibrary[] { libraryImport }), Arrays.asList(new ImportedBundle[0]), bundleManifest);
+
+        verifyMocks(mocks);
+
+        assertTrue(bundleManifest.getImportPackage().getImportedPackages().size() > 33);
+    }
+
+    @Test(expected = UnableToSatisfyDependenciesException.class)
+    public void disjointImportedBundleVersionRangeIntersection() throws UnableToSatisfyDependenciesException {
+        List<Object> mocks = new ArrayList<Object>();
+
+        ImportedBundle bundleImport1 = createAndStoreMock(ImportedBundle.class, mocks);
+        expect(bundleImport1.getBundleSymbolicName()).andReturn("org.springframework.core").atLeastOnce();
+        expect(bundleImport1.getVersion()).andReturn(new VersionRange("[2.5,3.0)")).atLeastOnce();
+        expect(bundleImport1.isApplicationImportScope()).andReturn(false).atLeastOnce();
+        expect(bundleImport1.getResolution()).andReturn(Resolution.MANDATORY).atLeastOnce();
+
+        ImportedBundle bundleImport2 = createAndStoreMock(ImportedBundle.class, mocks);
+        expect(bundleImport2.getBundleSymbolicName()).andReturn("org.springframework.core").atLeastOnce();
+        expect(bundleImport2.getVersion()).andReturn(new VersionRange("[2.0,2.5)")).atLeastOnce();
+        expect(bundleImport2.isApplicationImportScope()).andReturn(false).atLeastOnce();
+        expect(bundleImport2.getResolution()).andReturn(Resolution.MANDATORY).atLeastOnce();
+
+        ImportExpansionHandler handler = new ImportExpansionHandler(repository, packagesExportedBySystemBundle, new MockEventLogger());
+
+        replayMocks(mocks);
+
+        BundleManifest bundleManifest = BundleManifestFactory.createBundleManifest();
+
+        try {
+            handler.expandImports(Arrays.asList(new ImportedLibrary[0]), Arrays.asList(new ImportedBundle[] { bundleImport1, bundleImport2 }),
+                bundleManifest);
+        } catch (UnableToSatisfyDependenciesException utsde) {
+            throw utsde;
+        }
+    }
+
+    @Test
+    public void overlappingBundleAndImportedLibrarys() throws UnableToSatisfyDependenciesException {
+        List<Object> mocks = new ArrayList<Object>();
+
+        ImportedBundle bundleImport = createAndStoreMock(ImportedBundle.class, mocks);
+        expect(bundleImport.getBundleSymbolicName()).andReturn("org.springframework.core").atLeastOnce();
+        expect(bundleImport.getVersion()).andReturn(new VersionRange("[4.2,5)")).atLeastOnce();
+        expect(bundleImport.isApplicationImportScope()).andReturn(false).atLeastOnce();
+        expect(bundleImport.getResolution()).andReturn(Resolution.MANDATORY).atLeastOnce();
+
+        ImportedLibrary libraryImport = createAndStoreMock(ImportedLibrary.class, mocks);
+        expect(libraryImport.getLibrarySymbolicName()).andReturn("org.springframework").atLeastOnce();
+        expect(libraryImport.getVersion()).andReturn(new VersionRange("[4.2,5)")).atLeastOnce();
+        expect(libraryImport.getResolution()).andReturn(Resolution.MANDATORY).atLeastOnce();
+
+        ImportExpansionHandler handler = new ImportExpansionHandler(repository, packagesExportedBySystemBundle, new MockEventLogger());
+
+        replayMocks(mocks);
+
+        BundleManifest bundleManifest = BundleManifestFactory.createBundleManifest();
+
+        handler.expandImports(Arrays.asList(new ImportedLibrary[] { libraryImport }), Arrays.asList(new ImportedBundle[] { bundleImport }),
+            bundleManifest);
+    }
+
+    @Test
+    public void importBundleWithNoExports() throws UnableToSatisfyDependenciesException {
+        List<Object> mocks = new ArrayList<Object>();
+
+        ImportedBundle bundleImport = createAndStoreMock(ImportedBundle.class, mocks);
+        expect(bundleImport.getBundleSymbolicName()).andReturn("silht.bundles.noexports").atLeastOnce();
+        expect(bundleImport.getVersion()).andReturn(new VersionRange("[1.0,1.0]")).atLeastOnce();
+        expect(bundleImport.isApplicationImportScope()).andReturn(false).atLeastOnce();
+        expect(bundleImport.getResolution()).andReturn(Resolution.MANDATORY).atLeastOnce();
+
+        ImportExpansionHandler handler = new ImportExpansionHandler(repository, packagesExportedBySystemBundle, new MockEventLogger());
+
+        replayMocks(mocks);
+
+        BundleManifest bundleManifest = BundleManifestFactory.createBundleManifest();
+        handler.expandImports(Arrays.asList(new ImportedLibrary[0]), Arrays.asList(new ImportedBundle[] { bundleImport }), bundleManifest);
+    }
+
+    @Test
+    public void importBundleWithFragmentWithNoExports() throws UnableToSatisfyDependenciesException {
+        List<Object> mocks = new ArrayList<Object>();
+
+        ImportedBundle hostImportedBundle = createAndStoreMock(ImportedBundle.class, mocks);
+        expect(hostImportedBundle.getBundleSymbolicName()).andReturn("silht.bundles.noexports").atLeastOnce();
+        expect(hostImportedBundle.getVersion()).andReturn(new VersionRange("[1.0,1.0]")).atLeastOnce();
+        expect(hostImportedBundle.isApplicationImportScope()).andReturn(false).atLeastOnce();
+        expect(hostImportedBundle.getResolution()).andReturn(Resolution.MANDATORY).atLeastOnce();
+
+        ImportedBundle fragmentImportedBundle = createAndStoreMock(ImportedBundle.class, mocks);
+        expect(fragmentImportedBundle.getBundleSymbolicName()).andReturn("silht.bundles.fragmentwithnoexports").atLeastOnce();
+        expect(fragmentImportedBundle.getVersion()).andReturn(new VersionRange("[1.0,1.0]")).atLeastOnce();
+        expect(fragmentImportedBundle.isApplicationImportScope()).andReturn(false).atLeastOnce();
+        expect(fragmentImportedBundle.getResolution()).andReturn(Resolution.MANDATORY).atLeastOnce();
+
+        ImportExpansionHandler handler = new ImportExpansionHandler(repository, packagesExportedBySystemBundle, new MockEventLogger());
+
+        replayMocks(mocks);
+
+        BundleManifest bundleManifest = BundleManifestFactory.createBundleManifest();
+        handler.expandImports(Arrays.asList(new ImportedLibrary[0]),
+            Arrays.asList(new ImportedBundle[] { hostImportedBundle, fragmentImportedBundle }), bundleManifest);
+        assertTrue(bundleManifest.getImportPackage().getImportedPackages().size() == 0);
+    }
+
+    @Test
+    public void importBundleBetweenManifests() throws Exception {
+        List<BundleManifest> manifests = new ArrayList<BundleManifest>();
+
+        BundleManifest manifest = BundleManifestFactory.createBundleManifest(new StringReader("Manifest-Version: 1.0\nImport-Bundle: com.foo"));
+        manifests.add(manifest);
+        manifests.add(BundleManifestFactory.createBundleManifest(new StringReader(
+            "Manifest-Version: 1.0\nExport-Package: com.foo;version=1.0\nBundle-SymbolicName: com.foo\n")));
+
+        ImportExpansionHandler handler = new ImportExpansionHandler(this.repository, packagesExportedBySystemBundle, new MockEventLogger());
+        handler.expandImports(manifests);
+        assertImported(manifest, Arrays.asList(new String[] { "com.foo" }), Arrays.asList(new String[] { "1.0.0" }));
+    }
+
+    @Test
+    public void importBundleExportingPackagesExportedBySystemBundle() throws Exception {
+        List<BundleManifest> manifests = new ArrayList<BundleManifest>();
+        BundleManifest manifest = BundleManifestFactory.createBundleManifest(new StringReader("Manifest-Version: 1.0\nImport-Bundle: overlapper"));
+        manifests.add(manifest);
+
+        MockEventLogger eventLogger = new MockEventLogger();
+        ImportExpansionHandler handler = new ImportExpansionHandler(this.repository, packagesExportedBySystemBundle, eventLogger);
+        handler.expandImports(manifests);
+        assertImported(manifest, Arrays.asList(new String[] { "javax.crypto.spec", "javax.imageio", "javax.imageio.event", "overlapper.pkg" }),
+            Arrays.asList(new String[] { "0.0.0", "0.0.0", "0.0.0", "0.0.0" }));
+
+        Assert.assertTrue("No events were logged.", eventLogger.getCalled());
+        Assert.assertTrue("The correct event was not logged.", eventLogger.containsLogged("UR0003W"));
+        List<LoggedEvent> ur3Events = eventLogger.getEventsWithCodes("UR0003W");
+        Assert.assertEquals(1, ur3Events.size());
+        LoggedEvent ur3Event = ur3Events.get(0);
+        Object[] inserts = ur3Event.getInserts();
+        Assert.assertTrue("Wrong number of inserts.", inserts.length >= 3);
+        Object overlap = inserts[2];
+        Assert.assertTrue("Insert at index 2 is not a String", overlap instanceof String);
+        String overlapString = (String)overlap;
+        String[] splitOverlap = overlapString.substring(1, overlapString.length()-1).split(", ");
+        Set<String> overlapSet = new HashSet<String>();
+        for (String pkg : splitOverlap) {
+            overlapSet.add(pkg);
+        }
+        Assert.assertEquals("Unexpected overlap with system bundle exports", packagesExportedBySystemBundle, overlapSet);
+    }
+
+    @Test
+    public void importLibraryThatImportsMissingOptionalBundle() throws Exception {
+        List<Object> mocks = new ArrayList<Object>();
+
+        ImportedLibrary libraryImport = createAndStoreMock(ImportedLibrary.class, mocks);
+
+        expect(libraryImport.getLibrarySymbolicName()).andReturn("missing.optional.bundle").atLeastOnce();
+        expect(libraryImport.getVersion()).andReturn(new VersionRange("[1.0,1.0]")).atLeastOnce();
+        expect(libraryImport.getResolution()).andReturn(Resolution.MANDATORY).anyTimes();
+
+        ImportExpansionHandler handler = new ImportExpansionHandler(repository, packagesExportedBySystemBundle, new MockEventLogger());
+
+        replayMocks(mocks);
+
+        BundleManifest bundleManifest = BundleManifestFactory.createBundleManifest();
+
+        handler.expandImports(Arrays.asList(new ImportedLibrary[] { libraryImport }), Arrays.asList(new ImportedBundle[0]), bundleManifest);
+
+        verifyMocks(mocks);
+
+        assertEquals(0, bundleManifest.getImportPackage().getImportedPackages().size());
+    }
+
+    @Test
+    public void importBundleThatExportsPackageAtMultipleVersions() throws UnableToSatisfyDependenciesException {
+        List<Object> mocks = new ArrayList<Object>();
+
+        ImportedBundle bundleImport = createAndStoreMock(ImportedBundle.class, mocks);
+        expect(bundleImport.getBundleSymbolicName()).andReturn("multi.version.export").atLeastOnce();
+        expect(bundleImport.getVersion()).andReturn(new VersionRange("[1.0,2.0)")).atLeastOnce();
+        expect(bundleImport.isApplicationImportScope()).andReturn(false).atLeastOnce();
+        expect(bundleImport.getResolution()).andReturn(Resolution.MANDATORY).atLeastOnce();
+
+        ImportExpansionHandler handler = new ImportExpansionHandler(repository, packagesExportedBySystemBundle, new MockEventLogger());
+
+        replayMocks(mocks);
+
+        BundleManifest bundleManifest = BundleManifestFactory.createBundleManifest();
+
+        handler.expandImports(Arrays.asList(new ImportedLibrary[0]), Arrays.asList(new ImportedBundle[] { bundleImport }), bundleManifest);
+
+        verifyMocks(mocks);
+
+        assertImported(bundleManifest, Arrays.asList(new String[] { "a" }), Arrays.asList(new String[] { "1.0.0" }));
+    }
+
+    private static <T> T createAndStoreMock(Class<T> classToMock, List<Object> mocks) {
+        T mock = createMock(classToMock);
+        mocks.add(mock);
+        return mock;
+    }
+
+    private static void replayMocks(List<Object> mocks) {
+        Object[] mocksArray = mocks.toArray(new Object[mocks.size()]);
+        replay(mocksArray);
+    }
+
+    private static void verifyMocks(List<Object> mocks) {
+        Object[] mocksArray = mocks.toArray(new Object[mocks.size()]);
+        verify(mocksArray);
+    }
+
+    private static void assertImported(BundleManifest bundleManifest, List<String> packages, List<String> versions) {
+        List<ImportedPackage> packageImports = bundleManifest.getImportPackage().getImportedPackages();
+        List<String> expectedPackages = new ArrayList<String>(packages);
+        List<String> expectedVersions = new ArrayList<String>(versions);
+        for (ImportedPackage packageImport : packageImports) {
+
+            String packageName = packageImport.getPackageName();
+            int index = expectedPackages.indexOf(packageName);
+            if (index > -1) {
+                Version expected = new Version(expectedVersions.get(index));
+                VersionRange actualRange = new VersionRange(packageImport.getAttributes().get("version"));
+
+                if (actualRange.includes(expected)) {
+                    expectedPackages.remove(packageName);
+                    expectedVersions.remove(index);
+                }
+            }
+        }
+
+        if (expectedPackages.size() > 0) {
+            fail("No import(s) were found for package(s) " + expectedPackages + " with version(s) " + expectedVersions + " in manifest: \n"
+                + bundleManifest);
+        }
+    }
+
+    private static final class StubRepository implements Repository {
+
+        private final List<RepositoryAwareArtifactDescriptor> artifactDescriptors = new ArrayList<RepositoryAwareArtifactDescriptor>();
+
+        /**
+         * {@inheritDoc}
+         */
+        public Query createQuery(String key, String value) {
+            throw new UnsupportedOperationException();
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public Query createQuery(String key, String value, Map<String, Set<String>> properties) {
+            throw new UnsupportedOperationException();
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public RepositoryAwareArtifactDescriptor get(String type, String name, VersionRange versionRange) {
+            RepositoryAwareArtifactDescriptor bestMatch = null;
+
+            for (RepositoryAwareArtifactDescriptor candidate : this.artifactDescriptors) {
+                if (type.equals(candidate.getType()) && name.equals(candidate.getName()) && versionRange.includes(candidate.getVersion())) {
+                    if (bestMatch == null || bestMatch.getVersion().compareTo(candidate.getVersion()) < 0) {
+                        bestMatch = candidate;
+                    }
+                }
+            }
+            return bestMatch;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public String getName() {
+            throw new UnsupportedOperationException();
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public void stop() {
+            throw new UnsupportedOperationException();
+        }
+
+        private void addArtifactDescriptor(ArtifactDescriptor descriptor) {
+            this.artifactDescriptors.add(new StubRepositoryAwareArtifactDescriptor(descriptor));
+        }
+
+        private static final class StubRepositoryAwareArtifactDescriptor implements RepositoryAwareArtifactDescriptor {
+
+            private final ArtifactDescriptor delegate;
+
+            /**
+             * @param delegate
+             */
+            private StubRepositoryAwareArtifactDescriptor(ArtifactDescriptor delegate) {
+                this.delegate = delegate;
+            }
+
+            public Set<Attribute> getAttribute(String name) {
+                return delegate.getAttribute(name);
+            }
+
+            public Set<Attribute> getAttributes() {
+                return delegate.getAttributes();
+            }
+
+            public String getFilename() {
+                return delegate.getFilename();
+            }
+
+            public String getName() {
+                return delegate.getName();
+            }
+
+            public String getType() {
+                return delegate.getType();
+            }
+
+            public java.net.URI getUri() {
+                return delegate.getUri();
+            }
+
+            public Version getVersion() {
+                return delegate.getVersion();
+            }
+
+            public String getRepositoryName() {
+                return "Unit test repository";
+            }
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/importexpansion/TrackedPackageImportsTests.java b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/importexpansion/TrackedPackageImportsTests.java
new file mode 100644
index 0000000..39c78fd
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/importexpansion/TrackedPackageImportsTests.java
@@ -0,0 +1,405 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.importexpansion;
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import org.eclipse.virgo.kernel.osgi.framework.ImportMergeException;
+import org.eclipse.virgo.kernel.userregion.internal.importexpansion.StandardTrackedPackageImportsFactory;
+import org.eclipse.virgo.kernel.userregion.internal.importexpansion.TrackedPackageImports;
+import org.eclipse.virgo.kernel.userregion.internal.importexpansion.TrackedPackageImportsFactory;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifestFactory;
+import org.eclipse.virgo.util.osgi.manifest.ImportedPackage;
+import org.eclipse.virgo.util.osgi.manifest.Resolution;
+
+/**
+ */
+public class TrackedPackageImportsTests {
+
+    private static final String TEST_SOURCE = "test source";
+
+    private final TrackedPackageImportsFactory trackedPackageImportsFactory = new StandardTrackedPackageImportsFactory();
+
+    @Test public void testTrivialMerge() throws ImportMergeException, IOException {
+
+        BundleManifest manifestA = BundleManifestFactory.createBundleManifest(new StringReader("bundle-symbolicname: A\nimport-package: p"));
+        TrackedPackageImports tpiA = this.trackedPackageImportsFactory.create(manifestA);
+
+        BundleManifest manifestB = BundleManifestFactory.createBundleManifest(new StringReader("bundle-symbolicname: B\nimport-package: p"));
+        TrackedPackageImports tpiB = this.trackedPackageImportsFactory.create(manifestB);
+        
+        TrackedPackageImports empty = this.trackedPackageImportsFactory.createEmpty();
+        
+        Assert.assertTrue(empty.isEmpty());
+        Assert.assertFalse(tpiB.isEmpty());
+        Assert.assertTrue(tpiA.isEquivalent(tpiB));
+        Assert.assertFalse(tpiA.isEquivalent(empty));
+
+        tpiB.merge(tpiA);
+        tpiB.merge(empty);
+        Map<String, ImportedPackage> mergedImports = convertImportedPackageListToMap(tpiB.getMergedImports());
+        ImportedPackage pImport = mergedImports.get("p");
+        Assert.assertNotNull("Missing merged import", pImport);
+    }
+
+    @Test public void testOverlappingVersionRanges() throws ImportMergeException, IOException {
+
+        BundleManifest manifestA = BundleManifestFactory.createBundleManifest(new StringReader(
+            "bundle-symbolicname: A\nimport-package: p;version=\"[1,3]\""));
+        TrackedPackageImports tpiA = this.trackedPackageImportsFactory.create(manifestA);
+
+        BundleManifest manifestB = BundleManifestFactory.createBundleManifest(new StringReader(
+            "bundle-symbolicname: B\nimport-package: p;version=\"2\""));
+        TrackedPackageImports tpiB = this.trackedPackageImportsFactory.create(manifestB);
+
+        tpiB.merge(tpiA);
+        Map<String, ImportedPackage> mergedImports = convertImportedPackageListToMap(tpiB.getMergedImports());
+        ImportedPackage pImport = mergedImports.get("p");
+        Assert.assertNotNull("Missing merged import", pImport);
+        VersionRange v = new VersionRange(pImport.getAttributes().get("version"));
+        Assert.assertTrue("Incorrectly merged version", v.isFloorInclusive() && v.isCeilingInclusive() && v.getFloor().getMajor() == 2
+            && v.getCeiling().getMajor() == 3);
+    }
+
+    @Test public void testDisjointVersionRanges() throws IOException {
+      
+        BundleManifest manifestA = BundleManifestFactory.createBundleManifest(new StringReader(
+            "bundle-symbolicname: A\nimport-package: p;version=\"[1,2]\""));
+        TrackedPackageImports tpiA = this.trackedPackageImportsFactory.create(manifestA);
+
+        BundleManifest manifestB = BundleManifestFactory.createBundleManifest(new StringReader(
+            "bundle-symbolicname: B\nimport-package: p;version=\"[3,4]\""));
+        TrackedPackageImports tpiB = this.trackedPackageImportsFactory.create(manifestB);
+
+        try {
+            tpiB.merge(tpiA);
+            Assert.assertTrue("Exception should be thrown", false);
+        } catch (ImportMergeException e) {
+            System.out.println(e);
+            Assert.assertEquals("Incorrect conflicting package name", "p", e.getConflictingPackageName());
+            Assert.assertEquals("Incorrect sources", "bundle B, bundle A", e.getSources());
+        }
+    }
+
+    @Test public void testOverlappingBundleVersionRanges() throws ImportMergeException, IOException {
+
+        BundleManifest manifestA = BundleManifestFactory.createBundleManifest(new StringReader(
+            "bundle-symbolicname: A\nimport-package: p;bundle-version=\"[1,3]\""));
+        TrackedPackageImports tpiA = this.trackedPackageImportsFactory.create(manifestA);
+
+        BundleManifest manifestB = BundleManifestFactory.createBundleManifest(new StringReader(
+            "bundle-symbolicname: B\nimport-package: p;bundle-version=\"2\""));
+        TrackedPackageImports tpiB = this.trackedPackageImportsFactory.create(manifestB);
+
+        tpiB.merge(tpiA);
+        Map<String, ImportedPackage> mergedImports = convertImportedPackageListToMap(tpiB.getMergedImports());
+        ImportedPackage pImport = mergedImports.get("p");
+        Assert.assertNotNull("Missing merged import", pImport);
+        VersionRange v = new VersionRange(pImport.getAttributes().get("bundle-version"));
+        Assert.assertTrue("Incorrectly merged version", v.isFloorInclusive() && v.isCeilingInclusive() && v.getFloor().getMajor() == 2
+            && v.getCeiling().getMajor() == 3);
+    }
+
+    @Test public void testDisjointBundleVersionRanges() throws IOException {
+        BundleManifest manifestA = BundleManifestFactory.createBundleManifest(new StringReader(
+            "bundle-symbolicname: A\nimport-package: p;bundle-version=\"[1,2]\""));
+        TrackedPackageImports tpiA = this.trackedPackageImportsFactory.create(manifestA);
+
+        BundleManifest manifestB = BundleManifestFactory.createBundleManifest(new StringReader(
+            "bundle-symbolicname: B\nimport-package: p;bundle-version=\"[3,4]\""));
+        TrackedPackageImports tpiB = this.trackedPackageImportsFactory.create(manifestB);
+
+        try {
+            tpiB.merge(tpiA);
+            Assert.assertTrue("Exception should be thrown", false);
+        } catch (ImportMergeException e) {
+            System.out.println(e);
+            Assert.assertEquals("Incorrect conflicting package name", "p", e.getConflictingPackageName());
+            Assert.assertEquals("Incorrect sources", "bundle B, bundle A", e.getSources());
+        }
+    }
+
+    @Test public void testResolution() throws ImportMergeException, IOException {
+        
+        BundleManifest manifestA = BundleManifestFactory.createBundleManifest(new StringReader(
+            "bundle-symbolicname: A\nimport-package: p;resolution:=optional"));
+        TrackedPackageImports tpiA = this.trackedPackageImportsFactory.create(manifestA);
+
+        BundleManifest manifestB = BundleManifestFactory.createBundleManifest(new StringReader(
+            "bundle-symbolicname: B\nimport-package: p;resolution:=mandatory"));
+        TrackedPackageImports tpiB = this.trackedPackageImportsFactory.create(manifestB);
+
+        tpiB.merge(tpiA);
+        Map<String, ImportedPackage> mergedImports = convertImportedPackageListToMap(tpiB.getMergedImports());
+        ImportedPackage pImport = mergedImports.get("p");
+        Assert.assertNotNull("Missing merged import", pImport);
+        Assert.assertTrue("Incorrectly merged resolution", pImport.getResolution() == Resolution.MANDATORY);
+    }
+
+    @Test public void testConsistentAttributes() throws ImportMergeException, IOException {
+        
+        BundleManifest manifestA = BundleManifestFactory.createBundleManifest(new StringReader(
+            "bundle-symbolicname: A\nimport-package: p;a1=v1;a2=v2"));
+        TrackedPackageImports tpiA = this.trackedPackageImportsFactory.create(manifestA);
+
+        BundleManifest manifestB = BundleManifestFactory.createBundleManifest(new StringReader(
+            "bundle-symbolicname: B\nimport-package: p;a1=v1;a3=v3"));
+        TrackedPackageImports tpiB = this.trackedPackageImportsFactory.create(manifestB);
+
+        tpiB.merge(tpiA);
+        Map<String, ImportedPackage> mergedImports = convertImportedPackageListToMap(tpiB.getMergedImports());
+        ImportedPackage pImport = mergedImports.get("p");
+        Assert.assertNotNull("Missing merged import", pImport);
+        Map<String, String> pAttrs = pImport.getAttributes();
+        Assert.assertEquals("Incorrectly merged attribute for a1", "v1", pAttrs.get("a1"));
+        Assert.assertEquals("Incorrectly merged attribute for a2", "v2", pAttrs.get("a2"));
+        Assert.assertEquals("Incorrectly merged attribute for a3", "v3", pAttrs.get("a3"));
+    }
+
+    @Test public void testInconsistentAttributes() throws ImportMergeException, IOException {
+        
+        BundleManifest manifestA = BundleManifestFactory.createBundleManifest(new StringReader("bundle-symbolicname: A\nimport-package: p;a1=v1"));
+        TrackedPackageImports tpiA = this.trackedPackageImportsFactory.create(manifestA);
+
+        BundleManifest manifestB = BundleManifestFactory.createBundleManifest(new StringReader("bundle-symbolicname: B\nimport-package: p;a1=v2"));
+        TrackedPackageImports tpiB = this.trackedPackageImportsFactory.create(manifestB);
+
+        BundleManifest manifestC = BundleManifestFactory.createBundleManifest(new StringReader("bundle-symbolicname: C\nimport-package: q"));
+        TrackedPackageImports tpiC = this.trackedPackageImportsFactory.create(manifestC);
+        tpiB.merge(tpiC);
+
+        try {
+            tpiB.merge(tpiA);
+            Assert.assertTrue("Exception should be thrown", false);
+        } catch (ImportMergeException e) {
+            System.out.println(e);
+            Assert.assertEquals("Incorrect conflicting package name", "p", e.getConflictingPackageName());
+            Assert.assertEquals("Incorrect sources", "bundle B, bundle A", e.getSources());
+        }
+    }
+
+    @Test public void testTrivialAddition() throws ImportMergeException, IOException {
+
+        BundleManifest manifestA = BundleManifestFactory.createBundleManifest(new StringReader("bundle-symbolicname: A\nimport-package: p"));
+        TrackedPackageImports tpiA = this.trackedPackageImportsFactory.create(manifestA);
+
+        ImportedPackage packageImport = BundleManifestFactory.createBundleManifest().getImportPackage().addImportedPackage("p");
+        List<ImportedPackage> packageImports = new ArrayList<ImportedPackage>();
+        packageImports.add(packageImport);
+        TrackedPackageImports tpiB = this.trackedPackageImportsFactory.create(packageImports, TEST_SOURCE);
+
+        tpiA.merge(tpiB);
+        Map<String, ImportedPackage> mergedImports = convertImportedPackageListToMap(tpiA.getMergedImports());
+        ImportedPackage pImport = mergedImports.get("p");
+        Assert.assertNotNull("Missing merged import", pImport);
+    }
+
+    @Test public void testClashingAddition() throws IOException {
+
+        BundleManifest manifestA = BundleManifestFactory.createBundleManifest(new StringReader(
+            "bundle-symbolicname: A\nimport-package: p;attr=x"));
+        TrackedPackageImports tpiA = this.trackedPackageImportsFactory.create(manifestA);
+
+        ImportedPackage packageImport = BundleManifestFactory.createBundleManifest().getImportPackage().addImportedPackage("p");
+        packageImport.getAttributes().put("attr", "y");
+        List<ImportedPackage> packageImports = new ArrayList<ImportedPackage>();
+        packageImports.add(packageImport);
+        TrackedPackageImports tpiB = this.trackedPackageImportsFactory.create(packageImports, TEST_SOURCE);
+
+        try {
+            tpiA.merge(tpiB);
+            Assert.assertTrue("Exception should be thrown", false);
+        } catch (ImportMergeException e) {
+            System.out.println(e);
+            Assert.assertEquals("Incorrect conflicting package name", "p", e.getConflictingPackageName());
+            Assert.assertEquals("Incorrect sources", "bundle A, " + TEST_SOURCE, e.getSources());
+        }
+    }
+
+    @Test public void testOverlappingVersionRangesInCollection() throws ImportMergeException, IOException {
+
+        BundleManifest manifestA = BundleManifestFactory.createBundleManifest(new StringReader(
+            "bundle-symbolicname: A\nimport-package: p;version=\"[1,3]\""));
+        TrackedPackageImports tpiA = this.trackedPackageImportsFactory.create(manifestA);
+
+        BundleManifest manifestB = BundleManifestFactory.createBundleManifest(new StringReader(
+            "bundle-symbolicname: B\nimport-package: p;version=\"2\""));
+        TrackedPackageImports tpiB = this.trackedPackageImportsFactory.create(manifestB);
+
+        TrackedPackageImports tpiC = this.trackedPackageImportsFactory.createCollector();
+
+        tpiC.merge(tpiB);
+        tpiC.merge(tpiA);
+
+        Map<String, ImportedPackage> mergedImports = convertImportedPackageListToMap(tpiC.getMergedImports());
+        ImportedPackage pImport = mergedImports.get("p");
+        Assert.assertNotNull("Missing merged import", pImport);
+        VersionRange v = new VersionRange(pImport.getAttributes().get("version"));
+        Assert.assertTrue("Incorrectly merged version", v.isFloorInclusive() && v.isCeilingInclusive() && v.getFloor().getMajor() == 2
+            && v.getCeiling().getMajor() == 3);
+    }
+
+    @Test public void testDisjointVersionRangesInCollection() throws IOException {
+        
+        BundleManifest manifestA = BundleManifestFactory.createBundleManifest(new StringReader(
+            "bundle-symbolicname: A\nimport-package: p;version=\"[1,2]\""));
+        TrackedPackageImports tpiA = this.trackedPackageImportsFactory.create(manifestA);
+
+        BundleManifest manifestB = BundleManifestFactory.createBundleManifest(new StringReader(
+            "bundle-symbolicname: B\nimport-package: p;version=\"[3,4]\""));
+        TrackedPackageImports tpiB = this.trackedPackageImportsFactory.create(manifestB);
+
+        TrackedPackageImports tpiC = this.trackedPackageImportsFactory.createCollector();
+
+        try {
+            tpiC.merge(tpiB);
+            tpiC.merge(tpiA);
+            Assert.assertTrue("Exception should be thrown", false);
+        } catch (ImportMergeException e) {
+            System.out.println(e);
+            Assert.assertEquals("Incorrect conflicting package name", "p", e.getConflictingPackageName());
+            Assert.assertEquals("Incorrect sources", "bundle B, bundle A", e.getSources());
+        }
+    }
+
+    @Test public void testThreeWayClash() throws IOException {
+        
+        BundleManifest manifestA = BundleManifestFactory.createBundleManifest(new StringReader(
+            "bundle-symbolicname: A\nimport-package: p;version=\"[1,2]\""));
+        TrackedPackageImports tpiA = this.trackedPackageImportsFactory.create(manifestA);
+
+        BundleManifest manifestB = BundleManifestFactory.createBundleManifest(new StringReader(
+            "bundle-symbolicname: B\nimport-package: p;version=\"[2,3]\""));
+        TrackedPackageImports tpiB = this.trackedPackageImportsFactory.create(manifestB);
+
+        TrackedPackageImports tpiC = this.trackedPackageImportsFactory.createCollector();
+
+        BundleManifest manifestD = BundleManifestFactory.createBundleManifest(new StringReader(
+            "bundle-symbolicname: D\nimport-package: p;version=\"[3,3]\""));
+        TrackedPackageImports tpiD = this.trackedPackageImportsFactory.create(manifestD);
+
+        try {
+            tpiC.merge(tpiB);
+            tpiC.merge(tpiA);
+            tpiD.merge(tpiC);
+            Assert.assertTrue("Exception should be thrown", false);
+        } catch (ImportMergeException e) {
+            System.out.println(e);
+            Assert.assertEquals("Incorrect conflicting package name", "p", e.getConflictingPackageName());
+            /*
+             * Note that in a N-way clash of version ranges, there must be a pair of version ranges that clash, but the
+             * current implementation simply reports all N.
+             */
+            Assert.assertEquals("Incorrect sources", "bundle D, bundle B, bundle A", e.getSources());
+        }
+    }
+
+    @Test public void testThreeWayNestedClash() throws IOException {
+        
+        BundleManifest manifestA = BundleManifestFactory.createBundleManifest(new StringReader(
+            "bundle-symbolicname: A\nimport-package: p;version=\"[1,2]\""));
+        TrackedPackageImports tpiA = this.trackedPackageImportsFactory.create(manifestA);
+
+        BundleManifest manifestB = BundleManifestFactory.createBundleManifest(new StringReader(
+            "bundle-symbolicname: B\nimport-package: p;version=\"[2,3]\""));
+        TrackedPackageImports tpiB = this.trackedPackageImportsFactory.create(manifestB);
+
+        BundleManifest manifestD = BundleManifestFactory.createBundleManifest(new StringReader(
+            "bundle-symbolicname: D\nimport-package: p;version=\"[3,3]\""));
+        TrackedPackageImports tpiD = this.trackedPackageImportsFactory.create(manifestD);
+
+        TrackedPackageImports tpiContainer = this.trackedPackageImportsFactory.createContainer("container");
+
+        try {
+            tpiContainer.merge(tpiA);
+            tpiContainer.merge(tpiB);
+            tpiD.merge(tpiContainer);
+            Assert.assertTrue("Exception should be thrown", false);
+        } catch (ImportMergeException e) {
+            System.out.println(e);
+            Assert.assertEquals("Incorrect conflicting package name", "p", e.getConflictingPackageName());
+            /*
+             * Note that in a N-way clash of version ranges, there must be a pair of version ranges that clash, but the
+             * current implementation simply reports all N.
+             */
+            Assert.assertEquals("Incorrect sources", "bundle D, container(bundle A, bundle B)", e.getSources());
+        }
+    }
+
+    @Test public void testFourWayNestedClashInACollector() throws IOException {
+        
+        BundleManifest manifestA = BundleManifestFactory.createBundleManifest(new StringReader(
+            "bundle-symbolicname: A\nimport-package: p;version=\"[1,2]\""));
+        TrackedPackageImports tpiA = this.trackedPackageImportsFactory.create(manifestA);
+
+        BundleManifest manifestB = BundleManifestFactory.createBundleManifest(new StringReader(
+            "bundle-symbolicname: B\nimport-package: p;version=\"[2,3]\""));
+        TrackedPackageImports tpiB = this.trackedPackageImportsFactory.create(manifestB);
+
+        BundleManifest manifestC = BundleManifestFactory.createBundleManifest(new StringReader(
+            "bundle-symbolicname: C\nimport-package: p;version=\"[3,4]\""));
+        TrackedPackageImports tpiC = this.trackedPackageImportsFactory.create(manifestC);
+
+        BundleManifest manifestD = BundleManifestFactory.createBundleManifest(new StringReader(
+            "bundle-symbolicname: D\nimport-package: p;version=\"[4,5]\""));
+        TrackedPackageImports tpiD = this.trackedPackageImportsFactory.create(manifestD);
+
+        TrackedPackageImports tpiContainerX = this.trackedPackageImportsFactory.createContainer("containerX");
+        
+        TrackedPackageImports tpiContainerY = this.trackedPackageImportsFactory.createContainer("containerY");
+        
+        TrackedPackageImports tpiCollector = this.trackedPackageImportsFactory.createCollector();
+
+        try {
+            tpiContainerX.merge(tpiA);
+            tpiContainerX.merge(tpiB);
+            tpiContainerY.merge(tpiC);
+            tpiContainerY.merge(tpiD);
+            tpiCollector.merge(tpiContainerX);
+            tpiCollector.merge(tpiContainerY);
+            Assert.assertTrue("Exception should be thrown", false);
+        } catch (ImportMergeException e) {
+            System.out.println(e);
+            Assert.assertEquals("Incorrect conflicting package name", "p", e.getConflictingPackageName());
+            /*
+             * Note that in a N-way clash of version ranges, there must be a pair of version ranges that clash, but the
+             * current implementation simply reports all N.
+             */
+            Assert.assertEquals("Incorrect sources", "containerX(bundle A, bundle B), containerY(bundle C, bundle D)", e.getSources());
+        }
+    }
+
+    /**
+     * Convert a given list of package imports with no duplicate package names to a map of package name to
+     * {@link ImportedPackage}.
+     * 
+     * @param importedPackages a list of <code>PackageImport</code>
+     * @return a map of package name to <code>PackageImport</code>
+     */
+    private static Map<String, ImportedPackage> convertImportedPackageListToMap(List<ImportedPackage> importedPackages) {
+        Map<String, ImportedPackage> initialPackageImports = new HashMap<String, ImportedPackage>();
+        for (ImportedPackage importedPackage : importedPackages) {            
+            Assert.assertNull(initialPackageImports.put(importedPackage.getPackageName(), importedPackage));
+        }
+        return initialPackageImports;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/management/JMXQuasiStateDumpTests.java b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/management/JMXQuasiStateDumpTests.java
new file mode 100644
index 0000000..b8a0238
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/management/JMXQuasiStateDumpTests.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.virgo.kernel.userregion.internal.management;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.zip.ZipException;
+
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiFramework;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiFrameworkFactory;
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+/**
+ * 
+ *
+ */
+public class JMXQuasiStateDumpTests {
+
+	private static final String TEST_DUMP = "src/test/resources/testDump";
+	
+	private final JMXQuasiStateDump quasiStateDumpMBean;
+	
+	public JMXQuasiStateDumpTests() {
+		quasiStateDumpMBean = new JMXQuasiStateDump(new QuasiFrameworkFactory() {
+			
+			@Override
+			public QuasiFramework create(File stateDump) throws ZipException, IOException {
+			    if (File.separator.equals("/")) {
+			        assertEquals(TEST_DUMP, stateDump.getPath());
+			    } else {
+			        assertEquals(TEST_DUMP, stateDump.getPath().replace('\\',  '/'));
+			    }
+				return new StubQuasiFramework();
+			}
+			
+			@Override
+			public QuasiFramework create() {
+				return new StubQuasiFramework();
+			}
+		});
+	}
+	
+	@Test
+	public void testGetUnresolvedBundleFailures(){
+		JMXQuasiResolutionFailure[] unresolvedBundleFailures = this.quasiStateDumpMBean.getUnresolvedBundleFailures(TEST_DUMP);
+		assertEquals(1, unresolvedBundleFailures.length);
+		assertEquals("Description", unresolvedBundleFailures[0].getDescription());
+		assertEquals(StubQuasiFramework.TEST_BUNDLE_NAME, unresolvedBundleFailures[0].getSymbolicName());
+	}
+	
+	@Test
+	public void testListBundles(){
+		JMXQuasiMinimalBundle[] listBundles = this.quasiStateDumpMBean.listBundles(TEST_DUMP);
+		assertEquals(1, listBundles.length);
+		assertEquals(StubQuasiFramework.TEST_BUNDLE_NAME, listBundles[0].getSymbolicName());
+
+	}
+	
+	@Test
+	public void testGetBundle(){
+		JMXQuasiBundle bundle = this.quasiStateDumpMBean.getBundle(TEST_DUMP, 5l);
+		assertEquals(StubQuasiFramework.TEST_BUNDLE_NAME, bundle.getSymbolicName());
+		assertEquals(5l, bundle.getIdentifier());
+	}
+	
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/management/StubQuasiBundle.java b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/management/StubQuasiBundle.java
new file mode 100644
index 0000000..827fa22
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/management/StubQuasiBundle.java
@@ -0,0 +1,131 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.virgo.kernel.userregion.internal.management;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.equinox.region.Region;
+import org.eclipse.virgo.kernel.artifact.plan.PlanDescriptor.Provisioning;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiBundle;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiExportPackage;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiImportPackage;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiRequiredBundle;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.Version;
+
+/**
+ * 
+ *
+ */
+public class StubQuasiBundle implements QuasiBundle {
+
+    private final Version version;
+
+    private final String name;
+
+    private volatile Provisioning provisioning = Provisioning.AUTO;
+
+	private long bundleId;
+
+    public StubQuasiBundle(String name, Version version, long bundleId) {
+        this.name = name;
+        this.version = version;
+		this.bundleId = bundleId;
+    }
+
+    @Override
+    public String getSymbolicName() {
+        return this.name;
+    }
+
+    @Override
+    public Version getVersion() {
+        return this.version;
+    }
+
+    @Override
+    public boolean isResolved() {
+        return false;
+    }
+
+    @Override
+    public void uninstall() {
+    }
+
+    @Override
+    public Bundle getBundle() {
+        return null;
+    }
+
+    @Override
+    public long getBundleId() {
+        return bundleId;
+    }
+
+    @Override
+    public List<QuasiBundle> getFragments() {
+        return new ArrayList<QuasiBundle>();
+    }
+
+    @Override
+    public List<QuasiBundle> getHosts() {
+        return new ArrayList<QuasiBundle>();
+    }
+
+    @Override
+    public List<QuasiExportPackage> getExportPackages() {
+        return new ArrayList<QuasiExportPackage>();
+    }
+
+    @Override
+    public List<QuasiImportPackage> getImportPackages() {
+        return new ArrayList<QuasiImportPackage>();
+    }
+
+    @Override
+    public List<QuasiRequiredBundle> getRequiredBundles() {
+        return new ArrayList<QuasiRequiredBundle>();
+    }
+
+    @Override
+    public List<QuasiBundle> getDependents() {
+        return new ArrayList<QuasiBundle>();
+    }
+
+    @Override
+    public File getBundleFile() {
+        return null;
+    }
+
+    @Override
+    public void setProvisioning(Provisioning provisioning) {
+        this.provisioning = provisioning;
+
+    }
+
+    @Override
+    public Provisioning getProvisioning() {
+        return this.provisioning;
+    }
+
+	@Override
+	public Region getRegion() {
+		return null;
+	}
+
+	@Override
+	public String getBundleLocation() {
+		return null;
+	}
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/management/StubQuasiFramework.java b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/management/StubQuasiFramework.java
new file mode 100644
index 0000000..c323939
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/management/StubQuasiFramework.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.virgo.kernel.userregion.internal.management;
+
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.equinox.region.Region;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiBundle;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiFramework;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiResolutionFailure;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.Version;
+
+/**
+ *
+ */
+public class StubQuasiFramework implements QuasiFramework {
+
+	public static final String TEST_BUNDLE_NAME = "foo";
+	
+	@Override
+	public QuasiBundle install(URI location, BundleManifest bundleManifest) throws BundleException {
+		return null;
+	}
+
+	@Override
+	public List<QuasiBundle> getBundles() {
+		ArrayList<QuasiBundle> arrayList = new ArrayList<QuasiBundle>();
+		arrayList.add(new StubQuasiBundle(TEST_BUNDLE_NAME, Version.emptyVersion, 5l));
+		return arrayList;
+	}
+
+	@Override
+	public QuasiBundle getBundle(long bundleId) {
+		return new StubQuasiBundle(TEST_BUNDLE_NAME, Version.emptyVersion, bundleId);
+	}
+
+	@Override
+	public List<QuasiResolutionFailure> resolve() {
+		return new ArrayList<QuasiResolutionFailure>();
+	}
+
+	@Override
+	public List<QuasiResolutionFailure> diagnose(long bundleId) {
+		ArrayList<QuasiResolutionFailure> arrayList = new ArrayList<QuasiResolutionFailure>();
+		arrayList.add(new StubQuasiResolutionFailure(new StubQuasiBundle(TEST_BUNDLE_NAME, Version.emptyVersion, bundleId)));
+		return arrayList;
+	}
+
+	@Override
+	public void commit() throws BundleException {
+	}
+
+	@Override
+	public void destroy() {
+	}
+
+	@Override
+	public Set<Region> getRegions() {
+		return null;
+	}
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/management/StubQuasiResolutionFailure.java b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/management/StubQuasiResolutionFailure.java
new file mode 100644
index 0000000..db443c6
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/management/StubQuasiResolutionFailure.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.virgo.kernel.userregion.internal.management;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiBundle;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiParameterised;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiResolutionFailure;
+
+/**
+ * 
+ *
+ */
+public class StubQuasiResolutionFailure implements QuasiResolutionFailure, QuasiParameterised {
+
+	private final QuasiBundle quasiBundle;
+
+	public StubQuasiResolutionFailure(QuasiBundle quasiBundle) {
+		this.quasiBundle = quasiBundle;
+	}
+	
+	@Override
+	public Map<String, Object> getDirectives() {
+		return new HashMap<String, Object>();
+	}
+
+	@Override
+	public Map<String, Object> getAttributes() {
+		return new HashMap<String, Object>();
+	}
+
+	@Override
+	public String getDescription() {
+		return "Description";
+	}
+
+	@Override
+	public QuasiBundle getUnresolvedQuasiBundle() {
+		return this.quasiBundle;
+	}
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/quasi/BundleDescriptionComparatorTests.java b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/quasi/BundleDescriptionComparatorTests.java
new file mode 100644
index 0000000..31d694a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/quasi/BundleDescriptionComparatorTests.java
@@ -0,0 +1,316 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.quasi;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.osgi.service.resolver.BundleDescription;
+import org.eclipse.osgi.service.resolver.BundleSpecification;
+import org.eclipse.osgi.service.resolver.ExportPackageDescription;
+import org.eclipse.osgi.service.resolver.GenericDescription;
+import org.eclipse.osgi.service.resolver.GenericSpecification;
+import org.eclipse.osgi.service.resolver.HostSpecification;
+import org.eclipse.osgi.service.resolver.ImportPackageSpecification;
+import org.eclipse.osgi.service.resolver.NativeCodeSpecification;
+import org.eclipse.osgi.service.resolver.State;
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.Version;
+import org.osgi.framework.wiring.BundleRequirement;
+import org.osgi.framework.wiring.BundleWiring;
+import org.osgi.framework.wiring.BundleCapability;
+import org.osgi.resource.Capability;
+import org.osgi.resource.Requirement;
+
+
+public class BundleDescriptionComparatorTests {
+    
+    private final BundleDescriptionComparator bundleDescriptionComparator = new BundleDescriptionComparator();
+    
+    @Test
+    public void matchingBundleSymbolicNameAndVersion() {
+        StubBundleDescription bd1 = new StubBundleDescription("foo", new Version(1,2,3));
+        StubBundleDescription bd2 = new StubBundleDescription("foo", new Version(1,2,3));
+        assertEquals(0, bundleDescriptionComparator.compare(bd1, bd2));
+    }
+    
+    @Test
+    public void differingBundleSymbolicName() {
+        StubBundleDescription bd1 = new StubBundleDescription("foo", new Version(1,2,3));
+        StubBundleDescription bd2 = new StubBundleDescription("bar", new Version(1,2,3));
+        
+        assertDifferent(bd1, bd2);                                
+    }
+    
+    @Test
+    public void differingVersion() {
+        StubBundleDescription bd1 = new StubBundleDescription("foo", new Version(1,2,3));
+        StubBundleDescription bd2 = new StubBundleDescription("foo", new Version(2,3,4));
+        
+        assertDifferent(bd1, bd2);                                
+    }
+    
+    @Test
+    public void differingBundleSymbolicNameAndVersion() {
+        StubBundleDescription bd1 = new StubBundleDescription("foo", new Version(1,2,3));
+        StubBundleDescription bd2 = new StubBundleDescription("bar", new Version(2,3,4));
+        
+        assertDifferent(bd1, bd2);                                
+    }
+    
+    private void assertDifferent(StubBundleDescription bd1, StubBundleDescription bd2) {
+        int bd1ToBd2Comparison = this.bundleDescriptionComparator.compare(bd1, bd2);        
+        assertTrue(bd1ToBd2Comparison != 0);
+        
+        int bd2ToBd1Comparison = this.bundleDescriptionComparator.compare(bd2, bd1);        
+        assertTrue(bd2ToBd1Comparison != 0);
+        
+        assertFalse(bd2ToBd1Comparison < 0 && bd1ToBd2Comparison < 0);
+    }
+        
+    private static final class StubBundleDescription implements BundleDescription {
+        
+        private final String symbolicName;
+        
+        private final Version version;
+        
+        StubBundleDescription(String symbolicName, Version version) {
+            this.symbolicName = symbolicName;
+            this.version = version;
+        }
+
+        @Override
+        public boolean attachFragments() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public boolean dynamicFragments() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public long getBundleId() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public State getContainingState() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public BundleDescription[] getDependents() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public String[] getExecutionEnvironments() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public ExportPackageDescription[] getExportPackages() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public BundleDescription[] getFragments() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public GenericDescription[] getGenericCapabilities() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public GenericSpecification[] getGenericRequires() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public HostSpecification getHost() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public ImportPackageSpecification[] getImportPackages() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public String getLocation() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public NativeCodeSpecification getNativeCodeSpecification() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public String getPlatformFilter() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public BundleSpecification[] getRequiredBundles() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public ExportPackageDescription[] getResolvedImports() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public BundleDescription[] getResolvedRequires() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public ExportPackageDescription[] getSelectedExports() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public ExportPackageDescription[] getSubstitutedExports() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public String getSymbolicName() {
+            return this.symbolicName;
+        }
+
+        @Override
+        public Object getUserObject() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public boolean hasDynamicImports() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public boolean isRemovalPending() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public boolean isResolved() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public boolean isSingleton() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public void setUserObject(Object userObject) {
+            throw new UnsupportedOperationException();            
+        }
+       
+        @Override
+        public String getName() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public BundleDescription getSupplier() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public Version getVersion() {
+            return this.version;
+        }
+
+        @Override
+        public Map<String, String> getDeclaredDirectives() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public Map<String, Object> getDeclaredAttributes() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public List<BundleCapability> getDeclaredCapabilities(String namespace) {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public int getTypes() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public Bundle getBundle() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public ImportPackageSpecification[] getAddedDynamicImportPackages() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public GenericDescription[] getSelectedGenericCapabilities() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public GenericDescription[] getResolvedGenericRequires() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public BundleCapability getCapability() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public Map<String, Object> getAttributes() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public List<BundleRequirement> getDeclaredRequirements(String namespace) {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public BundleWiring getWiring() {
+            throw new UnsupportedOperationException();
+        }
+
+		@Override
+		public List<Capability> getCapabilities(String arg0) {
+			return null;
+		}
+
+		@Override
+		public List<Requirement> getRequirements(String arg0) {
+			return null;
+		}
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StandardQuasiBundleTests.java b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StandardQuasiBundleTests.java
new file mode 100644
index 0000000..8db4edc
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StandardQuasiBundleTests.java
@@ -0,0 +1,156 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.quasi;
+
+import java.util.List;
+
+import org.eclipse.equinox.region.Region;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiBundle;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiExportPackage;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiImportPackage;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiRequiredBundle;
+import org.eclipse.virgo.test.stubs.region.StubRegionDigraph;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.Version;
+
+/**
+ */
+public class StandardQuasiBundleTests {
+
+    private static final String BSN = "bsn";
+    
+    private static final Version BV = new Version("4.3.2.ga");
+    
+    private static final long BID = 2341341;
+
+    private StubBundleDescription bundleDescription;
+
+	private Region stubRegion;
+
+    @Before
+    public void setUp() throws BundleException {
+        this.stubRegion = new StubRegionDigraph().createRegion("testRegion");
+        this.bundleDescription = new StubBundleDescription();
+    }
+
+    @Test
+    public void testSymbolicName() {
+        bundleDescription.setBundleSymbolicName(BSN);
+        QuasiBundle qb = new StandardQuasiBundle(bundleDescription, null, null);
+        Assert.assertEquals(BSN, qb.getSymbolicName());
+    }
+    
+    @Test
+    public void testVersion() {
+        bundleDescription.setVersion(BV);
+        QuasiBundle qb = new StandardQuasiBundle(bundleDescription, null, null);
+        Assert.assertEquals(BV, qb.getVersion());
+    }
+    
+    @Test
+    public void testIsResolved() {
+        bundleDescription.setResolved(true);
+        QuasiBundle qb = new StandardQuasiBundle(bundleDescription, null, null);
+        Assert.assertEquals(true, qb.isResolved());
+    }
+    
+    @Test
+    public void testBundleId() {
+        bundleDescription.setBundleId(BID);
+        QuasiBundle qb = new StandardQuasiBundle(bundleDescription, null, null);
+        Assert.assertEquals(BID, qb.getBundleId());
+    }
+    
+    @Test
+    public void testFragments() {
+        bundleDescription.addFragment(new StubBundleDescription("f1"));
+        bundleDescription.addFragment(new StubBundleDescription("f2"));
+        QuasiBundle qb = new StandardQuasiBundle(bundleDescription, null, this.stubRegion);
+        List<QuasiBundle> fragments = qb.getFragments();
+        Assert.assertEquals(2, fragments.size());
+        Assert.assertEquals("f1", fragments.get(0).getSymbolicName());
+        Assert.assertEquals("f2", fragments.get(1).getSymbolicName());
+    }
+    
+    @Test
+    public void testNoFragments() {
+        QuasiBundle qb = new StandardQuasiBundle(bundleDescription, null, null);
+        List<QuasiBundle> fragments = qb.getFragments();
+        Assert.assertEquals(0, fragments.size());
+    }
+    
+    @Test
+    public void testHosts() {
+        bundleDescription.addHost(new StubBundleDescription("h1"));
+        bundleDescription.addHost(new StubBundleDescription("h2"));
+        QuasiBundle qb = new StandardQuasiBundle(bundleDescription, null, this.stubRegion);
+        List<QuasiBundle> hosts = qb.getHosts();
+        Assert.assertEquals(2, hosts.size());
+        Assert.assertEquals("h1", hosts.get(0).getSymbolicName());
+        Assert.assertEquals("h2", hosts.get(1).getSymbolicName());
+    }
+    
+    @Test
+    public void testNoHosts() {
+        QuasiBundle qb = new StandardQuasiBundle(bundleDescription, null, null);
+        List<QuasiBundle> hosts = qb.getHosts();
+        Assert.assertNull(hosts);
+    }
+    
+    @Test
+    public void testExportPackages() {
+        bundleDescription.addExportPackage(new StubExportPackageDescription("e1"));
+        bundleDescription.addExportPackage(new StubExportPackageDescription("e2"));
+        QuasiBundle qb = new StandardQuasiBundle(bundleDescription, null, null);
+        List<QuasiExportPackage> exportPackages = qb.getExportPackages();
+        Assert.assertEquals(2, exportPackages.size());
+        Assert.assertEquals("e1", exportPackages.get(0).getPackageName());
+        Assert.assertEquals("e2", exportPackages.get(1).getPackageName());
+    }
+    
+    @Test
+    public void testImportPackages() {
+        bundleDescription.addImportPackage(new StubImportPackageSpecification("i1"));
+        bundleDescription.addImportPackage(new StubImportPackageSpecification("i2"));
+        QuasiBundle qb = new StandardQuasiBundle(bundleDescription, null, null);
+        List<QuasiImportPackage> importPackages = qb.getImportPackages();
+        Assert.assertEquals(2, importPackages.size());
+        Assert.assertEquals("i1", importPackages.get(0).getPackageName());
+        Assert.assertEquals("i2", importPackages.get(1).getPackageName());
+    }
+    
+    @Test
+    public void testRequiredBundles() {
+        bundleDescription.addRequiredBundle(new StubBundleSpecification("b1"));
+        bundleDescription.addRequiredBundle(new StubBundleSpecification("b2"));
+        QuasiBundle qb = new StandardQuasiBundle(bundleDescription, null, null);
+        List<QuasiRequiredBundle> requiredBundles = qb.getRequiredBundles();
+        Assert.assertEquals(2, requiredBundles.size());
+        Assert.assertEquals("b1", requiredBundles.get(0).getRequiredBundleName());
+        Assert.assertEquals("b2", requiredBundles.get(1).getRequiredBundleName());
+    }
+    
+    @Test
+    public void testDependents() {
+        bundleDescription.addDependent(new StubBundleDescription("b1"));
+        bundleDescription.addDependent(new StubBundleDescription("b2"));
+        QuasiBundle qb = new StandardQuasiBundle(bundleDescription, null, this.stubRegion);
+        List<QuasiBundle> requiredBundles = qb.getDependents();
+        Assert.assertEquals(2, requiredBundles.size());
+        Assert.assertEquals("b1", requiredBundles.get(0).getSymbolicName());
+        Assert.assertEquals("b2", requiredBundles.get(1).getSymbolicName());
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StandardQuasiExportPackageTests.java b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StandardQuasiExportPackageTests.java
new file mode 100644
index 0000000..aae1d87
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StandardQuasiExportPackageTests.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.quasi;
+
+import java.util.List;
+
+import org.eclipse.equinox.region.Region;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiBundle;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiExportPackage;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiImportPackage;
+import org.eclipse.virgo.test.stubs.region.StubRegionDigraph;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.Version;
+
+/**
+ */
+public class StandardQuasiExportPackageTests {
+
+    private static final String BSN = "bsn";
+
+    private static final String PN = "p";
+
+    private static final Version VERSION = new Version("5.4.3");
+
+    private StubBundleDescription bundleDescription;
+
+    private StubExportPackageDescription exportPackage;
+
+    private QuasiBundle qb;
+
+	private Region stubRegion;
+
+    @Before
+    public void setUp() throws BundleException {
+        this.bundleDescription = new StubBundleDescription();
+        this.bundleDescription.setBundleSymbolicName(BSN);
+        this.stubRegion = new StubRegionDigraph().createRegion("testRegion");
+        this.qb = new StandardQuasiBundle(this.bundleDescription, null, this.stubRegion);
+        this.exportPackage = new StubExportPackageDescription(PN);
+    }
+
+    @Test
+    public void testPackageName() {
+        QuasiExportPackage qep = new StandardQuasiExportPackage(this.exportPackage, this.qb);
+        Assert.assertEquals(PN, qep.getPackageName());
+    }
+
+    @Test
+    public void testVersion() {
+        this.exportPackage.setVersion(VERSION);
+        QuasiExportPackage qep = new StandardQuasiExportPackage(this.exportPackage, this.qb);
+        Assert.assertEquals(PN, qep.getPackageName());
+    }
+
+    @Test
+    public void testExportingBundle() {
+        QuasiExportPackage qep = new StandardQuasiExportPackage(this.exportPackage, this.qb);
+        Assert.assertEquals(BSN, qep.getExportingBundle().getSymbolicName());
+    }
+
+    @Test
+    public void testConsumers() {
+        StubBundleDescription dependentBundle = new StubBundleDescription();
+        StubImportPackageSpecification ips = new StubImportPackageSpecification(PN);
+        dependentBundle.addImportPackage(ips);
+        ips.setSupplier(this.exportPackage);
+        this.bundleDescription.addDependent(dependentBundle);
+        this.exportPackage.setExporter(this.bundleDescription);
+        QuasiExportPackage qep = new StandardQuasiExportPackage(this.exportPackage, this.qb);
+        List<QuasiImportPackage> consumers = qep.getConsumers();
+        Assert.assertEquals(1, consumers.size());
+        Assert.assertEquals(PN, consumers.get(0).getPackageName());
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StandardQuasiImportPackageTests.java b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StandardQuasiImportPackageTests.java
new file mode 100644
index 0000000..dd5b7cd
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StandardQuasiImportPackageTests.java
@@ -0,0 +1,119 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.quasi;
+
+import org.eclipse.equinox.region.Region;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiBundle;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiImportPackage;
+import org.eclipse.virgo.test.stubs.region.StubRegionDigraph;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.BundleException;
+
+/**
+ */
+public class StandardQuasiImportPackageTests {
+
+    private static final String STRING_VERSION_RANGE = "[2,4)";
+
+    private static final org.eclipse.osgi.service.resolver.VersionRange RESOLVER_VERSION_RANGE = new org.eclipse.osgi.service.resolver.VersionRange(STRING_VERSION_RANGE);
+    
+    private static final VersionRange VERSION_RANGE = new VersionRange(STRING_VERSION_RANGE);
+
+    private static final String BSN = "bsn";
+    
+    private static final String PROVIDER_BSN = "provider-bsn";
+    
+    private static final String CONSUMER_BSN = "consumer-bsn";
+
+    private static final String PN = "p";
+
+    private StubBundleDescription bundleDescription;
+
+    private StubImportPackageSpecification importPackage;
+
+    private QuasiBundle qb;
+
+    private StubExportPackageDescription exportPackage;
+
+	private Region stubRegion;
+
+    @Before
+    public void setUp() throws BundleException {
+        this.bundleDescription = new StubBundleDescription();
+        this.bundleDescription.setBundleSymbolicName(BSN);
+        this.stubRegion = new StubRegionDigraph().createRegion("testRegion");
+        this.qb = new StandardQuasiBundle(this.bundleDescription, null, this.stubRegion);
+        this.importPackage = new StubImportPackageSpecification(PN);
+        this.exportPackage = new StubExportPackageDescription(PN);
+    }
+
+    @Test
+    public void testPackageName() {
+        QuasiImportPackage qip = new StandardQuasiImportPackage(this.importPackage, this.qb);
+        Assert.assertEquals(PN, qip.getPackageName());
+    }
+
+    @Test
+    public void testVersionConstraint() {
+        org.eclipse.osgi.service.resolver.VersionRange versionRange = RESOLVER_VERSION_RANGE;
+        this.importPackage.setVersionRange(versionRange);
+        QuasiImportPackage qip = new StandardQuasiImportPackage(this.importPackage, qb);
+        Assert.assertEquals(VERSION_RANGE, qip.getVersionConstraint());
+    }
+    
+    @Test
+    public void testResolved() {
+        this.importPackage.setResolved(true);
+        QuasiImportPackage qip = new StandardQuasiImportPackage(this.importPackage, this.qb);
+        Assert.assertTrue(qip.isResolved());
+    }
+    
+    @Test
+    public void testNotResolved() {
+        QuasiImportPackage qip = new StandardQuasiImportPackage(this.importPackage, this.qb);
+        Assert.assertFalse(qip.isResolved());
+    }
+    
+    @Test
+    public void testResolvedProvider() {
+        StubBaseDescription supplier = new StubBaseDescription();
+        StubBundleDescription bundleSupplier = new StubBundleDescription();
+        bundleSupplier.setBundleSymbolicName(PROVIDER_BSN);
+        supplier.setSupplier(bundleSupplier);
+        this.importPackage.setSupplier(supplier);
+        this.importPackage.setResolved(true);
+        StubBundleDescription bundleConsumer = new StubBundleDescription();
+        bundleConsumer.setBundleSymbolicName(CONSUMER_BSN);
+        this.importPackage.setBundle(bundleConsumer);
+        this.importPackage.setSupplier(this.exportPackage);
+        QuasiImportPackage qip = new StandardQuasiImportPackage(this.importPackage, qb);
+        this.exportPackage.setExporter(bundleSupplier);
+        Assert.assertEquals(PN, qip.getProvider().getPackageName());
+    }
+    
+    @Test
+    public void testUnresolvedProvider() {
+        QuasiImportPackage qip = new StandardQuasiImportPackage(this.importPackage, qb);
+        Assert.assertNull(qip.getProvider());
+    }
+    
+    @Test
+    public void testImportingBundle() {
+        QuasiImportPackage qip = new StandardQuasiImportPackage(this.importPackage, qb);
+        Assert.assertEquals(qb, qip.getImportingBundle());
+    }
+    
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StandardQuasiRequiredBundleTests.java b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StandardQuasiRequiredBundleTests.java
new file mode 100644
index 0000000..47da70d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StandardQuasiRequiredBundleTests.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.quasi;
+
+import org.eclipse.equinox.region.Region;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiBundle;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiRequiredBundle;
+import org.eclipse.virgo.test.stubs.region.StubRegionDigraph;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.BundleException;
+
+/**
+ */
+public class StandardQuasiRequiredBundleTests {
+    
+    private static final String STRING_VERSION_RANGE = "[2,4)";
+
+    private static final org.eclipse.osgi.service.resolver.VersionRange RESOLVER_VERSION_RANGE = new org.eclipse.osgi.service.resolver.VersionRange(STRING_VERSION_RANGE);
+    
+    private static final VersionRange VERSION_RANGE = new VersionRange(STRING_VERSION_RANGE);
+
+    private static final String BSN = "bsn";
+    
+    private static final String REQUIRED_BSN = "required-bsn";
+    
+    private StubBundleDescription bundleDescription;
+
+    private QuasiBundle qb;
+
+    private StubBundleSpecification bundleSpecification;
+    
+    private Region stubRegion;
+
+    @Before
+    public void setUp() throws BundleException {
+        this.bundleDescription = new StubBundleDescription();
+        this.bundleDescription.setBundleSymbolicName(BSN);
+        this.bundleSpecification = new StubBundleSpecification(REQUIRED_BSN);
+        this.stubRegion = new StubRegionDigraph().createRegion("testRegion");
+        this.qb = new StandardQuasiBundle(this.bundleDescription, null, this.stubRegion);
+    }
+
+    @Test
+    public void testRequiredBundleName() {
+        QuasiRequiredBundle qrb = new StandardQuasiRequiredBundle(this.bundleSpecification, this.qb);
+        Assert.assertEquals(REQUIRED_BSN, qrb.getRequiredBundleName());
+    }
+    
+    @Test
+    public void testVersionConstraint() {
+        this.bundleSpecification.setVersionRange(RESOLVER_VERSION_RANGE);
+        QuasiRequiredBundle qrb = new StandardQuasiRequiredBundle(this.bundleSpecification, this.qb);
+        Assert.assertEquals(VERSION_RANGE, qrb.getVersionConstraint());
+    }
+    
+    @Test
+    public void testResolved() {
+        this.bundleSpecification.setResolved(true);
+        QuasiRequiredBundle qrb = new StandardQuasiRequiredBundle(this.bundleSpecification, this.qb);
+        Assert.assertTrue(qrb.isResolved());
+    }
+    
+    @Test
+    public void testUnresolved() {
+        QuasiRequiredBundle qrb = new StandardQuasiRequiredBundle(this.bundleSpecification, this.qb);
+        Assert.assertFalse(qrb.isResolved());
+    }
+    
+    @Test
+    public void testUnresolvedProvider() {
+        QuasiRequiredBundle qrb = new StandardQuasiRequiredBundle(this.bundleSpecification, this.qb);
+        Assert.assertNull(qrb.getProvider());
+    }
+    
+    @Test
+    public void testResolvedProvider() {
+        StubBundleDescription requiredBundleDescription = new StubBundleDescription();
+        requiredBundleDescription.setBundleSymbolicName(REQUIRED_BSN);
+        QuasiBundle rqb = new StandardQuasiBundle(requiredBundleDescription, null, null);
+        QuasiRequiredBundle qrb = new StandardQuasiRequiredBundle(this.bundleSpecification, this.qb);
+        this.bundleSpecification.setResolved(true);
+        StubBaseDescription supplier = new StubBaseDescription();
+        supplier.setSupplier(requiredBundleDescription);
+        this.bundleSpecification.setSupplier(supplier);
+        Assert.assertEquals(rqb, qrb.getProvider());
+    }
+    
+    @Test
+    public void testRequiringBundle() {
+        QuasiRequiredBundle qrb = new StandardQuasiRequiredBundle(this.bundleSpecification, this.qb);
+        Assert.assertEquals(this.qb, qrb.getRequiringBundle());
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StubBaseDescription.java b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StubBaseDescription.java
new file mode 100644
index 0000000..7d419cd
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StubBaseDescription.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.quasi;
+
+import java.util.Map;
+
+import org.eclipse.osgi.service.resolver.BaseDescription;
+import org.eclipse.osgi.service.resolver.BundleDescription;
+import org.osgi.framework.Version;
+import org.osgi.framework.wiring.BundleCapability;
+
+public class StubBaseDescription implements BaseDescription {
+
+    private BundleDescription supplier;
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public String getName() {
+        throw new UnsupportedOperationException();
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public BundleDescription getSupplier() {
+        return this.supplier;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public Version getVersion() {
+        throw new UnsupportedOperationException();
+    }
+    
+    public void setSupplier(BundleDescription supplier) {
+        this.supplier = supplier;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public Map<String, String> getDeclaredDirectives() {
+        throw new UnsupportedOperationException();
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public Map<String, Object> getDeclaredAttributes() {
+        throw new UnsupportedOperationException();
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public BundleCapability getCapability() {
+        throw new UnsupportedOperationException();
+    }
+
+	@Override
+	public Object getUserObject() {
+		throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public void setUserObject(Object arg0) {
+	}
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StubBundleDescription.java b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StubBundleDescription.java
new file mode 100644
index 0000000..18e01ba
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StubBundleDescription.java
@@ -0,0 +1,498 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.quasi;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.osgi.service.resolver.BaseDescription;
+import org.eclipse.osgi.service.resolver.BundleDescription;
+import org.eclipse.osgi.service.resolver.BundleSpecification;
+import org.eclipse.osgi.service.resolver.ExportPackageDescription;
+import org.eclipse.osgi.service.resolver.GenericDescription;
+import org.eclipse.osgi.service.resolver.GenericSpecification;
+import org.eclipse.osgi.service.resolver.HostSpecification;
+import org.eclipse.osgi.service.resolver.ImportPackageSpecification;
+import org.eclipse.osgi.service.resolver.NativeCodeSpecification;
+import org.eclipse.osgi.service.resolver.State;
+import org.eclipse.osgi.service.resolver.VersionRange;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.Version;
+import org.osgi.framework.wiring.BundleRequirement;
+import org.osgi.framework.wiring.BundleWiring;
+import org.osgi.framework.wiring.BundleCapability;
+import org.osgi.resource.Capability;
+import org.osgi.resource.Requirement;
+
+public class StubBundleDescription implements BundleDescription {
+
+    private String bsn;
+
+    private Version bv;
+
+    private boolean resolved;
+
+    private long bid;
+
+    private List<BundleDescription> fragments = new ArrayList<BundleDescription>();
+
+    private List<BundleDescription> hosts = null;
+
+    private List<ExportPackageDescription> epds = new ArrayList<ExportPackageDescription>();
+
+    private List<ImportPackageSpecification> ipss = new ArrayList<ImportPackageSpecification>();
+
+    private List<BundleSpecification> rbs = new ArrayList<BundleSpecification>();
+
+    private List<BundleDescription> dependents = new ArrayList<BundleDescription>();
+
+    public StubBundleDescription() {
+    }
+
+    public StubBundleDescription(String bsn) {
+        this.bsn = bsn;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean attachFragments() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean dynamicFragments() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public long getBundleId() {
+        return this.bid;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public State getContainingState() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public BundleDescription[] getDependents() {
+        return this.dependents.toArray(new BundleDescription[this.dependents.size()]);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String[] getExecutionEnvironments() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public ExportPackageDescription[] getExportPackages() {
+        return this.epds.toArray(new ExportPackageDescription[this.epds.size()]);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public BundleDescription[] getFragments() {
+        return this.fragments.toArray(new BundleDescription[this.fragments.size()]);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public GenericDescription[] getGenericCapabilities() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public GenericSpecification[] getGenericRequires() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public HostSpecification getHost() {
+        return StubBundleDescription.this.hosts == null ? null : new HostSpecification() {
+
+            public BundleDescription[] getHosts() {
+                return StubBundleDescription.this.hosts.toArray(new BundleDescription[StubBundleDescription.this.hosts.size()]);
+            }
+
+            public boolean isMultiHost() {
+                throw new UnsupportedOperationException();
+            }
+
+            public BundleDescription getBundle() {
+                throw new UnsupportedOperationException();
+            }
+
+            public String getName() {
+                throw new UnsupportedOperationException();
+            }
+
+            public BaseDescription getSupplier() {
+                throw new UnsupportedOperationException();
+            }
+
+            public VersionRange getVersionRange() {
+                throw new UnsupportedOperationException();
+            }
+
+            public boolean isResolved() {
+                throw new UnsupportedOperationException();
+            }
+
+            public boolean isSatisfiedBy(BaseDescription supplier) {
+                throw new UnsupportedOperationException();
+            }
+
+            @Override
+            public BundleRequirement getRequirement() {
+                throw new UnsupportedOperationException();
+            }
+
+			@Override
+			public Object getUserObject() {
+				throw new UnsupportedOperationException();
+			}
+
+			@Override
+			public void setUserObject(Object arg0) {
+				throw new UnsupportedOperationException();
+			}
+
+        };
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public ImportPackageSpecification[] getImportPackages() {
+        return this.ipss.toArray(new ImportPackageSpecification[this.ipss.size()]);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String getLocation() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public NativeCodeSpecification getNativeCodeSpecification() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String getPlatformFilter() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public BundleSpecification[] getRequiredBundles() {
+        return this.rbs.toArray(new BundleSpecification[this.rbs.size()]);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public ExportPackageDescription[] getResolvedImports() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public BundleDescription[] getResolvedRequires() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public ExportPackageDescription[] getSelectedExports() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public ExportPackageDescription[] getSubstitutedExports() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String getSymbolicName() {
+        return this.bsn;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Object getUserObject() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean hasDynamicImports() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean isRemovalPending() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean isResolved() {
+        return this.resolved;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean isSingleton() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setUserObject(Object userObject) {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String getName() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public BundleDescription getSupplier() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Version getVersion() {
+        return this.bv;
+    }
+
+    public void setBundleSymbolicName(String bsn) {
+        this.bsn = bsn;
+    }
+
+    public void setVersion(Version bv) {
+        this.bv = bv;
+    }
+
+    public void setResolved(boolean resolved) {
+        this.resolved = resolved;
+    }
+
+    public void setBundleId(long bid) {
+        this.bid = bid;
+    }
+
+    public void addFragment(BundleDescription f) {
+        this.fragments.add(f);
+    }
+
+    public void addHost(StubBundleDescription bd) {
+        if (this.hosts == null) {
+            this.hosts = new ArrayList<BundleDescription>();
+        }
+        this.hosts.add(bd);
+    }
+
+    public void addExportPackage(ExportPackageDescription epd) {
+        this.epds.add(epd);
+    }
+
+    public void addImportPackage(ImportPackageSpecification ips) {
+        this.ipss.add(ips);
+    }
+
+    public void addRequiredBundle(BundleSpecification bs) {
+        this.rbs.add(bs);
+    }
+
+    public void addDependent(BundleDescription d) {
+        this.dependents.add(d);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Map<String, String> getDeclaredDirectives() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Map<String, Object> getDeclaredAttributes() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public List<BundleCapability> getDeclaredCapabilities(String namespace) {
+        throw new UnsupportedOperationException();
+    }
+    
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int getTypes() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Bundle getBundle() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public ImportPackageSpecification[] getAddedDynamicImportPackages() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public GenericDescription[] getSelectedGenericCapabilities() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public GenericDescription[] getResolvedGenericRequires() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public BundleCapability getCapability() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Map<String, Object> getAttributes() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public List<BundleRequirement> getDeclaredRequirements(String namespace) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public BundleWiring getWiring() {
+        throw new UnsupportedOperationException();
+    }
+
+	@Override
+	public List<Capability> getCapabilities(String arg0) {
+		throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public List<Requirement> getRequirements(String arg0) {
+		throw new UnsupportedOperationException();
+	}
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StubBundleSpecification.java b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StubBundleSpecification.java
new file mode 100644
index 0000000..cac9ada
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StubBundleSpecification.java
@@ -0,0 +1,117 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.quasi;
+
+import org.eclipse.osgi.service.resolver.BaseDescription;
+import org.eclipse.osgi.service.resolver.BundleDescription;
+import org.eclipse.osgi.service.resolver.BundleSpecification;
+import org.eclipse.osgi.service.resolver.VersionRange;
+import org.osgi.framework.wiring.BundleRequirement;
+
+public class StubBundleSpecification implements BundleSpecification {
+
+    private String name;
+    
+    private VersionRange versionRange;
+    
+    private boolean resolved = false;
+
+    private BaseDescription supplier;
+
+    public StubBundleSpecification(String name) {
+        this.name = name;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isExported() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isOptional() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public BundleDescription getBundle() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getName() {
+        return this.name;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public BaseDescription getSupplier() {
+        return this.supplier;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public VersionRange getVersionRange() {
+        return this.versionRange;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isResolved() {
+        return this.resolved;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isSatisfiedBy(BaseDescription supplier) {
+        throw new UnsupportedOperationException();
+    }
+    
+    public void setVersionRange(VersionRange versionRange) {
+        this.versionRange = versionRange;
+    }
+    
+    public void setResolved(boolean resolved) {
+        this.resolved = resolved;
+    }
+    
+    public void setSupplier(BaseDescription supplier) {
+        this.supplier = supplier;
+    }
+
+    @Override
+    public BundleRequirement getRequirement() {
+        throw new UnsupportedOperationException();
+    }
+
+	@Override
+	public Object getUserObject() {
+		throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public void setUserObject(Object arg0) {
+		throw new UnsupportedOperationException();
+	}
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StubExportPackageDescription.java b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StubExportPackageDescription.java
new file mode 100644
index 0000000..de458d7
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StubExportPackageDescription.java
@@ -0,0 +1,115 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.quasi;
+
+import java.util.Map;
+
+import org.eclipse.osgi.service.resolver.BundleDescription;
+import org.eclipse.osgi.service.resolver.ExportPackageDescription;
+import org.osgi.framework.Version;
+import org.osgi.framework.wiring.BundleCapability;
+
+public class StubExportPackageDescription extends StubParameterised implements ExportPackageDescription {
+
+    private String name;
+    
+    private Version version;
+
+    private BundleDescription exporter;
+
+    public StubExportPackageDescription(String name) {
+        this.name = name;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public BundleDescription getExporter() {
+        return this.exporter;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean isRoot() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String getName() {
+        return this.name;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public BundleDescription getSupplier() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Version getVersion() {
+        return this.version;
+    }
+
+    public void setVersion(Version version) {
+        this.version = version;
+    }
+    
+    public void setExporter(BundleDescription exporter) {
+        this.exporter = exporter;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Map<String, String> getDeclaredDirectives() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Map<String, Object> getDeclaredAttributes() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public BundleCapability getCapability() {
+        throw new UnsupportedOperationException();
+    }
+
+	@Override
+	public Object getUserObject() {
+		throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public void setUserObject(Object arg0) {
+		throw new UnsupportedOperationException();
+	}
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StubImportPackageSpecification.java b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StubImportPackageSpecification.java
new file mode 100644
index 0000000..d9efa86
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StubImportPackageSpecification.java
@@ -0,0 +1,125 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.quasi;
+
+import org.eclipse.osgi.service.resolver.BaseDescription;
+import org.eclipse.osgi.service.resolver.BundleDescription;
+import org.eclipse.osgi.service.resolver.ImportPackageSpecification;
+import org.eclipse.osgi.service.resolver.VersionRange;
+import org.osgi.framework.wiring.BundleRequirement;
+
+/**
+ */
+public class StubImportPackageSpecification extends StubParameterised implements ImportPackageSpecification {
+
+    private String name;
+    
+    private VersionRange versionRange;
+
+    private boolean resolved = false;
+
+    private BaseDescription supplier;
+
+    private BundleDescription bundle;
+
+    public StubImportPackageSpecification(String name) {
+        this.name = name;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getBundleSymbolicName() {
+        return "supplierBundle";
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public VersionRange getBundleVersionRange() {
+        return new VersionRange("[2.0.0, 4.0.0)");
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public BundleDescription getBundle() {
+        return this.bundle;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getName() {
+        return this.name;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public BaseDescription getSupplier() {
+        return this.supplier;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public VersionRange getVersionRange() {
+        return this.versionRange;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isResolved() {
+        return this.resolved ;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isSatisfiedBy(BaseDescription supplier) {
+        return this.name.equals(supplier.getName());
+    }
+    
+    public void setVersionRange(VersionRange versionRange) {
+        this.versionRange = versionRange;
+    }
+
+    public void setResolved(boolean b) {
+        this.resolved = b;
+    }
+    
+    public void setBundle(BundleDescription bundle) {
+        this.bundle = bundle;
+    }
+    
+    public void setSupplier(BaseDescription supplier) {
+        this.supplier = supplier;
+    }
+
+    @Override
+    public BundleRequirement getRequirement() {
+        throw new UnsupportedOperationException();
+    }
+
+	@Override
+	public Object getUserObject() {
+		throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public void setUserObject(Object arg0) {
+		throw new UnsupportedOperationException();
+	}
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StubParameterised.java b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StubParameterised.java
new file mode 100644
index 0000000..19262f4
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/java/org/eclipse/virgo/kernel/userregion/internal/quasi/StubParameterised.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregion.internal.quasi;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ */
+public abstract class StubParameterised {
+
+    Map<String, Object> attributes = new HashMap<String, Object>();
+
+    Map<String, Object> directives = new HashMap<String, Object>();
+
+    public Map<String, Object> getAttributes() {
+        return this.attributes;
+    }
+
+    public Object getDirective(String key) {
+        return this.directives.get(key);
+    }
+
+    public Map<String, Object> getDirectives() {
+        return this.directives;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/EquinoxOsgiFrameworkTests/faulty/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/EquinoxOsgiFrameworkTests/faulty/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..ba572df
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/EquinoxOsgiFrameworkTests/faulty/META-INF/MANIFEST.MF
@@ -0,0 +1,4 @@
+Bundle-SymbolicName: faulty
+Bundle-ManifestVersion: 2
+Bundle-Version: 1
+Import-Package: alpha
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/KernelBundleClassLoaderTests/dependant.jar b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/KernelBundleClassLoaderTests/dependant.jar
new file mode 100644
index 0000000..54b4006
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/KernelBundleClassLoaderTests/dependant.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/KernelBundleClassLoaderTests/depender.jar b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/KernelBundleClassLoaderTests/depender.jar
new file mode 100644
index 0000000..e522f57
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/KernelBundleClassLoaderTests/depender.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/eight/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/eight/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..b0b00a3
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/eight/META-INF/MANIFEST.MF
@@ -0,0 +1,4 @@
+Manifest-Version: 1.0
+Bundle-SymbolicName: install.eight
+Export-Package: install.eight
+Import-Package: install.six, install.seven
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/error/missingimport/bundle/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/error/missingimport/bundle/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..e34088c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/error/missingimport/bundle/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Bundle-SymbolicName: install.error.import
+Import-Package: does.not.exist
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/five/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/five/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..30bb1e3
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/five/META-INF/MANIFEST.MF
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0

+Bundle-SymbolicName: install.five

+Export-Package: install.five

+Require-Bundle: install.three

+

diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/four/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/four/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..cd43c08
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/four/META-INF/MANIFEST.MF
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0

+Import-Package: install.three

+Bundle-SymbolicName: install.four

+Export-Package: install.four

+

diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/fragments/unresolvable/bundle/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/fragments/unresolvable/bundle/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..9b7951f
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/fragments/unresolvable/bundle/META-INF/MANIFEST.MF
@@ -0,0 +1,2 @@
+Manifest-Version: 1.0
+Bundle-SymbolicName: fragments.unresolvable.host
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/fragments/unresolvable/fragment/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/fragments/unresolvable/fragment/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..8f3a985
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/fragments/unresolvable/fragment/META-INF/MANIFEST.MF
@@ -0,0 +1,4 @@
+Manifest-Version: 1.0
+Bundle-SymbolicName: fragments.unresolvable.frag
+Fragment-Host: fragments.unresolvable.host
+Import-Package: no.chance
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/multi/a/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/multi/a/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..002aa5b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/multi/a/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Bundle-SymbolicName: install.multi.a
+Export-Package: multi;version="1.2"
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/multi/b/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/multi/b/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..a239701
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/multi/b/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Bundle-SymbolicName: install.multi.b
+Export-Package: multi;version="1.3"
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/multi/bundle/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/multi/bundle/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..214cb9c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/multi/bundle/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Bundle-SymbolicName: install.multi.bundle
+Import-Package: multi;version="[1.2,1.4)"
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/nine/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/nine/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..9b7affd
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/nine/META-INF/MANIFEST.MF
@@ -0,0 +1,4 @@
+Manifest-Version: 1.0

+Import-Package: install.one

+Bundle-SymbolicName: install.nine

+

diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/one/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/one/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..7eccd98
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/one/META-INF/MANIFEST.MF
@@ -0,0 +1,4 @@
+Manifest-Version: 1.0

+Bundle-SymbolicName: install.one

+Export-Package: install.one

+

diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/optional/notsatindep/bundle/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/optional/notsatindep/bundle/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..3545444
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/optional/notsatindep/bundle/META-INF/MANIFEST.MF
@@ -0,0 +1,4 @@
+Manifest-Version: 1.0
+Bundle-SymbolicName: install.optional.dep.bundle
+Import-Package: pqr;resolution:=optional
+
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/optional/notsatindep/dep/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/optional/notsatindep/dep/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..15c0807
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/optional/notsatindep/dep/META-INF/MANIFEST.MF
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0
+Bundle-SymbolicName: install.optional.dep.dep
+Export-Package: pqr
+Import-Package: foo
+
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/optional/notsatisfied/bundle/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/optional/notsatisfied/bundle/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..f8f126c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/optional/notsatisfied/bundle/META-INF/MANIFEST.MF
@@ -0,0 +1,4 @@
+Manifest-Version: 1.0
+Bundle-SymbolicName: install.optional.ns
+Import-Package: p;resolution:=optional
+
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/outsiderepo/bundle/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/outsiderepo/bundle/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..4282016
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/outsiderepo/bundle/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Bundle-SymbolicName: install.outsiderepo
+Import-Package: install.standalone
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/seven/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/seven/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..18490cc
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/seven/META-INF/MANIFEST.MF
@@ -0,0 +1,4 @@
+Manifest-Version: 1.0
+Bundle-SymbolicName: install.seven
+Export-Package: install.seven
+Import-Package: install.six
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/six/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/six/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..e5ff528
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/six/META-INF/MANIFEST.MF
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0

+Import-Package: install.seven,install.eight

+Bundle-SymbolicName: install.six

+Export-Package: install.six

+

diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/three/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/three/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..c5a43e2
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/three/META-INF/MANIFEST.MF
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0

+Import-Package: install.two,install.one

+Bundle-SymbolicName: install.three

+Export-Package: install.three

+

diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/two/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/two/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..1573224
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/two/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Bundle-SymbolicName: install.two
+Export-Package: install.two
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/uses/bundle/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/uses/bundle/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..fd0eb33
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/uses/bundle/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Bundle-SymbolicName: install.uses.bundle
+Import-Package: uses.spring;version="[2.5.5, 2.5.5]",uses.hibernate;version="[3.2.6, 3.2.6]"
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/uses/hibernate325/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/uses/hibernate325/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..e68b24a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/uses/hibernate325/META-INF/MANIFEST.MF
@@ -0,0 +1,4 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: install.uses.hibernate325
+Export-Package: uses.hibernate;version="3.2.5"
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/uses/hibernate326/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/uses/hibernate326/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..53d31a2
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/uses/hibernate326/META-INF/MANIFEST.MF
@@ -0,0 +1,4 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: install.uses.hibernate326
+Export-Package: uses.hibernate;version="3.2.6"
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/uses/spring/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/uses/spring/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..365df33
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/uses/spring/META-INF/MANIFEST.MF
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: install.uses.spring
+Export-Package: uses.spring;version="2.5.5";uses:="uses.hibernate"
+Import-Package: uses.hibernate;version="[3.2.5, 3.2.5]"
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/x/high/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/x/high/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..f48164d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/x/high/META-INF/MANIFEST.MF
@@ -0,0 +1,4 @@
+Manifest-Version: 1.0
+Bundle-SymbolicName: install.x
+Bundle-Version: 1.4.6
+
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/x/low/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/x/low/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..195710c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/install/x/low/META-INF/MANIFEST.MF
@@ -0,0 +1,4 @@
+Manifest-Version: 1.0

+Bundle-SymbolicName: install.x

+Bundle-Version: 1.4.7

+

diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/standalone/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/standalone/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..b703d84
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/bit/standalone/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Bundle-SymbolicName: install.standalone
+Export-Package: install.standalone
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/config/BundleInstallationTests/repository.properties b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/config/BundleInstallationTests/repository.properties
new file mode 100644
index 0000000..55c3ddb
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/config/BundleInstallationTests/repository.properties
@@ -0,0 +1,43 @@
+bundles.type=external
+bundles.searchPattern=../{bundle}/target/classes
+
+ivy-cache-bundles.type=external
+ivy-cache-bundles.searchPattern=../${ivy.cache::ivy-cache}/repository/{org}/{name}/{version}/{bundle}.jar
+
+ivy-cache-libraries.type=external
+ivy-cache-libraries.searchPattern=../${ivy.cache::ivy-cache}/repository/{org}/{name}/{version}/{library}.libd
+
+src-test-resources-frag.type=external
+src-test-resources-frag.searchPattern=src/test/resources/frag/*
+
+src-test-resources-jars.type=external
+src-test-resources-jars.searchPattern=src/test/resources/jars/*.jar
+
+src-test-resources-bit-install-x.type=external
+src-test-resources-bit-install-x.searchPattern=src/test/resources/bit/install/x/*
+
+src-test-resources-bit-install.type=external
+src-test-resources-bit-install.searchPattern=src/test/resources/bit/install/*
+
+src-test-resources-fail.type=external
+src-test-resources-fail.searchPattern=src/test/resources/fail/*
+
+src-test-resources-bit-install-optional.type=external
+src-test-resources-bit-install-optional.searchPattern=src/test/resources/bit/install/optional/*/*
+
+src-test-resources-bit-install-error.type=external
+src-test-resources-bit-install-error.searchPattern=src/test/resources/bit/install/error/*/*
+
+src-test-resources-bit-install-fragments.type=external
+src-test-resources-bit-install-fragments.searchPattern=src/test/resources/bit/install/fragments/*/*
+
+src-test-resources-bit-install-outsiderepo.type=external
+src-test-resources-bit-install-outsiderepo.searchPattern=src/test/resources/bit/install/outsiderepo/*
+
+src-test-resources-bit-install-multi.type=external
+src-test-resources-bit-install-multi.searchPattern=src/test/resources/bit/install/multi/*
+
+src-test-resources-bit-install-uses.type=external
+src-test-resources-bit-install-uses.searchPattern=src/test/resources/bit/install/uses/*
+
+chain=bundles,ivy-cache-bundles,ivy-cache-libraries,src-test-resources-frag,src-test-resources-jars,src-test-resources-bit-install-x,src-test-resources-bit-install,src-test-resources-fail,src-test-resources-bit-install-optional,src-test-resources-bit-install-error,src-test-resources-bit-install-fragments,src-test-resources-bit-install-outsiderepo,src-test-resources-bit-install-multi,src-test-resources-bit-install-uses
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/config/BundleUpdateTests/repository.properties b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/config/BundleUpdateTests/repository.properties
new file mode 100644
index 0000000..55c3ddb
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/config/BundleUpdateTests/repository.properties
@@ -0,0 +1,43 @@
+bundles.type=external
+bundles.searchPattern=../{bundle}/target/classes
+
+ivy-cache-bundles.type=external
+ivy-cache-bundles.searchPattern=../${ivy.cache::ivy-cache}/repository/{org}/{name}/{version}/{bundle}.jar
+
+ivy-cache-libraries.type=external
+ivy-cache-libraries.searchPattern=../${ivy.cache::ivy-cache}/repository/{org}/{name}/{version}/{library}.libd
+
+src-test-resources-frag.type=external
+src-test-resources-frag.searchPattern=src/test/resources/frag/*
+
+src-test-resources-jars.type=external
+src-test-resources-jars.searchPattern=src/test/resources/jars/*.jar
+
+src-test-resources-bit-install-x.type=external
+src-test-resources-bit-install-x.searchPattern=src/test/resources/bit/install/x/*
+
+src-test-resources-bit-install.type=external
+src-test-resources-bit-install.searchPattern=src/test/resources/bit/install/*
+
+src-test-resources-fail.type=external
+src-test-resources-fail.searchPattern=src/test/resources/fail/*
+
+src-test-resources-bit-install-optional.type=external
+src-test-resources-bit-install-optional.searchPattern=src/test/resources/bit/install/optional/*/*
+
+src-test-resources-bit-install-error.type=external
+src-test-resources-bit-install-error.searchPattern=src/test/resources/bit/install/error/*/*
+
+src-test-resources-bit-install-fragments.type=external
+src-test-resources-bit-install-fragments.searchPattern=src/test/resources/bit/install/fragments/*/*
+
+src-test-resources-bit-install-outsiderepo.type=external
+src-test-resources-bit-install-outsiderepo.searchPattern=src/test/resources/bit/install/outsiderepo/*
+
+src-test-resources-bit-install-multi.type=external
+src-test-resources-bit-install-multi.searchPattern=src/test/resources/bit/install/multi/*
+
+src-test-resources-bit-install-uses.type=external
+src-test-resources-bit-install-uses.searchPattern=src/test/resources/bit/install/uses/*
+
+chain=bundles,ivy-cache-bundles,ivy-cache-libraries,src-test-resources-frag,src-test-resources-jars,src-test-resources-bit-install-x,src-test-resources-bit-install,src-test-resources-fail,src-test-resources-bit-install-optional,src-test-resources-bit-install-error,src-test-resources-bit-install-fragments,src-test-resources-bit-install-outsiderepo,src-test-resources-bit-install-multi,src-test-resources-bit-install-uses
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/config/EquinoxOsgiFrameworkTests/repository.properties b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/config/EquinoxOsgiFrameworkTests/repository.properties
new file mode 100644
index 0000000..58341ec
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/config/EquinoxOsgiFrameworkTests/repository.properties
@@ -0,0 +1,4 @@
+src-test-resources-faulty.type=external
+src-test-resources-faulty.searchPattern=src/test/resources/faulty/*.jar
+
+chain=src-test-resources-faulty
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/config/ImportExpansionHandlerTests/repository.properties b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/config/ImportExpansionHandlerTests/repository.properties
new file mode 100644
index 0000000..f5854cd
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/config/ImportExpansionHandlerTests/repository.properties
@@ -0,0 +1,13 @@
+bundles.type=external
+bundles.searchPattern=../{bundle}/target/classes
+
+src-test-resources-silht-libraries.type=external
+src-test-resources-silht-libraries.searchPattern=src/test/resources/silht/libraries/{name}.libd
+
+src-test-resources-silht-bundles.type=external
+src-test-resources-silht-bundles.searchPattern=src/test/resources/silht/bundles/{name}
+
+src-test-resources-ieh.type=external
+src-test-resources-ieh.searchPattern=src/test/resources/ieh/*
+
+chain=bundles,src-test-resources-silht-libraries,src-test-resources-silht-bundles,src-test-resources-ieh
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/config/InstallFromLocationTests/repository.properties b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/config/InstallFromLocationTests/repository.properties
new file mode 100644
index 0000000..4b83bd7
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/config/InstallFromLocationTests/repository.properties
@@ -0,0 +1,4 @@
+src-test-resources-empty.type=external
+src-test-resources-empty.searchPattern=src/test/resources/empty
+
+chain=src-test-resources-empty
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/config/KernelBundleClassLoaderTests/repository.properties b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/config/KernelBundleClassLoaderTests/repository.properties
new file mode 100644
index 0000000..a5e712c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/config/KernelBundleClassLoaderTests/repository.properties
@@ -0,0 +1,13 @@
+bundles.type=external
+bundles.searchPattern=../{bundle}/target/classes
+
+ivy-cache-bundles.type=external
+ivy-cache-bundles.searchPattern=../${ivy.cache::ivy-cache}/repository/{org}/{name}/{version}/{bundle}.jar
+
+ivy-cache-libraries.type=external
+ivy-cache-libraries.searchPattern=../${ivy.cache::ivy-cache}/repository/{org}/{name}/{version}/{library}.libd
+
+src-test-resources-resources.type=external
+src-test-resources-resources.searchPattern=src/test/resources/KernelBundleClassLoaderTests/*
+
+chain=bundles,ivy-cache-bundles,ivy-cache-libraries,src-test-resources-resources
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/config/LoadTimeWeavingTests/repository.properties b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/config/LoadTimeWeavingTests/repository.properties
new file mode 100644
index 0000000..611e33e
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/config/LoadTimeWeavingTests/repository.properties
@@ -0,0 +1,4 @@
+src-test-resources-ltw.type=external
+src-test-resources-ltw.searchPattern=src/test/resources/ltw/{bundle}.jar
+
+chain=src-test-resources-ltw
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/config/ResolutionStateDumperTests/repository.properties b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/config/ResolutionStateDumperTests/repository.properties
new file mode 100644
index 0000000..ca067ea
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/config/ResolutionStateDumperTests/repository.properties
@@ -0,0 +1,4 @@
+src-test-resources-rfd.type=external
+src-test-resources-rfd.searchPattern=src/test/resources/rfd/{name}
+
+chain=src-test-resources-rfd
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/config/UsesAnalyserTests/repository.properties b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/config/UsesAnalyserTests/repository.properties
new file mode 100644
index 0000000..ca067ea
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/config/UsesAnalyserTests/repository.properties
@@ -0,0 +1,4 @@
+src-test-resources-rfd.type=external
+src-test-resources-rfd.searchPattern=src/test/resources/rfd/{name}
+
+chain=src-test-resources-rfd
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/dependency-locator/config/repository.properties b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/dependency-locator/config/repository.properties
new file mode 100644
index 0000000..22f6874
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/dependency-locator/config/repository.properties
@@ -0,0 +1,7 @@
+bundles.type=external
+bundles.searchPattern=src/test/resources/dependency-locator/repository/bundles/{bundle}
+
+libraries.type=external
+libraries.searchPattern=src/test/resources/dependency-locator/repository/libraries/{library}
+
+chain=bundles,libraries
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/dependency-locator/lib/java5-server.profile b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/dependency-locator/lib/java5-server.profile
new file mode 100644
index 0000000..4fc9e2b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/dependency-locator/lib/java5-server.profile
@@ -0,0 +1,152 @@
+org.osgi.framework.system.packages = \
+ org.eclipse.virgo.server.serviceability.logging;version="1.0",\
+ org.eclipse.virgo.server.serviceability.output;version="1.0",\
+ org.eclipse.virgo.server.serviceability.tracing;version="1.0",\
+ 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.apache.commons.logging;version="1.1.1",\
+ org.apache.commons.logging.impl;version="1.1.1",\
+ 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.slf4j;version="1.5.0",\
+ org.slf4j.helpers;version="1.5.0",\
+ org.slf4j.impl;version="1.5.0",\
+ org.slf4j.spi;version="1.5.0",\
+ 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
+org.osgi.framework.bootdelegation = \
+ com_cenqua_clover,\
+ com.cenqua.*,\
+ com.yourkit.*,\
+ org.eclipse.virgo.server.bootstrap,\
+ org.eclipse.virgo.server.kernel.bootstrap,\
+ org.eclipse.virgo.server.osgi.*,\
+ com.sun.*,\
+ javax.xml.*,\
+ org.apache.xerces.jaxp.*,\
+ org.w3c.*,\
+ org.xml.*,\
+ sun.*
+org.osgi.framework.executionenvironment = \
+ OSGi/Minimum-1.0,\
+ OSGi/Minimum-1.1,\
+ J2SE-1.3,\
+ J2SE-1.4,\
+ J2SE-1.5
+osgi.java.profile.name = SpringSource-AP-Java5
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/dependency-locator/lib/java6-server.profile b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/dependency-locator/lib/java6-server.profile
new file mode 100644
index 0000000..5e41d4f
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/dependency-locator/lib/java6-server.profile
@@ -0,0 +1,216 @@
+org.osgi.framework.system.packages = \
+ org.eclipse.virgo.server.serviceability.logging;version="1.0",\
+ org.eclipse.virgo.server.serviceability.output;version="1.0",\
+ org.eclipse.virgo.server.serviceability.tracing;version="1.0",\
+ javax.accessibility,\
+ javax.activation,\
+ javax.activation;version="1.1.0",\
+ javax.activity,\
+ javax.annotation,\
+ javax.annotation;version="1.0.0",\
+ 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;version="2.0",\
+ javax.jws.soap,\
+ javax.jws.soap;version="2.0",\
+ 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.script;version="1.1",\
+ 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;version="1.0.1",\
+ javax.xml.bind,\
+ javax.xml.bind;version="2.0",\
+ javax.xml.bind.annotation,\
+ javax.xml.bind.annotation;version="2.0",\
+ javax.xml.bind.annotation.adapters,\
+ javax.xml.bind.annotation.adapters;version="2.0",\
+ javax.xml.bind.attachment,\
+ javax.xml.bind.attachment;version="2.0",\
+ javax.xml.bind.helpers,\
+ javax.xml.bind.helpers;version="2.0",\
+ javax.xml.bind.util,\
+ javax.xml.bind.util;version="2.0",\
+ javax.xml.crypto,\
+ javax.xml.crypto;version="1.0",\
+ javax.xml.crypto.dom,\
+ javax.xml.crypto.dom;version="1.0",\
+ javax.xml.crypto.dsig,\
+ javax.xml.crypto.dsig;version="1.0",\
+ javax.xml.crypto.dsig.dom,\
+ javax.xml.crypto.dsig.dom;version="1.0",\
+ javax.xml.crypto.dsig.keyinfo,\
+ javax.xml.crypto.dsig.keyinfo;version="1.0",\
+ javax.xml.crypto.dsig.spec,\
+ javax.xml.crypto.dsig.spec;version="1.0",\
+ javax.xml.datatype,\
+ javax.xml.namespace,\
+ javax.xml.parsers,\
+ javax.xml.soap,\
+ javax.xml.soap;version="1.3.0",\
+ javax.xml.stream,\
+ javax.xml.stream;version="1.0.1",\
+ javax.xml.stream.events,\
+ javax.xml.stream.events;version="1.0.1",\
+ javax.xml.stream.util,\
+ javax.xml.stream.util;version="1.0.1",\
+ 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;version="2.1.1",\
+ javax.xml.ws.handler,\
+ javax.xml.ws.handler;version="2.1.1",\
+ javax.xml.ws.handler.soap,\
+ javax.xml.ws.handler.soap;version="2.1.1",\
+ javax.xml.ws.http,\
+ javax.xml.ws.http;version="2.1.1",\
+ javax.xml.ws.soap,\
+ javax.xml.ws.soap;version="2.1.1",\
+ javax.xml.ws.spi,\
+ javax.xml.ws.spi;version="2.1.1",\
+ javax.xml.xpath,\
+ org.apache.commons.logging;version="1.1.1",\
+ org.apache.commons.logging.impl;version="1.1.1",\
+ 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.slf4j;version="1.5.0",\
+ org.slf4j.helpers;version="1.5.0",\
+ org.slf4j.impl;version="1.5.0",\
+ org.slf4j.spi;version="1.5.0",\
+ 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
+org.osgi.framework.bootdelegation = \
+ com_cenqua_clover,\
+ com.cenqua.*,\
+ com.yourkit.*,\
+ org.eclipse.virgo.server.bootstrap,\
+ org.eclipse.virgo.server.bootstrap.*,\
+ org.eclipse.virgo.server.kernel.bootstrap,\
+ org.eclipse.virgo.server.osgi.*,\
+ com.sun.*,\
+ javax.xml.*,\
+ org.apache.xerces.jaxp.*,\
+ org.w3c.*,\
+ org.xml.*,\
+ sun.*
+org.osgi.framework.executionenvironment = \
+ OSGi/Minimum-1.0,\
+ OSGi/Minimum-1.1,\
+ J2SE-1.3,\
+ J2SE-1.4,\
+ J2SE-1.5,\
+ JavaSE-1.6
+osgi.java.profile.name = SpringSource-AP-Java6
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/dependency-locator/lib/org.eclipse.osgi-3.4.0.v20080529-1200.jar b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/dependency-locator/lib/org.eclipse.osgi-3.4.0.v20080529-1200.jar
new file mode 100644
index 0000000..3d1f125
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/dependency-locator/lib/org.eclipse.osgi-3.4.0.v20080529-1200.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/dependency-locator/lib/server.profile b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/dependency-locator/lib/server.profile
new file mode 100644
index 0000000..2f28c08
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/dependency-locator/lib/server.profile
@@ -0,0 +1,146 @@
+org.osgi.framework.system.packages = \
+ org.eclipse.virgo.server.serviceability.logging;version="1.0",\
+ org.eclipse.virgo.server.serviceability.output;version="1.0",\
+ org.eclipse.virgo.server.serviceability.tracing;version="1.0",\
+ 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.apache.commons.logging;version="1.1.1",\
+ org.apache.commons.logging.impl;version="1.1.1",\
+ 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.slf4j;version="1.5.0",\
+ org.slf4j.helpers;version="1.5.0",\
+ org.slf4j.impl;version="1.5.0",\
+ org.slf4j.spi;version="1.5.0",\
+ org.w3c.dom,\
+ org.w3c.dom.bootstrap,\
+ org.w3c.dom.events,\
+ org.w3c.dom.ls,\
+ org.xml.sax,\
+ org.xml.sax.ext,\
+ org.xml.sax.helpers
+org.osgi.framework.bootdelegation = \
+ com_cenqua_clover,\
+ com.cenqua.*,\
+ com.yourkit.*,\
+ org.eclipse.virgo.server.bootstrap,\
+ org.eclipse.virgo.server.kernel.bootstrap,\
+ org.eclipse.virgo.server.osgi.*,\
+ com.sun.*,\
+ javax.xml.*,\
+ org.apache.xerces.jaxp.*,\
+ org.w3c.*,\
+ org.xml.*,\
+ sun.*
+org.osgi.framework.executionenvironment = \
+ OSGi/Minimum-1.0,\
+ OSGi/Minimum-1.1,\
+ J2SE-1.3,\
+ J2SE-1.4,\
+ J2SE-1.5
+osgi.java.profile.name = SpringSource-AP
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/fail/child/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/fail/child/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..c97a480
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/fail/child/META-INF/MANIFEST.MF
@@ -0,0 +1,6 @@
+Manifest-Version: 1
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: fail.child
+Bundle-Version: 1.0.0
+Export-Package: fail.child;version="1.2.3"
+Import-Package: fail.bar;version="1.2.3.";resolution:=optional
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/fail/parent/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/fail/parent/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..3c8b0e6
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/fail/parent/META-INF/MANIFEST.MF
@@ -0,0 +1,5 @@
+Manifest-Version: 1
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: fail.parent
+Bundle-Version: 1.0.0
+Import-Package: fail.child
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/frag/child/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/frag/child/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..2795c80
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/frag/child/META-INF/MANIFEST.MF
@@ -0,0 +1,5 @@
+Manifest-Version: 1
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: frag.child
+Bundle-Version: 1.0.0
+Fragment-Host: frag.host
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/frag/host/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/frag/host/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..47a5db6
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/frag/host/META-INF/MANIFEST.MF
@@ -0,0 +1,4 @@
+Manifest-Version: 1
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: frag.host
+Bundle-Version: 1.0.0
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/iflt/bundles/four/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/iflt/bundles/four/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..8076c3c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/iflt/bundles/four/META-INF/MANIFEST.MF
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: bundle.four
+Export-Package: bundle.four
+Import-Package: bundle.one
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/iflt/bundles/one/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/iflt/bundles/one/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..16e0d17
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/iflt/bundles/one/META-INF/MANIFEST.MF
@@ -0,0 +1,4 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: bundle.one
+Export-Package: bundle.one
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/iflt/bundles/three/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/iflt/bundles/three/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..6227004
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/iflt/bundles/three/META-INF/MANIFEST.MF
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: bundle.three
+Export-Package: bundle.three
+Import-Package: bundle.two
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/iflt/bundles/two/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/iflt/bundles/two/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..334988a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/iflt/bundles/two/META-INF/MANIFEST.MF
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: bundle.two
+Export-Package: bundle.two
+Import-Package: bundle.three
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/jars/dummy.jar b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/jars/dummy.jar
new file mode 100644
index 0000000..7ab5fb3
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/jars/dummy.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/jars/mockbundle.jar b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/jars/mockbundle.jar
new file mode 100644
index 0000000..d6c3b93
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/jars/mockbundle.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/ltw/ltw-domain.jar b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/ltw/ltw-domain.jar
new file mode 100644
index 0000000..3adc23f
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/ltw/ltw-domain.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/ltw/ltw-em.jar b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/ltw/ltw-em.jar
new file mode 100644
index 0000000..22342b3
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/ltw/ltw-em.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/ltw/ltw-include.jar b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/ltw/ltw-include.jar
new file mode 100644
index 0000000..06c0b6c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/ltw/ltw-include.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/platform170/simpleosgiapp-1.0.0.jar b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/platform170/simpleosgiapp-1.0.0.jar
new file mode 100644
index 0000000..bb69660
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/platform170/simpleosgiapp-1.0.0.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/platform170/simpleosgiapp-2.0.0.jar b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/platform170/simpleosgiapp-2.0.0.jar
new file mode 100644
index 0000000..30a8128
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/platform170/simpleosgiapp-2.0.0.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/platform170/simpleosgiservice-1.0.0.jar b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/platform170/simpleosgiservice-1.0.0.jar
new file mode 100644
index 0000000..0e844c8
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/platform170/simpleosgiservice-1.0.0.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/platform170/simpleosgiservice-2.0.0.jar b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/platform170/simpleosgiservice-2.0.0.jar
new file mode 100644
index 0000000..d1d6e2d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/platform170/simpleosgiservice-2.0.0.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/rfd-other/other/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/rfd-other/other/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..3169dff
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/rfd-other/other/META-INF/MANIFEST.MF
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: rfd.az
+Bundle-Version: 1.0
+Export-Package: rfd.az
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/rfd/a/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/rfd/a/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..deb3204
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/rfd/a/META-INF/MANIFEST.MF
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: rfd.a
+Bundle-Version: 1.0
+Import-Package: rfd.b, rfd.az
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/rfd/app/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/rfd/app/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..1379171
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/rfd/app/META-INF/MANIFEST.MF
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: rfd.app
+Bundle-Version: 1.0
+Export-Package: rfd.app
+Import-Package: rfd.hibernate;version="2.0",rfd.spring.orm
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/rfd/b/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/rfd/b/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..df7b55c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/rfd/b/META-INF/MANIFEST.MF
@@ -0,0 +1,7 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: rfd.b
+Bundle-Version: 1.0
+Import-Package: rfd.c
+Export-Package: rfd.b
+
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/rfd/c/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/rfd/c/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..2b73232
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/rfd/c/META-INF/MANIFEST.MF
@@ -0,0 +1,7 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: rfd.c
+Bundle-Version: 1.0
+Import-Package: rfd.d
+Export-Package: rfd.c
+
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/rfd/hibernate/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/rfd/hibernate/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..1ad8417
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/rfd/hibernate/META-INF/MANIFEST.MF
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: rfd.hibernate
+Bundle-Version: 1.0
+Export-Package: rfd.hibernate;version="1.0"
+
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/rfd/hibernate2/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/rfd/hibernate2/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..69f69d2
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/rfd/hibernate2/META-INF/MANIFEST.MF
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: rfd.hibernate
+Bundle-Version: 2.0
+Export-Package: rfd.hibernate;version="2.0"
+
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/rfd/spring/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/rfd/spring/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..7c8dc59
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/rfd/spring/META-INF/MANIFEST.MF
@@ -0,0 +1,7 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: rfd.spring
+Bundle-Version: 1.0
+Export-Package: rfd.spring.orm;uses:=rfd.hibernate
+Import-Package: rfd.hibernate
+
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/rfd/web/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/rfd/web/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..26dbeec
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/rfd/web/META-INF/MANIFEST.MF
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: rfd.web
+Bundle-Version: 1.0
+Import-Package: rfd.app
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/silht/bundles/fragmentOne/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/silht/bundles/fragmentOne/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..069c59c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/silht/bundles/fragmentOne/META-INF/MANIFEST.MF
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: com.foo.fragment.one
+Bundle-Version: 1.0
+Fragment-Host: com.foo.host;bundle-version="[1.0, 2.0)"
+Export-Package: com.foo.host;version="1.5"
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/silht/bundles/fragmentThree/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/silht/bundles/fragmentThree/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..b3a48a3
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/silht/bundles/fragmentThree/META-INF/MANIFEST.MF
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: com.foo.fragment.three
+Fragment-Host: com.foo.host
+Export-Package: com.foo.fragment.three;version="1.0"
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/silht/bundles/fragmentTwo/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/silht/bundles/fragmentTwo/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..b771681
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/silht/bundles/fragmentTwo/META-INF/MANIFEST.MF
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: com.foo.fragment.two
+Bundle-Version: 3
+Fragment-Host: com.foo.host;bundle-version="[1.0, 2.0)"
+Export-Package: com.foo.fragment.two;version="1.0",com.foo.host.b;version="1.0"
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/silht/bundles/fragmentwithnoexports/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/silht/bundles/fragmentwithnoexports/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..9367936
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/silht/bundles/fragmentwithnoexports/META-INF/MANIFEST.MF
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0
+Bundle-SymbolicName: silht.bundles.fragmentwithnoexports
+Bundle-ManifestVersion: 2
+Bundle-Name: Fragment bundle with no exports
+Bundle-Version: 1.0
+Fragment-Host: silht.bundles.noexports
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/silht/bundles/host/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/silht/bundles/host/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..c241855
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/silht/bundles/host/META-INF/MANIFEST.MF
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: com.foo.host
+Bundle-Version: 1.2
+Export-Package: com.foo.host;version="1.0",com.foo.host.a;version="1.0",com.foo.host.b;version="1.0"
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/silht/bundles/multi-version-export/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/silht/bundles/multi-version-export/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..2b039eb
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/silht/bundles/multi-version-export/META-INF/MANIFEST.MF
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: multi.version.export
+Bundle-Version: 1.0
+Export-Package: a;version=1.0,a;version=2.0,a;version=3.0
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/silht/bundles/noexports/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/silht/bundles/noexports/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..028ae76
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/silht/bundles/noexports/META-INF/MANIFEST.MF
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0
+Bundle-SymbolicName: silht.bundles.noexports
+Bundle-ManifestVersion: 2
+Bundle-Name: Bundle with no exports
+Bundle-Version: 1.0
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/silht/bundles/overlapper/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/silht/bundles/overlapper/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..2470149
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/silht/bundles/overlapper/META-INF/MANIFEST.MF
@@ -0,0 +1,4 @@
+Manifest-Version: 1
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: overlapper
+Export-Package: javax.crypto.spec,javax.imageio,javax.imageio.event,overlapper.pkg
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/silht/libraries/com.foo.libd b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/silht/libraries/com.foo.libd
new file mode 100644
index 0000000..32df9f8
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/silht/libraries/com.foo.libd
@@ -0,0 +1,3 @@
+Library-SymbolicName: com.foo
+Library-Version: 1.0
+Import-Bundle: com.foo.host, com.foo.fragment.one, com.foo.fragment.two
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/silht/libraries/missing.optional.bundle.libd b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/silht/libraries/missing.optional.bundle.libd
new file mode 100644
index 0000000..b96a3fd
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/silht/libraries/missing.optional.bundle.libd
@@ -0,0 +1,3 @@
+Library-SymbolicName: missing.optional.bundle
+Library-Version: 1.0
+Import-Bundle: no.such.bundle;resolution:=optional
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/silht/libraries/spring.libd b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/silht/libraries/spring.libd
new file mode 100644
index 0000000..0a8bfd6
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/silht/libraries/spring.libd
@@ -0,0 +1,4 @@
+Library-SymbolicName: org.springframework
+Library-Version: 4.2.9
+Import-Bundle: org.springframework.core;version="[4.2.9.RELEASE,4.2.9.RELEASE]",
+ org.springframework.beans;version="[4.2.9.RELEASE,4.2.9.RELEASE]"
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/testDump/.gitignore b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/testDump/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/testDump/.gitignore
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/uat/dependent/bundles/p/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/uat/dependent/bundles/p/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..6e96a65
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/uat/dependent/bundles/p/META-INF/MANIFEST.MF
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: uat.dependent.p
+Bundle-Version: 1.0
+Import-Package: q,r;version="[1.1,1.2)",s
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/uat/dependent/bundles/q/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/uat/dependent/bundles/q/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..7be90f5
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/uat/dependent/bundles/q/META-INF/MANIFEST.MF
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: uat.dependent.q
+Bundle-Version: 1.0
+Import-Package: r;version="[1.0, 1.1)",s
+Export-Package: q;version="1.0";uses:="r,s"
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/uat/dependent/bundles/r1/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/uat/dependent/bundles/r1/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..ec7f492
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/uat/dependent/bundles/r1/META-INF/MANIFEST.MF
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: uat.dependent.r
+Bundle-Version: 1.0
+Export-Package: r;version="1.0"
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/uat/dependent/bundles/r2/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/uat/dependent/bundles/r2/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..c80a5c6
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/uat/dependent/bundles/r2/META-INF/MANIFEST.MF
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: uat.dependent.r
+Bundle-Version: 1.1
+Export-Package: r;version="1.1"
+
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/uat/dependent/bundles/s1/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/uat/dependent/bundles/s1/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..bad89e8
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/uat/dependent/bundles/s1/META-INF/MANIFEST.MF
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: uat.dependent.s
+Bundle-Version: 1.0
+Export-Package: s;version="1.0"
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/uat/dependent/bundles/s2/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/uat/dependent/bundles/s2/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..3a65759
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/uat/dependent/bundles/s2/META-INF/MANIFEST.MF
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: uat.dependent.s
+Bundle-Version: 1.1
+Export-Package: s;version="1.1"
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/uat/install/bundles/p/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/uat/install/bundles/p/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..6540f1d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/uat/install/bundles/p/META-INF/MANIFEST.MF
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: uat.install.p
+Bundle-Version: 1.0
+Import-Package: q,r;version="[1.1,1.2]",s
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/uat/install/bundles/q/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/uat/install/bundles/q/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..e7d1849
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/uat/install/bundles/q/META-INF/MANIFEST.MF
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: uat.install.q
+Bundle-Version: 1.0
+Import-Package: r;version="[1.0, 1.1]",s
+Export-Package: q;version="1.0";uses:="r,s"
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/uat/install/bundles/r1/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/uat/install/bundles/r1/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..cd69b1f
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/uat/install/bundles/r1/META-INF/MANIFEST.MF
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: uat.install.r
+Bundle-Version: 1.0
+Export-Package: r;version="1.0"
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/uat/install/bundles/r2/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/uat/install/bundles/r2/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..556fc78
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/uat/install/bundles/r2/META-INF/MANIFEST.MF
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: uat.install.r
+Bundle-Version: 1.1
+Export-Package: r;version="1.1"
+
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/uat/install/bundles/s1/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/uat/install/bundles/s1/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..bfb6f6a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/uat/install/bundles/s1/META-INF/MANIFEST.MF
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: uat.install.s
+Bundle-Version: 1.0
+Export-Package: s;version="1.0"
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/uat/install/bundles/s2/META-INF/MANIFEST.MF b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/uat/install/bundles/s2/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..b4b57cf
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/uat/install/bundles/s2/META-INF/MANIFEST.MF
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: uat.install.s
+Bundle-Version: 1.1
+Export-Package: s;version="1.1"
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/uat/transitiveconstraint/tmA.jar b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/uat/transitiveconstraint/tmA.jar
new file mode 100644
index 0000000..55fe933
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/uat/transitiveconstraint/tmA.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/uat/transitiveconstraint/tmB.jar b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/uat/transitiveconstraint/tmB.jar
new file mode 100644
index 0000000..0ad7b28
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/uat/transitiveconstraint/tmB.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/uat/transitiveconstraint/tmC.jar b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/uat/transitiveconstraint/tmC.jar
new file mode 100644
index 0000000..aaf6e54
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/uat/transitiveconstraint/tmC.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/uat/transitiveconstraint/tmD.jar b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/uat/transitiveconstraint/tmD.jar
new file mode 100644
index 0000000..b269ce3
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/src/test/resources/uat/transitiveconstraint/tmD.jar
Binary files differ
diff --git a/kernel/org.eclipse.virgo.kernel.userregion/template.mf b/kernel/org.eclipse.virgo.kernel.userregion/template.mf
new file mode 100644
index 0000000..bb26e58
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregion/template.mf
@@ -0,0 +1,28 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Virgo Kernel user region management
+Bundle-SymbolicName: org.eclipse.virgo.kernel.userregion
+Bundle-Version: ${version}
+Excluded-Exports:
+ *.internal.*
+Excluded-Imports:
+ org.eclipse.virgo.kernel.services.repository.internal.*,
+ org.eclipse.virgo.kernel.userregion.internal.*,
+ org.eclipse.virgo.repository.internal
+Import-Template:
+ org.eclipse.equinox.region.*;version="${equinoxRegionExportedPackageVersion:[=.=.=, =.+1)}",
+ org.eclipse.virgo.kernel.*;version="${version:[=.=.=, =.+1)}",
+ org.eclipse.virgo.medic.*;version="${version:[=.=.=, =.+1)}",
+ org.eclipse.virgo.nano.*;version="${version:[=.=.=, =.+1)}",
+ org.eclipse.virgo.repository.*;version="${version:[=.=.=, =.+1)}",
+ org.eclipse.virgo.util.*;version="${version:[=.=.=, =.+1)}",
+ org.aspectj.*;version="${aspectjVersion:[=.=.=, +1)}",
+ org.slf4j.*;version="${slf4jVersion:[=.=.=, +1)}",
+ org.springframework.*;version="${springframeworkVersion:[2.5.6, +1)}",
+ org.eclipse.osgi.*;version="0",
+ org.osgi.framework.*;version="0",
+ org.osgi.service.*;version="0",
+ org.osgi.util.*;version="0",
+ javax.management;version="0"
+Bundle-Activator: org.eclipse.virgo.kernel.userregion.internal.Activator
+Import-Package: org.eclipse.virgo.medic.log;version="0"
diff --git a/kernel/org.eclipse.virgo.kernel.userregionfactory/.settings/org.eclipse.wst.common.project.facet.core.xml b/kernel/org.eclipse.virgo.kernel.userregionfactory/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..92aa290
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregionfactory/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+  <installed facet="org.eclipse.virgo.server.bundle" version="1.0"/>
+</faceted-project>
diff --git a/kernel/org.eclipse.virgo.kernel.userregionfactory/.springBeans b/kernel/org.eclipse.virgo.kernel.userregionfactory/.springBeans
new file mode 100644
index 0000000..55e47c5
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregionfactory/.springBeans
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beansProjectDescription>
+	<version>1</version>
+	<pluginVersion><![CDATA[2.5.0.201010141000-RC1]]></pluginVersion>
+	<configSuffixes>
+		<configSuffix><![CDATA[xml]]></configSuffix>
+	</configSuffixes>
+	<enableImports><![CDATA[false]]></enableImports>
+	<configs>
+	</configs>
+	<configSets>
+	</configSets>
+</beansProjectDescription>
diff --git a/kernel/org.eclipse.virgo.kernel.userregionfactory/src/main/java/org/eclipse/virgo/kernel/userregionfactory/Activator.java b/kernel/org.eclipse.virgo.kernel.userregionfactory/src/main/java/org/eclipse/virgo/kernel/userregionfactory/Activator.java
new file mode 100644
index 0000000..c8d5309
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregionfactory/src/main/java/org/eclipse/virgo/kernel/userregionfactory/Activator.java
@@ -0,0 +1,366 @@
+/*******************************************************************************
+ * This file is part of the Virgo Web Server.
+ *
+ * Copyright (c) 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    SpringSource, a division of VMware - initial API and implementation and/or initial documentation
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregionfactory;
+
+import static org.eclipse.virgo.kernel.osgi.framework.ServiceUtils.getPotentiallyDelayedService;
+
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Dictionary;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.equinox.region.Region;
+import org.eclipse.equinox.region.RegionDigraph;
+import org.eclipse.equinox.region.RegionFilter;
+import org.eclipse.equinox.region.RegionFilterBuilder;
+import org.eclipse.virgo.nano.core.Shutdown;
+import org.eclipse.virgo.medic.dump.DumpGenerator;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.util.parser.launcher.ArgumentParser;
+import org.eclipse.virgo.util.parser.launcher.BundleEntry;
+import org.eclipse.virgo.util.osgi.ServiceRegistrationTracker;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifestFactory;
+import org.eclipse.virgo.util.osgi.manifest.ImportedPackage;
+import org.eclipse.virgo.util.osgi.manifest.RequireBundle;
+import org.eclipse.virgo.util.osgi.manifest.RequiredBundle;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.Constants;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.Version;
+import org.osgi.framework.startlevel.FrameworkStartLevel;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+
+/**
+ * {@link Activator} initialises the user region factory bundle.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Not thread safe.
+ * 
+ */
+public final class Activator {
+
+    private static final int DEFAULT_BUNDLE_START_LEVEL = 4;
+
+    private static final String KERNEL_REGION_NAME = "org.eclipse.equinox.region.kernel";
+
+    private static final String CLASS_LIST_SEPARATOR = ",";
+
+    private static final String USER_REGION_CONFIGURATION_PID = "org.eclipse.virgo.kernel.userregion";
+
+    private static final String USER_REGION_BASE_BUNDLES_PROPERTY = "baseBundles";
+
+    private static final String USER_REGION_PACKAGE_IMPORTS_PROPERTY = "packageImports";
+
+    private static final String USER_REGION_SERVICE_IMPORTS_PROPERTY = "serviceImports";
+
+    private static final String USER_REGION_BUNDLE_IMPORTS_PROPERTY = "bundleImports";
+
+    private static final String USER_REGION_SERVICE_EXPORTS_PROPERTY = "serviceExports";
+
+    private static final String USER_REGION_BUNDLE_CONTEXT_SERVICE_PROPERTY = "org.eclipse.virgo.kernel.regionContext";
+
+    private static final String REGION_USER = "org.eclipse.virgo.region.user";
+
+    private static final String EVENT_REGION_STARTING = "org/eclipse/virgo/kernel/region/STARTING";
+
+    private static final String EVENT_PROPERTY_REGION_BUNDLECONTEXT = "region.bundleContext";
+
+    private static final String WILDCARD = "*";
+    
+    private EventAdmin eventAdmin;
+
+    private String regionBundles;
+
+    private String regionPackageImports;
+
+    private String regionServiceImports;
+
+    private String regionBundleImports;
+
+    private String regionServiceExports;
+
+    private BundleContext bundleContext;
+
+    private final ArgumentParser parser = new ArgumentParser();
+
+    private final ServiceRegistrationTracker tracker = new ServiceRegistrationTracker();
+
+    private DumpGenerator dumpGenerator;
+
+    public void activate(ComponentContext componentContext) throws Exception {
+        this.bundleContext = componentContext.getBundleContext();
+        
+        FrameworkStartLevel frameworkStartLevel = (FrameworkStartLevel)componentContext.getBundleContext().getBundle(0).adapt(FrameworkStartLevel.class);
+        frameworkStartLevel.setInitialBundleStartLevel(DEFAULT_BUNDLE_START_LEVEL);
+        
+        this.dumpGenerator = getPotentiallyDelayedService(bundleContext, DumpGenerator.class);
+        RegionDigraph regionDigraph = getPotentiallyDelayedService(bundleContext, RegionDigraph.class);
+        this.eventAdmin = getPotentiallyDelayedService(bundleContext, EventAdmin.class);
+        ConfigurationAdmin configAdmin = getPotentiallyDelayedService(bundleContext, ConfigurationAdmin.class);
+        EventLogger eventLogger = getPotentiallyDelayedService(bundleContext, EventLogger.class);
+        Shutdown shutdown = getPotentiallyDelayedService(bundleContext, Shutdown.class);
+        getRegionConfiguration(configAdmin, eventLogger, shutdown);
+
+        createUserRegion(regionDigraph, eventLogger);
+    }
+    
+    private void getRegionConfiguration(ConfigurationAdmin configAdmin, EventLogger eventLogger, Shutdown shutdown) {
+        try {
+            Configuration config = configAdmin.getConfiguration(USER_REGION_CONFIGURATION_PID, null);
+
+            Dictionary<String, Object> properties = config.getProperties();
+
+            if (properties != null) {
+                this.regionBundles = properties.get(USER_REGION_BASE_BUNDLES_PROPERTY).toString();
+                this.regionPackageImports = properties.get(USER_REGION_PACKAGE_IMPORTS_PROPERTY).toString();
+                this.regionServiceImports = properties.get(USER_REGION_SERVICE_IMPORTS_PROPERTY).toString();
+                this.regionBundleImports = properties.get(USER_REGION_BUNDLE_IMPORTS_PROPERTY).toString();
+                this.regionServiceExports = properties.get(USER_REGION_SERVICE_EXPORTS_PROPERTY).toString();
+            } else {
+                eventLogger.log(UserRegionFactoryLogEvents.USER_REGION_CONFIGURATION_UNAVAILABLE);
+                shutdown.immediateShutdown();
+            }
+        } catch (Exception e) {
+            eventLogger.log(UserRegionFactoryLogEvents.USER_REGION_CONFIGURATION_UNAVAILABLE, e);
+            shutdown.immediateShutdown();
+        }
+    }
+
+    private void createUserRegion(RegionDigraph regionDigraph, EventLogger eventLogger) throws BundleException, InvalidSyntaxException {
+
+        BundleContext systemBundleContext = getSystemBundleContext();
+        Bundle userRegionFactoryBundle = this.bundleContext.getBundle();
+
+        Region kernelRegion = getKernelRegion(regionDigraph);
+        kernelRegion.removeBundle(userRegionFactoryBundle);
+
+        Region userRegion = regionDigraph.createRegion(REGION_USER);
+        userRegion.addBundle(userRegionFactoryBundle);
+
+        RegionFilter kernelFilter = createKernelFilter(regionDigraph, systemBundleContext, eventLogger);
+        userRegion.connectRegion(kernelRegion, kernelFilter);
+
+        RegionFilter userRegionFilter = createUserRegionFilter(regionDigraph);
+        kernelRegion.connectRegion(userRegion, userRegionFilter);
+
+        notifyUserRegionStarting(this.bundleContext);
+
+        initialiseUserRegionBundles(userRegion);
+
+        registerRegionService(userRegion);
+        publishUserRegionBundleContext(this.bundleContext);
+    }
+
+    private RegionFilter createUserRegionFilter(RegionDigraph digraph) throws InvalidSyntaxException {
+        Collection<String> serviceFilters = classesToFilter(this.regionServiceExports);
+        RegionFilterBuilder builder = digraph.createRegionFilterBuilder();
+        for (String filter : serviceFilters) {
+            builder.allow(RegionFilter.VISIBLE_SERVICE_NAMESPACE, filter);
+        }
+        return builder.build();
+    }
+
+    private Region getKernelRegion(RegionDigraph regionDigraph) {
+        return regionDigraph.getRegion(KERNEL_REGION_NAME);
+    }
+
+    private RegionFilter createKernelFilter(RegionDigraph digraph, BundleContext systemBundleContext, EventLogger eventLogger)
+        throws BundleException, InvalidSyntaxException {
+        RegionFilterBuilder builder = digraph.createRegionFilterBuilder();
+        Collection<String> allowedBundles = allowImportedBundles(eventLogger);
+        for (String filter : allowedBundles) {
+            builder.allow(RegionFilter.VISIBLE_BUNDLE_NAMESPACE, filter);
+        }
+        Collection<String> allowedPackages = createUserRegionPackageImportPolicy(systemBundleContext, eventLogger);
+        for (String filter : allowedPackages) {
+            builder.allow(RegionFilter.VISIBLE_PACKAGE_NAMESPACE, filter);
+        }
+        Collection<String> allowedServices = classesToFilter(this.regionServiceImports);
+        for (String filter : allowedServices) {
+            builder.allow(RegionFilter.VISIBLE_SERVICE_NAMESPACE, filter);
+        }
+        return builder.build();
+    }
+
+    private Collection<String> allowImportedBundles(EventLogger eventLogger) {
+        String userRegionBundleImports = this.regionBundleImports != null ? this.regionBundleImports
+            : this.bundleContext.getProperty(USER_REGION_BUNDLE_IMPORTS_PROPERTY);
+
+        RequireBundle bundleImportsAsRequireBundle = representBundleImportsAsRequireBundle(userRegionBundleImports, eventLogger);
+        return importBundleToFilter(bundleImportsAsRequireBundle.getRequiredBundles());
+    }
+
+    private RequireBundle representBundleImportsAsRequireBundle(String userRegionBundleImportsProperty, EventLogger eventLogger) {
+        Dictionary<String, String> headers = new Hashtable<String, String>();
+        headers.put("Require-Bundle", userRegionBundleImportsProperty);
+        BundleManifest manifest = BundleManifestFactory.createBundleManifest(headers, new UserRegionFactoryParserLogger(eventLogger));
+        return manifest.getRequireBundle();
+    }
+
+    private static Collection<String> importBundleToFilter(List<RequiredBundle> importedBundles) {
+        if (importedBundles == null || importedBundles.isEmpty())
+            return Collections.emptyList();
+        Collection<String> result = new ArrayList<String>(importedBundles.size());
+        for (RequiredBundle importedBundle : importedBundles) {
+            StringBuilder f = new StringBuilder();
+            f.append("(&(").append(RegionFilter.VISIBLE_BUNDLE_NAMESPACE).append('=').append(importedBundle.getBundleSymbolicName()).append(')');
+            addRange(Constants.BUNDLE_VERSION_ATTRIBUTE, importedBundle.getBundleVersion(), f);
+            f.append(')');
+            result.add(f.toString());
+        }
+        return result;
+    }
+
+    private static Collection<String> importPackageToFilter(String importList) {
+        if (importList == null || importList.isEmpty()) {
+            return Collections.emptyList();
+        }
+        if (importList.contains(WILDCARD)) {
+            throw new IllegalArgumentException("Wildcards not supported in region imports: '" + importList + "'");
+        }
+        BundleManifest manifest = BundleManifestFactory.createBundleManifest();
+        manifest.setHeader("Import-Package", importList);
+        List<ImportedPackage> list = manifest.getImportPackage().getImportedPackages();
+        if (list.isEmpty())
+            return Collections.emptyList();
+        Collection<String> filters = new ArrayList<String>(list.size());
+        for (ImportedPackage importedPackage : list) {
+            StringBuilder f = new StringBuilder();
+            f.append("(&(").append(RegionFilter.VISIBLE_PACKAGE_NAMESPACE).append('=').append(importedPackage.getPackageName()).append(')');
+            Map<String, String> attrs = importedPackage.getAttributes();
+            for (Map.Entry<String, String> attr : attrs.entrySet()) {
+                if (Constants.VERSION_ATTRIBUTE.equals(attr.getKey()) || Constants.BUNDLE_VERSION_ATTRIBUTE.equals(attr.getKey())) {
+                    addRange(attr.getKey(), new VersionRange(attr.getValue()), f);
+                } else {
+                    f.append('(').append(attr.getKey()).append('=').append(attr.getValue()).append(')');
+                }
+            }
+            f.append(')');
+            filters.add(f.toString());
+        }
+        return filters;
+    }
+
+    private static void addRange(String key, VersionRange range, StringBuilder f) {
+        if (range.isFloorInclusive()) {
+            f.append('(' + key + ">=" + range.getFloor() + ')');
+        } else {
+            f.append("(!(" + key + "<=" + range.getFloor() + "))");
+        }
+        Version ceiling = range.getCeiling();
+        if (ceiling != null) {
+            if (range.isCeilingInclusive()) {
+                f.append('(' + key + "<=" + ceiling + ')');
+            } else {
+                f.append("(!(" + key + ">=" + ceiling + "))");
+            }
+        }
+    }
+
+    private static Collection<String> classesToFilter(String classList) {
+        if (classList == null) {
+            return Collections.emptyList();
+        }
+        String[] classes = classList.split(CLASS_LIST_SEPARATOR);
+        if (classes.length == 0) {
+            return Collections.emptyList();
+        }
+        Collection<String> result = new ArrayList<String>(classes.length);
+        for (String className : classes) {
+            result.add("(objectClass=" + className + ")");
+        }
+        return result;
+    }
+
+    private Collection<String> createUserRegionPackageImportPolicy(BundleContext systemBundleContext, EventLogger eventLogger) {
+        String userRegionImportsProperty = this.regionPackageImports != null ? this.regionPackageImports
+            : this.bundleContext.getProperty(USER_REGION_PACKAGE_IMPORTS_PROPERTY);
+        String expandedUserRegionImportsProperty = null;
+        if (userRegionImportsProperty != null) {
+            expandedUserRegionImportsProperty = PackageImportWildcardExpander.expandPackageImportsWildcards(userRegionImportsProperty,
+                systemBundleContext, eventLogger);
+        }
+        return importPackageToFilter(expandedUserRegionImportsProperty);
+    }
+
+    private BundleContext getSystemBundleContext() {
+        return this.bundleContext.getBundle(0L).getBundleContext();
+    }
+
+    private void notifyUserRegionStarting(BundleContext userRegionBundleContext) {
+        Map<String, Object> properties = new HashMap<String, Object>();
+        properties.put(EVENT_PROPERTY_REGION_BUNDLECONTEXT, userRegionBundleContext);
+        this.eventAdmin.sendEvent(new Event(EVENT_REGION_STARTING, properties));
+    }
+
+    private void initialiseUserRegionBundles(Region userRegion) throws BundleException {
+
+        String userRegionBundlesProperty = this.regionBundles != null ? this.regionBundles
+            : this.bundleContext.getProperty(USER_REGION_BASE_BUNDLES_PROPERTY);
+
+        if (userRegionBundlesProperty != null) {
+            List<Bundle> bundlesToStart = new ArrayList<Bundle>();
+
+            for (BundleEntry entry : this.parser.parseBundleEntries(userRegionBundlesProperty)) {
+                URI uri = entry.getURI();
+                Bundle bundle = userRegion.installBundle(uri.toString());
+
+                if (entry.isAutoStart()) {
+                    bundlesToStart.add(bundle);
+                }
+            }
+
+            for (Bundle bundle : bundlesToStart) {
+                try {
+                    bundle.start();
+                } catch (BundleException e) {
+                    // Take state dump for diagnosis of resolution failures
+                    this.dumpGenerator.generateDump("User region bundle failed to start", e);
+                    throw new BundleException("Failed to start bundle " + bundle.getSymbolicName() + " " + bundle.getVersion(), e);
+                }
+            }
+        }
+    }
+
+    private void registerRegionService(Region region) {
+        Dictionary<String, String> props = new Hashtable<String, String>();
+        props.put("org.eclipse.virgo.kernel.region.name", region.getName());
+        this.tracker.track(this.bundleContext.registerService(Region.class, region, props));
+    }
+
+    private void publishUserRegionBundleContext(BundleContext userRegionBundleContext) {
+        Dictionary<String, String> properties = new Hashtable<String, String>();
+        properties.put(USER_REGION_BUNDLE_CONTEXT_SERVICE_PROPERTY, "true");
+        this.bundleContext.registerService(BundleContext.class, userRegionBundleContext, properties);
+    }
+
+    public void deactivate(ComponentContext context) throws Exception {
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregionfactory/src/main/java/org/eclipse/virgo/kernel/userregionfactory/PackageImportWildcardExpander.java b/kernel/org.eclipse.virgo.kernel.userregionfactory/src/main/java/org/eclipse/virgo/kernel/userregionfactory/PackageImportWildcardExpander.java
new file mode 100644
index 0000000..2a6ff4b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregionfactory/src/main/java/org/eclipse/virgo/kernel/userregionfactory/PackageImportWildcardExpander.java
@@ -0,0 +1,132 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregionfactory;
+
+import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.virgo.nano.serviceability.Assert;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifestFactory;
+import org.eclipse.virgo.util.osgi.manifest.DynamicImportPackage;
+import org.eclipse.virgo.util.osgi.manifest.DynamicallyImportedPackage;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.packageadmin.ExportedPackage;
+import org.osgi.service.packageadmin.PackageAdmin;
+
+/**
+ * {@link PackageImportWildcardExpander} expands the wildcards in a string containing the body of an import package
+ * header.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread safe.
+ * 
+ */
+@SuppressWarnings("deprecation")
+final class PackageImportWildcardExpander {
+
+    private static final String wildcard = "*";
+
+    static String expandPackageImportsWildcards(String userRegionImportsProperty, BundleContext systemBundleContext, EventLogger eventLogger) {
+        String[] exportedPackageNames = getExportedPackageNames(systemBundleContext);
+
+        return expandWildcards(userRegionImportsProperty, exportedPackageNames, eventLogger);
+    }
+
+    private static String[] getExportedPackageNames(BundleContext bundleContext) {
+        Set<String> exportedPackageNames = new HashSet<String>();
+        for (ExportedPackage exportedPackage : getExportedPackages(bundleContext)) {
+            exportedPackageNames.add(exportedPackage.getName());
+        }
+        return exportedPackageNames.toArray(new String[exportedPackageNames.size()]);
+    }
+
+    private static ExportedPackage[] getExportedPackages(BundleContext bundleContext) {
+        ServiceReference<PackageAdmin> paServiceReference = bundleContext.getServiceReference(PackageAdmin.class);
+        PackageAdmin pa = bundleContext.getService(paServiceReference);
+
+        ExportedPackage[] exportedPackages = pa.getExportedPackages((Bundle) null);
+        Assert.notNull(exportedPackages, "Expected at least one exported package");
+        
+        bundleContext.ungetService(paServiceReference);
+        
+        return exportedPackages;
+    }
+
+    private static String expandWildcards(String userRegionImportsProperty, String[] exportedPackageNamess, EventLogger eventLogger) {
+        DynamicImportPackage dynamicImportPackage = representImportsAsDynamicImports(userRegionImportsProperty, eventLogger);
+        return expandWildcards(dynamicImportPackage, exportedPackageNamess, eventLogger);
+    }
+
+    private static DynamicImportPackage representImportsAsDynamicImports(String userRegionImportsProperty, EventLogger eventLogger) {
+        Dictionary<String, String> headers = new Hashtable<String, String>();
+        headers.put("DynamicImport-Package", userRegionImportsProperty);
+
+        BundleManifest manifest = BundleManifestFactory.createBundleManifest(headers, new UserRegionFactoryParserLogger(eventLogger));
+        return manifest.getDynamicImportPackage();
+    }
+
+    private static String expandWildcards(DynamicImportPackage dynamicImportPackage, String[] exportedPackageNames, EventLogger eventLogger) {
+        StringBuffer expandedPackages = new StringBuffer();
+        boolean first = true;
+        List<DynamicallyImportedPackage> dynamicallyImportedPackages = dynamicImportPackage.getDynamicallyImportedPackages();
+        for (DynamicallyImportedPackage dynamicallyImportedPackage : dynamicallyImportedPackages) {
+            String possiblyWildcardedPackageName = dynamicallyImportedPackage.getPackageName();
+            if (possiblyWildcardedPackageName.endsWith(wildcard)) {
+                List<String> expansions = expandWildcard(possiblyWildcardedPackageName, exportedPackageNames, eventLogger);
+                for (String expansion : expansions) {
+                    dynamicallyImportedPackage.setPackageName(expansion);
+                    if (first) {
+                        first = false;
+                    } else {
+                        expandedPackages.append(",");
+                    }
+                    expandedPackages.append(dynamicallyImportedPackage.toParseString());
+                }
+            } else {
+                if (first) {
+                    first = false;
+                } else {
+                    expandedPackages.append(",");
+                }
+                expandedPackages.append(dynamicallyImportedPackage.toParseString());
+            }
+
+        }
+        return expandedPackages.toString();
+    }
+
+    private static List<String> expandWildcard(String wildcardedPackageName, String[] exportedPackageNames, EventLogger eventLogger) {
+        List<String> expansions = new ArrayList<String>();
+
+        String prefix = wildcardedPackageName.substring(0, wildcardedPackageName.length() - 1);
+        for (String exportedPackage : exportedPackageNames) {
+            if (exportedPackage.startsWith(prefix)) {
+                expansions.add(exportedPackage);
+            }
+        }
+        if (expansions.isEmpty()) {
+            eventLogger.log(UserRegionFactoryLogEvents.REGION_IMPORT_NO_MATCH, wildcardedPackageName);
+        }
+        return expansions;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregionfactory/src/main/java/org/eclipse/virgo/kernel/userregionfactory/UserRegionFactoryLogEvents.java b/kernel/org.eclipse.virgo.kernel.userregionfactory/src/main/java/org/eclipse/virgo/kernel/userregionfactory/UserRegionFactoryLogEvents.java
new file mode 100644
index 0000000..507fde5
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregionfactory/src/main/java/org/eclipse/virgo/kernel/userregionfactory/UserRegionFactoryLogEvents.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ ******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregionfactory;
+
+import org.eclipse.virgo.nano.serviceability.LogEventDelegate;
+import org.eclipse.virgo.medic.eventlog.Level;
+import org.eclipse.virgo.medic.eventlog.LogEvent;
+
+/**
+ * {@link org.eclipse.virgo.medic.eventlog.LogEvent} for the OSGi provisioning bundle.
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.
+ * 
+ */
+public enum UserRegionFactoryLogEvents implements LogEvent {
+
+    REGION_IMPORTS_PARSE_FAILED(1, Level.ERROR), //
+    REGION_IMPORT_NO_MATCH(2, Level.WARNING), //
+    USER_REGION_CONFIGURATION_UNAVAILABLE(10, Level.ERROR);
+
+    private static final String PREFIX = "UF";
+
+    private final LogEventDelegate delegate;
+
+    private UserRegionFactoryLogEvents(int code, Level level) {
+        this.delegate = new LogEventDelegate(PREFIX, code, level);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getEventCode() {
+        return this.delegate.getEventCode();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Level getLevel() {
+        return this.delegate.getLevel();
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregionfactory/src/main/java/org/eclipse/virgo/kernel/userregionfactory/UserRegionFactoryParserLogger.java b/kernel/org.eclipse.virgo.kernel.userregionfactory/src/main/java/org/eclipse/virgo/kernel/userregionfactory/UserRegionFactoryParserLogger.java
new file mode 100644
index 0000000..d36ca6c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregionfactory/src/main/java/org/eclipse/virgo/kernel/userregionfactory/UserRegionFactoryParserLogger.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregionfactory;
+
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.util.osgi.manifest.parse.ParserLogger;
+
+/**
+ * {@link UserRegionFactoryParserLogger} maps OSGi bundle manifest parsing errors to a log message.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+final class UserRegionFactoryParserLogger implements ParserLogger {
+
+    private final EventLogger eventLogger;
+
+    public UserRegionFactoryParserLogger(EventLogger eventLogger) {
+        this.eventLogger = eventLogger;
+    }
+
+    public String[] errorReports() {
+        return new String[0];
+    }
+
+    public void outputErrorMsg(Exception re, String item) {
+        this.eventLogger.log(UserRegionFactoryLogEvents.REGION_IMPORTS_PARSE_FAILED, re, item);
+    }
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregionfactory/src/main/resources/EventLogMessages.properties b/kernel/org.eclipse.virgo.kernel.userregionfactory/src/main/resources/EventLogMessages.properties
new file mode 100644
index 0000000..340bb1f
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregionfactory/src/main/resources/EventLogMessages.properties
@@ -0,0 +1,16 @@
+################################################################################
+# Copyright (c) 2011 SAP AG
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#    Hristo Iliev, SAP AG - initial contribution
+################################################################################
+
+# User region factory
+UF0001E=Region imports parsing failed: {}.
+UF0002W=No match found for region import: {}.
+
+UF0010E=User region configuration unavailable.
diff --git a/kernel/org.eclipse.virgo.kernel.userregionfactory/src/main/resources/OSGI-INF/userregionfactory.xml b/kernel/org.eclipse.virgo.kernel.userregionfactory/src/main/resources/OSGI-INF/userregionfactory.xml
new file mode 100644
index 0000000..c0bc731
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregionfactory/src/main/resources/OSGI-INF/userregionfactory.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" immediate="true" name="User Region Factory Component">
+	<implementation class="org.eclipse.virgo.kernel.userregionfactory.Activator"/>
+	<reference name="EventLogger"
+		interface="org.eclipse.virgo.medic.eventlog.EventLogger"
+		policy="static"/>
+	<reference name="DumpGenerator"
+		interface="org.eclipse.virgo.medic.dump.DumpGenerator"
+		policy="static"/>	
+	<reference name="ConfigAdmin"
+		interface="org.osgi.service.cm.ConfigurationAdmin"
+		policy="static"/>
+  	<reference name="EventAdmin"
+		interface="org.osgi.service.event.EventAdmin"
+		policy="static"/>
+	<reference name="Shutdown"
+		interface="org.eclipse.virgo.nano.core.Shutdown"
+		policy="static"/>
+	<reference name="RegionDigraph"
+		interface="org.eclipse.equinox.region.RegionDigraph"
+		policy="static"/>
+	<reference name="Repository"
+		interface="org.eclipse.virgo.repository.Repository"
+		policy="static"/>		
+</scr:component>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.kernel.userregionfactory/src/test/java/org/eclipse/virgo/kernel/userregionfactory/PackageImportWildcardExpanderTests.java b/kernel/org.eclipse.virgo.kernel.userregionfactory/src/test/java/org/eclipse/virgo/kernel/userregionfactory/PackageImportWildcardExpanderTests.java
new file mode 100644
index 0000000..732f2c2
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregionfactory/src/test/java/org/eclipse/virgo/kernel/userregionfactory/PackageImportWildcardExpanderTests.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.userregionfactory;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+import org.osgi.service.packageadmin.ExportedPackage;
+import org.osgi.service.packageadmin.PackageAdmin;
+
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+
+/**
+ */
+@SuppressWarnings("deprecation")
+public class PackageImportWildcardExpanderTests {
+
+    private StubBundleContext stubBundleContext;
+
+    private EventLogger mockEventLogger;
+
+    private PackageAdmin mockPackageAdmin;
+
+    private ExportedPackage[] exportedPackages;
+
+    @Before
+    public void setUp() throws Exception {
+        this.stubBundleContext = new StubBundleContext();
+
+        this.mockEventLogger = createMock(EventLogger.class);
+        replay(this.mockEventLogger);
+
+        this.mockPackageAdmin = createMock(PackageAdmin.class);
+        this.exportedPackages = new ExportedPackage[] { createdMockExportedPackage("q"), createdMockExportedPackage("r.a"),
+            createdMockExportedPackage("r.b.c") };
+        expect(this.mockPackageAdmin.getExportedPackages((Bundle) null)).andReturn(this.exportedPackages);
+        replay(this.mockPackageAdmin);
+        this.stubBundleContext.registerService(PackageAdmin.class.getName(), this.mockPackageAdmin, null);
+    }
+
+    private ExportedPackage createdMockExportedPackage(String packageName) {
+        ExportedPackage pkg = createMock(ExportedPackage.class);
+        expect(pkg.getName()).andReturn(packageName);
+        replay(pkg);
+        return pkg;
+    }
+
+    @Test
+    public void testNoWildcards() {
+        String expansion = PackageImportWildcardExpander.expandPackageImportsWildcards("p,r", this.stubBundleContext, mockEventLogger);
+        assertEquals("Incorrect expansion", "p,r", expansion);
+    }
+
+    @Test
+    public void testWildcards() {
+        String expansion = PackageImportWildcardExpander.expandPackageImportsWildcards("r.*", this.stubBundleContext, mockEventLogger);
+        assertEquals("Incorrect expansion", "r.a,r.b.c", expansion);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.kernel.userregionfactory/src/test/resources/.gitignore b/kernel/org.eclipse.virgo.kernel.userregionfactory/src/test/resources/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregionfactory/src/test/resources/.gitignore
diff --git a/kernel/org.eclipse.virgo.kernel.userregionfactory/template.mf b/kernel/org.eclipse.virgo.kernel.userregionfactory/template.mf
new file mode 100644
index 0000000..7b2b63e
--- /dev/null
+++ b/kernel/org.eclipse.virgo.kernel.userregionfactory/template.mf
@@ -0,0 +1,20 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Virgo Kernel User Region Factory
+Bundle-SymbolicName: org.eclipse.virgo.kernel.userregionfactory
+Service-Component: OSGI-INF/userregionfactory.xml
+Bundle-Version: ${version}
+Import-Template: 
+ org.eclipse.virgo.kernel.*;version="${version:[=.=.=, =.+1)}",
+ org.eclipse.virgo.nano.*;version="${version:[=.=.=, =.+1)}",
+ org.eclipse.virgo.util.*;version="${version:[=.=.=, =.+1)}",
+ org.eclipse.osgi.framework.*;version="0",
+ org.eclipse.osgi.service.resolver.*;version="0",
+ org.osgi.framework.*;version="0",
+ org.osgi.service.*;version="0",
+ org.eclipse.virgo.medic.*;version="${version:[=.=.=, =.+1)}",
+ org.eclipse.equinox.region.*;version="${equinoxRegionExportedPackageVersion:[=.=.=, =.+1)}"
+Import-Package: org.aspectj.lang;version="0"
+Excluded-Imports: org.easymock,
+ org.eclipse.virgo.test.*
+Excluded-Exports: *
diff --git a/kernel/org.eclipse.virgo.management.console/images/attribute-base.svg b/kernel/org.eclipse.virgo.management.console/images/attribute-base.svg
new file mode 100644
index 0000000..1446c88
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/images/attribute-base.svg
@@ -0,0 +1,343 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
+   width="744.09448"
+   height="1052.3622"
+   id="svg2"
+   style="enable-background:new"
+   inkscape:version="0.47 r22583"
+   sodipodi:docname="attribute-base.svg">
+  <metadata
+     id="metadata41">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1023"
+     inkscape:window-height="1077"
+     id="namedview39"
+     showgrid="false"
+     inkscape:zoom="0.89702957"
+     inkscape:cx="394.34305"
+     inkscape:cy="659.95595"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="layer2" />
+  <defs
+     id="defs4">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective43" />
+    <linearGradient
+       id="linearGradient3731">
+      <stop
+         id="stop3733"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop3735"
+         style="stop-color:#002f5e;stop-opacity:1;"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3642">
+      <stop
+         id="stop3644"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop3646"
+         style="stop-color:#ffffff;stop-opacity:0.66666669"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       x1="267.85715"
+       y1="265.21933"
+       x2="350"
+       y2="142.36218"
+       id="linearGradient3656"
+       xlink:href="#linearGradient3642"
+       gradientUnits="userSpaceOnUse" />
+    <filter
+       color-interpolation-filters="sRGB"
+       id="filter3690">
+      <feGaussianBlur
+         id="feGaussianBlur3692"
+         stdDeviation="2.3132272" />
+    </filter>
+    <linearGradient
+       x1="267.85715"
+       y1="265.21933"
+       x2="350"
+       y2="142.36218"
+       id="linearGradient3721"
+       xlink:href="#linearGradient3642"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       cx="247.79221"
+       cy="222.81673"
+       r="130"
+       fx="247.79221"
+       fy="222.81673"
+       id="radialGradient3769"
+       xlink:href="#linearGradient3731"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.3246752,-1.1224867e-8,4.7270711e-8,0.65038354,-80.451981,60.56274)" />
+    <radialGradient
+       cx="247.79221"
+       cy="222.81673"
+       r="130"
+       fx="247.79221"
+       fy="222.81673"
+       id="radialGradient2852"
+       xlink:href="#linearGradient3731"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.3246752,-1.1224867e-8,4.7270711e-8,0.65038354,-80.451981,60.56274)" />
+  </defs>
+  <g
+     id="layer2"
+     style="display:inline">
+    <path
+       d="m 425.71429,474.50504 a 67.85714,49.285713 0 1 1 -135.71428,0 67.85714,49.285713 0 1 1 135.71428,0 z"
+       transform="matrix(1.6210572,0,0,-2.2338745,-271.1069,1229.8469)"
+       id="path3658"
+       style="opacity:0.4;fill:#6e6e6e;fill-opacity:1;stroke:none;filter:url(#filter3690)"
+       inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/tree-icons/attribute-scoped.png"
+       inkscape:export-xdpi="6.6122451"
+       inkscape:export-ydpi="6.6122451" />
+    <path
+       d="m 420,187.36218 a 130,66.428574 0 1 1 -260,0 130,66.428574 0 1 1 260,0 z"
+       transform="matrix(0.84615385,0,0,-1.6559139,44.615384,472.61783)"
+       id="path3628"
+       style="fill:#002f5e;fill-opacity:1;stroke:none"
+       inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/tree-icons/attribute-scoped.png"
+       inkscape:export-xdpi="6.6122451"
+       inkscape:export-ydpi="6.6122451" />
+    <path
+       d="m 350.00001,203.79076 a 82.14286,61.42857 0 1 1 -164.28572,0 82.14286,61.42857 0 1 1 164.28572,0 z"
+       transform="matrix(1.0956521,0,0,-1.4651163,-3.4782483,460.93934)"
+       id="path3638"
+       style="fill:url(#linearGradient3656);fill-opacity:1;stroke:none"
+       inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/tree-icons/attribute-scoped.png"
+       inkscape:export-xdpi="6.6122451"
+       inkscape:export-ydpi="6.6122451" />
+    <path
+       d="m 425.71429,474.50504 a 67.85714,49.285713 0 1 1 -135.71428,0 67.85714,49.285713 0 1 1 135.71428,0 z"
+       transform="matrix(1.6210572,0,0,-2.2338745,-271.1069,1579.8469)"
+       id="path3715"
+       style="opacity:0.4;fill:#6e6e6e;fill-opacity:1;stroke:none;filter:url(#filter3690)"
+       inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/tree-icons/attribute-scoped-atomic.png"
+       inkscape:export-xdpi="6.6122451"
+       inkscape:export-ydpi="6.6122451" />
+    <path
+       d="m 420,187.36218 a 130,66.428574 0 1 1 -260,0 130,66.428574 0 1 1 260,0 z"
+       transform="matrix(0.84615385,0,0,-1.6559139,44.615384,822.61783)"
+       id="path3717"
+       style="fill:#002f5e;fill-opacity:1;stroke:none"
+       inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/tree-icons/attribute-scoped-atomic.png"
+       inkscape:export-xdpi="6.6122451"
+       inkscape:export-ydpi="6.6122451" />
+    <path
+       d="m 350.00001,203.79076 a 82.14286,61.42857 0 1 1 -164.28572,0 82.14286,61.42857 0 1 1 164.28572,0 z"
+       transform="matrix(1.0956521,0,0,-1.4651163,-3.4782483,810.93934)"
+       id="path3719"
+       style="fill:url(#linearGradient3721);fill-opacity:1;stroke:none"
+       inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/tree-icons/attribute-scoped-atomic.png"
+       inkscape:export-xdpi="6.6122451"
+       inkscape:export-ydpi="6.6122451" />
+    <path
+       d="m 425.71429,474.50504 a 67.85714,49.285713 0 1 1 -135.71428,0 67.85714,49.285713 0 1 1 135.71428,0 z"
+       transform="matrix(0.65309346,0,0,-0.90281701,88.941269,1222.5748)"
+       id="path3723"
+       style="opacity:0.4;fill:#6e6e6e;fill-opacity:1;stroke:none;filter:url(#filter3690)"
+       inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/tree-icons/attribute-atomic.png"
+       inkscape:export-xdpi="9.7590504"
+       inkscape:export-ydpi="9.7590504" />
+    <path
+       d="m 420,187.36218 a 130,66.428574 0 1 1 -260,0 130,66.428574 0 1 1 260,0 z"
+       transform="matrix(0.34089947,0,0,-0.66923511,216.13984,916.54194)"
+       id="path3725"
+       style="fill:url(#radialGradient2852);fill-opacity:1;stroke:none"
+       inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/tree-icons/attribute-atomic.png"
+       inkscape:export-xdpi="9.7590504"
+       inkscape:export-ydpi="9.7590504" />
+    <use
+       transform="matrix(0.41506223,0,0,0.41506223,249.6836,510.62116)"
+       id="use3739"
+       x="0"
+       y="0"
+       width="744.09448"
+       height="1052.3622"
+       xlink:href="#path3723"
+       inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/tree-icons/attribute-atomic.png"
+       inkscape:export-xdpi="9.7590504"
+       inkscape:export-ydpi="9.7590504" />
+    <use
+       transform="matrix(0.41506223,0,0,0.41506223,249.6836,510.62116)"
+       id="use3741"
+       x="0"
+       y="0"
+       width="744.09448"
+       height="1052.3622"
+       xlink:href="#path3725"
+       inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/tree-icons/attribute-atomic.png"
+       inkscape:export-xdpi="9.7590504"
+       inkscape:export-ydpi="9.7590504" />
+    <use
+       transform="matrix(1.25,0,0,1.25,-217.54274,-184.04453)"
+       id="use3745"
+       x="0"
+       y="0"
+       width="744.09448"
+       height="1052.3622"
+       xlink:href="#use3739"
+       inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/tree-icons/attribute-atomic.png"
+       inkscape:export-xdpi="9.7590504"
+       inkscape:export-ydpi="9.7590504" />
+    <use
+       transform="matrix(1.25,0,0,1.25,-217.54274,-184.04453)"
+       id="use3747"
+       x="0"
+       y="0"
+       width="744.09448"
+       height="1052.3622"
+       xlink:href="#use3741"
+       inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/tree-icons/attribute-atomic.png"
+       inkscape:export-xdpi="9.7590504"
+       inkscape:export-ydpi="9.7590504" />
+    <use
+       transform="matrix(0.50000002,0,0,0.50000002,123.20942,302.54307)"
+       id="use3749"
+       x="0"
+       y="0"
+       width="744.09448"
+       height="1052.3622"
+       xlink:href="#use3745"
+       inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/tree-icons/attribute-atomic.png"
+       inkscape:export-xdpi="9.7590504"
+       inkscape:export-ydpi="9.7590504" />
+    <use
+       transform="matrix(0.50000002,0,0,0.50000002,123.20942,302.54307)"
+       id="use3751"
+       x="0"
+       y="0"
+       width="744.09448"
+       height="1052.3622"
+       xlink:href="#use3747"
+       inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/tree-icons/attribute-atomic.png"
+       inkscape:export-xdpi="9.7590504"
+       inkscape:export-ydpi="9.7590504" />
+    <path
+       d="m 425.71429,474.50504 a 67.85714,49.285713 0 1 1 -135.71428,0 67.85714,49.285713 0 1 1 135.71428,0 z"
+       transform="matrix(0.50839605,0,0,-0.70058785,122.01588,834.78872)"
+       id="path3753"
+       style="opacity:0.4;fill:#6e6e6e;fill-opacity:1;stroke:none;filter:url(#filter3690)"
+       inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/tree-icons/attribute-scoped-atomic.png"
+       inkscape:export-xdpi="6.6122451"
+       inkscape:export-ydpi="6.6122451" />
+    <path
+       d="m 420,187.36218 a 130,66.428574 0 1 1 -260,0 130,66.428574 0 1 1 260,0 z"
+       transform="matrix(0.26537082,0,0,-0.51932782,221.03273,597.30649)"
+       id="path3755"
+       style="fill:url(#radialGradient3769);fill-opacity:1;stroke:none"
+       inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/tree-icons/attribute-scoped-atomic.png"
+       inkscape:export-xdpi="6.6122451"
+       inkscape:export-ydpi="6.6122451" />
+    <use
+       transform="matrix(0.32282617,0,0,0.32282617,247.20952,281.65712)"
+       id="use3757"
+       x="0"
+       y="0"
+       width="744.09448"
+       height="1052.3622"
+       xlink:href="#path3723"
+       inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/tree-icons/attribute-scoped-atomic.png"
+       inkscape:export-xdpi="6.6122451"
+       inkscape:export-ydpi="6.6122451" />
+    <use
+       transform="matrix(0.32282617,0,0,0.32282617,247.20952,281.65712)"
+       id="use3759"
+       x="0"
+       y="0"
+       width="744.09448"
+       height="1052.3622"
+       xlink:href="#path3725"
+       inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/tree-icons/attribute-scoped-atomic.png"
+       inkscape:export-xdpi="6.6122451"
+       inkscape:export-ydpi="6.6122451" />
+    <use
+       transform="matrix(0.97222217,0,0,0.97222217,-116.36903,-254.71696)"
+       id="use3761"
+       x="0"
+       y="0"
+       width="744.09448"
+       height="1052.3622"
+       xlink:href="#use3739"
+       inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/tree-icons/attribute-scoped-atomic.png"
+       inkscape:export-xdpi="6.6122451"
+       inkscape:export-ydpi="6.6122451" />
+    <use
+       transform="matrix(0.97222217,0,0,0.97222217,-116.36903,-254.71696)"
+       id="use3763"
+       x="0"
+       y="0"
+       width="744.09448"
+       height="1052.3622"
+       xlink:href="#use3741"
+       inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/tree-icons/attribute-scoped-atomic.png"
+       inkscape:export-xdpi="6.6122451"
+       inkscape:export-ydpi="6.6122451" />
+    <use
+       transform="matrix(0.3888889,0,0,0.3888889,147.65875,125.46653)"
+       id="use3765"
+       x="0"
+       y="0"
+       width="744.09448"
+       height="1052.3622"
+       xlink:href="#use3745"
+       inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/tree-icons/attribute-scoped-atomic.png"
+       inkscape:export-xdpi="6.6122451"
+       inkscape:export-ydpi="6.6122451" />
+    <use
+       transform="matrix(0.3888889,0,0,0.3888889,147.65875,125.46653)"
+       id="use3767"
+       x="0"
+       y="0"
+       width="744.09448"
+       height="1052.3622"
+       xlink:href="#use3747"
+       inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/tree-icons/attribute-scoped-atomic.png"
+       inkscape:export-xdpi="6.6122451"
+       inkscape:export-ydpi="6.6122451" />
+  </g>
+</svg>
diff --git a/kernel/org.eclipse.virgo.management.console/images/curves-base.svg b/kernel/org.eclipse.virgo.management.console/images/curves-base.svg
new file mode 100644
index 0000000..dc30dde
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/images/curves-base.svg
@@ -0,0 +1,339 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
+   width="1488.189"
+   height="1052.3622"
+   id="svg2"
+   inkscape:version="0.47 r22583"
+   sodipodi:docname="curves-base.svg">
+  <metadata
+     id="metadata11">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1918"
+     inkscape:window-height="1172"
+     id="namedview9"
+     showgrid="false"
+     inkscape:zoom="1"
+     inkscape:cx="887.6495"
+     inkscape:cy="551.5489"
+     inkscape:window-x="1"
+     inkscape:window-y="0"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg2" />
+  <defs
+     id="defs4">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective13" />
+  </defs>
+  <path
+     style="fill:#002f5e;fill-opacity:1;stroke:none"
+     d="m 100,692.36224 0,130 0,130 c 19.63495,0 39.26218,-3.38355 57.40251,-9.89566 18.14034,-6.51211 34.7795,-16.14765 48.66351,-28.18046 13.88401,-12.03281 25.00194,-26.45341 32.51591,-42.17503 C 246.0959,856.38946 250,839.3792 250,822.36224 c 0,-17.01696 3.64383,-34.02722 10.65687,-49.74885 7.01304,-15.72162 17.38977,-30.14222 30.34818,-42.17503 12.95841,-12.03281 28.48829,-21.66835 45.41927,-28.18046 16.93098,-6.51211 35.24972,-9.89566 53.57568,-9.89566 l 10,0 -300,0 z"
+     id="rect3654"
+     inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/menu-curve-left.png"
+     inkscape:export-xdpi="9"
+     inkscape:export-ydpi="9"
+     inkscape:connector-curvature="0"
+     sodipodi:nodetypes="cccsssssssccc" />
+  <rect
+     inkscape:export-ydpi="9"
+     inkscape:export-xdpi="9"
+     inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/controls-cap-left.png"
+     style="fill:#002f5e;fill-opacity:1;stroke:none"
+     id="rect3775"
+     width="119.9999"
+     height="230"
+     x="250.00009"
+     y="342.36218" />
+  <path
+     inkscape:export-ydpi="9"
+     inkscape:export-xdpi="9"
+     inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/controls-cap-left.png"
+     transform="matrix(-1.5990648,0,0,1.7111233,1307.563,-754.59186)"
+     sodipodi:open="true"
+     sodipodi:end="7.8539816"
+     sodipodi:start="4.712389"
+     d="m 661.36347,623.54013 a 93.804832,84.739655 0 0 1 0,169.47931"
+     sodipodi:ry="84.739655"
+     sodipodi:rx="93.804832"
+     sodipodi:cy="708.27979"
+     sodipodi:cx="661.36346"
+     id="path3777"
+     style="fill:#002f5e;fill-opacity:1"
+     sodipodi:type="arc" />
+  <rect
+     inkscape:export-ydpi="9"
+     inkscape:export-xdpi="9"
+     inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/controls-cap-left.png"
+     y="312.36218"
+     x="250.00009"
+     height="30"
+     width="135"
+     id="rect3779"
+     style="fill:#002f5e;fill-opacity:1;stroke:none" />
+  <rect
+     inkscape:export-ydpi="9"
+     inkscape:export-xdpi="9"
+     inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/controls-cap-left.png"
+     style="fill:#002f5e;fill-opacity:1;stroke:none"
+     id="rect3781"
+     width="135"
+     height="30"
+     x="250.00009"
+     y="572.36218" />
+  <path
+     sodipodi:type="arc"
+     style="fill:#002f5e;fill-opacity:1"
+     id="path3783"
+     sodipodi:cx="661.36346"
+     sodipodi:cy="708.27979"
+     sodipodi:rx="93.804832"
+     sodipodi:ry="84.739655"
+     d="m 661.36347,623.54013 a 93.804832,84.739655 0 0 1 0,169.47931"
+     sodipodi:start="4.712389"
+     sodipodi:end="7.8539816"
+     sodipodi:open="true"
+     transform="matrix(0.15990648,0,0,0.17701276,279.24375,461.98762)"
+     inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/controls-cap-left.png"
+     inkscape:export-xdpi="9"
+     inkscape:export-ydpi="9" />
+  <path
+     inkscape:export-ydpi="9"
+     inkscape:export-xdpi="9"
+     inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/controls-cap-left.png"
+     transform="matrix(0.15990648,0,0,0.17701276,279.24375,201.98762)"
+     sodipodi:open="true"
+     sodipodi:end="7.8539816"
+     sodipodi:start="4.712389"
+     d="m 661.36347,623.54013 a 93.804832,84.739655 0 0 1 0,169.47931"
+     sodipodi:ry="84.739655"
+     sodipodi:rx="93.804832"
+     sodipodi:cy="708.27979"
+     sodipodi:cx="661.36346"
+     id="path3785"
+     style="fill:#002f5e;fill-opacity:1"
+     sodipodi:type="arc" />
+  <path
+     sodipodi:type="arc"
+     style="fill:#002f5e;fill-opacity:1"
+     id="path3787"
+     sodipodi:cx="661.36346"
+     sodipodi:cy="708.27979"
+     sodipodi:rx="93.804832"
+     sodipodi:ry="84.739655"
+     d="m 661.36347,623.54013 a 93.804832,84.739655 0 0 1 0,169.47931"
+     sodipodi:start="4.712389"
+     sodipodi:end="7.8539816"
+     sodipodi:open="true"
+     transform="matrix(-1.2792518,0,0,1.3570978,1866.0504,-153.84275)"
+     inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/button-cap-left-blue.png"
+     inkscape:export-xdpi="9"
+     inkscape:export-ydpi="9" />
+  <path
+     sodipodi:type="arc"
+     style="fill:#ffffff;fill-opacity:1"
+     id="path3610"
+     sodipodi:cx="661.36346"
+     sodipodi:cy="708.27979"
+     sodipodi:rx="93.804832"
+     sodipodi:ry="84.739655"
+     d="m 661.36347,623.54013 a 93.804832,84.739655 0 0 1 0,169.47931"
+     sodipodi:start="4.712389"
+     sodipodi:end="7.8539816"
+     sodipodi:open="true"
+     transform="matrix(-1.2792508,0,0,1.3570978,1216.0496,-503.84275)"
+     inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/button-cap-left-white.png"
+     inkscape:export-xdpi="9"
+     inkscape:export-ydpi="9" />
+  <path
+     inkscape:connector-curvature="0"
+     inkscape:export-ydpi="9"
+     inkscape:export-xdpi="9"
+     inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/menu-curve-right.png"
+     id="path3618"
+     d="m 800,692.36224 0,130 0,130 c -19.63495,0 -39.26218,-3.38355 -57.40251,-9.89566 -18.14034,-6.51211 -34.7795,-16.14765 -48.66351,-28.18046 C 680.04997,902.25331 668.93204,887.83271 661.41807,872.11109 653.9041,856.38946 650,839.3792 650,822.36224 650,805.34528 646.35617,788.33502 639.34313,772.61339 632.33009,756.89177 621.95336,742.47117 608.99495,730.43836 596.03654,718.40555 580.50666,708.77001 563.57568,702.2579 546.6447,695.74579 528.32596,692.36224 510,692.36224 l -10,0 300,0 z"
+     style="fill:#002f5e;fill-opacity:1;stroke:none"
+     sodipodi:nodetypes="cccsssssssccc" />
+  <g
+     id="g3635"
+     transform="translate(0,-0.01281738)"
+     inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/controls-cap-left.png"
+     inkscape:export-xdpi="9"
+     inkscape:export-ydpi="9">
+    <g
+       id="g3652">
+      <path
+         style="fill:#002f5e;fill-opacity:1;stroke:none"
+         d="m 650,312.375 c -82.8427,0 -150,64.91871 -150,145 0,80.08127 67.1573,145 150,145 l 135,0 c 8.28427,0 15,-6.71573 15,-15 0,-8.28427 -6.71573,-15 -15,-15 l -15,0 c -66.27411,0 -120,-51.48727 -120,-115 0,-63.51275 53.72589,-115 120,-115 l 15,0 c 8.28427,0 15,-6.71573 15,-15 0,-8.28427 -6.71573,-15 -15,-15 l -135,0 z"
+         id="rect3620" />
+    </g>
+  </g>
+  <g
+     transform="matrix(-1,0,0,1,1700,-0.01281738)"
+     id="g3661"
+     inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/controls-cap-right.png"
+     inkscape:export-xdpi="9"
+     inkscape:export-ydpi="9">
+    <g
+       id="g3663">
+      <path
+         id="path3665"
+         d="m 650,312.375 c -82.8427,0 -150,64.91871 -150,145 0,80.08127 67.1573,145 150,145 l 135,0 c 8.28427,0 15,-6.71573 15,-15 0,-8.28427 -6.71573,-15 -15,-15 l -15,0 c -66.27411,0 -120,-51.48727 -120,-115 0,-63.51275 53.72589,-115 120,-115 l 15,0 c 8.28427,0 15,-6.71573 15,-15 0,-8.28427 -6.71573,-15 -15,-15 l -135,0 z"
+         style="fill:#002f5e;fill-opacity:1;stroke:none" />
+    </g>
+  </g>
+  <path
+     inkscape:export-ydpi="9"
+     inkscape:export-xdpi="9"
+     inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/button-cap-right-blue.png"
+     transform="matrix(1.2792518,0,0,1.3570978,253.94959,-153.84275)"
+     sodipodi:open="true"
+     sodipodi:end="7.8539816"
+     sodipodi:start="4.712389"
+     d="m 661.36347,623.54013 a 93.804832,84.739655 0 0 1 0,169.47931"
+     sodipodi:ry="84.739655"
+     sodipodi:rx="93.804832"
+     sodipodi:cy="708.27979"
+     sodipodi:cx="661.36346"
+     id="path3667"
+     style="fill:#002f5e;fill-opacity:1"
+     sodipodi:type="arc" />
+  <path
+     sodipodi:type="arc"
+     style="fill:#ffffff;fill-opacity:1"
+     id="path3669"
+     sodipodi:cx="661.36346"
+     sodipodi:cy="708.27979"
+     sodipodi:rx="93.804832"
+     sodipodi:ry="84.739655"
+     d="m 661.36347,623.54013 a 93.804832,84.739655 0 0 1 0,169.47931"
+     sodipodi:start="4.712389"
+     sodipodi:end="7.8539816"
+     sodipodi:open="true"
+     transform="matrix(-1.2792518,0,0,1.3570978,2266.0504,-153.84275)"
+     inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/button-cap-left-white.png"
+     inkscape:export-xdpi="9"
+     inkscape:export-ydpi="9" />
+  <path
+     inkscape:export-ydpi="9"
+     inkscape:export-xdpi="9"
+     inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/button-cap-right-white.png"
+     transform="matrix(1.2792518,0,0,1.3570978,453.94959,-503.84275)"
+     sodipodi:open="true"
+     sodipodi:end="7.8539816"
+     sodipodi:start="4.712389"
+     d="m 661.36347,623.54013 a 93.804832,84.739655 0 0 1 0,169.47931"
+     sodipodi:ry="84.739655"
+     sodipodi:rx="93.804832"
+     sodipodi:cy="708.27979"
+     sodipodi:cx="661.36346"
+     id="path3671"
+     style="fill:#ffffff;fill-opacity:1"
+     sodipodi:type="arc" />
+  <path
+     inkscape:export-ydpi="9"
+     inkscape:export-xdpi="9"
+     inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/button-cap-left-blue.png"
+     transform="matrix(-1.2259496,0,0,1.3570978,1025.7983,-803.84275)"
+     d="m 755.1683,708.27979 a 93.804832,84.739655 0 1 1 -187.60967,0 93.804832,84.739655 0 1 1 187.60967,0 z"
+     sodipodi:ry="84.739655"
+     sodipodi:rx="93.804832"
+     sodipodi:cy="708.27979"
+     sodipodi:cx="661.36346"
+     id="path3675"
+     style="fill:#002f5e;fill-opacity:1"
+     sodipodi:type="arc" />
+  <path
+     sodipodi:type="arc"
+     style="fill:#ffffff;fill-opacity:1"
+     id="path3677"
+     sodipodi:cx="661.36346"
+     sodipodi:cy="708.27979"
+     sodipodi:rx="93.804832"
+     sodipodi:ry="84.739655"
+     d="m 755.1683,708.27979 a 93.804832,84.739655 0 1 1 -187.60967,0 93.804832,84.739655 0 1 1 187.60967,0 z"
+     transform="matrix(-0.90613669,0,0,1.0030723,814.28567,-553.09365)"
+     inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/button-cap-left-blue.png"
+     inkscape:export-xdpi="9"
+     inkscape:export-ydpi="9" />
+  <rect
+     style="fill:#002f5e;fill-opacity:1;stroke-width:0.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
+     id="rect3683"
+     width="110"
+     height="30"
+     x="159.99997"
+     y="142.36218"
+     ry="15" />
+  <rect
+     ry="15"
+     y="-229.99997"
+     x="102.36218"
+     height="30"
+     width="110"
+     id="rect3685"
+     style="fill:#002f5e;fill-opacity:1;stroke-width:0.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
+     transform="matrix(0,1,-1,0,0,0)" />
+  <g
+     id="g3697"
+     inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/add.png"
+     inkscape:export-xdpi="9"
+     inkscape:export-ydpi="9">
+    <path
+       id="path3687"
+       d="M 515 42.375 C 451.48726 42.375 400 93.862254 400 157.375 C 400 220.88775 451.48726 272.375 515 272.375 C 578.51274 272.375 630 220.88775 630 157.375 C 630 93.862254 578.51274 42.375 515 42.375 z M 512.8125 72.375 C 513.54155 72.356529 514.2665 72.375 515 72.375 C 561.9442 72.375 600 110.4308 600 157.375 C 600 204.3192 561.9442 242.375 515 242.375 C 468.0558 242.375 430 204.3192 430 157.375 C 430 111.1643 466.88223 73.538652 512.8125 72.375 z "
+       style="fill:#002f5e;fill-opacity:1" />
+    <path
+       id="rect3691"
+       d="M 515 102.375 C 506.69 102.375 500 109.065 500 117.375 L 500 142.375 L 475 142.375 C 466.69 142.375 460 149.065 460 157.375 C 460 165.685 466.69 172.375 475 172.375 L 500 172.375 L 500 197.375 C 500 205.685 506.69 212.375 515 212.375 C 523.31 212.375 530 205.685 530 197.375 L 530 172.375 L 555 172.375 C 563.31 172.375 570 165.685 570 157.375 C 570 149.065 563.31 142.375 555 142.375 L 530 142.375 L 530 117.375 C 530 109.065 523.31 102.375 515 102.375 z "
+       style="fill:#002f5e;fill-opacity:1;stroke-width:0.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none" />
+  </g>
+  <g
+     id="g3710"
+     inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/minus.png"
+     inkscape:export-xdpi="9"
+     inkscape:export-ydpi="9">
+    <path
+       id="path3701"
+       d="M 815 42.375 C 751.48726 42.375 700 93.862254 700 157.375 C 700 220.88775 751.48726 272.375 815 272.375 C 878.51274 272.375 930 220.88775 930 157.375 C 930 93.862254 878.51274 42.375 815 42.375 z M 812.8125 72.375 C 813.54155 72.356529 814.2665 72.375 815 72.375 C 861.9442 72.375 900 110.4308 900 157.375 C 900 204.3192 861.9442 242.375 815 242.375 C 768.0558 242.375 730 204.3192 730 157.375 C 730 111.1643 766.88223 73.538652 812.8125 72.375 z "
+       style="fill:#002f5e;fill-opacity:1" />
+    <rect
+       style="fill:#002f5e;fill-opacity:1;stroke-width:0.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
+       id="rect3705"
+       width="110"
+       height="30"
+       x="760"
+       y="142.36218"
+       ry="15" />
+  </g>
+</svg>
diff --git a/kernel/org.eclipse.virgo.management.console/images/expander.svg b/kernel/org.eclipse.virgo.management.console/images/expander.svg
new file mode 100644
index 0000000..4af9193
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/images/expander.svg
@@ -0,0 +1,356 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="744.09448819"
+   height="1052.3622047"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.0 r9654"
+   sodipodi:docname="expander.svg">
+  <defs
+     id="defs4">
+    <linearGradient
+       id="linearGradient3803">
+      <stop
+         style="stop-color:#84a3b7;stop-opacity:1;"
+         offset="0"
+         id="stop3805" />
+      <stop
+         style="stop-color:#84a3b7;stop-opacity:0;"
+         offset="1"
+         id="stop3807" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3777">
+      <stop
+         style="stop-color:#bad9ec;stop-opacity:1;"
+         offset="0"
+         id="stop3779" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0.3137255;"
+         offset="1"
+         id="stop3781" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3777"
+       id="linearGradient3783"
+       x1="116.99104"
+       y1="872.4314"
+       x2="113.80788"
+       y2="858.94275"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.6228456,0,0,0.62284561,37.921287,328.80938)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3777"
+       id="linearGradient3961"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.8068421,0,0,0.80684211,39.457656,168.36183)"
+       x1="100.06313"
+       y1="855.40216"
+       x2="116.74746"
+       y2="868.47101" />
+    <filter
+       inkscape:collect="always"
+       id="filter4122"
+       x="-0.84"
+       width="2.68"
+       y="-0.12"
+       height="1.24">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.35"
+         id="feGaussianBlur4124" />
+    </filter>
+    <filter
+       inkscape:collect="always"
+       id="filter4126"
+       x="-0.12"
+       width="1.24"
+       y="-0.84"
+       height="2.68">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.35"
+         id="feGaussianBlur4128" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3777"
+       id="linearGradient4142"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.6228456,0,0,0.62284561,57.921287,328.80938)"
+       x1="116.99104"
+       y1="872.4314"
+       x2="116.0379"
+       y2="865.12604" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3777"
+       id="linearGradient4182"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.6228456,0,0,0.62284561,57.921282,328.80938)"
+       x1="116.99104"
+       y1="872.4314"
+       x2="113.80788"
+       y2="858.94275" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3803"
+       id="radialGradient3809"
+       cx="110"
+       cy="846.36218"
+       fx="110"
+       fy="846.36218"
+       r="5"
+       gradientTransform="matrix(1,0,0,1.8,0,-677.08975)"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3803"
+       id="radialGradient3815"
+       cx="105.39104"
+       cy="-824.21521"
+       fx="105.39104"
+       fy="-824.21521"
+       r="5"
+       gradientTransform="matrix(1.871257,-3.0150294e-6,4.2919609e-6,1.6657364,-91.628028,526.09594)"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3803"
+       id="radialGradient3817"
+       cx="-846.80408"
+       cy="-105.50341"
+       fx="-846.80408"
+       fy="-105.50341"
+       r="9"
+       gradientTransform="matrix(1.0347122,-0.00588005,0.00284237,0.50017309,29.69429,-57.709288)"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3803"
+       id="radialGradient3820"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.871257,-3.0150294e-6,4.2919609e-6,1.6657364,-91.628028,526.09594)"
+       cx="105.39104"
+       cy="-824.21521"
+       fx="105.39104"
+       fy="-824.21521"
+       r="5" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3803"
+       id="radialGradient3823"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0347122,-0.00588005,0.00284237,0.50017309,29.69429,-57.709288)"
+       cx="-846.80408"
+       cy="-105.50341"
+       fx="-846.80408"
+       fy="-105.50341"
+       r="9" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="15.839192"
+     inkscape:cx="117.36682"
+     inkscape:cy="179.78733"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1223"
+     inkscape:window-height="881"
+     inkscape:window-x="383"
+     inkscape:window-y="156"
+     inkscape:window-maximized="0" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <rect
+       style="opacity:0.30172412;fill:#ffffff;fill-opacity:0.00392157;stroke:none"
+       id="rect4184"
+       width="18"
+       height="18"
+       x="97"
+       y="857.36218"
+       inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/tree-icons/plus.png"
+       inkscape:export-xdpi="90"
+       inkscape:export-ydpi="90" />
+    <rect
+       style="opacity:0.30172412;fill:none;stroke:#999999;stroke-width:1.08272517;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       id="rect4174"
+       width="9.9172745"
+       height="9.9172745"
+       x="121.54135"
+       y="862.90356"
+       inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/tree-icons/minus.png"
+       inkscape:export-xdpi="90"
+       inkscape:export-ydpi="90" />
+    <rect
+       inkscape:export-ydpi="90"
+       inkscape:export-xdpi="90"
+       inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/tree-icons/plus.png"
+       y="862.90356"
+       x="101.54136"
+       height="9.9172745"
+       width="9.9172745"
+       id="rect3984"
+       style="opacity:0.30172414;fill:none;stroke:#999999;stroke-width:1.08272517000000001;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+    <rect
+       inkscape:export-ydpi="90"
+       inkscape:export-xdpi="90"
+       inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/tree-icons/minus.png"
+       y="861.86212"
+       x="120.49993"
+       height="10.000132"
+       width="10.000132"
+       id="rect4176"
+       style="fill:url(#linearGradient4182);fill-opacity:1;stroke:#85a3b9;stroke-width:0.99986832999999997;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+    <rect
+       style="fill:url(#linearGradient3783);fill-opacity:1;stroke:#85a3b9;stroke-width:0.99986832999999997;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       id="rect3003"
+       width="10.000132"
+       height="10.000132"
+       x="100.49994"
+       y="861.86212"
+       inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/tree-icons/plus.png"
+       inkscape:export-xdpi="90"
+       inkscape:export-ydpi="90" />
+    <rect
+       y="-867.86218"
+       x="103"
+       height="1"
+       width="7"
+       id="rect4120"
+       style="fill:#1a1a1a;fill-opacity:1;stroke:none;filter:url(#filter4126);opacity:0.45"
+       transform="scale(1,-1)"
+       inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/tree-icons/plus.png"
+       inkscape:export-xdpi="90"
+       inkscape:export-ydpi="90" />
+    <rect
+       y="857.36218"
+       x="117"
+       height="18"
+       width="18"
+       id="rect4186"
+       style="opacity:0.30172412;fill:#ffffff;fill-opacity:0.00392157;stroke:none"
+       inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/tree-icons/minus.png"
+       inkscape:export-xdpi="90"
+       inkscape:export-ydpi="90" />
+    <rect
+       inkscape:export-ydpi="90"
+       inkscape:export-xdpi="90"
+       inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/tree-icons/plus.png"
+       transform="matrix(0,-1,-1,0,0,0)"
+       style="fill:#1a1a1a;fill-opacity:1;stroke:none;filter:url(#filter4122);opacity:0.45"
+       id="rect4118"
+       width="7"
+       height="1"
+       x="-870.86218"
+       y="-107" />
+    <rect
+       y="-106"
+       x="-870.36218"
+       height="1"
+       width="7"
+       id="rect3775"
+       style="fill:#1a1a1a;fill-opacity:1;stroke:none"
+       transform="matrix(0,-1,-1,0,0,0)"
+       inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/tree-icons/plus.png"
+       inkscape:export-xdpi="90"
+       inkscape:export-ydpi="90" />
+    <rect
+       inkscape:export-ydpi="90"
+       inkscape:export-xdpi="90"
+       inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/tree-icons/plus.png"
+       transform="scale(1,-1)"
+       style="fill:#1a1a1a;fill-opacity:1;stroke:none"
+       id="rect3982"
+       width="7"
+       height="1"
+       x="102"
+       y="-867.36218" />
+    <rect
+       inkscape:export-ydpi="90"
+       inkscape:export-xdpi="90"
+       inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/tree-icons/minus.png"
+       transform="matrix(1,0,0,-1,19.999995,0)"
+       style="opacity:0.45;fill:#1a1a1a;fill-opacity:1;stroke:none;filter:url(#filter4126)"
+       id="rect4170"
+       width="7"
+       height="1"
+       x="103"
+       y="-867.86218" />
+    <rect
+       y="-867.36218"
+       x="121.99999"
+       height="1"
+       width="7"
+       id="rect4180"
+       style="fill:#1a1a1a;fill-opacity:1;stroke:none"
+       transform="scale(1,-1)"
+       inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/tree-icons/minus.png"
+       inkscape:export-xdpi="90"
+       inkscape:export-ydpi="90" />
+    <rect
+       inkscape:export-ydpi="90"
+       inkscape:export-xdpi="90"
+       inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/tree-icons/attribute-default.png"
+       y="837.36218"
+       x="97"
+       height="18"
+       width="18"
+       id="rect3013"
+       style="opacity:0.30172412;fill:#ffffff;fill-opacity:0.00392157;stroke:none" />
+    <rect
+       inkscape:export-ydpi="90"
+       inkscape:export-xdpi="90"
+       inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/tree-icons/attribute-default.png"
+       transform="matrix(0,-1,-1,0,0,0)"
+       style="fill:url(#radialGradient3823);fill-opacity:1;stroke:none"
+       id="rect3015"
+       width="18"
+       height="1"
+       x="-855.36218"
+       y="-106" />
+    <rect
+       y="-847.36218"
+       x="105"
+       height="1"
+       width="10"
+       id="rect3017"
+       style="fill:url(#radialGradient3820);fill-opacity:1;stroke:none"
+       transform="scale(1,-1)"
+       inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/tree-icons/attribute-default.png"
+       inkscape:export-xdpi="90"
+       inkscape:export-ydpi="90" />
+  </g>
+</svg>
diff --git a/kernel/org.eclipse.virgo.management.console/images/mini-header.svg b/kernel/org.eclipse.virgo.management.console/images/mini-header.svg
new file mode 100644
index 0000000..a6ab276
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/images/mini-header.svg
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   version="1.1"
+   width="744.09448"
+   height="1052.3622"
+   id="svg2">
+  <defs
+     id="defs4" />
+  <g
+     id="layer1">
+    <rect
+       width="70"
+       height="70"
+       x="300"
+       y="262.36218"
+       id="rect2816"
+       style="fill:#dfdfdf;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    <path
+       d="m 271.60713,508.61218 a 4.8214288,4.2857141 0 0 1 4.82143,-4.28571 l 0,4.28571 z"
+       transform="matrix(14.518518,0,0,16.333334,-3643.3329,-7974.9705)"
+       id="path3590"
+       style="fill:#002e62;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+  </g>
+</svg>
diff --git a/kernel/org.eclipse.virgo.management.console/images/spring.svg b/kernel/org.eclipse.virgo.management.console/images/spring.svg
new file mode 100644
index 0000000..9952b7b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/images/spring.svg
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="744.09448819"
+   height="1052.3622047"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.0 r9654"
+   inkscape:export-filename="/Users/cgfrost/Repos/codewax/admin-jolokia/org.eclipse.virgo.apps.admin/src/main/webapp/images/tree-icons/attribute-spring.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90"
+   sodipodi:docname="spring.svg">
+  <defs
+     id="defs4">
+    <linearGradient
+       id="linearGradient3822">
+      <stop
+         style="stop-color:#c3cb4e;stop-opacity:0.33333334;"
+         offset="0"
+         id="stop3824" />
+      <stop
+         style="stop-color:#c3cb4e;stop-opacity:0;"
+         offset="1"
+         id="stop3826" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3822"
+       id="radialGradient3838"
+       cx="716.5"
+       cy="728.89551"
+       fx="716.5"
+       fy="728.89551"
+       r="0.5"
+       gradientTransform="matrix(-30.756671,0,0,-5.0428295,22753.655,4404.1164)"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3822"
+       id="radialGradient2989"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-30.756671,0,0,-6.2405271,22753.655,5277.7204)"
+       cx="716.5"
+       cy="729.02826"
+       fx="716.5"
+       fy="729.02826"
+       r="0.5" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="31.678384"
+     inkscape:cx="707.70261"
+     inkscape:cy="323.19335"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1156"
+     inkscape:window-height="803"
+     inkscape:window-x="148"
+     inkscape:window-y="69"
+     inkscape:window-maximized="0" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <rect
+       style="opacity:0.45000000000000001;fill:#ffffff;fill-opacity:0.00392157;stroke:none"
+       id="rect3050"
+       width="18"
+       height="18"
+       x="699"
+       y="720.36218" />
+    <image
+       y="723.36218"
+       x="700"
+       id="image3047"
+       xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAANCAYAAACgu+4kAAAABHNCSVQICAgIfAhkiAAAAeFJREFU KJGdkTtPVGEQhp+Z7zuwwLIutxgIicZLpJAVL3HVQomx8gcYf4PWNv4AexMrGltrY6KdJBSChQlE WWmMjbCuGC/rrnv2nO8bi2NBSCxkkunmmfd9Z4QD1trG9UvejeIOwOrqxuLZLNt+aoSO/w8webV+ +VSM6c0sb96Llk1G69dl78TqxtVrIbTnzdKyiBPQvhEiuCqEY2bhglk2BxEzcK78SQDebN6a6fYa j6KldWACYgIiQAAMSArIEIEQxVRMnJaCB0rdXuN5tG7NzPbb3hvRQETF+NxRGR+OppI5XV2/cifE Tg0MEflng4hXY3PHI0DiTMChIXZvFwKyX53CkP1teNd0fP8tVEqxeIcOtjwwvh8SKQCnxdqvXeXt tmP3l7B4Mmd4wCxERMSveBG/omLHvcOEwq0ZdPrCl7bwYVfZannGhiI35nLGRqLlARFRnI4uedHq g9aP/sL7Zm8hzcU6qUi7J/xMhW9dYWLEqB/NOT0TGPRmeSiyOi0/qdeWlwXg7lL9XGOnt9bLc18p GdOHIrPVyImpyGTZqJSsuIQZIglORx57V71fr71seoBk4ExrqvLx4cJs/vr8EUsTJxOJptMq2WEj jFtMcTqQqw5tqYw+uzj/ogHkAH8AkHfVxV2SK1oAAAAASUVORK5CYII= "
+       height="13"
+       width="16" />
+    <rect
+       style="opacity:1;fill:url(#radialGradient2989);fill-opacity:1;stroke:none"
+       id="rect3820"
+       width="1"
+       height="7"
+       x="716"
+       y="725.36218" />
+  </g>
+</svg>
diff --git a/kernel/org.eclipse.virgo.management.console/images/springsource-large.png b/kernel/org.eclipse.virgo.management.console/images/springsource-large.png
new file mode 100644
index 0000000..9523baf
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/images/springsource-large.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/images/springsource-small.png b/kernel/org.eclipse.virgo.management.console/images/springsource-small.png
new file mode 100644
index 0000000..5fdb882
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/images/springsource-small.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/images/tree-icons/MK0/icoActive.png b/kernel/org.eclipse.virgo.management.console/images/tree-icons/MK0/icoActive.png
new file mode 100644
index 0000000..a59a0a9
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/images/tree-icons/MK0/icoActive.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/images/tree-icons/MK0/icoAtomic.png b/kernel/org.eclipse.virgo.management.console/images/tree-icons/MK0/icoAtomic.png
new file mode 100644
index 0000000..3d04168
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/images/tree-icons/MK0/icoAtomic.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/images/tree-icons/MK0/icoBundle.png b/kernel/org.eclipse.virgo.management.console/images/tree-icons/MK0/icoBundle.png
new file mode 100644
index 0000000..db3df70
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/images/tree-icons/MK0/icoBundle.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/images/tree-icons/MK0/icoConfig.png b/kernel/org.eclipse.virgo.management.console/images/tree-icons/MK0/icoConfig.png
new file mode 100644
index 0000000..29ae422
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/images/tree-icons/MK0/icoConfig.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/images/tree-icons/MK0/icoInstalled.png b/kernel/org.eclipse.virgo.management.console/images/tree-icons/MK0/icoInstalled.png
new file mode 100644
index 0000000..08cd0cf
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/images/tree-icons/MK0/icoInstalled.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/images/tree-icons/MK0/icoPar.png b/kernel/org.eclipse.virgo.management.console/images/tree-icons/MK0/icoPar.png
new file mode 100644
index 0000000..d4118f1
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/images/tree-icons/MK0/icoPar.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/images/tree-icons/MK0/icoPlan.png b/kernel/org.eclipse.virgo.management.console/images/tree-icons/MK0/icoPlan.png
new file mode 100644
index 0000000..0835a1b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/images/tree-icons/MK0/icoPlan.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/images/tree-icons/MK0/icoResolved.png b/kernel/org.eclipse.virgo.management.console/images/tree-icons/MK0/icoResolved.png
new file mode 100644
index 0000000..ac8b3c1
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/images/tree-icons/MK0/icoResolved.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/images/tree-icons/MK0/icoScoped-Atomic.png b/kernel/org.eclipse.virgo.management.console/images/tree-icons/MK0/icoScoped-Atomic.png
new file mode 100644
index 0000000..cb5dd27
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/images/tree-icons/MK0/icoScoped-Atomic.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/images/tree-icons/MK0/icoScoped.png b/kernel/org.eclipse.virgo.management.console/images/tree-icons/MK0/icoScoped.png
new file mode 100644
index 0000000..770c2d0
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/images/tree-icons/MK0/icoScoped.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/images/tree-icons/MK0/icoStarting.png b/kernel/org.eclipse.virgo.management.console/images/tree-icons/MK0/icoStarting.png
new file mode 100644
index 0000000..3ec89b1
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/images/tree-icons/MK0/icoStarting.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/images/tree-icons/MK0/icoStopping.png b/kernel/org.eclipse.virgo.management.console/images/tree-icons/MK0/icoStopping.png
new file mode 100644
index 0000000..8bc784d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/images/tree-icons/MK0/icoStopping.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/images/tree-icons/artifact-blank.png b/kernel/org.eclipse.virgo.management.console/images/tree-icons/artifact-blank.png
new file mode 100644
index 0000000..837f860
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/images/tree-icons/artifact-blank.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/images/tree-icons/artifact-bundle.png b/kernel/org.eclipse.virgo.management.console/images/tree-icons/artifact-bundle.png
new file mode 100644
index 0000000..1131d39
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/images/tree-icons/artifact-bundle.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/images/tree-icons/artifact-configuration.png b/kernel/org.eclipse.virgo.management.console/images/tree-icons/artifact-configuration.png
new file mode 100644
index 0000000..e09a816
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/images/tree-icons/artifact-configuration.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/images/tree-icons/artifact-par.png b/kernel/org.eclipse.virgo.management.console/images/tree-icons/artifact-par.png
new file mode 100644
index 0000000..ccc1d7d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/images/tree-icons/artifact-par.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/images/tree-icons/artifact-plan.png b/kernel/org.eclipse.virgo.management.console/images/tree-icons/artifact-plan.png
new file mode 100644
index 0000000..6419d76
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/images/tree-icons/artifact-plan.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/images/tree-icons/artifact-region.png b/kernel/org.eclipse.virgo.management.console/images/tree-icons/artifact-region.png
new file mode 100644
index 0000000..120731f
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/images/tree-icons/artifact-region.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/images/tree-icons/attribute-atomic.png b/kernel/org.eclipse.virgo.management.console/images/tree-icons/attribute-atomic.png
new file mode 100644
index 0000000..53015c7
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/images/tree-icons/attribute-atomic.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/images/tree-icons/attribute-scoped-atomic.png b/kernel/org.eclipse.virgo.management.console/images/tree-icons/attribute-scoped-atomic.png
new file mode 100644
index 0000000..9a60da5
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/images/tree-icons/attribute-scoped-atomic.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/images/tree-icons/attribute-scoped.png b/kernel/org.eclipse.virgo.management.console/images/tree-icons/attribute-scoped.png
new file mode 100644
index 0000000..4a37399
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/images/tree-icons/attribute-scoped.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/images/tree-icons/attribute-spring.png b/kernel/org.eclipse.virgo.management.console/images/tree-icons/attribute-spring.png
new file mode 100644
index 0000000..10a5d4c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/images/tree-icons/attribute-spring.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/images/tree-icons/base.png b/kernel/org.eclipse.virgo.management.console/images/tree-icons/base.png
new file mode 100644
index 0000000..7ba9b4f
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/images/tree-icons/base.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/java/org/eclipse/virgo/management/console/Activator.java b/kernel/org.eclipse.virgo.management.console/src/main/java/org/eclipse/virgo/management/console/Activator.java
new file mode 100644
index 0000000..0925b6e
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/java/org/eclipse/virgo/management/console/Activator.java
@@ -0,0 +1,198 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.virgo.management.console;
+
+import java.util.Dictionary;
+import java.util.Hashtable;
+
+import org.eclipse.virgo.management.console.internal.AdminHttpContext;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.Filter;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.http.HttpService;
+import org.osgi.service.url.URLStreamHandlerService;
+import org.osgi.util.tracker.ServiceTracker;
+import org.osgi.util.tracker.ServiceTrackerCustomizer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.jolokia.osgi.servlet.JolokiaServlet;
+
+/**
+ *
+ *	This class is ThreadSafe
+ *
+ */
+public class Activator implements BundleActivator {
+
+	private static final Logger log = LoggerFactory.getLogger(Activator.class);
+	
+	protected static final String APPLICATION_NAME = "Virgo Admin Console";
+	
+	private static final String CONTENT_CONTEXT_PATH = "/content";
+	
+	private static final String RESOURCES_CONTEXT_PATH = "/resources";
+	
+	private static final String UPLOAD_CONTEXT_PATH = "/upload";
+	
+	private static final String JOLOKIA_CONTEXT_PATH = "/jolokia";
+
+	protected static String contextPath = null;
+	
+	private ServiceTracker<HttpService, HttpService> httpServiceTracker;
+	
+	private ServiceTracker<URLStreamHandlerService, URLStreamHandlerService> urlEncoderServiceTracker;
+	
+	private transient HttpService registeredHttpService = null;
+	
+	private transient boolean isRegisteredWithHttpService = false;
+	
+	private final Object lock = new Object();
+
+	private BundleContext bundleContext;
+
+	@Override
+	public void start(BundleContext context) throws Exception {
+		this.bundleContext = context;
+		
+		Activator.contextPath = this.bundleContext.getBundle().getHeaders().get("Web-ContextPath");
+		this.httpServiceTracker = new ServiceTracker<HttpService, HttpService>(context, HttpService.class, new HttpServiceTrackerCustomizer(context));
+		
+		Filter createFilter = context.createFilter("(&(" + Constants.OBJECTCLASS + "=" + URLStreamHandlerService.class.getSimpleName() + ")(url.handler.protocol=webbundle))");
+		this.urlEncoderServiceTracker = new ServiceTracker<URLStreamHandlerService, URLStreamHandlerService>(context, createFilter, new UrlEncoderServiceTrackerCustomizer(context));
+
+		this.httpServiceTracker.open();
+		this.urlEncoderServiceTracker.open();
+	}
+
+	@Override
+	public void stop(BundleContext context) throws Exception {
+		this.httpServiceTracker.close();
+		this.urlEncoderServiceTracker.close();
+	}
+	
+	private void registerWithHttpService(){
+		synchronized (this.lock) {
+			if(this.registeredHttpService != null){
+				try {
+					AdminHttpContext adminHttpContext = new AdminHttpContext(this.bundleContext.getBundle());
+					Dictionary<String, String> contentServletInitParams = new Hashtable<String, String>();
+					contentServletInitParams.put(ContentServlet.CONTENT_SERVLET_PREFIX, "/WEB-INF/layouts");
+					contentServletInitParams.put(ContentServlet.CONTENT_SERVLET_SUFFIX, ".html");
+					ContentServlet contentServlet = new ContentServlet();
+					this.registeredHttpService.registerServlet(Activator.contextPath, 							new IndexServlet(contentServlet), 		null,	adminHttpContext);
+					this.registeredHttpService.registerServlet(Activator.contextPath + CONTENT_CONTEXT_PATH, 	contentServlet, contentServletInitParams,		adminHttpContext);
+					this.registeredHttpService.registerServlet(Activator.contextPath + RESOURCES_CONTEXT_PATH, 	new ResourceServlet(), 					null,	adminHttpContext);
+					this.registeredHttpService.registerServlet(Activator.contextPath + UPLOAD_CONTEXT_PATH, 	new UploadServlet(this.bundleContext),	null,	adminHttpContext);
+					this.registeredHttpService.registerServlet(Activator.contextPath + JOLOKIA_CONTEXT_PATH, 	new JolokiaServlet(this.bundleContext),	null, 	null);
+					this.isRegisteredWithHttpService = true;
+					log.info("Admin console registered to HttpService: " + Activator.contextPath);
+				} catch (Exception e) {
+					log.error("Failed to register AdminConsole with HttpService", e);
+					this.unRegisterWithHttpService();
+				} 
+			}
+		}
+	}
+	
+	private void unRegisterWithHttpService(){
+		synchronized (this.lock) {
+			if(this.registeredHttpService != null){
+				this.doSafeUnregister(Activator.contextPath + Activator.CONTENT_CONTEXT_PATH);
+				this.doSafeUnregister(Activator.contextPath + Activator.RESOURCES_CONTEXT_PATH);
+				this.doSafeUnregister(Activator.contextPath + Activator.UPLOAD_CONTEXT_PATH);
+				this.doSafeUnregister(Activator.contextPath + Activator.JOLOKIA_CONTEXT_PATH);
+				this.doSafeUnregister(Activator.contextPath);
+			}
+			this.isRegisteredWithHttpService = false;
+			log.info("Admin console unregistering from HttpService at " + Activator.contextPath);
+		}
+	}
+	
+	private void doSafeUnregister(String path){
+		try{
+			this.registeredHttpService.unregister(path);
+		}catch(IllegalArgumentException e){
+			log.warn("Failed to unregister '" + path + "' from HttpService");
+		}
+	}
+	
+	/**
+	 * Tracker event handler for HttpService
+	 */
+	private class HttpServiceTrackerCustomizer implements ServiceTrackerCustomizer<HttpService, HttpService> {
+
+		private final BundleContext context;
+
+		public HttpServiceTrackerCustomizer(BundleContext context) {
+			this.context = context;
+		}
+
+		@Override
+		public HttpService addingService(ServiceReference<HttpService> reference) {
+			HttpService service = this.context.getService(reference);
+			if(urlEncoderServiceTracker.isEmpty() && !isRegisteredWithHttpService){
+				registeredHttpService = service;
+				registerWithHttpService();
+			}
+			return service;
+		}
+
+		@Override
+		public void modifiedService(ServiceReference<HttpService> reference, HttpService service) {
+			// no-op
+		}
+
+		@Override
+		public void removedService(ServiceReference<HttpService> reference,	HttpService service) {
+			if(registeredHttpService != null && service.equals(registeredHttpService)){
+				unRegisterWithHttpService();
+				registeredHttpService = null;
+			}
+		}
+		
+	}
+
+	/**
+	 * Tracker event handler for URLStreamHandlerService
+	 */
+	private class UrlEncoderServiceTrackerCustomizer implements ServiceTrackerCustomizer<URLStreamHandlerService, URLStreamHandlerService>{
+
+		private final BundleContext context;
+
+		public UrlEncoderServiceTrackerCustomizer(BundleContext context) {
+			this.context = context;
+		}
+
+		@Override
+		public URLStreamHandlerService addingService(ServiceReference<URLStreamHandlerService> reference) {
+			if(registeredHttpService != null){
+				unRegisterWithHttpService();
+			}
+			return this.context.getService(reference);
+		}
+
+		@Override
+		public void modifiedService(ServiceReference<URLStreamHandlerService> reference, URLStreamHandlerService service) {
+			// no-op
+		}
+
+		@Override
+		public void removedService(ServiceReference<URLStreamHandlerService> reference, URLStreamHandlerService service) {
+			if(urlEncoderServiceTracker.isEmpty() && !isRegisteredWithHttpService && registeredHttpService != null){
+				registerWithHttpService();
+			}
+		}
+		
+	}
+	
+}
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/java/org/eclipse/virgo/management/console/ContentServlet.java b/kernel/org.eclipse.virgo.management.console/src/main/java/org/eclipse/virgo/management/console/ContentServlet.java
new file mode 100644
index 0000000..0c71dd4
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/java/org/eclipse/virgo/management/console/ContentServlet.java
@@ -0,0 +1,276 @@
+/*
+ * Copyright 2004-2008 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.eclipse.virgo.management.console;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PrintWriter;
+import java.lang.management.ManagementFactory;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLConnection;
+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.Set;
+
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.virgo.management.console.internal.ContentURLFetcher;
+import org.eclipse.virgo.management.console.internal.GZIPResponseStream;
+import org.eclipse.virgo.management.console.internal.Parser;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Special servlet to load static resources.
+ * 
+ */
+public class ContentServlet extends HttpServlet {
+	
+	private static final Logger log = LoggerFactory.getLogger(ContentServlet.class);
+
+	private static final long serialVersionUID = 1L;
+
+	private static final String HTTP_CONTENT_LENGTH_HEADER = "Content-Length";
+
+	private static final String HTTP_LAST_MODIFIED_HEADER = "Last-Modified";
+
+	private static final String HTTP_EXPIRES_HEADER = "Expires";
+
+	private static final String HTTP_CACHE_CONTROL_HEADER = "Cache-Control";
+
+	protected static final String CONTENT_SERVLET_PREFIX = "prefix";
+
+	protected static final String CONTENT_SERVLET_SUFFIX = "suffix";
+	
+    private final MBeanServer server = ManagementFactory.getPlatformMBeanServer();
+	
+	private boolean gzipEnabled = true;
+
+	private int cacheTimeout = 60; //The number of seconds content should be cached by the client. Zero disables caching, 31556926 is one year.
+
+	private ContentURLFetcher urlFetcher;
+
+	private Map<String, String> defaultMimeTypes = new HashMap<String, String>();
+	{
+		defaultMimeTypes.put(".html",  "text/html");
+		defaultMimeTypes.put(".htm",   "text/html");
+		defaultMimeTypes.put(".xhtml", "text/html");
+	}
+
+	private Set<String> compressedMimeTypes = new HashSet<String>();
+	{
+		compressedMimeTypes.add("text/.*");
+		compressedMimeTypes.add(".*/xhtml.xml");
+	}
+
+    public void init(ServletConfig config) throws ServletException {
+    	super.init(config);
+    	String prefix = config.getInitParameter(CONTENT_SERVLET_PREFIX);
+    	String suffix = config.getInitParameter(CONTENT_SERVLET_SUFFIX);
+    	this.urlFetcher = new ContentURLFetcher(config.getServletContext(), prefix, suffix);
+    }
+	
+	/**
+	 * {@inheritDoc}
+	 */
+	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+		String rawRequestPath = this.getRequestPath(request);
+		if (log.isDebugEnabled()) {
+			log.debug("Attempting to GET content: " + rawRequestPath);
+		}
+		
+		URL resource = this.urlFetcher.getRequestedContentURL(rawRequestPath);
+		if (resource == null) {
+			if (log.isDebugEnabled()) {
+				log.debug("Content not found: " + rawRequestPath);
+			}
+			response.sendError(HttpServletResponse.SC_NOT_FOUND);
+			return;
+		}
+		prepareContentResponse(response, resource);
+		PrintWriter out = selectOutputStream(request, response, resource);
+		URLConnection resourceConn = resource.openConnection();
+		try {
+			InputStream in = resourceConn.getInputStream();
+			try {
+				Map<String, String> pageContext = new HashMap<String, String>();
+				this.preparePageContext(pageContext, rawRequestPath);
+				new Parser(out, this.urlFetcher, pageContext).parse(in);
+			} finally {
+				in.close();
+			}
+		} finally {
+			out.close();
+		}
+	}
+
+	private PrintWriter selectOutputStream(final HttpServletRequest request, final HttpServletResponse response, final URL resource) throws IOException {
+		String acceptEncoding = request.getHeader("Accept-Encoding");
+		String mimeType;
+		try {
+			mimeType = response.getContentType();
+		} catch(UnsupportedOperationException e){
+			mimeType = getResponseMimeType(resource);
+		}
+		if (gzipEnabled && 
+				acceptEncoding != null && 
+				acceptEncoding.indexOf("gzip") > -1 && 
+				matchesCompressedMimeTypes(mimeType)) {
+			log.debug("Enabling GZIP compression for the current response.");
+			return new PrintWriter(new GZIPResponseStream(response));
+		} else {
+			return response.getWriter();
+		}
+	}
+
+	private boolean matchesCompressedMimeTypes(final String mimeType) {
+		for(String compressedMimeType: compressedMimeTypes){
+			if(mimeType.matches(compressedMimeType)){
+				return true;
+			}
+		}
+		return false;
+	}
+	
+	private void prepareContentResponse(final HttpServletResponse response, final URL resource) throws IOException {	
+		URLConnection resourceConn = resource.openConnection();
+		response.setContentType(getResponseMimeType(resource));
+		response.setHeader(HTTP_CONTENT_LENGTH_HEADER, Long.toString(resourceConn.getContentLength()));
+		response.setDateHeader(HTTP_LAST_MODIFIED_HEADER, resourceConn.getLastModified());
+		if (cacheTimeout > 0) {
+			configureCaching(response, cacheTimeout);
+		}
+	}
+	
+	private String getResponseMimeType(final URL resource){
+		String extension = resource.getPath().substring(resource.getPath().lastIndexOf('.'));
+		String mimeType = (String) defaultMimeTypes.get(extension);
+		if (mimeType == null) {
+			 mimeType = getServletContext().getMimeType(resource.getPath());
+		}
+		return mimeType;
+	}
+	
+	private void preparePageContext(final Map<String, String> pageContext, final String rawRequestPath){
+		String viewName = rawRequestPath;
+		if('/' == viewName.charAt(0)){
+			viewName = viewName.substring(1);
+		}
+		
+		List<String> menuItems = new ArrayList<String>();
+
+		this.addIfMbeanPresent(menuItems, "artifacts", "org.eclipse.virgo.kernel:type=ArtifactModel,artifact-type=*,*");
+		this.addIfMbeanPresent(menuItems, "repositories", "org.eclipse.virgo.kernel:type=Repository,name=*");
+		this.addIfMbeanPresent(menuItems, "wirings", "osgi.core:version=1.0,type=wiringState,region=*");
+		this.addIfMbeanPresent(menuItems, "dumps", "org.eclipse.virgo.kernel:type=Medic,name=DumpInspector");
+		this.addIfMbeanPresent(menuItems, "configurations", "osgi.compendium:service=cm,version=1.3,region=*");
+		this.addIfMbeanPresent(menuItems, "logging", "ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator");
+		
+		String stringArray = Arrays.toString(menuItems.toArray(new String[menuItems.size()]));
+		pageContext.put("menuNames", stringArray.substring(1, stringArray.length() - 1));
+		pageContext.put("viewName", viewName);
+		
+		ServletContext servletContext = getServletContext();
+		try {
+			if (servletContext.getContextPath().isEmpty()) {
+				// running with plain Jetty HttpService
+				pageContext.put("contextPath", Activator.contextPath);
+				pageContext.put("servletContextName", Activator.APPLICATION_NAME);
+			} else {
+				pageContext.put("contextPath", servletContext.getContextPath());
+				pageContext.put("servletContextName", servletContext.getServletContextName());
+			}
+		} catch(UnsupportedOperationException e){
+			pageContext.put("contextPath", Activator.contextPath);
+			pageContext.put("servletContextName", Activator.APPLICATION_NAME);
+		}
+		pageContext.put("servletContainer", servletContext.getServerInfo());
+		pageContext.put("virtualMachine", String.format("%s - %s %s (%s)", System.getProperty("java.version"), System.getProperty("java.vm.name"), System.getProperty("java.vm.version"), System.getProperty("java.vm.vendor")));
+		pageContext.put("operatingSystem", String.format("%s %s (%s)", System.getProperty("os.name"), System.getProperty("os.version"), System.getProperty("os.arch")));
+	}
+
+	private void addIfMbeanPresent(List<String> menuItems, String viewName, String objectName){
+		try {
+			ObjectName objectNameImpl = new ObjectName(objectName);
+			if(objectNameImpl.isPattern()){
+				Set<ObjectName> queryNames = this.server.queryNames(objectNameImpl, null);
+				if(queryNames.size() > 0){
+					menuItems.add(viewName);
+				}
+			}else{
+				if(this.server.isRegistered(objectNameImpl)){
+					menuItems.add(viewName);
+				}
+			}
+		} catch (Exception e) {
+			this.log("Error checking for MBean required for Admin Console Page" + objectName, e);
+		}
+	}
+	
+	/**
+	 * {@inheritDoc}
+	 */
+	protected long getLastModified(HttpServletRequest request) {
+		String rawRequestPath = this.getRequestPath(request);
+		if (log.isDebugEnabled()) {
+			log.debug("Checking last modified of content: " + rawRequestPath);
+		}
+		URL resource;
+		try {
+			resource = this.urlFetcher.getRequestedContentURL(rawRequestPath);
+		} catch (MalformedURLException e) {
+			return -1;
+		}
+		if (resource == null) {
+			return -1;
+		}
+		try {
+			return resource.openConnection().getLastModified();
+		} catch (IOException e) {
+			return -1;
+		}
+	}
+	
+	private String getRequestPath(HttpServletRequest request){
+		String rawRequestPath = request.getPathInfo();
+		if(rawRequestPath == null){
+			rawRequestPath = "/overview";
+		}
+		return rawRequestPath;
+	}
+
+	/**
+	 * Set HTTP headers to allow caching for the given number of seconds.
+	 * @param seconds number of seconds into the future that the response should be cacheable for
+	 */
+	private void configureCaching(final HttpServletResponse response, final int seconds) {
+		response.setDateHeader(HTTP_EXPIRES_HEADER, System.currentTimeMillis() + seconds * 1000L); // HTTP 1.0 header
+		response.setHeader(HTTP_CACHE_CONTROL_HEADER, "max-age=" + seconds);// HTTP 1.1 header
+	}
+
+}
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/java/org/eclipse/virgo/management/console/IndexServlet.java b/kernel/org.eclipse.virgo.management.console/src/main/java/org/eclipse/virgo/management/console/IndexServlet.java
new file mode 100644
index 0000000..c9a869e
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/java/org/eclipse/virgo/management/console/IndexServlet.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.virgo.management.console;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * A very simple servlet to redirect requests to the root servlet path to the overview page
+ *
+ */
+public class IndexServlet extends HttpServlet {
+
+	private static final long serialVersionUID = 1L;
+
+	private final ContentServlet contentServlet;
+	
+	public IndexServlet(ContentServlet contentServlet) {
+		this.contentServlet = contentServlet;
+	}
+	
+	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+		this.contentServlet.doGet(request, response);
+	}
+	
+}
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/java/org/eclipse/virgo/management/console/ResourceServlet.java b/kernel/org.eclipse.virgo.management.console/src/main/java/org/eclipse/virgo/management/console/ResourceServlet.java
new file mode 100644
index 0000000..1af1964
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/java/org/eclipse/virgo/management/console/ResourceServlet.java
@@ -0,0 +1,363 @@
+/*
+ * Copyright 2004-2008 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.eclipse.virgo.management.console;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.virgo.management.console.internal.GZIPResponseStream;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Special servlet to load static resources and render the admin HTML pages
+ * 
+ * @author Jeremy Grelle
+ * @author Scott Andrews
+ * @author Christopher Frost
+ */
+public class ResourceServlet extends HttpServlet {
+
+	private static final long serialVersionUID = 1L;
+
+	private static final String HTTP_CONTENT_LENGTH_HEADER = "Content-Length";
+
+	private static final String HTTP_LAST_MODIFIED_HEADER = "Last-Modified";
+
+	private static final String HTTP_EXPIRES_HEADER = "Expires";
+
+	private static final String HTTP_CACHE_CONTROL_HEADER = "Cache-Control";
+
+	private static final Logger log = LoggerFactory.getLogger(ResourceServlet.class);
+
+	private final String protectedPath = "/?WEB-INF/.*";
+
+	private String jarPathPrefix = "META-INF";
+
+	private boolean gzipEnabled = true;
+	
+	private int cacheTimeout = 31556926; //The number of seconds resources should be cached by the client. Zero disables caching, default is one year.
+	
+	private Set<String> allowedResourcePaths = new HashSet<String>();
+	{
+		allowedResourcePaths.add("/.*/.*css");
+		allowedResourcePaths.add("/.*/.*gif");
+		allowedResourcePaths.add("/.*/.*ico");
+		allowedResourcePaths.add("/.*/.*jpeg");
+		allowedResourcePaths.add("/.*/.*jpg");
+		allowedResourcePaths.add("/.*/.*js");
+		allowedResourcePaths.add("/.*/.*png");
+		allowedResourcePaths.add("META-INF/.*/*css");
+		allowedResourcePaths.add("META-INF/.*/*gif");
+		allowedResourcePaths.add("META-INF/.*/*ico");
+		allowedResourcePaths.add("META-INF/.*/*jpeg");
+		allowedResourcePaths.add("META-INF/.*/*jpg");
+		allowedResourcePaths.add("META-INF/.*/*js");
+		allowedResourcePaths.add("META-INF/.*/*png");
+	}
+
+	private Map<String, String> defaultMimeTypes = new HashMap<String, String>();
+	{
+		defaultMimeTypes.put(".css", "text/css");
+		defaultMimeTypes.put(".gif", "image/gif");
+		defaultMimeTypes.put(".ico", "image/vnd.microsoft.icon");
+		defaultMimeTypes.put(".jpeg", "image/jpeg");
+		defaultMimeTypes.put(".jpg", "image/jpeg");
+		defaultMimeTypes.put(".js", "text/javascript");
+		defaultMimeTypes.put(".png", "image/png");
+	}
+
+	private Set<String> compressedMimeTypes = new HashSet<String>();
+	{
+		compressedMimeTypes.add("text/.*");
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+		String rawRequestPath = request.getPathInfo();
+		
+		if (log.isDebugEnabled()) {
+			log.debug("Attempting to GET resource: " + rawRequestPath);
+		}
+		
+		URL[] resources = getRequestResourceURLs(request);
+		if (resources == null || resources.length == 0) {
+			if (log.isDebugEnabled()) {
+				log.debug("Resource not found: " + rawRequestPath);
+			}
+			response.sendError(HttpServletResponse.SC_NOT_FOUND);
+			return;
+		}
+		
+		prepareResourcesResponse(response, resources, rawRequestPath);
+		OutputStream out = selectOutputStream(request, response, resources, rawRequestPath);
+		try {
+			for (int i = 0; i < resources.length; i++) {
+				URLConnection resourceConn = resources[i].openConnection();
+				InputStream in = resourceConn.getInputStream();
+				try {
+					byte[] buffer = new byte[1024];
+					int bytesRead = -1;
+					while ((bytesRead = in.read(buffer)) != -1) {
+						out.write(buffer, 0, bytesRead);
+					}
+				} finally {
+					in.close();
+				}
+			}
+		} finally {
+			out.close();
+		}
+	}
+
+	private OutputStream selectOutputStream(final HttpServletRequest request, final HttpServletResponse response, final URL[] resources, final String rawResourcePath) throws IOException {
+		String acceptEncoding = request.getHeader("Accept-Encoding");
+		String mimeType;
+		try {
+			mimeType = response.getContentType();
+		} catch(UnsupportedOperationException e){
+			mimeType = getResponseMimeType(resources, rawResourcePath);
+		}
+		if (gzipEnabled && acceptEncoding != null && acceptEncoding.indexOf("gzip") > -1 && matchesCompressedMimeTypes(mimeType)) {
+			log.debug("Enabling GZIP compression for the current response.");
+			return new GZIPResponseStream(response);
+		} else {
+			return response.getOutputStream();
+		}
+	}
+
+	private boolean matchesCompressedMimeTypes(String mimeType) {
+		for(String compressedMimeType: compressedMimeTypes){
+			if(mimeType.matches(compressedMimeType)){
+				return true;
+			}
+		}
+		return false;
+	}
+	
+	private void prepareResourcesResponse(HttpServletResponse response, URL[] resources, String rawResourcePath) throws IOException {
+		long lastModified = -1;
+		int contentLength = 0;
+		String mimeType = null;
+		for (int i = 0; i < resources.length; i++) {
+			URLConnection resourceConn = resources[i].openConnection();
+			if (resourceConn.getLastModified() > lastModified) {
+				lastModified = resourceConn.getLastModified();
+			}
+			mimeType = getMimeType(rawResourcePath, resources[i], mimeType);
+			contentLength += resourceConn.getContentLength();
+		}
+
+		response.setContentType(mimeType);
+		response.setHeader(HTTP_CONTENT_LENGTH_HEADER, Long.toString(contentLength));
+		response.setDateHeader(HTTP_LAST_MODIFIED_HEADER, lastModified);
+		if (cacheTimeout > 0) {
+			configureCaching(response, cacheTimeout);
+		}
+	}
+	
+	
+	private String getResponseMimeType(final URL[] resources, String rawResourcePath) throws IOException{
+		String mimeType = null;
+		for (int i = 0; i < resources.length; i++) {
+			mimeType = getMimeType(rawResourcePath, resources[i], mimeType);
+		}
+		return mimeType;
+	}
+	
+	private String getMimeType(final String rawResourcePath, final URL resource, String expectedMimeType) throws MalformedURLException{
+		String extension = resource.getPath().substring(resource.getPath().lastIndexOf('.'));
+		String currentMimeType = (String) defaultMimeTypes.get(extension);
+		if (currentMimeType == null) {
+			currentMimeType = getServletContext().getMimeType(resource.getPath());
+		}
+		if (expectedMimeType == null) {
+			expectedMimeType = currentMimeType;
+		} else if (!expectedMimeType.equals(currentMimeType)) {
+			throw new MalformedURLException("Combined resource path: " + rawResourcePath + " is invalid. All resources in a combined resource path must be of the same mime type.");
+		}
+		return expectedMimeType;
+	}
+	
+	/**
+	 * {@inheritDoc}
+	 */
+	protected long getLastModified(HttpServletRequest request) {
+		if (log.isDebugEnabled()) {
+			log.debug("Checking last modified of resource: " + request.getPathInfo());
+		}
+		URL[] resources;
+		try {
+			resources = getRequestResourceURLs(request);
+		} catch (MalformedURLException e) {
+			return -1;
+		}
+
+		if (resources == null || resources.length == 0) {
+			return -1;
+		}
+
+		long lastModified = -1;
+
+		for (int i = 0; i < resources.length; i++) {
+			URLConnection resourceConn;
+			try {
+				resourceConn = resources[i].openConnection();
+			} catch (IOException e) {
+				return -1;
+			}
+			if (resourceConn.getLastModified() > lastModified) {
+				lastModified = resourceConn.getLastModified();
+			}
+		}
+		return lastModified;
+	}
+
+	private URL[] getRequestResourceURLs(HttpServletRequest request) throws MalformedURLException {
+
+		String rawResourcePath = request.getPathInfo();
+		String appendedPaths = request.getParameter("appended");
+		if (appendedPaths != null && appendedPaths.length() < 0) {
+			rawResourcePath = rawResourcePath + "," + appendedPaths;
+		}
+		String[] localResourcePaths = this.delimitedListToStringArray(rawResourcePath, ",");
+		URL[] resources = new URL[localResourcePaths.length];
+		for (int i = 0; i < localResourcePaths.length; i++) {
+			String localResourcePath = localResourcePaths[i];
+			if (!isAllowed(localResourcePath)) {
+				if (log.isWarnEnabled()) {
+					log.warn("An attempt to access a protected resource at " + localResourcePath + " was disallowed.");
+				}
+				return null;
+			}
+			URL resource = getServletContext().getResource(localResourcePath);
+			if (resource == null) {
+				resource = getJarResource(jarPathPrefix, localResourcePath);
+			}
+			if (resource == null) {
+				if (resources.length > 1) {
+					log.debug("Combined resource not found: " + localResourcePath);
+				}
+				return null;
+			} else {
+				resources[i] = resource;
+			}
+		}
+		return resources;
+	}
+
+	private URL getJarResource(String jarPrefix, String resourcePath) {
+		String jarResourcePath = jarPrefix + resourcePath;
+		if (!isAllowed(jarResourcePath)) {
+			if (log.isWarnEnabled()) {
+				log.warn("An attempt to access a protected resource at " + jarResourcePath + " was disallowed.");
+			}
+			return null;
+		}
+		if (jarResourcePath.startsWith("/")) {
+			jarResourcePath = jarResourcePath.substring(1);
+		}
+		if (log.isDebugEnabled()) {
+			log.debug("Searching classpath for resource: " + jarResourcePath);
+		}
+		return getDefaultClassLoader().getResource(jarResourcePath);
+	}
+	
+	/*
+	 * TODO think I can delete this and just use the this classes classloader.
+	 */
+	private static ClassLoader getDefaultClassLoader() {
+		ClassLoader cl = null;
+		try {
+			cl = Thread.currentThread().getContextClassLoader();
+		}
+		catch (Throwable ex) {
+			// Cannot access thread context ClassLoader - falling back to system class loader...
+		}
+		if (cl == null) {
+			// No thread context class loader -> use class loader of this class.
+			cl = ResourceServlet.class.getClassLoader();
+		}
+		return cl;
+	}
+
+	private boolean isAllowed(String resourcePath) {
+		if (resourcePath.matches(protectedPath)) {
+			return false;
+		}
+		for(String allowedResourcePath: allowedResourcePaths){
+			if(resourcePath.matches(allowedResourcePath)){
+				return true;
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * Set HTTP headers to allow caching for the given number of seconds.
+	 * @param seconds number of seconds into the future that the response should be cacheable for
+	 */
+	private void configureCaching(HttpServletResponse response, int seconds) {
+		response.setDateHeader(HTTP_EXPIRES_HEADER, System.currentTimeMillis() + seconds * 1000L);// HTTP 1.0 header
+		response.setHeader(HTTP_CACHE_CONTROL_HEADER, "max-age=" + seconds);// HTTP 1.1 header
+	}
+	
+	private String[] delimitedListToStringArray(String str, String delimiter) {
+		if (str == null) {
+			return new String[0];
+		}
+		if (delimiter == null) {
+			return new String[] {str};
+		}
+		List<String> result = new ArrayList<String>();
+		if ("".equals(delimiter)) {
+			for (int i = 0; i < str.length(); i++) {
+				result.add(str.substring(i, i + 1));
+			}
+		}
+		else {
+			int pos = 0;
+			int delPos = 0;
+			while ((delPos = str.indexOf(delimiter, pos)) != -1) {
+				result.add(str.substring(pos, delPos));
+				pos = delPos + delimiter.length();
+			}
+			if (str.length() > 0 && pos <= str.length()) {
+				// Add rest of String, but not in case of empty input.
+				result.add(str.substring(pos));
+			}
+		}
+		return (String[]) result.toArray(new String[result.size()]);
+	}
+
+}
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/java/org/eclipse/virgo/management/console/UploadServlet.java b/kernel/org.eclipse.virgo.management.console/src/main/java/org/eclipse/virgo/management/console/UploadServlet.java
new file mode 100644
index 0000000..3be4788
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/java/org/eclipse/virgo/management/console/UploadServlet.java
@@ -0,0 +1,180 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.virgo.management.console;
+
+import org.apache.commons.fileupload.FileItem;
+import org.apache.commons.fileupload.FileItemFactory;
+import org.apache.commons.fileupload.disk.DiskFileItemFactory;
+import org.apache.commons.fileupload.servlet.ServletFileUpload;
+import org.osgi.framework.BundleContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.management.MBeanServer;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+import javax.management.openmbean.CompositeDataSupport;
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.lang.management.ManagementFactory;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ *
+ */
+public class UploadServlet extends HttpServlet {
+
+    private static final String[] DEPLOYMENT_IDENTITY_FIELDS = new String[]{"type", "symbolicName", "version"};
+
+    private static final int HTTP_RESPONSE_INTERNAL_SERVER_ERROR = 500;
+
+    private static final String ORG_ECLIPSE_VIRGO_KERNEL_HOME = "org.eclipse.virgo.kernel.home";
+
+    private static final String DEPLOYER_MBEAN_NAME = "org.eclipse.virgo.kernel:category=Control,type=Deployer";
+
+    private static final long serialVersionUID = 1L;
+
+    private static final String STAGING_DIR = "/work/org.eclipse.virgo.apps.admin.web.UploadServlet";
+
+    private static final Logger log = LoggerFactory.getLogger(UploadServlet.class);
+
+    private MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
+
+    private String serverHome = null;
+
+    private BundleContext bundleContext = null;
+
+    public UploadServlet() {
+    }
+
+    public UploadServlet(BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
+    }
+
+    /**
+     * Do not use this method with the HTTPService unless the BundleContext has already been set.
+     */
+    public void init(ServletConfig config) throws ServletException {
+        super.init(config);
+        if (bundleContext == null) {
+            this.bundleContext = (BundleContext) config.getServletContext().getAttribute("osgi-bundlecontext");
+        }
+        this.serverHome = this.bundleContext.getProperty(ORG_ECLIPSE_VIRGO_KERNEL_HOME);
+    }
+
+    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
+        try {
+            File stagingDir = createStagingDirectory();
+            FileItemFactory factory = new DiskFileItemFactory();
+            ServletFileUpload upload = new ServletFileUpload(factory);
+            response.setContentType("text/html");
+            List<FileItem> items = (List<FileItem>) upload.parseRequest(request);
+            List<File> uploadedFiles = new ArrayList<File>();
+            for (FileItem fileItem : items) {
+                File uploadedFile = this.doUpload(fileItem, stagingDir);
+                if (uploadedFile != null) {
+                    uploadedFiles.add(uploadedFile);
+                }
+            }
+            doDeployment(uploadedFiles, response);
+        } catch (IllegalArgumentException ea) {
+            PrintWriter writer = response.getWriter();
+            writer.append("<ol id=\"uploadResults\"><li>File name contains '/' or '\\', this is not allowed.</ol>");
+            writer.close();
+        } catch (Exception e) {
+            log.error(e.toString());
+            response.sendError(HTTP_RESPONSE_INTERNAL_SERVER_ERROR, e.toString());
+        }
+    }
+
+    File doUpload(FileItem fileItem, File stagingDir) throws Exception {
+        if (!fileItem.isFormField()) {
+            String name = fileItem.getName();
+            if (name != null && name.length() > 0) {
+                if (name.contains("\\") || name.contains("/")) {
+                    name = getFileNameFromPath(name);
+                }
+                File uploadedFile = new File(stagingDir, name);
+                fileItem.write(uploadedFile);
+                log.info(String.format("Uploaded artifact of size (%db) to %s", fileItem.getSize(), uploadedFile.getPath()));
+                return uploadedFile;
+            }
+        }
+        return null;
+    }
+
+    private String getFileNameFromPath(String fileName) {
+
+        String strippedFileName = fileName;
+
+        if (fileName.contains("\\") && fileName.contains("/")) {
+            throw new IllegalArgumentException("Security violation, file name contains '/' and '\\'");
+        } else if (fileName.contains("\\")) {
+            String[] fileNameParts = fileName.split("\\\\");
+            strippedFileName = fileNameParts[fileNameParts.length - 1];
+        } else if (fileName.contains("/")) {
+            String[] fileNameParts = fileName.split("/");
+            strippedFileName = fileNameParts[fileNameParts.length - 1];
+        }
+
+        return strippedFileName;
+    }
+
+    private void doDeployment(List<File> uploadedFiles, HttpServletResponse response) throws MalformedObjectNameException, NullPointerException, IOException {
+        ObjectName objectName = new ObjectName(DEPLOYER_MBEAN_NAME);
+        PrintWriter writer = response.getWriter();
+        writer.append("<ol id=\"uploadResults\">");
+        for (File file : uploadedFiles) {
+            URI uri = file.toURI();
+            try {
+                Object invoke = this.mBeanServer.invoke(objectName, "deploy", new Object[]{uri.toString()}, new String[]{String.class.getName()});
+                writer.append("<li>" + file.getName() + " deployed as " + getDeploymentIdentity(invoke) + "</li>");
+            } catch (Exception e) {
+                writer.append("<li>" + file.getName() + " failed to deploy '" + e.getMessage() + "'</li>");
+            }
+            writer.append("<li />");
+        }
+        writer.append("</ol>");
+        writer.close();
+    }
+
+    private String getDeploymentIdentity(Object deploymentIdentity) {
+        StringBuilder builder = new StringBuilder();
+        if (deploymentIdentity instanceof CompositeDataSupport) {
+            CompositeDataSupport deploymentIdentityInstance = (CompositeDataSupport) deploymentIdentity;
+            Object[] all = deploymentIdentityInstance.getAll(DEPLOYMENT_IDENTITY_FIELDS);
+            builder.append(all[0]);
+            builder.append(" - ").append(all[1]);
+            builder.append(": ").append(all[2]);
+        }
+        return builder.toString();
+    }
+
+    private File createStagingDirectory() throws IOException {
+        File pathReference = new File(String.format("%s%s", this.serverHome, STAGING_DIR));
+        if (!pathReference.exists()) {
+            if (!pathReference.mkdirs()) {
+                throw new IOException("Unable to create directory " + pathReference.getAbsolutePath());
+            }
+        }
+        return pathReference.getAbsoluteFile();
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/java/org/eclipse/virgo/management/console/internal/AdminHttpContext.java b/kernel/org.eclipse.virgo.management.console/src/main/java/org/eclipse/virgo/management/console/internal/AdminHttpContext.java
new file mode 100644
index 0000000..ab66257
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/java/org/eclipse/virgo/management/console/internal/AdminHttpContext.java
@@ -0,0 +1,134 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.virgo.management.console.internal;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.StringTokenizer;
+
+import javax.security.auth.Subject;
+import javax.security.auth.callback.Callback;
+import javax.security.auth.callback.CallbackHandler;
+import javax.security.auth.callback.NameCallback;
+import javax.security.auth.callback.PasswordCallback;
+import javax.security.auth.callback.UnsupportedCallbackException;
+import javax.security.auth.login.LoginContext;
+import javax.security.auth.login.LoginException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import org.eclipse.osgi.internal.signedcontent.Base64;
+import org.osgi.framework.Bundle;
+import org.osgi.service.http.HttpContext;
+
+/**
+ * 
+ *
+ */
+public class AdminHttpContext implements HttpContext {
+	
+	private static final String REALM = "Virgo Admin Console";
+	
+	private final Bundle bundle;
+	
+	public AdminHttpContext(Bundle bundle) {
+		this.bundle = bundle;
+	}
+	
+	@Override
+	public boolean handleSecurity(HttpServletRequest request, HttpServletResponse response) throws IOException {
+		String auth = request.getHeader("Authorization");
+		if (auth == null) {
+			return reject(request, response);
+		}
+
+		StringTokenizer tokens = new StringTokenizer(auth);
+		String authscheme = tokens.nextToken();
+		if (!authscheme.equals("Basic")) {
+			return reject(request, response);
+		}
+
+		String base64credentials = tokens.nextToken();
+		String credentials = new String(Base64.decode(base64credentials.getBytes()));
+		int colon = credentials.indexOf(':');
+		String userid = credentials.substring(0, colon);
+		String password = credentials.substring(colon + 1);
+
+		try {
+			Subject subject = login(request.getSession(true), userid, password);
+			if(subject == null){
+				return reject(request, response);
+			}
+			request.setAttribute(HttpContext.REMOTE_USER, userid);
+			request.setAttribute(HttpContext.AUTHENTICATION_TYPE, authscheme);
+			request.setAttribute(HttpContext.AUTHORIZATION, subject);
+			return true;
+		} catch (LoginException e) {
+			return reject(request, response);
+		}
+	}
+
+	@Override
+	public URL getResource(final String name) {
+		return bundle.getEntry(name);
+	}
+
+	@Override
+	public String getMimeType(String name) {
+		return null;
+	}
+	
+	@SuppressWarnings("deprecation")
+	private Subject login(final HttpSession session, final String userid, final String password) throws LoginException {
+		if (session == null){
+			return null;
+		}
+		LoginContext context = (LoginContext) session.getValue("securitycontext");
+		if (context != null){
+			return context.getSubject();
+		}	
+		context = new LoginContext("virgo-kernel", new CallbackHandler() {
+			
+			public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
+				for (int i = 0; i < callbacks.length; i++) {
+					if (callbacks[i] instanceof NameCallback){
+						((NameCallback) callbacks[i]).setName(userid);
+					} else if (callbacks[i] instanceof PasswordCallback){
+						((PasswordCallback) callbacks[i]).setPassword(password.toCharArray());
+					} else {
+						throw new UnsupportedCallbackException(callbacks[i]);
+					}
+				}
+			}
+			
+		});
+		context.login();
+		Subject result = context.getSubject();
+		if(result == null){
+			return null;
+		}
+		session.putValue("securitycontext", context);
+		return result;
+	}
+	
+	private boolean reject(HttpServletRequest request, HttpServletResponse response) {
+		request.getSession(true);
+		response.setHeader("WWW-Authenticate", "Basic realm=\"" + REALM + "\"");
+		try {
+			response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
+		} catch (IOException e) {
+			// no-op
+		}
+		return false;
+	}
+
+}
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/java/org/eclipse/virgo/management/console/internal/ContentURLFetcher.java b/kernel/org.eclipse.virgo.management.console/src/main/java/org/eclipse/virgo/management/console/internal/ContentURLFetcher.java
new file mode 100644
index 0000000..d9ffba8
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/java/org/eclipse/virgo/management/console/internal/ContentURLFetcher.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2004-2008 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.eclipse.virgo.management.console.internal;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.servlet.ServletContext;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @author cgfrost
+ *
+ */
+public class ContentURLFetcher {
+
+	private static final Logger log = LoggerFactory.getLogger(ContentURLFetcher.class);
+
+	private Set<String> protectedPaths = new HashSet<String>();
+	{
+		protectedPaths.add("/?WEB-INF/.*");
+		protectedPaths.add(".*css");
+		protectedPaths.add(".*gif");
+		protectedPaths.add(".*ico");
+		protectedPaths.add(".*jpeg");
+		protectedPaths.add(".*jpg");
+		protectedPaths.add(".*js");
+		protectedPaths.add(".*png");
+	}
+	
+	private String prefix = "";
+	
+	private String suffix = "";
+
+	private final ServletContext context;
+	
+	/**
+	 * 
+	 * @param suffix
+	 * @param prefix
+	 */
+	public ContentURLFetcher(ServletContext context, String prefix, String suffix) {
+		this.context = context;
+		this.prefix = prefix != null ?  prefix : "";
+		this.suffix = suffix != null ?  suffix : "";
+	}
+
+	public URL getRequestedContentURL(String rawRequestPath) throws MalformedURLException {
+		if (!isAllowed(rawRequestPath)) {
+			if (log.isWarnEnabled()) {
+				log.warn("An attempt to access protected content at " + rawRequestPath + " was disallowed.");
+			}
+			return null;
+		}
+		String localResourcePath = String.format("%s%s%s", this.prefix, rawRequestPath, this.suffix);	
+		URL resource = this.context.getResource(localResourcePath);
+		if (resource == null) {
+			if (log.isDebugEnabled()) {
+				log.debug("Content not found: " + localResourcePath);
+			}
+		}
+		return resource;
+	}
+
+	private boolean isAllowed(String resourcePath) {
+		for(String protectedPath: protectedPaths){
+			if(resourcePath.matches(protectedPath)){
+				return false;
+			}
+		}
+		return true;
+	}
+	
+}
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/java/org/eclipse/virgo/management/console/internal/GZIPResponseStream.java b/kernel/org.eclipse.virgo.management.console/src/main/java/org/eclipse/virgo/management/console/internal/GZIPResponseStream.java
new file mode 100644
index 0000000..98742ec
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/java/org/eclipse/virgo/management/console/internal/GZIPResponseStream.java
@@ -0,0 +1,87 @@
+package org.eclipse.virgo.management.console.internal;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.zip.GZIPOutputStream;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.WriteListener;
+import javax.servlet.http.HttpServletResponse;
+
+public class GZIPResponseStream extends ServletOutputStream {
+
+	private ByteArrayOutputStream byteStream = null;
+
+	private GZIPOutputStream gzipStream = null;
+
+	private boolean closed = false;
+
+	private HttpServletResponse response = null;
+
+	private ServletOutputStream servletStream = null;
+
+	public GZIPResponseStream(HttpServletResponse response) throws IOException {
+		super();
+		closed = false;
+		this.response = response;
+		this.servletStream = response.getOutputStream();
+		byteStream = new ByteArrayOutputStream();
+		gzipStream = new GZIPOutputStream(byteStream);
+	}
+
+	public void close() throws IOException {
+		if (closed) {
+			throw new IOException("This output stream has already been closed");
+		}
+		gzipStream.finish();
+
+		byte[] bytes = byteStream.toByteArray();
+
+		response.setContentLength(bytes.length);
+		try {
+			response.addHeader("Content-Encoding", "gzip");
+		} catch(UnsupportedOperationException e){
+			response.setHeader("Content-Encoding", "gzip"); //Not ideal as any previous content headers will be removed but none are set by the admin system.
+		}
+		servletStream.write(bytes);
+		servletStream.flush();
+		servletStream.close();
+		closed = true;
+	}
+
+	public void flush() throws IOException {
+		if (closed) {
+			throw new IOException("Cannot flush a closed output stream");
+		}
+		gzipStream.flush();
+	}
+
+	public void write(int b) throws IOException {
+		if (closed) {
+			throw new IOException("Cannot write to a closed output stream");
+		}
+		gzipStream.write((byte) b);
+	}
+
+	public void write(byte b[]) throws IOException {
+		write(b, 0, b.length);
+	}
+
+	public void write(byte b[], int off, int len) throws IOException {
+		if (closed) {
+			throw new IOException("Cannot write to a closed output stream");
+		}
+		gzipStream.write(b, off, len);
+	}
+
+    @Override
+    public boolean isReady() {
+        // TODO implement javax.servlet 3.1 method
+        return false;
+    }
+
+    @Override
+    public void setWriteListener(WriteListener arg0) {
+        // TODO implement javax.servlet 3.1 method
+    }
+}
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/java/org/eclipse/virgo/management/console/internal/Parser.java b/kernel/org.eclipse.virgo.management.console/src/main/java/org/eclipse/virgo/management/console/internal/Parser.java
new file mode 100644
index 0000000..de09da2
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/java/org/eclipse/virgo/management/console/internal/Parser.java
@@ -0,0 +1,166 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.virgo.management.console.internal;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PrintWriter;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.Map;
+import java.util.Scanner;
+
+/**
+ * @author cgfrost
+ * 
+ */
+public class Parser {
+
+	private static final String START_DECLARATION = "<!--@";
+
+	private static final String END_DECLARATION = "@-->";
+
+	private static final char IMPORT = '&'; // Replace the declaration with another file that will also be parsed, value can be a lookup.
+
+	private static final char SET = '>'; //Place the given value in to the page context, 'String:String'.
+	
+	private static final char LOOKUP = '<'; // Replace the declaration with a lookup from the page context.
+
+	private static final char EVALUATE = '?'; // Replace the declaration with a the result of an evaluation.
+
+	private final Map<String, String> pageContext;
+
+	private final PrintWriter out;
+
+	private final ContentURLFetcher urlFetcher;
+
+	/**
+	 * 
+	 * @param out
+	 * @param modelData
+	 */
+	public Parser(PrintWriter out, ContentURLFetcher urlFetcher, Map<String, String> modelData) {
+		this.out = out;
+		this.urlFetcher = urlFetcher;
+		this.pageContext = modelData;
+	}
+
+	/**
+	 * 
+	 * @param in
+	 */
+	public final void parse(InputStream in) throws IOException {
+		try (Scanner scanner = new Scanner(in)) {
+			String parsedLine;
+			while (scanner.hasNextLine()) {
+				parsedLine = parseLine(scanner.nextLine());
+				if (parsedLine != null && !parsedLine.trim().isEmpty()) {
+					out.append(parsedLine);
+					out.append('\n');
+				}
+			}
+		}
+	}
+
+	private String parseLine(String line) throws IOException {
+		int startOffset = line.indexOf(START_DECLARATION);
+		if(startOffset > -1){
+			int endOffset = line.indexOf(END_DECLARATION);
+			if(endOffset  > startOffset){
+				String arg = line.substring(startOffset + START_DECLARATION.length() + 1, endOffset);
+				String newValue = "";
+				switch (line.charAt(startOffset + START_DECLARATION.length())) {
+				case IMPORT:
+					newValue = doImport(arg);
+					break;
+				case SET:
+					newValue = doSet(arg);
+					break;
+				case LOOKUP:
+					newValue = doLookup(arg);
+					break;
+				case EVALUATE:
+					newValue = doEvaluate(arg);
+					break;
+				default:
+					//Unknown command, do nothing
+					break;
+				}
+				line = String.format("%s%s%s", line.substring(0, startOffset), newValue, line.substring(endOffset + END_DECLARATION.length()));
+				line = parseLine(line);// There might be further declarations in the line.
+			}
+		}
+		return line;
+	}
+
+	private String doImport(String arg) throws IOException {
+		arg = resolveField(arg);
+		if(arg.charAt(0) != '/'){
+			arg = '/' + arg;
+		}
+		URL content = this.urlFetcher.getRequestedContentURL(arg);
+		URLConnection resourceConn = content.openConnection();
+		InputStream in = resourceConn.getInputStream();
+		try {
+			this.parse(in);
+		} finally {
+			in.close();
+		}
+		return "";
+	}
+	
+	private String doSet(String arg) {
+		int splitOffSet = arg.indexOf(':');
+		if(splitOffSet >= 0){
+			this.pageContext.put(arg.substring(0, splitOffSet), arg.substring(splitOffSet + 1));
+		}
+		return "";
+	}
+
+	private String doLookup(String arg){
+		String newValue = this.pageContext.get(arg);
+		if(newValue == null){
+			return "";
+		}
+		return newValue;
+	}
+
+	private String doEvaluate(String arg) {
+		int equalsOffset = arg.indexOf('=');
+		int thenOffset = arg.indexOf(':');
+		int elseOffset = arg.indexOf(':', thenOffset + 1);
+		
+		boolean result;
+		if(equalsOffset >= 0  && equalsOffset < thenOffset){
+			String query = resolveField(arg.substring(0, equalsOffset));
+			String comparator = resolveField(arg.substring(equalsOffset + 1, thenOffset));
+			result = query.equals(comparator);
+		} else {
+			String query = resolveField(arg.substring(0, thenOffset));
+			result = Boolean.valueOf(query);
+		}
+		if(result){
+			return resolveField(arg.substring(thenOffset + 1, elseOffset));
+		} else {
+			return ((elseOffset + 1) == arg.length()) ? "" : resolveField(arg.substring(elseOffset + 1));
+		}
+	}
+	
+	private String resolveField(String field){
+		if(field.charAt(0) == LOOKUP){
+			field = this.doLookup(field.substring(1));
+		} else if (field.charAt(0) == SET){
+			field = this.doSet(field).substring(1);
+		}
+		return field;
+	}
+
+}
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/resources/.gitignore b/kernel/org.eclipse.virgo.management.console/src/main/resources/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/resources/.gitignore
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/META-INF/.gitignore b/kernel/org.eclipse.virgo.management.console/src/main/webapp/META-INF/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/META-INF/.gitignore
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/WEB-INF/layouts/artifacts.html b/kernel/org.eclipse.virgo.management.console/src/main/webapp/WEB-INF/layouts/artifacts.html
new file mode 100644
index 0000000..2fae115
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/WEB-INF/layouts/artifacts.html
@@ -0,0 +1,65 @@
+   
+<!--@&header@-->
+
+	<h1>Deployed Artifacts</h1>
+
+ 	<div id="upload-manager" class="container">
+		<h2>Deployer</h2> 
+				
+		<form id="upload-form" name="upload-form" enctype="multipart/form-data" method="POST" action="<!--@<contextPath@-->/upload" target="upload-target" >
+			<ul id="upload-list">
+				<li><input name="1" type="file" size="70"></input></li>
+			</ul>
+		</form>
+		<div id="add-upload-box" class="upload-control"></div>
+		<div id="minus-upload-box" class="upload-control"></div>
+
+		<iframe id="upload-target-id" name="upload-target" src=""></iframe>
+
+		<div class="button-container">
+       		<div class="control-cap-left"></div>
+       		<div class="controls">
+				<div class="button" onclick="uploadManager.startUpload()">
+					<div class="button-cap-left-blue"></div><div class="button-text">Deploy</div><div class="button-cap-right-blue"></div>
+				</div>
+				<div class="button" onclick="uploadManager.resetForm()">
+					<div class="button-cap-left-blue"></div><div class="button-text">Reset Form</div><div class="button-cap-right-blue"></div>
+				</div>
+			</div>
+       		<div class="control-cap-right"></div>
+		</div>
+	</div>
+	
+	<div class="button-container">
+		<div class="control-cap-left"></div>
+		<div class="controls">
+			<div id="upload-toggle-button" class="button" onclick="uploadManager.toggle()">
+				<div class="button-cap-left-blue"></div><div class="button-text">Deployer</div><div class="button-cap-right-blue"></div>
+			</div>
+		</div>
+		<div class="control-cap-right"></div>
+	</div>
+
+	<br />
+
+	<div class="button-container">
+		<div class="control-cap-left"></div>
+		<div class="controls">
+			<div class="control-text">
+				Sort by: 
+			</div>
+			<div id="type-filter-button" class="button button-selected" onclick="tree.reRenderWithFilter('type')">
+				<div class="button-cap-left-blue"></div><div class="button-text">Type</div><div class="button-cap-right-blue"></div>
+			</div>
+			<div id="region-filter-button" class="button" onclick="tree.reRenderWithFilter('region')">
+				<div class="button-cap-left-blue"></div><div class="button-text">Region</div><div class="button-cap-right-blue"></div>
+			</div>
+		</div>
+		<div class="control-cap-right"></div>
+	</div>
+	
+	<div id="artifacts-tree" class="bordered-container">
+		
+	</div>
+
+<!--@&footer@-->
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/WEB-INF/layouts/configurations.html b/kernel/org.eclipse.virgo.management.console/src/main/webapp/WEB-INF/layouts/configurations.html
new file mode 100644
index 0000000..2f52452
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/WEB-INF/layouts/configurations.html
@@ -0,0 +1,12 @@
+
+<!--@&header@-->
+
+	<h1>Configuration Admin</h1>
+	
+	<div class="consoleFootnote">Note: A Configuration artifact must be in the 'Active' state to be visible in Configuration Admin.</div>
+	
+	<div id="config-list" class="bordered-container">
+		
+	</div>
+
+<!--@&footer@-->
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/WEB-INF/layouts/dumps.html b/kernel/org.eclipse.virgo.management.console/src/main/webapp/WEB-INF/layouts/dumps.html
new file mode 100644
index 0000000..be789fa
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/WEB-INF/layouts/dumps.html
@@ -0,0 +1,25 @@
+
+<!--@&header@-->
+	    	
+	<h1>Serviceability Dumps</h1>
+	
+	<div id="side-bar" class="bordered-container">
+		<div class="button-container">
+       		<div class="control-cap-left"></div>
+       		<div class="controls">
+				<div class="button" onclick="dumpViewer.createDump()">
+					<div class="button-cap-left-blue"></div><div id="create-dump-button" class="button-text">Create Dump</div><div class="button-cap-right-blue"></div>
+				</div>
+			</div>
+       		<div class="control-cap-right"></div>
+		</div>
+		<div id="dumpLocation" class="consoleFootnote"></div>
+		<h2>Dumps Found</h2>
+		<ul id="dumps"></ul>
+		<h2>Dump Entries</h2>
+		<ul id="dump-items"></ul>
+	</div>
+	<div id="dump-item-content">
+	</div>
+
+<!--@&footer@-->
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/WEB-INF/layouts/error.html b/kernel/org.eclipse.virgo.management.console/src/main/webapp/WEB-INF/layouts/error.html
new file mode 100644
index 0000000..8fc2053
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/WEB-INF/layouts/error.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<html lang="en">
+
+	<head>
+		<title>Virgo Admin Console - error</title>
+		<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
+		<link rel="shortcut icon" href="/admin/images/favicon.ico" />
+		<link rel="stylesheet" href="/admin/styles/error.css" type="text/css" />
+		<link rel="stylesheet" href="/admin/styles/print.css" type="text/css" media="print" />
+		<script src="/admin/js/error.js" type="text/javascript" ></script>
+	</head>
+	
+	<body class="main">
+	    <div id="page">
+	        <div id="mini-header">
+				<div id="mini-header-left"></div>
+				<div id="mini-header-right"></div>
+	        </div> <!-- /mini-header -->
+	
+		    <div id="primary-navigation">
+		        <div id="primary-left">
+		
+		        </div>
+		        <div id="left-cap"></div>
+		        <div id="primary-right">
+		            <ul>
+		                <li><a href="/admin" title="Admin Console">Admin Console Home</a></li>
+		            </ul>
+		        </div>
+		        <div id="right-cap"></div>
+		    </div><!-- /primary-navigation -->
+	
+		    <div id="container">
+				<div id="content-no-nav">
+		
+					<h1 class="title">Virgo Server - OPPPS!!</h1>
+					<p>
+						An unexpected error occurred while performing your requested operation.
+						Please return to the <a href="/admin/content/overview">main page</a> and
+						try again.
+					</p>
+					<p>
+						If there has been an exception then consult the logs in the 
+						'<em>serviceability</em>' directory of the installed server.
+					</p>
+				</div><!-- /content -->
+		    </div><!-- /container -->
+		    
+		    <div id="footer-wrapper">
+		      <div id="footer-left">&#169; Copyright 2008, 2011 VMware Inc. Licensed under the Eclipse Public License v1.0.</div>
+		
+		      <div id="footer-right"></div> 
+		    </div>
+		</div> <!-- /page-->
+
+	</body>
+</html>
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/WEB-INF/layouts/footer.html b/kernel/org.eclipse.virgo.management.console/src/main/webapp/WEB-INF/layouts/footer.html
new file mode 100644
index 0000000..cef8efd
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/WEB-INF/layouts/footer.html
@@ -0,0 +1,12 @@
+
+			</div>
+
+			<div id="footer">
+				<div id="footer-left">Virgo Admin Console from EclipseRT</div>
+				<div id="footer-right">&#169; Copyright 2008, 2012 VMware Inc. Licensed under the Eclipse Public License v1.0.</div> 
+	    	</div>
+	
+		</div> <!-- /page-->
+	
+	</body>
+</html>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/WEB-INF/layouts/header.html b/kernel/org.eclipse.virgo.management.console/src/main/webapp/WEB-INF/layouts/header.html
new file mode 100644
index 0000000..0e42a2c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/WEB-INF/layouts/header.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<html lang="en">
+
+	<head>
+		<title><!--@<servletContextName@--> - <!--@<viewName@--></title>
+		<meta http-equiv="Content-Type" content="text/html;charset=utf-8"				/>
+		<link rel="shortcut icon" href="<!--@<contextPath@-->/resources/images/favicon.ico"			/>
+		<link rel="stylesheet"    href="<!--@<contextPath@-->/resources/styles/<!--@<viewName@-->.css"	type="text/css" />
+		<link rel="stylesheet"    href="<!--@<contextPath@-->/resources/styles/print.css"				type="text/css" media="print" />
+		<script type="text/javascript">var contextPath = "<!--@<contextPath@-->";</script>
+		<script src="<!--@<contextPath@-->/resources/js/jquery-1.7.2.min.js"							type="text/javascript" ></script>
+		<script src="<!--@<contextPath@-->/resources/js/jquery-ui-1.8.18.min.js"						type="text/javascript" ></script>
+		<script src="<!--@<contextPath@-->/resources/js/common.js"										type="text/javascript" ></script>
+		<script src="<!--@<contextPath@-->/resources/js/<!--@<viewName@-->.js"							type="text/javascript" ></script>
+	</head>
+	
+	<body>
+	    <div id="page">
+	        <div id="header">
+	            <div id="name-and-company">
+	                <div id='site-name'>
+	                </div>
+	            </div> <!-- /name-and-company -->
+	        </div> <!-- /header -->
+	
+			<div id="servers" class="container">
+				<h1>Manage Servers</h1> 
+				<div id="servers-list"></div>
+			</div>
+	
+	    	<div id="navigation">
+	        	<div id="navigation-left">
+	            	<ul>
+						<script type="text/javascript">loadMenus('<!--@<menuNames@-->', '<!--@<viewName@-->')</script>
+	            	</ul>
+	        	</div>
+		       	<div id="navigation-left-curve"></div>
+<!-- 	        	<div id="navigation-right">
+	            	<ul>
+	            	    <li id="servers-button" >
+	            	    	<a title="Servers" onclick="v_servers.toggle()"><div class="button-cap-left-white"></div><div class="navigation-text">Servers</div><div class="button-cap-right-white"></div></a>
+	            	    </li>
+	            	</ul>
+	        	</div> -->
+	        	<div id="navigation-right-curve"></div>
+	    	</div>
+
+			<div id="content" class="container">
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/WEB-INF/layouts/logging.html b/kernel/org.eclipse.virgo.management.console/src/main/webapp/WEB-INF/layouts/logging.html
new file mode 100644
index 0000000..19c65bb
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/WEB-INF/layouts/logging.html
@@ -0,0 +1,10 @@
+
+<!--@&header@-->
+
+	<h1>Logging</h1>
+	
+	<div class="consoleFootnote">Note: Changes to logging levels will not be persisted between restarts.</div>
+
+	<div id='logging-display'></div>
+
+<!--@&footer@-->
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/WEB-INF/layouts/overview.html b/kernel/org.eclipse.virgo.management.console/src/main/webapp/WEB-INF/layouts/overview.html
new file mode 100644
index 0000000..88c3352
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/WEB-INF/layouts/overview.html
@@ -0,0 +1,41 @@
+
+<!--@&header@-->
+
+	<h1>Host Information</h1>
+	
+	<p>Congratulations on installing Virgo. This is the Web console provided with Virgo to allow management of Virgo instances.</p>
+	
+	<h2>Documentation</h2>
+	<p>Documentation is available on-line for Virgo:</p>
+	<ul>
+		<li><a href="http://www.eclipse.org/virgo/documentation" target="_blank" title="Virgo Documentation">Virgo Documentation</a></li>
+		<li><a href="http://www.eclipse.org/virgo/samples" target="_blank" title="Virgo Samples">Virgo Samples</a></li>
+		<li><a href="http://wiki.eclipse.org/Virgo/FAQ" target="_blank" title="Virgo FAQ">Virgo FAQ</a></li>
+	</ul>
+	
+	<h2>Host Properties</h2>
+	
+	<table>
+		<thead class="table-head">
+			<tr>
+				<th>Name</th>
+				<th>Value</th>
+			</tr>
+		</thead>
+		<tbody class="table-body">
+			<tr>
+				<td>OSGi Runtime</td>
+				<td id='osgi-runtime'><!--@<servletContainer@--></td>
+			</tr>
+			<tr class="table-tr-odd">
+				<td>Virtual Machine</td>
+				<td><!--@<virtualMachine@--></td>
+			</tr>
+			<tr>
+				<td>Operating System</td>
+				<td><!--@<operatingSystem@--></td>
+			</tr>
+		</tbody>
+	</table>
+
+<!--@&footer@-->
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/WEB-INF/layouts/repositories.html b/kernel/org.eclipse.virgo.management.console/src/main/webapp/WEB-INF/layouts/repositories.html
new file mode 100644
index 0000000..89895b7
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/WEB-INF/layouts/repositories.html
@@ -0,0 +1,18 @@
+
+<!--@&header@-->
+
+	<h1>Repositories</h1>
+	
+	<div class="button-container">
+    	<div class="control-cap-left"></div>
+    	<div id="repository-controls" class="controls">
+    		<div class="control-text">Repositories: </div>
+		</div>
+    	<div class="control-cap-right"></div>
+	</div>
+		
+	<div class="consoleFootnote">Note: Non-watched repositories are not updated unless Virgo is restarted with the -clean option.</div>
+	
+	<div id="repository-panel" class="bordered-container"></div>
+
+<!--@&footer@-->
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/WEB-INF/layouts/wirings.html b/kernel/org.eclipse.virgo.management.console/src/main/webapp/WEB-INF/layouts/wirings.html
new file mode 100644
index 0000000..14cc8b2
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/WEB-INF/layouts/wirings.html
@@ -0,0 +1,30 @@
+
+<!--@&header@-->
+
+	<h1>OSGi Explorer</h1>
+	
+	<div>
+		<div id="side-bar">
+			
+		</div>
+			
+		<div id="display">
+			<div id="main-button-container" class="button-container">
+				<div class="control-cap-left"></div>
+				<div class="controls">
+					<div class="control-text">View relationships by: </div>
+					<div class="button button-selected" id="view-wires-button" onclick="layoutManager.displayType('wires')">
+						<div class="button-cap-left-blue"></div><div class="button-text">Wirings</div><div class="button-cap-right-blue"></div>
+					</div>
+					<div class="button" id="view-services-button" onclick="layoutManager.displayType('services')">
+						<div class="button-cap-left-blue"></div><div class="button-text">Services</div><div class="button-cap-right-blue"></div>
+					</div>
+				</div>
+				<div class="control-cap-right"></div>
+			</div>
+			
+			<div id="bundle-canvas"></div>
+			
+		</div>
+	</div>
+<!--@&footer@-->
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/WEB-INF/web.xml b/kernel/org.eclipse.virgo.management.console/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..9eeaf1c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
+  <display-name>Virgo Admin Console</display-name>
+  <description>Virgo Admin Console</description>
+  
+  <servlet>
+    <servlet-name>content</servlet-name>
+    <servlet-class>org.eclipse.virgo.management.console.ContentServlet</servlet-class>
+    <init-param>
+      <param-name>prefix</param-name>
+      <param-value>/WEB-INF/layouts</param-value>
+    </init-param>
+    <init-param>
+      <param-name>suffix</param-name>
+      <param-value>.html</param-value>
+    </init-param>
+  </servlet>
+  
+  <servlet-mapping>
+    <servlet-name>content</servlet-name>
+    <url-pattern>/content/*</url-pattern>
+  </servlet-mapping>
+  
+  <servlet>
+    <servlet-name>resources</servlet-name>
+    <servlet-class>org.eclipse.virgo.management.console.ResourceServlet</servlet-class>
+  </servlet>
+  
+  <servlet-mapping>
+    <servlet-name>resources</servlet-name>
+    <url-pattern>/resources/*</url-pattern>
+  </servlet-mapping>
+  
+  <servlet>
+    <servlet-name>upload</servlet-name>
+    <servlet-class>org.eclipse.virgo.management.console.UploadServlet</servlet-class>
+  </servlet>
+  
+  <servlet-mapping>
+    <servlet-name>upload</servlet-name>
+    <url-pattern>/upload/*</url-pattern>
+  </servlet-mapping>
+  
+  <servlet>
+    <servlet-name>JolokiaServlet</servlet-name>
+    <servlet-class>org.jolokia.osgi.servlet.JolokiaServlet</servlet-class>
+  </servlet>
+  
+  <servlet-mapping>
+    <servlet-name>JolokiaServlet</servlet-name>
+    <url-pattern>/jolokia/*</url-pattern>
+  </servlet-mapping>
+  
+  <error-page>
+    <error-code>404</error-code>
+    <location>/WEB-INF/layouts/error.html</location>
+  </error-page>
+  
+  <error-page>
+    <error-code>500</error-code>
+    <location>/WEB-INF/layouts/error.html</location>
+  </error-page>
+  
+  <error-page>
+    <exception-type>java.lang.Exception</exception-type>
+    <location>/WEB-INF/layouts/error.html</location>
+  </error-page>
+  
+  <security-constraint>
+    <web-resource-collection>
+      <web-resource-name>Virgo Server Admin Console</web-resource-name>
+      <url-pattern>/resources/*</url-pattern>
+      <url-pattern>/content/*</url-pattern>
+      <url-pattern>/jolokia/*</url-pattern>
+      <url-pattern>/upload/*</url-pattern>
+    </web-resource-collection>
+    <auth-constraint>
+      <role-name>admin</role-name>
+    </auth-constraint>
+  </security-constraint>
+  
+  <login-config>
+    <auth-method>BASIC</auth-method>
+    <realm-name>Virgo Admin Console</realm-name>
+  </login-config>
+  
+  <security-role>
+    <role-name>admin</role-name>
+  </security-role>
+
+</web-app>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/add.png b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/add.png
new file mode 100644
index 0000000..8a1c9ae
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/add.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/button-cap-left-blue.png b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/button-cap-left-blue.png
new file mode 100644
index 0000000..c58a61a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/button-cap-left-blue.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/button-cap-left-white.png b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/button-cap-left-white.png
new file mode 100644
index 0000000..e17e57c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/button-cap-left-white.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/button-cap-right-blue.png b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/button-cap-right-blue.png
new file mode 100644
index 0000000..4ef2f8d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/button-cap-right-blue.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/button-cap-right-white.png b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/button-cap-right-white.png
new file mode 100644
index 0000000..d7ca0c9
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/button-cap-right-white.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/controls-cap-left.png b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/controls-cap-left.png
new file mode 100644
index 0000000..4dcdae0
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/controls-cap-left.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/controls-cap-right.png b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/controls-cap-right.png
new file mode 100644
index 0000000..ddb08c2
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/controls-cap-right.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/favicon.ico b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/favicon.ico
new file mode 100755
index 0000000..e963685
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/favicon.ico
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/footer-left.png b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/footer-left.png
new file mode 100644
index 0000000..9abc489
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/footer-left.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/footer-right.png b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/footer-right.png
new file mode 100644
index 0000000..65f9153
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/footer-right.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/header-left.png b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/header-left.png
new file mode 100644
index 0000000..4920a0a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/header-left.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/header-right.png b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/header-right.png
new file mode 100644
index 0000000..09b0a59
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/header-right.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/header-title-left.png b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/header-title-left.png
new file mode 100644
index 0000000..002cc8c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/header-title-left.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/loader-large.gif b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/loader-large.gif
new file mode 100644
index 0000000..64e6054
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/loader-large.gif
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/loader-small.gif b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/loader-small.gif
new file mode 100644
index 0000000..82cd493
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/loader-small.gif
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/logo-hat-holly.png b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/logo-hat-holly.png
new file mode 100644
index 0000000..84b783c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/logo-hat-holly.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/menu-curve-left.png b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/menu-curve-left.png
new file mode 100644
index 0000000..1f144fa
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/menu-curve-left.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/menu-curve-right.png b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/menu-curve-right.png
new file mode 100644
index 0000000..842061d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/menu-curve-right.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/mini-header-left.png b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/mini-header-left.png
new file mode 100644
index 0000000..72551e7
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/mini-header-left.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/mini-header-right.png b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/mini-header-right.png
new file mode 100644
index 0000000..8aaf50c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/mini-header-right.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/minus.png b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/minus.png
new file mode 100644
index 0000000..ab9571b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/minus.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/attribute-atomic.png b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/attribute-atomic.png
new file mode 100644
index 0000000..53015c7
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/attribute-atomic.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/attribute-default.png b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/attribute-default.png
new file mode 100644
index 0000000..54d9cd8
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/attribute-default.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/attribute-scoped-atomic.png b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/attribute-scoped-atomic.png
new file mode 100644
index 0000000..934ce67
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/attribute-scoped-atomic.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/attribute-scoped.png b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/attribute-scoped.png
new file mode 100644
index 0000000..44444f0
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/attribute-scoped.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/attribute-spring.png b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/attribute-spring.png
new file mode 100644
index 0000000..10a5d4c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/attribute-spring.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/attribute-state-active.png b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/attribute-state-active.png
new file mode 100644
index 0000000..035d2b5
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/attribute-state-active.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/attribute-state-installed.png b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/attribute-state-installed.png
new file mode 100644
index 0000000..d5badc6
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/attribute-state-installed.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/attribute-state-resolved.png b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/attribute-state-resolved.png
new file mode 100644
index 0000000..e6cfd7c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/attribute-state-resolved.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/attribute-state-starting.png b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/attribute-state-starting.png
new file mode 100644
index 0000000..1f03d99
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/attribute-state-starting.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/attribute-state-stopping.png b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/attribute-state-stopping.png
new file mode 100644
index 0000000..aa41865
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/attribute-state-stopping.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/minus.png b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/minus.png
new file mode 100644
index 0000000..16d35e3
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/minus.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/node-bundle.png b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/node-bundle.png
new file mode 100644
index 0000000..1131d39
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/node-bundle.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/node-configuration.png b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/node-configuration.png
new file mode 100644
index 0000000..e09a816
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/node-configuration.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/node-default.png b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/node-default.png
new file mode 100644
index 0000000..6419d76
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/node-default.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/node-par.png b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/node-par.png
new file mode 100644
index 0000000..ccc1d7d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/node-par.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/node-plan.png b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/node-plan.png
new file mode 100644
index 0000000..6419d76
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/node-plan.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/node-region.png b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/node-region.png
new file mode 100644
index 0000000..120731f
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/node-region.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/plus.png b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/plus.png
new file mode 100644
index 0000000..9474302
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/tree-icons/plus.png
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/upgrad.jpg b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/upgrad.jpg
new file mode 100644
index 0000000..1f0a64a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/images/upgrad.jpg
Binary files differ
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/index.html b/kernel/org.eclipse.virgo.management.console/src/main/webapp/index.html
new file mode 100644
index 0000000..15d12f8
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/index.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html lang="en">
+	<head>
+		<title>Virgo Admin Console - Loading</title>
+	 	<meta http-equiv="REFRESH" content="0;url=content/overview">
+		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+		<link rel="shortcut icon" href="images/favicon.ico" />
+	</head>
+	<body>
+		<br/>
+		<div style="text-align:center;">
+			<p>
+				<em>Virgo Admin Console, Loading...</em>
+			</p>
+		</div>
+		<div style="margin:auto; width:48px; height:48px;">
+			<img alt="" src="images/loader-large.gif">
+		</div>
+	</body>
+</html>
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/js/artifacts.js b/kernel/org.eclipse.virgo.management.console/src/main/webapp/js/artifacts.js
new file mode 100644
index 0000000..9ac9c52
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/js/artifacts.js
@@ -0,0 +1,500 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+
+
+/**
+ * Script to be loaded in to the head of the artifacts view
+ */
+
+function pageinit(){
+	uploadManager = new UploadManager();
+	$('#upload-target-id').load(uploadManager.deployComplete);
+	$('#add-upload-box').click(uploadManager.addUploadBox);
+	$('#minus-upload-box').click(uploadManager.minusUploadBox);
+	util.doQuery('search/org.eclipse.virgo.kernel:type=ArtifactModel,*', function (response){
+		tree = new Tree();
+		tree.setup(response.value, 'type');
+		util.pageReady();
+	});
+}
+
+/**
+ * Constructor method for the Artifacts Tree
+ * 
+ * @param mbeans
+ * @returns
+ */
+var Tree = function() {
+	
+	var self = this;
+	
+	/**
+	 * Do the initial population of the tree
+	 * 
+	 * @param mbeans - the json data from the server
+	 * @param filter - what the top level should be sorted by
+	 */
+	this.setup = function (mbeans, filter){
+		var filterMatches = new Array();
+		$.each(mbeans, function(index, mbean){
+			var artifact = new Artifact(util.readObjectName(mbean));
+			var artifactFilterValue = artifact[filter];
+			if(-1 == $.inArray(artifactFilterValue, filterMatches)){
+				filterMatches.push(artifactFilterValue);
+			};
+			
+		});
+		$.each(filterMatches, function(index, filterMatch){
+			var node;
+			if(filter == 'type'){
+				node = self.getNodeContainer(filterMatch, filterMatch, filterMatch, filter);
+			} else {
+				node = self.getNodeContainer(filterMatch, 'region', filterMatch, filter);
+			}
+			node.addClass('top-level');
+			node.data('queryData', filter);
+			$('.artifact-label', node).click({'node': node, 'queryData': filter}, tree.nodeTwistyClicked);
+			$('#artifacts-tree').append(node);
+		});
+	};
+
+	/**
+	 * Called when the user chooses a different value to sort the top level of the tree on
+	 * 
+	 * @param filter - the artifact property to filter on
+	 */
+	this.reRenderWithFilter = function (filter){
+		$('#artifacts-tree').empty();
+		util.doQuery('search/org.eclipse.virgo.kernel:type=ArtifactModel,*', function (response){
+			self.setup(response.value, filter);
+		});
+		if(filter == 'type') {
+			$('#type-filter-button').addClass('button-selected');
+			$('#region-filter-button').removeClass('button-selected');
+		} else {
+			$('#region-filter-button').addClass('button-selected');
+			$('#type-filter-button').removeClass('button-selected');
+		}
+		
+	};
+
+	/**
+	 * Called when any node in the tree is expanded
+	 * 
+	 * @param objectName - the unique key of the artifact to render
+	 * @param filter - sort by
+	 */
+	this.nodeTwistyClicked = function (eventData, openCallBack, openCallBackArg){
+		var node = eventData.data.node;
+		self.setIconElement(node.children('.artifact-label').children('.twisty'), 'loader-small.gif');
+		if(node.hasClass('open-container')){
+			self.closeNode(node);
+		} else {
+			var query;
+			if(node.hasClass('top-level')){
+				query = 'search/org.eclipse.virgo.kernel:type=ArtifactModel,*';
+			} else {
+				query = 'read/' + eventData.data.queryData.toString;
+			}
+			util.doQuery(query, function (response){
+				self.renderNodeExpansion(response, node, eventData.data.queryData);
+				self.setIconElement(node.children('.artifact-label').children('.twisty'), 'tree-icons/minus.png');
+				if(openCallBack){
+					openCallBack(openCallBackArg);
+				}
+			});
+		}
+	};
+	
+	this.closeNode = function(rawNode, now){
+		var node = $(rawNode);
+		var container = node.children('.fx-container');
+		if(now){
+			container.remove();
+		}else{
+			container.slideToggle(util.fxTime, function(){
+				$(this).remove();
+			});
+		}
+		node.removeClass('open-container');
+		self.setIconElement(node.children('.artifact-label').children('.twisty'), 'tree-icons/plus.png');
+	};
+	
+	/**
+	 * Accepted operations are 'start', 'stop', 'uninstall' and 'refresh'
+	 * 
+	 */
+	this.doArtifactOperation = function(event){
+		util.doQuery('exec/' + event.data.objectName.toString + '/' + event.data.action, function(response){
+			self.reloadTree();
+		});
+	};
+	
+	this.reloadTree = function(){
+		//Record the open nodes and unmark
+		var openNodes = new Array();
+		$.each($('.open-container'), function(index, openNode){
+			openNodes.push($(openNode).prop('id'));
+		});
+
+		//Close the entire tree down
+		$.each($('#artifacts-tree').children('.artifact-container'), function(index, node){
+			self.closeNode(node, true);
+		});
+		
+		//Re-open the tree
+		var nodeOpener = function(nodesToOpen){
+			var breakOut = false;
+			$.each($('.artifact-container'), function(index, rawNode){
+				if(breakOut){
+					return false;
+				}
+				var node = $(rawNode);
+				if(!node.hasClass('open-container')){
+					$.each(nodesToOpen, function(index, nodeToOpen){
+						if(nodeToOpen == node.prop('id')){
+							var remainingNodesToOpen = $.grep(nodesToOpen, function(value) {
+								return value != nodeToOpen;
+							});
+							self.nodeTwistyClicked({data: {node: node, queryData: node.data('queryData')}}, nodeOpener, remainingNodesToOpen);
+							breakOut = true;
+							return false;
+						}
+					});
+				}
+			});
+		};
+		nodeOpener(openNodes);
+	};
+
+	/* **************** START PRIVATE METHODS **************** */
+	
+	/**
+	 * When the server responds to an node request this method takes care 
+	 * of rendering the artifact/tree and all its attributes and dependents
+	 * 
+	 * @param json - the raw json returned form the server
+	 * @param parent - element to put the artifact under
+	 * @param nodeData - of the artifact
+	 */
+	this.renderNodeExpansion = function(json, parent, nodeData){		
+		var fxContainer = $('<div />', {'class': 'fx-container'});
+		if(parent.hasClass('top-level')){
+			var mbeans = json.value.sort();
+			$.each(mbeans, function(index, mbean){
+				var artifact = new Artifact(util.readObjectName(mbean));
+				if(artifact[nodeData] == parent.prop('id')){
+					fxContainer.append(self.getArtifactLabel(artifact, parent.prop('id')));
+				}
+			});
+		} else {
+			if(json.value == undefined){
+				parent.remove();
+			} else {
+				var fullArtifact = new FullArtifact(json.value, nodeData);
+				
+				var artifactControlBar = self.getArtifactControlBar(fullArtifact);
+				if(fullArtifact.type == 'configuration'){
+					var configControl = $('<a />', {'class': 'artifact-control'});
+					configControl.attr('href', util.getHostAndAdminPath() + '/content/configurations#' + fullArtifact.name);
+					configControl.text('VIEW');
+					artifactControlBar.append(configControl);
+				}
+		
+				fxContainer.append(artifactControlBar);
+				fxContainer.append(self.getArtifactAttribute('SymbolicName: ' + fullArtifact.name));
+				fxContainer.append(self.getArtifactAttribute('Version: ' + fullArtifact.version));
+				fxContainer.append(self.getArtifactAttribute('Region: ' + fullArtifact.region));
+				fxContainer.append(self.getArtifactAttribute('Type: ' + fullArtifact.type));
+				fxContainer.append(self.getArtifactAttribute(fullArtifact.state, 'state-' + fullArtifact.state));
+				
+				var spring = false;
+				$.each(fullArtifact.properties, function(key, value){
+					if(value == 'true' || value == true){
+						if(key == 'Spring'){
+							spring = true;
+							fxContainer.append(self.getArtifactAttribute('Spring Powered', key));
+						} else if(key == 'Scoped' || key == 'Atomic' || key == 'Scoped-Atomic'){
+							fxContainer.append(self.getArtifactAttribute(key, key));
+						} else {
+							fxContainer.append(self.getArtifactAttribute(key + ': ' + value));
+						}
+					} else {
+						if(key == 'Bundle Id'){
+							fxContainer.append(self.getArtifactAttribute(key + ': ' + value, undefined, util.getHostAndAdminPath() + '/content/wirings#' + value));
+						} else if(key == 'org.eclipse.virgo.web.contextPath') {
+							fxContainer.append(self.getArtifactAttribute('Context Path: ' + value, undefined, util.getHost() + value));
+						} else {
+							fxContainer.append(self.getArtifactAttribute(key + ': ' + value));
+						}
+					}
+				});
+				
+				if(spring == false && fullArtifact.type == 'bundle'){
+					fxContainer.append(self.getArtifactAttribute('No Spring', 'Spring'));
+				}
+				
+				var dependents = fullArtifact.dependents.sort(function(a, b){
+					return a.compare(b);
+				});
+				
+				$.each(dependents, function(index, objectName){
+					var dependentArtifact = new Artifact(objectName);
+					fxContainer.append(self.getArtifactLabel(dependentArtifact, parent.attr('id')));
+				});
+			}
+		}
+		parent.append(fxContainer);
+		parent.addClass('open-container');
+		fxContainer.slideToggle(util.fxTime);
+	};
+	
+	/**
+	 * Create an artifact label element with text, icons etc for the supplied artifact
+	 * 
+	 * @param artifact - to construct
+	 * @param parent - element to insert the $ in to
+	 */
+	this.getArtifactLabel = function(artifact, parent){
+		var node = self.getNodeContainer(artifact.name + ': ' + artifact.version, artifact.type, parent + artifact.key, artifact.key);
+		$('.artifact-label', node).click({'queryData': artifact.objectName, 'node': node}, tree.nodeTwistyClicked);
+		node.data('queryData', artifact.objectName);
+		return node;
+	};
+	
+	/**
+	 * Create a label element with text and icons from the supplied details
+	 * 
+	 * @param text - text for the artifact label
+	 * @param icon - the name of the icon to use
+	 * @param id - unique id of the label
+	 */
+	this.getNodeContainer = function(text, icon, id, key){
+		var artifactContainer = $('<div />', {'class': 'artifact-container'});
+		artifactContainer.addClass(key);
+		artifactContainer.prop('id', id);
+
+		var artifactLabel = $('<div />', {'class': 'artifact-label'});
+		artifactContainer.append(artifactLabel);
+
+		var plusMinus = self.getIconElement('tree-icons/plus.png');
+		plusMinus.addClass('plus twisty');
+		artifactLabel.append(plusMinus);
+		artifactLabel.append(self.getIconElement('tree-icons/node-' + icon + '.png'));
+		var span  = $('<span />', {'class': 'label-text'});
+		span.text(text);
+		artifactLabel.append(span);
+		
+		return artifactContainer;
+	};
+	
+	this.getArtifactControlBar = function(artifact) {
+		var controlBar = $('<div />', {'class': 'artifact-attribute'});
+		controlBar.append(self.getIconElement('tree-icons/attribute-default.png'));
+		var span  = $('<span />', {'class': 'label-text'});
+		span.text('Actions:');
+		
+		controlBar.append(span);
+		controlBar.append(self.getArtifactControl('start', artifact.objectName));
+		controlBar.append(self.getArtifactControl('refresh', artifact.objectName));
+		controlBar.append(self.getArtifactControl('stop', artifact.objectName));
+		controlBar.append(self.getArtifactControl('uninstall', artifact.objectName));
+		return controlBar;
+	};
+	
+	this.getArtifactControl = function(action, objectName) {
+		var control = $('<div />', {'class': 'artifact-control'});
+		control.text(action.toUpperCase());
+		control.click({'action': action, 'objectName': objectName}, tree.doArtifactOperation);
+		return control;
+	};
+	
+	/**
+	 * Create an element for an artifacts property with an icon
+	 * 
+	 * @param text - the text for the attribute
+	 * @param icon - the icon name
+	 */
+	this.getArtifactAttribute = function(text, icon, link) {
+		var property = $('<div />', {'class': 'artifact-attribute'});
+		property.append(self.getIconElement('tree-icons/attribute-default.png'));
+		if(icon){
+			property.append(self.getIconElement('tree-icons/attribute-' + icon + '.png'));
+		}
+		var label;
+		if(link){
+			label = $('<a />', {'class': 'label-text'});
+			label.attr('href', link);
+		} else {
+			label  = $('<span />', {'class': 'label-text'});
+		}
+		label.text(text);
+		property.append(label);
+		return property;
+	};
+	
+	/**
+	 * Create an element with a background image applied
+	 * 
+	 * @param iconName - for the image
+	 */
+	this.getIconElement = function(iconName){
+		return self.setIconElement($('<div />', {'class': 'tree-icon'}), iconName);
+	};
+	
+	/**
+	 * Set an element with a background image applied
+	 * 
+	 * @param element - element to set the image on
+	 * @param iconName - for the image
+	 */
+	this.setIconElement = function(element, iconName){
+		element.css('background', 'url("' + util.getHostAndAdminPath() + '/resources/images/' + iconName.toLowerCase()  + '") no-repeat center center');
+		return element;
+	};
+	
+};
+
+/**
+ * A representation of a Artifact based on it's objectName
+ * 
+ * @param objectName
+ */
+var Artifact = function(objectName) {
+	this.name = objectName.get('name');
+	this.version = objectName.get('version');
+	this.region = objectName.get('region');
+	this.type = objectName.get('artifact-type');
+	this.objectName = objectName;
+	this.key = (this.name + this.version + this.region).replace(new RegExp('\\.', 'g'), '_');//Converts the dots to underscores so the osgi symbolic-name grammar complies to the CSS class identifier grammar 
+};
+
+/**
+ * A representation of a Artifact based on a full query
+ * 
+ * @param metaData
+ * @param objectName
+ */
+var FullArtifact = function(metaData, objectName) {
+	
+	var self = this;
+	
+	self.name = metaData['Name'];
+	self.version = metaData['Version'];
+	self.region = metaData['Region'];
+	self.type = metaData['Type'];
+	self.state = metaData['State'];
+	self.objectName = objectName;
+	
+	self.dependents = [];
+	$.each(metaData['Dependents'], function(index, item){
+		self.dependents.push(util.readObjectName(item.objectName));
+	});
+	
+	self.properties = {};
+	$.each(metaData['Properties'], function(key, value){
+		if(!(value == false || value == 'false')){
+			self.properties[key] = value;
+		}
+	});
+	
+	//Special processing for scoped/atomic artifacts
+	if(self.type == 'plan' || self.type == 'par'){
+		var scoped = metaData['Scoped'];
+		var atomic = metaData['Atomic'];
+		if(scoped == true && atomic == true){
+			self.properties['Scoped-Atomic'] = 'true';
+		} else {
+			if(scoped == true){
+				self.properties['Scoped'] = 'true';
+			}
+			if(atomic == true){
+				self.properties['Atomic'] = 'true';
+			}
+		}
+	}
+	self.key = (self.name + self.version + self.region).replace(new RegExp('\\.', 'g'), '_');//Converts the dots to underscores so the osgi symbolic-name grammar complies to the CSS class identifier grammar 
+};
+	
+
+var UploadManager = function() {
+
+	var self = this;
+	
+	this.uploading = false;
+	
+	this.open = false;
+	
+	this.toggle = function() {
+		$('#upload-manager').slideToggle(util.fxTime);
+		if(self.open) {
+			$('#upload-toggle-button').removeClass('button-selected');
+			self.open = false;
+		} else {
+			$('#upload-toggle-button').addClass('button-selected');
+			self.open = true;
+		}
+	};
+	
+	this.addUploadBox = function() {
+		$('#upload-list').append(self.getUploadFormElement($('#upload-list').children('li').length));
+	};
+	
+	this.minusUploadBox = function() {
+		var uploadBoxes = $('#upload-list').children('li');
+		if(uploadBoxes.length > 1){
+			uploadBoxes.last().remove();
+		}
+	};
+	
+	this.startUpload = function() {
+		self.uploading = true;
+		//this.spinner.show(true);
+		$('#upload-form').submit();
+	};
+	
+	this.resetForm = function() {
+		$('#upload-list').empty();
+		$('#upload-target-id').empty();
+		$('#upload-list').append(self.getUploadFormElement('1'));
+	};
+	
+	this.deployComplete = function(){
+		if(self.uploading){
+			var iframe = $('#upload-target-id');
+			var results = $('#uploadResults', iframe[0].contentDocument).children();
+			if(results.length == 0){
+				alert('Nothing Deployed');
+			}else{
+				var resultString = '';
+			    $.each(results, function(i, result){
+			    	resultString = resultString + '\n' + $(result).text();
+			    });
+			    alert('Deployment result\n\n' + resultString);
+			}
+		    self.resetForm();
+			self.uploading = false;
+		}
+	};
+
+	
+	this.getUploadFormElement = function(number){
+		var uploadBox = $('<input />');
+		uploadBox.prop('type', 'file');
+		uploadBox.prop('size', '70');
+		uploadBox.prop('name', number);
+		var listItem = $('<li />');
+		listItem.append(uploadBox);
+		return listItem;
+	};
+	
+};
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/js/bundlesGui.js b/kernel/org.eclipse.virgo.management.console/src/main/webapp/js/bundlesGui.js
new file mode 100644
index 0000000..5785351
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/js/bundlesGui.js
@@ -0,0 +1,605 @@
+/*******************************************************************************
+* Copyright (c) 2011 David Normiongton
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*   Chris Frost - initial contribution
+*   
+*******************************************************************************/
+
+var LayoutManager = function(bundleCanvas, width, height, dataSource){
+
+	var self = this;
+
+	self.relationshipType = 'wires';
+	
+	self.relationships = {};
+
+	self.dataSource = dataSource;
+
+	self.bundles = {};
+	
+	self.focused = NaN;
+
+	self.bundleSpacing = 10; //Pixels to leave between bundles when rendering
+
+	self.bundleCanvas = $('#' + bundleCanvas);
+	
+	self.paper = Raphael(bundleCanvas, width, height);
+		
+	self.setFocusListener = function(listener) {
+		self.focusListener = listener;
+	};
+	
+	self.displayType = function(type){
+		if(type == 'wires') {
+			$('#view-wires-button').addClass('button-selected');
+			$('#view-services-button').removeClass('button-selected');
+			self.relationshipType = type;
+			if(!isNaN(self.focused)){
+				self.displayBundle(self.focused);
+			}
+		} else if(type == 'services'){
+			$('#view-services-button').addClass('button-selected');
+			$('#view-wires-button').removeClass('button-selected');
+			self.relationshipType = type;
+			if(!isNaN(self.focused)){
+				self.displayBundle(self.focused);
+			}
+		}
+	};
+	
+	self.displayBundle = function(bundleId){
+		if(!isNaN(bundleId) && bundleId >= 0){
+			self.hideAll();
+			self.bundleCanvas.addClass('spinner-large');
+			self.focused = NaN;
+			self.dataSource.updateBundle(bundleId, function(){
+				var bundle;
+				if(self.bundles[bundleId]){
+					bundle = self.bundles[bundleId];
+					bundle.relationship.infoBoxData = new Array();
+				}else{
+					bundle = new Bundle(self.paper, self.dataSource.bundles[bundleId], 5, 5, self.displayBundle, 'middle', self.relationshipType);
+					self.bundles[bundleId] = bundle;
+				}
+				self.focused = bundleId;
+				
+				if(self.relationshipType == 'wires'){
+					self.renderWires(bundle);
+				}else{
+					self.renderServices(bundle);
+				}
+				
+				var middleX = Math.round(self.paper.width/2);
+				var middleY = Math.round(self.paper.height/2);
+				var selfInfoBoxData = bundle.relationship.infoBoxData;
+				bundle.reset(middleX - (bundle.boxWidth/2), middleY, 'middle', self.relationshipType);
+				bundle.relationship.infoBoxData = selfInfoBoxData;
+				self.bundleCanvas.scrollLeft(middleX - (self.bundleCanvas.width()/2));
+				
+				$.each(self.bundles, function(key, localBundle){
+					if(localBundle.state == 'waiting'){
+						localBundle.show();
+					}
+				});
+				
+				self.bundleCanvas.removeClass('spinner-large');
+			});
+			if(self.focusListener){
+				self.focusListener(bundleId);
+			}
+		} else {
+			alert('No such Bundle: ' + bundleId);
+		}
+	};
+	
+	self.renderWires = function(bundle){
+		var topRowBundleIds = {};
+		$.each(bundle.rawBundle.RequiredWires, function(index, wire){
+			self.addRelationshipToMap(topRowBundleIds, wire.ProviderBundleId, wire);
+		});
+		var topRowRenderResult = self.renderBundleRow(topRowBundleIds, -239, 'top', bundle);
+		var bottomRowBundleIds = {};
+		$.each(bundle.rawBundle.ProvidedWires, function(index, wire){
+			self.addRelationshipToMap(bottomRowBundleIds, wire.RequirerBundleId, wire); 
+		});
+		var bottomRowRenderResult = self.renderBundleRow(bottomRowBundleIds, 239, 'bottom', bundle);
+		self.centerBundles(topRowRenderResult, bottomRowRenderResult);
+	};
+	
+	self.renderServices = function(bundle){
+		var topRowBundleIds = {};
+		$.each(bundle.rawBundle.ServicesInUse, function(index, service){
+			self.addRelationshipToMap(topRowBundleIds, service.BundleIdentifier, {'service': service, 'consumerId': bundle.rawBundle.Identifier});
+		});
+		var topRowRenderResult = self.renderBundleRow(topRowBundleIds, -239, 'top', bundle);
+		var bottomRowBundleIds = {};
+		$.each(bundle.rawBundle.RegisteredServices, function(index, service){
+			$.each(service.UsingBundles, function(index, bundleId){
+				if(bundleId != bundle.rawBundle.Identifier){
+					self.addRelationshipToMap(bottomRowBundleIds, bundleId, {'service': service, 'consumerId': bundleId});
+				}
+			});
+		});
+		var bottomRowRenderResult = self.renderBundleRow(bottomRowBundleIds, 239, 'bottom', bundle);
+		self.centerBundles(topRowRenderResult, bottomRowRenderResult);
+	};
+	
+	self.addRelationshipToMap = function(map, bundleId, relationship){
+		if(!map[bundleId]){
+			map[bundleId] = new Array();
+		}
+		map[bundleId].push(relationship);
+	};
+	
+	self.renderBundleRow = function(bundleIds, offset, position, focusedBundle){
+		var yPos = (self.paper.height/2) + offset;
+		var xPos = this.bundleSpacing;
+		var focusedBundleId = focusedBundle.rawBundle.Identifier;
+		var renderedBundleIds = new Array();
+		$.each(bundleIds, function(bundleId, relationshipInfoDatas){
+			$.each(relationshipInfoDatas, function(index, relationshipInfoData){
+				if(!self.bundles[bundleId]){
+					var rawBundle;
+					if(bundleId >= 0){
+						rawBundle = self.dataSource.bundles[bundleId];
+					}else{
+						rawBundle = {'SymbolicName': 'unknown', 'Version': 'unknown', 'Identifier': -1};
+					}
+					var bundle = new Bundle(self.paper, rawBundle, xPos, yPos, self.displayBundle, position, self.relationshipType, focusedBundle);
+					bundle.increaseCount(relationshipInfoData);
+					renderedBundleIds.push(bundleId);
+					self.bundles[bundleId] = bundle;
+					xPos = xPos + bundle.boxWidth + self.bundleSpacing;
+				}else if(focusedBundleId == bundleId){
+					focusedBundle.increaseCount(relationshipInfoData);
+				}else {
+					var bundle = self.bundles[bundleId];
+					if(bundle.state == 'waiting'){
+						if(position != bundle.position){
+							bundle.increaseBackCount(relationshipInfoData);
+						}else{
+							bundle.increaseCount(relationshipInfoData);
+						}
+					}else{//bundle.state == 'hidden'
+						bundle.reset(xPos, yPos, position, self.relationshipType, focusedBundle);
+						bundle.increaseCount(relationshipInfoData);
+						renderedBundleIds.push(bundleId);
+						xPos = xPos + bundle.boxWidth + self.bundleSpacing;
+					}
+				}
+			});
+		});
+		return {bundleIds: renderedBundleIds, width: xPos};
+	};
+	
+	self.centerBundles = function(topRowRenderResult, bottomRowRenderResult){
+		var newWidth = topRowRenderResult.width < bottomRowRenderResult.width ? bottomRowRenderResult.width : topRowRenderResult.width;
+		if(newWidth < self.bundleCanvas.width()){
+			self.paper.setSize(self.bundleCanvas.width(), self.paper.height);
+			newWidth = self.bundleCanvas.width();
+		}else{
+			self.paper.setSize(newWidth, self.paper.height);
+		}
+		if(topRowRenderResult.width < newWidth){
+			self.moveRow(topRowRenderResult.bundleIds, Math.round((newWidth-topRowRenderResult.width)/2));
+		}
+		if(bottomRowRenderResult.width < newWidth){
+			self.moveRow(bottomRowRenderResult.bundleIds, Math.round((newWidth-bottomRowRenderResult.width)/2));
+		}
+	};
+	
+	self.moveRow = function(bundleIds, horizontalAdjustment){
+		$.each(bundleIds, function(index, bundleId){
+			self.bundles[bundleId].moveHorizontaly(horizontalAdjustment);
+		});
+	};
+
+	self.hideAll = function(){
+		$.each(self.bundles, function(index, bundle){
+			bundle.hide();
+		});
+	};
+	
+};
+
+/**
+ * Bundle
+ */
+var Bundle = function(paper, rawBundle, x, y, dblClickCallback, position, type, otherBundle){
+
+	var self = this;
+	
+	self.paper = paper;
+	self.rawBundle = rawBundle;
+	self.dblClickCallback = dblClickCallback;
+	self.position = position;
+	if(position == 'top'){
+		self.relationship = new Relationship(self.paper, type, self, otherBundle);
+	}else if(position == 'bottom'){
+		self.relationship = new Relationship(self.paper, type, otherBundle, self);
+	}else{
+		self.relationship = new Relationship(self.paper, type, self, self);
+	};	
+	self.state = 'waiting'; //One of 'hidden', 'waiting' or 'visible'
+	//Display attributes
+	self.bundleMargin = 8;
+	self.boxHeight = 28 + (2*self.bundleMargin); // Starter value to get text in the right place
+	self.x = Math.round(x); //Left edge of the box
+	self.y = Math.round(y); //Middle of the box
+	
+	self.stroke = '#002F5E';
+	if(self.rawBundle.Identifier == -1){
+		self.stroke = '#FF0000';
+	}
+	
+	self.summary = '[' + self.rawBundle.Identifier + '] ' + self.rawBundle.SymbolicName + '\n' + self.rawBundle.Version;
+	
+	self.text = self.paper.text(self.x + self.bundleMargin, self.y, self.summary).attr({
+		'text-anchor' : 'start', 
+		'font' : '12px Arial'
+	}).hide();
+	
+	self.boxWidth = Math.round(self.text.getBBox().width) + (3*self.bundleMargin);
+	self.boxHeight = Math.round(self.text.getBBox().height) + (2*self.bundleMargin);
+	
+	self.box = self.paper.rect(self.x, self.y - (self.boxHeight/2), self.boxWidth, self.boxHeight, self.bundleMargin).attr({
+		'fill' : '#E8F6FF', 
+		'stroke' : self.stroke
+	}).hide();
+	
+	self.info = self.paper.text(self.x + (self.boxWidth - 1.5*self.bundleMargin), self.y, 'i').attr({
+		'text-anchor' : 'start', 
+		'font-size' : '17px',
+		'font-family' : 'serif',
+		'font-weight' : 'bold',
+		'font-style' : 'italic',
+		'fill' : self.stroke,
+		'cursor' : 'pointer'
+	}).hide();
+	
+	self.box.toBack();
+	
+	self.box.dblclick(function(){
+		self.dblClickCallback(self.rawBundle.Identifier);
+	});
+	
+	self.text.dblclick(function(){
+		self.dblClickCallback(self.rawBundle.Identifier);
+	});
+
+	self.info.click(function(){
+		if(!self.infoBox){
+			self.infoBox = self.getInfoBoxWithBundle(self.rawBundle);
+		}
+		self.infoBox.show();
+	});
+	
+	self.show = function(){
+		if(self.state == 'waiting'){
+			self.text.show();
+			self.box.show();
+			self.info.show();
+			self.relationship.show();
+			self.state = 'visible';
+		}
+	};
+	
+	self.hide = function(){
+		if(self.state != 'hidden'){
+			self.text.hide();
+			self.box.hide();
+			self.info.hide();
+			self.infoBox = undefined;//Force it to be reloaded as the underlying data may have changed
+			self.relationship.hide();
+			self.state = 'hidden';
+		}
+	};
+	
+	self.reset = function(x, y, position, type, otherBundle) {
+		if(self.state == 'visible'){
+			self.hide();
+		}
+		self.x = Math.round(x);
+		self.y = Math.round(y);
+		self.text.attr({
+			'x' : self.x + self.bundleMargin, 
+			'y' : self.y
+		});
+		self.box.attr({
+			'x' : self.x,
+			'y' : self.y - (self.boxHeight/2)
+		});
+		self.info.attr({
+			'x' : self.x + (self.boxWidth - 1.5*self.bundleMargin), 
+			'y' : self.y
+		});
+		self.position = position;
+		if(position == 'top'){
+			self.relationship.reset(type, self, otherBundle);
+		}else if(position == 'bottom'){
+			self.relationship.reset(type, otherBundle, self);
+		}else{
+			self.relationship.reset(type, self, self);
+		};
+		self.state = 'waiting';
+	};
+	
+	self.moveHorizontaly = function(horizontalAdjustment){
+		self.x = self.x + horizontalAdjustment;
+		self.text.attr({
+			'x' : self.x + self.bundleMargin, 
+		});
+		self.box.attr({
+			'x' : self.x,
+		});
+		self.info.attr({
+			'x' : self.x + (self.boxWidth - 1.5*self.bundleMargin), 
+		});
+	};
+	
+	self.increaseCount = function(relationshipInfoData) {
+		self.relationship.increaseCount(relationshipInfoData);
+	};
+	
+	self.increaseBackCount = function(relationshipInfoData) {
+		self.relationship.increaseBackCount(relationshipInfoData);
+	};
+	
+	self.getInfoBoxWithBundle = function(rawBundle){
+		var name = 'bundle' + rawBundle.Identifier;
+		var title = 'Bundle [' + rawBundle.Identifier + '] ' + rawBundle.SymbolicName + ': ' + rawBundle.Version;
+		var infoBox = $('<ul></ul>');
+		var error = false;
+		if(rawBundle.Identifier >= 0){
+			infoBox.append($('<li>Region - ' + rawBundle.Region + '</li>'));
+			infoBox.append($('<li>Location - ' + rawBundle.Location + '</li>'));
+	
+			self.appendIfPresent(infoBox, 'State', rawBundle.State);
+			self.appendIfPresent(infoBox, 'LastModified', rawBundle.LastModified);
+			self.appendIfPresent(infoBox, 'Fragment', rawBundle.Fragment);
+			self.appendIfPresent(infoBox, 'StartLevel', rawBundle.StartLevel);
+			self.appendIfPresent(infoBox, 'PersistentlyStarted', rawBundle.PersistentlyStarted);
+			self.appendIfPresent(infoBox, 'ActivationPolicyUsed', rawBundle.ActivationPolicyUsed);
+			self.appendIfPresent(infoBox, 'Required', rawBundle.Required);
+	
+			if(!rawBundle.ExportedPackages || rawBundle.ExportedPackages.length == 0){
+				infoBox.append($('<li>No exported packages</li>'));
+			} else {
+				infoBox.append($('<li>Exported packages</li>'));
+				$.each(rawBundle.ExportedPackages, function(index, item){
+					infoBox.append($('<li>' + item + '</li>').addClass('indent1'));
+				});
+			}
+			if(!rawBundle.ImportedPackages || rawBundle.ImportedPackages.length == 0){
+				infoBox.append($('<li>No imported packages</li>'));
+			} else {
+				infoBox.append($('<li>Imported packages</li>'));
+				$.each(rawBundle.ImportedPackages, function(index, item){
+					infoBox.append($('<li>' + item + '</li>').addClass('indent1'));
+				});
+			}
+		} else {
+			error = true;
+			infoBox.append($('<li>This is a placeholder for the provider of missing Wires or Services that another Bundle want.</li>'));
+		}
+		return new InfoBox({name: name, title: title, content: infoBox, closeable: true, error: error});
+	};
+	
+	self.appendIfPresent = function(element, name, field){
+		if(field){
+			element.append($('<li>' + name + ' - ' + field + '</li>'));	
+		}
+	};
+
+};
+
+var Relationship = function(paper, type, fromBundle, toBundle) {
+	
+	var self = this;
+	
+	self.paper = paper;
+	self.fromBundle = fromBundle;
+	self.toBundle = toBundle;
+	self.type = type;
+	self.infoBoxData = new Array();
+	self.doubleEnded = 'none';
+	self.controlPointOffset = 90;
+	
+	self.setCoordinates = function(){
+		var startPoint;
+		var endPoint;
+		var startPointControl;
+		var endPointControl;
+			if(self.fromBundle.rawBundle.Identifier == self.toBundle.rawBundle.Identifier){
+				var xOffSet = self.fromBundle.x + self.toBundle.boxWidth;
+				startPoint = {'x' : xOffSet - 20, 'y' : self.fromBundle.y - (self.fromBundle.boxHeight/2)};
+				endPoint = {'x' : xOffSet - 20, 'y' : Math.round(self.toBundle.y + (self.toBundle.boxHeight/2))};
+				startPointControl = {'x' : startPoint.x + self.controlPointOffset, 'y' : startPoint.y - self.controlPointOffset}; 
+				endPointControl = {'x' : endPoint.x + self.controlPointOffset, 'y' : endPoint.y + self.controlPointOffset};
+				self.midPoint = {'x' : xOffSet + 47, 'y' : self.fromBundle.y};
+			}else{
+				startPoint = {'x' : Math.round(self.fromBundle.x + self.fromBundle.boxWidth/2), 'y' : self.fromBundle.y + (self.fromBundle.boxHeight/2)};
+				endPoint = {'x' : Math.round(self.toBundle.x + self.toBundle.boxWidth/2), 'y' : self.toBundle.y - (self.fromBundle.boxHeight/2)};
+				startPointControl = {'x' : startPoint.x, 'y' : startPoint.y + self.controlPointOffset}; 
+				endPointControl = {'x' : endPoint.x, 'y' : endPoint.y - self.controlPointOffset};
+				self.midPoint = self.calculateMidpoint(startPoint, endPoint);
+			}
+			self.pathString = 'M' + startPoint.x + ',' + startPoint.y + 
+				'C' + startPointControl.x + ',' + startPointControl.y + 
+				',' + endPointControl.x + ',' + endPointControl.y + 
+				',' + endPoint.x + ',' + endPoint.y;
+	};
+	
+	self.calculateMidpoint = function(startPoint, endPoint){
+		var midX, midY;
+		if(startPoint.x < endPoint.x){
+			midX = startPoint.x + (endPoint.x - startPoint.x)/2;
+		} else {
+			midX = endPoint.x + (startPoint.x - endPoint.x)/2;
+		}
+		if(startPoint.y < endPoint.y){
+			midY = startPoint.y + (endPoint.y - startPoint.y)/2;
+		} else {
+			midY = endPoint.y + (startPoint.y - endPoint.y)/2;
+		}
+		return {'x' : midX, 'y' : midY};
+	};
+	
+	self.show = function() {
+		if(0 < self.infoBoxData.length){
+			self.setCoordinates();
+			self.tooltip = 'From bundle ' + self.fromBundle.summary + '\n To bundle ' + self.toBundle.summary;
+			self.visual = self.paper.path(self.pathString).attr({
+				'arrow-start': self.doubleEnded,
+				'stroke-width' : 3,
+				'stroke' : '#002F5E'
+			}).toBack();
+			self.infoPoint = self.paper.circle(self.midPoint.x, self.midPoint.y, 10).attr({
+				'fill' : '#BAD9EC', 
+				'stroke' : 'none',
+				'cursor' : 'pointer',
+				'title' : self.tooltip
+			});
+			self.infoPointText = self.paper.text(self.midPoint.x, self.midPoint.y + 1, self.infoBoxData.length).attr({
+				'font' : '13px serif', 
+				'stroke' : '#002F5E',
+				'cursor' : 'pointer',
+				'title' : self.tooltip
+			});
+
+			self.infoPoint.click(function(){self.displayInfoBox();});
+			self.infoPointText.click(function(){self.displayInfoBox();});
+			
+			self.infoPoint.hover(function(){self.glow = self.visual.glow();}, function(){self.glow.remove();}, self, self);
+			self.infoPointText.hover(function(){self.glow = self.visual.glow();}, function(){self.glow.remove();}, self, self);
+		}
+	};
+	
+	self.displayInfoBox = function() {
+		if(!self.infoBox){
+			if(self.type == 'wires'){
+				self.infoBox = self.getInfoBoxWithWire(self.infoBoxData[0]);
+				for ( var i = 1; i < self.infoBoxData.length; i++) {
+					self.infoBox.addContent(self.getInfoBoxWithWireContent(self.infoBoxData[i]));
+				}
+			} else if(self.type == 'services'){
+				self.infoBox = self.getInfoBoxWithService(self.infoBoxData[0]);
+				for ( var i = 1; i < self.infoBoxData.length; i++) {
+					self.infoBox.addContent(self.getInfoBoxWithServiceContent(self.infoBoxData[i].service, self.infoBoxData[i].consumerId));
+				}
+			}
+		}
+		self.infoBox.show();
+	};
+	
+	self.increaseCount = function(relationshipInfoData) {		
+		if(self.infoPointText){
+			self.infoPointText.attr({'text': self.count});
+		}
+		self.infoBoxData.push(relationshipInfoData);
+	};
+	
+	self.increaseBackCount = function(relationshipInfoData) {
+		self.increaseCount(relationshipInfoData);
+		if('none' == self.doubleEnded){
+			self.doubleEnded = 'block-wide-long';
+			if(self.visual){
+				self.visual.attr({'arrow-start': self.doubleEnded});
+			}
+		}
+	};
+	
+	self.hide = function() {
+		if(self.visual){
+			self.visual.remove();
+		}
+		if(self.infoPoint){
+			self.infoPoint.remove();
+		}
+		if(self.infoPointText){
+			self.infoPointText.remove();
+		}
+	};
+	
+	self.reset = function(type, fromBundle, toBundle){
+		self.fromBundle = fromBundle;
+		self.toBundle = toBundle;
+		self.type = type;
+		self.infoBoxData = new Array();
+		self.doubleEnded = 'none';
+		if(self.visual){
+			self.visual.attr({'arrow-start': self.doubleEnded});
+		}
+		if(self.infoBox){
+			self.infoBox = undefined;
+		}
+	};
+	
+	self.getInfoBoxWithService = function(serviceData){
+		var name = 'service' + serviceData.service.Identifier;
+		var title = 'Service(s) between Bundles ' + serviceData.service.BundleIdentifier + ' and ' + serviceData.consumerId;
+		var content = self.getInfoBoxWithServiceContent(serviceData.service, serviceData.consumerId);
+		return new InfoBox({name: name, title: title, content: content, closeable: true});
+	};
+	
+	self.getInfoBoxWithServiceContent = function(service, consumerId){
+		var infoBox = $('<ul></ul>');
+		infoBox.append($('<li>Service [' + service.Identifier + '] ' + service.objectClass[0] + (service.objectClass.length > 1 ? '...' : '') + '</li>').addClass('section-title'));
+		infoBox.append($('<li>Published by Bundle ' + service.BundleIdentifier + '</li>'));
+		infoBox.append($('<li>Used by Bundle ' + consumerId + '</li>'));
+		if(service.UsingBundles.length > 1){
+			infoBox.append($('<li>Also used by Bundles</li>'));
+			$.each(service.UsingBundles, function(index, item){
+				if(item != consumerId){
+					infoBox.append($('<li>' + item + '</li>').addClass('indent1'));
+				}
+			});
+		}
+		infoBox.append($('<li>ObjectClass</li>'));
+		$.each(service.objectClass, function(index, item){
+			infoBox.append($('<li>' + item + '</li>').addClass('indent1'));
+		});
+		return infoBox;
+	};
+	
+	self.getInfoBoxWithWire = function(wire){
+		var name = 'wire' + wire.ProviderBundleId + '-' + wire.RequirerBundleId;
+		var title = 'Wire(s) between Bundles ' + wire.ProviderBundleId + ' and ' + wire.RequirerBundleId;
+		var content = self.getInfoBoxWithWireContent(wire);
+		return new InfoBox({name: name, title: title, content: content, closeable: true});
+	};
+
+	self.getInfoBoxWithWireContent = function(wire){
+		var infoBox = $('<ul></ul>');
+		infoBox.append($('<li>"' + wire.BundleRequirement.Namespace + '" provided by Bundle ' + wire.ProviderBundleId + ' to Bundle ' + wire.RequirerBundleId + '</li>').addClass('section-title'));
+		infoBox.append($('<li>Capability</li>'));
+		self.addWireProperties(infoBox, wire.BundleCapability.Attributes, '=', 'Attributes');
+		self.addWireProperties(infoBox, wire.BundleCapability.Directives, ':=', 'Directives');
+		infoBox.append($('<li>Requirement</li>'));
+		self.addWireProperties(infoBox, wire.BundleRequirement.Attributes, '=', 'Attributes');
+		self.addWireProperties(infoBox, wire.BundleRequirement.Directives, ':=', 'Directives');
+		return infoBox;
+	};
+	
+	self.addWireProperties = function(list, attributes, delimiter, type){
+		var firstItem = $('<li></li>').addClass('indent1');
+		list.append(firstItem);
+		var itemsAdded = false;
+		$.each(attributes, function(key, value){
+			if(!itemsAdded){
+				itemsAdded = true;
+				firstItem.text(type);
+			}
+			list.append($('<li>' + value.Key + delimiter + value.Value + '</li>').addClass('indent2'));
+		});
+		if(!itemsAdded){
+			firstItem.text('No ' + type);
+		}
+	};
+	
+};
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/js/common.js b/kernel/org.eclipse.virgo.management.console/src/main/webapp/js/common.js
new file mode 100644
index 0000000..bc97b0f
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/js/common.js
@@ -0,0 +1,640 @@
+/*******************************************************************************
+* Copyright (c) 2011 VMware Inc.
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*   Chris Frost - initial contribution
+*   David Normington - Tooltip code
+*   
+*******************************************************************************/
+
+// INIT FUNCTIONS
+
+$(document).ready(function() {
+	util = new Util();
+	util.start();
+	v_servers = new Servers();
+	v_servers.loadServers();
+	
+	var today = new Date();
+	if(today.getMonth() == 11 || (today.getMonth() == 0 && today.getDate() <= 5)){
+		$('#site-name').css({'background': 'url("' + util.getHostAndAdminPath() + '/resources/images/logo-hat-holly.png") no-repeat scroll center center transparent'});
+		$('#site-name').css({'height': '150px'});
+		$('#site-name').css({'width': '361px'});
+	}
+	
+	pageinit();
+});
+
+
+function loadMenus(menuNames, viewName){
+
+	var loadMenu = function(menuName, viewName){
+		var menuNameCaps = menuName.slice(0,1).toUpperCase() + menuName.slice(1);
+		var menuItem = $('<li />');
+		var link = $('<a href=\'' + contextPath + '/content/' + menuName + '\' />');
+		if(menuName == viewName){
+			menuItem.addClass('selected-navigation');
+		}
+		link.append($('<div />', {'class': 'button-cap-left-white'}));
+		link.append($('<div />', {'class': 'navigation-text'}).text(menuNameCaps));
+		link.append($('<div />', {'class': 'button-cap-right-white'}));
+		menuItem.append(link);
+		$('ul', $('#navigation-left')).append(menuItem);
+	};
+
+	loadMenu('overview', viewName);
+	$.each(menuNames.split(', '), function(index, menuItem){
+		loadMenu(menuItem, viewName);
+	});
+};
+
+// UTILITY FUNCTIONS
+
+var Util = function(){
+	
+	var self = this;
+	
+	self.fxTime = 200;
+		
+	self.queryHash = undefined; 
+
+	self.pageLocation = undefined;
+	
+	self.starting = false;
+	
+	self.started = false;
+	
+	self.start = function(){
+		if(!self.starting && !self.started){
+			self.starting = true;
+			self.spinnerElement = $('<div />');
+			self.spinner = self.spinnerElement.dialog({
+				modal: true,
+				dialogClass: 'spinner-large',
+				closeText: '',
+				draggable: false,
+				resizable: false,
+				closeOnEscape: false,
+				width: '48px',
+				close : function(){
+					self.spinnerElement.remove();
+				}
+			});
+			var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
+			var hash;
+			self.queryHash = {};
+		    for(var i = 0; i < hashes.length; i++) {
+		        hash = hashes[i].split('=');
+		        self.queryHash[hash[0]] = hash[1];
+		    }
+			if(location.hash){
+				self.pageLocation = location.hash.replace("#", "");
+			}
+		}
+	};
+	
+	/**
+	 * 
+	 */
+	self.pageReady = function(){
+		if(self.starting && !this.started){
+			self.started = true;
+			self.spinner.dialog('close');
+			self.spinner = undefined;
+			self.spinnerElement.remove();
+		}
+	};
+
+	
+	self.getHost = function(){
+		return location.protocol + '//' + location.host;
+	};
+	
+	/**
+	 * 
+	 * @returns {String}
+	 */
+	self.getHostAndAdminPath = function(){
+		return self.getHost() + contextPath;
+	};
+	
+	/**
+	 * 
+	 * @param objectName
+	 * @returns {ObjectName}
+	 */
+	self.readObjectName = function(objectName){
+		marker = objectName.indexOf(':');
+		domain = objectName.substring(0, marker);
+		propertyParts = objectName.substring(marker + 1).split(',');
+		properties = new Object();
+		$.each(propertyParts, function(index, item){
+			marker = item.indexOf('=');
+			properties[item.substring(0, marker)] = item.substring(marker + 1);
+		});
+		return new ObjectName(domain, properties, objectName);
+	};
+	
+	/**
+	 * 
+	 * @param query string for jolokia
+	 */
+	self.doQuery = function(query, successCallback, errorCallback){
+		$.ajax({
+			url: util.getHostAndAdminPath() + '/jolokia/' + query,
+			dataType: 'json',
+			contentType: 'application/json',
+			cache: false,
+			success: function (response) {
+				successCallback(response);
+			},
+			error: function(xmlHttpRequest, textStatus, errorThrown) {
+				if(errorCallback){
+					errorCallback(xmlHttpRequest, textStatus, errorThrown);
+				}
+			}
+		});
+	};
+	
+	/**
+	 * 
+	 * @param query object of keys and values
+	 * @param callback
+	 */
+	self.doBulkQuery = function(query, successCallback, errorCallback){
+		$.ajax({
+			type: 'POST',
+			url: self.getHostAndAdminPath() + '/jolokia',
+			dataType: 'json',
+			contentType: 'application/json',
+			cache: false,
+			data: JSON.stringify(query),
+			success: function (response) {
+				successCallback(response);
+			},
+			error: function(xmlHttpRequest, textStatus, errorThrown) {
+				if(errorCallback){
+					errorCallback(xmlHttpRequest, textStatus, errorThrown);
+				}
+			}
+		});
+	};
+	
+	/**
+	 * Loads a JavaScript file from the current host
+	 * 
+	 * @param name - the name of the script file to load, .js is not required on the end
+	 */
+	self.loadScript = function(name, callback){
+		$.getScript(self.getHostAndAdminPath() + '/resources/js/' + name + '.js', callback);
+	};
+	
+	/**
+	 * Adds a tooltip to the target element
+	 * 
+	 * @param el (Object) - The target elements
+	 * @param text (String) - The text of the tooltip
+	 */
+	self.tooltip = function(el, text) {
+		if ($('tooltip') == null) {
+			var div = $("<div />");
+			document.childNodes[1].appendChild(div);
+			div.setProperty('id', 'tooltip');
+			div.set('style','display: none;');
+		}
+		
+		el.onmouseover = function(e) {
+			$('tooltip').empty();
+			$('tooltip').set('html', text);
+			$('tooltip').set('styles', {"display": "block", "top": (e.pageY+10) + "px", "left": e.pageX + "px"});
+		};
+		
+		el.onmouseout = function(){
+			$('tooltip').set('styles', {"display": "none"});
+		};
+	};
+	
+	/**
+	 * Create and return a table element populated with the provided rows.
+	 */
+	self.makeTable = function(properties) {
+		
+		var decorate = function(table){
+			var tBody = $('tbody', table);
+			var bodyRows = $('tr', tBody);
+			bodyRows.removeClass('table-tr-odd');
+			bodyRows.filter(':odd').addClass('table-tr-odd');
+			bodyRows.each(function(index, row){
+				$(row).mouseenter(function(){
+					$(this).addClass('table-tr-hovered');
+				});
+				$(row).mouseleave(function(){
+					$(this).removeClass('table-tr-hovered');
+				});
+				if(properties.selectable){
+					$(row).click(function(evenData){
+						$('.table-tr-selected', newTable).removeClass('table-tr-selected');
+						$(this).addClass('table-tr-selected');
+						properties.selectable($(this));
+					});
+				}
+			});
+		};
+		
+		var doSort = function(table, th, type){
+			
+			var upArrow = '\u2191';
+			var downArrow = '\u2193';
+			
+			var stripArrow = function(text){
+				var lastChar = text[text.length - 1] ;
+				if(lastChar === upArrow || lastChar == downArrow){
+					return stripArrow(text.slice(0, text.length - 1));
+				}else{
+					return text;
+				};
+			};
+			
+			var index = th.col;
+
+			var compareAlpha = function(tr1, tr2){
+				var getText = function(tr){
+					var cell = $('*:nth-child(' + (index+1) + ')', tr);
+					return $(cell).text();
+				};
+				var text1 = getText(tr1);
+				var text2 = getText(tr2);
+				return ((text1 < text2) ? -1 : ((text1 > text2) ? 1 : 0));
+			};
+			
+			var compareNumeric = function(tr1, tr2){
+				var getText = function(tr){
+					var cell = $('*:nth-child(' + (index+1) + ')', tr);
+					return $(cell).text();
+				};
+				return getText(tr1) - getText(tr2);
+			};
+			
+			var compareVersion = function(tr1, tr2){
+				var getText = function(tr){
+					var cell = $('*:nth-child(' + (index+1) + ')', tr);
+					return $(cell).text();
+				};
+				var ver1 = getText(tr1).split('.');
+				var ver2 = getText(tr2).split('.');
+				var result = ver1[0] - ver2[0];
+				if(result == 0){
+					result = ver1[1] - ver2[1];
+				}
+				if(result == 0){
+					result = ver1[2] - ver2[2];
+				}
+				if(result == 0){
+					result = ((ver1[3] < ver2[3]) ? -1 : ((ver1[3] > ver2[3]) ? 1 : 0));
+				}
+				return result;
+			};
+			
+			var revCompareAlpha = function(tr1, tr2) {
+				return -compareAlpha(tr1, tr2);
+			};
+			
+			var revCompareNumeric = function(tr1, tr2) {
+				return -compareNumeric(tr1, tr2);
+			};
+			
+			var revCompareVersion = function(tr1, tr2){
+				return -compareVersion(tr1, tr2);
+			};
+			
+			var ths = $(th).siblings();
+			ths.removeClass('table-th-sort');
+			ths.removeClass('table-th-sort-rev');
+			ths.each(function(i,th){
+				var thx = $(th);
+				thx.text(stripArrow(thx.text()));
+			});
+			
+			var isSorted = th.hasClass('table-th-sort');
+			if(isSorted){
+				th.removeClass('table-th-sort');
+				th.addClass('table-th-sort-rev');
+				th.text(stripArrow(th.text()) + ' ' + upArrow);
+			}else{
+				th.removeClass('table-th-sort-rev');
+				th.addClass('table-th-sort');
+				th.text(stripArrow(th.text()) + ' ' + downArrow);
+			}
+			
+			var tBody = $('tbody', table);
+			var tRows = tBody.children();
+			tRows.remove();
+			if(type == 'numeric'){
+				tRows.sort(isSorted ? revCompareNumeric : compareNumeric);
+			}else if(type == 'alpha'){
+				tRows.sort(isSorted ? revCompareAlpha : compareAlpha);
+			}else{
+				tRows.sort(isSorted ? revCompareVersion : compareVersion);
+			}
+			tBody.append(tRows);
+		};
+		
+		var sortTable = function(clickEvent){
+			var th = clickEvent.data.header;
+			var table = th.parents('table');
+			var sortType = clickEvent.data.type;
+			doSort(table, th, sortType);
+			decorate(table);
+		};
+		
+		var newTable = $('<table />');
+		var sortTh = null;
+		if(properties.headers){
+			var tHeadRow = $('<tr />');
+			$.each(properties.headers, function(index, item){
+				var th = $('<th>' + item.title + '</th>');
+				th.col = index;
+				if (properties.sortable) {
+					th.click({header: th, type: item.type}, sortTable);
+				}
+				tHeadRow.append(th);
+				if (properties.sortable && index == properties.sortIndex) {
+					sortTh = th;
+				}
+			});
+			newTable.append($('<thead />', {'class': 'table-head'}).append(tHeadRow));
+		}
+		if(properties.clazz){
+			newTable.addClass(properties.clazz);
+		}
+		if(properties.id){
+			newTable.attr(properties.id);
+		}
+		if(properties.sortable){
+			newTable.addClass('table-sortable');
+		}
+		if(properties.selectable){
+			newTable.addClass('table-selectable');
+			newTable.addClass('table-hoverable');
+		}
+		if(properties.hoverable){
+			newTable.addClass('table-hoverable');
+		}
+		
+		var tBody = $('<tbody />', {'class': 'table-body'});
+		if(properties.rows){
+			$.each(properties.rows, function(i, row){
+				var newRow = $('<tr />');
+				$.each(row, function(j, value){
+					if(value instanceof Object){
+						newRow.append(value);
+					}else{
+						newRow.append($('<td>' + value + '</td>'));
+					}
+				});
+				tBody.append(newRow);
+			});
+		}
+		newTable.append(tBody);
+		
+		if(properties.sortable && sortTh != null){
+			doSort(newTable, sortTh, properties.headers[0].type);
+		};
+		decorate(newTable);
+		
+		newTable.getElementOffset = function(elementInTable){
+			return elementInTable.position().top - $('thead', this).position().top - 25;
+		};
+		
+		return newTable;
+	};
+	
+};
+
+/**
+ * 
+ */
+var InfoBox = function(properties){
+	
+	var self = this;
+	
+	self.isVisible = false;
+	self.dialogBox = $('<div />').addClass(properties.name).addClass('info-box');
+	self.title = $('<div />', {'class': 'box-title'}).text(properties.title);
+	self.content = $('<div />', {'class': 'box-content'}).append(properties.content);
+
+	self.dialogBox.append(self.title);
+	self.dialogBox.append(self.content);
+
+	if(properties.closeable){
+		self.title.append($('<div />', {'class': 'box-title-close'}).append('x').click(function(event){
+			event.stopPropagation();
+			self.hide();
+		}));
+	}
+
+	if(properties.error){
+		self.dialogBox.addClass('error-info-box');
+	}
+	
+	self.dialogBox.draggable({  scroll: false, stack: '.info-box', handle: self.title});
+	
+	self.addContent = function(newContent){
+		$.each(newContent.children(), function(index, item){
+			self.content.append(item);
+		});
+	};
+	
+	self.show = function(relativeTo){
+		if(!self.isVisible){
+			$("li", self.dialogBox).removeClass('li-odd');
+			$("li:odd", self.dialogBox).addClass('li-odd');
+			
+			var displayPosition = {};
+			if(relativeTo){
+				var position = relativeTo.position();
+				displayPosition.x = position.left + 15;
+				displayPosition.y = position.top + 25;
+			} else {
+				var position = $('#content').position();
+				var infoBoxCount = $('.info-box').length;
+				var floorCount = Math.floor(infoBoxCount/10);
+				var xOffSet = floorCount * 250;
+				infoBoxCount = infoBoxCount - (floorCount * 10);
+				displayPosition.x = position.left + 40 + xOffSet + (infoBoxCount*25);
+				displayPosition.y = position.top + 50 + (infoBoxCount*25);
+			}
+			self.dialogBox.css({position: 'absolute', 
+								left: displayPosition.x, 
+								top: displayPosition.y, 
+								'z-index': self.getHighestZIndex() + 1});
+			self.dialogBox.show();	
+			$('body').append(self.dialogBox);
+			self.isVisible = true;
+		}else{
+			self.dialogBox.css({'z-index': self.getHighestZIndex() + 1});
+		}
+		return self;
+	};
+	
+	self.dialogBox.click(self.show);
+	
+	self.getHighestZIndex = function(){
+		var zIndex = 0;
+		$.each($('.info-box'), function(index, otherInfoBox){
+			var checkZIndex = new Number($(otherInfoBox).css('z-index')).valueOf();
+			if(checkZIndex > zIndex){
+				zIndex = checkZIndex;
+			}
+		});
+		return zIndex;
+	};
+	
+	self.hide = function(){
+		if(self.isVisible){
+			self.dialogBox.detach();
+			self.dialogBox.hide();
+			self.isVisible = false;
+		}
+	};
+	
+};
+
+/**
+ * 
+ */
+var ObjectName = function(domain, properties, objectName){
+	
+	var self = this;
+	
+	self.domain = domain;
+	self.properties = properties;
+	self.toString = objectName;
+	
+	self.get = function(key){
+		return self.properties[key];
+	};
+	
+	self.compare = function(other){
+		 if (self.toString < other.toString) {
+			 return -1;
+		 }
+		 if (self.toString > other.toString) {
+			 return 1;
+		 }
+		 return 0; 
+	};
+	
+};
+
+// SERVERS GUI SECTION
+
+var Servers = function(){
+
+	this.open = false;
+	
+	/*
+	 * This takes the server string in the URL and sets the servers ServersDisplay.servers to an array of ip address.
+	 */
+	this.loadServers = function() {
+		var rows;
+		if(util.queryHash.s){
+			rows = util.queryHash.s.split(',');
+			if(!rows.contains(util.getHostAndAdminPath())){
+				rows.push(util.getHostAndAdminPath());
+			}
+		} else {
+			rows = [util.getHostAndAdminPath()];
+		}
+		
+		var serversTable = util.makeTable({
+			headers: ['Configured Servers'],
+			clazz: 'servers-table'
+		});
+
+		var tBody = $('tbody', serversTable);
+		
+		$.each(rows, function(index, item){
+			var newRow = $('<tr />');
+			newRow.append($('<td>' + item + '</td>\
+							 <td class="server-status">Status</td>\
+							 <td class="server-link">Overview</td>\
+							 <td class="server-link">Artifacts</td>\
+							 <td class="server-link">Repositories</td>\
+							 <td class="server-link">Configuration</td>\
+							 <td class="server-link">Dumps</td>'));
+			tBody.append(newRow);
+		});
+		
+		$('#servers-list').replaceWith(serversTable);
+	};
+
+	this.toggle = function() {
+		$('#servers').slideToggle(util.fxTime);
+		if(this.open) {
+			$('#servers-button').removeClass('selected-navigation');
+			this.open = false;
+		} else {
+			$('#servers-button').addClass('selected-navigation');
+			this.open = true;
+		}
+	};
+
+};
+
+// SERVERS
+
+var Server = function(){
+		
+	/**
+	 * Request an overview of the current server.
+	 * 
+	 * @param callback - a function to call with the retrieved server overview data
+	 */
+	this.getServerOverview = function(callback){
+		var request = [{
+			"type" : "version"
+		},{
+			"mbean" : "java.lang:type=OperatingSystem",
+			"attribute" : "Name",
+			"type" : "READ"
+		},{
+			"mbean" : "java.lang:type=OperatingSystem",
+			"attribute" : "Version",
+			"type" : "READ"
+		},{
+			"mbean" : "java.lang:type=OperatingSystem",
+			"attribute" : "Arch",
+			"type" : "READ"
+		},{
+			"mbean" : "java.lang:type=Runtime",
+			"attribute" : "VmVendor",
+			"type" : "READ"
+		},{
+			"mbean" : "java.lang:type=Runtime",
+			"attribute" : "VmName",
+			"type" : "READ"
+		},{
+			"mbean" : "java.lang:type=Runtime",
+			"attribute" : "VmVersion",
+			"type" : "READ"
+		}];
+		
+		util.doBulkQuery(request, function(response) {
+			var virgo;
+			if(response[0].value.info.extraInfo){
+				virgo = ['OSGi Container', response[0].value.info.product + ' ' + response[0].value.info.version + ' (' + response[0].value.info.extraInfo.type + ')'];
+			}else{				
+				virgo = ['OSGi Container', response[0].value.info.product + ' ' + response[0].value.info.version];
+			}
+			var runtime = ['Virtual Machine', response[5].value + ' version ' + response[6].value + ' (' + response[4].value + ')'];
+			var os = ['Operating System', response[1].value + ' ' + response[2].value + ' (' + response[3].value + ')'];
+			callback([virgo, runtime, os]);
+		}); 
+	};
+
+};
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/js/configurations.js b/kernel/org.eclipse.virgo.management.console/src/main/webapp/js/configurations.js
new file mode 100644
index 0000000..dd3d204
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/js/configurations.js
@@ -0,0 +1,114 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+/**
+ * Scripts to be loaded in to the head of the configuration view
+ */
+function pageinit(){
+	util.doQuery('search/org.eclipse.equinox.region.domain:type=Region,*', function(response){
+		$.each(response.value, function(index, region){
+			var regionName = util.readObjectName(region).get('name');
+			util.doQuery('exec/osgi.compendium:region=' + regionName + ',service=cm,version=1.3/getConfigurations/(service.pid=*)', function(response){
+			ConfigurationInit.addConfigurationSection(regionName, response.value);
+			});
+		});
+		util.pageReady();
+	});
+}
+
+
+ConfigurationInit = {
+
+	addConfigurationSection : function(regionName, json){
+		ConfigurationInit.appendConfigurationHeader(regionName);
+		$.each(json, function(index, item){
+			var pid = item[0];
+			var location = item[1];
+			var label = ConfigurationInit.getConfigurationLabel(pid);
+			var config = new Configuration(pid, location, regionName, label);
+			if(util.pageLocation && util.pageLocation == pid){
+				config.toggle();
+			}
+			$('.config-label', label).click(config, function(event){
+				event.data.toggle();
+			});
+		});
+	},
+	
+	getConfigurationLabel : function(labelText){
+		var configContainer = $('<div />', {'class': 'config-container'});
+		var configLabel = $('<div />', {'class': 'config-label'});
+		configLabel.append($('<div />', {'class': 'tree-icon plus'}).css('background', 'url("' + util.getHostAndAdminPath() + '/resources/images/tree-icons/plus.png") no-repeat center center'));
+		configLabel.append($('<span />').text(labelText));
+		configContainer.append(configLabel);
+		$('#config-list').append(configContainer);
+		return configContainer;
+	},
+	
+	appendConfigurationHeader : function(regionName){
+		var configLabel = $('<div />', {'class': 'config-header'});
+		configLabel.append($('<span />').text('Region: ' + regionName));
+		$('#config-list').append(configLabel);
+	}
+	
+};
+
+
+var Configuration = function(pid, location, regionName, label){
+	
+	var self = this;
+	
+	self.location = location;
+	
+	self.regionName = regionName;
+	
+	self.pid = pid;
+	
+	self.label = label;
+	
+	self.icon = $('.tree-icon', label);
+	
+	self.toggle = function(){
+		if(self.icon.hasClass('plus')){
+			self.setPlusMinusIcon('loader-small.gif', 'spinnerIcon');
+			util.doQuery('exec/osgi.compendium:region=' + self.regionName + ',service=cm,version=1.3/getProperties/' + pid, self.createTable);
+		} else {
+			$('.config-properties', self.label).slideToggle(util.fxTime, function(){
+				$(this).remove();
+			});
+			self.setPlusMinusIcon('tree-icons/plus.png', 'plus');
+		}
+	};
+	
+	self.setPlusMinusIcon = function (icon, className){
+		self.icon.css('background', 'url("' + util.getHostAndAdminPath() + '/resources/images/' + icon + '") no-repeat center center');
+		self.icon.removeClass('plus').removeClass('minus').removeClass('spinnerIcon').addClass(className);
+	};
+	
+	self.createTable = function(json){
+		var tableRows = new Array();
+		$.each(json.value, function(index, item){
+			tableRows.push([index, item.Value]);
+		});
+			
+		var propertiesTable = util.makeTable({ 
+			clazz: "config-table", 
+			headers: [{title: 'Property'}, {title: 'Value'}], 
+			rows: tableRows
+		});
+
+		var tableHolder = $('<div />', {'class' : 'config-properties'}).append(propertiesTable);
+		self.label.append(tableHolder);
+		tableHolder.slideToggle(util.fxTime);
+		self.setPlusMinusIcon('tree-icons/minus.png', 'minus');
+	};
+	
+};
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/js/dumps.js b/kernel/org.eclipse.virgo.management.console/src/main/webapp/js/dumps.js
new file mode 100644
index 0000000..5eeefbf
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/js/dumps.js
@@ -0,0 +1,399 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+/**
+ * Scripts to be loaded in to the head of the dumps view
+ */
+function pageinit(){
+	util.loadScript('bundlesGui', function(){});
+	util.loadScript('raphael', function(){});
+	dumpViewer = new DumpViewer().displayDumps();
+	$.ajax({
+		url: util.getHostAndAdminPath() + '/jolokia/read/org.eclipse.virgo.kernel:type=Medic,name=DumpInspector/ConfiguredDumpDirectory', 
+		dataType: 'json',
+		contentType: 'application/json',
+		cache: false,
+		success: function (response) {
+			$('#dumpLocation').text("Location: " + response.value);
+			dumpViewer.setDumpLocation(response.value);
+		}
+	});
+}
+
+function DumpViewer(){
+	
+	var self = this;
+	
+	self.loadingDump = false;
+
+	self.selectedDump = null;
+	
+	self.setDumpLocation = function(dumpLocation){
+		self.dumpLocation = dumpLocation;
+	};
+	
+	self.displayDumps = function(){
+		$('#dumps').empty();
+		$.ajax({
+			url: util.getHostAndAdminPath() + '/jolokia/read/org.eclipse.virgo.kernel:type=Medic,name=DumpInspector/Dumps', 
+			dataType: 'json',
+			contentType: 'application/json',
+			cache: false,
+			success: function (response){
+				self.displayDumpsResponse(response.value);
+				if(self.selectedDump){
+					// Look up the id of the selected dump again.
+					var dumpId = self.selectedDump.attr("id");
+					self.selectedDump = $('#' + dumpId);
+					if (self.selectedDump){
+						$(self.selectedDump).addClass('selected-item');
+					}
+				}
+				self.displaySelectedDump();
+			}
+		});
+		return self;
+	};
+	
+	self.displayDumpsResponse = function(json){
+		if(json && json.length > 0){
+			$.each(json, function(index, item){
+				var dumpListItem = $('<li />', {'class' : 'dump'});
+				dumpListItem.attr("id", item);
+				dumpListItem.append($('<div />', {'class' : 'label'}).text(item).click(dumpListItem, self.displayDumpEntries));
+				dumpListItem.append($('<div />', {'class' : 'delete'}).text('Delete').click(dumpListItem, self.deleteDump));
+				$('#dumps').append(dumpListItem);
+			});
+		} else {
+			var dumpListItem = $('<li />');
+			dumpListItem.text('None');
+			$('#dumps').append(dumpListItem);
+		}
+		util.pageReady();
+	};
+
+	self.displayDumpEntries = function(event){
+		var dumpListItem = event.data;
+		var dumpParent = $('#dumps');
+		var dumps = dumpParent.children();
+		$.each(dumps, function(index, dump){
+			$(dump).removeClass('selected-item');
+		});
+		dumpListItem.addClass('selected-item');
+		self.selectedDump = dumpListItem;
+		self.displaySelectedDump();
+	};
+	
+	self.displaySelectedDump = function(){
+		if(self.selectedDump){
+			var dumpId = self.selectedDump.attr("id");
+			$.ajax({
+				url: util.getHostAndAdminPath() + '/jolokia/exec/org.eclipse.virgo.kernel:type=Medic,name=DumpInspector/getDumpEntries/' + dumpId, 
+				dataType: 'json',
+				contentType: 'application/json',
+				cache: false,
+				success: function (response){
+					self.displaySelectedDumpResponse(response.value, self.selectedDump);
+				}
+			});
+		}else{
+			$('#dump-items').empty();
+			$('#dump-item-content').empty();
+		}
+	};
+	
+	self.displaySelectedDumpResponse = function(json, dumpListItem){
+		var dumpId = dumpListItem.attr("id");
+		$('#dump-items').empty();
+		$('#dump-item-content').empty();
+		if(json && json.length > 0){
+			$.each(json, function(index, item){
+				// Replace periods in ids to make them easy to use as JQuery selectors.
+				var dumpEntryId = (dumpId + item[0]).replace(new RegExp('\\.', 'g'), '_');
+				var dumpEntryListItem = $('<li />', {'class' : 'dump-item'});
+				dumpEntryListItem.attr('id', dumpEntryId);
+				var dumpEntryLabel = $('<div />', {'class' : 'label'}).text(item[0]);
+				var dumpEntryClickData = {'dumpEntryId': dumpEntryId, 'queryString': item[1], 'dumpId': dumpId};
+				dumpEntryLabel.click(dumpEntryClickData, self.displayDumpEntry);
+				dumpEntryListItem.append(dumpEntryLabel);
+				$('#dump-items').append(dumpEntryListItem);
+				if('summary.txt' == item[0]){
+					dumpEntryLabel.click();
+				}
+			});
+		}
+	};
+	
+	self.displayDumpEntry = function(event){
+		$.each($('#dump-items').children(), function(index, dump){
+			$(dump).removeClass('selected-item');
+		});
+		$('#' + event.data.dumpEntryId).addClass('selected-item');
+		if(-1 < event.data.queryString.indexOf('StateDumpInspector')){
+			self.displayOSGiStateDumpEntry(event.data.dumpId);
+		} else {
+			$.ajax({
+				url: util.getHostAndAdminPath() + '/jolokia/exec/org.eclipse.virgo.kernel:type=Medic,name=' + event.data.queryString, 
+				dataType: 'json',
+				success: function (response){
+					self.displayDumpEntryResponse(response.value);
+				}
+			});
+		}
+	};
+	
+	self.displayDumpEntryResponse = function(json){
+		$('#dump-item-content').empty();
+		if(json && json.length > 0){
+			$.each(json, function(index, item){
+				var dumpListItem = $('<div />', {'class' : 'dump-file-line'});
+				dumpListItem.text(item);
+				$('#dump-item-content').append(dumpListItem);
+			});
+		}
+	};
+	
+	self.displayOSGiStateDumpEntry = function(dumpId){
+		$('#dump-item-content').empty();
+		var controls = $('<div />', {id: 'gui-controls'});
+		var bundleCanvas = $('<div />', {id: 'bundle-canvas'});
+		$('#dump-item-content').append(controls);
+		$('#dump-item-content').append(bundleCanvas);
+		
+		var dataSource = new QuasiDataSource(self.dumpLocation + '!/' + dumpId);
+		dataSource.updateData(function(){
+			dataSource.getUnresolvedBundleIds(function(bundles){
+				
+				if($.browser.msie){
+					$('#bundle-canvas').css({'height': '574px', 'width': '1000px'});
+				}
+				
+				layoutManager = new LayoutManager('bundle-canvas', 1000, 553, dataSource);
+				if(bundles.length < 1){
+					controls.append($('<div />').text('There were no unresolved bundles at the time of this state dump.'));
+				}else{
+					$.each(bundles, function(index, unresolvedBundle){
+						var bundleTitle = $('<div />').text('Bundle [' + unresolvedBundle.identifier + '] ' + unresolvedBundle.symbolicName + ': ' + unresolvedBundle.version + ' is unresolved.');
+						var cause = $('<div />', {'class': 'unresolved-bundle-cause'}).text(unresolvedBundle.description);
+						var unresolvedBundleElement = $('<div />', {'class': 'unresolved-bundle'}).append(bundleTitle).append(cause);
+						unresolvedBundleElement.click(unresolvedBundle.identifier, function(eventData){
+							layoutManager.displayBundle(eventData.data);
+						});
+						controls.append(unresolvedBundleElement);
+					});
+					layoutManager.displayBundle(bundles[0].identifier);
+				}
+				var tableHolder = $('<div />', {id: 'table-holder'});
+				controls.append(tableHolder);
+				new TopBar(tableHolder, layoutManager, dataSource).init();
+				$('#side-bar').height($('#dump-item-content').height() - 17);
+			});
+		}, function(){
+			controls.append($('<div />').text('Unable to retrieve Bundle data for the state dump, this requires the Virgo Kernel or above.'));
+		});
+	};
+	
+	//CREATE AND DELETE DUMPS
+	
+	self.createDump = function(){
+		if(!self.loadingDump){
+			self.loadingDump = true;
+			$('#create-dump-button').addClass('grey-out');
+			$('#dumps').append($('<div />', {'class' : 'spinner-small'}));
+			$.ajax({
+				url: util.getHostAndAdminPath() + '/jolokia/exec/org.eclipse.virgo.kernel:type=Medic,name=DumpInspector/createDump', 
+				dataType: 'json',
+				cache: false,
+				success: function (response){
+					self.loadingDump = false;
+					$('#create-dump-button').removeClass('grey-out');
+					self.displayDumps();
+				}
+			});
+		}
+	};
+
+	self.deleteDump = function(event){
+		var dumpListItem = event.data;
+		var dumpId = dumpListItem.attr("id");
+		$.ajax({
+			url: util.getHostAndAdminPath() + '/jolokia/exec/org.eclipse.virgo.kernel:type=Medic,name=DumpInspector/deleteDump/' +  dumpId, 
+			dataType: 'json',
+			cache: false,
+			success: function (response){
+				if(dumpListItem == self.selectedDump){
+					self.selectedDump = null;
+				}
+				self.displayDumps();
+			}
+		});
+	};
+	
+};
+
+
+/**
+ * As a datasource to the bundles gui layout manager this object must provide the following methods.
+ * 
+ * UpdateData
+ * UpdateBundle
+ * 
+ */
+var QuasiDataSource = function(dumpFolder){
+
+	var self = this;
+
+	self.dumpFolder = dumpFolder.replace('/', '!/');
+	
+	self.bundles = {};
+	
+	self.services = {};
+	
+	self.getUnresolvedBundleIds = function(callback){
+		util.doQuery('exec/org.eclipse.virgo.kernel:type=Medic,name=StateDumpInspector/getUnresolvedBundleFailures/' + self.dumpFolder, function(response){
+			callback(response.value);
+		});
+	};
+	
+	self.updateData = function(callback, failCallback){
+		util.doQuery('exec/org.eclipse.virgo.kernel:type=Medic,name=StateDumpInspector/listBundles/' + self.dumpFolder, function(response){
+			if(response.value){
+				self.bundles = {};
+				$.each(response.value, function(index, item){
+					self.bundles[item.identifier] = {	'SymbolicName': item.symbolicName,
+														'Version': item.version,
+														'Identifier': item.identifier,
+														'State': item.state,
+														'Region': item.region,
+														'Location': item.location,
+														'Fragment': item.fragment,
+														'ExportedPackages': item.exportedPackages,
+														'ImportedPackages': item.importedPackages};
+				});
+				callback();
+			}else{
+				failCallback();
+			}
+		});
+	};
+	
+
+	self.updateBundle = function(bundleId, callback){
+		util.doQuery('exec/org.eclipse.virgo.kernel:type=Medic,name=StateDumpInspector/getBundle/' + self.dumpFolder + '/' + bundleId, function(response){
+			self.bundles[bundleId].ProvidedWires = self.processWires(response.value.providedWires);
+			self.bundles[bundleId].RequiredWires = self.processWires(response.value.requiredWires);
+			callback();
+		});
+	};
+	
+	self.processWires = function(badlyFormattedWires){
+		var wellFormattedWires = new Array();
+		$.each(badlyFormattedWires, function(index, badlyFormattedWire){
+			wellFormattedWires.push({ProviderBundleId: badlyFormattedWire.providerBundleId, 
+									 RequirerBundleId: badlyFormattedWire.requirerBundleId, 
+									 BundleRequirement: {Namespace: badlyFormattedWire.namespace,
+										 				 Attributes: self.processProperties(badlyFormattedWire.bundleRequirementAttributes),
+										 				 Directives: self.processProperties(badlyFormattedWire.bundleRequirementDirectives)},
+									 BundleCapability: {Namespace: badlyFormattedWire.namespace,
+										 				 Attributes: self.processProperties(badlyFormattedWire.bundleCapabilityAttributes),
+						 				 				 Directives: self.processProperties(badlyFormattedWire.bundleCapabilityDirectives)}});
+		});
+		return wellFormattedWires;
+	};
+	
+	self.processProperties = function(wellFormattedProperties){
+		var specFormattedProperties = {};
+		$.each(wellFormattedProperties, function(key, value){
+			specFormattedProperties[key] = {'Key': key, 'Value': value};
+		});
+		return specFormattedProperties;
+	};
+
+};
+
+
+var TopBar = function(container, layoutManager, dataSource){
+
+	var self = this;
+	
+	self.dataSource = dataSource;
+	
+	self.layoutManager = layoutManager;
+	
+	self.container = container;
+	
+	self.focused = -1;
+	
+	self.layoutManager.setFocusListener(function(bundleId){
+		if(bundleId != self.focused){
+			self.setFocused(bundleId);
+		}
+	});
+	
+	self.setFocused = function(bundleId){
+		self.focused = bundleId;
+		var rowIds = $('tbody td:first-child', self.bundlesTable);
+		$.each(rowIds, function(index, rowId){
+			if($(rowId).text() == bundleId){
+				self.container.scrollTop(self.bundlesTable.getElementOffset($(rowId)));				
+				$('.table-tr-selected', self.bundlesTable).removeClass('table-tr-selected');
+				$(rowId).parent().addClass('table-tr-selected');
+			}
+		});
+	};
+	
+	self.init = function(){
+		var tRows = new Array();
+		$.each(dataSource.bundles, function(id, bundle){		
+			tRows.push([id, self.getFormattedBundleName(bundle), bundle.Version]);
+		});
+		
+		self.bundlesTable = util.makeTable({ 
+			id: 'bundle-table',
+			headers: [{title: 'Id', type: 'numeric'}, {title: 'SymbolicName', type: 'alpha'}, {title: 'Version', type: 'version'}], 
+			rows: tRows,
+			sortable : true,
+			sortIndex: 0,
+			selectable : self.clickEvent
+		});
+		self.container.append(self.bundlesTable);
+		if(util.pageLocation && util.pageLocation.length > 0){
+			self.setFocused(util.pageLocation);
+		}
+	};
+	
+	self.getFormattedBundleName = function(bundle){
+		var formatBundleList = function(bundleIdArray){
+			var result = bundleIdArray[0];
+			for(var i = 1; i < bundleIdArray.length; i++) {
+				result = result + ', ' + bundleIdArray[i];
+			}
+			return result;
+		};
+		if(bundle.Fragments && bundle.Fragments.length > 0){
+			return bundle.SymbolicName + ' - Fragments [' + formatBundleList(bundle.Fragments) + ']';
+		}
+		if(bundle.Hosts && bundle.Hosts.length > 0){
+			return bundle.SymbolicName + ' - Host [' + formatBundleList(bundle.Hosts) + ']';
+		}else if(bundle.Fragment == 'true'){
+			return bundle.SymbolicName + ' Is Fragments';
+		}
+		return bundle.SymbolicName;
+	};
+	
+	self.clickEvent = function(row){
+		var bundleId = $('td:first-child', row).text();
+		self.focused = bundleId;
+		self.layoutManager.displayBundle(bundleId);
+	};
+	
+};
+		
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/js/error.js b/kernel/org.eclipse.virgo.management.console/src/main/webapp/js/error.js
new file mode 100644
index 0000000..f7afbff
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/js/error.js
@@ -0,0 +1,17 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+/**
+ * Scripts to be loaded in to the head of the error page
+ */
+window.addEvent('domready', function() {
+	
+});
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/js/jquery-1.7.2.min.js b/kernel/org.eclipse.virgo.management.console/src/main/webapp/js/jquery-1.7.2.min.js
new file mode 100644
index 0000000..16ad06c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/js/jquery-1.7.2.min.js
@@ -0,0 +1,4 @@
+/*! jQuery v1.7.2 jquery.com | jquery.org/license */
+(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cu(a){if(!cj[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ck||(ck=c.createElement("iframe"),ck.frameBorder=ck.width=ck.height=0),b.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write((f.support.boxModel?"<!doctype html>":"")+"<html><body>"),cl.close();d=cl.createElement(a),cl.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ck)}cj[a]=e}return cj[a]}function ct(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function cs(){cq=b}function cr(){setTimeout(cs,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function ca(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function b_(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bD.test(a)?d(a,e):b_(a+"["+(typeof e=="object"?b:"")+"]",e,c,d)});else if(!c&&f.type(b)==="object")for(var e in b)b_(a+"["+e+"]",b[e],c,d);else d(a,b)}function b$(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function bZ(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bS,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bZ(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=bZ(a,c,d,e,"*",g));return l}function bY(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bO),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bB(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?1:0,g=4;if(d>0){if(c!=="border")for(;e<g;e+=2)c||(d-=parseFloat(f.css(a,"padding"+bx[e]))||0),c==="margin"?d+=parseFloat(f.css(a,c+bx[e]))||0:d-=parseFloat(f.css(a,"border"+bx[e]+"Width"))||0;return d+"px"}d=by(a,b);if(d<0||d==null)d=a.style[b];if(bt.test(d))return d;d=parseFloat(d)||0;if(c)for(;e<g;e+=2)d+=parseFloat(f.css(a,"padding"+bx[e]))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+bx[e]+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+bx[e]))||0);return d+"px"}function bo(a){var b=c.createElement("div");bh.appendChild(b),b.innerHTML=a.outerHTML;return b.firstChild}function bn(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bm(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bm)}function bm(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bl(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bk(a,b){var c;b.nodeType===1&&(b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase(),c==="object"?b.outerHTML=a.outerHTML:c!=="input"||a.type!=="checkbox"&&a.type!=="radio"?c==="option"?b.selected=a.defaultSelected:c==="input"||c==="textarea"?b.defaultValue=a.defaultValue:c==="script"&&b.text!==a.text&&(b.text=a.text):(a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value)),b.removeAttribute(f.expando),b.removeAttribute("_submit_attached"),b.removeAttribute("_change_attached"))}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d<e;d++)f.event.add(b,c,i[c][d])}h.data&&(h.data=f.extend({},h.data))}}function bi(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function U(a){var b=V.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function T(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(O.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?+d:j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c<d;c++)b[a[c]]=!0;return b}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){if(typeof c!="string"||!c)return null;var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b,c){var d;if(b){if(H)return H.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h,i){var j,k=d==null,l=0,m=a.length;if(d&&typeof d=="object"){for(l in d)e.access(a,c,l,d[l],1,h,f);g=1}else if(f!==b){j=i===b&&e.isFunction(f),k&&(j?(j=c,c=function(a,b,c){return j.call(e(a),c)}):(c.call(a,f),c=null));if(c)for(;l<m;l++)c(a[l],d,j?f.call(a[l],l,c(a[l],d)):f,i);g=1}return g?a:k?c.call(a):m?c(a[0],d):h},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test(" ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g={};f.Callbacks=function(a){a=a?g[a]||h(a):{};var c=[],d=[],e,i,j,k,l,m,n=function(b){var d,e,g,h,i;for(d=0,e=b.length;d<e;d++)g=b[d],h=f.type(g),h==="array"?n(g):h==="function"&&(!a.unique||!p.has(g))&&c.push(g)},o=function(b,f){f=f||[],e=!a.memory||[b,f],i=!0,j=!0,m=k||0,k=0,l=c.length;for(;c&&m<l;m++)if(c[m].apply(b,f)===!1&&a.stopOnFalse){e=!0;break}j=!1,c&&(a.once?e===!0?p.disable():c=[]:d&&d.length&&(e=d.shift(),p.fireWith(e[0],e[1])))},p={add:function(){if(c){var a=c.length;n(arguments),j?l=c.length:e&&e!==!0&&(k=a,o(e[0],e[1]))}return this},remove:function(){if(c){var b=arguments,d=0,e=b.length;for(;d<e;d++)for(var f=0;f<c.length;f++)if(b[d]===c[f]){j&&f<=l&&(l--,f<=m&&m--),c.splice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.length;for(;b<d;b++)if(a===c[b])return!0}return!1},empty:function(){c=[];return this},disable:function(){c=d=e=b;return this},disabled:function(){return!c},lock:function(){d=b,(!e||e===!0)&&p.disable();return this},locked:function(){return!d},fireWith:function(b,c){d&&(j?a.once||d.push([b,c]):(!a.once||!e)&&o(b,c));return this},fire:function(){p.fireWith(this,arguments);return this},fired:function(){return!!i}};return p};var i=[].slice;f.extend({Deferred:function(a){var b=f.Callbacks("once memory"),c=f.Callbacks("once memory"),d=f.Callbacks("memory"),e="pending",g={resolve:b,reject:c,notify:d},h={done:b.add,fail:c.add,progress:d.add,state:function(){return e},isResolved:b.fired,isRejected:c.fired,then:function(a,b,c){i.done(a).fail(b).progress(c);return this},always:function(){i.done.apply(i,arguments).fail.apply(i,arguments);return this},pipe:function(a,b,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[b,"reject"],progress:[c,"notify"]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function(){g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+"With"](this===i?d:this,[g])}):i[a](d[e])})}).promise()},promise:function(a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}},i=h.promise({}),j;for(j in g)i[j]=g[j].fire,i[j+"With"]=g[j].fireWith;i.done(function(){e="resolved"},c.disable,d.lock).fail(function(){e="rejected"},b.disable,d.lock),a&&a.call(i,i);return i},when:function(a){function m(a){return function(b){e[a]=arguments.length>1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c<d;c++)b[c]&&b[c].promise&&f.isFunction(b[c].promise)?b[c].promise().then(l(c),j.reject,m(c)):--g;g||j.resolveWith(j,b)}else j!==a&&j.resolveWith(j,d?[a]:[]);return k}}),f.support=function(){var b,d,e,g,h,i,j,k,l,m,n,o,p=c.createElement("div"),q=c.documentElement;p.setAttribute("className","t"),p.innerHTML="   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=p.getElementsByTagName("*"),e=p.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=p.getElementsByTagName("input")[0],b={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:p.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,pixelMargin:!0},f.boxModel=b.boxModel=c.compatMode==="CSS1Compat",i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete p.test}catch(r){b.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",function(){b.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),i.setAttribute("name","t"),p.appendChild(i),j=c.createDocumentFragment(),j.appendChild(p.lastChild),b.checkClone=j.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,j.removeChild(i),j.appendChild(p);if(p.attachEvent)for(n in{submit:1,change:1,focusin:1})m="on"+n,o=m in p,o||(p.setAttribute(m,"return;"),o=typeof p[m]=="function"),b[n+"Bubbles"]=o;j.removeChild(p),j=g=h=p=i=null,f(function(){var d,e,g,h,i,j,l,m,n,q,r,s,t,u=c.getElementsByTagName("body")[0];!u||(m=1,t="padding:0;margin:0;border:",r="position:absolute;top:0;left:0;width:1px;height:1px;",s=t+"0;visibility:hidden;",n="style='"+r+t+"5px solid #000;",q="<div "+n+"display:block;'><div style='"+t+"0;display:block;overflow:hidden;'></div></div>"+"<table "+n+"' cellpadding='0' cellspacing='0'>"+"<tr><td></td></tr></table>",d=c.createElement("div"),d.style.cssText=s+"width:0;height:0;position:static;top:0;margin-top:"+m+"px",u.insertBefore(d,u.firstChild),p=c.createElement("div"),d.appendChild(p),p.innerHTML="<table><tr><td style='"+t+"0;display:none'></td><td>t</td></tr></table>",k=p.getElementsByTagName("td"),o=k[0].offsetHeight===0,k[0].style.display="",k[1].style.display="none",b.reliableHiddenOffsets=o&&k[0].offsetHeight===0,a.getComputedStyle&&(p.innerHTML="",l=c.createElement("div"),l.style.width="0",l.style.marginRight="0",p.style.width="2px",p.appendChild(l),b.reliableMarginRight=(parseInt((a.getComputedStyle(l,null)||{marginRight:0}).marginRight,10)||0)===0),typeof p.style.zoom!="undefined"&&(p.innerHTML="",p.style.width=p.style.padding="1px",p.style.border=0,p.style.overflow="hidden",p.style.display="inline",p.style.zoom=1,b.inlineBlockNeedsLayout=p.offsetWidth===3,p.style.display="block",p.style.overflow="visible",p.innerHTML="<div style='width:5px;'></div>",b.shrinkWrapBlocks=p.offsetWidth!==3),p.style.cssText=r+s,p.innerHTML=q,e=p.firstChild,g=e.firstChild,i=e.nextSibling.firstChild.firstChild,j={doesNotAddBorder:g.offsetTop!==5,doesAddBorderForTableAndCells:i.offsetTop===5},g.style.position="fixed",g.style.top="20px",j.fixedPosition=g.offsetTop===20||g.offsetTop===15,g.style.position=g.style.top="",e.style.overflow="hidden",e.style.position="relative",j.subtractsBorderForOverflowNotVisible=g.offsetTop===-5,j.doesNotIncludeMarginInBodyOffset=u.offsetTop!==m,a.getComputedStyle&&(p.style.marginTop="1%",b.pixelMargin=(a.getComputedStyle(p,null)||{marginTop:0}).marginTop!=="1%"),typeof d.style.zoom!="undefined"&&(d.style.zoom=1),u.removeChild(d),l=p=d=null,f.extend(b,j))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e<g;e++)delete d[b[e]];if(!(c?m:f.isEmptyObject)(d))return}}if(!c){delete j[k].data;if(!m(j[k]))return}f.support.deleteExpando||!j.setInterval?delete j[k]:j[k]=null,i&&(f.support.deleteExpando?delete a[h]:a.removeAttribute?a.removeAttribute(h):a[h]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d,e,g,h,i,j=this[0],k=0,m=null;if(a===b){if(this.length){m=f.data(j);if(j.nodeType===1&&!f._data(j,"parsedAttrs")){g=j.attributes;for(i=g.length;k<i;k++)h=g[k].name,h.indexOf("data-")===0&&(h=f.camelCase(h.substring(5)),l(j,h,m[h]));f._data(j,"parsedAttrs",!0)}}return m}if(typeof a=="object")return this.each(function(){f.data(this,a)});d=a.split(".",2),d[1]=d[1]?"."+d[1]:"",e=d[1]+"!";return f.access(this,function(c){if(c===b){m=this.triggerHandler("getData"+e,[d[0]]),m===b&&j&&(m=f.data(j,a),m=l(j,a,m));return m===b&&d[1]?this.data(d[0]):m}d[1]=c,this.each(function(){var b=f(this);b.triggerHandler("setData"+e,d),f.data(this,a,c),b.triggerHandler("changeData"+e,d)})},null,c,arguments.length>1,null,!1)},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){var d=2;typeof a!="string"&&(c=a,a="fx",d--);if(arguments.length<d)return f.queue(this[0],a);return c===b?this:this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f.Callbacks("once memory"),!0))h++,l.add(m);m();return d.promise(c)}});var o=/[\n\t\r]/g,p=/\s+/,q=/\r/g,r=/^(?:button|input)$/i,s=/^(?:button|input|object|select|textarea)$/i,t=/^a(?:rea)?$/i,u=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,v=f.support.getSetAttribute,w,x,y;f.fn.extend({attr:function(a,b){return f.access(this,f.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,f.prop,a,b,arguments.length>1)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(p);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(o," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(p);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(o," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.type]||f.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.type]||f.valHooks[g.nodeName.toLowerCase()];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c<d;c++){e=i[c];if(e.selected&&(f.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!f.nodeName(e.parentNode,"optgroup"))){b=f(e).val();if(j)return b;h.push(b)}}if(j&&!h.length&&i.length)return f(i[g]).val();return h},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h,i=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;i<g;i++)e=d[i],e&&(c=f.propFix[e]||e,h=u.test(e),h||f.attr(a,e,""),a.removeAttribute(v?e:c),h&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(r.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(w&&f.nodeName(a,"button"))return w.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(w&&f.nodeName(a,"button"))return w.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,g,h,i=a.nodeType;if(!!a&&i!==3&&i!==8&&i!==2){h=i!==1||!f.isXMLDoc(a),h&&(c=f.propFix[c]||c,g=f.propHooks[c]);return d!==b?g&&"set"in g&&(e=g.set(a,d,c))!==b?e:a[c]=d:g&&"get"in g&&(e=g.get(a,c))!==null?e:a[c]}},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):s.test(a.nodeName)||t.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabindex=f.propHooks.tabIndex,x={get:function(a,c){var d,e=f.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},v||(y={name:!0,id:!0,coords:!0},w=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&(y[c]?d.nodeValue!=="":d.specified)?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.attrHooks.tabindex.set=w.set,f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})}),f.attrHooks.contenteditable={get:w.get,set:function(a,b,c){b===""&&(b="false"),w.set(a,b,c)}}),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.enctype||(f.propFix.enctype="encoding"),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/(?:^|\s)hover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(
+a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler,g=p.selector),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||"").split(".").sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:d.guid,selector:g,quick:g&&G(g),namespace:n.join(".")},p),r=j[m];if(!r){r=j[m]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListener?a.addEventListener(m,i,!1):a.attachEvent&&a.attachEvent("on"+m,i)}s.add&&(s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateCount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:function(a,b,c,d,e){var g=f.hasData(a)&&f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&&!!(o=g.events)){b=f.trim(I(b||"")).split(" ");for(h=0;h<b.length;h++){i=A.exec(b[h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);continue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.length,l=l?new RegExp("(^|\\.)"+l.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(n=0;n<r.length;n++)s=r[n],(e||k===s.origType)&&(!c||c.guid===s.guid)&&(!l||l.test(s.namespace))&&(!d||d===s.selector||d==="**"&&s.selector)&&(r.splice(n--,1),s.selector&&r.delegateCount--,p.remove&&p.remove.call(a,s));r.length===0&&m!==r.length&&((!p.teardown||p.teardown.call(a,l)===!1)&&f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&&(q=g.handle,q&&(q.elem=null),f.removeData(a,["events","handle"],!0))}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeType!==3&&e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,r,s;if(E.test(h+f.event.triggered))return;h.indexOf("!")>=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.length&&!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,"events")||{})[c.type]&&f._data(m,"handle"),q&&q.apply(m,d),q=o&&m[o],q&&f.acceptData(m)&&q.apply(m,d)===!1&&c.preventDefault();c.type=h,!g&&!c.isDefaultPrevented()&&(!p._default||p._default.apply(e.ownerDocument,d)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)&&o&&e[h]&&(h!=="focus"&&h!=="blur"||c.target.offsetWidth!==0)&&!f.isWindow(e)&&(n=e[o],n&&(e[o]=null),f.event.triggered=h,e[h](),f.event.triggered=b,n&&(e[o]=n));return c.result}},dispatch:function(c){c=f.event.fix(c||a.event);var d=(f._data(this,"events")||{})[c.type]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&&!c.namespace,i=f.event.special[c.type]||{},j=[],k,l,m,n,o,p,q,r,s,t,u;g[0]=c,c.delegateTarget=this;if(!i.preDispatch||i.preDispatch.call(this,c)!==!1){if(e&&(!c.button||c.type!=="click")){n=f(this),n.context=this.ownerDocument||this;for(m=c.target;m!=this;m=m.parentNode||this)if(m.disabled!==!0){p={},r=[],n[0]=m;for(k=0;k<e;k++)s=d[k],t=s.selector,p[t]===b&&(p[t]=s.quick?H(m,s.quick):n.is(t)),p[t]&&r.push(s);r.length&&j.push({elem:m,matches:r})}}d.length>e&&j.push({elem:this,matches:d.slice(e)});for(k=0;k<j.length&&!c.isPropagationStopped();k++){q=j[k],c.currentTarget=q.elem;for(l=0;l<q.matches.length&&!c.isImmediatePropagationStopped();l++){s=q.matches[l];if(h||!c.namespace&&!s.namespace||c.namespace_re&&c.namespace_re.test(s.namespace))c.data=s.data,c.handleObj=s,o=((f.event.special[s.origType]||{}).handle||s.handler).apply(q.elem,g),o!==b&&(c.result=o,o===!1&&(c.preventDefault(),c.stopPropagation()))}}i.postDispatch&&i.postDispatch.call(this,c);return c.result}},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,d){var e,f,g,h=d.button,i=d.fromElement;a.pageX==null&&d.clientX!=null&&(e=a.target.ownerDocument||c,f=e.documentElement,g=e.body,a.pageX=d.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=d.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?d.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0);return a}},fix:function(a){if(a[f.expando])return a;var d,e,g=a,h=f.event.fixHooks[a.type]||{},i=h.props?this.props.concat(h.props):this.props;a=f.Event(g);for(d=i.length;d;)e=i[--d],a[e]=g[e];a.target||(a.target=g.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey===b&&(a.metaKey=a.ctrlKey);return h.filter?h.filter(a,g):a},special:{ready:{setup:f.bindReady},load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=f.extend(new f.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?f.event.trigger(e,null,b):f.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},f.event.handle=f.event.dispatch,f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?K:J):this.type=a,b&&f.extend(this,b),this.timeStamp=a&&a.timeStamp||f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=K;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=K;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=K,this.stopPropagation()},isDefaultPrevented:J,isPropagationStopped:J,isImmediatePropagationStopped:J},f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c=this,d=a.relatedTarget,e=a.handleObj,g=e.selector,h;if(!d||d!==c&&!f.contains(c,d))a.type=e.origType,h=e.handler.apply(this,arguments),a.type=b;return h}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(){if(f.nodeName(this,"form"))return!1;f.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=f.nodeName(c,"input")||f.nodeName(c,"button")?c.form:b;d&&!d._submit_attached&&(f.event.add(d,"submit._submit",function(a){a._submit_bubble=!0}),d._submit_attached=!0)})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&f.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){if(f.nodeName(this,"form"))return!1;f.event.remove(this,"._submit")}}),f.support.changeBubbles||(f.event.special.change={setup:function(){if(z.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")f.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),f.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1,f.event.simulate("change",this,a,!0))});return!1}f.event.add(this,"beforeactivate._change",function(a){var b=a.target;z.test(b.nodeName)&&!b._change_attached&&(f.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&f.event.simulate("change",this.parentNode,a,!0)}),b._change_attached=!0)})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){f.event.remove(this,"._change");return z.test(this.nodeName)}}),f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){var d=0,e=function(a){f.event.simulate(b,a.target,f.event.fix(a),!0)};f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.fn.extend({on:function(a,c,d,e,g){var h,i;if(typeof a=="object"){typeof c!="string"&&(d=d||c,c=b);for(i in a)this.on(i,c,d,a[i],g);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=J;else if(!e)return this;g===1&&(h=e,e=function(a){f().off(a);return h.apply(this,arguments)},e.guid=h.guid||(h.guid=f.guid++));return this.each(function(){f.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,c,d){if(a&&a.preventDefault&&a.handleObj){var e=a.handleObj;f(a.delegateTarget).off(e.namespace?e.origType+"."+e.namespace:e.origType,e.selector,e.handler);return this}if(typeof a=="object"){for(var g in a)this.off(g,c,a[g]);return this}if(c===!1||typeof c=="function")d=c,c=b;d===!1&&(d=J);return this.each(function(){f.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){f(this.context).on(a,this.selector,b,c);return this},die:function(a,b){f(this.context).off(a,this.selector||"**",b);return this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,"**"):this.off(b,a,c)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f._data(this,"lastToggle"+a.guid)||0)%d;f._data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),f.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}if(j.nodeType===1){g||(j[d]=c,j.sizset=h);if(typeof b!="string"){if(j===b){k=!0;break}}else if(m.filter(b,[j]).length>0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}j.nodeType===1&&!g&&(j[d]=c,j.sizset=h);if(j.nodeName.toLowerCase()===b){k=j;break}j=j[a]}e[h]=k}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},m.matches=function(a,b){return m(a,null,null,b)},m.matchesSelector=function(a,b){return m(b,null,null,[a]).length>0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e<f;e++){h=o.order[e];if(g=o.leftMatch[h].exec(a)){i=g[1],g.splice(1,1);if(i.substr(i.length-1)!=="\\"){g[1]=(g[1]||"").replace(j,""),d=o.find[h](g,b,c);if(d!=null){a=a.replace(o.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},m.filter=function(a,c,d,e){var f,g,h,i,j,k,l,n,p,q=a,r=[],s=c,t=c&&c[0]&&m.isXML(c[0]);while(a&&c.length){for(h in o.filter)if((f=o.leftMatch[h].exec(a))!=null&&f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.length-1)==="\\")continue;s===r&&(r=[]);if(o.preFilter[h]){f=o.preFilter[h](f,s,d,r,e,t);if(!f)g=i=!0;else if(f===!0)continue}if(f)for(n=0;(j=s[n])!=null;n++)j&&(i=k(j,f,n,s),p=e^i,d&&i!=null?p?g=!0:s[n]=!1:p&&(r.push(j),g=!0));if(i!==b){d||(s=r),a=a.replace(o.match[h],"");if(!g)return[];break}}if(a===q)if(g==null)m.error(a);else break;q=a}return s},m.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)};var n=m.getText=function(a){var b,c,d=a.nodeType,e="";if(d){if(d===1||d===9||d===11){if(typeof a.textContent=="string")return a.textContent;if(typeof a.innerText=="string")return a.innerText.replace(k,"");for(a=a.firstChild;a;a=a.nextSibling)e+=n(a)}else if(d===3||d===4)return a.nodeValue}else for(b=0;c=a[b];b++)c.nodeType!==8&&(e+=n(c));return e},o=m.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!l.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&m.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&m.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(j,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}m.error(e)},CHILD:function(a,b){var c,e,f,g,h,i,j,k=b[1],l=a;switch(k){case"only":case"first":while(l=l.previousSibling)if(l.nodeType===1)return!1;if(k==="first")return!0;l=a;case"last":while(l=l.nextSibling)if(l.nodeType===1)return!1;return!0;case"nth":c=b[2],e=b[3];if(c===1&&e===0)return!0;f=b[0],g=a.parentNode;if(g&&(g[d]!==f||!a.nodeIndex)){i=0;for(l=g.firstChild;l;l=l.nextSibling)l.nodeType===1&&(l.nodeIndex=++i);g[d]=f}j=a.nodeIndex-e;return c===0?j===0:j%c===0&&j/c>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));o.match.globalPOS=p;var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var u,v;c.documentElement.compareDocumentPosition?u=function(a,b){if(a===b){h=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,i=b.parentNode,j=g;if(g===i)return v(a,b);if(!g)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return v(e[k],f[k]);return k===c?v(a,f[k],-1):v(e[k],b,1)},v=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h<i;h++)m(a,g[h],e,c);return m.filter(f,e)};m.attr=f.attr,m.selectors.attrMap={},f.find=m,f.expr=m.selectors,f.expr[":"]=f.expr.filters,f.unique=m.uniqueSort,f.text=m.getText,f.isXMLDoc=m.isXML,f.contains=m.contains}();var L=/Until$/,M=/^(?:parents|prevUntil|prevAll)/,N=/,/,O=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,Q=f.expr.match.globalPOS,R={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(T(this,a,!1),"not",a)},filter:function(a){return this.pushStack(T(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?Q.test(a)?f(a,this.context).index(this[0])>=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d<a.length;d++)f(g).is(a[d])&&c.push({selector:a[d],elem:g,level:h});g=g.parentNode,h++}return c}var i=Q.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(i?i.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/<tbody/i,_=/<|&#?\w+;/,ba=/<(?:script|style)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp("<(?:"+V+")[\\s/>]","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*<!(?:\[CDATA\[|\-\-)/,bg={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){return f.access(this,function(a){return a===b?f.text(this):this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f
+.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){return f.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1></$2>");try{for(;d<e;d++)c=this[d]||{},c.nodeType===1&&(f.cleanData(c.getElementsByTagName("*")),c.innerHTML=a);c=0}catch(g){}}c&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,function(a,b){b.src?f.ajax({type:"GET",global:!1,url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bf,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)})}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof j=="string"&&j.length<512&&i===c&&j.charAt(0)==="<"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone||!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test("<"+a.nodeName+">")?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g,h,i,j=[];b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof l=="number"&&(l+="");if(!l)continue;if(typeof l=="string")if(!_.test(l))l=b.createTextNode(l);else{l=l.replace(Y,"<$1></$2>");var m=(Z.exec(l)||["",""])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement("div"),q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m==="table"&&!s?p.firstChild&&p.firstChild.childNodes:n[1]==="<table>"&&!s?p.childNodes:[];for(i=t.length-1;i>=0;--i)f.nodeName(t[i],"tbody")&&!t[i].childNodes.length&&t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&&X.test(l)&&p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p&&(p.parentNode.removeChild(p),q.length>0&&(r=q[q.length-1],r&&r.parentNode&&r.parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&&typeof (u=l.length)=="number")for(i=0;i<u;i++)bn(l[i]);else bn(l);l.nodeType?j.push(l):j=f.merge(j,l)}if(d){g=function(a){return!a.type||be.test(a.type)};for(k=0;j[k];k++){h=j[k];if(e&&f.nodeName(h,"script")&&(!h.type||be.test(h.type)))e.push(h.parentNode?h.parentNode.removeChild(h):h);else{if(h.nodeType===1){var v=f.grep(h.getElementsByTagName("script"),g);j.splice.apply(j,[k+1,0].concat(v))}d.appendChild(h)}}}return j},cleanData:function(a){var b,c,d=f.cache,e=f.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&&i.removeAttribute(f.expando),delete d[c]}}}});var bp=/alpha\([^)]*\)/i,bq=/opacity=([^)]*)/,br=/([A-Z]|^ms)/g,bs=/^[\-+]?(?:\d*\.)?\d+$/i,bt=/^-?(?:\d*\.)?\d+(?!px)[^\d\s]+$/i,bu=/^([\-+])=([\-+.\de]+)/,bv=/^margin/,bw={position:"absolute",visibility:"hidden",display:"block"},bx=["Top","Right","Bottom","Left"],by,bz,bA;f.fn.css=function(a,c){return f.access(this,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)},a,c,arguments.length>1)},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=by(a,"opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bu.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(by)return by(a,c)},swap:function(a,b,c){var d={},e,f;for(f in b)d[f]=a.style[f],a.style[f]=b[f];e=c.call(a);for(f in b)a.style[f]=d[f];return e}}),f.curCSS=f.css,c.defaultView&&c.defaultView.getComputedStyle&&(bz=function(a,b){var c,d,e,g,h=a.style;b=b.replace(br,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b))),!f.support.pixelMargin&&e&&bv.test(b)&&bt.test(c)&&(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.documentElement.currentStyle&&(bA=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f==null&&g&&(e=g[b])&&(f=e),bt.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),by=bz||bA,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0?bB(a,b,d):f.swap(a,bw,function(){return bB(a,b,d)})},set:function(a,b){return bs.test(b)?b+"px":b}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bq.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bp,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bp.test(g)?g.replace(bp,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){return f.swap(a,{display:"inline-block"},function(){return b?by(a,"margin-right"):a.style.marginRight})}})}),f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)}),f.each({margin:"",padding:"",border:"Width"},function(a,b){f.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bx[d]+b]=e[d]||e[d-2]||e[0];return f}}});var bC=/%20/g,bD=/\[\]$/,bE=/\r?\n/g,bF=/#.*$/,bG=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bH=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\/\//,bL=/\?/,bM=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bN=/^(?:select|textarea)/i,bO=/\s+/,bP=/([?&])_=[^&]*/,bQ=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV,bW=["*/"]+["*"];try{bU=e.href}catch(bX){bU=c.createElement("a"),bU.href="",bU=bU.href}bV=bQ.exec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bM,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bN.test(this.nodeName)||bH.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bE,"\r\n")}}):{name:b.name,value:c.replace(bE,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b$(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b$(a,b);return a},ajaxSettings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bW},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bY(bS),ajaxTransport:bY(bT),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?ca(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cb(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bF,"").replace(bK,bV[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bO),d.crossDomain==null&&(r=bQ.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bV[1]&&r[2]==bV[2]&&(r[3]||(r[1]==="http:"?80:443))==(bV[3]||(bV[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bZ(bS,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bL.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bP,"$1_="+x);d.url=y+(y===d.url?(bL.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bW+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bZ(bT,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g,a[g],c,e);return d.join("&").replace(bC,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cc++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=typeof b.data=="string"&&/^application\/x\-www\-form\-urlencoded/.test(b.contentType);if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n);try{m.text=h.responseText}catch(a){}try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cq;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(ct("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),(e===""&&f.css(d,"display")==="none"||!f.contains(d.ownerDocument.documentElement,d))&&f._data(d,"olddisplay",cu(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(ct("hide",3),a,b,c);var d,e,g=0,h=this.length;for(;g<h;g++)d=this[g],d.style&&(e=f.css(d,"display"),e!=="none"&&!f._data(d,"olddisplay")&&f._data(d,"olddisplay",e));for(g=0;g<h;g++)this[g].style&&(this[g].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(ct("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){function g(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o,p,q;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]);if((k=f.cssHooks[g])&&"expand"in k){l=k.expand(a[g]),delete a[g];for(i in l)i in a||(a[i]=l[i])}}for(g in a){h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(!f.support.inlineBlockNeedsLayout||cu(this.nodeName)==="inline"?this.style.display="inline-block":this.style.zoom=1))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)j=new f.fx(this,b,i),h=a[i],cm.test(h)?(q=f._data(this,"toggle"+i)||(h==="toggle"?d?"show":"hide":0),q?(f._data(this,"toggle"+i,q==="show"?"hide":"show"),j[q]()):j[h]()):(m=cn.exec(h),n=j.cur(),m?(o=parseFloat(m[2]),p=m[3]||(f.cssNumber[i]?"":"px"),p!=="px"&&(f.style(this,i,(o||1)+p),n=(o||1)/j.cur()*n,f.style(this,i,n+p)),m[1]&&(o=(m[1]==="-="?-1:1)*o+n),j.custom(n,o,p)):j.custom(n,h,""));return!0}var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return e.queue===!1?this.each(g):this.queue(e.queue,g)},stop:function(a,c,d){typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]);return this.each(function(){function h(a,b,c){var e=b[c];f.removeData(a,c,!0),e.stop(d)}var b,c=!1,e=f.timers,g=f._data(this);d||f._unmark(!0,this);if(a==null)for(b in g)g[b]&&g[b].stop&&b.indexOf(".run")===b.length-4&&h(this,g,b);else g[b=a+".run"]&&g[b].stop&&h(this,g,b);for(b=e.length;b--;)e[b].elem===this&&(a==null||e[b].queue===a)&&(d?e[b](!0):e[b].saveState(),c=!0,e.splice(b,1));(!d||!c)&&f.dequeue(this,a)})}}),f.each({slideDown:ct("show",1),slideUp:ct("hide",1),slideToggle:ct("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue?f.dequeue(this,d.queue):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a){return a},swing:function(a){return-Math.cos(a*Math.PI)/2+.5}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,c,d){function h(a){return e.step(a)}var e=this,g=f.fx;this.startTime=cq||cr(),this.end=c,this.now=this.start=a,this.pos=this.state=0,this.unit=d||this.unit||(f.cssNumber[this.prop]?"":"px"),h.queue=this.options.queue,h.elem=this.elem,h.saveState=function(){f._data(e.elem,"fxshow"+e.prop)===b&&(e.options.hide?f._data(e.elem,"fxshow"+e.prop,e.start):e.options.show&&f._data(e.elem,"fxshow"+e.prop,e.end))},h()&&f.timers.push(h)&&!co&&(co=setInterval(g.tick,g.interval))},show:function(){var a=f._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=a||f.style(this.elem,this.prop),this.options.show=!0,a!==b?this.custom(this.cur(),a):this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f._data(this.elem,"fxshow"+this.prop)||f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b,c,d,e=cq||cr(),g=!0,h=this.elem,i=this.options;if(a||e>=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||f.fx.stop()},interval:13,stop:function(){clearInterval(co),co=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=a.now+a.unit:a.elem[a.prop]=a.now}}}),f.each(cp.concat.apply([],cp),function(a,b){b.indexOf("margin")&&(f.fx.step[b]=function(a){f.style(a.elem,b,Math.max(0,a.now)+a.unit)})}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cv,cw=/^t(?:able|d|h)$/i,cx=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?cv=function(a,b,c,d){try{d=a.getBoundingClientRect()}catch(e){}if(!d||!f.contains(c,a))return d?{top:d.top,left:d.left}:{top:0,left:0};var g=b.body,h=cy(b),i=c.clientTop||g.clientTop||0,j=c.clientLeft||g.clientLeft||0,k=h.pageYOffset||f.support.boxModel&&c.scrollTop||g.scrollTop,l=h.pageXOffset||f.support.boxModel&&c.scrollLeft||g.scrollLeft,m=d.top+k-i,n=d.left+l-j;return{top:m,left:n}}:cv=function(a,b,c){var d,e=a.offsetParent,g=a,h=b.body,i=b.defaultView,j=i?i.getComputedStyle(a,null):a.currentStyle,k=a.offsetTop,l=a.offsetLeft;while((a=a.parentNode)&&a!==h&&a!==c){if(f.support.fixedPosition&&j.position==="fixed")break;d=i?i.getComputedStyle(a,null):a.currentStyle,k-=a.scrollTop,l-=a.scrollLeft,a===e&&(k+=a.offsetTop,l+=a.offsetLeft,f.support.doesNotAddBorder&&(!f.support.doesAddBorderForTableAndCells||!cw.test(a.nodeName))&&(k+=parseFloat(d.borderTopWidth)||0,l+=parseFloat(d.borderLeftWidth)||0),g=e,e=a.offsetParent),f.support.subtractsBorderForOverflowNotVisible&&d.overflow!=="visible"&&(k+=parseFloat(d.borderTopWidth)||0,l+=parseFloat(d.borderLeftWidth)||0),j=d}if(j.position==="relative"||j.position==="static")k+=h.offsetTop,l+=h.offsetLeft;f.support.fixedPosition&&j.position==="fixed"&&(k+=Math.max(c.scrollTop,h.scrollTop),l+=Math.max(c.scrollLeft,h.scrollLeft));return{top:k,left:l}},f.fn.offset=function(a){if(arguments.length)return a===b?this:this.each(function(b){f.offset.setOffset(this,a,b)});var c=this[0],d=c&&c.ownerDocument;if(!d)return null;if(c===d.body)return f.offset.bodyOffset(c);return cv(c,d,d.documentElement)},f.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);f.fn[a]=function(e){return f.access(this,function(a,e,g){var h=cy(a);if(g===b)return h?c in h?h[c]:f.support.boxModel&&h.document.documentElement[e]||h.document.body[e]:a[e];h?h.scrollTo(d?f(h).scrollLeft():g,d?g:f(h).scrollTop()):a[e]=g},a,e,arguments.length,null)}}),f.each({Height:"height",Width:"width"},function(a,c){var d="client"+a,e="scroll"+a,g="offset"+a;f.fn["inner"+a]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,c,"padding")):this[c]():null},f.fn["outer"+a]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,c,a?"margin":"border")):this[c]():null},f.fn[c]=function(a){return f.access(this,function(a,c,h){var i,j,k,l;if(f.isWindow(a)){i=a.document,j=i.documentElement[d];return f.support.boxModel&&j||i.body&&i.body[d]||j}if(a.nodeType===9){i=a.documentElement;if(i[d]>=i[e])return i[d];return Math.max(a.body[e],i[e],a.body[g],i[g])}if(h===b){k=f.css(a,c),l=parseFloat(k);return f.isNumeric(l)?l:k}f(a).css(c,h)},c,a,arguments.length,null)}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window);
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/js/jquery-ui-1.8.18.min.js b/kernel/org.eclipse.virgo.management.console/src/main/webapp/js/jquery-ui-1.8.18.min.js
new file mode 100755
index 0000000..f00a62f
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/js/jquery-ui-1.8.18.min.js
@@ -0,0 +1,356 @@
+/*!
+ * jQuery UI 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI
+ */(function(a,b){function d(b){return!a(b).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}function c(b,c){var e=b.nodeName.toLowerCase();if("area"===e){var f=b.parentNode,g=f.name,h;if(!b.href||!g||f.nodeName.toLowerCase()!=="map")return!1;h=a("img[usemap=#"+g+"]")[0];return!!h&&d(h)}return(/input|select|textarea|button|object/.test(e)?!b.disabled:"a"==e?b.href||c:c)&&d(b)}a.ui=a.ui||{};a.ui.version||(a.extend(a.ui,{version:"1.8.18",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}}),a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(b,c){return typeof b=="number"?this.each(function(){var d=this;setTimeout(function(){a(d).focus(),c&&c.call(d)},b)}):this._focus.apply(this,arguments)},scrollParent:function(){var b;a.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?b=this.parents().filter(function(){return/(relative|absolute|fixed)/.test(a.curCSS(this,"position",1))&&/(auto|scroll)/.test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0):b=this.parents().filter(function(){return/(auto|scroll)/.test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!b.length?a(document):b},zIndex:function(c){if(c!==b)return this.css("zIndex",c);if(this.length){var d=a(this[0]),e,f;while(d.length&&d[0]!==document){e=d.css("position");if(e==="absolute"||e==="relative"||e==="fixed"){f=parseInt(d.css("zIndex"),10);if(!isNaN(f)&&f!==0)return f}d=d.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}}),a.each(["Width","Height"],function(c,d){function h(b,c,d,f){a.each(e,function(){c-=parseFloat(a.curCSS(b,"padding"+this,!0))||0,d&&(c-=parseFloat(a.curCSS(b,"border"+this+"Width",!0))||0),f&&(c-=parseFloat(a.curCSS(b,"margin"+this,!0))||0)});return c}var e=d==="Width"?["Left","Right"]:["Top","Bottom"],f=d.toLowerCase(),g={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};a.fn["inner"+d]=function(c){if(c===b)return g["inner"+d].call(this);return this.each(function(){a(this).css(f,h(this,c)+"px")})},a.fn["outer"+d]=function(b,c){if(typeof b!="number")return g["outer"+d].call(this,b);return this.each(function(){a(this).css(f,h(this,b,!0,c)+"px")})}}),a.extend(a.expr[":"],{data:function(b,c,d){return!!a.data(b,d[3])},focusable:function(b){return c(b,!isNaN(a.attr(b,"tabindex")))},tabbable:function(b){var d=a.attr(b,"tabindex"),e=isNaN(d);return(e||d>=0)&&c(b,!e)}}),a(function(){var b=document.body,c=b.appendChild(c=document.createElement("div"));c.offsetHeight,a.extend(c.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0}),a.support.minHeight=c.offsetHeight===100,a.support.selectstart="onselectstart"in c,b.removeChild(c).style.display="none"}),a.extend(a.ui,{plugin:{add:function(b,c,d){var e=a.ui[b].prototype;for(var f in d)e.plugins[f]=e.plugins[f]||[],e.plugins[f].push([c,d[f]])},call:function(a,b,c){var d=a.plugins[b];if(!!d&&!!a.element[0].parentNode)for(var e=0;e<d.length;e++)a.options[d[e][0]]&&d[e][1].apply(a.element,c)}},contains:function(a,b){return document.compareDocumentPosition?a.compareDocumentPosition(b)&16:a!==b&&a.contains(b)},hasScroll:function(b,c){if(a(b).css("overflow")==="hidden")return!1;var d=c&&c==="left"?"scrollLeft":"scrollTop",e=!1;if(b[d]>0)return!0;b[d]=1,e=b[d]>0,b[d]=0;return e},isOverAxis:function(a,b,c){return a>b&&a<b+c},isOver:function(b,c,d,e,f,g){return a.ui.isOverAxis(b,d,f)&&a.ui.isOverAxis(c,e,g)}}))})(jQuery);/*!
+ * jQuery UI Widget 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Widget
+ */(function(a,b){if(a.cleanData){var c=a.cleanData;a.cleanData=function(b){for(var d=0,e;(e=b[d])!=null;d++)try{a(e).triggerHandler("remove")}catch(f){}c(b)}}else{var d=a.fn.remove;a.fn.remove=function(b,c){return this.each(function(){c||(!b||a.filter(b,[this]).length)&&a("*",this).add([this]).each(function(){try{a(this).triggerHandler("remove")}catch(b){}});return d.call(a(this),b,c)})}}a.widget=function(b,c,d){var e=b.split(".")[0],f;b=b.split(".")[1],f=e+"-"+b,d||(d=c,c=a.Widget),a.expr[":"][f]=function(c){return!!a.data(c,b)},a[e]=a[e]||{},a[e][b]=function(a,b){arguments.length&&this._createWidget(a,b)};var g=new c;g.options=a.extend(!0,{},g.options),a[e][b].prototype=a.extend(!0,g,{namespace:e,widgetName:b,widgetEventPrefix:a[e][b].prototype.widgetEventPrefix||b,widgetBaseClass:f},d),a.widget.bridge(b,a[e][b])},a.widget.bridge=function(c,d){a.fn[c]=function(e){var f=typeof e=="string",g=Array.prototype.slice.call(arguments,1),h=this;e=!f&&g.length?a.extend.apply(null,[!0,e].concat(g)):e;if(f&&e.charAt(0)==="_")return h;f?this.each(function(){var d=a.data(this,c),f=d&&a.isFunction(d[e])?d[e].apply(d,g):d;if(f!==d&&f!==b){h=f;return!1}}):this.each(function(){var b=a.data(this,c);b?b.option(e||{})._init():a.data(this,c,new d(e,this))});return h}},a.Widget=function(a,b){arguments.length&&this._createWidget(a,b)},a.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:!1},_createWidget:function(b,c){a.data(c,this.widgetName,this),this.element=a(c),this.options=a.extend(!0,{},this.options,this._getCreateOptions(),b);var d=this;this.element.bind("remove."+this.widgetName,function(){d.destroy()}),this._create(),this._trigger("create"),this._init()},_getCreateOptions:function(){return a.metadata&&a.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName),this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled "+"ui-state-disabled")},widget:function(){return this.element},option:function(c,d){var e=c;if(arguments.length===0)return a.extend({},this.options);if(typeof c=="string"){if(d===b)return this.options[c];e={},e[c]=d}this._setOptions(e);return this},_setOptions:function(b){var c=this;a.each(b,function(a,b){c._setOption(a,b)});return this},_setOption:function(a,b){this.options[a]=b,a==="disabled"&&this.widget()[b?"addClass":"removeClass"](this.widgetBaseClass+"-disabled"+" "+"ui-state-disabled").attr("aria-disabled",b);return this},enable:function(){return this._setOption("disabled",!1)},disable:function(){return this._setOption("disabled",!0)},_trigger:function(b,c,d){var e,f,g=this.options[b];d=d||{},c=a.Event(c),c.type=(b===this.widgetEventPrefix?b:this.widgetEventPrefix+b).toLowerCase(),c.target=this.element[0],f=c.originalEvent;if(f)for(e in f)e in c||(c[e]=f[e]);this.element.trigger(c,d);return!(a.isFunction(g)&&g.call(this.element[0],c,d)===!1||c.isDefaultPrevented())}}})(jQuery);/*!
+ * jQuery UI Mouse 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Mouse
+ *
+ * Depends:
+ *	jquery.ui.widget.js
+ */(function(a,b){var c=!1;a(document).mouseup(function(a){c=!1}),a.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var b=this;this.element.bind("mousedown."+this.widgetName,function(a){return b._mouseDown(a)}).bind("click."+this.widgetName,function(c){if(!0===a.data(c.target,b.widgetName+".preventClickEvent")){a.removeData(c.target,b.widgetName+".preventClickEvent"),c.stopImmediatePropagation();return!1}}),this.started=!1},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(b){if(!c){this._mouseStarted&&this._mouseUp(b),this._mouseDownEvent=b;var d=this,e=b.which==1,f=typeof this.options.cancel=="string"&&b.target.nodeName?a(b.target).closest(this.options.cancel).length:!1;if(!e||f||!this._mouseCapture(b))return!0;this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){d.mouseDelayMet=!0},this.options.delay));if(this._mouseDistanceMet(b)&&this._mouseDelayMet(b)){this._mouseStarted=this._mouseStart(b)!==!1;if(!this._mouseStarted){b.preventDefault();return!0}}!0===a.data(b.target,this.widgetName+".preventClickEvent")&&a.removeData(b.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(a){return d._mouseMove(a)},this._mouseUpDelegate=function(a){return d._mouseUp(a)},a(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate),b.preventDefault(),c=!0;return!0}},_mouseMove:function(b){if(a.browser.msie&&!(document.documentMode>=9)&&!b.button)return this._mouseUp(b);if(this._mouseStarted){this._mouseDrag(b);return b.preventDefault()}this._mouseDistanceMet(b)&&this._mouseDelayMet(b)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,b)!==!1,this._mouseStarted?this._mouseDrag(b):this._mouseUp(b));return!this._mouseStarted},_mouseUp:function(b){a(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,b.target==this._mouseDownEvent.target&&a.data(b.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(b));return!1},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(a){return this.mouseDelayMet},_mouseStart:function(a){},_mouseDrag:function(a){},_mouseStop:function(a){},_mouseCapture:function(a){return!0}})})(jQuery);/*
+ * jQuery UI Position 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Position
+ */(function(a,b){a.ui=a.ui||{};var c=/left|center|right/,d=/top|center|bottom/,e="center",f={},g=a.fn.position,h=a.fn.offset;a.fn.position=function(b){if(!b||!b.of)return g.apply(this,arguments);b=a.extend({},b);var h=a(b.of),i=h[0],j=(b.collision||"flip").split(" "),k=b.offset?b.offset.split(" "):[0,0],l,m,n;i.nodeType===9?(l=h.width(),m=h.height(),n={top:0,left:0}):i.setTimeout?(l=h.width(),m=h.height(),n={top:h.scrollTop(),left:h.scrollLeft()}):i.preventDefault?(b.at="left top",l=m=0,n={top:b.of.pageY,left:b.of.pageX}):(l=h.outerWidth(),m=h.outerHeight(),n=h.offset()),a.each(["my","at"],function(){var a=(b[this]||"").split(" ");a.length===1&&(a=c.test(a[0])?a.concat([e]):d.test(a[0])?[e].concat(a):[e,e]),a[0]=c.test(a[0])?a[0]:e,a[1]=d.test(a[1])?a[1]:e,b[this]=a}),j.length===1&&(j[1]=j[0]),k[0]=parseInt(k[0],10)||0,k.length===1&&(k[1]=k[0]),k[1]=parseInt(k[1],10)||0,b.at[0]==="right"?n.left+=l:b.at[0]===e&&(n.left+=l/2),b.at[1]==="bottom"?n.top+=m:b.at[1]===e&&(n.top+=m/2),n.left+=k[0],n.top+=k[1];return this.each(function(){var c=a(this),d=c.outerWidth(),g=c.outerHeight(),h=parseInt(a.curCSS(this,"marginLeft",!0))||0,i=parseInt(a.curCSS(this,"marginTop",!0))||0,o=d+h+(parseInt(a.curCSS(this,"marginRight",!0))||0),p=g+i+(parseInt(a.curCSS(this,"marginBottom",!0))||0),q=a.extend({},n),r;b.my[0]==="right"?q.left-=d:b.my[0]===e&&(q.left-=d/2),b.my[1]==="bottom"?q.top-=g:b.my[1]===e&&(q.top-=g/2),f.fractions||(q.left=Math.round(q.left),q.top=Math.round(q.top)),r={left:q.left-h,top:q.top-i},a.each(["left","top"],function(c,e){a.ui.position[j[c]]&&a.ui.position[j[c]][e](q,{targetWidth:l,targetHeight:m,elemWidth:d,elemHeight:g,collisionPosition:r,collisionWidth:o,collisionHeight:p,offset:k,my:b.my,at:b.at})}),a.fn.bgiframe&&c.bgiframe(),c.offset(a.extend(q,{using:b.using}))})},a.ui.position={fit:{left:function(b,c){var d=a(window),e=c.collisionPosition.left+c.collisionWidth-d.width()-d.scrollLeft();b.left=e>0?b.left-e:Math.max(b.left-c.collisionPosition.left,b.left)},top:function(b,c){var d=a(window),e=c.collisionPosition.top+c.collisionHeight-d.height()-d.scrollTop();b.top=e>0?b.top-e:Math.max(b.top-c.collisionPosition.top,b.top)}},flip:{left:function(b,c){if(c.at[0]!==e){var d=a(window),f=c.collisionPosition.left+c.collisionWidth-d.width()-d.scrollLeft(),g=c.my[0]==="left"?-c.elemWidth:c.my[0]==="right"?c.elemWidth:0,h=c.at[0]==="left"?c.targetWidth:-c.targetWidth,i=-2*c.offset[0];b.left+=c.collisionPosition.left<0?g+h+i:f>0?g+h+i:0}},top:function(b,c){if(c.at[1]!==e){var d=a(window),f=c.collisionPosition.top+c.collisionHeight-d.height()-d.scrollTop(),g=c.my[1]==="top"?-c.elemHeight:c.my[1]==="bottom"?c.elemHeight:0,h=c.at[1]==="top"?c.targetHeight:-c.targetHeight,i=-2*c.offset[1];b.top+=c.collisionPosition.top<0?g+h+i:f>0?g+h+i:0}}}},a.offset.setOffset||(a.offset.setOffset=function(b,c){/static/.test(a.curCSS(b,"position"))&&(b.style.position="relative");var d=a(b),e=d.offset(),f=parseInt(a.curCSS(b,"top",!0),10)||0,g=parseInt(a.curCSS(b,"left",!0),10)||0,h={top:c.top-e.top+f,left:c.left-e.left+g};"using"in c?c.using.call(b,h):d.css(h)},a.fn.offset=function(b){var c=this[0];if(!c||!c.ownerDocument)return null;if(b)return this.each(function(){a.offset.setOffset(this,b)});return h.call(this)}),function(){var b=document.getElementsByTagName("body")[0],c=document.createElement("div"),d,e,g,h,i;d=document.createElement(b?"div":"body"),g={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},b&&a.extend(g,{position:"absolute",left:"-1000px",top:"-1000px"});for(var j in g)d.style[j]=g[j];d.appendChild(c),e=b||document.documentElement,e.insertBefore(d,e.firstChild),c.style.cssText="position: absolute; left: 10.7432222px; top: 10.432325px; height: 30px; width: 201px;",h=a(c).offset(function(a,b){return b}).offset(),d.innerHTML="",e.removeChild(d),i=h.top+h.left+(b?2e3:0),f.fractions=i>21&&i<22}()})(jQuery);/*
+ * jQuery UI Draggable 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Draggables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */(function(a,b){a.widget("ui.draggable",a.ui.mouse,{widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1},_create:function(){this.options.helper=="original"&&!/^(?:r|a|f)/.test(this.element.css("position"))&&(this.element[0].style.position="relative"),this.options.addClasses&&this.element.addClass("ui-draggable"),this.options.disabled&&this.element.addClass("ui-draggable-disabled"),this._mouseInit()},destroy:function(){if(!!this.element.data("draggable")){this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled"),this._mouseDestroy();return this}},_mouseCapture:function(b){var c=this.options;if(this.helper||c.disabled||a(b.target).is(".ui-resizable-handle"))return!1;this.handle=this._getHandle(b);if(!this.handle)return!1;c.iframeFix&&a(c.iframeFix===!0?"iframe":c.iframeFix).each(function(){a('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1e3}).css(a(this).offset()).appendTo("body")});return!0},_mouseStart:function(b){var c=this.options;this.helper=this._createHelper(b),this._cacheHelperProportions(),a.ui.ddmanager&&(a.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(),this.offset=this.positionAbs=this.element.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},a.extend(this.offset,{click:{left:b.pageX-this.offset.left,top:b.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.originalPosition=this.position=this._generatePosition(b),this.originalPageX=b.pageX,this.originalPageY=b.pageY,c.cursorAt&&this._adjustOffsetFromHelper(c.cursorAt),c.containment&&this._setContainment();if(this._trigger("start",b)===!1){this._clear();return!1}this._cacheHelperProportions(),a.ui.ddmanager&&!c.dropBehaviour&&a.ui.ddmanager.prepareOffsets(this,b),this.helper.addClass("ui-draggable-dragging"),this._mouseDrag(b,!0),a.ui.ddmanager&&a.ui.ddmanager.dragStart(this,b);return!0},_mouseDrag:function(b,c){this.position=this._generatePosition(b),this.positionAbs=this._convertPositionTo("absolute");if(!c){var d=this._uiHash();if(this._trigger("drag",b,d)===!1){this._mouseUp({});return!1}this.position=d.position}if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";a.ui.ddmanager&&a.ui.ddmanager.drag(this,b);return!1},_mouseStop:function(b){var c=!1;a.ui.ddmanager&&!this.options.dropBehaviour&&(c=a.ui.ddmanager.drop(this,b)),this.dropped&&(c=this.dropped,this.dropped=!1);if((!this.element[0]||!this.element[0].parentNode)&&this.options.helper=="original")return!1;if(this.options.revert=="invalid"&&!c||this.options.revert=="valid"&&c||this.options.revert===!0||a.isFunction(this.options.revert)&&this.options.revert.call(this.element,c)){var d=this;a(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){d._trigger("stop",b)!==!1&&d._clear()})}else this._trigger("stop",b)!==!1&&this._clear();return!1},_mouseUp:function(b){this.options.iframeFix===!0&&a("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)}),a.ui.ddmanager&&a.ui.ddmanager.dragStop(this,b);return a.ui.mouse.prototype._mouseUp.call(this,b)},cancel:function(){this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear();return this},_getHandle:function(b){var c=!this.options.handle||!a(this.options.handle,this.element).length?!0:!1;a(this.options.handle,this.element).find("*").andSelf().each(function(){this==b.target&&(c=!0)});return c},_createHelper:function(b){var c=this.options,d=a.isFunction(c.helper)?a(c.helper.apply(this.element[0],[b])):c.helper=="clone"?this.element.clone().removeAttr("id"):this.element;d.parents("body").length||d.appendTo(c.appendTo=="parent"?this.element[0].parentNode:c.appendTo),d[0]!=this.element[0]&&!/(fixed|absolute)/.test(d.css("position"))&&d.css("position","absolute");return d},_adjustOffsetFromHelper:function(b){typeof b=="string"&&(b=b.split(" ")),a.isArray(b)&&(b={left:+b[0],top:+b[1]||0}),"left"in b&&(this.offset.click.left=b.left+this.margins.left),"right"in b&&(this.offset.click.left=this.helperProportions.width-b.right+this.margins.left),"top"in b&&(this.offset.click.top=b.top+this.margins.top),"bottom"in b&&(this.offset.click.top=this.helperProportions.height-b.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var b=this.offsetParent.offset();this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0])&&(b.left+=this.scrollParent.scrollLeft(),b.top+=this.scrollParent.scrollTop());if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&a.browser.msie)b={top:0,left:0};return{top:b.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:b.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.element.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var b=this.options;b.containment=="parent"&&(b.containment=this.helper[0].parentNode);if(b.containment=="document"||b.containment=="window")this.containment=[b.containment=="document"?0:a(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,b.containment=="document"?0:a(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,(b.containment=="document"?0:a(window).scrollLeft())+a(b.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(b.containment=="document"?0:a(window).scrollTop())+(a(b.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(b.containment)&&b.containment.constructor!=Array){var c=a(b.containment),d=c[0];if(!d)return;var e=c.offset(),f=a(d).css("overflow")!="hidden";this.containment=[(parseInt(a(d).css("borderLeftWidth"),10)||0)+(parseInt(a(d).css("paddingLeft"),10)||0),(parseInt(a(d).css("borderTopWidth"),10)||0)+(parseInt(a(d).css("paddingTop"),10)||0),(f?Math.max(d.scrollWidth,d.offsetWidth):d.offsetWidth)-(parseInt(a(d).css("borderLeftWidth"),10)||0)-(parseInt(a(d).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(f?Math.max(d.scrollHeight,d.offsetHeight):d.offsetHeight)-(parseInt(a(d).css("borderTopWidth"),10)||0)-(parseInt(a(d).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relative_container=c}else b.containment.constructor==Array&&(this.containment=b.containment)},_convertPositionTo:function(b,c){c||(c=this.position);var d=b=="absolute"?1:-1,e=this.options,f=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,g=/(html|body)/i.test(f[0].tagName);return{top:c.top+this.offset.relative.top*d+this.offset.parent.top*d-(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():g?0:f.scrollTop())*d),left:c.left+this.offset.relative.left*d+this.offset.parent.left*d-(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():g?0:f.scrollLeft())*d)}},_generatePosition:function(b){var c=this.options,d=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(d[0].tagName),f=b.pageX,g=b.pageY;if(this.originalPosition){var h;if(this.containment){if(this.relative_container){var i=this.relative_container.offset();h=[this.containment[0]+i.left,this.containment[1]+i.top,this.containment[2]+i.left,this.containment[3]+i.top]}else h=this.containment;b.pageX-this.offset.click.left<h[0]&&(f=h[0]+this.offset.click.left),b.pageY-this.offset.click.top<h[1]&&(g=h[1]+this.offset.click.top),b.pageX-this.offset.click.left>h[2]&&(f=h[2]+this.offset.click.left),b.pageY-this.offset.click.top>h[3]&&(g=h[3]+this.offset.click.top)}if(c.grid){var j=c.grid[1]?this.originalPageY+Math.round((g-this.originalPageY)/c.grid[1])*c.grid[1]:this.originalPageY;g=h?j-this.offset.click.top<h[1]||j-this.offset.click.top>h[3]?j-this.offset.click.top<h[1]?j+c.grid[1]:j-c.grid[1]:j:j;var k=c.grid[0]?this.originalPageX+Math.round((f-this.originalPageX)/c.grid[0])*c.grid[0]:this.originalPageX;f=h?k-this.offset.click.left<h[0]||k-this.offset.click.left>h[2]?k-this.offset.click.left<h[0]?k+c.grid[0]:k-c.grid[0]:k:k}}return{top:g-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():e?0:d.scrollTop()),left:f-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():e?0:d.scrollLeft())}},_clear:function(){this.helper.removeClass("ui-draggable-dragging"),this.helper[0]!=this.element[0]&&!this.cancelHelperRemoval&&this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1},_trigger:function(b,c,d){d=d||this._uiHash(),a.ui.plugin.call(this,b,[c,d]),b=="drag"&&(this.positionAbs=this._convertPositionTo("absolute"));return a.Widget.prototype._trigger.call(this,b,c,d)},plugins:{},_uiHash:function(a){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),a.extend(a.ui.draggable,{version:"1.8.18"}),a.ui.plugin.add("draggable","connectToSortable",{start:function(b,c){var d=a(this).data("draggable"),e=d.options,f=a.extend({},c,{item:d.element});d.sortables=[],a(e.connectToSortable).each(function(){var c=a.data(this,"sortable");c&&!c.options.disabled&&(d.sortables.push({instance:c,shouldRevert:c.options.revert}),c.refreshPositions(),c._trigger("activate",b,f))})},stop:function(b,c){var d=a(this).data("draggable"),e=a.extend({},c,{item:d.element});a.each(d.sortables,function(){this.instance.isOver?(this.instance.isOver=0,d.cancelHelperRemoval=!0,this.instance.cancelHelperRemoval=!1,this.shouldRevert&&(this.instance.options.revert=!0),this.instance._mouseStop(b),this.instance.options.helper=this.instance.options._helper,d.options.helper=="original"&&this.instance.currentItem.css({top:"auto",left:"auto"})):(this.instance.cancelHelperRemoval=!1,this.instance._trigger("deactivate",b,e))})},drag:function(b,c){var d=a(this).data("draggable"),e=this,f=function(b){var c=this.offset.click.top,d=this.offset.click.left,e=this.positionAbs.top,f=this.positionAbs.left,g=b.height,h=b.width,i=b.top,j=b.left;return a.ui.isOver(e+c,f+d,i,j,g,h)};a.each(d.sortables,function(f){this.instance.positionAbs=d.positionAbs,this.instance.helperProportions=d.helperProportions,this.instance.offset.click=d.offset.click,this.instance._intersectsWith(this.instance.containerCache)?(this.instance.isOver||(this.instance.isOver=1,this.instance.currentItem=a(e).clone().removeAttr("id").appendTo(this.instance.element).data("sortable-item",!0),this.instance.options._helper=this.instance.options.helper,this.instance.options.helper=function(){return c.helper[0]},b.target=this.instance.currentItem[0],this.instance._mouseCapture(b,!0),this.instance._mouseStart(b,!0,!0),this.instance.offset.click.top=d.offset.click.top,this.instance.offset.click.left=d.offset.click.left,this.instance.offset.parent.left-=d.offset.parent.left-this.instance.offset.parent.left,this.instance.offset.parent.top-=d.offset.parent.top-this.instance.offset.parent.top,d._trigger("toSortable",b),d.dropped=this.instance.element,d.currentItem=d.element,this.instance.fromOutside=d),this.instance.currentItem&&this.instance._mouseDrag(b)):this.instance.isOver&&(this.instance.isOver=0,this.instance.cancelHelperRemoval=!0,this.instance.options.revert=!1,this.instance._trigger("out",b,this.instance._uiHash(this.instance)),this.instance._mouseStop(b,!0),this.instance.options.helper=this.instance.options._helper,this.instance.currentItem.remove(),this.instance.placeholder&&this.instance.placeholder.remove(),d._trigger("fromSortable",b),d.dropped=!1)})}}),a.ui.plugin.add("draggable","cursor",{start:function(b,c){var d=a("body"),e=a(this).data("draggable").options;d.css("cursor")&&(e._cursor=d.css("cursor")),d.css("cursor",e.cursor)},stop:function(b,c){var d=a(this).data("draggable").options;d._cursor&&a("body").css("cursor",d._cursor)}}),a.ui.plugin.add("draggable","opacity",{start:function(b,c){var d=a(c.helper),e=a(this).data("draggable").options;d.css("opacity")&&(e._opacity=d.css("opacity")),d.css("opacity",e.opacity)},stop:function(b,c){var d=a(this).data("draggable").options;d._opacity&&a(c.helper).css("opacity",d._opacity)}}),a.ui.plugin.add("draggable","scroll",{start:function(b,c){var d=a(this).data("draggable");d.scrollParent[0]!=document&&d.scrollParent[0].tagName!="HTML"&&(d.overflowOffset=d.scrollParent.offset())},drag:function(b,c){var d=a(this).data("draggable"),e=d.options,f=!1;if(d.scrollParent[0]!=document&&d.scrollParent[0].tagName!="HTML"){if(!e.axis||e.axis!="x")d.overflowOffset.top+d.scrollParent[0].offsetHeight-b.pageY<e.scrollSensitivity?d.scrollParent[0].scrollTop=f=d.scrollParent[0].scrollTop+e.scrollSpeed:b.pageY-d.overflowOffset.top<e.scrollSensitivity&&(d.scrollParent[0].scrollTop=f=d.scrollParent[0].scrollTop-e.scrollSpeed);if(!e.axis||e.axis!="y")d.overflowOffset.left+d.scrollParent[0].offsetWidth-b.pageX<e.scrollSensitivity?d.scrollParent[0].scrollLeft=f=d.scrollParent[0].scrollLeft+e.scrollSpeed:b.pageX-d.overflowOffset.left<e.scrollSensitivity&&(d.scrollParent[0].scrollLeft=f=d.scrollParent[0].scrollLeft-e.scrollSpeed)}else{if(!e.axis||e.axis!="x")b.pageY-a(document).scrollTop()<e.scrollSensitivity?f=a(document).scrollTop(a(document).scrollTop()-e.scrollSpeed):a(window).height()-(b.pageY-a(document).scrollTop())<e.scrollSensitivity&&(f=a(document).scrollTop(a(document).scrollTop()+e.scrollSpeed));if(!e.axis||e.axis!="y")b.pageX-a(document).scrollLeft()<e.scrollSensitivity?f=a(document).scrollLeft(a(document).scrollLeft()-e.scrollSpeed):a(window).width()-(b.pageX-a(document).scrollLeft())<e.scrollSensitivity&&(f=a(document).scrollLeft(a(document).scrollLeft()+e.scrollSpeed))}f!==!1&&a.ui.ddmanager&&!e.dropBehaviour&&a.ui.ddmanager.prepareOffsets(d,b)}}),a.ui.plugin.add("draggable","snap",{start:function(b,c){var d=a(this).data("draggable"),e=d.options;d.snapElements=[],a(e.snap.constructor!=String?e.snap.items||":data(draggable)":e.snap).each(function(){var b=a(this),c=b.offset();this!=d.element[0]&&d.snapElements.push({item:this,width:b.outerWidth(),height:b.outerHeight(),top:c.top,left:c.left})})},drag:function(b,c){var d=a(this).data("draggable"),e=d.options,f=e.snapTolerance,g=c.offset.left,h=g+d.helperProportions.width,i=c.offset.top,j=i+d.helperProportions.height;for(var k=d.snapElements.length-1;k>=0;k--){var l=d.snapElements[k].left,m=l+d.snapElements[k].width,n=d.snapElements[k].top,o=n+d.snapElements[k].height;if(!(l-f<g&&g<m+f&&n-f<i&&i<o+f||l-f<g&&g<m+f&&n-f<j&&j<o+f||l-f<h&&h<m+f&&n-f<i&&i<o+f||l-f<h&&h<m+f&&n-f<j&&j<o+f)){d.snapElements[k].snapping&&d.options.snap.release&&d.options.snap.release.call(d.element,b,a.extend(d._uiHash(),{snapItem:d.snapElements[k].item})),d.snapElements[k].snapping=!1;continue}if(e.snapMode!="inner"){var p=Math.abs(n-j)<=f,q=Math.abs(o-i)<=f,r=Math.abs(l-h)<=f,s=Math.abs(m-g)<=f;p&&(c.position.top=d._convertPositionTo("relative",{top:n-d.helperProportions.height,left:0}).top-d.margins.top),q&&(c.position.top=d._convertPositionTo("relative",{top:o,left:0}).top-d.margins.top),r&&(c.position.left=d._convertPositionTo("relative",{top:0,left:l-d.helperProportions.width}).left-d.margins.left),s&&(c.position.left=d._convertPositionTo("relative",{top:0,left:m}).left-d.margins.left)}var t=p||q||r||s;if(e.snapMode!="outer"){var p=Math.abs(n-i)<=f,q=Math.abs(o-j)<=f,r=Math.abs(l-g)<=f,s=Math.abs(m-h)<=f;p&&(c.position.top=d._convertPositionTo("relative",{top:n,left:0}).top-d.margins.top),q&&(c.position.top=d._convertPositionTo("relative",{top:o-d.helperProportions.height,left:0}).top-d.margins.top),r&&(c.position.left=d._convertPositionTo("relative",{top:0,left:l}).left-d.margins.left),s&&(c.position.left=d._convertPositionTo("relative",{top:0,left:m-d.helperProportions.width}).left-d.margins.left)}!d.snapElements[k].snapping&&(p||q||r||s||t)&&d.options.snap.snap&&d.options.snap.snap.call(d.element,b,a.extend(d._uiHash(),{snapItem:d.snapElements[k].item})),d.snapElements[k].snapping=p||q||r||s||t}}}),a.ui.plugin.add("draggable","stack",{start:function(b,c){var d=a(this).data("draggable").options,e=a.makeArray(a(d.stack)).sort(function(b,c){return(parseInt(a(b).css("zIndex"),10)||0)-(parseInt(a(c).css("zIndex"),10)||0)});if(!!e.length){var f=parseInt(e[0].style.zIndex)||0;a(e).each(function(a){this.style.zIndex=f+a}),this[0].style.zIndex=f+e.length}}}),a.ui.plugin.add("draggable","zIndex",{start:function(b,c){var d=a(c.helper),e=a(this).data("draggable").options;d.css("zIndex")&&(e._zIndex=d.css("zIndex")),d.css("zIndex",e.zIndex)},stop:function(b,c){var d=a(this).data("draggable").options;d._zIndex&&a(c.helper).css("zIndex",d._zIndex)}})})(jQuery);/*
+ * jQuery UI Droppable 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Droppables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.draggable.js
+ */(function(a,b){a.widget("ui.droppable",{widgetEventPrefix:"drop",options:{accept:"*",activeClass:!1,addClasses:!0,greedy:!1,hoverClass:!1,scope:"default",tolerance:"intersect"},_create:function(){var b=this.options,c=b.accept;this.isover=0,this.isout=1,this.accept=a.isFunction(c)?c:function(a){return a.is(c)},this.proportions={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight},a.ui.ddmanager.droppables[b.scope]=a.ui.ddmanager.droppables[b.scope]||[],a.ui.ddmanager.droppables[b.scope].push(this),b.addClasses&&this.element.addClass("ui-droppable")},destroy:function(){var b=a.ui.ddmanager.droppables[this.options.scope];for(var c=0;c<b.length;c++)b[c]==this&&b.splice(c,1);this.element.removeClass("ui-droppable ui-droppable-disabled").removeData("droppable").unbind(".droppable");return this},_setOption:function(b,c){b=="accept"&&(this.accept=a.isFunction(c)?c:function(a){return a.is(c)}),a.Widget.prototype._setOption.apply(this,arguments)},_activate:function(b){var c=a.ui.ddmanager.current;this.options.activeClass&&this.element.addClass(this.options.activeClass),c&&this._trigger("activate",b,this.ui(c))},_deactivate:function(b){var c=a.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass),c&&this._trigger("deactivate",b,this.ui(c))},_over:function(b){var c=a.ui.ddmanager.current;!!c&&(c.currentItem||c.element)[0]!=this.element[0]&&this.accept.call(this.element[0],c.currentItem||c.element)&&(this.options.hoverClass&&this.element.addClass(this.options.hoverClass),this._trigger("over",b,this.ui(c)))},_out:function(b){var c=a.ui.ddmanager.current;!!c&&(c.currentItem||c.element)[0]!=this.element[0]&&this.accept.call(this.element[0],c.currentItem||c.element)&&(this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("out",b,this.ui(c)))},_drop:function(b,c){var d=c||a.ui.ddmanager.current;if(!d||(d.currentItem||d.element)[0]==this.element[0])return!1;var e=!1;this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function(){var b=a.data(this,"droppable");if(b.options.greedy&&!b.options.disabled&&b.options.scope==d.options.scope&&b.accept.call(b.element[0],d.currentItem||d.element)&&a.ui.intersect(d,a.extend(b,{offset:b.element.offset()}),b.options.tolerance)){e=!0;return!1}});if(e)return!1;if(this.accept.call(this.element[0],d.currentItem||d.element)){this.options.activeClass&&this.element.removeClass(this.options.activeClass),this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("drop",b,this.ui(d));return this.element}return!1},ui:function(a){return{draggable:a.currentItem||a.element,helper:a.helper,position:a.position,offset:a.positionAbs}}}),a.extend(a.ui.droppable,{version:"1.8.18"}),a.ui.intersect=function(b,c,d){if(!c.offset)return!1;var e=(b.positionAbs||b.position.absolute).left,f=e+b.helperProportions.width,g=(b.positionAbs||b.position.absolute).top,h=g+b.helperProportions.height,i=c.offset.left,j=i+c.proportions.width,k=c.offset.top,l=k+c.proportions.height;switch(d){case"fit":return i<=e&&f<=j&&k<=g&&h<=l;case"intersect":return i<e+b.helperProportions.width/2&&f-b.helperProportions.width/2<j&&k<g+b.helperProportions.height/2&&h-b.helperProportions.height/2<l;case"pointer":var m=(b.positionAbs||b.position.absolute).left+(b.clickOffset||b.offset.click).left,n=(b.positionAbs||b.position.absolute).top+(b.clickOffset||b.offset.click).top,o=a.ui.isOver(n,m,k,i,c.proportions.height,c.proportions.width);return o;case"touch":return(g>=k&&g<=l||h>=k&&h<=l||g<k&&h>l)&&(e>=i&&e<=j||f>=i&&f<=j||e<i&&f>j);default:return!1}},a.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(b,c){var d=a.ui.ddmanager.droppables[b.options.scope]||[],e=c?c.type:null,f=(b.currentItem||b.element).find(":data(droppable)").andSelf();droppablesLoop:for(var g=0;g<d.length;g++){if(d[g].options.disabled||b&&!d[g].accept.call(d[g].element[0],b.currentItem||b.element))continue;for(var h=0;h<f.length;h++)if(f[h]==d[g].element[0]){d[g].proportions.height=0;continue droppablesLoop}d[g].visible=d[g].element.css("display")!="none";if(!d[g].visible)continue;e=="mousedown"&&d[g]._activate.call(d[g],c),d[g].offset=d[g].element.offset(),d[g].proportions={width:d[g].element[0].offsetWidth,height:d[g].element[0].offsetHeight}}},drop:function(b,c){var d=!1;a.each(a.ui.ddmanager.droppables[b.options.scope]||[],function(){!this.options||(!this.options.disabled&&this.visible&&a.ui.intersect(b,this,this.options.tolerance)&&(d=this._drop.call(this,c)||d),!this.options.disabled&&this.visible&&this.accept.call(this.element[0],b.currentItem||b.element)&&(this.isout=1,this.isover=0,this._deactivate.call(this,c)))});return d},dragStart:function(b,c){b.element.parents(":not(body,html)").bind("scroll.droppable",function(){b.options.refreshPositions||a.ui.ddmanager.prepareOffsets(b,c)})},drag:function(b,c){b.options.refreshPositions&&a.ui.ddmanager.prepareOffsets(b,c),a.each(a.ui.ddmanager.droppables[b.options.scope]||[],function(){if(!(this.options.disabled||this.greedyChild||!this.visible)){var d=a.ui.intersect(b,this,this.options.tolerance),e=!d&&this.isover==1?"isout":d&&this.isover==0?"isover":null;if(!e)return;var f;if(this.options.greedy){var g=this.element.parents(":data(droppable):eq(0)");g.length&&(f=a.data(g[0],"droppable"),f.greedyChild=e=="isover"?1:0)}f&&e=="isover"&&(f.isover=0,f.isout=1,f._out.call(f,c)),this[e]=1,this[e=="isout"?"isover":"isout"]=0,this[e=="isover"?"_over":"_out"].call(this,c),f&&e=="isout"&&(f.isout=0,f.isover=1,f._over.call(f,c))}})},dragStop:function(b,c){b.element.parents(":not(body,html)").unbind("scroll.droppable"),b.options.refreshPositions||a.ui.ddmanager.prepareOffsets(b,c)}}})(jQuery);/*
+ * jQuery UI Resizable 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Resizables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */(function(a,b){a.widget("ui.resizable",a.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1e3},_create:function(){var b=this,c=this.options;this.element.addClass("ui-resizable"),a.extend(this,{_aspectRatio:!!c.aspectRatio,aspectRatio:c.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:c.helper||c.ghost||c.animate?c.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)&&(this.element.wrap(a('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("resizable",this.element.data("resizable")),this.elementIsWrapper=!0,this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")}),this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0}),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css({margin:this.originalElement.css("margin")}),this._proportionallyResize()),this.handles=c.handles||(a(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se");if(this.handles.constructor==String){this.handles=="all"&&(this.handles="n,e,s,w,se,sw,ne,nw");var d=this.handles.split(",");this.handles={};for(var e=0;e<d.length;e++){var f=a.trim(d[e]),g="ui-resizable-"+f,h=a('<div class="ui-resizable-handle '+g+'"></div>');/sw|se|ne|nw/.test(f)&&h.css({zIndex:++c.zIndex}),"se"==f&&h.addClass("ui-icon ui-icon-gripsmall-diagonal-se"),this.handles[f]=".ui-resizable-"+f,this.element.append(h)}}this._renderAxis=function(b){b=b||this.element;for(var c in this.handles){this.handles[c].constructor==String&&(this.handles[c]=a(this.handles[c],this.element).show());if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var d=a(this.handles[c],this.element),e=0;e=/sw|ne|nw|se|n|s/.test(c)?d.outerHeight():d.outerWidth();var f=["padding",/ne|nw|n/.test(c)?"Top":/se|sw|s/.test(c)?"Bottom":/^e$/.test(c)?"Right":"Left"].join("");b.css(f,e),this._proportionallyResize()}if(!a(this.handles[c]).length)continue}},this._renderAxis(this.element),this._handles=a(".ui-resizable-handle",this.element).disableSelection(),this._handles.mouseover(function(){if(!b.resizing){if(this.className)var a=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);b.axis=a&&a[1]?a[1]:"se"}}),c.autoHide&&(this._handles.hide(),a(this.element).addClass("ui-resizable-autohide").hover(function(){c.disabled||(a(this).removeClass("ui-resizable-autohide"),b._handles.show())},function(){c.disabled||b.resizing||(a(this).addClass("ui-resizable-autohide"),b._handles.hide())})),this._mouseInit()},destroy:function(){this._mouseDestroy();var b=function(b){a(b).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){b(this.element);var c=this.element;c.after(this.originalElement.css({position:c.css("position"),width:c.outerWidth(),height:c.outerHeight(),top:c.css("top"),left:c.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle),b(this.originalElement);return this},_mouseCapture:function(b){var c=!1;for(var d in this.handles)a(this.handles[d])[0]==b.target&&(c=!0);return!this.options.disabled&&c},_mouseStart:function(b){var d=this.options,e=this.element.position(),f=this.element;this.resizing=!0,this.documentScroll={top:a(document).scrollTop(),left:a(document).scrollLeft()},(f.is(".ui-draggable")||/absolute/.test(f.css("position")))&&f.css({position:"absolute",top:e.top,left:e.left}),this._renderProxy();var g=c(this.helper.css("left")),h=c(this.helper.css("top"));d.containment&&(g+=a(d.containment).scrollLeft()||0,h+=a(d.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:g,top:h},this.size=this._helper?{width:f.outerWidth(),height:f.outerHeight()}:{width:f.width(),height:f.height()},this.originalSize=this._helper?{width:f.outerWidth(),height:f.outerHeight()}:{width:f.width(),height:f.height()},this.originalPosition={left:g,top:h},this.sizeDiff={width:f.outerWidth()-f.width(),height:f.outerHeight()-f.height()},this.originalMousePosition={left:b.pageX,top:b.pageY},this.aspectRatio=typeof d.aspectRatio=="number"?d.aspectRatio:this.originalSize.width/this.originalSize.height||1;var i=a(".ui-resizable-"+this.axis).css("cursor");a("body").css("cursor",i=="auto"?this.axis+"-resize":i),f.addClass("ui-resizable-resizing"),this._propagate("start",b);return!0},_mouseDrag:function(b){var c=this.helper,d=this.options,e={},f=this,g=this.originalMousePosition,h=this.axis,i=b.pageX-g.left||0,j=b.pageY-g.top||0,k=this._change[h];if(!k)return!1;var l=k.apply(this,[b,i,j]),m=a.browser.msie&&a.browser.version<7,n=this.sizeDiff;this._updateVirtualBoundaries(b.shiftKey);if(this._aspectRatio||b.shiftKey)l=this._updateRatio(l,b);l=this._respectSize(l,b),this._propagate("resize",b),c.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"}),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),this._updateCache(l),this._trigger("resize",b,this.ui());return!1},_mouseStop:function(b){this.resizing=!1;var c=this.options,d=this;if(this._helper){var e=this._proportionallyResizeElements,f=e.length&&/textarea/i.test(e[0].nodeName),g=f&&a.ui.hasScroll(e[0],"left")?0:d.sizeDiff.height,h=f?0:d.sizeDiff.width,i={width:d.helper.width()-h,height:d.helper.height()-g},j=parseInt(d.element.css("left"),10)+(d.position.left-d.originalPosition.left)||null,k=parseInt(d.element.css("top"),10)+(d.position.top-d.originalPosition.top)||null;c.animate||this.element.css(a.extend(i,{top:k,left:j})),d.helper.height(d.size.height),d.helper.width(d.size.width),this._helper&&!c.animate&&this._proportionallyResize()}a("body").css("cursor","auto"),this.element.removeClass("ui-resizable-resizing"),this._propagate("stop",b),this._helper&&this.helper.remove();return!1},_updateVirtualBoundaries:function(a){var b=this.options,c,e,f,g,h;h={minWidth:d(b.minWidth)?b.minWidth:0,maxWidth:d(b.maxWidth)?b.maxWidth:Infinity,minHeight:d(b.minHeight)?b.minHeight:0,maxHeight:d(b.maxHeight)?b.maxHeight:Infinity};if(this._aspectRatio||a)c=h.minHeight*this.aspectRatio,f=h.minWidth/this.aspectRatio,e=h.maxHeight*this.aspectRatio,g=h.maxWidth/this.aspectRatio,c>h.minWidth&&(h.minWidth=c),f>h.minHeight&&(h.minHeight=f),e<h.maxWidth&&(h.maxWidth=e),g<h.maxHeight&&(h.maxHeight=g);this._vBoundaries=h},_updateCache:function(a){var b=this.options;this.offset=this.helper.offset(),d(a.left)&&(this.position.left=a.left),d(a.top)&&(this.position.top=a.top),d(a.height)&&(this.size.height=a.height),d(a.width)&&(this.size.width=a.width)},_updateRatio:function(a,b){var c=this.options,e=this.position,f=this.size,g=this.axis;d(a.height)?a.width=a.height*this.aspectRatio:d(a.width)&&(a.height=a.width/this.aspectRatio),g=="sw"&&(a.left=e.left+(f.width-a.width),a.top=null),g=="nw"&&(a.top=e.top+(f.height-a.height),a.left=e.left+(f.width-a.width));return a},_respectSize:function(a,b){var c=this.helper,e=this._vBoundaries,f=this._aspectRatio||b.shiftKey,g=this.axis,h=d(a.width)&&e.maxWidth&&e.maxWidth<a.width,i=d(a.height)&&e.maxHeight&&e.maxHeight<a.height,j=d(a.width)&&e.minWidth&&e.minWidth>a.width,k=d(a.height)&&e.minHeight&&e.minHeight>a.height;j&&(a.width=e.minWidth),k&&(a.height=e.minHeight),h&&(a.width=e.maxWidth),i&&(a.height=e.maxHeight);var l=this.originalPosition.left+this.originalSize.width,m=this.position.top+this.size.height,n=/sw|nw|w/.test(g),o=/nw|ne|n/.test(g);j&&n&&(a.left=l-e.minWidth),h&&n&&(a.left=l-e.maxWidth),k&&o&&(a.top=m-e.minHeight),i&&o&&(a.top=m-e.maxHeight);var p=!a.width&&!a.height;p&&!a.left&&a.top?a.top=null:p&&!a.top&&a.left&&(a.left=null);return a},_proportionallyResize:function(){var b=this.options;if(!!this._proportionallyResizeElements.length){var c=this.helper||this.element;for(var d=0;d<this._proportionallyResizeElements.length;d++){var e=this._proportionallyResizeElements[d];if(!this.borderDif){var f=[e.css("borderTopWidth"),e.css("borderRightWidth"),e.css("borderBottomWidth"),e.css("borderLeftWidth")],g=[e.css("paddingTop"),e.css("paddingRight"),e.css("paddingBottom"),e.css("paddingLeft")];this.borderDif=a.map(f,function(a,b){var c=parseInt(a,10)||0,d=parseInt(g[b],10)||0;return c+d})}if(a.browser.msie&&(!!a(c).is(":hidden")||!!a(c).parents(":hidden").length))continue;e.css({height:c.height()-this.borderDif[0]-this.borderDif[2]||0,width:c.width()-this.borderDif[1]-this.borderDif[3]||0})}}},_renderProxy:function(){var b=this.element,c=this.options;this.elementOffset=b.offset();if(this._helper){this.helper=this.helper||a('<div style="overflow:hidden;"></div>');var d=a.browser.msie&&a.browser.version<7,e=d?1:0,f=d?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+f,height:this.element.outerHeight()+f,position:"absolute",left:this.elementOffset.left-e+"px",top:this.elementOffset.top-e+"px",zIndex:++c.zIndex}),this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(a,b,c){return{width:this.originalSize.width+b}},w:function(a,b,c){var d=this.options,e=this.originalSize,f=this.originalPosition;return{left:f.left+b,width:e.width-b}},n:function(a,b,c){var d=this.options,e=this.originalSize,f=this.originalPosition;return{top:f.top+c,height:e.height-c}},s:function(a,b,c){return{height:this.originalSize.height+c}},se:function(b,c,d){return a.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,c,d]))},sw:function(b,c,d){return a.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,c,d]))},ne:function(b,c,d){return a.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[b,c,d]))},nw:function(b,c,d){return a.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,c,d]))}},_propagate:function(b,c){a.ui.plugin.call(this,b,[c,this.ui()]),b!="resize"&&this._trigger(b,c,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),a.extend(a.ui.resizable,{version:"1.8.18"}),a.ui.plugin.add("resizable","alsoResize",{start:function(b,c){var d=a(this).data("resizable"),e=d.options,f=function(b){a(b).each(function(){var b=a(this);b.data("resizable-alsoresize",{width:parseInt(b.width(),10),height:parseInt(b.height(),10),left:parseInt(b.css("left"),10),top:parseInt(b.css("top"),10)})})};typeof e.alsoResize=="object"&&!e.alsoResize.parentNode?e.alsoResize.length?(e.alsoResize=e.alsoResize[0],f(e.alsoResize)):a.each(e.alsoResize,function(a){f(a)}):f(e.alsoResize)},resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.originalSize,g=d.originalPosition,h={height:d.size.height-f.height||0,width:d.size.width-f.width||0,top:d.position.top-g.top||0,left:d.position.left-g.left||0},i=function(b,d){a(b).each(function(){var b=a(this),e=a(this).data("resizable-alsoresize"),f={},g=d&&d.length?d:b.parents(c.originalElement[0]).length?["width","height"]:["width","height","top","left"];a.each(g,function(a,b){var c=(e[b]||0)+(h[b]||0);c&&c>=0&&(f[b]=c||null)}),b.css(f)})};typeof e.alsoResize=="object"&&!e.alsoResize.nodeType?a.each(e.alsoResize,function(a,b){i(a,b)}):i(e.alsoResize)},stop:function(b,c){a(this).removeData("resizable-alsoresize")}}),a.ui.plugin.add("resizable","animate",{stop:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d._proportionallyResizeElements,g=f.length&&/textarea/i.test(f[0].nodeName),h=g&&a.ui.hasScroll(f[0],"left")?0:d.sizeDiff.height,i=g?0:d.sizeDiff.width,j={width:d.size.width-i,height:d.size.height-h},k=parseInt(d.element.css("left"),10)+(d.position.left-d.originalPosition.left)||null,l=parseInt(d.element.css("top"),10)+(d.position.top-d.originalPosition.top)||null;d.element.animate(a.extend(j,l&&k?{top:l,left:k}:{}),{duration:e.animateDuration,easing:e.animateEasing,step:function(){var c={width:parseInt(d.element.css("width"),10),height:parseInt(d.element.css("height"),10),top:parseInt(d.element.css("top"),10),left:parseInt(d.element.css("left"),10)};f&&f.length&&a(f[0]).css({width:c.width,height:c.height}),d._updateCache(c),d._propagate("resize",b)}})}}),a.ui.plugin.add("resizable","containment",{start:function(b,d){var e=a(this).data("resizable"),f=e.options,g=e.element,h=f.containment,i=h instanceof a?h.get(0):/parent/.test(h)?g.parent().get(0):h;if(!!i){e.containerElement=a(i);if(/document/.test(h)||h==document)e.containerOffset={left:0,top:0},e.containerPosition={left:0,top:0},e.parentData={element:a(document),left:0,top:0,width:a(document).width(),height:a(document).height()||document.body.parentNode.scrollHeight};else{var j=a(i),k=[];a(["Top","Right","Left","Bottom"]).each(function(a,b){k[a]=c(j.css("padding"+b))}),e.containerOffset=j.offset(),e.containerPosition=j.position(),e.containerSize={height:j.innerHeight()-k[3],width:j.innerWidth()-k[1]};var l=e.containerOffset,m=e.containerSize.height,n=e.containerSize.width,o=a.ui.hasScroll(i,"left")?i.scrollWidth:n,p=a.ui.hasScroll(i)?i.scrollHeight:m;e.parentData={element:i,left:l.left,top:l.top,width:o,height:p}}}},resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.containerSize,g=d.containerOffset,h=d.size,i=d.position,j=d._aspectRatio||b.shiftKey,k={top:0,left:0},l=d.containerElement;l[0]!=document&&/static/.test(l.css("position"))&&(k=g),i.left<(d._helper?g.left:0)&&(d.size.width=d.size.width+(d._helper?d.position.left-g.left:d.position.left-k.left),j&&(d.size.height=d.size.width/e.aspectRatio),d.position.left=e.helper?g.left:0),i.top<(d._helper?g.top:0)&&(d.size.height=d.size.height+(d._helper?d.position.top-g.top:d.position.top),j&&(d.size.width=d.size.height*e.aspectRatio),d.position.top=d._helper?g.top:0),d.offset.left=d.parentData.left+d.position.left,d.offset.top=d.parentData.top+d.position.top;var m=Math.abs((d._helper?d.offset.left-k.left:d.offset.left-k.left)+d.sizeDiff.width),n=Math.abs((d._helper?d.offset.top-k.top:d.offset.top-g.top)+d.sizeDiff.height),o=d.containerElement.get(0)==d.element.parent().get(0),p=/relative|absolute/.test(d.containerElement.css("position"));o&&p&&(m-=d.parentData.left),m+d.size.width>=d.parentData.width&&(d.size.width=d.parentData.width-m,j&&(d.size.height=d.size.width/d.aspectRatio)),n+d.size.height>=d.parentData.height&&(d.size.height=d.parentData.height-n,j&&(d.size.width=d.size.height*d.aspectRatio))},stop:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.position,g=d.containerOffset,h=d.containerPosition,i=d.containerElement,j=a(d.helper),k=j.offset(),l=j.outerWidth()-d.sizeDiff.width,m=j.outerHeight()-d.sizeDiff.height;d._helper&&!e.animate&&/relative/.test(i.css("position"))&&a(this).css({left:k.left-h.left-g.left,width:l,height:m}),d._helper&&!e.animate&&/static/.test(i.css("position"))&&a(this).css({left:k.left-h.left-g.left,width:l,height:m})}}),a.ui.plugin.add("resizable","ghost",{start:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.size;d.ghost=d.originalElement.clone(),d.ghost.css({opacity:.25,display:"block",position:"relative",height:f.height,width:f.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof e.ghost=="string"?e.ghost:""),d.ghost.appendTo(d.helper)},resize:function(b,c){var d=a(this).data("resizable"),e=d.options;d.ghost&&d.ghost.css({position:"relative",height:d.size.height,width:d.size.width})},stop:function(b,c){var d=a(this).data("resizable"),e=d.options;d.ghost&&d.helper&&d.helper.get(0).removeChild(d.ghost.get(0))}}),a.ui.plugin.add("resizable","grid",{resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.size,g=d.originalSize,h=d.originalPosition,i=d.axis,j=e._aspectRatio||b.shiftKey;e.grid=typeof e.grid=="number"?[e.grid,e.grid]:e.grid;var k=Math.round((f.width-g.width)/(e.grid[0]||1))*(e.grid[0]||1),l=Math.round((f.height-g.height)/(e.grid[1]||1))*(e.grid[1]||1);/^(se|s|e)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l):/^(ne)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l,d.position.top=h.top-l):/^(sw)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l,d.position.left=h.left-k):(d.size.width=g.width+k,d.size.height=g.height+l,d.position.top=h.top-l,d.position.left=h.left-k)}});var c=function(a){return parseInt(a,10)||0},d=function(a){return!isNaN(parseInt(a,10))}})(jQuery);/*
+ * jQuery UI Selectable 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Selectables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */(function(a,b){a.widget("ui.selectable",a.ui.mouse,{options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch"},_create:function(){var b=this;this.element.addClass("ui-selectable"),this.dragged=!1;var c;this.refresh=function(){c=a(b.options.filter,b.element[0]),c.addClass("ui-selectee"),c.each(function(){var b=a(this),c=b.offset();a.data(this,"selectable-item",{element:this,$element:b,left:c.left,top:c.top,right:c.left+b.outerWidth(),bottom:c.top+b.outerHeight(),startselected:!1,selected:b.hasClass("ui-selected"),selecting:b.hasClass("ui-selecting"),unselecting:b.hasClass("ui-unselecting")})})},this.refresh(),this.selectees=c.addClass("ui-selectee"),this._mouseInit(),this.helper=a("<div class='ui-selectable-helper'></div>")},destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item"),this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable"),this._mouseDestroy();return this},_mouseStart:function(b){var c=this;this.opos=[b.pageX,b.pageY];if(!this.options.disabled){var d=this.options;this.selectees=a(d.filter,this.element[0]),this._trigger("start",b),a(d.appendTo).append(this.helper),this.helper.css({left:b.clientX,top:b.clientY,width:0,height:0}),d.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var d=a.data(this,"selectable-item");d.startselected=!0,!b.metaKey&&!b.ctrlKey&&(d.$element.removeClass("ui-selected"),d.selected=!1,d.$element.addClass("ui-unselecting"),d.unselecting=!0,c._trigger("unselecting",b,{unselecting:d.element}))}),a(b.target).parents().andSelf().each(function(){var d=a.data(this,"selectable-item");if(d){var e=!b.metaKey&&!b.ctrlKey||!d.$element.hasClass("ui-selected");d.$element.removeClass(e?"ui-unselecting":"ui-selected").addClass(e?"ui-selecting":"ui-unselecting"),d.unselecting=!e,d.selecting=e,d.selected=e,e?c._trigger("selecting",b,{selecting:d.element}):c._trigger("unselecting",b,{unselecting:d.element});return!1}})}},_mouseDrag:function(b){var c=this;this.dragged=!0;if(!this.options.disabled){var d=this.options,e=this.opos[0],f=this.opos[1],g=b.pageX,h=b.pageY;if(e>g){var i=g;g=e,e=i}if(f>h){var i=h;h=f,f=i}this.helper.css({left:e,top:f,width:g-e,height:h-f}),this.selectees.each(function(){var i=a.data(this,"selectable-item");if(!!i&&i.element!=c.element[0]){var j=!1;d.tolerance=="touch"?j=!(i.left>g||i.right<e||i.top>h||i.bottom<f):d.tolerance=="fit"&&(j=i.left>e&&i.right<g&&i.top>f&&i.bottom<h),j?(i.selected&&(i.$element.removeClass("ui-selected"),i.selected=!1),i.unselecting&&(i.$element.removeClass("ui-unselecting"),i.unselecting=!1),i.selecting||(i.$element.addClass("ui-selecting"),i.selecting=!0,c._trigger("selecting",b,{selecting:i.element}))):(i.selecting&&((b.metaKey||b.ctrlKey)&&i.startselected?(i.$element.removeClass("ui-selecting"),i.selecting=!1,i.$element.addClass("ui-selected"),i.selected=!0):(i.$element.removeClass("ui-selecting"),i.selecting=!1,i.startselected&&(i.$element.addClass("ui-unselecting"),i.unselecting=!0),c._trigger("unselecting",b,{unselecting:i.element}))),i.selected&&!b.metaKey&&!b.ctrlKey&&!i.startselected&&(i.$element.removeClass("ui-selected"),i.selected=!1,i.$element.addClass("ui-unselecting"),i.unselecting=!0,c._trigger("unselecting",b,{unselecting:i.element})))}});return!1}},_mouseStop:function(b){var c=this;this.dragged=!1;var d=this.options;a(".ui-unselecting",this.element[0]).each(function(){var d=a.data(this,"selectable-item");d.$element.removeClass("ui-unselecting"),d.unselecting=!1,d.startselected=!1,c._trigger("unselected",b,{unselected:d.element})}),a(".ui-selecting",this.element[0]).each(function(){var d=a.data(this,"selectable-item");d.$element.removeClass("ui-selecting").addClass("ui-selected"),d.selecting=!1,d.selected=!0,d.startselected=!0,c._trigger("selected",b,{selected:d.element})}),this._trigger("stop",b),this.helper.remove();return!1}}),a.extend(a.ui.selectable,{version:"1.8.18"})})(jQuery);/*
+ * jQuery UI Sortable 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Sortables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */(function(a,b){a.widget("ui.sortable",a.ui.mouse,{widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3},_create:function(){var a=this.options;this.containerCache={},this.element.addClass("ui-sortable"),this.refresh(),this.floating=this.items.length?a.axis==="x"||/left|right/.test(this.items[0].item.css("float"))||/inline|table-cell/.test(this.items[0].item.css("display")):!1,this.offset=this.element.offset(),this._mouseInit(),this.ready=!0},destroy:function(){a.Widget.prototype.destroy.call(this),this.element.removeClass("ui-sortable ui-sortable-disabled"),this._mouseDestroy();for(var b=this.items.length-1;b>=0;b--)this.items[b].item.removeData(this.widgetName+"-item");return this},_setOption:function(b,c){b==="disabled"?(this.options[b]=c,this.widget()[c?"addClass":"removeClass"]("ui-sortable-disabled")):a.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(b,c){var d=this;if(this.reverting)return!1;if(this.options.disabled||this.options.type=="static")return!1;this._refreshItems(b);var e=null,f=this,g=a(b.target).parents().each(function(){if(a.data(this,d.widgetName+"-item")==f){e=a(this);return!1}});a.data(b.target,d.widgetName+"-item")==f&&(e=a(b.target));if(!e)return!1;if(this.options.handle&&!c){var h=!1;a(this.options.handle,e).find("*").andSelf().each(function(){this==b.target&&(h=!0)});if(!h)return!1}this.currentItem=e,this._removeCurrentsFromItems();return!0},_mouseStart:function(b,c,d){var e=this.options,f=this;this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(b),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),a.extend(this.offset,{click:{left:b.pageX-this.offset.left,top:b.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.originalPosition=this._generatePosition(b),this.originalPageX=b.pageX,this.originalPageY=b.pageY,e.cursorAt&&this._adjustOffsetFromHelper(e.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!=this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),e.containment&&this._setContainment(),e.cursor&&(a("body").css("cursor")&&(this._storedCursor=a("body").css("cursor")),a("body").css("cursor",e.cursor)),e.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",e.opacity)),e.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",e.zIndex)),this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",b,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions();if(!d)for(var g=this.containers.length-1;g>=0;g--)this.containers[g]._trigger("activate",b,f._uiHash(this));a.ui.ddmanager&&(a.ui.ddmanager.current=this),a.ui.ddmanager&&!e.dropBehaviour&&a.ui.ddmanager.prepareOffsets(this,b),this.dragging=!0,this.helper.addClass("ui-sortable-helper"),this._mouseDrag(b);return!0},_mouseDrag:function(b){this.position=this._generatePosition(b),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs);if(this.options.scroll){var c=this.options,d=!1;this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-b.pageY<c.scrollSensitivity?this.scrollParent[0].scrollTop=d=this.scrollParent[0].scrollTop+c.scrollSpeed:b.pageY-this.overflowOffset.top<c.scrollSensitivity&&(this.scrollParent[0].scrollTop=d=this.scrollParent[0].scrollTop-c.scrollSpeed),this.overflowOffset.left+this.scrollParent[0].offsetWidth-b.pageX<c.scrollSensitivity?this.scrollParent[0].scrollLeft=d=this.scrollParent[0].scrollLeft+c.scrollSpeed:b.pageX-this.overflowOffset.left<c.scrollSensitivity&&(this.scrollParent[0].scrollLeft=d=this.scrollParent[0].scrollLeft-c.scrollSpeed)):(b.pageY-a(document).scrollTop()<c.scrollSensitivity?d=a(document).scrollTop(a(document).scrollTop()-c.scrollSpeed):a(window).height()-(b.pageY-a(document).scrollTop())<c.scrollSensitivity&&(d=a(document).scrollTop(a(document).scrollTop()+c.scrollSpeed)),b.pageX-a(document).scrollLeft()<c.scrollSensitivity?d=a(document).scrollLeft(a(document).scrollLeft()-c.scrollSpeed):a(window).width()-(b.pageX-a(document).scrollLeft())<c.scrollSensitivity&&(d=a(document).scrollLeft(a(document).scrollLeft()+c.scrollSpeed))),d!==!1&&a.ui.ddmanager&&!c.dropBehaviour&&a.ui.ddmanager.prepareOffsets(this,b)}this.positionAbs=this._convertPositionTo("absolute");if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";for(var e=this.items.length-1;e>=0;e--){var f=this.items[e],g=f.item[0],h=this._intersectsWithPointer(f);if(!h)continue;if(g!=this.currentItem[0]&&this.placeholder[h==1?"next":"prev"]()[0]!=g&&!a.ui.contains(this.placeholder[0],g)&&(this.options.type=="semi-dynamic"?!a.ui.contains(this.element[0],g):!0)){this.direction=h==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(f))this._rearrange(b,f);else break;this._trigger("change",b,this._uiHash());break}}this._contactContainers(b),a.ui.ddmanager&&a.ui.ddmanager.drag(this,b),this._trigger("sort",b,this._uiHash()),this.lastPositionAbs=this.positionAbs;return!1},_mouseStop:function(b,c){if(!!b){a.ui.ddmanager&&!this.options.dropBehaviour&&a.ui.ddmanager.drop(this,b);if(this.options.revert){var d=this,e=d.placeholder.offset();d.reverting=!0,a(this.helper).animate({left:e.left-this.offset.parent.left-d.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:e.top-this.offset.parent.top-d.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){d._clear(b)})}else this._clear(b,c);return!1}},cancel:function(){var b=this;if(this.dragging){this._mouseUp({target:null}),this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var c=this.containers.length-1;c>=0;c--)this.containers[c]._trigger("deactivate",null,b._uiHash(this)),this.containers[c].containerCache.over&&(this.containers[c]._trigger("out",null,b._uiHash(this)),this.containers[c].containerCache.over=0)}this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),a.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?a(this.domPosition.prev).after(this.currentItem):a(this.domPosition.parent).prepend(this.currentItem));return this},serialize:function(b){var c=this._getItemsAsjQuery(b&&b.connected),d=[];b=b||{},a(c).each(function(){var c=(a(b.item||this).attr(b.attribute||"id")||"").match(b.expression||/(.+)[-=_](.+)/);c&&d.push((b.key||c[1]+"[]")+"="+(b.key&&b.expression?c[1]:c[2]))}),!d.length&&b.key&&d.push(b.key+"=");return d.join("&")},toArray:function(b){var c=this._getItemsAsjQuery(b&&b.connected),d=[];b=b||{},c.each(function(){d.push(a(b.item||this).attr(b.attribute||"id")||"")});return d},_intersectsWith:function(a){var b=this.positionAbs.left,c=b+this.helperProportions.width,d=this.positionAbs.top,e=d+this.helperProportions.height,f=a.left,g=f+a.width,h=a.top,i=h+a.height,j=this.offset.click.top,k=this.offset.click.left,l=d+j>h&&d+j<i&&b+k>f&&b+k<g;return this.options.tolerance=="pointer"||this.options.forcePointerForContainers||this.options.tolerance!="pointer"&&this.helperProportions[this.floating?"width":"height"]>a[this.floating?"width":"height"]?l:f<b+this.helperProportions.width/2&&c-this.helperProportions.width/2<g&&h<d+this.helperProportions.height/2&&e-this.helperProportions.height/2<i},_intersectsWithPointer:function(b){var c=a.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,b.top,b.height),d=a.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,b.left,b.width),e=c&&d,f=this._getDragVerticalDirection(),g=this._getDragHorizontalDirection();if(!e)return!1;return this.floating?g&&g=="right"||f=="down"?2:1:f&&(f=="down"?2:1)},_intersectsWithSides:function(b){var c=a.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,b.top+b.height/2,b.height),d=a.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,b.left+b.width/2,b.width),e=this._getDragVerticalDirection(),f=this._getDragHorizontalDirection();return this.floating&&f?f=="right"&&d||f=="left"&&!d:e&&(e=="down"&&c||e=="up"&&!c)},_getDragVerticalDirection:function(){var a=this.positionAbs.top-this.lastPositionAbs.top;return a!=0&&(a>0?"down":"up")},_getDragHorizontalDirection:function(){var a=this.positionAbs.left-this.lastPositionAbs.left;return a!=0&&(a>0?"right":"left")},refresh:function(a){this._refreshItems(a),this.refreshPositions();return this},_connectWith:function(){var a=this.options;return a.connectWith.constructor==String?[a.connectWith]:a.connectWith},_getItemsAsjQuery:function(b){var c=this,d=[],e=[],f=this._connectWith();if(f&&b)for(var g=f.length-1;g>=0;g--){var h=a(f[g]);for(var i=h.length-1;i>=0;i--){var j=a.data(h[i],this.widgetName);j&&j!=this&&!j.options.disabled&&e.push([a.isFunction(j.options.items)?j.options.items.call(j.element):a(j.options.items,j.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),j])}}e.push([a.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):a(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]);for(var g=e.length-1;g>=0;g--)e[g][0].each(function(){d.push(this)});return a(d)},_removeCurrentsFromItems:function(){var a=this.currentItem.find(":data("+this.widgetName+"-item)");for(var b=0;b<this.items.length;b++)for(var c=0;c<a.length;c++)a[c]==this.items[b].item[0]&&this.items.splice(b,1)},_refreshItems:function(b){this.items=[],this.containers=[this];var c=this.items,d=this,e=[[a.isFunction(this.options.items)?this.options.items.call(this.element[0],b,{item:this.currentItem}):a(this.options.items,this.element),this]],f=this._connectWith();if(f&&this.ready)for(var g=f.length-1;g>=0;g--){var h=a(f[g]);for(var i=h.length-1;i>=0;i--){var j=a.data(h[i],this.widgetName);j&&j!=this&&!j.options.disabled&&(e.push([a.isFunction(j.options.items)?j.options.items.call(j.element[0],b,{item:this.currentItem}):a(j.options.items,j.element),j]),this.containers.push(j))}}for(var g=e.length-1;g>=0;g--){var k=e[g][1],l=e[g][0];for(var i=0,m=l.length;i<m;i++){var n=a(l[i]);n.data(this.widgetName+"-item",k),c.push({item:n,instance:k,width:0,height:0,left:0,top:0})}}},refreshPositions:function(b){this.offsetParent&&this.helper&&(this.offset.parent=this._getParentOffset());for(var c=this.items.length-1;c>=0;c--){var d=this.items[c];if(d.instance!=this.currentContainer&&this.currentContainer&&d.item[0]!=this.currentItem[0])continue;var e=this.options.toleranceElement?a(this.options.toleranceElement,d.item):d.item;b||(d.width=e.outerWidth(),d.height=e.outerHeight());var f=e.offset();d.left=f.left,d.top=f.top}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(var c=this.containers.length-1;c>=0;c--){var f=this.containers[c].element.offset();this.containers[c].containerCache.left=f.left,this.containers[c].containerCache.top=f.top,this.containers[c].containerCache.width=this.containers[c].element.outerWidth(),this.containers[c].containerCache.height=this.containers[c].element.outerHeight()}return this},_createPlaceholder:function(b){var c=b||this,d=c.options;if(!d.placeholder||d.placeholder.constructor==String){var e=d.placeholder;d.placeholder={element:function(){var b=a(document.createElement(c.currentItem[0].nodeName)).addClass(e||c.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];e||(b.style.visibility="hidden");return b},update:function(a,b){if(!e||!!d.forcePlaceholderSize)b.height()||b.height(c.currentItem.innerHeight()-parseInt(c.currentItem.css("paddingTop")||0,10)-parseInt(c.currentItem.css("paddingBottom")||0,10)),b.width()||b.width(c.currentItem.innerWidth()-parseInt(c.currentItem.css("paddingLeft")||0,10)-parseInt(c.currentItem.css("paddingRight")||0,10))}}}c.placeholder=a(d.placeholder.element.call(c.element,c.currentItem)),c.currentItem.after(c.placeholder),d.placeholder.update(c,c.placeholder)},_contactContainers:function(b){var c=null,d=null;for(var e=this.containers.length-1;e>=0;e--){if(a.ui.contains(this.currentItem[0],this.containers[e].element[0]))continue;if(this._intersectsWith(this.containers[e].containerCache)){if(c&&a.ui.contains(this.containers[e].element[0],c.element[0]))continue;c=this.containers[e],d=e}else this.containers[e].containerCache.over&&(this.containers[e]._trigger("out",b,this._uiHash(this)),this.containers[e].containerCache.over=0)}if(!!c)if(this.containers.length===1)this.containers[d]._trigger("over",b,this._uiHash(this)),this.containers[d].containerCache.over=1;else if(this.currentContainer!=this.containers[d]){var f=1e4,g=null,h=this.positionAbs[this.containers[d].floating?"left":"top"];for(var i=this.items.length-1;i>=0;i--){if(!a.ui.contains(this.containers[d].element[0],this.items[i].item[0]))continue;var j=this.items[i][this.containers[d].floating?"left":"top"];Math.abs(j-h)<f&&(f=Math.abs(j-h),g=this.items[i])}if(!g&&!this.options.dropOnEmpty)return;this.currentContainer=this.containers[d],g?this._rearrange(b,g,null,!0):this._rearrange(b,null,this.containers[d].element,!0),this._trigger("change",b,this._uiHash()),this.containers[d]._trigger("change",b,this._uiHash(this)),this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[d]._trigger("over",b,this._uiHash(this)),this.containers[d].containerCache.over=1}},_createHelper:function(b){var c=this.options,d=a.isFunction(c.helper)?a(c.helper.apply(this.element[0],[b,this.currentItem])):c.helper=="clone"?this.currentItem.clone():this.currentItem;d.parents("body").length||a(c.appendTo!="parent"?c.appendTo:this.currentItem[0].parentNode)[0].appendChild(d[0]),d[0]==this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(d[0].style.width==""||c.forceHelperSize)&&d.width(this.currentItem.width()),(d[0].style.height==""||c.forceHelperSize)&&d.height(this.currentItem.height());return d},_adjustOffsetFromHelper:function(b){typeof b=="string"&&(b=b.split(" ")),a.isArray(b)&&(b={left:+b[0],top:+b[1]||0}),"left"in b&&(this.offset.click.left=b.left+this.margins.left),"right"in b&&(this.offset.click.left=this.helperProportions.width-b.right+this.margins.left),"top"in b&&(this.offset.click.top=b.top+this.margins.top),"bottom"in b&&(this.offset.click.top=this.helperProportions.height-b.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var b=this.offsetParent.offset();this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0])&&(b.left+=this.scrollParent.scrollLeft(),b.top+=this.scrollParent.scrollTop());if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&a.browser.msie)b={top:0,left:0};return{top:b.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:b.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.currentItem.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var b=this.options;b.containment=="parent"&&(b.containment=this.helper[0].parentNode);if(b.containment=="document"||b.containment=="window")this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,a(b.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(a(b.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(b.containment)){var c=a(b.containment)[0],d=a(b.containment).offset(),e=a(c).css("overflow")!="hidden";this.containment=[d.left+(parseInt(a(c).css("borderLeftWidth"),10)||0)+(parseInt(a(c).css("paddingLeft"),10)||0)-this.margins.left,d.top+(parseInt(a(c).css("borderTopWidth"),10)||0)+(parseInt(a(c).css("paddingTop"),10)||0)-this.margins.top,d.left+(e?Math.max(c.scrollWidth,c.offsetWidth):c.offsetWidth)-(parseInt(a(c).css("borderLeftWidth"),10)||0)-(parseInt(a(c).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,d.top+(e?Math.max(c.scrollHeight,c.offsetHeight):c.offsetHeight)-(parseInt(a(c).css("borderTopWidth"),10)||0)-(parseInt(a(c).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}},_convertPositionTo:function(b,c){c||(c=this.position);var d=b=="absolute"?1:-1,e=this.options,f=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,g=/(html|body)/i.test(f[0].tagName);return{top:c.top+this.offset.relative.top*d+this.offset.parent.top*d-(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():g?0:f.scrollTop())*d),left:c.left+this.offset.relative.left*d+this.offset.parent.left*d-(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():g?0:f.scrollLeft())*d)}},_generatePosition:function(b){var c=this.options,d=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(d[0].tagName);this.cssPosition=="relative"&&(this.scrollParent[0]==document||this.scrollParent[0]==this.offsetParent[0])&&(this.offset.relative=this._getRelativeOffset());var f=b.pageX,g=b.pageY;if(this.originalPosition){this.containment&&(b.pageX-this.offset.click.left<this.containment[0]&&(f=this.containment[0]+this.offset.click.left),b.pageY-this.offset.click.top<this.containment[1]&&(g=this.containment[1]+this.offset.click.top),b.pageX-this.offset.click.left>this.containment[2]&&(f=this.containment[2]+this.offset.click.left),b.pageY-this.offset.click.top>this.containment[3]&&(g=this.containment[3]+this.offset.click.top));if(c.grid){var h=this.originalPageY+Math.round((g-this.originalPageY)/c.grid[1])*c.grid[1];g=this.containment?h-this.offset.click.top<this.containment[1]||h-this.offset.click.top>this.containment[3]?h-this.offset.click.top<this.containment[1]?h+c.grid[1]:h-c.grid[1]:h:h;var i=this.originalPageX+Math.round((f-this.originalPageX)/c.grid[0])*c.grid[0];f=this.containment?i-this.offset.click.left<this.containment[0]||i-this.offset.click.left>this.containment[2]?i-this.offset.click.left<this.containment[0]?i+c.grid[0]:i-c.grid[0]:i:i}}return{top:g-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(a.browser.safari&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():e?0:d.scrollTop()),left:f-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(a.browser.safari&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():e?0:d.scrollLeft())}},_rearrange:function(a,b,c,d){c?c[0].appendChild(this.placeholder[0]):b.item[0].parentNode.insertBefore(this.placeholder[0],this.direction=="down"?b.item[0]:b.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var e=this,f=this.counter;window.setTimeout(function(){f==e.counter&&e.refreshPositions(!d)},0)},_clear:function(b,c){this.reverting=!1;var d=[],e=this;!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null;if(this.helper[0]==this.currentItem[0]){for(var f in this._storedCSS)if(this._storedCSS[f]=="auto"||this._storedCSS[f]=="static")this._storedCSS[f]="";this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();this.fromOutside&&!c&&d.push(function(a){this._trigger("receive",a,this._uiHash(this.fromOutside))}),(this.fromOutside||this.domPosition.prev!=this.currentItem.prev().not(".ui-sortable-helper")[0]||this.domPosition.parent!=this.currentItem.parent()[0])&&!c&&d.push(function(a){this._trigger("update",a,this._uiHash())});if(!a.ui.contains(this.element[0],this.currentItem[0])){c||d.push(function(a){this._trigger("remove",a,this._uiHash())});for(var f=this.containers.length-1;f>=0;f--)a.ui.contains(this.containers[f].element[0],this.currentItem[0])&&!c&&(d.push(function(a){return function(b){a._trigger("receive",b,this._uiHash(this))}}.call(this,this.containers[f])),d.push(function(a){return function(b){a._trigger("update",b,this._uiHash(this))}}.call(this,this.containers[f])))}for(var f=this.containers.length-1;f>=0;f--)c||d.push(function(a){return function(b){a._trigger("deactivate",b,this._uiHash(this))}}.call(this,this.containers[f])),this.containers[f].containerCache.over&&(d.push(function(a){return function(b){a._trigger("out",b,this._uiHash(this))}}.call(this,this.containers[f])),this.containers[f].containerCache.over=0);this._storedCursor&&a("body").css("cursor",this._storedCursor),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex),this.dragging=!1;if(this.cancelHelperRemoval){if(!c){this._trigger("beforeStop",b,this._uiHash());for(var f=0;f<d.length;f++)d[f].call(this,b);this._trigger("stop",b,this._uiHash())}return!1}c||this._trigger("beforeStop",b,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.helper[0]!=this.currentItem[0]&&this.helper.remove(),this.helper=null;if(!c){for(var f=0;f<d.length;f++)d[f].call(this,b);this._trigger("stop",b,this._uiHash())}this.fromOutside=!1;return!0},_trigger:function(){a.Widget.prototype._trigger.apply(this,arguments)===!1&&this.cancel()},_uiHash:function(b){var c=b||this;return{helper:c.helper,placeholder:c.placeholder||a([]),position:c.position,originalPosition:c.originalPosition,offset:c.positionAbs,item:c.currentItem,sender:b?b.element:null}}}),a.extend(a.ui.sortable,{version:"1.8.18"})})(jQuery);/*
+ * jQuery UI Accordion 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Accordion
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ */(function(a,b){a.widget("ui.accordion",{options:{active:0,animated:"slide",autoHeight:!0,clearStyle:!1,collapsible:!1,event:"click",fillSpace:!1,header:"> li > :first-child,> :not(li):even",icons:{header:"ui-icon-triangle-1-e",headerSelected:"ui-icon-triangle-1-s"},navigation:!1,navigationFilter:function(){return this.href.toLowerCase()===location.href.toLowerCase()}},_create:function(){var b=this,c=b.options;b.running=0,b.element.addClass("ui-accordion ui-widget ui-helper-reset").children("li").addClass("ui-accordion-li-fix"),b.headers=b.element.find(c.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all").bind("mouseenter.accordion",function(){c.disabled||a(this).addClass("ui-state-hover")}).bind("mouseleave.accordion",function(){c.disabled||a(this).removeClass("ui-state-hover")}).bind("focus.accordion",function(){c.disabled||a(this).addClass("ui-state-focus")}).bind("blur.accordion",function(){c.disabled||a(this).removeClass("ui-state-focus")}),b.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom");if(c.navigation){var d=b.element.find("a").filter(c.navigationFilter).eq(0);if(d.length){var e=d.closest(".ui-accordion-header");e.length?b.active=e:b.active=d.closest(".ui-accordion-content").prev()}}b.active=b._findActive(b.active||c.active).addClass("ui-state-default ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top"),b.active.next().addClass("ui-accordion-content-active"),b._createIcons(),b.resize(),b.element.attr("role","tablist"),b.headers.attr("role","tab").bind("keydown.accordion",function(a){return b._keydown(a)}).next().attr("role","tabpanel"),b.headers.not(b.active||"").attr({"aria-expanded":"false","aria-selected":"false",tabIndex:-1}).next().hide(),b.active.length?b.active.attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}):b.headers.eq(0).attr("tabIndex",0),a.browser.safari||b.headers.find("a").attr("tabIndex",-1),c.event&&b.headers.bind(c.event.split(" ").join(".accordion ")+".accordion",function(a){b._clickHandler.call(b,a,this),a.preventDefault()})},_createIcons:function(){var b=this.options;b.icons&&(a("<span></span>").addClass("ui-icon "+b.icons.header).prependTo(this.headers),this.active.children(".ui-icon").toggleClass(b.icons.header).toggleClass(b.icons.headerSelected),this.element.addClass("ui-accordion-icons"))},_destroyIcons:function(){this.headers.children(".ui-icon").remove(),this.element.removeClass("ui-accordion-icons")},destroy:function(){var b=this.options;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role"),this.headers.unbind(".accordion").removeClass("ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-selected").removeAttr("tabIndex"),this.headers.find("a").removeAttr("tabIndex"),this._destroyIcons();var c=this.headers.next().css("display","").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-accordion-disabled ui-state-disabled");(b.autoHeight||b.fillHeight)&&c.css("height","");return a.Widget.prototype.destroy.call(this)},_setOption:function(b,c){a.Widget.prototype._setOption.apply(this,arguments),b=="active"&&this.activate(c),b=="icons"&&(this._destroyIcons(),c&&this._createIcons()),b=="disabled"&&this.headers.add(this.headers.next())[c?"addClass":"removeClass"]("ui-accordion-disabled ui-state-disabled")},_keydown:function(b){if(!(this.options.disabled||b.altKey||b.ctrlKey)){var c=a.ui.keyCode,d=this.headers.length,e=this.headers.index(b.target),f=!1;switch(b.keyCode){case c.RIGHT:case c.DOWN:f=this.headers[(e+1)%d];break;case c.LEFT:case c.UP:f=this.headers[(e-1+d)%d];break;case c.SPACE:case c.ENTER:this._clickHandler({target:b.target},b.target),b.preventDefault()}if(f){a(b.target).attr("tabIndex",-1),a(f).attr("tabIndex",0),f.focus();return!1}return!0}},resize:function(){var b=this.options,c;if(b.fillSpace){if(a.browser.msie){var d=this.element.parent().css("overflow");this.element.parent().css("overflow","hidden")}c=this.element.parent().height(),a.browser.msie&&this.element.parent().css("overflow",d),this.headers.each(function(){c-=a(this).outerHeight(!0)}),this.headers.next().each(function(){a(this).height(Math.max(0,c-a(this).innerHeight()+a(this).height()))}).css("overflow","auto")}else b.autoHeight&&(c=0,this.headers.next().each(function(){c=Math.max(c,a(this).height("").height())}).height(c));return this},activate:function(a){this.options.active=a;var b=this._findActive(a)[0];this._clickHandler({target:b},b);return this},_findActive:function(b){return b?typeof b=="number"?this.headers.filter(":eq("+b+")"):this.headers.not(this.headers.not(b)):b===!1?a([]):this.headers.filter(":eq(0)")},_clickHandler:function(b,c){var d=this.options;if(!d.disabled){if(!b.target){if(!d.collapsible)return;this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header),this.active.next().addClass("ui-accordion-content-active");var e=this.active.next(),f={options:d,newHeader:a([]),oldHeader:d.active,newContent:a([]),oldContent:e},g=this.active=a([]);this._toggle(g,e,f);return}var h=a(b.currentTarget||c),i=h[0]===this.active[0];d.active=d.collapsible&&i?!1:this.headers.index(h);if(this.running||!d.collapsible&&i)return;var j=this.active,g=h.next(),e=this.active.next(),f={options:d,newHeader:i&&d.collapsible?a([]):h,oldHeader:this.active,newContent:i&&d.collapsible?a([]):g,oldContent:e},k=this.headers.index(this.active[0])>this.headers.index(h[0]);this.active=i?a([]):h,this._toggle(g,e,f,i,k),j.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header),i||(h.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top").children(".ui-icon").removeClass(d.icons.header).addClass(d.icons.headerSelected),h.next().addClass("ui-accordion-content-active"));return}},_toggle:function(b,c,d,e,f){var g=this,h=g.options;g.toShow=b,g.toHide=c,g.data=d;var i=function(){if(!!g)return g._completed.apply(g,arguments)};g._trigger("changestart",null,g.data),g.running=c.size()===0?b.size():c.size();if(h.animated){var j={};h.collapsible&&e?j={toShow:a([]),toHide:c,complete:i,down:f,autoHeight:h.autoHeight||h.fillSpace}:j={toShow:b,toHide:c,complete:i,down:f,autoHeight:h.autoHeight||h.fillSpace},h.proxied||(h.proxied=h.animated),h.proxiedDuration||(h.proxiedDuration=h.duration),h.animated=a.isFunction(h.proxied)?h.proxied(j):h.proxied,h.duration=a.isFunction(h.proxiedDuration)?h.proxiedDuration(j):h.proxiedDuration;var k=a.ui.accordion.animations,l=h.duration,m=h.animated;m&&!k[m]&&!a.easing[m]&&(m="slide"),k[m]||(k[m]=function(a){this.slide(a,{easing:m,duration:l||700})}),k[m](j)}else h.collapsible&&e?b.toggle():(c.hide(),b.show()),i(!0);c.prev().attr({"aria-expanded":"false","aria-selected":"false",tabIndex:-1}).blur(),b.prev().attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}).focus()},_completed:function(a){this.running=a?0:--this.running;this.running||(this.options.clearStyle&&this.toShow.add(this.toHide).css({height:"",overflow:""}),this.toHide.removeClass("ui-accordion-content-active"),this.toHide.length&&(this.toHide.parent()[0].className=this.toHide.parent()[0].className),this._trigger("change",null,this.data))}}),a.extend(a.ui.accordion,{version:"1.8.18",animations:{slide:function(b,c){b=a.extend({easing:"swing",duration:300},b,c);if(!b.toHide.size())b.toShow.animate({height:"show",paddingTop:"show",paddingBottom:"show"},b);else{if(!b.toShow.size()){b.toHide.animate({height:"hide",paddingTop:"hide",paddingBottom:"hide"},b);return}var d=b.toShow.css("overflow"),e=0,f={},g={},h=["height","paddingTop","paddingBottom"],i,j=b.toShow;i=j[0].style.width,j.width(j.parent().width()-parseFloat(j.css("paddingLeft"))-parseFloat(j.css("paddingRight"))-(parseFloat(j.css("borderLeftWidth"))||0)-(parseFloat(j.css("borderRightWidth"))||0)),a.each(h,function(c,d){g[d]="hide";var e=(""+a.css(b.toShow[0],d)).match(/^([\d+-.]+)(.*)$/);f[d]={value:e[1],unit:e[2]||"px"}}),b.toShow.css({height:0,overflow:"hidden"}).show(),b.toHide.filter(":hidden").each(b.complete).end().filter(":visible").animate(g,{step:function(a,c){c.prop=="height"&&(e=c.end-c.start===0?0:(c.now-c.start)/(c.end-c.start)),b.toShow[0].style[c.prop]=e*f[c.prop].value+f[c.prop].unit},duration:b.duration,easing:b.easing,complete:function(){b.autoHeight||b.toShow.css("height",""),b.toShow.css({width:i,overflow:d}),b.complete()}})}},bounceslide:function(a){this.slide(a,{easing:a.down?"easeOutBounce":"swing",duration:a.down?1e3:200})}}})})(jQuery);/*
+ * jQuery UI Autocomplete 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Autocomplete
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ *	jquery.ui.position.js
+ */(function(a,b){var c=0;a.widget("ui.autocomplete",{options:{appendTo:"body",autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null},pending:0,_create:function(){var b=this,c=this.element[0].ownerDocument,d;this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(c){if(!b.options.disabled&&!b.element.propAttr("readOnly")){d=!1;var e=a.ui.keyCode;switch(c.keyCode){case e.PAGE_UP:b._move("previousPage",c);break;case e.PAGE_DOWN:b._move("nextPage",c);break;case e.UP:b._move("previous",c),c.preventDefault();break;case e.DOWN:b._move("next",c),c.preventDefault();break;case e.ENTER:case e.NUMPAD_ENTER:b.menu.active&&(d=!0,c.preventDefault());case e.TAB:if(!b.menu.active)return;b.menu.select(c);break;case e.ESCAPE:b.element.val(b.term),b.close(c);break;default:clearTimeout(b.searching),b.searching=setTimeout(function(){b.term!=b.element.val()&&(b.selectedItem=null,b.search(null,c))},b.options.delay)}}}).bind("keypress.autocomplete",function(a){d&&(d=!1,a.preventDefault())}).bind("focus.autocomplete",function(){b.options.disabled||(b.selectedItem=null,b.previous=b.element.val())}).bind("blur.autocomplete",function(a){b.options.disabled||(clearTimeout(b.searching),b.closing=setTimeout(function(){b.close(a),b._change(a)},150))}),this._initSource(),this.response=function(){return b._response.apply(b,arguments)},this.menu=a("<ul></ul>").addClass("ui-autocomplete").appendTo(a(this.options.appendTo||"body",c)[0]).mousedown(function(c){var d=b.menu.element[0];a(c.target).closest(".ui-menu-item").length||setTimeout(function(){a(document).one("mousedown",function(c){c.target!==b.element[0]&&c.target!==d&&!a.ui.contains(d,c.target)&&b.close()})},1),setTimeout(function(){clearTimeout(b.closing)},13)}).menu({focus:function(a,c){var d=c.item.data("item.autocomplete");!1!==b._trigger("focus",a,{item:d})&&/^key/.test(a.originalEvent.type)&&b.element.val(d.value)},selected:function(a,d){var e=d.item.data("item.autocomplete"),f=b.previous;b.element[0]!==c.activeElement&&(b.element.focus(),b.previous=f,setTimeout(function(){b.previous=f,b.selectedItem=e},1)),!1!==b._trigger("select",a,{item:e})&&b.element.val(e.value),b.term=b.element.val(),b.close(a),b.selectedItem=e},blur:function(a,c){b.menu.element.is(":visible")&&b.element.val()!==b.term&&b.element.val(b.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu"),a.fn.bgiframe&&this.menu.element.bgiframe(),b.beforeunloadHandler=function(){b.element.removeAttr("autocomplete")},a(window).bind("beforeunload",b.beforeunloadHandler)},destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup"),this.menu.element.remove(),a(window).unbind("beforeunload",this.beforeunloadHandler),a.Widget.prototype.destroy.call(this)},_setOption:function(b,c){a.Widget.prototype._setOption.apply(this,arguments),b==="source"&&this._initSource(),b==="appendTo"&&this.menu.element.appendTo(a(c||"body",this.element[0].ownerDocument)[0]),b==="disabled"&&c&&this.xhr&&this.xhr.abort()},_initSource:function(){var b=this,d,e;a.isArray(this.options.source)?(d=this.options.source,this.source=function(b,c){c(a.ui.autocomplete.filter(d,b.term))}):typeof this.options.source=="string"?(e=this.options.source,this.source=function(d,f){b.xhr&&b.xhr.abort(),b.xhr=a.ajax({url:e,data:d,dataType:"json",context:{autocompleteRequest:++c},success:function(a,b){this.autocompleteRequest===c&&f(a)},error:function(){this.autocompleteRequest===c&&f([])}})}):this.source=this.options.source},search:function(a,b){a=a!=null?a:this.element.val(),this.term=this.element.val();if(a.length<this.options.minLength)return this.close(b);clearTimeout(this.closing);if(this._trigger("search",b)!==!1)return this._search(a)},_search:function(a){this.pending++,this.element.addClass("ui-autocomplete-loading"),this.source({term:a},this.response)},_response:function(a){!this.options.disabled&&a&&a.length?(a=this._normalize(a),this._suggest(a),this._trigger("open")):this.close(),this.pending--,this.pending||this.element.removeClass("ui-autocomplete-loading")},close:function(a){clearTimeout(this.closing),this.menu.element.is(":visible")&&(this.menu.element.hide(),this.menu.deactivate(),this._trigger("close",a))},_change:function(a){this.previous!==this.element.val()&&this._trigger("change",a,{item:this.selectedItem})},_normalize:function(b){if(b.length&&b[0].label&&b[0].value)return b;return a.map(b,function(b){if(typeof b=="string")return{label:b,value:b};return a.extend({label:b.label||b.value,value:b.value||b.label},b)})},_suggest:function(b){var c=this.menu.element.empty().zIndex(this.element.zIndex()+1);this._renderMenu(c,b),this.menu.deactivate(),this.menu.refresh(),c.show(),this._resizeMenu(),c.position(a.extend({of:this.element},this.options.position)),this.options.autoFocus&&this.menu.next(new a.Event("mouseover"))},_resizeMenu:function(){var a=this.menu.element;a.outerWidth(Math.max(a.width("").outerWidth()+1,this.element.outerWidth()))},_renderMenu:function(b,c){var d=this;a.each(c,function(a,c){d._renderItem(b,c)})},_renderItem:function(b,c){return a("<li></li>").data("item.autocomplete",c).append(a("<a></a>").text(c.label)).appendTo(b)},_move:function(a,b){if(!this.menu.element.is(":visible"))this.search(null,b);else{if(this.menu.first()&&/^previous/.test(a)||this.menu.last()&&/^next/.test(a)){this.element.val(this.term),this.menu.deactivate();return}this.menu[a](b)}},widget:function(){return this.menu.element}}),a.extend(a.ui.autocomplete,{escapeRegex:function(a){return a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&")},filter:function(b,c){var d=new RegExp(a.ui.autocomplete.escapeRegex(c),"i");return a.grep(b,function(a){return d.test(a.label||a.value||a)})}})})(jQuery),function(a){a.widget("ui.menu",{_create:function(){var b=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(c){!a(c.target).closest(".ui-menu-item a").length||(c.preventDefault(),b.select(c))}),this.refresh()},refresh:function(){var b=this,c=this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem");c.children("a").addClass("ui-corner-all").attr("tabindex",-1).mouseenter(function(c){b.activate(c,a(this).parent())}).mouseleave(function(){b.deactivate()})},activate:function(a,b){this.deactivate();if(this.hasScroll()){var c=b.offset().top-this.element.offset().top,d=this.element.scrollTop(),e=this.element.height();c<0?this.element.scrollTop(d+c):c>=e&&this.element.scrollTop(d+c-e+b.height())}this.active=b.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end(),this._trigger("focus",a,{item:b})},deactivate:function(){!this.active||(this.active.children("a").removeClass("ui-state-hover").removeAttr("id"),this._trigger("blur"),this.active=null)},next:function(a){this.move("next",".ui-menu-item:first",a)},previous:function(a){this.move("prev",".ui-menu-item:last",a)},first:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},last:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},move:function(a,b,c){if(!this.active)this.activate(c,this.element.children(b));else{var d=this.active[a+"All"](".ui-menu-item").eq(0);d.length?this.activate(c,d):this.activate(c,this.element.children(b))}},nextPage:function(b){if(this.hasScroll()){if(!this.active||this.last()){this.activate(b,this.element.children(".ui-menu-item:first"));return}var c=this.active.offset().top,d=this.element.height(),e=this.element.children(".ui-menu-item").filter(function(){var b=a(this).offset().top-c-d+a(this).height();return b<10&&b>-10});e.length||(e=this.element.children(".ui-menu-item:last")),this.activate(b,e)}else this.activate(b,this.element.children(".ui-menu-item").filter(!this.active||this.last()?":first":":last"))},previousPage:function(b){if(this.hasScroll()){if(!this.active||this.first()){this.activate(b,this.element.children(".ui-menu-item:last"));return}var c=this.active.offset().top,d=this.element.height();result=this.element.children(".ui-menu-item").filter(function(){var b=a(this).offset().top-c+d-a(this).height();return b<10&&b>-10}),result.length||(result=this.element.children(".ui-menu-item:first")),this.activate(b,result)}else this.activate(b,this.element.children(".ui-menu-item").filter(!this.active||this.first()?":last":":first"))},hasScroll:function(){return this.element.height()<this.element[a.fn.prop?"prop":"attr"]("scrollHeight")},select:function(a){this._trigger("selected",a,{item:this.active})}})}(jQuery);/*
+ * jQuery UI Button 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Button
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ */(function(a,b){var c,d,e,f,g="ui-button ui-widget ui-state-default ui-corner-all",h="ui-state-hover ui-state-active ",i="ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",j=function(){var b=a(this).find(":ui-button");setTimeout(function(){b.button("refresh")},1)},k=function(b){var c=b.name,d=b.form,e=a([]);c&&(d?e=a(d).find("[name='"+c+"']"):e=a("[name='"+c+"']",b.ownerDocument).filter(function(){return!this.form}));return e};a.widget("ui.button",{options:{disabled:null,text:!0,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset.button").bind("reset.button",j),typeof this.options.disabled!="boolean"?this.options.disabled=!!this.element.propAttr("disabled"):this.element.propAttr("disabled",this.options.disabled),this._determineButtonType(),this.hasTitle=!!this.buttonElement.attr("title");var b=this,h=this.options,i=this.type==="checkbox"||this.type==="radio",l="ui-state-hover"+(i?"":" ui-state-active"),m="ui-state-focus";h.label===null&&(h.label=this.buttonElement.html()),this.buttonElement.addClass(g).attr("role","button").bind("mouseenter.button",function(){h.disabled||(a(this).addClass("ui-state-hover"),this===c&&a(this).addClass("ui-state-active"))}).bind("mouseleave.button",function(){h.disabled||a(this).removeClass(l)}).bind("click.button",function(a){h.disabled&&(a.preventDefault(),a.stopImmediatePropagation())}),this.element.bind("focus.button",function(){b.buttonElement.addClass(m)}).bind("blur.button",function(){b.buttonElement.removeClass(m)}),i&&(this.element.bind("change.button",function(){f||b.refresh()}),this.buttonElement.bind("mousedown.button",function(a){h.disabled||(f=!1,d=a.pageX,e=a.pageY)}).bind("mouseup.button",function(a){!h.disabled&&(d!==a.pageX||e!==a.pageY)&&(f=!0)})),this.type==="checkbox"?this.buttonElement.bind("click.button",function(){if(h.disabled||f)return!1;a(this).toggleClass("ui-state-active"),b.buttonElement.attr("aria-pressed",b.element[0].checked)}):this.type==="radio"?this.buttonElement.bind("click.button",function(){if(h.disabled||f)return!1;a(this).addClass("ui-state-active"),b.buttonElement.attr("aria-pressed","true");var c=b.element[0];k(c).not(c).map(function(){return a(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed","false")}):(this.buttonElement.bind("mousedown.button",function(){if(h.disabled)return!1;a(this).addClass("ui-state-active"),c=this,a(document).one("mouseup",function(){c=null})}).bind("mouseup.button",function(){if(h.disabled)return!1;a(this).removeClass("ui-state-active")}).bind("keydown.button",function(b){if(h.disabled)return!1;(b.keyCode==a.ui.keyCode.SPACE||b.keyCode==a.ui.keyCode.ENTER)&&a(this).addClass("ui-state-active")}).bind("keyup.button",function(){a(this).removeClass("ui-state-active")}),this.buttonElement.is("a")&&this.buttonElement.keyup(function(b){b.keyCode===a.ui.keyCode.SPACE&&a(this).click()})),this._setOption("disabled",h.disabled),this._resetButton()},_determineButtonType:function(){this.element.is(":checkbox")?this.type="checkbox":this.element.is(":radio")?this.type="radio":this.element.is("input")?this.type="input":this.type="button";if(this.type==="checkbox"||this.type==="radio"){var a=this.element.parents().filter(":last"),b="label[for='"+this.element.attr("id")+"']";this.buttonElement=a.find(b),this.buttonElement.length||(a=a.length?a.siblings():this.element.siblings(),this.buttonElement=a.filter(b),this.buttonElement.length||(this.buttonElement=a.find(b))),this.element.addClass("ui-helper-hidden-accessible");var c=this.element.is(":checked");c&&this.buttonElement.addClass("ui-state-active"),this.buttonElement.attr("aria-pressed",c)}else this.buttonElement=this.element},widget:function(){return this.buttonElement},destroy:function(){this.element.removeClass("ui-helper-hidden-accessible"),this.buttonElement.removeClass(g+" "+h+" "+i).removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html()),this.hasTitle||this.buttonElement.removeAttr("title"),a.Widget.prototype.destroy.call(this)},_setOption:function(b,c){a.Widget.prototype._setOption.apply(this,arguments);b==="disabled"?c?this.element.propAttr("disabled",!0):this.element.propAttr("disabled",!1):this._resetButton()},refresh:function(){var b=this.element.is(":disabled");b!==this.options.disabled&&this._setOption("disabled",b),this.type==="radio"?k(this.element[0]).each(function(){a(this).is(":checked")?a(this).button("widget").addClass("ui-state-active").attr("aria-pressed","true"):a(this).button("widget").removeClass("ui-state-active").attr("aria-pressed","false")}):this.type==="checkbox"&&(this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed","true"):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed","false"))},_resetButton:function(){if(this.type==="input")this.options.label&&this.element.val(this.options.label);else{var b=this.buttonElement.removeClass(i),c=a("<span></span>",this.element[0].ownerDocument).addClass("ui-button-text").html(this.options.label).appendTo(b.empty()).text(),d=this.options.icons,e=d.primary&&d.secondary,f=[];d.primary||d.secondary?(this.options.text&&f.push("ui-button-text-icon"+(e?"s":d.primary?"-primary":"-secondary")),d.primary&&b.prepend("<span class='ui-button-icon-primary ui-icon "+d.primary+"'></span>"),d.secondary&&b.append("<span class='ui-button-icon-secondary ui-icon "+d.secondary+"'></span>"),this.options.text||(f.push(e?"ui-button-icons-only":"ui-button-icon-only"),this.hasTitle||b.attr("title",c))):f.push("ui-button-text-only"),b.addClass(f.join(" "))}}}),a.widget("ui.buttonset",{options:{items:":button, :submit, :reset, :checkbox, :radio, a, :data(button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(b,c){b==="disabled"&&this.buttons.button("option",b,c),a.Widget.prototype._setOption.apply(this,arguments)},refresh:function(){var b=this.element.css("direction")==="rtl";this.buttons=this.element.find(this.options.items).filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass(b?"ui-corner-right":"ui-corner-left").end().filter(":last").addClass(b?"ui-corner-left":"ui-corner-right").end().end()},destroy:function(){this.element.removeClass("ui-buttonset"),this.buttons.map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy"),a.Widget.prototype.destroy.call(this)}})})(jQuery);/*
+ * jQuery UI Dialog 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Dialog
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ *  jquery.ui.button.js
+ *	jquery.ui.draggable.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.position.js
+ *	jquery.ui.resizable.js
+ */(function(a,b){var c="ui-dialog ui-widget ui-widget-content ui-corner-all ",d={buttons:!0,height:!0,maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0,width:!0},e={maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0},f=a.attrFn||{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0,click:!0};a.widget("ui.dialog",{options:{autoOpen:!0,buttons:{},closeOnEscape:!0,closeText:"close",dialogClass:"",draggable:!0,hide:null,height:"auto",maxHeight:!1,maxWidth:!1,minHeight:150,minWidth:150,modal:!1,position:{my:"center",at:"center",collision:"fit",using:function(b){var c=a(this).css(b).offset().top;c<0&&a(this).css("top",b.top-c)}},resizable:!0,show:null,stack:!0,title:"",width:300,zIndex:1e3},_create:function(){this.originalTitle=this.element.attr("title"),typeof this.originalTitle!="string"&&(this.originalTitle=""),this.options.title=this.options.title||this.originalTitle;var b=this,d=b.options,e=d.title||"&#160;",f=a.ui.dialog.getTitleId(b.element),g=(b.uiDialog=a("<div></div>")).appendTo(document.body).hide().addClass(c+d.dialogClass).css({zIndex:d.zIndex}).attr("tabIndex",-1).css("outline",0).keydown(function(c){d.closeOnEscape&&!c.isDefaultPrevented()&&c.keyCode&&c.keyCode===a.ui.keyCode.ESCAPE&&(b.close(c),c.preventDefault())}).attr({role:"dialog","aria-labelledby":f}).mousedown(function(a){b.moveToTop(!1,a)}),h=b.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(g),i=(b.uiDialogTitlebar=a("<div></div>")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(g),j=a('<a href="#"></a>').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role","button").hover(function(){j.addClass("ui-state-hover")},function(){j.removeClass("ui-state-hover")}).focus(function(){j.addClass("ui-state-focus")}).blur(function(){j.removeClass("ui-state-focus")}).click(function(a){b.close(a);return!1}).appendTo(i),k=(b.uiDialogTitlebarCloseText=a("<span></span>")).addClass("ui-icon ui-icon-closethick").text(d.closeText).appendTo(j),l=a("<span></span>").addClass("ui-dialog-title").attr("id",f).html(e).prependTo(i);a.isFunction(d.beforeclose)&&!a.isFunction(d.beforeClose)&&(d.beforeClose=d.beforeclose),i.find("*").add(i).disableSelection(),d.draggable&&a.fn.draggable&&b._makeDraggable(),d.resizable&&a.fn.resizable&&b._makeResizable(),b._createButtons(d.buttons),b._isOpen=!1,a.fn.bgiframe&&g.bgiframe()},_init:function(){this.options.autoOpen&&this.open()},destroy:function(){var a=this;a.overlay&&a.overlay.destroy(),a.uiDialog.hide(),a.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body"),a.uiDialog.remove(),a.originalTitle&&a.element.attr("title",a.originalTitle);return a},widget:function(){return this.uiDialog},close:function(b){var c=this,d,e;if(!1!==c._trigger("beforeClose",b)){c.overlay&&c.overlay.destroy(),c.uiDialog.unbind("keypress.ui-dialog"),c._isOpen=!1,c.options.hide?c.uiDialog.hide(c.options.hide,function(){c._trigger("close",b)}):(c.uiDialog.hide(),c._trigger("close",b)),a.ui.dialog.overlay.resize(),c.options.modal&&(d=0,a(".ui-dialog").each(function(){this!==c.uiDialog[0]&&(e=a(this).css("z-index"),isNaN(e)||(d=Math.max(d,e)))}),a.ui.dialog.maxZ=d);return c}},isOpen:function(){return this._isOpen},moveToTop:function(b,c){var d=this,e=d.options,f;if(e.modal&&!b||!e.stack&&!e.modal)return d._trigger("focus",c);e.zIndex>a.ui.dialog.maxZ&&(a.ui.dialog.maxZ=e.zIndex),d.overlay&&(a.ui.dialog.maxZ+=1,d.overlay.$el.css("z-index",a.ui.dialog.overlay.maxZ=a.ui.dialog.maxZ)),f={scrollTop:d.element.scrollTop(),scrollLeft:d.element.scrollLeft()},a.ui.dialog.maxZ+=1,d.uiDialog.css("z-index",a.ui.dialog.maxZ),d.element.attr(f),d._trigger("focus",c);return d},open:function(){if(!this._isOpen){var b=this,c=b.options,d=b.uiDialog;b.overlay=c.modal?new a.ui.dialog.overlay(b):null,b._size(),b._position(c.position),d.show(c.show),b.moveToTop(!0),c.modal&&d.bind("keydown.ui-dialog",function(b){if(b.keyCode===a.ui.keyCode.TAB){var c=a(":tabbable",this),d=c.filter(":first"),e=c.filter(":last");if(b.target===e[0]&&!b.shiftKey){d.focus(1);return!1}if(b.target===d[0]&&b.shiftKey){e.focus(1);return!1}}}),a(b.element.find(":tabbable").get().concat(d.find(".ui-dialog-buttonpane :tabbable").get().concat(d.get()))).eq(0).focus(),b._isOpen=!0,b._trigger("open");return b}},_createButtons:function(b){var c=this,d=!1,e=a("<div></div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),g=a("<div></div>").addClass("ui-dialog-buttonset").appendTo(e);c.uiDialog.find(".ui-dialog-buttonpane").remove(),typeof b=="object"&&b!==null&&a.each(b,function(){return!(d=!0)}),d&&(a.each(b,function(b,d){d=a.isFunction(d)?{click:d,text:b}:d;var e=a('<button type="button"></button>').click(function(){d.click.apply(c.element[0],arguments)}).appendTo(g);a.each(d,function(a,b){a!=="click"&&(a in f?e[a](b):e.attr(a,b))}),a.fn.button&&e.button()}),e.appendTo(c.uiDialog))},_makeDraggable:function(){function f(a){return{position:a.position,offset:a.offset}}var b=this,c=b.options,d=a(document),e;b.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(d,g){e=c.height==="auto"?"auto":a(this).height(),a(this).height(a(this).height()).addClass("ui-dialog-dragging"),b._trigger("dragStart",d,f(g))},drag:function(a,c){b._trigger("drag",a,f(c))},stop:function(g,h){c.position=[h.position.left-d.scrollLeft(),h.position.top-d.scrollTop()],a(this).removeClass("ui-dialog-dragging").height(e),b._trigger("dragStop",g,f(h)),a.ui.dialog.overlay.resize()}})},_makeResizable:function(c){function h(a){return{originalPosition:a.originalPosition,originalSize:a.originalSize,position:a.position,size:a.size}}c=c===b?this.options.resizable:c;var d=this,e=d.options,f=d.uiDialog.css("position"),g=typeof c=="string"?c:"n,e,s,w,se,sw,ne,nw";d.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:d.element,maxWidth:e.maxWidth,maxHeight:e.maxHeight,minWidth:e.minWidth,minHeight:d._minHeight(),handles:g,start:function(b,c){a(this).addClass("ui-dialog-resizing"),d._trigger("resizeStart",b,h(c))},resize:function(a,b){d._trigger("resize",a,h(b))},stop:function(b,c){a(this).removeClass("ui-dialog-resizing"),e.height=a(this).height(),e.width=a(this).width(),d._trigger("resizeStop",b,h(c)),a.ui.dialog.overlay.resize()}}).css("position",f).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var a=this.options;return a.height==="auto"?a.minHeight:Math.min(a.minHeight,a.height)},_position:function(b){var c=[],d=[0,0],e;if(b){if(typeof b=="string"||typeof b=="object"&&"0"in b)c=b.split?b.split(" "):[b[0],b[1]],c.length===1&&(c[1]=c[0]),a.each(["left","top"],function(a,b){+c[a]===c[a]&&(d[a]=c[a],c[a]=b)}),b={my:c.join(" "),at:c.join(" "),offset:d.join(" ")};b=a.extend({},a.ui.dialog.prototype.options.position,b)}else b=a.ui.dialog.prototype.options.position;e=this.uiDialog.is(":visible"),e||this.uiDialog.show(),this.uiDialog.css({top:0,left:0}).position(a.extend({of:window},b)),e||this.uiDialog.hide()},_setOptions:function(b){var c=this,f={},g=!1;a.each(b,function(a,b){c._setOption(a,b),a in d&&(g=!0),a in e&&(f[a]=b)}),g&&this._size(),this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option",f)},_setOption:function(b,d){var e=this,f=e.uiDialog;switch(b){case"beforeclose":b="beforeClose";break;case"buttons":e._createButtons(d);break;case"closeText":e.uiDialogTitlebarCloseText.text(""+d);break;case"dialogClass":f.removeClass(e.options.dialogClass).addClass(c+d);break;case"disabled":d?f.addClass("ui-dialog-disabled"):f.removeClass("ui-dialog-disabled");break;case"draggable":var g=f.is(":data(draggable)");g&&!d&&f.draggable("destroy"),!g&&d&&e._makeDraggable();break;case"position":e._position(d);break;case"resizable":var h=f.is(":data(resizable)");h&&!d&&f.resizable("destroy"),h&&typeof d=="string"&&f.resizable("option","handles",d),!h&&d!==!1&&e._makeResizable(d);break;case"title":a(".ui-dialog-title",e.uiDialogTitlebar).html(""+(d||"&#160;"))}a.Widget.prototype._setOption.apply(e,arguments)},_size:function(){var b=this.options,c,d,e=this.uiDialog.is(":visible");this.element.show().css({width:"auto",minHeight:0,height:0}),b.minWidth>b.width&&(b.width=b.minWidth),c=this.uiDialog.css({height:"auto",width:b.width}).height(),d=Math.max(0,b.minHeight-c);if(b.height==="auto")if(a.support.minHeight)this.element.css({minHeight:d,height:"auto"});else{this.uiDialog.show();var f=this.element.css("height","auto").height();e||this.uiDialog.hide(),this.element.height(Math.max(f,d))}else this.element.height(Math.max(b.height-c,0));this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())}}),a.extend(a.ui.dialog,{version:"1.8.18",uuid:0,maxZ:0,getTitleId:function(a){var b=a.attr("id");b||(this.uuid+=1,b=this.uuid);return"ui-dialog-title-"+b},overlay:function(b){this.$el=a.ui.dialog.overlay.create(b)}}),a.extend(a.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:a.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(a){return a+".dialog-overlay"}).join(" "),create:function(b){this.instances.length===0&&(setTimeout(function(){a.ui.dialog.overlay.instances.length&&a(document).bind(a.ui.dialog.overlay.events,function(b){if(a(b.target).zIndex()<a.ui.dialog.overlay.maxZ)return!1})},1),a(document).bind("keydown.dialog-overlay",function(c){b.options.closeOnEscape&&!c.isDefaultPrevented()&&c.keyCode&&c.keyCode===a.ui.keyCode.ESCAPE&&(b.close(c),c.preventDefault())}),a(window).bind("resize.dialog-overlay",a.ui.dialog.overlay.resize));var c=(this.oldInstances.pop()||a("<div></div>").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(),height:this.height()});a.fn.bgiframe&&c.bgiframe(),this.instances.push(c);return c},destroy:function(b){var c=a.inArray(b,this.instances);c!=-1&&this.oldInstances.push(this.instances.splice(c,1)[0]),this.instances.length===0&&a([document,window]).unbind(".dialog-overlay"),b.remove();var d=0;a.each(this.instances,function(){d=Math.max(d,this.css("z-index"))}),this.maxZ=d},height:function(){var b,c;if(a.browser.msie&&a.browser.version<7){b=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight),c=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight);return b<c?a(window).height()+"px":b+"px"}return a(document).height()+"px"},width:function(){var b,c;if(a.browser.msie){b=Math.max(document.documentElement.scrollWidth,document.body.scrollWidth),c=Math.max(document.documentElement.offsetWidth,document.body.offsetWidth);return b<c?a(window).width()+"px":b+"px"}return a(document).width()+"px"},resize:function(){var b=a([]);a.each(a.ui.dialog.overlay.instances,function(){b=b.add(this)}),b.css({width:0,height:0}).css({width:a.ui.dialog.overlay.width(),height:a.ui.dialog.overlay.height()})}}),a.extend(a.ui.dialog.overlay.prototype,{destroy:function(){a.ui.dialog.overlay.destroy(this.$el)}})})(jQuery);/*
+ * jQuery UI Slider 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Slider
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */(function(a,b){var c=5;a.widget("ui.slider",a.ui.mouse,{widgetEventPrefix:"slide",options:{animate:!1,distance:0,max:100,min:0,orientation:"horizontal",range:!1,step:1,value:0,values:null},_create:function(){var b=this,d=this.options,e=this.element.find(".ui-slider-handle").addClass("ui-state-default ui-corner-all"),f="<a class='ui-slider-handle ui-state-default ui-corner-all' href='#'></a>",g=d.values&&d.values.length||1,h=[];this._keySliding=!1,this._mouseSliding=!1,this._animateOff=!0,this._handleIndex=null,this._detectOrientation(),this._mouseInit(),this.element.addClass("ui-slider ui-slider-"+this.orientation+" ui-widget"+" ui-widget-content"+" ui-corner-all"+(d.disabled?" ui-slider-disabled ui-disabled":"")),this.range=a([]),d.range&&(d.range===!0&&(d.values||(d.values=[this._valueMin(),this._valueMin()]),d.values.length&&d.values.length!==2&&(d.values=[d.values[0],d.values[0]])),this.range=a("<div></div>").appendTo(this.element).addClass("ui-slider-range ui-widget-header"+(d.range==="min"||d.range==="max"?" ui-slider-range-"+d.range:"")));for(var i=e.length;i<g;i+=1)h.push(f);this.handles=e.add(a(h.join("")).appendTo(b.element)),this.handle=this.handles.eq(0),this.handles.add(this.range).filter("a").click(function(a){a.preventDefault()}).hover(function(){d.disabled||a(this).addClass("ui-state-hover")},function(){a(this).removeClass("ui-state-hover")}).focus(function(){d.disabled?a(this).blur():(a(".ui-slider .ui-state-focus").removeClass("ui-state-focus"),a(this).addClass("ui-state-focus"))}).blur(function(){a(this).removeClass("ui-state-focus")}),this.handles.each(function(b){a(this).data("index.ui-slider-handle",b)}),this.handles.keydown(function(d){var e=a(this).data("index.ui-slider-handle"),f,g,h,i;if(!b.options.disabled){switch(d.keyCode){case a.ui.keyCode.HOME:case a.ui.keyCode.END:case a.ui.keyCode.PAGE_UP:case a.ui.keyCode.PAGE_DOWN:case a.ui.keyCode.UP:case a.ui.keyCode.RIGHT:case a.ui.keyCode.DOWN:case a.ui.keyCode.LEFT:d.preventDefault();if(!b._keySliding){b._keySliding=!0,a(this).addClass("ui-state-active"),f=b._start(d,e);if(f===!1)return}}i=b.options.step,b.options.values&&b.options.values.length?g=h=b.values(e):g=h=b.value();switch(d.keyCode){case a.ui.keyCode.HOME:h=b._valueMin();break;case a.ui.keyCode.END:h=b._valueMax();break;case a.ui.keyCode.PAGE_UP:h=b._trimAlignValue(g+(b._valueMax()-b._valueMin())/c);break;case a.ui.keyCode.PAGE_DOWN:h=b._trimAlignValue(g-(b._valueMax()-b._valueMin())/c);break;case a.ui.keyCode.UP:case a.ui.keyCode.RIGHT:if(g===b._valueMax())return;h=b._trimAlignValue(g+i);break;case a.ui.keyCode.DOWN:case a.ui.keyCode.LEFT:if(g===b._valueMin())return;h=b._trimAlignValue(g-i)}b._slide(d,e,h)}}).keyup(function(c){var d=a(this).data("index.ui-slider-handle");b._keySliding&&(b._keySliding=!1,b._stop(c,d),b._change(c,d),a(this).removeClass("ui-state-active"))}),this._refreshValue(),this._animateOff=!1},destroy:function(){this.handles.remove(),this.range.remove(),this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-slider-disabled ui-widget ui-widget-content ui-corner-all").removeData("slider").unbind(".slider"),this._mouseDestroy();return this},_mouseCapture:function(b){var c=this.options,d,e,f,g,h,i,j,k,l;if(c.disabled)return!1;this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()},this.elementOffset=this.element.offset(),d={x:b.pageX,y:b.pageY},e=this._normValueFromMouse(d),f=this._valueMax()-this._valueMin()+1,h=this,this.handles.each(function(b){var c=Math.abs(e-h.values(b));f>c&&(f=c,g=a(this),i=b)}),c.range===!0&&this.values(1)===c.min&&(i+=1,g=a(this.handles[i])),j=this._start(b,i);if(j===!1)return!1;this._mouseSliding=!0,h._handleIndex=i,g.addClass("ui-state-active").focus(),k=g.offset(),l=!a(b.target).parents().andSelf().is(".ui-slider-handle"),this._clickOffset=l?{left:0,top:0}:{left:b.pageX-k.left-g.width()/2,top:b.pageY-k.top-g.height()/2-(parseInt(g.css("borderTopWidth"),10)||0)-(parseInt(g.css("borderBottomWidth"),10)||0)+(parseInt(g.css("marginTop"),10)||0)},this.handles.hasClass("ui-state-hover")||this._slide(b,i,e),this._animateOff=!0;return!0},_mouseStart:function(a){return!0},_mouseDrag:function(a){var b={x:a.pageX,y:a.pageY},c=this._normValueFromMouse(b);this._slide(a,this._handleIndex,c);return!1},_mouseStop:function(a){this.handles.removeClass("ui-state-active"),this._mouseSliding=!1,this._stop(a,this._handleIndex),this._change(a,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1;return!1},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(a){var b,c,d,e,f;this.orientation==="horizontal"?(b=this.elementSize.width,c=a.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(b=this.elementSize.height,c=a.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),d=c/b,d>1&&(d=1),d<0&&(d=0),this.orientation==="vertical"&&(d=1-d),e=this._valueMax()-this._valueMin(),f=this._valueMin()+d*e;return this._trimAlignValue(f)},_start:function(a,b){var c={handle:this.handles[b],value:this.value()};this.options.values&&this.options.values.length&&(c.value=this.values(b),c.values=this.values());return this._trigger("start",a,c)},_slide:function(a,b,c){var d,e,f;this.options.values&&this.options.values.length?(d=this.values(b?0:1),this.options.values.length===2&&this.options.range===!0&&(b===0&&c>d||b===1&&c<d)&&(c=d),c!==this.values(b)&&(e=this.values(),e[b]=c,f=this._trigger("slide",a,{handle:this.handles[b],value:c,values:e}),d=this.values(b?0:1),f!==!1&&this.values(b,c,!0))):c!==this.value()&&(f=this._trigger("slide",a,{handle:this.handles[b],value:c}),f!==!1&&this.value(c))},_stop:function(a,b){var c={handle:this.handles[b],value:this.value()};this.options.values&&this.options.values.length&&(c.value=this.values(b),c.values=this.values()),this._trigger("stop",a,c)},_change:function(a,b){if(!this._keySliding&&!this._mouseSliding){var c={handle:this.handles[b],value:this.value()};this.options.values&&this.options.values.length&&(c.value=this.values(b),c.values=this.values()),this._trigger("change",a,c)}},value:function(a){if(arguments.length)this.options.value=this._trimAlignValue(a),this._refreshValue(),this._change(null,0);else return this._value()},values:function(b,c){var d,e,f;if(arguments.length>1)this.options.values[b]=this._trimAlignValue(c),this._refreshValue(),this._change(null,b);else{if(!arguments.length)return this._values();if(!a.isArray(arguments[0]))return this.options.values&&this.options.values.length?this._values(b):this.value();d=this.options.values,e=arguments[0];for(f=0;f<d.length;f+=1)d[f]=this._trimAlignValue(e[f]),this._change(null,f);this._refreshValue()}},_setOption:function(b,c){var d,e=0;a.isArray(this.options.values)&&(e=this.options.values.length),a.Widget.prototype._setOption.apply(this,arguments);switch(b){case"disabled":c?(this.handles.filter(".ui-state-focus").blur(),this.handles.removeClass("ui-state-hover"),this.handles.propAttr("disabled",!0),this.element.addClass("ui-disabled")):(this.handles.propAttr("disabled",!1),this.element.removeClass("ui-disabled"));break;case"orientation":this._detectOrientation(),this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation),this._refreshValue();break;case"value":this._animateOff=!0,this._refreshValue(),this._change(null,0),this._animateOff=!1;break;case"values":this._animateOff=!0,this._refreshValue();for(d=0;d<e;d+=1)this._change(null,d);this._animateOff=!1}},_value:function(){var a=this.options.value;a=this._trimAlignValue(a);return a},_values:function(a){var b,c,d;if(arguments.length){b=this.options.values[a],b=this._trimAlignValue(b);return b}c=this.options.values.slice();for(d=0;d<c.length;d+=1)c[d]=this._trimAlignValue(c[d]);return c},_trimAlignValue:function(a){if(a<=this._valueMin())return this._valueMin();if(a>=this._valueMax())return this._valueMax();var b=this.options.step>0?this.options.step:1,c=(a-this._valueMin())%b,d=a-c;Math.abs(c)*2>=b&&(d+=c>0?b:-b);return parseFloat(d.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},_refreshValue:function(){var b=this.options.range,c=this.options,d=this,e=this._animateOff?!1:c.animate,f,g={},h,i,j,k;this.options.values&&this.options.values.length?this.handles.each(function(b,i){f=(d.values(b)-d._valueMin())/(d._valueMax()-d._valueMin())*100,g[d.orientation==="horizontal"?"left":"bottom"]=f+"%",a(this).stop(1,1)[e?"animate":"css"](g,c.animate),d.options.range===!0&&(d.orientation==="horizontal"?(b===0&&d.range.stop(1,1)[e?"animate":"css"]({left:f+"%"},c.animate),b===1&&d.range[e?"animate":"css"]({width:f-h+"%"},{queue:!1,duration:c.animate})):(b===0&&d.range.stop(1,1)[e?"animate":"css"]({bottom:f+"%"},c.animate),b===1&&d.range[e?"animate":"css"]({height:f-h+"%"},{queue:!1,duration:c.animate}))),h=f}):(i=this.value(),j=this._valueMin(),k=this._valueMax(),f=k!==j?(i-j)/(k-j)*100:0,g[d.orientation==="horizontal"?"left":"bottom"]=f+"%",this.handle.stop(1,1)[e?"animate":"css"](g,c.animate),b==="min"&&this.orientation==="horizontal"&&this.range.stop(1,1)[e?"animate":"css"]({width:f+"%"},c.animate),b==="max"&&this.orientation==="horizontal"&&this.range[e?"animate":"css"]({width:100-f+"%"},{queue:!1,duration:c.animate}),b==="min"&&this.orientation==="vertical"&&this.range.stop(1,1)[e?"animate":"css"]({height:f+"%"},c.animate),b==="max"&&this.orientation==="vertical"&&this.range[e?"animate":"css"]({height:100-f+"%"},{queue:!1,duration:c.animate}))}}),a.extend(a.ui.slider,{version:"1.8.18"})})(jQuery);/*
+ * jQuery UI Tabs 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Tabs
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ */(function(a,b){function f(){return++d}function e(){return++c}var c=0,d=0;a.widget("ui.tabs",{options:{add:null,ajaxOptions:null,cache:!1,cookie:null,collapsible:!1,disable:null,disabled:[],enable:null,event:"click",fx:null,idPrefix:"ui-tabs-",load:null,panelTemplate:"<div></div>",remove:null,select:null,show:null,spinner:"<em>Loading&#8230;</em>",tabTemplate:"<li><a href='#{href}'><span>#{label}</span></a></li>"},_create:function(){this._tabify(!0)},_setOption:function(a,b){if(a=="selected"){if(this.options.collapsible&&b==this.options.selected)return;this.select(b)}else this.options[a]=b,this._tabify()},_tabId:function(a){return a.title&&a.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+e()},_sanitizeSelector:function(a){return a.replace(/:/g,"\\:")},_cookie:function(){var b=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+f());return a.cookie.apply(null,[b].concat(a.makeArray(arguments)))},_ui:function(a,b){return{tab:a,panel:b,index:this.anchors.index(a)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var b=a(this);b.html(b.data("label.tabs")).removeData("label.tabs")})},_tabify:function(c){function m(b,c){b.css("display",""),!a.support.opacity&&c.opacity&&b[0].style.removeAttribute("filter")}var d=this,e=this.options,f=/^#.+/;this.list=this.element.find("ol,ul").eq(0),this.lis=a(" > li:has(a[href])",this.list),this.anchors=this.lis.map(function(){return a("a",this)[0]}),this.panels=a([]),this.anchors.each(function(b,c){var g=a(c).attr("href"),h=g.split("#")[0],i;h&&(h===location.toString().split("#")[0]||(i=a("base")[0])&&h===i.href)&&(g=c.hash,c.href=g);if(f.test(g))d.panels=d.panels.add(d.element.find(d._sanitizeSelector(g)));else if(g&&g!=="#"){a.data(c,"href.tabs",g),a.data(c,"load.tabs",g.replace(/#.*$/,""));var j=d._tabId(c);c.href="#"+j;var k=d.element.find("#"+j);k.length||(k=a(e.panelTemplate).attr("id",j).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(d.panels[b-1]||d.list),k.data("destroy.tabs",!0)),d.panels=d.panels.add(k)}else e.disabled.push(b)}),c?(this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all"),this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all"),this.lis.addClass("ui-state-default ui-corner-top"),this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom"),e.selected===b?(location.hash&&this.anchors.each(function(a,b){if(b.hash==location.hash){e.selected=a;return!1}}),typeof e.selected!="number"&&e.cookie&&(e.selected=parseInt(d._cookie(),10)),typeof e.selected!="number"&&this.lis.filter(".ui-tabs-selected").length&&(e.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"))),e.selected=e.selected||(this.lis.length?0:-1)):e.selected===null&&(e.selected=-1),e.selected=e.selected>=0&&this.anchors[e.selected]||e.selected<0?e.selected:0,e.disabled=a.unique(e.disabled.concat(a.map(this.lis.filter(".ui-state-disabled"),function(a,b){return d.lis.index(a)}))).sort(),a.inArray(e.selected,e.disabled)!=-1&&e.disabled.splice(a.inArray(e.selected,e.disabled),1),this.panels.addClass("ui-tabs-hide"),this.lis.removeClass("ui-tabs-selected ui-state-active"),e.selected>=0&&this.anchors.length&&(d.element.find(d._sanitizeSelector(d.anchors[e.selected].hash)).removeClass("ui-tabs-hide"),this.lis.eq(e.selected).addClass("ui-tabs-selected ui-state-active"),d.element.queue("tabs",function(){d._trigger("show",null,d._ui(d.anchors[e.selected],d.element.find(d._sanitizeSelector(d.anchors[e.selected].hash))[0]))}),this.load(e.selected)),a(window).bind("unload",function(){d.lis.add(d.anchors).unbind(".tabs"),d.lis=d.anchors=d.panels=null})):e.selected=this.lis.index(this.lis.filter(".ui-tabs-selected")),this.element[e.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible"),e.cookie&&this._cookie(e.selected,e.cookie);for(var g=0,h;h=this.lis[g];g++)a(h)[a.inArray(g,e.disabled)!=-1&&!a(h).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");e.cache===!1&&this.anchors.removeData("cache.tabs"),this.lis.add(this.anchors).unbind(".tabs");if(e.event!=="mouseover"){var i=function(a,b){b.is(":not(.ui-state-disabled)")&&b.addClass("ui-state-"+a)},j=function(a,b){b.removeClass("ui-state-"+a)};this.lis.bind("mouseover.tabs",function(){i("hover",a(this))}),this.lis.bind("mouseout.tabs",function(){j("hover",a(this))}),this.anchors.bind("focus.tabs",function(){i("focus",a(this).closest("li"))}),this.anchors.bind("blur.tabs",function(){j("focus",a(this).closest("li"))})}var k,l;e.fx&&(a.isArray(e.fx)?(k=e.fx[0],l=e.fx[1]):k=l=e.fx);var n=l?function(b,c){a(b).closest("li").addClass("ui-tabs-selected ui-state-active"),c.hide().removeClass("ui-tabs-hide").animate(l,l.duration||"normal",function(){m(c,l),d._trigger("show",null,d._ui(b,c[0]))})}:function(b,c){a(b).closest("li").addClass("ui-tabs-selected ui-state-active"),c.removeClass("ui-tabs-hide"),d._trigger("show",null,d._ui(b,c[0]))},o=k?function(a,b){b.animate(k,k.duration||"normal",function(){d.lis.removeClass("ui-tabs-selected ui-state-active"),b.addClass("ui-tabs-hide"),m(b,k),d.element.dequeue("tabs")})}:function(a,b,c){d.lis.removeClass("ui-tabs-selected ui-state-active"),b.addClass("ui-tabs-hide"),d.element.dequeue("tabs")};this.anchors.bind(e.event+".tabs",function(){var b=this,c=a(b).closest("li"),f=d.panels.filter(":not(.ui-tabs-hide)"),g=d.element.find(d._sanitizeSelector(b.hash));if(c.hasClass("ui-tabs-selected")&&!e.collapsible||c.hasClass("ui-state-disabled")||c.hasClass("ui-state-processing")||d.panels.filter(":animated").length||d._trigger("select",null,d._ui(this,g[0]))===!1){this.blur();return!1}e.selected=d.anchors.index(this),d.abort();if(e.collapsible){if(c.hasClass("ui-tabs-selected")){e.selected=-1,e.cookie&&d._cookie(e.selected,e.cookie),d.element.queue("tabs",function(){o(b,f)}).dequeue("tabs"),this.blur();return!1}if(!f.length){e.cookie&&d._cookie(e.selected,e.cookie),d.element.queue("tabs",function(){n(b,g)}),d.load(d.anchors.index(this)),this.blur();return!1}}e.cookie&&d._cookie(e.selected,e.cookie);if(g.length)f.length&&d.element.queue("tabs",function(){o(b,f)}),d.element.queue("tabs",function(){n(b,g)}),d.load(d.anchors.index(this));else throw"jQuery UI Tabs: Mismatching fragment identifier.";a.browser.msie&&this.blur()}),this.anchors.bind("click.tabs",function(){return!1})},_getIndex:function(a){typeof a=="string"&&(a=this.anchors.index(this.anchors.filter("[href$="+a+"]")));return a},destroy:function(){var b=this.options;this.abort(),this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs"),this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all"),this.anchors.each(function(){var b=a.data(this,"href.tabs");b&&(this.href=b);var c=a(this).unbind(".tabs");a.each(["href","load","cache"],function(a,b){c.removeData(b+".tabs")})}),this.lis.unbind(".tabs").add(this.panels).each(function(){a.data(this,"destroy.tabs")?a(this).remove():a(this).removeClass(["ui-state-default","ui-corner-top","ui-tabs-selected","ui-state-active","ui-state-hover","ui-state-focus","ui-state-disabled","ui-tabs-panel","ui-widget-content","ui-corner-bottom","ui-tabs-hide"].join(" "))}),b.cookie&&this._cookie(null,b.cookie);return this},add:function(c,d,e){e===b&&(e=this.anchors.length);var f=this,g=this.options,h=a(g.tabTemplate.replace(/#\{href\}/g,c).replace(/#\{label\}/g,d)),i=c.indexOf("#")?this._tabId(a("a",h)[0]):c.replace("#","");h.addClass("ui-state-default ui-corner-top").data("destroy.tabs",!0);var j=f.element.find("#"+i);j.length||(j=a(g.panelTemplate).attr("id",i).data("destroy.tabs",!0)),j.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide"),e>=this.lis.length?(h.appendTo(this.list),j.appendTo(this.list[0].parentNode)):(h.insertBefore(this.lis[e]),j.insertBefore(this.panels[e])),g.disabled=a.map(g.disabled,function(a,b){return a>=e?++a:a}),this._tabify(),this.anchors.length==1&&(g.selected=0,h.addClass("ui-tabs-selected ui-state-active"),j.removeClass("ui-tabs-hide"),this.element.queue("tabs",function(){f._trigger("show",null,f._ui(f.anchors[0],f.panels[0]))}),this.load(0)),this._trigger("add",null,this._ui(this.anchors[e],this.panels[e]));return this},remove:function(b){b=this._getIndex(b);var c=this.options,d=this.lis.eq(b).remove(),e=this.panels.eq(b).remove();d.hasClass("ui-tabs-selected")&&this.anchors.length>1&&this.select(b+(b+1<this.anchors.length?1:-1)),c.disabled=a.map(a.grep(c.disabled,function(a,c){return a!=b}),function(a,c){return a>=b?--a:a}),this._tabify(),this._trigger("remove",null,this._ui(d.find("a")[0],e[0]));return this},enable:function(b){b=this._getIndex(b);var c=this.options;if(a.inArray(b,c.disabled)!=-1){this.lis.eq(b).removeClass("ui-state-disabled"),c.disabled=a.grep(c.disabled,function(a,c){return a!=b}),this._trigger("enable",null,this._ui(this.anchors[b],this.panels[b]));return this}},disable:function(a){a=this._getIndex(a);var b=this,c=this.options;a!=c.selected&&(this.lis.eq(a).addClass("ui-state-disabled"),c.disabled.push(a),c.disabled.sort(),this._trigger("disable",null,this._ui(this.anchors[a],this.panels[a])));return this},select:function(a){a=this._getIndex(a);if(a==-1)if(this.options.collapsible&&this.options.selected!=-1)a=this.options.selected;else return this;this.anchors.eq(a).trigger(this.options.event+".tabs");return this},load:function(b){b=this._getIndex(b);var c=this,d=this.options,e=this.anchors.eq(b)[0],f=a.data(e,"load.tabs");this.abort();if(!f||this.element.queue("tabs").length!==0&&a.data(e,"cache.tabs"))this.element.dequeue("tabs");else{this.lis.eq(b).addClass("ui-state-processing");if(d.spinner){var g=a("span",e);g.data("label.tabs",g.html()).html(d.spinner)}this.xhr=a.ajax(a.extend({},d.ajaxOptions,{url:f,success:function(f,g){c.element.find(c._sanitizeSelector(e.hash)).html(f),c._cleanup(),d.cache&&a.data(e,"cache.tabs",!0),c._trigger("load",null,c._ui(c.anchors[b],c.panels[b]));try{d.ajaxOptions.success(f,g)}catch(h){}},error:function(a,f,g){c._cleanup(),c._trigger("load",null,c._ui(c.anchors[b],c.panels[b]));try{d.ajaxOptions.error(a,f,b,e)}catch(g){}}})),c.element.dequeue("tabs");return this}},abort:function(){this.element.queue([]),this.panels.stop(!1,!0),this.element.queue("tabs",this.element.queue("tabs").splice(-2,2)),this.xhr&&(this.xhr.abort(),delete this.xhr),this._cleanup();return this},url:function(a,b){this.anchors.eq(a).removeData("cache.tabs").data("load.tabs",b);return this},length:function(){return this.anchors.length}}),a.extend(a.ui.tabs,{version:"1.8.18"}),a.extend(a.ui.tabs.prototype,{rotation:null,rotate:function(a,b){var c=this,d=this.options,e=c._rotate||(c._rotate=function(b){clearTimeout(c.rotation),c.rotation=setTimeout(function(){var a=d.selected;c.select(++a<c.anchors.length?a:0)},a),b&&b.stopPropagation()}),f=c._unrotate||(c._unrotate=b?function(a){t=d.selected,e()}:function(a){a.clientX&&c.rotate(null)});a?(this.element.bind("tabsshow",e),this.anchors.bind(d.event+".tabs",f),e()):(clearTimeout(c.rotation),this.element.unbind("tabsshow",e),this.anchors.unbind(d.event+".tabs",f),delete this._rotate,delete this._unrotate);return this}})})(jQuery);/*
+ * jQuery UI Datepicker 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Datepicker
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ */(function($,undefined){function isArray(a){return a&&($.browser.safari&&typeof a=="object"&&a.length||a.constructor&&a.constructor.toString().match(/\Array\(\)/))}function extendRemove(a,b){$.extend(a,b);for(var c in b)if(b[c]==null||b[c]==undefined)a[c]=b[c];return a}function bindHover(a){var b="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return a.bind("mouseout",function(a){var c=$(a.target).closest(b);!c.length||c.removeClass("ui-state-hover ui-datepicker-prev-hover ui-datepicker-next-hover")}).bind("mouseover",function(c){var d=$(c.target).closest(b);!$.datepicker._isDisabledDatepicker(instActive.inline?a.parent()[0]:instActive.input[0])&&!!d.length&&(d.parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),d.addClass("ui-state-hover"),d.hasClass("ui-datepicker-prev")&&d.addClass("ui-datepicker-prev-hover"),d.hasClass("ui-datepicker-next")&&d.addClass("ui-datepicker-next-hover"))})}function Datepicker(){this.debug=!1,this._curInst=null,this._keyEvent=!1,this._disabledInputs=[],this._datepickerShowing=!1,this._inDialog=!1,this._mainDivId="ui-datepicker-div",this._inlineClass="ui-datepicker-inline",this._appendClass="ui-datepicker-append",this._triggerClass="ui-datepicker-trigger",this._dialogClass="ui-datepicker-dialog",this._disableClass="ui-datepicker-disabled",this._unselectableClass="ui-datepicker-unselectable",this._currentClass="ui-datepicker-current-day",this._dayOverClass="ui-datepicker-days-cell-over",this.regional=[],this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:!1,hideIfNoPrevNext:!1,navigationAsDateFormat:!1,gotoCurrent:!1,changeMonth:!1,changeYear:!1,yearRange:"c-10:c+10",showOtherMonths:!1,selectOtherMonths:!1,showWeek:!1,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:!0,showButtonPanel:!1,autoSize:!1,disabled:!1},$.extend(this._defaults,this.regional[""]),this.dpDiv=bindHover($('<div id="'+this._mainDivId+'" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>'))}$.extend($.ui,{datepicker:{version:"1.8.18"}});var PROP_NAME="datepicker",dpuuid=(new Date).getTime(),instActive;$.extend(Datepicker.prototype,{markerClassName:"hasDatepicker",maxRows:4,log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){extendRemove(this._defaults,a||{});return this},_attachDatepicker:function(target,settings){var inlineSettings=null;for(var attrName in this._defaults){var attrValue=target.getAttribute("date:"+attrName);if(attrValue){inlineSettings=inlineSettings||{};try{inlineSettings[attrName]=eval(attrValue)}catch(err){inlineSettings[attrName]=attrValue}}}var nodeName=target.nodeName.toLowerCase(),inline=nodeName=="div"||nodeName=="span";target.id||(this.uuid+=1,target.id="dp"+this.uuid);var inst=this._newInst($(target),inline);inst.settings=$.extend({},settings||{},inlineSettings||{}),nodeName=="input"?this._connectDatepicker(target,inst):inline&&this._inlineDatepicker(target,inst)},_newInst:function(a,b){var c=a[0].id.replace(/([^A-Za-z0-9_-])/g,"\\\\$1");return{id:c,input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:b?bindHover($('<div class="'+this._inlineClass+' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')):this.dpDiv}},_connectDatepicker:function(a,b){var c=$(a);b.append=$([]),b.trigger=$([]);c.hasClass(this.markerClassName)||(this._attachments(c,b),c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",function(a,c,d){b.settings[c]=d}).bind("getData.datepicker",function(a,c){return this._get(b,c)}),this._autoSize(b),$.data(a,PROP_NAME,b),b.settings.disabled&&this._disableDatepicker(a))},_attachments:function(a,b){var c=this._get(b,"appendText"),d=this._get(b,"isRTL");b.append&&b.append.remove(),c&&(b.append=$('<span class="'+this._appendClass+'">'+c+"</span>"),a[d?"before":"after"](b.append)),a.unbind("focus",this._showDatepicker),b.trigger&&b.trigger.remove();var e=this._get(b,"showOn");(e=="focus"||e=="both")&&a.focus(this._showDatepicker);if(e=="button"||e=="both"){var f=this._get(b,"buttonText"),g=this._get(b,"buttonImage");b.trigger=$(this._get(b,"buttonImageOnly")?$("<img/>").addClass(this._triggerClass).attr({src:g,alt:f,title:f}):$('<button type="button"></button>').addClass(this._triggerClass).html(g==""?f:$("<img/>").attr({src:g,alt:f,title:f}))),a[d?"before":"after"](b.trigger),b.trigger.click(function(){$.datepicker._datepickerShowing&&$.datepicker._lastInput==a[0]?$.datepicker._hideDatepicker():$.datepicker._datepickerShowing&&$.datepicker._lastInput!=a[0]?($.datepicker._hideDatepicker(),$.datepicker._showDatepicker(a[0])):$.datepicker._showDatepicker(a[0]);return!1})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var b=new Date(2009,11,20),c=this._get(a,"dateFormat");if(c.match(/[DM]/)){var d=function(a){var b=0,c=0;for(var d=0;d<a.length;d++)a[d].length>b&&(b=a[d].length,c=d);return c};b.setMonth(d(this._get(a,c.match(/MM/)?"monthNames":"monthNamesShort"))),b.setDate(d(this._get(a,c.match(/DD/)?"dayNames":"dayNamesShort"))+20-b.getDay())}a.input.attr("size",this._formatDate(a,b).length)}},_inlineDatepicker:function(a,b){var c=$(a);c.hasClass(this.markerClassName)||(c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker",function(a,c,d){b.settings[c]=d}).bind("getData.datepicker",function(a,c){return this._get(b,c)}),$.data(a,PROP_NAME,b),this._setDate(b,this._getDefaultDate(b),!0),this._updateDatepicker(b),this._updateAlternate(b),b.settings.disabled&&this._disableDatepicker(a),b.dpDiv.css("display","block"))},_dialogDatepicker:function(a,b,c,d,e){var f=this._dialogInst;if(!f){this.uuid+=1;var g="dp"+this.uuid;this._dialogInput=$('<input type="text" id="'+g+'" style="position: absolute; top: -100px; width: 0px; z-index: -10;"/>'),this._dialogInput.keydown(this._doKeyDown),$("body").append(this._dialogInput),f=this._dialogInst=this._newInst(this._dialogInput,!1),f.settings={},$.data(this._dialogInput[0],PROP_NAME,f)}extendRemove(f.settings,d||{}),b=b&&b.constructor==Date?this._formatDate(f,b):b,this._dialogInput.val(b),this._pos=e?e.length?e:[e.pageX,e.pageY]:null;if(!this._pos){var h=document.documentElement.clientWidth,i=document.documentElement.clientHeight,j=document.documentElement.scrollLeft||document.body.scrollLeft,k=document.documentElement.scrollTop||document.body.scrollTop;this._pos=[h/2-100+j,i/2-150+k]}this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px"),f.settings.onSelect=c,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),$.blockUI&&$.blockUI(this.dpDiv),$.data(this._dialogInput[0],PROP_NAME,f);return this},_destroyDatepicker:function(a){var b=$(a),c=$.data(a,PROP_NAME);if(!!b.hasClass(this.markerClassName)){var d=a.nodeName.toLowerCase();$.removeData(a,PROP_NAME),d=="input"?(c.append.remove(),c.trigger.remove(),b.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)):(d=="div"||d=="span")&&b.removeClass(this.markerClassName).empty()}},_enableDatepicker:function(a){var b=$(a),c=$.data(a,PROP_NAME);if(!!b.hasClass(this.markerClassName)){var d=a.nodeName.toLowerCase();if(d=="input")a.disabled=!1,c.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""});else if(d=="div"||d=="span"){var e=b.children("."+this._inlineClass);e.children().removeClass("ui-state-disabled"),e.find("select.ui-datepicker-month, select.ui-datepicker-year").removeAttr("disabled")}this._disabledInputs=$.map(this._disabledInputs,function(b){return b==a?null:b})}},_disableDatepicker:function(a){var b=$(a),c=$.data(a,PROP_NAME);if(!!b.hasClass(this.markerClassName)){var d=a.nodeName.toLowerCase();if(d=="input")a.disabled=!0,c.trigger.filter("button").each(function(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"});else if(d=="div"||d=="span"){var e=b.children("."+this._inlineClass);e.children().addClass("ui-state-disabled"),e.find("select.ui-datepicker-month, select.ui-datepicker-year").attr("disabled","disabled")}this._disabledInputs=$.map(this._disabledInputs,function(b){return b==a?null:b}),this._disabledInputs[this._disabledInputs.length]=a}},_isDisabledDatepicker:function(a){if(!a)return!1;for(var b=0;b<this._disabledInputs.length;b++)if(this._disabledInputs[b]==a)return!0;return!1},_getInst:function(a){try{return $.data(a,PROP_NAME)}catch(b){throw"Missing instance data for this datepicker"}},_optionDatepicker:function(a,b,c){var d=this._getInst(a);if(arguments.length==2&&typeof b=="string")return b=="defaults"?$.extend({},$.datepicker._defaults):d?b=="all"?$.extend({},d.settings):this._get(d,b):null;var e=b||{};typeof b=="string"&&(e={},e[b]=c);if(d){this._curInst==d&&this._hideDatepicker();var f=this._getDateDatepicker(a,!0),g=this._getMinMaxDate(d,"min"),h=this._getMinMaxDate(d,"max");extendRemove(d.settings,e),g!==null&&e.dateFormat!==undefined&&e.minDate===undefined&&(d.settings.minDate=this._formatDate(d,g)),h!==null&&e.dateFormat!==undefined&&e.maxDate===undefined&&(d.settings.maxDate=this._formatDate(d,h)),this._attachments($(a),d),this._autoSize(d),this._setDate(d,f),this._updateAlternate(d),this._updateDatepicker(d)}},_changeDatepicker:function(a,b,c){this._optionDatepicker(a,b,c)},_refreshDatepicker:function(a){var b=this._getInst(a);b&&this._updateDatepicker(b)},_setDateDatepicker:function(a,b){var c=this._getInst(a);c&&(this._setDate(c,b),this._updateDatepicker(c),this._updateAlternate(c))},_getDateDatepicker:function(a,b){var c=this._getInst(a);c&&!c.inline&&this._setDateFromField(c,b);return c?this._getDate(c):null},_doKeyDown:function(a){var b=$.datepicker._getInst(a.target),c=!0,d=b.dpDiv.is(".ui-datepicker-rtl");b._keyEvent=!0;if($.datepicker._datepickerShowing)switch(a.keyCode){case 9:$.datepicker._hideDatepicker(),c=!1;break;case 13:var e=$("td."+$.datepicker._dayOverClass+":not(."+$.datepicker._currentClass+")",b.dpDiv);e[0]&&$.datepicker._selectDay(a.target,b.selectedMonth,b.selectedYear,e[0]);var f=$.datepicker._get(b,"onSelect");if(f){var g=$.datepicker._formatDate(b);f.apply(b.input?b.input[0]:null,[g,b])}else $.datepicker._hideDatepicker();return!1;case 27:$.datepicker._hideDatepicker();break;case 33:$.datepicker._adjustDate(a.target,a.ctrlKey?-$.datepicker._get(b,"stepBigMonths"):-$.datepicker._get(b,"stepMonths"),"M");break;case 34:$.datepicker._adjustDate(a.target,a.ctrlKey?+$.datepicker._get(b,"stepBigMonths"):+$.datepicker._get(b,"stepMonths"),"M");break;case 35:(a.ctrlKey||a.metaKey)&&$.datepicker._clearDate(a.target),c=a.ctrlKey||a.metaKey;break;case 36:(a.ctrlKey||a.metaKey)&&$.datepicker._gotoToday(a.target),c=a.ctrlKey||a.metaKey;break;case 37:(a.ctrlKey||a.metaKey)&&$.datepicker._adjustDate(a.target,d?1:-1,"D"),c=a.ctrlKey||a.metaKey,a.originalEvent.altKey&&$.datepicker._adjustDate(a.target,a.ctrlKey?-$.datepicker._get(b,"stepBigMonths"):-$.datepicker._get(b,"stepMonths"),"M");break;case 38:(a.ctrlKey||a.metaKey)&&$.datepicker._adjustDate(a.target,-7,"D"),c=a.ctrlKey||a.metaKey;break;case 39:(a.ctrlKey||a.metaKey)&&$.datepicker._adjustDate(a.target,d?-1:1,"D"),c=a.ctrlKey||a.metaKey,a.originalEvent.altKey&&$.datepicker._adjustDate(a.target,a.ctrlKey?+$.datepicker._get(b,"stepBigMonths"):+$.datepicker._get(b,"stepMonths"),"M");break;case 40:(a.ctrlKey||a.metaKey)&&$.datepicker._adjustDate(a.target,7,"D"),c=a.ctrlKey||a.metaKey;break;default:c=!1}else a.keyCode==36&&a.ctrlKey?$.datepicker._showDatepicker(this):c=!1;c&&(a.preventDefault(),a.stopPropagation())},_doKeyPress:function(a){var b=$.datepicker._getInst(a.target);if($.datepicker._get(b,"constrainInput")){var c=$.datepicker._possibleChars($.datepicker._get(b,"dateFormat")),d=String.fromCharCode(a.charCode==undefined?a.keyCode:a.charCode);return a.ctrlKey||a.metaKey||d<" "||!c||c.indexOf(d)>-1}},_doKeyUp:function(a){var b=$.datepicker._getInst(a.target);if(b.input.val()!=b.lastVal)try{var c=$.datepicker.parseDate($.datepicker._get(b,"dateFormat"),b.input?b.input.val():null,$.datepicker._getFormatConfig(b));c&&($.datepicker._setDateFromField(b),$.datepicker._updateAlternate(b),$.datepicker._updateDatepicker(b))}catch(a){$.datepicker.log(a)}return!0},_showDatepicker:function(a){a=a.target||a,a.nodeName.toLowerCase()!="input"&&(a=$("input",a.parentNode)[0]);if(!$.datepicker._isDisabledDatepicker(a)&&$.datepicker._lastInput!=a){var b=$.datepicker._getInst(a);$.datepicker._curInst&&$.datepicker._curInst!=b&&($.datepicker._curInst.dpDiv.stop(!0,!0),b&&$.datepicker._datepickerShowing&&$.datepicker._hideDatepicker($.datepicker._curInst.input[0]));var c=$.datepicker._get(b,"beforeShow"),d=c?c.apply(a,[a,b]):{};if(d===!1)return;extendRemove(b.settings,d),b.lastVal=null,$.datepicker._lastInput=a,$.datepicker._setDateFromField(b),$.datepicker._inDialog&&(a.value=""),$.datepicker._pos||($.datepicker._pos=$.datepicker._findPos(a),$.datepicker._pos[1]+=a.offsetHeight);var e=!1;$(a).parents().each(function(){e|=$(this).css("position")=="fixed";return!e}),e&&$.browser.opera&&($.datepicker._pos[0]-=document.documentElement.scrollLeft,$.datepicker._pos[1]-=document.documentElement.scrollTop);var f={left:$.datepicker._pos[0],top:$.datepicker._pos[1]};$.datepicker._pos=null,b.dpDiv.empty(),b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"}),$.datepicker._updateDatepicker(b),f=$.datepicker._checkOffset(b,f,e),b.dpDiv.css({position:$.datepicker._inDialog&&$.blockUI?"static":e?"fixed":"absolute",display:"none",left:f.left+"px",top:f.top+"px"});if(!b.inline){var g=$.datepicker._get(b,"showAnim"),h=$.datepicker._get(b,"duration"),i=function(){var a=b.dpDiv.find("iframe.ui-datepicker-cover");if(!!a.length){var c=$.datepicker._getBorders(b.dpDiv);a.css({left:-c[0],top:-c[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()})}};b.dpDiv.zIndex($(a).zIndex()+1),$.datepicker._datepickerShowing=!0,$.effects&&$.effects[g]?b.dpDiv.show(g,$.datepicker._get(b,"showOptions"),h,i):b.dpDiv[g||"show"](g?h:null,i),(!g||!h)&&i(),b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus(),$.datepicker._curInst=b}}},_updateDatepicker:function(a){var b=this;b.maxRows=4;var c=$.datepicker._getBorders(a.dpDiv);instActive=a,a.dpDiv.empty().append(this._generateHTML(a));var d=a.dpDiv.find("iframe.ui-datepicker-cover");!d.length||d.css({left:-c[0],top:-c[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()}),a.dpDiv.find("."+this._dayOverClass+" a").mouseover();var e=this._getNumberOfMonths(a),f=e[1],g=17;a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""),f>1&&a.dpDiv.addClass("ui-datepicker-multi-"+f).css("width",g*f+"em"),a.dpDiv[(e[0]!=1||e[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi"),a.dpDiv[(this._get(a,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"),a==$.datepicker._curInst&&$.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&&a.input[0]!=document.activeElement&&a.input.focus();if(a.yearshtml){var h=a.yearshtml;setTimeout(function(){h===a.yearshtml&&a.yearshtml&&a.dpDiv.find("select.ui-datepicker-year:first").replaceWith(a.yearshtml),h=a.yearshtml=null},0)}},_getBorders:function(a){var b=function(a){return{thin:1,medium:2,thick:3}[a]||a};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]},_checkOffset:function(a,b,c){var d=a.dpDiv.outerWidth(),e=a.dpDiv.outerHeight(),f=a.input?a.input.outerWidth():0,g=a.input?a.input.outerHeight():0,h=document.documentElement.clientWidth+$(document).scrollLeft(),i=document.documentElement.clientHeight+$(document).scrollTop();b.left-=this._get(a,"isRTL")?d-f:0,b.left-=c&&b.left==a.input.offset().left?$(document).scrollLeft():0,b.top-=c&&b.top==a.input.offset().top+g?$(document).scrollTop():0,b.left-=Math.min(b.left,b.left+d>h&&h>d?Math.abs(b.left+d-h):0),b.top-=Math.min(b.top,b.top+e>i&&i>e?Math.abs(e+g):0);return b},_findPos:function(a){var b=this._getInst(a),c=this._get(b,"isRTL");while(a&&(a.type=="hidden"||a.nodeType!=1||$.expr.filters.hidden(a)))a=a[c?"previousSibling":"nextSibling"];var d=$(a).offset();return[d.left,d.top]},_hideDatepicker:function(a){var b=this._curInst;if(!(!b||a&&b!=$.data(a,PROP_NAME))&&this._datepickerShowing){var c=this._get(b,"showAnim"),d=this._get(b,"duration"),e=this,f=function(){$.datepicker._tidyDialog(b),e._curInst=null};$.effects&&$.effects[c]?b.dpDiv.hide(c,$.datepicker._get(b,"showOptions"),d,f):b.dpDiv[c=="slideDown"?"slideUp":c=="fadeIn"?"fadeOut":"hide"](c?d:null,f),c||f(),this._datepickerShowing=!1;var g=this._get(b,"onClose");g&&g.apply(b.input?b.input[0]:null,[b.input?b.input.val():"",b]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),$.blockUI&&($.unblockUI(),$("body").append(this.dpDiv))),this._inDialog=!1}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(a){if(!!$.datepicker._curInst){var b=$(a.target),c=$.datepicker._getInst(b[0]);(b[0].id!=$.datepicker._mainDivId&&b.parents("#"+$.datepicker._mainDivId).length==0&&!b.hasClass($.datepicker.markerClassName)&&!b.closest("."+$.datepicker._triggerClass).length&&$.datepicker._datepickerShowing&&(!$.datepicker._inDialog||!$.blockUI)||b.hasClass($.datepicker.markerClassName)&&$.datepicker._curInst!=c)&&$.datepicker._hideDatepicker()}},_adjustDate:function(a,b,c){var d=$(a),e=this._getInst(d[0]);this._isDisabledDatepicker(d[0])||(this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"):0),c),this._updateDatepicker(e))},_gotoToday:function(a){var b=$(a),c=this._getInst(b[0]);if(this._get(c,"gotoCurrent")&&c.currentDay)c.selectedDay=c.currentDay,c.drawMonth=c.selectedMonth=c.currentMonth,c.drawYear=c.selectedYear=c.currentYear;else{var d=new Date;c.selectedDay=d.getDate(),c.drawMonth=c.selectedMonth=d.getMonth(),c.drawYear=c.selectedYear=d.getFullYear()}this._notifyChange(c),this._adjustDate(b)},_selectMonthYear:function(a,b,c){var d=$(a),e=this._getInst(d[0]);e["selected"+(c=="M"?"Month":"Year")]=e["draw"+(c=="M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10),this._notifyChange(e),this._adjustDate(d)},_selectDay:function(a,b,c,d){var e=$(a);if(!$(d).hasClass(this._unselectableClass)&&!this._isDisabledDatepicker(e[0])){var f=this._getInst(e[0]);f.selectedDay=f.currentDay=$("a",d).html(),f.selectedMonth=f.currentMonth=b,f.selectedYear=f.currentYear=c,this._selectDate(a,this._formatDate(f,f.currentDay,f.currentMonth,f.currentYear))}},_clearDate:function(a){var b=$(a),c=this._getInst(b[0]);this._selectDate(b,"")},_selectDate:function(a,b){var c=$(a),d=this._getInst(c[0]);b=b!=null?b:this._formatDate(d),d.input&&d.input.val(b),this._updateAlternate(d);var e=this._get(d,"onSelect");e?e.apply(d.input?d.input[0]:null,[b,d]):d.input&&d.input.trigger("change"),d.inline?this._updateDatepicker(d):(this._hideDatepicker(),this._lastInput=d.input[0],typeof d.input[0]!="object"&&d.input.focus(),this._lastInput=null)},_updateAlternate:function(a){var b=this._get(a,"altField");if(b){var c=this._get(a,"altFormat")||this._get(a,"dateFormat"),d=this._getDate(a),e=this.formatDate(c,d,this._getFormatConfig(a));$(b).each(function(){$(this).val(e)})}},noWeekends:function(a){var b=a.getDay();return[b>0&&b<6,""]},iso8601Week:function(a){var b=new Date(a.getTime());b.setDate(b.getDate()+4-(b.getDay()||7));var c=b.getTime();b.setMonth(0),b.setDate(1);return Math.floor(Math.round((c-b)/864e5)/7)+1},parseDate:function(a,b,c){if(a==null||b==null)throw"Invalid arguments";b=typeof b=="object"?b.toString():b+"";if(b=="")return null;var d=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff;d=typeof d!="string"?d:(new Date).getFullYear()%100+parseInt(d,10);var e=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,f=(c?c.dayNames:null)||this._defaults.dayNames,g=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,h=(c?c.monthNames:null)||this._defaults.monthNames,i=-1,j=-1,k=-1,l=-1,m=!1,n=function(b){var c=s+1<a.length&&a.charAt(s+1)==b;c&&s++;return c},o=function(a){var c=n(a),d=a=="@"?14:a=="!"?20:a=="y"&&c?4:a=="o"?3:2,e=new RegExp("^\\d{1,"+d+"}"),f=b.substring(r).match(e);if(!f)throw"Missing number at position "+r;r+=f[0].length;return parseInt(f[0],10)},p=function(a,c,d){var e=$.map(n(a)?d:c,function(a,b){return[[b,a]]}).sort(function(a,b){return-(a[1].length-b[1].length)}),f=-1;$.each(e,function(a,c){var d=c[1];if(b.substr(r,d.length).toLowerCase()==d.toLowerCase()){f=c[0],r+=d.length;return!1}});if(f!=-1)return f+1;throw"Unknown name at position "+r},q=function(){if(b.charAt(r)!=a.charAt(s))throw"Unexpected literal at position "+r;r++},r=0;for(var s=0;s<a.length;s++)if(m)a.charAt(s)=="'"&&!n("'")?m=!1:q();else switch(a.charAt(s)){case"d":k=o("d");break;case"D":p("D",e,f);break;case"o":l=o("o");break;case"m":j=o("m");break;case"M":j=p("M",g,h);break;case"y":i=o("y");break;case"@":var t=new Date(o("@"));i=t.getFullYear(),j=t.getMonth()+1,k=t.getDate();break;case"!":var t=new Date((o("!")-this._ticksTo1970)/1e4);i=t.getFullYear(),j=t.getMonth()+1,k=t.getDate();break;case"'":n("'")?q():m=!0;break;default:q()}if(r<b.length)throw"Extra/unparsed characters found in date: "+b.substring(r);i==-1?i=(new Date).getFullYear():i<100&&(i+=(new Date).getFullYear()-(new Date).getFullYear()%100+(i<=d?0:-100));if(l>-1){j=1,k=l;for(;;){var u=this._getDaysInMonth(i,j-1);if(k<=u)break;j++,k-=u}}var t=this._daylightSavingAdjust(new Date(i,j-1,k));if(t.getFullYear()!=i||t.getMonth()+1!=j||t.getDate()!=k)throw"Invalid date";return t},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*60*60*1e7,formatDate:function(a,b,c){if(!b)return"";var d=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,e=(c?c.dayNames:null)||this._defaults.dayNames,f=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,g=(c?c.monthNames:null)||this._defaults.monthNames,h=function(b){var c=m+1<a.length&&a.charAt(m+1)==b;c&&m++;return c},i=function(a,b,c){var d=""+b;if(h(a))while(d.length<c)d="0"+d;return d},j=function(a,b,c,d){return h(a)?d[b]:c[b]},k="",l=!1;if(b)for(var m=0;m<a.length;m++)if(l)a.charAt(m)=="'"&&!h("'")?l=!1:k+=a.charAt(m);else switch(a.charAt(m)){case"d":k+=i("d",b.getDate(),2);break;case"D":k+=j("D",b.getDay(),d,e);break;case"o":k+=i("o",Math.round(((new Date(b.getFullYear(),b.getMonth(),b.getDate())).getTime()-(new Date(b.getFullYear(),0,0)).getTime())/864e5),3);break;case"m":k+=i("m",b.getMonth()+1,2);break;case"M":k+=j("M",b.getMonth(),f,g);break;case"y":k+=h("y")?b.getFullYear():(b.getYear()%100<10?"0":"")+b.getYear()%100;break;case"@":k+=b.getTime();break;case"!":k+=b.getTime()*1e4+this._ticksTo1970;break;case"'":h("'")?k+="'":l=!0;break;default:k+=a.charAt(m)}return k},_possibleChars:function(a){var b="",c=!1,d=function(b){var c=e+1<a.length&&a.charAt(e+1)==b;c&&e++;return c};for(var e=0;e<a.length;e++)if(c)a.charAt(e)=="'"&&!d("'")?c=!1:b+=a.charAt(e);else switch(a.charAt(e)){case"d":case"m":case"y":case"@":b+="0123456789";break;case"D":case"M":return null;case"'":d("'")?b+="'":c=!0;break;default:b+=a.charAt(e)}return b},_get:function(a,b){return a.settings[b]!==undefined?a.settings[b]:this._defaults[b]},_setDateFromField:function(a,b){if(a.input.val()!=a.lastVal){var c=this._get(a,"dateFormat"),d=a.lastVal=a.input?a.input.val():null,e,f;e=f=this._getDefaultDate(a);var g=this._getFormatConfig(a);try{e=this.parseDate(c,d,g)||f}catch(h){this.log(h),d=b?"":d}a.selectedDay=e.getDate(),a.drawMonth=a.selectedMonth=e.getMonth(),a.drawYear=a.selectedYear=e.getFullYear(),a.currentDay=d?e.getDate():0,a.currentMonth=d?e.getMonth():0,a.currentYear=d?e.getFullYear():0,this._adjustInstDate(a)}},_getDefaultDate:function(a){return this._restrictMinMax(a,this._determineDate(a,this._get(a,"defaultDate"),new Date))},_determineDate:function(a,b,c){var d=function(a){var b=new Date;b.setDate(b.getDate()+a);return b},e=function(b){try{return $.datepicker.parseDate($.datepicker._get(a,"dateFormat"),b,$.datepicker._getFormatConfig(a))}catch(c){}var d=(b.toLowerCase().match(/^c/)?$.datepicker._getDate(a):null)||new Date,e=d.getFullYear(),f=d.getMonth(),g=d.getDate(),h=/([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,i=h.exec(b);while(i){switch(i[2]||"d"){case"d":case"D":g+=parseInt(i[1],10);break;case"w":case"W":g+=parseInt(i[1],10)*7;break;case"m":case"M":f+=parseInt(i[1],10),g=Math.min(g,$.datepicker._getDaysInMonth(e,f));break;case"y":case"Y":e+=parseInt(i[1],10),g=Math.min(g,$.datepicker._getDaysInMonth(e,f))}i=h.exec(b)}return new Date(e,f,g)},f=b==null||b===""?c:typeof b=="string"?e(b):typeof b=="number"?isNaN(b)?c:d(b):new Date(b.getTime());f=f&&f.toString()=="Invalid Date"?c:f,f&&(f.setHours(0),f.setMinutes(0),f.setSeconds(0),f.setMilliseconds(0));return this._daylightSavingAdjust(f)},_daylightSavingAdjust:function(a){if(!a)return null;a.setHours(a.getHours()>12?a.getHours()+2:0);return a},_setDate:function(a,b,c){var d=!b,e=a.selectedMonth,f=a.selectedYear,g=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay=a.currentDay=g.getDate(),a.drawMonth=a.selectedMonth=a.currentMonth=g.getMonth(),a.drawYear=a.selectedYear=a.currentYear=g.getFullYear(),(e!=a.selectedMonth||f!=a.selectedYear)&&!c&&this._notifyChange(a),this._adjustInstDate(a),a.input&&a.input.val(d?"":this._formatDate(a))},_getDate:function(a){var b=!a.currentYear||a.input&&a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return b},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFullYear(),b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),d=this._get(a,"showButtonPanel"),e=this._get(a,"hideIfNoPrevNext"),f=this._get(a,"navigationAsDateFormat"),g=this._getNumberOfMonths(a),h=this._get(a,"showCurrentAtPos"),i=this._get(a,"stepMonths"),j=g[0]!=1||g[1]!=1,k=this._daylightSavingAdjust(a.currentDay?new Date(a.currentYear,a.currentMonth,a.currentDay):new Date(9999,9,9)),l=this._getMinMaxDate(a,"min"),m=this._getMinMaxDate(a,"max"),n=a.drawMonth-h,o=a.drawYear;n<0&&(n+=12,o--);if(m){var p=this._daylightSavingAdjust(new Date(m.getFullYear(),m.getMonth()-g[0]*g[1]+1,m.getDate()));p=l&&p<l?l:p;while(this._daylightSavingAdjust(new Date(o,n,1))>p)n--,n<0&&(n=11,o--)}a.drawMonth=n,a.drawYear=o;var q=this._get(a,"prevText");q=f?this.formatDate(q,this._daylightSavingAdjust(new Date(o,n-i,1)),this._getFormatConfig(a)):q;var r=this._canAdjustMonth(a,-1,o,n)?'<a class="ui-datepicker-prev ui-corner-all" onclick="DP_jQuery_'+dpuuid+".datepicker._adjustDate('#"+a.id+"', -"+i+", 'M');\""+' title="'+q+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"e":"w")+'">'+q+"</span></a>":e?"":'<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+q+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"e":"w")+'">'+q+"</span></a>",s=this._get(a,"nextText");s=f?this.formatDate(s,this._daylightSavingAdjust(new Date(o,n+i,1)),this._getFormatConfig(a)):s;var t=this._canAdjustMonth(a,1,o,n)?'<a class="ui-datepicker-next ui-corner-all" onclick="DP_jQuery_'+dpuuid+".datepicker._adjustDate('#"+a.id+"', +"+i+", 'M');\""+' title="'+s+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"w":"e")+'">'+s+"</span></a>":e?"":'<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+s+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"w":"e")+'">'+s+"</span></a>",u=this._get(a,"currentText"),v=this._get(a,"gotoCurrent")&&a.currentDay?k:b;u=f?this.formatDate(u,v,this._getFormatConfig(a)):u;var w=a.inline?"":'<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery_'+dpuuid+'.datepicker._hideDatepicker();">'+this._get(a,"closeText")+"</button>",x=d?'<div class="ui-datepicker-buttonpane ui-widget-content">'+(c?w:"")+(this._isInRange(a,v)?'<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" onclick="DP_jQuery_'+dpuuid+".datepicker._gotoToday('#"+a.id+"');\""+">"+u+"</button>":"")+(c?"":w)+"</div>":"",y=parseInt(this._get(a,"firstDay"),10);y=isNaN(y)?0:y;var z=this._get(a,"showWeek"),A=this._get(a,"dayNames"),B=this._get(a,"dayNamesShort"),C=this._get(a,"dayNamesMin"),D=this._get(a,"monthNames"),E=this._get(a,"monthNamesShort"),F=this._get(a,"beforeShowDay"),G=this._get(a,"showOtherMonths"),H=this._get(a,"selectOtherMonths"),I=this._get(a,"calculateWeek")||this.iso8601Week,J=this._getDefaultDate(a),K="";for(var L=0;L<g[0];L++){var M="";this.maxRows=4;for(var N=0;N<g[1];N++){var O=this._daylightSavingAdjust(new Date(o,n,a.selectedDay)),P=" ui-corner-all",Q="";if(j){Q+='<div class="ui-datepicker-group';if(g[1]>1)switch(N){case 0:Q+=" ui-datepicker-group-first",P=" ui-corner-"+(c?"right":"left");break;case g[1]-1:Q+=" ui-datepicker-group-last",P=" ui-corner-"+(c?"left":"right");break;default:Q+=" ui-datepicker-group-middle",P=""}Q+='">'}Q+='<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix'+P+'">'+(/all|left/.test(P)&&L==0?c?t:r:"")+(/all|right/.test(P)&&L==0?c?r:t:"")+this._generateMonthYearHeader(a,n,o,l,m,L>0||N>0,D,E)+'</div><table class="ui-datepicker-calendar"><thead>'+"<tr>";var R=z?'<th class="ui-datepicker-week-col">'+this._get(a,"weekHeader")+"</th>":"";for(var S=0;S<7;S++){var T=(S+y)%7;R+="<th"+((S+y+6)%7>=5?' class="ui-datepicker-week-end"':"")+">"+'<span title="'+A[T]+'">'+C[T]+"</span></th>"}Q+=R+"</tr></thead><tbody>";var U=this._getDaysInMonth(o,n);o==a.selectedYear&&n==a.selectedMonth&&(a.selectedDay=Math.min(a.selectedDay,U));var V=(this._getFirstDayOfMonth(o,n)-y+7)%7,W=Math.ceil((V+U)/7),X=j?this.maxRows>W?this.maxRows:W:W;this.maxRows=X;var Y=this._daylightSavingAdjust(new Date(o,n,1-V));for(var Z=0;Z<X;Z++){Q+="<tr>";var _=z?'<td class="ui-datepicker-week-col">'+this._get(a,"calculateWeek")(Y)+"</td>":"";for(var S=0;S<7;S++){var ba=F?F.apply(a.input?a.input[0]:null,[Y]):[!0,""],bb=Y.getMonth()!=n,bc=bb&&!H||!ba[0]||l&&Y<l||m&&Y>m;_+='<td class="'+((S+y+6)%7>=5?" ui-datepicker-week-end":"")+(bb?" ui-datepicker-other-month":"")+(Y.getTime()==O.getTime()&&n==a.selectedMonth&&a._keyEvent||J.getTime()==Y.getTime()&&J.getTime()==O.getTime()?" "+this._dayOverClass:"")+(bc?" "+this._unselectableClass+" ui-state-disabled":"")+(bb&&!G?"":" "+ba[1]+(Y.getTime()==k.getTime()?" "+this._currentClass:"")+(Y.getTime()==b.getTime()?" ui-datepicker-today":""))+'"'+((!bb||G)&&ba[2]?' title="'+ba[2]+'"':"")+(bc?"":' onclick="DP_jQuery_'+dpuuid+".datepicker._selectDay('#"+a.id+"',"+Y.getMonth()+","+Y.getFullYear()+', this);return false;"')+">"+(bb&&!G?"&#xa0;":bc?'<span class="ui-state-default">'+Y.getDate()+"</span>":'<a class="ui-state-default'+(Y.getTime()==b.getTime()?" ui-state-highlight":"")+(Y.getTime()==k.getTime()?" ui-state-active":"")+(bb?" ui-priority-secondary":"")+'" href="#">'+Y.getDate()+"</a>")+"</td>",Y.setDate(Y.getDate()+1),Y=this._daylightSavingAdjust(Y)}Q+=_+"</tr>"}n++,n>11&&(n=0,o++),Q+="</tbody></table>"+(j?"</div>"+(g[0]>0&&N==g[1]-1?'<div class="ui-datepicker-row-break"></div>':""):""),M+=Q}K+=M}K+=x+($.browser.msie&&parseInt($.browser.version,10)<7&&!a.inline?'<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>':""),
+a._keyEvent=!1;return K},_generateMonthYearHeader:function(a,b,c,d,e,f,g,h){var i=this._get(a,"changeMonth"),j=this._get(a,"changeYear"),k=this._get(a,"showMonthAfterYear"),l='<div class="ui-datepicker-title">',m="";if(f||!i)m+='<span class="ui-datepicker-month">'+g[b]+"</span>";else{var n=d&&d.getFullYear()==c,o=e&&e.getFullYear()==c;m+='<select class="ui-datepicker-month" onchange="DP_jQuery_'+dpuuid+".datepicker._selectMonthYear('#"+a.id+"', this, 'M');\" "+">";for(var p=0;p<12;p++)(!n||p>=d.getMonth())&&(!o||p<=e.getMonth())&&(m+='<option value="'+p+'"'+(p==b?' selected="selected"':"")+">"+h[p]+"</option>");m+="</select>"}k||(l+=m+(f||!i||!j?"&#xa0;":""));if(!a.yearshtml){a.yearshtml="";if(f||!j)l+='<span class="ui-datepicker-year">'+c+"</span>";else{var q=this._get(a,"yearRange").split(":"),r=(new Date).getFullYear(),s=function(a){var b=a.match(/c[+-].*/)?c+parseInt(a.substring(1),10):a.match(/[+-].*/)?r+parseInt(a,10):parseInt(a,10);return isNaN(b)?r:b},t=s(q[0]),u=Math.max(t,s(q[1]||""));t=d?Math.max(t,d.getFullYear()):t,u=e?Math.min(u,e.getFullYear()):u,a.yearshtml+='<select class="ui-datepicker-year" onchange="DP_jQuery_'+dpuuid+".datepicker._selectMonthYear('#"+a.id+"', this, 'Y');\" "+">";for(;t<=u;t++)a.yearshtml+='<option value="'+t+'"'+(t==c?' selected="selected"':"")+">"+t+"</option>";a.yearshtml+="</select>",l+=a.yearshtml,a.yearshtml=null}}l+=this._get(a,"yearSuffix"),k&&(l+=(f||!i||!j?"&#xa0;":"")+m),l+="</div>";return l},_adjustInstDate:function(a,b,c){var d=a.drawYear+(c=="Y"?b:0),e=a.drawMonth+(c=="M"?b:0),f=Math.min(a.selectedDay,this._getDaysInMonth(d,e))+(c=="D"?b:0),g=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(d,e,f)));a.selectedDay=g.getDate(),a.drawMonth=a.selectedMonth=g.getMonth(),a.drawYear=a.selectedYear=g.getFullYear(),(c=="M"||c=="Y")&&this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min"),d=this._getMinMaxDate(a,"max"),e=c&&b<c?c:b;e=d&&e>d?d:e;return e},_notifyChange:function(a){var b=this._get(a,"onChangeMonthYear");b&&b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){var b=this._get(a,"numberOfMonths");return b==null?[1,1]:typeof b=="number"?[1,b]:b},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-this._daylightSavingAdjust(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,d){var e=this._getNumberOfMonths(a),f=this._daylightSavingAdjust(new Date(c,d+(b<0?b:e[0]*e[1]),1));b<0&&f.setDate(this._getDaysInMonth(f.getFullYear(),f.getMonth()));return this._isInRange(a,f)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min"),d=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!d||b.getTime()<=d.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10);return{shortYearCutoff:b,dayNamesShort:this._get(a,"dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,d){b||(a.currentDay=a.selectedDay,a.currentMonth=a.selectedMonth,a.currentYear=a.selectedYear);var e=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(d,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),e,this._getFormatConfig(a))}}),$.fn.datepicker=function(a){if(!this.length)return this;$.datepicker.initialized||($(document).mousedown($.datepicker._checkExternalClick).find("body").append($.datepicker.dpDiv),$.datepicker.initialized=!0);var b=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return $.datepicker["_"+a+"Datepicker"].apply($.datepicker,[this[0]].concat(b));if(a=="option"&&arguments.length==2&&typeof arguments[1]=="string")return $.datepicker["_"+a+"Datepicker"].apply($.datepicker,[this[0]].concat(b));return this.each(function(){typeof a=="string"?$.datepicker["_"+a+"Datepicker"].apply($.datepicker,[this].concat(b)):$.datepicker._attachDatepicker(this,a)})},$.datepicker=new Datepicker,$.datepicker.initialized=!1,$.datepicker.uuid=(new Date).getTime(),$.datepicker.version="1.8.18",window["DP_jQuery_"+dpuuid]=$})(jQuery);/*
+ * jQuery UI Progressbar 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Progressbar
+ *
+ * Depends:
+ *   jquery.ui.core.js
+ *   jquery.ui.widget.js
+ */(function(a,b){a.widget("ui.progressbar",{options:{value:0,max:100},min:0,_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min,"aria-valuemax":this.options.max,"aria-valuenow":this._value()}),this.valueDiv=a("<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>").appendTo(this.element),this.oldValue=this._value(),this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.valueDiv.remove(),a.Widget.prototype.destroy.apply(this,arguments)},value:function(a){if(a===b)return this._value();this._setOption("value",a);return this},_setOption:function(b,c){b==="value"&&(this.options.value=c,this._refreshValue(),this._value()===this.options.max&&this._trigger("complete")),a.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var a=this.options.value;typeof a!="number"&&(a=0);return Math.min(this.options.max,Math.max(this.min,a))},_percentage:function(){return 100*this._value()/this.options.max},_refreshValue:function(){var a=this.value(),b=this._percentage();this.oldValue!==a&&(this.oldValue=a,this._trigger("change")),this.valueDiv.toggle(a>this.min).toggleClass("ui-corner-right",a===this.options.max).width(b.toFixed(0)+"%"),this.element.attr("aria-valuenow",a)}}),a.extend(a.ui.progressbar,{version:"1.8.18"})})(jQuery);/*
+ * jQuery UI Effects 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/
+ */jQuery.effects||function(a,b){function l(b){if(!b||typeof b=="number"||a.fx.speeds[b])return!0;if(typeof b=="string"&&!a.effects[b])return!0;return!1}function k(b,c,d,e){typeof b=="object"&&(e=c,d=null,c=b,b=c.effect),a.isFunction(c)&&(e=c,d=null,c={});if(typeof c=="number"||a.fx.speeds[c])e=d,d=c,c={};a.isFunction(d)&&(e=d,d=null),c=c||{},d=d||c.duration,d=a.fx.off?0:typeof d=="number"?d:d in a.fx.speeds?a.fx.speeds[d]:a.fx.speeds._default,e=e||c.complete;return[b,c,d,e]}function j(a,b){var c={_:0},d;for(d in b)a[d]!=b[d]&&(c[d]=b[d]);return c}function i(b){var c,d;for(c in b)d=b[c],(d==null||a.isFunction(d)||c in g||/scrollbar/.test(c)||!/color/i.test(c)&&isNaN(parseFloat(d)))&&delete b[c];return b}function h(){var a=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle,b={},c,d;if(a&&a.length&&a[0]&&a[a[0]]){var e=a.length;while(e--)c=a[e],typeof a[c]=="string"&&(d=c.replace(/\-(\w)/g,function(a,b){return b.toUpperCase()}),b[d]=a[c])}else for(c in a)typeof a[c]=="string"&&(b[c]=a[c]);return b}function d(b,d){var e;do{e=a.curCSS(b,d);if(e!=""&&e!="transparent"||a.nodeName(b,"body"))break;d="backgroundColor"}while(b=b.parentNode);return c(e)}function c(b){var c;if(b&&b.constructor==Array&&b.length==3)return b;if(c=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(b))return[parseInt(c[1],10),parseInt(c[2],10),parseInt(c[3],10)];if(c=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(b))return[parseFloat(c[1])*2.55,parseFloat(c[2])*2.55,parseFloat(c[3])*2.55];if(c=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(b))return[parseInt(c[1],16),parseInt(c[2],16),parseInt(c[3],16)];if(c=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(b))return[parseInt(c[1]+c[1],16),parseInt(c[2]+c[2],16),parseInt(c[3]+c[3],16)];if(c=/rgba\(0, 0, 0, 0\)/.exec(b))return e.transparent;return e[a.trim(b).toLowerCase()]}a.effects={},a.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor","borderTopColor","borderColor","color","outlineColor"],function(b,e){a.fx.step[e]=function(a){a.colorInit||(a.start=d(a.elem,e),a.end=c(a.end),a.colorInit=!0),a.elem.style[e]="rgb("+Math.max(Math.min(parseInt(a.pos*(a.end[0]-a.start[0])+a.start[0],10),255),0)+","+Math.max(Math.min(parseInt(a.pos*(a.end[1]-a.start[1])+a.start[1],10),255),0)+","+Math.max(Math.min(parseInt(a.pos*(a.end[2]-a.start[2])+a.start[2],10),255),0)+")"}});var e={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},f=["add","remove","toggle"],g={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};a.effects.animateClass=function(b,c,d,e){a.isFunction(d)&&(e=d,d=null);return this.queue(function(){var g=a(this),k=g.attr("style")||" ",l=i(h.call(this)),m,n=g.attr("class");a.each(f,function(a,c){b[c]&&g[c+"Class"](b[c])}),m=i(h.call(this)),g.attr("class",n),g.animate(j(l,m),{queue:!1,duration:c,easing:d,complete:function(){a.each(f,function(a,c){b[c]&&g[c+"Class"](b[c])}),typeof g.attr("style")=="object"?(g.attr("style").cssText="",g.attr("style").cssText=k):g.attr("style",k),e&&e.apply(this,arguments),a.dequeue(this)}})})},a.fn.extend({_addClass:a.fn.addClass,addClass:function(b,c,d,e){return c?a.effects.animateClass.apply(this,[{add:b},c,d,e]):this._addClass(b)},_removeClass:a.fn.removeClass,removeClass:function(b,c,d,e){return c?a.effects.animateClass.apply(this,[{remove:b},c,d,e]):this._removeClass(b)},_toggleClass:a.fn.toggleClass,toggleClass:function(c,d,e,f,g){return typeof d=="boolean"||d===b?e?a.effects.animateClass.apply(this,[d?{add:c}:{remove:c},e,f,g]):this._toggleClass(c,d):a.effects.animateClass.apply(this,[{toggle:c},d,e,f])},switchClass:function(b,c,d,e,f){return a.effects.animateClass.apply(this,[{add:c,remove:b},d,e,f])}}),a.extend(a.effects,{version:"1.8.18",save:function(a,b){for(var c=0;c<b.length;c++)b[c]!==null&&a.data("ec.storage."+b[c],a[0].style[b[c]])},restore:function(a,b){for(var c=0;c<b.length;c++)b[c]!==null&&a.css(b[c],a.data("ec.storage."+b[c]))},setMode:function(a,b){b=="toggle"&&(b=a.is(":hidden")?"show":"hide");return b},getBaseline:function(a,b){var c,d;switch(a[0]){case"top":c=0;break;case"middle":c=.5;break;case"bottom":c=1;break;default:c=a[0]/b.height}switch(a[1]){case"left":d=0;break;case"center":d=.5;break;case"right":d=1;break;default:d=a[1]/b.width}return{x:d,y:c}},createWrapper:function(b){if(b.parent().is(".ui-effects-wrapper"))return b.parent();var c={width:b.outerWidth(!0),height:b.outerHeight(!0),"float":b.css("float")},d=a("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),e=document.activeElement;b.wrap(d),(b[0]===e||a.contains(b[0],e))&&a(e).focus(),d=b.parent(),b.css("position")=="static"?(d.css({position:"relative"}),b.css({position:"relative"})):(a.extend(c,{position:b.css("position"),zIndex:b.css("z-index")}),a.each(["top","left","bottom","right"],function(a,d){c[d]=b.css(d),isNaN(parseInt(c[d],10))&&(c[d]="auto")}),b.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"}));return d.css(c).show()},removeWrapper:function(b){var c,d=document.activeElement;if(b.parent().is(".ui-effects-wrapper")){c=b.parent().replaceWith(b),(b[0]===d||a.contains(b[0],d))&&a(d).focus();return c}return b},setTransition:function(b,c,d,e){e=e||{},a.each(c,function(a,c){unit=b.cssUnit(c),unit[0]>0&&(e[c]=unit[0]*d+unit[1])});return e}}),a.fn.extend({effect:function(b,c,d,e){var f=k.apply(this,arguments),g={options:f[1],duration:f[2],callback:f[3]},h=g.options.mode,i=a.effects[b];if(a.fx.off||!i)return h?this[h](g.duration,g.callback):this.each(function(){g.callback&&g.callback.call(this)});return i.call(this,g)},_show:a.fn.show,show:function(a){if(l(a))return this._show.apply(this,arguments);var b=k.apply(this,arguments);b[1].mode="show";return this.effect.apply(this,b)},_hide:a.fn.hide,hide:function(a){if(l(a))return this._hide.apply(this,arguments);var b=k.apply(this,arguments);b[1].mode="hide";return this.effect.apply(this,b)},__toggle:a.fn.toggle,toggle:function(b){if(l(b)||typeof b=="boolean"||a.isFunction(b))return this.__toggle.apply(this,arguments);var c=k.apply(this,arguments);c[1].mode="toggle";return this.effect.apply(this,c)},cssUnit:function(b){var c=this.css(b),d=[];a.each(["em","px","%","pt"],function(a,b){c.indexOf(b)>0&&(d=[parseFloat(c),b])});return d}}),a.easing.jswing=a.easing.swing,a.extend(a.easing,{def:"easeOutQuad",swing:function(b,c,d,e,f){return a.easing[a.easing.def](b,c,d,e,f)},easeInQuad:function(a,b,c,d,e){return d*(b/=e)*b+c},easeOutQuad:function(a,b,c,d,e){return-d*(b/=e)*(b-2)+c},easeInOutQuad:function(a,b,c,d,e){if((b/=e/2)<1)return d/2*b*b+c;return-d/2*(--b*(b-2)-1)+c},easeInCubic:function(a,b,c,d,e){return d*(b/=e)*b*b+c},easeOutCubic:function(a,b,c,d,e){return d*((b=b/e-1)*b*b+1)+c},easeInOutCubic:function(a,b,c,d,e){if((b/=e/2)<1)return d/2*b*b*b+c;return d/2*((b-=2)*b*b+2)+c},easeInQuart:function(a,b,c,d,e){return d*(b/=e)*b*b*b+c},easeOutQuart:function(a,b,c,d,e){return-d*((b=b/e-1)*b*b*b-1)+c},easeInOutQuart:function(a,b,c,d,e){if((b/=e/2)<1)return d/2*b*b*b*b+c;return-d/2*((b-=2)*b*b*b-2)+c},easeInQuint:function(a,b,c,d,e){return d*(b/=e)*b*b*b*b+c},easeOutQuint:function(a,b,c,d,e){return d*((b=b/e-1)*b*b*b*b+1)+c},easeInOutQuint:function(a,b,c,d,e){if((b/=e/2)<1)return d/2*b*b*b*b*b+c;return d/2*((b-=2)*b*b*b*b+2)+c},easeInSine:function(a,b,c,d,e){return-d*Math.cos(b/e*(Math.PI/2))+d+c},easeOutSine:function(a,b,c,d,e){return d*Math.sin(b/e*(Math.PI/2))+c},easeInOutSine:function(a,b,c,d,e){return-d/2*(Math.cos(Math.PI*b/e)-1)+c},easeInExpo:function(a,b,c,d,e){return b==0?c:d*Math.pow(2,10*(b/e-1))+c},easeOutExpo:function(a,b,c,d,e){return b==e?c+d:d*(-Math.pow(2,-10*b/e)+1)+c},easeInOutExpo:function(a,b,c,d,e){if(b==0)return c;if(b==e)return c+d;if((b/=e/2)<1)return d/2*Math.pow(2,10*(b-1))+c;return d/2*(-Math.pow(2,-10*--b)+2)+c},easeInCirc:function(a,b,c,d,e){return-d*(Math.sqrt(1-(b/=e)*b)-1)+c},easeOutCirc:function(a,b,c,d,e){return d*Math.sqrt(1-(b=b/e-1)*b)+c},easeInOutCirc:function(a,b,c,d,e){if((b/=e/2)<1)return-d/2*(Math.sqrt(1-b*b)-1)+c;return d/2*(Math.sqrt(1-(b-=2)*b)+1)+c},easeInElastic:function(a,b,c,d,e){var f=1.70158,g=0,h=d;if(b==0)return c;if((b/=e)==1)return c+d;g||(g=e*.3);if(h<Math.abs(d)){h=d;var f=g/4}else var f=g/(2*Math.PI)*Math.asin(d/h);return-(h*Math.pow(2,10*(b-=1))*Math.sin((b*e-f)*2*Math.PI/g))+c},easeOutElastic:function(a,b,c,d,e){var f=1.70158,g=0,h=d;if(b==0)return c;if((b/=e)==1)return c+d;g||(g=e*.3);if(h<Math.abs(d)){h=d;var f=g/4}else var f=g/(2*Math.PI)*Math.asin(d/h);return h*Math.pow(2,-10*b)*Math.sin((b*e-f)*2*Math.PI/g)+d+c},easeInOutElastic:function(a,b,c,d,e){var f=1.70158,g=0,h=d;if(b==0)return c;if((b/=e/2)==2)return c+d;g||(g=e*.3*1.5);if(h<Math.abs(d)){h=d;var f=g/4}else var f=g/(2*Math.PI)*Math.asin(d/h);if(b<1)return-0.5*h*Math.pow(2,10*(b-=1))*Math.sin((b*e-f)*2*Math.PI/g)+c;return h*Math.pow(2,-10*(b-=1))*Math.sin((b*e-f)*2*Math.PI/g)*.5+d+c},easeInBack:function(a,c,d,e,f,g){g==b&&(g=1.70158);return e*(c/=f)*c*((g+1)*c-g)+d},easeOutBack:function(a,c,d,e,f,g){g==b&&(g=1.70158);return e*((c=c/f-1)*c*((g+1)*c+g)+1)+d},easeInOutBack:function(a,c,d,e,f,g){g==b&&(g=1.70158);if((c/=f/2)<1)return e/2*c*c*(((g*=1.525)+1)*c-g)+d;return e/2*((c-=2)*c*(((g*=1.525)+1)*c+g)+2)+d},easeInBounce:function(b,c,d,e,f){return e-a.easing.easeOutBounce(b,f-c,0,e,f)+d},easeOutBounce:function(a,b,c,d,e){return(b/=e)<1/2.75?d*7.5625*b*b+c:b<2/2.75?d*(7.5625*(b-=1.5/2.75)*b+.75)+c:b<2.5/2.75?d*(7.5625*(b-=2.25/2.75)*b+.9375)+c:d*(7.5625*(b-=2.625/2.75)*b+.984375)+c},easeInOutBounce:function(b,c,d,e,f){if(c<f/2)return a.easing.easeInBounce(b,c*2,0,e,f)*.5+d;return a.easing.easeOutBounce(b,c*2-f,0,e,f)*.5+e*.5+d}})}(jQuery);/*
+ * jQuery UI Effects Blind 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Blind
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */(function(a,b){a.effects.blind=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right"],e=a.effects.setMode(c,b.options.mode||"hide"),f=b.options.direction||"vertical";a.effects.save(c,d),c.show();var g=a.effects.createWrapper(c).css({overflow:"hidden"}),h=f=="vertical"?"height":"width",i=f=="vertical"?g.height():g.width();e=="show"&&g.css(h,0);var j={};j[h]=e=="show"?i:0,g.animate(j,b.duration,b.options.easing,function(){e=="hide"&&c.hide(),a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(c[0],arguments),c.dequeue()})})}})(jQuery);/*
+ * jQuery UI Effects Bounce 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Bounce
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */(function(a,b){a.effects.bounce=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right"],e=a.effects.setMode(c,b.options.mode||"effect"),f=b.options.direction||"up",g=b.options.distance||20,h=b.options.times||5,i=b.duration||250;/show|hide/.test(e)&&d.push("opacity"),a.effects.save(c,d),c.show(),a.effects.createWrapper(c);var j=f=="up"||f=="down"?"top":"left",k=f=="up"||f=="left"?"pos":"neg",g=b.options.distance||(j=="top"?c.outerHeight({margin:!0})/3:c.outerWidth({margin:!0})/3);e=="show"&&c.css("opacity",0).css(j,k=="pos"?-g:g),e=="hide"&&(g=g/(h*2)),e!="hide"&&h--;if(e=="show"){var l={opacity:1};l[j]=(k=="pos"?"+=":"-=")+g,c.animate(l,i/2,b.options.easing),g=g/2,h--}for(var m=0;m<h;m++){var n={},p={};n[j]=(k=="pos"?"-=":"+=")+g,p[j]=(k=="pos"?"+=":"-=")+g,c.animate(n,i/2,b.options.easing).animate(p,i/2,b.options.easing),g=e=="hide"?g*2:g/2}if(e=="hide"){var l={opacity:0};l[j]=(k=="pos"?"-=":"+=")+g,c.animate(l,i/2,b.options.easing,function(){c.hide(),a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(this,arguments)})}else{var n={},p={};n[j]=(k=="pos"?"-=":"+=")+g,p[j]=(k=="pos"?"+=":"-=")+g,c.animate(n,i/2,b.options.easing).animate(p,i/2,b.options.easing,function(){a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(this,arguments)})}c.queue("fx",function(){c.dequeue()}),c.dequeue()})}})(jQuery);/*
+ * jQuery UI Effects Clip 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Clip
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */(function(a,b){a.effects.clip=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right","height","width"],e=a.effects.setMode(c,b.options.mode||"hide"),f=b.options.direction||"vertical";a.effects.save(c,d),c.show();var g=a.effects.createWrapper(c).css({overflow:"hidden"}),h=c[0].tagName=="IMG"?g:c,i={size:f=="vertical"?"height":"width",position:f=="vertical"?"top":"left"},j=f=="vertical"?h.height():h.width();e=="show"&&(h.css(i.size,0),h.css(i.position,j/2));var k={};k[i.size]=e=="show"?j:0,k[i.position]=e=="show"?0:j/2,h.animate(k,{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){e=="hide"&&c.hide(),a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(c[0],arguments),c.dequeue()}})})}})(jQuery);/*
+ * jQuery UI Effects Drop 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Drop
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */(function(a,b){a.effects.drop=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right","opacity"],e=a.effects.setMode(c,b.options.mode||"hide"),f=b.options.direction||"left";a.effects.save(c,d),c.show(),a.effects.createWrapper(c);var g=f=="up"||f=="down"?"top":"left",h=f=="up"||f=="left"?"pos":"neg",i=b.options.distance||(g=="top"?c.outerHeight({margin:!0})/2:c.outerWidth({margin:!0})/2);e=="show"&&c.css("opacity",0).css(g,h=="pos"?-i:i);var j={opacity:e=="show"?1:0};j[g]=(e=="show"?h=="pos"?"+=":"-=":h=="pos"?"-=":"+=")+i,c.animate(j,{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){e=="hide"&&c.hide(),a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(this,arguments),c.dequeue()}})})}})(jQuery);/*
+ * jQuery UI Effects Explode 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Explode
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */(function(a,b){a.effects.explode=function(b){return this.queue(function(){var c=b.options.pieces?Math.round(Math.sqrt(b.options.pieces)):3,d=b.options.pieces?Math.round(Math.sqrt(b.options.pieces)):3;b.options.mode=b.options.mode=="toggle"?a(this).is(":visible")?"hide":"show":b.options.mode;var e=a(this).show().css("visibility","hidden"),f=e.offset();f.top-=parseInt(e.css("marginTop"),10)||0,f.left-=parseInt(e.css("marginLeft"),10)||0;var g=e.outerWidth(!0),h=e.outerHeight(!0);for(var i=0;i<c;i++)for(var j=0;j<d;j++)e.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-j*(g/d),top:-i*(h/c)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:g/d,height:h/c,left:f.left+j*(g/d)+(b.options.mode=="show"?(j-Math.floor(d/2))*(g/d):0),top:f.top+i*(h/c)+(b.options.mode=="show"?(i-Math.floor(c/2))*(h/c):0),opacity:b.options.mode=="show"?0:1}).animate({left:f.left+j*(g/d)+(b.options.mode=="show"?0:(j-Math.floor(d/2))*(g/d)),top:f.top+i*(h/c)+(b.options.mode=="show"?0:(i-Math.floor(c/2))*(h/c)),opacity:b.options.mode=="show"?1:0},b.duration||500);setTimeout(function(){b.options.mode=="show"?e.css({visibility:"visible"}):e.css({visibility:"visible"}).hide(),b.callback&&b.callback.apply(e[0]),e.dequeue(),a("div.ui-effects-explode").remove()},b.duration||500)})}})(jQuery);/*
+ * jQuery UI Effects Fade 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Fade
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */(function(a,b){a.effects.fade=function(b){return this.queue(function(){var c=a(this),d=a.effects.setMode(c,b.options.mode||"hide");c.animate({opacity:d},{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){b.callback&&b.callback.apply(this,arguments),c.dequeue()}})})}})(jQuery);/*
+ * jQuery UI Effects Fold 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Fold
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */(function(a,b){a.effects.fold=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right"],e=a.effects.setMode(c,b.options.mode||"hide"),f=b.options.size||15,g=!!b.options.horizFirst,h=b.duration?b.duration/2:a.fx.speeds._default/2;a.effects.save(c,d),c.show();var i=a.effects.createWrapper(c).css({overflow:"hidden"}),j=e=="show"!=g,k=j?["width","height"]:["height","width"],l=j?[i.width(),i.height()]:[i.height(),i.width()],m=/([0-9]+)%/.exec(f);m&&(f=parseInt(m[1],10)/100*l[e=="hide"?0:1]),e=="show"&&i.css(g?{height:0,width:f}:{height:f,width:0});var n={},p={};n[k[0]]=e=="show"?l[0]:f,p[k[1]]=e=="show"?l[1]:0,i.animate(n,h,b.options.easing).animate(p,h,b.options.easing,function(){e=="hide"&&c.hide(),a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(c[0],arguments),c.dequeue()})})}})(jQuery);/*
+ * jQuery UI Effects Highlight 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Highlight
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */(function(a,b){a.effects.highlight=function(b){return this.queue(function(){var c=a(this),d=["backgroundImage","backgroundColor","opacity"],e=a.effects.setMode(c,b.options.mode||"show"),f={backgroundColor:c.css("backgroundColor")};e=="hide"&&(f.opacity=0),a.effects.save(c,d),c.show().css({backgroundImage:"none",backgroundColor:b.options.color||"#ffff99"}).animate(f,{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){e=="hide"&&c.hide(),a.effects.restore(c,d),e=="show"&&!a.support.opacity&&this.style.removeAttribute("filter"),b.callback&&b.callback.apply(this,arguments),c.dequeue()}})})}})(jQuery);/*
+ * jQuery UI Effects Pulsate 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Pulsate
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */(function(a,b){a.effects.pulsate=function(b){return this.queue(function(){var c=a(this),d=a.effects.setMode(c,b.options.mode||"show");times=(b.options.times||5)*2-1,duration=b.duration?b.duration/2:a.fx.speeds._default/2,isVisible=c.is(":visible"),animateTo=0,isVisible||(c.css("opacity",0).show(),animateTo=1),(d=="hide"&&isVisible||d=="show"&&!isVisible)&&times--;for(var e=0;e<times;e++)c.animate({opacity:animateTo},duration,b.options.easing),animateTo=(animateTo+1)%2;c.animate({opacity:animateTo},duration,b.options.easing,function(){animateTo==0&&c.hide(),b.callback&&b.callback.apply(this,arguments)}),c.queue("fx",function(){c.dequeue()}).dequeue()})}})(jQuery);/*
+ * jQuery UI Effects Scale 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Scale
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */(function(a,b){a.effects.puff=function(b){return this.queue(function(){var c=a(this),d=a.effects.setMode(c,b.options.mode||"hide"),e=parseInt(b.options.percent,10)||150,f=e/100,g={height:c.height(),width:c.width()};a.extend(b.options,{fade:!0,mode:d,percent:d=="hide"?e:100,from:d=="hide"?g:{height:g.height*f,width:g.width*f}}),c.effect("scale",b.options,b.duration,b.callback),c.dequeue()})},a.effects.scale=function(b){return this.queue(function(){var c=a(this),d=a.extend(!0,{},b.options),e=a.effects.setMode(c,b.options.mode||"effect"),f=parseInt(b.options.percent,10)||(parseInt(b.options.percent,10)==0?0:e=="hide"?0:100),g=b.options.direction||"both",h=b.options.origin;e!="effect"&&(d.origin=h||["middle","center"],d.restore=!0);var i={height:c.height(),width:c.width()};c.from=b.options.from||(e=="show"?{height:0,width:0}:i);var j={y:g!="horizontal"?f/100:1,x:g!="vertical"?f/100:1};c.to={height:i.height*j.y,width:i.width*j.x},b.options.fade&&(e=="show"&&(c.from.opacity=0,c.to.opacity=1),e=="hide"&&(c.from.opacity=1,c.to.opacity=0)),d.from=c.from,d.to=c.to,d.mode=e,c.effect("size",d,b.duration,b.callback),c.dequeue()})},a.effects.size=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right","width","height","overflow","opacity"],e=["position","top","bottom","left","right","overflow","opacity"],f=["width","height","overflow"],g=["fontSize"],h=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],i=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],j=a.effects.setMode(c,b.options.mode||"effect"),k=b.options.restore||!1,l=b.options.scale||"both",m=b.options.origin,n={height:c.height(),width:c.width()};c.from=b.options.from||n,c.to=b.options.to||n;if(m){var p=a.effects.getBaseline(m,n);c.from.top=(n.height-c.from.height)*p.y,c.from.left=(n.width-c.from.width)*p.x,c.to.top=(n.height-c.to.height)*p.y,c.to.left=(n.width-c.to.width)*p.x}var q={from:{y:c.from.height/n.height,x:c.from.width/n.width},to:{y:c.to.height/n.height,x:c.to.width/n.width}};if(l=="box"||l=="both")q.from.y!=q.to.y&&(d=d.concat(h),c.from=a.effects.setTransition(c,h,q.from.y,c.from),c.to=a.effects.setTransition(c,h,q.to.y,c.to)),q.from.x!=q.to.x&&(d=d.concat(i),c.from=a.effects.setTransition(c,i,q.from.x,c.from),c.to=a.effects.setTransition(c,i,q.to.x,c.to));(l=="content"||l=="both")&&q.from.y!=q.to.y&&(d=d.concat(g),c.from=a.effects.setTransition(c,g,q.from.y,c.from),c.to=a.effects.setTransition(c,g,q.to.y,c.to)),a.effects.save(c,k?d:e),c.show(),a.effects.createWrapper(c),c.css("overflow","hidden").css(c.from);if(l=="content"||l=="both")h=h.concat(["marginTop","marginBottom"]).concat(g),i=i.concat(["marginLeft","marginRight"]),f=d.concat(h).concat(i),c.find("*[width]").each(function(){child=a(this),k&&a.effects.save(child,f);var c={height:child.height(),width:child.width()};child.from={height:c.height*q.from.y,width:c.width*q.from.x},child.to={height:c.height*q.to.y,width:c.width*q.to.x},q.from.y!=q.to.y&&(child.from=a.effects.setTransition(child,h,q.from.y,child.from),child.to=a.effects.setTransition(child,h,q.to.y,child.to)),q.from.x!=q.to.x&&(child.from=a.effects.setTransition(child,i,q.from.x,child.from),child.to=a.effects.setTransition(child,i,q.to.x,child.to)),child.css(child.from),child.animate(child.to,b.duration,b.options.easing,function(){k&&a.effects.restore(child,f)})});c.animate(c.to,{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){c.to.opacity===0&&c.css("opacity",c.from.opacity),j=="hide"&&c.hide(),a.effects.restore(c,k?d:e),a.effects.removeWrapper(c),b.callback&&b.callback.apply(this,arguments),c.dequeue()}})})}})(jQuery);/*
+ * jQuery UI Effects Shake 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Shake
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */(function(a,b){a.effects.shake=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right"],e=a.effects.setMode(c,b.options.mode||"effect"),f=b.options.direction||"left",g=b.options.distance||20,h=b.options.times||3,i=b.duration||b.options.duration||140;a.effects.save(c,d),c.show(),a.effects.createWrapper(c);var j=f=="up"||f=="down"?"top":"left",k=f=="up"||f=="left"?"pos":"neg",l={},m={},n={};l[j]=(k=="pos"?"-=":"+=")+g,m[j]=(k=="pos"?"+=":"-=")+g*2,n[j]=(k=="pos"?"-=":"+=")+g*2,c.animate(l,i,b.options.easing);for(var p=1;p<h;p++)c.animate(m,i,b.options.easing).animate(n,i,b.options.easing);c.animate(m,i,b.options.easing).animate(l,i/2,b.options.easing,function(){a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(this,arguments)}),c.queue("fx",function(){c.dequeue()}),c.dequeue()})}})(jQuery);/*
+ * jQuery UI Effects Slide 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Slide
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */(function(a,b){a.effects.slide=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right"],e=a.effects.setMode(c,b.options.mode||"show"),f=b.options.direction||"left";a.effects.save(c,d),c.show(),a.effects.createWrapper(c).css({overflow:"hidden"});var g=f=="up"||f=="down"?"top":"left",h=f=="up"||f=="left"?"pos":"neg",i=b.options.distance||(g=="top"?c.outerHeight({margin:!0}):c.outerWidth({margin:!0}));e=="show"&&c.css(g,h=="pos"?isNaN(i)?"-"+i:-i:i);var j={};j[g]=(e=="show"?h=="pos"?"+=":"-=":h=="pos"?"-=":"+=")+i,c.animate(j,{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){e=="hide"&&c.hide(),a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(this,arguments),c.dequeue()}})})}})(jQuery);/*
+ * jQuery UI Effects Transfer 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Transfer
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */(function(a,b){a.effects.transfer=function(b){return this.queue(function(){var c=a(this),d=a(b.options.to),e=d.offset(),f={top:e.top,left:e.left,height:d.innerHeight(),width:d.innerWidth()},g=c.offset(),h=a('<div class="ui-effects-transfer"></div>').appendTo(document.body).addClass(b.options.className).css({top:g.top,left:g.left,height:c.innerHeight(),width:c.innerWidth(),position:"absolute"}).animate(f,b.duration,b.options.easing,function(){h.remove(),b.callback&&b.callback.apply(c[0],arguments),c.dequeue()})})}})(jQuery);
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/js/logging.js b/kernel/org.eclipse.virgo.management.console/src/main/webapp/js/logging.js
new file mode 100644
index 0000000..1a80780
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/js/logging.js
@@ -0,0 +1,122 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+/**
+ * Scripts to be loaded in to the head of the logging view
+ */
+function pageinit(){
+
+	util.doQuery('read/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/LoggerList', function (response){
+		loggingHandler = new LoggerList(response.value);
+		loggingHandler.renderLoggerList();
+		util.pageReady();
+	});
+	
+}
+
+
+var LoggerList = function(loggerList){
+	
+	var self = this;
+	
+	self.loggerList = loggerList;
+
+	self.renderLoggerList = function(){
+		$('#logging-display').empty();
+
+		var rows = new Array();
+		$.each(loggerList, function(index, loggerName){
+			var row = new Array(loggerName);
+			var td = $('<td />', {'id': 'click-' + loggerName.replace(new RegExp('\\.', 'g'), '_'), 'class': 'logger-update','onClick': 'loggingHandler.displayLoggerInfo("' + loggerName + '")'});
+			row.push(td.text('view/edit'));
+			rows.push(row);
+		});
+		
+		self.loggerTable = util.makeTable({
+			clazz: 'logger-table',
+			headers: [{title: 'Logger Name', type: 'alpha'}, {title: '', type: 'alpha'}],
+			rows: rows,
+			hoverable: true,
+			sortable: true,
+			sortIndex: 0
+		});
+		
+		$('#logging-display').append(self.loggerTable);
+	};
+	
+	self.displayLoggerInfo = function(loggerName){
+		var request = new Array({
+			"type": "EXEC",
+			"mbean": "ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator",
+			"operation": "getLoggerLevel",
+			"arguments": [loggerName]
+		},{
+			"type": "EXEC",
+			"mbean": "ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator",
+			"operation": "getLoggerEffectiveLevel",
+			"arguments": [loggerName]
+		});
+		
+		var cssLoggerName = loggerName.replace(new RegExp('\\.', 'g'), '_');
+		
+		util.doBulkQuery(request, function(response) {
+			var name = 'updatelevel-' + cssLoggerName;			
+			var title = 'Update a Logging level';
+			var content = $('<div />');
+			
+			var tableRows = new Array();
+
+			tableRows.push(['Logger: ', loggerName]);
+			tableRows.push(['Logger Level: ', response[0].value]);
+			tableRows.push(['Effective Logger Level: ', response[1].value]);
+			
+			var levelSelector = $('<select />', {id: 'level-selector-' + cssLoggerName, type: 'select'});
+			levelSelector.append($('<option />', {value: 'ERROR'}).text('Error'));
+			levelSelector.append($('<option />', {value: 'WARN'}).text('Warn'));
+			levelSelector.append($('<option />', {value: 'INFO'}).text('Info'));
+			levelSelector.append($('<option />', {value: 'DEBUG'}).text('Debug'));
+			levelSelector.append($('<option />', {value: 'TRACE'}).text('Trace'));
+			tableRows.push(['New Level', levelSelector]);
+			
+			var propertiesTable = util.makeTable({ 
+				clazz: "logger-details-table", 
+				headers: [], 
+				rows: tableRows
+			});
+			
+			content.append(propertiesTable);
+			
+			var link = $('<div />', {'class': 'button-container'});
+			var linkButton = $('<div />', {'class': 'button'});
+			linkButton.append($('<div />', {'class': 'button-cap-left-blue'}));
+			linkButton.append($('<div />', {'class': 'button-text'}).text('Submit'));
+			linkButton.append($('<div />', {'class': 'button-cap-right-blue'}));
+			link.append(linkButton);
+			content.append(link);
+			
+			var infoBox = new InfoBox({name: name, title: title, content: content, closeable: true}).show($('#click-' + cssLoggerName).parent());
+			
+			link.click({loggerName: loggerName, cssLoggerName: cssLoggerName}, function(event){
+				event.stopPropagation();
+				var newLevel = $('#level-selector-' + event.data.cssLoggerName).val();				
+				infoBox.hide();
+				util.doQuery('exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/setLoggerLevel/' + event.data.loggerName + '/' + newLevel, function (response){
+					self.displayLoggerInfo(event.data.loggerName);
+				});
+			});
+			
+		});
+		
+
+		
+	};
+	
+};
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/js/overview.js b/kernel/org.eclipse.virgo.management.console/src/main/webapp/js/overview.js
new file mode 100644
index 0000000..70e3858
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/js/overview.js
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+/**
+ * Scripts to be loaded in to the head of the overview view
+ */
+function pageinit() {
+	
+	$.ajax({
+		url: util.getHostAndAdminPath() + '/jolokia/version', 
+		dataType: 'json',
+		contentType: 'application/json',
+		cache: false,
+		success: function (response) {
+			var text = $('#osgi-runtime').text(); 
+			$('#osgi-runtime').text(text + ' on ' + response.value.info.vendor + ' ' + response.value.info.product + ' ' + response.value.info.version);
+			util.pageReady();
+		}
+	});		
+		
+};
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/js/raphael.js b/kernel/org.eclipse.virgo.management.console/src/main/webapp/js/raphael.js
new file mode 100644
index 0000000..f9b9b62
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/js/raphael.js
@@ -0,0 +1,5436 @@
+// ┌─────────────────────────────────────────────────────────────────────┐ \\
+// │ Raphaël 2.0 - JavaScript Vector Library                             │ \\
+// ├─────────────────────────────────────────────────────────────────────┤ \\
+// │ Copyright (c) 2008-2011 Dmitry Baranovskiy (http://raphaeljs.com)   │ \\
+// │ Copyright (c) 2008-2011 Sencha Labs (http://sencha.com)             │ \\
+// │ Licensed under the MIT (http://raphaeljs.com/license.html) license. │ \\
+// └─────────────────────────────────────────────────────────────────────┘ \\
+
+// ┌──────────────────────────────────────────────────────────────────────────────────────┐ \\
+// │ Eve 0.3.2 - JavaScript Events Library                                                │ \\
+// ├──────────────────────────────────────────────────────────────────────────────────────┤ \\
+// │ Copyright (c) 2008-2011 Dmitry Baranovskiy (http://dmitry.baranovskiy.com/)          │ \\
+// │ Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license. │ \\
+// └──────────────────────────────────────────────────────────────────────────────────────┘ \\
+
+(function (glob) {
+    var version = "0.3.2",
+        has = "hasOwnProperty",
+        separator = /[\.\/]/,
+        wildcard = "*",
+        fun = function () {},
+        numsort = function (a, b) {
+            return a - b;
+        },
+        current_event,
+        stop,
+        events = {n: {}},
+    
+        eve = function (name, scope) {
+            var e = events,
+                oldstop = stop,
+                args = Array.prototype.slice.call(arguments, 2),
+                listeners = eve.listeners(name),
+                z = 0,
+                f = false,
+                l,
+                indexed = [],
+                queue = {},
+                out = [],
+                errors = [];
+            current_event = name;
+            stop = 0;
+            for (var i = 0, ii = listeners.length; i < ii; i++) if ("zIndex" in listeners[i]) {
+                indexed.push(listeners[i].zIndex);
+                if (listeners[i].zIndex < 0) {
+                    queue[listeners[i].zIndex] = listeners[i];
+                }
+            }
+            indexed.sort(numsort);
+            while (indexed[z] < 0) {
+                l = queue[indexed[z++]];
+                out.push(l.apply(scope, args));
+                if (stop) {
+                    stop = oldstop;
+                    return out;
+                }
+            }
+            for (i = 0; i < ii; i++) {
+                l = listeners[i];
+                if ("zIndex" in l) {
+                    if (l.zIndex == indexed[z]) {
+                        out.push(l.apply(scope, args));
+                        if (stop) {
+                            stop = oldstop;
+                            return out;
+                        }
+                        do {
+                            z++;
+                            l = queue[indexed[z]];
+                            l && out.push(l.apply(scope, args));
+                            if (stop) {
+                                stop = oldstop;
+                                return out;
+                            }
+                        } while (l)
+                    } else {
+                        queue[l.zIndex] = l;
+                    }
+                } else {
+                    out.push(l.apply(scope, args));
+                    if (stop) {
+                        stop = oldstop;
+                        return out;
+                    }
+                }
+            }
+            stop = oldstop;
+            return out.length ? out : null;
+        };
+    
+    eve.listeners = function (name) {
+        var names = name.split(separator),
+            e = events,
+            item,
+            items,
+            k,
+            i,
+            ii,
+            j,
+            jj,
+            nes,
+            es = [e],
+            out = [];
+        for (i = 0, ii = names.length; i < ii; i++) {
+            nes = [];
+            for (j = 0, jj = es.length; j < jj; j++) {
+                e = es[j].n;
+                items = [e[names[i]], e[wildcard]];
+                k = 2;
+                while (k--) {
+                    item = items[k];
+                    if (item) {
+                        nes.push(item);
+                        out = out.concat(item.f || []);
+                    }
+                }
+            }
+            es = nes;
+        }
+        return out;
+    };
+    
+    
+    eve.on = function (name, f) {
+        var names = name.split(separator),
+            e = events;
+        for (var i = 0, ii = names.length; i < ii; i++) {
+            e = e.n;
+            !e[names[i]] && (e[names[i]] = {n: {}});
+            e = e[names[i]];
+        }
+        e.f = e.f || [];
+        for (i = 0, ii = e.f.length; i < ii; i++) if (e.f[i] == f) {
+            return fun;
+        }
+        e.f.push(f);
+        return function (zIndex) {
+            if (+zIndex == +zIndex) {
+                f.zIndex = +zIndex;
+            }
+        };
+    };
+    
+    eve.stop = function () {
+        stop = 1;
+    };
+    
+    eve.nt = function (subname) {
+        if (subname) {
+            return new RegExp("(?:\\.|\\/|^)" + subname + "(?:\\.|\\/|$)").test(current_event);
+        }
+        return current_event;
+    };
+    
+    eve.unbind = function (name, f) {
+        var names = name.split(separator),
+            e,
+            key,
+            splice,
+            cur = [events];
+        for (var i = 0, ii = names.length; i < ii; i++) {
+            for (var j = 0; j < cur.length; j += splice.length - 2) {
+                splice = [j, 1];
+                e = cur[j].n;
+                if (names[i] != wildcard) {
+                    if (e[names[i]]) {
+                        splice.push(e[names[i]]);
+                    }
+                } else {
+                    for (key in e) if (e[has](key)) {
+                        splice.push(e[key]);
+                    }
+                }
+                cur.splice.apply(cur, splice);
+            }
+        }
+        for (i = 0, ii = cur.length; i < ii; i++) {
+            e = cur[i];
+            while (e.n) {
+                if (f) {
+                    if (e.f) {
+                        for (j = 0, jj = e.f.length; j < jj; j++) if (e.f[j] == f) {
+                            e.f.splice(j, 1);
+                            break;
+                        }
+                        !e.f.length && delete e.f;
+                    }
+                    for (key in e.n) if (e.n[has](key) && e.n[key].f) {
+                        var funcs = e.n[key].f;
+                        for (j = 0, jj = funcs.length; j < jj; j++) if (funcs[j] == f) {
+                            funcs.splice(j, 1);
+                            break;
+                        }
+                        !funcs.length && delete e.n[key].f;
+                    }
+                } else {
+                    delete e.f;
+                    for (key in e.n) if (e.n[has](key) && e.n[key].f) {
+                        delete e.n[key].f;
+                    }
+                }
+                e = e.n;
+            }
+        }
+    };
+    
+    eve.version = version;
+    eve.toString = function () {
+        return "You are running Eve " + version;
+    };
+    (typeof module != "undefined" && module.exports) ? (module.exports = eve) : (glob.eve = eve);
+})(this);
+
+// ┌─────────────────────────────────────────────────────────────────────┐ \\
+// │ "Raphaël 2.0" - JavaScript Vector Library                           │ \\
+// ├─────────────────────────────────────────────────────────────────────┤ \\
+// │ Copyright (c) 2008-2011 Dmitry Baranovskiy (http://raphaeljs.com)   │ \\
+// │ Copyright (c) 2008-2011 Sencha Labs (http://sencha.com)             │ \\
+// │ Licensed under the MIT (http://raphaeljs.com/license.html) license. │ \\
+// └─────────────────────────────────────────────────────────────────────┘ \\
+(function () {
+    
+    function R(first) {
+        if (R.is(first, "function")) {
+            return loaded ? first() : eve.on("DOMload", first);
+        } else if (R.is(first, array)) {
+            var a = first,
+                cnv = R._engine.create[apply](R, a.splice(0, 3 + R.is(a[0], nu))),
+                res = cnv.set(),
+                i = 0,
+                ii = a.length,
+                j;
+            for (; i < ii; i++) {
+                j = a[i] || {};
+                elements[has](j.type) && res.push(cnv[j.type]().attr(j));
+            }
+            return res;
+        } else {
+            var args = Array.prototype.slice.call(arguments, 0);
+            if (R.is(args[args.length - 1], "function")) {
+                var f = args.pop();
+                return loaded ? f.call(R._engine.create[apply](R, args)) : eve.on("DOMload", function () {
+                    f.call(R._engine.create[apply](R, args));
+                });
+            } else {
+                return R._engine.create[apply](R, arguments);
+            }
+        }
+    }
+    R.version = "2.0.0";
+    R.eve = eve;
+    var loaded,
+        separator = /[, ]+/,
+        elements = {circle: 1, rect: 1, path: 1, ellipse: 1, text: 1, image: 1},
+        formatrg = /\{(\d+)\}/g,
+        proto = "prototype",
+        has = "hasOwnProperty",
+        g = {
+            doc: document,
+            win: window
+        },
+        oldRaphael = {
+            was: Object.prototype[has].call(g.win, "Raphael"),
+            is: g.win.Raphael
+        },
+        Paper = function () {
+            
+            
+            this.ca = this.customAttributes = {};
+        },
+        paperproto,
+        appendChild = "appendChild",
+        apply = "apply",
+        concat = "concat",
+        supportsTouch = "createTouch" in g.doc,
+        E = "",
+        S = " ",
+        Str = String,
+        split = "split",
+        events = "click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend touchcancel"[split](S),
+        touchMap = {
+            mousedown: "touchstart",
+            mousemove: "touchmove",
+            mouseup: "touchend"
+        },
+        lowerCase = Str.prototype.toLowerCase,
+        math = Math,
+        mmax = math.max,
+        mmin = math.min,
+        abs = math.abs,
+        pow = math.pow,
+        PI = math.PI,
+        nu = "number",
+        string = "string",
+        array = "array",
+        toString = "toString",
+        fillString = "fill",
+        objectToString = Object.prototype.toString,
+        paper = {},
+        push = "push",
+        ISURL = R._ISURL = /^url\(['"]?([^\)]+?)['"]?\)$/i,
+        colourRegExp = /^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+%?(?:\s*,\s*[\d\.]+%?)?)\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\))\s*$/i,
+        isnan = {"NaN": 1, "Infinity": 1, "-Infinity": 1},
+        bezierrg = /^(?:cubic-)?bezier\(([^,]+),([^,]+),([^,]+),([^\)]+)\)/,
+        round = math.round,
+        setAttribute = "setAttribute",
+        toFloat = parseFloat,
+        toInt = parseInt,
+        upperCase = Str.prototype.toUpperCase,
+        availableAttrs = R._availableAttrs = {
+            "arrow-end": "none",
+            "arrow-start": "none",
+            blur: 0,
+            "clip-rect": "0 0 1e9 1e9",
+            cursor: "default",
+            cx: 0,
+            cy: 0,
+            fill: "#fff",
+            "fill-opacity": 1,
+            font: '10px "Arial"',
+            "font-family": '"Arial"',
+            "font-size": "10",
+            "font-style": "normal",
+            "font-weight": 400,
+            gradient: 0,
+            height: 0,
+            href: "http://raphaeljs.com/",
+            opacity: 1,
+            path: "M0,0",
+            r: 0,
+            rx: 0,
+            ry: 0,
+            src: "",
+            stroke: "#000",
+            "stroke-dasharray": "",
+            "stroke-linecap": "butt",
+            "stroke-linejoin": "butt",
+            "stroke-miterlimit": 0,
+            "stroke-opacity": 1,
+            "stroke-width": 1,
+            target: "_blank",
+            "text-anchor": "middle",
+            title: "Raphael",
+            transform: "",
+            width: 0,
+            x: 0,
+            y: 0
+        },
+        availableAnimAttrs = R._availableAnimAttrs = {
+            blur: nu,
+            "clip-rect": "csv",
+            cx: nu,
+            cy: nu,
+            fill: "colour",
+            "fill-opacity": nu,
+            "font-size": nu,
+            height: nu,
+            opacity: nu,
+            path: "path",
+            r: nu,
+            rx: nu,
+            ry: nu,
+            stroke: "colour",
+            "stroke-opacity": nu,
+            "stroke-width": nu,
+            transform: "transform",
+            width: nu,
+            x: nu,
+            y: nu
+        },
+        commaSpaces = /\s*,\s*/,
+        hsrg = {hs: 1, rg: 1},
+        p2s = /,?([achlmqrstvxz]),?/gi,
+        pathCommand = /([achlmrqstvz])[\s,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?\s*,?\s*)+)/ig,
+        tCommand = /([rstm])[\s,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?\s*,?\s*)+)/ig,
+        pathValues = /(-?\d*\.?\d*(?:e[\-+]?\d+)?)\s*,?\s*/ig,
+        radial_gradient = R._radial_gradient = /^r(?:\(([^,]+?)\s*,\s*([^\)]+?)\))?/,
+        eldata = {},
+        sortByKey = function (a, b) {
+            return a.key - b.key;
+        },
+        sortByNumber = function (a, b) {
+            return toFloat(a) - toFloat(b);
+        },
+        fun = function () {},
+        pipe = function (x) {
+            return x;
+        },
+        rectPath = R._rectPath = function (x, y, w, h, r) {
+            if (r) {
+                return [["M", x + r, y], ["l", w - r * 2, 0], ["a", r, r, 0, 0, 1, r, r], ["l", 0, h - r * 2], ["a", r, r, 0, 0, 1, -r, r], ["l", r * 2 - w, 0], ["a", r, r, 0, 0, 1, -r, -r], ["l", 0, r * 2 - h], ["a", r, r, 0, 0, 1, r, -r], ["z"]];
+            }
+            return [["M", x, y], ["l", w, 0], ["l", 0, h], ["l", -w, 0], ["z"]];
+        },
+        ellipsePath = function (x, y, rx, ry) {
+            if (ry == null) {
+                ry = rx;
+            }
+            return [["M", x, y], ["m", 0, -ry], ["a", rx, ry, 0, 1, 1, 0, 2 * ry], ["a", rx, ry, 0, 1, 1, 0, -2 * ry], ["z"]];
+        },
+        getPath = R._getPath = {
+            path: function (el) {
+                return el.attr("path");
+            },
+            circle: function (el) {
+                var a = el.attrs;
+                return ellipsePath(a.cx, a.cy, a.r);
+            },
+            ellipse: function (el) {
+                var a = el.attrs;
+                return ellipsePath(a.cx, a.cy, a.rx, a.ry);
+            },
+            rect: function (el) {
+                var a = el.attrs;
+                return rectPath(a.x, a.y, a.width, a.height, a.r);
+            },
+            image: function (el) {
+                var a = el.attrs;
+                return rectPath(a.x, a.y, a.width, a.height);
+            },
+            text: function (el) {
+                var bbox = el._getBBox();
+                return rectPath(bbox.x, bbox.y, bbox.width, bbox.height);
+            }
+        },
+        mapPath = R.mapPath = function (path, matrix) {
+            if (!matrix) {
+                return path;
+            }
+            var x, y, i, j, pathi;
+            path = path2curve(path);
+            for (i = 0, ii = path.length; i < ii; i++) {
+                pathi = path[i];
+                for (j = 1, jj = pathi.length; j < jj; j += 2) {
+                    x = matrix.x(pathi[j], pathi[j + 1]);
+                    y = matrix.y(pathi[j], pathi[j + 1]);
+                    pathi[j] = x;
+                    pathi[j + 1] = y;
+                }
+            }
+            return path;
+        };
+
+    R._g = g;
+    
+    R.type = (g.win.SVGAngle || g.doc.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1") ? "SVG" : "VML");
+    if (R.type == "VML") {
+        var d = g.doc.createElement("div"),
+            b;
+        d.innerHTML = '<v:shape adj="1"/>';
+        b = d.firstChild;
+        b.style.behavior = "url(#default#VML)";
+        if (!(b && typeof b.adj == "object")) {
+            return (R.type = E);
+        }
+        d = null;
+    }
+    
+    
+    R.svg = !(R.vml = R.type == "VML");
+    R._Paper = Paper;
+    
+    R.fn = paperproto = Paper.prototype = R.prototype;
+    R._id = 0;
+    R._oid = 0;
+    
+    R.is = function (o, type) {
+        type = lowerCase.call(type);
+        if (type == "finite") {
+            return !isnan[has](+o);
+        }
+        if (type == "array") {
+            return o instanceof Array;
+        }
+        return  (type == "null" && o === null) ||
+                (type == typeof o && o !== null) ||
+                (type == "object" && o === Object(o)) ||
+                (type == "array" && Array.isArray && Array.isArray(o)) ||
+                objectToString.call(o).slice(8, -1).toLowerCase() == type;
+    };
+    
+    R.angle = function (x1, y1, x2, y2, x3, y3) {
+        if (x3 == null) {
+            var x = x1 - x2,
+                y = y1 - y2;
+            if (!x && !y) {
+                return 0;
+            }
+            return (180 + math.atan2(-y, -x) * 180 / PI + 360) % 360;
+        } else {
+            return R.angle(x1, y1, x3, y3) - R.angle(x2, y2, x3, y3);
+        }
+    };
+    
+    R.rad = function (deg) {
+        return deg % 360 * PI / 180;
+    };
+    
+    R.deg = function (rad) {
+        return rad * 180 / PI % 360;
+    };
+    
+    R.snapTo = function (values, value, tolerance) {
+        tolerance = R.is(tolerance, "finite") ? tolerance : 10;
+        if (R.is(values, array)) {
+            var i = values.length;
+            while (i--) if (abs(values[i] - value) <= tolerance) {
+                return values[i];
+            }
+        } else {
+            values = +values;
+            var rem = value % values;
+            if (rem < tolerance) {
+                return value - rem;
+            }
+            if (rem > values - tolerance) {
+                return value - rem + values;
+            }
+        }
+        return value;
+    };
+    
+    
+    var createUUID = R.createUUID = (function (uuidRegEx, uuidReplacer) {
+        return function () {
+            return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(uuidRegEx, uuidReplacer).toUpperCase();
+        };
+    })(/[xy]/g, function (c) {
+        var r = math.random() * 16 | 0,
+            v = c == "x" ? r : (r & 3 | 8);
+        return v.toString(16);
+    });
+
+    
+    R.setWindow = function (newwin) {
+        eve("setWindow", R, g.win, newwin);
+        g.win = newwin;
+        g.doc = g.win.document;
+        if (initWin) {
+            initWin(g.win);
+        }
+    };
+    var toHex = function (color) {
+        if (R.vml) {
+            // http://dean.edwards.name/weblog/2009/10/convert-any-colour-value-to-hex-in-msie/
+            var trim = /^\s+|\s+$/g;
+            var bod;
+            try {
+                var docum = new ActiveXObject("htmlfile");
+                docum.write("<body>");
+                docum.close();
+                bod = docum.body;
+            } catch(e) {
+                bod = createPopup().document.body;
+            }
+            var range = bod.createTextRange();
+            toHex = cacher(function (color) {
+                try {
+                    bod.style.color = Str(color).replace(trim, E);
+                    var value = range.queryCommandValue("ForeColor");
+                    value = ((value & 255) << 16) | (value & 65280) | ((value & 16711680) >>> 16);
+                    return "#" + ("000000" + value.toString(16)).slice(-6);
+                } catch(e) {
+                    return "none";
+                }
+            });
+        } else {
+            var i = g.doc.createElement("i");
+            i.title = "Rapha\xebl Colour Picker";
+            i.style.display = "none";
+            g.doc.body.appendChild(i);
+            toHex = cacher(function (color) {
+                i.style.color = color;
+                return g.doc.defaultView.getComputedStyle(i, E).getPropertyValue("color");
+            });
+        }
+        return toHex(color);
+    },
+    hsbtoString = function () {
+        return "hsb(" + [this.h, this.s, this.b] + ")";
+    },
+    hsltoString = function () {
+        return "hsl(" + [this.h, this.s, this.l] + ")";
+    },
+    rgbtoString = function () {
+        return this.hex;
+    },
+    prepareRGB = function (r, g, b) {
+        if (g == null && R.is(r, "object") && "r" in r && "g" in r && "b" in r) {
+            b = r.b;
+            g = r.g;
+            r = r.r;
+        }
+        if (g == null && R.is(r, string)) {
+            var clr = R.getRGB(r);
+            r = clr.r;
+            g = clr.g;
+            b = clr.b;
+        }
+        if (r > 1 || g > 1 || b > 1) {
+            r /= 255;
+            g /= 255;
+            b /= 255;
+        }
+        
+        return [r, g, b];
+    },
+    packageRGB = function (r, g, b, o) {
+        r *= 255;
+        g *= 255;
+        b *= 255;
+        var rgb = {
+            r: r,
+            g: g,
+            b: b,
+            hex: R.rgb(r, g, b),
+            toString: rgbtoString
+        };
+        R.is(o, "finite") && (rgb.opacity = o);
+        return rgb;
+    };
+    
+    
+    R.color = function (clr) {
+        var rgb;
+        if (R.is(clr, "object") && "h" in clr && "s" in clr && "b" in clr) {
+            rgb = R.hsb2rgb(clr);
+            clr.r = rgb.r;
+            clr.g = rgb.g;
+            clr.b = rgb.b;
+            clr.hex = rgb.hex;
+        } else if (R.is(clr, "object") && "h" in clr && "s" in clr && "l" in clr) {
+            rgb = R.hsl2rgb(clr);
+            clr.r = rgb.r;
+            clr.g = rgb.g;
+            clr.b = rgb.b;
+            clr.hex = rgb.hex;
+        } else {
+            if (R.is(clr, "string")) {
+                clr = R.getRGB(clr);
+            }
+            if (R.is(clr, "object") && "r" in clr && "g" in clr && "b" in clr) {
+                rgb = R.rgb2hsl(clr);
+                clr.h = rgb.h;
+                clr.s = rgb.s;
+                clr.l = rgb.l;
+                rgb = R.rgb2hsb(clr);
+                clr.v = rgb.b;
+            } else {
+                clr = {hex: "none"};
+                crl.r = clr.g = clr.b = clr.h = clr.s = clr.v = clr.l = -1;
+            }
+        }
+        clr.toString = rgbtoString;
+        return clr;
+    };
+    
+    R.hsb2rgb = function (h, s, v, o) {
+        if (this.is(h, "object") && "h" in h && "s" in h && "b" in h) {
+            v = h.b;
+            s = h.s;
+            h = h.h;
+            o = h.o;
+        }
+        h *= 360;
+        var R, G, B, X, C;
+        h = (h % 360) / 60;
+        C = v * s;
+        X = C * (1 - abs(h % 2 - 1));
+        R = G = B = v - C;
+
+        h = ~~h;
+        R += [C, X, 0, 0, X, C][h];
+        G += [X, C, C, X, 0, 0][h];
+        B += [0, 0, X, C, C, X][h];
+        return packageRGB(R, G, B, o);
+    };
+    
+    R.hsl2rgb = function (h, s, l, o) {
+        if (this.is(h, "object") && "h" in h && "s" in h && "l" in h) {
+            l = h.l;
+            s = h.s;
+            h = h.h;
+        }
+        if (h > 1 || s > 1 || l > 1) {
+            h /= 360;
+            s /= 100;
+            l /= 100;
+        }
+        h *= 360;
+        var R, G, B, X, C;
+        h = (h % 360) / 60;
+        C = 2 * s * (l < .5 ? l : 1 - l);
+        X = C * (1 - abs(h % 2 - 1));
+        R = G = B = l - C / 2;
+
+        h = ~~h;
+        R += [C, X, 0, 0, X, C][h];
+        G += [X, C, C, X, 0, 0][h];
+        B += [0, 0, X, C, C, X][h];
+        return packageRGB(R, G, B, o);
+    };
+    
+    R.rgb2hsb = function (r, g, b) {
+        b = prepareRGB(r, g, b);
+        r = b[0];
+        g = b[1];
+        b = b[2];
+
+        var H, S, V, C;
+        V = mmax(r, g, b);
+        C = V - mmin(r, g, b);
+        H = (C == 0 ? null :
+             V == r ? (g - b) / C :
+             V == g ? (b - r) / C + 2 :
+                      (r - g) / C + 4
+            );
+        H = ((H + 360) % 6) * 60 / 360;
+        S = C == 0 ? 0 : C / V;
+        return {h: H, s: S, b: V, toString: hsbtoString};
+    };
+    
+    R.rgb2hsl = function (r, g, b) {
+        b = prepareRGB(r, g, b);
+        r = b[0];
+        g = b[1];
+        b = b[2];
+
+        var H, S, L, M, m, C;
+        M = mmax(r, g, b);
+        m = mmin(r, g, b);
+        C = M - m;
+        H = (C == 0 ? null :
+             M == r ? (g - b) / C :
+             M == g ? (b - r) / C + 2 :
+                      (r - g) / C + 4);
+        H = ((H + 360) % 6) * 60 / 360;
+        L = (M + m) / 2;
+        S = (C == 0 ? 0 :
+             L < .5 ? C / (2 * L) :
+                      C / (2 - 2 * L));
+        return {h: H, s: S, l: L, toString: hsltoString};
+    };
+    R._path2string = function () {
+        return this.join(",").replace(p2s, "$1");
+    };
+    function repush(array, item) {
+        for (var i = 0, ii = array.length; i < ii; i++) if (array[i] === item) {
+            return array.push(array.splice(i, 1)[0]);
+        }
+    }
+    function cacher(f, scope, postprocessor) {
+        function newf() {
+            var arg = Array.prototype.slice.call(arguments, 0),
+                args = arg.join("\u2400"),
+                cache = newf.cache = newf.cache || {},
+                count = newf.count = newf.count || [];
+            if (cache[has](args)) {
+                repush(count, args);
+                return postprocessor ? postprocessor(cache[args]) : cache[args];
+            }
+            count.length >= 1e3 && delete cache[count.shift()];
+            count.push(args);
+            cache[args] = f[apply](scope, arg);
+            return postprocessor ? postprocessor(cache[args]) : cache[args];
+        }
+        return newf;
+    }
+
+    var preload = R._preload = function (src, f) {
+        var img = g.doc.createElement("img");
+        img.style.cssText = "position:absolute;left:-9999em;top-9999em";
+        img.onload = function () {
+            f.call(this);
+            this.onload = null;
+            g.doc.body.removeChild(this);
+        };
+        img.onerror = function () {
+            g.doc.body.removeChild(this);
+        };
+        g.doc.body.appendChild(img);
+        img.src = src;
+    };
+    
+    function clrToString() {
+        return this.hex;
+    }
+
+    
+    R.getRGB = cacher(function (colour) {
+        if (!colour || !!((colour = Str(colour)).indexOf("-") + 1)) {
+            return {r: -1, g: -1, b: -1, hex: "none", error: 1, toString: clrToString};
+        }
+        if (colour == "none") {
+            return {r: -1, g: -1, b: -1, hex: "none", toString: clrToString};
+        }
+        !(hsrg[has](colour.toLowerCase().substring(0, 2)) || colour.charAt() == "#") && (colour = toHex(colour));
+        var res,
+            red,
+            green,
+            blue,
+            opacity,
+            t,
+            values,
+            rgb = colour.match(colourRegExp);
+        if (rgb) {
+            if (rgb[2]) {
+                blue = toInt(rgb[2].substring(5), 16);
+                green = toInt(rgb[2].substring(3, 5), 16);
+                red = toInt(rgb[2].substring(1, 3), 16);
+            }
+            if (rgb[3]) {
+                blue = toInt((t = rgb[3].charAt(3)) + t, 16);
+                green = toInt((t = rgb[3].charAt(2)) + t, 16);
+                red = toInt((t = rgb[3].charAt(1)) + t, 16);
+            }
+            if (rgb[4]) {
+                values = rgb[4][split](commaSpaces);
+                red = toFloat(values[0]);
+                values[0].slice(-1) == "%" && (red *= 2.55);
+                green = toFloat(values[1]);
+                values[1].slice(-1) == "%" && (green *= 2.55);
+                blue = toFloat(values[2]);
+                values[2].slice(-1) == "%" && (blue *= 2.55);
+                rgb[1].toLowerCase().slice(0, 4) == "rgba" && (opacity = toFloat(values[3]));
+                values[3] && values[3].slice(-1) == "%" && (opacity /= 100);
+            }
+            if (rgb[5]) {
+                values = rgb[5][split](commaSpaces);
+                red = toFloat(values[0]);
+                values[0].slice(-1) == "%" && (red *= 2.55);
+                green = toFloat(values[1]);
+                values[1].slice(-1) == "%" && (green *= 2.55);
+                blue = toFloat(values[2]);
+                values[2].slice(-1) == "%" && (blue *= 2.55);
+                (values[0].slice(-3) == "deg" || values[0].slice(-1) == "\xb0") && (red /= 360);
+                rgb[1].toLowerCase().slice(0, 4) == "hsba" && (opacity = toFloat(values[3]));
+                values[3] && values[3].slice(-1) == "%" && (opacity /= 100);
+                return R.hsb2rgb(red, green, blue, opacity);
+            }
+            if (rgb[6]) {
+                values = rgb[6][split](commaSpaces);
+                red = toFloat(values[0]);
+                values[0].slice(-1) == "%" && (red *= 2.55);
+                green = toFloat(values[1]);
+                values[1].slice(-1) == "%" && (green *= 2.55);
+                blue = toFloat(values[2]);
+                values[2].slice(-1) == "%" && (blue *= 2.55);
+                (values[0].slice(-3) == "deg" || values[0].slice(-1) == "\xb0") && (red /= 360);
+                rgb[1].toLowerCase().slice(0, 4) == "hsla" && (opacity = toFloat(values[3]));
+                values[3] && values[3].slice(-1) == "%" && (opacity /= 100);
+                return R.hsl2rgb(red, green, blue, opacity);
+            }
+            rgb = {r: red, g: green, b: blue, toString: clrToString};
+            rgb.hex = "#" + (16777216 | blue | (green << 8) | (red << 16)).toString(16).slice(1);
+            R.is(opacity, "finite") && (rgb.opacity = opacity);
+            return rgb;
+        }
+        return {r: -1, g: -1, b: -1, hex: "none", error: 1, toString: clrToString};
+    }, R);
+    
+    R.hsb = cacher(function (h, s, b) {
+        return R.hsb2rgb(h, s, b).hex;
+    });
+    
+    R.hsl = cacher(function (h, s, l) {
+        return R.hsl2rgb(h, s, l).hex;
+    });
+    
+    R.rgb = cacher(function (r, g, b) {
+        return "#" + (16777216 | b | (g << 8) | (r << 16)).toString(16).slice(1);
+    });
+    
+    R.getColor = function (value) {
+        var start = this.getColor.start = this.getColor.start || {h: 0, s: 1, b: value || .75},
+            rgb = this.hsb2rgb(start.h, start.s, start.b);
+        start.h += .075;
+        if (start.h > 1) {
+            start.h = 0;
+            start.s -= .2;
+            start.s <= 0 && (this.getColor.start = {h: 0, s: 1, b: start.b});
+        }
+        return rgb.hex;
+    };
+    
+    R.getColor.reset = function () {
+        delete this.start;
+    };
+
+    // http://schepers.cc/getting-to-the-point
+    function catmullRom2bezier(crp) {
+        var d = [];
+        for (var i = 0, iLen = crp.length; iLen - 2 > i; i += 2) {
+            var p = [{x: +crp[i],     y: +crp[i + 1]},
+                     {x: +crp[i],     y: +crp[i + 1]},
+                     {x: +crp[i + 2], y: +crp[i + 3]},
+                     {x: +crp[i + 4], y: +crp[i + 5]}];
+            if (iLen - 4 == i) {
+                p[0] = {x: +crp[i - 2], y: +crp[i - 1]};
+                p[3] = p[2];
+            } else if (i) {
+                p[0] = {x: +crp[i - 2], y: +crp[i - 1]};
+            }
+            d.push(["C",
+                (-p[0].x + 6 * p[1].x + p[2].x) / 6,
+                (-p[0].y + 6 * p[1].y + p[2].y) / 6,
+                (p[1].x + 6 * p[2].x - p[3].x) / 6,
+                (p[1].y + 6*p[2].y - p[3].y) / 6,
+                p[2].x,
+                p[2].y
+            ]);
+        }
+
+        return d;
+    }
+    
+    R.parsePathString = cacher(function (pathString) {
+        if (!pathString) {
+            return null;
+        }
+        var paramCounts = {a: 7, c: 6, h: 1, l: 2, m: 2, r: 4, q: 4, s: 4, t: 2, v: 1, z: 0},
+            data = [];
+        if (R.is(pathString, array) && R.is(pathString[0], array)) { // rough assumption
+            data = pathClone(pathString);
+        }
+        if (!data.length) {
+            Str(pathString).replace(pathCommand, function (a, b, c) {
+                var params = [],
+                    name = b.toLowerCase();
+                c.replace(pathValues, function (a, b) {
+                    b && params.push(+b);
+                });
+                if (name == "m" && params.length > 2) {
+                    data.push([b][concat](params.splice(0, 2)));
+                    name = "l";
+                    b = b == "m" ? "l" : "L";
+                }
+                if (name == "r") {
+                    data.push([b][concat](params));
+                } else while (params.length >= paramCounts[name]) {
+                    data.push([b][concat](params.splice(0, paramCounts[name])));
+                    if (!paramCounts[name]) {
+                        break;
+                    }
+                }
+            });
+        }
+        data.toString = R._path2string;
+        return data;
+    });
+    
+    R.parseTransformString = cacher(function (TString) {
+        if (!TString) {
+            return null;
+        }
+        var paramCounts = {r: 3, s: 4, t: 2, m: 6},
+            data = [];
+        if (R.is(TString, array) && R.is(TString[0], array)) { // rough assumption
+            data = pathClone(TString);
+        }
+        if (!data.length) {
+            Str(TString).replace(tCommand, function (a, b, c) {
+                var params = [],
+                    name = lowerCase.call(b);
+                c.replace(pathValues, function (a, b) {
+                    b && params.push(+b);
+                });
+                data.push([b][concat](params));
+            });
+        }
+        data.toString = R._path2string;
+        return data;
+    });
+    
+    R.findDotsAtSegment = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) {
+        var t1 = 1 - t,
+            t13 = pow(t1, 3),
+            t12 = pow(t1, 2),
+            t2 = t * t,
+            t3 = t2 * t,
+            x = t13 * p1x + t12 * 3 * t * c1x + t1 * 3 * t * t * c2x + t3 * p2x,
+            y = t13 * p1y + t12 * 3 * t * c1y + t1 * 3 * t * t * c2y + t3 * p2y,
+            mx = p1x + 2 * t * (c1x - p1x) + t2 * (c2x - 2 * c1x + p1x),
+            my = p1y + 2 * t * (c1y - p1y) + t2 * (c2y - 2 * c1y + p1y),
+            nx = c1x + 2 * t * (c2x - c1x) + t2 * (p2x - 2 * c2x + c1x),
+            ny = c1y + 2 * t * (c2y - c1y) + t2 * (p2y - 2 * c2y + c1y),
+            ax = t1 * p1x + t * c1x,
+            ay = t1 * p1y + t * c1y,
+            cx = t1 * c2x + t * p2x,
+            cy = t1 * c2y + t * p2y,
+            alpha = (90 - math.atan2(mx - nx, my - ny) * 180 / PI);
+        (mx > nx || my < ny) && (alpha += 180);
+        return {
+            x: x,
+            y: y,
+            m: {x: mx, y: my},
+            n: {x: nx, y: ny},
+            start: {x: ax, y: ay},
+            end: {x: cx, y: cy},
+            alpha: alpha
+        };
+    };
+    var pathDimensions = cacher(function (path) {
+        if (!path) {
+            return {x: 0, y: 0, width: 0, height: 0};
+        }
+        path = path2curve(path);
+        var x = 0, 
+            y = 0,
+            X = [],
+            Y = [],
+            p;
+        for (var i = 0, ii = path.length; i < ii; i++) {
+            p = path[i];
+            if (p[0] == "M") {
+                x = p[1];
+                y = p[2];
+                X.push(x);
+                Y.push(y);
+            } else {
+                var dim = curveDim(x, y, p[1], p[2], p[3], p[4], p[5], p[6]);
+                X = X[concat](dim.min.x, dim.max.x);
+                Y = Y[concat](dim.min.y, dim.max.y);
+                x = p[5];
+                y = p[6];
+            }
+        }
+        var xmin = mmin[apply](0, X),
+            ymin = mmin[apply](0, Y);
+        return {
+            x: xmin,
+            y: ymin,
+            width: mmax[apply](0, X) - xmin,
+            height: mmax[apply](0, Y) - ymin
+        };
+    }, null, function (o) {
+        return {
+            x: o.x,
+            y: o.y,
+            width: o.width,
+            height: o.height
+        };
+    }),
+        pathClone = function (pathArray) {
+            var res = [];
+            if (!R.is(pathArray, array) || !R.is(pathArray && pathArray[0], array)) { // rough assumption
+                pathArray = R.parsePathString(pathArray);
+            }
+            for (var i = 0, ii = pathArray.length; i < ii; i++) {
+                res[i] = [];
+                for (var j = 0, jj = pathArray[i].length; j < jj; j++) {
+                    res[i][j] = pathArray[i][j];
+                }
+            }
+            res.toString = R._path2string;
+            return res;
+        },
+        pathToRelative = R._pathToRelative = cacher(function (pathArray) {
+            if (!R.is(pathArray, array) || !R.is(pathArray && pathArray[0], array)) { // rough assumption
+                pathArray = R.parsePathString(pathArray);
+            }
+            var res = [],
+                x = 0,
+                y = 0,
+                mx = 0,
+                my = 0,
+                start = 0;
+            if (pathArray[0][0] == "M") {
+                x = pathArray[0][1];
+                y = pathArray[0][2];
+                mx = x;
+                my = y;
+                start++;
+                res.push(["M", x, y]);
+            }
+            for (var i = start, ii = pathArray.length; i < ii; i++) {
+                var r = res[i] = [],
+                    pa = pathArray[i];
+                if (pa[0] != lowerCase.call(pa[0])) {
+                    r[0] = lowerCase.call(pa[0]);
+                    switch (r[0]) {
+                        case "a":
+                            r[1] = pa[1];
+                            r[2] = pa[2];
+                            r[3] = pa[3];
+                            r[4] = pa[4];
+                            r[5] = pa[5];
+                            r[6] = +(pa[6] - x).toFixed(3);
+                            r[7] = +(pa[7] - y).toFixed(3);
+                            break;
+                        case "v":
+                            r[1] = +(pa[1] - y).toFixed(3);
+                            break;
+                        case "m":
+                            mx = pa[1];
+                            my = pa[2];
+                        default:
+                            for (var j = 1, jj = pa.length; j < jj; j++) {
+                                r[j] = +(pa[j] - ((j % 2) ? x : y)).toFixed(3);
+                            }
+                    }
+                } else {
+                    r = res[i] = [];
+                    if (pa[0] == "m") {
+                        mx = pa[1] + x;
+                        my = pa[2] + y;
+                    }
+                    for (var k = 0, kk = pa.length; k < kk; k++) {
+                        res[i][k] = pa[k];
+                    }
+                }
+                var len = res[i].length;
+                switch (res[i][0]) {
+                    case "z":
+                        x = mx;
+                        y = my;
+                        break;
+                    case "h":
+                        x += +res[i][len - 1];
+                        break;
+                    case "v":
+                        y += +res[i][len - 1];
+                        break;
+                    default:
+                        x += +res[i][len - 2];
+                        y += +res[i][len - 1];
+                }
+            }
+            res.toString = R._path2string;
+            return res;
+        }, 0, pathClone),
+        pathToAbsolute = R._pathToAbsolute = cacher(function (pathArray) {
+            if (!R.is(pathArray, array) || !R.is(pathArray && pathArray[0], array)) { // rough assumption
+                pathArray = R.parsePathString(pathArray);
+            }
+            if (!pathArray || !pathArray.length) {
+                return [["M", 0, 0]];
+            }
+            var res = [],
+                x = 0,
+                y = 0,
+                mx = 0,
+                my = 0,
+                start = 0;
+            if (pathArray[0][0] == "M") {
+                x = +pathArray[0][1];
+                y = +pathArray[0][2];
+                mx = x;
+                my = y;
+                start++;
+                res[0] = ["M", x, y];
+            }
+            for (var r, pa, i = start, ii = pathArray.length; i < ii; i++) {
+                res.push(r = []);
+                pa = pathArray[i];
+                if (pa[0] != upperCase.call(pa[0])) {
+                    r[0] = upperCase.call(pa[0]);
+                    switch (r[0]) {
+                        case "A":
+                            r[1] = pa[1];
+                            r[2] = pa[2];
+                            r[3] = pa[3];
+                            r[4] = pa[4];
+                            r[5] = pa[5];
+                            r[6] = +(pa[6] + x);
+                            r[7] = +(pa[7] + y);
+                            break;
+                        case "V":
+                            r[1] = +pa[1] + y;
+                            break;
+                        case "H":
+                            r[1] = +pa[1] + x;
+                            break;
+                        case "R":
+                            var dots = [x, y][concat](pa.slice(1));
+                            for (var j = 2, jj = dots.length; j < jj; j++) {
+                                dots[j] = +dots[j] + x;
+                                dots[++j] = +dots[j] + y;
+                            }
+                            res.pop();
+                            res = res[concat](catmullRom2bezier(dots));
+                            break;
+                        case "M":
+                            mx = +pa[1] + x;
+                            my = +pa[2] + y;
+                        default:
+                            for (j = 1, jj = pa.length; j < jj; j++) {
+                                r[j] = +pa[j] + ((j % 2) ? x : y);
+                            }
+                    }
+                } else if (pa[0] == "R") {
+                    dots = [x, y][concat](pa.slice(1));
+                    res.pop();
+                    res = res[concat](catmullRom2bezier(dots));
+                    r = ["R"][concat](pa.slice(-2));
+                } else {
+                    for (var k = 0, kk = pa.length; k < kk; k++) {
+                        r[k] = pa[k];
+                    }
+                }
+                switch (r[0]) {
+                    case "Z":
+                        x = mx;
+                        y = my;
+                        break;
+                    case "H":
+                        x = r[1];
+                        break;
+                    case "V":
+                        y = r[1];
+                        break;
+                    case "M":
+                        mx = r[r.length - 2];
+                        my = r[r.length - 1];
+                    default:
+                        x = r[r.length - 2];
+                        y = r[r.length - 1];
+                }
+            }
+            res.toString = R._path2string;
+            return res;
+        }, null, pathClone),
+        l2c = function (x1, y1, x2, y2) {
+            return [x1, y1, x2, y2, x2, y2];
+        },
+        q2c = function (x1, y1, ax, ay, x2, y2) {
+            var _13 = 1 / 3,
+                _23 = 2 / 3;
+            return [
+                    _13 * x1 + _23 * ax,
+                    _13 * y1 + _23 * ay,
+                    _13 * x2 + _23 * ax,
+                    _13 * y2 + _23 * ay,
+                    x2,
+                    y2
+                ];
+        },
+        a2c = function (x1, y1, rx, ry, angle, large_arc_flag, sweep_flag, x2, y2, recursive) {
+            // for more information of where this math came from visit:
+            // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes
+            var _120 = PI * 120 / 180,
+                rad = PI / 180 * (+angle || 0),
+                res = [],
+                xy,
+                rotate = cacher(function (x, y, rad) {
+                    var X = x * math.cos(rad) - y * math.sin(rad),
+                        Y = x * math.sin(rad) + y * math.cos(rad);
+                    return {x: X, y: Y};
+                });
+            if (!recursive) {
+                xy = rotate(x1, y1, -rad);
+                x1 = xy.x;
+                y1 = xy.y;
+                xy = rotate(x2, y2, -rad);
+                x2 = xy.x;
+                y2 = xy.y;
+                var cos = math.cos(PI / 180 * angle),
+                    sin = math.sin(PI / 180 * angle),
+                    x = (x1 - x2) / 2,
+                    y = (y1 - y2) / 2;
+                var h = (x * x) / (rx * rx) + (y * y) / (ry * ry);
+                if (h > 1) {
+                    h = math.sqrt(h);
+                    rx = h * rx;
+                    ry = h * ry;
+                }
+                var rx2 = rx * rx,
+                    ry2 = ry * ry,
+                    k = (large_arc_flag == sweep_flag ? -1 : 1) *
+                        math.sqrt(abs((rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x))),
+                    cx = k * rx * y / ry + (x1 + x2) / 2,
+                    cy = k * -ry * x / rx + (y1 + y2) / 2,
+                    f1 = math.asin(((y1 - cy) / ry).toFixed(9)),
+                    f2 = math.asin(((y2 - cy) / ry).toFixed(9));
+
+                f1 = x1 < cx ? PI - f1 : f1;
+                f2 = x2 < cx ? PI - f2 : f2;
+                f1 < 0 && (f1 = PI * 2 + f1);
+                f2 < 0 && (f2 = PI * 2 + f2);
+                if (sweep_flag && f1 > f2) {
+                    f1 = f1 - PI * 2;
+                }
+                if (!sweep_flag && f2 > f1) {
+                    f2 = f2 - PI * 2;
+                }
+            } else {
+                f1 = recursive[0];
+                f2 = recursive[1];
+                cx = recursive[2];
+                cy = recursive[3];
+            }
+            var df = f2 - f1;
+            if (abs(df) > _120) {
+                var f2old = f2,
+                    x2old = x2,
+                    y2old = y2;
+                f2 = f1 + _120 * (sweep_flag && f2 > f1 ? 1 : -1);
+                x2 = cx + rx * math.cos(f2);
+                y2 = cy + ry * math.sin(f2);
+                res = a2c(x2, y2, rx, ry, angle, 0, sweep_flag, x2old, y2old, [f2, f2old, cx, cy]);
+            }
+            df = f2 - f1;
+            var c1 = math.cos(f1),
+                s1 = math.sin(f1),
+                c2 = math.cos(f2),
+                s2 = math.sin(f2),
+                t = math.tan(df / 4),
+                hx = 4 / 3 * rx * t,
+                hy = 4 / 3 * ry * t,
+                m1 = [x1, y1],
+                m2 = [x1 + hx * s1, y1 - hy * c1],
+                m3 = [x2 + hx * s2, y2 - hy * c2],
+                m4 = [x2, y2];
+            m2[0] = 2 * m1[0] - m2[0];
+            m2[1] = 2 * m1[1] - m2[1];
+            if (recursive) {
+                return [m2, m3, m4][concat](res);
+            } else {
+                res = [m2, m3, m4][concat](res).join()[split](",");
+                var newres = [];
+                for (var i = 0, ii = res.length; i < ii; i++) {
+                    newres[i] = i % 2 ? rotate(res[i - 1], res[i], rad).y : rotate(res[i], res[i + 1], rad).x;
+                }
+                return newres;
+            }
+        },
+        findDotAtSegment = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) {
+            var t1 = 1 - t;
+            return {
+                x: pow(t1, 3) * p1x + pow(t1, 2) * 3 * t * c1x + t1 * 3 * t * t * c2x + pow(t, 3) * p2x,
+                y: pow(t1, 3) * p1y + pow(t1, 2) * 3 * t * c1y + t1 * 3 * t * t * c2y + pow(t, 3) * p2y
+            };
+        },
+        curveDim = cacher(function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y) {
+            var a = (c2x - 2 * c1x + p1x) - (p2x - 2 * c2x + c1x),
+                b = 2 * (c1x - p1x) - 2 * (c2x - c1x),
+                c = p1x - c1x,
+                t1 = (-b + math.sqrt(b * b - 4 * a * c)) / 2 / a,
+                t2 = (-b - math.sqrt(b * b - 4 * a * c)) / 2 / a,
+                y = [p1y, p2y],
+                x = [p1x, p2x],
+                dot;
+            abs(t1) > "1e12" && (t1 = .5);
+            abs(t2) > "1e12" && (t2 = .5);
+            if (t1 > 0 && t1 < 1) {
+                dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t1);
+                x.push(dot.x);
+                y.push(dot.y);
+            }
+            if (t2 > 0 && t2 < 1) {
+                dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t2);
+                x.push(dot.x);
+                y.push(dot.y);
+            }
+            a = (c2y - 2 * c1y + p1y) - (p2y - 2 * c2y + c1y);
+            b = 2 * (c1y - p1y) - 2 * (c2y - c1y);
+            c = p1y - c1y;
+            t1 = (-b + math.sqrt(b * b - 4 * a * c)) / 2 / a;
+            t2 = (-b - math.sqrt(b * b - 4 * a * c)) / 2 / a;
+            abs(t1) > "1e12" && (t1 = .5);
+            abs(t2) > "1e12" && (t2 = .5);
+            if (t1 > 0 && t1 < 1) {
+                dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t1);
+                x.push(dot.x);
+                y.push(dot.y);
+            }
+            if (t2 > 0 && t2 < 1) {
+                dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t2);
+                x.push(dot.x);
+                y.push(dot.y);
+            }
+            return {
+                min: {x: mmin[apply](0, x), y: mmin[apply](0, y)},
+                max: {x: mmax[apply](0, x), y: mmax[apply](0, y)}
+            };
+        }),
+        path2curve = R._path2curve = cacher(function (path, path2) {
+            var p = pathToAbsolute(path),
+                p2 = path2 && pathToAbsolute(path2),
+                attrs = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null},
+                attrs2 = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null},
+                processPath = function (path, d) {
+                    var nx, ny;
+                    if (!path) {
+                        return ["C", d.x, d.y, d.x, d.y, d.x, d.y];
+                    }
+                    !(path[0] in {T:1, Q:1}) && (d.qx = d.qy = null);
+                    switch (path[0]) {
+                        case "M":
+                            d.X = path[1];
+                            d.Y = path[2];
+                            break;
+                        case "A":
+                            path = ["C"][concat](a2c[apply](0, [d.x, d.y][concat](path.slice(1))));
+                            break;
+                        case "S":
+                            nx = d.x + (d.x - (d.bx || d.x));
+                            ny = d.y + (d.y - (d.by || d.y));
+                            path = ["C", nx, ny][concat](path.slice(1));
+                            break;
+                        case "T":
+                            d.qx = d.x + (d.x - (d.qx || d.x));
+                            d.qy = d.y + (d.y - (d.qy || d.y));
+                            path = ["C"][concat](q2c(d.x, d.y, d.qx, d.qy, path[1], path[2]));
+                            break;
+                        case "Q":
+                            d.qx = path[1];
+                            d.qy = path[2];
+                            path = ["C"][concat](q2c(d.x, d.y, path[1], path[2], path[3], path[4]));
+                            break;
+                        case "L":
+                            path = ["C"][concat](l2c(d.x, d.y, path[1], path[2]));
+                            break;
+                        case "H":
+                            path = ["C"][concat](l2c(d.x, d.y, path[1], d.y));
+                            break;
+                        case "V":
+                            path = ["C"][concat](l2c(d.x, d.y, d.x, path[1]));
+                            break;
+                        case "Z":
+                            path = ["C"][concat](l2c(d.x, d.y, d.X, d.Y));
+                            break;
+                    }
+                    return path;
+                },
+                fixArc = function (pp, i) {
+                    if (pp[i].length > 7) {
+                        pp[i].shift();
+                        var pi = pp[i];
+                        while (pi.length) {
+                            pp.splice(i++, 0, ["C"][concat](pi.splice(0, 6)));
+                        }
+                        pp.splice(i, 1);
+                        ii = mmax(p.length, p2 && p2.length || 0);
+                    }
+                },
+                fixM = function (path1, path2, a1, a2, i) {
+                    if (path1 && path2 && path1[i][0] == "M" && path2[i][0] != "M") {
+                        path2.splice(i, 0, ["M", a2.x, a2.y]);
+                        a1.bx = 0;
+                        a1.by = 0;
+                        a1.x = path1[i][1];
+                        a1.y = path1[i][2];
+                        ii = mmax(p.length, p2 && p2.length || 0);
+                    }
+                };
+            for (var i = 0, ii = mmax(p.length, p2 && p2.length || 0); i < ii; i++) {
+                p[i] = processPath(p[i], attrs);
+                fixArc(p, i);
+                p2 && (p2[i] = processPath(p2[i], attrs2));
+                p2 && fixArc(p2, i);
+                fixM(p, p2, attrs, attrs2, i);
+                fixM(p2, p, attrs2, attrs, i);
+                var seg = p[i],
+                    seg2 = p2 && p2[i],
+                    seglen = seg.length,
+                    seg2len = p2 && seg2.length;
+                attrs.x = seg[seglen - 2];
+                attrs.y = seg[seglen - 1];
+                attrs.bx = toFloat(seg[seglen - 4]) || attrs.x;
+                attrs.by = toFloat(seg[seglen - 3]) || attrs.y;
+                attrs2.bx = p2 && (toFloat(seg2[seg2len - 4]) || attrs2.x);
+                attrs2.by = p2 && (toFloat(seg2[seg2len - 3]) || attrs2.y);
+                attrs2.x = p2 && seg2[seg2len - 2];
+                attrs2.y = p2 && seg2[seg2len - 1];
+            }
+            return p2 ? [p, p2] : p;
+        }, null, pathClone),
+        parseDots = R._parseDots = cacher(function (gradient) {
+            var dots = [];
+            for (var i = 0, ii = gradient.length; i < ii; i++) {
+                var dot = {},
+                    par = gradient[i].match(/^([^:]*):?([\d\.]*)/);
+                dot.color = R.getRGB(par[1]);
+                if (dot.color.error) {
+                    return null;
+                }
+                dot.color = dot.color.hex;
+                par[2] && (dot.offset = par[2] + "%");
+                dots.push(dot);
+            }
+            for (i = 1, ii = dots.length - 1; i < ii; i++) {
+                if (!dots[i].offset) {
+                    var start = toFloat(dots[i - 1].offset || 0),
+                        end = 0;
+                    for (var j = i + 1; j < ii; j++) {
+                        if (dots[j].offset) {
+                            end = dots[j].offset;
+                            break;
+                        }
+                    }
+                    if (!end) {
+                        end = 100;
+                        j = ii;
+                    }
+                    end = toFloat(end);
+                    var d = (end - start) / (j - i + 1);
+                    for (; i < j; i++) {
+                        start += d;
+                        dots[i].offset = start + "%";
+                    }
+                }
+            }
+            return dots;
+        }),
+        tear = R._tear = function (el, paper) {
+            el == paper.top && (paper.top = el.prev);
+            el == paper.bottom && (paper.bottom = el.next);
+            el.next && (el.next.prev = el.prev);
+            el.prev && (el.prev.next = el.next);
+        },
+        tofront = R._tofront = function (el, paper) {
+            if (paper.top === el) {
+                return;
+            }
+            tear(el, paper);
+            el.next = null;
+            el.prev = paper.top;
+            paper.top.next = el;
+            paper.top = el;
+        },
+        toback = R._toback = function (el, paper) {
+            if (paper.bottom === el) {
+                return;
+            }
+            tear(el, paper);
+            el.next = paper.bottom;
+            el.prev = null;
+            paper.bottom.prev = el;
+            paper.bottom = el;
+        },
+        insertafter = R._insertafter = function (el, el2, paper) {
+            tear(el, paper);
+            el2 == paper.top && (paper.top = el);
+            el2.next && (el2.next.prev = el);
+            el.next = el2.next;
+            el.prev = el2;
+            el2.next = el;
+        },
+        insertbefore = R._insertbefore = function (el, el2, paper) {
+            tear(el, paper);
+            el2 == paper.bottom && (paper.bottom = el);
+            el2.prev && (el2.prev.next = el);
+            el.prev = el2.prev;
+            el2.prev = el;
+            el.next = el2;
+        },
+        removed = function (methodname) {
+            return function () {
+                throw new Error("Rapha\xebl: you are calling to method \u201c" + methodname + "\u201d of removed object");
+            };
+        },
+        extractTransform = R._extractTransform = function (el, tstr) {
+            if (tstr == null) {
+                return el._.transform;
+            }
+            tstr = Str(tstr).replace(/\.{3}|\u2026/g, el._.transform || E);
+            var tdata = R.parseTransformString(tstr),
+                deg = 0,
+                dx = 0,
+                dy = 0,
+                sx = 1,
+                sy = 1,
+                _ = el._,
+                m = new Matrix;
+            _.transform = tdata || [];
+            if (tdata) {
+                for (var i = 0, ii = tdata.length; i < ii; i++) {
+                    var t = tdata[i],
+                        tlen = t.length,
+                        command = Str(t[0]).toLowerCase(),
+                        absolute = t[0] != command,
+                        inver = absolute ? m.invert() : 0,
+                        x1,
+                        y1,
+                        x2,
+                        y2,
+                        bb;
+                    if (command == "t" && tlen == 3) {
+                        if (absolute) {
+                            x1 = inver.x(0, 0);
+                            y1 = inver.y(0, 0);
+                            x2 = inver.x(t[1], t[2]);
+                            y2 = inver.y(t[1], t[2]);
+                            m.translate(x2 - x1, y2 - y1);
+                        } else {
+                            m.translate(t[1], t[2]);
+                        }
+                    } else if (command == "r") {
+                        if (tlen == 2) {
+                            bb = bb || el.getBBox(1);
+                            m.rotate(t[1], bb.x + bb.width / 2, bb.y + bb.height / 2);
+                            deg += t[1];
+                        } else if (tlen == 4) {
+                            if (absolute) {
+                                x2 = inver.x(t[2], t[3]);
+                                y2 = inver.y(t[2], t[3]);
+                                m.rotate(t[1], x2, y2);
+                            } else {
+                                m.rotate(t[1], t[2], t[3]);
+                            }
+                            deg += t[1];
+                        }
+                    } else if (command == "s") {
+                        if (tlen == 2 || tlen == 3) {
+                            bb = bb || el.getBBox(1);
+                            m.scale(t[1], t[tlen - 1], bb.x + bb.width / 2, bb.y + bb.height / 2);
+                            sx *= t[1];
+                            sy *= t[tlen - 1];
+                        } else if (tlen == 5) {
+                            if (absolute) {
+                                x2 = inver.x(t[3], t[4]);
+                                y2 = inver.y(t[3], t[4]);
+                                m.scale(t[1], t[2], x2, y2);
+                            } else {
+                                m.scale(t[1], t[2], t[3], t[4]);
+                            }
+                            sx *= t[1];
+                            sy *= t[2];
+                        }
+                    } else if (command == "m" && tlen == 7) {
+                        m.add(t[1], t[2], t[3], t[4], t[5], t[6]);
+                    }
+                    _.dirtyT = 1;
+                    el.matrix = m;
+                }
+            }
+
+            el.matrix = m;
+
+            _.sx = sx;
+            _.sy = sy;
+            _.deg = deg;
+            _.dx = dx = m.e;
+            _.dy = dy = m.f;
+
+            if (sx == 1 && sy == 1 && !deg && _.bbox) {
+                _.bbox.x += +dx;
+                _.bbox.y += +dy;
+            } else {
+                _.dirtyT = 1;
+            }
+        },
+        getEmpty = function (item) {
+            var l = item[0];
+            switch (l.toLowerCase()) {
+                case "t": return [l, 0, 0];
+                case "m": return [l, 1, 0, 0, 1, 0, 0];
+                case "r": if (item.length == 4) {
+                    return [l, 0, item[2], item[3]];
+                } else {
+                    return [l, 0];
+                }
+                case "s": if (item.length == 5) {
+                    return [l, 1, 1, item[3], item[4]];
+                } else if (item.length == 3) {
+                    return [l, 1, 1];
+                } else {
+                    return [l, 1];
+                }
+            }
+        },
+        equaliseTransform = R._equaliseTransform = function (t1, t2) {
+            t2 = Str(t2).replace(/\.{3}|\u2026/g, t1);
+            t1 = R.parseTransformString(t1) || [];
+            t2 = R.parseTransformString(t2) || [];
+            var maxlength = mmax(t1.length, t2.length),
+                from = [],
+                to = [],
+                i = 0, j, jj,
+                tt1, tt2;
+            for (; i < maxlength; i++) {
+                tt1 = t1[i] || getEmpty(t2[i]);
+                tt2 = t2[i] || getEmpty(tt1);
+                if ((tt1[0] != tt2[0]) ||
+                    (tt1[0].toLowerCase() == "r" && (tt1[2] != tt2[2] || tt1[3] != tt2[3])) ||
+                    (tt1[0].toLowerCase() == "s" && (tt1[3] != tt2[3] || tt1[4] != tt2[4]))
+                    ) {
+                    return;
+                }
+                from[i] = [];
+                to[i] = [];
+                for (j = 0, jj = mmax(tt1.length, tt2.length); j < jj; j++) {
+                    j in tt1 && (from[i][j] = tt1[j]);
+                    j in tt2 && (to[i][j] = tt2[j]);
+                }
+            }
+            return {
+                from: from,
+                to: to
+            };
+        };
+    R._getContainer = function (x, y, w, h) {
+        var container;
+        container = h == null && !R.is(x, "object") ? g.doc.getElementById(x) : x;
+        if (container == null) {
+            return;
+        }
+        if (container.tagName) {
+            if (y == null) {
+                return {
+                    container: container,
+                    width: container.style.pixelWidth || container.offsetWidth,
+                    height: container.style.pixelHeight || container.offsetHeight
+                };
+            } else {
+                return {
+                    container: container,
+                    width: y,
+                    height: w
+                };
+            }
+        }
+        return {
+            container: 1,
+            x: x,
+            y: y,
+            width: w,
+            height: h
+        };
+    };
+    
+    R.pathToRelative = pathToRelative;
+    R._engine = {};
+    
+    R.path2curve = path2curve;
+    
+    R.matrix = function (a, b, c, d, e, f) {
+        return new Matrix(a, b, c, d, e, f);
+    };
+    function Matrix(a, b, c, d, e, f) {
+        if (a != null) {
+            this.a = +a;
+            this.b = +b;
+            this.c = +c;
+            this.d = +d;
+            this.e = +e;
+            this.f = +f;
+        } else {
+            this.a = 1;
+            this.b = 0;
+            this.c = 0;
+            this.d = 1;
+            this.e = 0;
+            this.f = 0;
+        }
+    }
+    (function (matrixproto) {
+        
+        matrixproto.add = function (a, b, c, d, e, f) {
+            var out = [[], [], []],
+                m = [[this.a, this.c, this.e], [this.b, this.d, this.f], [0, 0, 1]],
+                matrix = [[a, c, e], [b, d, f], [0, 0, 1]],
+                x, y, z, res;
+
+            if (a && a instanceof Matrix) {
+                matrix = [[a.a, a.c, a.e], [a.b, a.d, a.f], [0, 0, 1]];
+            }
+
+            for (x = 0; x < 3; x++) {
+                for (y = 0; y < 3; y++) {
+                    res = 0;
+                    for (z = 0; z < 3; z++) {
+                        res += m[x][z] * matrix[z][y];
+                    }
+                    out[x][y] = res;
+                }
+            }
+            this.a = out[0][0];
+            this.b = out[1][0];
+            this.c = out[0][1];
+            this.d = out[1][1];
+            this.e = out[0][2];
+            this.f = out[1][2];
+        };
+        
+        matrixproto.invert = function () {
+            var me = this,
+                x = me.a * me.d - me.b * me.c;
+            return new Matrix(me.d / x, -me.b / x, -me.c / x, me.a / x, (me.c * me.f - me.d * me.e) / x, (me.b * me.e - me.a * me.f) / x);
+        };
+        
+        matrixproto.clone = function () {
+            return new Matrix(this.a, this.b, this.c, this.d, this.e, this.f);
+        };
+        
+        matrixproto.translate = function (x, y) {
+            this.add(1, 0, 0, 1, x, y);
+        };
+        
+        matrixproto.scale = function (x, y, cx, cy) {
+            y == null && (y = x);
+            (cx || cy) && this.add(1, 0, 0, 1, cx, cy);
+            this.add(x, 0, 0, y, 0, 0);
+            (cx || cy) && this.add(1, 0, 0, 1, -cx, -cy);
+        };
+        
+        matrixproto.rotate = function (a, x, y) {
+            a = R.rad(a);
+            x = x || 0;
+            y = y || 0;
+            var cos = +math.cos(a).toFixed(9),
+                sin = +math.sin(a).toFixed(9);
+            this.add(cos, sin, -sin, cos, x, y);
+            this.add(1, 0, 0, 1, -x, -y);
+        };
+        
+        matrixproto.x = function (x, y) {
+            return x * this.a + y * this.c + this.e;
+        };
+        
+        matrixproto.y = function (x, y) {
+            return x * this.b + y * this.d + this.f;
+        };
+        matrixproto.get = function (i) {
+            return +this[Str.fromCharCode(97 + i)].toFixed(4);
+        };
+        matrixproto.toString = function () {
+            return R.svg ?
+                "matrix(" + [this.get(0), this.get(1), this.get(2), this.get(3), this.get(4), this.get(5)].join() + ")" :
+                [this.get(0), this.get(2), this.get(1), this.get(3), 0, 0].join();
+        };
+        matrixproto.toFilter = function () {
+            return "progid:DXImageTransform.Microsoft.Matrix(M11=" + this.get(0) +
+                ", M12=" + this.get(2) + ", M21=" + this.get(1) + ", M22=" + this.get(3) +
+                ", Dx=" + this.get(4) + ", Dy=" + this.get(5) + ", sizingmethod='auto expand')";
+        };
+        matrixproto.offset = function () {
+            return [this.e.toFixed(4), this.f.toFixed(4)];
+        };
+        function norm(a) {
+            return a[0] * a[0] + a[1] * a[1];
+        }
+        function normalize(a) {
+            var mag = math.sqrt(norm(a));
+            a[0] && (a[0] /= mag);
+            a[1] && (a[1] /= mag);
+        }
+        
+        matrixproto.split = function () {
+            var out = {};
+            // translation
+            out.dx = this.e;
+            out.dy = this.f;
+
+            // scale and shear
+            var row = [[this.a, this.c], [this.b, this.d]];
+            out.scalex = math.sqrt(norm(row[0]));
+            normalize(row[0]);
+
+            out.shear = row[0][0] * row[1][0] + row[0][1] * row[1][1];
+            row[1] = [row[1][0] - row[0][0] * out.shear, row[1][1] - row[0][1] * out.shear];
+
+            out.scaley = math.sqrt(norm(row[1]));
+            normalize(row[1]);
+            out.shear /= out.scaley;
+
+            // rotation
+            var sin = -row[0][1],
+                cos = row[1][1];
+            if (cos < 0) {
+                out.rotate = R.deg(math.acos(cos));
+                if (sin < 0) {
+                    out.rotate = 360 - out.rotate;
+                }
+            } else {
+                out.rotate = R.deg(math.asin(sin));
+            }
+
+            out.isSimple = !+out.shear.toFixed(9) && (out.scalex.toFixed(9) == out.scaley.toFixed(9) || !out.rotate);
+            out.isSuperSimple = !+out.shear.toFixed(9) && out.scalex.toFixed(9) == out.scaley.toFixed(9) && !out.rotate;
+            out.noRotation = !+out.shear.toFixed(9) && !out.rotate;
+            return out;
+        };
+        
+        matrixproto.toTransformString = function (shorter) {
+            var s = shorter || this[split]();
+            if (s.isSimple) {
+                return "t" + [s.dx, s.dy] + "s" + [s.scalex, s.scaley, 0, 0] + "r" + [s.rotate, 0, 0];
+            } else {
+                return "m" + [this.get(0), this.get(1), this.get(2), this.get(3), this.get(4), this.get(5)];
+            }
+        };
+    })(Matrix.prototype);
+
+    // WebKit rendering bug workaround method
+    var version = navigator.userAgent.match(/Version\/(.*?)\s/) || navigator.userAgent.match(/Chrome\/(\d+)/);
+    if ((navigator.vendor == "Apple Computer, Inc.") && (version && version[1] < 4 || navigator.platform.slice(0, 2) == "iP") ||
+        (navigator.vendor == "Google Inc." && version && version[1] < 8)) {
+        
+        paperproto.safari = function () {
+            var rect = this.rect(-99, -99, this.width + 99, this.height + 99).attr({stroke: "none"});
+            setTimeout(function () {rect.remove();});
+        };
+    } else {
+        paperproto.safari = fun;
+    }
+ 
+    var preventDefault = function () {
+        this.returnValue = false;
+    },
+    preventTouch = function () {
+        return this.originalEvent.preventDefault();
+    },
+    stopPropagation = function () {
+        this.cancelBubble = true;
+    },
+    stopTouch = function () {
+        return this.originalEvent.stopPropagation();
+    },
+    addEvent = (function () {
+        if (g.doc.addEventListener) {
+            return function (obj, type, fn, element) {
+                var realName = supportsTouch && touchMap[type] ? touchMap[type] : type,
+                    f = function (e) {
+                        var scrollY = g.doc.documentElement.scrollTop || g.doc.body.scrollTop,
+                            scrollX = g.doc.documentElement.scrollLeft || g.doc.body.scrollLeft,
+                            x = e.clientX + scrollX,
+                            y = e.clientY + scrollY;
+                    if (supportsTouch && touchMap[has](type)) {
+                        for (var i = 0, ii = e.targetTouches && e.targetTouches.length; i < ii; i++) {
+                            if (e.targetTouches[i].target == obj) {
+                                var olde = e;
+                                e = e.targetTouches[i];
+                                e.originalEvent = olde;
+                                e.preventDefault = preventTouch;
+                                e.stopPropagation = stopTouch;
+                                break;
+                            }
+                        }
+                    }
+                    return fn.call(element, e, x, y);
+                };
+                obj.addEventListener(realName, f, false);
+                return function () {
+                    obj.removeEventListener(realName, f, false);
+                    return true;
+                };
+            };
+        } else if (g.doc.attachEvent) {
+            return function (obj, type, fn, element) {
+                var f = function (e) {
+                    e = e || g.win.event;
+                    var scrollY = g.doc.documentElement.scrollTop || g.doc.body.scrollTop,
+                        scrollX = g.doc.documentElement.scrollLeft || g.doc.body.scrollLeft,
+                        x = e.clientX + scrollX,
+                        y = e.clientY + scrollY;
+                    e.preventDefault = e.preventDefault || preventDefault;
+                    e.stopPropagation = e.stopPropagation || stopPropagation;
+                    return fn.call(element, e, x, y);
+                };
+                obj.attachEvent("on" + type, f);
+                var detacher = function () {
+                    obj.detachEvent("on" + type, f);
+                    return true;
+                };
+                return detacher;
+            };
+        }
+    })(),
+    drag = [],
+    dragMove = function (e) {
+        var x = e.clientX,
+            y = e.clientY,
+            scrollY = g.doc.documentElement.scrollTop || g.doc.body.scrollTop,
+            scrollX = g.doc.documentElement.scrollLeft || g.doc.body.scrollLeft,
+            dragi,
+            j = drag.length;
+        while (j--) {
+            dragi = drag[j];
+            if (supportsTouch) {
+                var i = e.touches.length,
+                    touch;
+                while (i--) {
+                    touch = e.touches[i];
+                    if (touch.identifier == dragi.el._drag.id) {
+                        x = touch.clientX;
+                        y = touch.clientY;
+                        (e.originalEvent ? e.originalEvent : e).preventDefault();
+                        break;
+                    }
+                }
+            } else {
+                e.preventDefault();
+            }
+            var node = dragi.el.node,
+                o,
+                next = node.nextSibling,
+                parent = node.parentNode,
+                display = node.style.display;
+            g.win.opera && parent.removeChild(node);
+            node.style.display = "none";
+            o = dragi.el.paper.getElementByPoint(x, y);
+            node.style.display = display;
+            g.win.opera && (next ? parent.insertBefore(node, next) : parent.appendChild(node));
+            o && eve("drag.over." + dragi.el.id, dragi.el, o);
+            x += scrollX;
+            y += scrollY;
+            eve("drag.move." + dragi.el.id, dragi.move_scope || dragi.el, x - dragi.el._drag.x, y - dragi.el._drag.y, x, y, e);
+        }
+    },
+    dragUp = function (e) {
+        R.unmousemove(dragMove).unmouseup(dragUp);
+        var i = drag.length,
+            dragi;
+        while (i--) {
+            dragi = drag[i];
+            dragi.el._drag = {};
+            eve("drag.end." + dragi.el.id, dragi.end_scope || dragi.start_scope || dragi.move_scope || dragi.el, e);
+        }
+        drag = [];
+    },
+    
+    elproto = R.el = {};
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    for (var i = events.length; i--;) {
+        (function (eventName) {
+            R[eventName] = elproto[eventName] = function (fn, scope) {
+                if (R.is(fn, "function")) {
+                    this.events = this.events || [];
+                    this.events.push({name: eventName, f: fn, unbind: addEvent(this.shape || this.node || g.doc, eventName, fn, scope || this)});
+                }
+                return this;
+            };
+            R["un" + eventName] = elproto["un" + eventName] = function (fn) {
+                var events = this.events,
+                    l = events.length;
+                while (l--) if (events[l].name == eventName && events[l].f == fn) {
+                    events[l].unbind();
+                    events.splice(l, 1);
+                    !events.length && delete this.events;
+                    return this;
+                }
+                return this;
+            };
+        })(events[i]);
+    }
+    
+    
+    elproto.data = function (key, value) {
+        var data = eldata[this.id] = eldata[this.id] || {};
+        if (arguments.length == 1) {
+            if (R.is(key, "object")) {
+                for (var i in key) if (key[has](i)) {
+                    this.data(i, key[i]);
+                }
+                return this;
+            }
+            eve("data.get." + this.id, this, data[key], key);
+            return data[key];
+        }
+        data[key] = value;
+        eve("data.set." + this.id, this, value, key);
+        return this;
+    };
+    
+    elproto.removeData = function (key) {
+        if (key == null) {
+            eldata[this.id] = {};
+        } else {
+            eldata[this.id] && delete eldata[this.id][key];
+        }
+        return this;
+    };
+    
+    elproto.hover = function (f_in, f_out, scope_in, scope_out) {
+        return this.mouseover(f_in, scope_in).mouseout(f_out, scope_out || scope_in);
+    };
+    
+    elproto.unhover = function (f_in, f_out) {
+        return this.unmouseover(f_in).unmouseout(f_out);
+    };
+    
+    elproto.drag = function (onmove, onstart, onend, move_scope, start_scope, end_scope) {
+        function start(e) {
+            (e.originalEvent || e).preventDefault();
+            var scrollY = g.doc.documentElement.scrollTop || g.doc.body.scrollTop,
+                scrollX = g.doc.documentElement.scrollLeft || g.doc.body.scrollLeft;
+            this._drag.x = e.clientX + scrollX;
+            this._drag.y = e.clientY + scrollY;
+            this._drag.id = e.identifier;
+            !drag.length && R.mousemove(dragMove).mouseup(dragUp);
+            drag.push({el: this, move_scope: move_scope, start_scope: start_scope, end_scope: end_scope});
+            onstart && eve.on("drag.start." + this.id, onstart);
+            onmove && eve.on("drag.move." + this.id, onmove);
+            onend && eve.on("drag.end." + this.id, onend);
+            eve("drag.start." + this.id, start_scope || move_scope || this, e.clientX + scrollX, e.clientY + scrollY, e);
+        }
+        this._drag = {};
+        this.mousedown(start);
+        return this;
+    };
+    
+    elproto.onDragOver = function (f) {
+        f ? eve.on("drag.over." + this.id, f) : eve.unbind("drag.over." + this.id);
+    };
+    
+    elproto.undrag = function () {
+        var i = drag.length;
+        while (i--) if (drag[i].el == this) {
+            R.unmousedown(drag[i].start);
+            drag.splice(i++, 1);
+            eve.unbind("drag.*." + this.id);
+        }
+        !drag.length && R.unmousemove(dragMove).unmouseup(dragUp);
+    };
+    
+    paperproto.circle = function (x, y, r) {
+        var out = R._engine.circle(this, x || 0, y || 0, r || 0);
+        this.__set__ && this.__set__.push(out);
+        return out;
+    };
+    
+    paperproto.rect = function (x, y, w, h, r) {
+        var out = R._engine.rect(this, x || 0, y || 0, w || 0, h || 0, r || 0);
+        this.__set__ && this.__set__.push(out);
+        return out;
+    };
+    
+    paperproto.ellipse = function (x, y, rx, ry) {
+        var out = R._engine.ellipse(this, x || 0, y || 0, rx || 0, ry || 0);
+        this.__set__ && this.__set__.push(out);
+        return out;
+    };
+    
+    paperproto.path = function (pathString) {
+        pathString && !R.is(pathString, string) && !R.is(pathString[0], array) && (pathString += E);
+        var out = R._engine.path(R.format[apply](R, arguments), this);
+        this.__set__ && this.__set__.push(out);
+        return out;
+    };
+    
+    paperproto.image = function (src, x, y, w, h) {
+        var out = R._engine.image(this, src || "about:blank", x || 0, y || 0, w || 0, h || 0);
+        this.__set__ && this.__set__.push(out);
+        return out;
+    };
+    
+    paperproto.text = function (x, y, text) {
+        var out = R._engine.text(this, x || 0, y || 0, Str(text));
+        this.__set__ && this.__set__.push(out);
+        return out;
+    };
+    
+    paperproto.set = function (itemsArray) {
+        !R.is(itemsArray, "array") && (itemsArray = Array.prototype.splice.call(arguments, 0, arguments.length));
+        var out = new Set(itemsArray);
+        this.__set__ && this.__set__.push(out);
+        return out;
+    };
+    
+    paperproto.setStart = function (set) {
+        this.__set__ = set || this.set();
+    };
+    
+    paperproto.setFinish = function (set) {
+        var out = this.__set__;
+        delete this.__set__;
+        return out;
+    };
+    
+    paperproto.setSize = function (width, height) {
+        return R._engine.setSize.call(this, width, height);
+    };
+    
+    paperproto.setViewBox = function (x, y, w, h, fit) {
+        return R._engine.setViewBox.call(this, x, y, w, h, fit);
+    };
+    
+    
+    paperproto.top = paperproto.bottom = null;
+    
+    paperproto.raphael = R;
+    var getOffset = function (elem) {
+        var box = elem.getBoundingClientRect(),
+            doc = elem.ownerDocument,
+            body = doc.body,
+            docElem = doc.documentElement,
+            clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0,
+            top  = box.top  + (g.win.pageYOffset || docElem.scrollTop || body.scrollTop ) - clientTop,
+            left = box.left + (g.win.pageXOffset || docElem.scrollLeft || body.scrollLeft) - clientLeft;
+        return {
+            y: top,
+            x: left
+        };
+    };
+    
+    paperproto.getElementByPoint = function (x, y) {
+        var paper = this,
+            svg = paper.canvas,
+            target = g.doc.elementFromPoint(x, y);
+        if (g.win.opera && target.tagName == "svg") {
+            var so = getOffset(svg),
+                sr = svg.createSVGRect();
+            sr.x = x - so.x;
+            sr.y = y - so.y;
+            sr.width = sr.height = 1;
+            var hits = svg.getIntersectionList(sr, null);
+            if (hits.length) {
+                target = hits[hits.length - 1];
+            }
+        }
+        if (!target) {
+            return null;
+        }
+        while (target.parentNode && target != svg.parentNode && !target.raphael) {
+            target = target.parentNode;
+        }
+        target == paper.canvas.parentNode && (target = svg);
+        target = target && target.raphael ? paper.getById(target.raphaelid) : null;
+        return target;
+    };
+    
+    paperproto.getById = function (id) {
+        var bot = this.bottom;
+        while (bot) {
+            if (bot.id == id) {
+                return bot;
+            }
+            bot = bot.next;
+        }
+        return null;
+    };
+    
+    paperproto.forEach = function (callback, thisArg) {
+        var bot = this.bottom;
+        while (bot) {
+            if (callback.call(thisArg, bot) === false) {
+                return this;
+            }
+            bot = bot.next;
+        }
+        return this;
+    };
+    function x_y() {
+        return this.x + S + this.y;
+    }
+    function x_y_w_h() {
+        return this.x + S + this.y + S + this.width + " \xd7 " + this.height;
+    }
+    
+    elproto.getBBox = function (isWithoutTransform) {
+        if (this.removed) {
+            return {};
+        }
+        var _ = this._;
+        if (isWithoutTransform) {
+            if (_.dirty || !_.bboxwt) {
+                this.realPath = getPath[this.type](this);
+                _.bboxwt = pathDimensions(this.realPath);
+                _.bboxwt.toString = x_y_w_h;
+                _.dirty = 0;
+            }
+            return _.bboxwt;
+        }
+        if (_.dirty || _.dirtyT || !_.bbox) {
+            if (_.dirty || !this.realPath) {
+                _.bboxwt = 0;
+                this.realPath = getPath[this.type](this);
+            }
+            _.bbox = pathDimensions(mapPath(this.realPath, this.matrix));
+            _.bbox.toString = x_y_w_h;
+            _.dirty = _.dirtyT = 0;
+        }
+        return _.bbox;
+    };
+    
+    elproto.clone = function () {
+        if (this.removed) {
+            return null;
+        }
+        var out = this.paper[this.type]().attr(this.attr());
+        this.__set__ && this.__set__.push(out);
+        return out;
+    };
+    
+    elproto.glow = function (glow) {
+        if (this.type == "text") {
+            return null;
+        }
+        glow = glow || {};
+        var s = {
+            width: (glow.width || 10) + (+this.attr("stroke-width") || 1),
+            fill: glow.fill || false,
+            opacity: glow.opacity || .5,
+            offsetx: glow.offsetx || 0,
+            offsety: glow.offsety || 0,
+            color: glow.color || "#000"
+        },
+            c = s.width / 2,
+            r = this.paper,
+            out = r.set(),
+            path = this.realPath || getPath[this.type](this);
+        path = this.matrix ? mapPath(path, this.matrix) : path;
+        for (var i = 1; i < c + 1; i++) {
+            out.push(r.path(path).attr({
+                stroke: s.color,
+                fill: s.fill ? s.color : "none",
+                "stroke-linejoin": "round",
+                "stroke-linecap": "round",
+                "stroke-width": +(s.width / c * i).toFixed(3),
+                opacity: +(s.opacity / c).toFixed(3)
+            }));
+        }
+        return out.insertBefore(this).translate(s.offsetx, s.offsety);
+    };
+    var curveslengths = {},
+    getPointAtSegmentLength = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, length) {
+        var len = 0,
+            precision = 100,
+            name = [p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y].join(),
+            cache = curveslengths[name],
+            old, dot;
+        !cache && (curveslengths[name] = cache = {data: []});
+        cache.timer && clearTimeout(cache.timer);
+        cache.timer = setTimeout(function () {delete curveslengths[name];}, 2e3);
+        if (length != null && !cache.precision) {
+            var total = getPointAtSegmentLength(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y);
+            cache.precision = ~~total * 10;
+            cache.data = [];
+        }
+        precision = cache.precision || precision;
+        for (var i = 0; i < precision + 1; i++) {
+            if (cache.data[i * precision]) {
+                dot = cache.data[i * precision];
+            } else {
+                dot = R.findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, i / precision);
+                cache.data[i * precision] = dot;
+            }
+            i && (len += pow(pow(old.x - dot.x, 2) + pow(old.y - dot.y, 2), .5));
+            if (length != null && len >= length) {
+                return dot;
+            }
+            old = dot;
+        }
+        if (length == null) {
+            return len;
+        }
+    },
+    getLengthFactory = function (istotal, subpath) {
+        return function (path, length, onlystart) {
+            path = path2curve(path);
+            var x, y, p, l, sp = "", subpaths = {}, point,
+                len = 0;
+            for (var i = 0, ii = path.length; i < ii; i++) {
+                p = path[i];
+                if (p[0] == "M") {
+                    x = +p[1];
+                    y = +p[2];
+                } else {
+                    l = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6]);
+                    if (len + l > length) {
+                        if (subpath && !subpaths.start) {
+                            point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len);
+                            sp += ["C" + point.start.x, point.start.y, point.m.x, point.m.y, point.x, point.y];
+                            if (onlystart) {return sp;}
+                            subpaths.start = sp;
+                            sp = ["M" + point.x, point.y + "C" + point.n.x, point.n.y, point.end.x, point.end.y, p[5], p[6]].join();
+                            len += l;
+                            x = +p[5];
+                            y = +p[6];
+                            continue;
+                        }
+                        if (!istotal && !subpath) {
+                            point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len);
+                            return {x: point.x, y: point.y, alpha: point.alpha};
+                        }
+                    }
+                    len += l;
+                    x = +p[5];
+                    y = +p[6];
+                }
+                sp += p.shift() + p;
+            }
+            subpaths.end = sp;
+            point = istotal ? len : subpath ? subpaths : R.findDotsAtSegment(x, y, p[0], p[1], p[2], p[3], p[4], p[5], 1);
+            point.alpha && (point = {x: point.x, y: point.y, alpha: point.alpha});
+            return point;
+        };
+    };
+    var getTotalLength = getLengthFactory(1),
+        getPointAtLength = getLengthFactory(),
+        getSubpathsAtLength = getLengthFactory(0, 1);
+    
+    R.getTotalLength = getTotalLength;
+    
+    R.getPointAtLength = getPointAtLength;
+    
+    R.getSubpath = function (path, from, to) {
+        if (this.getTotalLength(path) - to < 1e-6) {
+            return getSubpathsAtLength(path, from).end;
+        }
+        var a = getSubpathsAtLength(path, to, 1);
+        return from ? getSubpathsAtLength(a, from).end : a;
+    };
+    
+    elproto.getTotalLength = function () {
+        if (this.type != "path") {return;}
+        if (this.node.getTotalLength) {
+            return this.node.getTotalLength();
+        }
+        return getTotalLength(this.attrs.path);
+    };
+    
+    elproto.getPointAtLength = function (length) {
+        if (this.type != "path") {return;}
+        return getPointAtLength(this.attrs.path, length);
+    };
+    
+    elproto.getSubpath = function (from, to) {
+        if (this.type != "path") {return;}
+        return R.getSubpath(this.attrs.path, from, to);
+    };
+    
+    var ef = R.easing_formulas = {
+        linear: function (n) {
+            return n;
+        },
+        "<": function (n) {
+            return pow(n, 1.7);
+        },
+        ">": function (n) {
+            return pow(n, .48);
+        },
+        "<>": function (n) {
+            var q = .48 - n / 1.04,
+                Q = math.sqrt(.1734 + q * q),
+                x = Q - q,
+                X = pow(abs(x), 1 / 3) * (x < 0 ? -1 : 1),
+                y = -Q - q,
+                Y = pow(abs(y), 1 / 3) * (y < 0 ? -1 : 1),
+                t = X + Y + .5;
+            return (1 - t) * 3 * t * t + t * t * t;
+        },
+        backIn: function (n) {
+            var s = 1.70158;
+            return n * n * ((s + 1) * n - s);
+        },
+        backOut: function (n) {
+            n = n - 1;
+            var s = 1.70158;
+            return n * n * ((s + 1) * n + s) + 1;
+        },
+        elastic: function (n) {
+            if (n == !!n) {
+                return n;
+            }
+            return pow(2, -10 * n) * math.sin((n - .075) * (2 * PI) / .3) + 1;
+        },
+        bounce: function (n) {
+            var s = 7.5625,
+                p = 2.75,
+                l;
+            if (n < (1 / p)) {
+                l = s * n * n;
+            } else {
+                if (n < (2 / p)) {
+                    n -= (1.5 / p);
+                    l = s * n * n + .75;
+                } else {
+                    if (n < (2.5 / p)) {
+                        n -= (2.25 / p);
+                        l = s * n * n + .9375;
+                    } else {
+                        n -= (2.625 / p);
+                        l = s * n * n + .984375;
+                    }
+                }
+            }
+            return l;
+        }
+    };
+    ef.easeIn = ef["ease-in"] = ef["<"];
+    ef.easeOut = ef["ease-out"] = ef[">"];
+    ef.easeInOut = ef["ease-in-out"] = ef["<>"];
+    ef["back-in"] = ef.backIn;
+    ef["back-out"] = ef.backOut;
+
+    var animationElements = [],
+        requestAnimFrame = window.requestAnimationFrame       ||
+                           window.webkitRequestAnimationFrame ||
+                           window.mozRequestAnimationFrame    ||
+                           window.oRequestAnimationFrame      ||
+                           window.msRequestAnimationFrame     ||
+                           function (callback) {
+                               setTimeout(callback, 16);
+                           },
+        animation = function () {
+            var Now = +new Date,
+                l = 0;
+            for (; l < animationElements.length; l++) {
+                var e = animationElements[l];
+                if (e.el.removed || e.paused) {
+                    continue;
+                }
+                var time = Now - e.start,
+                    ms = e.ms,
+                    easing = e.easing,
+                    from = e.from,
+                    diff = e.diff,
+                    to = e.to,
+                    t = e.t,
+                    that = e.el,
+                    set = {},
+                    now,
+                    init = {},
+                    key;
+                if (e.initstatus) {
+                    time = (e.initstatus * e.anim.top - e.prev) / (e.percent - e.prev) * ms;
+                    e.status = e.initstatus;
+                    delete e.initstatus;
+                    e.stop && animationElements.splice(l--, 1);
+                } else {
+                    e.status = (e.prev + (e.percent - e.prev) * (time / ms)) / e.anim.top;
+                }
+                if (time < 0) {
+                    continue;
+                }
+                if (time < ms) {
+                    var pos = easing(time / ms);
+                    for (var attr in from) if (from[has](attr)) {
+                        switch (availableAnimAttrs[attr]) {
+                            case nu:
+                                now = +from[attr] + pos * ms * diff[attr];
+                                break;
+                            case "colour":
+                                now = "rgb(" + [
+                                    upto255(round(from[attr].r + pos * ms * diff[attr].r)),
+                                    upto255(round(from[attr].g + pos * ms * diff[attr].g)),
+                                    upto255(round(from[attr].b + pos * ms * diff[attr].b))
+                                ].join(",") + ")";
+                                break;
+                            case "path":
+                                now = [];
+                                for (var i = 0, ii = from[attr].length; i < ii; i++) {
+                                    now[i] = [from[attr][i][0]];
+                                    for (var j = 1, jj = from[attr][i].length; j < jj; j++) {
+                                        now[i][j] = +from[attr][i][j] + pos * ms * diff[attr][i][j];
+                                    }
+                                    now[i] = now[i].join(S);
+                                }
+                                now = now.join(S);
+                                break;
+                            case "transform":
+                                if (diff[attr].real) {
+                                    now = [];
+                                    for (i = 0, ii = from[attr].length; i < ii; i++) {
+                                        now[i] = [from[attr][i][0]];
+                                        for (j = 1, jj = from[attr][i].length; j < jj; j++) {
+                                            now[i][j] = from[attr][i][j] + pos * ms * diff[attr][i][j];
+                                        }
+                                    }
+                                } else {
+                                    var get = function (i) {
+                                        return +from[attr][i] + pos * ms * diff[attr][i];
+                                    };
+                                    // now = [["r", get(2), 0, 0], ["t", get(3), get(4)], ["s", get(0), get(1), 0, 0]];
+                                    now = [["m", get(0), get(1), get(2), get(3), get(4), get(5)]];
+                                }
+                                break;
+                            case "csv":
+                                if (attr == "clip-rect") {
+                                    now = [];
+                                    i = 4;
+                                    while (i--) {
+                                        now[i] = +from[attr][i] + pos * ms * diff[attr][i];
+                                    }
+                                }
+                                break;
+                            default:
+                                var from2 = [][concat](from[attr]);
+                                now = [];
+                                i = that.paper.customAttributes[attr].length;
+                                while (i--) {
+                                    now[i] = +from2[i] + pos * ms * diff[attr][i];
+                                }
+                                break;
+                        }
+                        set[attr] = now;
+                    }
+                    that.attr(set);
+                    (function (id, that, anim) {
+                        setTimeout(function () {
+                            eve("anim.frame." + id, that, anim);
+                        });
+                    })(that.id, that, e.anim);
+                } else {
+                    (function(f, el, a) {
+                        setTimeout(function() {
+                            eve("anim.frame." + el.id, el, a);
+                            eve("anim.finish." + el.id, el, a);
+                            R.is(f, "function") && f.call(el);
+                        });
+                    })(e.callback, that, e.anim);
+                    that.attr(to);
+                    animationElements.splice(l--, 1);
+                    if (e.repeat > 1 && !e.next) {
+                        for (key in to) if (to[has](key)) {
+                            init[key] = e.totalOrigin[key];
+                        }
+                        e.el.attr(init);
+                        runAnimation(e.anim, e.el, e.anim.percents[0], null, e.totalOrigin, e.repeat - 1);
+                    }
+                    if (e.next && !e.stop) {
+                        runAnimation(e.anim, e.el, e.next, null, e.totalOrigin, e.repeat);
+                    }
+                }
+            }
+            R.svg && that && that.paper && that.paper.safari();
+            animationElements.length && requestAnimFrame(animation);
+        },
+        upto255 = function (color) {
+            return color > 255 ? 255 : color < 0 ? 0 : color;
+        };
+    
+    elproto.animateWith = function (element, anim, params, ms, easing, callback) {
+        var a = params ? R.animation(params, ms, easing, callback) : anim;
+            status = element.status(anim);
+        return this.animate(a).status(a, status * anim.ms / a.ms);
+    };
+    function CubicBezierAtTime(t, p1x, p1y, p2x, p2y, duration) {
+        var cx = 3 * p1x,
+            bx = 3 * (p2x - p1x) - cx,
+            ax = 1 - cx - bx,
+            cy = 3 * p1y,
+            by = 3 * (p2y - p1y) - cy,
+            ay = 1 - cy - by;
+        function sampleCurveX(t) {
+            return ((ax * t + bx) * t + cx) * t;
+        }
+        function solve(x, epsilon) {
+            var t = solveCurveX(x, epsilon);
+            return ((ay * t + by) * t + cy) * t;
+        }
+        function solveCurveX(x, epsilon) {
+            var t0, t1, t2, x2, d2, i;
+            for(t2 = x, i = 0; i < 8; i++) {
+                x2 = sampleCurveX(t2) - x;
+                if (abs(x2) < epsilon) {
+                    return t2;
+                }
+                d2 = (3 * ax * t2 + 2 * bx) * t2 + cx;
+                if (abs(d2) < 1e-6) {
+                    break;
+                }
+                t2 = t2 - x2 / d2;
+            }
+            t0 = 0;
+            t1 = 1;
+            t2 = x;
+            if (t2 < t0) {
+                return t0;
+            }
+            if (t2 > t1) {
+                return t1;
+            }
+            while (t0 < t1) {
+                x2 = sampleCurveX(t2);
+                if (abs(x2 - x) < epsilon) {
+                    return t2;
+                }
+                if (x > x2) {
+                    t0 = t2;
+                } else {
+                    t1 = t2;
+                }
+                t2 = (t1 - t0) / 2 + t0;
+            }
+            return t2;
+        }
+        return solve(t, 1 / (200 * duration));
+    }
+    elproto.onAnimation = function (f) {
+        f ? eve.on("anim.frame." + this.id, f) : eve.unbind("anim.frame." + this.id);
+        return this;
+    };
+    function Animation(anim, ms) {
+        var percents = [],
+            newAnim = {};
+        this.ms = ms;
+        this.times = 1;
+        if (anim) {
+            for (var attr in anim) if (anim[has](attr)) {
+                newAnim[toFloat(attr)] = anim[attr];
+                percents.push(toFloat(attr));
+            }
+            percents.sort(sortByNumber);
+        }
+        this.anim = newAnim;
+        this.top = percents[percents.length - 1];
+        this.percents = percents;
+    }
+    
+    Animation.prototype.delay = function (delay) {
+        var a = new Animation(this.anim, this.ms);
+        a.times = this.times;
+        a.del = +delay || 0;
+        return a;
+    };
+    
+    Animation.prototype.repeat = function (times) { 
+        var a = new Animation(this.anim, this.ms);
+        a.del = this.del;
+        a.times = math.floor(mmax(times, 0)) || 1;
+        return a;
+    };
+    function runAnimation(anim, element, percent, status, totalOrigin, times) {
+        percent = toFloat(percent);
+        var params,
+            isInAnim,
+            isInAnimSet,
+            percents = [],
+            next,
+            prev,
+            timestamp,
+            ms = anim.ms,
+            from = {},
+            to = {},
+            diff = {};
+        if (status) {
+            for (i = 0, ii = animationElements.length; i < ii; i++) {
+                var e = animationElements[i];
+                if (e.el.id == element.id && e.anim == anim) {
+                    if (e.percent != percent) {
+                        animationElements.splice(i, 1);
+                        isInAnimSet = 1;
+                    } else {
+                        isInAnim = e;
+                    }
+                    element.attr(e.totalOrigin);
+                    break;
+                }
+            }
+        } else {
+            status = +to; // NaN
+        }
+        for (var i = 0, ii = anim.percents.length; i < ii; i++) {
+            if (anim.percents[i] == percent || anim.percents[i] > status * anim.top) {
+                percent = anim.percents[i];
+                prev = anim.percents[i - 1] || 0;
+                ms = ms / anim.top * (percent - prev);
+                next = anim.percents[i + 1];
+                params = anim.anim[percent];
+                break;
+            } else if (status) {
+                element.attr(anim.anim[anim.percents[i]]);
+            }
+        }
+        if (!params) {
+            return;
+        }
+        if (!isInAnim) {
+            for (attr in params) if (params[has](attr)) {
+                if (availableAnimAttrs[has](attr) || element.paper.customAttributes[has](attr)) {
+                    from[attr] = element.attr(attr);
+                    (from[attr] == null) && (from[attr] = availableAttrs[attr]);
+                    to[attr] = params[attr];
+                    switch (availableAnimAttrs[attr]) {
+                        case nu:
+                            diff[attr] = (to[attr] - from[attr]) / ms;
+                            break;
+                        case "colour":
+                            from[attr] = R.getRGB(from[attr]);
+                            var toColour = R.getRGB(to[attr]);
+                            diff[attr] = {
+                                r: (toColour.r - from[attr].r) / ms,
+                                g: (toColour.g - from[attr].g) / ms,
+                                b: (toColour.b - from[attr].b) / ms
+                            };
+                            break;
+                        case "path":
+                            var pathes = path2curve(from[attr], to[attr]),
+                                toPath = pathes[1];
+                            from[attr] = pathes[0];
+                            diff[attr] = [];
+                            for (i = 0, ii = from[attr].length; i < ii; i++) {
+                                diff[attr][i] = [0];
+                                for (var j = 1, jj = from[attr][i].length; j < jj; j++) {
+                                    diff[attr][i][j] = (toPath[i][j] - from[attr][i][j]) / ms;
+                                }
+                            }
+                            break;
+                        case "transform":
+                            var _ = element._,
+                                eq = equaliseTransform(_[attr], to[attr]);
+                            if (eq) {
+                                from[attr] = eq.from;
+                                to[attr] = eq.to;
+                                diff[attr] = [];
+                                diff[attr].real = true;
+                                for (i = 0, ii = from[attr].length; i < ii; i++) {
+                                    diff[attr][i] = [from[attr][i][0]];
+                                    for (j = 1, jj = from[attr][i].length; j < jj; j++) {
+                                        diff[attr][i][j] = (to[attr][i][j] - from[attr][i][j]) / ms;
+                                    }
+                                }
+                            } else {
+                                var m = (element.matrix || new Matrix),
+                                    to2 = {
+                                        _: {transform: _.transform},
+                                        getBBox: function () {
+                                            return element.getBBox(1);
+                                        }
+                                    };
+                                from[attr] = [
+                                    m.a,
+                                    m.b,
+                                    m.c,
+                                    m.d,
+                                    m.e,
+                                    m.f
+                                ];
+                                extractTransform(to2, to[attr]);
+                                to[attr] = to2._.transform;
+                                diff[attr] = [
+                                    (to2.matrix.a - m.a) / ms,
+                                    (to2.matrix.b - m.b) / ms,
+                                    (to2.matrix.c - m.c) / ms,
+                                    (to2.matrix.d - m.d) / ms,
+                                    (to2.matrix.e - m.e) / ms,
+                                    (to2.matrix.e - m.f) / ms
+                                ];
+                                // from[attr] = [_.sx, _.sy, _.deg, _.dx, _.dy];
+                                // var to2 = {_:{}, getBBox: function () { return element.getBBox(); }};
+                                // extractTransform(to2, to[attr]);
+                                // diff[attr] = [
+                                //     (to2._.sx - _.sx) / ms,
+                                //     (to2._.sy - _.sy) / ms,
+                                //     (to2._.deg - _.deg) / ms,
+                                //     (to2._.dx - _.dx) / ms,
+                                //     (to2._.dy - _.dy) / ms
+                                // ];
+                            }
+                            break;
+                        case "csv":
+                            var values = Str(params[attr])[split](separator),
+                                from2 = Str(from[attr])[split](separator);
+                            if (attr == "clip-rect") {
+                                from[attr] = from2;
+                                diff[attr] = [];
+                                i = from2.length;
+                                while (i--) {
+                                    diff[attr][i] = (values[i] - from[attr][i]) / ms;
+                                }
+                            }
+                            to[attr] = values;
+                            break;
+                        default:
+                            values = [][concat](params[attr]);
+                            from2 = [][concat](from[attr]);
+                            diff[attr] = [];
+                            i = element.paper.customAttributes[attr].length;
+                            while (i--) {
+                                diff[attr][i] = ((values[i] || 0) - (from2[i] || 0)) / ms;
+                            }
+                            break;
+                    }
+                }
+            }
+            var easing = params.easing,
+                easyeasy = R.easing_formulas[easing];
+            if (!easyeasy) {
+                easyeasy = Str(easing).match(bezierrg);
+                if (easyeasy && easyeasy.length == 5) {
+                    var curve = easyeasy;
+                    easyeasy = function (t) {
+                        return CubicBezierAtTime(t, +curve[1], +curve[2], +curve[3], +curve[4], ms);
+                    };
+                } else {
+                    easyeasy = pipe;
+                }
+            }
+            timestamp = params.start || anim.start || +new Date;
+            e = {
+                anim: anim,
+                percent: percent,
+                timestamp: timestamp,
+                start: timestamp + (anim.del || 0),
+                status: 0,
+                initstatus: status || 0,
+                stop: false,
+                ms: ms,
+                easing: easyeasy,
+                from: from,
+                diff: diff,
+                to: to,
+                el: element,
+                callback: params.callback,
+                prev: prev,
+                next: next,
+                repeat: times || anim.times,
+                origin: element.attr(),
+                totalOrigin: totalOrigin
+            };
+            animationElements.push(e);
+            if (status && !isInAnim && !isInAnimSet) {
+                e.stop = true;
+                e.start = new Date - ms * status;
+                if (animationElements.length == 1) {
+                    return animation();
+                }
+            }
+            if (isInAnimSet) {
+                e.start = new Date - e.ms * status;
+            }
+            animationElements.length == 1 && requestAnimFrame(animation);
+        } else {
+            isInAnim.initstatus = status;
+            isInAnim.start = new Date - isInAnim.ms * status;
+        }
+        eve("anim.start." + element.id, element, anim);
+    }
+    
+    R.animation = function (params, ms, easing, callback) {
+        if (params instanceof Animation) {
+            return params;
+        }
+        if (R.is(easing, "function") || !easing) {
+            callback = callback || easing || null;
+            easing = null;
+        }
+        params = Object(params);
+        ms = +ms || 0;
+        var p = {},
+            json,
+            attr;
+        for (attr in params) if (params[has](attr) && toFloat(attr) != attr && toFloat(attr) + "%" != attr) {
+            json = true;
+            p[attr] = params[attr];
+        }
+        if (!json) {
+            return new Animation(params, ms);
+        } else {
+            easing && (p.easing = easing);
+            callback && (p.callback = callback);
+            return new Animation({100: p}, ms);
+        }
+    };
+    
+    elproto.animate = function (params, ms, easing, callback) {
+        var element = this;
+        if (element.removed) {
+            callback && callback.call(element);
+            return element;
+        }
+        var anim = params instanceof Animation ? params : R.animation(params, ms, easing, callback);
+        runAnimation(anim, element, anim.percents[0], null, element.attr());
+        return element;
+    };
+    
+    elproto.setTime = function (anim, value) {
+        if (anim && value != null) {
+            this.status(anim, mmin(value, anim.ms) / anim.ms);
+        }
+        return this;
+    };
+    
+    elproto.status = function (anim, value) {
+        var out = [],
+            i = 0,
+            len,
+            e;
+        if (value != null) {
+            runAnimation(anim, this, -1, mmin(value, 1));
+            return this;
+        } else {
+            len = animationElements.length;
+            for (; i < len; i++) {
+                e = animationElements[i];
+                if (e.el.id == this.id && (!anim || e.anim == anim)) {
+                    if (anim) {
+                        return e.status;
+                    }
+                    out.push({
+                        anim: e.anim,
+                        status: e.status
+                    });
+                }
+            }
+            if (anim) {
+                return 0;
+            }
+            return out;
+        }
+    };
+    
+    elproto.pause = function (anim) {
+        for (var i = 0; i < animationElements.length; i++) if (animationElements[i].el.id == this.id && (!anim || animationElements[i].anim == anim)) {
+            if (eve("anim.pause." + this.id, this, animationElements[i].anim) !== false) {
+                animationElements[i].paused = true;
+            }
+        }
+        return this;
+    };
+    
+    elproto.resume = function (anim) {
+        for (var i = 0; i < animationElements.length; i++) if (animationElements[i].el.id == this.id && (!anim || animationElements[i].anim == anim)) {
+            var e = animationElements[i];
+            if (eve("anim.resume." + this.id, this, e.anim) !== false) {
+                delete e.paused;
+                this.status(e.anim, e.status);
+            }
+        }
+        return this;
+    };
+    
+    elproto.stop = function (anim) {
+        for (var i = 0; i < animationElements.length; i++) if (animationElements[i].el.id == this.id && (!anim || animationElements[i].anim == anim)) {
+            if (eve("anim.stop." + this.id, this, animationElements[i].anim) !== false) {
+                animationElements.splice(i--, 1);
+            }
+        }
+        return this;
+    };
+    elproto.toString = function () {
+        return "Rapha\xebl\u2019s object";
+    };
+
+    // Set
+    var Set = function (items) {
+        this.items = [];
+        this.length = 0;
+        this.type = "set";
+        if (items) {
+            for (var i = 0, ii = items.length; i < ii; i++) {
+                if (items[i] && (items[i].constructor == elproto.constructor || items[i].constructor == Set)) {
+                    this[this.items.length] = this.items[this.items.length] = items[i];
+                    this.length++;
+                }
+            }
+        }
+    },
+    setproto = Set.prototype;
+    
+    setproto.push = function () {
+        var item,
+            len;
+        for (var i = 0, ii = arguments.length; i < ii; i++) {
+            item = arguments[i];
+            if (item && (item.constructor == elproto.constructor || item.constructor == Set)) {
+                len = this.items.length;
+                this[len] = this.items[len] = item;
+                this.length++;
+            }
+        }
+        return this;
+    };
+    
+    setproto.pop = function () {
+        this.length && delete this[this.length--];
+        return this.items.pop();
+    };
+    
+    setproto.forEach = function (callback, thisArg) {
+        for (var i = 0, ii = this.items.length; i < ii; i++) {
+            if (callback.call(thisArg, this.items[i], i) === false) {
+                return this;
+            }
+        }
+        return this;
+    };
+    for (var method in elproto) if (elproto[has](method)) {
+        setproto[method] = (function (methodname) {
+            return function () {
+                var arg = arguments;
+                return this.forEach(function (el) {
+                    el[methodname][apply](el, arg);
+                });
+            };
+        })(method);
+    }
+    setproto.attr = function (name, value) {
+        if (name && R.is(name, array) && R.is(name[0], "object")) {
+            for (var j = 0, jj = name.length; j < jj; j++) {
+                this.items[j].attr(name[j]);
+            }
+        } else {
+            for (var i = 0, ii = this.items.length; i < ii; i++) {
+                this.items[i].attr(name, value);
+            }
+        }
+        return this;
+    };
+    
+    setproto.clear = function () {
+        while (this.length) {
+            this.pop();
+        }
+    };
+    
+    setproto.splice = function (index, count, insertion) {
+        index = index < 0 ? mmax(this.length + index, 0) : index;
+        count = mmax(0, mmin(this.length - index, count));
+        var tail = [],
+            todel = [],
+            args = [],
+            i;
+        for (i = 2; i < arguments.length; i++) {
+            args.push(arguments[i]);
+        }
+        for (i = 0; i < count; i++) {
+            todel.push(this[index + i]);
+        }
+        for (; i < this.length - index; i++) {
+            tail.push(this[index + i]);
+        }
+        var arglen = args.length;
+        for (i = 0; i < arglen + tail.length; i++) {
+            this.items[index + i] = this[index + i] = i < arglen ? args[i] : tail[i - arglen];
+        }
+        i = this.items.length = this.length -= count - arglen;
+        while (this[i]) {
+            delete this[i++];
+        }
+        return new Set(todel);
+    };
+    
+    setproto.exclude = function (el) {
+        for (var i = 0, ii = this.length; i < ii; i++) if (this[i] == el) {
+            this.splice(i, 1);
+            return true;
+        }
+    };
+    setproto.animate = function (params, ms, easing, callback) {
+        (R.is(easing, "function") || !easing) && (callback = easing || null);
+        var len = this.items.length,
+            i = len,
+            item,
+            set = this,
+            collector;
+        if (!len) {
+            return this;
+        }
+        callback && (collector = function () {
+            !--len && callback.call(set);
+        });
+        easing = R.is(easing, string) ? easing : collector;
+        var anim = R.animation(params, ms, easing, collector);
+        item = this.items[--i].animate(anim);
+        while (i--) {
+            this.items[i] && !this.items[i].removed && this.items[i].animateWith(item, anim);
+        }
+        return this;
+    };
+    setproto.insertAfter = function (el) {
+        var i = this.items.length;
+        while (i--) {
+            this.items[i].insertAfter(el);
+        }
+        return this;
+    };
+    setproto.getBBox = function () {
+        var x = [],
+            y = [],
+            w = [],
+            h = [];
+        for (var i = this.items.length; i--;) if (!this.items[i].removed) {
+            var box = this.items[i].getBBox();
+            x.push(box.x);
+            y.push(box.y);
+            w.push(box.x + box.width);
+            h.push(box.y + box.height);
+        }
+        x = mmin[apply](0, x);
+        y = mmin[apply](0, y);
+        return {
+            x: x,
+            y: y,
+            width: mmax[apply](0, w) - x,
+            height: mmax[apply](0, h) - y
+        };
+    };
+    setproto.clone = function (s) {
+        s = new Set;
+        for (var i = 0, ii = this.items.length; i < ii; i++) {
+            s.push(this.items[i].clone());
+        }
+        return s;
+    };
+    setproto.toString = function () {
+        return "Rapha\xebl\u2018s set";
+    };
+
+    
+    R.registerFont = function (font) {
+        if (!font.face) {
+            return font;
+        }
+        this.fonts = this.fonts || {};
+        var fontcopy = {
+                w: font.w,
+                face: {},
+                glyphs: {}
+            },
+            family = font.face["font-family"];
+        for (var prop in font.face) if (font.face[has](prop)) {
+            fontcopy.face[prop] = font.face[prop];
+        }
+        if (this.fonts[family]) {
+            this.fonts[family].push(fontcopy);
+        } else {
+            this.fonts[family] = [fontcopy];
+        }
+        if (!font.svg) {
+            fontcopy.face["units-per-em"] = toInt(font.face["units-per-em"], 10);
+            for (var glyph in font.glyphs) if (font.glyphs[has](glyph)) {
+                var path = font.glyphs[glyph];
+                fontcopy.glyphs[glyph] = {
+                    w: path.w,
+                    k: {},
+                    d: path.d && "M" + path.d.replace(/[mlcxtrv]/g, function (command) {
+                            return {l: "L", c: "C", x: "z", t: "m", r: "l", v: "c"}[command] || "M";
+                        }) + "z"
+                };
+                if (path.k) {
+                    for (var k in path.k) if (path[has](k)) {
+                        fontcopy.glyphs[glyph].k[k] = path.k[k];
+                    }
+                }
+            }
+        }
+        return font;
+    };
+    
+    paperproto.getFont = function (family, weight, style, stretch) {
+        stretch = stretch || "normal";
+        style = style || "normal";
+        weight = +weight || {normal: 400, bold: 700, lighter: 300, bolder: 800}[weight] || 400;
+        if (!R.fonts) {
+            return;
+        }
+        var font = R.fonts[family];
+        if (!font) {
+            var name = new RegExp("(^|\\s)" + family.replace(/[^\w\d\s+!~.:_-]/g, E) + "(\\s|$)", "i");
+            for (var fontName in R.fonts) if (R.fonts[has](fontName)) {
+                if (name.test(fontName)) {
+                    font = R.fonts[fontName];
+                    break;
+                }
+            }
+        }
+        var thefont;
+        if (font) {
+            for (var i = 0, ii = font.length; i < ii; i++) {
+                thefont = font[i];
+                if (thefont.face["font-weight"] == weight && (thefont.face["font-style"] == style || !thefont.face["font-style"]) && thefont.face["font-stretch"] == stretch) {
+                    break;
+                }
+            }
+        }
+        return thefont;
+    };
+    
+    paperproto.print = function (x, y, string, font, size, origin, letter_spacing) {
+        origin = origin || "middle"; // baseline|middle
+        letter_spacing = mmax(mmin(letter_spacing || 0, 1), -1);
+        var out = this.set(),
+            letters = Str(string)[split](E),
+            shift = 0,
+            path = E,
+            scale;
+        R.is(font, string) && (font = this.getFont(font));
+        if (font) {
+            scale = (size || 16) / font.face["units-per-em"];
+            var bb = font.face.bbox[split](separator),
+                top = +bb[0],
+                height = +bb[1] + (origin == "baseline" ? bb[3] - bb[1] + (+font.face.descent) : (bb[3] - bb[1]) / 2);
+            for (var i = 0, ii = letters.length; i < ii; i++) {
+                var prev = i && font.glyphs[letters[i - 1]] || {},
+                    curr = font.glyphs[letters[i]];
+                shift += i ? (prev.w || font.w) + (prev.k && prev.k[letters[i]] || 0) + (font.w * letter_spacing) : 0;
+                curr && curr.d && out.push(this.path(curr.d).attr({
+                    fill: "#000",
+                    stroke: "none",
+                    transform: [["t", shift * scale, 0]]
+                }));
+            }
+            out.transform(["...s", scale, scale, top, height, "t", (x - top) / scale, (y - height) / scale]);
+        }
+        return out;
+    };
+
+    
+    R.format = function (token, params) {
+        var args = R.is(params, array) ? [0][concat](params) : arguments;
+        token && R.is(token, string) && args.length - 1 && (token = token.replace(formatrg, function (str, i) {
+            return args[++i] == null ? E : args[i];
+        }));
+        return token || E;
+    };
+    
+    R.fullfill = (function () {
+        var tokenRegex = /\{([^\}]+)\}/g,
+            objNotationRegex = /(?:(?:^|\.)(.+?)(?=\[|\.|$|\()|\[('|")(.+?)\2\])(\(\))?/g, // matches .xxxxx or ["xxxxx"] to run over object properties
+            replacer = function (all, key, obj) {
+                var res = obj;
+                key.replace(objNotationRegex, function (all, name, quote, quotedName, isFunc) {
+                    name = name || quotedName;
+                    if (res) {
+                        if (name in res) {
+                            res = res[name];
+                        }
+                        typeof res == "function" && isFunc && (res = res());
+                    }
+                });
+                res = (res == null || res == obj ? all : res) + "";
+                return res;
+            };
+        return function (str, obj) {
+            return String(str).replace(tokenRegex, function (all, key) {
+                return replacer(all, key, obj);
+            });
+        };
+    })();
+    
+    R.ninja = function () {
+        oldRaphael.was ? (g.win.Raphael = oldRaphael.is) : delete Raphael;
+        return R;
+    };
+    
+    R.st = setproto;
+    // Firefox <3.6 fix: http://webreflection.blogspot.com/2009/11/195-chars-to-help-lazy-loading.html
+    (function (doc, loaded, f) {
+        if (doc.readyState == null && doc.addEventListener){
+            doc.addEventListener(loaded, f = function () {
+                doc.removeEventListener(loaded, f, false);
+                doc.readyState = "complete";
+            }, false);
+            doc.readyState = "loading";
+        }
+        function isLoaded() {
+            (/in/).test(doc.readyState) ? setTimeout(isLoaded, 9) : R.eve("DOMload");
+        }
+        isLoaded();
+    })(document, "DOMContentLoaded");
+
+    oldRaphael.was ? (g.win.Raphael = R) : (Raphael = R);
+    
+    eve.on("DOMload", function () {
+        loaded = true;
+    });
+})();
+
+// ┌─────────────────────────────────────────────────────────────────────┐ \\
+// │ Raphaël 2 - JavaScript Vector Library                               │ \\
+// ├─────────────────────────────────────────────────────────────────────┤ \\
+// │ SVG Module                                                          │ \\
+// ├─────────────────────────────────────────────────────────────────────┤ \\
+// │ Copyright (c) 2008-2011 Dmitry Baranovskiy (http://raphaeljs.com)   │ \\
+// │ Copyright (c) 2008-2011 Sencha Labs (http://sencha.com)             │ \\
+// │ Licensed under the MIT (http://raphaeljs.com/license.html) license. │ \\
+// └─────────────────────────────────────────────────────────────────────┘ \\
+window.Raphael.svg && function (R) {
+    var has = "hasOwnProperty",
+        Str = String,
+        toFloat = parseFloat,
+        toInt = parseInt,
+        math = Math,
+        mmax = math.max,
+        abs = math.abs,
+        pow = math.pow,
+        separator = /[, ]+/,
+        eve = R.eve,
+        E = "",
+        S = " ";
+    var xlink = "http://www.w3.org/1999/xlink",
+        markers = {
+            block: "M5,0 0,2.5 5,5z",
+            classic: "M5,0 0,2.5 5,5 3.5,3 3.5,2z",
+            diamond: "M2.5,0 5,2.5 2.5,5 0,2.5z",
+            open: "M6,1 1,3.5 6,6",
+            oval: "M2.5,0A2.5,2.5,0,0,1,2.5,5 2.5,2.5,0,0,1,2.5,0z"
+        },
+        markerCounter = {};
+    R.toString = function () {
+        return  "Your browser supports SVG.\nYou are running Rapha\xebl " + this.version;
+    };
+    var $ = function (el, attr) {
+        if (attr) {
+            if (typeof el == "string") {
+                el = $(el);
+            }
+            for (var key in attr) if (attr[has](key)) {
+                if (key.substring(0, 6) == "xlink:") {
+                    el.setAttributeNS(xlink, key.substring(6), Str(attr[key]));
+                } else {
+                    el.setAttribute(key, Str(attr[key]));
+                }
+            }
+        } else {
+            el = R._g.doc.createElementNS("http://www.w3.org/2000/svg", el);
+            el.style && (el.style.webkitTapHighlightColor = "rgba(0,0,0,0)");
+        }
+        return el;
+    },
+    gradients = {},
+    rgGrad = /^url\(#(.*)\)$/,
+    removeGradientFill = function (node, paper) {
+        var oid = node.getAttribute("fill");
+        oid = oid && oid.match(rgGrad);
+        if (oid && !--gradients[oid[1]]) {
+            delete gradients[oid[1]];
+            paper.defs.removeChild(R._g.doc.getElementById(oid[1]));
+        }
+    },
+    addGradientFill = function (element, gradient) {
+        var type = "linear",
+            id = element.id + gradient,
+            fx = .5, fy = .5,
+            o = element.node,
+            SVG = element.paper,
+            s = o.style,
+            el = R._g.doc.getElementById(id);
+        if (!el) {
+            gradient = Str(gradient).replace(R._radial_gradient, function (all, _fx, _fy) {
+                type = "radial";
+                if (_fx && _fy) {
+                    fx = toFloat(_fx);
+                    fy = toFloat(_fy);
+                    var dir = ((fy > .5) * 2 - 1);
+                    pow(fx - .5, 2) + pow(fy - .5, 2) > .25 &&
+                        (fy = math.sqrt(.25 - pow(fx - .5, 2)) * dir + .5) &&
+                        fy != .5 &&
+                        (fy = fy.toFixed(5) - 1e-5 * dir);
+                }
+                return E;
+            });
+            gradient = gradient.split(/\s*\-\s*/);
+            if (type == "linear") {
+                var angle = gradient.shift();
+                angle = -toFloat(angle);
+                if (isNaN(angle)) {
+                    return null;
+                }
+                var vector = [0, 0, math.cos(R.rad(angle)), math.sin(R.rad(angle))],
+                    max = 1 / (mmax(abs(vector[2]), abs(vector[3])) || 1);
+                vector[2] *= max;
+                vector[3] *= max;
+                if (vector[2] < 0) {
+                    vector[0] = -vector[2];
+                    vector[2] = 0;
+                }
+                if (vector[3] < 0) {
+                    vector[1] = -vector[3];
+                    vector[3] = 0;
+                }
+            }
+            var dots = R._parseDots(gradient);
+            if (!dots) {
+                return null;
+            }
+            if (element.gradient) {
+                SVG.defs.removeChild(element.gradient);
+                delete element.gradient;
+            }
+
+            id = id.replace(/[\(\)\s,\xb0#]/g, "-");
+            el = $(type + "Gradient", {id: id});
+            element.gradient = el;
+            $(el, type == "radial" ? {
+                fx: fx,
+                fy: fy
+            } : {
+                x1: vector[0],
+                y1: vector[1],
+                x2: vector[2],
+                y2: vector[3],
+                gradientTransform: element.matrix.invert()
+            });
+            SVG.defs.appendChild(el);
+            for (var i = 0, ii = dots.length; i < ii; i++) {
+                el.appendChild($("stop", {
+                    offset: dots[i].offset ? dots[i].offset : i ? "100%" : "0%",
+                    "stop-color": dots[i].color || "#fff"
+                }));
+            }
+        }
+        $(o, {
+            fill: "url(#" + id + ")",
+            opacity: 1,
+            "fill-opacity": 1
+        });
+        s.fill = E;
+        s.opacity = 1;
+        s.fillOpacity = 1;
+        return 1;
+    },
+    updatePosition = function (o) {
+        var bbox = o.getBBox(1);
+        $(o.pattern, {patternTransform: o.matrix.invert() + " translate(" + bbox.x + "," + bbox.y + ")"});
+    },
+    addArrow = function (o, value, isEnd) {
+        if (o.type == "path") {
+            var values = Str(value).toLowerCase().split("-"),
+                p = o.paper,
+                se = isEnd ? "end" : "start",
+                node = o.node,
+                attrs = o.attrs,
+                stroke = attrs["stroke-width"],
+                i = values.length,
+                type = "classic",
+                from,
+                to,
+                dx,
+                refX,
+                attr,
+                w = 3,
+                h = 3,
+                t = 5;
+            while (i--) {
+                switch (values[i]) {
+                    case "block":
+                    case "classic":
+                    case "oval":
+                    case "diamond":
+                    case "open":
+                    case "none":
+                        type = values[i];
+                        break;
+                    case "wide": h = 5; break;
+                    case "narrow": h = 2; break;
+                    case "long": w = 5; break;
+                    case "short": w = 2; break;
+                }
+            }
+            if (type == "open") {
+                w += 2;
+                h += 2;
+                t += 2;
+                dx = 1;
+                refX = isEnd ? 4 : 1;
+                attr = {
+                    fill: "none",
+                    stroke: attrs.stroke
+                };
+            } else {
+                refX = dx = w / 2;
+                attr = {
+                    fill: attrs.stroke,
+                    stroke: "none"
+                };
+            }
+            if (o._.arrows) {
+                if (isEnd) {
+                    o._.arrows.endPath && markerCounter[o._.arrows.endPath]--;
+                    o._.arrows.endMarker && markerCounter[o._.arrows.endMarker]--;
+                } else {
+                    o._.arrows.startPath && markerCounter[o._.arrows.startPath]--;
+                    o._.arrows.startMarker && markerCounter[o._.arrows.startMarker]--;
+                }
+            } else {
+                o._.arrows = {};
+            }
+            if (type != "none") {
+                var pathId = "raphael-marker-" + type,
+                    markerId = "raphael-marker-" + se + type + w + h;
+                if (!R._g.doc.getElementById(pathId)) {
+                    p.defs.appendChild($($("path"), {
+                        "stroke-linecap": "round",
+                        d: markers[type],
+                        id: pathId
+                    }));
+                    markerCounter[pathId] = 1;
+                } else {
+                    markerCounter[pathId]++;
+                }
+                var marker = R._g.doc.getElementById(markerId),
+                    use;
+                if (!marker) {
+                    marker = $($("marker"), {
+                        id: markerId,
+                        markerHeight: h,
+                        markerWidth: w,
+                        orient: "auto",
+                        refX: refX,
+                        refY: h / 2
+                    });
+                    use = $($("use"), {
+                        "xlink:href": "#" + pathId,
+                        transform: (isEnd ? " rotate(180 " + w / 2 + " " + h / 2 + ") " : S) + "scale(" + w / t + "," + h / t + ")",
+                        "stroke-width": 1 / ((w / t + h / t) / 2)
+                    });
+                    marker.appendChild(use);
+                    p.defs.appendChild(marker);
+                    markerCounter[markerId] = 1;
+                } else {
+                    markerCounter[markerId]++;
+                    use = marker.getElementsByTagName("use")[0];
+                }
+                $(use, attr);
+                var delta = dx * (type != "diamond" && type != "oval");
+                if (isEnd) {
+                    from = o._.arrows.startdx * stroke || 0;
+                    to = R.getTotalLength(attrs.path) - delta * stroke;
+                } else {
+                    from = delta * stroke;
+                    to = R.getTotalLength(attrs.path) - (o._.arrows.enddx * stroke || 0);
+                }
+                attr = {};
+                attr["marker-" + se] = "url(#" + markerId + ")";
+                if (to || from) {
+                    attr.d = Raphael.getSubpath(attrs.path, from, to);
+                }
+                $(node, attr);
+                o._.arrows[se + "Path"] = pathId;
+                o._.arrows[se + "Marker"] = markerId;
+                o._.arrows[se + "dx"] = delta;
+                o._.arrows[se + "Type"] = type;
+                o._.arrows[se + "String"] = value;
+            } else {
+                if (isEnd) {
+                    from = o._.arrows.startdx * stroke || 0;
+                    to = R.getTotalLength(attrs.path) - from;
+                } else {
+                    from = 0;
+                    to = R.getTotalLength(attrs.path) - (o._.arrows.enddx * stroke || 0);
+                }
+                o._.arrows[se + "Path"] && $(node, {d: Raphael.getSubpath(attrs.path, from, to)});
+                delete o._.arrows[se + "Path"];
+                delete o._.arrows[se + "Marker"];
+                delete o._.arrows[se + "dx"];
+                delete o._.arrows[se + "Type"];
+                delete o._.arrows[se + "String"];
+            }
+            for (attr in markerCounter) if (markerCounter[has](attr) && !markerCounter[attr]) {
+                var item = R._g.doc.getElementById(attr);
+                item && item.parentNode.removeChild(item);
+            }
+        }
+    },
+    dasharray = {
+        "": [0],
+        "none": [0],
+        "-": [3, 1],
+        ".": [1, 1],
+        "-.": [3, 1, 1, 1],
+        "-..": [3, 1, 1, 1, 1, 1],
+        ". ": [1, 3],
+        "- ": [4, 3],
+        "--": [8, 3],
+        "- .": [4, 3, 1, 3],
+        "--.": [8, 3, 1, 3],
+        "--..": [8, 3, 1, 3, 1, 3]
+    },
+    addDashes = function (o, value, params) {
+        value = dasharray[Str(value).toLowerCase()];
+        if (value) {
+            var width = o.attrs["stroke-width"] || "1",
+                butt = {round: width, square: width, butt: 0}[o.attrs["stroke-linecap"] || params["stroke-linecap"]] || 0,
+                dashes = [],
+                i = value.length;
+            while (i--) {
+                dashes[i] = value[i] * width + ((i % 2) ? 1 : -1) * butt;
+            }
+            $(o.node, {"stroke-dasharray": dashes.join(",")});
+        }
+    },
+    setFillAndStroke = function (o, params) {
+        var node = o.node,
+            attrs = o.attrs,
+            vis = node.style.visibility;
+        node.style.visibility = "hidden";
+        for (var att in params) {
+            if (params[has](att)) {
+                if (!R._availableAttrs[has](att)) {
+                    continue;
+                }
+                var value = params[att];
+                attrs[att] = value;
+                switch (att) {
+                    case "blur":
+                        o.blur(value);
+                        break;
+                    case "href":
+                    case "title":
+                    case "target":
+                        var pn = node.parentNode;
+                        if (pn.tagName.toLowerCase() != "a") {
+                            var hl = $("a");
+                            pn.insertBefore(hl, node);
+                            hl.appendChild(node);
+                            pn = hl;
+                        }
+                        if (att == "target" && value == "blank") {
+                            pn.setAttributeNS(xlink, "show", "new");
+                        } else {
+                            pn.setAttributeNS(xlink, att, value);
+                        }
+                        break;
+                    case "cursor":
+                        node.style.cursor = value;
+                        break;
+                    case "transform":
+                        o.transform(value);
+                        break;
+                    case "arrow-start":
+                        addArrow(o, value);
+                        break;
+                    case "arrow-end":
+                        addArrow(o, value, 1);
+                        break;
+                    case "clip-rect":
+                        var rect = Str(value).split(separator);
+                        if (rect.length == 4) {
+                            o.clip && o.clip.parentNode.parentNode.removeChild(o.clip.parentNode);
+                            var el = $("clipPath"),
+                                rc = $("rect");
+                            el.id = R.createUUID();
+                            $(rc, {
+                                x: rect[0],
+                                y: rect[1],
+                                width: rect[2],
+                                height: rect[3]
+                            });
+                            el.appendChild(rc);
+                            o.paper.defs.appendChild(el);
+                            $(node, {"clip-path": "url(#" + el.id + ")"});
+                            o.clip = rc;
+                        }
+                        if (!value) {
+                            var clip = R._g.doc.getElementById(node.getAttribute("clip-path").replace(/(^url\(#|\)$)/g, E));
+                            clip && clip.parentNode.removeChild(clip);
+                            $(node, {"clip-path": E});
+                            delete o.clip;
+                        }
+                    break;
+                    case "path":
+                        if (o.type == "path") {
+                            $(node, {d: value ? attrs.path = R._pathToAbsolute(value) : "M0,0"});
+                            o._.dirty = 1;
+                            if (o._.arrows) {
+                                "startString" in o._.arrows && addArrow(o, o._.arrows.startString);
+                                "endString" in o._.arrows && addArrow(o, o._.arrows.endString, 1);
+                            }
+                        }
+                        break;
+                    case "width":
+                        node.setAttribute(att, value);
+                        o._.dirty = 1;
+                        if (attrs.fx) {
+                            att = "x";
+                            value = attrs.x;
+                        } else {
+                            break;
+                        }
+                    case "x":
+                        if (attrs.fx) {
+                            value = -attrs.x - (attrs.width || 0);
+                        }
+                    case "rx":
+                        if (att == "rx" && o.type == "rect") {
+                            break;
+                        }
+                    case "cx":
+                        node.setAttribute(att, value);
+                        o.pattern && updatePosition(o);
+                        o._.dirty = 1;
+                        break;
+                    case "height":
+                        node.setAttribute(att, value);
+                        o._.dirty = 1;
+                        if (attrs.fy) {
+                            att = "y";
+                            value = attrs.y;
+                        } else {
+                            break;
+                        }
+                    case "y":
+                        if (attrs.fy) {
+                            value = -attrs.y - (attrs.height || 0);
+                        }
+                    case "ry":
+                        if (att == "ry" && o.type == "rect") {
+                            break;
+                        }
+                    case "cy":
+                        node.setAttribute(att, value);
+                        o.pattern && updatePosition(o);
+                        o._.dirty = 1;
+                        break;
+                    case "r":
+                        if (o.type == "rect") {
+                            $(node, {rx: value, ry: value});
+                        } else {
+                            node.setAttribute(att, value);
+                        }
+                        o._.dirty = 1;
+                        break;
+                    case "src":
+                        if (o.type == "image") {
+                            node.setAttributeNS(xlink, "href", value);
+                        }
+                        break;
+                    case "stroke-width":
+                        if (o._.sx != 1 || o._.sy != 1) {
+                            value /= mmax(abs(o._.sx), abs(o._.sy)) || 1;
+                        }
+                        if (o.paper._vbSize) {
+                            value *= o.paper._vbSize;
+                        }
+                        node.setAttribute(att, value);
+                        if (attrs["stroke-dasharray"]) {
+                            addDashes(o, attrs["stroke-dasharray"], params);
+                        }
+                        if (o._.arrows) {
+                            "startString" in o._.arrows && addArrow(o, o._.arrows.startString);
+                            "endString" in o._.arrows && addArrow(o, o._.arrows.endString, 1);
+                        }
+                        break;
+                    case "stroke-dasharray":
+                        addDashes(o, value, params);
+                        break;
+                    case "fill":
+                        var isURL = Str(value).match(R._ISURL);
+                        if (isURL) {
+                            el = $("pattern");
+                            var ig = $("image");
+                            el.id = R.createUUID();
+                            $(el, {x: 0, y: 0, patternUnits: "userSpaceOnUse", height: 1, width: 1});
+                            $(ig, {x: 0, y: 0, "xlink:href": isURL[1]});
+                            el.appendChild(ig);
+
+                            (function (el) {
+                                R._preload(isURL[1], function () {
+                                    var w = this.offsetWidth,
+                                        h = this.offsetHeight;
+                                    $(el, {width: w, height: h});
+                                    $(ig, {width: w, height: h});
+                                    o.paper.safari();
+                                });
+                            })(el);
+                            o.paper.defs.appendChild(el);
+                            node.style.fill = "url(#" + el.id + ")";
+                            $(node, {fill: "url(#" + el.id + ")"});
+                            o.pattern = el;
+                            o.pattern && updatePosition(o);
+                            break;
+                        }
+                        var clr = R.getRGB(value);
+                        if (!clr.error) {
+                            delete params.gradient;
+                            delete attrs.gradient;
+                            !R.is(attrs.opacity, "undefined") &&
+                                R.is(params.opacity, "undefined") &&
+                                $(node, {opacity: attrs.opacity});
+                            !R.is(attrs["fill-opacity"], "undefined") &&
+                                R.is(params["fill-opacity"], "undefined") &&
+                                $(node, {"fill-opacity": attrs["fill-opacity"]});
+                        } else if ((o.type == "circle" || o.type == "ellipse" || Str(value).charAt() != "r") && addGradientFill(o, value)) {
+                            if ("opacity" in attrs || "fill-opacity" in attrs) {
+                                var gradient = R._g.doc.getElementById(node.getAttribute("fill").replace(/^url\(#|\)$/g, E));
+                                if (gradient) {
+                                    var stops = gradient.getElementsByTagName("stop");
+                                    $(stops[stops.length - 1], {"stop-opacity": ("opacity" in attrs ? attrs.opacity : 1) * ("fill-opacity" in attrs ? attrs["fill-opacity"] : 1)});
+                                }
+                            }
+                            attrs.gradient = value;
+                            attrs.fill = "none";
+                            break;
+                        }
+                        clr[has]("opacity") && $(node, {"fill-opacity": clr.opacity > 1 ? clr.opacity / 100 : clr.opacity});
+                    case "stroke":
+                        clr = R.getRGB(value);
+                        node.setAttribute(att, clr.hex);
+                        att == "stroke" && clr[has]("opacity") && $(node, {"stroke-opacity": clr.opacity > 1 ? clr.opacity / 100 : clr.opacity});
+                        if (att == "stroke" && o._.arrows) {
+                            "startString" in o._.arrows && addArrow(o, o._.arrows.startString);
+                            "endString" in o._.arrows && addArrow(o, o._.arrows.endString, 1);
+                        }
+                        break;
+                    case "gradient":
+                        (o.type == "circle" || o.type == "ellipse" || Str(value).charAt() != "r") && addGradientFill(o, value);
+                        break;
+                    case "opacity":
+                        if (attrs.gradient && !attrs[has]("stroke-opacity")) {
+                            $(node, {"stroke-opacity": value > 1 ? value / 100 : value});
+                        }
+                        // fall
+                    case "fill-opacity":
+                        if (attrs.gradient) {
+                            gradient = R._g.doc.getElementById(node.getAttribute("fill").replace(/^url\(#|\)$/g, E));
+                            if (gradient) {
+                                stops = gradient.getElementsByTagName("stop");
+                                $(stops[stops.length - 1], {"stop-opacity": value});
+                            }
+                            break;
+                        }
+                    default:
+                        att == "font-size" && (value = toInt(value, 10) + "px");
+                        var cssrule = att.replace(/(\-.)/g, function (w) {
+                            return w.substring(1).toUpperCase();
+                        });
+                        node.style[cssrule] = value;
+                        o._.dirty = 1;
+                        node.setAttribute(att, value);
+                        break;
+                }
+            }
+        }
+
+        tuneText(o, params);
+        node.style.visibility = vis;
+    },
+    leading = 1.2,
+    tuneText = function (el, params) {
+        if (el.type != "text" || !(params[has]("text") || params[has]("font") || params[has]("font-size") || params[has]("x") || params[has]("y"))) {
+            return;
+        }
+        var a = el.attrs,
+            node = el.node,
+            fontSize = node.firstChild ? toInt(R._g.doc.defaultView.getComputedStyle(node.firstChild, E).getPropertyValue("font-size"), 10) : 10;
+
+        if (params[has]("text")) {
+            a.text = params.text;
+            while (node.firstChild) {
+                node.removeChild(node.firstChild);
+            }
+            var texts = Str(params.text).split("\n"),
+                tspans = [],
+                tspan;
+            for (var i = 0, ii = texts.length; i < ii; i++) {
+                tspan = $("tspan");
+                i && $(tspan, {dy: fontSize * leading, x: a.x});
+                tspan.appendChild(R._g.doc.createTextNode(texts[i]));
+                node.appendChild(tspan);
+                tspans[i] = tspan;
+            }
+        } else {
+            tspans = node.getElementsByTagName("tspan");
+            for (i = 0, ii = tspans.length; i < ii; i++) if (i) {
+                $(tspans[i], {dy: fontSize * leading, x: a.x});
+            } else {
+                $(tspans[0], {dy: 0});
+            }
+        }
+        $(node, {x: a.x, y: a.y});
+        el._.dirty = 1;
+        var bb = el._getBBox(),
+            dif = a.y - (bb.y + bb.height / 2);
+        dif && R.is(dif, "finite") && $(tspans[0], {dy: dif});
+    },
+    Element = function (node, svg) {
+        var X = 0,
+            Y = 0;
+        
+        this[0] = this.node = node;
+        
+        node.raphael = true;
+        
+        this.id = R._oid++;
+        node.raphaelid = this.id;
+        this.matrix = R.matrix();
+        this.realPath = null;
+        
+        this.paper = svg;
+        this.attrs = this.attrs || {};
+        this._ = {
+            transform: [],
+            sx: 1,
+            sy: 1,
+            deg: 0,
+            dx: 0,
+            dy: 0,
+            dirty: 1
+        };
+        !svg.bottom && (svg.bottom = this);
+        
+        this.prev = svg.top;
+        svg.top && (svg.top.next = this);
+        svg.top = this;
+        
+        this.next = null;
+    },
+    elproto = R.el;
+
+    Element.prototype = elproto;
+    elproto.constructor = Element;
+
+    R._engine.path = function (pathString, SVG) {
+        var el = $("path");
+        SVG.canvas && SVG.canvas.appendChild(el);
+        var p = new Element(el, SVG);
+        p.type = "path";
+        setFillAndStroke(p, {
+            fill: "none",
+            stroke: "#000",
+            path: pathString
+        });
+        return p;
+    };
+    
+    elproto.rotate = function (deg, cx, cy) {
+        if (this.removed) {
+            return this;
+        }
+        deg = Str(deg).split(separator);
+        if (deg.length - 1) {
+            cx = toFloat(deg[1]);
+            cy = toFloat(deg[2]);
+        }
+        deg = toFloat(deg[0]);
+        (cy == null) && (cx = cy);
+        if (cx == null || cy == null) {
+            var bbox = this.getBBox(1);
+            cx = bbox.x + bbox.width / 2;
+            cy = bbox.y + bbox.height / 2;
+        }
+        this.transform(this._.transform.concat([["r", deg, cx, cy]]));
+        return this;
+    };
+    
+    elproto.scale = function (sx, sy, cx, cy) {
+        if (this.removed) {
+            return this;
+        }
+        sx = Str(sx).split(separator);
+        if (sx.length - 1) {
+            sy = toFloat(sx[1]);
+            cx = toFloat(sx[2]);
+            cy = toFloat(sx[3]);
+        }
+        sx = toFloat(sx[0]);
+        (sy == null) && (sy = sx);
+        (cy == null) && (cx = cy);
+        if (cx == null || cy == null) {
+            var bbox = this.getBBox(1);
+        }
+        cx = cx == null ? bbox.x + bbox.width / 2 : cx;
+        cy = cy == null ? bbox.y + bbox.height / 2 : cy;
+        this.transform(this._.transform.concat([["s", sx, sy, cx, cy]]));
+        return this;
+    };
+    
+    elproto.translate = function (dx, dy) {
+        if (this.removed) {
+            return this;
+        }
+        dx = Str(dx).split(separator);
+        if (dx.length - 1) {
+            dy = toFloat(dx[1]);
+        }
+        dx = toFloat(dx[0]) || 0;
+        dy = +dy || 0;
+        this.transform(this._.transform.concat([["t", dx, dy]]));
+        return this;
+    };
+    
+    elproto.transform = function (tstr) {
+        var _ = this._;
+        if (tstr == null) {
+            return _.transform;
+        }
+        R._extractTransform(this, tstr);
+
+        this.clip && $(this.clip, {transform: this.matrix.invert()});
+        this.pattern && updatePosition(this);
+        this.node && $(this.node, {transform: this.matrix});
+    
+        if (_.sx != 1 || _.sy != 1) {
+            var sw = this.attrs[has]("stroke-width") ? this.attrs["stroke-width"] : 1;
+            this.attr({"stroke-width": sw});
+        }
+
+        return this;
+    };
+    
+    elproto.hide = function () {
+        !this.removed && this.paper.safari(this.node.style.display = "none");
+        return this;
+    };
+    
+    elproto.show = function () {
+        !this.removed && this.paper.safari(this.node.style.display = "");
+        return this;
+    };
+    
+    elproto.remove = function () {
+        if (this.removed) {
+            return;
+        }
+        this.paper.__set__ && this.paper.__set__.exclude(this);
+        eve.unbind("*.*." + this.id);
+        R._tear(this, this.paper);
+        this.node.parentNode.removeChild(this.node);
+        for (var i in this) {
+            delete this[i];
+        }
+        this.removed = true;
+    };
+    elproto._getBBox = function () {
+        if (this.node.style.display == "none") {
+            this.show();
+            var hide = true;
+        }
+        var bbox = {};
+        try {
+            bbox = this.node.getBBox();
+        } catch(e) {
+            // Firefox 3.0.x plays badly here
+        } finally {
+            bbox = bbox || {};
+        }
+        hide && this.hide();
+        return bbox;
+    };
+    
+    elproto.attr = function (name, value) {
+        if (this.removed) {
+            return this;
+        }
+        if (name == null) {
+            var res = {};
+            for (var a in this.attrs) if (this.attrs[has](a)) {
+                res[a] = this.attrs[a];
+            }
+            res.gradient && res.fill == "none" && (res.fill = res.gradient) && delete res.gradient;
+            res.transform = this._.transform;
+            return res;
+        }
+        if (value == null && R.is(name, "string")) {
+            if (name == "fill" && this.attrs.fill == "none" && this.attrs.gradient) {
+                return this.attrs.gradient;
+            }
+            if (name == "transform") {
+                return this._.transform;
+            }
+            var names = name.split(separator),
+                out = {};
+            for (var i = 0, ii = names.length; i < ii; i++) {
+                name = names[i];
+                if (name in this.attrs) {
+                    out[name] = this.attrs[name];
+                } else if (R.is(this.paper.customAttributes[name], "function")) {
+                    out[name] = this.paper.customAttributes[name].def;
+                } else {
+                    out[name] = R._availableAttrs[name];
+                }
+            }
+            return ii - 1 ? out : out[names[0]];
+        }
+        if (value == null && R.is(name, "array")) {
+            out = {};
+            for (i = 0, ii = name.length; i < ii; i++) {
+                out[name[i]] = this.attr(name[i]);
+            }
+            return out;
+        }
+        if (value != null) {
+            var params = {};
+            params[name] = value;
+        } else if (name != null && R.is(name, "object")) {
+            params = name;
+        }
+        for (var key in params) {
+            eve("attr." + key + "." + this.id, this, params[key]);
+        }
+        for (key in this.paper.customAttributes) if (this.paper.customAttributes[has](key) && params[has](key) && R.is(this.paper.customAttributes[key], "function")) {
+            var par = this.paper.customAttributes[key].apply(this, [].concat(params[key]));
+            this.attrs[key] = params[key];
+            for (var subkey in par) if (par[has](subkey)) {
+                params[subkey] = par[subkey];
+            }
+        }
+        setFillAndStroke(this, params);
+        return this;
+    };
+    
+    elproto.toFront = function () {
+        if (this.removed) {
+            return this;
+        }
+        this.node.parentNode.appendChild(this.node);
+        var svg = this.paper;
+        svg.top != this && R._tofront(this, svg);
+        return this;
+    };
+    
+    elproto.toBack = function () {
+        if (this.removed) {
+            return this;
+        }
+        if (this.node.parentNode.firstChild != this.node) {
+            this.node.parentNode.insertBefore(this.node, this.node.parentNode.firstChild);
+            R._toback(this, this.paper);
+            var svg = this.paper;
+        }
+        return this;
+    };
+    
+    elproto.insertAfter = function (element) {
+        if (this.removed) {
+            return this;
+        }
+        var node = element.node || element[element.length - 1].node;
+        if (node.nextSibling) {
+            node.parentNode.insertBefore(this.node, node.nextSibling);
+        } else {
+            node.parentNode.appendChild(this.node);
+        }
+        R._insertafter(this, element, this.paper);
+        return this;
+    };
+    
+    elproto.insertBefore = function (element) {
+        if (this.removed) {
+            return this;
+        }
+        var node = element.node || element[0].node;
+        node.parentNode.insertBefore(this.node, node);
+        R._insertbefore(this, element, this.paper);
+        return this;
+    };
+    elproto.blur = function (size) {
+        // Experimental. No Safari support. Use it on your own risk.
+        var t = this;
+        if (+size !== 0) {
+            var fltr = $("filter"),
+                blur = $("feGaussianBlur");
+            t.attrs.blur = size;
+            fltr.id = R.createUUID();
+            $(blur, {stdDeviation: +size || 1.5});
+            fltr.appendChild(blur);
+            t.paper.defs.appendChild(fltr);
+            t._blur = fltr;
+            $(t.node, {filter: "url(#" + fltr.id + ")"});
+        } else {
+            if (t._blur) {
+                t._blur.parentNode.removeChild(t._blur);
+                delete t._blur;
+                delete t.attrs.blur;
+            }
+            t.node.removeAttribute("filter");
+        }
+    };
+    R._engine.circle = function (svg, x, y, r) {
+        var el = $("circle");
+        svg.canvas && svg.canvas.appendChild(el);
+        var res = new Element(el, svg);
+        res.attrs = {cx: x, cy: y, r: r, fill: "none", stroke: "#000"};
+        res.type = "circle";
+        $(el, res.attrs);
+        return res;
+    };
+    R._engine.rect = function (svg, x, y, w, h, r) {
+        var el = $("rect");
+        svg.canvas && svg.canvas.appendChild(el);
+        var res = new Element(el, svg);
+        res.attrs = {x: x, y: y, width: w, height: h, r: r || 0, rx: r || 0, ry: r || 0, fill: "none", stroke: "#000"};
+        res.type = "rect";
+        $(el, res.attrs);
+        return res;
+    };
+    R._engine.ellipse = function (svg, x, y, rx, ry) {
+        var el = $("ellipse");
+        svg.canvas && svg.canvas.appendChild(el);
+        var res = new Element(el, svg);
+        res.attrs = {cx: x, cy: y, rx: rx, ry: ry, fill: "none", stroke: "#000"};
+        res.type = "ellipse";
+        $(el, res.attrs);
+        return res;
+    };
+    R._engine.image = function (svg, src, x, y, w, h) {
+        var el = $("image");
+        $(el, {x: x, y: y, width: w, height: h, preserveAspectRatio: "none"});
+        el.setAttributeNS(xlink, "href", src);
+        svg.canvas && svg.canvas.appendChild(el);
+        var res = new Element(el, svg);
+        res.attrs = {x: x, y: y, width: w, height: h, src: src};
+        res.type = "image";
+        return res;
+    };
+    R._engine.text = function (svg, x, y, text) {
+        var el = $("text");
+        // $(el, {x: x, y: y, "text-anchor": "middle"});
+        svg.canvas && svg.canvas.appendChild(el);
+        var res = new Element(el, svg);
+        res.attrs = {
+            x: x,
+            y: y,
+            "text-anchor": "middle",
+            text: text,
+            font: R._availableAttrs.font,
+            stroke: "none",
+            fill: "#000"
+        };
+        res.type = "text";
+        setFillAndStroke(res, res.attrs);
+        return res;
+    };
+    R._engine.setSize = function (width, height) {
+        this.width = width || this.width;
+        this.height = height || this.height;
+        this.canvas.setAttribute("width", this.width);
+        this.canvas.setAttribute("height", this.height);
+        if (this._viewBox) {
+            this.setViewBox.apply(this, this._viewBox);
+        }
+        return this;
+    };
+    R._engine.create = function () {
+        var con = R._getContainer.apply(0, arguments),
+            container = con && con.container,
+            x = con.x,
+            y = con.y,
+            width = con.width,
+            height = con.height;
+        if (!container) {
+            throw new Error("SVG container not found.");
+        }
+        var cnvs = $("svg"),
+            css = "overflow:hidden;",
+            isFloating;
+        x = x || 0;
+        y = y || 0;
+        width = width || 512;
+        height = height || 342;
+        $(cnvs, {
+            height: height,
+            version: 1.1,
+            width: width,
+            xmlns: "http://www.w3.org/2000/svg"
+        });
+        if (container == 1) {
+            cnvs.style.cssText = css + "position:absolute;left:" + x + "px;top:" + y + "px";
+            R._g.doc.body.appendChild(cnvs);
+            isFloating = 1;
+        } else {
+            cnvs.style.cssText = css + "position:relative";
+            if (container.firstChild) {
+                container.insertBefore(cnvs, container.firstChild);
+            } else {
+                container.appendChild(cnvs);
+            }
+        }
+        container = new R._Paper;
+        container.width = width;
+        container.height = height;
+        container.canvas = cnvs;
+        // plugins.call(container, container, R.fn);
+        container.clear();
+        container._left = container._top = 0;
+        isFloating && (container.renderfix = function () {});
+        container.renderfix();
+        return container;
+    };
+    R._engine.setViewBox = function (x, y, w, h, fit) {
+        eve("setViewBox", this, this._viewBox, [x, y, w, h, fit]);
+        var size = mmax(w / this.width, h / this.height),
+            top = this.top,
+            aspectRatio = fit ? "meet" : "xMinYMin",
+            vb,
+            sw;
+        if (x == null) {
+            if (this._vbSize) {
+                size = 1;
+            }
+            delete this._vbSize;
+            vb = "0 0 " + this.width + S + this.height;
+        } else {
+            this._vbSize = size;
+            vb = x + S + y + S + w + S + h;
+        }
+        $(this.canvas, {
+            viewBox: vb,
+            preserveAspectRatio: aspectRatio
+        });
+        while (size && top) {
+            sw = "stroke-width" in top.attrs ? top.attrs["stroke-width"] : 1;
+            top.attr({"stroke-width": sw});
+            top._.dirty = 1;
+            top._.dirtyT = 1;
+            top = top.prev;
+        }
+        this._viewBox = [x, y, w, h, !!fit];
+        return this;
+    };
+    
+    R.prototype.renderfix = function () {
+        var cnvs = this.canvas,
+            s = cnvs.style,
+            pos = cnvs.getScreenCTM() || cnvs.createSVGMatrix(),
+            left = -pos.e % 1,
+            top = -pos.f % 1;
+        if (left || top) {
+            if (left) {
+                this._left = (this._left + left) % 1;
+                s.left = this._left + "px";
+            }
+            if (top) {
+                this._top = (this._top + top) % 1;
+                s.top = this._top + "px";
+            }
+        }
+    };
+    
+    R.prototype.clear = function () {
+        R.eve("clear", this);
+        var c = this.canvas;
+        while (c.firstChild) {
+            c.removeChild(c.firstChild);
+        }
+        this.bottom = this.top = null;
+        (this.desc = $("desc")).appendChild(R._g.doc.createTextNode("Created with Rapha\xebl " + R.version));
+        c.appendChild(this.desc);
+        c.appendChild(this.defs = $("defs"));
+    };
+    
+    R.prototype.remove = function () {
+        eve("remove", this);
+        this.canvas.parentNode && this.canvas.parentNode.removeChild(this.canvas);
+        for (var i in this) {
+            this[i] = removed(i);
+        }
+    };
+    var setproto = R.st;
+    for (var method in elproto) if (elproto[has](method) && !setproto[has](method)) {
+        setproto[method] = (function (methodname) {
+            return function () {
+                var arg = arguments;
+                return this.forEach(function (el) {
+                    el[methodname].apply(el, arg);
+                });
+            };
+        })(method);
+    }
+}(window.Raphael);
+
+// ┌─────────────────────────────────────────────────────────────────────┐ \\
+// │ Raphaël 2 - JavaScript Vector Library                               │ \\
+// ├─────────────────────────────────────────────────────────────────────┤ \\
+// │ VML Module                                                          │ \\
+// ├─────────────────────────────────────────────────────────────────────┤ \\
+// │ Copyright (c) 2008-2011 Dmitry Baranovskiy (http://raphaeljs.com)   │ \\
+// │ Copyright (c) 2008-2011 Sencha Labs (http://sencha.com)             │ \\
+// │ Licensed under the MIT (http://raphaeljs.com/license.html) license. │ \\
+// └─────────────────────────────────────────────────────────────────────┘ \\
+window.Raphael.vml && function (R) {
+    var has = "hasOwnProperty",
+        Str = String,
+        toFloat = parseFloat,
+        math = Math,
+        round = math.round,
+        mmax = math.max,
+        mmin = math.min,
+        abs = math.abs,
+        fillString = "fill",
+        separator = /[, ]+/,
+        eve = R.eve,
+        ms = " progid:DXImageTransform.Microsoft",
+        S = " ",
+        E = "",
+        map = {M: "m", L: "l", C: "c", Z: "x", m: "t", l: "r", c: "v", z: "x"},
+        bites = /([clmz]),?([^clmz]*)/gi,
+        blurregexp = / progid:\S+Blur\([^\)]+\)/g,
+        val = /-?[^,\s-]+/g,
+        cssDot = "position:absolute;left:0;top:0;width:1px;height:1px",
+        zoom = 21600,
+        pathTypes = {path: 1, rect: 1, image: 1},
+        ovalTypes = {circle: 1, ellipse: 1},
+        path2vml = function (path) {
+            var total =  /[ahqstv]/ig,
+                command = R._pathToAbsolute;
+            Str(path).match(total) && (command = R._path2curve);
+            total = /[clmz]/g;
+            if (command == R._pathToAbsolute && !Str(path).match(total)) {
+                var res = Str(path).replace(bites, function (all, command, args) {
+                    var vals = [],
+                        isMove = command.toLowerCase() == "m",
+                        res = map[command];
+                    args.replace(val, function (value) {
+                        if (isMove && vals.length == 2) {
+                            res += vals + map[command == "m" ? "l" : "L"];
+                            vals = [];
+                        }
+                        vals.push(round(value * zoom));
+                    });
+                    return res + vals;
+                });
+                return res;
+            }
+            var pa = command(path), p, r;
+            res = [];
+            for (var i = 0, ii = pa.length; i < ii; i++) {
+                p = pa[i];
+                r = pa[i][0].toLowerCase();
+                r == "z" && (r = "x");
+                for (var j = 1, jj = p.length; j < jj; j++) {
+                    r += round(p[j] * zoom) + (j != jj - 1 ? "," : E);
+                }
+                res.push(r);
+            }
+            return res.join(S);
+        },
+        compensation = function (deg, dx, dy) {
+            var m = R.matrix();
+            m.rotate(-deg, .5, .5);
+            return {
+                dx: m.x(dx, dy),
+                dy: m.y(dx, dy)
+            };
+        },
+        setCoords = function (p, sx, sy, dx, dy, deg) {
+            var _ = p._,
+                m = p.matrix,
+                fillpos = _.fillpos,
+                o = p.node,
+                s = o.style,
+                y = 1,
+                flip = "",
+                dxdy,
+                kx = zoom / sx,
+                ky = zoom / sy;
+            s.visibility = "hidden";
+            if (!sx || !sy) {
+                return;
+            }
+            o.coordsize = abs(kx) + S + abs(ky);
+            s.rotation = deg * (sx * sy < 0 ? -1 : 1);
+            if (deg) {
+                var c = compensation(deg, dx, dy);
+                dx = c.dx;
+                dy = c.dy;
+            }
+            sx < 0 && (flip += "x");
+            sy < 0 && (flip += " y") && (y = -1);
+            s.flip = flip;
+            o.coordorigin = (dx * -kx) + S + (dy * -ky);
+            if (fillpos || _.fillsize) {
+                var fill = o.getElementsByTagName(fillString);
+                fill = fill && fill[0];
+                o.removeChild(fill);
+                if (fillpos) {
+                    c = compensation(deg, m.x(fillpos[0], fillpos[1]), m.y(fillpos[0], fillpos[1]));
+                    fill.position = c.dx * y + S + c.dy * y;
+                }
+                if (_.fillsize) {
+                    fill.size = _.fillsize[0] * abs(sx) + S + _.fillsize[1] * abs(sy);
+                }
+                o.appendChild(fill);
+            }
+            s.visibility = "visible";
+        };
+    R.toString = function () {
+        return  "Your browser doesn\u2019t support SVG. Falling down to VML.\nYou are running Rapha\xebl " + this.version;
+    };
+    addArrow = function (o, value, isEnd) {
+        var values = Str(value).toLowerCase().split("-"),
+            se = isEnd ? "end" : "start",
+            i = values.length,
+            type = "classic",
+            w = "medium",
+            h = "medium";
+        while (i--) {
+            switch (values[i]) {
+                case "block":
+                case "classic":
+                case "oval":
+                case "diamond":
+                case "open":
+                case "none":
+                    type = values[i];
+                    break;
+                case "wide":
+                case "narrow": h = values[i]; break;
+                case "long":
+                case "short": w = values[i]; break;
+            }
+        }
+        var stroke = o.node.getElementsByTagName("stroke")[0];
+        stroke[se + "arrow"] = type;
+        stroke[se + "arrowlength"] = w;
+        stroke[se + "arrowwidth"] = h;
+    };
+    setFillAndStroke = function (o, params) {
+        // o.paper.canvas.style.display = "none";
+        o.attrs = o.attrs || {};
+        var node = o.node,
+            a = o.attrs,
+            s = node.style,
+            xy,
+            newpath = pathTypes[o.type] && (params.x != a.x || params.y != a.y || params.width != a.width || params.height != a.height || params.cx != a.cx || params.cy != a.cy || params.rx != a.rx || params.ry != a.ry || params.r != a.r),
+            isOval = ovalTypes[o.type] && (a.cx != params.cx || a.cy != params.cy || a.r != params.r || a.rx != params.rx || a.ry != params.ry),
+            res = o;
+
+
+        for (var par in params) if (params[has](par)) {
+            a[par] = params[par];
+        }
+        if (newpath) {
+            a.path = R._getPath[o.type](o);
+            o._.dirty = 1;
+        }
+        params.href && (node.href = params.href);
+        params.title && (node.title = params.title);
+        params.target && (node.target = params.target);
+        params.cursor && (s.cursor = params.cursor);
+        "blur" in params && o.blur(params.blur);
+        if (params.path && o.type == "path" || newpath) {
+            node.path = path2vml(~Str(a.path).toLowerCase().indexOf("r") ? R._pathToAbsolute(a.path) : a.path);
+            if (o.type == "image") {
+                o._.fillpos = [a.x, a.y];
+                o._.fillsize = [a.width, a.height];
+                setCoords(o, 1, 1, 0, 0, 0);
+            }
+        }
+        "transform" in params && o.transform(params.transform);
+        if (isOval) {
+            var cx = +a.cx,
+                cy = +a.cy,
+                rx = +a.rx || +a.r || 0,
+                ry = +a.ry || +a.r || 0;
+            node.path = R.format("ar{0},{1},{2},{3},{4},{1},{4},{1}x", round((cx - rx) * zoom), round((cy - ry) * zoom), round((cx + rx) * zoom), round((cy + ry) * zoom), round(cx * zoom));
+        }
+        if ("clip-rect" in params) {
+            var rect = Str(params["clip-rect"]).split(separator);
+            if (rect.length == 4) {
+                rect[2] = +rect[2] + (+rect[0]);
+                rect[3] = +rect[3] + (+rect[1]);
+                var div = node.clipRect || R._g.doc.createElement("div"),
+                    dstyle = div.style;
+                dstyle.clip = R.format("rect({1}px {2}px {3}px {0}px)", rect);
+                if (!node.clipRect) {
+                    dstyle.position = "absolute";
+                    dstyle.top = 0;
+                    dstyle.left = 0;
+                    dstyle.width = o.paper.width + "px";
+                    dstyle.height = o.paper.height + "px";
+                    node.parentNode.insertBefore(div, node);
+                    div.appendChild(node);
+                    node.clipRect = div;
+                }
+            }
+            if (!params["clip-rect"]) {
+                node.clipRect && (node.clipRect.style.clip = E);
+            }
+        }
+        if (o.textpath) {
+            var textpathStyle = o.textpath.style;
+            params.font && (textpathStyle.font = params.font);
+            params["font-family"] && (textpathStyle.fontFamily = '"' + params["font-family"].split(",")[0].replace(/^['"]+|['"]+$/g, E) + '"');
+            params["font-size"] && (textpathStyle.fontSize = params["font-size"]);
+            params["font-weight"] && (textpathStyle.fontWeight = params["font-weight"]);
+            params["font-style"] && (textpathStyle.fontStyle = params["font-style"]);
+        }
+        if ("arrow-start" in params) {
+            addArrow(res, params["arrow-start"]);
+        }
+        if ("arrow-end" in params) {
+            addArrow(res, params["arrow-end"], 1);
+        }
+        if (params.opacity != null || 
+            params["stroke-width"] != null ||
+            params.fill != null ||
+            params.src != null ||
+            params.stroke != null ||
+            params["stroke-width"] != null ||
+            params["stroke-opacity"] != null ||
+            params["fill-opacity"] != null ||
+            params["stroke-dasharray"] != null ||
+            params["stroke-miterlimit"] != null ||
+            params["stroke-linejoin"] != null ||
+            params["stroke-linecap"] != null) {
+            var fill = node.getElementsByTagName(fillString),
+                newfill = false;
+            fill = fill && fill[0];
+            !fill && (newfill = fill = createNode(fillString));
+            if (o.type == "image" && params.src) {
+                fill.src = params.src;
+            }
+            params.fill && (fill.on = true);
+            if (fill.on == null || params.fill == "none" || params.fill === null) {
+                fill.on = false;
+            }
+            if (fill.on && params.fill) {
+                var isURL = Str(params.fill).match(R._ISURL);
+                if (isURL) {
+                    fill.parentNode == node && node.removeChild(fill);
+                    fill.rotate = true;
+                    fill.src = isURL[1];
+                    fill.type = "tile";
+                    var bbox = o.getBBox(1);
+                    fill.position = bbox.x + S + bbox.y;
+                    o._.fillpos = [bbox.x, bbox.y];
+
+                    R._preload(isURL[1], function () {
+                        o._.fillsize = [this.offsetWidth, this.offsetHeight];
+                    });
+                } else {
+                    fill.color = R.getRGB(params.fill).hex;
+                    fill.src = E;
+                    fill.type = "solid";
+                    if (R.getRGB(params.fill).error && (res.type in {circle: 1, ellipse: 1} || Str(params.fill).charAt() != "r") && addGradientFill(res, params.fill, fill)) {
+                        a.fill = "none";
+                        a.gradient = params.fill;
+                        fill.rotate = false;
+                    }
+                }
+            }
+            if ("fill-opacity" in params || "opacity" in params) {
+                var opacity = ((+a["fill-opacity"] + 1 || 2) - 1) * ((+a.opacity + 1 || 2) - 1) * ((+R.getRGB(params.fill).o + 1 || 2) - 1);
+                opacity = mmin(mmax(opacity, 0), 1);
+                fill.opacity = opacity;
+                if (fill.src) {
+                    fill.color = "none";
+                }
+            }
+            node.appendChild(fill);
+            var stroke = (node.getElementsByTagName("stroke") && node.getElementsByTagName("stroke")[0]),
+            newstroke = false;
+            !stroke && (newstroke = stroke = createNode("stroke"));
+            if ((params.stroke && params.stroke != "none") ||
+                params["stroke-width"] ||
+                params["stroke-opacity"] != null ||
+                params["stroke-dasharray"] ||
+                params["stroke-miterlimit"] ||
+                params["stroke-linejoin"] ||
+                params["stroke-linecap"]) {
+                stroke.on = true;
+            }
+            (params.stroke == "none" || params.stroke === null || stroke.on == null || params.stroke == 0 || params["stroke-width"] == 0) && (stroke.on = false);
+            var strokeColor = R.getRGB(params.stroke);
+            stroke.on && params.stroke && (stroke.color = strokeColor.hex);
+            opacity = ((+a["stroke-opacity"] + 1 || 2) - 1) * ((+a.opacity + 1 || 2) - 1) * ((+strokeColor.o + 1 || 2) - 1);
+            var width = (toFloat(params["stroke-width"]) || 1) * .75;
+            opacity = mmin(mmax(opacity, 0), 1);
+            params["stroke-width"] == null && (width = a["stroke-width"]);
+            params["stroke-width"] && (stroke.weight = width);
+            width && width < 1 && (opacity *= width) && (stroke.weight = 1);
+            stroke.opacity = opacity;
+        
+            params["stroke-linejoin"] && (stroke.joinstyle = params["stroke-linejoin"] || "miter");
+            stroke.miterlimit = params["stroke-miterlimit"] || 8;
+            params["stroke-linecap"] && (stroke.endcap = params["stroke-linecap"] == "butt" ? "flat" : params["stroke-linecap"] == "square" ? "square" : "round");
+            if (params["stroke-dasharray"]) {
+                var dasharray = {
+                    "-": "shortdash",
+                    ".": "shortdot",
+                    "-.": "shortdashdot",
+                    "-..": "shortdashdotdot",
+                    ". ": "dot",
+                    "- ": "dash",
+                    "--": "longdash",
+                    "- .": "dashdot",
+                    "--.": "longdashdot",
+                    "--..": "longdashdotdot"
+                };
+                stroke.dashstyle = dasharray[has](params["stroke-dasharray"]) ? dasharray[params["stroke-dasharray"]] : E;
+            }
+            newstroke && node.appendChild(stroke);
+        }
+        if (res.type == "text") {
+            res.paper.canvas.style.display = E;
+            var span = res.paper.span,
+                m = 100,
+                fontSize = a.font && a.font.match(/\d+(?:\.\d*)?(?=px)/);
+            s = span.style;
+            a.font && (s.font = a.font);
+            a["font-family"] && (s.fontFamily = a["font-family"]);
+            a["font-weight"] && (s.fontWeight = a["font-weight"]);
+            a["font-style"] && (s.fontStyle = a["font-style"]);
+            fontSize = toFloat(fontSize ? fontSize[0] : a["font-size"]);
+            s.fontSize = fontSize * m + "px";
+            res.textpath.string && (span.innerHTML = Str(res.textpath.string).replace(/</g, "&#60;").replace(/&/g, "&#38;").replace(/\n/g, "<br>"));
+            var brect = span.getBoundingClientRect();
+            res.W = a.w = (brect.right - brect.left) / m;
+            res.H = a.h = (brect.bottom - brect.top) / m;
+            // res.paper.canvas.style.display = "none";
+            res.X = a.x;
+            res.Y = a.y + res.H / 2;
+
+            ("x" in params || "y" in params) && (res.path.v = R.format("m{0},{1}l{2},{1}", round(a.x * zoom), round(a.y * zoom), round(a.x * zoom) + 1));
+            var dirtyattrs = ["x", "y", "text", "font", "font-family", "font-weight", "font-style", "font-size"];
+            for (var d = 0, dd = dirtyattrs.length; d < dd; d++) if (dirtyattrs[d] in params) {
+                res._.dirty = 1;
+                break;
+            }
+        
+            // text-anchor emulation
+            switch (a["text-anchor"]) {
+                case "start":
+                    res.textpath.style["v-text-align"] = "left";
+                    res.bbx = res.W / 2;
+                break;
+                case "end":
+                    res.textpath.style["v-text-align"] = "right";
+                    res.bbx = -res.W / 2;
+                break;
+                default:
+                    res.textpath.style["v-text-align"] = "center";
+                    res.bbx = 0;
+                break;
+            }
+            res.textpath.style["v-text-kern"] = true;
+        }
+        // res.paper.canvas.style.display = E;
+    };
+    addGradientFill = function (o, gradient, fill) {
+        o.attrs = o.attrs || {};
+        var attrs = o.attrs,
+            pow = Math.pow,
+            opacity,
+            oindex,
+            type = "linear",
+            fxfy = ".5 .5";
+        o.attrs.gradient = gradient;
+        gradient = Str(gradient).replace(R._radial_gradient, function (all, fx, fy) {
+            type = "radial";
+            if (fx && fy) {
+                fx = toFloat(fx);
+                fy = toFloat(fy);
+                pow(fx - .5, 2) + pow(fy - .5, 2) > .25 && (fy = math.sqrt(.25 - pow(fx - .5, 2)) * ((fy > .5) * 2 - 1) + .5);
+                fxfy = fx + S + fy;
+            }
+            return E;
+        });
+        gradient = gradient.split(/\s*\-\s*/);
+        if (type == "linear") {
+            var angle = gradient.shift();
+            angle = -toFloat(angle);
+            if (isNaN(angle)) {
+                return null;
+            }
+        }
+        var dots = R._parseDots(gradient);
+        if (!dots) {
+            return null;
+        }
+        o = o.shape || o.node;
+        if (dots.length) {
+            o.removeChild(fill);
+            fill.on = true;
+            fill.method = "none";
+            fill.color = dots[0].color;
+            fill.color2 = dots[dots.length - 1].color;
+            var clrs = [];
+            for (var i = 0, ii = dots.length; i < ii; i++) {
+                dots[i].offset && clrs.push(dots[i].offset + S + dots[i].color);
+            }
+            fill.colors = clrs.length ? clrs.join() : "0% " + fill.color;
+            if (type == "radial") {
+                fill.type = "gradientTitle";
+                fill.focus = "100%";
+                fill.focussize = "0 0";
+                fill.focusposition = fxfy;
+                fill.angle = 0;
+            } else {
+                // fill.rotate= true;
+                fill.type = "gradient";
+                fill.angle = (270 - angle) % 360;
+            }
+            o.appendChild(fill);
+        }
+        return 1;
+    };
+    Element = function (node, vml) {
+        this[0] = this.node = node;
+        node.raphael = true;
+        this.id = R._oid++;
+        node.raphaelid = this.id;
+        this.X = 0;
+        this.Y = 0;
+        this.attrs = {};
+        this.paper = vml;
+        this.matrix = R.matrix();
+        this._ = {
+            transform: [],
+            sx: 1,
+            sy: 1,
+            dx: 0,
+            dy: 0,
+            deg: 0,
+            dirty: 1,
+            dirtyT: 1
+        };
+        !vml.bottom && (vml.bottom = this);
+        this.prev = vml.top;
+        vml.top && (vml.top.next = this);
+        vml.top = this;
+        this.next = null;
+    };
+    var elproto = R.el;
+
+    Element.prototype = elproto;
+    elproto.constructor = Element;
+    elproto.transform = function (tstr) {
+        if (tstr == null) {
+            return this._.transform;
+        }
+        var vbs = this.paper._viewBoxShift,
+            vbt = vbs ? "s" + [vbs.scale, vbs.scale] + "-1-1t" + [vbs.dx, vbs.dy] : E,
+            oldt;
+        if (vbs) {
+            oldt = tstr = Str(tstr).replace(/\.{3}|\u2026/g, this._.transform || E);
+        }
+        R._extractTransform(this, vbt + tstr);
+        var matrix = this.matrix.clone(),
+            skew = this.skew,
+            o = this.node,
+            split,
+            isGrad = ~Str(this.attrs.fill).indexOf("-"),
+            isPatt = !Str(this.attrs.fill).indexOf("url(");
+        matrix.translate(-.5, -.5);
+        if (isPatt || isGrad || this.type == "image") {
+            skew.matrix = "1 0 0 1";
+            skew.offset = "0 0";
+            split = matrix.split();
+            if ((isGrad && split.noRotation) || !split.isSimple) {
+                o.style.filter = matrix.toFilter();
+                var bb = this.getBBox(),
+                    bbt = this.getBBox(1),
+                    dx = bb.x - bbt.x,
+                    dy = bb.y - bbt.y;
+                o.coordorigin = (dx * -zoom) + S + (dy * -zoom);
+                setCoords(this, 1, 1, dx, dy, 0);
+            } else {
+                o.style.filter = E;
+                setCoords(this, split.scalex, split.scaley, split.dx, split.dy, split.rotate);
+            }
+        } else {
+            o.style.filter = E;
+            skew.matrix = Str(matrix);
+            skew.offset = matrix.offset();
+        }
+        oldt && (this._.transform = oldt);
+        return this;
+    };
+    elproto.rotate = function (deg, cx, cy) {
+        if (this.removed) {
+            return this;
+        }
+        if (deg == null) {
+            return;
+        }
+        deg = Str(deg).split(separator);
+        if (deg.length - 1) {
+            cx = toFloat(deg[1]);
+            cy = toFloat(deg[2]);
+        }
+        deg = toFloat(deg[0]);
+        (cy == null) && (cx = cy);
+        if (cx == null || cy == null) {
+            var bbox = this.getBBox(1);
+            cx = bbox.x + bbox.width / 2;
+            cy = bbox.y + bbox.height / 2;
+        }
+        this._.dirtyT = 1;
+        this.transform(this._.transform.concat([["r", deg, cx, cy]]));
+        return this;
+    };
+    elproto.translate = function (dx, dy) {
+        if (this.removed) {
+            return this;
+        }
+        dx = Str(dx).split(separator);
+        if (dx.length - 1) {
+            dy = toFloat(dx[1]);
+        }
+        dx = toFloat(dx[0]) || 0;
+        dy = +dy || 0;
+        if (this._.bbox) {
+            this._.bbox.x += dx;
+            this._.bbox.y += dy;
+        }
+        this.transform(this._.transform.concat([["t", dx, dy]]));
+        return this;
+    };
+    elproto.scale = function (sx, sy, cx, cy) {
+        if (this.removed) {
+            return this;
+        }
+        sx = Str(sx).split(separator);
+        if (sx.length - 1) {
+            sy = toFloat(sx[1]);
+            cx = toFloat(sx[2]);
+            cy = toFloat(sx[3]);
+            isNaN(cx) && (cx = null);
+            isNaN(cy) && (cy = null);
+        }
+        sx = toFloat(sx[0]);
+        (sy == null) && (sy = sx);
+        (cy == null) && (cx = cy);
+        if (cx == null || cy == null) {
+            var bbox = this.getBBox(1);
+        }
+        cx = cx == null ? bbox.x + bbox.width / 2 : cx;
+        cy = cy == null ? bbox.y + bbox.height / 2 : cy;
+    
+        this.transform(this._.transform.concat([["s", sx, sy, cx, cy]]));
+        this._.dirtyT = 1;
+        return this;
+    };
+    elproto.hide = function () {
+        !this.removed && (this.node.style.display = "none");
+        return this;
+    };
+    elproto.show = function () {
+        !this.removed && (this.node.style.display = E);
+        return this;
+    };
+    elproto._getBBox = function () {
+        if (this.removed) {
+            return {};
+        }
+        if (this.type == "text") {
+            return {
+                x: this.X + (this.bbx || 0) - this.W / 2,
+                y: this.Y - this.H,
+                width: this.W,
+                height: this.H
+            };
+        } else {
+            return pathDimensions(this.attrs.path);
+        }
+    };
+    elproto.remove = function () {
+        if (this.removed) {
+            return;
+        }
+        this.paper.__set__ && this.paper.__set__.exclude(this);
+        R.eve.unbind("*.*." + this.id);
+        R._tear(this, this.paper);
+        this.node.parentNode.removeChild(this.node);
+        this.shape && this.shape.parentNode.removeChild(this.shape);
+        for (var i in this) {
+            delete this[i];
+        }
+        this.removed = true;
+    };
+    elproto.attr = function (name, value) {
+        if (this.removed) {
+            return this;
+        }
+        if (name == null) {
+            var res = {};
+            for (var a in this.attrs) if (this.attrs[has](a)) {
+                res[a] = this.attrs[a];
+            }
+            res.gradient && res.fill == "none" && (res.fill = res.gradient) && delete res.gradient;
+            res.transform = this._.transform;
+            return res;
+        }
+        if (value == null && R.is(name, "string")) {
+            if (name == fillString && this.attrs.fill == "none" && this.attrs.gradient) {
+                return this.attrs.gradient;
+            }
+            var names = name.split(separator),
+                out = {};
+            for (var i = 0, ii = names.length; i < ii; i++) {
+                name = names[i];
+                if (name in this.attrs) {
+                    out[name] = this.attrs[name];
+                } else if (R.is(this.paper.customAttributes[name], "function")) {
+                    out[name] = this.paper.customAttributes[name].def;
+                } else {
+                    out[name] = R._availableAttrs[name];
+                }
+            }
+            return ii - 1 ? out : out[names[0]];
+        }
+        if (this.attrs && value == null && R.is(name, "array")) {
+            out = {};
+            for (i = 0, ii = name.length; i < ii; i++) {
+                out[name[i]] = this.attr(name[i]);
+            }
+            return out;
+        }
+        var params;
+        if (value != null) {
+            params = {};
+            params[name] = value;
+        }
+        value == null && R.is(name, "object") && (params = name);
+        for (var key in params) {
+            eve("attr." + key + "." + this.id, this, params[key]);
+        }
+        if (params) {
+            for (key in this.paper.customAttributes) if (this.paper.customAttributes[has](key) && params[has](key) && R.is(this.paper.customAttributes[key], "function")) {
+                var par = this.paper.customAttributes[key].apply(this, [].concat(params[key]));
+                this.attrs[key] = params[key];
+                for (var subkey in par) if (par[has](subkey)) {
+                    params[subkey] = par[subkey];
+                }
+            }
+            // this.paper.canvas.style.display = "none";
+            if (params.text && this.type == "text") {
+                this.textpath.string = params.text;
+            }
+            setFillAndStroke(this, params);
+            // this.paper.canvas.style.display = E;
+        }
+        return this;
+    };
+    elproto.toFront = function () {
+        !this.removed && this.node.parentNode.appendChild(this.node);
+        this.paper && this.paper.top != this && R._tofront(this, this.paper);
+        return this;
+    };
+    elproto.toBack = function () {
+        if (this.removed) {
+            return this;
+        }
+        if (this.node.parentNode.firstChild != this.node) {
+            this.node.parentNode.insertBefore(this.node, this.node.parentNode.firstChild);
+            R._toback(this, this.paper);
+        }
+        return this;
+    };
+    elproto.insertAfter = function (element) {
+        if (this.removed) {
+            return this;
+        }
+        if (element.constructor == R.st.constructor) {
+            element = element[element.length - 1];
+        }
+        if (element.node.nextSibling) {
+            element.node.parentNode.insertBefore(this.node, element.node.nextSibling);
+        } else {
+            element.node.parentNode.appendChild(this.node);
+        }
+        R._insertafter(this, element, this.paper);
+        return this;
+    };
+    elproto.insertBefore = function (element) {
+        if (this.removed) {
+            return this;
+        }
+        if (element.constructor == R.st.constructor) {
+            element = element[0];
+        }
+        element.node.parentNode.insertBefore(this.node, element.node);
+        R._insertbefore(this, element, this.paper);
+        return this;
+    };
+    elproto.blur = function (size) {
+        var s = this.node.runtimeStyle,
+            f = s.filter;
+        f = f.replace(blurregexp, E);
+        if (+size !== 0) {
+            this.attrs.blur = size;
+            s.filter = f + S + ms + ".Blur(pixelradius=" + (+size || 1.5) + ")";
+            s.margin = R.format("-{0}px 0 0 -{0}px", round(+size || 1.5));
+        } else {
+            s.filter = f;
+            s.margin = 0;
+            delete this.attrs.blur;
+        }
+    };
+
+    R._engine.path = function (pathString, vml) {
+        var el = createNode("shape");
+        el.style.cssText = cssDot;
+        el.coordsize = zoom + S + zoom;
+        el.coordorigin = vml.coordorigin;
+        var p = new Element(el, vml),
+            attr = {fill: "none", stroke: "#000"};
+        pathString && (attr.path = pathString);
+        p.type = "path";
+        p.path = [];
+        p.Path = E;
+        setFillAndStroke(p, attr);
+        vml.canvas.appendChild(el);
+        var skew = createNode("skew");
+        skew.on = true;
+        el.appendChild(skew);
+        p.skew = skew;
+        p.transform(E);
+        return p;
+    };
+    R._engine.rect = function (vml, x, y, w, h, r) {
+        var path = R._rectPath(x, y, w, h, r),
+            res = vml.path(path),
+            a = res.attrs;
+        res.X = a.x = x;
+        res.Y = a.y = y;
+        res.W = a.width = w;
+        res.H = a.height = h;
+        a.r = r;
+        a.path = path;
+        res.type = "rect";
+        return res;
+    };
+    R._engine.ellipse = function (vml, x, y, rx, ry) {
+        var res = vml.path(),
+            a = res.attrs;
+        res.X = x - rx;
+        res.Y = y - ry;
+        res.W = rx * 2;
+        res.H = ry * 2;
+        res.type = "ellipse";
+        setFillAndStroke(res, {
+            cx: x,
+            cy: y,
+            rx: rx,
+            ry: ry
+        });
+        return res;
+    };
+    R._engine.circle = function (vml, x, y, r) {
+        var res = vml.path(),
+            a = res.attrs;
+        res.X = x - r;
+        res.Y = y - r;
+        res.W = res.H = r * 2;
+        res.type = "circle";
+        setFillAndStroke(res, {
+            cx: x,
+            cy: y,
+            r: r
+        });
+        return res;
+    };
+    R._engine.image = function (vml, src, x, y, w, h) {
+        var path = R._rectPath(x, y, w, h),
+            res = vml.path(path).attr({stroke: "none"}),
+            a = res.attrs,
+            node = res.node,
+            fill = node.getElementsByTagName(fillString)[0];
+        a.src = src;
+        res.X = a.x = x;
+        res.Y = a.y = y;
+        res.W = a.width = w;
+        res.H = a.height = h;
+        a.path = path;
+        res.type = "image";
+        fill.parentNode == node && node.removeChild(fill);
+        fill.rotate = true;
+        fill.src = src;
+        fill.type = "tile";
+        res._.fillpos = [x, y];
+        res._.fillsize = [w, h];
+        node.appendChild(fill);
+        setCoords(res, 1, 1, 0, 0, 0);
+        return res;
+    };
+    R._engine.text = function (vml, x, y, text) {
+        var el = createNode("shape"),
+            path = createNode("path"),
+            o = createNode("textpath");
+        x = x || 0;
+        y = y || 0;
+        text = text || "";
+        path.v = R.format("m{0},{1}l{2},{1}", round(x * zoom), round(y * zoom), round(x * zoom) + 1);
+        path.textpathok = true;
+        o.string = Str(text);
+        o.on = true;
+        el.style.cssText = cssDot;
+        el.coordsize = zoom + S + zoom;
+        el.coordorigin = "0 0";
+        var p = new Element(el, vml),
+            attr = {
+                fill: "#000",
+                stroke: "none",
+                font: R._availableAttrs.font,
+                text: text
+            };
+        p.shape = el;
+        p.path = path;
+        p.textpath = o;
+        p.type = "text";
+        p.attrs.text = Str(text);
+        p.attrs.x = x;
+        p.attrs.y = y;
+        p.attrs.w = 1;
+        p.attrs.h = 1;
+        setFillAndStroke(p, attr);
+        el.appendChild(o);
+        el.appendChild(path);
+        vml.canvas.appendChild(el);
+        var skew = createNode("skew");
+        skew.on = true;
+        el.appendChild(skew);
+        p.skew = skew;
+        p.transform(E);
+        return p;
+    };
+    R._engine.setSize = function (width, height) {
+        var cs = this.canvas.style;
+        this.width = width;
+        this.height = height;
+        width == +width && (width += "px");
+        height == +height && (height += "px");
+        cs.width = width;
+        cs.height = height;
+        cs.clip = "rect(0 " + width + " " + height + " 0)";
+        if (this._viewBox) {
+            setViewBox.apply(this, this._viewBox);
+        }
+        return this;
+    };
+    R._engine.setViewBox = function (x, y, w, h, fit) {
+        R.eve("setViewBox", this, this._viewBox, [x, y, w, h, fit]);
+        var width = this.width,
+            height = this.height,
+            size = 1 / mmax(w / width, h / height),
+            H, W;
+        if (fit) {
+            H = height / h;
+            W = width / w;
+            if (w * H < width) {
+                x -= (width - w * H) / 2 / H;
+            }
+            if (h * W < height) {
+                y -= (height - h * W) / 2 / W;
+            }
+        }
+        this._viewBox = [x, y, w, h, !!fit];
+        this._viewBoxShift = {
+            dx: -x,
+            dy: -y,
+            scale: size
+        };
+        this.forEach(function (el) {
+            el.transform("...");
+        });
+        return this;
+    };
+    var createNode,
+        initWin = function (win) {
+            var doc = win.document;
+            doc.createStyleSheet().addRule(".rvml", "behavior:url(#default#VML)");
+            try {
+                !doc.namespaces.rvml && doc.namespaces.add("rvml", "urn:schemas-microsoft-com:vml");
+                createNode = function (tagName) {
+                    return doc.createElement('<rvml:' + tagName + ' class="rvml">');
+                };
+            } catch (e) {
+                createNode = function (tagName) {
+                    return doc.createElement('<' + tagName + ' xmlns="urn:schemas-microsoft.com:vml" class="rvml">');
+                };
+            }
+        };
+    initWin(R._g.win);
+    R._engine.create = function () {
+        var con = R._getContainer.apply(0, arguments),
+            container = con.container,
+            height = con.height,
+            s,
+            width = con.width,
+            x = con.x,
+            y = con.y;
+        if (!container) {
+            throw new Error("VML container not found.");
+        }
+        var res = new R._Paper,
+            c = res.canvas = R._g.doc.createElement("div"),
+            cs = c.style;
+        x = x || 0;
+        y = y || 0;
+        width = width || 512;
+        height = height || 342;
+        res.width = width;
+        res.height = height;
+        width == +width && (width += "px");
+        height == +height && (height += "px");
+        res.coordsize = zoom * 1e3 + S + zoom * 1e3;
+        res.coordorigin = "0 0";
+        res.span = R._g.doc.createElement("span");
+        res.span.style.cssText = "position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;";
+        c.appendChild(res.span);
+        cs.cssText = R.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden", width, height);
+        if (container == 1) {
+            R._g.doc.body.appendChild(c);
+            cs.left = x + "px";
+            cs.top = y + "px";
+            cs.position = "absolute";
+        } else {
+            if (container.firstChild) {
+                container.insertBefore(c, container.firstChild);
+            } else {
+                container.appendChild(c);
+            }
+        }
+        // plugins.call(res, res, R.fn);
+        res.renderfix = function () {};
+        return res;
+    };
+    R.prototype.clear = function () {
+        R.eve("clear", this);
+        this.canvas.innerHTML = E;
+        this.span = R._g.doc.createElement("span");
+        this.span.style.cssText = "position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;";
+        this.canvas.appendChild(this.span);
+        this.bottom = this.top = null;
+    };
+    R.prototype.remove = function () {
+        R.eve("remove", this);
+        this.canvas.parentNode.removeChild(this.canvas);
+        for (var i in this) {
+            this[i] = removed(i);
+        }
+        return true;
+    };
+
+    var setproto = R.st;
+    for (var method in elproto) if (elproto[has](method) && !setproto[has](method)) {
+        setproto[method] = (function (methodname) {
+            return function () {
+                var arg = arguments;
+                return this.forEach(function (el) {
+                    el[methodname].apply(el, arg);
+                });
+            };
+        })(method);
+    }
+}(window.Raphael);
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/js/repositories.js b/kernel/org.eclipse.virgo.management.console/src/main/webapp/js/repositories.js
new file mode 100644
index 0000000..153a4f1
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/js/repositories.js
@@ -0,0 +1,124 @@
+/*******************************************************************************
+ * Copyright (c) 2012 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+/**
+ * Scripts to be loaded in to the head of the repositories view
+ */
+
+function pageinit() {
+	
+	$.ajax({
+		url: util.getHostAndAdminPath() + '/jolokia/search/org.eclipse.virgo.kernel:type=Repository,*',
+		dataType: 'json',
+		contentType: 'application/json',
+		cache: false,
+		success: function (response) {
+			Repositories.renderRepositoryMBeans(response.value);
+			util.pageReady();
+		}
+	});
+	
+};
+
+var Repositories = {
+	
+	renderRepositoryMBeans: function(mbeanNames){
+		var getNameAttribute = function(mbeanName){
+			return util.readObjectName(mbeanName).get('name');
+		};
+		
+		$.each(mbeanNames, function(i, mbeanName){
+			var button = $('<div />', {'class' : 'button'}).append(
+											$('<div />', {'class' : 'button-cap-left-blue'}), 
+											$('<div />', {'class' : 'button-text'}).text(getNameAttribute(mbeanName)),
+											$('<div />', {'class' : 'button-cap-right-blue'})
+										);
+			$('#repository-controls').append(button);
+			button.mbeanName = mbeanName;
+			button.click(button, Repositories.display);
+			if(i == 0){
+				button.click();
+			}
+	
+		});
+		
+	},
+	
+	display: function(clickEvent){
+		var button = clickEvent.data;
+		
+		$('.button-selected').removeClass('button-selected');
+		button.addClass('button-selected');
+		
+		$.ajax({
+			url: util.getHostAndAdminPath() + '/jolokia/read/' + button.mbeanName,
+			dataType: 'json',
+			contentType: 'application/json',
+			cache: false,
+			success: function (response) {
+				Repositories.renderArtifactDescriptorSummaries(response.value.AllArtifactDescriptorSummaries);
+			}
+		});
+	
+	},
+	
+	renderArtifactDescriptorSummaries: function(artifactDescriptorSummaries){
+		
+		var rows = [];
+		
+		$.each(artifactDescriptorSummaries, function(i, summary){
+			var row = [summary.type, summary.name, summary.version];
+			if(summary.type != 'library'){
+				row.push($('<td />', {'class' : 'repository-deploy', 'onClick': 'Repositories.deploy("repository:' + summary.type + '/' + summary.name + '")'}).text('deploy'));
+			}else{
+				row.push('');
+			}
+			rows.push(row);
+		});
+		
+		var descriptorTable = util.makeTable({
+			clazz: 'repository-table',
+			headers: [{title: 'Type', type: 'alpha'}, {title: 'Name', type: 'alpha'}, {title: 'Version', type: 'version'}],
+			rows: rows,
+			hoverable: true,
+			sortable: true,
+			sortIndex: 1
+		});
+		
+		
+		var panel = $('#repository-panel');
+		panel.empty();
+		panel.append(descriptorTable);
+	
+	},
+	
+	deploy: function(artifact){
+	
+		var request = [{
+			"type":"EXEC",
+			"mbean":"org.eclipse.virgo.kernel:category=Control,type=Deployer",
+			"operation":"deploy(java.lang.String)",
+			"arguments":[artifact]
+		}];
+		
+		util.doBulkQuery(request, function(response){
+			if(response[0].value){
+				alert('Deployed artifact of type:' + response[0].value.type + ', name: ' + response[0].value.symbolicName + ', version: ' + response[0].value.version + '. If the version doesn\'t match, then that version was found in the configured repository chain.');
+			}else{
+				alert('Deployment failed (A Dump may have been generated): ' + response[0].error);
+			}
+		}, function(xmlHttpRequest, textStatus, errorThrown){
+			alert('Deployment failed \'' + textStatus + '\': ' + xmlHttpRequest + ' ' + errorThrown);
+		});
+	
+	}
+
+};
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/js/wirings.js b/kernel/org.eclipse.virgo.management.console/src/main/webapp/js/wirings.js
new file mode 100644
index 0000000..385738b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/js/wirings.js
@@ -0,0 +1,196 @@
+/*******************************************************************************
+* Copyright (c) 2011 David Normington
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v10.html
+*
+* Contributors:
+*   Chris Frost - initial contribution
+*   David Normington
+*   
+*******************************************************************************/
+
+function pageinit() {
+	util.loadScript('bundlesGui', function(){
+		util.loadScript('raphael', function(){
+			var dataSource = new GeminiDataSource();
+			dataSource.updateData(function(){
+				
+				if($.browser.msie){
+					$('#bundle-canvas').css({'height': '574px', 'width': '900px'});
+				}
+				
+				layoutManager = new LayoutManager('bundle-canvas', 900, 553, dataSource);
+				new SideBar(layoutManager, dataSource).init();
+				if(util.pageLocation && util.pageLocation.length > 0){
+					layoutManager.displayBundle(util.pageLocation);
+				}
+				util.pageReady();
+			});
+		});
+	});
+}
+
+function SideBar(layoutManager, dataSource){
+
+	var self = this;
+	
+	self.dataSource = dataSource;
+	
+	self.layoutManager = layoutManager;
+	
+	self.focused = -1;
+	
+	self.layoutManager.setFocusListener(function(bundleId){
+		if(bundleId != self.focused){
+			self.setFocused(bundleId);
+		}
+	});
+	
+	self.setFocused = function(bundleId){
+		self.focused = bundleId;
+		var rowIds = $('tbody td:first-child', self.bundlesTable);
+		$.each(rowIds, function(index, rowId){
+			if($(rowId).text() == bundleId){							
+				$('#side-bar').scrollTop(self.bundlesTable.getElementOffset($(rowId)));		
+				$('.table-tr-selected', self.bundlesTable).removeClass('table-tr-selected');
+				$(rowId).parent().addClass('table-tr-selected');
+			}
+		});
+	};
+	
+	self.init = function(){
+		var tRows = new Array();
+		$.each(dataSource.bundles, function(id, bundle){		
+			tRows.push([id, self.getFormattedBundleName(bundle), bundle.Version]);
+		});
+		
+		self.bundlesTable = util.makeTable({ 
+			id: 'bundle-table',
+			headers: [{title: 'Id', type: 'numeric'}, {title: 'SymbolicName', type: 'alpha'}, {title: 'Version', type: 'version'}], 
+			rows: tRows,
+			sortable : true,
+			sortIndex: 0,
+			selectable : self.clickEvent
+		});
+		$('#side-bar').append(self.bundlesTable);
+		if(util.pageLocation && util.pageLocation.length > 0){
+			self.setFocused(util.pageLocation);
+		}
+	};
+	
+	self.getFormattedBundleName = function(bundle){
+		var formatBundleList = function(bundleIdArray){
+			var result = bundleIdArray[0];
+			for(var i = 1; i < bundleIdArray.length; i++) {
+				result = result + ', ' + bundleIdArray[i];
+			}
+			return result;
+		};
+		if(bundle.Fragments.length > 0){
+			return bundle.SymbolicName + ' - Fragments [' + formatBundleList(bundle.Fragments) + ']';
+		}
+		if(bundle.Hosts.length > 0){
+			return bundle.SymbolicName + ' - Host [' + formatBundleList(bundle.Hosts) + ']';
+		}
+		return bundle.SymbolicName;
+	};
+	
+	self.clickEvent = function(row){
+		var bundleId = $('td:first-child', row).text();
+		self.focused = bundleId;
+		self.layoutManager.displayBundle(bundleId);
+	};
+	
+};
+
+/**
+ * As a datasource to the bundles gui layout manager this object must provide the following methods.
+ * 
+ * UpdateData
+ * UpdateBundle
+ * 
+ */
+var GeminiDataSource = function(){
+
+	var self = this;
+
+	self.bundles = {};
+	
+	self.services = {};
+	
+	self.updateData = function(callback){
+		util.doQuery('search/org.eclipse.equinox.region.domain:type=Region,*', function(response){
+			
+			var bundlesRequest = new Array();
+			$.each(response.value, function(index, region){
+				bundlesRequest.push({	
+					"mbean" : "osgi.core:type=bundleState,version=1.5,region=" + util.readObjectName(region).get('name'),
+					"operation" : "listBundles()",
+					"arguments" : [],
+					"type" : "exec"
+				});
+			});
+
+			self.bundles = {};
+			
+			util.doBulkQuery(bundlesRequest, function(response){
+				$.each(response, function(index, regionBundles){
+					var region = util.readObjectName(regionBundles.request.mbean).get('region');
+					if(regionBundles.value){
+						$.each(regionBundles.value, function(bundleId, bundle){
+							if(self.bundles[bundleId]){
+								self.bundles[bundleId].Region.push(region);
+							}else{
+								self.bundles[bundleId] = bundle;
+								self.bundles[bundleId].Region = [region];
+							}
+						});
+					}else{
+						$("#main-button-container").after($('<div />', {'class': 'warning-note'}).text('Region ' + region + ' does not contain Gemini Management, unable to display its bundles'));
+					};
+				});
+				callback();
+			}, function(){alert('Error loading page, please refresh.');});
+			
+		});
+	};
+	
+
+	self.updateBundle = function(bundleId, callback){
+		var region = self.bundles[bundleId].Region[0];
+
+		var bundleQuery = new Array({
+			'mbean' : 'osgi.core:version=1.0,type=wiringState,region=' + region,
+			'operation' : "getCurrentWiring(long,java.lang.String)",
+			'arguments' : [bundleId, 'osgi.wiring.all'],
+			'type' : 'exec'
+		},{
+			'mbean' : 'osgi.core:version=1.5,type=serviceState,region=' + region,
+			'operation' : 'getRegisteredServices(long)',
+			'arguments' : [bundleId],
+			'type' : 'exec'
+		},{
+			'mbean' : 'osgi.core:version=1.5,type=serviceState,region=' + region,
+			'operation' : 'getServicesInUse(long)',
+			'arguments' : [bundleId],
+			'type' : 'exec'
+		});
+		
+		util.doBulkQuery(bundleQuery, function(response){
+			if(response[0].value){
+				self.bundles[bundleId].ProvidedWires = response[0].value.ProvidedWires;
+				self.bundles[bundleId].RequiredWires = response[0].value.RequiredWires;
+			} else {
+				self.bundles[bundleId].ProvidedWires = new Array();
+				self.bundles[bundleId].RequiredWires = new Array();
+			}
+			self.bundles[bundleId].RegisteredServices = response[1].value;
+			self.bundles[bundleId].ServicesInUse = response[2].value;
+
+			callback();
+		});
+	};
+
+};
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/styles/artifacts.css b/kernel/org.eclipse.virgo.management.console/src/main/webapp/styles/artifacts.css
new file mode 100644
index 0000000..86b21e4
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/styles/artifacts.css
@@ -0,0 +1,97 @@
+@import "common.css";
+
+/* 
+ * Virgo Admin Console
+ *
+ * Styles for the artifacts page
+ *
+ * Christopher Frost - 2011
+ */
+
+/*
+ * UPLOAD MANAGER
+ */
+
+#upload-manager {
+    border-bottom: 1px solid #BAD9EC;
+    display: none;
+    margin-bottom: 13px;
+    padding: 0 22px 11px;
+}
+
+#upload-manager li {
+	list-style: none;
+	margin: 4px 0;
+}
+
+#add-upload-box {
+    background: transparent url("../images/add.png") no-repeat;
+}
+
+#minus-upload-box {
+    background: transparent url("../images/minus.png") no-repeat;
+}
+
+.upload-control {
+    display: inline-block;
+	cursor: pointer;
+    height: 23px;
+    margin: 0 5px;
+    width: 23px;
+}
+
+iframe {
+    background-color: #FFFFFF;
+    height: 0px;
+    width: 0px;
+    margin: 0;
+    width: 100%;
+}
+
+/*
+ * ARTIFACT TREE
+ */
+
+.artifact-label, .artifact-attribute {
+    margin-top: 3px;
+}
+
+.artifact-label:hover {
+	background: #BAD9EC;
+	cursor: pointer;
+}
+
+.label-text {
+	margin: 0 2px;
+}
+	
+.fx-container {
+	display: none;
+	margin-left: 20px;
+}
+	
+.tree-icon {
+	display: inline-block;
+	vertical-align: bottom;
+	margin-right: 2px;
+	height: 18px;
+	width: 18px;
+}
+
+.artifact-attribute {
+	overflow-x: auto;
+	overflow-y: hidden;
+	word-wrap: break-word;	
+}
+
+.artifact-attribute .artifact-control {	
+	cursor: pointer;
+	display: inline;
+	margin-left: 8px;
+	color: #888888;
+	text-decoration: none;
+}
+.artifact-control:hover {
+	color: #0095CA;
+}
+
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/styles/common.css b/kernel/org.eclipse.virgo.management.console/src/main/webapp/styles/common.css
new file mode 100644
index 0000000..d52fc34
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/styles/common.css
@@ -0,0 +1,534 @@
+@import "reset.css";
+
+/* 
+ * Virgo Admin Console
+ *
+ * All common styles for the screen, page specific files should go in the css file for that page.
+ *
+ * Christopher Frost - 2011
+ *
+ * Colour scheme
+ * Dark Blue			- #002F5E
+ * Light Blue			- #0095CA
+ * Table zebra			- #E8F6FF
+ * Underline/lowlight	- #BAD9EC
+ *
+ */
+ 
+body {
+	font: 13px Trebucet, "Trebucet MS", Helvetica, Arial, "DejaVu Sans", "Nimbus Sans L", sans-serif;
+	background-color: #dfdfdf;
+}
+
+#page {
+	margin: 10px;
+	width: auto;
+	color: #333;
+}
+
+/*
+ * HEADER STYLES
+ */
+#header {
+	background: #fff url(../images/header-right.png) no-repeat scroll right top;
+	width: 100%;
+}
+
+#name-and-company {
+	background: transparent url(../images/header-left.png) no-repeat top left;
+	width: 100%;
+	top: 0px;
+	left: 0px;
+}
+
+#site-name {
+	background: transparent url(../images/header-title-left.png) no-repeat scroll center center;
+	height: 100px;
+	width: 345px;
+	margin: auto;
+}
+
+#site-name a, #site-name a:hover {
+	height: 60px;
+	width: 190px;
+}
+
+/*
+ * TEXT FORMATTING STYLES
+ */
+h1 {
+	font-size: 1.5em;
+	font-weight: bold;
+	padding: 12px 0 5px 0;
+	line-height: 125%;
+	color: #002F5E;
+	border-bottom: 1px solid #BAD9EC;
+	margin: 13px 0px;
+}
+
+h2 {
+	font-size: 1.3em;
+	font-weight: bold;
+	padding: 10px 0 2px 0;
+	color: #002F5E;
+	margin: 12px 0px;
+}
+
+h3 {
+	font-size: 1.1em;
+	font-weight: bold;
+	padding: 8px 0 5px 0;
+	color: #002F5E;
+	margin: 12px 0px;
+}
+
+h4 {
+	font-size: 1.1em;
+	font-weight: bold;
+	padding-top: 8px;
+	color: #333;
+	margin: 12px 0px;
+}
+
+h5 {
+	font-size: 1.1em;
+	padding-top: 6px;
+	color: #333;
+	margin: 12px 0px;
+}
+
+/*
+ * LINK STYLES
+ */
+ 
+a:link, a:visited {
+	color: #333;
+	text-decoration: underline;
+}
+
+a:hover, a:focus {
+	color: #0095CA;
+	text-decoration: underline;
+}
+
+a:active, a.active { 
+	color: #0095CA;
+}
+  
+/*
+ * NAVIGATION STYLES
+ */
+ 
+#navigation {
+    background-color: #FFFFFF;
+    border-top: 3px solid #002F5E;
+    height: 26px;
+}
+
+#navigation-left, #navigation-right {
+	background: #002F5E;
+	height: 26px;
+}
+
+#navigation-left, #navigation-left-curve {
+	float: left;
+}
+
+#navigation-right, #navigation-right-curve {
+	float: right;
+}
+
+#navigation-left ul {
+	margin-left: 10px;
+}
+
+#navigation-right ul {
+	margin-right: 10px;
+}
+
+#navigation li {
+	display: inline; /* Can't use inline-block here due to IE bug */
+	cursor: pointer;
+	height: 23px;
+}
+
+#navigation a {
+	font-weight: normal;
+	text-decoration: none;
+}
+
+.navigation-text {
+	display: inline-block;
+	padding: 5px 0 5px;
+	vertical-align: top;
+	height: 13px;
+}
+
+.button-cap-left-white, .button-cap-right-white { 
+	display: inline-block;
+    height: 23px;
+    width: 12px;
+}
+
+#navigation-left-curve {
+	background: transparent url(../images/menu-curve-left.png) no-repeat left top;
+	height: 26px;
+	width: 30px;
+}
+
+#navigation-right-curve {
+	background: transparent url(../images/menu-curve-right.png) no-repeat right top;
+	height: 26px;
+	width: 30px;
+}
+
+#navigation li > * {
+	color: #FFFFFF;
+	background: #002F5E;
+	vertical-align: top;
+}
+
+#navigation li:hover .navigation-text {
+	background: #FFFFFF;
+	color:#002F5E;
+}
+
+#navigation li:hover .button-cap-left-white {
+	background: transparent url(../images/button-cap-left-white.png) no-repeat right center;
+}
+
+#navigation li:hover .button-cap-right-white {
+    background: transparent url(../images/button-cap-right-white.png) no-repeat left center;
+}
+
+#navigation .selected-navigation .navigation-text {
+	color: #0095CA !important;
+}
+
+/*
+ * SPINNER STYLES
+ */
+
+.spinner-small {
+	background: url(../images/loader-small.gif) no-repeat center center;
+ 	width: 16px;
+	height: 16px;
+	margin: 0 auto;
+}
+
+.spinner-large {
+	background: url(../images/loader-large.gif) no-repeat center center;
+}
+
+/*
+ * CONTAINER STYLES
+ */
+ 
+.container {	
+    font-size: 13px;
+	display: block;
+	background: #FFFFFF;
+	overflow: hidden;
+}
+
+#content {
+	min-height: 400px;
+	padding: 0px 22px 40px 22px;
+}
+
+.bordered-container {
+	border: 1px solid #BAD9EC;
+	margin-top: 13px;
+	padding: 15px 20px;
+}
+
+.container p, .container ul, .container ol{
+	margin-bottom: 15px;
+}
+
+.consoleFootnote {
+	color: #888;
+ 	line-height: 19px;
+ 	font-size: 11px;
+ 	padding: 2px;
+}
+
+/*
+ * TOOLTIP STYLES
+ */
+#tooltip {
+	position: absolute;
+	z-index: 9999;
+	width: 200px;
+	padding: 5px;
+	background: #333; 
+	color: #fff;
+	font-size: 10px;
+	border-radius: 5px;
+	word-wrap: break-word;	
+}
+
+/*
+ * TABLE STYLES
+ */
+table {
+	border-spacing: 0;
+	margin: 0;
+	border-collapse: collapse;
+	color: #666;
+}
+
+thead {
+	border-bottom: 1px solid #BAD9EC;
+}
+
+th {
+	white-space: nowrap;
+	height: 19px;
+	text-align: left;
+	font-weight: bold;
+	margin: 0;
+	padding: 0 6px 0 6px;
+	line-height: 19px;
+	color: #333;
+}
+
+td {
+	margin: 0;
+	padding: 4px 6px 4px 6px;
+	vertical-align: top;
+}
+
+.table-sortable th {
+	cursor: pointer;
+}
+
+.table-sortable .table-th-sort, .table-sortable .table-th-sort-rev {
+	color: #0095CA;
+}
+ 
+.table-tr-odd {
+	background: #E8F6FF;
+}
+
+.table-hoverable .table-tr-hovered {
+	background: #BAD9EC;
+}
+
+
+.table-selectable .table-tr-hovered {
+	cursor: pointer;
+}
+
+.table-selectable .table-tr-selected {
+	background: #BAD9EC;
+}
+/*
+ * SERVERS STYLES
+ */
+ 
+#servers {
+	display: none;
+	padding: 0px 22px 30px 22px;
+	border-top: 3px solid #002F5E;
+}
+ 
+.servers-table {
+	width: 100%;
+}
+
+.servers-table .table-tr-hovered {
+	background: #BAD9EC;
+}
+
+.servers-table .server-link {
+	color: transparent;
+}
+
+.table-tr-hovered .server-link {
+	color: #666666;
+	cursor: pointer;
+}
+
+/*
+ * BUTTONS AND CONTROLS
+ */
+
+.button-container {
+	height: 29px;
+	text-align: center;
+}
+
+.controls {
+    display: inline-block;
+	height: 23px;
+}
+
+.controls input {
+	bottom: 2px;
+    margin-right: 6px;
+    position: relative;
+}
+
+
+.control-cap-left, .control-cap-right {
+	display: inline-block;
+	height: 29px;
+	width: 30px;
+}
+
+.control-cap-left {
+	background: transparent url(../images/controls-cap-left.png) no-repeat right center;
+	margin-right: -7px;
+}
+
+.control-cap-right {
+	background: transparent url(../images/controls-cap-right.png) no-repeat left center;
+	margin-left: -7px;
+}
+
+.control-text, .button-text {
+    display: inline-block;
+    height: 13px;
+    padding: 5px 0 5px;
+}
+
+.button {
+    display: inline-block;
+	height: 23px;
+	margin: 0 2px;
+	cursor: pointer;
+}
+
+.button-cap-left-blue, .button-cap-right-blue {
+	display: inline-block;
+	height: 23px;
+	width: 12px;
+}
+	
+.button-cap-left-blue {
+	background: transparent url(../images/button-cap-left-blue.png) no-repeat right center;
+}
+
+.button-cap-right-blue {
+    background: transparent url("../images/button-cap-right-blue.png") no-repeat left center;
+}
+
+.button-text {
+    background-color: #002F5E;
+    color: #FFFFFF;
+}
+
+.button > * {
+	vertical-align: top;
+}
+
+.button:hover > div {
+	background: #FFFFFF;
+	color: #002F5E;
+}
+
+.button-selected > .button-text{
+	color: #0095CA !important;
+}
+
+/*
+ * FOOTER STYLES
+ */
+#footer {
+    background-color: #EFF0EB;
+    border-top: 3px solid #002F5E;
+    height: 26px;
+}
+
+#footer-left, #footer-right {
+    color: #AAAAAA;
+    font-size: 12px;
+    height: 12px;
+    padding: 7px 10px;
+}
+
+#footer-left {
+	background: url("../images/footer-left.png") no-repeat scroll left bottom transparent;
+	float: left;
+}
+
+#footer-right {
+	background: url("../images/footer-right.png") no-repeat scroll right bottom transparent;
+	float: right;
+}
+
+#footer-left a, #footer-right a {
+    color: #999;
+    text-decoration: none;
+}
+
+/*
+ * INFO BOX
+ */
+ 
+
+.info-box {
+	background: #FFFFFF;
+	border: 3px solid #002F5E;
+	-moz-border-radius: 8px;
+    -webkit-border-radius: 8px;
+    -khtml-border-radius: 8px;
+    border-radius: 8px;
+    z-index: 1500;
+    position:absolute;
+}
+
+.error-info-box {
+	border-color: #FF0000;
+}
+
+.info-box .box-title-close {
+	float: right;
+	cursor: pointer;
+}
+
+.info-box .box-title {
+	font-weight: bold;
+	text-align: center;
+	color: #002F5E;
+	padding: 5px;
+	border-bottom: 1px solid #B6D9ED;
+	cursor: move;
+}
+
+.info-box .box-content {
+    margin: 5px 0;
+    max-height: 300px;
+    overflow: auto;
+    padding: 0 5px;
+	min-width: 400px;
+	max-width: 800px;
+	white-space: pre-wrap;
+	word-wrap: break-word;
+	word-break: break-all;
+}
+
+.info-box .section-title {
+	padding: 5px;
+	font-weight: bold;
+}
+
+.info-box .indent1 {
+	padding-left: 20px;
+}
+.info-box .indent2 {
+	padding-left: 40px;
+}
+
+.info-box .li-odd {
+	background: #E8F6FF;
+}
+
+.info-box li {
+	padding: 3px;
+}
+	
+.info-box li:hover {
+	background: #BAD9EC;
+}
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/styles/configurations.css b/kernel/org.eclipse.virgo.management.console/src/main/webapp/styles/configurations.css
new file mode 100644
index 0000000..b933b3f
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/styles/configurations.css
@@ -0,0 +1,53 @@
+@import "common.css";
+
+/* 
+ * Virgo Admin Console
+ *
+ * Styles for the configuration page
+ *
+ * Christopher Frost - 2011
+ */
+
+.config-list {
+	padding-top: 0px;
+}
+
+.config-header {
+	color: #002F5E;
+    font-size: 15px;
+    margin-bottom: 5px;
+    margin-top: 15px;
+}
+
+.config-label {
+	cursor: pointer;
+    margin-top: 3px;
+}
+
+.config-label:hover {
+	background: #BAD9EC;
+}
+
+.config-container td + td {
+	 word-wrap: break-word;
+	 word-break: break-all;
+}
+ 
+.config-properties {
+	display: none;
+	overflow-x: auto; 
+}
+
+.config-table {
+    margin-bottom: 5px;
+    margin-left: 20px;
+    margin-top: 5px;
+}
+	
+.tree-icon {
+	display: inline-block;
+	vertical-align: bottom;
+	margin-right: 2px;
+	height: 18px;
+	width: 18px;
+}
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/styles/dumps.css b/kernel/org.eclipse.virgo.management.console/src/main/webapp/styles/dumps.css
new file mode 100644
index 0000000..dff3800
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/styles/dumps.css
@@ -0,0 +1,110 @@
+@import "common.css";
+
+/* 
+ * Virgo Admin Console
+ *
+ * Styles for the dumps page
+ *
+ * Christopher Frost - 2011
+ */
+ 
+#side-bar {
+    position: absolute;
+    width: 250px;
+    min-height: 550px;
+}
+
+#side-bar h2 {
+	margin-top: 0px;
+}
+
+.grey-out {
+	color: #AAAAAA !important;
+}
+
+#dumps, #dump-items {
+	max-height: 200px;
+    min-height: 100px;
+    overflow: auto;
+}
+
+#dumps li, #dump-items li{
+	line-height: 19px;
+}
+	
+.dump .label, .dump-item .label {
+	display: inline;
+}
+	
+.dump .delete {
+	margin: 0 10px;
+	cursor: pointer;
+	color: transparent;
+	float: right;
+}
+
+.dump:hover .delete {
+	color: #666666;
+}
+
+.dump .label:hover, .dump-item .label:hover {
+	cursor: pointer;
+}
+
+.dump:hover, .dump-item:hover {
+	background-color: #BAD9EC;
+}
+
+.selected-item {
+	background-color: #E8F6FF;
+}
+
+#dump-item-content {
+    margin: 13px 0 0 312px;
+    max-width: 69%;
+    min-height: 580px;
+    display: inline-block;
+}
+
+.dump-file-line {
+    font-family : "Courier New", Courier, monospace;
+	white-space: pre-wrap;
+	word-break: break-all;
+	word-wrap: break-word;
+}
+
+.dump-file-line:hover {
+	background-color: #BAD9EC;
+}
+
+#gui-controls {
+	margin: 15px 0 5px;
+}
+
+#table-holder {
+	margin-top: 15px;
+	max-height: 200px;
+	overflow: auto;
+}
+
+.unresolved-bundle {
+	margin-bottom: 10px;
+	cursor: pointer;
+}
+
+.unresolved-bundle:hover {
+	background-color: #BAD9EC;
+}
+
+.unresolved-bundle-cause {
+	padding-left: 20px;
+}
+
+#bundle-canvas {
+	margin-top: 0px;
+	margin-left: auto;
+	margin-right: auto;
+	margin-bottom: 0px;
+	overflow-x: auto;
+}
+ 
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/styles/error.css b/kernel/org.eclipse.virgo.management.console/src/main/webapp/styles/error.css
new file mode 100644
index 0000000..7ee3e93
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/styles/error.css
@@ -0,0 +1,224 @@
+/* 
+ * Virgo Admin Console
+ *
+ * Styles for the error page
+ *
+ * Christopher Frost - 2011
+ */
+ 
+body {
+	font: 12px Helvetica, Arial, "Bitstream Vera Sans", sans-serif;
+	background-color: #dfdfdf;
+}
+
+#page {
+    color: #333333;
+    margin-left: auto;
+    margin-right: auto;
+    margin-top: 100px;
+    width: 700px;
+}
+
+/*
+ * TEXT FORMATTING STYLES
+ */
+h1 {
+	font-size: 1.4em;
+	padding: 12px 0 5px 0;
+	line-height: 125%;
+	color: #002E62;
+	text-align: center;
+	border-bottom: 1px solid #BAD9EC;
+}
+
+h2 {
+	font-size: 1.2em;
+	padding: 10px 0 2px 0;
+	color: #002E62;
+}
+
+/*
+ * LINK STYLES
+ */
+ 
+a:link, a:visited {
+	color: #333;
+	text-decoration: underline;
+}
+
+a:hover, a:focus {
+	color: #0093CF;
+	text-decoration: underline;
+}
+
+a:active, a.active { 
+	color: #0093CF;
+}
+  
+/*
+ * MENU STYLES
+ */
+#primary-navigation {
+	background: #fff url(../images/menu-stretch.png) repeat-x scroll 0 0;
+	height:29px;
+	margin:0;
+	padding:0;
+	position: relative;
+}
+
+#primary-left {
+	background: #002E62;
+	float: left;
+	height: 26px;
+	line-height: normal;
+	padding: 3px 0 0;
+	position: relative;
+}
+
+#primary-right {
+	background: #002E62;
+	float: right;
+	height: 26px;
+	line-height: normal;
+	padding: 3px 0 0;
+	position: relative;
+}
+
+#primary-left ul, #primary-right ul {
+	padding: 0 4px 0 4px;
+	margin: 2px 0 0 0;
+	list-style: none;
+}
+
+#primary-left li, #primary-right li {
+	display: inline;
+}
+
+#primary-left a, #primary-right a {
+	color: #ffffff;
+	display: block;
+	float: left;
+	font-weight:normal;
+	margin: 0 1px 0 1px;
+	padding: 7px 8px 4px 10px;
+	text-decoration: none;
+}
+
+#primary-left a:hover, #primary-right a:hover, .selected-menu {
+	background: #ffffff;
+	color:#002E62;
+	text-decoration: none;
+}
+
+#left-cap {
+	background: transparent url(../images/menu-curve-left.png) no-repeat top left;
+	height: 29px;
+	width: 30px;
+	float: left;
+}
+
+#right-cap {
+	background: transparent url(../images/menu-curve-right.png) no-repeat top right;
+	height: 29px;
+	width: 30px;
+	float: right;
+}
+
+/*
+ * CONTAINER STYLES
+ */
+#content-no-nav {
+	display: block;
+	margin: 0px 22px 20px 22px;
+	padding: 0;
+}
+ 
+#container {
+	margin: 0;
+	padding-bottom: 20px;
+	height: 400px;
+	overflow:hidden;
+	background:#fff;
+}
+
+/*
+ * FOOTER STYLES
+ */
+#footer-wrapper {
+	clear: both;
+	margin: 0;
+	background-image: url(../images/footer-stretch.png);
+	background-repeat: repeat-x;
+	height: 29px;
+	width: 100%;
+}
+
+#footer-left, #footer-right {
+	margin: 0;
+	font-size: 85%;
+	padding: 1em;
+	height: 29px;
+    color: #bbb;
+}
+
+#footer-left {
+	text-align: left;
+	background-image: url(../images/footer-left.png);
+	background-repeat: no-repeat;
+	position: relative;
+	left: 0;
+	float: left;
+}
+
+#footer-right {
+	text-align: right;
+	background-image: url(../images/footer-right.png);
+	background-repeat: no-repeat;
+	background-position: top right;
+	position: relative;
+	right: 0;
+	float: right;
+}
+
+#footer-left a, #footer-right a {
+    color: #999;
+    text-decoration:none;
+}
+
+/* 
+ *  Local style information for the Virgo Splash Screen
+ *
+ *  Contains both style and colour information and 
+ *  overrides content from the dojo/tundra style.
+ *
+ *  Christopher Frost - March 2010
+ *
+ */
+ 
+#mini-header, #mini-header-left, #mini-header-right {
+	height: 7px;
+	width: 7px;
+	margin: 0px;
+	padding: 0px;
+}
+
+#mini-header {
+	width: 100%;
+	background-color: #002e62; 
+}
+
+#mini-header-left {
+	background-image: url(../images/mini-header-left.png); 
+	background-repeat: no-repeat; 
+	background-position: left top;
+	float: left;
+}
+
+#mini-header-right {
+	background-image: url(../images/mini-header-right.png); 
+	background-repeat: no-repeat scroll; 
+	background-position: right top;
+	float: right;
+}
+
+ 
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/styles/logging.css b/kernel/org.eclipse.virgo.management.console/src/main/webapp/styles/logging.css
new file mode 100644
index 0000000..9bd4ced
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/styles/logging.css
@@ -0,0 +1,28 @@
+@import "common.css";
+
+/* 
+ * Virgo Admin Console
+ *
+ * Styles for the logging page
+ *
+ * Christopher Frost - 2011
+ */
+ 
+#logging-display {
+	margin-bottom: 30px;
+}
+ 
+.logger-table .logger-update {
+	color: transparent;
+}
+
+.table-tr-hovered .logger-update {
+	color: #666666;
+	cursor: pointer;
+}
+
+.logger-details-table {
+	margin-bottom: 15px;
+	margin-left: auto;
+	margin-right: auto;	
+}
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/styles/overview.css b/kernel/org.eclipse.virgo.management.console/src/main/webapp/styles/overview.css
new file mode 100644
index 0000000..d2eafe7
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/styles/overview.css
@@ -0,0 +1,17 @@
+@import "common.css";
+
+/* 
+ * Virgo Admin Console
+ *
+ * Styles for the overview page
+ *
+ * Christopher Frost - 2011
+ */
+
+#content ul, #content table {
+	margin-left: 20px;
+}
+
+#content li {
+	list-style: disc inside none;
+}
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/styles/print.css b/kernel/org.eclipse.virgo.management.console/src/main/webapp/styles/print.css
new file mode 100644
index 0000000..3abe1c0
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/styles/print.css
@@ -0,0 +1,60 @@
+/* print.css 2008/04/22 nicolekonicki */
+
+/* White background, black text, arial font, decent font size */
+  body
+  {
+    background-color: #fff;
+    color: #000;
+    font-family: Arial, Helvetica, "Bitstream Vera Sans", sans-serif;
+    font-size: 10pt;
+    width: 100%;
+  }
+
+/* Change the layout to remove columns */
+  html body
+  {
+    background: transparent;
+    width: auto;
+  }
+
+  #main, #container 
+  {
+    width: 100%;
+  }
+
+  #page
+  {
+    margin: 0;
+    width: 90%;
+  }
+  
+  #content
+  {
+  	margin:0;
+  	overflow:visible;
+  }
+
+
+/* Hide header and nav elements */
+  #header, #primary-navigation, #secondary-navigation, #footer-wrapper
+  {
+    visibility: hidden;
+    display: none;
+  }
+
+/* Style links */
+  a:link, a:visited
+  {
+    color: #520;
+    background: transparent;
+    text-decoration: underline !important;
+  }
+  
+/* Remove table header graphic */  
+  .bordered-table th
+  {
+  	background-image:none;
+  }
+  
+
+
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/styles/repositories.css b/kernel/org.eclipse.virgo.management.console/src/main/webapp/styles/repositories.css
new file mode 100644
index 0000000..ddacae5
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/styles/repositories.css
@@ -0,0 +1,18 @@
+@import "common.css";
+
+/* 
+ * Virgo Admin Console
+ *
+ * Styles for the artifacts page
+ *
+ * Christopher Frost - 2011
+ */
+
+.repository-table .repository-deploy {
+	color: transparent;
+}
+
+.table-tr-hovered .repository-deploy {
+	color: #666666;
+	cursor: pointer;
+}
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/styles/reset.css b/kernel/org.eclipse.virgo.management.console/src/main/webapp/styles/reset.css
new file mode 100644
index 0000000..f827992
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/styles/reset.css
@@ -0,0 +1,113 @@
+/* 
+ *	html5doctor.com Reset Stylesheet
+ *	v1.4 
+ *	2009-07-27
+ *	Author: Richard Clark - http://richclarkdesign.com
+ *	With some extras
+ */
+
+html, body, div, span, object, iframe,
+h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+abbr, address, cite, code,
+del, dfn, em, img, ins, kbd, q, samp,
+small, strong, sub, sup, var,
+b, i, dl, dt, dd, ol, ul, li,
+fieldset, form, label, legend,
+table, caption, tbody, tfoot, thead, tr, th, td,
+article, aside, dialog, figure, footer, header, 
+hgroup, menu, nav, section, menu,
+time, mark, audio, video {
+	margin:0;
+	padding:0;
+	border:0;
+	outline:0;
+	font-size:100%;
+	font-weight: normal; /*Extra*/
+	vertical-align:middle; /*Was baseline*/
+	background:transparent;
+}
+body {
+	line-height:1;
+}
+
+article, aside, dialog, figure, footer, header, hgroup, nav, section { 
+	display: block;
+}
+
+ol, ul, li { /* was 'nav ul' */
+	list-style: none;
+}
+
+blockquote, q {
+	quotes:none;
+}
+
+blockquote:before, blockquote:after, q:before, q:after {
+	content:'';
+	content:none;
+}
+
+a {
+	margin:0;
+	padding:0;
+	border:0;
+	font-size:100%;
+	vertical-align:baseline;
+	background:transparent;
+	text-decoration: none; /*Extra*/
+}
+
+ins {
+	background-color:#ff9;
+	color:#000;
+	text-decoration:none;
+}
+
+mark {
+	background-color:#ff9;
+	color:#000;	
+	font-style:italic;
+	font-weight:bold;
+}
+
+abbr[title], dfn[title] {
+	border-bottom:1px dotted #000;
+	cursor:help;
+}
+
+table {
+	border-collapse:collapse;
+	border-spacing:0;
+}
+
+hr {
+    display:block;
+    height:1px;
+    border:0;	
+    border-top:1px solid #cccccc;
+    margin:1em 0;
+    padding:0;
+}
+
+/* Reset some sensible defaults */
+
+input, select {
+	vertical-align:middle;
+	margin:0 2px; /*addition*/
+}
+
+strong {
+	font-weight: bold
+}
+
+em {
+	font-style: italic
+}
+
+del {
+	text-decoration: line-through;
+}
+
+a img {
+	border: none /* Gets rid of IE's blue borders */
+}
diff --git a/kernel/org.eclipse.virgo.management.console/src/main/webapp/styles/wirings.css b/kernel/org.eclipse.virgo.management.console/src/main/webapp/styles/wirings.css
new file mode 100644
index 0000000..ccd0433
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/main/webapp/styles/wirings.css
@@ -0,0 +1,36 @@
+@import "common.css";
+
+/* 
+ * Virgo Admin Console
+ *
+ * Styles for the artifacts page
+ */
+
+#side-bar, #display {
+	vertical-align: top;
+}
+
+#side-bar {
+	display: inline-block;
+	overflow-y: auto;
+	width: 34%;
+	height: 613px;
+}
+
+#display {
+	display: inline-block;
+	width: 65%;
+}
+
+.warning-note{
+    margin: 10px;
+    text-align: center;
+}
+
+#bundle-canvas {
+	margin-top: 13px;
+	margin-left: auto;
+	margin-right: auto;
+	margin-bottom: 0px;
+	overflow-x: auto;
+}
diff --git a/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/AbstractJSTests.java b/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/AbstractJSTests.java
new file mode 100644
index 0000000..58c9259
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/AbstractJSTests.java
@@ -0,0 +1,104 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.virgo.management.console;
+
+import java.io.FileReader;
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+
+import javax.script.ScriptException;
+
+import junit.framework.Assert;
+
+import org.eclipse.virgo.management.console.stubs.objects.Dollar;
+import org.eclipse.virgo.management.console.stubs.objects.Util;
+import org.eclipse.virgo.management.console.stubs.objects.Window;
+import org.eclipse.virgo.management.console.stubs.types.Element;
+import org.eclipse.virgo.management.console.stubs.types.Server;
+import org.junit.After;
+import org.junit.Before;
+import org.mozilla.javascript.Context;
+import org.mozilla.javascript.Function;
+import org.mozilla.javascript.FunctionObject;
+import org.mozilla.javascript.Scriptable;
+import org.mozilla.javascript.ScriptableObject;
+
+/**
+ * 
+ *
+ */
+public abstract class AbstractJSTests {
+	
+	protected Context context; 
+	
+	protected ScriptableObject scope;
+
+	protected static String alertMsg;
+	
+	protected Util commonUtil = null;
+	
+	@Before
+	public void setUp() throws ScriptException, IOException, IllegalAccessException, InstantiationException, InvocationTargetException, SecurityException, NoSuchMethodException{
+		context = Context.enter();
+		scope = context.initStandardObjects();
+
+		//Create the browser environment
+		ScriptableObject.defineClass(scope, Element.class);
+		ScriptableObject.defineClass(scope, Server.class);
+		ScriptableObject.putProperty(scope, "window", Context.javaToJS(new Window(), scope));
+		
+		Dollar.init(context, scope);
+		FunctionObject dollarFunction = new FunctionObject("$", Dollar.class.getDeclaredMethod("dollar", ScriptableObject.class), scope);
+		ScriptableObject.putProperty(scope, "$", dollarFunction);
+		ScriptableObject.putProperty(dollarFunction, "ajax", new FunctionObject("ajax", Dollar.class.getDeclaredMethod("ajax", Scriptable.class), dollarFunction));
+		ScriptableObject.putProperty(dollarFunction, "browser", Context.javaToJS(new Object(), scope));
+		ScriptableObject.putProperty(dollarFunction, "each", new FunctionObject("each", Dollar.class.getDeclaredMethod("each", Scriptable.class, Function.class), dollarFunction));
+		
+		FunctionObject alertFunction = new FunctionObject("alert", AbstractJSTests.class.getDeclaredMethod("alert", String.class), scope);
+		ScriptableObject.putProperty(scope, alertFunction.getFunctionName(), alertFunction);
+	}
+
+	@After
+	public void closeDown(){
+		Context.exit();
+	}
+	
+	// callback from JS function doesn't work with non static field
+	public static void alert(String msg){
+		System.out.println(msg);
+		alertMsg = msg;
+	}
+	
+	protected final void readFile(String fileName) throws IOException{
+		context.evaluateReader(scope, new FileReader(fileName), fileName, 0, null);
+	}
+	
+	protected final void readString(String js) throws IOException{
+		context.evaluateString(scope, js, "snippet", 0, null);
+	}
+	
+	protected final void addCommonObjects(){
+		commonUtil = new Util(context, scope);
+		Object wrapped = Context.javaToJS(commonUtil, scope);
+		ScriptableObject.putProperty(scope, "util", wrapped);
+	}
+	
+	protected final void invokePageInit() throws ScriptException, NoSuchMethodException{
+		Object fObj = scope.get("pageinit", scope);
+		if (fObj instanceof Function) {
+		    Function f = (Function)fObj;
+		    f.call(context, scope, scope, Context.emptyArgs);
+		} else {
+			Assert.fail("pageinit function not found");
+		}		
+	}
+
+}
diff --git a/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/ArtifactsJSTests.java b/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/ArtifactsJSTests.java
new file mode 100644
index 0000000..166736b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/ArtifactsJSTests.java
@@ -0,0 +1,125 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.virgo.management.console;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+
+import javax.script.ScriptException;
+
+import org.eclipse.virgo.management.console.stubs.objects.Dollar;
+import org.eclipse.virgo.management.console.stubs.types.Element;
+import org.junit.Before;
+import org.junit.Test;
+
+import org.mozilla.javascript.Context;
+import org.mozilla.javascript.Function;
+import org.mozilla.javascript.Scriptable;
+import org.mozilla.javascript.ScriptableObject;
+
+/**
+ *
+ *
+ */
+public class ArtifactsJSTests extends AbstractJSTests {
+
+    @Before
+    public void setUpArtifactsJS() throws ScriptException, IOException, NoSuchMethodException {
+        addCommonObjects();
+        readFile("src/main/webapp/js/artifacts.js");
+
+        invokePageInit();
+        assertNotNull(commonUtil.getLastQueryCallBack());
+
+        commonUtil.getLastQueryCallBack().call(context, scope, scope, new Object[] { this.getTestData(), "type" });
+        assertTrue("Page ready has not been called", commonUtil.isPageReady());
+    }
+
+    @Test
+    public void testTreeLoad() {
+        Dollar.getEachOperation().call(context, scope, scope, new Object[] { 1, "filterMatch" });
+        assertEquals("Tree inserted in to the wrong dom node", "#artifacts-tree", Dollar.getDollarLookup());
+    }
+
+    @Test
+    public void testFileUpload() throws IOException {
+        ScriptableObject uploadManager = (ScriptableObject) scope.get("uploadManager", scope);
+
+        Element element = (Element) ((Function) scope.get("Element", scope)).construct(context, scope, new Object[] { "<div />" });
+        Dollar.setDollarLookupResultForIds(element, 3);
+        ScriptableObject.callMethod(uploadManager, "toggle", new Object[] {});
+        assertTrue(element.getClasses().contains("button-selected"));
+
+        Element element2 = (Element) ((Function) scope.get("Element", scope)).construct(context, scope, new Object[] { "#upload-form" });
+        Dollar.setDollarLookupResultForIds(element2, 1);
+        assertFalse((Boolean) Context.jsToJava(ScriptableObject.getProperty(uploadManager, "uploading"), Boolean.class));
+        ScriptableObject.callMethod(uploadManager, "startUpload", new Object[] {});
+        assertTrue((Boolean) Context.jsToJava(ScriptableObject.getProperty(uploadManager, "uploading"), Boolean.class));
+        assertTrue(element2.isSubmitted());
+
+        Element element3 = (Element) ((Function) scope.get("Element", scope)).construct(context, scope, new Object[] { "#upload-target-id" });
+        Element element4 = (Element) ((Function) scope.get("Element", scope)).construct(context, scope, new Object[] { "#uploadLocations" });
+        element3.setContentDocument(element4);
+        Dollar.setDollarLookupResultForIds(new Scriptable[] { element3 }, 1);
+        ScriptableObject.callMethod(uploadManager, "deployComplete", new Object[] {});
+        assertFalse((Boolean) Context.jsToJava(ScriptableObject.getProperty(uploadManager, "uploading"), Boolean.class));
+        assertTrue(alertMsg.startsWith("Deployment result"));
+
+    }
+
+    @Test
+    public void testTreeTopLevelTwisty() throws IOException {
+        ScriptableObject tree = (ScriptableObject) scope.get("tree", scope);
+        ScriptableObject.callMethod(tree, "nodeTwistyClicked", new Object[] { getTestTopLevelEventData() });
+        assertEquals("search/org.eclipse.virgo.kernel:type=ArtifactModel,*", commonUtil.getLastQuery());
+    }
+
+    @Test
+    public void testTreeTwisty() throws IOException {
+        ScriptableObject tree = (ScriptableObject) scope.get("tree", scope);
+        ScriptableObject.callMethod(tree, "nodeTwistyClicked", new Object[] { getTestOtherLevelEventData() });
+        assertEquals("read/objectName", commonUtil.getLastQuery());
+    }
+
+    private Scriptable getTestData() throws IOException {
+		readString( "var TestData = function() {" +
+					"	this.value = {};" +
+					"};");
+        Function testData = (Function) scope.get("TestData", scope);
+        return testData.construct(context, scope, Context.emptyArgs);
+    }
+
+    private Scriptable getTestTopLevelEventData() throws IOException {
+		readString( "var TestEventData = function() {" +
+					"	this.data = {};" +
+					"	this.data.node = new Element('node');" +
+					"   this.data.node.addClass('top-level');" +
+					"	this.data.queryData = {};" +
+					"};");
+        Function testData = (Function) scope.get("TestEventData", scope);
+        return testData.construct(context, scope, Context.emptyArgs);
+    }
+
+    private Scriptable getTestOtherLevelEventData() throws IOException {
+		readString( "var TestEventData = function() {" +
+					"	this.data = {};" +
+					"	this.data.node = new Element('node');" +
+					"	this.data.queryData = {};" +
+					"	this.data.queryData.toString = 'objectName';" +
+					"};");
+        Function testData = (Function) scope.get("TestEventData", scope);
+        return testData.construct(context, scope, Context.emptyArgs);
+    }
+}
diff --git a/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/BundlesGuiJSTests.java b/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/BundlesGuiJSTests.java
new file mode 100644
index 0000000..f10afbb
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/BundlesGuiJSTests.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.virgo.management.console;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+
+import javax.script.ScriptException;
+
+import org.junit.Test;
+
+import org.mozilla.javascript.Context;
+import org.mozilla.javascript.Function;
+import org.mozilla.javascript.FunctionObject;
+import org.mozilla.javascript.Scriptable;
+import org.mozilla.javascript.ScriptableObject;
+
+/**
+ *
+ *
+ */
+public class BundlesGuiJSTests extends AbstractJSTests {
+	
+	@Test
+	public void testConstructors() throws ScriptException, IOException, NoSuchMethodException{
+		addCommonObjects();
+
+		FunctionObject raphaelFunction = new FunctionObject("Raphael", BundlesGuiJSTests.class.getDeclaredMethod("raphael", String.class, int.class, int.class), scope);
+		ScriptableObject.putProperty(scope, "Raphael", raphaelFunction);
+		
+		readFile("src/main/webapp/js/bundlesGui.js");
+
+		((Function) scope.get("LayoutManager", scope)).construct(context, scope, new Object[]{"DrawOnMe", 500, 600, null});
+		((Function) scope.get("Bundle", scope)).construct(context, scope, new Object[]{getTestPaper(), getTestRawBundle(), null});
+		((Function) scope.get("Relationship", scope)).construct(context, scope, new Object[]{getTestPaper(), getTestRawBundle(), getTestRawBundle(), null});
+	}
+	
+	public static Object raphael(String element, int width, int height){
+		assertEquals("DrawOnMe", element);
+		assertEquals(500, width);
+		assertEquals(600, height);
+		return null;
+	}
+
+	private Scriptable getTestRawBundle() throws IOException{
+		readString( "var TestRawBundle = function() {" +
+					"	this.Identifier = 5;" +
+					"	this.summary = 'summary';" +
+					"	this.ExportedPackages = [1,2];" +
+					"	this.ImportedPackages = [3,4];" +
+					"};");
+		Function testData = (Function) scope.get("TestRawBundle", scope);
+		return testData.construct(context, scope, Context.emptyArgs);
+	}
+
+	private Scriptable getTestPaper() throws IOException{
+		readString( "var TestPaper = function() {" +
+				"	this.text = function(){return new TestElement();};" +
+				"	this.path = function(){return new TestElement();};" +
+				"	this.circle = function(){return new TestElement();};" +
+				"	this.rect = function(){return new TestElement();};" +
+					"};" + 
+				"	var TestElement = function() {" +
+				"	this.attr = function(){return new TestElement();};" +
+				"	this.hide = function(){return new TestElement();};" +
+				"	this.getBBox = function(){return new TestElement();};" +
+				"	this.toBack = function(){return new TestElement();};" +
+				"	this.dblclick = function(){return new TestElement();};" +
+				"	this.click = function(){return new TestElement();};" +
+				"	this.width = 5;" +
+				"	this.height = 5;" +
+					"};");
+		Function testData = (Function) scope.get("TestPaper", scope);
+		return testData.construct(context, scope, Context.emptyArgs);
+	}
+	
+}
diff --git a/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/CommonJSTests.java b/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/CommonJSTests.java
new file mode 100644
index 0000000..d0cf08d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/CommonJSTests.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.virgo.management.console;
+
+import java.io.IOException;
+
+import javax.script.ScriptException;
+
+import org.junit.Test;
+
+import org.mozilla.javascript.Function;
+import org.mozilla.javascript.Scriptable;
+import org.mozilla.javascript.ScriptableObject;
+
+/**
+ *
+ *
+ */
+public class CommonJSTests extends AbstractJSTests {
+	
+	@Test
+	public void testParse() throws ScriptException, IOException{
+		Scriptable document = ((Function) scope.get("Element", scope)).construct(context, scope, new Object[]{"<div />"});
+		ScriptableObject.putProperty(scope, "document", document);
+		
+		readFile("src/main/webapp/js/common.js");
+
+	}
+	
+}
diff --git a/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/ConfigurationsJSTests.java b/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/ConfigurationsJSTests.java
new file mode 100644
index 0000000..8d01891
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/ConfigurationsJSTests.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.management.console;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.util.HashMap;
+
+import javax.script.ScriptException;
+
+import org.eclipse.virgo.management.console.stubs.objects.ObjectName;
+import org.eclipse.virgo.management.console.stubs.types.Element;
+import org.junit.Before;
+import org.junit.Test;
+
+import org.mozilla.javascript.Context;
+import org.mozilla.javascript.Function;
+import org.mozilla.javascript.Scriptable;
+
+public class ConfigurationsJSTests extends AbstractJSTests {
+
+    /**
+     * Test that the init script for the page reports back that the page is ready for display
+     * 
+     * @throws ScriptException
+     * @throws IOException
+     * @throws NoSuchMethodException
+     */
+    @Before
+    public void setUpConfigurationsJS() throws ScriptException, IOException, NoSuchMethodException {
+        addCommonObjects();
+        readFile("src/main/webapp/js/configurations.js");
+
+        invokePageInit();
+        assertNotNull(commonUtil.getLastQueryCallBack());
+
+        commonUtil.getLastQueryCallBack().call(context, scope, scope, new Object[] { getTestData() });
+        assertTrue("Page ready has not been called", commonUtil.isPageReady());
+    }
+
+    /**
+     * Tests that the css class applied to the twisty changes from plus to minus as toggle is called.
+     * 
+     * @throws IOException
+     * 
+     */
+    @Test
+    public void testConfigToggle() throws IOException {
+        Function configurationConstructor = (Function) scope.get("Configuration", scope);
+
+        HashMap<String, String> properties = new HashMap<String, String>();
+        properties.put("name", "testName");
+        ObjectName value = new ObjectName("domain", properties);
+
+        Scriptable labelElement = ((Function) scope.get("Element", scope)).construct(context, scope, new Object[] { "<div />" });
+        Scriptable configuration = configurationConstructor.construct(context, scope, new Object[] { Context.javaToJS(value, scope), labelElement });
+
+        assertFalse("Icon not toggled", ((Element) configuration.get("icon", scope)).jsFunction_hasClass("plus"));
+        assertFalse("Icon not toggled", ((Element) configuration.get("icon", scope)).jsFunction_hasClass("minus"));
+        assertFalse("Icon not toggled", ((Element) configuration.get("icon", scope)).jsFunction_hasClass("spinnerIcon"));
+
+        Function toggleFunction = (Function) configuration.get("toggle", scope);
+        toggleFunction.call(context, scope, configuration, Context.emptyArgs); // Close it
+        assertTrue("Icon not toggled", ((Element) configuration.get("icon", scope)).jsFunction_hasClass("plus"));
+        assertFalse("Icon not toggled", ((Element) configuration.get("icon", scope)).jsFunction_hasClass("minus"));
+        assertFalse("Icon not toggled", ((Element) configuration.get("icon", scope)).jsFunction_hasClass("spinnerIcon"));
+
+        toggleFunction.call(context, scope, configuration, Context.emptyArgs); // Open it
+        assertFalse("Icon not toggled", ((Element) configuration.get("icon", scope)).jsFunction_hasClass("plus"));
+        assertFalse("Icon not toggled", ((Element) configuration.get("icon", scope)).jsFunction_hasClass("minus"));
+        assertTrue("Icon not toggled", ((Element) configuration.get("icon", scope)).jsFunction_hasClass("spinnerIcon"));
+    }
+
+    private Scriptable getTestData() throws IOException {
+
+        readString("var Data = function() { this.value = {}; this.value.Value = {}; };");
+
+        Function testData = (Function) scope.get("Data", scope);
+        return testData.construct(context, scope, Context.emptyArgs);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/DumpsJSTests.java b/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/DumpsJSTests.java
new file mode 100644
index 0000000..8209041
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/DumpsJSTests.java
@@ -0,0 +1,179 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.virgo.management.console;
+
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.util.Map;
+
+import javax.script.ScriptException;
+
+import org.eclipse.virgo.management.console.stubs.objects.Dollar;
+import org.eclipse.virgo.management.console.stubs.types.Element;
+import org.junit.Before;
+import org.junit.Test;
+
+import org.mozilla.javascript.Context;
+import org.mozilla.javascript.Function;
+import org.mozilla.javascript.Scriptable;
+
+/**
+ * All the methods in this test class should be run in the defined order. In particular, testPageInit must be run first
+ * to perform common setup.
+ */
+public class DumpsJSTests extends AbstractJSTests {
+    
+    private static final String DUMPDIR_URL = "hostPrefix/jolokia/read/org.eclipse.virgo.kernel:type=Medic,name=DumpInspector/ConfiguredDumpDirectory";
+    
+    private static final String DUMPS_URL = "hostPrefix/jolokia/read/org.eclipse.virgo.kernel:type=Medic,name=DumpInspector/Dumps";
+	
+    @Before
+    public void setUpDumpsJS() throws ScriptException, IOException, NoSuchMethodException {
+
+        // Common setup that will be used by other test methods.
+        readFile("src/main/webapp/js/dumps.js");
+
+        addCommonObjects();
+
+        invokePageInit();
+    }
+
+    @Test
+    public void testPageInit() throws IOException {
+        Map<String, Function> successByUrl = Dollar.getAndClearAjaxSuccessByUrl();
+        
+        assertTrue(successByUrl.containsKey(DUMPDIR_URL));
+        successByUrl.get(DUMPS_URL).call(context, scope, scope, new Object[] { getTestDumpDirectory() });
+        
+        assertTrue(successByUrl.containsKey(DUMPS_URL));
+        successByUrl.get(DUMPS_URL).call(context, scope, scope, new Object[] { getTestDumpList() });
+
+        assertTrue("Page ready has not been called", commonUtil.isPageReady());
+    }
+    
+    private Scriptable getTestDumpDirectory() throws IOException {
+
+        readString("var Data = function() {" + //
+            "   this.value = ['servicability/dump'];" + //
+            "   this.value.Properties = {};" + //
+            "};");
+
+        Function testData = (Function) scope.get("Data", scope);
+        return testData.construct(context, scope, Context.emptyArgs);
+    }
+
+    private Scriptable getTestDumpList() throws IOException {
+
+        readString("var Data = function() {" + //
+            "   this.value = ['2012-05-02-13-30-643'];" + //
+            "   this.value.Properties = {};" + //
+            "};");
+
+        Function testData = (Function) scope.get("Data", scope);
+        return testData.construct(context, scope, Context.emptyArgs);
+    }
+    
+    @Test
+    public void testDisplayDumpEntries() throws ScriptException, IOException, NoSuchMethodException {
+        
+        Function dumpViewerConstructor = (Function) scope.get("DumpViewer", scope);        
+        Scriptable dumpViewer = dumpViewerConstructor.construct(context, scope, new Object[]{});
+        
+        readString( "var DumpEntryList = function() {" +
+            "   this.children = function() {return [];};" +
+            "};");
+        Function dumpEntryList = (Function) scope.get("DumpEntryList", scope);
+        Scriptable listElement = dumpEntryList.construct(context, scope, Context.emptyArgs);
+        Dollar.setDollarLookupResultForIds(listElement);
+
+        readString("var ClickEvent = function() {" + //
+            "   this.data = new Element('<div />');" + //
+            "};");
+        
+        Function eventConstructor = (Function) scope.get("ClickEvent", scope);
+        Object[] args = new Object[] {};
+        Scriptable event = eventConstructor.construct(Context.getCurrentContext(), scope, args);
+        Function displayDumpEntriesFunction = (Function) dumpViewer.get("displayDumpEntries", scope);
+        displayDumpEntriesFunction.call(context, scope, dumpViewer, new Object[] {event});
+
+        Function displaySelectedDumpEntriesFunction = (Function) dumpViewer.get("displaySelectedDump", scope);
+        displaySelectedDumpEntriesFunction.call(context, scope, dumpViewer, new Object[] {});
+    }
+    
+    @Test
+    public void testDisplaySelectedDumpResponse() throws ScriptException, IOException, NoSuchMethodException {
+        
+        Function dumpViewerConstructor = (Function) scope.get("DumpViewer", scope);        
+        Scriptable dumpViewer = dumpViewerConstructor.construct(context, scope, new Object[]{});
+        
+        Object[][] json = new Object[][]{{"a","b"},{"c","d"}};
+
+        readString("var DumpListItem = function() {" + //
+            "   this.attr = function(id){return 'anId'};" + //
+            "};");
+        
+        Function dumpListItemConstructor = (Function) scope.get("DumpListItem", scope);
+        Object[] args = new Object[] {};
+        Scriptable dumpListItem = dumpListItemConstructor.construct(Context.getCurrentContext(), scope, args);
+
+        Function displaySelectedDumpEntriesResponseFunction = (Function) dumpViewer.get("displaySelectedDumpResponse", scope);
+        displaySelectedDumpEntriesResponseFunction.call(context, scope, dumpViewer, new Object[] {Context.javaToJS(json, scope), dumpListItem});
+        
+        readString( "var DumpEntryList = function() {" +
+            "   this.children = function() {return [];};" +
+            "   this.append = function(dumpEntryListItem) {return this;};" +
+            "};");
+        Function dumpEntryList = (Function) scope.get("DumpEntryList", scope);
+        Scriptable listElement = dumpEntryList.construct(context, scope, Context.emptyArgs);
+        Dollar.setDollarLookupResultForIds(listElement, 2);
+        
+        Element.resetClicked();
+        Function eachOperation = Dollar.getEachOperation();
+        eachOperation.call(context, scope, eachOperation, new Object[]{Context.javaToJS(1, scope), new Object[]{"bar.txt","foo"}});
+        assertEquals(1, Element.isClicked());
+        eachOperation.call(context, scope, eachOperation, new Object[]{Context.javaToJS(1, scope), new Object[]{"summary.txt","foo"}});
+        assertEquals(3, Element.isClicked());
+    }
+    
+    @Test
+    public void testCreateDump() throws ScriptException, IOException, NoSuchMethodException {
+        Function dumpViewerConstructor = (Function) scope.get("DumpViewer", scope);        
+        Scriptable dumpViewer = dumpViewerConstructor.construct(context, scope, new Object[]{});
+        Function createDumpFunction = (Function) dumpViewer.get("createDump", scope);
+        createDumpFunction.call(context, scope, dumpViewer, new Object[] {});
+        
+        String ajaxUrl = Dollar.getAjaxUrl();
+        assertEquals("hostPrefix/jolokia/exec/org.eclipse.virgo.kernel:type=Medic,name=DumpInspector/createDump", ajaxUrl);
+    }
+    
+    @Test
+    public void testDeleteDump() throws ScriptException, IOException, NoSuchMethodException {
+        Function dumpViewerConstructor = (Function) scope.get("DumpViewer", scope);        
+        Scriptable dumpViewer = dumpViewerConstructor.construct(context, scope, new Object[]{});
+        Function deleteDumpFunction = (Function) dumpViewer.get("deleteDump", scope);
+        
+        readString("var Event = function() {" + //
+            "   this.data = {attr : function(id){return 'anId'}};" + //
+            "};");
+        
+        Function eventConstructor = (Function) scope.get("Event", scope);
+        Object[] args = new Object[] {};
+        Scriptable event = eventConstructor.construct(Context.getCurrentContext(), scope, args);
+        
+        deleteDumpFunction.call(context, scope, dumpViewer, new Object[] {event});
+        
+        String ajaxUrl = Dollar.getAjaxUrl();
+        assertEquals("hostPrefix/jolokia/exec/org.eclipse.virgo.kernel:type=Medic,name=DumpInspector/deleteDump/anId", ajaxUrl);
+    }
+}
diff --git a/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/ErrorJSTests.java b/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/ErrorJSTests.java
new file mode 100644
index 0000000..f1e93a3
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/ErrorJSTests.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.virgo.management.console;
+
+import java.io.IOException;
+
+import javax.script.ScriptException;
+
+import org.junit.Test;
+
+/**
+ *
+ *
+ */
+public class ErrorJSTests extends AbstractJSTests {
+	
+	@Test
+	public void testParse() throws ScriptException, IOException{
+		readFile("src/main/webapp/js/error.js");
+	}
+	
+}
diff --git a/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/LoggingJSTests.java b/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/LoggingJSTests.java
new file mode 100644
index 0000000..b7db7ea
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/LoggingJSTests.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.virgo.management.console;
+
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+
+import javax.script.ScriptException;
+
+import org.junit.Test;
+
+import org.mozilla.javascript.Context;
+import org.mozilla.javascript.Function;
+import org.mozilla.javascript.Scriptable;
+
+/**
+ *
+ *
+ */
+public class LoggingJSTests extends AbstractJSTests {
+	
+	@Test
+	public void testPageinit() throws ScriptException, IOException, NoSuchMethodException{
+		addCommonObjects();
+		readFile("src/main/webapp/js/logging.js");
+		
+		invokePageInit();
+		
+		Function callback = commonUtil.getLastQueryCallBack();
+		
+		callback.call(context, scope, scope, new Object[] { getTestLoggers() });
+		
+		assertTrue("Page ready has not been called", commonUtil.isPageReady());
+	}
+
+    private Scriptable getTestLoggers() throws IOException {
+
+        readString("var Data = function() {" + 
+            "   this.value = ['logger1','logger2'];" +
+            "};");
+
+        Function testData = (Function) scope.get("Data", scope);
+        return testData.construct(context, scope, Context.emptyArgs);
+    }
+}
diff --git a/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/OverviewJSTests.java b/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/OverviewJSTests.java
new file mode 100644
index 0000000..a8956e0
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/OverviewJSTests.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2012 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.virgo.management.console;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+
+import javax.script.ScriptException;
+
+import org.eclipse.virgo.management.console.stubs.objects.Dollar;
+import org.junit.Test;
+
+import org.mozilla.javascript.Context;
+import org.mozilla.javascript.Function;
+import org.mozilla.javascript.Scriptable;
+
+/**
+ * Unit test of overview.js.
+ */
+public class OverviewJSTests extends AbstractJSTests {
+	
+	@Test
+	public void testPageinit() throws ScriptException, NoSuchMethodException, IOException{
+		addCommonObjects();
+		readFile("src/main/webapp/js/overview.js");
+
+		invokePageInit();
+		
+		assertEquals("hostPrefix/jolokia/version", Dollar.getAjaxUrl());
+		
+		Dollar.getAjaxSuccess().call(context, scope, scope, new Object[] { getTestVersion() });
+		
+		assertTrue("Page ready has not been called", commonUtil.isPageReady());
+	}
+
+    private Scriptable getTestVersion() throws IOException {
+
+        readString("var Data = function() {" + 
+            "   this.value = {info: {vendor: 'a', product: 'b', version: '1'}};" +
+            "};");
+
+        Function testData = (Function) scope.get("Data", scope);
+        return testData.construct(context, scope, Context.emptyArgs);
+    }	
+}
diff --git a/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/RepositoriesJSTests.java b/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/RepositoriesJSTests.java
new file mode 100644
index 0000000..6514e80
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/RepositoriesJSTests.java
@@ -0,0 +1,132 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.management.console;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+
+import javax.script.ScriptException;
+
+import org.eclipse.virgo.management.console.stubs.objects.Dollar;
+import org.junit.Before;
+import org.junit.Test;
+
+import org.mozilla.javascript.Context;
+import org.mozilla.javascript.Function;
+import org.mozilla.javascript.Scriptable;
+import org.mozilla.javascript.ScriptableObject;
+
+/**
+ * All the methods in this test class should be run in the defined order. In particular, testPageInit must be run first
+ * to perform common setup.
+ */
+public class RepositoriesJSTests extends AbstractJSTests {
+
+    @Before
+    public void setUpRepositoriesJS() throws ScriptException, IOException, NoSuchMethodException {
+
+        // Common setup that will be used by other test methods.
+        readFile("src/main/webapp/js/repositories.js");
+
+        addCommonObjects();
+
+        invokePageInit();
+    }
+
+    @Test
+    public void testPageInit() throws IOException {
+        assertNotNull(Dollar.getAjaxSuccess());
+        Dollar.getAjaxSuccess().call(context, scope, scope, new Object[] { getTestData() });
+
+        Function eachOperation = Dollar.getEachOperation();
+        eachOperation.call(context, scope, scope, new Object[] { 0, "org.eclipse.virgo.kernel:name=usr,type=Repository" });
+
+        assertTrue("Page ready has not been called", commonUtil.isPageReady());
+
+    }
+
+    private Scriptable getTestData() throws IOException {
+
+        readString("var Data = function() {" + //
+            "   this.value = ['org.eclipse.virgo.kernel:name=usr,type=Repository', 'org.eclipse.virgo.kernel:name=ext,type=Repository'];" + //
+            "   this.value.Properties = {};" + //
+            "};");
+
+        Function testData = (Function) scope.get("Data", scope);
+        return testData.construct(context, scope, Context.emptyArgs);
+    }
+
+    @Test
+    public void testDisplay() throws Exception {
+        Scriptable repositories = (Scriptable) scope.get("Repositories", scope);
+
+        Function displayFunction = (Function) repositories.get("display", scope);
+
+        readString("var ClickEvent = function() {" + //
+            "   this.data = new Element('<div />');" + //
+            "   this.mbeanName = 'mbeanName';" + //
+            "};");
+
+        Function eventConstructor = (Function) scope.get("ClickEvent", scope);
+        Object[] args = new Object[] {};
+        Scriptable event = eventConstructor.construct(Context.getCurrentContext(), scope, args);
+
+        displayFunction.call(context, scope, repositories, new Object[] { event });
+
+        assertNotNull(Dollar.getAjaxSuccess());
+        Dollar.getAjaxSuccess().call(context, scope, scope, new Object[] { getDisplayTestData() });
+
+    }
+
+    @Test
+    public void testDeploy() throws Exception {
+        Scriptable repositories = (Scriptable) scope.get("Repositories", scope);
+
+        Function deployFunction = (Function) repositories.get("deploy", scope);
+
+        deployFunction.call(context, scope, repositories, new Object[] { "anArtifact" });
+
+        Scriptable lastBulkQuery = commonUtil.getLastBulkQuery();
+        Scriptable[] lastBulkQueryArray = (Scriptable[])Context.jsToJava(lastBulkQuery, Scriptable[].class);
+        Scriptable argumentsProperty = (Scriptable)ScriptableObject.getProperty(lastBulkQueryArray[0], "arguments");
+        String[] arguments = (String[])Context.jsToJava(argumentsProperty, String[].class);
+        assertEquals(1, arguments.length);
+        assertEquals("anArtifact", arguments[0]);
+
+        readString("var aResponse = [{" + //
+            "   value : {type : 'bundle'," + //
+            "       symbolicName : 'someBundle'," + //
+            "       version : '2.1'" + //
+            "   }" + //
+            "}];");
+        Scriptable aResponse = (Scriptable) scope.get("aResponse", scope);
+        commonUtil.getLastBulkQueryCallBack().call(context, scope, scope, new Object[] { aResponse });
+        
+        readString("var console = { log : function(xmlHttpRequest, textStatus, errorThrown) {}};");
+        commonUtil.getLastBulkQueryErrorCallBack().call(context, scope, scope, new Object[] { "xmlHttpRequest", "textStatus", "errorThrown" });
+    }
+
+    private Scriptable getDisplayTestData() throws IOException {
+
+        readString("var Data = function() {" + //
+            "   this.value = {AllArtifactDescriptorSummaries : []};" + //
+            "   this.value.Properties = {};" + //
+            "};");
+
+        Function testData = (Function) scope.get("Data", scope);
+        return testData.construct(context, scope, Context.emptyArgs);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/UploadServletTests.java b/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/UploadServletTests.java
new file mode 100644
index 0000000..884d821
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/UploadServletTests.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.virgo.management.console;
+
+import org.apache.commons.fileupload.FileItem;
+import org.apache.commons.fileupload.disk.DiskFileItem;
+import org.junit.Test;
+import org.springframework.mock.web.MockHttpServletRequest;
+import org.springframework.mock.web.MockHttpServletResponse;
+
+import java.io.File;
+import java.io.IOException;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+public class UploadServletTests {
+
+    @Test
+    public void testDoPost() throws IOException {
+        UploadServlet uploadServlet = new UploadServlet();
+        MockHttpServletRequest request = new MockHttpServletRequest("POST", null);
+        uploadServlet.doPost(request, new MockHttpServletResponse());
+    }
+
+    @Test(expected = RuntimeException.class)
+    public void testDoUploadFail() throws Exception {
+        UploadServlet uploadServlet = new UploadServlet();
+        FileItem fileItem = new DiskFileItem("foo", "json/application", false, "src/test/resources\\test.upload", 500, new File("build"));
+        File stagingDir = new File("build");
+        fileItem.getOutputStream();
+        uploadServlet.doUpload(fileItem, stagingDir);
+    }
+
+    @Test
+    public void testDoUpload() throws Exception {
+        UploadServlet uploadServlet = new UploadServlet();
+        FileItem fileItem = new DiskFileItem("foo", "json/application", false, "test.upload", 500, new File("build"));
+        File stagingDir = new File("src/test/resources");
+        fileItem.getOutputStream();
+        File doUpload = uploadServlet.doUpload(fileItem, stagingDir);
+        assertNotNull(doUpload);
+        assertTrue("test.upload".equals(doUpload.getName()));
+    }
+
+    @Test
+    public void testDoUploadWithFullPathUnix() throws Exception {
+        UploadServlet uploadServlet = new UploadServlet();
+        FileItem fileItem = new DiskFileItem("foo", "json/application", false, "src/test/resources/test.upload", 500, new File("build"));
+        File stagingDir = new File("src/test/resources");
+        fileItem.getOutputStream();
+        File doUpload = uploadServlet.doUpload(fileItem, stagingDir);
+        System.out.println(doUpload.getName());
+        assertNotNull(doUpload);
+        assertTrue("test.upload".equals(doUpload.getName()));
+    }
+
+
+    @Test
+    public void testDoUploadWithFullPathWin() throws Exception {
+        UploadServlet uploadServlet = new UploadServlet();
+        FileItem fileItem = new DiskFileItem("foo", "json/application", false, "src\\test\\resources\\test.upload", 500, new File("build"));
+        File stagingDir = new File("src/test/resources");
+        fileItem.getOutputStream();
+        File doUpload = uploadServlet.doUpload(fileItem, stagingDir);
+        assertNotNull(doUpload);
+        assertTrue("test.upload".equals(doUpload.getName()));
+    }
+}
diff --git a/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/WiringsJSTests.java b/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/WiringsJSTests.java
new file mode 100644
index 0000000..383f965
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/WiringsJSTests.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.virgo.management.console;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+
+import javax.script.ScriptException;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import org.mozilla.javascript.Context;
+import org.mozilla.javascript.Function;
+import org.mozilla.javascript.Scriptable;
+
+/**
+ *
+ *
+ */
+public class WiringsJSTests extends AbstractJSTests {
+	
+	@Before
+	public void setUpWirings() throws ScriptException, IOException, NoSuchMethodException{
+		addCommonObjects();
+		readFile("src/main/webapp/js/wirings.js");
+		createTestLayoutManager();
+		createRaphael();
+		
+		invokePageInit();
+	}
+
+    @Test
+    public void testPageInit() throws IOException {
+		assertEquals("bundlesGui", commonUtil.getLastScriptLoaded());
+		assertNotNull(commonUtil.getLoadScriptAsync());
+		commonUtil.getLoadScriptAsync().call(context, scope, scope, new Object[]{});
+
+		assertEquals("raphael", commonUtil.getLastScriptLoaded());
+		assertNotNull(commonUtil.getLoadScriptAsync());
+		commonUtil.getLoadScriptAsync().call(context, scope, scope, new Object[]{});
+		
+		assertNotNull(commonUtil.getLastQueryCallBack());
+		commonUtil.getLastQueryCallBack().call(context, scope, scope, new Object[]{getTestValue()});
+		
+		assertNotNull(commonUtil.getLastBulkQueryCallBack());
+		commonUtil.getLastBulkQueryCallBack().call(context, scope, scope, new Object[]{getTestValue()});
+		
+		assertTrue("Page ready has not been called", commonUtil.isPageReady());
+	}
+	
+	@Test
+	public void testConstructors() throws ScriptException, IOException, NoSuchMethodException{
+		((Function) scope.get("SideBar", scope)).construct(context, scope, new Object[]{getTestLayoutManager(), null});
+		((Function) scope.get("GeminiDataSource", scope)).construct(context, scope, new Object[]{});
+	}
+
+	private Scriptable getTestValue() throws IOException{
+		readString( "var TestValue = function() {" +
+					"	this.value = [];" +
+					"};");
+		Function testData = (Function) scope.get("TestValue", scope);
+		return testData.construct(context, scope, Context.emptyArgs);
+	}
+
+	private void createTestLayoutManager() throws IOException{
+		readString( "var LayoutManager = function() {" +
+				"	this.setFocusListener = function(){};" +
+				"};");
+	}
+
+	private void createRaphael() throws IOException{
+		readString( "var Raphael = function(element, width, height) {" +
+				"};");
+	}
+
+	private Scriptable getTestLayoutManager() throws IOException{
+		Function testData = (Function) scope.get("LayoutManager", scope);
+		return testData.construct(context, scope, Context.emptyArgs);
+	}
+	
+}
diff --git a/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/stubs/objects/Dollar.java b/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/stubs/objects/Dollar.java
new file mode 100644
index 0000000..1a80096
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/stubs/objects/Dollar.java
@@ -0,0 +1,135 @@
+/*******************************************************************************
+ * Copyright (c) 2012 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.management.console.stubs.objects;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.mozilla.javascript.Context;
+import org.mozilla.javascript.Function;
+import org.mozilla.javascript.Scriptable;
+import org.mozilla.javascript.ScriptableObject;
+
+/**
+ * 
+ */
+public final class Dollar {
+	
+	private static Context CONTEXT; 
+	
+	private static ScriptableObject SCOPE;
+	
+	private static String dollarLookup = "";
+	
+	private static Function ajax_success;
+
+	private static String ajax_url;
+	
+	private static Map<String, Function> ajaxSuccessByUrl = new HashMap<String, Function>();
+
+	private static Scriptable each_array;
+
+	private static Function each_operation;
+
+    private static Scriptable lookupResultForIds;
+
+    private static Scriptable[] lookupResultArrayForIds;
+
+    private static int lookupResultForIdsCount;
+
+    private Dollar(Context context, ScriptableObject scope) {
+    }
+    
+    public static void init(Context context, ScriptableObject scope) {
+    	Dollar.lookupResultForIds = null;
+    	CONTEXT = context;
+    	SCOPE = scope;
+    }
+
+    // JavaScript Functions
+    
+	public static Object dollar(ScriptableObject name){
+		Dollar.dollarLookup = (String) Context.jsToJava(name, String.class);
+		if (Dollar.dollarLookup.startsWith("#") && Dollar.lookupResultForIds != null) {
+		    Scriptable result = Dollar.lookupResultForIds;
+		    if (--Dollar.lookupResultForIdsCount == 0) {
+		        Dollar.lookupResultForIds = null;
+		    }
+            return result;
+		} else if (Dollar.dollarLookup.startsWith("#") && Dollar.lookupResultArrayForIds != null) {
+		    Scriptable[] result = Dollar.lookupResultArrayForIds;
+            if (--Dollar.lookupResultForIdsCount == 0) {
+                Dollar.lookupResultArrayForIds = null;
+            }
+            return result;
+		} else {
+		    Function elementConstructor = (Function) SCOPE.get("Element", SCOPE);
+		    Object[] args = new Object[]{name};
+		    Scriptable constructedElement = elementConstructor.construct(CONTEXT, SCOPE, args);
+		    return constructedElement;
+		}
+	}
+	
+    public static void ajax(Scriptable options){
+    	Dollar.ajax_url = (String) Context.jsToJava(ScriptableObject.getProperty(options, "url"), String.class);
+    	Dollar.ajax_success = (Function) Context.jsToJava(ScriptableObject.getProperty(options, "success"), Function.class);
+    	Dollar.ajaxSuccessByUrl.put(Dollar.ajax_url, Dollar.ajax_success);
+    }
+
+	public static void each(Scriptable array, Function operation){
+    	Dollar.each_array = array;
+    	Dollar.each_operation = operation;
+	}
+	
+	// Test Helper Methods
+	
+	public static void setDollarLookupResultForIds(Scriptable dollarLookupResultForIds) {
+	    setDollarLookupResultForIds(dollarLookupResultForIds, 1);
+	}
+	
+	public static void setDollarLookupResultForIds(Scriptable dollarLookupResultForIds, int count) {
+        Dollar.lookupResultForIds = dollarLookupResultForIds;
+        Dollar.lookupResultForIdsCount = count;
+    }
+	
+	public static void setDollarLookupResultForIds(Scriptable[] dollarLookupArrayResultForIds, int count) {
+        Dollar.lookupResultArrayForIds = dollarLookupArrayResultForIds;
+        Dollar.lookupResultForIdsCount = count;
+    }
+	
+	public static String getDollarLookup() {
+		return Dollar.dollarLookup;
+	}
+
+	public static Function getAjaxSuccess() {
+		return Dollar.ajax_success;
+	}
+	
+	public static Map<String, Function> getAndClearAjaxSuccessByUrl() {
+	    Map<String, Function> result = new HashMap<String, Function>(Dollar.ajaxSuccessByUrl);
+	    Dollar.ajaxSuccessByUrl.clear();
+	    return result;
+	}
+
+	public static String getAjaxUrl() {
+		return Dollar.ajax_url;
+	}
+
+	public static Scriptable getEachArray() {
+		return Dollar.each_array;
+	}
+
+	public static Function getEachOperation() {
+		return Dollar.each_operation;
+	}
+    
+}
diff --git a/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/stubs/objects/MBean.java b/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/stubs/objects/MBean.java
new file mode 100644
index 0000000..14672b8
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/stubs/objects/MBean.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 20012 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.virgo.management.console.stubs.objects;
+
+
+public class MBean {
+
+    public MBean(String mbeanName) {
+    }
+    
+    public String get(String property) {
+        return "value";
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/stubs/objects/ObjectName.java b/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/stubs/objects/ObjectName.java
new file mode 100644
index 0000000..904301b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/stubs/objects/ObjectName.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.management.console.stubs.objects;
+
+import java.util.Map;
+
+public class ObjectName {
+
+    private final String domain;
+
+    private final Map<String, String> properties;
+
+    public ObjectName(String domain, Map<String, String> properties) {
+        this.domain = domain;
+        this.properties = properties;
+    }
+
+    // Stub methods
+
+    public String get(String property) {
+        return this.properties.get(property);
+    }
+
+    public String domain() {
+        return domain;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/stubs/objects/Util.java b/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/stubs/objects/Util.java
new file mode 100644
index 0000000..c60b569
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/stubs/objects/Util.java
@@ -0,0 +1,173 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.management.console.stubs.objects;
+
+import org.mozilla.javascript.Context;
+import org.mozilla.javascript.Function;
+import org.mozilla.javascript.Scriptable;
+import org.mozilla.javascript.ScriptableObject;
+
+/**
+ * 
+ *
+ */
+public class Util {
+
+    private final Context CONTEXT;
+
+    private final ScriptableObject SCOPE;
+
+    private boolean pageReady = false;
+
+    private String[] lastMakeTableRows = null;
+
+    private String[] lastMakeTableHeaders = null;
+
+    private Scriptable lastMakeTableTable = null;
+
+    private String lastQuery = null;
+
+    private Function lastQueryCallBack = null;
+
+    private Scriptable lastBulkQuery = null;
+
+    private Function lastBulkQueryCallBack = null;
+
+    private Function lastBulkQueryErrorCallBack = null;
+
+    private Function async;
+
+    private String lastScriptLoaded;
+
+    public static int fxTime = 200;
+
+    public Util(Context context, ScriptableObject SCOPE) {
+        this.CONTEXT = context;
+        this.SCOPE = SCOPE;
+    }
+
+    // Stub methods
+
+    public void pageReady() {
+        this.pageReady = true;
+    }
+
+    public Object getHost() {
+        return Context.javaToJS("hostPrefix", SCOPE);
+    }
+
+    public Object getHostAndAdminPath() {
+        return Context.javaToJS("hostPrefix", SCOPE);
+    }
+
+    public Object readObjectName(String mbeanName) {
+        return new MBean(mbeanName);
+    }
+
+    public void loadScript(Object scriptName, Object async) {
+        this.lastScriptLoaded = (String) scriptName;
+        this.async = (Function) async;
+    }
+
+    public Object makeTable(Scriptable properties) {
+        Object[] headers = (Object[]) Context.jsToJava(ScriptableObject.getProperty(properties, "headers"), Object[].class);
+        this.lastMakeTableHeaders = new String[headers.length];
+        for (int i = 0; i < headers.length; i++) {
+            this.lastMakeTableHeaders[i] = (String) Context.jsToJava(ScriptableObject.getProperty((Scriptable) headers[i], "title"), String.class);
+        }
+
+        this.lastMakeTableRows = (String[]) Context.jsToJava(ScriptableObject.getProperty(properties, "rows"), String[].class);
+
+        Function elementConstructor = (Function) SCOPE.get("Element", SCOPE);
+        Object[] args = new Object[] { properties };
+        Scriptable table = elementConstructor.construct(Context.getCurrentContext(), SCOPE, args);
+        this.lastMakeTableTable = table;
+        return table;
+    }
+
+    public Object makeDiv(String clazz) {
+        Function elementConstructor = (Function) SCOPE.get("Element", SCOPE);
+        Object[] args = new Object[] { clazz };
+        return elementConstructor.construct(this.CONTEXT, SCOPE, args);
+    }
+
+    public void doQuery(String query, Function callBack) {
+        this.lastQuery = query;
+        this.lastQueryCallBack = callBack;
+        // this.lastQueryErrorCallBack = errorCallBack;
+    }
+
+    public void doBulkQuery(Scriptable query, Function callBack, Function errorCallBack) {
+        this.lastBulkQuery = query;
+        this.lastBulkQueryCallBack = callBack;
+        this.lastBulkQueryErrorCallBack = errorCallBack;
+    }
+
+    // Test methods
+
+    public void clean() {
+        this.pageReady = false;
+        this.lastMakeTableRows = null;
+        this.lastMakeTableHeaders = null;
+        this.lastMakeTableTable = null;
+        this.lastQuery = null;
+        this.lastQueryCallBack = null;
+        this.lastBulkQuery = null;
+        this.lastBulkQueryCallBack = null;
+        this.lastBulkQueryErrorCallBack = null;
+    }
+
+    public boolean isPageReady() {
+        return pageReady;
+    }
+
+    public Function getLoadScriptAsync() {
+        return this.async;
+    }
+
+    public String[] getLastMakeTableHeaders() {
+        return this.lastMakeTableHeaders;
+    }
+
+    public String[] getLastMakeTableRows() {
+        return this.lastMakeTableRows;
+    }
+
+    public Scriptable getLastMakeTableTable() {
+        return this.lastMakeTableTable;
+    }
+
+    public String getLastQuery() {
+        return lastQuery;
+    }
+
+    public Function getLastQueryCallBack() {
+        return lastQueryCallBack;
+    }
+
+    public Scriptable getLastBulkQuery() {
+        return lastBulkQuery;
+    }
+
+    public Function getLastBulkQueryCallBack() {
+        return lastBulkQueryCallBack;
+    }
+
+    public Function getLastBulkQueryErrorCallBack() {
+        return lastBulkQueryErrorCallBack;
+    }
+
+    public String getLastScriptLoaded() {
+        return lastScriptLoaded;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/stubs/objects/Window.java b/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/stubs/objects/Window.java
new file mode 100644
index 0000000..7a57df7
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/stubs/objects/Window.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.virgo.management.console.stubs.objects;
+
+import org.mozilla.javascript.Function;
+
+/**
+ * 
+ *
+ */
+public class Window {
+
+	public Window() {
+
+	}
+	
+	public void addEvent(String name, Function function){
+		
+	}
+
+	public void log(String msg){
+		System.out.println(msg);
+	}
+	
+}
diff --git a/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/stubs/types/Element.java b/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/stubs/types/Element.java
new file mode 100644
index 0000000..ff82933
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/stubs/types/Element.java
@@ -0,0 +1,182 @@
+/*******************************************************************************
+ * Copyright (c) 2012 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.management.console.stubs.types;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.virgo.management.console.stubs.objects.Util;
+
+import org.mozilla.javascript.Context;
+import org.mozilla.javascript.Function;
+import org.mozilla.javascript.ScriptableObject;
+
+/**
+ */
+public class Element extends ParentStub {
+    
+    private static final long serialVersionUID = 1L;
+
+    private static List<String> CONSTRUCTOR_ARGUMENT_TRACE = new ArrayList<String>();
+
+    private Element lastReplacement;
+
+	private Element lastAppended;
+
+	private Function ready;
+    
+    private final String constructorArgument;
+	
+    private List<String> CLASSES = new ArrayList<String>();
+    
+    private Map<String, String> CSS = new HashMap<String, String>();
+
+	private boolean isSubmitted;
+	
+	private static int CLICK_COUNT = 0;
+
+    private Element contentDocument;
+    
+    /**
+     * Prototype constructor
+     */
+    public Element() {
+        this.constructorArgument = null;
+    }
+    
+    /**
+     * JavaScript Constructor
+     */
+    public Element(ScriptableObject constructorArgument) {
+        this.constructorArgument = ((String) Context.jsToJava(constructorArgument, String.class));
+        CONSTRUCTOR_ARGUMENT_TRACE.add(this.constructorArgument);
+    }
+    
+    public void jsFunction_empty(){
+    }
+
+	public void jsFunction_ready(Function readyFunction){
+		ready = readyFunction;
+	}
+    
+    public ScriptableObject jsFunction_replaceWith(Element replacement){
+        lastReplacement = replacement;
+        return this;
+    }
+    
+    public ScriptableObject jsFunction_append(Element toAppend){
+        lastAppended = toAppend;
+        return this;
+    }
+
+    public ScriptableObject jsFunction_addClass(String newClass){
+    	CLASSES.add(newClass);
+        return this;
+    }
+    
+	public boolean jsFunction_hasClass(String className){
+		return CLASSES.contains(className);
+	}
+
+	public ScriptableObject jsFunction_removeClass(String className) {
+		CLASSES.remove(className);
+        return this;
+	}
+	
+    public ScriptableObject jsFunction_text(String text) {
+        return this;
+    }
+	
+    public void jsFunction_attr(String attr) {
+    }
+    
+    public void jsFunction_prop(String prop){
+    }
+    
+    public void jsFunction_data(String name, String value){
+    }
+
+    public void jsFunction_click() {
+    	CLICK_COUNT++;
+    }
+
+    public void jsFunction_load() {
+    }
+
+    public void jsFunction_submit() {
+    	this.isSubmitted = true;
+    }
+    
+    public ScriptableObject jsFunction_children(String filter) {
+    	return this;
+    }
+
+	public ScriptableObject jsFunction_css(String key, String value) {
+		CSS.put(key, value);
+		return this;
+	}
+	
+	public void jsFunction_slideToggle(int time){
+		assertEquals(Util.fxTime, time);
+	}
+	
+	public Element jsFunction_contentDocument(){
+	    return this.contentDocument;
+	}
+    
+    // Test helper methods
+	
+	public Function getReadyFunction(){
+		return ready;
+	}
+	
+	public List<String> getClasses(){
+		return CLASSES;
+	}
+    
+	public static List<String> getConstructorArgumentTrace() {
+		return CONSTRUCTOR_ARGUMENT_TRACE;
+	}
+   
+	public Element getLastReplacement() {
+		return lastReplacement;
+	}
+   
+	public Element getLastAppended() {
+		return lastAppended;
+	}
+
+	public String getConstructorArgument() {
+		return this.constructorArgument;
+	}
+	
+	public boolean isSubmitted() {
+		return this.isSubmitted;
+	}
+	
+	public static int isClicked() {
+		return CLICK_COUNT;
+	}
+	
+	public static void resetClicked() {
+		CLICK_COUNT = 0;
+	}
+	
+	public void setContentDocument(Element contentDocument){
+	    this.contentDocument = contentDocument;
+	}
+	
+}
diff --git a/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/stubs/types/ParentStub.java b/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/stubs/types/ParentStub.java
new file mode 100644
index 0000000..d4067cf
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/stubs/types/ParentStub.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2012 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.virgo.management.console.stubs.types;
+
+import org.mozilla.javascript.ScriptableObject;
+
+/**
+ * 
+ * 
+ */
+public abstract class ParentStub extends ScriptableObject {
+
+	private static final long serialVersionUID = 1L;
+
+	@Override
+	public String getClassName() {
+		return this.getClass().getSimpleName();
+	}
+	
+}
diff --git a/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/stubs/types/Server.java b/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/stubs/types/Server.java
new file mode 100644
index 0000000..41cab36
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/test/java/org/eclipse/virgo/management/console/stubs/types/Server.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.management.console.stubs.types;
+
+import org.mozilla.javascript.Function;
+
+/**
+ * 
+ *
+ */
+public class Server extends ParentStub {
+
+    private static final long serialVersionUID = 1L;
+
+    private Function callbackFunction;
+
+    public Server() {
+    }
+
+    // Stub methods
+
+    public void jsFunction_getServerOverview(Function callbackFunction) {
+        this.callbackFunction = callbackFunction;
+    }
+
+    // Test methods
+
+    public Function getCallbackFunction() {
+        return this.callbackFunction;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.management.console/src/test/resources/test.upload b/kernel/org.eclipse.virgo.management.console/src/test/resources/test.upload
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/src/test/resources/test.upload
diff --git a/kernel/org.eclipse.virgo.management.console/template.mf b/kernel/org.eclipse.virgo.management.console/template.mf
new file mode 100644
index 0000000..e001a3b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.console/template.mf
@@ -0,0 +1,30 @@
+Manifest-Version: 1.0
+Bundle-Name: Virgo Admin Console
+Bundle-Version: ${version}
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: org.eclipse.virgo.management.console
+Bundle-ClassPath: WEB-INF/classes
+Web-ContextPath: /admin
+Bundle-Activator: org.eclipse.virgo.management.console.Activator
+Import-Template: 
+ javax.servlet.*;version="${javaxServletVersion:[-1.6.=,=.+1)}",
+ org.eclipse.virgo.util.*;version="${version:[=.=.=, +1)}",
+ org.jolokia.osgi.servlet;version="${jolokiaVersion:[=.=,+1.=)}",
+ org.slf4j;version="${slf4jVersion:[=.=.=,+1)}",
+ org.apache.commons.fileupload.*;version="${commonsFileuploadVersion:[=.=.=,+1)}",
+ org.eclipse.osgi.internal.signedcontent;version="0",
+ org.osgi.framework.*;version="0",
+ org.osgi.service.*;version="0",
+ org.osgi.util.tracker.*;version="0",
+ javax.management.*;version="0",
+ javax.security.*;version="0",
+ com.sun.javadoc.*;version="0",
+ com.sun.tools.javadoc.*;version="0",
+ javax.swing.*;version="0",
+ javax.xml.parsers.*;version="0",
+ javax.xml.stream.*;version="0",
+ javax.xml.transform.*;version="0",
+ org.apache.tools.ant.*;version="0",
+ org.w3c.dom.*;version="0",
+ org.xml.sax.*;version="0"
+Excluded-Exports: *
diff --git a/kernel/org.eclipse.virgo.management.fragment/.settings/com.springsource.server.ide.bundlor.core.prefs b/kernel/org.eclipse.virgo.management.fragment/.settings/com.springsource.server.ide.bundlor.core.prefs
new file mode 100644
index 0000000..61ee8a9
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.fragment/.settings/com.springsource.server.ide.bundlor.core.prefs
@@ -0,0 +1,3 @@
+#Mon Jul 06 09:06:52 BST 2009
+com.springsource.server.ide.bundlor.core.template.properties.files=../build.properties;../build.versions
+eclipse.preferences.version=1
diff --git a/kernel/org.eclipse.virgo.management.fragment/.settings/org.eclipse.wst.common.project.facet.core.xml b/kernel/org.eclipse.virgo.management.fragment/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..92aa290
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.fragment/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+  <installed facet="org.eclipse.virgo.server.bundle" version="1.0"/>
+</faceted-project>
diff --git a/kernel/org.eclipse.virgo.management.fragment/.settings/org.springframework.ide.eclipse.beans.core.prefs b/kernel/org.eclipse.virgo.management.fragment/.settings/org.springframework.ide.eclipse.beans.core.prefs
new file mode 100644
index 0000000..e68da31
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.fragment/.settings/org.springframework.ide.eclipse.beans.core.prefs
@@ -0,0 +1,3 @@
+#Mon Jul 06 16:49:15 BST 2009
+eclipse.preferences.version=1
+org.springframework.ide.eclipse.beans.core.ignoreMissingNamespaceHandler=false
diff --git a/kernel/org.eclipse.virgo.management.fragment/src/main/java/org/eclipse/virgo/management/fragment/VirgoObjectNameTranslator.java b/kernel/org.eclipse.virgo.management.fragment/src/main/java/org/eclipse/virgo/management/fragment/VirgoObjectNameTranslator.java
new file mode 100644
index 0000000..c69c293
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.fragment/src/main/java/org/eclipse/virgo/management/fragment/VirgoObjectNameTranslator.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+ 
+package org.eclipse.virgo.management.fragment;
+
+import java.util.Hashtable;
+
+import javax.management.ObjectName;
+
+import org.eclipse.equinox.region.Region;
+import org.eclipse.equinox.region.RegionDigraph;
+import org.eclipse.gemini.management.ObjectNameTranslator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+
+public class VirgoObjectNameTranslator implements ObjectNameTranslator{
+
+	private static final String REGION_KEY = "region";
+	
+	private final String regionName;
+
+	public VirgoObjectNameTranslator(BundleContext context) {
+		ServiceReference<RegionDigraph> serviceReference = context.getServiceReference(RegionDigraph.class);
+		RegionDigraph service = context.getService(serviceReference);
+		Region region = service.getRegion(context.getBundle().getBundleId());
+		this.regionName = region.getName();
+	}
+	
+	/**
+	 * {@inheritDoc}
+	 */
+	public ObjectName translate(ObjectName originalName) {
+		Hashtable<String, String> keyPropertyList = originalName.getKeyPropertyList();
+		keyPropertyList.put(REGION_KEY, regionName);
+		try {
+			return new ObjectName(originalName.getDomain(), keyPropertyList);
+		} catch (Exception e) {
+			throw new RuntimeException("Error modifying ObjectName for '" + originalName.getCanonicalName() + "'", e);
+		}
+	}
+
+}
diff --git a/kernel/org.eclipse.virgo.management.fragment/src/test/java/org/eclipse/virgo/management/fragment/VirgoObjectNameTranslatorTests.java b/kernel/org.eclipse.virgo.management.fragment/src/test/java/org/eclipse/virgo/management/fragment/VirgoObjectNameTranslatorTests.java
new file mode 100644
index 0000000..8b8c4b4
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.fragment/src/test/java/org/eclipse/virgo/management/fragment/VirgoObjectNameTranslatorTests.java
@@ -0,0 +1,77 @@
+package org.eclipse.virgo.management.fragment;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Hashtable;
+
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+
+import org.easymock.EasyMock;
+import org.eclipse.equinox.region.Region;
+import org.eclipse.equinox.region.RegionDigraph;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+
+public class VirgoObjectNameTranslatorTests {
+
+	private static final String MOCK_REGION_NAME = "testRegion";
+
+	private ObjectName testObjectName;
+	
+	private ObjectName testObjectNameTranslation;
+
+	private BundleContext mockContext;
+	
+	private ServiceReference<RegionDigraph> mockServiceReference;
+
+	private Bundle mockBundle;
+
+	private RegionDigraph mockRegionDigraph;
+
+	private Region mockRegion;
+
+
+	@SuppressWarnings("unchecked")
+	@Before
+	public void setup() throws MalformedObjectNameException, NullPointerException{
+		Hashtable<String, String> table = new Hashtable<String, String>();
+		table.put("testKey", "testValue");
+		testObjectName = ObjectName.getInstance("testDomain", table);
+		table.put("region", MOCK_REGION_NAME);
+		testObjectNameTranslation = ObjectName.getInstance("testDomain", table);
+		mockContext = EasyMock.createMock(BundleContext.class);
+		mockServiceReference = (ServiceReference<RegionDigraph>) EasyMock.createMock(ServiceReference.class);
+        mockBundle = EasyMock.createMock(Bundle.class);
+        mockRegionDigraph = EasyMock.createMock(RegionDigraph.class);
+        mockRegion = EasyMock.createMock(Region.class);
+		EasyMock.expect(mockContext.getServiceReference(RegionDigraph.class)).andReturn(mockServiceReference);
+		EasyMock.expect(mockContext.getService(mockServiceReference)).andReturn(mockRegionDigraph);
+		EasyMock.expect(mockContext.getBundle()).andReturn(mockBundle);
+		EasyMock.expect(mockBundle.getBundleId()).andReturn(5l);
+		EasyMock.expect(mockRegionDigraph.getRegion(5l)).andReturn(mockRegion);
+		EasyMock.expect(mockRegion.getName()).andReturn(MOCK_REGION_NAME);
+	}
+	
+    private void replayMocks() {
+        EasyMock.replay(mockContext, mockServiceReference, mockBundle, mockRegionDigraph, mockRegion);
+    }
+
+    @After
+    public void tearDown() {
+        EasyMock.verify(mockContext, mockServiceReference, mockBundle, mockRegionDigraph, mockRegion);
+    }
+	
+	@Test
+	public void test() {
+		replayMocks();
+		VirgoObjectNameTranslator virgoObjectNameTranslator = new VirgoObjectNameTranslator(mockContext);
+		ObjectName translatedObjectName = virgoObjectNameTranslator.translate(testObjectName);
+		assertEquals(testObjectNameTranslation, translatedObjectName);
+	}
+
+}
diff --git a/kernel/org.eclipse.virgo.management.fragment/template.mf b/kernel/org.eclipse.virgo.management.fragment/template.mf
new file mode 100644
index 0000000..4029a37
--- /dev/null
+++ b/kernel/org.eclipse.virgo.management.fragment/template.mf
@@ -0,0 +1,13 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Virgo Management Fragment
+Fragment-Host: org.eclipse.gemini.management;bundle-version="${geminiManagementVersion:[=.=.=, =.+1)}"
+Bundle-SymbolicName: org.eclipse.virgo.management.fragment
+Bundle-Version: ${version}
+GeminiManagement-ObjectNameTranslator: org.eclipse.virgo.management.fragment.VirgoObjectNameTranslator
+Import-Package: 
+ org.eclipse.equinox.region;version="${equinoxRegionExportedPackageVersion:[=.=.=, =.+1)}",
+ javax.management;version="0",
+ org.osgi.framework;version="0"
+Excluded-Imports: org.eclipse.gemini.management
+Excluded-Exports: *
diff --git a/kernel/org.eclipse.virgo.shell.command/.settings/org.eclipse.wst.common.project.facet.core.xml b/kernel/org.eclipse.virgo.shell.command/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..92aa290
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+  <installed facet="org.eclipse.virgo.server.bundle" version="1.0"/>
+</faceted-project>
diff --git a/kernel/org.eclipse.virgo.shell.command/.settings/org.springframework.ide.eclipse.beans.core.prefs b/kernel/org.eclipse.virgo.shell.command/.settings/org.springframework.ide.eclipse.beans.core.prefs
new file mode 100644
index 0000000..ca1fb46
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/.settings/org.springframework.ide.eclipse.beans.core.prefs
@@ -0,0 +1,3 @@
+#Tue Sep 01 16:11:24 BST 2009
+eclipse.preferences.version=1
+org.springframework.ide.eclipse.beans.core.ignoreMissingNamespaceHandler=false
diff --git a/kernel/org.eclipse.virgo.shell.command/.springBeans b/kernel/org.eclipse.virgo.shell.command/.springBeans
new file mode 100644
index 0000000..123ac46
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/.springBeans
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beansProjectDescription>
+	<version>1</version>
+	<pluginVersion><![CDATA[2.2.6.200908051215-RELEASE]]></pluginVersion>
+	<configSuffixes>
+		<configSuffix><![CDATA[xml]]></configSuffix>
+	</configSuffixes>
+	<enableImports><![CDATA[false]]></enableImports>
+	<configs>
+		<config>src/main/resources/META-INF/spring/module-context.xml</config>
+		<config>src/main/resources/META-INF/spring/osgi-context.xml</config>
+	</configs>
+	<configSets>
+		<configSet>
+			<name><![CDATA[org.eclipse.virgo.kernel.shell.config.set]]></name>
+			<allowBeanDefinitionOverriding>true</allowBeanDefinitionOverriding>
+			<incomplete>false</incomplete>
+			<configs>
+				<config>src/main/resources/META-INF/spring/module-context.xml</config>
+				<config>src/main/resources/META-INF/spring/osgi-context.xml</config>
+			</configs>
+		</configSet>
+	</configSets>
+</beansProjectDescription>
diff --git a/kernel/org.eclipse.virgo.shell.command/key.ser b/kernel/org.eclipse.virgo.shell.command/key.ser
new file mode 100644
index 0000000..2e678fe
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/key.ser
Binary files differ
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/Command.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/Command.java
new file mode 100644
index 0000000..beea5b8
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/Command.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell;
+
+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;
+
+/**
+ * <code>Command</code> is used to annotate shell commands. Applying the annotation to a class will identify it as a
+ * provider of shell commands and allows the base command name to be specified. Applying the annotation to a method will
+ * identify it as a shell command and allows the command's name to be specified. For example:
+ * 
+ * <pre>
+ *{@link Command @Command}("do")
+ * public class MyCommands {
+ *     
+ *    {@link Command @Command}("something")
+ *     public String performCommand() {
+ *         return "hello";
+ *     }
+ * }
+ * <p />
+ * </pre>
+ * 
+ * This class will result in a top-level command called do that provides a sub-command named something, i.e.
+ * <code>do something</code> would be a valid command in the shell.
+ * 
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target( { ElementType.TYPE, ElementType.METHOD })
+@Inherited
+public @interface Command {
+
+    String value();
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/CommandCompleter.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/CommandCompleter.java
new file mode 100644
index 0000000..40331d6
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/CommandCompleter.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell;
+
+import java.util.List;
+
+/**
+ * A <code>CommandCompleter</code> is used to help the user complete a command. A <code>CommandCompleter</code> can be
+ * made available to the Shell by publishing it in the service registry and setting the required
+ * {@link #SERVICE_PROPERTY_COMPLETER_COMMAND_NAMES service property}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ * 
+ */
+public interface CommandCompleter {
+
+    /**
+     * A service property used to specify the commands with which the completer should be associated. The property's
+     * value must be either a String or a String[].
+     */
+    public static final String SERVICE_PROPERTY_COMPLETER_COMMAND_NAMES = "org.eclipse.virgo.shell.completer.commmandNames";
+
+    /**
+     * Returns all of the completion candidates for the given <code>subCommand</code> and <code>arguments</code>. The
+     * argument which the user is attempting to complete is always the last argument. If the user is attempting to
+     * complete the first argument, <code>arguments</code> will contain a single entry that is an empty String, i.e.
+     * <code>arguments</code> will always have length >= 1, and will never contain <code>null</code> entries.
+     * 
+     * @param subCommand The subCommand, or <code>null</code> if there is no sub-command.
+     * 
+     * @param arguments The arguments that the user has entered thus far
+     * 
+     * @return The completion candidates. If there are no candidates, an empty array is returned, <strong>not</strong>
+     *         null.
+     */
+    List<String> getCompletionCandidates(String subCommand, String... arguments);
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/CommandExecutor.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/CommandExecutor.java
new file mode 100644
index 0000000..5c6774b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/CommandExecutor.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * This file is part of the Virgo Web Server.
+ *
+ * Copyright (c) 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    SpringSource, a division of VMware - initial API and implementation and/or initial documentation
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell;
+
+import java.io.IOException;
+
+/**
+ * Interface for service to allow kernel commands to be invoked from the user-region
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ * implementations must be thread-safe
+ *
+ * @author Steve Powell
+ */
+public interface CommandExecutor {
+    
+    /**
+     * Execute the given command with the supplied parameters, and output results serially on the linePrinter.
+     * @param commandLine the command line to execute
+     * @param linePrinter the linePrinter to use for outputting results of executing the command
+     * @return false if the command requests termination of execution context; true otherwise
+     * @throws IOException if linePrinter does; otherwise should throw unchecked exceptions for command failures
+     */
+    boolean execute(String commandLine, LinePrinter linePrinter) throws IOException;
+
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/Converter.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/Converter.java
new file mode 100644
index 0000000..6a11f1a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/Converter.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright (c) OSGi Alliance (2008). All Rights Reserved.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.eclipse.virgo.shell;
+
+/**
+ * A converter is a service that can help create specific object types from a
+ * string, and vice versa.
+ * 
+ * The shell is capable of coercing arguments to the their proper type. However,
+ * sometimes commands require extra help to do this conversion. This service can
+ * implement a converter for a number of types.
+ * 
+ * The command shell will rank these services in order of service.ranking and
+ * will then call them until one of the converters succeeds.
+ * 
+ * TODO The javadoc in this class need a good scrub before release.
+ * 
+ * @ThreadSafe
+ * @version $Revision: 5654 $
+ */
+public interface Converter {
+        /**
+         * This property is a string, or array of strings, and defines the classes
+         * or interfaces that this converter recognises. Recognised classes can be
+         * converted from a string to a class and they can be printed in 3 different
+         * modes.
+         */
+        String CONVERTER_CLASSES = "osgi.converter.classes";
+
+        /**
+         * Print the object in detail. This can contain multiple lines.
+         */
+        int INSPECT = 0;
+
+        /**
+         * Print the object as a row in a table. The columns should align for
+         * multiple objects printed beneath each other. The print may run over
+         * multiple lines but must not end in a CR.
+         */
+        int LINE = 1;
+
+        /**
+         * Print the value in a small format so that it is identifiable. This
+         * printed format must be recognisable by the conversion method.
+         */
+        int PART = 2;
+
+        /**
+         * Convert an object to the desired type.
+         * 
+         * Return null if the conversion can not be done. Otherwise return and
+         * object that extends the desired type or implements it.
+         * 
+         * @param desiredType The type that the returned object can be assigned to
+         * @param in The object that must be converted
+         * @return An object that can be assigned to the desired type or null.
+         * @throws Exception
+         */
+        Object convert(Class<?> desiredType, Object in) throws Exception;
+
+        /**
+         * Convert an object to a CharSequence object in the requested format. The
+         * format can be INSPECT, LINE, or PART. Other values must throw
+         * IllegalArgumentException.
+         * 
+         * @param target The object to be converted to a String
+         * @param level One of INSPECT, LINE, or PART.
+         * @param escape Use this object to format sub ordinate objects.
+         * @return A printed object of potentially multiple lines
+         * @throws Exception
+         */
+        CharSequence format(Object target, int level, Converter escape)
+                        throws Exception;
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/LinePrinter.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/LinePrinter.java
new file mode 100644
index 0000000..19252d3
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/LinePrinter.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * This file is part of the Virgo Web Server.
+ *
+ * Copyright (c) 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    SpringSource, a division of VMware - initial API and implementation and/or initial documentation
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell;
+
+import java.io.IOException;
+
+/**
+ * An interface used to output lines serially
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ * Implementations should be thread-safe
+ *
+ * @author Steve Powell
+ */
+public interface LinePrinter {
+    
+    /**
+     * Print the string as a single line. May contain newline characters, but should not end with one.
+     * @param line the line to print
+     * @return self, as an aid to chaining
+     * @throws IOException to indicate printing failures
+     */
+    LinePrinter println(String line) throws IOException;
+
+    /**
+     * Print an empty line.
+     * @return self, as an aid to chaining
+     * @throws IOException to indicate printing failures
+     */
+    LinePrinter println() throws IOException;
+
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/AnnotationBasedCommandResolver.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/AnnotationBasedCommandResolver.java
new file mode 100644
index 0000000..fa02811
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/AnnotationBasedCommandResolver.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal;
+
+import java.lang.reflect.AnnotatedElement;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.virgo.shell.Command;
+import org.osgi.framework.ServiceReference;
+
+
+/**
+ * <p>
+ * A <code>CommandResolver</code> that examines the OSGi service for {@link Command} annotations to resolve the
+ * service's commands.
+ * </p>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ * 
+ */
+final class AnnotationBasedCommandResolver implements CommandResolver {
+
+    public List<CommandDescriptor> resolveCommands(ServiceReference<?> serviceReference, Object object) {
+        List<CommandDescriptor> commandDescriptors = new ArrayList<CommandDescriptor>();
+
+        Class<? extends Object> clazz = object.getClass();
+        String commandName = getCommandName(clazz);
+
+        if (commandName != null) {
+            while (clazz != null) {
+                commandDescriptors.addAll(resolveCommands(clazz, object, commandName));
+                clazz = clazz.getSuperclass();
+            }
+        }
+
+        return commandDescriptors;
+    }
+    
+    private List<CommandDescriptor> resolveCommands(Class<?> clazz, Object object, String commandName) {
+        List<CommandDescriptor> commandDescriptors = new ArrayList<CommandDescriptor>();
+        
+        for (Method method : clazz.getDeclaredMethods()) {
+            String subCommandName = getCommandName(method);
+
+            if (subCommandName != null) {
+                commandDescriptors.add(new CommandDescriptor(commandName, subCommandName, method, object));
+            }
+        }
+        
+        return commandDescriptors;
+    }
+
+    private String getCommandName(AnnotatedElement annotatedElement) {
+        Command command = annotatedElement.getAnnotation(Command.class);
+
+        if (command == null) {
+            return null;
+        } else {
+            return command.value();
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/CommandDescriptor.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/CommandDescriptor.java
new file mode 100644
index 0000000..82153da
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/CommandDescriptor.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal;
+
+import java.lang.reflect.Method;
+
+/**
+ * A <code>CommandDescriptor</code> describes a command that is known to the Shell.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *  Thread-safe.
+ *
+ */
+public final class CommandDescriptor {
+    
+    private final String commandName;
+    
+    private final String subCommandName;
+    
+    private final Method method;
+    
+    private final Object target;
+    
+    CommandDescriptor(String commandName, String subCommandName, Method method, Object target) {
+        this.commandName = commandName;
+        this.subCommandName = subCommandName;
+        this.method = method;
+        this.target = target;
+    }
+    
+    public String toString() {
+        StringBuilder builder = new StringBuilder();
+        builder.append(commandName).append(" ").append(subCommandName).append(" ").append(method);
+        return builder.toString();
+    }
+    
+    public String getCommandName() {
+        return commandName;
+    }
+
+    
+    public String getSubCommandName() {
+        return subCommandName;
+    }
+    
+    public Method getMethod() {
+        return method;
+    }
+    
+    public Object getTarget() {
+        return target;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/CommandInvoker.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/CommandInvoker.java
new file mode 100644
index 0000000..d1c7dca
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/CommandInvoker.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal;
+
+import java.util.List;
+
+import org.eclipse.virgo.shell.internal.parsing.ParsedCommand;
+
+
+
+/**
+ * A <code>CommandInvoker</code> is used to invoke a command once it has been parsed.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Implementations <strong>must</strong> be thread-safe.
+ *
+ */
+public interface CommandInvoker {
+    
+    /**
+     * Invokes the supplied <code>command</code>.
+     * @param command the command to invoke
+     * @return the result of invoking the command
+     * @throws CommandNotFoundException if a matching command could not be found
+     * @throws ParametersMismatchException if the command has too few parameters
+     */
+    List<String> invokeCommand(ParsedCommand command) throws CommandNotFoundException, ParametersMismatchException;
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/CommandNotFoundException.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/CommandNotFoundException.java
new file mode 100644
index 0000000..d8c2638
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/CommandNotFoundException.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal;
+
+
+/**
+ * Thrown to signal that a command that matches the supplied input could not be found.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Thread-safe.
+ *
+ * @see CommandInvoker#invokeCommand(org.eclipse.virgo.shell.internal.parsing.ParsedCommand)
+ */
+public class CommandNotFoundException extends Exception {
+    
+    private static final long serialVersionUID = -5788920220311337018L;
+
+    CommandNotFoundException() {
+        super();
+    }
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/CommandProcessor.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/CommandProcessor.java
new file mode 100644
index 0000000..92bfb32
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/CommandProcessor.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal;
+
+/**
+ * A command shell can create and maintain a number of command sessions.
+ */
+public interface CommandProcessor {
+
+    /**
+     * Create a new command session associated with err streams.
+     * <p/>
+     * The session is bound to the life cycle of the bundle getting this
+     * service. The session will be automatically closed when this bundle is
+     * stopped or the service is returned.
+     * <p/>
+     * The shell will provide any available commands to this session and
+     * can set additional variables.
+     *
+     * @return A new session.
+     */
+    CommandSession createSession();
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/CommandProviderResolver.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/CommandProviderResolver.java
new file mode 100644
index 0000000..0b50647
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/CommandProviderResolver.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal;
+
+/**
+ * A <code>CommandProviderResolver</code> is responsible for resolving
+ * command providers by command name.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Implementations must be thread-safe.
+ *
+ */
+public interface CommandProviderResolver {
+
+    /**
+     * Returns an Object that provides the command with the given <code>command</code> name.
+     * @param command The command for which a provider is required
+     * @return The provider of the command, or <code>null</code> if no provider exists.
+     */
+    public abstract Object getCommandProvider(String command);
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/CommandRegistry.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/CommandRegistry.java
new file mode 100644
index 0000000..306eace
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/CommandRegistry.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceEvent;
+import org.osgi.framework.ServiceListener;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * A <code>CommandRegistry</code> maintains a list of {@link CommandDescriptor CommandDescriptors} based on the contents
+ * of the OSGi service registry. Descriptors are created using a {@link CommandResolver}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ * 
+ */
+public final class CommandRegistry {
+
+    private final CommandResolver commandResolver;
+
+    private final BundleContext bundleContext;
+
+    private final List<CommandDescriptor> commandDescriptors = new ArrayList<CommandDescriptor>();
+
+    private final Map<ServiceReference<?>, List<CommandDescriptor>> commandDescriptorsByService = new HashMap<ServiceReference<?>, List<CommandDescriptor>>();
+
+    private final Object monitor = new Object();
+
+    private final CommandRegistryServiceListener commandRegistryServiceListener = new CommandRegistryServiceListener();
+
+    /**
+     * @param commandResolver
+     * @param bundleContext 
+     */
+    public CommandRegistry(CommandResolver commandResolver, BundleContext bundleContext) {
+        this.commandResolver = commandResolver;
+        this.bundleContext = bundleContext;
+    }
+
+    void initialize() {
+        // TODO Limit with a filter
+        this.bundleContext.addServiceListener(this.commandRegistryServiceListener);
+        try {
+            // TODO Limit with a filter
+            ServiceReference<?>[] serviceReferences = this.bundleContext.getServiceReferences((String)null, null);
+            if (serviceReferences != null) {
+                for (ServiceReference<?> serviceReference : serviceReferences) {
+                    serviceRegistered(serviceReference);
+                }
+            }
+        } catch (InvalidSyntaxException e) {
+            throw new RuntimeException("Unexpected InvalidSyntaxException", e);
+        }
+    }
+    
+    public List<CommandDescriptor> getCommandDescriptors() {
+        synchronized(this.monitor) { 
+            return new ArrayList<CommandDescriptor>(this.commandDescriptors);
+        }
+    }
+    
+
+    private void serviceRegistered(ServiceReference<?> serviceReference) {
+        Object service = bundleContext.getService(serviceReference);
+        if (service != null) {
+            List<CommandDescriptor> commands = commandResolver.resolveCommands(serviceReference, service);
+            if (!commands.isEmpty()) {
+                synchronized (this.monitor) {
+                    this.commandDescriptors.addAll(commands);
+                    this.commandDescriptorsByService.put(serviceReference, commands);
+                }
+            }
+        }
+    }
+
+    private void serviceUnregistering(ServiceReference<?> serviceReference) {
+        synchronized (this.monitor) {
+            List<CommandDescriptor> commandDescriptorsForService = this.commandDescriptorsByService.remove(serviceReference);
+            if (commandDescriptorsForService != null) {
+                this.commandDescriptors.removeAll(commandDescriptorsForService);
+            }
+        }
+    }
+
+    private final class CommandRegistryServiceListener implements ServiceListener {
+
+        /**
+         * {@inheritDoc}
+         */
+        public void serviceChanged(ServiceEvent event) {
+            if (ServiceEvent.REGISTERED == event.getType()) {
+                serviceRegistered(event.getServiceReference());
+            } else if (ServiceEvent.UNREGISTERING == event.getType()) {
+                serviceUnregistering(event.getServiceReference());
+            }
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/CommandRegistryCommandInvoker.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/CommandRegistryCommandInvoker.java
new file mode 100644
index 0000000..8ae6199
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/CommandRegistryCommandInvoker.java
@@ -0,0 +1,174 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.virgo.shell.Converter;
+import org.eclipse.virgo.shell.internal.converters.ConverterRegistry;
+import org.eclipse.virgo.shell.internal.parsing.ParsedCommand;
+import org.springframework.util.ReflectionUtils;
+
+
+/**
+ * A <code>CommandInvoker</code> implementation that finds the command to invoke from a {@link CommandRegistry}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ * 
+ */
+final class CommandRegistryCommandInvoker implements CommandInvoker {
+
+    private final CommandRegistry commandRegistry;
+
+    private final ConverterRegistry converterRegistry;
+
+    /**
+     * @param commandRegistry
+     * @param converterRegistry
+     */
+    CommandRegistryCommandInvoker(CommandRegistry commandRegistry, ConverterRegistry converterRegistry) {
+        this.commandRegistry = commandRegistry;
+        this.converterRegistry = converterRegistry;
+    }
+
+    public List<String> invokeCommand(ParsedCommand command) throws CommandNotFoundException, ParametersMismatchException {
+        List<CommandDescriptor> commands = commandsOfCommandName(this.commandRegistry, command.getCommand());
+
+        if (commands.isEmpty()) {
+            throw new CommandNotFoundException();
+        }
+
+        String[] arguments = command.getArguments();
+
+        String subcommandName = extractSubcommand(arguments);
+
+        String[] subcommandArguments = extractSubcommandArguments(arguments);
+
+        ParametersMismatchException lastException = null;
+
+        for (CommandDescriptor commandDescriptor : commands) {
+            List<String> objResult = null;
+            String commandSubcommandName = commandDescriptor.getSubCommandName();
+            String commandString = commandDescriptor.getCommandName();
+            try {
+                if (commandSubcommandName != null && !commandSubcommandName.equals("")) {
+                    if (isSubcommandMatch(commandSubcommandName, subcommandName)) {
+                        commandString += " " + subcommandName;
+                        objResult = attemptExecution(commandDescriptor, subcommandArguments);
+                        return objResult;
+                    }
+                } else {
+                    objResult = attemptExecution(commandDescriptor, arguments);
+                    return objResult;
+                }
+            } catch (ParametersMismatchException e) {
+                lastException = new ParametersMismatchException("Command " + commandString + ": " + e.getMessage());
+            }
+        }
+
+        if (lastException != null) {
+            throw lastException;
+        }
+
+        throw new ParametersMismatchException("Command '" + command.getCommand() + "' expects a subcommand; try help vsh:" + command.getCommand());
+    }
+
+    private static boolean isSubcommandMatch(String commandSubcommandName, String subcommandName) {
+        if (subcommandName == null) {
+            return false;
+        }
+        if (commandSubcommandName != null) {
+            if (commandSubcommandName.equals(subcommandName)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private static String[] extractSubcommandArguments(String[] arguments) {
+        if (arguments.length > 0) {
+            String[] result = new String[arguments.length - 1];
+            System.arraycopy(arguments, 1, result, 0, result.length);
+            return result;
+        }
+        return null;
+    }
+
+    private static String extractSubcommand(String[] arguments) {
+        if (arguments.length > 0) {
+            return arguments[0];
+        }
+        return null;
+    }
+
+    @SuppressWarnings("unchecked")
+    private List<String> attemptExecution(CommandDescriptor commandDescriptor, String[] arguments) throws ParametersMismatchException {
+        Method method = commandDescriptor.getMethod();
+
+        Object[] convertedArguments = convertArguments(method, arguments);
+
+        ReflectionUtils.makeAccessible(method);
+        return (List<String>) ReflectionUtils.invokeMethod(method, commandDescriptor.getTarget(), convertedArguments);
+    }
+
+    private static List<CommandDescriptor> commandsOfCommandName(final CommandRegistry commandRegistry, final String commandName) {
+        List<CommandDescriptor> commands = new ArrayList<CommandDescriptor>();
+        for (CommandDescriptor commandDescriptor : commandRegistry.getCommandDescriptors()) {
+            if (commandDescriptor.getCommandName().equals(commandName)) {
+                commands.add(commandDescriptor);
+            }
+        }
+        return commands;
+    }
+
+    private Object[] convertArguments(final Method method, final String[] arguments) throws ParametersMismatchException {
+        Class<?>[] parameterTypes = method.getParameterTypes();
+
+        if (parameterTypes.length != arguments.length) {
+            throw new ParametersMismatchException("Incorrect number of parameters");
+        }
+
+        Object[] parameters = new Object[parameterTypes.length];
+
+        for (int i = 0; i < parameterTypes.length; i++) {
+
+            Object convertedParameter = convertArgument(arguments[i], parameterTypes[i]);
+
+            if (convertedParameter != null) {
+                parameters[i] = convertedParameter;
+            } else {
+                throw new ParametersMismatchException("Cannot convert parameter " + i + ".");
+            }
+        }
+
+        return parameters;
+    }
+
+    private Object convertArgument(final String argument, Class<?> type) {
+        Converter converter = this.converterRegistry.getConverter(type);
+
+        if (converter == null) {
+            return null;
+        }
+
+        try {
+            return converter.convert(type, argument);
+        } catch (Exception e) {
+            return null;
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/CommandResolver.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/CommandResolver.java
new file mode 100644
index 0000000..40c61dc
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/CommandResolver.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal;
+
+import java.util.List;
+
+import org.osgi.framework.ServiceReference;
+
+/**
+ * A <code>CommandResolver</code> is used to resolve Shell commands provided by an OSGi service. The mechanism by which
+ * commands are resolved for a service are a detail of the implementation.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Implementations <strong>must</strong> be thread-safe.
+ * 
+ */
+interface CommandResolver {
+
+    /**
+     * Resolve commands from the supplied {@link ServiceReference} and <code>service</code>
+     * 
+     * @param serviceReference The reference to the service
+     * @param service The service
+     * @return A <code>List</code> of <code>CommandDescriptor</code>s or an empty list if no commands were found
+     */
+    List<CommandDescriptor> resolveCommands(ServiceReference<?> serviceReference, Object service);
+
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/CommandSession.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/CommandSession.java
new file mode 100644
index 0000000..8e62cbc
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/CommandSession.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal;
+
+
+import java.util.List;
+
+/**
+ * This can take a typed command and figure out the correct Command to call or Completer to use if the command is not recognised.
+ * 
+ * Implementations should be threadsafe
+ * 
+ */
+interface CommandSession
+{
+    /**
+     * Execute a program in this session.
+     *
+     * @param commandline
+     * @return the result of the execution
+     * @throws Exception 
+     */
+    List<String> execute(CharSequence commandline) throws Exception;
+
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/CompoundCommandResolver.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/CompoundCommandResolver.java
new file mode 100644
index 0000000..f0bd4e3
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/CompoundCommandResolver.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.osgi.framework.ServiceReference;
+
+/**
+ * A <code>CommandResolver</code> that combines results from one or more delegates. 
+ * 
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ * 
+ */
+final class CompoundCommandResolver implements CommandResolver {
+
+    private final CommandResolver[] commandResolvers;
+
+    CompoundCommandResolver(CommandResolver... commandResolvers) {
+        this.commandResolvers = commandResolvers;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public List<CommandDescriptor> resolveCommands(ServiceReference<?> serviceReference, Object service) {
+        List<CommandDescriptor> commandDescriptors = new ArrayList<CommandDescriptor>();
+
+        for (CommandResolver commandResolver : commandResolvers) {
+            commandDescriptors.addAll(commandResolver.resolveCommands(serviceReference, service));
+        }
+
+        return commandDescriptors;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/LocalInputOutputManager.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/LocalInputOutputManager.java
new file mode 100644
index 0000000..54b4779
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/LocalInputOutputManager.java
@@ -0,0 +1,123 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal;
+
+import java.io.FileDescriptor;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.io.PrintStream;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+
+import org.eclipse.virgo.medic.log.DelegatingPrintStream;
+
+
+/**
+ * <p>
+ * LocalInputOutputManager can grab the system input and output streams from the service registry and block and release them
+ * </p>
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * LocalInputOutputManager is thread safe
+ *
+ */
+public final class LocalInputOutputManager {
+    
+    private static final String SERVICE_FILTER_SYSERR_DELEGATE = "(org.eclipse.virgo.medic.log.printStream=delegating.System.err)";
+
+    private static final String SERVICE_FILTER_SYSOUT_DELEGATE = "(org.eclipse.virgo.medic.log.printStream=delegating.System.out)";
+    
+    private final InputStream in;
+    
+    private final PrintStream out;
+    
+    private final PrintStream err;         
+    
+    private final DelegatingPrintStream delegatingSysOut;
+    
+    private final DelegatingPrintStream delegatingSysErr;
+    
+    public LocalInputOutputManager(BundleContext bundleContext) {
+        this.in = new FileInputStream(FileDescriptor.in);
+        
+        this.out = getPrintStreamFromServiceRegistry(bundleContext, "(org.eclipse.virgo.medic.log.printStream=System.out)");
+        this.err = getPrintStreamFromServiceRegistry(bundleContext, "(org.eclipse.virgo.medic.log.printStream=System.err)");
+        
+        this.delegatingSysOut = getDelegatingPrintStreamFromServiceRegistry(bundleContext,SERVICE_FILTER_SYSOUT_DELEGATE);
+        this.delegatingSysErr = getDelegatingPrintStreamFromServiceRegistry(bundleContext,SERVICE_FILTER_SYSERR_DELEGATE);            
+    }
+    
+    /**
+     * 
+     */
+    public void grabSystemIO() {
+        this.delegatingSysOut.setDelegate(null);
+        this.delegatingSysErr.setDelegate(null);                
+    }
+    
+    /**
+     * 
+     */
+    public void releaseSystemIO() {
+        this.delegatingSysOut.setDelegate(this.out);
+        this.delegatingSysErr.setDelegate(this.err);        
+    }
+
+    /**
+     * Get the original {@link PrintStream} for the local command line
+     * @return PrintStream
+     */
+    public PrintStream getErr() {
+        return err;
+    }
+
+    /**
+     * Get the original {@link PrintStream} for the local command line
+     * @return PrintStream
+     */
+    public PrintStream getOut() {
+        return out;
+    }
+
+    /**
+     * Get the original {@link InputStream} for the local command line
+     * @return InputStream
+     */
+    public InputStream getIn() {
+        return in;
+    }
+
+    private static PrintStream getPrintStreamFromServiceRegistry(BundleContext bundleContext, String filter) {
+        return (PrintStream) getService(PrintStream.class, bundleContext, filter);
+    }
+    
+    private static DelegatingPrintStream getDelegatingPrintStreamFromServiceRegistry(BundleContext bundleContext, String filter) {
+        return (DelegatingPrintStream) getService(DelegatingPrintStream.class, bundleContext, filter);
+    }
+    
+    private static Object getService(Class<?> clazz, BundleContext bundleContext, String filter) {
+        ServiceReference<?>[] serviceReferences;
+        try {
+            serviceReferences = bundleContext.getServiceReferences(clazz.getName(), filter);
+        } catch (InvalidSyntaxException e) {
+            throw new RuntimeException("Unexpected InvalidSyntaxException", e);
+        }
+        if (serviceReferences != null && serviceReferences.length > 0) {
+            return bundleContext.getService(serviceReferences[0]);
+        } else {
+            return null;
+        }
+    }    
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/ParametersMismatchException.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/ParametersMismatchException.java
new file mode 100644
index 0000000..177a34c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/ParametersMismatchException.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal;
+
+
+/**
+ * An exception thrown when a command to be invoked has incorrect parameters.
+ * This might be too many, too few, or the wrong types.
+ * <p />
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread-safe
+ *
+ */
+public class ParametersMismatchException extends Exception {
+
+    private static final long serialVersionUID = -1264972215460449046L;
+
+    /**
+     * 
+     */
+    public ParametersMismatchException() {
+    }
+    
+    /**
+     * @param message Exception detail -- in this case the nature of the mismatch
+     */
+    public ParametersMismatchException(String message) {
+        super(message);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/ServiceUtils.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/ServiceUtils.java
new file mode 100644
index 0000000..aa6fe3a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/ServiceUtils.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * Utility methods for working with services in the OSGi service registry.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Thread-safe.
+ *
+ */
+public final class ServiceUtils {
+    
+    private static final Logger LOGGER = LoggerFactory.getLogger(ServiceUtils.class);
+    
+    public static <T> T getService(BundleContext bundleContext, Class<T> clazz, String requiredProperty, String requiredPropertyValue) {
+        T result = null;
+        try {
+            ServiceReference<?>[] serviceReferences = bundleContext.getServiceReferences((String)null, String.format("(%s=*)", requiredProperty));
+            if (serviceReferences != null) {
+                for (ServiceReference<?> serviceReference : serviceReferences) {
+                    Object offeredPropertyValue = serviceReference.getProperty(requiredProperty);
+                    if (offeredPropertyValue instanceof String) { // String value
+                        String offeredProperty = (String) offeredPropertyValue;
+                        if (offeredProperty != null && requiredPropertyValue.equals(offeredProperty)) {
+                            Object potentialResult = bundleContext.getService(serviceReference);
+                            if (clazz.isInstance(potentialResult)) {
+                                result = clazz.cast(bundleContext.getService(serviceReference));
+                                break;
+                            }
+                        }
+                    } else if (offeredPropertyValue instanceof String[]) { // String[] value
+                        String[] offeredProperties = (String[]) offeredPropertyValue;
+                        if (offeredProperties != null && arrayContainsEntry(offeredProperties, requiredPropertyValue)) {
+                            Object potentialResult = bundleContext.getService(serviceReference);
+                            if (clazz.isInstance(potentialResult)) {
+                                result = clazz.cast(bundleContext.getService(serviceReference));
+                                break;
+                            }
+                        }
+                    } else {
+                        LOGGER.warn(String.format(
+                            "Matching service found from bundle %d but with a bad type for the '%s' property, String or String[] expected.",
+                            serviceReference.getBundle().getBundleId(), requiredProperty));
+                    }
+                }
+            }
+        } catch (InvalidSyntaxException e) {
+            throw new RuntimeException("Unexpected InvalidSyntaxException", e);
+        }
+
+        return result;
+    }
+    
+    private static <T> boolean arrayContainsEntry(T[] array, T entry) {
+        if (entry == null || array == null) {
+            return false;
+        }
+        for (T arrayEntry : array) {
+            if (arrayEntry != null && arrayEntry.equals(entry)) {
+                return true;
+            }
+        }
+        return false;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/SessionCommandExecutor.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/SessionCommandExecutor.java
new file mode 100644
index 0000000..11741a4
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/SessionCommandExecutor.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * This file is part of the Virgo Web Server.
+ *
+ * Copyright (c) 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    SpringSource, a division of VMware - initial API and implementation and/or initial documentation
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.eclipse.virgo.shell.CommandExecutor;
+import org.eclipse.virgo.shell.LinePrinter;
+
+/**
+ * Implementation of {@link CommandExecutor} that uses a {@link CommandSession} to execute commands.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ * thread-safe
+ *
+ * @author Steve Powell
+ */
+public class SessionCommandExecutor implements CommandExecutor {
+
+    private final static String EXIT_COMMAND = "exit";
+    
+    private final CommandSession commandSession;
+    
+    SessionCommandExecutor(CommandSession commandSession) {
+        this.commandSession = commandSession;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public boolean execute(String commandLine, LinePrinter linePrinter) throws IOException {
+        if (commandLine!=null) {
+            commandLine = commandLine.trim();
+            if (commandLine.length()>0) {
+                if (EXIT_COMMAND.equalsIgnoreCase(commandLine)) {
+                    return false;
+                } else {
+                    try {
+                        List<String> executionResult = this.commandSession.execute(commandLine);
+                        if (executionResult == null) {
+                            linePrinter.println(String.format("Null result returned for '%s'", commandLine));
+                        } else {
+                            printList(linePrinter, executionResult);
+                        }
+                    } catch (Exception e) {
+                        linePrinter.println(String.format("%s while executing command '%s': '%s'", e.getClass().getName(), commandLine,
+                            e.getMessage()));
+                    }
+                }
+            }
+        }
+        return true;
+    }
+    
+    private static void printList(LinePrinter linePrinter, List<String> executionResult) throws IOException {
+        linePrinter.println();
+        for (String line : executionResult) {
+            linePrinter.println(line);
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/SingleSessionCommandExecutor.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/SingleSessionCommandExecutor.java
new file mode 100644
index 0000000..f0cc011
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/SingleSessionCommandExecutor.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * This file is part of the Virgo Web Server.
+ *
+ * Copyright (c) 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    SpringSource, a division of VMware - initial API and implementation and/or initial documentation
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal;
+
+import java.io.IOException;
+
+import org.eclipse.virgo.shell.CommandExecutor;
+import org.eclipse.virgo.shell.LinePrinter;
+
+/**
+ * Implementation of {@link CommandExecutor} which executes a single command in a new session.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ * thread-safe
+ *
+ * @author Steve Powell
+ */
+public class SingleSessionCommandExecutor implements CommandExecutor {
+
+    private final CommandProcessor commandProcessor;
+    
+    SingleSessionCommandExecutor(CommandProcessor commandProcessor) {
+        this.commandProcessor = commandProcessor;
+    }
+    
+    /** 
+     * {@inheritDoc}
+     */
+    public boolean execute(String commandLine, LinePrinter linePrinter) throws IOException {
+        CommandExecutor sessionCommandExecutor = new SessionCommandExecutor(this.commandProcessor.createSession());
+        return sessionCommandExecutor.execute(commandLine, linePrinter);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/StandardCommandProcessor.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/StandardCommandProcessor.java
new file mode 100644
index 0000000..4d6d74b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/StandardCommandProcessor.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal;
+
+/**
+ * <p>
+ * StandardCommandProcessor 
+ * </p>
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * StandardCommandProcessor is Thread safe
+ *
+ */
+final class StandardCommandProcessor implements CommandProcessor {
+    
+    private final CommandInvoker commandInvoker;
+
+    /**
+     * @param commandInvoker
+     */
+    StandardCommandProcessor(CommandInvoker commandInvoker) {
+        this.commandInvoker = commandInvoker;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public CommandSession createSession() {
+        return new StandardCommandSession(commandInvoker);
+    }      
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/StandardCommandSession.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/StandardCommandSession.java
new file mode 100644
index 0000000..fdcfb1b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/StandardCommandSession.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.virgo.shell.internal.parsing.ParsedCommand;
+import org.eclipse.virgo.shell.internal.parsing.ParsingUtils;
+
+/**
+ * The standard implementation of {@link CommandSession}
+ * </p>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * threadsafe
+ * 
+ */
+final class StandardCommandSession implements CommandSession {
+
+    private final CommandInvoker commandInvoker;
+
+    StandardCommandSession(CommandInvoker commandInvoker) {
+        this.commandInvoker = commandInvoker;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public List<String> execute(CharSequence commandLine) {
+        ParsedCommand command = ParsingUtils.parseCommand(commandLine);
+
+        if (command == null) {
+            return null;
+        }
+
+        try {
+            return this.commandInvoker.invokeCommand(command);
+        } catch (CommandNotFoundException cnfe) {
+            return Arrays.asList(String.format("No command found for input %s", command));
+        } catch (ParametersMismatchException pme) {
+            return Arrays.asList(pme.getMessage());
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/commands/AbstractInstallArtifactBasedCommands.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/commands/AbstractInstallArtifactBasedCommands.java
new file mode 100644
index 0000000..2bad2be
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/commands/AbstractInstallArtifactBasedCommands.java
@@ -0,0 +1,186 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.commands;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.lang.management.ManagementFactory;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Set;
+
+import javax.management.InstanceNotFoundException;
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+
+import org.osgi.framework.Version;
+
+import org.eclipse.virgo.kernel.model.management.ManageableArtifact;
+import org.eclipse.virgo.kernel.model.management.RuntimeArtifactModelObjectNameCreator;
+import org.eclipse.equinox.region.Region;
+import org.eclipse.equinox.region.RegionDigraph;
+import org.eclipse.virgo.shell.Command;
+import org.eclipse.virgo.shell.internal.formatting.InstallArtifactCommandFormatter;
+import org.eclipse.virgo.shell.internal.util.ArtifactRetriever;
+
+/**
+ * An abstract class that handles the methods that are delegated to an install artifact.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread-safe
+ * 
+ */
+abstract class AbstractInstallArtifactBasedCommands<T extends ManageableArtifact> {
+
+    private static final String NO_ARTIFACT_FOR_NAME_AND_VERSION = "No %s with name '%s' and version '%s' in Region '%s' was found";
+
+    private final MBeanServer server = ManagementFactory.getPlatformMBeanServer();
+
+    private final String type;
+
+    private final RuntimeArtifactModelObjectNameCreator objectNameCreator;
+
+    private final InstallArtifactCommandFormatter<T> formatter;
+
+    private final ArtifactRetriever<T> artifactRetriever;
+
+    private final RegionDigraph regionDigraph;
+
+    public AbstractInstallArtifactBasedCommands(String type, RuntimeArtifactModelObjectNameCreator objectNameCreator, InstallArtifactCommandFormatter<T> formatter, Class<T> artifactType, RegionDigraph regionDigraph) {
+        this.type = type;
+        this.objectNameCreator = objectNameCreator;
+        this.formatter = formatter;
+        this.artifactRetriever = new ArtifactRetriever<T>(type, objectNameCreator, artifactType);
+        this.regionDigraph = regionDigraph;
+    }
+
+    @Command("list")
+    public List<String> list() {
+        Set<ObjectName> objectNames = this.server.queryNames(this.objectNameCreator.createArtifactsOfTypeQuery(this.type), null);
+        List<T> artifacts = new ArrayList<T>(objectNames.size());
+        for (ObjectName objectName : objectNames) {
+            try {
+                artifacts.add(this.artifactRetriever.getArtifact(objectName));
+            } catch (InstanceNotFoundException e) {
+                // Swallow to allow other to proceed
+            }
+        }
+
+        return this.formatter.formatList(artifacts);
+    }
+
+    @Command("examine")
+    public List<String> examine(String name, String versionString, String regionName) {
+        Version convertToVersion = convertToVersion(versionString);
+		Region convertToRegion = convertToRegion(regionName);
+        try {
+			return this.formatter.formatExamine(this.artifactRetriever.getArtifact(name, convertToVersion, convertToRegion));
+        } catch (IllegalArgumentException iae) {
+            return Arrays.asList(iae.getMessage());
+        } catch (InstanceNotFoundException infe) {
+            return Arrays.asList(infe.getMessage());
+        }
+    }
+
+    protected List<String> getDoesNotExistMessage(String type, String name, String version, String regionName) {
+        return Arrays.asList(String.format(NO_ARTIFACT_FOR_NAME_AND_VERSION, type, name, version, regionName));
+    }
+
+    @Command("start")
+    public List<String> start(String name, String version, String regionName) {
+        try {
+            this.artifactRetriever.getArtifact(name, convertToVersion(version), convertToRegion(regionName)).start();
+            return Arrays.asList(String.format("%s %s:%s started successfully", this.type, name, version));
+        } catch (IllegalArgumentException iae) {
+            return Arrays.asList(iae.getMessage());
+        } catch (InstanceNotFoundException e) {
+            return getDoesNotExistMessage(this.type, name, version, regionName);
+        } catch (Exception e) {
+            return Arrays.asList(String.format("%s %s:%s start failed", this.type, name, version), "", "", formatException(e));
+        }
+    }
+
+    @Command("stop")
+    public List<String> stop(String name, String version, String regionName) {
+        try {
+            this.artifactRetriever.getArtifact(name, convertToVersion(version), convertToRegion(regionName)).stop();
+            return Arrays.asList(String.format("%s %s:%s stopped successfully", this.type, name, version));
+        } catch (IllegalArgumentException iae) {
+            return Arrays.asList(iae.getMessage());
+        } catch (InstanceNotFoundException e) {
+            return getDoesNotExistMessage(this.type, name, version, regionName);
+        } catch (Exception e) {
+            return Arrays.asList(String.format("%s %s:%s stop failed", this.type, name, version), "", "", formatException(e));
+        }
+    }
+
+    @Command("refresh")
+    public List<String> refresh(String name, String version, String regionName) {
+        try {
+            if (this.artifactRetriever.getArtifact(name, convertToVersion(version), convertToRegion(regionName)).refresh()) {
+                return Arrays.asList(String.format("%s %s:%s refreshed successfully", this.type, name, version));
+            } else {
+                return Arrays.asList(String.format("%s %s:%s not refreshed, no changes made", this.type, name, version));
+            }
+        } catch (IllegalArgumentException iae) {
+            return Arrays.asList(iae.getMessage());
+        } catch (InstanceNotFoundException e) {
+            return getDoesNotExistMessage(this.type, name, version, regionName);
+        } catch (Exception e) {
+            return Arrays.asList(String.format("%s %s:%s refresh failed", this.type, name, version), "", "", formatException(e));
+        }
+    }
+
+    @Command("uninstall")
+    public List<String> uninstall(String name, String version, String regionName) {
+        try {
+            this.artifactRetriever.getArtifact(name, convertToVersion(version), convertToRegion(regionName)).uninstall();
+            return Arrays.asList(String.format("%s %s%s uninstalled successfully", this.type, name, version));
+        } catch (IllegalArgumentException iae) {
+            return Arrays.asList(iae.getMessage());
+        } catch (InstanceNotFoundException e) {
+            return getDoesNotExistMessage(this.type, name, version, regionName);
+        } catch (Exception e) {
+            return Arrays.asList(String.format("%s %s:%s uninstall failed", this.type, name, version), "", "", formatException(e));
+        }
+    }
+
+    protected final ArtifactRetriever<T> getArtifactRetriever() {
+        return this.artifactRetriever;
+    }
+
+    private String formatException(Exception e) {
+        StringWriter formattedException = new StringWriter();
+        PrintWriter writer = new PrintWriter(formattedException);
+        e.printStackTrace(writer);
+
+        return formattedException.toString();
+    }
+
+    static Version convertToVersion(String versionString) {
+        try {
+            return new Version(versionString);
+        } catch (IllegalArgumentException iae) {
+            throw new IllegalArgumentException(String.format("'%s' is not a valid version", versionString));
+        }
+    }
+
+    protected final Region convertToRegion(String regionName) {
+        try {
+            return this.regionDigraph.getRegion(regionName);
+        } catch (IllegalArgumentException iae) {
+            throw new IllegalArgumentException(String.format("'%s' is not a valid Region name", regionName));
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/commands/BundleCommands.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/commands/BundleCommands.java
new file mode 100644
index 0000000..fa5ca3d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/commands/BundleCommands.java
@@ -0,0 +1,155 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.commands;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.equinox.region.RegionDigraph;
+import org.eclipse.virgo.kernel.model.management.ManageableArtifact;
+import org.eclipse.virgo.kernel.model.management.RuntimeArtifactModelObjectNameCreator;
+import org.eclipse.virgo.kernel.module.ModuleContextAccessor;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiBundle;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiResolutionFailure;
+import org.eclipse.virgo.shell.Command;
+import org.eclipse.virgo.shell.internal.formatting.BundleInstallArtifactCommandFormatter;
+import org.eclipse.virgo.shell.internal.util.QuasiBundleUtil;
+import org.eclipse.virgo.shell.internal.util.QuasiServiceUtil;
+import org.osgi.framework.Version;
+
+/**
+ * <p>
+ * BundleCommands provides implementations of all the supported commands that can be 
+ * performed on a bundle or bundles. In some cases it can fall back to generic behaviour 
+ * in it super class {@link AbstractInstallArtifactBasedCommands}.
+ * </p>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * BundleCommands is threadsafe
+ * 
+ */
+@Command("bundle")
+final class BundleCommands extends AbstractInstallArtifactBasedCommands<ManageableArtifact> {
+
+    private static final String NO_BUNDLE_FOR_BUNDLE_ID = "No bundle with id '%s' was found";
+    
+    private static final String TYPE = "bundle";
+
+    private final BundleInstallArtifactCommandFormatter formatter;
+
+    private final QuasiBundleUtil quasiBundleUtil;
+
+    public BundleCommands(RuntimeArtifactModelObjectNameCreator objectNameCreator, QuasiBundleUtil quasiBundleUtil, QuasiServiceUtil quasiServiceUtil, ModuleContextAccessor moduleContextAccessor, RegionDigraph regionDigraph) {
+        super(TYPE, objectNameCreator, new BundleInstallArtifactCommandFormatter(regionDigraph, quasiBundleUtil, quasiServiceUtil, moduleContextAccessor), ManageableArtifact.class, regionDigraph);
+        this.quasiBundleUtil = quasiBundleUtil;
+        this.formatter = new BundleInstallArtifactCommandFormatter(regionDigraph, quasiBundleUtil, quasiServiceUtil, moduleContextAccessor);
+    }
+
+    @Command("examine")
+    public List<String> examine(long id) {
+        QuasiBundle bundle = this.quasiBundleUtil.getBundle(id);
+        if (bundle != null) {
+            return examine(bundle.getSymbolicName(), bundle.getVersion().toString(), bundle.getRegion().getName());
+        } else {
+            return Arrays.asList(String.format(NO_BUNDLE_FOR_BUNDLE_ID, id));
+        }
+    }
+
+    @Command("start")
+    public List<String> start(long id) {
+        QuasiBundle bundle = this.quasiBundleUtil.getBundle(id);
+        if (bundle != null) {
+            return start(bundle.getSymbolicName(), bundle.getVersion().toString(), bundle.getRegion().getName());
+        } else {
+            return Arrays.asList(String.format(NO_BUNDLE_FOR_BUNDLE_ID, id));
+        }
+    }
+
+    @Command("stop")
+    public List<String> stop(long id) {
+        QuasiBundle bundle = this.quasiBundleUtil.getBundle(id);
+        if (bundle != null) {
+            return stop(bundle.getSymbolicName(), bundle.getVersion().toString(), bundle.getRegion().getName());
+        } else {
+            return Arrays.asList(String.format(NO_BUNDLE_FOR_BUNDLE_ID, id));
+        }
+    }
+
+    @Command("refresh")
+    public List<String> refresh(long id) {
+        QuasiBundle bundle = this.quasiBundleUtil.getBundle(id);
+        if (bundle != null) {
+            return refresh(bundle.getSymbolicName(), bundle.getVersion().toString(), bundle.getRegion().getName());
+        } else {
+            return Arrays.asList(String.format(NO_BUNDLE_FOR_BUNDLE_ID, id));
+        }
+    }
+
+    @Command("uninstall")
+    public List<String> uninstall(long id) {
+        QuasiBundle bundle = this.quasiBundleUtil.getBundle(id);
+        if (bundle != null) {
+            return uninstall(bundle.getSymbolicName(), bundle.getVersion().toString(), bundle.getRegion().getName());
+        } else {
+            return Arrays.asList(String.format(NO_BUNDLE_FOR_BUNDLE_ID, id));
+        }
+    }
+
+    @Command("diag")
+    public List<String> diag(long id) {
+        QuasiBundle bundle = this.quasiBundleUtil.getBundle(id);
+        if (bundle != null) {
+            return diag(bundle.getSymbolicName(), bundle.getVersion().toString(), bundle.getRegion().getName());
+        } else {
+            return Arrays.asList(String.format(NO_BUNDLE_FOR_BUNDLE_ID, id));
+        }
+    }
+
+    @Command("diag")
+    public List<String> diag(String name, String version, String region) {
+        QuasiBundle bundle = getBundle(name, version, region);
+        if (bundle != null) {
+            List<QuasiResolutionFailure> resolverReport = this.quasiBundleUtil.getResolverReport(bundle.getBundleId());
+            return this.formatter.formatDiag(bundle, resolverReport);
+        } else {
+            return getDoesNotExistMessage(TYPE, name, version, region);
+        }
+    }
+
+    @Command("headers")
+    public List<String> headers(long id) {
+        QuasiBundle bundle = this.quasiBundleUtil.getBundle(id);
+        if (bundle != null) {
+            return headers(bundle.getSymbolicName(), bundle.getVersion().toString(), bundle.getRegion().getName());
+        } else {
+            return Arrays.asList(String.format(NO_BUNDLE_FOR_BUNDLE_ID, id));
+        }
+    }
+
+    @Command("headers")
+    public List<String> headers(String name, String version, String region) {
+        return this.formatter.formatHeaders(getBundle(name, version, region));
+    }
+
+    private QuasiBundle getBundle(String name, String version, String region) {
+        Version v = new Version(version);
+        List<QuasiBundle> bundles = this.quasiBundleUtil.getAllBundles();
+        for (QuasiBundle bundle : bundles) {
+            if (bundle.getSymbolicName().equals(name) && bundle.getVersion().equals(v) && bundle.getRegion().equals(region)) {
+                return bundle;
+            }
+        }
+        return null;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/commands/ConfigCommands.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/commands/ConfigCommands.java
new file mode 100644
index 0000000..36dbe4b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/commands/ConfigCommands.java
@@ -0,0 +1,123 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.commands;
+
+import java.util.Arrays;
+import java.util.List;
+
+import javax.management.InstanceNotFoundException;
+
+import org.osgi.framework.Version;
+import org.osgi.service.cm.ConfigurationAdmin;
+
+import org.eclipse.equinox.region.RegionDigraph;
+import org.eclipse.virgo.kernel.model.management.ManageableArtifact;
+import org.eclipse.virgo.kernel.model.management.RuntimeArtifactModelObjectNameCreator;
+import org.eclipse.virgo.shell.Command;
+import org.eclipse.virgo.shell.internal.formatting.ConfigInstallArtifactCommandFormatter;
+
+/**
+ * Commands for config artifacts.
+ * 
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ * 
+ */
+@Command("config")
+final class ConfigCommands extends AbstractInstallArtifactBasedCommands<ManageableArtifact> {
+
+    private static final String UNABLE_TO_EXAMINE_CONFIGURATION_IN_NON_ACTIVE_STATE = String.format("Unable to examine configuration in non-active state");
+
+    private static final String EMPTY_VERSION_STRING = Version.emptyVersion.toString();
+    
+    private static final String GLOBAL_REGION_NAME = "global";
+
+    private static final String TYPE = "configuration";
+
+    private static final String STATE_ACTIVE = "ACTIVE";
+
+    public ConfigCommands(RuntimeArtifactModelObjectNameCreator objectNameCreator, ConfigurationAdmin configurationAdmin, RegionDigraph regionDigraph) {
+        super(TYPE, objectNameCreator, new ConfigInstallArtifactCommandFormatter(configurationAdmin), ManageableArtifact.class, regionDigraph);
+    }
+
+    @Command("examine")
+    public List<String> examine(String name) {
+        return examine(name, EMPTY_VERSION_STRING, GLOBAL_REGION_NAME);
+    }
+
+    @Command("examine")
+    public List<String> examine(String name, String version) {
+        return examine(name, version, GLOBAL_REGION_NAME);
+    }
+
+    @Override
+    public List<String> examine(String name, String versionString, String regionName) {
+        ManageableArtifact artifact;
+
+        try {
+            artifact = getArtifactRetriever().getArtifact(name, convertToVersion(versionString), convertToRegion(regionName));
+        } catch (IllegalArgumentException iae) {
+            return Arrays.asList(iae.getMessage());
+        } catch (InstanceNotFoundException e) {
+            return getDoesNotExistMessage(TYPE, name, versionString, regionName);
+        }
+
+        if (STATE_ACTIVE.equals(artifact.getState())) {
+            return super.examine(name, versionString, regionName);
+        }
+        return Arrays.asList(UNABLE_TO_EXAMINE_CONFIGURATION_IN_NON_ACTIVE_STATE);
+    }
+
+    @Command("start")
+    public List<String> start(String name) {
+        return start(name, EMPTY_VERSION_STRING, GLOBAL_REGION_NAME);
+    }
+
+    @Command("start")
+    public List<String> start(String name, String version) {
+        return start(name, version, GLOBAL_REGION_NAME);
+    }
+
+    @Command("stop")
+    public List<String> stop(String name) {
+        return stop(name, EMPTY_VERSION_STRING, GLOBAL_REGION_NAME);
+    }
+
+    @Command("stop")
+    public List<String> stop(String name, String version) {
+        return stop(name, version, GLOBAL_REGION_NAME);
+    }
+
+    @Command("refresh")
+    public List<String> refresh(String name) {
+        return refresh(name, EMPTY_VERSION_STRING, GLOBAL_REGION_NAME);
+    }
+
+    @Command("refresh")
+    public List<String> refresh(String name, String version) {
+        return refresh(name, version, GLOBAL_REGION_NAME);
+    }
+
+    @Command("uninstall")
+    public List<String> uninstall(String name) {
+        return uninstall(name, EMPTY_VERSION_STRING, GLOBAL_REGION_NAME);
+    }
+    
+    @Command("uninstall")
+    public List<String> uninstall(String name, String version) {
+        return uninstall(name, version, GLOBAL_REGION_NAME);
+    }
+    
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/commands/ExitCommand.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/commands/ExitCommand.java
new file mode 100644
index 0000000..2b17113
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/commands/ExitCommand.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.commands;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.virgo.shell.Command;
+
+
+/**
+ * Provides a dummy place-holder for the exit command. <br/>
+ * Since the exit command is treated specially by the command processor, this implementation cannot be invoked from the
+ * shell. The existence of this definition implies that there can be help for it, which is automatically found and
+ * displayed (by help) and that another command for 'exit' cannot be defined without a clash.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Severely thread-safe.
+ * 
+ */
+@Command("exit")
+public class ExitCommand {
+
+    @Command("")
+    public List<String> exit() {
+        return Arrays.asList("No-op exit command called.");
+    }
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/commands/HelpCommand.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/commands/HelpCommand.java
new file mode 100644
index 0000000..727d70b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/commands/HelpCommand.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.commands;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.SortedMap;
+import java.util.TreeMap;
+
+import org.eclipse.virgo.shell.Command;
+import org.eclipse.virgo.shell.internal.CommandDescriptor;
+import org.eclipse.virgo.shell.internal.CommandRegistry;
+import org.eclipse.virgo.shell.internal.help.HelpAccessor;
+
+
+/**
+ * A Shell command that provides help information for all of the commands known to a {@link CommandRegistry}.
+ * 
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ * 
+ */
+@Command("help")
+final class HelpCommand {
+
+    private final CommandRegistry commandRegistry;
+
+    private final HelpAccessor helpAccessor;
+
+    HelpCommand(CommandRegistry commandRegistry, HelpAccessor helpAccessor) {
+        this.commandRegistry = commandRegistry;
+        this.helpAccessor = helpAccessor;
+    }
+
+    @Command("")
+    public List<String> summaryHelp() {
+        List<String> lines = new ArrayList<String>();
+
+        SortedMap<String, CommandDescriptor> topLevelCommands = getTopLevelCommands();
+        Set<String> sortedCommandNames = topLevelCommands.keySet();
+
+        int width = maxWidthOfCommandNames(sortedCommandNames);
+        String lineFormatNull = String.format("    %%-%ds", width);
+        String lineFormat = String.format("    %%-%ds - %%s", width);
+
+        lines.add("");
+
+        for (String commandName : sortedCommandNames) {
+            String commandHelp = this.helpAccessor.getSummaryHelp(topLevelCommands.get(commandName).getTarget().getClass());
+            if (commandHelp == null) {
+                lines.add(String.format(lineFormatNull, commandName));
+            } else {
+                lines.add(String.format(lineFormat, commandName, commandHelp));
+            }
+        }
+
+        lines.add("");
+
+        return lines;
+    }
+
+    private int maxWidthOfCommandNames(Set<String> keySet) {
+        int result = 0;
+        for (String key : keySet) {
+            if (result < key.length())
+                result = key.length();
+        }
+        return (result < 8 ? 8 : result);
+    }
+
+    @Command("")
+    public List<String> detailedHelp(String command) {
+
+        Map<String, CommandDescriptor> commandMap = getTopLevelCommands();
+        CommandDescriptor descriptor = commandMap.get(command);
+
+        if (descriptor == null) {
+            return Arrays.asList(String.format("No help is available as command '%s' is unknown", command));
+        }
+
+        List<String> detailedHelp = this.helpAccessor.getDetailedHelp(descriptor.getTarget().getClass());
+
+        if (detailedHelp == null || detailedHelp.size() == 0) {
+            return Arrays.asList(String.format("No help is available for command '%s'", command));
+        }
+
+        return detailedHelp;
+    }
+
+    private SortedMap<String, CommandDescriptor> getTopLevelCommands() {
+        SortedMap<String, CommandDescriptor> commandMap = new TreeMap<String, CommandDescriptor>();
+
+        List<CommandDescriptor> commands = this.commandRegistry.getCommandDescriptors();
+
+        for (CommandDescriptor command : commands) {
+            commandMap.put(command.getCommandName(), command);
+        }
+
+        return commandMap;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/commands/InstallCommand.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/commands/InstallCommand.java
new file mode 100644
index 0000000..355cb47
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/commands/InstallCommand.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.commands;
+
+import java.lang.management.ManagementFactory;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.management.JMX;
+import javax.management.MBeanServer;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+
+import org.eclipse.virgo.nano.deployer.api.ArtifactIdentity;
+import org.eclipse.virgo.nano.deployer.api.Deployer;
+import org.eclipse.virgo.nano.deployer.api.core.ApplicationDeployer;
+import org.eclipse.virgo.shell.Command;
+
+
+/**
+ * A Shell command that allows artifacts to be installed using an {@link ApplicationDeployer}.
+ * 
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ * 
+ */
+@Command("install")
+public final class InstallCommand {
+
+    private static final String ARTIFACT_INSTALLATION_FAILED = "Artifact installation failed: %s";
+
+    private static final String ARTIFACT_INSTALLED = "Artifact %s %s %s installed";
+
+    private final MBeanServer server = ManagementFactory.getPlatformMBeanServer();
+
+    private final ObjectName deployerObjectName;
+
+    public InstallCommand() throws MalformedObjectNameException, NullPointerException {
+        this.deployerObjectName = new ObjectName("org.eclipse.virgo.kernel:category=Control,type=Deployer");
+    }
+
+    @Command("")
+    public List<String> install(String artifactLocation) {
+        ArtifactIdentity artifactIdentity;
+        try {
+            artifactIdentity = getDeployer().install(artifactLocation);
+        } catch (Exception e) {
+            return Arrays.asList(String.format(ARTIFACT_INSTALLATION_FAILED, e.getMessage()));
+        }
+
+        return Arrays.asList(String.format(ARTIFACT_INSTALLED, artifactIdentity.getType(), artifactIdentity.getName(), artifactIdentity.getVersion()));
+    }
+
+    private Deployer getDeployer() {
+        return JMX.newMXBeanProxy(this.server, this.deployerObjectName, Deployer.class);
+    }
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/commands/PackageCommands.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/commands/PackageCommands.java
new file mode 100644
index 0000000..e339fcc
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/commands/PackageCommands.java
@@ -0,0 +1,119 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.commands;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.osgi.framework.Version;
+
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiBundle;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiExportPackage;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiFramework;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiFrameworkFactory;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiImportPackage;
+import org.eclipse.virgo.shell.Command;
+import org.eclipse.virgo.shell.internal.formatting.PackageCommandFormatter;
+import org.eclipse.virgo.shell.internal.util.PackageHolder;
+
+@Command("package")
+public final class PackageCommands {
+
+    private final QuasiFrameworkFactory quasiFrameworkFactory;
+
+    private final PackageCommandFormatter formatter;
+
+    public PackageCommands(QuasiFrameworkFactory quasiFrameworkFactory) {
+        this.quasiFrameworkFactory = quasiFrameworkFactory;
+        this.formatter = new PackageCommandFormatter();
+    }
+
+    @Command("list")
+    public List<String> list() {
+        return this.formatter.formatList(getAllPackages());
+    }
+
+    @Command("examine")
+    public List<String> examine(String name, String versionString) {
+        List<QuasiExportPackage> matchingExports = new ArrayList<QuasiExportPackage>();
+
+        Version version;
+
+        try {
+            version = AbstractInstallArtifactBasedCommands.convertToVersion(versionString);
+        } catch (IllegalArgumentException iae) {
+            return Arrays.asList(iae.getMessage());
+        }
+
+        PackageHolder packages = this.getPackages(name);
+        for (QuasiExportPackage exportPackage : packages.getExporters()) {
+            if (exportPackage.getVersion().equals(version)) {
+                matchingExports.add(exportPackage);
+            }
+        }
+
+        if (matchingExports.isEmpty()) {
+            return Arrays.asList(String.format("No package with name '%s' and version '%s' was found", name, version));
+        } else {
+            return this.formatter.formatExamine(matchingExports);
+        }
+    }
+
+    private List<QuasiExportPackage> getAllPackages() {
+        List<QuasiExportPackage> packages = new ArrayList<QuasiExportPackage>();
+        for (QuasiBundle bundle : this.quasiFrameworkFactory.create().getBundles()) {
+            packages.addAll(bundle.getExportPackages());
+        }
+        return packages;
+    }
+
+    private PackageHolder getPackages(String packageName) {
+        QuasiFramework framework = this.quasiFrameworkFactory.create();
+        if (packageName != null) {
+            List<QuasiImportPackage> importers = new ArrayList<QuasiImportPackage>();
+            List<QuasiExportPackage> exporters = new ArrayList<QuasiExportPackage>();
+            List<QuasiBundle> bundles = framework.getBundles();
+            for (QuasiBundle qBundle : bundles) {
+                QuasiImportPackage importPackage = processImporters(qBundle, packageName);
+                if (importPackage != null) {
+                    importers.add(importPackage);
+                }
+                QuasiExportPackage exportPackage = processExporters(qBundle, packageName);
+                if (exportPackage != null) {
+                    exporters.add(exportPackage);
+                }
+            }
+            return new PackageHolder(exporters, importers, packageName);
+        }
+        return null;
+    }
+
+    private QuasiImportPackage processImporters(QuasiBundle qBundle, String packageName) {
+        for (QuasiImportPackage qImportPackage : qBundle.getImportPackages()) {
+            if (qImportPackage.getPackageName().equals(packageName)) {
+                return qImportPackage;
+            }
+        }
+        return null;
+    }
+
+    private QuasiExportPackage processExporters(QuasiBundle qBundle, String packageName) {
+        for (QuasiExportPackage qExportPackage : qBundle.getExportPackages()) {
+            if (qExportPackage.getPackageName().equals(packageName)) {
+                return qExportPackage;
+            }
+        }
+        return null;
+    }
+    
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/commands/ParCommands.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/commands/ParCommands.java
new file mode 100644
index 0000000..9edf0ed
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/commands/ParCommands.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.commands;
+
+import org.eclipse.virgo.kernel.model.management.ManageableCompositeArtifact;
+import org.eclipse.virgo.kernel.model.management.RuntimeArtifactModelObjectNameCreator;
+import org.eclipse.virgo.shell.Command;
+import org.eclipse.virgo.shell.internal.formatting.CompositeInstallArtifactCommandFormatter;
+
+@Command("par")
+final class ParCommands extends AbstractInstallArtifactBasedCommands<ManageableCompositeArtifact> {
+
+    private static final String TYPE = "par";
+
+    public ParCommands(RuntimeArtifactModelObjectNameCreator objectNameCreator) {
+        super(TYPE, objectNameCreator, new CompositeInstallArtifactCommandFormatter(), ManageableCompositeArtifact.class, null);
+    }
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/commands/PlanCommands.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/commands/PlanCommands.java
new file mode 100644
index 0000000..dfb70ab
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/commands/PlanCommands.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.commands;
+
+import java.util.List;
+
+import org.eclipse.equinox.region.RegionDigraph;
+import org.eclipse.virgo.kernel.model.management.ManageableCompositeArtifact;
+import org.eclipse.virgo.kernel.model.management.RuntimeArtifactModelObjectNameCreator;
+import org.eclipse.virgo.shell.Command;
+import org.eclipse.virgo.shell.internal.formatting.CompositeInstallArtifactCommandFormatter;
+
+@Command("plan")
+final class PlanCommands extends AbstractInstallArtifactBasedCommands<ManageableCompositeArtifact> {
+
+    private static final String TYPE = "plan";
+
+    private static final String GLOBAL_REGION_NAME = "global";
+
+    public PlanCommands(RuntimeArtifactModelObjectNameCreator objectNameCreator, RegionDigraph regionDigraph) {
+        super(TYPE, objectNameCreator, new CompositeInstallArtifactCommandFormatter(), ManageableCompositeArtifact.class, regionDigraph);
+    }
+
+    @Command("examine")
+    public List<String> examine(String name, String version) {
+        return examine(name, version, GLOBAL_REGION_NAME);
+    }
+
+    @Command("start")
+    public List<String> start(String name, String version) {
+        return start(name, version, GLOBAL_REGION_NAME);
+    }
+
+    @Command("stop")
+    public List<String> stop(String name, String version) {
+        return stop(name, version, GLOBAL_REGION_NAME);
+    }
+
+    @Command("refresh")
+    public List<String> refresh(String name, String version) {
+        return refresh(name, version, GLOBAL_REGION_NAME);
+    }
+
+    @Command("uninstall")
+    public List<String> uninstall(String name, String version) {
+        return uninstall(name, version, GLOBAL_REGION_NAME);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/commands/ServiceCommands.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/commands/ServiceCommands.java
new file mode 100644
index 0000000..84091bc
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/commands/ServiceCommands.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.commands;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.virgo.shell.Command;
+import org.eclipse.virgo.shell.internal.formatting.ServiceCommandFormatter;
+import org.eclipse.virgo.shell.internal.util.QuasiServiceUtil;
+import org.eclipse.virgo.shell.internal.util.ServiceHolder;
+
+
+@Command("service")
+public final class ServiceCommands {
+
+    private final ServiceCommandFormatter formatter;
+    
+	private QuasiServiceUtil quasiServiceUtil;
+
+    public ServiceCommands(QuasiServiceUtil quasiServiceUtil) {
+        this.quasiServiceUtil = quasiServiceUtil;
+        this.formatter = new ServiceCommandFormatter();
+    }
+
+    @Command("list")
+    public List<String> list() {
+        return this.formatter.formatList(this.quasiServiceUtil.getAllServices());
+    }
+
+    @Command("examine")
+    public List<String> examine(long serviceId) {
+    	ServiceHolder service = this.quasiServiceUtil.getService(serviceId);
+        if (service == null) {
+            return Arrays.asList(String.format("No service with id '%s' was found", serviceId));
+        } else {
+            return this.formatter.formatExamine(service);
+        }
+    }
+    
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/commands/ShutdownCommand.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/commands/ShutdownCommand.java
new file mode 100644
index 0000000..c4e5521
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/commands/ShutdownCommand.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.commands;
+
+import java.lang.management.ManagementFactory;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+
+import org.eclipse.virgo.shell.Command;
+import org.eclipse.virgo.shell.internal.LocalInputOutputManager;
+
+
+/**
+ * Provides the Shell's <code>shutdown</code> command that will shutdown the kernel.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ * 
+ */
+@Command("shutdown")
+final class ShutdownCommand {
+
+    private static final String DEFAULT_KERNEL_DOMAIN = "org.eclipse.virgo.kernel";
+
+    private static final String MBEAN_VALUE_SHUTDOWN = "Shutdown";
+
+    private static final String MBEAN_KEY_TYPE = "type";
+
+    private final LocalInputOutputManager ioManager;
+
+    ShutdownCommand(LocalInputOutputManager ioManager) {
+        this.ioManager = ioManager;
+    }
+
+    @Command("")
+    public List<String> shutdown() {
+
+        this.ioManager.releaseSystemIO();
+
+        MBeanServer server = ManagementFactory.getPlatformMBeanServer();
+        try {
+            // TODO The kernel's domain needs to be read from configuration
+            ObjectName shutdownName = ObjectName.getInstance(DEFAULT_KERNEL_DOMAIN, MBEAN_KEY_TYPE, MBEAN_VALUE_SHUTDOWN);
+            server.invoke(shutdownName, "shutdown", new Object[0], new String[0]);
+        } catch (Exception e) {
+            this.ioManager.grabSystemIO();
+            return Arrays.asList(String.format("Error occurred '%s'", e.getMessage()));
+        }
+        return Collections.emptyList();
+    }
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/completers/AbstractInstallArtifactCompleter.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/completers/AbstractInstallArtifactCompleter.java
new file mode 100644
index 0000000..88f2439
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/completers/AbstractInstallArtifactCompleter.java
@@ -0,0 +1,98 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.completers;
+
+import java.lang.management.ManagementFactory;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+
+import org.eclipse.virgo.kernel.model.management.RuntimeArtifactModelObjectNameCreator;
+import org.eclipse.virgo.shell.CommandCompleter;
+
+class AbstractInstallArtifactCompleter implements CommandCompleter {
+
+    private static final String SUBCOMMAND_LIST = "list";
+
+    private final MBeanServer server = ManagementFactory.getPlatformMBeanServer();
+
+    private final String type;
+
+    private final RuntimeArtifactModelObjectNameCreator objectNameCreator;
+
+    public AbstractInstallArtifactCompleter(String type, RuntimeArtifactModelObjectNameCreator objectNameCreator) {
+        this.type = type;
+        this.objectNameCreator = objectNameCreator;
+    }
+
+    public final List<String> getCompletionCandidates(String subcommand, String... tokens) {
+        Set<String> candidates;
+
+        if (SUBCOMMAND_LIST.equals(subcommand)) {
+            candidates = Collections.<String> emptySet();
+        } else if (tokens.length == 2) {
+            candidates = versions(tokens[0], tokens[1]);
+        } else if (tokens.length == 1) {
+            candidates = names(tokens[0]);
+        } else {
+            candidates = Collections.<String> emptySet();
+        }
+
+        filter(candidates, subcommand, tokens);
+        List<String> candidateList = new ArrayList<String>(candidates);
+        Collections.sort(candidateList);
+        return candidateList;
+    }
+
+    /**
+     * To be over ridden by sub-classes that want to filter the completions to be offered back to the user.
+     * 
+     * @param candidates  
+     * @param subcommand 
+     * @param tokens 
+     */
+    protected void filter(Set<String> candidates, String subcommand, String... tokens) {
+    }
+
+    private Set<String> versions(String name, String version) {
+        Set<String> candidates = new HashSet<String>();
+
+        Set<ObjectName> objectNames = this.server.queryNames(this.objectNameCreator.createArtifactVersionsQuery(this.type, name), null);
+        for (ObjectName objectName : objectNames) {
+            String candidateVersion = this.objectNameCreator.getVersion(objectName);
+            if (candidateVersion.startsWith(version)) {
+                candidates.add(candidateVersion);
+            }
+        }
+
+        return candidates;
+    }
+
+    private Set<String> names(String name) {
+        Set<String> candidates = new HashSet<String>();
+
+        Set<ObjectName> objectNames = this.server.queryNames(this.objectNameCreator.createArtifactsOfTypeQuery(this.type), null);
+        for (ObjectName objectName : objectNames) {
+            String candidateName = this.objectNameCreator.getName(objectName);
+            if (candidateName.startsWith(name)) {
+                candidates.add(candidateName);
+            }
+        }
+
+        return candidates;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/completers/BundleCompleter.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/completers/BundleCompleter.java
new file mode 100644
index 0000000..129109f
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/completers/BundleCompleter.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.completers;
+
+import org.eclipse.virgo.kernel.model.management.RuntimeArtifactModelObjectNameCreator;
+
+final class BundleCompleter extends AbstractInstallArtifactCompleter {
+
+    private static final String TYPE = "bundle";
+
+    public BundleCompleter(RuntimeArtifactModelObjectNameCreator objectNameCreator) {
+        super(TYPE, objectNameCreator);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/completers/CommandCompleterRegistry.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/completers/CommandCompleterRegistry.java
new file mode 100644
index 0000000..ad2275d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/completers/CommandCompleterRegistry.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.completers;
+
+import org.eclipse.virgo.shell.CommandCompleter;
+
+/**
+ * A <code>CommandCompleterRegistry</code> provides access to all of the currently available {@link CommandCompleter CommandCompleters}.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Implementations must be thread-safe.
+ *
+ */
+public interface CommandCompleterRegistry {
+
+    /**
+     * Returns the {@link CommandCompleter} for the command with the given <code>commandName</code>, or
+     * <code>null</code> if no such completer is known to the registry.
+     * 
+     * @param commandName The name of the command for which a completer is required
+     * @return The completer for the command
+     */
+    CommandCompleter getCommandCompleter(String commandName);
+
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/completers/ConfigCompleter.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/completers/ConfigCompleter.java
new file mode 100644
index 0000000..b271992
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/completers/ConfigCompleter.java
@@ -0,0 +1,101 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.completers;
+
+import java.lang.management.ManagementFactory;
+import java.util.Iterator;
+import java.util.Set;
+
+import javax.management.InstanceNotFoundException;
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+
+import org.osgi.framework.Version;
+
+import org.eclipse.equinox.region.Region;
+import org.eclipse.equinox.region.RegionDigraph;
+import org.eclipse.virgo.kernel.model.management.ManageableArtifact;
+import org.eclipse.virgo.kernel.model.management.RuntimeArtifactModelObjectNameCreator;
+import org.eclipse.virgo.shell.internal.util.ArtifactRetriever;
+
+final class ConfigCompleter extends AbstractInstallArtifactCompleter {
+
+    private static final String TYPE = "configuration";
+
+    private static final String COMMAND_EXAMINE = "examine";
+
+    private static final String STATE_ACTIVE = "ACTIVE";
+    
+    private final Region globalRegion;
+
+    private final MBeanServer server = ManagementFactory.getPlatformMBeanServer();
+
+    private final RuntimeArtifactModelObjectNameCreator objectNameCreator;
+
+    private final ArtifactRetriever<ManageableArtifact> artifactRetriever;
+
+    public ConfigCompleter(RuntimeArtifactModelObjectNameCreator objectNameCreator, RegionDigraph regionDigraph) {
+        super(TYPE, objectNameCreator);
+        this.objectNameCreator = objectNameCreator;
+        this.globalRegion = regionDigraph.getRegion("global");
+        this.artifactRetriever = new ArtifactRetriever<ManageableArtifact>(TYPE, objectNameCreator, ManageableArtifact.class);
+    }
+
+    @Override
+    protected void filter(Set<String> candidates, String subcommand, String... tokens) {
+        if (COMMAND_EXAMINE.equals(subcommand)) {
+            if (tokens.length == 2) {
+                filterVersions(tokens[0], candidates);
+            } else if (tokens.length == 1) {
+                filterNames(candidates);
+            }
+        }
+    }
+
+    private void filterVersions(String name, Set<String> candidates) {
+        for (Iterator<String> i = candidates.iterator(); i.hasNext();) {
+            try {
+                ManageableArtifact artifact = this.artifactRetriever.getArtifact(name, new Version(i.next()), globalRegion);
+                if (!STATE_ACTIVE.equals(artifact.getState())) {
+                    i.remove();
+                }
+            } catch (InstanceNotFoundException e) {
+                // Swallow to allow others to proceed
+            }
+        }
+
+    }
+
+    private void filterNames(Set<String> candidates) {
+        for (Iterator<String> i = candidates.iterator(); i.hasNext();) {
+            ObjectName createArtifactVersionsQuery = this.objectNameCreator.createArtifactVersionsQuery(TYPE, i.next());
+			Set<ObjectName> objectNames = this.server.queryNames(createArtifactVersionsQuery, null);
+            boolean hasActive = false;
+            for (ObjectName objectName : objectNames) {
+                try {
+                    ManageableArtifact artifact = this.artifactRetriever.getArtifact(objectName);
+                    if (STATE_ACTIVE.equals(artifact.getState())) {
+                        hasActive = true;
+                        break;
+                    }
+                } catch (InstanceNotFoundException e) {
+                    // Swallow to allow others to proceed
+                }
+            }
+            if (!hasActive) {
+                i.remove();
+            }
+        }
+
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/completers/HelpCommandCompleter.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/completers/HelpCommandCompleter.java
new file mode 100644
index 0000000..484a33d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/completers/HelpCommandCompleter.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.completers;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.virgo.shell.CommandCompleter;
+import org.eclipse.virgo.shell.internal.CommandDescriptor;
+import org.eclipse.virgo.shell.internal.CommandRegistry;
+
+
+/**
+ * A <code>CommandCompleter<code> for the <code>help</code> command that offers completions based on all the commands in
+ * a {@link CommandRegistry}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ * 
+ */
+final class HelpCommandCompleter implements CommandCompleter {
+
+    private final CommandRegistry commandRegistry;
+
+    HelpCommandCompleter(CommandRegistry commandRegistry) {
+        this.commandRegistry = commandRegistry;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public List<String> getCompletionCandidates(String subCommand, String... arguments) {
+        List<String> candidates = new ArrayList<String>();
+        if (arguments.length == 0) {
+            // only complete first argument (subCommand)
+            List<CommandDescriptor> commandDescriptors = this.commandRegistry.getCommandDescriptors();
+            for (CommandDescriptor commandDescriptor : commandDescriptors) {
+                if (commandDescriptor.getCommandName().startsWith(subCommand)) {
+                    candidates.add(commandDescriptor.getCommandName());
+                }
+            }
+        }
+        Collections.sort(candidates);
+        return candidates;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/completers/InstallCompleter.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/completers/InstallCompleter.java
new file mode 100644
index 0000000..9e63c32
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/completers/InstallCompleter.java
@@ -0,0 +1,180 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.completers;
+
+import java.lang.management.ManagementFactory;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.management.JMX;
+import javax.management.MBeanServer;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+
+import org.eclipse.virgo.repository.management.ArtifactDescriptorSummary;
+import org.eclipse.virgo.repository.management.RepositoryInfo;
+import org.eclipse.virgo.shell.CommandCompleter;
+
+public class InstallCompleter implements CommandCompleter {
+
+    private static final String FILE_PREFIX = "file:";
+
+    private static final String FILE_PATH_CANDIDATE_FORMAT = FILE_PREFIX + "%s%s";
+
+    private static final String REPOSITORY_PREFIX = "repository:";
+
+    private static final String REPOSITORY_TYPE_NAME_VERSION_FORMAT = REPOSITORY_PREFIX + "%s/%s/%s";
+
+    private static final String REPOSITORY_TYPE_NAME_FORMAT = REPOSITORY_PREFIX + "%s/%s/";
+
+    private static final String REPOSITORY_TYPE_FORMAT = REPOSITORY_PREFIX + "%s/";
+
+    private static final String[] SCHEMES = { FILE_PREFIX, REPOSITORY_PREFIX };
+
+    private final MBeanServer server = ManagementFactory.getPlatformMBeanServer();
+
+    private final ObjectName repositoryQuery;
+
+    private final ObjectName hostedRepositoryQuery;
+
+    public InstallCompleter() throws MalformedObjectNameException, NullPointerException {
+        this.repositoryQuery = new ObjectName("org.eclipse.virgo.kernel:type=Repository,*");
+        this.hostedRepositoryQuery = new ObjectName("org.eclipse.virgo.server:type=HostedRepository,*");
+    }
+
+    public List<String> getCompletionCandidates(String subcommand, String... arguments) {
+        Set<String> candidates;
+        if (arguments.length == 0) {
+            if (subcommand.startsWith(REPOSITORY_PREFIX)) {
+                candidates = repository(subcommand);
+            } else if (subcommand.startsWith(FILE_PREFIX)) {
+                candidates = file(subcommand);
+            } else {
+                candidates = new HashSet<String>();
+                for (String scheme : SCHEMES) {
+                    if (scheme.startsWith(subcommand)) {
+                        candidates.add(scheme);
+                    }
+                }
+            }
+        } else {
+            // We do not complete anything after the 'subcommand' argument
+            candidates = new HashSet<String>();
+        }
+
+        List<String> candidateList = new ArrayList<String>(candidates);
+        Collections.sort(candidateList);
+        return candidateList;
+    }
+
+    private Set<String> file(String subcommand) {
+        List<String> candidates = new ArrayList<String>();
+
+        String path = subcommand.substring(FILE_PREFIX.length());
+        int completionIndex = 0; //new FileNameCompletor().complete(path, path.length(), candidates);
+        
+        Set<String> candidateSet = new HashSet<String>(candidates.size());
+
+        if (completionIndex >= 0) {
+            String completablePath = path.substring(0, completionIndex);
+    
+            for (String candidate : candidates) {
+                candidateSet.add(String.format(FILE_PATH_CANDIDATE_FORMAT, completablePath, candidate));
+            }
+        }
+
+        return candidateSet;
+    }
+
+    private Set<String> repository(String subcommand) {
+        List<String> uriParts = getUriParts(subcommand);
+
+        if (uriParts.size() == 1) {
+            return type(uriParts.get(0));
+        } else if (uriParts.size() == 2) {
+            return name(uriParts.get(0), uriParts.get(1));
+        } else if (uriParts.size() == 3) {
+            return version(uriParts.get(0), uriParts.get(1), uriParts.get(2));
+        }
+        return Collections.emptySet();
+    }
+
+    private List<String> getUriParts(String subcommand) {
+        List<String> uriParts = new ArrayList<String>(Arrays.asList(subcommand.substring(REPOSITORY_PREFIX.length()).split("/")));
+        if (subcommand.endsWith("/")) {
+            uriParts.add("");
+        }
+        return uriParts;
+    }
+
+    private Set<String> type(String type) {
+        Set<String> types = new HashSet<String>();
+
+        for (RepositoryInfo repository : getRepositories()) {
+            for (ArtifactDescriptorSummary artifact : repository.getAllArtifactDescriptorSummaries()) {
+                if (artifact.getType().startsWith(type)) {
+                    types.add(String.format(REPOSITORY_TYPE_FORMAT, artifact.getType()));
+                }
+            }
+        }
+
+        return types;
+    }
+
+    private Set<String> name(String type, String name) {
+        Set<String> names = new HashSet<String>();
+
+        for (RepositoryInfo repository : getRepositories()) {
+            for (ArtifactDescriptorSummary artifact : repository.getAllArtifactDescriptorSummaries()) {
+                if (artifact.getType().equals(type) && artifact.getName().startsWith(name)) {
+                    names.add(String.format(REPOSITORY_TYPE_NAME_FORMAT, artifact.getType(), artifact.getName()));
+                }
+            }
+        }
+
+        return names;
+    }
+
+    private Set<String> version(String type, String name, String version) {
+        Set<String> versions = new HashSet<String>();
+
+        for (RepositoryInfo repository : getRepositories()) {
+            for (ArtifactDescriptorSummary artifact : repository.getAllArtifactDescriptorSummaries()) {
+                if (artifact.getType().equals(type) && artifact.getName().equals(name) && artifact.getVersion().startsWith(version)) {
+                    versions.add(String.format(REPOSITORY_TYPE_NAME_VERSION_FORMAT, artifact.getType(), artifact.getName(), artifact.getVersion()));
+                }
+            }
+        }
+
+        return versions;
+    }
+
+    private Set<RepositoryInfo> getRepositories() {
+        Set<String> hostedRepositoryNames = new HashSet<String>();
+        for (ObjectName objectName : this.server.queryNames(this.hostedRepositoryQuery, null)) {
+            hostedRepositoryNames.add(objectName.getKeyProperty("name"));
+        }
+
+        Set<RepositoryInfo> repositories = new HashSet<RepositoryInfo>();
+        for (ObjectName objectName : this.server.queryNames(this.repositoryQuery, null)) {
+            String name = objectName.getKeyProperty("name");
+            if (!hostedRepositoryNames.contains(name)) {
+                repositories.add(JMX.newMXBeanProxy(this.server, objectName, RepositoryInfo.class));
+            }
+        }
+        return repositories;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/completers/PackageCompleter.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/completers/PackageCompleter.java
new file mode 100644
index 0000000..703e45a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/completers/PackageCompleter.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.completers;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiBundle;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiExportPackage;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiFrameworkFactory;
+import org.eclipse.virgo.shell.CommandCompleter;
+
+public class PackageCompleter implements CommandCompleter {
+
+    private static final String SUBCOMMAND_LIST = "list";
+
+	private QuasiFrameworkFactory quasiFrameworkFactory;
+
+    public PackageCompleter(QuasiFrameworkFactory quasiFrameworkFactory) {
+        this.quasiFrameworkFactory = quasiFrameworkFactory;
+    }
+
+    public List<String> getCompletionCandidates(String subcommand, String... tokens) {
+        Set<String> candidates;
+
+        if (SUBCOMMAND_LIST.equals(subcommand)) {
+            candidates = Collections.<String> emptySet();
+        } else if (tokens.length == 2) {
+            candidates = versions(tokens[0], tokens[1]);
+        } else if (tokens.length == 1) {
+            candidates = names(tokens[0]);
+        } else {
+            candidates = Collections.<String> emptySet();
+        }
+
+        List<String> candidateList = new ArrayList<String>(candidates);
+        Collections.sort(candidateList);
+        return candidateList;
+    }
+
+    private Set<String> versions(String name, String version) {
+        Set<String> versions = new HashSet<String>();
+
+        for (QuasiExportPackage exportPackage : getAllPackages()) {
+            String packageName = exportPackage.getPackageName();
+            String packageVersion = exportPackage.getVersion().toString();
+            if (packageName.equals(name) && packageVersion.startsWith(version)) {
+                versions.add(packageVersion);
+            }
+        }
+
+        return versions;
+    }
+
+    private Set<String> names(String name) {
+        Set<String> names = new HashSet<String>();
+
+        for (QuasiExportPackage exportPackage : getAllPackages()) {
+            String packageName = exportPackage.getPackageName();
+            if (packageName.startsWith(name)) {
+                names.add(packageName);
+            }
+        }
+
+        return names;
+    }
+
+    private List<QuasiExportPackage> getAllPackages() {
+        List<QuasiExportPackage> packages = new ArrayList<QuasiExportPackage>();
+        for (QuasiBundle bundle : this.quasiFrameworkFactory.create().getBundles()) {
+            packages.addAll(bundle.getExportPackages());
+        }
+        return packages;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/completers/ParCompleter.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/completers/ParCompleter.java
new file mode 100644
index 0000000..27cb13f
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/completers/ParCompleter.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.completers;
+
+import org.eclipse.virgo.kernel.model.management.RuntimeArtifactModelObjectNameCreator;
+
+final class ParCompleter extends AbstractInstallArtifactCompleter {
+
+    private static final String TYPE = "par";
+
+    public ParCompleter(RuntimeArtifactModelObjectNameCreator objectNameCreator) {
+        super(TYPE, objectNameCreator);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/completers/PlanCompleter.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/completers/PlanCompleter.java
new file mode 100644
index 0000000..454806c
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/completers/PlanCompleter.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.completers;
+
+import org.eclipse.virgo.kernel.model.management.RuntimeArtifactModelObjectNameCreator;
+
+final class PlanCompleter extends AbstractInstallArtifactCompleter {
+
+    private static final String TYPE = "plan";
+
+    public PlanCompleter(RuntimeArtifactModelObjectNameCreator objectNameCreator) {
+        super(TYPE, objectNameCreator);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/completers/ServiceRegistryCommandCompleterRegistry.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/completers/ServiceRegistryCommandCompleterRegistry.java
new file mode 100644
index 0000000..5cab928
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/completers/ServiceRegistryCommandCompleterRegistry.java
@@ -0,0 +1,122 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.completers;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.virgo.shell.CommandCompleter;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceEvent;
+import org.osgi.framework.ServiceListener;
+import org.osgi.framework.ServiceReference;
+
+
+
+/**
+ * A dynamic registry of {@link CommandCompleter CommandCompleters} backed by the OSGi
+ * service registry.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Thread-safe.
+ *
+ */
+final class ServiceRegistryCommandCompleterRegistry implements CommandCompleterRegistry {
+        
+    private final ServiceListener commandCompleterRegistryServiceListener = new ConverterRegistryServiceListener();
+    
+    private final Map<String, CommandCompleter> completers = new HashMap<String, CommandCompleter>();
+    
+    private final Object monitor = new Object();
+    
+    private final BundleContext bundleContext;
+    
+    ServiceRegistryCommandCompleterRegistry(BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public CommandCompleter getCommandCompleter(String commandName) {
+        synchronized(this.monitor) {
+            return this.completers.get(commandName);
+        }
+    }
+    
+    void initialize() {        
+        try {
+            this.bundleContext.addServiceListener(this.commandCompleterRegistryServiceListener, "(objectClass=" + CommandCompleter.class.getName() + ")");
+            ServiceReference<?>[] serviceReferences = this.bundleContext.getServiceReferences(CommandCompleter.class.getName(), null);
+            if (serviceReferences != null) {
+                for (ServiceReference<?> serviceReference : serviceReferences) {
+                    serviceRegistered(serviceReference);
+                }
+            }
+        } catch (InvalidSyntaxException e) {
+            throw new RuntimeException("Unexpected InvalidSyntaxException", e);
+        }
+    }
+    
+    private void serviceRegistered(ServiceReference<?> serviceReference) {
+        CommandCompleter completer = (CommandCompleter)bundleContext.getService(serviceReference);
+        if (completer != null) {
+            String[] commandNames = getCommandNames(serviceReference);
+            for (String commandName : commandNames) {
+                this.completers.put(commandName, completer);
+            }
+        }
+    }
+    
+    private String[] getCommandNames(ServiceReference<?> serviceReference) {
+        Object commandNamesProperty = serviceReference.getProperty(CommandCompleter.SERVICE_PROPERTY_COMPLETER_COMMAND_NAMES);
+        String[] commandNames;
+        
+        if (commandNamesProperty instanceof String[]) {
+            commandNames = (String[])commandNamesProperty;
+        } else if (commandNamesProperty instanceof String) {
+            commandNames = new String[] {(String)commandNamesProperty};
+        } else {
+            commandNames = new String[0];
+        }
+        return commandNames;
+    }
+
+    private void serviceUnregistering(ServiceReference<?> serviceReference) {
+        Object converter = this.bundleContext.getService(serviceReference);
+        if (converter != null) {
+            String[] commandNames = getCommandNames(serviceReference);
+            synchronized (monitor) {
+                for (String commandName : commandNames) {
+                    this.completers.remove(commandName);
+                }                           
+            }
+        }
+    }
+    
+    private final class ConverterRegistryServiceListener implements ServiceListener {
+
+        /**
+         * {@inheritDoc}
+         */
+        public void serviceChanged(ServiceEvent event) {
+            if (ServiceEvent.REGISTERED == event.getType()) {
+                serviceRegistered(event.getServiceReference());
+            } else if (ServiceEvent.UNREGISTERING == event.getType()) {
+                serviceUnregistering(event.getServiceReference());
+            }
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/converters/ConverterRegistry.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/converters/ConverterRegistry.java
new file mode 100644
index 0000000..da86b1b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/converters/ConverterRegistry.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.converters;
+
+import org.eclipse.virgo.shell.Converter;
+
+/**
+ * A <code>ConverterRegistry</code> provides access to all of the currently available {@link Converter Converters}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations must be thread-safe.
+ * 
+ */
+public interface ConverterRegistry {
+
+    /**
+     * Returns the converter for the given <code>clazz</code>
+     * 
+     * @param clazz The Class for which a <code>Converter</code> is required
+     * @return The <code>Converter</code> for the Class, or <code>null</code> if no <code>Converter</code> is available.
+     */
+    Converter getConverter(Class<?> clazz);
+
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/converters/LongConverter.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/converters/LongConverter.java
new file mode 100644
index 0000000..435388a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/converters/LongConverter.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.converters;
+
+import org.eclipse.virgo.shell.Converter;
+
+
+
+/**
+ * <p>
+ * LongConverter is registered in the service registry to provide a conversion service 
+ * from both {@link Long} and <code>long</code> to and from Strings for use by the command 
+ * 
+ * resolver.
+ * </p>
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * LongConverter is thread safe
+ *
+ */
+final public class LongConverter implements Converter {
+
+    private static final String[] TYPES = new String[]{ Long.class.getName(), long.class.getName() };
+    
+    /**
+     * Simple getter used when this class is created as a bean and placed in the service registry.
+     * 
+     * @return String or String[] of the types this converter can convert
+     */
+    public static String[] getTypes() {
+        return TYPES.clone();
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public Object convert(Class<?> desiredType, Object in) throws Exception {
+        if(canConvert(desiredType)){
+            try{
+                return Long.valueOf(in.toString());
+            }catch (NumberFormatException e){
+                // no-op to just return null
+            }
+        }
+        return null;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public CharSequence format(Object target, int level, Converter escape) throws Exception {
+        if(canFormat(target)){
+            return String.valueOf(target);
+        }
+        return null;
+    }
+    
+    private boolean canConvert(Class<?> desiredType) {
+        return Long.class.equals(desiredType) || long.class.equals(desiredType);
+    }
+    
+    private boolean canFormat(Object target) {
+        return target instanceof Long;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/converters/ServiceRegistryConverterRegistry.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/converters/ServiceRegistryConverterRegistry.java
new file mode 100644
index 0000000..0a88c43
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/converters/ServiceRegistryConverterRegistry.java
@@ -0,0 +1,124 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.converters;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.eclipse.virgo.shell.Converter;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceEvent;
+import org.osgi.framework.ServiceListener;
+import org.osgi.framework.ServiceReference;
+
+
+
+/**
+ * A registry of {@link Converter Converters} backed by the OSGi service registry.
+ * 
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Thread-safe.
+ *
+ */
+final class ServiceRegistryConverterRegistry implements ConverterRegistry {
+        
+    private final ServiceListener converterRegistryServiceListener = new ConverterRegistryServiceListener();
+    
+    private final Map<String, Converter> converters = new HashMap<String, Converter>();
+    
+    private final Object monitor = new Object();
+    
+    private final BundleContext bundleContext;
+    
+    ServiceRegistryConverterRegistry(BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public Converter getConverter(Class<?> clazz) {
+        synchronized(this.monitor) {
+            return this.converters.get(clazz.getName());
+        }
+    }
+    
+    void initialize() {        
+        try {
+            this.bundleContext.addServiceListener(this.converterRegistryServiceListener, "(objectClass=" + Converter.class.getName() + ")");
+            ServiceReference<?>[] serviceReferences = this.bundleContext.getServiceReferences(Converter.class.getName(), null);
+            if (serviceReferences != null) {
+                for (ServiceReference<?> serviceReference : serviceReferences) {
+                    serviceRegistered(serviceReference);
+                }
+            }
+        } catch (InvalidSyntaxException e) {
+            throw new RuntimeException("Unexpected InvalidSyntaxException", e);
+        }
+    }
+    
+    private void serviceRegistered(ServiceReference<?> serviceReference) {
+        Converter converter = (Converter)bundleContext.getService(serviceReference);
+        if (converter != null) {
+            String[] converterClasses = getConverterClasses(serviceReference);
+            for (String converterClass : converterClasses) {
+                this.converters.put(converterClass, converter);
+            }
+        }
+    }
+    
+    private String[] getConverterClasses(ServiceReference<?> serviceReference) {
+        Object converterClassesProperty = serviceReference.getProperty(Converter.CONVERTER_CLASSES);
+        String[] converterClasses;
+        
+        if (converterClassesProperty instanceof String[]) {
+            converterClasses = (String[])converterClassesProperty;
+        } else if (converterClassesProperty instanceof String) {
+            converterClasses = new String[] {(String)converterClassesProperty};
+        } else {
+            converterClasses = new String[0];
+        }
+        return converterClasses;
+    }
+
+    private void serviceUnregistering(ServiceReference<?> serviceReference) {
+        Object converter = this.bundleContext.getService(serviceReference);
+        if (converter != null) {
+            synchronized (monitor) {
+                Iterator<Entry<String, Converter>> iterator = this.converters.entrySet().iterator();
+                while (iterator.hasNext()) {
+                    Converter candidate = iterator.next().getValue();
+                    if (converter.equals(candidate)) {
+                        iterator.remove();
+                    }
+                }                
+            }
+        }
+    }
+    
+    private final class ConverterRegistryServiceListener implements ServiceListener {
+
+        public void serviceChanged(ServiceEvent event) {
+            if (ServiceEvent.REGISTERED == event.getType()) {
+                serviceRegistered(event.getServiceReference());
+            } else if (ServiceEvent.UNREGISTERING == event.getType()) {
+                serviceUnregistering(event.getServiceReference());
+            }
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/converters/StringConverter.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/converters/StringConverter.java
new file mode 100644
index 0000000..bc1ec23
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/converters/StringConverter.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.converters;
+
+import org.eclipse.virgo.shell.Converter;
+
+
+
+/**
+ */
+final public class StringConverter implements Converter {
+
+    private static final String TYPES = String.class.getName();
+
+    /**
+     * Simple getter used when this class is created as a bean and placed in the service registry.
+     * 
+     * @return String or String[] of the types this converter can convert
+     */
+    public static String getTypes() {
+        return TYPES;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public Object convert(Class<?> desiredType, Object in) throws Exception {
+        if(desiredType.equals(String.class)){
+            return in.toString();
+        }
+        return null;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public CharSequence format(Object target, int level, Converter escape) throws Exception {
+        if(target instanceof String){
+            return target.toString();
+        }
+        return null;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/formatting/AbstractInstallArtifactCommandFormatter.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/formatting/AbstractInstallArtifactCommandFormatter.java
new file mode 100644
index 0000000..cab452e
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/formatting/AbstractInstallArtifactCommandFormatter.java
@@ -0,0 +1,79 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.formatting;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import org.eclipse.virgo.kernel.model.BundleArtifact;
+import org.eclipse.virgo.kernel.model.management.ManageableArtifact;
+
+public abstract class AbstractInstallArtifactCommandFormatter<T extends ManageableArtifact> implements InstallArtifactCommandFormatter<T> {
+
+    protected static final int MAX_LINE_LENGTH = 80;
+
+    private static final String NAME_COLUMN_NAME = "Name";
+
+    private static final int NAME_COLUMN_MIN_WIDTH = NAME_COLUMN_NAME.length();
+
+    private static final String VERSION_COLUMN_NAME = "Version";
+
+    private static final int VERSION_COLUMN_MIN_WIDTH = VERSION_COLUMN_NAME.length();
+
+    private static final String STATE_COLUMN_NAME = "State";
+
+    /**
+     * longest state name from {@link BundleArtifact#mapBundleState()}
+     */
+    private static final int STATE_COLUMN_MIN_WIDTH = 11;
+
+    public List<String> formatList(List<T> artifacts) {
+        Collections.sort(artifacts, new ManageableArtifactComparator<T>());
+
+        int maxNameLength = NAME_COLUMN_MIN_WIDTH;
+        int maxVersionLength = VERSION_COLUMN_MIN_WIDTH;
+        for (T artifact : artifacts) {
+            final int nameLength = artifact.getName().length();
+            maxNameLength = nameLength > maxNameLength ? nameLength : maxNameLength;
+            final int versionLength = artifact.getVersion().length();
+            maxVersionLength = versionLength > maxVersionLength ? versionLength : maxVersionLength;
+        }
+
+        List<String> lines = new ArrayList<String>();
+        int stateLength = MAX_LINE_LENGTH - (2 + maxNameLength + maxVersionLength);
+        if (stateLength < STATE_COLUMN_MIN_WIDTH) {
+            stateLength = STATE_COLUMN_MIN_WIDTH;
+        }
+        final String singleLineFormat = String.format("%%-%ds %%-%ds %%%ds", maxNameLength, maxVersionLength, stateLength);
+        lines.add(String.format(singleLineFormat, NAME_COLUMN_NAME, VERSION_COLUMN_NAME, STATE_COLUMN_NAME));
+
+        for (T artifact : artifacts) {
+            lines.add(String.format(singleLineFormat, artifact.getName(), artifact.getVersion(), artifact.getState()));
+        }
+
+        return lines;
+    }
+
+    private static class ManageableArtifactComparator<T extends ManageableArtifact> implements Comparator<T> {
+
+        public int compare(T artifact1, T artifact2) {
+            int value = artifact1.getName().compareTo(artifact2.getName());
+            if (value != 0) {
+                return value;
+            }
+            return artifact1.getVersion().compareTo(artifact2.getVersion());
+        }
+
+    }
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/formatting/BundleInstallArtifactCommandFormatter.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/formatting/BundleInstallArtifactCommandFormatter.java
new file mode 100644
index 0000000..0fab679
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/formatting/BundleInstallArtifactCommandFormatter.java
@@ -0,0 +1,462 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.formatting;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.equinox.region.Region;
+import org.eclipse.equinox.region.RegionDigraph;
+import org.eclipse.virgo.kernel.model.BundleArtifact;
+import org.eclipse.virgo.kernel.model.management.ManageableArtifact;
+import org.eclipse.virgo.kernel.module.ModuleContext;
+import org.eclipse.virgo.kernel.module.ModuleContextAccessor;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiBundle;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiExportPackage;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiImportPackage;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiResolutionFailure;
+import org.eclipse.virgo.shell.internal.util.QuasiBundleUtil;
+import org.eclipse.virgo.shell.internal.util.QuasiServiceUtil;
+import org.eclipse.virgo.shell.internal.util.ServiceHolder;
+import org.eclipse.virgo.util.common.StringUtils;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.Constants;
+import org.osgi.framework.Version;
+
+public final class BundleInstallArtifactCommandFormatter implements InstallArtifactCommandFormatter<ManageableArtifact> {
+
+    private static final int MAX_LINE_LENGTH = 80;
+
+    private static final String ID_COLUMN_NAME = "Id";
+
+    private static final int ID_COLUMN_MIN_WIDTH = ID_COLUMN_NAME.length();
+
+    private static final String SPRING_POWERED_COLUMN_NAME = " ";
+
+    private static final int SPRING_POWERED_COLUMN_WIDTH = SPRING_POWERED_COLUMN_NAME.length();
+
+    private static final String NAME_COLUMN_NAME = "Name";
+
+    private static final int NAME_COLUMN_MIN_WIDTH = NAME_COLUMN_NAME.length();
+
+    private static final String VERSION_COLUMN_NAME = "Version";
+
+    private static final int VERSION_COLUMN_MIN_WIDTH = VERSION_COLUMN_NAME.length();
+
+    private static final String STATE_COLUMN_NAME = "State";
+    
+    private static final String USER_REGION_NAME = "org.eclipse.virgo.region.user";
+
+    /**
+     * longest state name from {@link BundleArtifact#mapBundleState()}
+     */
+    private static final int STATE_COLUMN_MIN_WIDTH = 11;
+
+    private final ModuleContextAccessor moduleContextAccessor;
+    
+    private final Region userRegion;
+
+	private final QuasiBundleUtil quasiBundleUtil;
+
+	private QuasiServiceUtil quasiServiceUtil;
+
+    public BundleInstallArtifactCommandFormatter(RegionDigraph regionDigraph, QuasiBundleUtil quasiBundleUtil, QuasiServiceUtil quasiServiceUtil, ModuleContextAccessor moduleContextAccessor) {
+        this.quasiBundleUtil = quasiBundleUtil;
+		this.quasiServiceUtil = quasiServiceUtil;
+        this.moduleContextAccessor = moduleContextAccessor;
+        this.userRegion = regionDigraph.getRegion(USER_REGION_NAME);
+    }
+
+    public List<String> formatList(List<ManageableArtifact> artifacts) {
+        List<ArtifactHolder> artifactHolders = getArtifactHolders(artifacts);
+        Collections.sort(artifactHolders);
+
+        int maxIdLength = ID_COLUMN_MIN_WIDTH;
+        int maxNameLength = NAME_COLUMN_MIN_WIDTH;
+        int maxVersionLength = VERSION_COLUMN_MIN_WIDTH;
+        for (ArtifactHolder artifact : artifactHolders) {
+            final int idLength = artifact.getId().toString().length();
+            maxIdLength = idLength > maxIdLength ? idLength : maxIdLength;
+            final int nameLength = artifact.getName().length();
+            maxNameLength = nameLength > maxNameLength ? nameLength : maxNameLength;
+            final int versionLength = artifact.getVersion().length();
+            maxVersionLength = versionLength > maxVersionLength ? versionLength : maxVersionLength;
+        }
+
+        List<String> lines = new ArrayList<String>();
+        int stateLength = MAX_LINE_LENGTH - (4 + maxIdLength + SPRING_POWERED_COLUMN_WIDTH + maxNameLength + maxVersionLength);
+        if (stateLength < STATE_COLUMN_MIN_WIDTH) {
+            stateLength = STATE_COLUMN_MIN_WIDTH;
+        }
+
+        final String singleLineFormat = String.format("%%-%ds %%s %%-%ds %%-%ds %%%ds", maxIdLength, maxNameLength, maxVersionLength, stateLength);
+        lines.add(String.format(singleLineFormat, ID_COLUMN_NAME, SPRING_POWERED_COLUMN_NAME, NAME_COLUMN_NAME, VERSION_COLUMN_NAME,
+            STATE_COLUMN_NAME));
+
+        for (ArtifactHolder artifact : artifactHolders) {
+            lines.add(String.format(singleLineFormat, artifact.getId(), artifact.getSpringPowered() ? "S" : " ", artifact.getName(),
+                artifact.getVersion(), artifact.getState()));
+        }
+
+        return lines;
+    }
+
+    public List<String> formatExamine(ManageableArtifact artifact) {
+        List<String> lines = new ArrayList<String>();
+
+        List<QuasiBundle> quasiBundles = this.quasiBundleUtil.getAllBundles();
+        ArtifactHolder artifactHolder = getArtifactHolder(artifact, quasiBundles);
+
+        if (artifactHolder == null) {
+            lines.add("No artifact found of type '" + artifact.getType() + "' name '" + artifact.getName() + "' and version '"
+                + artifact.getVersion() + "'");
+        } else {
+            lines.add(String.format("Id:              %s", artifactHolder.getId()));
+            lines.add(String.format("Name:            %s", artifactHolder.getName()));
+            lines.add(String.format("Version          %s", artifactHolder.getVersion()));
+            lines.add(String.format("State:           %s", artifactHolder.getState()));
+            lines.add(String.format("Spring Powered:  %s", artifactHolder.getSpringPowered()));
+
+            String bundleLocation = artifactHolder.getBundleLocation();
+            lines.add(String.format("Bundle Location: %s", bundleLocation == null ? "" : bundleLocation));
+
+            lines.addAll(formatImportedPackages(artifactHolder));
+            lines.addAll(formatExportedPackages(artifactHolder));
+            lines.addAll(formatPublishedServices(artifactHolder));
+            lines.addAll(formatConsumedServices(artifactHolder));
+            lines.addAll(formatFragments(artifactHolder));
+            lines.addAll(formatHost(artifactHolder));
+        }
+        return lines;
+    }
+
+    private List<String> formatConsumedServices(ArtifactHolder artifactHolder) {
+        List<String> lines = new ArrayList<String>();
+
+        lines.add("");
+        lines.add(String.format("Consumed services:"));
+        List<ServiceHolder> consumedServices = artifactHolder.getConsumedServices(this.quasiServiceUtil);
+        if (consumedServices.isEmpty()) {
+            lines.add(String.format("    None"));
+        } else {
+            for (ServiceHolder consumedService : consumedServices) {
+                String objectClass = extractFirstObjectClass(consumedService.getProperties().get(Constants.OBJECTCLASS));
+                lines.add(String.format("    %3s %s", consumedService.getServiceId(), objectClass));
+                lines.add(String.format("        published by %s", formatBundleSummary(consumedService.getProvider())));
+            }
+        }
+        return lines;
+    }
+
+    private List<String> formatPublishedServices(ArtifactHolder artifactHolder) {
+        List<String> lines = new ArrayList<String>();
+
+        lines.add("");
+        lines.add(String.format("Published services:"));
+        List<ServiceHolder> publishedServices = artifactHolder.getPublishedServices(this.quasiServiceUtil);
+        if (publishedServices.isEmpty()) {
+            lines.add(String.format("    None"));
+        } else {
+            for (ServiceHolder publishedService : publishedServices) {
+                String objectClass = extractFirstObjectClass(publishedService.getProperties().get(Constants.OBJECTCLASS));
+                lines.add(String.format("    %3s %s", publishedService.getServiceId(), objectClass));
+                List<QuasiBundle> consumers = publishedService.getConsumers();
+                for (QuasiBundle consumer : consumers) {
+                    lines.add(String.format("        consumed by %s", formatBundleSummary(consumer)));
+                }
+            }
+        }
+        return lines;
+    }
+
+    private String extractFirstObjectClass(Object objectClass) {
+        String[] objectClasses;
+
+        if (objectClass instanceof String) {
+            objectClasses = StringUtils.commaDelimitedListToStringArray((String) objectClass);
+        } else if (objectClass instanceof Object[]) {
+            objectClasses = (String[]) objectClass;
+        } else {
+            objectClasses = StringUtils.commaDelimitedListToStringArray(objectClass.toString());
+        }
+
+        if (objectClasses.length > 0) {
+            return objectClasses[0];
+        } else {
+            return "<no object classes>";
+        }
+    }
+
+    private List<String> formatHost(ArtifactHolder artifactHolder) {
+        List<String> lines = new ArrayList<String>();
+
+        List<QuasiBundle> hosts = artifactHolder.getHosts();
+        if (hosts != null && !hosts.isEmpty()) {
+            lines.add("");
+            lines.add(String.format("Host:"));
+            QuasiBundle host = hosts.get(0);
+            lines.add(String.format("    %s", formatBundleSummary(host)));
+        }
+
+        return lines;
+    }
+
+    private List<String> formatFragments(ArtifactHolder artifactHolder) {
+        List<String> lines = new ArrayList<String>();
+
+        lines.add("");
+        lines.add(String.format("Fragments:"));
+        List<QuasiBundle> fragments = artifactHolder.getFragments();
+        if (fragments.isEmpty()) {
+            lines.add(String.format("    None"));
+        } else {
+            for (QuasiBundle fragment : fragments) {
+                lines.add(String.format("    %s", formatBundleSummary(fragment)));
+            }
+        }
+
+        return lines;
+    }
+
+    private List<String> formatExportedPackages(ArtifactHolder artifactHolder) {
+        List<String> lines = new ArrayList<String>();
+
+        lines.add("");
+        lines.add(String.format("Exported Packages:"));
+        List<QuasiExportPackage> exportPackages = artifactHolder.getExportPackages();
+        if (exportPackages.isEmpty()) {
+            lines.add(String.format("    None"));
+        } else {
+            for (QuasiExportPackage exportPackage : exportPackages) {
+                lines.add(String.format("    %s %s", exportPackage.getPackageName(), exportPackage.getVersion().toString()));
+                for (QuasiImportPackage consumer : exportPackage.getConsumers()) {
+                    QuasiBundle bundle = consumer.getImportingBundle();
+                    lines.add(String.format("        imported by %s", formatBundleSummary(bundle)));
+                }
+            }
+        }
+
+        return lines;
+    }
+
+    private List<String> formatImportedPackages(ArtifactHolder artifactHolder) {
+        List<String> lines = new ArrayList<String>();
+
+        lines.add("");
+        lines.add(String.format("Imported Packages:"));
+        List<QuasiImportPackage> importPackages = artifactHolder.getImportPackages();
+        if (importPackages.isEmpty()) {
+            lines.add(String.format("    None"));
+        } else {
+            for (QuasiImportPackage importPackage : importPackages) {
+                if (importPackage.isResolved()) {
+                    lines.add(String.format("    %s %s", importPackage.getPackageName(), importPackage.getVersionConstraint().toString()));
+                    QuasiBundle bundle = importPackage.getProvider().getExportingBundle();
+                    lines.add(String.format("        exported by %s", formatBundleSummary(bundle)));
+                }
+            }
+        }
+
+        return lines;
+    }
+
+    private String formatBundleSummary(QuasiBundle bundle) {
+        return String.format("%s %s [%s]", bundle.getSymbolicName(), bundle.getVersion(), bundle.getBundleId());
+    }
+
+    public List<String> formatDiag(QuasiBundle bundle, List<QuasiResolutionFailure> resolverReport) {
+        if (bundle == null) {
+            return Arrays.asList("Unable to locate bundle");
+        }
+
+        if (resolverReport.size() == 0) {
+            return Arrays.asList("No resolution errors found");
+        }
+
+        List<String> lines = new ArrayList<String>();
+        for (QuasiResolutionFailure quasiResolutionFailure : resolverReport) {
+            lines.add(String.format("%s", quasiResolutionFailure.getDescription()));
+        }
+        return lines;
+    }
+
+    public List<String> formatHeaders(QuasiBundle quasiBundle) {
+        if (quasiBundle == null) {
+            return Arrays.asList("Unable to locate bundle");
+        }
+
+        List<String> lines = new ArrayList<String>();
+
+        Bundle bundle = quasiBundle.getBundle();
+        if(bundle != null){
+			Dictionary<String, String> headers = bundle.getHeaders();
+	        Enumeration<String> keys = headers.keys();
+	        while (keys.hasMoreElements()) {
+	            String key = keys.nextElement();
+	            lines.add(String.format("%s: ", key));
+	            lines.addAll(formatHeaderValue(headers.get(key)));
+	        }
+        }
+        return lines;
+    }
+
+    private List<ArtifactHolder> getArtifactHolders(List<ManageableArtifact> artifacts) {
+        List<ArtifactHolder> artifactHolders = new ArrayList<ArtifactHolder>(artifacts.size());
+
+        List<QuasiBundle> bundles = this.quasiBundleUtil.getAllBundles();
+        
+        for (ManageableArtifact artifact : artifacts) {
+            ArtifactHolder artifactHolder = getArtifactHolder(artifact, bundles);
+            if (artifactHolder != null) {
+                artifactHolders.add(artifactHolder);
+            }
+        }
+
+        return artifactHolders;
+    }
+
+    private ArtifactHolder getArtifactHolder(ManageableArtifact artifact, List<QuasiBundle> bundles) {
+        Version v = new Version(artifact.getVersion());
+        Set<Long> bundleIds = userRegion.getBundleIds();
+        for (QuasiBundle bundle : bundles) {
+            if (bundle.getSymbolicName().equals(artifact.getName()) && bundle.getVersion().equals(v) && bundleIds.contains(bundle.getBundleId())) {
+                return new ArtifactHolder(artifact, bundle, moduleContextAccessor);
+            }
+        }
+        return null;
+    }
+
+    private List<String> formatHeaderValue(String value) {
+        List<String> lines = new ArrayList<String>();
+
+        Reader reader = new StringReader(value);
+        char[] buffer = new char[71];
+        int length = 0;
+        try {
+            while ((length = reader.read(buffer)) != -1) {
+                lines.add(String.format(" %s", new String(buffer, 0, length)));
+            }
+        } catch (IOException e) {
+            // Do nothing
+        }
+        return lines;
+    }
+
+    private static class ArtifactHolder implements Comparable<ArtifactHolder> {
+
+        private final ModuleContextAccessor moduleContextAccessor;
+
+        private final ManageableArtifact artifact;
+
+        private final QuasiBundle bundle;
+
+        public ArtifactHolder(ManageableArtifact artifact, QuasiBundle bundle, ModuleContextAccessor moduleContextAccessor) {
+            this.artifact = artifact;
+            this.bundle = bundle;
+            this.moduleContextAccessor = moduleContextAccessor;
+        }
+
+        public Long getId() {
+            return this.bundle.getBundleId();
+        }
+
+        public String getName() {
+            return artifact.getName();
+        }
+
+        public String getState() {
+            return artifact.getState();
+        }
+
+        public String getVersion() {
+            return artifact.getVersion();
+        }
+
+        public String getBundleLocation() {
+            return this.bundle.getBundleLocation();
+        }
+
+        public boolean getSpringPowered() {
+            Bundle realBundle = bundle.getBundle();
+            if (realBundle != null) {
+                ModuleContext moduleContext = moduleContextAccessor.getModuleContext(realBundle);
+                if (moduleContext != null) {
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        public List<QuasiExportPackage> getExportPackages() {
+            return bundle.getExportPackages();
+        }
+
+        public List<QuasiImportPackage> getImportPackages() {
+            return bundle.getImportPackages();
+        }
+
+        public List<QuasiBundle> getFragments() {
+            return bundle.getFragments();
+        }
+
+        public List<QuasiBundle> getHosts() {
+            return bundle.getHosts();
+        }
+
+        public List<ServiceHolder> getPublishedServices(QuasiServiceUtil quasiServiceUtil) {
+        	List<ServiceHolder> services = new ArrayList<ServiceHolder>();
+        	List<ServiceHolder> allServices = quasiServiceUtil.getAllServices();
+        	for (ServiceHolder quasiLiveService : allServices) {
+				if(quasiLiveService.getProvider().equals(bundle)){
+					services.add(quasiLiveService);
+				}
+			}
+            return services;
+        }
+
+        public List<ServiceHolder> getConsumedServices(QuasiServiceUtil quasiServiceUtil) {
+        	List<ServiceHolder> services = new ArrayList<ServiceHolder>();
+        	List<ServiceHolder> allServices = quasiServiceUtil.getAllServices();
+        	for (ServiceHolder quasiLiveService : allServices) {
+        		List<QuasiBundle> consumers = quasiLiveService.getConsumers();
+        		for (QuasiBundle quasiBundle : consumers) {
+    				if(quasiBundle.equals(bundle) && !services.contains(quasiLiveService)){
+    					services.add(quasiLiveService);
+    				}
+				}
+			}
+            return services;
+        }
+
+        public int compareTo(ArtifactHolder o) {
+            return getId().compareTo(o.getId());
+        }
+
+        @Override
+        public int hashCode() {
+            return getId().hashCode();
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            return obj instanceof ArtifactHolder && getId().equals(((ArtifactHolder) obj).getId());
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/formatting/CompositeInstallArtifactCommandFormatter.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/formatting/CompositeInstallArtifactCommandFormatter.java
new file mode 100644
index 0000000..ec84d26
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/formatting/CompositeInstallArtifactCommandFormatter.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.formatting;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.management.ObjectName;
+
+import org.eclipse.virgo.kernel.model.management.ManageableCompositeArtifact;
+
+public final class CompositeInstallArtifactCommandFormatter extends AbstractInstallArtifactCommandFormatter<ManageableCompositeArtifact> {
+
+    private static final String CHILD_FORMAT = "    %s %s %s";
+
+    public List<String> formatExamine(ManageableCompositeArtifact artifact) {
+        List<String> lines = new ArrayList<String>();
+
+        lines.add(String.format("State:  %s", artifact.getState()));
+        lines.add(String.format("Scoped: %s", artifact.isScoped()));
+        lines.add(String.format("Atomic: %s", artifact.isAtomic()));
+        lines.add("");
+        lines.add("Children:");
+
+        for (ObjectName child : artifact.getDependents()) {
+            lines.add(String.format(CHILD_FORMAT, child.getKeyProperty("artifact-type"), child.getKeyProperty("name"),
+                child.getKeyProperty("version")));
+        }
+
+        return lines;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/formatting/ConfigInstallArtifactCommandFormatter.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/formatting/ConfigInstallArtifactCommandFormatter.java
new file mode 100644
index 0000000..cfd310a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/formatting/ConfigInstallArtifactCommandFormatter.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.formatting;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.List;
+
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+
+import org.eclipse.virgo.kernel.model.management.ManageableArtifact;
+
+public final class ConfigInstallArtifactCommandFormatter extends AbstractInstallArtifactCommandFormatter<ManageableArtifact> {
+
+    private final ConfigurationAdmin configurationAdmin;
+
+    public ConfigInstallArtifactCommandFormatter(ConfigurationAdmin configurationAdmin) {
+        this.configurationAdmin = configurationAdmin;
+    }
+
+    public List<String> formatExamine(ManageableArtifact artifact) {
+        List<String> lines = new ArrayList<String>();
+
+        Configuration configuration;
+        try {
+            configuration = this.configurationAdmin.getConfiguration(artifact.getName(), null);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+
+        String factoryPid = configuration.getFactoryPid();
+        String bundleLocation = configuration.getBundleLocation();
+
+        lines.add(String.format("Factory pid:     %s", factoryPid == null ? "" : factoryPid));
+        lines.add(String.format("Bundle Location: %s", bundleLocation == null ? "" : bundleLocation));
+
+        lines.addAll(formatProperties(configuration));
+
+        return lines;
+    }
+
+    private List<String> formatProperties(Configuration configuration) {
+        List<String> lines = new ArrayList<String>();
+        List<String> propertyKeys = new ArrayList<String>();
+
+        Dictionary<String, Object> properties = configuration.getProperties();
+        if (properties != null) {
+            Enumeration<String> keys = properties.keys();
+            while (keys.hasMoreElements()) {
+                propertyKeys.add(keys.nextElement());
+            }
+            Collections.sort(propertyKeys);
+
+            lines.add("");
+            lines.add(String.format("Properties:"));
+            for (String propertyKey : propertyKeys) {
+                lines.add(String.format("    %s:", propertyKey));
+
+                List<String> values = PropertyFormatter.formatPropertyValue(properties.get(propertyKey), MAX_LINE_LENGTH);
+                for (String value : values) {
+                    lines.add(String.format("        %s", value));
+                }
+            }
+        }
+
+        return lines;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/formatting/InstallArtifactCommandFormatter.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/formatting/InstallArtifactCommandFormatter.java
new file mode 100644
index 0000000..6056ad3
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/formatting/InstallArtifactCommandFormatter.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.formatting;
+
+import java.util.List;
+
+import org.eclipse.virgo.kernel.model.management.ManageableArtifact;
+
+public interface InstallArtifactCommandFormatter<T extends ManageableArtifact> {
+
+    List<String> formatList(List<T> artifacts);
+
+    List<String> formatExamine(T artifact);
+
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/formatting/PackageCommandFormatter.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/formatting/PackageCommandFormatter.java
new file mode 100644
index 0000000..2db3c72
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/formatting/PackageCommandFormatter.java
@@ -0,0 +1,142 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.formatting;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiBundle;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiExportPackage;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiImportPackage;
+
+public final class PackageCommandFormatter {
+
+    private static final int MAX_LINE_LENGTH = 80;
+
+    private static final String NAME = "Name";
+
+    private static final String VERSION = "Version";
+
+    private static final String PROVIDER = "Providing Bundle";
+
+    public List<String> formatList(List<QuasiExportPackage> packages) {
+        Collections.sort(packages, new QuasiExportPackageComparator());
+
+        int maxNameLength = NAME.length();
+        int maxVersionLength = VERSION.length();
+        for (QuasiExportPackage exportPackage : packages) {
+            int nameLength = exportPackage.getPackageName().length();
+            maxNameLength = nameLength > maxNameLength ? nameLength : maxNameLength;
+            int versionLength = exportPackage.getVersion().toString().length();
+            maxVersionLength = versionLength > maxVersionLength ? versionLength : maxVersionLength;
+        }
+
+        List<String> lines = new ArrayList<String>();
+        String format = String.format("%%-%ds %%-%ds %%%ds", maxNameLength, maxVersionLength, MAX_LINE_LENGTH
+            - (2 + maxNameLength + maxVersionLength));
+        lines.add(String.format(format, NAME, VERSION, PROVIDER));
+
+        for (QuasiExportPackage exportPackage : packages) {
+            lines.add(String.format(format, exportPackage.getPackageName(), exportPackage.getVersion().toString(),
+                exportPackage.getExportingBundle().getBundleId()));
+        }
+
+        return lines;
+    }
+
+    public List<String> formatExamine(List<QuasiExportPackage> exportPackages) {
+        List<String> lines = new ArrayList<String>();
+
+        boolean first = true;
+
+        for (QuasiExportPackage exportPackage : exportPackages) {
+            if (!first) {
+                lines.add("");
+                lines.add("");
+            }
+            QuasiBundle exportingBundle = exportPackage.getExportingBundle();
+            lines.add(String.format("Exporter: %s %s [%s]", exportingBundle.getSymbolicName(), exportingBundle.getVersion().toString(),
+                exportingBundle.getBundleId()));
+
+            lines.add("");
+            lines.add(String.format("Attributes:"));
+            lines.addAll(formatProperties(exportPackage.getAttributes()));
+
+            lines.add("");
+            lines.add(String.format("Directives:"));
+            lines.addAll(formatProperties(exportPackage.getDirectives()));
+
+            lines.add("");
+            lines.add(String.format("Importer(s):"));
+            if (exportPackage.getConsumers().isEmpty()) {
+                lines.add(String.format("    %s", "None"));
+            } else {
+                for (QuasiImportPackage importPackage : exportPackage.getConsumers()) {
+                    QuasiBundle importingBundle = importPackage.getImportingBundle();
+                    lines.add(String.format("    %s %s [%s]", importingBundle.getSymbolicName(), importingBundle.getVersion().toString(),
+                        importingBundle.getBundleId()));
+                    lines.add(String.format("        Import-Package attributes:"));
+                    lines.addAll(formatProperties(importPackage.getAttributes(), "            "));
+                    lines.add(String.format("        Import-Package directives:"));
+                    lines.addAll(formatProperties(importPackage.getDirectives(), "            "));
+                }
+            }
+            first = false;
+        }
+
+        return lines;
+    }
+
+    private List<String> formatProperties(Map<String, Object> properties) {
+        return formatProperties(properties, "    ");
+    }
+
+    private List<String> formatProperties(Map<String, Object> properties, String indent) {
+        List<String> lines = new ArrayList<String>();
+        List<String> keys = new ArrayList<String>(properties.keySet());
+        if (keys.isEmpty()) {
+            lines.add(String.format("%s%s", indent, "None"));
+        } else {
+            Collections.sort(keys);
+
+            for (String key : keys) {
+                lines.add(String.format("%s%s:", indent, key));
+                Object value = properties.get(key);
+                if (value instanceof Object[]) {
+                    List<String> propertyLines = PropertyFormatter.formatPropertyValue(value, MAX_LINE_LENGTH - 8);
+                    for (String propertyLine : propertyLines) {
+                        lines.add(String.format("%s    %s", indent, propertyLine));
+                    }
+                } else {
+                    lines.add(String.format("%s    %s", indent, value));
+                }
+            }
+        }
+        return lines;
+    }
+
+    private static class QuasiExportPackageComparator implements Comparator<QuasiExportPackage> {
+
+        public int compare(QuasiExportPackage package1, QuasiExportPackage package2) {
+            int value = package1.getPackageName().compareTo(package2.getPackageName());
+            if (value != 0) {
+                return value;
+            }
+            return package1.getVersion().compareTo(package2.getVersion());
+        }
+
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/formatting/PropertyFormatter.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/formatting/PropertyFormatter.java
new file mode 100644
index 0000000..e6793ee
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/formatting/PropertyFormatter.java
@@ -0,0 +1,111 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.formatting;
+
+import java.lang.reflect.Array;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * A helper class for formatting properties.
+ * 
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe
+ * 
+ */
+public class PropertyFormatter {
+
+    /**
+     * Formats the supplied value into one or more Strings. Each String in the <code>List</code> represents a line of
+     * output.
+     * 
+     * <p />
+     * If <code>value</code> is a single object, i.e. it is not an array, the returned list will contain a single line -
+     * the <code>toString</code> of <code>value</code>. If <code>value</code> is an array, lines in the list are formed
+     * by concatenating the <code>toString</code> of each entry in the array, wrapping when <code>maxLineLength</code>
+     * is reached.
+     * 
+     * <p />
+     * If an individual <code>toString</code> is longer that the given <code>maxLineLength</code> the full string will
+     * be included as a line in the returned <code>List</code>, i.e. individual Strings are not truncated and the
+     * <code>maxLineLength</code> will be exceeded.
+     * 
+     * @param value the value to format
+     * @param maxLineLength the desired maximum line length
+     * @return the formatted value, one list entry per line
+     */
+    public static List<String> formatPropertyValue(Object value, int maxLineLength) {
+
+        String[] strings;
+        if (value.getClass().isArray()) {
+            strings = arrayToStrings(value);
+        } else {
+            strings = new String[] { value.toString() };
+        }
+
+        int lineLength = 0;
+
+        List<String> formatted = new ArrayList<String>();
+
+        StringBuilder builder = new StringBuilder();
+
+        for (int i = 0; i < strings.length; i++) {
+            String item;
+            if (i < strings.length - 1) {
+                item = strings[i] + ", ";
+            } else {
+                item = strings[i];
+            }
+
+            if (!isSufficientRoomForNextItem(item, lineLength, maxLineLength) && addEntryIfNecessary(builder, formatted)) {
+                builder = new StringBuilder();
+                lineLength = 0;
+            }
+
+            builder.append(item);
+            lineLength += item.length();
+        }
+
+        addEntryIfNecessary(builder, formatted);
+
+        return formatted;
+    }
+
+    private static boolean addEntryIfNecessary(StringBuilder builder, List<String> entries) {
+        String string = builder.toString();
+        if (!string.isEmpty()) {
+            entries.add(string);
+            return true;
+        }
+        return false;
+    }
+
+    private static boolean isSufficientRoomForNextItem(String item, int currentLineLength, int maxLineLength) {
+        return (currentLineLength + item.length()) <= maxLineLength;
+    }
+
+    private static String[] arrayToStrings(Object array) {
+
+        int length = Array.getLength(array);
+        String[] strings = new String[length];
+
+        for (int i = 0; i < length; i++) {
+            Object object = Array.get(array, i);
+            strings[i] = object == null ? "null" : object.toString();
+        }
+
+        return strings;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/formatting/ServiceCommandFormatter.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/formatting/ServiceCommandFormatter.java
new file mode 100644
index 0000000..00ddb3b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/formatting/ServiceCommandFormatter.java
@@ -0,0 +1,151 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.formatting;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+
+import org.osgi.framework.Constants;
+
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiBundle;
+import org.eclipse.virgo.shell.internal.util.ServiceHolder;
+import org.eclipse.virgo.util.common.StringUtils;
+
+public final class ServiceCommandFormatter {
+
+    private static final int MAX_LINE_LENGTH = 80;
+
+    private static final String MULTIPLE_OBJECT_CLASSES_SUFFIX = ", ...";
+
+    private static final String ID = "Id";
+
+    private static final String OBJECT_CLASSES = "Object Class(es)";
+
+    private static final String PROVIDER = "Providing Bundle";
+
+    public List<String> formatList(List<ServiceHolder> services) {
+        Collections.sort(services, new QuasiLiveServiceComparator());
+
+        int maxIdLength = ID.length();
+        int maxProviderLength = PROVIDER.length();
+        for (ServiceHolder service : services) {
+            int idLength = ((Long) service.getServiceId()).toString().length();
+            maxIdLength = idLength > maxIdLength ? idLength : maxIdLength;
+            int providerLength = ((Long) service.getProvider().getBundleId()).toString().length();
+            maxProviderLength = providerLength > maxProviderLength ? providerLength : maxProviderLength;
+        }
+
+        int objectClassWidth = MAX_LINE_LENGTH - (2 + maxIdLength + maxProviderLength);
+
+        List<String> lines = new ArrayList<String>();
+        String format = String.format("%%-%ds %%-%ds %%%ds", maxIdLength, objectClassWidth, maxProviderLength);
+        lines.add(String.format(format, ID, OBJECT_CLASSES, PROVIDER));
+
+        for (ServiceHolder service : services) {
+            Object objectClass = service.getProperties().get(Constants.OBJECTCLASS);
+            lines.add(String.format(format, service.getServiceId(), formatObjectClass(objectClass, objectClassWidth),
+                service.getProvider().getBundleId()));
+        }
+
+        return lines;
+    }
+
+    public List<String> formatExamine(ServiceHolder service) {
+        List<String> lines = new ArrayList<String>();
+
+        lines.add(String.format("Properties:"));
+        lines.addAll(formatProperties(service.getProperties()));
+
+        QuasiBundle provider = service.getProvider();
+        lines.add("");
+        lines.add(String.format("Publisher: %s %s [%s]", provider.getSymbolicName(), provider.getVersion().toString(), provider.getBundleId()));
+
+        lines.add("");
+        lines.add(String.format("Consumer(s):"));
+        List<QuasiBundle> consumers = service.getConsumers();
+        if (consumers.size() == 0) {
+            lines.add(String.format("    None"));
+        } else {
+            for (QuasiBundle consumer : consumers) {
+                lines.add(String.format("    %s %s [%s]", consumer.getSymbolicName(), consumer.getVersion().toString(), consumer.getBundleId()));
+            }
+        }
+
+        return lines;
+    }
+
+    private static String formatObjectClass(Object objectClass, int maxLength) {
+        StringBuilder sb = new StringBuilder();
+        if (objectClass == null) {
+            objectClass = new String[0];
+        }
+        String[] objectClasses;
+        if (objectClass instanceof String) {
+            objectClasses = StringUtils.commaDelimitedListToStringArray((String) objectClass);
+        } else if (objectClass instanceof Object[]) {
+            objectClasses = (String[]) objectClass;
+        } else {
+            objectClasses = StringUtils.commaDelimitedListToStringArray(objectClass.toString());
+        }
+
+        if (objectClasses.length == 0) {
+            sb.append("<none>");
+        } else {
+            if (objectClasses.length > 1) {
+                maxLength -= MULTIPLE_OBJECT_CLASSES_SUFFIX.length();
+            }
+
+            String formattedObjectClass = StringUtils.abbreviateDotSeparatedString(objectClasses[0], maxLength);
+            sb.append(formattedObjectClass);
+
+            if (objectClasses.length > 1) {
+                sb.append(MULTIPLE_OBJECT_CLASSES_SUFFIX);
+            }
+        }
+
+        return sb.toString();
+    }
+
+    private List<String> formatProperties(Map<String, Object> properties) {
+        List<String> lines = new ArrayList<String>();
+        List<String> keys = new ArrayList<String>(properties.keySet());
+        Collections.sort(keys);
+
+        for (String key : keys) {
+            lines.add(String.format("    %s:", key));
+            Object value = properties.get(key);
+            if (value instanceof Object[]) {
+                List<String> propertyLines = PropertyFormatter.formatPropertyValue(value, MAX_LINE_LENGTH - 8);
+                for (String propertyLine : propertyLines) {
+                    lines.add(String.format("        %s", propertyLine));
+                }
+            } else {
+                lines.add(String.format("        %s", value));
+            }
+        }
+        
+        return lines;
+    }
+
+    private static class QuasiLiveServiceComparator implements Comparator<ServiceHolder> {
+
+        public int compare(ServiceHolder service1, ServiceHolder service2) {
+            Long id1 = service1.getServiceId();
+            Long id2 = service2.getServiceId();
+            return id1.compareTo(id2);
+        }
+
+    }
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/help/HelpAccessor.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/help/HelpAccessor.java
new file mode 100644
index 0000000..3caabba
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/help/HelpAccessor.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.help;
+
+import java.util.List;
+
+
+/**
+ * Helper interface that retrieves summary and detailed help for a given shell class, if it exists.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ * Implementations must be thread-safe.
+ *
+ */
+public interface HelpAccessor {
+
+    /**
+     * Get the summary string (for use in a list) for the {@link Class} <code>clazz</code> obtained
+     * from a help resource file in the bundle in which the class belongs.
+     * <br/>
+     * <code>null</code> is returned if the class is not part of a bundle, or if no help resource is found there.
+     * @param clazz for which help is retrieved
+     * @return summary string for {@link Class} <code>clazz</code> - typically one line.
+     */
+    String getSummaryHelp(Class<?> clazz);
+    
+    /**
+     * Get the detailed string (for use in a single description) for the {@link Class} <code>clazz</code> obtained
+     * from a help resource file in the bundle in which the class belongs.
+     * <br/>
+     * <code>null</code> is returned if the class is not part of a bundle, or if no help resource is found there.
+     * @param clazz for which help is retrieved
+     * @return summary string for {@link Class} <code>clazz</code> - typically multi-line.
+     */
+    List<String> getDetailedHelp(Class<?> clazz);
+    
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/help/SimpleFileHelpAccessor.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/help/SimpleFileHelpAccessor.java
new file mode 100644
index 0000000..48f9117
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/help/SimpleFileHelpAccessor.java
@@ -0,0 +1,149 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.help;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.virgo.util.io.IOUtils;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.FrameworkUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Implementation of {@link HelpAccessor} which searches for a simple text file resource in the bundle of the class.
+ * <p/>
+ * The name of the file resource is the fully-qualified class name followed by "<code>.help</code>". <br/>
+ * Lines beginning with a hash (pound) sign '#', as the first character, are comment lines; all other lines are
+ * 'content' lines. <br/>
+ * Comment lines are ignored. <br/>
+ * All strings returned are terminated by a newline character.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread-safe.
+ * 
+ */
+public class SimpleFileHelpAccessor implements HelpAccessor {
+
+    private static final char HELP_FILE_COMMENT_CHARACTER = '#';
+
+    private static final String HELP_ACCESSOR_RESOURCE_EXTENSION = ".help";
+
+    private static final Logger logger = LoggerFactory.getLogger(SimpleFileHelpAccessor.class);
+
+    /**
+     * {@inheritDoc}
+     */
+    public List<String> getDetailedHelp(Class<?> clazz) {
+        try (BufferedReader readFileIn = this.helpResourceReader(clazz)) {
+            if (readFileIn != null) {
+                return readAllButFirstHelpLines(readFileIn);
+            }
+        } catch (IOException ioe) {
+            logger.error(String.format("Exception reading help resource for class '%s'.", clazz.getCanonicalName()), ioe);
+        }
+        return Collections.emptyList();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getSummaryHelp(Class<?> clazz) {
+        try (BufferedReader readFileIn = this.helpResourceReader(clazz)) {
+            if (readFileIn != null) {
+                return readFirstHelpLine(readFileIn);
+            }
+        } catch (IOException ioe) {
+            logger.error(String.format("Exception reading help resource for class '%s'.", clazz.getCanonicalName()), ioe);
+        }
+        return null;
+    }
+
+    private final String readFirstHelpLine(BufferedReader reader) throws IOException {
+        String line = reader.readLine();
+        while (line != null) {
+            if (contentLine(line)) {
+                return line;
+            }
+            line = reader.readLine();
+        }
+        return line;
+    }
+
+    private final List<String> readAllButFirstHelpLines(BufferedReader reader) throws IOException {
+        List<String> lines = new ArrayList<String>();
+
+        String line = reader.readLine();
+        boolean skipLine = true;
+        while (line != null) {
+            if (contentLine(line)) {
+                if (!skipLine) {
+                    lines.add(line);
+                } else {
+                    skipLine = false;
+                }
+            }
+            line = reader.readLine();
+        }
+
+        return lines;
+    }
+
+    private static final boolean contentLine(String line) {
+        if (line == null)
+            return false;
+        return (line.length() == 0 || line.charAt(0) != HELP_FILE_COMMENT_CHARACTER);
+    }
+
+    private final BufferedReader helpResourceReader(Class<?> clazz) {
+        BufferedReader readFileIn = null;
+        String className = clazz.getCanonicalName();
+        if (className != null) {
+            String fileResourceName = new StringBuffer(className).append(HELP_ACCESSOR_RESOURCE_EXTENSION).toString();
+            URL resourceUrl = this.helpResourceUrl(clazz, fileResourceName);
+            if (resourceUrl != null) {
+                InputStream resourceIn = null;
+                try {
+                    resourceIn = resourceUrl.openStream();
+                    readFileIn = new BufferedReader(new InputStreamReader(resourceIn, UTF_8));
+                } catch (IOException ioe) {
+                    logger.error(String.format("Exception reading help resource '%s'.", resourceUrl), ioe);
+                    IOUtils.closeQuietly(resourceIn);
+                    return null;
+                }
+            }
+        }
+        return readFileIn;
+    }
+
+    protected URL helpResourceUrl(Class<?> clazz, String fileResourceName) {
+        Bundle bundle = FrameworkUtil.getBundle(clazz);
+        try {
+            if (bundle != null) {
+                return bundle.getResource(fileResourceName);
+            }
+        } catch (IllegalStateException ise) {
+            logger.error(String.format("Exception obtaining help resource file '%s'.", fileResourceName), ise);
+        }
+        return null;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/parsing/ParsedCommand.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/parsing/ParsedCommand.java
new file mode 100644
index 0000000..7bfddcd
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/parsing/ParsedCommand.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.parsing;
+
+import java.util.Arrays;
+
+/**
+ * A <code>ParsedCommand</code> represents a command that has been parsed into the top-level command and its arguments.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ * 
+ */
+public final class ParsedCommand {
+
+    private final String command;
+
+    private final String[] arguments;
+
+    public ParsedCommand(String command, String[] arguments) {
+        this.command = command;
+        this.arguments = arguments.clone();
+    }
+
+    public String getCommand() {
+        return command;
+    }
+
+    public String[] getArguments() {
+        return arguments.clone();
+    }
+
+    public String toString() {
+        StringBuilder builder = new StringBuilder(command);
+
+        for (String arg : this.arguments) {
+            builder.append(" ").append(arg);
+        }
+        return builder.toString();
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + Arrays.hashCode(this.arguments);
+        result = prime * result + ((this.command == null) ? 0 : this.command.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        ParsedCommand other = (ParsedCommand) obj;
+        if (!Arrays.equals(this.arguments, other.arguments))
+            return false;
+        if (!this.command.equals(other.command))
+            return false;
+        return true;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/parsing/ParsingUtils.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/parsing/ParsingUtils.java
new file mode 100644
index 0000000..216116d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/parsing/ParsingUtils.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.parsing;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.StringTokenizer;
+
+import org.eclipse.virgo.util.common.StringUtils;
+
+
+/**
+ * Utility methods for parsing command input.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Thread-safe.
+ *
+ */
+public class ParsingUtils {
+    
+    private static final String DELIMITER = " ";
+    
+    private static final String EMPTY_STRING = "";
+    
+    /**
+     * Parses the supplied command.
+     * 
+     * @param command the command to parse
+     * 
+     * @return The parsed command.
+     */
+    public static ParsedCommand parseCommand(CharSequence command) {
+        
+        String commandString = command.toString();
+        String[] tokens = StringUtils.tokenizeToStringArray(commandString, DELIMITER);
+        if (tokens.length == 0) {
+            return null;
+        }
+
+        String commandName = tokens[0];
+        String[] arguments = getArguments(commandString.substring(commandName.length()));        
+        
+        return new ParsedCommand(commandName, arguments);
+    }
+    
+    private static String[] getArguments(String buffer) {
+        
+        List<String> arguments = new ArrayList<String>();
+        
+        StringTokenizer tokenizer = new StringTokenizer(buffer, DELIMITER, true);        
+        while (tokenizer.hasMoreElements()) {
+            String token = tokenizer.nextToken();
+            
+            if (DELIMITER.equals(token)) {
+                if (!tokenizer.hasMoreElements()) {
+                    arguments.add(EMPTY_STRING);
+                }
+            } else {
+                arguments.add(token);
+            }
+        }
+        
+        return arguments.toArray(new String[arguments.size()]);
+    }
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/util/ArtifactRetriever.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/util/ArtifactRetriever.java
new file mode 100644
index 0000000..14627e9
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/util/ArtifactRetriever.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.util;
+
+import java.lang.management.ManagementFactory;
+
+import javax.management.InstanceNotFoundException;
+import javax.management.JMX;
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+
+import org.eclipse.equinox.region.Region;
+import org.eclipse.virgo.kernel.model.management.ManageableArtifact;
+import org.eclipse.virgo.kernel.model.management.RuntimeArtifactModelObjectNameCreator;
+import org.osgi.framework.Version;
+
+/**
+ * <p>
+ * ArtifactRetriever is responsible for obtaining artifacts from the MBean server 
+ * MBeans published by the Runtime Artifact Model. One instance of this class can
+ * only retrieve MBeans backed by the given type T.
+ * </p>
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * ArtifactRetriever is threadsafe
+ *
+ * @param <T> type of artifact retrieved
+ */
+public final class ArtifactRetriever<T extends ManageableArtifact> {
+
+    private final MBeanServer server = ManagementFactory.getPlatformMBeanServer();
+
+    private final String type;
+
+    private final RuntimeArtifactModelObjectNameCreator objectNameCreator;
+    
+    private final Class<T> artifactType;
+
+    /**
+     * 
+     * @param type
+     * @param objectNameCreator
+     * @param artifactType
+     */
+    public ArtifactRetriever(String type, RuntimeArtifactModelObjectNameCreator objectNameCreator, Class<T> artifactType) {
+        this.type = type;
+        this.objectNameCreator = objectNameCreator;
+        this.artifactType = artifactType;
+    }
+    
+    /**
+     * @param name
+     * @param version
+     * @param region
+     * @return
+     * @throws InstanceNotFoundException
+     */
+    public T getArtifact(String name, Version version, Region region) throws InstanceNotFoundException {
+        return getArtifact(this.objectNameCreator.createArtifactModel(this.type, name, version, region));
+    }
+
+    /**
+     * 
+     * @param objectName
+     * @return artifact
+     * @throws InstanceNotFoundException
+     */
+    public T getArtifact(final ObjectName objectName) throws InstanceNotFoundException {
+        if (this.server.isRegistered(objectName)) {
+            return JMX.newMXBeanProxy(this.server, objectName, this.artifactType);
+        }
+        throw new InstanceNotFoundException(String.format("Instance '%s' not found", objectName.getCanonicalName()));
+    }
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/util/PackageHolder.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/util/PackageHolder.java
new file mode 100644
index 0000000..da99bc0
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/util/PackageHolder.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.util;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiExportPackage;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiImportPackage;
+import org.eclipse.virgo.util.common.StringUtils;
+
+
+/**
+ * <p>
+ * QuasiPackageUtil acts as a simple data holder
+ * </p>
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * QuasiPackageUtil is immutable.
+ *
+ */
+public final class PackageHolder {
+
+    private final String packageName;
+    
+    private final List<QuasiImportPackage> quasiImportPackages;
+    
+    private final List<QuasiExportPackage> quasiExportPackages;
+
+    public PackageHolder(List<QuasiExportPackage> quasiExportPackages, List<QuasiImportPackage> quasiImportPackages, String packageName) {
+        if(!StringUtils.hasLength(packageName)){
+            throw new IllegalArgumentException("QuasiPackageName must not be null and have at least one character");
+        }
+        this.quasiExportPackages = quasiExportPackages == null ? new ArrayList<QuasiExportPackage>() : quasiExportPackages;
+        this.quasiImportPackages = quasiImportPackages == null ? new ArrayList<QuasiImportPackage>() : quasiImportPackages;
+        this.packageName = packageName;
+    }
+    
+    /** 
+     * {@inheritDoc}
+     */
+    public List<QuasiExportPackage> getExporters() {
+        return this.quasiExportPackages;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public List<QuasiImportPackage> getImporters() {
+        return this.quasiImportPackages;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public String getPackageName() {
+        return this.packageName;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/util/QuasiBundleUtil.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/util/QuasiBundleUtil.java
new file mode 100644
index 0000000..139bc49
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/util/QuasiBundleUtil.java
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2012 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.virgo.shell.internal.util;
+
+import java.util.List;
+
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiBundle;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiFramework;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiFrameworkFactory;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiResolutionFailure;
+
+/**
+ * Utility methods to help with Bundle related commands and formatting
+ *
+ */
+public final class QuasiBundleUtil {
+
+	private QuasiFrameworkFactory quasiFrameworkFactory;
+
+	/**
+	 * 
+	 * @param quasiFrameworkFactory
+	 */
+	public QuasiBundleUtil(QuasiFrameworkFactory quasiFrameworkFactory) {
+		this.quasiFrameworkFactory = quasiFrameworkFactory;
+	}
+	
+	/**
+	 * 
+	 * @return
+	 */
+    public List<QuasiBundle> getAllBundles() {
+        return this.getQuasiFramework().getBundles();
+    }
+    
+    /**
+     * 
+     * @param bundleId
+     * @return
+     */
+    public QuasiBundle getBundle(long bundleId) {
+        return this.getQuasiFramework().getBundle(bundleId);
+    }
+    
+    /**
+     * 
+     * @param bundleId
+     * @return
+     */
+    public List<QuasiResolutionFailure> getResolverReport(long bundleId) {
+        QuasiFramework framework = this.getQuasiFramework();
+        // We only care about the side-effect here
+        framework.resolve();
+        return framework.diagnose(bundleId);
+    }
+
+    /**
+     * 
+     * @return
+     */
+    private QuasiFramework getQuasiFramework() {
+        return this.quasiFrameworkFactory.create();
+    }
+    
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/util/QuasiServiceUtil.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/util/QuasiServiceUtil.java
new file mode 100644
index 0000000..e652fd1
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/util/QuasiServiceUtil.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.virgo.shell.internal.util;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.SortedMap;
+import java.util.TreeMap;
+import java.util.Map.Entry;
+
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiFrameworkFactory;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * Util methods to help with Service related commands and formatting
+ *
+ */
+public class QuasiServiceUtil {
+
+	private QuasiFrameworkFactory quasiFrameworkFactory;
+	private BundleContext bundleContext;
+
+	public QuasiServiceUtil(BundleContext bundleContext, QuasiFrameworkFactory quasiFrameworkFactory) {
+		this.bundleContext = bundleContext.getBundle(0l).getBundleContext();
+		this.quasiFrameworkFactory = quasiFrameworkFactory;
+	}
+	
+    public ServiceHolder getService(long serviceId) {
+    	SortedMap<Long, ServiceHolder> services = getServicesSortedMap();
+        return services.get(serviceId);
+    }
+    
+    public List<ServiceHolder> getAllServices() {
+        List<ServiceHolder> quasiLiveServices = new ArrayList<ServiceHolder>();
+        SortedMap<Long, ServiceHolder> services = getServicesSortedMap();
+        for (Entry<Long, ServiceHolder> serviceEntry : services.entrySet()) {
+            quasiLiveServices.add(serviceEntry.getValue());
+        }
+        return quasiLiveServices;
+    }
+
+    private SortedMap<Long, ServiceHolder> getServicesSortedMap() {
+        SortedMap<Long, ServiceHolder> services = new TreeMap<Long, ServiceHolder>();
+        ServiceReference<?>[] allServiceReferences = null;
+        try {
+            allServiceReferences = this.bundleContext.getAllServiceReferences(null, null);
+        } catch (InvalidSyntaxException e) {
+            // Will not happen
+            return services;
+        }
+        if(allServiceReferences == null){
+            return services;
+        }
+        for (ServiceReference<?> serviceReference : allServiceReferences) {
+        	ServiceHolder service = new ServiceHolder(this.quasiFrameworkFactory.create(), serviceReference);
+            services.put(service.getServiceId(), service);
+        }
+        return services;
+    }
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/util/ServiceHolder.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/util/ServiceHolder.java
new file mode 100644
index 0000000..60e2515
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/internal/util/ServiceHolder.java
@@ -0,0 +1,132 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.util;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceReference;
+
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiBundle;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiFramework;
+
+/**
+ * <p>
+ * QuasiServiceUtil provides an extension of the Quasi abstraction that allows information on the services 
+ * of a live/running OSGi state to be explored. It can also be sorted for when it is being rendered to a 
+ * user interface from a set.
+ * </p>
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * QuasiServiceUtil is threadsafe
+ *
+ */
+public final class ServiceHolder implements Comparable<ServiceHolder> {
+
+    private final ServiceReference<?> serviceReference;
+    
+    private final QuasiFramework quasiFramework;
+
+    public ServiceHolder(QuasiFramework quasiFramework, ServiceReference<?> serviceReference) {
+        this.serviceReference = serviceReference;
+        this.quasiFramework = quasiFramework;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public long getServiceId() {
+        return (Long) this.serviceReference.getProperty(Constants.SERVICE_ID);
+    }
+    
+    /** 
+     * {@inheritDoc}
+     */
+    public List<QuasiBundle> getConsumers() {
+        List<QuasiBundle> quasiUsers = new ArrayList<QuasiBundle>();
+        Bundle[] usingBundles = this.serviceReference.getUsingBundles();
+        if(usingBundles != null){
+            for(Bundle user : usingBundles){
+            	quasiUsers.add(this.quasiFramework.getBundle(user.getBundleId()));
+            }
+        }
+        return quasiUsers;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public QuasiBundle getProvider() {
+        Bundle providingBundle = this.serviceReference.getBundle();
+        return this.quasiFramework.getBundle(providingBundle.getBundleId());
+    }
+    
+    /**
+     * {@inheritDoc}
+     */
+    public Map<String, Object> getProperties() {
+        Map<String, Object> properties = new HashMap<String, Object>(); 
+        for(String key : this.serviceReference.getPropertyKeys()){
+            Object value = this.serviceReference.getProperty(key);
+            if (value != null) {
+                properties.put(key, value);
+            }                
+        }
+        return properties;
+    }
+    
+    /**
+     * {@inheritDoc}
+     */
+    public int compareTo(ServiceHolder other) {
+        return (int) (this.getServiceId() - other.getServiceId());
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((this.serviceReference == null) ? 0 : this.serviceReference.hashCode());
+        return result;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        ServiceHolder other = (ServiceHolder) obj;
+        if (this.serviceReference == null) {
+            if (other.serviceReference != null){
+                return false;
+            }
+        } else if (!this.serviceReference.equals(other.serviceReference)){
+            return false;
+        }
+        return true;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/osgicommand/Activator.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/osgicommand/Activator.java
new file mode 100755
index 0000000..799ba51
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/osgicommand/Activator.java
@@ -0,0 +1,127 @@
+/*******************************************************************************
+ * This file is part of the Virgo Kernel.
+ *
+ * Copyright (c) 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    SpringSource, a division of VMware - initial API and implementation and/or initial documentation
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.osgicommand;
+
+import java.lang.management.ManagementFactory;
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.concurrent.TimeoutException;
+
+import javax.management.MBeanServer;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+
+import org.eclipse.virgo.kernel.osgi.framework.ServiceUtils;
+
+import org.eclipse.virgo.shell.CommandExecutor;
+import org.eclipse.virgo.shell.osgicommand.internal.GogoClassLoadingCommand;
+import org.eclipse.virgo.shell.osgicommand.internal.GogoKernelShellCommand;
+import org.eclipse.virgo.shell.osgicommand.management.ClassLoadingSupport;
+import org.eclipse.virgo.util.osgi.ServiceRegistrationTracker;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceRegistration;
+
+/**
+ * {@link BundleActivator} for the Gogo shell command bundle.
+ * <p/>
+ * <strong>Concurrent Semantics</strong><br />
+ * Not thread safe.
+ */
+public class Activator implements BundleActivator {
+
+    private static final String KERNEL_SHELL_COMMAND = "vsh";
+
+    private static final String[] KERNEL_SHELL_SUBCOMMANDS = new String[] { "bundle", "config", "install", "packages", "par", "plan", "service", "shutdown" };
+
+    private static final String[] CLASS_LOADING_SUBCOMMANDS = new String[] { "clhas", "clload", "clexport" };
+
+    private final ServiceRegistrationTracker registrationTracker = new ServiceRegistrationTracker();
+
+    private final MBeanServer server = ManagementFactory.getPlatformMBeanServer();
+
+    private final ObjectName classLoadingObjectName;
+
+    private ServiceRegistration<GogoClassLoadingCommand> classLoadingCommandRegistration;
+
+    public Activator() throws MalformedObjectNameException {
+        this.classLoadingObjectName = new ObjectName("org.eclipse.virgo.kernel:type=Classloading");
+    }
+
+    @Override
+    public void start(BundleContext context) throws Exception {
+        // Gogo binding
+        Dictionary<String, Object> properties = new Hashtable<String, Object>();
+        properties.put(org.apache.felix.service.command.CommandProcessor.COMMAND_SCOPE, KERNEL_SHELL_COMMAND);
+        properties.put(org.apache.felix.service.command.CommandProcessor.COMMAND_FUNCTION, CLASS_LOADING_SUBCOMMANDS);
+        this.classLoadingCommandRegistration = context.registerService(GogoClassLoadingCommand.class, new GogoClassLoadingCommand(context),
+            properties);
+
+        this.server.registerMBean(new ClassLoadingSupport(context), this.classLoadingObjectName);
+
+        Runnable runnable = new PostStartInitialisationRunnable(context, this.registrationTracker);
+        Thread thread = new Thread(runnable);
+        thread.setDaemon(true);
+        thread.start();
+    }
+
+    @Override
+    public void stop(BundleContext context) throws Exception {
+        // Gogo binding
+        if (this.classLoadingCommandRegistration != null) {
+            this.classLoadingCommandRegistration.unregister();
+            this.classLoadingCommandRegistration = null;
+        }
+
+        this.registrationTracker.unregisterAll();
+
+        this.server.unregisterMBean(this.classLoadingObjectName);
+    }
+
+    private static final class PostStartInitialisationRunnable implements Runnable {
+
+        private final BundleContext context;
+
+        private final ServiceRegistrationTracker registrationTracker;
+
+        public PostStartInitialisationRunnable(BundleContext context, ServiceRegistrationTracker registrationTracker) {
+            this.context = context;
+            this.registrationTracker = registrationTracker;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public void run() {
+            CommandExecutor commandExecutor = null;
+			try {
+				commandExecutor = ServiceUtils.getPotentiallyDelayedService(this.context, CommandExecutor.class);
+			} catch (TimeoutException e) {
+				// no-op
+			} catch (InterruptedException e) {
+				// no-op
+			}
+            if (commandExecutor == null) {
+                return; // TODO: report this failure -- but where?
+            }
+
+            // Gogo binding
+            Dictionary<String, Object> properties = new Hashtable<String, Object>();
+            properties.put(org.apache.felix.service.command.CommandProcessor.COMMAND_SCOPE, KERNEL_SHELL_COMMAND);
+            properties.put(org.apache.felix.service.command.CommandProcessor.COMMAND_FUNCTION, KERNEL_SHELL_SUBCOMMANDS);
+            this.registrationTracker.track(context.registerService(GogoKernelShellCommand.class, new GogoKernelShellCommand(commandExecutor), properties));
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/osgicommand/helper/ClassLoadingHelper.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/osgicommand/helper/ClassLoadingHelper.java
new file mode 100755
index 0000000..d18af58
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/osgicommand/helper/ClassLoadingHelper.java
@@ -0,0 +1,269 @@
+/*******************************************************************************

+ * Copyright (c) 2010 SAP AG

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ *

+ * Contributors:

+ *   Hristo Iliev, SAP AG - initial contribution

+ *******************************************************************************/

+package org.eclipse.virgo.shell.osgicommand.helper;

+

+import org.eclipse.osgi.service.resolver.BundleDescription;

+import org.eclipse.osgi.service.resolver.ExportPackageDescription;

+import org.eclipse.osgi.service.resolver.PlatformAdmin;

+import org.osgi.framework.Bundle;

+import org.osgi.framework.BundleContext;

+import org.osgi.framework.FrameworkUtil;

+import org.osgi.framework.ServiceReference;

+import org.osgi.service.packageadmin.PackageAdmin;

+

+import java.net.URL;

+import java.util.*;

+

+/**

+ * Helper for class loading supporting commands

+ */

+@SuppressWarnings("deprecation")

+public class ClassLoadingHelper {

+

+    /**

+     * Determines if a class package is exported by a bundle

+     *

+     * @param bundleContext Bundle context for interaction with the OSGi framework

+     * @param classPackage  Class package to check for

+     * @param testBundle    The bundle that has to be tested

+     * @return TRUE if the bundle is exported by the package, FALSE if the class is not exported or it does not have a package

+     */

+    public static boolean isPackageExported(BundleContext bundleContext, String classPackage, Bundle testBundle) {

+        ServiceReference<PlatformAdmin> reference = bundleContext.getServiceReference(PlatformAdmin.class);

+        PlatformAdmin platformAdmin = bundleContext.getService(reference);

+        BundleDescription bundleDescription = platformAdmin.getState(false).getBundle(testBundle.getBundleId());

+

+        ExportPackageDescription[] exportDescriptions = bundleDescription.getSelectedExports();

+        for (ExportPackageDescription exportDescription : exportDescriptions) {

+            if (exportDescription.getName().equals(convertToClassName(classPackage)))

+                return true;

+        }

+

+        // not found

+        return false;

+    }

+

+    /**

+     * Returns the bundles that can load a class and the originating bundle in a map

+     *

+     * @param bundleContext Bundle context for interaction with the OSGi framework

+     * @param className     Fully qualified class name (in the form &lt;package&gt;.&lt;class name&gt;)

+     * @return Map between the bundles that can load the class and the bundle that provides it in each case

+     */

+    public static Map<Bundle, Bundle> getBundlesLoadingClass(BundleContext bundleContext, String className) {

+        Bundle[] bundles = bundleContext.getBundles();

+        HashMap<Bundle, Bundle> foundBundles = new HashMap<Bundle, Bundle>();

+        for (Bundle bundle : bundles) {

+            Bundle originBundle = getOriginBundleOfClass(className, bundleContext, bundle);

+            if (originBundle != null) {

+                foundBundles.put(bundle, originBundle);

+            }

+        }

+

+        return foundBundles;

+    }

+

+    /**

+     * Find the originating bundle of a class loaded by a bundle

+     *

+     * @param className     Fully qualified class name (in the form &lt;package&gt;.&lt;class name&gt; name)

+     * @param bundleContext Bundle context for interaction with the OSGi framework

+     * @param loadingBundle Bundle instance to load class from

+     * @return originating {@link Bundle} or null if it cannot be loaded by <code>testBundle</code>

+     */

+    public static Bundle getOriginBundleOfClass(String className, BundleContext bundleContext, Bundle loadingBundle) {

+        Class<?> clasz = tryToLoadClass(className, loadingBundle);

+        Bundle originBundle = null;

+        if (clasz != null) {

+            originBundle = FrameworkUtil.getBundle(clasz);

+            if (originBundle == null) {

+                // this is the system bundle

+                originBundle = bundleContext.getBundle(0);

+            }

+        }

+        return originBundle;

+    }

+

+    /**

+     * Tries to load a class

+     *

+     * @param className Fully qualified class name (in the form &lt;package&gt;.&lt;class name&gt;)

+     * @param bundle    Bundle instance that has to be checked

+     * @return The loaded class or null if it cannot be loaded from this bundle

+     */

+    public static Class<?> tryToLoadClass(String className, Bundle bundle) {

+        if (bundle == null)

+            return null;

+

+        try {

+            return bundle.loadClass(convertToClassName(className));

+        } catch (ClassNotFoundException e) {

+            // do nothing - if the class is not found we don't care

+        }

+        return null;

+    }

+

+    /**

+     * Converts resource path (/javax/servlet/Servlet.class) to class name (javax.servlet.Servlet)

+     *

+     * @param resourcePath Path to the resource

+     * @return Class name

+     */

+    public static String convertToClassName(String resourcePath) {

+        if (resourcePath == null)

+            return null;

+

+        resourcePath = resourcePath.replace("/", ".");

+        if (resourcePath.startsWith(".")) {

+            resourcePath = resourcePath.substring(1);

+        }

+        if (resourcePath.endsWith(".class")) {

+            resourcePath = resourcePath.substring(0, resourcePath.length() - 6);

+        }

+

+        return resourcePath;

+    }

+

+    /**

+     * Convert from package to path format (javax.servlet.Servlet --> javax/servlet/Servlet.class)

+     *

+     * @param className Class name

+     * @return Path to a resource

+     */

+    public static String convertToResourcePath(String className) {

+       if (className == null)

+           return null;

+

+        String result = className;

+        if (!className.contains("/") && !className.contains("*")) {

+            if (className.endsWith(".class")) {

+                result = className.substring(0, className.length() - 6);

+            }

+            return result.replace(".", "/") + ".class";

+        }

+

+        return result;

+    }

+

+    /**

+     * Returns all bundles that can load a class

+     *

+     * @param bundleContext Bundle context for interaction with the OSGi framework

+     * @param className     Fully qualified class name (in the form &lt;package&gt;.&lt;class name&gt;)

+     * @param bundle        Bundle name or ID that has to be checked

+     * @return Map between the bundle that can load the class (key) and the one that provides it (value)

+     * @throws IllegalArgumentException if there is no bundle with such name/id

+     */

+    public static Map<Bundle, Bundle> getBundlesLoadingClass(BundleContext bundleContext, String className, String bundle) throws IllegalArgumentException {

+        HashMap<Bundle, Bundle> result = new HashMap<Bundle, Bundle>();

+        long id = Long.MIN_VALUE;

+        try {

+            id = Long.parseLong(bundle);

+        } catch (NumberFormatException e) {

+            // not a number - then it is bundle name

+        }

+

+        if (id >= 0) {

+            Bundle testBundle = bundleContext.getBundle(id);

+            if (testBundle == null)

+                throw new IllegalArgumentException("Bundle with ID [" + id + "] not found");

+

+            Bundle originBundle = getOriginBundleOfClass(className, bundleContext, testBundle);

+            if (originBundle != null) {

+                result.put(testBundle, originBundle);

+            }

+        } else {

+            ServiceReference<PackageAdmin> reference = bundleContext.getServiceReference(PackageAdmin.class);

+            PackageAdmin packageAdmin = bundleContext.getService(reference);

+            Bundle[] bundles = packageAdmin.getBundles(bundle, null);

+            if (bundles == null)

+                throw new IllegalArgumentException("Bundle with symbolic name [" + bundle + "] not found");

+

+            for (Bundle testBundle : bundles) {

+                Bundle originBundle = getOriginBundleOfClass(className, bundleContext, testBundle);

+                if (originBundle != null) {

+                    result.put(testBundle, originBundle);

+                }

+            }

+        }

+

+        return result;

+    }

+

+    /**

+     * Returns all bundles that contain a class

+     *

+     * @param bundleContext   Bundle context for interaction with the OSGi framework

+     * @param resourcePattern Search pattern in the form &lt;package&gt;/&lt;class name&gt;. The pattern can contain wildcards

+     * @return Map between the bundle (key) and the URL(s) of the resources (value)

+     */

+    public static Map<Bundle, List<String>> getBundlesContainingResource(BundleContext bundleContext, String resourcePattern) {

+        Map<Bundle, List<String>> result = new HashMap<Bundle, List<String>>();

+

+        Bundle[] bundles = bundleContext.getBundles();

+        for (Bundle bundle : bundles) {

+            List<String> entries = findEntries(bundle, resourcePattern);

+            if (entries != null && entries.size() != 0) {

+                result.put(bundle, entries);

+            }

+        }

+

+        return result;

+    }

+

+    /**

+     * Returns a list with bundle entries matching a resource pattern

+     *

+     * @param bundle Bundle to scan for entries

+     * @param resourcePattern Pattern used for matching

+     * @return List with found entries

+     */

+    private static List<String> findEntries(Bundle bundle, String resourcePattern) {

+        HashSet<String> urls = new HashSet<String>();

+

+        int index = resourcePattern.lastIndexOf("/");

+        if (index != -1) {

+            String resourcePath = resourcePattern.substring(0, index);

+            String resourceEntity = resourcePattern.substring(index + 1);

+            // Search the whole bundle for entity starting from the root. We need this since "the pattern is only

+            // matched against the last element of the entry path" as stated in findEntries JavaDoc. This means that

+            // web bundle that packages a class in WEB-INF/classes will not be found by findEntries since the path is

+            // prepended with WEB-INF/classes. Therefore we search for a class everywhere in the bundle and then

+            // filter the result.

+            addURLs(urls, bundle.findEntries("/", resourceEntity, true), resourcePath);

+        }

+

+        // Search the root of the bundle for entity matching the specified pattern

+        addURLs(urls, bundle.findEntries("/", resourcePattern, true), null);

+        return new ArrayList<String>(urls);

+    }

+

+    /**

+     * Adds all found resources eliminating the duplicates or the ones that do not contain the requested path

+     *

+     * @param urls      Result set with URLs as string

+     * @param foundURLs Enumeration to scan

+     * @param path      Expected path of the entities. The entities are not put in the result set unless they contain

+     *                  this path.

+     */

+    private static void addURLs(HashSet<String> urls, Enumeration<URL> foundURLs, String path) {

+        if (foundURLs != null) {

+            while (foundURLs.hasMoreElements()) {

+                String url = foundURLs.nextElement().getFile();

+                if (path != null && !url.contains(path)) {

+                    continue;

+                }

+                urls.add(url);

+            }

+        }

+    }

+

+}
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/osgicommand/internal/GogoClassLoadingCommand.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/osgicommand/internal/GogoClassLoadingCommand.java
new file mode 100755
index 0000000..80ca106
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/osgicommand/internal/GogoClassLoadingCommand.java
@@ -0,0 +1,188 @@
+/*******************************************************************************
+ * Copyright (c) 2010-2011 SAP AG and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Hristo Iliev, SAP AG - initial contribution
+ *   Glyn Normington, VMware Inc. - bind commands to Gogo
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.osgicommand.internal;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.felix.service.command.Descriptor;
+import org.eclipse.virgo.shell.osgicommand.helper.ClassLoadingHelper;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+
+/**
+ * Class loading commands for supportability and diagnostics
+ */
+public class GogoClassLoadingCommand {
+
+    private BundleContext bundleContext;
+
+    public GogoClassLoadingCommand(BundleContext context) {
+        this.bundleContext = context;
+    }
+
+    /**
+     * Lists all bundles that contain a class
+     * 
+     */
+    @Descriptor("list all bundles that contain a class or resource with the specified name")
+    public void clhas(@Descriptor("class or resource name") String className) {
+        className = ClassLoadingHelper.convertToResourcePath(className);
+
+        Map<Bundle, List<String>> foundBundles = ClassLoadingHelper.getBundlesContainingResource(bundleContext, className);
+        if (foundBundles.size() == 0) {
+            System.out.println("No bundle contains [" + className + "]");
+            return;
+        }
+
+        outputBundlesAndResources("Bundles containing [" + className + "]:", foundBundles);
+    }
+
+    @Descriptor("list all bundles that can load the specified class")
+    public void clload(@Descriptor("fully qualified class name") String className) {
+        doClload(className, null);
+    }
+
+    @Descriptor("try to load the specified class using the specified bundle")
+    public void clload(@Descriptor("fully qualified class name") String className, @Descriptor("bundle symbolic name") String bundleName) {
+        doClload(className, bundleName);
+    }
+
+    @Descriptor("try to load the specified class using the specified bundle")
+    public void clload(@Descriptor("fully qualified class name") String className, @Descriptor("  bundle id") long bundleId) {
+        doClload(className, String.valueOf(bundleId));
+    }
+
+    private void doClload(String className, String bundle) {
+        if (extractPackage(className) == null) {
+            System.out.println("Warning: the class name [" + className + "] has no package and is assumed to belong to the default package");
+        }
+
+        Map<Bundle, Bundle> foundBundles;
+        if (bundle == null) {
+            foundBundles = ClassLoadingHelper.getBundlesLoadingClass(bundleContext, className);
+        } else {
+            foundBundles = ClassLoadingHelper.getBundlesLoadingClass(bundleContext, className, bundle);
+        }
+
+        if (foundBundles.size() == 0) {
+            if (bundle == null) {
+                System.out.println("No bundle can load class [" + className + "]");
+            } else {
+                System.out.println("Bundle [" + bundle + "] cannot load class [" + className + "]");
+            }
+            return;
+        }
+
+        outputFoundBundlesAndRelations("Successfully loaded [" + className + "] " + ((bundle != null) ? "using class loader from:" : "from:"),
+            foundBundles, "provided by");
+    }
+
+    /**
+     * Lists all bundles that export a class
+     * 
+     */
+    @Descriptor("list all bundles that export a class with the specified name")
+    public void clexport(@Descriptor("fully qualified class name") String className) {
+        String classPackage = extractPackage(className);
+
+        if (classPackage == null) {
+            System.out.println("The class name [" + className + "] contains no package");
+            return;
+        }
+
+        Bundle[] bundles = bundleContext.getBundles();
+        HashMap<Long, String> foundBundles = new HashMap<Long, String>();
+        for (Bundle bundle : bundles) {
+            if (ClassLoadingHelper.isPackageExported(bundleContext, classPackage, bundle)) {
+                if (ClassLoadingHelper.tryToLoadClass(className, bundle) != null) {
+                    foundBundles.put(bundle.getBundleId(), bundle.getSymbolicName());
+                } else {
+                    foundBundles.put(bundle.getBundleId(), bundle.getSymbolicName() + "     [class not found, package only]");
+                }
+            }
+        }
+
+        if (foundBundles.size() == 0) {
+            System.out.println("No bundle exports class [" + className + "]");
+            return;
+        }
+
+        System.out.println();
+        System.out.println("Bundles exporting [" + className + "]:");
+        for (Map.Entry<Long, String> entry : foundBundles.entrySet()) {
+            System.out.println("  " + entry.getKey() + "\t" + entry.getValue());
+        }
+    }
+
+    private String extractPackage(String className) {
+        int index = className.lastIndexOf(".");
+        return index == -1 ? null : className.substring(0, index);        
+    }
+
+    /**
+     * Outputs a list with all found bundles
+     * 
+     * @param message Message to print before the list
+     * @param foundBundles A map with ID and bundle details
+     * @param relation Relation between the bundles
+     */
+    private void outputFoundBundlesAndRelations(String message, Map<Bundle, Bundle> foundBundles, String relation) {
+        System.out.println();
+        System.out.println(message);
+
+        for (Map.Entry<Bundle, Bundle> entry : foundBundles.entrySet()) {
+            Bundle testBundle = entry.getKey();
+            Bundle originalBundle = entry.getValue();
+            if (testBundle.equals(originalBundle)) {
+                System.out.println("  " + bundleToString(testBundle, false));
+            } else {
+                System.out.println("  " + bundleToString(testBundle, false));
+                if (relation != null)
+                    System.out.println("  \t\t[" + relation + " " + bundleToString(originalBundle, true) + "]");
+            }
+        }
+    }
+
+    /**
+     * Outputs a list with all found bundles
+     * 
+     * @param message Message to print before the list
+     * @param foundBundles A map with Bundle and found resources
+     */
+    private void outputBundlesAndResources(String message, Map<Bundle, List<String>> foundBundles) {
+        System.out.println();
+        System.out.println(message);
+
+        for (Map.Entry<Bundle, List<String>> bundleListEntry : foundBundles.entrySet()) {
+            System.out.println("  " + bundleToString(bundleListEntry.getKey(), false));
+
+            for (String resource : bundleListEntry.getValue()) {
+                System.out.println("  \t\t" + resource);
+            }
+        }
+    }
+
+    /**
+     * Provides String representation of a Bundle
+     * 
+     * @param b See {@link org.osgi.framework.Bundle}
+     * @param space Separate ID and symbolic name with space instead of tab character
+     * @return String containing ID and symbolic name of the bundle
+     */
+    private String bundleToString(Bundle b, boolean space) {
+        return b.getBundleId() + (space ? " " : "\t") + b.getSymbolicName();
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/osgicommand/internal/GogoKernelShellCommand.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/osgicommand/internal/GogoKernelShellCommand.java
new file mode 100755
index 0000000..fdc1b64
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/osgicommand/internal/GogoKernelShellCommand.java
@@ -0,0 +1,242 @@
+/*******************************************************************************
+ * Copyright (c) 2011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.osgicommand.internal;
+
+import java.io.IOException;
+
+import org.eclipse.virgo.shell.CommandExecutor;
+import org.apache.felix.service.command.Descriptor;
+
+/**
+ * {@link GogoKernelShellCommand} binds the vsh commands to the Gogo shell.
+ * <p />
+ * Thread safe.
+ */
+public final class GogoKernelShellCommand {
+
+    /*
+     * The following operations must be listed in
+     * org.eclipse.virgo.kernel.osgicommand.Activator#KERNEL_SHELL_SUBCOMMANDS.
+     */
+    private static final String BUNDLE_OP = "bundle";
+
+    private static final String CONFIG_OP = "config";
+
+    private static final String PACKAGE_OP = "package";
+
+    private static final String PAR_OP = "par";
+
+    private static final String PLAN_OP = "plan";
+
+    private static final String SERVICE_OP = "service";
+
+    private static final String INSTALL_OP = "install";
+
+    private static final String SHUTDOWN_OP = "shutdown";
+
+    private static final String NULL_STRING = "";
+
+    private static final String SPACE = " ";
+
+    private final CommandExecutor commandExecutor;
+
+    public GogoKernelShellCommand(CommandExecutor commandExecutor) {
+        this.commandExecutor = commandExecutor;
+    }
+
+    /*
+     * Bundle commands
+     */
+
+    @Descriptor("list bundle artifacts")
+    public void bundle(@Descriptor("operation (list)") String op) {
+        doBundle(op, NULL_STRING);
+    }
+
+    @Descriptor("examine or manage a bundle artifact")
+    public void bundle(@Descriptor("operation (examine|diag|headers|start|stop|refresh|uninstall)") String op,
+        @Descriptor("bundle symbolic name") String bsn, @Descriptor("bundle version") String bv) {
+        doBundle(op, bsn + SPACE + bv);
+    }
+
+    @Descriptor("examine or manage a bundle artifact")
+    public void bundle(@Descriptor("operation (examine|diag|headers|start|stop|refresh|uninstall)") String op,
+        @Descriptor("  bundle id") long bundleId) {
+        doBundle(op, String.valueOf(bundleId));
+    }
+
+    public void doBundle(String op, String argList) {
+        doOp(BUNDLE_OP, op, argList);
+
+    }
+
+    /*
+     * Configuration commands
+     */
+
+    @Descriptor("list configuration artifacts")
+    public void config(@Descriptor("operation (list)") String op) {
+        doConfig(op, NULL_STRING);
+    }
+
+    @Descriptor("examine or manage a configuration artifact")
+    public void config(@Descriptor("operation (examine|start|stop|refresh|uninstall)") String op, @Descriptor("configuration name") String configName) {
+        doConfig(op, configName);
+    }
+
+    @Descriptor("examine or manage a configuration artifact")
+    public void config(@Descriptor("operation (examine|start|stop|refresh|uninstall)") String op,
+        @Descriptor("configuration name") String configName, @Descriptor("configuration version") String configVersion) {
+        doConfig(op, configName + SPACE + configVersion);
+    }
+
+    public void doConfig(String op, String argList) {
+        doOp(CONFIG_OP, op, argList);
+
+    }
+
+    /*
+     * Package commands - renamed to "packages" to avoid clash with Java keyword
+     */
+
+    @Descriptor("list exported packages")
+    public void packages(@Descriptor("operation (list)") String op) {
+        doPackage(op, NULL_STRING);
+    }
+
+    @Descriptor("examine an exported package")
+    public void packages(@Descriptor("operation (examine)") String op, @Descriptor("package name") String packageName,
+        @Descriptor("package version") String packageVersion) {
+        doPackage(op, packageName + SPACE + packageVersion);
+    }
+
+    public void doPackage(String op, String argList) {
+        doOp(PACKAGE_OP, op, argList);
+
+    }
+
+    /*
+     * Par commands
+     */
+
+    @Descriptor("list PAR artifacts")
+    public void par(@Descriptor("operation (list)") String op) {
+        doPar(op, NULL_STRING);
+    }
+
+    @Descriptor("examine or manage a PAR artifact")
+    public void par(@Descriptor("operation (examine|start|stop|refresh|uninstall)") String op, @Descriptor("PAR name") String parName,
+        @Descriptor("PAR version") String parVersion) {
+        doPar(op, parName + SPACE + parVersion);
+    }
+
+    public void doPar(String op, String argList) {
+        doOp(PAR_OP, op, argList);
+
+    }
+
+    /*
+     * Plan commands
+     */
+
+    @Descriptor("list plan artifacts")
+    public void plan(@Descriptor("operation (list)") String op) {
+        doPlan(op, NULL_STRING);
+    }
+
+    @Descriptor("examine or manage a plan artifact")
+    public void plan(@Descriptor("operation (examine|start|stop|refresh|uninstall)") String op, @Descriptor("plan name") String planName,
+        @Descriptor("plan version") String planVersion) {
+        doPlan(op, planName + SPACE + planVersion);
+    }
+
+    public void doPlan(String op, String argList) {
+        doOp(PLAN_OP, op, argList);
+
+    }
+
+    /*
+     * Service commands
+     */
+
+    @Descriptor("list all services in the service registry")
+    public void service(@Descriptor("operation (list)") String op) {
+        doService(op, NULL_STRING);
+    }
+
+    @Descriptor("examine a service in the service registry")
+    public void service(@Descriptor("operation (examine)") String op, @Descriptor("  service id") long serviceId) {
+        doService(op, String.valueOf(serviceId));
+    }
+
+    public void doService(String op, String argList) {
+        doOp(SERVICE_OP, op, argList);
+
+    }
+
+    /*
+     * Install command
+     */
+
+    @Descriptor("install (deploy) an artifact")
+    public void install(@Descriptor("artifact URI") String configName) {
+        doOp(INSTALL_OP, configName);
+    }
+
+    /*
+     * Shutdown command
+     */
+
+    @Descriptor("shut down the kernel")
+    public void shutdown() {
+        doOp(SHUTDOWN_OP, "");
+    }
+
+    /*
+     * Helper methods
+     */
+
+    private void doOp(String mainOp, String subOp, String argList) {
+        String args = concatArgs(mainOp, subOp, argList);
+        try {
+            boolean continueCommands = this.commandExecutor.execute(args, new GogoLinePrinter());
+            if (!continueCommands) {
+                System.out.println("vsh: command '" + args + "' requested exit");
+            }
+        } catch (IOException e) {
+            System.out.println("vsh: command '" + args + "' threw an exception...");
+            e.printStackTrace(System.out);
+        }
+    }
+
+    private void doOp(String op, String argList) {
+        String args = concatArgs(op, argList);
+        try {
+            boolean continueCommands = this.commandExecutor.execute(args, new GogoLinePrinter());
+            if (!continueCommands) {
+                System.out.println("vsh: command '" + args + "' requested exit");
+            }
+        } catch (IOException e) {
+            System.out.println("vsh: command '" + args + "' threw an exception...");
+            e.printStackTrace(System.out);
+        }
+    }
+
+    private String concatArgs(String cmd, String... args) {
+        StringBuffer result = new StringBuffer(cmd).append(SPACE);
+        for (String arg : args) {
+            result.append(arg).append(SPACE);
+        }
+        return result.toString();
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/osgicommand/internal/GogoLinePrinter.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/osgicommand/internal/GogoLinePrinter.java
new file mode 100755
index 0000000..809f473
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/osgicommand/internal/GogoLinePrinter.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.osgicommand.internal;
+
+
+import java.io.IOException;
+
+import org.eclipse.virgo.shell.LinePrinter;
+
+/**
+ * {@link GogoLinePrinter} is an implementation of the Virgo shell {@link LinePrinter} for use with Gogo.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread safe.
+ */
+final class GogoLinePrinter implements LinePrinter {
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public LinePrinter println(String line) throws IOException {
+        System.out.println(line);
+        return null;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public LinePrinter println() throws IOException {
+        System.out.println();
+        return null;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/osgicommand/management/ClassLoadingSupport.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/osgicommand/management/ClassLoadingSupport.java
new file mode 100755
index 0000000..1f8910f
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/osgicommand/management/ClassLoadingSupport.java
@@ -0,0 +1,96 @@
+/*******************************************************************************

+ * Copyright (c) 2011 SAP AG

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ *

+ * Contributors:

+ *    Hristo Iliev, SAP AG - initial contribution

+ ******************************************************************************/

+

+package org.eclipse.virgo.shell.osgicommand.management;

+

+import org.eclipse.virgo.shell.osgicommand.helper.ClassLoadingHelper;

+import org.osgi.framework.Bundle;

+import org.osgi.framework.BundleContext;

+

+import java.util.*;

+

+/**

+ * MBean for class loading queries

+ */

+public class ClassLoadingSupport implements ClassLoadingSupportMBean {

+

+    private BundleContext bundleContext;

+

+    public ClassLoadingSupport(BundleContext bundleContext) {

+        this.bundleContext = bundleContext;

+    }

+

+    @Override

+    public Map<List<String>, List<String>> getBundlesContainingResource(String resourcePattern) {

+        Map<Bundle, List<String>> resources = ClassLoadingHelper.getBundlesContainingResource(this.bundleContext, resourcePattern);

+

+        Map<List<String>, List<String>> result = new HashMap<List<String>, List<String>>();

+

+        for (Map.Entry<Bundle, List<String>> entry: resources.entrySet()) {

+            result.put(getBundleInformation(entry.getKey()), entry.getValue());

+        }

+

+        return result;

+    }

+

+    @Override

+    public Map<List<String>, List<String>> getBundlesLoadingClass(String className) {

+        Map<Bundle, Bundle> bundles = ClassLoadingHelper.getBundlesLoadingClass(this.bundleContext, className);

+

+        Map<List<String>, List<String>> result = new HashMap<List<String>, List<String>>();

+

+        for (Map.Entry<Bundle, Bundle> entry : bundles.entrySet()) {

+            Bundle loadingBundle = entry.getKey();

+            Bundle originatingBundle = entry.getKey();

+            result.put(getBundleInformation(loadingBundle), getBundleInformation(originatingBundle));

+        }

+

+        return result;

+    }

+

+    @Override

+    public List<List<String>> getBundlesExportingPackage(String packageName) {

+        Bundle[] allBundles = this.bundleContext.getBundles();

+

+        List<List<String>> result = new ArrayList<List<String>>();

+

+        for (Bundle bundle : allBundles) {

+            if (ClassLoadingHelper.isPackageExported(this.bundleContext, packageName, bundle)) {

+                result.add(getBundleInformation(bundle));

+            }

+        }

+

+        return result;

+    }

+

+    @Override

+    public boolean tryToLoadClassFromBundle(String className, long bundleId) {

+        Class<?> result = ClassLoadingHelper.tryToLoadClass(className, this.bundleContext.getBundle(bundleId));

+        return result != null;

+    }

+

+    /**

+     * Builds bundle information (ID, symbolic name) to a collection

+     *

+     * @param bundle Bundle to obtain information for. If <code>null</code>, then the collection will be filled

+     *               with null elements

+     * @return List with bundle information as string or <code>null</code> if the bundle is <code>null</code>

+     */

+    private List<String> getBundleInformation(Bundle bundle) {

+        List<String> list = new ArrayList<String>(2);

+

+        list.add(bundle != null ? "" + bundle.getBundleId() : null);

+        list.add(bundle != null ? bundle.getSymbolicName() : null);

+

+        return list;

+    }

+

+}

diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/osgicommand/management/ClassLoadingSupportMBean.java b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/osgicommand/management/ClassLoadingSupportMBean.java
new file mode 100755
index 0000000..538841d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/java/org/eclipse/virgo/shell/osgicommand/management/ClassLoadingSupportMBean.java
@@ -0,0 +1,59 @@
+/*******************************************************************************

+ * Copyright (c) 2011 SAP AG

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ *

+ * Contributors:

+ *    Hristo Iliev, SAP AG - initial contribution

+ ******************************************************************************/

+

+package org.eclipse.virgo.shell.osgicommand.management;

+

+import java.util.List;

+import java.util.Map;

+

+/**

+ * mBean interface for class loading queries

+ */

+public interface ClassLoadingSupportMBean {

+

+    /**

+     * Returns list with all bundles that can load a class and the origin bundle

+     *

+     * @param resourcePattern Resource pattern (package.class) to search for. The pattern may contain wildcard (*)

+     * @return Mapping between the bundle that contains the resource (possibly provided by fragment bundle) and the

+     *         resource URLs found in the bundle. The bundle information list contain the bundle ID and

+     *         symbolic name.

+     */

+    Map<List<String>, List<String>> getBundlesContainingResource(String resourcePattern);

+

+    /**

+     * Returns list with all bundles that can load a class and the origin bundle

+     *

+     * @param className Fully qualified class name (package.class) to load

+     * @return Mapping between the bundle that can load the class (possibly delegating to another bundle) and the

+     *         origin bundle that actually performs the loading. The bundle information list contain the bundle ID and

+     *         symbolic name.

+     */

+    Map<List<String>, List<String>> getBundlesLoadingClass(String className);

+

+    /**

+     * Returns list with all bundles that export a package

+     *

+     * @param packageName Package to scan for

+     * @return List with information (ID and symbolic name) about the bundles that export the package

+     */

+    List<List<String>> getBundlesExportingPackage(String packageName);

+

+    /**

+     * Tries to load a class from bundle

+     *

+     * @param className Fully qualified class name (package.class) to load

+     * @param bundleId  Bundle ID of the bundle, which loader will be used to load the class

+     * @return <code>true</code> if the class can be loaded, <code>false</code> if the class cannot be loaded with the

+     *         bundle's loader

+     */

+    public boolean tryToLoadClassFromBundle(String className, long bundleId);

+}

diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/resources/META-INF/spring/module-context.xml b/kernel/org.eclipse.virgo.shell.command/src/main/resources/META-INF/spring/module-context.xml
new file mode 100644
index 0000000..b7f3295
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/resources/META-INF/spring/module-context.xml
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
+
+	<!-- START UP THE SHELL -->
+
+	<bean id="commandProcessor" class="org.eclipse.virgo.shell.internal.StandardCommandProcessor">
+		<constructor-arg ref="commandInvoker" />
+	</bean>
+
+	<bean id="singleCommandExecutor" class="org.eclipse.virgo.shell.internal.SingleSessionCommandExecutor">
+		<constructor-arg ref="commandProcessor"/>
+	</bean>
+
+	<bean id="ioManager" class="org.eclipse.virgo.shell.internal.LocalInputOutputManager">
+		<constructor-arg ref="bundleContext"/>
+	</bean>
+
+	<bean id="completerRegistry" class="org.eclipse.virgo.shell.internal.completers.ServiceRegistryCommandCompleterRegistry" init-method="initialize">
+		<constructor-arg ref="bundleContext"/>
+	</bean>
+
+	<!-- START UP THE INTIAL COMMAND PROVIDER -->
+	
+	<bean id="quasiBundleUtil" class="org.eclipse.virgo.shell.internal.util.QuasiBundleUtil">
+		<constructor-arg ref="quasiFrameworkFactory" />
+	</bean>
+	<bean id="quasiServiceUtil" class="org.eclipse.virgo.shell.internal.util.QuasiServiceUtil">
+		<constructor-arg ref="bundleContext"/>
+		<constructor-arg ref="quasiFrameworkFactory" />
+	</bean>
+	
+	<bean id="installCommand" class="org.eclipse.virgo.shell.internal.commands.InstallCommand"/>
+
+	<bean id="bundleCommands" class="org.eclipse.virgo.shell.internal.commands.BundleCommands">
+		<constructor-arg ref="objectNameCreator"/>
+		<constructor-arg ref="quasiBundleUtil" />
+		<constructor-arg ref="quasiServiceUtil" />
+		<constructor-arg ref="moduleContextAccessor" />
+		<constructor-arg ref="regionDigraph" />
+	</bean>
+
+	<bean id="serviceCommands" class="org.eclipse.virgo.shell.internal.commands.ServiceCommands">
+		<constructor-arg ref="quasiServiceUtil" />
+	</bean>
+
+	<bean id="packageCommands" class="org.eclipse.virgo.shell.internal.commands.PackageCommands">
+		<constructor-arg ref="quasiFrameworkFactory" />
+	</bean>
+
+	<bean id="configCommands" class="org.eclipse.virgo.shell.internal.commands.ConfigCommands">
+		<constructor-arg ref="objectNameCreator"/>
+		<constructor-arg ref="configAdmin" />
+		<constructor-arg ref="regionDigraph" />
+	</bean>
+
+	<bean id="planCommands" class="org.eclipse.virgo.shell.internal.commands.PlanCommands">
+		<constructor-arg ref="objectNameCreator"/>
+		<constructor-arg ref="regionDigraph" />
+	</bean>
+
+	<bean id="parCommands" class="org.eclipse.virgo.shell.internal.commands.ParCommands">
+		<constructor-arg ref="objectNameCreator"/>
+	</bean>
+
+	<bean id="shutdownCommand" class="org.eclipse.virgo.shell.internal.commands.ShutdownCommand">
+		<constructor-arg ref="ioManager"/>
+	</bean>
+	
+	<bean id="exitCommand" class="org.eclipse.virgo.shell.internal.commands.ExitCommand"/>
+	
+	<bean id="helpCommand" class="org.eclipse.virgo.shell.internal.commands.HelpCommand">
+		<constructor-arg ref="commandRegistry"/>
+		<constructor-arg ref="helpAccessor"/>
+	</bean>
+	
+	<bean id="helpAccessor" class="org.eclipse.virgo.shell.internal.help.SimpleFileHelpAccessor"/>
+
+	<bean id="helpCommandCompleter" class="org.eclipse.virgo.shell.internal.completers.HelpCommandCompleter">
+		<constructor-arg ref="commandRegistry"/>
+	</bean>
+
+	<bean id="bundleCompleter" class="org.eclipse.virgo.shell.internal.completers.BundleCompleter">
+		<constructor-arg ref="objectNameCreator"/>
+	</bean>
+
+	<bean id="packageCompleter" class="org.eclipse.virgo.shell.internal.completers.PackageCompleter">
+		<constructor-arg ref="quasiFrameworkFactory" />
+	</bean>
+
+	<bean id="configCompleter" class="org.eclipse.virgo.shell.internal.completers.ConfigCompleter">
+		<constructor-arg ref="objectNameCreator"/>
+		<constructor-arg ref="regionDigraph" />
+	</bean>
+	
+	<bean id="parCompleter" class="org.eclipse.virgo.shell.internal.completers.ParCompleter">
+		<constructor-arg ref="objectNameCreator"/>
+	</bean>
+	
+	<bean id="planCompleter" class="org.eclipse.virgo.shell.internal.completers.PlanCompleter">
+		<constructor-arg ref="objectNameCreator"/>
+	</bean>
+	
+	<bean id="installCompleter" class="org.eclipse.virgo.shell.internal.completers.InstallCompleter"/>
+
+	<!-- CREATE THE VARIOUS TYPE CONVERTERS -->
+
+	<bean id="longConverter" class="org.eclipse.virgo.shell.internal.converters.LongConverter" />
+
+	<bean id="stringConverter" class="org.eclipse.virgo.shell.internal.converters.StringConverter" />
+
+	<bean id="commandResolver" class="org.eclipse.virgo.shell.internal.CompoundCommandResolver">
+		<constructor-arg>
+			<list>
+				<bean class="org.eclipse.virgo.shell.internal.AnnotationBasedCommandResolver"/>
+			</list>
+		</constructor-arg>
+	</bean>
+
+	<bean id="commandRegistry" class="org.eclipse.virgo.shell.internal.CommandRegistry" init-method="initialize">
+		<constructor-arg ref="commandResolver"/>
+		<constructor-arg ref="bundleContext"/>
+	</bean>
+
+	<bean id="commandInvoker" class="org.eclipse.virgo.shell.internal.CommandRegistryCommandInvoker">
+		<constructor-arg ref="commandRegistry"/>
+		<constructor-arg ref="converterRegistry"/>
+	</bean>
+
+	<bean id="converterRegistry" class="org.eclipse.virgo.shell.internal.converters.ServiceRegistryConverterRegistry" init-method="initialize">
+		<constructor-arg ref="bundleContext"/>
+	</bean>
+
+</beans>
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/resources/META-INF/spring/osgi-context.xml b/kernel/org.eclipse.virgo.shell.command/src/main/resources/META-INF/spring/osgi-context.xml
new file mode 100644
index 0000000..c2a44e0
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/resources/META-INF/spring/osgi-context.xml
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns:osgi="http://www.springframework.org/schema/osgi"
+	xmlns:util="http://www.springframework.org/schema/util"
+	xsi:schemaLocation="http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi-1.0.xsd
+		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
+		http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd">
+
+<!-- SERVICES FOR THE CORE SHELL SYSTEM -->
+
+	<osgi:reference id="quasiFrameworkFactory" interface="org.eclipse.virgo.kernel.osgi.quasi.QuasiFrameworkFactory" />
+
+	<osgi:reference id="moduleContextAccessor" interface="org.eclipse.virgo.kernel.module.ModuleContextAccessor" />
+
+	<osgi:reference id="eventLogger" interface="org.eclipse.virgo.medic.eventlog.EventLogger" />
+
+	<osgi:reference id="configAdmin" interface="org.osgi.service.cm.ConfigurationAdmin" />
+
+	<osgi:service ref="commandProcessor" interface="org.eclipse.virgo.shell.internal.CommandProcessor" />
+	
+	<osgi:service ref="singleCommandExecutor" interface="org.eclipse.virgo.shell.CommandExecutor" />
+
+	<osgi:reference id="userRegionBundleContext" interface="org.osgi.framework.BundleContext" filter="(org.eclipse.virgo.kernel.regionContext=true)"/>
+	    
+    <osgi:reference id="regionDigraph" interface="org.eclipse.equinox.region.RegionDigraph" />
+    
+<!-- SERVICES FOR THE TYPE CONVERTERS -->
+
+	<osgi:service ref="longConverter" interface="org.eclipse.virgo.shell.Converter">
+		<osgi:service-properties>
+			<entry>
+				<key><util:constant static-field="org.eclipse.virgo.shell.Converter.CONVERTER_CLASSES"/></key>
+				<value>#{longConverter.getTypes()}</value>
+			</entry>
+		</osgi:service-properties>
+	</osgi:service>
+
+	<osgi:service ref="stringConverter" interface="org.eclipse.virgo.shell.Converter">
+		<osgi:service-properties>
+			<entry>
+				<key><util:constant static-field="org.eclipse.virgo.shell.Converter.CONVERTER_CLASSES"/></key>
+				<value>#{stringConverter.getTypes()}</value>
+			</entry>
+		</osgi:service-properties>
+	</osgi:service>
+
+<!-- SERVICES FOR THE COMMAND PROVIDERS -->
+
+	<osgi:service ref="helpCommand" auto-export="class-hierarchy"/>
+	
+	<osgi:service ref="installCommand" auto-export="class-hierarchy"/>	
+	
+	<osgi:service ref="shutdownCommand" auto-export="class-hierarchy"/>
+	
+	<osgi:service ref="exitCommand" auto-export="class-hierarchy"/>
+
+	<osgi:service ref="serviceCommands" auto-export="class-hierarchy"/>
+
+	<osgi:service ref="bundleCommands" auto-export="class-hierarchy"/>
+
+	<osgi:service ref="packageCommands" auto-export="class-hierarchy"/>
+
+	<osgi:service ref="configCommands" auto-export="class-hierarchy"/>
+
+	<osgi:service ref="planCommands" auto-export="class-hierarchy"/>
+
+	<osgi:service ref="parCommands" auto-export="class-hierarchy"/>
+
+	<osgi:reference id="objectNameCreator" interface="org.eclipse.virgo.kernel.model.management.RuntimeArtifactModelObjectNameCreator"/>
+
+	<osgi:service ref="helpCommandCompleter" interface="org.eclipse.virgo.shell.CommandCompleter">
+		<osgi:service-properties>
+			<entry>
+				<key><util:constant static-field="org.eclipse.virgo.shell.CommandCompleter.SERVICE_PROPERTY_COMPLETER_COMMAND_NAMES"/></key>
+				<value>help</value>
+			</entry>
+		</osgi:service-properties>
+	</osgi:service>
+
+	<osgi:service ref="bundleCompleter" interface="org.eclipse.virgo.shell.CommandCompleter">
+		<osgi:service-properties>
+			<entry>
+				<key><util:constant static-field="org.eclipse.virgo.shell.CommandCompleter.SERVICE_PROPERTY_COMPLETER_COMMAND_NAMES"/></key>
+				<value>bundle</value>
+			</entry>
+		</osgi:service-properties>
+	</osgi:service>
+	
+	<osgi:service ref="packageCompleter" interface="org.eclipse.virgo.shell.CommandCompleter">
+		<osgi:service-properties>
+			<entry>
+				<key><util:constant static-field="org.eclipse.virgo.shell.CommandCompleter.SERVICE_PROPERTY_COMPLETER_COMMAND_NAMES"/></key>
+				<value>package</value>
+			</entry>
+		</osgi:service-properties>
+	</osgi:service>
+
+	<osgi:service ref="configCompleter" interface="org.eclipse.virgo.shell.CommandCompleter">
+		<osgi:service-properties>
+			<entry>
+				<key><util:constant static-field="org.eclipse.virgo.shell.CommandCompleter.SERVICE_PROPERTY_COMPLETER_COMMAND_NAMES"/></key>
+				<value>config</value>
+			</entry>
+		</osgi:service-properties>
+	</osgi:service>
+	
+	<osgi:service ref="parCompleter" interface="org.eclipse.virgo.shell.CommandCompleter">
+		<osgi:service-properties>
+			<entry>
+				<key><util:constant static-field="org.eclipse.virgo.shell.CommandCompleter.SERVICE_PROPERTY_COMPLETER_COMMAND_NAMES"/></key>
+				<value>par</value>
+			</entry>
+		</osgi:service-properties>
+	</osgi:service>
+	
+	<osgi:service ref="planCompleter" interface="org.eclipse.virgo.shell.CommandCompleter">
+		<osgi:service-properties>
+			<entry>
+				<key><util:constant static-field="org.eclipse.virgo.shell.CommandCompleter.SERVICE_PROPERTY_COMPLETER_COMMAND_NAMES"/></key>
+				<value>plan</value>
+			</entry>
+		</osgi:service-properties>
+	</osgi:service>
+	
+		<osgi:service ref="installCompleter" interface="org.eclipse.virgo.shell.CommandCompleter">
+		<osgi:service-properties>
+			<entry>
+				<key><util:constant static-field="org.eclipse.virgo.shell.CommandCompleter.SERVICE_PROPERTY_COMPLETER_COMMAND_NAMES"/></key>
+				<value>install</value>
+			</entry>
+		</osgi:service-properties>
+	</osgi:service>
+
+</beans>
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/resources/org.eclipse.virgo.kernel.shell.internal.commands.BundleCommands.help b/kernel/org.eclipse.virgo.shell.command/src/main/resources/org.eclipse.virgo.kernel.shell.internal.commands.BundleCommands.help
new file mode 100644
index 0000000..c0fe047
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/resources/org.eclipse.virgo.kernel.shell.internal.commands.BundleCommands.help
@@ -0,0 +1,19 @@
+# Summary
+Management and examination of bundle artifacts
+# Detail
+bundle list                            - List all bundle artifacts that are
+                                         currently installed
+bundle examine   [ id | name version ] - Examine a bundle artifact
+bundle start     [ id | name version ] - Start a bundle artifact. Starting this
+                                         artifact starts it in the OSGi
+                                         framework.
+bundle stop      [ id | name version ] - Stop a bundle artifact. Stopping this
+                                         artifact stops it in the OSGi
+                                         framework.
+bundle refresh   [ id | name version ] - Refresh a bundle artifact. Refreshing
+                                         this artifact updates its contents in
+                                         the OSGi framework.
+bundle uninstall [ id | name version ] - Uninstall a bundle artifact
+bundle diag      [ id | name version ] - Provide diagnostics for a bundle
+                                         artifact
+bundle headers   [ id | name version ] - Show the headers for a bundle artifact
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/resources/org.eclipse.virgo.kernel.shell.internal.commands.ConfigCommands.help b/kernel/org.eclipse.virgo.shell.command/src/main/resources/org.eclipse.virgo.kernel.shell.internal.commands.ConfigCommands.help
new file mode 100644
index 0000000..e756aa9
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/resources/org.eclipse.virgo.kernel.shell.internal.commands.ConfigCommands.help
@@ -0,0 +1,18 @@
+# Summary
+Management and examination of configuration artifacts
+# Detail
+config list                       - List all configuration artifacts that are
+                                    currently installed
+config examine   <name> [version] - Examine a configuration artifact. A
+                                    configuration artifact must be active to
+                                    examine it.
+config start     <name> [version] - Start a configuration artifact. Starting
+                                    this artifact makes it visible to
+                                    ConfigurationAdmin.
+config stop      <name> [version] - Stop a configuration artifact. Stopping this
+                                    artifact makes it invisible to
+                                    ConfigurationAdmin.
+config refresh   <name> [version] - Refresh a configuration artifact. Refreshing
+                                    this artifact updates its contents in
+                                    ConfigurationAdmin.
+config uninstall <name> [version] - Uninstall a configuration artifact
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/resources/org.eclipse.virgo.kernel.shell.internal.commands.ExitCommand.help b/kernel/org.eclipse.virgo.shell.command/src/main/resources/org.eclipse.virgo.kernel.shell.internal.commands.ExitCommand.help
new file mode 100644
index 0000000..c425eea
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/resources/org.eclipse.virgo.kernel.shell.internal.commands.ExitCommand.help
@@ -0,0 +1,6 @@
+# Summary
+Exit the kernel shell environment
+# Detail
+exit - leave the shell. If the shell is local the console reverts to the kernel log.
+       If the shell is remote, the connection is dropped. Issue shutdown to terminate
+       the kernel. This command has no effect when issued from the OSGi console.
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/resources/org.eclipse.virgo.kernel.shell.internal.commands.HelpCommand.help b/kernel/org.eclipse.virgo.shell.command/src/main/resources/org.eclipse.virgo.kernel.shell.internal.commands.HelpCommand.help
new file mode 100644
index 0000000..3945d76
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/resources/org.eclipse.virgo.kernel.shell.internal.commands.HelpCommand.help
@@ -0,0 +1,5 @@
+# Summary
+Get help on commands
+# Detail
+help           - List all the commands with summary help
+help <command> - List the detailed help for <command>
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/resources/org.eclipse.virgo.kernel.shell.internal.commands.InstallCommand.help b/kernel/org.eclipse.virgo.shell.command/src/main/resources/org.eclipse.virgo.kernel.shell.internal.commands.InstallCommand.help
new file mode 100644
index 0000000..7b659c4
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/resources/org.eclipse.virgo.kernel.shell.internal.commands.InstallCommand.help
@@ -0,0 +1,4 @@
+# Summary
+Install (deploy) an artifact to the server
+# Detail
+install <uri> - Deploy the artifact, identified by URI
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/resources/org.eclipse.virgo.kernel.shell.internal.commands.PackageCommands.help b/kernel/org.eclipse.virgo.shell.command/src/main/resources/org.eclipse.virgo.kernel.shell.internal.commands.PackageCommands.help
new file mode 100644
index 0000000..2f02cda
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/resources/org.eclipse.virgo.kernel.shell.internal.commands.PackageCommands.help
@@ -0,0 +1,5 @@
+# Summary
+Examination of exported packages
+# Detail
+package list                     - List all packages that are currently exported
+package examine <name> <version> - Examine an exported package
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/resources/org.eclipse.virgo.kernel.shell.internal.commands.ParCommands.help b/kernel/org.eclipse.virgo.shell.command/src/main/resources/org.eclipse.virgo.kernel.shell.internal.commands.ParCommands.help
new file mode 100644
index 0000000..aecf052
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/resources/org.eclipse.virgo.kernel.shell.internal.commands.ParCommands.help
@@ -0,0 +1,10 @@
+# Summary
+Management and examination of PAR artifacts
+# Detail
+par list                       - List all PAR artifacts that are currently
+                                 installed
+par examine   <name> <version> - Examine a PAR artifact
+par start     <name> <version> - Start a PAR artifact
+par stop      <name> <version> - Stop a PAR artifact
+par refresh   <name> <version> - Refresh a PAR artifact
+par uninstall <name> <version> - Uninstall a PAR artifact
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/resources/org.eclipse.virgo.kernel.shell.internal.commands.PlanCommands.help b/kernel/org.eclipse.virgo.shell.command/src/main/resources/org.eclipse.virgo.kernel.shell.internal.commands.PlanCommands.help
new file mode 100644
index 0000000..6114a74
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/resources/org.eclipse.virgo.kernel.shell.internal.commands.PlanCommands.help
@@ -0,0 +1,10 @@
+# Summary
+Management and examination of plan artifacts
+# Detail
+plan list                       - List all plan artifacts that are currently
+                                  installed
+plan examine   <name> <version> - Examine a plan artifact
+plan start     <name> <version> - Start a plan artifact
+plan stop      <name> <version> - Stop a plan artifact
+plan refresh   <name> <version> - Refresh a plan artifact
+plan uninstall <name> <version> - Uninstall a plan artifact
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/resources/org.eclipse.virgo.kernel.shell.internal.commands.ServiceCommands.help b/kernel/org.eclipse.virgo.shell.command/src/main/resources/org.eclipse.virgo.kernel.shell.internal.commands.ServiceCommands.help
new file mode 100644
index 0000000..8350772
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/resources/org.eclipse.virgo.kernel.shell.internal.commands.ServiceCommands.help
@@ -0,0 +1,5 @@
+# Summary
+Examination of services
+# Detail
+service list         - List all services in the service registry
+service examine <id> - Examine a specific service
diff --git a/kernel/org.eclipse.virgo.shell.command/src/main/resources/org.eclipse.virgo.kernel.shell.internal.commands.ShutdownCommand.help b/kernel/org.eclipse.virgo.shell.command/src/main/resources/org.eclipse.virgo.kernel.shell.internal.commands.ShutdownCommand.help
new file mode 100644
index 0000000..ab6f022
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/main/resources/org.eclipse.virgo.kernel.shell.internal.commands.ShutdownCommand.help
@@ -0,0 +1,4 @@
+# Summary
+Shutdown Virgo Kernel
+# Detail
+shutdown - terminate the shell and the running kernel
diff --git a/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/AnnotationBasedCommandResolverTests.java b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/AnnotationBasedCommandResolverTests.java
new file mode 100644
index 0000000..e4655b1
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/AnnotationBasedCommandResolverTests.java
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.lang.reflect.Method;
+import java.util.List;
+
+import org.eclipse.virgo.shell.Command;
+import org.eclipse.virgo.shell.internal.AnnotationBasedCommandResolver;
+import org.eclipse.virgo.shell.internal.CommandDescriptor;
+import org.junit.Test;
+
+/**
+ */
+public class AnnotationBasedCommandResolverTests {
+
+    private final AnnotationBasedCommandResolver resolver = new AnnotationBasedCommandResolver();
+
+    @Test
+    public void basicAnnotations() throws SecurityException, NoSuchMethodException {
+        List<CommandDescriptor> commands = resolver.resolveCommands(null, new TestCommands());
+        assertEquals(2, commands.size());
+
+        assertCommandEquals(TestCommands.class.getMethod("foo"), "test", "one", commands);
+        assertCommandEquals(TestCommands.class.getMethod("bar"), "test", "two", commands);
+    }
+
+    @Test
+    public void inheritedAnnotations() throws SecurityException, NoSuchMethodException {
+        List<CommandDescriptor> commands = resolver.resolveCommands(null, new SubTestCommands());
+        assertEquals(4, commands.size());
+
+        assertCommandEquals(SubTestCommands.class.getMethod("alpha"), "test-sub", "three", commands);
+        assertCommandEquals(SubTestCommands.class.getMethod("bravo"), "test-sub", "four", commands);
+        assertCommandEquals(SubTestCommands.class.getMethod("foo"), "test-sub", "one", commands);
+        assertCommandEquals(SubTestCommands.class.getMethod("bar"), "test-sub", "two", commands);
+    }
+
+    private void assertCommandEquals(Method expectedMethod, String expectedCommandName, String expectedSubCommandName,
+        List<CommandDescriptor> commands) {
+        boolean found = false;
+        for (CommandDescriptor commandDescriptor : commands) {
+            if (expectedMethod.equals(commandDescriptor.getMethod())) {
+                found = true;
+                assertEquals(expectedCommandName, commandDescriptor.getCommandName());
+                assertEquals(expectedSubCommandName, commandDescriptor.getSubCommandName());
+            }
+        }
+        assertTrue("Method not found '" + expectedMethod + "'", found);
+    }
+
+    @Command("test")
+    private static class TestCommands {
+
+        @Command("one")
+        public void foo() {
+
+        }
+
+        @Command("two")
+        public void bar() {
+
+        }
+    }
+
+    @Command("test-sub")
+    private static final class SubTestCommands extends TestCommands {
+
+        @Command("three")
+        public void alpha() {
+
+        }
+
+        @Command("four")
+        public void bravo() {
+
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/StandardCommandProcessorTests.java b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/StandardCommandProcessorTests.java
new file mode 100644
index 0000000..5f26f76
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/StandardCommandProcessorTests.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal;
+
+import static org.easymock.EasyMock.createNiceMock;
+import static org.junit.Assert.assertNotNull;
+
+import org.eclipse.virgo.shell.internal.CommandInvoker;
+import org.eclipse.virgo.shell.internal.CommandSession;
+import org.eclipse.virgo.shell.internal.StandardCommandProcessor;
+import org.junit.Before;
+import org.junit.Test;
+
+
+/**
+ */
+public class StandardCommandProcessorTests {
+
+    private StandardCommandProcessor standardCommandProcessor;
+    
+    /**
+     * @throws java.lang.Exception possibly
+     */
+    @Before
+    public void setUp() throws Exception {
+        CommandInvoker commandInvoker = createNiceMock(CommandInvoker.class);
+        this.standardCommandProcessor = new StandardCommandProcessor(commandInvoker);
+    }
+
+    /**
+     * Test method for {@link StandardCommandProcessor#createSession()}.
+     */
+    @Test
+    public void testCreateSession() {
+        CommandSession commandSession = this.standardCommandProcessor.createSession();
+        assertNotNull(commandSession);       
+    }
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/StandardCommandSessionTests.java b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/StandardCommandSessionTests.java
new file mode 100644
index 0000000..c22862b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/StandardCommandSessionTests.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.eq;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.junit.Assert.assertEquals;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.virgo.shell.internal.CommandInvoker;
+import org.eclipse.virgo.shell.internal.CommandNotFoundException;
+import org.eclipse.virgo.shell.internal.ParametersMismatchException;
+import org.eclipse.virgo.shell.internal.StandardCommandSession;
+import org.eclipse.virgo.shell.internal.parsing.ParsedCommand;
+import org.eclipse.virgo.shell.internal.parsing.ParsingUtils;
+import org.junit.Test;
+
+
+/**
+ */
+public class StandardCommandSessionTests {
+
+    private final CommandInvoker commandInvoker = createMock(CommandInvoker.class);
+
+    private final StandardCommandSession standardCommandSession = new StandardCommandSession(commandInvoker);
+
+    @Test
+    public void testExecute() throws CommandNotFoundException, ParametersMismatchException {
+        ParsedCommand parsedCommand = ParsingUtils.parseCommand("bundle examine 5");
+
+        expect(this.commandInvoker.invokeCommand(eq(parsedCommand))).andReturn(Arrays.asList("result"));
+        replay(this.commandInvoker);
+
+        List<String> lines = this.standardCommandSession.execute("bundle examine 5");
+        assertEquals("result", lines.get(0));
+    }
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/commands/AbztractCompositeInstallArtifactBasedCommandsTests.java b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/commands/AbztractCompositeInstallArtifactBasedCommandsTests.java
new file mode 100644
index 0000000..7d5736e
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/commands/AbztractCompositeInstallArtifactBasedCommandsTests.java
@@ -0,0 +1,103 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.commands;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.lang.management.ManagementFactory;
+import java.util.List;
+
+import javax.management.InstanceAlreadyExistsException;
+import javax.management.InstanceNotFoundException;
+import javax.management.MBeanRegistrationException;
+import javax.management.MalformedObjectNameException;
+import javax.management.NotCompliantMBeanException;
+import javax.management.ObjectName;
+
+import org.eclipse.virgo.shell.internal.formatting.StubManageableCompositeArtifact;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+
+public class AbztractCompositeInstallArtifactBasedCommandsTests {
+
+    private final StubAbstractCompositeInstallArtifactBasedCommands commands = new StubAbstractCompositeInstallArtifactBasedCommands();
+
+    private final StubManageableCompositeArtifact artifact = new StubManageableCompositeArtifact();
+
+    private volatile ObjectName name;
+    {
+        try {
+            this.name = new ObjectName("test:type=ArtifactModel,artifact-type=test,name=test1,version=0.0.0,region=region1");
+        } catch (MalformedObjectNameException e) {
+        } catch (NullPointerException e) {
+        }
+    }
+
+    @Before
+    public void installTestBean() throws InstanceAlreadyExistsException, MBeanRegistrationException, NotCompliantMBeanException {
+        ManagementFactory.getPlatformMBeanServer().registerMBean(this.artifact, this.name);
+    }
+
+    @After
+    public void uninstallTestBean() throws MBeanRegistrationException, InstanceNotFoundException {
+        ManagementFactory.getPlatformMBeanServer().unregisterMBean(this.name);
+    }
+
+    @Test
+    public void list() {
+        List<String> lines = this.commands.list();
+        assertFalse(lines.isEmpty());
+    }
+
+    @Test
+    public void examine() {
+        List<String> lines = this.commands.examine("test1", "0.0.0", "region1");
+        assertFalse(lines.isEmpty());
+    }
+
+    @Test
+    public void start() {
+        this.commands.start("test1", "0.0.0", "region1");
+        assertTrue(this.artifact.getStartCalled());
+    }
+
+    @Test
+    public void stop() {
+        this.commands.stop("test1", "0.0.0", "region1");
+        assertTrue(this.artifact.getStopCalled());
+    }
+
+    @Test
+    public void refreshWork() {
+        this.artifact.setShouldRefreshSucceed(true);
+        List<String> lines = this.commands.refresh("test1", "0.0.0", "region1");
+        assertTrue(this.artifact.getRefreshCalled());
+        assertTrue(lines.get(0).contains("refreshed successfully"));
+    }
+
+    @Test
+    public void refreshFail() {
+        this.artifact.setShouldRefreshSucceed(false);
+        List<String> lines = this.commands.refresh("test1", "0.0.0", "region1");
+        assertTrue(this.artifact.getRefreshCalled());
+        assertTrue(lines.get(0).contains("not refreshed"));
+    }
+
+    @Test
+    public void uninstall() {
+        this.commands.uninstall("test1", "0.0.0", "region1");
+        assertTrue(this.artifact.getUninstallCalled());
+    }
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/commands/ConfigCommandsTests.java b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/commands/ConfigCommandsTests.java
new file mode 100644
index 0000000..8252bd7
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/commands/ConfigCommandsTests.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.commands;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.lang.management.ManagementFactory;
+import java.util.Arrays;
+
+import javax.management.InstanceAlreadyExistsException;
+import javax.management.InstanceNotFoundException;
+import javax.management.MBeanRegistrationException;
+import javax.management.MalformedObjectNameException;
+import javax.management.NotCompliantMBeanException;
+import javax.management.ObjectName;
+
+import org.eclipse.virgo.shell.internal.formatting.StubManageableCompositeArtifact;
+import org.eclipse.virgo.test.stubs.region.StubRegionDigraph;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.BundleException;
+
+import org.eclipse.virgo.shell.internal.commands.ConfigCommands;
+import org.eclipse.virgo.test.stubs.service.cm.StubConfigurationAdmin;
+
+public class ConfigCommandsTests {
+
+    private static final StubRegionDigraph REGION_DIGRAPH = new StubRegionDigraph();
+
+	private static final StubConfigurationAdmin CONFIG_ADMIN = new StubConfigurationAdmin();
+
+    private final ConfigCommands commands = new ConfigCommands(new StubRuntimeArtifactModelObjectNameCreator(), CONFIG_ADMIN, REGION_DIGRAPH);
+
+    private final StubManageableCompositeArtifact artifact = new StubManageableCompositeArtifact();
+
+    private volatile ObjectName name;
+    {
+        try {
+            this.name = new ObjectName("test:type=ArtifactModel,artifact-type=configuration,name=test1,version=0.0.0,region=global");
+        } catch (MalformedObjectNameException e) {
+        } catch (NullPointerException e) {
+        }
+    }
+
+    @Before
+    public void installTestBean() throws InstanceAlreadyExistsException, MBeanRegistrationException, NotCompliantMBeanException, BundleException {
+    	REGION_DIGRAPH.createRegion("global");
+        ManagementFactory.getPlatformMBeanServer().registerMBean(this.artifact, this.name);
+    }
+
+    @After
+    public void uninstallTestBean() throws MBeanRegistrationException, InstanceNotFoundException {
+        ManagementFactory.getPlatformMBeanServer().unregisterMBean(this.name);
+    }
+
+    @Test
+    public void examineActive() throws IOException {
+    	CONFIG_ADMIN.createConfiguration("test1");
+        assertEquals(Arrays.asList("Factory pid:     com.springsource.testName", "Bundle Location: "), this.commands.examine("test1", "0.0.0", "global"));
+    }
+
+    @Test
+    public void examineNotActive() {
+        this.artifact.setState("RESOLVED");
+        assertEquals(Arrays.asList("Unable to examine configuration in non-active state"), this.commands.examine("test1", "0.0.0", "global"));
+    }
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/commands/InstallCommandTests.java b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/commands/InstallCommandTests.java
new file mode 100644
index 0000000..7e89921
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/commands/InstallCommandTests.java
@@ -0,0 +1,137 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.commands;
+
+import static org.junit.Assert.assertEquals;
+
+import java.lang.management.ManagementFactory;
+import java.util.List;
+
+import javax.management.InstanceAlreadyExistsException;
+import javax.management.InstanceNotFoundException;
+import javax.management.MBeanRegistrationException;
+import javax.management.MalformedObjectNameException;
+import javax.management.NotCompliantMBeanException;
+import javax.management.ObjectName;
+
+import org.eclipse.virgo.nano.deployer.api.ArtifactIdentity;
+import org.eclipse.virgo.nano.deployer.api.Deployer;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.eclipse.virgo.shell.internal.commands.InstallCommand;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+
+public class InstallCommandTests {
+
+    public final InstallCommand command;
+
+    private final ObjectName deployerObjectName;
+
+    public InstallCommandTests() throws MalformedObjectNameException, NullPointerException {
+        this.command = new InstallCommand();
+        this.deployerObjectName = new ObjectName("org.eclipse.virgo.kernel:category=Control,type=Deployer");
+    }
+
+    @Before
+    public void export() throws InstanceAlreadyExistsException, MBeanRegistrationException, NotCompliantMBeanException {
+        ManagementFactory.getPlatformMBeanServer().registerMBean(new StubDeployer(), this.deployerObjectName);
+    }
+
+    @After
+    public void unexport() throws MBeanRegistrationException, InstanceNotFoundException {
+        ManagementFactory.getPlatformMBeanServer().unregisterMBean(this.deployerObjectName);
+    }
+
+    @Test
+    public void install() {
+        List<String> lines = this.command.install("test1");
+        assertEquals("Artifact testType testName testVersion installed", lines.get(0));
+    }
+
+    @Test
+    public void installException() {
+        List<String> lines = this.command.install("test2");
+        assertEquals("Artifact installation failed: test", lines.get(0));
+    }
+
+    private static class StubDeployer implements Deployer {
+
+        public DeploymentIdentity deploy(String uri) {
+            throw new UnsupportedOperationException();
+        }
+
+        public DeploymentIdentity deploy(String uri, boolean recoverable) throws DeploymentException {
+            throw new UnsupportedOperationException();
+        }
+
+        public ArtifactIdentity install(String artifactUri) throws DeploymentException {
+            if ("test1".equals(artifactUri)) {
+                return new ArtifactIdentity("testType", "testName", "testVersion");
+            } else if ("test2".equals(artifactUri)) {
+                throw new IllegalArgumentException("test");
+            }
+            return null;
+        }
+
+        public ArtifactIdentity install(String artifactUri, boolean recover) throws DeploymentException {
+            throw new UnsupportedOperationException();
+        }
+
+        public ArtifactIdentity install(String type, String name, String version) throws DeploymentException {
+            throw new UnsupportedOperationException();
+        }
+
+        public ArtifactIdentity install(String type, String name, String version, boolean recover) throws DeploymentException {
+            throw new UnsupportedOperationException();
+        }
+
+        public void refresh(String uri, String symbolicName) throws DeploymentException {
+            throw new UnsupportedOperationException();
+        }
+
+        public void refreshBundle(String bundleSymbolicName, String bundleVersion) throws DeploymentException {
+            throw new UnsupportedOperationException();
+        }
+
+        public void start(ArtifactIdentity artifactIdentity) throws DeploymentException, IllegalStateException {
+            throw new UnsupportedOperationException();
+        }
+
+        public void start(String type, String name, String version) throws DeploymentException, IllegalStateException {
+            throw new UnsupportedOperationException();
+        }
+
+        public void stop(ArtifactIdentity artifactIdentity) throws DeploymentException, IllegalStateException {
+            throw new UnsupportedOperationException();
+        }
+
+        public void stop(String type, String name, String version) throws DeploymentException, IllegalStateException {
+            throw new UnsupportedOperationException();
+        }
+
+        public void undeploy(String applicationSymbolicName, String version) throws DeploymentException {
+            throw new UnsupportedOperationException();
+        }
+
+        public void uninstall(ArtifactIdentity artifactIdentity) throws DeploymentException, IllegalStateException {
+            throw new UnsupportedOperationException();
+        }
+
+        public void uninstall(String type, String name, String version) throws DeploymentException, IllegalStateException {
+            throw new UnsupportedOperationException();
+        }
+
+    }
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/commands/StubAbstractCompositeInstallArtifactBasedCommands.java b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/commands/StubAbstractCompositeInstallArtifactBasedCommands.java
new file mode 100644
index 0000000..b290017
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/commands/StubAbstractCompositeInstallArtifactBasedCommands.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.commands;
+
+import org.eclipse.virgo.kernel.model.management.ManageableCompositeArtifact;
+import org.eclipse.virgo.shell.internal.commands.AbstractInstallArtifactBasedCommands;
+import org.eclipse.virgo.test.stubs.region.StubRegionDigraph;
+
+import org.osgi.framework.BundleException;
+
+final class StubAbstractCompositeInstallArtifactBasedCommands extends AbstractInstallArtifactBasedCommands<ManageableCompositeArtifact> {
+
+    private static final StubRegionDigraph REGION_DIGRAPH = new StubRegionDigraph();
+
+    {
+    	try {
+			REGION_DIGRAPH.createRegion("region1");
+		} catch (BundleException e) {
+			e.printStackTrace(System.out);
+		}
+    }
+    
+	public StubAbstractCompositeInstallArtifactBasedCommands() {
+        super("test", new StubRuntimeArtifactModelObjectNameCreator(), new StubInstallArtifactCommandFormatter(), ManageableCompositeArtifact.class, REGION_DIGRAPH);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/commands/StubInstallArtifactCommandFormatter.java b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/commands/StubInstallArtifactCommandFormatter.java
new file mode 100644
index 0000000..29bda0d
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/commands/StubInstallArtifactCommandFormatter.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.commands;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.virgo.kernel.model.management.ManageableCompositeArtifact;
+import org.eclipse.virgo.shell.internal.formatting.InstallArtifactCommandFormatter;
+
+final class StubInstallArtifactCommandFormatter implements InstallArtifactCommandFormatter<ManageableCompositeArtifact> {
+
+    public List<String> formatExamine(ManageableCompositeArtifact artifact) {
+        return Arrays.asList("");
+    }
+
+    public List<String> formatList(List<ManageableCompositeArtifact> artifacts) {
+        return Arrays.asList("");
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/commands/StubRuntimeArtifactModelObjectNameCreator.java b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/commands/StubRuntimeArtifactModelObjectNameCreator.java
new file mode 100644
index 0000000..f464dc5
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/commands/StubRuntimeArtifactModelObjectNameCreator.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.commands;
+
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+
+import org.eclipse.equinox.region.Region;
+import org.eclipse.virgo.kernel.model.Artifact;
+import org.eclipse.virgo.kernel.model.management.RuntimeArtifactModelObjectNameCreator;
+import org.osgi.framework.Version;
+
+public final class StubRuntimeArtifactModelObjectNameCreator implements RuntimeArtifactModelObjectNameCreator {
+    
+    public ObjectName createArtifactModel(Artifact artifact) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public ObjectName createArtifactModel(String type, String name, Version version, Region region) {
+        try {
+            return new ObjectName("test:type=ArtifactModel,artifact-type=" + type + ",name=" + name + ",version=" + version + ",region=" + region.getName());
+        } catch (MalformedObjectNameException e) {
+        } catch (NullPointerException e) {
+        }
+        return null;
+    }
+
+    public ObjectName createArtifactsOfTypeQuery(String type) {
+        try {
+            return new ObjectName("test:artifact-type=" + type + ",*");
+        } catch (MalformedObjectNameException e) {
+        } catch (NullPointerException e) {
+        }
+        return null;
+    }
+
+    public ObjectName createArtifactsQuery() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public ObjectName createAllArtifactsQuery() {
+        throw new UnsupportedOperationException();
+    }
+
+    public ObjectName createArtifactVersionsQuery(String type, String name) {
+        try {
+            return new ObjectName("test:type=ArtifactModel,artifact-type=" + type + ",name=" + name + ",*");
+        } catch (MalformedObjectNameException e) {
+        } catch (NullPointerException e) {
+        }
+        return null;
+    }
+
+    public String getName(ObjectName objectName) {
+        return objectName.getKeyProperty("name");
+    }
+
+    public String getVersion(ObjectName objectName) {
+        return objectName.getKeyProperty("version");
+    }
+
+	@Override
+	public String getRegion(ObjectName objectName) {
+        return objectName.getKeyProperty("region");
+	}
+
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/completers/AbztractInstallArtifactCompleterTests.java b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/completers/AbztractInstallArtifactCompleterTests.java
new file mode 100644
index 0000000..02eeea2
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/completers/AbztractInstallArtifactCompleterTests.java
@@ -0,0 +1,99 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.completers;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.lang.management.ManagementFactory;
+import java.util.Set;
+
+import javax.management.InstanceAlreadyExistsException;
+import javax.management.InstanceNotFoundException;
+import javax.management.MBeanRegistrationException;
+import javax.management.MalformedObjectNameException;
+import javax.management.NotCompliantMBeanException;
+import javax.management.ObjectName;
+
+import org.eclipse.virgo.shell.internal.commands.StubRuntimeArtifactModelObjectNameCreator;
+import org.eclipse.virgo.shell.internal.completers.AbstractInstallArtifactCompleter;
+import org.eclipse.virgo.shell.internal.formatting.StubManageableCompositeArtifact;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+
+public class AbztractInstallArtifactCompleterTests {
+
+    private final StubInstallArtifactCompleter completer = new StubInstallArtifactCompleter();
+
+    private final StubManageableCompositeArtifact artifact = new StubManageableCompositeArtifact();
+
+    private volatile ObjectName name;
+    {
+        try {
+            this.name = new ObjectName("test:type=ArtifactModel,artifact-type=test,name=test1,version=0.0.0");
+        } catch (MalformedObjectNameException e) {
+        } catch (NullPointerException e) {
+        }
+    }
+
+    @Before
+    public void installTestBean() throws InstanceAlreadyExistsException, MBeanRegistrationException, NotCompliantMBeanException {
+        ManagementFactory.getPlatformMBeanServer().registerMBean(this.artifact, this.name);
+    }
+
+    @After
+    public void uninstallTestBean() throws MBeanRegistrationException, InstanceNotFoundException {
+        ManagementFactory.getPlatformMBeanServer().unregisterMBean(this.name);
+    }
+
+    @Test
+    public void list() {
+        assertEquals(0, this.completer.getCompletionCandidates("list").size());
+    }
+
+    @Test
+    public void name() {
+        assertEquals(1, this.completer.getCompletionCandidates("examine", "tes").size());
+    }
+
+    @Test
+    public void version() {
+        assertEquals(1, this.completer.getCompletionCandidates("examine", "test1", "").size());
+    }
+
+    @Test
+    public void tooManyArgs() {
+        assertEquals(0, this.completer.getCompletionCandidates("testCommand", "", "", "").size());
+    }
+
+    @Test
+    public void filter() {
+        assertTrue(this.completer.getCompletionCandidates("testFilter", "tes").contains("filtered"));
+    }
+
+    private static class StubInstallArtifactCompleter extends AbstractInstallArtifactCompleter {
+
+        public StubInstallArtifactCompleter() {
+            super("test", new StubRuntimeArtifactModelObjectNameCreator());
+        }
+
+        @Override
+        protected void filter(Set<String> candidates, String subcommand, String... tokens) {
+            if ("testFilter".equals(subcommand)) {
+                candidates.add("filtered");
+            }
+        }
+
+    }
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/completers/ConfigCompleterTests.java b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/completers/ConfigCompleterTests.java
new file mode 100644
index 0000000..f50ffb2
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/completers/ConfigCompleterTests.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.completers;
+
+import static org.junit.Assert.assertEquals;
+
+import java.lang.management.ManagementFactory;
+
+import javax.management.InstanceAlreadyExistsException;
+import javax.management.InstanceNotFoundException;
+import javax.management.MBeanRegistrationException;
+import javax.management.MalformedObjectNameException;
+import javax.management.NotCompliantMBeanException;
+import javax.management.ObjectName;
+
+import org.eclipse.virgo.shell.internal.commands.StubRuntimeArtifactModelObjectNameCreator;
+import org.eclipse.virgo.shell.internal.formatting.StubManageableCompositeArtifact;
+import org.eclipse.virgo.test.stubs.region.StubRegionDigraph;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.osgi.framework.BundleException;
+
+
+public class ConfigCompleterTests {
+
+    private static final StubRegionDigraph REGION_DIGRAPH = new StubRegionDigraph();
+    
+	private final ConfigCompleter completer = new ConfigCompleter(new StubRuntimeArtifactModelObjectNameCreator(), REGION_DIGRAPH);
+
+    @BeforeClass
+    public static void installTestBean() throws InstanceAlreadyExistsException, MBeanRegistrationException, NotCompliantMBeanException, BundleException {
+    	REGION_DIGRAPH.createRegion("global");
+        ManagementFactory.getPlatformMBeanServer().registerMBean(getActiveArtifact(), getObjectName("test1", "0.0.0"));
+        ManagementFactory.getPlatformMBeanServer().registerMBean(getActiveArtifact(), getObjectName("test1", "1.0.0"));
+        ManagementFactory.getPlatformMBeanServer().registerMBean(getActiveArtifact(), getObjectName("test2", "0.0.0"));
+        ManagementFactory.getPlatformMBeanServer().registerMBean(getInactiveArtifact(), getObjectName("test2", "1.0.0"));
+        ManagementFactory.getPlatformMBeanServer().registerMBean(getInactiveArtifact(), getObjectName("test3", "0.0.0"));
+        ManagementFactory.getPlatformMBeanServer().registerMBean(getInactiveArtifact(), getObjectName("test3", "1.0.0"));
+    }
+
+    @AfterClass
+    public static void uninstallTestBean() throws MBeanRegistrationException, InstanceNotFoundException {
+        ManagementFactory.getPlatformMBeanServer().unregisterMBean(getObjectName("test1", "0.0.0"));
+        ManagementFactory.getPlatformMBeanServer().unregisterMBean(getObjectName("test1", "1.0.0"));
+        ManagementFactory.getPlatformMBeanServer().unregisterMBean(getObjectName("test2", "0.0.0"));
+        ManagementFactory.getPlatformMBeanServer().unregisterMBean(getObjectName("test2", "1.0.0"));
+        ManagementFactory.getPlatformMBeanServer().unregisterMBean(getObjectName("test3", "0.0.0"));
+        ManagementFactory.getPlatformMBeanServer().unregisterMBean(getObjectName("test3", "1.0.0"));
+    }
+
+    @Test
+    public void filterNames() {
+    	assertEquals(2, this.completer.getCompletionCandidates("examine", "").size());
+    }
+    
+    @Test
+    public void filterVersions() {
+    	assertEquals(2, this.completer.getCompletionCandidates("examine", "test1", "").size());
+        assertEquals(1, this.completer.getCompletionCandidates("examine", "test2", "").size());
+        assertEquals(0, this.completer.getCompletionCandidates("examine", "test3", "").size());
+    }
+
+    private final static ObjectName getObjectName(String name, String version) {
+        try {
+            return new ObjectName("test:type=ArtifactModel,artifact-type=configuration,name=" + name + ",version=" + version + ",region=global");
+        } catch (MalformedObjectNameException e) {
+        } catch (NullPointerException e) {
+        }
+        return null;
+    }
+
+    private final static StubManageableCompositeArtifact getActiveArtifact() {
+        return new StubManageableCompositeArtifact().setState("ACTIVE");
+    }
+
+    private final static StubManageableCompositeArtifact getInactiveArtifact() {
+        return new StubManageableCompositeArtifact().setState("RESOLVED");
+    }
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/completers/InstallCompleterTests.java b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/completers/InstallCompleterTests.java
new file mode 100644
index 0000000..b121011
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/completers/InstallCompleterTests.java
@@ -0,0 +1,108 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.completers;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.util.List;
+
+import org.eclipse.virgo.shell.internal.completers.InstallCompleter;
+import org.junit.Ignore;
+import org.junit.Test;
+
+/**
+ */
+public class InstallCompleterTests {
+
+    private static final String FILE_PREFIX = "file:";
+
+    private static final File base = new File("build" + File.separatorChar + "install-completer" + File.separatorChar);
+
+    private static final String ALPHA = FILE_PREFIX + new File(base, "alpha ").getPath();
+
+    private static final String ALPHA_SINGLE = FILE_PREFIX + new File(base, "alpha").getPath() + File.separatorChar;
+
+    private static final String APPLE = FILE_PREFIX + new File(base, "apple.txt ").getPath();
+
+    private static final String BRAVO = FILE_PREFIX + new File(base, "bravo ").getPath();
+
+    private static final String BRAVO_SINGLE = FILE_PREFIX + new File(base, "bravo").getPath() + File.separatorChar;
+
+    private final InstallCompleter completer;
+
+    {
+        try {
+            this.completer = new InstallCompleter();
+
+            new File(base, "alpha").mkdirs();
+            new File(base, "bravo").mkdirs();
+            new File(base, "apple.txt").createNewFile();
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    @Test
+    public void completionOfCompletelyUnmatchingPath() {
+        List<String> completionCandidates = this.completer.getCompletionCandidates("file:zebra" + File.separatorChar + "giraffe");
+        assertCompletionsPresent(completionCandidates);
+    }
+    
+    @Ignore("[DMS-2885] FileNameComplet(e|o)r no longer available.")
+    @Test
+    public void completionWithMultipleOptions() {
+        List<String> completionCandidates = this.completer.getCompletionCandidates("file:target" + File.separatorChar + "install-completer"
+            + File.separatorChar);
+        assertCompletionsPresent(completionCandidates, ALPHA, APPLE, BRAVO);
+
+        completionCandidates = this.completer.getCompletionCandidates("file:target" + File.separatorChar + "install-completer" + File.separatorChar
+            + "a");
+        assertCompletionsPresent(completionCandidates, ALPHA, APPLE);
+    }
+
+    @Ignore("[DMS-2885]FileNameComplet(e|o)r no longer available.")
+    @Test
+    public void completionWithSingleOption() {
+        List<String> completionCandidates = this.completer.getCompletionCandidates("file:target" + File.separatorChar + "install-completer"
+            + File.separatorChar + "ap");
+        assertEquals(1, completionCandidates.size());
+        assertCompletionsPresent(completionCandidates, APPLE);
+
+        completionCandidates = this.completer.getCompletionCandidates("file:target" + File.separatorChar + "install-completer" + File.separatorChar
+            + "al");
+        assertCompletionsPresent(completionCandidates, ALPHA_SINGLE);
+
+        completionCandidates = this.completer.getCompletionCandidates("file:target" + File.separatorChar + "install-completer" + File.separatorChar
+            + "b");
+        assertCompletionsPresent(completionCandidates, BRAVO_SINGLE);
+    }
+
+    @Test
+    public void completionWithNoOptions() {
+        List<String> completionCandidates = this.completer.getCompletionCandidates("file:target" + File.separatorChar + "install-completer"
+            + File.separatorChar + "c");
+        assertCompletionsPresent(completionCandidates);
+
+        completionCandidates = this.completer.getCompletionCandidates("file:target" + File.separatorChar + "install-completer" + File.separatorChar
+            + "bravo" + File.separatorChar);
+        assertCompletionsPresent(completionCandidates);
+    }
+
+    private static void assertCompletionsPresent(List<String> actual, String... expected) {
+        assertEquals(expected.length, actual.size());
+        for (String string : expected) {
+            assertTrue("Expected completion candidate '" + string + "' was not present in completions " + actual, actual.contains(string));
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/converters/LongConverterTests.java b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/converters/LongConverterTests.java
new file mode 100644
index 0000000..b24977a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/converters/LongConverterTests.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.converters;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.virgo.shell.Converter;
+import org.eclipse.virgo.shell.internal.converters.LongConverter;
+import org.junit.Test;
+
+
+/**
+ */
+public class LongConverterTests {
+
+    private final Long testLong = 45L;
+
+    private final long testLongPrimitive = testLong.longValue();
+
+    @Test
+    public void testGetTypes() {
+        String[] types = LongConverter.getTypes();
+        List<String> typesList = Arrays.asList(types);
+        assertTrue(typesList.contains(Long.class.getName()));
+        assertTrue(typesList.contains(long.class.getName()));
+    }
+
+    @Test
+    public void testConvert() throws Exception {
+        LongConverter longConverter = new LongConverter();
+        assertEquals(testLong, longConverter.convert(Long.class, testLong.toString()));
+        assertEquals(testLong, longConverter.convert(long.class, testLong.toString()));
+    }
+
+    @Test
+    public void testConvertBadInput() throws Exception {
+        LongConverter longConverter = new LongConverter();
+        assertNull(longConverter.convert(Integer.class, testLong.toString()));
+        assertNull(longConverter.convert(int.class, testLong.toString()));
+    }
+
+    @Test
+    public void testFormat() throws Exception {
+        LongConverter longConverter = new LongConverter();
+        assertEquals(testLong.toString(), longConverter.format(testLong, Converter.LINE, null));
+        assertEquals(testLong.toString(), longConverter.format(testLongPrimitive, Converter.LINE, null));
+    }
+
+    @Test
+    public void testFormatNotALong() throws Exception {
+        LongConverter longConverter = new LongConverter();
+        assertNull(longConverter.format(new Object(), Converter.LINE, null));
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/converters/StringConverterTests.java b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/converters/StringConverterTests.java
new file mode 100644
index 0000000..a502c1e
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/converters/StringConverterTests.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.converters;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import org.eclipse.virgo.shell.internal.converters.StringConverter;
+import org.junit.Test;
+
+
+
+/**
+ * <p>
+ * StringConverterTests for the basic function of {@link StringConverter} the format method is not used.
+ * </p>
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Test class
+ *
+ */
+public class StringConverterTests {
+
+    private static final String testString = "formattedString";
+
+    /**
+     * Test method for {@link StringConverter#getTypes()}.
+     */
+    @Test
+    public void testGetTypes() {
+        assertEquals(String.class.getName(), StringConverter.getTypes());
+    }
+
+    /**
+     * Test method for {@link StringConverter#convert(java.lang.Class, java.lang.Object)}.
+     * @throws Exception 
+     */
+    @Test
+    public void testConvert() throws Exception {
+        StringConverter stringConverter = new StringConverter();
+        assertEquals(testString, stringConverter.convert(String.class, testString));
+    }
+
+    /**
+     * Test method for {@link StringConverter#convert(java.lang.Class, java.lang.Object)}.
+     * @throws Exception 
+     */
+    @Test
+    public void testConvertBadType() throws Exception {
+        StringConverter stringConverter = new StringConverter();
+        assertEquals(null, stringConverter.convert(Integer.class, testString));
+    }
+
+    /**
+     * Test method for {@link StringConverter#format(java.lang.Object, int, org.eclipse.virgo.shell.Converter)}.
+     * @throws Exception 
+     */
+    @Test
+    public void testFormat() throws Exception {
+        StringConverter stringConverter = new StringConverter();
+        assertEquals(testString, stringConverter.format(testString, 0, null));
+    }
+
+    /**
+     * Test method for {@link StringConverter#format(java.lang.Object, int, org.eclipse.virgo.shell.Converter)}.
+     * @throws Exception 
+     */
+    @Test
+    public void testFormatNotAString() throws Exception {
+        StringConverter stringConverter = new StringConverter();
+        assertNull(stringConverter.format(new Object(), 0, null));
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/formatting/AbztractInstallArtifactCommandFormatterTests.java b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/formatting/AbztractInstallArtifactCommandFormatterTests.java
new file mode 100644
index 0000000..d6994ab
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/formatting/AbztractInstallArtifactCommandFormatterTests.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.formatting;
+
+import static org.eclipse.virgo.shell.internal.formatting.TestOutputComparator.assertOutputEquals;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Test;
+
+import org.eclipse.virgo.kernel.model.management.ManageableArtifact;
+import org.eclipse.virgo.shell.internal.formatting.AbstractInstallArtifactCommandFormatter;
+
+public class AbztractInstallArtifactCommandFormatterTests {
+
+    private final StubInstallArtifactCommandFormatter formatter = new StubInstallArtifactCommandFormatter();
+
+    @Test
+    public void list() {
+        List<ManageableArtifact> artifacts = new ArrayList<ManageableArtifact>();
+        artifacts.add(new StubManageableCompositeArtifact());
+        List<String> lines = this.formatter.formatList(artifacts);
+        assertOutputEquals(new File("src/test/resources/org/eclipse/virgo/kernel/shell/internal/formatting/abstract-list.txt"), lines);
+    }
+
+    private static class StubInstallArtifactCommandFormatter extends AbstractInstallArtifactCommandFormatter<ManageableArtifact> {
+
+        public List<String> formatExamine(ManageableArtifact artifact) {
+            throw new UnsupportedOperationException();
+        }
+
+    }
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/formatting/CompositeInstallArtifactCommandFormatterTests.java b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/formatting/CompositeInstallArtifactCommandFormatterTests.java
new file mode 100644
index 0000000..b050f65
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/formatting/CompositeInstallArtifactCommandFormatterTests.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.formatting;
+
+import static org.eclipse.virgo.shell.internal.formatting.TestOutputComparator.assertOutputEquals;
+
+import java.io.File;
+import java.util.List;
+
+import org.eclipse.virgo.shell.internal.formatting.CompositeInstallArtifactCommandFormatter;
+import org.junit.Test;
+
+public class CompositeInstallArtifactCommandFormatterTests {
+
+    private final CompositeInstallArtifactCommandFormatter formatter = new CompositeInstallArtifactCommandFormatter();
+
+    @Test
+    public void examine() {
+        List<String> lines = this.formatter.formatExamine(new StubManageableCompositeArtifact());
+        assertOutputEquals(new File("src/test/resources/org/eclipse/virgo/kernel/shell/internal/formatting/composite-examine.txt"), lines);
+    }
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/formatting/ConfigInstallArtifactCommandFormatterTests.java b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/formatting/ConfigInstallArtifactCommandFormatterTests.java
new file mode 100644
index 0000000..04a3046
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/formatting/ConfigInstallArtifactCommandFormatterTests.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.formatting;
+
+import static org.eclipse.virgo.shell.internal.formatting.TestOutputComparator.assertOutputEquals;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+import javax.management.ObjectName;
+
+import org.junit.Test;
+
+import org.eclipse.virgo.kernel.model.management.ManageableArtifact;
+import org.eclipse.virgo.shell.internal.formatting.ConfigInstallArtifactCommandFormatter;
+import org.eclipse.virgo.test.stubs.service.cm.StubConfiguration;
+import org.eclipse.virgo.test.stubs.service.cm.StubConfigurationAdmin;
+
+public class ConfigInstallArtifactCommandFormatterTests {
+
+    private final StubConfigurationAdmin configurationAdmin = new StubConfigurationAdmin();
+
+    private final ConfigInstallArtifactCommandFormatter formatter = new ConfigInstallArtifactCommandFormatter(configurationAdmin);
+
+    @Test
+    public void examine() throws IOException {
+        StubConfiguration configuration = this.configurationAdmin.createConfiguration("testPid");
+        configuration.setBundleLocation("/a/location");
+        configuration.addProperty("key1", new Object[] { "value11111111111111111111111111111111111111111111111111111111111111111111111111111111a",
+            "value1b" });
+        configuration.addProperty("key2", "value2");
+
+        List<String> lines = this.formatter.formatExamine(new StubManageableArtifact());
+        assertOutputEquals(new File("src/test/resources/org/eclipse/virgo/kernel/shell/internal/formatting/config-examine.txt"), lines);
+    }
+
+    private static class StubManageableArtifact implements ManageableArtifact {
+
+        public ObjectName[] getDependents() {
+            throw new UnsupportedOperationException();
+        }
+
+        public String getName() {
+            return "testPid";
+        }
+
+        public Map<String, String> getProperties() {
+            throw new UnsupportedOperationException();
+        }
+
+        public String getState() {
+            throw new UnsupportedOperationException();
+        }
+
+        public String getRegion() {
+            throw new UnsupportedOperationException();
+        }
+
+        public String getType() {
+            throw new UnsupportedOperationException();
+        }
+
+        public String getVersion() {
+            throw new UnsupportedOperationException();
+        }
+
+        public void start() {
+            throw new UnsupportedOperationException();
+        }
+
+        public void stop() {
+            throw new UnsupportedOperationException();
+        }
+
+        public void uninstall() {
+            throw new UnsupportedOperationException();
+        }
+
+        public boolean refresh() {
+            throw new UnsupportedOperationException();
+        }
+
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/formatting/PropertyFormatterTests.java b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/formatting/PropertyFormatterTests.java
new file mode 100644
index 0000000..82dd7e4
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/formatting/PropertyFormatterTests.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.formatting;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.List;
+
+import org.eclipse.virgo.shell.internal.formatting.PropertyFormatter;
+import org.junit.Test;
+
+
+
+/**
+ */
+public class PropertyFormatterTests {
+    
+    @Test
+    public void formatSingleEntry() {
+        List<String> formatted = PropertyFormatter.formatPropertyValue("a single entry", 80);
+        assertEquals(1, formatted.size());
+        assertEquals("a single entry", formatted.get(0));
+        
+        formatted = PropertyFormatter.formatPropertyValue("a single entry", 8);
+        assertEquals(1, formatted.size());
+        assertEquals("a single entry", formatted.get(0));
+    }
+    
+    @Test
+    public void formatArrayEntry() {
+        List<String> formatted = PropertyFormatter.formatPropertyValue(new String[] {"alpha", "bravo", "charlie", "delta", "echo"}, 20);
+        assertEquals(2, formatted.size());
+        assertEquals("alpha, bravo, ", formatted.get(0));
+        assertEquals("charlie, delta, echo", formatted.get(1));        
+        
+        formatted = PropertyFormatter.formatPropertyValue(new String[] {"alpha", "bravo", "charlie", "delta", "echo"}, 5);
+        assertEquals(5, formatted.size());
+        assertEquals("alpha, ", formatted.get(0));
+        assertEquals("bravo, ", formatted.get(1));
+        assertEquals("charlie, ", formatted.get(2));
+        assertEquals("delta, ", formatted.get(3));
+        assertEquals("echo", formatted.get(4));
+    }
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/formatting/ServiceCommandFormatterTests.java b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/formatting/ServiceCommandFormatterTests.java
new file mode 100644
index 0000000..5803d36
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/formatting/ServiceCommandFormatterTests.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.formatting;
+
+import static org.eclipse.virgo.shell.internal.formatting.TestOutputComparator.assertOutputEquals;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.List;
+
+import org.eclipse.virgo.shell.internal.formatting.ServiceCommandFormatter;
+import org.eclipse.virgo.shell.internal.util.ServiceHolder;
+import org.eclipse.virgo.shell.stubs.StubQuasiFramework;
+import org.eclipse.virgo.test.stubs.framework.StubBundle;
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+import org.eclipse.virgo.test.stubs.framework.StubServiceReference;
+import org.eclipse.virgo.test.stubs.framework.StubServiceRegistration;
+import org.junit.Test;
+import org.osgi.framework.Constants;
+import org.osgi.framework.Version;
+
+/**
+ * Tests for {@link ServiceCommandFormatter}
+ * 
+ */
+public class ServiceCommandFormatterTests {
+
+    private final ServiceCommandFormatter serviceCommandFormatter = new ServiceCommandFormatter();
+
+    @Test
+    public void examine() throws Exception {
+    	StubBundle bundle = new StubBundle(2L, "bundle.symbolic.name", new Version("1.0.1.asdhjgf"), "/some/location");
+        StubQuasiFramework stubQuasiFramework = new StubQuasiFramework(bundle);
+
+        StubServiceRegistration<Object> stubServiceRegistration = new StubServiceRegistration<Object>((StubBundleContext) bundle.getBundleContext(), new String[]{"bundle.symbolic.name"});
+		StubServiceReference<Object> serviceReference = new StubServiceReference<Object>(stubServiceRegistration);
+		serviceReference.setBundle(bundle);
+        ServiceHolder service = new ServiceHolder(stubQuasiFramework, serviceReference);
+
+        String[] obj1 = new String[] { "This is a string array....", "Second string" };
+        Dictionary<String, Object> dic = new Hashtable<String, Object>();
+        dic.put("propertyName1", obj1);
+        stubServiceRegistration.setProperties(dic);
+
+        List<String> lines = serviceCommandFormatter.formatExamine(service);
+        assertOutputEquals(new File("src/test/resources/org/eclipse/virgo/kernel/shell/internal/formatting/service-examine.txt"), lines);
+    }
+
+    @Test
+    public void summary() throws Exception {
+    	StubBundle bundle1 = new StubBundle(2L, "bundle.symbolic.name1", new Version("2.0.1.asdhjgf"), "/some/location");
+    	StubBundle bundle2 = new StubBundle(4L, "bundle.symbolic.name2", new Version("4.0.1.asdhjgf"), "/some/location");
+        StubQuasiFramework stubQuasiFramework = new StubQuasiFramework(bundle1, bundle2);
+
+        StubServiceRegistration<Object> stubServiceRegistration1 = new StubServiceRegistration<Object>((StubBundleContext) bundle1.getBundleContext(), new String[]{"bundle.symbolic.name1"});
+		StubServiceReference<Object> serviceReference1 = new StubServiceReference<Object>(stubServiceRegistration1);
+		serviceReference1.setBundle(bundle1);
+        ServiceHolder service1 = new ServiceHolder(stubQuasiFramework, serviceReference1);
+
+        StubServiceRegistration<Object> stubServiceRegistration2 = new StubServiceRegistration<Object>((StubBundleContext) bundle2.getBundleContext(), new String[]{"bundle.symbolic.name2"});
+		StubServiceReference<Object> serviceReference2 = new StubServiceReference<Object>(stubServiceRegistration2);
+		serviceReference2.setBundle(bundle2);
+        ServiceHolder service2 = new ServiceHolder(stubQuasiFramework, serviceReference2);
+        
+        Dictionary<String, Object> dic = new Hashtable<String, Object>();
+        dic.put(Constants.OBJECTCLASS, "object.class.obj.com.com.com.springsource.verylongclassnameinpackage.AgainLongName");
+        stubServiceRegistration1.setProperties(dic);
+
+        List<ServiceHolder> services = new ArrayList<ServiceHolder>(2);
+        services.add(service1);
+        services.add(service2);
+
+        List<String> lines = serviceCommandFormatter.formatList(services);
+        assertOutputEquals(new File("src/test/resources/org/eclipse/virgo/kernel/shell/internal/formatting/service-list.txt"), lines);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/formatting/StubManageableCompositeArtifact.java b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/formatting/StubManageableCompositeArtifact.java
new file mode 100644
index 0000000..36ed7ef
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/formatting/StubManageableCompositeArtifact.java
@@ -0,0 +1,193 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.formatting;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+
+import org.eclipse.virgo.kernel.model.management.ManageableCompositeArtifact;
+
+public class StubManageableCompositeArtifact implements ManageableCompositeArtifact {
+
+    private volatile boolean atomicCalled = false;
+
+    private volatile boolean scopedCalled = false;
+
+    private volatile boolean namedCalled = false;
+
+    private volatile boolean stateCalled = false;
+
+    private volatile boolean typeCalled = false;
+
+    private volatile boolean versionCalled = false;
+
+    private volatile boolean regionCalled = false;
+
+    private volatile boolean startCalled = false;
+
+    private volatile boolean stopCalled = false;
+
+    private volatile boolean uninstallCalled = false;
+
+    private volatile boolean refreshCalled = false;
+
+    private volatile boolean dependentsCalled = false;
+
+    private volatile boolean propertiesCalled = false;
+    
+    private volatile boolean shouldRefreshSucceed = true;
+	
+    private volatile String state = "ACTIVE";
+    
+    public void setShouldRefreshSucceed(boolean shouldRefreshSucceed) {
+		this.shouldRefreshSucceed = shouldRefreshSucceed;
+	}
+
+    public boolean isAtomic() {
+        this.atomicCalled = true;
+        return false;
+    }
+
+    public boolean isScoped() {
+        this.scopedCalled = true;
+        return false;
+    }
+
+    public ObjectName[] getDependents() {
+        this.dependentsCalled = true;
+
+        List<ObjectName> objectNames = new ArrayList<ObjectName>();
+        try {
+            objectNames.add(new ObjectName("test:artifact-type=test,name=com.springsource.test2,version=0.0.0"));
+            objectNames.add(new ObjectName("test:artifact-type=test,name=com.springsource.test3,version=0.0.0"));
+        } catch (MalformedObjectNameException e) {
+        } catch (NullPointerException e) {
+        }
+
+        return objectNames.toArray(new ObjectName[objectNames.size()]);
+    }
+
+    public String getName() {
+        this.namedCalled = true;
+        return "com.springsource.testName";
+    }
+
+    public Map<String, String> getProperties() {
+        this.propertiesCalled = true;
+
+        Map<String, String> properties = new HashMap<String, String>(2);
+        properties.put("key1", "value1");
+        properties.put("key2", "value2");
+
+        return properties;
+    }
+
+    public String getState() {
+        this.stateCalled = true;
+        return this.state;
+    }
+
+    public String getRegion() {
+        this.regionCalled = true;
+        return "testRegion";
+    }
+    
+    public StubManageableCompositeArtifact setState(String state) {
+        this.state = state;
+        return this;
+    }
+
+    public String getType() {
+        this.typeCalled = true;
+        return "testType";
+    }
+
+    public String getVersion() {
+        this.versionCalled = true;
+        return "0.0.0";
+    }
+
+    public void start() {
+        this.startCalled = true;
+    }
+
+    public void stop() {
+        this.stopCalled = true;
+    }
+
+    public void uninstall() {
+        this.uninstallCalled = true;
+    }
+
+    public boolean refresh() {
+        this.refreshCalled = true;
+        return this.shouldRefreshSucceed;
+    }
+
+    public boolean getAtomicCalled() {
+        return atomicCalled;
+    }
+
+    public boolean getScopedCalled() {
+        return scopedCalled;
+    }
+
+    public boolean getNamedCalled() {
+        return namedCalled;
+    }
+
+    public boolean getStateCalled() {
+        return stateCalled;
+    }
+
+    public boolean getTypeCalled() {
+        return typeCalled;
+    }
+
+    public boolean getRegionCalled() {
+        return regionCalled;
+    }
+
+    public boolean getVersionCalled() {
+        return versionCalled;
+    }
+
+    public boolean getStartCalled() {
+        return startCalled;
+    }
+
+    public boolean getStopCalled() {
+        return stopCalled;
+    }
+
+    public boolean getUninstallCalled() {
+        return uninstallCalled;
+    }
+
+    public boolean getRefreshCalled() {
+        return refreshCalled;
+    }
+
+    public boolean getDependentsCalled() {
+        return dependentsCalled;
+    }
+
+    public boolean getPropertiesCalled() {
+        return propertiesCalled;
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/formatting/TestOutputComparator.java b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/formatting/TestOutputComparator.java
new file mode 100644
index 0000000..30753a9
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/formatting/TestOutputComparator.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.formatting;
+
+import static org.junit.Assert.fail;
+import static org.junit.Assert.assertEquals;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.virgo.util.io.IOUtils;
+
+public final class TestOutputComparator {
+
+    public static void assertOutputEquals(File expectedFile, List<String> experimental) {
+
+        BufferedReader in = null;
+        Iterator<String> it = experimental.iterator();
+
+        try {
+            in = new BufferedReader(new FileReader(expectedFile));
+            String line;
+            while ((line = in.readLine()) != null) {
+                assertEquals(line, it.next());
+            }
+        } catch (FileNotFoundException e) {
+            fail(e.getMessage());
+        } catch (IOException e) {
+            fail(e.getMessage());
+        } finally {
+            IOUtils.closeQuietly(in);
+        }
+    }
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/help/SimpleFileHelpAccessorTests.java b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/help/SimpleFileHelpAccessorTests.java
new file mode 100644
index 0000000..88d6936
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/help/SimpleFileHelpAccessorTests.java
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.help;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.virgo.shell.internal.help.HelpAccessor;
+import org.eclipse.virgo.shell.internal.help.SimpleFileHelpAccessor;
+import org.junit.Test;
+
+/**
+ * Tests for {@link SimpleFileHelpAccessor}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread-safe
+ * 
+ */
+public class SimpleFileHelpAccessorTests {
+
+    private static final String HELP_ACCESSOR_TEST_FILE_NAME = "org.eclipse.virgo.shell.internal.help.SimpleFileHelpAccessorTests.help";
+
+    private static final URL HELP_ACCESSOR_TEST_HELP_FILE_URL;
+    static {
+        URL url = null;
+        try {
+            url = new File("src/test/resources/helpAccessorTests.help").toURI().toURL();
+        } catch (MalformedURLException mue) {
+            assertTrue("Cannot define URL in test", false);
+        }
+        HELP_ACCESSOR_TEST_HELP_FILE_URL = url;
+    }
+
+    private static class AccessorTestClass extends SimpleFileHelpAccessor {
+
+        protected URL helpResourceUrl(Class<?> clazz, String fileResourceName) {
+            assertEquals("File resource name not correctly formed from classname", HELP_ACCESSOR_TEST_FILE_NAME, fileResourceName);
+            return HELP_ACCESSOR_TEST_HELP_FILE_URL;
+        }
+    }
+
+    private static class NoHelpAccessorTestClass extends SimpleFileHelpAccessor {
+
+        protected URL helpResourceUrl(Class<?> clazz, String fileResourceName) {
+            return null;
+        }
+    }
+
+    private HelpAccessor haTest = new AccessorTestClass();
+
+    @Test
+    public void readHelpFileSummary() throws Exception {
+        String helpSummary = haTest.getSummaryHelp(SimpleFileHelpAccessorTests.class);
+        assertEquals("First line not read correctly", "First line of help text", helpSummary);
+    }
+
+    @Test
+    public void readHelpFileDetails() throws Exception {
+        List<String> lines = haTest.getDetailedHelp(SimpleFileHelpAccessorTests.class);
+        assertEquals("Detail not read correctly", Arrays.asList("Line 1", "  Line 2"), lines);
+    }
+
+    @Test
+    public void summaryWithNoHelpFile() throws Exception {
+        HelpAccessor missingHelp = new NoHelpAccessorTestClass();
+        assertNull(missingHelp.getSummaryHelp(Object.class));
+    }
+
+    @Test
+    public void detailWithNoHelpFile() throws Exception {
+        HelpAccessor missingHelp = new NoHelpAccessorTestClass();
+        assertTrue(missingHelp.getDetailedHelp(Object.class).isEmpty());
+    }
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/util/PackageHolderTests.java b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/util/PackageHolderTests.java
new file mode 100644
index 0000000..628d4cb
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/util/PackageHolderTests.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.util;
+
+import static org.junit.Assert.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiExportPackage;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiImportPackage;
+import org.eclipse.virgo.shell.internal.util.PackageHolder;
+import org.eclipse.virgo.shell.stubs.StubQuasiExportPackage;
+import org.eclipse.virgo.shell.stubs.StubQuasiImportPackage;
+
+
+/**
+ */
+public class PackageHolderTests {
+
+    private static final String TEST_PACKAGE_NAME = "test.package";
+    
+    private PackageHolder standardQuasiPackage;
+    
+    @Before
+    public void setUp() throws Exception {
+        List<QuasiExportPackage> exports = new ArrayList<QuasiExportPackage>();
+        exports.add(new StubQuasiExportPackage(TEST_PACKAGE_NAME));
+        List<QuasiImportPackage> imports = new ArrayList<QuasiImportPackage>();
+        imports.add(new StubQuasiImportPackage(TEST_PACKAGE_NAME));
+        this.standardQuasiPackage = new PackageHolder(exports, imports, TEST_PACKAGE_NAME);
+    }
+
+    @Test
+    public void testGetExporters() {
+        assertNotNull(this.standardQuasiPackage.getExporters());
+        assertEquals(1, this.standardQuasiPackage.getExporters().size());
+    }
+
+    @Test
+    public void testGetImporters() {
+        assertNotNull(this.standardQuasiPackage.getImporters());
+        assertEquals(1, this.standardQuasiPackage.getImporters().size());
+    }
+
+    @Test
+    public void testGetPackageName() {
+        assertNotNull(this.standardQuasiPackage.getPackageName());
+        assertEquals(TEST_PACKAGE_NAME, this.standardQuasiPackage.getPackageName());
+    }
+
+    @Test
+    public void testGetExportersNull() {
+        this.standardQuasiPackage = new PackageHolder(null, new ArrayList<QuasiImportPackage>(), TEST_PACKAGE_NAME);
+        assertNotNull(this.standardQuasiPackage.getExporters());
+    }
+
+    @Test
+    public void testGetImportersNull() {
+        this.standardQuasiPackage = new PackageHolder(new ArrayList<QuasiExportPackage>(), null, TEST_PACKAGE_NAME);
+        assertNotNull(this.standardQuasiPackage.getImporters());
+    }
+
+    @Test(expected=IllegalArgumentException.class)
+    public void testGetPackageNameNull() {
+        this.standardQuasiPackage = new PackageHolder(new ArrayList<QuasiExportPackage>(), new ArrayList<QuasiImportPackage>(), null);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/util/QuasiBundleUtilTests.java b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/util/QuasiBundleUtilTests.java
new file mode 100644
index 0000000..b8cda60
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/util/QuasiBundleUtilTests.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.virgo.shell.internal.util;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+import java.util.List;
+
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiBundle;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiFrameworkFactory;
+import org.eclipse.virgo.shell.internal.util.QuasiBundleUtil;
+import org.eclipse.virgo.shell.stubs.StubQuasiFrameworkFactory;
+import org.eclipse.virgo.test.stubs.framework.StubBundle;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Version;
+
+public class QuasiBundleUtilTests {
+
+
+    private QuasiBundleUtil quasiBundleUtil;
+
+    private QuasiFrameworkFactory stubQuasiFrameworkFactory;
+    
+    /**
+     * @throws java.lang.Exception
+     */
+    @Before
+    public void setUp() throws Exception {
+    	StubBundle stubBundle = new StubBundle(4l, "test.symbolic.name", new Version("1.2.3"), "location");
+        this.stubQuasiFrameworkFactory = new StubQuasiFrameworkFactory(stubBundle);
+        this.quasiBundleUtil = new QuasiBundleUtil(this.stubQuasiFrameworkFactory);
+    }
+
+    @Test
+    public void getAllBundlesNullDump() {
+        List<QuasiBundle> result = this.quasiBundleUtil.getAllBundles();
+        assertNotNull(result);
+        assertEquals(1, result.size());
+    }
+
+    @Test
+    public void getBundleNullDumpExists() {
+        QuasiBundle quasiBundle = this.quasiBundleUtil.getBundle(4);
+        assertNotNull(quasiBundle);
+        assertEquals("test.symbolic.name", quasiBundle.getSymbolicName());
+    }
+
+    @Test
+    public void getBundleNullDumpNoExists() {
+        QuasiBundle quasiBundle = this.quasiBundleUtil.getBundle(5);
+        assertNull(quasiBundle);
+    }
+    
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/util/QuasiServiceUtilTests.java b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/util/QuasiServiceUtilTests.java
new file mode 100644
index 0000000..79023ca
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/util/QuasiServiceUtilTests.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.virgo.shell.internal.util;
+
+import static org.junit.Assert.assertNotNull;
+
+import java.util.List;
+
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiFrameworkFactory;
+import org.eclipse.virgo.shell.internal.util.QuasiServiceUtil;
+import org.eclipse.virgo.shell.internal.util.ServiceHolder;
+import org.eclipse.virgo.shell.stubs.StubQuasiFrameworkFactory;
+import org.eclipse.virgo.test.stubs.framework.StubBundle;
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Version;
+
+/**
+ * <p>
+ * Tests for {@link StandardStateService}
+ * </p>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Tests
+ * 
+ */
+public class QuasiServiceUtilTests {
+
+    private QuasiServiceUtil quasiServiceUtil;
+
+    private StubBundleContext stubBundleContext;
+
+    private QuasiFrameworkFactory stubQuasiFrameworkFactory;
+
+    /**
+     * @throws java.lang.Exception
+     */
+    @Before
+    public void setUp() throws Exception {
+        this.stubBundleContext = new StubBundleContext();
+        
+        StubBundle stubSystemBundle = new StubBundle(0L, "stub.system.bundle", Version.emptyVersion, "stubLocation");
+        this.stubBundleContext.addInstalledBundle(stubSystemBundle);
+        
+        this.stubQuasiFrameworkFactory = new StubQuasiFrameworkFactory();
+        this.quasiServiceUtil = new QuasiServiceUtil(this.stubBundleContext, this.stubQuasiFrameworkFactory);
+    }
+
+    @Test
+    public void getAllServices() {
+        List<ServiceHolder> allServices = this.quasiServiceUtil.getAllServices();
+        assertNotNull(allServices);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/util/ServiceHolderTests.java b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/util/ServiceHolderTests.java
new file mode 100644
index 0000000..85a5854
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/internal/util/ServiceHolderTests.java
@@ -0,0 +1,109 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.internal.util;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiBundle;
+import org.eclipse.virgo.shell.internal.util.ServiceHolder;
+import org.eclipse.virgo.shell.stubs.StubQuasiFramework;
+import org.eclipse.virgo.test.stubs.framework.StubBundle;
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+import org.eclipse.virgo.test.stubs.framework.StubServiceReference;
+import org.eclipse.virgo.test.stubs.framework.StubServiceRegistration;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Constants;
+import org.osgi.framework.Version;
+
+/**
+ */
+public class ServiceHolderTests {
+
+    private ServiceHolder serviceHolder;
+
+    /**
+     * @throws java.lang.Exception
+     */
+    @Before
+    public void setUp() throws Exception {
+        StubServiceRegistration<Object> serviceRegistration = new StubServiceRegistration<Object>(new StubBundleContext());
+        Dictionary<String, Object> properties = new Hashtable<String, Object>();
+        properties.put(Constants.OBJECTCLASS, new String[] { "one", "two" });
+        properties.put("Random", "foo");
+        serviceRegistration.setProperties(properties);
+        StubServiceReference<Object> stubServiceReference = new StubServiceReference<Object>(38l, 6, serviceRegistration);
+        
+        StubBundle stubBundle = new StubBundle(4L, "test.symbolic.name", new Version("1.2.3"), "");
+        stubServiceReference.setBundle(stubBundle);
+        
+        stubServiceReference.addUsingBundles(new StubBundle(), new StubBundle());
+        StubQuasiFramework stubQuasiFramework = new StubQuasiFramework(stubBundle);
+        this.serviceHolder = new ServiceHolder(stubQuasiFramework, stubServiceReference);
+    }
+
+    /**
+     * Test method for {@link ServiceHolder#getServiceId()}.
+     */
+    @Test
+    public void testGetServiceId() {
+        assertEquals(38l, this.serviceHolder.getServiceId());
+    }
+
+    /**
+     * Test method for {@link ServiceHolder#getConsumers()}.
+     */
+    @Test
+    public void testGetConsumers() {
+        List<QuasiBundle> result = this.serviceHolder.getConsumers();
+        assertNotNull(result);
+        assertEquals(2, result.size());
+    }
+
+    /**
+     * Test method for {@link ServiceHolder#getProvider()}.
+     */
+    @Test
+    public void testGetProvider() {
+        assertEquals(4l, this.serviceHolder.getProvider().getBundleId());
+    }
+
+    /**
+     * Test method for {@link ServiceHolder#getProperties()}.
+     */
+    @Test
+    public void testGetProperties() {
+        Map<String, Object> propertyMap = this.serviceHolder.getProperties();
+        assertNotNull(propertyMap);
+        assertEquals(4, propertyMap.size());
+        assertNotNull(propertyMap.get(Constants.SERVICE_ID));
+        assertEquals("foo", propertyMap.get("Random"));
+    }
+
+    /**
+     * Test method for
+     * {@link ServiceHolder#compareTo(QuasiLiveService)}
+     * .
+     */
+    @Test
+    public void testCompareTo() {
+        int compareTo = this.serviceHolder.compareTo(this.serviceHolder);
+        assertEquals(0, compareTo);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/osgicommand/helper/ClassLoadingHelperTests.java b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/osgicommand/helper/ClassLoadingHelperTests.java
new file mode 100755
index 0000000..b076adb
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/osgicommand/helper/ClassLoadingHelperTests.java
@@ -0,0 +1,248 @@
+/*******************************************************************************

+ * Copyright (c) 2010 SAP AG

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ *

+ * Contributors:

+ *    Hristo Iliev, SAP AG - initial contribution

+ ******************************************************************************/

+package org.eclipse.virgo.shell.osgicommand.helper;

+

+import org.eclipse.osgi.service.resolver.BundleDescription;

+import org.eclipse.osgi.service.resolver.ExportPackageDescription;

+import org.eclipse.osgi.service.resolver.PlatformAdmin;

+import org.eclipse.osgi.service.resolver.State;

+import org.junit.Test;

+import org.osgi.framework.Bundle;

+import org.osgi.framework.BundleContext;

+import org.osgi.framework.ServiceReference;

+import org.osgi.service.packageadmin.PackageAdmin;

+

+import static org.easymock.EasyMock.*;

+import static org.junit.Assert.*;

+

+/**

+ * Class for unit testing {@link ClassLoadingHelper}

+ */

+@SuppressWarnings("deprecation")

+public class ClassLoadingHelperTests {

+

+    private static final long BUNDLE_ID = 1234;

+    private static final String BUNDLE_SYMBOLIC_NAME = "test";

+    private static final String CLASS_NAME = ClassLoadingHelperTests.class.getName();

+    private static final String CLASS_NAME_PATH = CLASS_NAME.replace(".", "/") + ".class";

+    private static final String CLASS_PACKAGE = ClassLoadingHelperTests.class.getPackage().getName();

+

+    @SuppressWarnings({"rawtypes", "unchecked"})

+    @Test

+    public void testIsMissingPackageExported() throws Exception {

+        PlatformAdmin platformAdmin = createMock(PlatformAdmin.class);

+        ServiceReference platformAdminServiceReference = createMock(ServiceReference.class);

+        Bundle bundle = createMock(Bundle.class);

+        BundleContext bundleContext = createMock(BundleContext.class);

+        State bundleState = createMock(State.class);

+        BundleDescription bundleDescription = createMock(BundleDescription.class);

+

+        expect(bundle.getBundleId()).andReturn(BUNDLE_ID);

+        expect(bundleContext.getServiceReference(PlatformAdmin.class)).andReturn(platformAdminServiceReference);

+        expect(bundleContext.getService(platformAdminServiceReference)).andReturn(platformAdmin);

+        expect(bundleDescription.getSelectedExports()).andReturn(new ExportPackageDescription[0]);

+        expect(platformAdmin.getState(false)).andReturn(bundleState);

+        expect(bundleState.getBundle(BUNDLE_ID)).andReturn(bundleDescription);

+

+        replay(platformAdmin, platformAdminServiceReference, bundle, bundleContext, bundleState, bundleDescription);

+

+        assertFalse("Class [" + CLASS_NAME + "] is reported as exported, while it is NOT",

+                    ClassLoadingHelper.isPackageExported(bundleContext, CLASS_NAME, bundle));

+

+        verify(platformAdmin, platformAdminServiceReference, bundle, bundleContext, bundleState, bundleDescription);

+    }

+

+    @SuppressWarnings({"rawtypes", "unchecked"})

+    @Test

+    public void testIsExistingPackageExported() throws Exception {

+        PlatformAdmin platformAdmin = createMock(PlatformAdmin.class);

+        ServiceReference platformAdminServiceReference = createMock(ServiceReference.class);

+        Bundle bundle = createMock(Bundle.class);

+        BundleContext bundleContext = createMock(BundleContext.class);

+        State bundleState = createMock(State.class);

+        BundleDescription bundleDescription = createMock(BundleDescription.class);

+        ExportPackageDescription exportPackageDescription = createMock(ExportPackageDescription.class);

+

+        expect(bundle.getBundleId()).andReturn(BUNDLE_ID);

+        expect(bundleContext.getServiceReference(PlatformAdmin.class)).andReturn(platformAdminServiceReference);

+        expect(bundleContext.getService(platformAdminServiceReference)).andReturn(platformAdmin);

+        expect(exportPackageDescription.getName()).andReturn(CLASS_PACKAGE);

+        expect(bundleDescription.getSelectedExports()).andReturn(new ExportPackageDescription[]{exportPackageDescription});

+        expect(platformAdmin.getState(false)).andReturn(bundleState);

+        expect(bundleState.getBundle(BUNDLE_ID)).andReturn(bundleDescription);

+

+        replay(platformAdmin, platformAdminServiceReference,

+               bundle, bundleContext, bundleState, bundleDescription,

+               exportPackageDescription);

+

+        assertTrue("Class [" + CLASS_NAME + "] is reported as NOT exported, while it is",

+                   ClassLoadingHelper.isPackageExported(bundleContext, CLASS_PACKAGE, bundle));

+

+        verify(platformAdmin, platformAdminServiceReference, bundle, bundleContext, bundleState, bundleDescription);

+    }

+

+    @Test

+    public void testTryToLoadMissingClass() throws Exception {

+        Bundle bundle = createMock(Bundle.class);

+

+        expect(bundle.loadClass(CLASS_NAME)).andReturn(null); // missing class

+

+        replay(bundle);

+

+        assertNull("Class [" + CLASS_NAME + "] found, while it is not existing",

+                   ClassLoadingHelper.tryToLoadClass(CLASS_NAME, bundle));

+

+        verify(bundle);

+    }

+

+    @Test

+    public void testTryToLoadMissingBundle() throws Exception {

+        assertNull("Class [" + CLASS_NAME + "] found, while no bundle is specified",

+                   ClassLoadingHelper.tryToLoadClass(CLASS_NAME, null));

+    }

+

+    @Test

+    public void testTryToLoadMissingClassWithException() throws Exception {

+        Bundle bundle = createMock(Bundle.class);

+

+        expect(bundle.loadClass(CLASS_NAME)).andThrow(new ClassNotFoundException("not found")); // missing class

+

+        replay(bundle);

+

+        assertNull("Class [" + CLASS_NAME + "] found, while it is not existing",

+                   ClassLoadingHelper.tryToLoadClass(CLASS_NAME, bundle));

+

+        verify(bundle);

+    }

+

+    @SuppressWarnings("rawtypes")

+    @Test

+    public void testTryToLoadExistingClass() throws Exception {

+        Bundle bundle = createMock(Bundle.class);

+

+        expect((Class) bundle.loadClass(CLASS_NAME)).andReturn(ClassLoadingHelperTests.class);

+

+        replay(bundle);

+

+        assertNotNull("Class [" + CLASS_NAME + "] not found",

+                      ClassLoadingHelper.tryToLoadClass(CLASS_NAME, bundle));

+

+        verify(bundle);

+    }

+

+    @Test

+    public void testGetBundlesLoadingMissingClass() throws Exception {

+        Bundle bundle = createMock(Bundle.class);

+        BundleContext bundleContext = createMock(BundleContext.class);

+

+        expect(bundle.loadClass(CLASS_NAME)).andReturn(null); // missing class

+        expect(bundleContext.getBundles()).andReturn(new Bundle[]{bundle});

+

+        replay(bundle, bundleContext);

+

+        assertTrue("The bundle [" + BUNDLE_SYMBOLIC_NAME + "] should NOT be able to load class [" + CLASS_NAME + "]",

+                   ClassLoadingHelper.getBundlesLoadingClass(bundleContext, CLASS_NAME).size() == 0);

+

+        verify(bundle, bundleContext);

+    }

+

+    @SuppressWarnings("rawtypes")

+    @Test

+    public void testGetBundlesLoadingExistingClass() throws Exception {

+        Bundle bundle = createMock(Bundle.class);

+        BundleContext bundleContext = createMock(BundleContext.class);

+

+        expect((Class) bundle.loadClass(CLASS_NAME)).andReturn(ClassLoadingHelperTests.class);

+        expect(bundleContext.getBundles()).andReturn(new Bundle[]{bundle});

+        expect(bundleContext.getBundle(0)).andReturn(bundle);

+

+        replay(bundle, bundleContext);

+

+        assertFalse("The bundle [" + BUNDLE_SYMBOLIC_NAME + "] should be able to load class [" + CLASS_NAME + "]",

+                    ClassLoadingHelper.getBundlesLoadingClass(bundleContext, CLASS_NAME).size() == 0);

+

+        verify(bundle, bundleContext);

+    }

+

+    @SuppressWarnings({"rawtypes", "unchecked"})

+    @Test

+    public void testGetBundleLoadingMissingClass() throws Exception {

+        Bundle bundle = createMock(Bundle.class);

+        BundleContext bundleContext = createMock(BundleContext.class);

+        PackageAdmin packageAdmin = createMock(PackageAdmin.class);

+        ServiceReference packageAdminServiceReference = createMock(ServiceReference.class);

+

+        expect(bundle.loadClass(CLASS_NAME)).andReturn(null); // missing class

+        expect(bundleContext.getServiceReference(PackageAdmin.class)).andReturn(packageAdminServiceReference);

+        expect(bundleContext.getService(packageAdminServiceReference)).andReturn(packageAdmin);

+        expect(packageAdmin.getBundles(BUNDLE_SYMBOLIC_NAME, null)).andReturn(new Bundle[]{bundle});

+

+        replay(bundle, bundleContext, packageAdmin, packageAdminServiceReference);

+

+        assertTrue("No bundle should be able to load class [" + CLASS_NAME + "]",

+                   ClassLoadingHelper.getBundlesLoadingClass(bundleContext, CLASS_NAME, BUNDLE_SYMBOLIC_NAME).size() == 0);

+

+        verify(bundle, bundleContext, packageAdmin, packageAdminServiceReference);

+    }

+

+    @SuppressWarnings({"rawtypes", "unchecked"})

+    @Test

+    public void testGetBundleByNameLoadingExistingClass() throws Exception {

+        Bundle bundle = createMock(Bundle.class);

+        BundleContext bundleContext = createMock(BundleContext.class);

+        PackageAdmin packageAdmin = createMock(PackageAdmin.class);

+        ServiceReference packageAdminServiceReference = createMock(ServiceReference.class);

+

+        expect((Class) bundle.loadClass(CLASS_NAME)).andReturn(ClassLoadingHelperTests.class);

+        expect(bundleContext.getBundle(0)).andReturn(bundle);

+        expect(bundleContext.getServiceReference(PackageAdmin.class)).andReturn(packageAdminServiceReference);

+        expect(bundleContext.getService(packageAdminServiceReference)).andReturn(packageAdmin);

+        expect(packageAdmin.getBundles(BUNDLE_SYMBOLIC_NAME, null)).andReturn(new Bundle[]{bundle});

+

+        replay(bundle, bundleContext, packageAdmin, packageAdminServiceReference);

+

+        assertTrue("The class [" + CLASS_NAME + "] should be successfully loaded",

+                   ClassLoadingHelper.getBundlesLoadingClass(bundleContext, CLASS_NAME, BUNDLE_SYMBOLIC_NAME).size() != 0);

+

+        verify(bundle, bundleContext, packageAdmin, packageAdminServiceReference);

+    }

+

+    @SuppressWarnings("rawtypes")

+    @Test

+    public void testGetBundleByIdLoadingExistingClass() throws Exception {

+        Bundle bundle = createMock(Bundle.class);

+        BundleContext bundleContext = createMock(BundleContext.class);

+

+        expect((Class) bundle.loadClass(CLASS_NAME)).andReturn(ClassLoadingHelperTests.class);

+        expect(bundleContext.getBundle(BUNDLE_ID)).andReturn(bundle);

+        expect(bundleContext.getBundle(0)).andReturn(bundle);

+

+        replay(bundle, bundleContext);

+

+        assertTrue("The class [" + CLASS_NAME + "] should be successfully loaded",

+                   ClassLoadingHelper.getBundlesLoadingClass(bundleContext, CLASS_NAME, "" + BUNDLE_ID).size() != 0);

+

+        verify(bundle, bundleContext);

+    }

+

+    @Test

+    public void testConvertToClassName() throws Exception {

+        assertEquals("Path to resource [" + CLASS_NAME_PATH + "] not converted properly", CLASS_NAME, ClassLoadingHelper.convertToClassName(CLASS_NAME_PATH));

+        assertEquals("Path to resource [" + CLASS_NAME + "] not converted properly", CLASS_NAME, ClassLoadingHelper.convertToClassName(CLASS_NAME));

+    }

+

+    @Test

+    public void testConvertToResourcePath() throws Exception {

+        assertEquals("Class name [" + CLASS_NAME + "] not converted properly", CLASS_NAME_PATH, ClassLoadingHelper.convertToResourcePath(CLASS_NAME));

+        assertEquals("Class name [" + CLASS_NAME_PATH + "] not converted properly", CLASS_NAME_PATH, ClassLoadingHelper.convertToResourcePath(CLASS_NAME_PATH));

+    }

+

+}

diff --git a/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/osgicommand/internal/GogoClassLoadingCommandTests.java b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/osgicommand/internal/GogoClassLoadingCommandTests.java
new file mode 100755
index 0000000..fec7c2b
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/osgicommand/internal/GogoClassLoadingCommandTests.java
@@ -0,0 +1,376 @@
+/*******************************************************************************

+ * Copyright (c) 2010 SAP AG

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ *

+ * Contributors:

+ *    Hristo Iliev, SAP AG - initial contribution

+ ******************************************************************************/

+

+package org.eclipse.virgo.shell.osgicommand.internal;

+

+import static java.nio.charset.StandardCharsets.UTF_8;

+import static org.easymock.EasyMock.createMock;

+import static org.easymock.EasyMock.expect;

+import static org.easymock.EasyMock.replay;

+import static org.easymock.EasyMock.verify;

+import static org.junit.Assert.assertFalse;

+import static org.junit.Assert.assertTrue;

+

+import java.io.ByteArrayOutputStream;

+import java.io.PrintStream;

+import java.io.UnsupportedEncodingException;

+import java.net.URL;

+import java.util.Enumeration;

+

+import org.eclipse.osgi.service.resolver.BundleDescription;

+import org.eclipse.osgi.service.resolver.ExportPackageDescription;

+import org.eclipse.osgi.service.resolver.PlatformAdmin;

+import org.eclipse.osgi.service.resolver.State;

+import org.junit.After;

+import org.junit.Before;

+import org.junit.Test;

+import org.osgi.framework.Bundle;

+import org.osgi.framework.BundleContext;

+import org.osgi.framework.ServiceReference;

+import org.osgi.service.packageadmin.PackageAdmin;

+

+/**

+ * Unit tests for class loading commands

+ */

+@SuppressWarnings("deprecation")

+public class GogoClassLoadingCommandTests {

+

+    private static final long BUNDLE_ID = 1234;

+

+    private static final String BUNDLE_SYMBOLIC_NAME = "test";

+

+    private static final String CLASS_NAME = GogoClassLoadingCommandTests.class.getName();

+

+    private static final String CLASS_PACKAGE = GogoClassLoadingCommandTests.class.getPackage().getName();

+

+    private static final String SHORT_CLASS_NAME = CLASS_NAME.substring(CLASS_NAME.lastIndexOf(".") + 1) + ".class";

+

+    private static final String CLASS_NAME_PATH = CLASS_NAME.replace(".", "/") + ".class";

+

+    private static final String CLASS_PACKAGE_PATH = CLASS_PACKAGE.replace(".", "/");

+

+    private ByteArrayOutputStream baos;

+

+    private PrintStream oldOut;

+

+    private PrintStream output;

+

+    @Before

+    public void before() throws UnsupportedEncodingException {

+        this.oldOut = System.out;

+        this.baos = new ByteArrayOutputStream();

+        this.output = new PrintStream(baos, true, UTF_8.name());

+        System.setOut(this.output);

+    }

+

+    private String getOutput() {

+        this.output.flush();

+        String output = new String(baos.toByteArray(), UTF_8);

+        return output;

+    }

+

+    @After

+    public void after() {

+        System.setOut(this.oldOut);

+    }

+

+    @Test

+    public void testClHasWithExistingClass() throws Exception {

+        Bundle bundle = createMock(Bundle.class);

+        BundleContext bundleContext = createMock(BundleContext.class);

+        Enumeration<URL> urlEnum = this.getClass().getClassLoader().getResources(CLASS_NAME_PATH);

+

+        expect(bundle.findEntries("/", SHORT_CLASS_NAME, true)).andReturn(urlEnum);

+        expect(bundle.findEntries("/", CLASS_NAME_PATH, true)).andReturn(null); // class not found in root

+        expect(bundle.getBundleId()).andReturn(BUNDLE_ID);

+        expect(bundle.getSymbolicName()).andReturn(BUNDLE_SYMBOLIC_NAME);

+        expect(bundleContext.getBundles()).andReturn(new Bundle[] { bundle });

+

+        replay(bundle, bundleContext);

+

+        GogoClassLoadingCommand command = new GogoClassLoadingCommand(bundleContext);

+        command.clhas(CLASS_NAME);

+        String output = getOutput();

+

+        assertTrue("Command output [" + output + "] does not contain class name [" + CLASS_NAME + "]", output.contains("" + CLASS_NAME_PATH));

+        assertTrue("Command output [" + output + "] does not contain class package [" + CLASS_PACKAGE_PATH + "]",

+            output.contains("" + CLASS_PACKAGE_PATH));

+        assertTrue("Command output [" + output + "] does not contain bundle ID [" + BUNDLE_ID + "]", output.contains("" + BUNDLE_ID));

+        assertTrue("Command output [" + output + "] does not contain bundle symbolic name [" + BUNDLE_SYMBOLIC_NAME + "]",

+            output.contains(BUNDLE_SYMBOLIC_NAME));

+

+        verify(bundle, bundleContext);

+

+    }

+

+    @Test

+    public void testClHasWithNonExistingClass() throws Exception {

+        Bundle bundle = createMock(Bundle.class);

+        BundleContext bundleContext = createMock(BundleContext.class);

+

+        expect(bundle.findEntries("/", SHORT_CLASS_NAME, true)).andReturn(null); // class does not exist

+        expect(bundle.findEntries("/", CLASS_NAME_PATH, true)).andReturn(null); // class does not exist

+        expect(bundleContext.getBundles()).andReturn(new Bundle[] { bundle });

+

+        replay(bundle, bundleContext);

+

+        GogoClassLoadingCommand command = new GogoClassLoadingCommand(bundleContext);

+        command.clhas(CLASS_NAME);

+        String output = getOutput();

+

+        assertTrue("Command output [" + output + "] does not contain class name [" + CLASS_NAME + "]", output.contains("" + CLASS_NAME_PATH));

+        assertTrue("Command output [" + output + "] does not contain class package [" + CLASS_PACKAGE + "]", output.contains("" + CLASS_PACKAGE_PATH));

+        assertFalse("Command output [" + output + "] contains bundle ID [" + BUNDLE_ID + "]", output.contains("" + BUNDLE_ID));

+        assertFalse("Command output [" + output + "] contains bundle symbolic name [" + BUNDLE_SYMBOLIC_NAME + "]",

+            output.contains(BUNDLE_SYMBOLIC_NAME));

+

+        verify(bundle, bundleContext);

+    }

+

+    @SuppressWarnings("rawtypes")

+    @Test

+    public void testClLoadWithExistingClass() throws Exception {

+        Bundle bundle = createMock(Bundle.class);

+        BundleContext bundleContext = createMock(BundleContext.class);

+

+        expect((Class) bundle.loadClass(CLASS_NAME)).andReturn(GogoClassLoadingCommandTests.class);

+        expect(bundle.getBundleId()).andReturn(BUNDLE_ID);

+        expect(bundle.getSymbolicName()).andReturn(BUNDLE_SYMBOLIC_NAME);

+        expect(bundleContext.getBundles()).andReturn(new Bundle[] { bundle });

+        expect(bundleContext.getBundle(0)).andReturn(bundle); // system bundle is also our mockup

+

+        replay(bundle, bundleContext);

+

+        GogoClassLoadingCommand command = new GogoClassLoadingCommand(bundleContext);

+        command.clload(CLASS_NAME);

+        String output = getOutput();

+

+        assertTrue("Command output [" + output + "] does not contain class name [" + CLASS_NAME + "]", output.contains("" + CLASS_NAME));

+        assertTrue("Command output [" + output + "] does not contain class package [" + CLASS_PACKAGE + "]", output.contains("" + CLASS_PACKAGE));

+        assertTrue("Command output [" + output + "] does not contain bundle ID [" + BUNDLE_ID + "]", output.contains("" + BUNDLE_ID));

+        assertTrue("Command output [" + output + "] does not contain bundle symbolic name [" + BUNDLE_SYMBOLIC_NAME + "]",

+            output.contains(BUNDLE_SYMBOLIC_NAME));

+

+        verify(bundle, bundleContext);

+    }

+

+    @Test

+    public void testClLoadWithNonExistingClass() throws Exception {

+        Bundle bundle = createMock(Bundle.class);

+        BundleContext bundleContext = createMock(BundleContext.class);

+

+        expect(bundle.loadClass(CLASS_NAME)).andReturn(null);

+        expect(bundleContext.getBundles()).andReturn(new Bundle[] { bundle });

+

+        replay(bundle, bundleContext);

+

+        GogoClassLoadingCommand command = new GogoClassLoadingCommand(bundleContext);

+        command.clload(CLASS_NAME);

+        String output = getOutput();

+

+        assertTrue("Command output [" + output + "] does not contain class name [" + CLASS_NAME + "]", output.contains("" + CLASS_NAME));

+        assertTrue("Command output [" + output + "] does not contain class package [" + CLASS_PACKAGE + "]", output.contains("" + CLASS_PACKAGE));

+        assertFalse("Command output [" + output + "] contains bundle ID [" + BUNDLE_ID + "]", output.contains("" + BUNDLE_ID));

+        assertFalse("Command output [" + output + "] contains bundle symbolic name [" + BUNDLE_SYMBOLIC_NAME + "]",

+            output.contains(BUNDLE_SYMBOLIC_NAME));

+

+        verify(bundle, bundleContext);

+    }

+

+    @SuppressWarnings({ "rawtypes", "unchecked" })

+    @Test

+    public void testClLoadWithBundleNameAndExistingClass() throws Exception {

+        Bundle bundle = createMock(Bundle.class);

+        BundleContext bundleContext = createMock(BundleContext.class);

+        PackageAdmin packageAdmin = createMock(PackageAdmin.class);

+        ServiceReference packageAdminServiceReference = createMock(ServiceReference.class);

+

+        expect((Class) bundle.loadClass(CLASS_NAME)).andReturn(GogoClassLoadingCommandTests.class);

+        expect(bundle.getBundleId()).andReturn(BUNDLE_ID);

+        expect(bundle.getSymbolicName()).andReturn(BUNDLE_SYMBOLIC_NAME);

+        expect(bundleContext.getBundle(0)).andReturn(bundle); // system bundle is also our mockup

+        expect(bundleContext.getServiceReference(PackageAdmin.class)).andReturn(packageAdminServiceReference);

+        expect(bundleContext.getService(packageAdminServiceReference)).andReturn(packageAdmin);

+        expect(packageAdmin.getBundles(BUNDLE_SYMBOLIC_NAME, null)).andReturn(new Bundle[] { bundle });

+

+        replay(bundle, bundleContext, packageAdmin, packageAdminServiceReference);

+

+        GogoClassLoadingCommand command = new GogoClassLoadingCommand(bundleContext);

+        command.clload(CLASS_NAME, BUNDLE_SYMBOLIC_NAME);

+        String output = getOutput();

+

+        assertTrue("Command output [" + output + "] does not contain class name [" + CLASS_NAME + "]", output.contains("" + CLASS_NAME));

+        assertTrue("Command output [" + output + "] does not contain class package [" + CLASS_PACKAGE + "]", output.contains("" + CLASS_PACKAGE));

+        assertTrue("Command output [" + output + "] does not contain bundle ID [" + BUNDLE_ID + "]", output.contains("" + BUNDLE_ID));

+        assertTrue("Command output [" + output + "] does not contain bundle symbolic name [" + BUNDLE_SYMBOLIC_NAME + "]",

+            output.contains(BUNDLE_SYMBOLIC_NAME));

+

+        verify(bundle, bundleContext, packageAdmin, packageAdminServiceReference);

+    }

+

+    @SuppressWarnings("rawtypes")

+    @Test

+    public void testClLoadWithBundleIdAndExistingClass() throws Exception {

+        Bundle bundle = createMock(Bundle.class);

+        BundleContext bundleContext = createMock(BundleContext.class);

+

+        expect((Class) bundle.loadClass(CLASS_NAME)).andReturn(GogoClassLoadingCommandTests.class);

+        expect(bundle.getBundleId()).andReturn(BUNDLE_ID);

+        expect(bundle.getSymbolicName()).andReturn(BUNDLE_SYMBOLIC_NAME);

+        expect(bundleContext.getBundle(0)).andReturn(bundle); // system bundle is also our mockup

+        expect(bundleContext.getBundle(BUNDLE_ID)).andReturn(bundle);

+

+        replay(bundle, bundleContext);

+

+        GogoClassLoadingCommand command = new GogoClassLoadingCommand(bundleContext);

+        command.clload(CLASS_NAME, BUNDLE_ID);

+        String output = getOutput();

+

+        assertTrue("Command output [" + output + "] does not contain class name [" + CLASS_NAME + "]", output.contains("" + CLASS_NAME));

+        assertTrue("Command output [" + output + "] does not contain class package [" + CLASS_PACKAGE + "]", output.contains("" + CLASS_PACKAGE));

+        assertTrue("Command output [" + output + "] does not contain bundle ID [" + BUNDLE_ID + "]", output.contains("" + BUNDLE_ID));

+        assertTrue("Command output [" + output + "] does not contain bundle symbolic name [" + BUNDLE_SYMBOLIC_NAME + "]",

+            output.contains(BUNDLE_SYMBOLIC_NAME));

+

+        verify(bundle, bundleContext);

+    }

+

+    @Test

+    public void testClLoadWithBundleIdAndMissingClass() throws Exception {

+        Bundle bundle = createMock(Bundle.class);

+        BundleContext bundleContext = createMock(BundleContext.class);

+

+        expect(bundle.loadClass(CLASS_NAME)).andReturn(null);

+        expect(bundleContext.getBundle(BUNDLE_ID)).andReturn(bundle);

+

+        replay(bundle, bundleContext);

+

+        GogoClassLoadingCommand command = new GogoClassLoadingCommand(bundleContext);

+        command.clload(CLASS_NAME, BUNDLE_ID);

+        String output = getOutput();

+

+        assertTrue("Command output [" + output + "] does not contain class name [" + CLASS_NAME + "]", output.contains("" + CLASS_NAME));

+        assertTrue("Command output [" + output + "] does not contain class package [" + CLASS_PACKAGE + "]", output.contains("" + CLASS_PACKAGE));

+        assertTrue("Command output [" + output + "] does not contain bundle ID [" + BUNDLE_ID + "]", output.contains("" + BUNDLE_ID));

+        assertFalse("Command output [" + output + "] contains bundle symbolic name [" + BUNDLE_SYMBOLIC_NAME + "]",

+            output.contains(BUNDLE_SYMBOLIC_NAME));

+

+        verify(bundle, bundleContext);

+    }

+

+    @SuppressWarnings({ "rawtypes", "unchecked" })

+    @Test

+    public void testClExportWithMissingPackage() throws Exception {

+        PlatformAdmin platformAdmin = createMock(PlatformAdmin.class);

+        ServiceReference platformAdminServiceReference = createMock(ServiceReference.class);

+        Bundle bundle = createMock(Bundle.class);

+        BundleContext bundleContext = createMock(BundleContext.class);

+        State bundleState = createMock(State.class);

+        BundleDescription bundleDescription = createMock(BundleDescription.class);

+

+        expect(bundle.getBundleId()).andReturn(BUNDLE_ID);

+        expect(bundleContext.getServiceReference(PlatformAdmin.class)).andReturn(platformAdminServiceReference);

+        expect(bundleContext.getService(platformAdminServiceReference)).andReturn(platformAdmin);

+        expect(bundleContext.getBundles()).andReturn(new Bundle[] { bundle });

+        expect(bundleDescription.getSelectedExports()).andReturn(new ExportPackageDescription[] {}); // nothing exported

+        expect(platformAdmin.getState(false)).andReturn(bundleState);

+        expect(bundleState.getBundle(BUNDLE_ID)).andReturn(bundleDescription);

+

+        replay(platformAdmin, platformAdminServiceReference, bundle, bundleContext, bundleState, bundleDescription);

+

+        GogoClassLoadingCommand command = new GogoClassLoadingCommand(bundleContext);

+        command.clexport(CLASS_NAME);

+        String output = getOutput();

+

+        assertTrue("Command output [" + output + "] does not contain class name [" + CLASS_NAME + "]", output.contains("" + CLASS_NAME));

+        assertTrue("Command output [" + output + "] does not contain class package [" + CLASS_PACKAGE + "]", output.contains("" + CLASS_PACKAGE));

+        assertFalse("Command output [" + output + "] contains bundle ID [" + BUNDLE_ID + "]", output.contains("" + BUNDLE_ID));

+        assertFalse("Command output [" + output + "] contains bundle symbolic name [" + BUNDLE_SYMBOLIC_NAME + "]",

+            output.contains(BUNDLE_SYMBOLIC_NAME));

+

+        verify(platformAdmin, platformAdminServiceReference, bundle, bundleContext, bundleState, bundleDescription);

+    }

+

+    @SuppressWarnings({ "rawtypes", "unchecked" })

+    @Test

+    public void testClExportWithExportedPackage() throws Exception {

+        PlatformAdmin platformAdmin = createMock(PlatformAdmin.class);

+        ServiceReference platformAdminServiceReference = createMock(ServiceReference.class);

+        Bundle bundle = createMock(Bundle.class);

+        BundleContext bundleContext = createMock(BundleContext.class);

+        State bundleState = createMock(State.class);

+        BundleDescription bundleDescription = createMock(BundleDescription.class);

+        ExportPackageDescription exportPackageDescription = createMock(ExportPackageDescription.class);

+

+        expect(bundle.getBundleId()).andReturn(BUNDLE_ID).times(2);

+        expect(bundle.getSymbolicName()).andReturn(BUNDLE_SYMBOLIC_NAME);

+        expect((Class) bundle.loadClass(CLASS_NAME)).andReturn(GogoClassLoadingCommandTests.class);

+        expect(bundleContext.getServiceReference(PlatformAdmin.class)).andReturn(platformAdminServiceReference);

+        expect(bundleContext.getService(platformAdminServiceReference)).andReturn(platformAdmin);

+        expect(bundleContext.getBundles()).andReturn(new Bundle[] { bundle });

+        expect(exportPackageDescription.getName()).andReturn(CLASS_PACKAGE);

+        expect(bundleDescription.getSelectedExports()).andReturn(new ExportPackageDescription[] { exportPackageDescription });

+        expect(platformAdmin.getState(false)).andReturn(bundleState);

+        expect(bundleState.getBundle(BUNDLE_ID)).andReturn(bundleDescription);

+

+        replay(platformAdmin, platformAdminServiceReference, bundle, bundleContext, bundleState, bundleDescription, exportPackageDescription);

+

+        GogoClassLoadingCommand command = new GogoClassLoadingCommand(bundleContext);

+        command.clexport(CLASS_NAME);

+        String output = getOutput();

+

+        assertTrue("Command output [" + output + "] does not contain class name [" + CLASS_NAME + "]", output.contains("" + CLASS_NAME));

+        assertTrue("Command output [" + output + "] does not contain class package [" + CLASS_PACKAGE + "]", output.contains("" + CLASS_PACKAGE));

+        assertTrue("Command output [" + output + "] does not contain bundle ID [" + BUNDLE_ID + "]", output.contains("" + BUNDLE_ID));

+        assertTrue("Command output [" + output + "] does not contain bundle symbolic name [" + BUNDLE_SYMBOLIC_NAME + "]",

+            output.contains(BUNDLE_SYMBOLIC_NAME));

+

+        verify(platformAdmin, platformAdminServiceReference, bundle, bundleContext, bundleState, bundleDescription, exportPackageDescription);

+    }

+

+    @SuppressWarnings({ "rawtypes", "unchecked" })

+    @Test

+    public void testClExportWithExportedPackageMissingClass() throws Exception {

+        PlatformAdmin platformAdmin = createMock(PlatformAdmin.class);

+        ServiceReference platformAdminServiceReference = createMock(ServiceReference.class);

+        Bundle bundle = createMock(Bundle.class);

+        BundleContext bundleContext = createMock(BundleContext.class);

+        State bundleState = createMock(State.class);

+        BundleDescription bundleDescription = createMock(BundleDescription.class);

+        ExportPackageDescription exportPackageDescription = createMock(ExportPackageDescription.class);

+

+        expect(bundle.getBundleId()).andReturn(BUNDLE_ID).times(2);

+        expect(bundle.getSymbolicName()).andReturn(BUNDLE_SYMBOLIC_NAME);

+        expect(bundle.loadClass(CLASS_NAME)).andReturn(null); // class cannot be loaded

+        expect(bundleContext.getServiceReference(PlatformAdmin.class)).andReturn(platformAdminServiceReference);

+        expect(bundleContext.getService(platformAdminServiceReference)).andReturn(platformAdmin);

+        expect(bundleContext.getBundles()).andReturn(new Bundle[] { bundle });

+        expect(exportPackageDescription.getName()).andReturn(CLASS_PACKAGE);

+        expect(bundleDescription.getSelectedExports()).andReturn(new ExportPackageDescription[] { exportPackageDescription });

+        expect(platformAdmin.getState(false)).andReturn(bundleState);

+        expect(bundleState.getBundle(BUNDLE_ID)).andReturn(bundleDescription);

+

+        replay(platformAdmin, platformAdminServiceReference, bundle, bundleContext, bundleState, bundleDescription, exportPackageDescription);

+

+        GogoClassLoadingCommand command = new GogoClassLoadingCommand(bundleContext);

+        command.clexport(CLASS_NAME);

+        String output = getOutput();

+

+        assertTrue("Command output [" + output + "] does not contain class name [" + CLASS_NAME + "]", output.contains("" + CLASS_NAME));

+        assertTrue("Command output [" + output + "] does not contain class package [" + CLASS_PACKAGE + "]", output.contains("" + CLASS_PACKAGE));

+        assertTrue("Command output [" + output + "] does not contain bundle ID [" + BUNDLE_ID + "]", output.contains("" + BUNDLE_ID));

+        assertTrue("Command output [" + output + "] does not contain bundle symbolic name [" + BUNDLE_SYMBOLIC_NAME + "]",

+            output.contains(BUNDLE_SYMBOLIC_NAME));

+

+        verify(platformAdmin, platformAdminServiceReference, bundle, bundleContext, bundleState, bundleDescription, exportPackageDescription);

+    }

+

+}

diff --git a/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/osgicommand/management/ClassLoadingSupportTests.java b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/osgicommand/management/ClassLoadingSupportTests.java
new file mode 100755
index 0000000..2898f4a
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/osgicommand/management/ClassLoadingSupportTests.java
@@ -0,0 +1,159 @@
+/*******************************************************************************

+ * Copyright (c) 2011 SAP AG

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ *

+ * Contributors:

+ *    Hristo Iliev, SAP AG - initial contribution

+ ******************************************************************************/

+

+package org.eclipse.virgo.shell.osgicommand.management;

+

+import org.eclipse.osgi.service.resolver.BundleDescription;

+import org.eclipse.osgi.service.resolver.ExportPackageDescription;

+import org.eclipse.osgi.service.resolver.PlatformAdmin;

+import org.eclipse.osgi.service.resolver.State;

+import org.eclipse.virgo.shell.osgicommand.helper.ClassLoadingHelperTests;

+import org.junit.Test;

+import org.osgi.framework.Bundle;

+import org.osgi.framework.BundleContext;

+import org.osgi.framework.ServiceReference;

+

+import java.net.URL;

+import java.util.*;

+

+import static org.easymock.EasyMock.*;

+import static org.junit.Assert.*;

+

+/**

+ * Tests for {@link ClassLoadingSupport}

+ *

+ */

+public class ClassLoadingSupportTests {

+

+    private static final long BUNDLE_ID = 1234;

+    private static final String BUNDLE_SYMBOLIC_NAME = "test";

+

+    private static final String CLASS_NAME = ClassLoadingSupportTests.class.getName();

+    private static final String CLASS_PACKAGE = ClassLoadingSupportTests.class.getPackage().getName();

+

+    private static final String SHORT_CLASS_NAME = CLASS_NAME.substring(CLASS_NAME.lastIndexOf(".") + 1) + ".class";

+    private static final String CLASS_NAME_PATH = CLASS_NAME.replace(".", "/") + ".class";

+

+    private static final Map<List<String>, List<String>> RESULT_ORIGIN_LOAD_MAP = new HashMap<List<String>, List<String>>(2);

+    private static final List<List<String>> RESULT_EXPORT_ARRAY = new ArrayList<List<String>>(1);

+

+    static {

+        List<String> loadingBundle = new ArrayList<String>();

+        loadingBundle.add("" + BUNDLE_ID);

+        loadingBundle.add(BUNDLE_SYMBOLIC_NAME);

+

+        List<String> originBundle = new ArrayList<String>();

+        originBundle.add("" + BUNDLE_ID);

+        originBundle.add(BUNDLE_SYMBOLIC_NAME);

+

+        RESULT_ORIGIN_LOAD_MAP.put(loadingBundle, originBundle);

+        RESULT_EXPORT_ARRAY.add(loadingBundle);

+    }

+

+    @Test

+    public void testGetBundlesContainingResource() throws Exception {

+        Bundle bundle = createMock(Bundle.class);

+        BundleContext bundleContext = createMock(BundleContext.class);

+        Enumeration<URL> urlEnum = this.getClass().getClassLoader().getResources(CLASS_NAME_PATH);

+

+        expect(bundle.findEntries("/", SHORT_CLASS_NAME, true)).andReturn(urlEnum);

+        expect(bundle.findEntries("/", CLASS_NAME_PATH, true)).andReturn(null); // not found in the root

+        expect(bundle.getBundleId()).andReturn(BUNDLE_ID);

+        expect(bundle.getSymbolicName()).andReturn(BUNDLE_SYMBOLIC_NAME);

+        expect(bundleContext.getBundles()).andReturn(new Bundle[]{bundle});

+

+        replay(bundle, bundleContext);

+

+        ClassLoadingSupport support = new ClassLoadingSupport(bundleContext);

+

+        Map<List<String>, List<String>> map = support.getBundlesContainingResource(CLASS_NAME_PATH);

+        assertEquals("More than one test URL found in the result " + map, 1, map.size());

+        assertTrue("Test URL not found in the result: " + map, map.toString().contains(CLASS_NAME_PATH));

+

+        verify(bundle, bundleContext);

+    }

+

+    @SuppressWarnings("rawtypes")

+    @Test

+    public void testGetBundlesLoadingClass() throws Exception {

+        Bundle bundle = createMock(Bundle.class);

+        BundleContext bundleContext = createMock(BundleContext.class);

+

+        expect((Class) bundle.loadClass(CLASS_NAME)).andReturn(ClassLoadingHelperTests.class);

+        expect(bundle.getBundleId()).andReturn(BUNDLE_ID).times(2);

+        expect(bundle.getSymbolicName()).andReturn(BUNDLE_SYMBOLIC_NAME).times(2);

+        expect(bundleContext.getBundles()).andReturn(new Bundle[]{bundle});

+        expect(bundleContext.getBundle(0)).andReturn(bundle);

+

+        replay(bundle, bundleContext);

+

+        ClassLoadingSupport support = new ClassLoadingSupport(bundleContext);

+

+        Map<List<String>, List<String>> map = support.getBundlesLoadingClass(CLASS_NAME);

+        assertEquals("Unexpected result length for map " + map, RESULT_ORIGIN_LOAD_MAP.size(), map.size());

+        assertEquals("Unexpected result array: " + map, RESULT_ORIGIN_LOAD_MAP, map);

+

+        verify(bundle, bundleContext);

+    }

+

+    @Test

+    public void testGetBundlesExportingPackage() throws Exception {

+        PlatformAdmin platformAdmin = createMock(PlatformAdmin.class);

+        @SuppressWarnings("unchecked")

+        ServiceReference<PlatformAdmin> platformAdminServiceReference = createMock(ServiceReference.class);

+        Bundle bundle = createMock(Bundle.class);

+        BundleContext bundleContext = createMock(BundleContext.class);

+        State bundleState = createMock(State.class);

+        BundleDescription bundleDescription = createMock(BundleDescription.class);

+        ExportPackageDescription exportPackageDescription = createMock(ExportPackageDescription.class);

+

+        expect(bundle.getBundleId()).andReturn(BUNDLE_ID).times(2);

+        expect(bundle.getSymbolicName()).andReturn(BUNDLE_SYMBOLIC_NAME);

+        expect(bundleContext.getServiceReference(PlatformAdmin.class)).andReturn(platformAdminServiceReference);

+        expect(bundleContext.getService(platformAdminServiceReference)).andReturn(platformAdmin);

+        expect(bundleContext.getBundles()).andReturn(new Bundle[]{bundle});

+        expect(exportPackageDescription.getName()).andReturn(CLASS_PACKAGE);

+        expect(bundleDescription.getSelectedExports()).andReturn(new ExportPackageDescription[]{exportPackageDescription});

+        expect(platformAdmin.getState(false)).andReturn(bundleState);

+        expect(bundleState.getBundle(BUNDLE_ID)).andReturn(bundleDescription);

+

+        replay(platformAdmin, platformAdminServiceReference,

+               bundle, bundleContext, bundleState, bundleDescription,

+               exportPackageDescription);

+

+        ClassLoadingSupport support = new ClassLoadingSupport(bundleContext);

+

+        List<List<String>> list = support.getBundlesExportingPackage(CLASS_PACKAGE);

+        assertEquals("Unexpected result length for list " + list, RESULT_EXPORT_ARRAY.size(), list.size());

+        assertEquals("Unexpected result list " + list, RESULT_EXPORT_ARRAY, list);

+

+        verify(platformAdmin, platformAdminServiceReference, bundle, bundleContext, bundleState, bundleDescription);

+    }

+

+    @SuppressWarnings("rawtypes")

+    @Test

+    public void testTryToLoadClassFromBundle() throws Exception {

+        Bundle bundle = createMock(Bundle.class);

+        expect((Class) bundle.loadClass(CLASS_NAME)).andReturn(ClassLoadingHelperTests.class);

+        expect((Class<?>) bundle.loadClass(CLASS_NAME + CLASS_NAME)).andReturn(null);

+        BundleContext bundleContext = createMock(BundleContext.class);

+        expect(bundleContext.getBundle(BUNDLE_ID)).andReturn(bundle).times(2);

+

+        replay(bundle, bundleContext);

+

+        ClassLoadingSupport support = new ClassLoadingSupport(bundleContext);

+

+        assertTrue("Class [" + CLASS_NAME + "] not found", support.tryToLoadClassFromBundle(CLASS_NAME, BUNDLE_ID));

+        assertFalse("Class [" + CLASS_NAME + CLASS_NAME + "] found", support.tryToLoadClassFromBundle(CLASS_NAME + CLASS_NAME, BUNDLE_ID));

+

+        verify(bundle, bundleContext);

+    }

+}

diff --git a/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/stubs/StubQuasiBundle.java b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/stubs/StubQuasiBundle.java
new file mode 100644
index 0000000..86a1167
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/stubs/StubQuasiBundle.java
@@ -0,0 +1,138 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.virgo.shell.stubs;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.equinox.region.Region;
+import org.eclipse.virgo.kernel.artifact.plan.PlanDescriptor.Provisioning;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiBundle;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiExportPackage;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiImportPackage;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiRequiredBundle;
+import org.eclipse.virgo.test.stubs.framework.StubBundle;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.Version;
+
+/**
+ * 
+ *
+ */
+public class StubQuasiBundle implements QuasiBundle {
+
+    private final Version version;
+
+    private final String name;
+
+    private volatile Provisioning provisioning = Provisioning.AUTO;
+
+	private Long id;
+
+    public StubQuasiBundle(Long id, String name, Version version) {
+        this.id = id;
+		this.name = name;
+        this.version = version;
+    }
+
+    public StubQuasiBundle(StubBundle bundle) {
+        this.id = bundle.getBundleId();
+		this.name = bundle.getSymbolicName();
+        this.version = bundle.getVersion();
+    }
+
+    @Override
+    public String getSymbolicName() {
+        return this.name;
+    }
+
+    @Override
+    public Version getVersion() {
+        return this.version;
+    }
+
+    @Override
+    public boolean isResolved() {
+        return false;
+    }
+
+    @Override
+    public void uninstall() {
+    }
+
+    @Override
+    public Bundle getBundle() {
+        return null;
+    }
+
+    @Override
+    public long getBundleId() {
+        return this.id;
+    }
+
+    @Override
+    public List<QuasiBundle> getFragments() {
+        return new ArrayList<QuasiBundle>();
+    }
+
+    @Override
+    public List<QuasiBundle> getHosts() {
+        return new ArrayList<QuasiBundle>();
+    }
+
+    @Override
+    public List<QuasiExportPackage> getExportPackages() {
+        return new ArrayList<QuasiExportPackage>();
+    }
+
+    @Override
+    public List<QuasiImportPackage> getImportPackages() {
+        return new ArrayList<QuasiImportPackage>();
+    }
+
+    @Override
+    public List<QuasiRequiredBundle> getRequiredBundles() {
+        return new ArrayList<QuasiRequiredBundle>();
+    }
+
+    @Override
+    public List<QuasiBundle> getDependents() {
+        return new ArrayList<QuasiBundle>();
+    }
+
+    @Override
+    public File getBundleFile() {
+        return null;
+    }
+
+    @Override
+    public void setProvisioning(Provisioning provisioning) {
+        this.provisioning = provisioning;
+
+    }
+
+    @Override
+    public Provisioning getProvisioning() {
+        return this.provisioning;
+    }
+
+	@Override
+	public Region getRegion() {
+		return null;
+	}
+
+	@Override
+	public String getBundleLocation() {
+		return null;
+	}
+
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/stubs/StubQuasiExportPackage.java b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/stubs/StubQuasiExportPackage.java
new file mode 100644
index 0000000..a5a7850
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/stubs/StubQuasiExportPackage.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.stubs;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiBundle;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiExportPackage;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiImportPackage;
+import org.osgi.framework.Version;
+
+
+/**
+ */
+public class StubQuasiExportPackage implements QuasiExportPackage {
+
+    private final String packageName;
+
+    public StubQuasiExportPackage(String packageName) {
+        this.packageName = packageName;
+    }
+    
+    /** 
+     * {@inheritDoc}
+     */
+    public List<QuasiImportPackage> getConsumers() {
+        return new ArrayList<QuasiImportPackage>();
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public QuasiBundle getExportingBundle() {
+        return new StubQuasiBundle(5l, "", new Version("1.0.0"));
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public String getPackageName() {
+        return this.packageName;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public Version getVersion() {
+        return Version.emptyVersion;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public Map<String, Object> getAttributes() {
+        return new HashMap<String, Object>();
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public Map<String, Object> getDirectives() {
+        return new HashMap<String, Object>();
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/stubs/StubQuasiFramework.java b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/stubs/StubQuasiFramework.java
new file mode 100644
index 0000000..f592ee0
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/stubs/StubQuasiFramework.java
@@ -0,0 +1,101 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.stubs;
+
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.osgi.framework.BundleException;
+import org.osgi.framework.Version;
+
+import org.eclipse.equinox.region.Region;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiBundle;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiFramework;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiResolutionFailure;
+import org.eclipse.virgo.test.stubs.framework.StubBundle;
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+import org.eclipse.virgo.test.stubs.framework.StubServiceReference;
+import org.eclipse.virgo.test.stubs.framework.StubServiceRegistration;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+
+/**
+ * <p>
+ * This <code>StubQuasiFramework</code> is a pretend framework containing one bundle with an id of 4
+ * <p />
+ * 
+ */
+public class StubQuasiFramework implements QuasiFramework {
+    
+    private final Map<Long, StubBundle> bundles = new HashMap<Long, StubBundle>();
+
+	public StubQuasiFramework(StubBundle... stubBundles) {
+    	for (StubBundle stubBundle : stubBundles) {
+            this.bundles.put(stubBundle.getBundleId(), stubBundle);
+            StubBundleContext stubBundleContext = new StubBundleContext(stubBundle);
+            stubBundleContext.addInstalledBundle(stubBundle);
+            stubBundle.setBundleContext(stubBundleContext);
+            stubBundle.addRegisteredService(new StubServiceReference<Object>(new StubServiceRegistration<Object>(stubBundleContext)));
+		}
+    }
+
+    public void commit() throws BundleException {
+    }
+
+    public QuasiBundle getBundle(long bundleId) {
+    	if(this.bundles.containsKey(bundleId)){
+            return new StubQuasiBundle(bundleId, this.bundles.get(bundleId).getSymbolicName(), this.bundles.get(bundleId).getVersion());
+    	} else {
+    		return null;
+    	}
+    }
+
+    public List<QuasiBundle> getBundles() {
+        List<QuasiBundle> bundles = new ArrayList<QuasiBundle>();
+        Collection<StubBundle> values = this.bundles.values();
+        for (StubBundle stubBundle : values) {
+			bundles.add(new StubQuasiBundle(stubBundle));
+		}
+        return bundles;
+    }
+
+    public QuasiBundle install(URI location, BundleManifest bundleManifest) throws BundleException {
+        return new StubQuasiBundle(6l, null, null);
+    }
+
+    public List<QuasiResolutionFailure> resolve() {
+        return new ArrayList<QuasiResolutionFailure>();
+    }
+
+    public List<QuasiResolutionFailure> diagnose(long bundleId) {
+        return new ArrayList<QuasiResolutionFailure>();
+    }
+
+    public QuasiBundle getBundle(String name, Version version) {
+        return null;
+    }
+
+    @Override
+    public void destroy() {
+    }
+
+	@Override
+	public Set<Region> getRegions() {
+		return new HashSet<Region>();
+	}
+
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/stubs/StubQuasiFrameworkFactory.java b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/stubs/StubQuasiFrameworkFactory.java
new file mode 100644
index 0000000..79d17ea
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/stubs/StubQuasiFrameworkFactory.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.stubs;
+
+import java.io.File;
+
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiFramework;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiFrameworkFactory;
+import org.eclipse.virgo.test.stubs.framework.StubBundle;
+
+/**
+ */
+public class StubQuasiFrameworkFactory implements QuasiFrameworkFactory {
+
+	private StubBundle[] stubBundles;
+
+	public StubQuasiFrameworkFactory(StubBundle... stubBundles) {
+		this.stubBundles = stubBundles;
+	}
+	
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public QuasiFramework create() {
+        return new StubQuasiFramework(this.stubBundles);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public QuasiFramework create(File arg0) {
+        return new StubQuasiFramework(this.stubBundles);
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/stubs/StubQuasiImportPackage.java b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/stubs/StubQuasiImportPackage.java
new file mode 100644
index 0000000..bad06f1
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/test/java/org/eclipse/virgo/shell/stubs/StubQuasiImportPackage.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.shell.stubs;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiBundle;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiExportPackage;
+import org.eclipse.virgo.kernel.osgi.quasi.QuasiImportPackage;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+
+
+/**
+ */
+public class StubQuasiImportPackage implements QuasiImportPackage {
+
+    private final String packageName;
+
+    public StubQuasiImportPackage(String packageName) {
+        this.packageName = packageName;
+    }
+    
+    /** 
+     * {@inheritDoc}
+     */
+    public QuasiBundle getImportingBundle() {
+        return new StubQuasiBundle(5l, "name", null);
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public String getPackageName() {
+        return this.packageName;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public QuasiExportPackage getProvider() {
+        return new StubQuasiExportPackage(packageName);
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public VersionRange getVersionConstraint() {
+        return VersionRange.NATURAL_NUMBER_RANGE;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public boolean isResolved() {
+        return false;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public Map<String, Object> getAttributes() {
+        return new HashMap<String, Object>();
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public Map<String, Object> getDirectives() {
+        return new HashMap<String, Object>();
+    }
+
+}
diff --git a/kernel/org.eclipse.virgo.shell.command/src/test/resources/helpAccessorTests.help b/kernel/org.eclipse.virgo.shell.command/src/test/resources/helpAccessorTests.help
new file mode 100644
index 0000000..c44fd7e
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/test/resources/helpAccessorTests.help
@@ -0,0 +1,7 @@
+# rubbish
+First line of help text
+# more rubbish
+Line 1
+#
+  Line 2
+#
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.shell.command/src/test/resources/org/eclipse/virgo/kernel/shell/internal/formatting/abstract-list.txt b/kernel/org.eclipse.virgo.shell.command/src/test/resources/org/eclipse/virgo/kernel/shell/internal/formatting/abstract-list.txt
new file mode 100644
index 0000000..661a615
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/test/resources/org/eclipse/virgo/kernel/shell/internal/formatting/abstract-list.txt
@@ -0,0 +1,2 @@
+Name                      Version                                          State
+com.springsource.testName 0.0.0                                           ACTIVE
diff --git a/kernel/org.eclipse.virgo.shell.command/src/test/resources/org/eclipse/virgo/kernel/shell/internal/formatting/composite-examine.txt b/kernel/org.eclipse.virgo.shell.command/src/test/resources/org/eclipse/virgo/kernel/shell/internal/formatting/composite-examine.txt
new file mode 100644
index 0000000..fd61e63
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/test/resources/org/eclipse/virgo/kernel/shell/internal/formatting/composite-examine.txt
@@ -0,0 +1,7 @@
+State:  ACTIVE
+Scoped: false
+Atomic: false
+
+Children:
+    test com.springsource.test2 0.0.0
+    test com.springsource.test3 0.0.0
diff --git a/kernel/org.eclipse.virgo.shell.command/src/test/resources/org/eclipse/virgo/kernel/shell/internal/formatting/config-examine.txt b/kernel/org.eclipse.virgo.shell.command/src/test/resources/org/eclipse/virgo/kernel/shell/internal/formatting/config-examine.txt
new file mode 100644
index 0000000..49171ef
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/test/resources/org/eclipse/virgo/kernel/shell/internal/formatting/config-examine.txt
@@ -0,0 +1,13 @@
+Factory pid:     testPid
+Bundle Location: /a/location
+
+Properties:
+    key1:
+        value11111111111111111111111111111111111111111111111111111111111111111111111111111111a, 
+        value1b
+    key2:
+        value2
+    service.factoryPid:
+        testPid
+    service.pid:
+        testPid
diff --git a/kernel/org.eclipse.virgo.shell.command/src/test/resources/org/eclipse/virgo/kernel/shell/internal/formatting/service-examine.txt b/kernel/org.eclipse.virgo.shell.command/src/test/resources/org/eclipse/virgo/kernel/shell/internal/formatting/service-examine.txt
new file mode 100644
index 0000000..29ba4da
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/test/resources/org/eclipse/virgo/kernel/shell/internal/formatting/service-examine.txt
@@ -0,0 +1,14 @@
+Properties:
+    objectClass:
+        bundle.symbolic.name
+    propertyName1:
+        This is a string array...., Second string
+    service.id:
+        1
+    service.ranking:
+        0
+
+Publisher: bundle.symbolic.name 1.0.1.asdhjgf [2]
+
+Consumer(s):
+    None
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.shell.command/src/test/resources/org/eclipse/virgo/kernel/shell/internal/formatting/service-list.txt b/kernel/org.eclipse.virgo.shell.command/src/test/resources/org/eclipse/virgo/kernel/shell/internal/formatting/service-list.txt
new file mode 100644
index 0000000..e50b1e2
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/src/test/resources/org/eclipse/virgo/kernel/shell/internal/formatting/service-list.txt
@@ -0,0 +1,3 @@
+Id Object Class(es)                                             Providing Bundle
+1  bundle.symbolic.name1                                                       2
+1  bundle.symbolic.name2                                                       4
\ No newline at end of file
diff --git a/kernel/org.eclipse.virgo.shell.command/template.mf b/kernel/org.eclipse.virgo.shell.command/template.mf
new file mode 100644
index 0000000..067051e
--- /dev/null
+++ b/kernel/org.eclipse.virgo.shell.command/template.mf
@@ -0,0 +1,40 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Virgo Admin Shell
+Bundle-SymbolicName: org.eclipse.virgo.shell.command
+Bundle-Version: ${version}
+Import-Template:
+ org.eclipse.virgo.kernel.*;version="${version:[=.=.=, =.+1)}",
+ org.eclipse.virgo.nano.*;version="${version:[=.=.=, =.+1)}",
+ org.eclipse.virgo.util.*;version="${version:[=.=.=, =.+1)}",
+ org.eclipse.virgo.medic.*;version="${version:[=.=.=, =.+1)}",
+ org.eclipse.virgo.repository.*;version="${version:[=.=.=, =.+1)}",
+ org.springframework.*;version="${springframeworkVersion:[2.5.6, +1)}",
+ org.slf4j.*;version="${slf4jVersion:[=.=.=, +1)}",
+ org.aspectj.*;version="${aspectjVersion:[=.=.=, +1)}",
+ javax.crypto.*;version="0",
+ javax.net.*;version="0",
+ javax.security.*;version="0",
+ org.ietf.jgss.*;version="0",
+ org.eclipse.osgi.*;version="0",
+ org.osgi.framework.*;version="0",
+ org.osgi.service.*;version="0",
+ org.osgi.util.*;version="0",
+ org.osgi.service.cm.*;version="0",
+ org.osgi.service.event.*;version="0",
+ org.eclipse.equinox.region.*;version="${equinoxRegionExportedPackageVersion:[=.=.=, =.+1)}",
+ javax.management.*;version="0",
+ org.eclipse.osgi.framework.*;version="0",
+ org.eclipse.osgi.service.resolver.*;version="0",
+ org.apache.felix.service.command;status=provisional;version="${gogoRuntimeVersion:[=.=.=, =.+1)}"
+Export-Template:
+ org.eclipse.virgo.shell.osgicommand.helper.*;version="${version}"
+Bundle-Activator: org.eclipse.virgo.shell.osgicommand.Activator
+Excluded-Imports:
+ org.eclipse.virgo.kernel.shell.*,
+ com.jcraft.jzlib.*,
+ org.bouncycastle.*,
+ org.easymock
+Excluded-Exports:
+ *.internal.*,
+ org.apache.*
diff --git a/kernel/scripts/CoverageOverview.groovy b/kernel/scripts/CoverageOverview.groovy
new file mode 100755
index 0000000..08ea7c1
--- /dev/null
+++ b/kernel/scripts/CoverageOverview.groovy
@@ -0,0 +1,67 @@
+#!/usr/bin/env groovy
+
+import javax.xml.parsers.DocumentBuilderFactory
+import javax.xml.xpath.*
+
+def buildXmlFile = new File("build-kernel/build.xml")
+def buildXml = loadXmlFile(buildXmlFile);
+def relativeLocations = readProjectLocations(buildXml);
+
+def cloverResultFiles = []
+
+relativeLocations.each {
+	cloverResultFiles.add(new File(buildXmlFile.parent, it + "/target/clover/clover.xml"))
+}
+
+println ""
+
+cloverResultFiles.each {
+	
+	def coverage = determineCoverage(it);
+	
+	outputCoverage (it.parentFile.parentFile.parentFile.name, coverage);
+}
+
+def overallCoverage = determineCoverage(new File(buildXmlFile.parent, "/target/clover/clover.xml"))
+
+println ""
+outputCoverage("Overall", overallCoverage);
+println ""
+
+def loadXmlFile(File xmlFile) {
+	builder = DocumentBuilderFactory.newInstance().newDocumentBuilder()
+	inputStream = new FileInputStream(xmlFile)
+	return builder.parse(inputStream).documentElement
+}
+
+def readProjectLocations(def buildXml) {
+	def xpath = XPathFactory.newInstance().newXPath()
+	def nodes = xpath.evaluate( '//path[@id="unit.test.bundles"]/pathelement', buildXml, XPathConstants.NODESET)
+
+	def locations = []
+
+	nodes.each {
+	  locations.add(xpath.evaluate( '@location', it ))
+	}
+	
+	return locations
+}
+
+double determineCoverage(def cloverXmlFile) {
+	if (!cloverXmlFile.exists()) {
+		return 0;
+	}
+	
+	def cloverXml = loadXmlFile(cloverXmlFile);
+	def xpath = XPathFactory.newInstance().newXPath()
+	def metrics = xpath.evaluate( '/coverage/project/metrics', cloverXml, XPathConstants.NODESET).item(0)
+
+	coveredElements = xpath.evaluate('@coveredelements', metrics).toDouble()
+	elements = xpath.evaluate('@elements', metrics).toDouble()
+
+	return (coveredElements / elements) * 100
+}
+
+def outputCoverage(def name, def coverage) {
+	println String.format("%-48s: %5.2f%%", name, coverage)
+}
diff --git a/kernel/test-apps/activator-tccl/build.xml b/kernel/test-apps/activator-tccl/build.xml
new file mode 100644
index 0000000..1c40c83
--- /dev/null
+++ b/kernel/test-apps/activator-tccl/build.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="activator-tccl">
+
+	<property file="${basedir}/../build.properties"/>
+    <property file="${basedir}/../../build.versions"/>
+	<property name="jar.output.file" value="${basedir}/../../org.eclipse.virgo.kernel.deployer.test/src/test/resources/activator-tccl.jar"/>
+	<import file="${basedir}/../../virgo-build/standard/default.xml"/>
+
+</project>
diff --git a/kernel/test-apps/activator-tccl/ivy.xml b/kernel/test-apps/activator-tccl/ivy.xml
new file mode 100644
index 0000000..346e13b
--- /dev/null
+++ b/kernel/test-apps/activator-tccl/ivy.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="http://ivyrep.jayasoft.org/ivy-doc.xsl"?>
+<ivy-module
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:noNamespaceSchemaLocation="http://incubator.apache.org/ivy/schemas/ivy.xsd"
+		version="1.3">
+
+	<info organisation="${project.organisation}" module="${ant.project.name}"/>
+
+	<configurations>
+		<include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>
+	</configurations>
+
+	<publications>
+	</publications>
+
+	<dependencies>
+		<dependency org="org.junit" name="com.springsource.org.junit" rev="${org.junit}" conf="test->runtime"/>
+		<dependency name='org.eclipse.osgi' rev='${org.eclipse.osgi}' org="org.eclipse.virgo.mirrored" conf='compile->runtime'/>
+	</dependencies>
+
+</ivy-module>
diff --git a/kernel/test-apps/activator-tccl/src/main/java/eg/Activator.java b/kernel/test-apps/activator-tccl/src/main/java/eg/Activator.java
new file mode 100644
index 0000000..3eb1d84
--- /dev/null
+++ b/kernel/test-apps/activator-tccl/src/main/java/eg/Activator.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package eg;
+
+import org.osgi.framework.*;
+import org.eclipse.osgi.framework.adaptor.BundleClassLoader;
+
+public class Activator implements BundleActivator {
+	
+	public void start(BundleContext ctx) throws BundleException {
+		assertTccl("start", ctx.getBundle());
+	}
+	
+	public void stop(BundleContext ctx) throws BundleException {
+		assertTccl("stop", ctx.getBundle());
+	}
+	
+	private void assertTccl(String operation, Bundle expectedBundle) throws BundleException {
+		ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+		
+		System.out.println("ClassLoader during " + operation + ": " + classLoader);
+
+		if (!(classLoader instanceof BundleClassLoader)) {
+			throw new BundleException("TCCL " + classLoader + " was not a BundleClassLoader");
+		}
+		
+		if (!expectedBundle.equals(((BundleReference)classLoader).getBundle())) {
+			throw new BundleException("TCCL " + classLoader + " was not bundle class loader for this bundle");
+		}
+	}
+}
diff --git a/kernel/test-apps/activator-tccl/src/main/resources/META-INF/MANIFEST.MF b/kernel/test-apps/activator-tccl/src/main/resources/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..21690df
--- /dev/null
+++ b/kernel/test-apps/activator-tccl/src/main/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,8 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: activator.tccl
+Bundle-Name: Bundle activator thread context class loader tests
+Import-Package: org.osgi.framework,
+ org.eclipse.osgi.framework.adaptor
+Bundle-Activator: eg.Activator
+
diff --git a/kernel/test-apps/build.properties b/kernel/test-apps/build.properties
new file mode 100644
index 0000000..5fb8189
--- /dev/null
+++ b/kernel/test-apps/build.properties
@@ -0,0 +1,6 @@
+version=1.0.0
+release.type=integration
+ivy.cache.dir=${user.home}/virgo-build-cache/ivy-cache
+integration.repo.dir=${user.home}/virgo-build-cache/integration-repo
+project.organisation=org.eclipse.virgo.kernel.test-apps
+disable.bundlor=true
\ No newline at end of file
diff --git a/kernel/test-apps/build.xml b/kernel/test-apps/build.xml
new file mode 100644
index 0000000..6f4c6eb
--- /dev/null
+++ b/kernel/test-apps/build.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="test-apps">
+
+	<path id="bundles">
+		<pathelement location="activator-tccl/"/>
+		<pathelement location="bundle-activation-policy/build-par"/>
+		<pathelement location="deployer-edge-tests/clashing-exports-in-a-scope/build-par"/>
+		<pathelement location="manual-context/"/>
+		<pathelement location="plan-deployment/simple.bundle.one"/>
+		<pathelement location="plan-deployment/simple.bundle.two"/>
+		<pathelement location="plan-deployment/simple.bundle.three"/>
+		<pathelement location="quartz-scheduler/quartz.bundle.a"/>
+		<pathelement location="quartz-scheduler/quartz.bundle.b"/>
+		<pathelement location="quartz-scheduler/quartz.bundle.same1"/>
+		<pathelement location="quartz-scheduler/quartz.bundle.same2"/>
+		<pathelement location="redeploy-refresh/simple.bundle.bad"/>
+		<pathelement location="redeploy-refresh/simple.bundle.ok"/>
+		<pathelement location="refresh/refresh/build-par"/>
+		<pathelement location="refresh/refresh-import-bundle/build-par"/>
+		<pathelement location="service-publication-from-repo-bundles/consumer"/>
+		<pathelement location="service-publication-from-repo-bundles/publisher"/>
+		<pathelement location="service-scoping/build-par"/>
+		<pathelement location="service-scoping-engine-1265/build-par"/>
+		<pathelement location="service-scoping-platform-183/build-par"/>
+		<pathelement location="spring-2.5.6.A-sample/"/>
+		<pathelement location="synthetic-tccl/synthetic.tccl.global"/>
+		<pathelement location="synthetic-tccl/build-par"/>
+	</path>
+
+	<property file="${basedir}/build.properties"/>
+    <property file="${basedir}/../build.versions"/>
+	<import file="${basedir}/../virgo-build/multi-bundle/default.xml"/>
+
+</project>
diff --git a/kernel/test-apps/bundle-activation-policy/build-par/build.xml b/kernel/test-apps/bundle-activation-policy/build-par/build.xml
new file mode 100644
index 0000000..4528595
--- /dev/null
+++ b/kernel/test-apps/bundle-activation-policy/build-par/build.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="bundle-activation-policy">
+
+	<path id="bundles">
+		<pathelement location="../bundle.activation.policy.module.b"/>
+		<pathelement location="../bundle.activation.policy.module.a"/>
+	</path>
+
+	<property file="${basedir}/../../build.properties"/>
+	<property name="par.output.file" value="${basedir}/../../../org.eclipse.virgo.kernel.deployer.test/src/test/resources/bundle-activation-policy.par"/>
+
+	<import file="${basedir}/../../../virgo-build/par/default.xml"/>
+
+</project>
diff --git a/kernel/test-apps/bundle-activation-policy/bundle.activation.policy.module.a/build.xml b/kernel/test-apps/bundle-activation-policy/bundle.activation.policy.module.a/build.xml
new file mode 100644
index 0000000..d41cf8b
--- /dev/null
+++ b/kernel/test-apps/bundle-activation-policy/bundle.activation.policy.module.a/build.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="bundle.activation.policy.module.a">
+
+	<property file="${basedir}/../../build.properties"/>
+    <property file="${basedir}/../../../build.versions"/>
+
+	<import file="${basedir}/../../../virgo-build/standard/default.xml"/>
+
+</project>
diff --git a/kernel/test-apps/bundle-activation-policy/bundle.activation.policy.module.a/ivy.xml b/kernel/test-apps/bundle-activation-policy/bundle.activation.policy.module.a/ivy.xml
new file mode 100644
index 0000000..9d96ed3
--- /dev/null
+++ b/kernel/test-apps/bundle-activation-policy/bundle.activation.policy.module.a/ivy.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="http://ivyrep.jayasoft.org/ivy-doc.xsl"?>
+<ivy-module
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:noNamespaceSchemaLocation="http://incubator.apache.org/ivy/schemas/ivy.xsd"
+		version="1.3">
+
+	<info organisation="${project.organisation}" module="${ant.project.name}">
+		<ivyauthor name="awilkinson"/>
+	</info>
+
+	<configurations>
+		<include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>
+	</configurations>
+
+	<publications>
+		<artifact name="${ant.project.name}"/>
+		<artifact name="${ant.project.name}-sources" type="src" ext="jar"/>
+	</publications>
+
+	<dependencies>
+		<dependency org="org.junit" name="com.springsource.org.junit" rev="${org.junit}" conf="test->runtime"/>
+		<dependency org="${project.organisation}" name="bundle.activation.policy.module.b" rev="latest.integration" conf="compile->compile"/>
+	</dependencies>
+
+</ivy-module>
diff --git a/kernel/test-apps/bundle-activation-policy/bundle.activation.policy.module.a/src/main/java/a/UseBundleB.java b/kernel/test-apps/bundle-activation-policy/bundle.activation.policy.module.a/src/main/java/a/UseBundleB.java
new file mode 100644
index 0000000..74944df
--- /dev/null
+++ b/kernel/test-apps/bundle-activation-policy/bundle.activation.policy.module.a/src/main/java/a/UseBundleB.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package a;
+
+import b.ClassInBundleB;
+
+public class UseBundleB {
+	private final ClassInBundleB classInBundleB;
+    public UseBundleB() {
+		this.classInBundleB = new ClassInBundleB();
+	}
+	public ClassInBundleB getClassInBundleB() {
+		return this.classInBundleB;
+	}
+}
diff --git a/kernel/test-apps/bundle-activation-policy/bundle.activation.policy.module.a/src/main/resources/META-INF/MANIFEST.MF b/kernel/test-apps/bundle-activation-policy/bundle.activation.policy.module.a/src/main/resources/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..faa2e94
--- /dev/null
+++ b/kernel/test-apps/bundle-activation-policy/bundle.activation.policy.module.a/src/main/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,5 @@
+Bundle-SymbolicName: bundle.activation.policy.module.a
+Bundle-Version: 1.0
+Bundle-ManifestVersion: 2
+Import-Package: b
+Export-Package: a
diff --git a/kernel/test-apps/bundle-activation-policy/bundle.activation.policy.module.b/build.xml b/kernel/test-apps/bundle-activation-policy/bundle.activation.policy.module.b/build.xml
new file mode 100644
index 0000000..03aa7dd
--- /dev/null
+++ b/kernel/test-apps/bundle-activation-policy/bundle.activation.policy.module.b/build.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="bundle.activation.policy.module.b">
+
+	<property file="${basedir}/../../build.properties"/>
+    <property file="${basedir}/../../../build.versions"/>
+
+	<import file="${basedir}/../../../virgo-build/standard/default.xml"/>
+
+</project>
diff --git a/kernel/test-apps/bundle-activation-policy/bundle.activation.policy.module.b/ivy.xml b/kernel/test-apps/bundle-activation-policy/bundle.activation.policy.module.b/ivy.xml
new file mode 100644
index 0000000..640e289
--- /dev/null
+++ b/kernel/test-apps/bundle-activation-policy/bundle.activation.policy.module.b/ivy.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="http://ivyrep.jayasoft.org/ivy-doc.xsl"?>
+<ivy-module
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:noNamespaceSchemaLocation="http://incubator.apache.org/ivy/schemas/ivy.xsd"
+		version="1.3">
+
+	<info organisation="${project.organisation}" module="${ant.project.name}">
+		<ivyauthor name="awilkinson"/>
+	</info>
+
+	<configurations>
+		<include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>
+	</configurations>
+
+	<publications>
+		<artifact name="${ant.project.name}"/>
+		<artifact name="${ant.project.name}-sources" type="src" ext="jar"/>
+	</publications>
+
+	<dependencies>
+		<dependency org="org.junit" name="com.springsource.org.junit" rev="${org.junit}" conf="test->runtime"/>
+	</dependencies>
+
+</ivy-module>
diff --git a/kernel/test-apps/bundle-activation-policy/bundle.activation.policy.module.b/src/main/java/b/ClassInBundleB.java b/kernel/test-apps/bundle-activation-policy/bundle.activation.policy.module.b/src/main/java/b/ClassInBundleB.java
new file mode 100644
index 0000000..5ef6aa0
--- /dev/null
+++ b/kernel/test-apps/bundle-activation-policy/bundle.activation.policy.module.b/src/main/java/b/ClassInBundleB.java
@@ -0,0 +1,17 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package b;
+
+public class ClassInBundleB {
+    public ClassInBundleB() {	
+    }
+}
diff --git a/kernel/test-apps/bundle-activation-policy/bundle.activation.policy.module.b/src/main/resources/META-INF/MANIFEST.MF b/kernel/test-apps/bundle-activation-policy/bundle.activation.policy.module.b/src/main/resources/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..1e2fb2e
--- /dev/null
+++ b/kernel/test-apps/bundle-activation-policy/bundle.activation.policy.module.b/src/main/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,5 @@
+Bundle-SymbolicName: bundle.activation.policy.module.b
+Bundle-Version: 1.0
+Bundle-ManifestVersion: 2
+Export-Package: b
+Bundle-ActivationPolicy: lazy
diff --git a/kernel/test-apps/deployer-edge-tests/clashing-exports-in-a-scope/build-par/build.xml b/kernel/test-apps/deployer-edge-tests/clashing-exports-in-a-scope/build-par/build.xml
new file mode 100644
index 0000000..1a42fc6
--- /dev/null
+++ b/kernel/test-apps/deployer-edge-tests/clashing-exports-in-a-scope/build-par/build.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="clashing-exports-in-a-scope-par">
+
+	<path id="bundles">
+		<pathelement location="../c1"/>
+		<pathelement location="../c2"/>
+	</path>
+
+	<property file="${basedir}/../../../build.properties"/>
+	<property name="par.output.dir" value="${basedir}/../../../../org.eclipse.virgo.kernel.deployer.test/src/test/resources"/>
+
+	<import file="${basedir}/../../../../virgo-build/par/default.xml"/>
+
+
+</project>
diff --git a/kernel/test-apps/deployer-edge-tests/clashing-exports-in-a-scope/c1/build.xml b/kernel/test-apps/deployer-edge-tests/clashing-exports-in-a-scope/c1/build.xml
new file mode 100644
index 0000000..f216fd6
--- /dev/null
+++ b/kernel/test-apps/deployer-edge-tests/clashing-exports-in-a-scope/c1/build.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="c1">
+
+	<property file="${basedir}/../../../build.properties"/>
+    <property file="${basedir}/../../../../build.versions"/>
+
+	<import file="${basedir}/../../../../virgo-build/standard/default.xml"/>
+
+</project>
diff --git a/kernel/test-apps/deployer-edge-tests/clashing-exports-in-a-scope/c1/ivy.xml b/kernel/test-apps/deployer-edge-tests/clashing-exports-in-a-scope/c1/ivy.xml
new file mode 100644
index 0000000..996e254
--- /dev/null
+++ b/kernel/test-apps/deployer-edge-tests/clashing-exports-in-a-scope/c1/ivy.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="http://ivyrep.jayasoft.org/ivy-doc.xsl"?>
+<ivy-module
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:noNamespaceSchemaLocation="http://incubator.apache.org/ivy/schemas/ivy.xsd"
+		version="1.3">
+
+	<info organisation="${project.organisation}" module="${ant.project.name}">
+		<ivyauthor name="gnormington"/>
+	</info>
+
+	<configurations>
+		<include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>
+	</configurations>
+
+	<publications/>
+
+	<dependencies/>
+
+</ivy-module>
diff --git a/kernel/test-apps/deployer-edge-tests/clashing-exports-in-a-scope/c1/src/main/java/.gitignore b/kernel/test-apps/deployer-edge-tests/clashing-exports-in-a-scope/c1/src/main/java/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/test-apps/deployer-edge-tests/clashing-exports-in-a-scope/c1/src/main/java/.gitignore
diff --git a/kernel/test-apps/deployer-edge-tests/clashing-exports-in-a-scope/c1/src/main/resources/META-INF/MANIFEST.MF b/kernel/test-apps/deployer-edge-tests/clashing-exports-in-a-scope/c1/src/main/resources/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..d40b9d5
--- /dev/null
+++ b/kernel/test-apps/deployer-edge-tests/clashing-exports-in-a-scope/c1/src/main/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: c1
+Export-Package: c.p
+
+
diff --git a/kernel/test-apps/deployer-edge-tests/clashing-exports-in-a-scope/c2/build.xml b/kernel/test-apps/deployer-edge-tests/clashing-exports-in-a-scope/c2/build.xml
new file mode 100644
index 0000000..0c1b89c
--- /dev/null
+++ b/kernel/test-apps/deployer-edge-tests/clashing-exports-in-a-scope/c2/build.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="c2">
+
+	<property file="${basedir}/../../../build.properties"/>
+    <property file="${basedir}/../../../../build.versions"/>
+
+	<import file="${basedir}/../../../../virgo-build/standard/default.xml"/>
+
+</project>
diff --git a/kernel/test-apps/deployer-edge-tests/clashing-exports-in-a-scope/c2/ivy.xml b/kernel/test-apps/deployer-edge-tests/clashing-exports-in-a-scope/c2/ivy.xml
new file mode 100644
index 0000000..996e254
--- /dev/null
+++ b/kernel/test-apps/deployer-edge-tests/clashing-exports-in-a-scope/c2/ivy.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="http://ivyrep.jayasoft.org/ivy-doc.xsl"?>
+<ivy-module
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:noNamespaceSchemaLocation="http://incubator.apache.org/ivy/schemas/ivy.xsd"
+		version="1.3">
+
+	<info organisation="${project.organisation}" module="${ant.project.name}">
+		<ivyauthor name="gnormington"/>
+	</info>
+
+	<configurations>
+		<include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>
+	</configurations>
+
+	<publications/>
+
+	<dependencies/>
+
+</ivy-module>
diff --git a/kernel/test-apps/deployer-edge-tests/clashing-exports-in-a-scope/c2/src/main/java/.gitignore b/kernel/test-apps/deployer-edge-tests/clashing-exports-in-a-scope/c2/src/main/java/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/test-apps/deployer-edge-tests/clashing-exports-in-a-scope/c2/src/main/java/.gitignore
diff --git a/kernel/test-apps/deployer-edge-tests/clashing-exports-in-a-scope/c2/src/main/resources/META-INF/MANIFEST.MF b/kernel/test-apps/deployer-edge-tests/clashing-exports-in-a-scope/c2/src/main/resources/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..cddc240
--- /dev/null
+++ b/kernel/test-apps/deployer-edge-tests/clashing-exports-in-a-scope/c2/src/main/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: c2
+Export-Package: c.p
+
+
diff --git a/kernel/test-apps/manual-context/build.xml b/kernel/test-apps/manual-context/build.xml
new file mode 100644
index 0000000..fa73aa3
--- /dev/null
+++ b/kernel/test-apps/manual-context/build.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="manual-context">
+
+	<property file="${basedir}/../build.properties"/>
+    <property file="${basedir}/../../build.versions"/>
+	<property name="jar.output.file" value="${basedir}/../../org.eclipse.virgo.kernel.deployer.test/src/test/resources/manual-context.jar"/>
+	<import file="${basedir}/../../virgo-build/standard/default.xml"/>
+
+</project>
diff --git a/kernel/test-apps/manual-context/ivy.xml b/kernel/test-apps/manual-context/ivy.xml
new file mode 100644
index 0000000..7613cff
--- /dev/null
+++ b/kernel/test-apps/manual-context/ivy.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="http://ivyrep.jayasoft.org/ivy-doc.xsl"?>
+<ivy-module
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:noNamespaceSchemaLocation="http://incubator.apache.org/ivy/schemas/ivy.xsd"
+		version="1.3">
+
+	<info organisation="${project.organisation}" module="${ant.project.name}">
+		<ivyauthor name="rharrop"/>
+	</info>
+
+	<configurations>
+		<include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>
+	</configurations>
+
+	<publications>
+	</publications>
+
+	<dependencies>
+		<dependency org="org.junit" name="com.springsource.org.junit" rev="${org.junit}" conf="test->runtime"/>
+		<dependency org="org.springframework" name="org.springframework.beans" rev="${org.springframework}" conf="compile->runtime"/>
+		<dependency org="org.springframework" name="org.springframework.context" rev="${org.springframework}" conf="compile->runtime"/>
+		<dependency org="org.springframework" name="org.springframework.context.support" rev="${org.springframework}" conf="compile->runtime"/>
+		<dependency org="org.springframework" name="org.springframework.core" rev="${org.springframework}" conf="compile->runtime"/>
+		<dependency name='org.eclipse.osgi' rev='${org.eclipse.osgi}' org="org.eclipse.virgo.mirrored" conf='compile->runtime'/>
+	</dependencies>
+
+</ivy-module>
diff --git a/kernel/test-apps/manual-context/src/main/java/eg/Activator.java b/kernel/test-apps/manual-context/src/main/java/eg/Activator.java
new file mode 100644
index 0000000..80a5ec0
--- /dev/null
+++ b/kernel/test-apps/manual-context/src/main/java/eg/Activator.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package eg;
+
+import org.osgi.framework.*;
+import org.springframework.context.support.*;
+
+public class Activator implements BundleActivator {
+	
+	public void start(BundleContext ctx) throws BundleException {
+		System.out.println("Starting with TCCL: " + Thread.currentThread().getContextClassLoader());
+		ClassPathXmlApplicationContext c = new ClassPathXmlApplicationContext("context.xml", getClass());
+		c.refresh();
+	}
+	
+	public void stop(BundleContext ctx) throws BundleException {
+		
+	}
+}
diff --git a/kernel/test-apps/manual-context/src/main/java/eg/context.xml b/kernel/test-apps/manual-context/src/main/java/eg/context.xml
new file mode 100644
index 0000000..c872253
--- /dev/null
+++ b/kernel/test-apps/manual-context/src/main/java/eg/context.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="
+    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
+    
+</beans>
diff --git a/kernel/test-apps/manual-context/src/main/resources/META-INF/MANIFEST.MF b/kernel/test-apps/manual-context/src/main/resources/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..667a817
--- /dev/null
+++ b/kernel/test-apps/manual-context/src/main/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,8 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: manual.context
+Bundle-Name: Manual Context Test
+Import-Package: org.osgi.framework,
+ org.springframework.context.support
+Bundle-Activator: eg.Activator
+
diff --git a/kernel/test-apps/plan-deployment/simple.bundle.one/build.xml b/kernel/test-apps/plan-deployment/simple.bundle.one/build.xml
new file mode 100644
index 0000000..3539cff
--- /dev/null
+++ b/kernel/test-apps/plan-deployment/simple.bundle.one/build.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="simple.bundle.one">
+
+	<property file="${basedir}/../../build.properties"/>
+    <property file="${basedir}/../../../build.versions"/>
+	<property name="jar.output.file" value="${basedir}/../../../org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/simple.bundle.one.jar"/>
+	<import file="${basedir}/../../../virgo-build/standard/default.xml"/>
+
+</project>
diff --git a/kernel/test-apps/plan-deployment/simple.bundle.one/ivy.xml b/kernel/test-apps/plan-deployment/simple.bundle.one/ivy.xml
new file mode 100644
index 0000000..470d1c5
--- /dev/null
+++ b/kernel/test-apps/plan-deployment/simple.bundle.one/ivy.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="http://ivyrep.jayasoft.org/ivy-doc.xsl"?>
+<ivy-module
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:noNamespaceSchemaLocation="http://incubator.apache.org/ivy/schemas/ivy.xsd"
+		version="1.3">
+
+	<info organisation="${project.organisation}" module="${ant.project.name}">
+		<ivyauthor name="gnormington"/>
+	</info>
+
+	<configurations>
+		<include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>
+	</configurations>
+
+	<publications>
+	</publications>
+
+	<dependencies>
+	</dependencies>
+
+</ivy-module>
diff --git a/kernel/test-apps/plan-deployment/simple.bundle.one/src/main/java/.gitignore b/kernel/test-apps/plan-deployment/simple.bundle.one/src/main/java/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/test-apps/plan-deployment/simple.bundle.one/src/main/java/.gitignore
diff --git a/kernel/test-apps/plan-deployment/simple.bundle.one/src/main/resources/META-INF/MANIFEST.MF b/kernel/test-apps/plan-deployment/simple.bundle.one/src/main/resources/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..8e10770
--- /dev/null
+++ b/kernel/test-apps/plan-deployment/simple.bundle.one/src/main/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,4 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: simple.bundle.one
+Bundle-Version: 1
diff --git a/kernel/test-apps/plan-deployment/simple.bundle.one/src/test/java/.gitignore b/kernel/test-apps/plan-deployment/simple.bundle.one/src/test/java/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/test-apps/plan-deployment/simple.bundle.one/src/test/java/.gitignore
diff --git a/kernel/test-apps/plan-deployment/simple.bundle.one/src/test/resources/.gitignore b/kernel/test-apps/plan-deployment/simple.bundle.one/src/test/resources/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/test-apps/plan-deployment/simple.bundle.one/src/test/resources/.gitignore
diff --git a/kernel/test-apps/plan-deployment/simple.bundle.three/build.xml b/kernel/test-apps/plan-deployment/simple.bundle.three/build.xml
new file mode 100644
index 0000000..d2967fb
--- /dev/null
+++ b/kernel/test-apps/plan-deployment/simple.bundle.three/build.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="simple.bundle.three">
+
+	<property file="${basedir}/../../build.properties"/>
+    <property file="${basedir}/../../../build.versions"/>
+	<property name="jar.output.file" value="${basedir}/../../../org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment-dag/simple.bundle.three.jar"/>
+	<import file="${basedir}/../../../virgo-build/standard/default.xml"/>
+
+</project>
diff --git a/kernel/test-apps/plan-deployment/simple.bundle.three/ivy.xml b/kernel/test-apps/plan-deployment/simple.bundle.three/ivy.xml
new file mode 100644
index 0000000..470d1c5
--- /dev/null
+++ b/kernel/test-apps/plan-deployment/simple.bundle.three/ivy.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="http://ivyrep.jayasoft.org/ivy-doc.xsl"?>
+<ivy-module
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:noNamespaceSchemaLocation="http://incubator.apache.org/ivy/schemas/ivy.xsd"
+		version="1.3">
+
+	<info organisation="${project.organisation}" module="${ant.project.name}">
+		<ivyauthor name="gnormington"/>
+	</info>
+
+	<configurations>
+		<include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>
+	</configurations>
+
+	<publications>
+	</publications>
+
+	<dependencies>
+	</dependencies>
+
+</ivy-module>
diff --git a/kernel/test-apps/plan-deployment/simple.bundle.three/src/main/java/.gitignore b/kernel/test-apps/plan-deployment/simple.bundle.three/src/main/java/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/test-apps/plan-deployment/simple.bundle.three/src/main/java/.gitignore
diff --git a/kernel/test-apps/plan-deployment/simple.bundle.three/src/main/resources/META-INF/MANIFEST.MF b/kernel/test-apps/plan-deployment/simple.bundle.three/src/main/resources/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..2b5a6fc
--- /dev/null
+++ b/kernel/test-apps/plan-deployment/simple.bundle.three/src/main/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,4 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: simple.bundle.three
+Bundle-Version: 1
diff --git a/kernel/test-apps/plan-deployment/simple.bundle.three/src/test/java/.gitignore b/kernel/test-apps/plan-deployment/simple.bundle.three/src/test/java/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/test-apps/plan-deployment/simple.bundle.three/src/test/java/.gitignore
diff --git a/kernel/test-apps/plan-deployment/simple.bundle.three/src/test/resources/.gitignore b/kernel/test-apps/plan-deployment/simple.bundle.three/src/test/resources/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/test-apps/plan-deployment/simple.bundle.three/src/test/resources/.gitignore
diff --git a/kernel/test-apps/plan-deployment/simple.bundle.two/build.xml b/kernel/test-apps/plan-deployment/simple.bundle.two/build.xml
new file mode 100644
index 0000000..587a5fd
--- /dev/null
+++ b/kernel/test-apps/plan-deployment/simple.bundle.two/build.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="simple.bundle.two">
+
+	<property file="${basedir}/../../build.properties"/>
+    <property file="${basedir}/../../../build.versions"/>
+	<property name="jar.output.file" value="${basedir}/../../../org.eclipse.virgo.kernel.deployer.test/src/test/resources/plan-deployment/simple.bundle.two.jar"/>
+	<import file="${basedir}/../../../virgo-build/standard/default.xml"/>
+
+</project>
diff --git a/kernel/test-apps/plan-deployment/simple.bundle.two/ivy.xml b/kernel/test-apps/plan-deployment/simple.bundle.two/ivy.xml
new file mode 100644
index 0000000..470d1c5
--- /dev/null
+++ b/kernel/test-apps/plan-deployment/simple.bundle.two/ivy.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="http://ivyrep.jayasoft.org/ivy-doc.xsl"?>
+<ivy-module
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:noNamespaceSchemaLocation="http://incubator.apache.org/ivy/schemas/ivy.xsd"
+		version="1.3">
+
+	<info organisation="${project.organisation}" module="${ant.project.name}">
+		<ivyauthor name="gnormington"/>
+	</info>
+
+	<configurations>
+		<include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>
+	</configurations>
+
+	<publications>
+	</publications>
+
+	<dependencies>
+	</dependencies>
+
+</ivy-module>
diff --git a/kernel/test-apps/plan-deployment/simple.bundle.two/src/main/java/.gitignore b/kernel/test-apps/plan-deployment/simple.bundle.two/src/main/java/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/test-apps/plan-deployment/simple.bundle.two/src/main/java/.gitignore
diff --git a/kernel/test-apps/plan-deployment/simple.bundle.two/src/main/resources/META-INF/MANIFEST.MF b/kernel/test-apps/plan-deployment/simple.bundle.two/src/main/resources/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..7b4ce17
--- /dev/null
+++ b/kernel/test-apps/plan-deployment/simple.bundle.two/src/main/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,4 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: simple.bundle.two
+Bundle-Version: 1
diff --git a/kernel/test-apps/plan-deployment/simple.bundle.two/src/test/java/.gitignore b/kernel/test-apps/plan-deployment/simple.bundle.two/src/test/java/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/test-apps/plan-deployment/simple.bundle.two/src/test/java/.gitignore
diff --git a/kernel/test-apps/plan-deployment/simple.bundle.two/src/test/resources/.gitignore b/kernel/test-apps/plan-deployment/simple.bundle.two/src/test/resources/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/test-apps/plan-deployment/simple.bundle.two/src/test/resources/.gitignore
diff --git a/kernel/test-apps/quartz-scheduler/quartz.bundle.a/build.xml b/kernel/test-apps/quartz-scheduler/quartz.bundle.a/build.xml
new file mode 100644
index 0000000..b2f96de
--- /dev/null
+++ b/kernel/test-apps/quartz-scheduler/quartz.bundle.a/build.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="quartz.bundle.a">
+
+	<property file="${basedir}/../../build.properties"/>
+    <property file="${basedir}/../../../build.versions"/>
+    <property name="jar.output.file" value="${basedir}/../../../org.eclipse.virgo.kernel.deployer.test/src/test/resources/quartz/quartz.bundle.a.jar"/>
+    <import file="${basedir}/../../../virgo-build/standard/default.xml"/>
+
+</project>
diff --git a/kernel/test-apps/quartz-scheduler/quartz.bundle.a/ivy.xml b/kernel/test-apps/quartz-scheduler/quartz.bundle.a/ivy.xml
new file mode 100644
index 0000000..88b2157
--- /dev/null
+++ b/kernel/test-apps/quartz-scheduler/quartz.bundle.a/ivy.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="http://ivyrep.jayasoft.org/ivy-doc.xsl"?>
+<ivy-module
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:noNamespaceSchemaLocation="http://incubator.apache.org/ivy/schemas/ivy.xsd"
+		version="1.3">
+
+	<info organisation="${project.organisation}" module="${ant.project.name}">
+		<ivyauthor name="sbrannen"/>
+	</info>
+
+	<configurations>
+		<include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>
+	</configurations>
+
+	<publications>
+	</publications>
+
+	<dependencies>
+		<dependency org="com.opensymphony.quartz" name="com.springsource.org.quartz" rev="${com.opensymphony.quartz}" conf="provided->compile"/>
+		<dependency org="org.eclipse.virgo.mirrored" name="org.eclipse.osgi" rev="${org.eclipse.osgi}" conf="provided->compile"/>
+        <dependency org="org.springframework" name="org.springframework.beans" rev="${org.springframework}" conf="provided->compile"/>
+        <dependency org="org.springframework" name="org.springframework.context" rev="${org.springframework}" conf="provided->compile"/>
+        <dependency org="org.springframework" name="org.springframework.context.support" rev="${org.springframework}" conf="provided->compile"/>
+        <dependency org="org.springframework" name="org.springframework.core" rev="${org.springframework}" conf="provided->compile"/>
+		<dependency org="org.springframework.osgi" name="org.springframework.osgi.core" rev="${org.springframework.osgi}" conf="provided->compile"/>
+		
+		<override org="org.springframework" rev="${org.springframework}"/>
+	</dependencies>
+
+</ivy-module>
diff --git a/kernel/test-apps/quartz-scheduler/quartz.bundle.a/src/main/java/quartz/bundle/a/Service.java b/kernel/test-apps/quartz-scheduler/quartz.bundle.a/src/main/java/quartz/bundle/a/Service.java
new file mode 100644
index 0000000..5ac6b33
--- /dev/null
+++ b/kernel/test-apps/quartz-scheduler/quartz.bundle.a/src/main/java/quartz/bundle/a/Service.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package quartz.bundle.a;
+
+import org.quartz.Scheduler;
+
+/**
+ * Simple test service to serve as a scheduled job.
+ * 
+ */
+public interface Service {
+
+    int getCount();
+
+    Scheduler getScheduler();
+
+    void process();
+
+}
diff --git a/kernel/test-apps/quartz-scheduler/quartz.bundle.a/src/main/java/quartz/bundle/a/internal/StandardService.java b/kernel/test-apps/quartz-scheduler/quartz.bundle.a/src/main/java/quartz/bundle/a/internal/StandardService.java
new file mode 100644
index 0000000..c438287
--- /dev/null
+++ b/kernel/test-apps/quartz-scheduler/quartz.bundle.a/src/main/java/quartz/bundle/a/internal/StandardService.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package quartz.bundle.a.internal;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.quartz.Scheduler;
+import org.springframework.beans.BeansException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+
+import quartz.bundle.a.Service;
+
+/**
+ */
+public class StandardService implements Service, ApplicationContextAware {
+
+    private final AtomicInteger count = new AtomicInteger(0);
+
+    private ApplicationContext applicationContext;
+
+    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+        this.applicationContext = applicationContext;
+    }
+
+    public int getCount() {
+        return this.count.get();
+    }
+
+    public Scheduler getScheduler() {
+        return (Scheduler) this.applicationContext.getBean("schedulerFactoryBean");
+    }
+
+    public void process() {
+        System.err.println(getClass().getName() + " called " + this.count.incrementAndGet() + " times.");
+    }
+
+}
diff --git a/kernel/test-apps/quartz-scheduler/quartz.bundle.a/src/main/resources/META-INF/MANIFEST.MF b/kernel/test-apps/quartz-scheduler/quartz.bundle.a/src/main/resources/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..b3b5f7c
--- /dev/null
+++ b/kernel/test-apps/quartz-scheduler/quartz.bundle.a/src/main/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,7 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: quartz.bundle.a
+Bundle-Version: 1.0.0
+Import-Bundle: com.springsource.org.quartz;version="[1.6.0,1.6.0]"
+Import-Library: org.springframework.spring;version="[2.5.5,4.0.0)"
+Export-Package: quartz.bundle.a
diff --git a/kernel/test-apps/quartz-scheduler/quartz.bundle.a/src/main/resources/META-INF/spring/module-context.xml b/kernel/test-apps/quartz-scheduler/quartz.bundle.a/src/main/resources/META-INF/spring/module-context.xml
new file mode 100644
index 0000000..2dcfaca
--- /dev/null
+++ b/kernel/test-apps/quartz-scheduler/quartz.bundle.a/src/main/resources/META-INF/spring/module-context.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<beans xmlns="http://www.springframework.org/schema/beans"

+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

+	xsi:schemaLocation="

+		http://www.springframework.org/schema/beans

+		http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

+	<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">

+		<property name="jobDetail" ref="jobDetail" />

+		<property name="startDelay" value="500" />

+		<property name="repeatInterval" value="1000" />

+	</bean>

+	<bean id="jobDetail"

+		class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">

+		<property name="targetObject" ref="service" />

+		<property name="targetMethod" value="process" />

+		<property name="concurrent" value="false" />

+	</bean>

+	<bean id="schedulerFactoryBean"

+		class="org.springframework.scheduling.quartz.SchedulerFactoryBean">

+		<property name="schedulerName" value="QuartzScheduler-A" />

+		<property name="triggers">

+			<list>

+				<ref bean="simpleTrigger" />

+			</list>

+		</property>

+	</bean>

+	<bean id="service" class="quartz.bundle.a.internal.StandardService" />

+</beans>
diff --git a/kernel/test-apps/quartz-scheduler/quartz.bundle.a/src/main/resources/META-INF/spring/osgi-context.xml b/kernel/test-apps/quartz-scheduler/quartz.bundle.a/src/main/resources/META-INF/spring/osgi-context.xml
new file mode 100644
index 0000000..d78e2bd
--- /dev/null
+++ b/kernel/test-apps/quartz-scheduler/quartz.bundle.a/src/main/resources/META-INF/spring/osgi-context.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans:beans xmlns="http://www.springframework.org/schema/osgi"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"
+	xsi:schemaLocation="
+		http://www.springframework.org/schema/beans
+		http://www.springframework.org/schema/beans/spring-beans.xsd
+		http://www.springframework.org/schema/osgi
+		http://www.springframework.org/schema/osgi/spring-osgi.xsd">
+
+	<service ref="service" interface="quartz.bundle.a.Service" />
+
+</beans:beans>
diff --git a/kernel/test-apps/quartz-scheduler/quartz.bundle.b/build.xml b/kernel/test-apps/quartz-scheduler/quartz.bundle.b/build.xml
new file mode 100644
index 0000000..04c4a7b
--- /dev/null
+++ b/kernel/test-apps/quartz-scheduler/quartz.bundle.b/build.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="quartz.bundle.b">
+
+	<property file="${basedir}/../../build.properties"/>
+    <property file="${basedir}/../../../build.versions"/>
+    <property name="jar.output.file" value="${basedir}/../../../org.eclipse.virgo.kernel.deployer.test/src/test/resources/quartz/quartz.bundle.b.jar"/>
+    <import file="${basedir}/../../../virgo-build/standard/default.xml"/>
+
+</project>
diff --git a/kernel/test-apps/quartz-scheduler/quartz.bundle.b/ivy.xml b/kernel/test-apps/quartz-scheduler/quartz.bundle.b/ivy.xml
new file mode 100644
index 0000000..88b2157
--- /dev/null
+++ b/kernel/test-apps/quartz-scheduler/quartz.bundle.b/ivy.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="http://ivyrep.jayasoft.org/ivy-doc.xsl"?>
+<ivy-module
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:noNamespaceSchemaLocation="http://incubator.apache.org/ivy/schemas/ivy.xsd"
+		version="1.3">
+
+	<info organisation="${project.organisation}" module="${ant.project.name}">
+		<ivyauthor name="sbrannen"/>
+	</info>
+
+	<configurations>
+		<include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>
+	</configurations>
+
+	<publications>
+	</publications>
+
+	<dependencies>
+		<dependency org="com.opensymphony.quartz" name="com.springsource.org.quartz" rev="${com.opensymphony.quartz}" conf="provided->compile"/>
+		<dependency org="org.eclipse.virgo.mirrored" name="org.eclipse.osgi" rev="${org.eclipse.osgi}" conf="provided->compile"/>
+        <dependency org="org.springframework" name="org.springframework.beans" rev="${org.springframework}" conf="provided->compile"/>
+        <dependency org="org.springframework" name="org.springframework.context" rev="${org.springframework}" conf="provided->compile"/>
+        <dependency org="org.springframework" name="org.springframework.context.support" rev="${org.springframework}" conf="provided->compile"/>
+        <dependency org="org.springframework" name="org.springframework.core" rev="${org.springframework}" conf="provided->compile"/>
+		<dependency org="org.springframework.osgi" name="org.springframework.osgi.core" rev="${org.springframework.osgi}" conf="provided->compile"/>
+		
+		<override org="org.springframework" rev="${org.springframework}"/>
+	</dependencies>
+
+</ivy-module>
diff --git a/kernel/test-apps/quartz-scheduler/quartz.bundle.b/src/main/java/quartz/bundle/b/Service.java b/kernel/test-apps/quartz-scheduler/quartz.bundle.b/src/main/java/quartz/bundle/b/Service.java
new file mode 100644
index 0000000..aed2555
--- /dev/null
+++ b/kernel/test-apps/quartz-scheduler/quartz.bundle.b/src/main/java/quartz/bundle/b/Service.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package quartz.bundle.b;
+
+import org.quartz.Scheduler;
+
+/**
+ * Simple test service to serve as a scheduled job.
+ * 
+ */
+public interface Service {
+
+    int getCount();
+
+    Scheduler getScheduler();
+
+    void process();
+
+}
diff --git a/kernel/test-apps/quartz-scheduler/quartz.bundle.b/src/main/java/quartz/bundle/b/internal/StandardService.java b/kernel/test-apps/quartz-scheduler/quartz.bundle.b/src/main/java/quartz/bundle/b/internal/StandardService.java
new file mode 100644
index 0000000..707d068
--- /dev/null
+++ b/kernel/test-apps/quartz-scheduler/quartz.bundle.b/src/main/java/quartz/bundle/b/internal/StandardService.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package quartz.bundle.b.internal;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.quartz.Scheduler;
+import org.springframework.beans.BeansException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+
+import quartz.bundle.b.Service;
+
+/**
+ */
+public class StandardService implements Service, ApplicationContextAware {
+
+    private final AtomicInteger count = new AtomicInteger(0);
+
+    private ApplicationContext applicationContext;
+
+    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+        this.applicationContext = applicationContext;
+    }
+
+    public int getCount() {
+        return this.count.get();
+    }
+
+    public Scheduler getScheduler() {
+        return (Scheduler) this.applicationContext.getBean("schedulerFactoryBean");
+    }
+
+    public void process() {
+        System.err.println(getClass().getName() + " called " + this.count.incrementAndGet() + " times.");
+    }
+
+}
diff --git a/kernel/test-apps/quartz-scheduler/quartz.bundle.b/src/main/resources/META-INF/MANIFEST.MF b/kernel/test-apps/quartz-scheduler/quartz.bundle.b/src/main/resources/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..f6e5c60
--- /dev/null
+++ b/kernel/test-apps/quartz-scheduler/quartz.bundle.b/src/main/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,7 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: quartz.bundle.b
+Bundle-Version: 1.0.0
+Import-Bundle: com.springsource.org.quartz;version="[1.6.0,1.6.0]"
+Import-Library: org.springframework.spring;version="[2.5.5,4.0.0)"
+Export-Package: quartz.bundle.b
diff --git a/kernel/test-apps/quartz-scheduler/quartz.bundle.b/src/main/resources/META-INF/spring/module-context.xml b/kernel/test-apps/quartz-scheduler/quartz.bundle.b/src/main/resources/META-INF/spring/module-context.xml
new file mode 100644
index 0000000..d088934
--- /dev/null
+++ b/kernel/test-apps/quartz-scheduler/quartz.bundle.b/src/main/resources/META-INF/spring/module-context.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<beans xmlns="http://www.springframework.org/schema/beans"

+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

+	xsi:schemaLocation="

+		http://www.springframework.org/schema/beans

+		http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

+	<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">

+		<property name="jobDetail" ref="jobDetail" />

+		<property name="startDelay" value="500" />

+		<property name="repeatInterval" value="1000" />

+	</bean>

+	<bean id="jobDetail"

+		class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">

+		<property name="targetObject" ref="service" />

+		<property name="targetMethod" value="process" />

+		<property name="concurrent" value="false" />

+	</bean>

+	<bean id="schedulerFactoryBean"

+		class="org.springframework.scheduling.quartz.SchedulerFactoryBean">

+		<property name="schedulerName" value="QuartzScheduler-B" />

+		<property name="triggers">

+			<list>

+				<ref bean="simpleTrigger" />

+			</list>

+		</property>

+	</bean>

+	<bean id="service" class="quartz.bundle.b.internal.StandardService" />

+</beans>
diff --git a/kernel/test-apps/quartz-scheduler/quartz.bundle.b/src/main/resources/META-INF/spring/osgi-context.xml b/kernel/test-apps/quartz-scheduler/quartz.bundle.b/src/main/resources/META-INF/spring/osgi-context.xml
new file mode 100644
index 0000000..f8f283b
--- /dev/null
+++ b/kernel/test-apps/quartz-scheduler/quartz.bundle.b/src/main/resources/META-INF/spring/osgi-context.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans:beans xmlns="http://www.springframework.org/schema/osgi"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"
+	xsi:schemaLocation="
+		http://www.springframework.org/schema/beans
+		http://www.springframework.org/schema/beans/spring-beans.xsd
+		http://www.springframework.org/schema/osgi
+		http://www.springframework.org/schema/osgi/spring-osgi.xsd">
+
+	<service ref="service" interface="quartz.bundle.b.Service" />
+
+</beans:beans>
diff --git a/kernel/test-apps/quartz-scheduler/quartz.bundle.same1/build.xml b/kernel/test-apps/quartz-scheduler/quartz.bundle.same1/build.xml
new file mode 100644
index 0000000..93411a9
--- /dev/null
+++ b/kernel/test-apps/quartz-scheduler/quartz.bundle.same1/build.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="quartz.bundle.same1">
+
+	<property file="${basedir}/../../build.properties"/>
+    <property file="${basedir}/../../../build.versions"/>
+    <property name="jar.output.file" value="${basedir}/../../../org.eclipse.virgo.kernel.deployer.test/src/test/resources/quartz/quartz.bundle.same1.jar"/>
+    <import file="${basedir}/../../../virgo-build/standard/default.xml"/>
+
+</project>
diff --git a/kernel/test-apps/quartz-scheduler/quartz.bundle.same1/ivy.xml b/kernel/test-apps/quartz-scheduler/quartz.bundle.same1/ivy.xml
new file mode 100644
index 0000000..88b2157
--- /dev/null
+++ b/kernel/test-apps/quartz-scheduler/quartz.bundle.same1/ivy.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="http://ivyrep.jayasoft.org/ivy-doc.xsl"?>
+<ivy-module
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:noNamespaceSchemaLocation="http://incubator.apache.org/ivy/schemas/ivy.xsd"
+		version="1.3">
+
+	<info organisation="${project.organisation}" module="${ant.project.name}">
+		<ivyauthor name="sbrannen"/>
+	</info>
+
+	<configurations>
+		<include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>
+	</configurations>
+
+	<publications>
+	</publications>
+
+	<dependencies>
+		<dependency org="com.opensymphony.quartz" name="com.springsource.org.quartz" rev="${com.opensymphony.quartz}" conf="provided->compile"/>
+		<dependency org="org.eclipse.virgo.mirrored" name="org.eclipse.osgi" rev="${org.eclipse.osgi}" conf="provided->compile"/>
+        <dependency org="org.springframework" name="org.springframework.beans" rev="${org.springframework}" conf="provided->compile"/>
+        <dependency org="org.springframework" name="org.springframework.context" rev="${org.springframework}" conf="provided->compile"/>
+        <dependency org="org.springframework" name="org.springframework.context.support" rev="${org.springframework}" conf="provided->compile"/>
+        <dependency org="org.springframework" name="org.springframework.core" rev="${org.springframework}" conf="provided->compile"/>
+		<dependency org="org.springframework.osgi" name="org.springframework.osgi.core" rev="${org.springframework.osgi}" conf="provided->compile"/>
+		
+		<override org="org.springframework" rev="${org.springframework}"/>
+	</dependencies>
+
+</ivy-module>
diff --git a/kernel/test-apps/quartz-scheduler/quartz.bundle.same1/src/main/java/quartz/bundle/same1/Service.java b/kernel/test-apps/quartz-scheduler/quartz.bundle.same1/src/main/java/quartz/bundle/same1/Service.java
new file mode 100644
index 0000000..66f43b5
--- /dev/null
+++ b/kernel/test-apps/quartz-scheduler/quartz.bundle.same1/src/main/java/quartz/bundle/same1/Service.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package quartz.bundle.same1;
+
+import org.quartz.Scheduler;
+
+/**
+ * Simple test service to serve as a scheduled job.
+ * 
+ */
+public interface Service {
+
+    int getCount();
+
+    Scheduler getScheduler();
+
+    void process();
+
+}
diff --git a/kernel/test-apps/quartz-scheduler/quartz.bundle.same1/src/main/java/quartz/bundle/same1/internal/StandardService.java b/kernel/test-apps/quartz-scheduler/quartz.bundle.same1/src/main/java/quartz/bundle/same1/internal/StandardService.java
new file mode 100644
index 0000000..36db66a
--- /dev/null
+++ b/kernel/test-apps/quartz-scheduler/quartz.bundle.same1/src/main/java/quartz/bundle/same1/internal/StandardService.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package quartz.bundle.same1.internal;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.quartz.Scheduler;
+import org.springframework.beans.BeansException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+
+import quartz.bundle.same1.Service;
+
+/**
+ */
+public class StandardService implements Service, ApplicationContextAware {
+
+    private final AtomicInteger count = new AtomicInteger(0);
+
+    private ApplicationContext applicationContext;
+
+    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+        this.applicationContext = applicationContext;
+    }
+
+    public int getCount() {
+        return this.count.get();
+    }
+
+    public Scheduler getScheduler() {
+        return (Scheduler) this.applicationContext.getBean("schedulerFactoryBean");
+    }
+
+    public void process() {
+        System.err.println(getClass().getName() + " called " + this.count.incrementAndGet() + " times.");
+    }
+
+}
diff --git a/kernel/test-apps/quartz-scheduler/quartz.bundle.same1/src/main/resources/META-INF/MANIFEST.MF b/kernel/test-apps/quartz-scheduler/quartz.bundle.same1/src/main/resources/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..66218ca
--- /dev/null
+++ b/kernel/test-apps/quartz-scheduler/quartz.bundle.same1/src/main/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,7 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: quartz.bundle.same1
+Bundle-Version: 1.0.0
+Import-Bundle: com.springsource.org.quartz;version="[1.6.0,1.6.0]"
+Import-Library: org.springframework.spring;version="[2.5.5,4.0.0)"
+Export-Package: quartz.bundle.same1
diff --git a/kernel/test-apps/quartz-scheduler/quartz.bundle.same1/src/main/resources/META-INF/spring/module-context.xml b/kernel/test-apps/quartz-scheduler/quartz.bundle.same1/src/main/resources/META-INF/spring/module-context.xml
new file mode 100644
index 0000000..635e571
--- /dev/null
+++ b/kernel/test-apps/quartz-scheduler/quartz.bundle.same1/src/main/resources/META-INF/spring/module-context.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<beans xmlns="http://www.springframework.org/schema/beans"

+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

+	xsi:schemaLocation="

+		http://www.springframework.org/schema/beans

+		http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

+	<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">

+		<property name="jobDetail" ref="jobDetail" />

+		<property name="startDelay" value="500" />

+		<property name="repeatInterval" value="1000" />

+	</bean>

+	<bean id="jobDetail"

+		class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">

+		<property name="targetObject" ref="service" />

+		<property name="targetMethod" value="process" />

+		<property name="concurrent" value="false" />

+	</bean>

+	<bean id="schedulerFactoryBean"

+		class="org.springframework.scheduling.quartz.SchedulerFactoryBean">

+		<property name="triggers">

+			<list>

+				<ref bean="simpleTrigger" />

+			</list>

+		</property>

+	</bean>

+	<bean id="service" class="quartz.bundle.same1.internal.StandardService" />

+</beans>
diff --git a/kernel/test-apps/quartz-scheduler/quartz.bundle.same1/src/main/resources/META-INF/spring/osgi-context.xml b/kernel/test-apps/quartz-scheduler/quartz.bundle.same1/src/main/resources/META-INF/spring/osgi-context.xml
new file mode 100644
index 0000000..0b42dcb
--- /dev/null
+++ b/kernel/test-apps/quartz-scheduler/quartz.bundle.same1/src/main/resources/META-INF/spring/osgi-context.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans:beans xmlns="http://www.springframework.org/schema/osgi"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"
+	xsi:schemaLocation="
+		http://www.springframework.org/schema/beans
+		http://www.springframework.org/schema/beans/spring-beans.xsd
+		http://www.springframework.org/schema/osgi
+		http://www.springframework.org/schema/osgi/spring-osgi.xsd">
+
+	<service ref="service" interface="quartz.bundle.same1.Service" />
+
+</beans:beans>
diff --git a/kernel/test-apps/quartz-scheduler/quartz.bundle.same2/build.xml b/kernel/test-apps/quartz-scheduler/quartz.bundle.same2/build.xml
new file mode 100644
index 0000000..9c3b4dd
--- /dev/null
+++ b/kernel/test-apps/quartz-scheduler/quartz.bundle.same2/build.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="quartz.bundle.same2">
+
+	<property file="${basedir}/../../build.properties"/>
+    <property file="${basedir}/../../../build.versions"/>
+    <property name="jar.output.file" value="${basedir}/../../../org.eclipse.virgo.kernel.deployer.test/src/test/resources/quartz/quartz.bundle.same2.jar"/>
+    <import file="${basedir}/../../../virgo-build/standard/default.xml"/>
+
+</project>
diff --git a/kernel/test-apps/quartz-scheduler/quartz.bundle.same2/ivy.xml b/kernel/test-apps/quartz-scheduler/quartz.bundle.same2/ivy.xml
new file mode 100644
index 0000000..88b2157
--- /dev/null
+++ b/kernel/test-apps/quartz-scheduler/quartz.bundle.same2/ivy.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="http://ivyrep.jayasoft.org/ivy-doc.xsl"?>
+<ivy-module
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:noNamespaceSchemaLocation="http://incubator.apache.org/ivy/schemas/ivy.xsd"
+		version="1.3">
+
+	<info organisation="${project.organisation}" module="${ant.project.name}">
+		<ivyauthor name="sbrannen"/>
+	</info>
+
+	<configurations>
+		<include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>
+	</configurations>
+
+	<publications>
+	</publications>
+
+	<dependencies>
+		<dependency org="com.opensymphony.quartz" name="com.springsource.org.quartz" rev="${com.opensymphony.quartz}" conf="provided->compile"/>
+		<dependency org="org.eclipse.virgo.mirrored" name="org.eclipse.osgi" rev="${org.eclipse.osgi}" conf="provided->compile"/>
+        <dependency org="org.springframework" name="org.springframework.beans" rev="${org.springframework}" conf="provided->compile"/>
+        <dependency org="org.springframework" name="org.springframework.context" rev="${org.springframework}" conf="provided->compile"/>
+        <dependency org="org.springframework" name="org.springframework.context.support" rev="${org.springframework}" conf="provided->compile"/>
+        <dependency org="org.springframework" name="org.springframework.core" rev="${org.springframework}" conf="provided->compile"/>
+		<dependency org="org.springframework.osgi" name="org.springframework.osgi.core" rev="${org.springframework.osgi}" conf="provided->compile"/>
+		
+		<override org="org.springframework" rev="${org.springframework}"/>
+	</dependencies>
+
+</ivy-module>
diff --git a/kernel/test-apps/quartz-scheduler/quartz.bundle.same2/src/main/java/quartz/bundle/same2/Service.java b/kernel/test-apps/quartz-scheduler/quartz.bundle.same2/src/main/java/quartz/bundle/same2/Service.java
new file mode 100644
index 0000000..1e35709
--- /dev/null
+++ b/kernel/test-apps/quartz-scheduler/quartz.bundle.same2/src/main/java/quartz/bundle/same2/Service.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package quartz.bundle.same2;
+
+import org.quartz.Scheduler;
+
+/**
+ * Simple test service to serve as a scheduled job.
+ * 
+ */
+public interface Service {
+
+    int getCount();
+
+    Scheduler getScheduler();
+
+    void process();
+
+}
diff --git a/kernel/test-apps/quartz-scheduler/quartz.bundle.same2/src/main/java/quartz/bundle/same2/internal/StandardService.java b/kernel/test-apps/quartz-scheduler/quartz.bundle.same2/src/main/java/quartz/bundle/same2/internal/StandardService.java
new file mode 100644
index 0000000..c848cde
--- /dev/null
+++ b/kernel/test-apps/quartz-scheduler/quartz.bundle.same2/src/main/java/quartz/bundle/same2/internal/StandardService.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package quartz.bundle.same2.internal;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.quartz.Scheduler;
+import org.springframework.beans.BeansException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+
+import quartz.bundle.same2.Service;
+
+/**
+ */
+public class StandardService implements Service, ApplicationContextAware {
+
+    private final AtomicInteger count = new AtomicInteger(0);
+
+    private ApplicationContext applicationContext;
+
+    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+        this.applicationContext = applicationContext;
+    }
+
+    public int getCount() {
+        return this.count.get();
+    }
+
+    public Scheduler getScheduler() {
+        return (Scheduler) this.applicationContext.getBean("schedulerFactoryBean");
+    }
+
+    public void process() {
+        System.err.println(getClass().getName() + " called " + this.count.incrementAndGet() + " times.");
+    }
+
+}
diff --git a/kernel/test-apps/quartz-scheduler/quartz.bundle.same2/src/main/resources/META-INF/MANIFEST.MF b/kernel/test-apps/quartz-scheduler/quartz.bundle.same2/src/main/resources/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..0a66878
--- /dev/null
+++ b/kernel/test-apps/quartz-scheduler/quartz.bundle.same2/src/main/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,7 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: quartz.bundle.same2
+Bundle-Version: 1.0.0
+Import-Bundle: com.springsource.org.quartz;version="[1.6.0,1.6.0]"
+Import-Library: org.springframework.spring;version="[2.5.5,4.0.0)"
+Export-Package: quartz.bundle.same2
diff --git a/kernel/test-apps/quartz-scheduler/quartz.bundle.same2/src/main/resources/META-INF/spring/module-context.xml b/kernel/test-apps/quartz-scheduler/quartz.bundle.same2/src/main/resources/META-INF/spring/module-context.xml
new file mode 100644
index 0000000..6784bb0
--- /dev/null
+++ b/kernel/test-apps/quartz-scheduler/quartz.bundle.same2/src/main/resources/META-INF/spring/module-context.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<beans xmlns="http://www.springframework.org/schema/beans"

+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

+	xsi:schemaLocation="

+		http://www.springframework.org/schema/beans

+		http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

+	<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">

+		<property name="jobDetail" ref="jobDetail" />

+		<property name="startDelay" value="500" />

+		<property name="repeatInterval" value="1000" />

+	</bean>

+	<bean id="jobDetail"

+		class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">

+		<property name="targetObject" ref="service" />

+		<property name="targetMethod" value="process" />

+		<property name="concurrent" value="false" />

+	</bean>

+	<bean id="schedulerFactoryBean"

+		class="org.springframework.scheduling.quartz.SchedulerFactoryBean">

+		<property name="triggers">

+			<list>

+				<ref bean="simpleTrigger" />

+			</list>

+		</property>

+	</bean>

+	<bean id="service" class="quartz.bundle.same2.internal.StandardService" />

+</beans>
diff --git a/kernel/test-apps/quartz-scheduler/quartz.bundle.same2/src/main/resources/META-INF/spring/osgi-context.xml b/kernel/test-apps/quartz-scheduler/quartz.bundle.same2/src/main/resources/META-INF/spring/osgi-context.xml
new file mode 100644
index 0000000..ccf6356
--- /dev/null
+++ b/kernel/test-apps/quartz-scheduler/quartz.bundle.same2/src/main/resources/META-INF/spring/osgi-context.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans:beans xmlns="http://www.springframework.org/schema/osgi"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"
+	xsi:schemaLocation="
+		http://www.springframework.org/schema/beans
+		http://www.springframework.org/schema/beans/spring-beans.xsd
+		http://www.springframework.org/schema/osgi
+		http://www.springframework.org/schema/osgi/spring-osgi.xsd">
+
+	<service ref="service" interface="quartz.bundle.same2.Service" />
+
+</beans:beans>
diff --git a/kernel/test-apps/redeploy-refresh/simple.bundle.bad/build.xml b/kernel/test-apps/redeploy-refresh/simple.bundle.bad/build.xml
new file mode 100644
index 0000000..0b56553
--- /dev/null
+++ b/kernel/test-apps/redeploy-refresh/simple.bundle.bad/build.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="simple.module.bad">
+
+	<property file="${basedir}/../../build.properties"/>
+    <property file="${basedir}/../../../build.versions"/>
+	<property name="jar.output.file" value="${basedir}/../../../org.eclipse.virgo.kernel.deployer.test/src/test/resources/redeploy-refresh/bad/simple.module.jar"/>
+	<import file="${basedir}/../../../virgo-build/standard/default.xml"/>
+
+</project>
diff --git a/kernel/test-apps/redeploy-refresh/simple.bundle.bad/ivy.xml b/kernel/test-apps/redeploy-refresh/simple.bundle.bad/ivy.xml
new file mode 100644
index 0000000..470d1c5
--- /dev/null
+++ b/kernel/test-apps/redeploy-refresh/simple.bundle.bad/ivy.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="http://ivyrep.jayasoft.org/ivy-doc.xsl"?>
+<ivy-module
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:noNamespaceSchemaLocation="http://incubator.apache.org/ivy/schemas/ivy.xsd"
+		version="1.3">
+
+	<info organisation="${project.organisation}" module="${ant.project.name}">
+		<ivyauthor name="gnormington"/>
+	</info>
+
+	<configurations>
+		<include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>
+	</configurations>
+
+	<publications>
+	</publications>
+
+	<dependencies>
+	</dependencies>
+
+</ivy-module>
diff --git a/kernel/test-apps/redeploy-refresh/simple.bundle.bad/src/main/java/.gitignore b/kernel/test-apps/redeploy-refresh/simple.bundle.bad/src/main/java/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/test-apps/redeploy-refresh/simple.bundle.bad/src/main/java/.gitignore
diff --git a/kernel/test-apps/redeploy-refresh/simple.bundle.bad/src/main/resources/META-INF/MANIFEST.MF b/kernel/test-apps/redeploy-refresh/simple.bundle.bad/src/main/resources/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..8b20b43
--- /dev/null
+++ b/kernel/test-apps/redeploy-refresh/simple.bundle.bad/src/main/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: simple.module
+Bundle-Version: 2
+Import-Package: no.such.package
+
diff --git a/kernel/test-apps/redeploy-refresh/simple.bundle.ok/build.xml b/kernel/test-apps/redeploy-refresh/simple.bundle.ok/build.xml
new file mode 100644
index 0000000..a9bf9e7
--- /dev/null
+++ b/kernel/test-apps/redeploy-refresh/simple.bundle.ok/build.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="simple.module.good">
+
+	<property file="${basedir}/../../build.properties"/>
+    <property file="${basedir}/../../../build.versions"/>
+	<property name="jar.output.file" value="${basedir}/../../../org.eclipse.virgo.kernel.deployer.test/src/test/resources/redeploy-refresh/good/simple.module.jar"/>
+	<import file="${basedir}/../../../virgo-build/standard/default.xml"/>
+
+</project>
diff --git a/kernel/test-apps/redeploy-refresh/simple.bundle.ok/ivy.xml b/kernel/test-apps/redeploy-refresh/simple.bundle.ok/ivy.xml
new file mode 100644
index 0000000..470d1c5
--- /dev/null
+++ b/kernel/test-apps/redeploy-refresh/simple.bundle.ok/ivy.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="http://ivyrep.jayasoft.org/ivy-doc.xsl"?>
+<ivy-module
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:noNamespaceSchemaLocation="http://incubator.apache.org/ivy/schemas/ivy.xsd"
+		version="1.3">
+
+	<info organisation="${project.organisation}" module="${ant.project.name}">
+		<ivyauthor name="gnormington"/>
+	</info>
+
+	<configurations>
+		<include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>
+	</configurations>
+
+	<publications>
+	</publications>
+
+	<dependencies>
+	</dependencies>
+
+</ivy-module>
diff --git a/kernel/test-apps/redeploy-refresh/simple.bundle.ok/src/main/java/.gitignore b/kernel/test-apps/redeploy-refresh/simple.bundle.ok/src/main/java/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/test-apps/redeploy-refresh/simple.bundle.ok/src/main/java/.gitignore
diff --git a/kernel/test-apps/redeploy-refresh/simple.bundle.ok/src/main/resources/META-INF/MANIFEST.MF b/kernel/test-apps/redeploy-refresh/simple.bundle.ok/src/main/resources/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..69145de
--- /dev/null
+++ b/kernel/test-apps/redeploy-refresh/simple.bundle.ok/src/main/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,4 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: simple.module
+Bundle-Version: 1
diff --git a/kernel/test-apps/redeploy-refresh/simple.bundle.ok/src/test/java/.gitignore b/kernel/test-apps/redeploy-refresh/simple.bundle.ok/src/test/java/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/test-apps/redeploy-refresh/simple.bundle.ok/src/test/java/.gitignore
diff --git a/kernel/test-apps/redeploy-refresh/simple.bundle.ok/src/test/resources/.gitignore b/kernel/test-apps/redeploy-refresh/simple.bundle.ok/src/test/resources/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/test-apps/redeploy-refresh/simple.bundle.ok/src/test/resources/.gitignore
diff --git a/kernel/test-apps/refresh/refresh-import-bundle/build-par/build.xml b/kernel/test-apps/refresh/refresh-import-bundle/build-par/build.xml
new file mode 100644
index 0000000..dc66b52
--- /dev/null
+++ b/kernel/test-apps/refresh/refresh-import-bundle/build-par/build.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="RefreshTest-Import-Bundle">
+	
+	<path id="bundles">
+		<pathelement location="../exporter"/>
+		<pathelement location="../importer"/>
+	</path>
+
+	<property file="${basedir}/../../../build.properties"/>
+	<property name="par.output.file" value="${basedir}/../../../../org.eclipse.virgo.kernel.deployer.test/src/test/resources/refresh-import-bundle.par"/>
+
+	<import file="${basedir}/../../../../virgo-build/par/default.xml"/>
+
+</project>
diff --git a/kernel/test-apps/refresh/refresh-import-bundle/exporter/build.xml b/kernel/test-apps/refresh/refresh-import-bundle/exporter/build.xml
new file mode 100644
index 0000000..b17100d
--- /dev/null
+++ b/kernel/test-apps/refresh/refresh-import-bundle/exporter/build.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="RefreshBundleExporter">
+
+	<property file="${basedir}/../../../build.properties"/>
+	<import file="${basedir}/../../../../virgo-build/standard/default.xml"/>
+
+</project>
diff --git a/kernel/test-apps/refresh/refresh-import-bundle/exporter/ivy.xml b/kernel/test-apps/refresh/refresh-import-bundle/exporter/ivy.xml
new file mode 100644
index 0000000..ae75255
--- /dev/null
+++ b/kernel/test-apps/refresh/refresh-import-bundle/exporter/ivy.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="http://ivyrep.jayasoft.org/ivy-doc.xsl"?>
+<ivy-module
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://incubator.apache.org/ivy/schemas/ivy.xsd" version="1.3">
+
+	<info organisation="${project.organisation}" module="${ant.project.name}">
+		<ivyauthor name="robharrop"/>
+	</info>
+
+	<configurations>
+		<include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>
+	</configurations>
+
+	<publications>
+	</publications>
+
+	<dependencies>
+	</dependencies>
+
+</ivy-module>
diff --git a/kernel/test-apps/refresh/refresh-import-bundle/exporter/src/main/java/refresh/exporter/b1/B11.java b/kernel/test-apps/refresh/refresh-import-bundle/exporter/src/main/java/refresh/exporter/b1/B11.java
new file mode 100644
index 0000000..f88b07a
--- /dev/null
+++ b/kernel/test-apps/refresh/refresh-import-bundle/exporter/src/main/java/refresh/exporter/b1/B11.java
@@ -0,0 +1,17 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package refresh.exporter.b1;
+
+
+public class B11 {
+
+}
diff --git a/kernel/test-apps/refresh/refresh-import-bundle/exporter/src/main/resources/META-INF/MANIFEST.MF b/kernel/test-apps/refresh/refresh-import-bundle/exporter/src/main/resources/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..0c5f9e7
--- /dev/null
+++ b/kernel/test-apps/refresh/refresh-import-bundle/exporter/src/main/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,8 @@
+Manifest-Version: 1.0
+Bundle-Name: RefreshExporter
+Created-By: 1.5.0_13 (Apple Computer, Inc.)
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: RefreshExporter
+Export-Package: refresh.exporter.b1
+Bundle-Version: 1
+
diff --git a/kernel/test-apps/refresh/refresh-import-bundle/importer/build.xml b/kernel/test-apps/refresh/refresh-import-bundle/importer/build.xml
new file mode 100644
index 0000000..bce235b
--- /dev/null
+++ b/kernel/test-apps/refresh/refresh-import-bundle/importer/build.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="RefreshBundleImporter">
+	
+	<property file="${basedir}/../../../build.properties"/>
+	<import file="${basedir}/../../../../virgo-build/standard/default.xml"/>
+
+</project>
diff --git a/kernel/test-apps/refresh/refresh-import-bundle/importer/ivy.xml b/kernel/test-apps/refresh/refresh-import-bundle/importer/ivy.xml
new file mode 100644
index 0000000..30ce576
--- /dev/null
+++ b/kernel/test-apps/refresh/refresh-import-bundle/importer/ivy.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="http://ivyrep.jayasoft.org/ivy-doc.xsl"?>
+<ivy-module
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:noNamespaceSchemaLocation="http://incubator.apache.org/ivy/schemas/ivy.xsd"
+		version="1.3">
+
+	<info organisation="${project.organisation}" module="${ant.project.name}">
+		<ivyauthor name="robharrop"/>
+	</info>
+
+	<configurations>
+		<include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>
+	</configurations>
+
+	<publications>
+	</publications>
+
+	<dependencies>
+		<dependency org="org.eclipse.virgo.kernel" name="org.eclipse.virgo.kernel.osgi" rev="latest.integration" conf="provided->compile"/>
+		<dependency org="org.eclipse.virgo.kernel" name="org.eclipse.virgo.kernel.deployer.test" rev="latest.integration" conf="provided->compile"/>
+	</dependencies>
+
+</ivy-module>
diff --git a/kernel/test-apps/refresh/refresh-import-bundle/importer/src/main/java/org/eclipse/virgo/kernel/deployer/test/LoadableClasses.java b/kernel/test-apps/refresh/refresh-import-bundle/importer/src/main/java/org/eclipse/virgo/kernel/deployer/test/LoadableClasses.java
new file mode 100644
index 0000000..e56913a
--- /dev/null
+++ b/kernel/test-apps/refresh/refresh-import-bundle/importer/src/main/java/org/eclipse/virgo/kernel/deployer/test/LoadableClasses.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import java.util.Set;
+
+public interface LoadableClasses {
+
+    Set<String> getLoadableClasses();
+
+}
diff --git a/kernel/test-apps/refresh/refresh-import-bundle/importer/src/main/java/refresh/importer/Importer.java b/kernel/test-apps/refresh/refresh-import-bundle/importer/src/main/java/refresh/importer/Importer.java
new file mode 100644
index 0000000..f1ed4d2
--- /dev/null
+++ b/kernel/test-apps/refresh/refresh-import-bundle/importer/src/main/java/refresh/importer/Importer.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package refresh.importer;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.osgi.framework.Bundle;
+
+import org.eclipse.virgo.kernel.deployer.test.LoadableClasses;
+import org.eclipse.virgo.kernel.osgi.framework.OsgiFramework;
+
+public class Importer implements LoadableClasses {
+
+    private final Set<String> loadableClasses = new HashSet<String>();
+
+    public Importer(OsgiFramework osgi) {
+        System.out.println("New Importer bean");
+        checkLoadClass("refresh.exporter.b1.B11");
+        checkLoadClass("refresh.exporter.b1.B12");
+        checkLoadClass("refresh.exporter.b2.B21");
+        Bundle[] bundles = osgi.getBundleContext().getBundles();
+        for (Bundle bundle : bundles) {
+            if (bundle.getSymbolicName().equals("RefreshTest-1-RefreshExporter")) {
+                System.out.println(bundle.getHeaders().get("bundle-version"));
+            }
+        }
+    }
+
+    private void checkLoadClass(String className) {
+        try {
+            this.getClass().getClassLoader().loadClass(className);
+            System.out.println(className + " is loadable");
+            loadableClasses.add(className);
+        } catch (ClassNotFoundException e) {
+            System.out.println(className + " is not loadable");
+        }
+    }
+
+    public Set<String> getLoadableClasses() {
+        return this.loadableClasses;
+    }
+
+}
diff --git a/kernel/test-apps/refresh/refresh-import-bundle/importer/src/main/resources/META-INF/MANIFEST.MF b/kernel/test-apps/refresh/refresh-import-bundle/importer/src/main/resources/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..4bc5342
--- /dev/null
+++ b/kernel/test-apps/refresh/refresh-import-bundle/importer/src/main/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,11 @@
+Manifest-Version: 1.0
+Bundle-Name: RefreshImporter
+Created-By: 1.5.0_13 (Apple Computer, Inc.)
+Import-Package: org.osgi.framework,
+ org.eclipse.virgo.kernel.deployer.test,
+ org.eclipse.virgo.kernel.osgi.framework
+Import-Bundle: RefreshExporter
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: RefreshImporter
+Bundle-Version: 1.0.0
+
diff --git a/kernel/test-apps/refresh/refresh-import-bundle/importer/src/main/resources/META-INF/spring/importer-context.xml b/kernel/test-apps/refresh/refresh-import-bundle/importer/src/main/resources/META-INF/spring/importer-context.xml
new file mode 100644
index 0000000..df598c1
--- /dev/null
+++ b/kernel/test-apps/refresh/refresh-import-bundle/importer/src/main/resources/META-INF/spring/importer-context.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans:beans xmlns="http://www.springframework.org/schema/osgi"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns:beans="http://www.springframework.org/schema/beans"
+	xsi:schemaLocation="http://www.springframework.org/schema/osgi  
+       http://www.springframework.org/schema/osgi/spring-osgi.xsd
+       http://www.springframework.org/schema/beans   
+       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
+
+	<reference id="osgiFramework"
+		interface="org.eclipse.virgo.kernel.osgi.framework.OsgiFramework" />
+
+	<beans:bean id="importer" class="refresh.importer.Importer">
+		<beans:constructor-arg ref="osgiFramework" />
+	</beans:bean>
+
+	<service ref="importer"
+		 interface="org.eclipse.virgo.kernel.deployer.test.LoadableClasses" />
+
+</beans:beans>
diff --git a/kernel/test-apps/refresh/refresh-import-bundle/src/main/resources/META-INF/MANIFEST.MF b/kernel/test-apps/refresh/refresh-import-bundle/src/main/resources/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..c1c1faa
--- /dev/null
+++ b/kernel/test-apps/refresh/refresh-import-bundle/src/main/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: refresh-import-bundle
diff --git a/kernel/test-apps/refresh/refresh/build-par/build.xml b/kernel/test-apps/refresh/refresh/build-par/build.xml
new file mode 100644
index 0000000..3b7e50e
--- /dev/null
+++ b/kernel/test-apps/refresh/refresh/build-par/build.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="RefreshTest">
+	
+	<path id="bundles">
+            <pathelement location="../exporter"/>
+            <pathelement location="../exporter2"/>
+            <pathelement location="../exporter3"/>
+            <pathelement location="../importer"/>
+    </path>
+
+	<property file="${basedir}/../../../build.properties"/>
+    <property file="${basedir}/../../../../build.versions"/>
+	<property name="par.expanded.dir" value="${basedir}/target/par-expanded"/>
+	<import file="${basedir}/../../../../virgo-build/par/default.xml"/>
+
+	<target name="jar">
+		<all-bundles target="jar"/>
+		
+		<mkdir dir="${par.expanded.dir}/build"/>		
+		<copy todir="${par.expanded.dir}" file="../importer/target/artifacts/RefreshImporter.jar"/>
+		<copy todir="${par.expanded.dir}" file="../exporter/target/artifacts/RefreshExporter.jar"/>
+		<copy todir="${par.expanded.dir}/build" file="../exporter2/target/artifacts/RefreshExporterv2.jar"/>
+		<copy todir="${par.expanded.dir}/build" file="../exporter3/target/artifacts/RefreshExporterv3.jar"/>
+		
+     	<mkdir dir="${basedir}/target/artifacts"/>		
+		<jar destfile="${basedir}/target/artifacts/refresh.par">
+			<fileset dir="${par.expanded.dir}" includes="**/*"/>
+			<manifest>
+				<attribute name="Application-Version" value="1.0"/>
+				<attribute name="Application-SymbolicName" value="${ant.project.name}"/>
+			</manifest>
+		</jar>
+		
+		<copy todir="${basedir}/../../../../org.eclipse.virgo.kernel.deployer.test/src/test/resources" file="target/artifacts/refresh.par"/>
+				
+	</target>
+
+</project>
diff --git a/kernel/test-apps/refresh/refresh/exporter/build.xml b/kernel/test-apps/refresh/refresh/exporter/build.xml
new file mode 100644
index 0000000..dcb90cf
--- /dev/null
+++ b/kernel/test-apps/refresh/refresh/exporter/build.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="RefreshExporter">
+
+	<property file="${basedir}/../../../build.properties"/>
+    <property file="${basedir}/../../../../build.versions"/>
+
+	<import file="${basedir}/../../../../virgo-build/standard/default.xml"/>
+
+</project>
diff --git a/kernel/test-apps/refresh/refresh/exporter/ivy.xml b/kernel/test-apps/refresh/refresh/exporter/ivy.xml
new file mode 100644
index 0000000..5729da0
--- /dev/null
+++ b/kernel/test-apps/refresh/refresh/exporter/ivy.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="http://ivyrep.jayasoft.org/ivy-doc.xsl"?>
+<ivy-module
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:noNamespaceSchemaLocation="http://incubator.apache.org/ivy/schemas/ivy.xsd"
+		version="1.3">
+
+	<info organisation="${project.organisation}" module="${ant.project.name}">
+		<ivyauthor name="robharrop"/>
+	</info>
+
+	<configurations>
+		<include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>
+	</configurations>
+
+	<publications>
+	</publications>
+
+	<dependencies/>
+
+</ivy-module>
diff --git a/kernel/test-apps/refresh/refresh/exporter/src/main/java/refresh/exporter/b1/B11.java b/kernel/test-apps/refresh/refresh/exporter/src/main/java/refresh/exporter/b1/B11.java
new file mode 100644
index 0000000..f88b07a
--- /dev/null
+++ b/kernel/test-apps/refresh/refresh/exporter/src/main/java/refresh/exporter/b1/B11.java
@@ -0,0 +1,17 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package refresh.exporter.b1;
+
+
+public class B11 {
+
+}
diff --git a/kernel/test-apps/refresh/refresh/exporter/src/main/resources/META-INF/MANIFEST.MF b/kernel/test-apps/refresh/refresh/exporter/src/main/resources/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..0c5f9e7
--- /dev/null
+++ b/kernel/test-apps/refresh/refresh/exporter/src/main/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,8 @@
+Manifest-Version: 1.0
+Bundle-Name: RefreshExporter
+Created-By: 1.5.0_13 (Apple Computer, Inc.)
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: RefreshExporter
+Export-Package: refresh.exporter.b1
+Bundle-Version: 1
+
diff --git a/kernel/test-apps/refresh/refresh/exporter2/build.xml b/kernel/test-apps/refresh/refresh/exporter2/build.xml
new file mode 100644
index 0000000..501fa85
--- /dev/null
+++ b/kernel/test-apps/refresh/refresh/exporter2/build.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="RefreshExporterv2">
+
+	<property file="${basedir}/../../../build.properties"/>
+    <property file="${basedir}/../../../../build.versions"/>
+
+	<import file="${basedir}/../../../../virgo-build/standard/default.xml"/>
+
+</project>
diff --git a/kernel/test-apps/refresh/refresh/exporter2/ivy.xml b/kernel/test-apps/refresh/refresh/exporter2/ivy.xml
new file mode 100644
index 0000000..5729da0
--- /dev/null
+++ b/kernel/test-apps/refresh/refresh/exporter2/ivy.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="http://ivyrep.jayasoft.org/ivy-doc.xsl"?>
+<ivy-module
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:noNamespaceSchemaLocation="http://incubator.apache.org/ivy/schemas/ivy.xsd"
+		version="1.3">
+
+	<info organisation="${project.organisation}" module="${ant.project.name}">
+		<ivyauthor name="robharrop"/>
+	</info>
+
+	<configurations>
+		<include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>
+	</configurations>
+
+	<publications>
+	</publications>
+
+	<dependencies/>
+
+</ivy-module>
diff --git a/kernel/test-apps/refresh/refresh/exporter2/src/main/java/exporter/b1/B11.java b/kernel/test-apps/refresh/refresh/exporter2/src/main/java/exporter/b1/B11.java
new file mode 100644
index 0000000..f88b07a
--- /dev/null
+++ b/kernel/test-apps/refresh/refresh/exporter2/src/main/java/exporter/b1/B11.java
@@ -0,0 +1,17 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package refresh.exporter.b1;
+
+
+public class B11 {
+
+}
diff --git a/kernel/test-apps/refresh/refresh/exporter2/src/main/java/exporter/b1/B12.java b/kernel/test-apps/refresh/refresh/exporter2/src/main/java/exporter/b1/B12.java
new file mode 100644
index 0000000..ac06716
--- /dev/null
+++ b/kernel/test-apps/refresh/refresh/exporter2/src/main/java/exporter/b1/B12.java
@@ -0,0 +1,17 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package refresh.exporter.b1;
+
+
+public class B12 {
+
+}
diff --git a/kernel/test-apps/refresh/refresh/exporter2/src/main/resources/META-INF/MANIFEST.MF b/kernel/test-apps/refresh/refresh/exporter2/src/main/resources/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..1348e13
--- /dev/null
+++ b/kernel/test-apps/refresh/refresh/exporter2/src/main/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,8 @@
+Manifest-Version: 1.0
+Bundle-Name: RefreshExporter
+Created-By: 1.5.0_13 (Apple Computer, Inc.)
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: RefreshExporter
+Export-Package: refresh.exporter.b1
+Bundle-Version: 2
+
diff --git a/kernel/test-apps/refresh/refresh/exporter3/build.xml b/kernel/test-apps/refresh/refresh/exporter3/build.xml
new file mode 100644
index 0000000..e70557a
--- /dev/null
+++ b/kernel/test-apps/refresh/refresh/exporter3/build.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="RefreshExporterv3">
+
+	<property file="${basedir}/../../../build.properties"/>
+    <property file="${basedir}/../../../../build.versions"/>
+
+	<import file="${basedir}/../../../../virgo-build/standard/default.xml"/>
+
+</project>
diff --git a/kernel/test-apps/refresh/refresh/exporter3/ivy.xml b/kernel/test-apps/refresh/refresh/exporter3/ivy.xml
new file mode 100644
index 0000000..5729da0
--- /dev/null
+++ b/kernel/test-apps/refresh/refresh/exporter3/ivy.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="http://ivyrep.jayasoft.org/ivy-doc.xsl"?>
+<ivy-module
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:noNamespaceSchemaLocation="http://incubator.apache.org/ivy/schemas/ivy.xsd"
+		version="1.3">
+
+	<info organisation="${project.organisation}" module="${ant.project.name}">
+		<ivyauthor name="robharrop"/>
+	</info>
+
+	<configurations>
+		<include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>
+	</configurations>
+
+	<publications>
+	</publications>
+
+	<dependencies/>
+
+</ivy-module>
diff --git a/kernel/test-apps/refresh/refresh/exporter3/src/main/java/exporter/b1/B11.java b/kernel/test-apps/refresh/refresh/exporter3/src/main/java/exporter/b1/B11.java
new file mode 100644
index 0000000..f88b07a
--- /dev/null
+++ b/kernel/test-apps/refresh/refresh/exporter3/src/main/java/exporter/b1/B11.java
@@ -0,0 +1,17 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package refresh.exporter.b1;
+
+
+public class B11 {
+
+}
diff --git a/kernel/test-apps/refresh/refresh/exporter3/src/main/java/exporter/b1/B12.java b/kernel/test-apps/refresh/refresh/exporter3/src/main/java/exporter/b1/B12.java
new file mode 100644
index 0000000..ac06716
--- /dev/null
+++ b/kernel/test-apps/refresh/refresh/exporter3/src/main/java/exporter/b1/B12.java
@@ -0,0 +1,17 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package refresh.exporter.b1;
+
+
+public class B12 {
+
+}
diff --git a/kernel/test-apps/refresh/refresh/exporter3/src/main/java/exporter/b2/B21.java b/kernel/test-apps/refresh/refresh/exporter3/src/main/java/exporter/b2/B21.java
new file mode 100644
index 0000000..d5f9ed2
--- /dev/null
+++ b/kernel/test-apps/refresh/refresh/exporter3/src/main/java/exporter/b2/B21.java
@@ -0,0 +1,17 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package refresh.exporter.b2;
+
+
+public class B21 {
+
+}
diff --git a/kernel/test-apps/refresh/refresh/exporter3/src/main/resources/META-INF/MANIFEST.MF b/kernel/test-apps/refresh/refresh/exporter3/src/main/resources/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..a1ebe06
--- /dev/null
+++ b/kernel/test-apps/refresh/refresh/exporter3/src/main/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,8 @@
+Manifest-Version: 1.0
+Bundle-Name: RefreshExporter
+Created-By: 1.5.0_13 (Apple Computer, Inc.)
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: RefreshExporter
+Export-Package: refresh.exporter.b1,refresh.exporter.b2
+Bundle-Version: 3
+
diff --git a/kernel/test-apps/refresh/refresh/importer/build.xml b/kernel/test-apps/refresh/refresh/importer/build.xml
new file mode 100644
index 0000000..872141f
--- /dev/null
+++ b/kernel/test-apps/refresh/refresh/importer/build.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="RefreshImporter">
+
+	<property file="${basedir}/../../../build.properties"/>
+    <property file="${basedir}/../../../../build.versions"/>
+
+	<import file="${basedir}/../../../../virgo-build/standard/default.xml"/>
+
+</project>
diff --git a/kernel/test-apps/refresh/refresh/importer/ivy.xml b/kernel/test-apps/refresh/refresh/importer/ivy.xml
new file mode 100644
index 0000000..8be7913
--- /dev/null
+++ b/kernel/test-apps/refresh/refresh/importer/ivy.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="http://ivyrep.jayasoft.org/ivy-doc.xsl"?>
+<ivy-module
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:noNamespaceSchemaLocation="http://incubator.apache.org/ivy/schemas/ivy.xsd"
+		version="1.3">
+
+	<info organisation="${project.organisation}" module="${ant.project.name}">
+		<ivyauthor name="robharrop"/>
+	</info>
+
+	<configurations>
+		<include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>
+	</configurations>
+
+	<publications>
+	</publications>
+
+	<dependencies>
+		 <dependency org="org.eclipse.virgo.mirrored" name="org.eclipse.osgi" rev="${org.eclipse.osgi}" conf="provided->compile"/>
+		 <dependency org="org.eclipse.virgo.kernel" name="org.eclipse.virgo.kernel.osgi" rev="latest.integration" conf="provided->compile"/>
+		 <dependency org="org.eclipse.virgo.kernel" name="org.eclipse.virgo.kernel.deployer.test" rev="latest.integration" conf="provided->compile"/>
+	</dependencies>
+
+</ivy-module>
diff --git a/kernel/test-apps/refresh/refresh/importer/src/main/java/org/eclipse/virgo/kernel/deployer/test/LoadableClasses.java b/kernel/test-apps/refresh/refresh/importer/src/main/java/org/eclipse/virgo/kernel/deployer/test/LoadableClasses.java
new file mode 100644
index 0000000..e56913a
--- /dev/null
+++ b/kernel/test-apps/refresh/refresh/importer/src/main/java/org/eclipse/virgo/kernel/deployer/test/LoadableClasses.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.deployer.test;
+
+import java.util.Set;
+
+public interface LoadableClasses {
+
+    Set<String> getLoadableClasses();
+
+}
diff --git a/kernel/test-apps/refresh/refresh/importer/src/main/java/refresh/importer/Importer.java b/kernel/test-apps/refresh/refresh/importer/src/main/java/refresh/importer/Importer.java
new file mode 100644
index 0000000..f1ed4d2
--- /dev/null
+++ b/kernel/test-apps/refresh/refresh/importer/src/main/java/refresh/importer/Importer.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package refresh.importer;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.osgi.framework.Bundle;
+
+import org.eclipse.virgo.kernel.deployer.test.LoadableClasses;
+import org.eclipse.virgo.kernel.osgi.framework.OsgiFramework;
+
+public class Importer implements LoadableClasses {
+
+    private final Set<String> loadableClasses = new HashSet<String>();
+
+    public Importer(OsgiFramework osgi) {
+        System.out.println("New Importer bean");
+        checkLoadClass("refresh.exporter.b1.B11");
+        checkLoadClass("refresh.exporter.b1.B12");
+        checkLoadClass("refresh.exporter.b2.B21");
+        Bundle[] bundles = osgi.getBundleContext().getBundles();
+        for (Bundle bundle : bundles) {
+            if (bundle.getSymbolicName().equals("RefreshTest-1-RefreshExporter")) {
+                System.out.println(bundle.getHeaders().get("bundle-version"));
+            }
+        }
+    }
+
+    private void checkLoadClass(String className) {
+        try {
+            this.getClass().getClassLoader().loadClass(className);
+            System.out.println(className + " is loadable");
+            loadableClasses.add(className);
+        } catch (ClassNotFoundException e) {
+            System.out.println(className + " is not loadable");
+        }
+    }
+
+    public Set<String> getLoadableClasses() {
+        return this.loadableClasses;
+    }
+
+}
diff --git a/kernel/test-apps/refresh/refresh/importer/src/main/resources/META-INF/MANIFEST.MF b/kernel/test-apps/refresh/refresh/importer/src/main/resources/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..0357d76
--- /dev/null
+++ b/kernel/test-apps/refresh/refresh/importer/src/main/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,12 @@
+Manifest-Version: 1.0
+Bundle-Name: RefreshImporter
+Created-By: 1.5.0_13 (Apple Computer, Inc.)
+Import-Package: org.osgi.framework,
+ org.eclipse.virgo.kernel.osgi.framework,
+ org.eclipse.virgo.kernel.deployer.test,
+ refresh.exporter.b1,
+ refresh.exporter.b2;resolution:=optional
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: RefreshImporter
+Bundle-Version: 1.0.0
+
diff --git a/kernel/test-apps/refresh/refresh/importer/src/main/resources/META-INF/spring/importer-context.xml b/kernel/test-apps/refresh/refresh/importer/src/main/resources/META-INF/spring/importer-context.xml
new file mode 100644
index 0000000..df598c1
--- /dev/null
+++ b/kernel/test-apps/refresh/refresh/importer/src/main/resources/META-INF/spring/importer-context.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans:beans xmlns="http://www.springframework.org/schema/osgi"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns:beans="http://www.springframework.org/schema/beans"
+	xsi:schemaLocation="http://www.springframework.org/schema/osgi  
+       http://www.springframework.org/schema/osgi/spring-osgi.xsd
+       http://www.springframework.org/schema/beans   
+       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
+
+	<reference id="osgiFramework"
+		interface="org.eclipse.virgo.kernel.osgi.framework.OsgiFramework" />
+
+	<beans:bean id="importer" class="refresh.importer.Importer">
+		<beans:constructor-arg ref="osgiFramework" />
+	</beans:bean>
+
+	<service ref="importer"
+		 interface="org.eclipse.virgo.kernel.deployer.test.LoadableClasses" />
+
+</beans:beans>
diff --git a/kernel/test-apps/service-publication-from-repo-bundles/consumer/build.xml b/kernel/test-apps/service-publication-from-repo-bundles/consumer/build.xml
new file mode 100644
index 0000000..510459f
--- /dev/null
+++ b/kernel/test-apps/service-publication-from-repo-bundles/consumer/build.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="consumer">
+
+	<property file="${basedir}/../../build.properties"/>
+    <property file="${basedir}/../../../build.versions"/>
+    <property name="jar.output.file" value="${basedir}/../../../org.eclipse.virgo.kernel.deployer.test/src/test/resources/service-publication-from-repo/consumer.jar"/>
+	<import file="${basedir}/../../../virgo-build/standard/default.xml"/>
+
+</project>
diff --git a/kernel/test-apps/service-publication-from-repo-bundles/consumer/ivy.xml b/kernel/test-apps/service-publication-from-repo-bundles/consumer/ivy.xml
new file mode 100644
index 0000000..187290f
--- /dev/null
+++ b/kernel/test-apps/service-publication-from-repo-bundles/consumer/ivy.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="http://ivyrep.jayasoft.org/ivy-doc.xsl"?>
+<ivy-module
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:noNamespaceSchemaLocation="http://incubator.apache.org/ivy/schemas/ivy.xsd"
+		version="1.3">
+
+	<info organisation="${project.organisation}" module="${ant.project.name}">
+		<ivyauthor name="awilkinson"/>
+	</info>
+
+	<configurations>
+		<include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>
+	</configurations>
+
+	<publications>
+	</publications>
+
+	<dependencies>
+	</dependencies>
+
+</ivy-module>
diff --git a/kernel/test-apps/service-publication-from-repo-bundles/consumer/src/main/java/.gitignore b/kernel/test-apps/service-publication-from-repo-bundles/consumer/src/main/java/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/test-apps/service-publication-from-repo-bundles/consumer/src/main/java/.gitignore
diff --git a/kernel/test-apps/service-publication-from-repo-bundles/consumer/src/main/resources/META-INF/MANIFEST.MF b/kernel/test-apps/service-publication-from-repo-bundles/consumer/src/main/resources/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..1c2ead8
--- /dev/null
+++ b/kernel/test-apps/service-publication-from-repo-bundles/consumer/src/main/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,4 @@
+Bundle-ManifestVersion: 2
+Manifest-Version: 1.0
+Bundle-SymbolicName: org.eclipse.virgo.server.test.consumer
+Import-Package: org.eclipse.virgo.server.test.publisher
diff --git a/kernel/test-apps/service-publication-from-repo-bundles/consumer/src/main/resources/META-INF/spring/app-context.xml b/kernel/test-apps/service-publication-from-repo-bundles/consumer/src/main/resources/META-INF/spring/app-context.xml
new file mode 100644
index 0000000..6a4393f
--- /dev/null
+++ b/kernel/test-apps/service-publication-from-repo-bundles/consumer/src/main/resources/META-INF/spring/app-context.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans:beans xmlns:osgi="http://www.springframework.org/schema/osgi"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns:beans="http://www.springframework.org/schema/beans"
+	xmlns:util="http://www.springframework.org/schema/util"
+	xsi:schemaLocation="http://www.springframework.org/schema/osgi  
+       http://www.springframework.org/schema/osgi/spring-osgi.xsd
+       http://www.springframework.org/schema/beans   
+       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
+       http://www.springframework.org/schema/util
+       http://www.springframework.org/schema/util/spring-util-2.5.xsd">
+	
+	<osgi:reference id="list" interface="java.util.List"/>	
+		
+</beans:beans>
diff --git a/kernel/test-apps/service-publication-from-repo-bundles/publisher/build.xml b/kernel/test-apps/service-publication-from-repo-bundles/publisher/build.xml
new file mode 100644
index 0000000..c031c79
--- /dev/null
+++ b/kernel/test-apps/service-publication-from-repo-bundles/publisher/build.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="publisher">
+
+	<property file="${basedir}/../../build.properties"/>
+    <property file="${basedir}/../../../build.versions"/>
+    <property name="jar.output.file" value="${basedir}/../../../org.eclipse.virgo.kernel.deployer.test/src/test/resources/service-publication-from-repo/publisher.jar"/>
+    <import file="${basedir}/../../../virgo-build/standard/default.xml"/>
+
+</project>
diff --git a/kernel/test-apps/service-publication-from-repo-bundles/publisher/ivy.xml b/kernel/test-apps/service-publication-from-repo-bundles/publisher/ivy.xml
new file mode 100644
index 0000000..187290f
--- /dev/null
+++ b/kernel/test-apps/service-publication-from-repo-bundles/publisher/ivy.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="http://ivyrep.jayasoft.org/ivy-doc.xsl"?>
+<ivy-module
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:noNamespaceSchemaLocation="http://incubator.apache.org/ivy/schemas/ivy.xsd"
+		version="1.3">
+
+	<info organisation="${project.organisation}" module="${ant.project.name}">
+		<ivyauthor name="awilkinson"/>
+	</info>
+
+	<configurations>
+		<include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>
+	</configurations>
+
+	<publications>
+	</publications>
+
+	<dependencies>
+	</dependencies>
+
+</ivy-module>
diff --git a/kernel/test-apps/service-publication-from-repo-bundles/publisher/src/main/java/.gitignore b/kernel/test-apps/service-publication-from-repo-bundles/publisher/src/main/java/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/test-apps/service-publication-from-repo-bundles/publisher/src/main/java/.gitignore
diff --git a/kernel/test-apps/service-publication-from-repo-bundles/publisher/src/main/resources/META-INF/MANIFEST.MF b/kernel/test-apps/service-publication-from-repo-bundles/publisher/src/main/resources/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..9edfef1
--- /dev/null
+++ b/kernel/test-apps/service-publication-from-repo-bundles/publisher/src/main/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,4 @@
+Bundle-ManifestVersion: 2
+Manifest-Version: 1.0
+Bundle-SymbolicName: org.eclipse.virgo.server.test.publisher
+Export-Package: org.eclipse.virgo.server.test.publisher
diff --git a/kernel/test-apps/service-publication-from-repo-bundles/publisher/src/main/resources/META-INF/spring/app-context.xml b/kernel/test-apps/service-publication-from-repo-bundles/publisher/src/main/resources/META-INF/spring/app-context.xml
new file mode 100644
index 0000000..9f5947b
--- /dev/null
+++ b/kernel/test-apps/service-publication-from-repo-bundles/publisher/src/main/resources/META-INF/spring/app-context.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans:beans xmlns:osgi="http://www.springframework.org/schema/osgi"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns:beans="http://www.springframework.org/schema/beans"
+	xmlns:util="http://www.springframework.org/schema/util"
+	xsi:schemaLocation="http://www.springframework.org/schema/osgi  
+       http://www.springframework.org/schema/osgi/spring-osgi.xsd
+       http://www.springframework.org/schema/beans   
+       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
+       http://www.springframework.org/schema/util
+       http://www.springframework.org/schema/util/spring-util-2.5.xsd">
+	
+	<osgi:service ref="list" interface="java.util.List"/>	
+	<beans:bean id="list" class="java.util.ArrayList"/>
+		
+</beans:beans>
diff --git a/kernel/test-apps/service-scoping-engine-1265/build-par/build.xml b/kernel/test-apps/service-scoping-engine-1265/build-par/build.xml
new file mode 100644
index 0000000..cb39d0f
--- /dev/null
+++ b/kernel/test-apps/service-scoping-engine-1265/build-par/build.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="service-scoping-engine-1265">
+
+	<path id="bundles">
+		<pathelement location="../master"/>
+		<pathelement location="../dependent"/>
+	</path>
+
+	<property file="${basedir}/../../build.properties"/>
+	<property name="par.output.file" value="${basedir}/../../../org.eclipse.virgo.kernel.deployer.test/src/test/resources/service-scoping/service-scoping-engine-1265.par"/>
+	<import file="${basedir}/../../../virgo-build/par/default.xml"/>
+
+</project>
diff --git a/kernel/test-apps/service-scoping-engine-1265/dependent/build.xml b/kernel/test-apps/service-scoping-engine-1265/dependent/build.xml
new file mode 100644
index 0000000..b653e9d
--- /dev/null
+++ b/kernel/test-apps/service-scoping-engine-1265/dependent/build.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="scoping.service.dependent">
+
+	<property file="${basedir}/../../build.properties"/>
+    <property file="${basedir}/../../../build.versions"/>
+
+	<import file="${basedir}/../../../virgo-build/standard/default.xml"/>
+
+</project>
diff --git a/kernel/test-apps/service-scoping-engine-1265/dependent/ivy.xml b/kernel/test-apps/service-scoping-engine-1265/dependent/ivy.xml
new file mode 100644
index 0000000..730d2af
--- /dev/null
+++ b/kernel/test-apps/service-scoping-engine-1265/dependent/ivy.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="http://ivyrep.jayasoft.org/ivy-doc.xsl"?>
+<ivy-module
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:noNamespaceSchemaLocation="http://incubator.apache.org/ivy/schemas/ivy.xsd"
+		version="1.3">
+
+	<info organisation="${project.organisation}" module="${ant.project.name}">
+		<ivyauthor name="rharrop"/>
+	</info>
+
+	<configurations>
+		<include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>
+	</configurations>
+
+	<publications>
+	</publications>
+
+	<dependencies>
+	</dependencies>
+
+</ivy-module>
diff --git a/kernel/test-apps/service-scoping-engine-1265/dependent/src/main/java/.gitignore b/kernel/test-apps/service-scoping-engine-1265/dependent/src/main/java/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/test-apps/service-scoping-engine-1265/dependent/src/main/java/.gitignore
diff --git a/kernel/test-apps/service-scoping-engine-1265/dependent/src/main/resources/META-INF/MANIFEST.MF b/kernel/test-apps/service-scoping-engine-1265/dependent/src/main/resources/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..f073930
--- /dev/null
+++ b/kernel/test-apps/service-scoping-engine-1265/dependent/src/main/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: dependent.bundle
+Bundle-Version: 1.0.0.SNAPSHOT
+Import-Library: org.springframework.spring
diff --git a/kernel/test-apps/service-scoping-engine-1265/dependent/src/main/resources/META-INF/spring/bundle-context.xml b/kernel/test-apps/service-scoping-engine-1265/dependent/src/main/resources/META-INF/spring/bundle-context.xml
new file mode 100644
index 0000000..4682df0
--- /dev/null
+++ b/kernel/test-apps/service-scoping-engine-1265/dependent/src/main/resources/META-INF/spring/bundle-context.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns:context="http://www.springframework.org/schema/context"
+	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+	http://www.springframework.org/schema/context
+    http://www.springframework.org/schema/context/spring-context-2.5.xsd">
+
+	<!-- bean name="dependent-registrar" class="test.registrar.ResourceRegistrar"/-->
+
+	<context:component-scan base-package="test.scratch.dependent"/>
+
+</beans>
diff --git a/kernel/test-apps/service-scoping-engine-1265/dependent/src/main/resources/META-INF/spring/osgi-context.xml b/kernel/test-apps/service-scoping-engine-1265/dependent/src/main/resources/META-INF/spring/osgi-context.xml
new file mode 100644
index 0000000..f38eb3a
--- /dev/null
+++ b/kernel/test-apps/service-scoping-engine-1265/dependent/src/main/resources/META-INF/spring/osgi-context.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans:beans xmlns="http://www.springframework.org/schema/osgi"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns:beans="http://www.springframework.org/schema/beans"
+	xsi:schemaLocation="http://www.springframework.org/schema/osgi  
+       http://www.springframework.org/schema/osgi/spring-osgi.xsd
+       http://www.springframework.org/schema/beans   
+       http://www.springframework.org/schema/beans/spring-beans.xsd">
+
+	<reference id="scratch-registrar" 
+		interface="org.springframework.core.io.Resource" filter="(path=foo)" cardinality="0..1"/>
+
+	<list id="scratch-registrars"
+		interface="org.springframework.core.io.Resource" cardinality="0..N"/>
+
+</beans:beans>
diff --git a/kernel/test-apps/service-scoping-engine-1265/master/build.xml b/kernel/test-apps/service-scoping-engine-1265/master/build.xml
new file mode 100644
index 0000000..022b67b
--- /dev/null
+++ b/kernel/test-apps/service-scoping-engine-1265/master/build.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="scoping.service.master">
+
+	<property file="${basedir}/../../build.properties"/>
+    <property file="${basedir}/../../../build.versions"/>
+
+	<import file="${basedir}/../../../virgo-build/standard/default.xml"/>
+
+</project>
diff --git a/kernel/test-apps/service-scoping-engine-1265/master/ivy.xml b/kernel/test-apps/service-scoping-engine-1265/master/ivy.xml
new file mode 100644
index 0000000..730d2af
--- /dev/null
+++ b/kernel/test-apps/service-scoping-engine-1265/master/ivy.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="http://ivyrep.jayasoft.org/ivy-doc.xsl"?>
+<ivy-module
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:noNamespaceSchemaLocation="http://incubator.apache.org/ivy/schemas/ivy.xsd"
+		version="1.3">
+
+	<info organisation="${project.organisation}" module="${ant.project.name}">
+		<ivyauthor name="rharrop"/>
+	</info>
+
+	<configurations>
+		<include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>
+	</configurations>
+
+	<publications>
+	</publications>
+
+	<dependencies>
+	</dependencies>
+
+</ivy-module>
diff --git a/kernel/test-apps/service-scoping-engine-1265/master/src/main/java/.gitignore b/kernel/test-apps/service-scoping-engine-1265/master/src/main/java/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/test-apps/service-scoping-engine-1265/master/src/main/java/.gitignore
diff --git a/kernel/test-apps/service-scoping-engine-1265/master/src/main/resources/META-INF/MANIFEST.MF b/kernel/test-apps/service-scoping-engine-1265/master/src/main/resources/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..1275a83
--- /dev/null
+++ b/kernel/test-apps/service-scoping-engine-1265/master/src/main/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: master.bundle
+Bundle-Version: 1.0.0.SNAPSHOT
+Import-Library: org.springframework.spring
diff --git a/kernel/test-apps/service-scoping-engine-1265/master/src/main/resources/META-INF/spring/bundle-context.xml b/kernel/test-apps/service-scoping-engine-1265/master/src/main/resources/META-INF/spring/bundle-context.xml
new file mode 100644
index 0000000..80430c7
--- /dev/null
+++ b/kernel/test-apps/service-scoping-engine-1265/master/src/main/resources/META-INF/spring/bundle-context.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns:osgi="http://www.springframework.org/schema/osgi"
+	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+	http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi.xsd">
+
+	<bean name="scratch-registrar"
+		class="org.springframework.core.io.ClassPathResource">
+		<constructor-arg value="META-INF/spring/bundle-context.xml"/>
+	</bean>
+
+	<bean name="other-resource"
+		class="org.springframework.core.io.ClassPathResource">
+		<constructor-arg value="META-INF/spring/bundle-context.xml"/>
+	</bean>
+
+	<bean id="properties"
+		class="org.springframework.beans.factory.config.PropertiesFactoryBean">
+		<property name="properties">
+			<props>
+				<prop key="foo">bar</prop>
+			</props>
+		</property>
+	</bean>
+</beans>
diff --git a/kernel/test-apps/service-scoping-engine-1265/master/src/main/resources/META-INF/spring/osgi-context.xml b/kernel/test-apps/service-scoping-engine-1265/master/src/main/resources/META-INF/spring/osgi-context.xml
new file mode 100644
index 0000000..6a42143
--- /dev/null
+++ b/kernel/test-apps/service-scoping-engine-1265/master/src/main/resources/META-INF/spring/osgi-context.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans:beans xmlns="http://www.springframework.org/schema/osgi"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns:beans="http://www.springframework.org/schema/beans"
+	xsi:schemaLocation="http://www.springframework.org/schema/osgi  
+       http://www.springframework.org/schema/osgi/spring-osgi.xsd
+       http://www.springframework.org/schema/beans   
+       http://www.springframework.org/schema/beans/spring-beans.xsd">
+
+	<service ref="scratch-registrar"
+		interface="org.springframework.core.io.Resource">
+		<service-properties>
+			<beans:entry key="path" value="foo" />
+		</service-properties>
+	</service>
+
+	<service ref="other-resource"
+		interface="org.springframework.core.io.Resource"/>
+
+	<service ref="properties" interface="java.util.Properties" />
+
+</beans:beans>
diff --git a/kernel/test-apps/service-scoping-platform-183/build-par/build.xml b/kernel/test-apps/service-scoping-platform-183/build-par/build.xml
new file mode 100644
index 0000000..0177dc5
--- /dev/null
+++ b/kernel/test-apps/service-scoping-platform-183/build-par/build.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="service-scoping-platform-183">
+
+	<path id="bundles">
+		<pathelement location="../scoping.service.module.a"/>
+		<pathelement location="../scoping.service.module.b"/>
+	</path>
+
+	<property file="${basedir}/../../build.properties"/>
+    <property name="par.output.file" value="${basedir}/../../../org.eclipse.virgo.kernel.deployer.test/src/test/resources/service-scoping/service-scoping-platform-183.par"/>
+	<import file="${basedir}/../../../virgo-build/par/default.xml"/>
+
+</project>
diff --git a/kernel/test-apps/service-scoping-platform-183/scoping.service.module.a/build.xml b/kernel/test-apps/service-scoping-platform-183/scoping.service.module.a/build.xml
new file mode 100644
index 0000000..0ec21f3
--- /dev/null
+++ b/kernel/test-apps/service-scoping-platform-183/scoping.service.module.a/build.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="scoping.service.183.module.a">
+
+	<property file="${basedir}/../../build.properties"/>
+    <property file="${basedir}/../../../build.versions"/>
+
+	<import file="${basedir}/../../../virgo-build/standard/default.xml"/>
+
+</project>
diff --git a/kernel/test-apps/service-scoping-platform-183/scoping.service.module.a/ivy.xml b/kernel/test-apps/service-scoping-platform-183/scoping.service.module.a/ivy.xml
new file mode 100644
index 0000000..730d2af
--- /dev/null
+++ b/kernel/test-apps/service-scoping-platform-183/scoping.service.module.a/ivy.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="http://ivyrep.jayasoft.org/ivy-doc.xsl"?>
+<ivy-module
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:noNamespaceSchemaLocation="http://incubator.apache.org/ivy/schemas/ivy.xsd"
+		version="1.3">
+
+	<info organisation="${project.organisation}" module="${ant.project.name}">
+		<ivyauthor name="rharrop"/>
+	</info>
+
+	<configurations>
+		<include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>
+	</configurations>
+
+	<publications>
+	</publications>
+
+	<dependencies>
+	</dependencies>
+
+</ivy-module>
diff --git a/kernel/test-apps/service-scoping-platform-183/scoping.service.module.a/src/main/java/.gitignore b/kernel/test-apps/service-scoping-platform-183/scoping.service.module.a/src/main/java/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/test-apps/service-scoping-platform-183/scoping.service.module.a/src/main/java/.gitignore
diff --git a/kernel/test-apps/service-scoping-platform-183/scoping.service.module.a/src/main/resources/META-INF/MANIFEST.MF b/kernel/test-apps/service-scoping-platform-183/scoping.service.module.a/src/main/resources/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..9d371f0
--- /dev/null
+++ b/kernel/test-apps/service-scoping-platform-183/scoping.service.module.a/src/main/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: scoping.service.module.a
diff --git a/kernel/test-apps/service-scoping-platform-183/scoping.service.module.a/src/main/resources/META-INF/spring/module.xml b/kernel/test-apps/service-scoping-platform-183/scoping.service.module.a/src/main/resources/META-INF/spring/module.xml
new file mode 100644
index 0000000..9881b44
--- /dev/null
+++ b/kernel/test-apps/service-scoping-platform-183/scoping.service.module.a/src/main/resources/META-INF/spring/module.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans:beans xmlns="http://www.springframework.org/schema/osgi"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"
+	xsi:schemaLocation="http://www.springframework.org/schema/osgi  
+       http://www.springframework.org/schema/osgi/spring-osgi.xsd
+       http://www.springframework.org/schema/beans   
+       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
+	
+	<reference id="local" interface="java.lang.Appendable"/>
+	
+</beans:beans>
diff --git a/kernel/test-apps/service-scoping-platform-183/scoping.service.module.a/src/test/java/.gitignore b/kernel/test-apps/service-scoping-platform-183/scoping.service.module.a/src/test/java/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/test-apps/service-scoping-platform-183/scoping.service.module.a/src/test/java/.gitignore
diff --git a/kernel/test-apps/service-scoping-platform-183/scoping.service.module.a/src/test/resources/.gitignore b/kernel/test-apps/service-scoping-platform-183/scoping.service.module.a/src/test/resources/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/test-apps/service-scoping-platform-183/scoping.service.module.a/src/test/resources/.gitignore
diff --git a/kernel/test-apps/service-scoping-platform-183/scoping.service.module.b/build.xml b/kernel/test-apps/service-scoping-platform-183/scoping.service.module.b/build.xml
new file mode 100644
index 0000000..3398fc3
--- /dev/null
+++ b/kernel/test-apps/service-scoping-platform-183/scoping.service.module.b/build.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="scoping.service.183.module.b">
+
+	<property file="${basedir}/../../build.properties"/>
+    <property file="${basedir}/../../../build.versions"/>
+
+	<import file="${basedir}/../../../virgo-build/standard/default.xml"/>
+
+</project>
diff --git a/kernel/test-apps/service-scoping-platform-183/scoping.service.module.b/ivy.xml b/kernel/test-apps/service-scoping-platform-183/scoping.service.module.b/ivy.xml
new file mode 100644
index 0000000..730d2af
--- /dev/null
+++ b/kernel/test-apps/service-scoping-platform-183/scoping.service.module.b/ivy.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="http://ivyrep.jayasoft.org/ivy-doc.xsl"?>
+<ivy-module
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:noNamespaceSchemaLocation="http://incubator.apache.org/ivy/schemas/ivy.xsd"
+		version="1.3">
+
+	<info organisation="${project.organisation}" module="${ant.project.name}">
+		<ivyauthor name="rharrop"/>
+	</info>
+
+	<configurations>
+		<include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>
+	</configurations>
+
+	<publications>
+	</publications>
+
+	<dependencies>
+	</dependencies>
+
+</ivy-module>
diff --git a/kernel/test-apps/service-scoping-platform-183/scoping.service.module.b/src/main/java/.gitignore b/kernel/test-apps/service-scoping-platform-183/scoping.service.module.b/src/main/java/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/test-apps/service-scoping-platform-183/scoping.service.module.b/src/main/java/.gitignore
diff --git a/kernel/test-apps/service-scoping-platform-183/scoping.service.module.b/src/main/resources/META-INF/MANIFEST.MF b/kernel/test-apps/service-scoping-platform-183/scoping.service.module.b/src/main/resources/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..aa2130a
--- /dev/null
+++ b/kernel/test-apps/service-scoping-platform-183/scoping.service.module.b/src/main/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: scoping.service.module.b
diff --git a/kernel/test-apps/service-scoping-platform-183/scoping.service.module.b/src/main/resources/META-INF/spring/module.xml b/kernel/test-apps/service-scoping-platform-183/scoping.service.module.b/src/main/resources/META-INF/spring/module.xml
new file mode 100644
index 0000000..467524d
--- /dev/null
+++ b/kernel/test-apps/service-scoping-platform-183/scoping.service.module.b/src/main/resources/META-INF/spring/module.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans:beans xmlns="http://www.springframework.org/schema/osgi"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"
+	xsi:schemaLocation="http://www.springframework.org/schema/osgi  
+       http://www.springframework.org/schema/osgi/spring-osgi.xsd
+       http://www.springframework.org/schema/beans   
+       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
+	
+	<service ref="appendable">
+		<interfaces>
+			<beans:value>java.lang.Appendable
+			</beans:value>
+		</interfaces>
+	</service>
+		
+	<beans:bean id="appendable" class="java.lang.StringBuilder" />
+	
+</beans:beans>
diff --git a/kernel/test-apps/service-scoping/build-par/build.xml b/kernel/test-apps/service-scoping/build-par/build.xml
new file mode 100644
index 0000000..d143d9a
--- /dev/null
+++ b/kernel/test-apps/service-scoping/build-par/build.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="service-scoping">
+
+	<path id="bundles">
+		<pathelement location="../scoping.service.module.a"/>
+		<pathelement location="../scoping.service.module.b"/>
+	</path>
+
+	<property file="${basedir}/../../build.properties"/>
+	<property name="par.output.file" value="${basedir}/../../../org.eclipse.virgo.kernel.deployer.test/src/test/resources/service-scoping/service-scoping.par"/>
+	<import file="${basedir}/../../../virgo-build/par/default.xml"/>
+
+</project>
diff --git a/kernel/test-apps/service-scoping/scoping.service.global/build.xml b/kernel/test-apps/service-scoping/scoping.service.global/build.xml
new file mode 100644
index 0000000..b582515
--- /dev/null
+++ b/kernel/test-apps/service-scoping/scoping.service.global/build.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="scoping.service.global">
+
+	<property file="${basedir}/../../build.properties"/>
+    <property file="${basedir}/../../../build.versions"/>
+	<property name="jar.output.file" value="${basedir}/../../../org.eclipse.virgo.kernel.deployer.test/src/test/resources/service-scoping/scoping.service.global.jar"/>
+	<import file="${basedir}/../../../virgo-build/standard/default.xml"/>
+
+</project>
diff --git a/kernel/test-apps/service-scoping/scoping.service.global/ivy.xml b/kernel/test-apps/service-scoping/scoping.service.global/ivy.xml
new file mode 100644
index 0000000..9fa026e
--- /dev/null
+++ b/kernel/test-apps/service-scoping/scoping.service.global/ivy.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="http://ivyrep.jayasoft.org/ivy-doc.xsl"?>
+<ivy-module
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:noNamespaceSchemaLocation="http://incubator.apache.org/ivy/schemas/ivy.xsd"
+		version="1.3">
+
+	<info organisation="${project.organisation}" module="${ant.project.name}">
+		<ivyauthor name="rharrop"/>
+	</info>
+
+	<configurations>
+		<include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>
+	</configurations>
+
+	<publications>
+	</publications>
+
+	<dependencies>
+		<dependency org="org.junit" name="com.springsource.org.junit" rev="${org.junit}" conf="test->runtime"/>
+	</dependencies>
+
+</ivy-module>
diff --git a/kernel/test-apps/service-scoping/scoping.service.global/src/main/java/.gitignore b/kernel/test-apps/service-scoping/scoping.service.global/src/main/java/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/test-apps/service-scoping/scoping.service.global/src/main/java/.gitignore
diff --git a/kernel/test-apps/service-scoping/scoping.service.global/src/main/resources/META-INF/MANIFEST.MF b/kernel/test-apps/service-scoping/scoping.service.global/src/main/resources/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..303243a
--- /dev/null
+++ b/kernel/test-apps/service-scoping/scoping.service.global/src/main/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: scoping.service.global
diff --git a/kernel/test-apps/service-scoping/scoping.service.global/src/main/resources/META-INF/spring/module.xml b/kernel/test-apps/service-scoping/scoping.service.global/src/main/resources/META-INF/spring/module.xml
new file mode 100644
index 0000000..6d9b826
--- /dev/null
+++ b/kernel/test-apps/service-scoping/scoping.service.global/src/main/resources/META-INF/spring/module.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans:beans xmlns="http://www.springframework.org/schema/osgi"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"
+	xsi:schemaLocation="http://www.springframework.org/schema/osgi  
+       http://www.springframework.org/schema/osgi/spring-osgi.xsd
+       http://www.springframework.org/schema/beans   
+       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
+	<service ref="appendable" interface="java.lang.Appendable">
+		<service-properties>
+			<beans:entry key="provider" value="global" />
+		</service-properties>
+	</service>
+	<beans:bean id="appendable" class="java.lang.StringBuilder" />
+</beans:beans>
diff --git a/kernel/test-apps/service-scoping/scoping.service.global/src/test/java/.gitignore b/kernel/test-apps/service-scoping/scoping.service.global/src/test/java/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/test-apps/service-scoping/scoping.service.global/src/test/java/.gitignore
diff --git a/kernel/test-apps/service-scoping/scoping.service.global/src/test/resources/.gitignore b/kernel/test-apps/service-scoping/scoping.service.global/src/test/resources/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/test-apps/service-scoping/scoping.service.global/src/test/resources/.gitignore
diff --git a/kernel/test-apps/service-scoping/scoping.service.module.a/build.xml b/kernel/test-apps/service-scoping/scoping.service.module.a/build.xml
new file mode 100644
index 0000000..7dabaef
--- /dev/null
+++ b/kernel/test-apps/service-scoping/scoping.service.module.a/build.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="scoping.service.module.a">
+
+	<property file="${basedir}/../../build.properties"/>
+    <property file="${basedir}/../../../build.versions"/>
+
+	<import file="${basedir}/../../../virgo-build/standard/default.xml"/>
+
+</project>
diff --git a/kernel/test-apps/service-scoping/scoping.service.module.a/ivy.xml b/kernel/test-apps/service-scoping/scoping.service.module.a/ivy.xml
new file mode 100644
index 0000000..f2f65ea
--- /dev/null
+++ b/kernel/test-apps/service-scoping/scoping.service.module.a/ivy.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="http://ivyrep.jayasoft.org/ivy-doc.xsl"?>
+<ivy-module
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:noNamespaceSchemaLocation="http://incubator.apache.org/ivy/schemas/ivy.xsd"
+		version="1.3">
+
+	<info organisation="${project.organisation}" module="${ant.project.name}">
+		<ivyauthor name="rharrop"/>
+	</info>
+
+	<configurations>
+		<include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>
+	</configurations>
+
+	<publications>
+		<artifact name="${ant.project.name}"/>
+		<artifact name="${ant.project.name}-sources" type="src" ext="jar"/>
+	</publications>
+
+	<dependencies>
+		<dependency org="org.junit" name="com.springsource.org.junit" rev="${org.junit}" conf="test->runtime"/>
+	</dependencies>
+
+</ivy-module>
diff --git a/kernel/test-apps/service-scoping/scoping.service.module.a/src/main/java/.gitignore b/kernel/test-apps/service-scoping/scoping.service.module.a/src/main/java/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/test-apps/service-scoping/scoping.service.module.a/src/main/java/.gitignore
diff --git a/kernel/test-apps/service-scoping/scoping.service.module.a/src/main/resources/META-INF/MANIFEST.MF b/kernel/test-apps/service-scoping/scoping.service.module.a/src/main/resources/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..9d371f0
--- /dev/null
+++ b/kernel/test-apps/service-scoping/scoping.service.module.a/src/main/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: scoping.service.module.a
diff --git a/kernel/test-apps/service-scoping/scoping.service.module.a/src/main/resources/META-INF/spring/module.xml b/kernel/test-apps/service-scoping/scoping.service.module.a/src/main/resources/META-INF/spring/module.xml
new file mode 100644
index 0000000..4d29c3a
--- /dev/null
+++ b/kernel/test-apps/service-scoping/scoping.service.module.a/src/main/resources/META-INF/spring/module.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans:beans xmlns="http://www.springframework.org/schema/osgi"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"
+	xsi:schemaLocation="http://www.springframework.org/schema/osgi  
+       http://www.springframework.org/schema/osgi/spring-osgi.xsd
+       http://www.springframework.org/schema/beans   
+       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
+	
+	<reference id="local" interface="java.lang.Appendable"/>
+	<reference id="localWithFilter" interface="java.lang.Appendable" filter="(provider=local)"/>
+		<reference id="serializable" interface="java.io.Serializable" filter="(a=b)"/>
+	
+</beans:beans>
diff --git a/kernel/test-apps/service-scoping/scoping.service.module.a/src/test/java/.gitignore b/kernel/test-apps/service-scoping/scoping.service.module.a/src/test/java/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/test-apps/service-scoping/scoping.service.module.a/src/test/java/.gitignore
diff --git a/kernel/test-apps/service-scoping/scoping.service.module.a/src/test/resources/.gitignore b/kernel/test-apps/service-scoping/scoping.service.module.a/src/test/resources/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/test-apps/service-scoping/scoping.service.module.a/src/test/resources/.gitignore
diff --git a/kernel/test-apps/service-scoping/scoping.service.module.b/build.xml b/kernel/test-apps/service-scoping/scoping.service.module.b/build.xml
new file mode 100644
index 0000000..56e4fe8
--- /dev/null
+++ b/kernel/test-apps/service-scoping/scoping.service.module.b/build.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="scoping.service.module.b">
+
+	<property file="${basedir}/../../build.properties"/>
+    <property file="${basedir}/../../../build.versions"/>
+
+	<import file="${basedir}/../../../virgo-build/standard/default.xml"/>
+
+</project>
diff --git a/kernel/test-apps/service-scoping/scoping.service.module.b/ivy.xml b/kernel/test-apps/service-scoping/scoping.service.module.b/ivy.xml
new file mode 100644
index 0000000..b0a0106
--- /dev/null
+++ b/kernel/test-apps/service-scoping/scoping.service.module.b/ivy.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="http://ivyrep.jayasoft.org/ivy-doc.xsl"?>
+<ivy-module
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:noNamespaceSchemaLocation="http://incubator.apache.org/ivy/schemas/ivy.xsd"
+		version="1.3">
+
+	<info organisation="${project.organisation}" module="${ant.project.name}">
+		<ivyauthor name="rharrop"/>
+	</info>
+
+	<configurations>
+		<include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>
+	</configurations>
+
+	<publications>
+		<artifact name="${ant.project.name}"/>
+		<artifact name="${ant.project.name}-sources" type="src" ext="jar"/>
+	</publications>
+
+	<dependencies>
+		<dependency org="org.junit" name="com.springsource.org.junit" rev="${org.junit}" conf="test->runtime"/>
+		<dependency org="org.eclipse.virgo.mirrored" name="org.eclipse.osgi" rev="${org.eclipse.osgi}" conf="provided->runtime"/>
+	</dependencies>
+
+</ivy-module>
diff --git a/kernel/test-apps/service-scoping/scoping.service.module.b/src/main/java/scoping/Activator.java b/kernel/test-apps/service-scoping/scoping.service.module.b/src/main/java/scoping/Activator.java
new file mode 100644
index 0000000..853a2f9
--- /dev/null
+++ b/kernel/test-apps/service-scoping/scoping.service.module.b/src/main/java/scoping/Activator.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package scoping;
+
+import java.lang.management.ManagementFactory;
+
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+
+public class Activator implements BundleActivator {
+
+    private final String OBJECT_NAME = "scoping.test:type=Listener";
+    
+    public void start(BundleContext context) throws Exception {
+        Listener listener = new Listener(context);
+        context.addServiceListener(listener, "(test-case=app-listener)");
+        
+        MBeanServer server = ManagementFactory.getPlatformMBeanServer();
+        server.registerMBean(listener, ObjectName.getInstance(OBJECT_NAME));
+    }
+
+    public void stop(BundleContext context) throws Exception {
+        MBeanServer server = ManagementFactory.getPlatformMBeanServer();
+        server.unregisterMBean(ObjectName.getInstance(OBJECT_NAME));
+    }
+
+}
diff --git a/kernel/test-apps/service-scoping/scoping.service.module.b/src/main/java/scoping/Listener.java b/kernel/test-apps/service-scoping/scoping.service.module.b/src/main/java/scoping/Listener.java
new file mode 100644
index 0000000..579c8bc
--- /dev/null
+++ b/kernel/test-apps/service-scoping/scoping.service.module.b/src/main/java/scoping/Listener.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package scoping;
+
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceEvent;
+import org.osgi.framework.ServiceListener;
+
+public class Listener implements ListenerMBean, ServiceListener {
+
+    private final AtomicInteger counter = new AtomicInteger();
+
+    private final BundleContext context;
+
+    public Listener(BundleContext context) {
+        this.context = context;
+    }
+
+    public int getCount() {
+        return this.counter.get();
+    }
+
+    public void registerService() {
+        Dictionary<String, String> properties = new Hashtable<String, String>();
+        properties.put("test-case", "app-listener");
+        this.context.registerService(CharSequence.class.getName(), "test", properties);
+    }
+
+    public void serviceChanged(ServiceEvent event) {
+        if (event.getType() == ServiceEvent.REGISTERED) {
+            this.counter.incrementAndGet();
+        }
+    }
+
+}
diff --git a/kernel/test-apps/service-scoping/scoping.service.module.b/src/main/java/scoping/ListenerMBean.java b/kernel/test-apps/service-scoping/scoping.service.module.b/src/main/java/scoping/ListenerMBean.java
new file mode 100644
index 0000000..99c2cc4
--- /dev/null
+++ b/kernel/test-apps/service-scoping/scoping.service.module.b/src/main/java/scoping/ListenerMBean.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package scoping;
+
+
+public interface ListenerMBean {
+
+    int getCount();
+    
+    void registerService();
+}
diff --git a/kernel/test-apps/service-scoping/scoping.service.module.b/src/main/resources/META-INF/MANIFEST.MF b/kernel/test-apps/service-scoping/scoping.service.module.b/src/main/resources/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..3a97166
--- /dev/null
+++ b/kernel/test-apps/service-scoping/scoping.service.module.b/src/main/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: scoping.service.module.b
+Import-Package: org.osgi.framework, javax.management
+Bundle-Activator: scoping.Activator
diff --git a/kernel/test-apps/service-scoping/scoping.service.module.b/src/main/resources/META-INF/spring/module.xml b/kernel/test-apps/service-scoping/scoping.service.module.b/src/main/resources/META-INF/spring/module.xml
new file mode 100644
index 0000000..fec4aa4
--- /dev/null
+++ b/kernel/test-apps/service-scoping/scoping.service.module.b/src/main/resources/META-INF/spring/module.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans:beans xmlns="http://www.springframework.org/schema/osgi"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"
+	xsi:schemaLocation="http://www.springframework.org/schema/osgi  
+       http://www.springframework.org/schema/osgi/spring-osgi.xsd
+       http://www.springframework.org/schema/beans   
+       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
+	<service ref="appendable" interface="java.lang.Appendable">
+		<service-properties>
+			<beans:entry key="provider" value="local" />
+		</service-properties>
+	</service>
+	
+	<service id="nestingCheck" interface="java.io.Serializable">
+		<beans:bean class="java.lang.String">
+			<beans:constructor-arg value="foo"/>
+		</beans:bean>
+	</service>
+	
+	<service id="interfacesCheck">
+		<interfaces>
+			<beans:value>java.io.Serializable</beans:value>
+		</interfaces>
+		<service-properties>
+			<beans:entry key="a" value="b"/>
+		</service-properties>
+		<beans:bean class="java.lang.String">
+			<beans:constructor-arg value="foo"/>
+		</beans:bean>
+	</service>
+	
+	<service id="publishIntoGlobal" interface="java.lang.CharSequence">
+		<service-properties>
+			<beans:entry key="org.eclipse.virgo.service.scope" value="global" />
+		</service-properties>
+		<beans:bean class="java.lang.String">
+			<beans:constructor-arg value="foo"/>
+		</beans:bean>
+	</service>
+	
+	<beans:bean id="appendable" class="java.lang.StringBuilder" />
+	
+	<reference id="global" interface="java.lang.Appendable" filter="(provider=global)"/>
+</beans:beans>
diff --git a/kernel/test-apps/service-scoping/scoping.service.module.b/src/test/java/.gitignore b/kernel/test-apps/service-scoping/scoping.service.module.b/src/test/java/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/test-apps/service-scoping/scoping.service.module.b/src/test/java/.gitignore
diff --git a/kernel/test-apps/service-scoping/scoping.service.module.b/src/test/resources/.gitignore b/kernel/test-apps/service-scoping/scoping.service.module.b/src/test/resources/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/test-apps/service-scoping/scoping.service.module.b/src/test/resources/.gitignore
diff --git a/kernel/test-apps/spring-2.5.6.A-sample/.springBeans b/kernel/test-apps/spring-2.5.6.A-sample/.springBeans
new file mode 100644
index 0000000..8058887
--- /dev/null
+++ b/kernel/test-apps/spring-2.5.6.A-sample/.springBeans
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beansProjectDescription>
+	<version>1</version>
+	<pluginVersion><![CDATA[2.2.6.200908051215-RELEASE]]></pluginVersion>
+	<configSuffixes>
+		<configSuffix><![CDATA[xml]]></configSuffix>
+	</configSuffixes>
+	<enableImports><![CDATA[false]]></enableImports>
+	<configs>
+	</configs>
+	<configSets>
+	</configSets>
+</beansProjectDescription>
diff --git a/kernel/test-apps/spring-2.5.6.A-sample/build.xml b/kernel/test-apps/spring-2.5.6.A-sample/build.xml
new file mode 100644
index 0000000..f1e0cba
--- /dev/null
+++ b/kernel/test-apps/spring-2.5.6.A-sample/build.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="spring.256A.sample">
+
+	<property file="${basedir}/../build.properties"/>
+    <property file="${basedir}/../../build.versions"/>
+    <property name="jar.output.file" value="${basedir}/../../org.eclipse.virgo.kernel.deployer.test/src/test/resources/spring.256A.sample.jar"/>
+	<import file="${basedir}/../../virgo-build/standard/default.xml"/>
+
+</project>
diff --git a/kernel/test-apps/spring-2.5.6.A-sample/ivy.xml b/kernel/test-apps/spring-2.5.6.A-sample/ivy.xml
new file mode 100644
index 0000000..ba94f72
--- /dev/null
+++ b/kernel/test-apps/spring-2.5.6.A-sample/ivy.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="http://ivyrep.jayasoft.org/ivy-doc.xsl"?>
+<ivy-module xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:noNamespaceSchemaLocation="http://incubator.apache.org/ivy/schemas/ivy.xsd"
+	version="1.3">
+
+	<info organisation="${project.organisation}" module="${ant.project.name}">
+		<ivyauthor name="rmadala" />
+	</info>
+
+	<configurations>
+		<include file="${virgo.build.dir}/common/default-ivy-configurations.xml" />
+	</configurations>
+
+	<publications>
+	</publications>
+
+	<dependencies>
+        <dependency org="org.springframework" name="org.springframework.beans" rev="2.5.6.A" conf="provided->compile"/>
+	</dependencies>
+
+</ivy-module>
diff --git a/kernel/test-apps/spring-2.5.6.A-sample/src/main/java/spring/sample/SampleBean.java b/kernel/test-apps/spring-2.5.6.A-sample/src/main/java/spring/sample/SampleBean.java
new file mode 100644
index 0000000..8964939
--- /dev/null
+++ b/kernel/test-apps/spring-2.5.6.A-sample/src/main/java/spring/sample/SampleBean.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package spring.sample;
+
+import org.springframework.beans.BeanUtils;
+
+public class SampleBean {
+
+	@SuppressWarnings("unused")
+	private final BeanUtils beanUtils;
+
+	public SampleBean() {
+		this.beanUtils = new BeanUtils() {
+		};
+	}
+
+	private String username;
+
+	private String password;
+
+	public String getPassword() {
+		return password;
+	}
+
+	public void setPassword(String password) {
+		this.password = password;
+	}
+
+	public String getUsername() {
+		return username;
+	}
+
+	public void setUsername(String username) {
+		this.username = username;
+	}
+
+}
diff --git a/kernel/test-apps/spring-2.5.6.A-sample/src/main/resources/META-INF/MANIFEST.MF b/kernel/test-apps/spring-2.5.6.A-sample/src/main/resources/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..35961ba
--- /dev/null
+++ b/kernel/test-apps/spring-2.5.6.A-sample/src/main/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,8 @@
+Manifest-Version: 1.0

+Bundle-Name: Spring 2.5.6.A Sample

+Bundle-ManifestVersion: 2

+Bundle-SymbolicName: spring.256A.sample

+Bundle-Version: 1.0.0

+Import-Bundle: org.springframework.beans;version="[2.5.6.A,2.5.6.A]"

+

+

diff --git a/kernel/test-apps/spring-2.5.6.A-sample/src/main/resources/META-INF/spring/applicationContext.xml b/kernel/test-apps/spring-2.5.6.A-sample/src/main/resources/META-INF/spring/applicationContext.xml
new file mode 100644
index 0000000..55be403
--- /dev/null
+++ b/kernel/test-apps/spring-2.5.6.A-sample/src/main/resources/META-INF/spring/applicationContext.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
+
+  <bean id="sampleBean" class="spring.sample.SampleBean">
+    <property name="username" value="admin"></property>
+  </bean>
+</beans>
diff --git a/kernel/test-apps/synthetic-tccl/build-par/build.xml b/kernel/test-apps/synthetic-tccl/build-par/build.xml
new file mode 100644
index 0000000..c4c521a
--- /dev/null
+++ b/kernel/test-apps/synthetic-tccl/build-par/build.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="synthetic.tccl">
+
+	<path id="bundles">
+		<pathelement location="../synthetic.tccl.bundle.a"/>
+		<pathelement location="../synthetic.tccl.bundle.b"/>
+	</path>
+
+	<property file="${basedir}/../../build.properties"/>
+	<property name="par.output.dir" value="${basedir}/../../../org.eclipse.virgo.kernel.deployer.test/src/test/resources/synthetic-tccl"/>
+	<import file="${basedir}/../../../virgo-build/par/default.xml"/>
+
+</project>
diff --git a/kernel/test-apps/synthetic-tccl/synthetic.tccl.bundle.a/build.xml b/kernel/test-apps/synthetic-tccl/synthetic.tccl.bundle.a/build.xml
new file mode 100644
index 0000000..6578846
--- /dev/null
+++ b/kernel/test-apps/synthetic-tccl/synthetic.tccl.bundle.a/build.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="synthetic.tccl.bundle.a">
+
+	<property file="${basedir}/../../build.properties"/>
+    <property file="${basedir}/../../../build.versions"/>
+
+	<import file="${basedir}/../../../virgo-build/standard/default.xml"/>
+
+</project>
diff --git a/kernel/test-apps/synthetic-tccl/synthetic.tccl.bundle.a/ivy.xml b/kernel/test-apps/synthetic-tccl/synthetic.tccl.bundle.a/ivy.xml
new file mode 100644
index 0000000..fe83cf4
--- /dev/null
+++ b/kernel/test-apps/synthetic-tccl/synthetic.tccl.bundle.a/ivy.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="http://ivyrep.jayasoft.org/ivy-doc.xsl"?>
+<ivy-module
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:noNamespaceSchemaLocation="http://incubator.apache.org/ivy/schemas/ivy.xsd"
+		version="1.3">
+
+	<info organisation="${project.organisation}" module="${ant.project.name}">
+		<ivyauthor name="gnormington"/>
+	</info>
+
+	<configurations>
+		<include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>
+	</configurations>
+
+	<publications>
+		<artifact name="${ant.project.name}"/>
+		<artifact name="${ant.project.name}-sources" type="src" ext="jar"/>
+	</publications>
+
+	<dependencies>
+		<dependency org="org.junit" name="com.springsource.org.junit" rev="${org.junit}" conf="test->runtime"/>
+	</dependencies>
+
+</ivy-module>
diff --git a/kernel/test-apps/synthetic-tccl/synthetic.tccl.bundle.a/src/main/java/.gitignore b/kernel/test-apps/synthetic-tccl/synthetic.tccl.bundle.a/src/main/java/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/test-apps/synthetic-tccl/synthetic.tccl.bundle.a/src/main/java/.gitignore
diff --git a/kernel/test-apps/synthetic-tccl/synthetic.tccl.bundle.a/src/main/java/synthetic/tccl/a/AClass.java b/kernel/test-apps/synthetic-tccl/synthetic.tccl.bundle.a/src/main/java/synthetic/tccl/a/AClass.java
new file mode 100644
index 0000000..c812e07
--- /dev/null
+++ b/kernel/test-apps/synthetic-tccl/synthetic.tccl.bundle.a/src/main/java/synthetic/tccl/a/AClass.java
@@ -0,0 +1,16 @@
+/*******************************************************************************
+ * Copyright (c) 20011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package synthetic.tccl.a;
+
+public class AClass {
+
+}
diff --git a/kernel/test-apps/synthetic-tccl/synthetic.tccl.bundle.a/src/main/resources/META-INF/MANIFEST.MF b/kernel/test-apps/synthetic-tccl/synthetic.tccl.bundle.a/src/main/resources/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..7381a5f
--- /dev/null
+++ b/kernel/test-apps/synthetic-tccl/synthetic.tccl.bundle.a/src/main/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: synthetic.tccl.bundle.a
+Export-Package: synthetic.tccl.a
+
diff --git a/kernel/test-apps/synthetic-tccl/synthetic.tccl.bundle.a/src/test/java/.gitignore b/kernel/test-apps/synthetic-tccl/synthetic.tccl.bundle.a/src/test/java/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/test-apps/synthetic-tccl/synthetic.tccl.bundle.a/src/test/java/.gitignore
diff --git a/kernel/test-apps/synthetic-tccl/synthetic.tccl.bundle.a/src/test/resources/.gitignore b/kernel/test-apps/synthetic-tccl/synthetic.tccl.bundle.a/src/test/resources/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/test-apps/synthetic-tccl/synthetic.tccl.bundle.a/src/test/resources/.gitignore
diff --git a/kernel/test-apps/synthetic-tccl/synthetic.tccl.bundle.b/build.xml b/kernel/test-apps/synthetic-tccl/synthetic.tccl.bundle.b/build.xml
new file mode 100644
index 0000000..d2c5835
--- /dev/null
+++ b/kernel/test-apps/synthetic-tccl/synthetic.tccl.bundle.b/build.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="synthetic.tccl.bundle.b">
+
+	<property file="${basedir}/../../build.properties"/>
+    <property file="${basedir}/../../../build.versions"/>
+
+	<import file="${basedir}/../../../virgo-build/standard/default.xml"/>
+
+</project>
diff --git a/kernel/test-apps/synthetic-tccl/synthetic.tccl.bundle.b/ivy.xml b/kernel/test-apps/synthetic-tccl/synthetic.tccl.bundle.b/ivy.xml
new file mode 100644
index 0000000..a632bad
--- /dev/null
+++ b/kernel/test-apps/synthetic-tccl/synthetic.tccl.bundle.b/ivy.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="http://ivyrep.jayasoft.org/ivy-doc.xsl"?>
+<ivy-module
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:noNamespaceSchemaLocation="http://incubator.apache.org/ivy/schemas/ivy.xsd"
+		version="1.3">
+
+	<info organisation="${project.organisation}" module="${ant.project.name}">
+		<ivyauthor name="gnormington"/>
+	</info>
+
+	<configurations>
+		<include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>
+	</configurations>
+
+	<publications>
+		<artifact name="${ant.project.name}"/>
+		<artifact name="${ant.project.name}-sources" type="src" ext="jar"/>
+	</publications>
+
+	<dependencies>
+	    <dependency org="${project.organisation}" name="synthetic.tccl.global" rev="latest.integration" conf="provided->runtime" />
+		<dependency org="org.junit" name="com.springsource.org.junit" rev="${org.junit}" conf="test->runtime"/>
+		<dependency org="org.eclipse.virgo.mirrored" name="org.eclipse.osgi" rev="${org.eclipse.osgi}" conf="provided->runtime"/>
+	</dependencies>
+
+</ivy-module>
diff --git a/kernel/test-apps/synthetic-tccl/synthetic.tccl.bundle.b/src/main/java/synthetic/tccl/b/Invoker.java b/kernel/test-apps/synthetic-tccl/synthetic.tccl.bundle.b/src/main/java/synthetic/tccl/b/Invoker.java
new file mode 100644
index 0000000..ca05a8b
--- /dev/null
+++ b/kernel/test-apps/synthetic-tccl/synthetic.tccl.bundle.b/src/main/java/synthetic/tccl/b/Invoker.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 20011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package synthetic.tccl.b;
+
+import synthetic.tccl.global.Library;
+
+public class Invoker {
+
+    public Invoker() throws ClassNotFoundException {
+        Library.run();
+    }
+
+}
diff --git a/kernel/test-apps/synthetic-tccl/synthetic.tccl.bundle.b/src/main/resources/META-INF/MANIFEST.MF b/kernel/test-apps/synthetic-tccl/synthetic.tccl.bundle.b/src/main/resources/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..79d2b96
--- /dev/null
+++ b/kernel/test-apps/synthetic-tccl/synthetic.tccl.bundle.b/src/main/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: synthetic.tccl.bundle.b
+Import-Package: synthetic.tccl.global
+
+
diff --git a/kernel/test-apps/synthetic-tccl/synthetic.tccl.bundle.b/src/main/resources/META-INF/spring/module.xml b/kernel/test-apps/synthetic-tccl/synthetic.tccl.bundle.b/src/main/resources/META-INF/spring/module.xml
new file mode 100644
index 0000000..74ff5c7
--- /dev/null
+++ b/kernel/test-apps/synthetic-tccl/synthetic.tccl.bundle.b/src/main/resources/META-INF/spring/module.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans:beans xmlns="http://www.springframework.org/schema/osgi"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"
+	xsi:schemaLocation="http://www.springframework.org/schema/osgi  
+       http://www.springframework.org/schema/osgi/spring-osgi.xsd
+       http://www.springframework.org/schema/beans   
+       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
+	
+	<beans:bean id="invoker" class="synthetic.tccl.b.Invoker" />
+	
+</beans:beans>
diff --git a/kernel/test-apps/synthetic-tccl/synthetic.tccl.bundle.b/src/test/java/.gitignore b/kernel/test-apps/synthetic-tccl/synthetic.tccl.bundle.b/src/test/java/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/test-apps/synthetic-tccl/synthetic.tccl.bundle.b/src/test/java/.gitignore
diff --git a/kernel/test-apps/synthetic-tccl/synthetic.tccl.bundle.b/src/test/resources/.gitignore b/kernel/test-apps/synthetic-tccl/synthetic.tccl.bundle.b/src/test/resources/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/test-apps/synthetic-tccl/synthetic.tccl.bundle.b/src/test/resources/.gitignore
diff --git a/kernel/test-apps/synthetic-tccl/synthetic.tccl.global/build.xml b/kernel/test-apps/synthetic-tccl/synthetic.tccl.global/build.xml
new file mode 100644
index 0000000..ee3da18
--- /dev/null
+++ b/kernel/test-apps/synthetic-tccl/synthetic.tccl.global/build.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="synthetic.tccl.global">
+
+	<property file="${basedir}/../../build.properties"/>
+    <property file="${basedir}/../../../build.versions"/>
+	<property name="jar.output.dir" value="${basedir}/../../../org.eclipse.virgo.kernel.deployer.test/src/test/resources/synthetic-tccl"/>
+	<import file="${basedir}/../../../virgo-build/standard/default.xml"/>
+
+</project>
diff --git a/kernel/test-apps/synthetic-tccl/synthetic.tccl.global/ivy.xml b/kernel/test-apps/synthetic-tccl/synthetic.tccl.global/ivy.xml
new file mode 100644
index 0000000..fe83cf4
--- /dev/null
+++ b/kernel/test-apps/synthetic-tccl/synthetic.tccl.global/ivy.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="http://ivyrep.jayasoft.org/ivy-doc.xsl"?>
+<ivy-module
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:noNamespaceSchemaLocation="http://incubator.apache.org/ivy/schemas/ivy.xsd"
+		version="1.3">
+
+	<info organisation="${project.organisation}" module="${ant.project.name}">
+		<ivyauthor name="gnormington"/>
+	</info>
+
+	<configurations>
+		<include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>
+	</configurations>
+
+	<publications>
+		<artifact name="${ant.project.name}"/>
+		<artifact name="${ant.project.name}-sources" type="src" ext="jar"/>
+	</publications>
+
+	<dependencies>
+		<dependency org="org.junit" name="com.springsource.org.junit" rev="${org.junit}" conf="test->runtime"/>
+	</dependencies>
+
+</ivy-module>
diff --git a/kernel/test-apps/synthetic-tccl/synthetic.tccl.global/src/main/java/.gitignore b/kernel/test-apps/synthetic-tccl/synthetic.tccl.global/src/main/java/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/test-apps/synthetic-tccl/synthetic.tccl.global/src/main/java/.gitignore
diff --git a/kernel/test-apps/synthetic-tccl/synthetic.tccl.global/src/main/java/synthetic/tccl/global/Library.java b/kernel/test-apps/synthetic-tccl/synthetic.tccl.global/src/main/java/synthetic/tccl/global/Library.java
new file mode 100644
index 0000000..967f9de
--- /dev/null
+++ b/kernel/test-apps/synthetic-tccl/synthetic.tccl.global/src/main/java/synthetic/tccl/global/Library.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * Copyright (c) 20011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package synthetic.tccl.global;
+
+public class Library {
+
+    public static void run() throws ClassNotFoundException {
+        Thread.currentThread().getContextClassLoader().loadClass("synthetic.tccl.a.AClass");
+    }
+}
diff --git a/kernel/test-apps/synthetic-tccl/synthetic.tccl.global/src/main/resources/META-INF/MANIFEST.MF b/kernel/test-apps/synthetic-tccl/synthetic.tccl.global/src/main/resources/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..56ef984
--- /dev/null
+++ b/kernel/test-apps/synthetic-tccl/synthetic.tccl.global/src/main/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,4 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: synthetic.tccl.global
+Export-Package: synthetic.tccl.global
diff --git a/kernel/test-apps/synthetic-tccl/synthetic.tccl.global/src/test/java/.gitignore b/kernel/test-apps/synthetic-tccl/synthetic.tccl.global/src/test/java/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/test-apps/synthetic-tccl/synthetic.tccl.global/src/test/java/.gitignore
diff --git a/kernel/test-apps/synthetic-tccl/synthetic.tccl.global/src/test/resources/.gitignore b/kernel/test-apps/synthetic-tccl/synthetic.tccl.global/src/test/resources/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/test-apps/synthetic-tccl/synthetic.tccl.global/src/test/resources/.gitignore
diff --git a/medic/.gitignore b/medic/.gitignore
new file mode 100644
index 0000000..3fbb103
--- /dev/null
+++ b/medic/.gitignore
@@ -0,0 +1,13 @@
+*/src/main/resources/META-INF/MANIFEST.MF
+*/src/test/resources/META-INF/TEST.MF
+target
+integration-repo
+ivy-cache
+.ant-targets-build.xml
+user-ivy.properties
+bin/
+build/
+.settings/
+.project
+.classpath
+
diff --git a/medic/CONTRIBUTING.md b/medic/CONTRIBUTING.md
new file mode 100644
index 0000000..e3a5790
--- /dev/null
+++ b/medic/CONTRIBUTING.md
@@ -0,0 +1,47 @@
+Contributing to Virgo
+=====================
+
+Thanks for your interest in this project.
+
+Project description:
+--------------------
+
+The Virgo Web Server from EclipseRT is a completely module-based Java application server that is designed to run enterprise Java applications and Spring-powered applications with a high degree of flexibility and reliability. It offers a simple yet comprehensive platform to develop, deploy, and service enterprise Java applications.
+The Virgo kernel supports the core concepts of Virgo and is not biased towards the web server, thus enabling other types of server to be created. The kernel can also be used stand-alone as a rich OSGi application platform. A server runtime can easily be constructed by deploying suitable bundles on top of the kernel.
+
+- https://projects.eclipse.org/projects/rt.virgo
+
+Developer resources:
+--------------------
+
+Information regarding source code management, builds, coding standards, and more.
+
+- https://projects.eclipse.org/projects/rt.virgo/developer
+
+Contributor License Agreement:
+------------------------------
+
+Before your contribution can be accepted by the project, you need to create and electronically sign the Eclipse Foundation Contributor License Agreement (CLA).
+
+- http://www.eclipse.org/legal/CLA.php
+
+Contact:
+--------
+
+Contact the project developers via the project's "dev" list.
+
+- https://dev.eclipse.org/mailman/listinfo/virgo-dev
+
+Search for bugs:
+----------------
+
+This project uses Bugzilla to track ongoing development and issues.
+
+- https://bugs.eclipse.org/bugs/buglist.cgi?product=Virgo
+
+Create a new bug:
+-----------------
+
+Be sure to search for existing bugs before you create another one. Remember that contributions are always welcome!
+
+- https://bugs.eclipse.org/bugs/enter_bug.cgi?product=Virgo
\ No newline at end of file
diff --git a/medic/build.gradle b/medic/build.gradle
new file mode 100644
index 0000000..986b213
--- /dev/null
+++ b/medic/build.gradle
@@ -0,0 +1,40 @@
+project(':medic:org.eclipse.virgo.medic') {
+    dependencies {
+        testCompile group: 'org.easymock', name: 'easymock', version: easymockVersion
+
+        compile group: "org.slf4j", name: "slf4j-api", version: slf4jVersion
+
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi", version: equinoxVersion, configuration: "compile", ext: "jar"
+    }
+}
+
+project(':medic:org.eclipse.virgo.medic.core') {
+    dependencies {
+        testCompile group: 'org.easymock', name: 'easymock', version: easymockVersion
+        testCompile project(':test:org.eclipse.virgo.test.stubs')
+
+        testRuntime "org.aspectj:aspectjrt:${project.aspectjVersion}"
+
+        compile project(':medic:org.eclipse.virgo.medic')
+        compile project(':util:org.eclipse.virgo.util.io')
+        compile project(':util:org.eclipse.virgo.util.osgi')
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi", version: equinoxVersion, configuration: "compile", ext: "jar"
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi.services", version: osgiServicesVersion, configuration: "compile", ext: "jar"
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.cm", version: equinoxCmVersion, configuration: "compile", ext: "jar"
+        compile group: "org.slf4j", name: "slf4j-api", version: slf4jVersion
+        compile group: "org.slf4j", name: "jul-to-slf4j", version: slf4jVersion
+
+        compile 'org.fusesource.jansi:jansi:1.11'
+
+        compile "ch.qos.logback:logback-core:${logbackVersion}"
+        compile "ch.qos.logback:logback-classic:${logbackVersion}"
+    }
+}
+
+project(':medic:org.eclipse.virgo.medic.test') {
+    dependencies {
+        compile project(':medic:org.eclipse.virgo.medic')
+
+        testRuntime "org.aspectj:aspectjrt:${project.aspectjVersion}"
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/.settings/org.eclipse.virgo.ide.bundlor.core.prefs b/medic/org.eclipse.virgo.medic.core/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
new file mode 100644
index 0000000..5bf8f0a
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
@@ -0,0 +1,5 @@
+#Tue Nov 23 11:21:55 GMT 2010
+org.eclipse.virgo.ide.bundlor.core.bundlor.generated.manifest.autoformatting=true
+org.eclipse.virgo.ide.bundlor.core.byte.code.scanning=true
+org.eclipse.virgo.ide.bundlor.core.template.properties.files=../build.versions;../build.properties
+eclipse.preferences.version=1
diff --git a/medic/org.eclipse.virgo.medic.core/.settings/org.eclipse.wst.common.project.facet.core.xml b/medic/org.eclipse.virgo.medic.core/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..92aa290
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+  <installed facet="org.eclipse.virgo.server.bundle" version="1.0"/>
+</faceted-project>
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/dump/impl/DumpContributorPublisher.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/dump/impl/DumpContributorPublisher.java
new file mode 100644
index 0000000..4584b91
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/dump/impl/DumpContributorPublisher.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.dump.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.virgo.medic.dump.DumpContributor;
+import org.eclipse.virgo.medic.dump.impl.heap.HeapDumpContributor;
+import org.eclipse.virgo.medic.dump.impl.summary.SummaryDumpContributor;
+import org.eclipse.virgo.medic.dump.impl.thread.ThreadDumpContributor;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceRegistration;
+
+public final class DumpContributorPublisher {
+
+    private static final String SUPPRESS_HEAP_DUMPS = "org.eclipse.virgo.suppress.heap.dumps";
+
+    private final List<ServiceRegistration<DumpContributor>> contributorRegistrations = new ArrayList<ServiceRegistration<DumpContributor>>();
+
+    private final BundleContext bundleContext;
+
+    public DumpContributorPublisher(BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
+    }
+
+    public void publishDumpContributors() {
+        publishDumpContributor(new SummaryDumpContributor());
+        if("false".equalsIgnoreCase(this.bundleContext.getProperty(SUPPRESS_HEAP_DUMPS))){
+            publishDumpContributor(new HeapDumpContributor());
+        }
+        publishDumpContributor(new ThreadDumpContributor());
+    }
+
+    @SuppressWarnings("unchecked")
+	private void publishDumpContributor(DumpContributor dumpContributor) {
+        ServiceRegistration<DumpContributor> registration = (ServiceRegistration<DumpContributor>)this.bundleContext.registerService(DumpContributor.class.getName(), dumpContributor, null);
+        this.contributorRegistrations.add(registration);
+    }
+
+    public void retractDumpContributors() {        
+        for (ServiceRegistration<DumpContributor> registration : this.contributorRegistrations) {
+            registration.unregister();
+        }
+        
+        this.contributorRegistrations.clear();
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/dump/impl/DumpContributorResolver.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/dump/impl/DumpContributorResolver.java
new file mode 100644
index 0000000..55f36f9
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/dump/impl/DumpContributorResolver.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.dump.impl;
+
+import java.util.List;
+
+import org.eclipse.virgo.medic.dump.DumpContributor;
+
+
+interface DumpContributorResolver {
+
+    List<DumpContributor> getDumpContributors();
+
+    void close();
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/dump/impl/DumpContributorTracker.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/dump/impl/DumpContributorTracker.java
new file mode 100644
index 0000000..3b8918d
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/dump/impl/DumpContributorTracker.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.dump.impl;
+
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.eclipse.virgo.medic.dump.DumpContributor;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.util.tracker.ServiceTrackerCustomizer;
+
+
+final class DumpContributorTracker implements ServiceTrackerCustomizer<DumpContributor ,DumpContributor> {
+
+    private final List<DumpContributor> contributors = new CopyOnWriteArrayList<DumpContributor>();
+
+    private final BundleContext bundleContext;
+
+    DumpContributorTracker(BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
+    }
+
+    public DumpContributor addingService(ServiceReference<DumpContributor> reference) {
+        DumpContributor service = bundleContext.getService(reference);
+        contributors.add(service);
+        return service;
+    }
+
+    public void modifiedService(ServiceReference<DumpContributor> reference, DumpContributor service) {
+    }
+
+    public void removedService(ServiceReference<DumpContributor> reference, DumpContributor service) {
+        this.contributors.remove(service);
+        this.bundleContext.ungetService(reference);
+    }
+
+    List<DumpContributor> getDumpContributors() {
+        return this.contributors;
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/dump/impl/StandardDump.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/dump/impl/StandardDump.java
new file mode 100644
index 0000000..3dd9500
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/dump/impl/StandardDump.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.dump.impl;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.Map;
+
+import org.eclipse.virgo.medic.dump.Dump;
+import org.eclipse.virgo.medic.dump.DumpContributionFailedException;
+
+
+final class StandardDump implements Dump {
+
+    private final File dumpDirectory;
+
+    private final String cause;
+
+    private final Map<String, Object> context;
+
+    private final Throwable[] throwables;
+
+    private final long timestamp;
+
+    StandardDump(String cause, long timestamp, Map<String, Object> context, Throwable[] throwables, File dumpDirectory) {
+        this.cause = cause;
+        this.timestamp = timestamp;
+        this.context = context;
+        this.throwables = throwables;
+        this.dumpDirectory = dumpDirectory;
+    }
+
+    public String getCause() {
+        return this.cause;
+    }
+
+    public Map<String, Object> getContext() {
+        return this.context;
+    }
+
+    public Throwable[] getThrowables() {
+        return this.throwables;
+    }
+
+    public long getTimestamp() {
+        return this.timestamp;
+    }
+
+    public File createFile(String name) {
+        return new File(this.dumpDirectory, name);
+    }
+
+    public FileOutputStream createFileOutputStream(String name) throws DumpContributionFailedException {
+        try {
+            return new FileOutputStream(createFile(name));
+        } catch (FileNotFoundException e) {
+            throw new DumpContributionFailedException("Unable to open output stream '" + name + "'");
+        }
+    }
+
+    public FileWriter createFileWriter(String name) throws DumpContributionFailedException {
+        try {
+            return new FileWriter(createFile(name));
+        } catch (IOException e) {
+            throw new DumpContributionFailedException("Unable to open file writer '" + name + "'");
+        }
+    }
+
+	File getDumpDirectory() {
+		return this.dumpDirectory;
+	}
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/dump/impl/StandardDumpContributorResolver.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/dump/impl/StandardDumpContributorResolver.java
new file mode 100644
index 0000000..ea4c538
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/dump/impl/StandardDumpContributorResolver.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.dump.impl;
+
+import java.util.List;
+
+import org.eclipse.virgo.medic.dump.DumpContributor;
+import org.osgi.framework.BundleContext;
+import org.osgi.util.tracker.ServiceTracker;
+
+public final class StandardDumpContributorResolver implements
+		DumpContributorResolver {
+
+	private final ServiceTracker<DumpContributor, DumpContributor> serviceTracker;
+
+	private final DumpContributorTracker dumpContributorTracker;
+
+	public StandardDumpContributorResolver(BundleContext bundleContext) {
+		this.dumpContributorTracker = new DumpContributorTracker(bundleContext);
+
+		this.serviceTracker = new ServiceTracker<DumpContributor, DumpContributor>(
+				bundleContext, DumpContributor.class.getName(),
+				this.dumpContributorTracker);
+		this.serviceTracker.open();
+	}
+
+	public List<DumpContributor> getDumpContributors() {
+		return this.dumpContributorTracker.getDumpContributors();
+	}
+
+	public void close() {
+		this.serviceTracker.close();
+	}
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/dump/impl/StandardDumpGenerator.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/dump/impl/StandardDumpGenerator.java
new file mode 100644
index 0000000..e6a1016
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/dump/impl/StandardDumpGenerator.java
@@ -0,0 +1,172 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.dump.impl;
+
+import java.io.File;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Dictionary;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.virgo.medic.dump.DumpContributionFailedException;
+import org.eclipse.virgo.medic.dump.DumpContributor;
+import org.eclipse.virgo.medic.dump.DumpGenerationFailedException;
+import org.eclipse.virgo.medic.dump.DumpGenerator;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.medic.impl.MedicLogEvents;
+import org.eclipse.virgo.medic.impl.config.ConfigurationProvider;
+
+
+public final class StandardDumpGenerator implements DumpGenerator {
+
+    private static final DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd-HH-mm-SSS");
+
+    private static final Map<String, Object> NO_CONTEXT = new HashMap<String, Object>();
+
+    private final DumpContributorResolver dumpContributorsAccessor;
+
+    private final ConfigurationProvider configurationProvider;
+
+    private final EventLogger eventLogger;
+    
+    private String latestDumpId = null;
+
+    public StandardDumpGenerator(DumpContributorResolver accessor, ConfigurationProvider configurationProvider, EventLogger eventLogger) {
+        this.dumpContributorsAccessor = accessor;
+        this.configurationProvider = configurationProvider;
+        this.eventLogger = eventLogger;
+    }
+
+    public void generateDump(String cause, Throwable... throwables) {
+        this.generateDump(cause, NO_CONTEXT, throwables);
+    }
+
+    public void generateDump(String cause, Map<String, Object> context, Throwable... throwables) {
+        StandardDump dump;
+        try {
+            dump = createDump(cause, context, throwables);
+        } catch (DumpGenerationFailedException e) {
+            return;
+        }
+
+        for (DumpContributor dumpContributor : getDumpContributors(cause)) {
+            try {
+                dumpContributor.contribute(dump);
+            } catch (DumpContributionFailedException e) {
+                this.eventLogger.log(MedicLogEvents.CONTRIBUTION_FAILED, e, dumpContributor.getName(), dump.getTimestamp());
+            } catch (RuntimeException e) {
+                this.eventLogger.log(MedicLogEvents.CONTRIBUTION_ERROR, e, dumpContributor.getName(), dump.getTimestamp());
+            }
+        }
+        
+        this.eventLogger.log(MedicLogEvents.DUMP_GENERATED, dump.getDumpDirectory());
+    }
+
+    private StandardDump createDump(String cause, Map<String, Object> context, Throwable... throwables) throws DumpGenerationFailedException {        
+        File dumpDirectory = null;
+        
+        long timestamp = System.currentTimeMillis();
+        
+        while ((dumpDirectory = getDumpDirectory(timestamp)) == null) {
+            try {
+                Thread.sleep(10);
+            } catch (InterruptedException ie) {
+                ie.printStackTrace();
+            }
+            timestamp = System.currentTimeMillis();
+        }        
+
+        return new StandardDump(cause, timestamp, context, throwables, dumpDirectory);
+    }
+
+    private List<DumpContributor> getDumpContributors(String cause) {
+        Dictionary<?, ?> configuration = this.configurationProvider.getConfiguration();
+        String excludedContributorsProperty = (String) configuration.get("dump.exclusions." + cause);
+        List<String> excludedContributors = toList(excludedContributorsProperty);
+        excludedContributorsProperty = (String) configuration.get("dump.exclusions.*");
+        excludedContributors.addAll(toList(excludedContributorsProperty));
+
+        List<DumpContributor> candidateContributors = this.dumpContributorsAccessor.getDumpContributors();
+
+        List<DumpContributor> includedContributors = new ArrayList<DumpContributor>();
+
+        for (DumpContributor candidate : candidateContributors) {
+            if (!excludedContributors.contains(candidate.getName())) {
+                includedContributors.add(candidate);
+            }
+        }
+
+        return includedContributors;
+    }
+
+    private List<String> toList(String property) {
+        List<String> list = new ArrayList<String>();
+        if (property != null) {
+            String[] components = property.split(",");
+            for (String component : components) {
+                String trimmed = component.trim();
+                list.add(trimmed);
+            }
+        }
+        return list;
+    }
+
+    private String getDumpId(long timestamp) {
+        Date date = new Date(timestamp);
+        synchronized (DATE_FORMAT) {
+            String dumpId = DATE_FORMAT.format(date);
+            if (dumpId.equals(latestDumpId)) {
+                dumpId = null;
+            } else {
+                latestDumpId = dumpId;
+            }            
+            return dumpId;
+        }
+    }
+
+    private File getDumpDirectory(long timestamp) throws DumpGenerationFailedException {
+        File dumpDirectory = null;
+        
+        String dumpId = getDumpId(timestamp);
+        
+        if (dumpId != null) {
+            dumpDirectory = new File(getRootDumpDirectory(), dumpId);
+            if (dumpDirectory.exists()) {
+                dumpDirectory = null;
+            } else {
+                createDirectory(dumpDirectory);
+            }
+        }
+        
+        return dumpDirectory;                        
+    }
+
+    private String getRootDumpDirectory() {
+        Dictionary<?, ?> configuration = this.configurationProvider.getConfiguration();
+        return (String) configuration.get(ConfigurationProvider.KEY_DUMP_ROOT_DIRECTORY);
+    }
+
+    private void createDirectory(File file) throws DumpGenerationFailedException {
+        if (!file.mkdirs()) {
+            this.eventLogger.log(MedicLogEvents.DIRECTORY_CREATION_FAILED, file.getAbsolutePath());
+            throw new DumpGenerationFailedException("Directory creation failed");
+        }
+    }
+
+    public void close() {
+        this.dumpContributorsAccessor.close();
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/dump/impl/heap/HeapDumpContributor.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/dump/impl/heap/HeapDumpContributor.java
new file mode 100644
index 0000000..4083594
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/dump/impl/heap/HeapDumpContributor.java
@@ -0,0 +1,101 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.dump.impl.heap;
+
+import java.io.PrintWriter;
+import java.lang.management.ManagementFactory;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+import javax.management.MBeanServer;
+
+import org.eclipse.virgo.medic.dump.Dump;
+import org.eclipse.virgo.medic.dump.DumpContributionFailedException;
+import org.eclipse.virgo.medic.dump.DumpContributor;
+
+public final class HeapDumpContributor implements DumpContributor {
+
+    private static final MBeanServer MBEAN_SERVER = ManagementFactory.getPlatformMBeanServer();
+
+    private static final String HOTSPOT_DIAGNOSTIC_MBEAN_NAME = "com.sun.management:type=HotSpotDiagnostic";
+
+    private final Method heapDumpMethod;
+
+    private final Object diagnosticMBean;
+
+    public HeapDumpContributor() {
+
+        Method heapDumpMethod = null;
+        Object diagnosticMBean = null;
+
+        // Java 7 strategy
+        try {
+            Class<?> diagnosticMbeanClass = Class.forName("com.sun.management.HotSpotDiagnosticMXBean", true,
+                HeapDumpContributor.class.getClassLoader());
+            diagnosticMBean = ManagementFactory.newPlatformMXBeanProxy(MBEAN_SERVER, HOTSPOT_DIAGNOSTIC_MBEAN_NAME, diagnosticMbeanClass);
+        } catch (Exception e) {
+            // Ignore
+        }
+
+        if (diagnosticMBean == null) {
+            // Java 6 strategy
+            try {
+                Class<?> managementFactoryClass = Class.forName("sun.management.ManagementFactory", true, HeapDumpContributor.class.getClassLoader());
+                Method method = managementFactoryClass.getMethod("getDiagnosticMXBean");
+                diagnosticMBean = method.invoke(null);
+            } catch (Exception e) {
+                heapDumpMethod = null;
+                diagnosticMBean = null;
+            }
+        }
+
+        if (diagnosticMBean != null) {
+            try {
+                heapDumpMethod = diagnosticMBean.getClass().getMethod("dumpHeap", String.class, boolean.class);
+            } catch (Exception e) {
+                heapDumpMethod = null;
+                diagnosticMBean = null;
+            }
+        }
+
+        this.heapDumpMethod = heapDumpMethod;
+        this.diagnosticMBean = diagnosticMBean;
+    }
+
+    public void contribute(Dump dump) throws DumpContributionFailedException {
+        try {
+            if (this.heapDumpMethod != null && this.diagnosticMBean != null) {
+                heapDumpMethod.invoke(this.diagnosticMBean, dump.createFile("heap.out").getAbsolutePath(), true);
+            } else {
+                PrintWriter writer = null;
+                try {
+                    writer = new PrintWriter(dump.createFileWriter("heap.err"));
+                    writer.println("Diagnostic MXBean is not available. Heap dump cannot be generated.");
+                } finally {
+                    if (writer != null) {
+                        writer.close();
+                    }
+                }
+            }
+        } catch (InvocationTargetException e) {
+            throw new DumpContributionFailedException("Failed to generate heap dump contribution", e);
+        } catch (IllegalArgumentException e) {
+            throw new DumpContributionFailedException("Failed to generate heap dump contribution", e);
+        } catch (IllegalAccessException e) {
+            throw new DumpContributionFailedException("Failed to generate heap dump contribution", e);
+        }
+    }
+
+    public String getName() {
+        return "heap";
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/dump/impl/summary/SummaryDumpContributor.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/dump/impl/summary/SummaryDumpContributor.java
new file mode 100644
index 0000000..6c4489c
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/dump/impl/summary/SummaryDumpContributor.java
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.dump.impl.summary;
+
+import java.io.PrintWriter;
+import java.text.DateFormat;
+import java.util.Date;
+
+import org.eclipse.virgo.medic.dump.Dump;
+import org.eclipse.virgo.medic.dump.DumpContributionFailedException;
+import org.eclipse.virgo.medic.dump.DumpContributor;
+
+
+public final class SummaryDumpContributor implements DumpContributor {
+
+    private final DateFormat dateFormat = DateFormat.getDateInstance();
+
+    private final DateFormat timeFormat = DateFormat.getTimeInstance(DateFormat.LONG);
+
+    private final Object formatterLock = new Object();
+
+    public void contribute(Dump dump) throws DumpContributionFailedException {
+        PrintWriter writer = null;
+        try {
+            writer = new PrintWriter(dump.createFileWriter("summary.txt"));
+            processHeader(writer, dump.getTimestamp());
+            processCause(writer, dump.getCause());
+            processThrowables(writer, dump.getThrowables());
+        } finally {
+            if (writer != null) {
+                writer.close();
+            }
+        }
+    }
+
+    public String getName() {
+        return "summary";
+    }
+
+    private void processHeader(PrintWriter dump, long timestamp) {
+        synchronized (formatterLock) {
+            dump.println("Date:\t\t" + dateFormat.format(new Date(timestamp)));
+            dump.println("Time:\t\t" + timeFormat.format(new Date(timestamp)));
+        }
+    }
+
+    private static void processCause(PrintWriter dump, String cause) {
+        dump.println();
+        dump.println("Cause: " + cause);
+    }
+
+    private static void processThrowables(PrintWriter dump, Throwable... throwables) {
+        if (throwables.length == 0) {
+            dump.println();
+            dump.println("Exception: None");
+        } else {
+            for (Throwable throwable : throwables) {
+                dump.println();
+                dump.println("Exception:");
+                throwable.printStackTrace(dump);
+            }
+        }
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/dump/impl/thread/Java5ThreadInfoWriter.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/dump/impl/thread/Java5ThreadInfoWriter.java
new file mode 100644
index 0000000..557a138
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/dump/impl/thread/Java5ThreadInfoWriter.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.dump.impl.thread;
+
+import java.io.PrintWriter;
+import java.lang.management.ThreadInfo;
+
+final class Java5ThreadInfoWriter implements ThreadInfoWriter {
+
+    /**
+     * {@inheritDoc}
+     */
+    public void write(ThreadInfo threadInfo, PrintWriter writer) {
+        writer.print(String.format("\"%s\" Id=%s %s", threadInfo.getThreadName(), threadInfo.getThreadId(), threadInfo.getThreadState()));
+        if (threadInfo.getLockName() != null) {
+            writer.print(String.format(" on %s", threadInfo.getLockName()));
+            if (threadInfo.getLockOwnerName() != null) {
+                writer.print(String.format(" owned by \"%s\" Id=%s", threadInfo.getLockOwnerName(), threadInfo.getLockOwnerId()));
+            }
+        }
+        if (threadInfo.isInNative()) {
+            writer.println(" (in native)");
+        } else {
+            writer.println();
+        }
+        StackTraceElement[] stackTraceElements = threadInfo.getStackTrace();
+        for (StackTraceElement stackTraceElement : stackTraceElements) {
+            writer.println("    at " + stackTraceElement);
+        }
+    }
+}
+
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/dump/impl/thread/Java5ThreadMXBeanDelegate.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/dump/impl/thread/Java5ThreadMXBeanDelegate.java
new file mode 100644
index 0000000..0c054b6
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/dump/impl/thread/Java5ThreadMXBeanDelegate.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.dump.impl.thread;
+
+import java.lang.management.ManagementFactory;
+import java.lang.management.ThreadInfo;
+import java.lang.management.ThreadMXBean;
+
+/**
+ * A Java 5-based implementation of <code>ThreadMXBeanDelegate</code>. This class requires a Java 5 (or later) VM.
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread-safe.
+ * 
+ */
+public class Java5ThreadMXBeanDelegate implements ThreadMXBeanDelegate {
+
+    private ThreadMXBean threadBean = ManagementFactory.getThreadMXBean();
+
+    /**
+     * {@inheritDoc}
+     */
+    public long[] findDeadlockedThreads() {
+        return threadBean.findMonitorDeadlockedThreads();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public ThreadInfo[] getThreadInfo(long[] threadIds) {
+        return threadBean.getThreadInfo(threadIds, Integer.MAX_VALUE);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public ThreadInfo[] dumpAllThreads() {
+        return threadBean.getThreadInfo(threadBean.getAllThreadIds(), Integer.MAX_VALUE);
+    }
+}
+
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/dump/impl/thread/StandardThreadInfoWriter.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/dump/impl/thread/StandardThreadInfoWriter.java
new file mode 100644
index 0000000..a6a1475
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/dump/impl/thread/StandardThreadInfoWriter.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.dump.impl.thread;
+
+import java.io.PrintWriter;
+import java.lang.management.ThreadInfo;
+
+class StandardThreadInfoWriter implements ThreadInfoWriter {
+
+    public void write(ThreadInfo threadInfo, PrintWriter writer) {
+        writer.print(threadInfo.toString().replaceAll("\n",  System.getProperty("line.separator")));
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/dump/impl/thread/StandardThreadMXBeanDelegate.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/dump/impl/thread/StandardThreadMXBeanDelegate.java
new file mode 100644
index 0000000..e07f607
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/dump/impl/thread/StandardThreadMXBeanDelegate.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.dump.impl.thread;
+
+import java.lang.management.ManagementFactory;
+import java.lang.management.ThreadInfo;
+import java.lang.management.ThreadMXBean;
+
+public class StandardThreadMXBeanDelegate implements ThreadMXBeanDelegate {
+
+    private final ThreadMXBean threadBean = ManagementFactory.getThreadMXBean();
+
+    public ThreadInfo[] dumpAllThreads() {
+        return threadBean.dumpAllThreads(true, true);
+    }
+
+    public long[] findDeadlockedThreads() {
+        return threadBean.findDeadlockedThreads();
+    }
+
+    public ThreadInfo[] getThreadInfo(long[] threadIds) {
+        return threadBean.getThreadInfo(threadIds, true, true);
+    }
+
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/dump/impl/thread/ThreadDumpContributor.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/dump/impl/thread/ThreadDumpContributor.java
new file mode 100644
index 0000000..e6b4fd8
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/dump/impl/thread/ThreadDumpContributor.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.dump.impl.thread;
+
+import java.io.PrintWriter;
+import java.lang.management.ThreadInfo;
+
+import org.eclipse.virgo.medic.dump.Dump;
+import org.eclipse.virgo.medic.dump.DumpContributionFailedException;
+import org.eclipse.virgo.medic.dump.DumpContributor;
+
+
+public class ThreadDumpContributor implements DumpContributor {
+
+    private final ThreadMXBeanDelegate threadBeanDelegate;
+
+    private final ThreadInfoWriter threadInfoWriter;
+
+    public ThreadDumpContributor(ThreadMXBeanDelegate threadBeanDelegate, ThreadInfoWriter threadInfoPrinter) {
+        this.threadBeanDelegate = threadBeanDelegate;
+        this.threadInfoWriter = threadInfoPrinter;
+    }
+
+    public ThreadDumpContributor() {
+        String javaSpecificationVersion = System.getProperty("java.specification.version");
+        if ("1.5".equals(javaSpecificationVersion)) {
+            this.threadBeanDelegate = new Java5ThreadMXBeanDelegate();
+            this.threadInfoWriter = new Java5ThreadInfoWriter();
+        } else {
+            this.threadBeanDelegate = new StandardThreadMXBeanDelegate();
+            this.threadInfoWriter = new StandardThreadInfoWriter();
+        }
+    }
+
+    public String getName() {
+        return "thread";
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void contribute(Dump dump) throws DumpContributionFailedException {
+        PrintWriter writer = null;
+        try {
+            writer = new PrintWriter(dump.createFileWriter("thread.txt"));
+            processDeadlocks(writer);
+            processAllThreads(writer);
+            writer.close();
+        } finally {
+            if (writer != null) {
+                writer.close();
+            }
+        }
+    }
+
+    private void processDeadlocks(PrintWriter dump) {
+        dump.println("Deadlocked Threads");
+        dump.println("==================");
+        long[] deadlockedThreadIds = this.threadBeanDelegate.findDeadlockedThreads();
+        if (deadlockedThreadIds != null) {
+            dumpThreads(dump, this.threadBeanDelegate.getThreadInfo(deadlockedThreadIds));
+        }
+    }
+
+    private void processAllThreads(PrintWriter dump) {
+        dump.println();
+        dump.println("All Threads");
+        dump.println("===========");
+        dumpThreads(dump, this.threadBeanDelegate.dumpAllThreads());
+    }
+
+    private void dumpThreads(PrintWriter dump, ThreadInfo[] infos) {
+        for (ThreadInfo info : infos) {
+            dump.println();
+            this.threadInfoWriter.write(info, dump);
+        }
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/dump/impl/thread/ThreadInfoWriter.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/dump/impl/thread/ThreadInfoWriter.java
new file mode 100644
index 0000000..cdfe8f2
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/dump/impl/thread/ThreadInfoWriter.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.dump.impl.thread;
+
+import java.io.PrintWriter;
+import java.lang.management.ThreadInfo;
+
+/**
+ * A helper interface for writing {@link ThreadInfo} instances enabling the plugging-in of an implementation that can
+ * cope with the differences in {@link ThreadInfo}'s contents on Java 5 and Java 6 virtual machines.
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations <strong>must</strong> be thread-safe.
+ * 
+ */
+interface ThreadInfoWriter {
+
+    /**
+     * Writes the supplied {@ThreadInfo} to the supplied {@PrintWriter}.
+     * 
+     * @param threadInfo The <code>ThreadInfo</code>
+     * @param writer the <code>PrintWriter</code> to write to
+     */
+    void write(ThreadInfo threadInfo, PrintWriter writer);
+}
+
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/dump/impl/thread/ThreadMXBeanDelegate.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/dump/impl/thread/ThreadMXBeanDelegate.java
new file mode 100644
index 0000000..ac8501a
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/dump/impl/thread/ThreadMXBeanDelegate.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.dump.impl.thread;
+
+import java.lang.management.ThreadInfo;
+
+/**
+ * A delegate for ThreadMXBean to hide the differences in the methods and capabilities of its Java 5 and Java 6
+ * versions.
+ * <p />
+ * <strong>Concurrent Semantics</strong><br />
+ * Implementation <strong>must</strong> be thread-safe.
+ * 
+ */
+interface ThreadMXBeanDelegate {
+
+    /**
+     * Finds all threads in the JVM that are deadlocked
+     * 
+     * @return An array of thread ids of the deadlocked threads
+     */
+    long[] findDeadlockedThreads();
+
+    /**
+     * Returns an array of <code>ThreadInfo</code> instances, one for each thread identified in the supplied array of
+     * thread ids.
+     * 
+     * @param threadIds The thread ids
+     * @return The array of <code>ThreadInfo</code> instances.
+     */
+    public ThreadInfo[] getThreadInfo(long[] threadIds);
+
+    /**
+     * Returns an array of <code>ThreadInfo</code> instances, one for each live thread.
+     * 
+     * @return The array of <code>ThreadInfo</code> instances.
+     */
+    public ThreadInfo[] dumpAllThreads();
+}
+
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/eventlog/impl/BundleSearchingPropertyResourceBundleResolver.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/eventlog/impl/BundleSearchingPropertyResourceBundleResolver.java
new file mode 100644
index 0000000..d86a2da
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/eventlog/impl/BundleSearchingPropertyResourceBundleResolver.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.eventlog.impl;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.PropertyResourceBundle;
+
+import org.osgi.framework.Bundle;
+
+public final class BundleSearchingPropertyResourceBundleResolver implements PropertyResourceBundleResolver {
+
+    public List<PropertyResourceBundle> getResourceBundles(Bundle bundle, String candidatePropertiesFileName) {
+        Enumeration<?> entries = bundle.findEntries("", candidatePropertiesFileName, false);
+        List<PropertyResourceBundle> propertyBundles = new ArrayList<PropertyResourceBundle>();
+        if (entries != null) {
+            while (entries.hasMoreElements()) {
+                URL propertiesFile = (URL) entries.nextElement();
+                InputStream input = null;
+                try {
+                    input = propertiesFile.openStream();
+                    propertyBundles.add(new PropertyResourceBundle(input));
+                } catch (IOException ioe) {
+                } finally {
+                    try {
+                        if (input != null) {
+                            input.close();
+                        }
+                    } catch (IOException e) {
+                    }
+                }
+            }
+        }
+        return propertyBundles;
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/eventlog/impl/EventLoggerServiceFactory.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/eventlog/impl/EventLoggerServiceFactory.java
new file mode 100644
index 0000000..b5fc498
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/eventlog/impl/EventLoggerServiceFactory.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.eventlog.impl;
+
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.medic.eventlog.EventLoggerFactory;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.ServiceFactory;
+import org.osgi.framework.ServiceRegistration;
+
+
+public final class EventLoggerServiceFactory implements ServiceFactory<EventLogger> {
+
+    private final EventLoggerFactory eventLoggerFactory;
+
+    public EventLoggerServiceFactory(EventLoggerFactory factory) {
+        this.eventLoggerFactory = factory;
+    }
+
+    public EventLogger getService(Bundle bundle, ServiceRegistration<EventLogger> registration) {
+        return this.eventLoggerFactory.createEventLogger(bundle);
+    }
+
+    public void ungetService(Bundle bundle, ServiceRegistration<EventLogger> registration, EventLogger service) {
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/eventlog/impl/LocaleResolver.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/eventlog/impl/LocaleResolver.java
new file mode 100644
index 0000000..c29742d
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/eventlog/impl/LocaleResolver.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.eventlog.impl;
+
+import java.util.Locale;
+
+/**
+ * A <code>LocaleResolver</code> provides a basic strategy for determining the current {@link Locale}.
+ * <strong>Concurrent Semantics</strong><br />
+ * Implementations <strong>must</strong> be thread-safe.
+ * 
+ */
+public interface LocaleResolver {
+
+    /**
+     * Return the current {@link Locale}. This should never return <code>null</code>.
+     * 
+     * @return the current <code>Locale</code>. Never <code>null</code>.
+     */
+    Locale getLocale();
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/eventlog/impl/MessageResolver.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/eventlog/impl/MessageResolver.java
new file mode 100644
index 0000000..4ace248
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/eventlog/impl/MessageResolver.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.eventlog.impl;
+
+import java.util.Locale;
+
+/**
+ * A LogEventMessageResolver is used to resolve the message of a logged event.
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Implementations <strong>must</strong> be thread-safe.
+ * 
+ */
+public interface MessageResolver {
+
+    /**
+     * Resolves the message identified by the supplied event code.
+     * @param eventCode The code identifying the message to be resolved
+     * @return The resolved message, or <code>null</code> if no message could be found
+     */
+    String resolveLogEventMessage(String eventCode);
+
+    /**
+     * Resolves the message identified by the supplied event code in the supplied {@link Locale}.
+     * 
+     * @param eventCode The code identifying the message is to be resolved
+     * @param locale the {@link Locale} in which the message is to be resolved
+     * @return The resolved message, or <code>null</code> if no message could be found
+     */
+    String resolveLogEventMessage(String eventCode, Locale locale);
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/eventlog/impl/PropertyResourceBundleResolver.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/eventlog/impl/PropertyResourceBundleResolver.java
new file mode 100644
index 0000000..f043968
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/eventlog/impl/PropertyResourceBundleResolver.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.eventlog.impl;
+
+import java.util.List;
+import java.util.PropertyResourceBundle;
+
+import org.osgi.framework.Bundle;
+
+public interface PropertyResourceBundleResolver {
+
+    List<PropertyResourceBundle> getResourceBundles(Bundle bundle, String candidatePropertiesFileName);
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/eventlog/impl/ResourceBundleUtils.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/eventlog/impl/ResourceBundleUtils.java
new file mode 100644
index 0000000..4bc9795
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/eventlog/impl/ResourceBundleUtils.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.eventlog.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+
+final class ResourceBundleUtils {
+
+    private static final String PROPERTIES_SUFFIX = ".properties";
+
+    static List<String> generateCandidatePropertiesFileNames(String baseName, Locale locale) {
+        List<String> candidateNames = new ArrayList<String>();
+
+        candidateNames.addAll(generateCandidatePropertiesFileNames(baseName, locale.getLanguage(), locale.getCountry(), locale.getVariant()));
+
+        Locale defaultLocale = Locale.getDefault();
+
+        if (!defaultLocale.equals(locale)) {
+            candidateNames.addAll(generateCandidatePropertiesFileNames(baseName, defaultLocale.getLanguage(), defaultLocale.getCountry(),
+                defaultLocale.getVariant()));
+        }
+
+        candidateNames.add(baseName + PROPERTIES_SUFFIX);
+
+        return candidateNames;
+    }
+
+    private static List<String> generateCandidatePropertiesFileNames(String baseName, String language, String country, String variant) {
+        List<String> candidateNames = new ArrayList<String>();
+
+        if (hasText(language)) {
+            if (hasText(country)) {
+                if (hasText(variant)) {
+                    candidateNames.add(baseName + "_" + language + "_" + country + "_" + variant + PROPERTIES_SUFFIX);
+                }
+                candidateNames.add(baseName + "_" + language + "_" + country + PROPERTIES_SUFFIX);
+            }
+            candidateNames.add(baseName + "_" + language + PROPERTIES_SUFFIX);
+        }
+
+        return candidateNames;
+    }
+
+    private static boolean hasText(String string) {
+        return (string != null && string.length() > 0);
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/eventlog/impl/StandardLocaleResolver.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/eventlog/impl/StandardLocaleResolver.java
new file mode 100644
index 0000000..fd63b99
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/eventlog/impl/StandardLocaleResolver.java
@@ -0,0 +1,21 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.eventlog.impl;
+
+import java.util.Locale;
+
+public final class StandardLocaleResolver implements LocaleResolver {
+
+    public Locale getLocale() {
+        return Locale.getDefault();
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/eventlog/impl/StandardMessageResolver.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/eventlog/impl/StandardMessageResolver.java
new file mode 100644
index 0000000..5969c1b
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/eventlog/impl/StandardMessageResolver.java
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.eventlog.impl;
+
+import java.util.List;
+import java.util.Locale;
+import java.util.MissingResourceException;
+import java.util.PropertyResourceBundle;
+
+import org.osgi.framework.Bundle;
+
+public final class StandardMessageResolver implements MessageResolver {
+
+    private static final String RESOURCE_BUNDLE_NAME = "EventLogMessages";
+
+    private final LocaleResolver localeResolver;
+
+    private final PropertyResourceBundleResolver resourceBundleLocator;
+
+    private final Bundle primaryBundle;
+
+    private final Bundle secondaryBundle;
+
+    public StandardMessageResolver(LocaleResolver localeResolver, PropertyResourceBundleResolver resourceBundleLocator, Bundle primaryBundle,
+        Bundle secondaryBundle) {
+        this.localeResolver = localeResolver;
+        this.resourceBundleLocator = resourceBundleLocator;
+        this.primaryBundle = primaryBundle;
+        this.secondaryBundle = secondaryBundle;
+    }
+
+    public String resolveLogEventMessage(String eventCode) {
+        return resolveLogEventMessage(eventCode, this.localeResolver.getLocale());
+    }
+
+    public String resolveLogEventMessage(String eventCode, Locale locale) {
+        List<String> candidatePropertiesFileNames = ResourceBundleUtils.generateCandidatePropertiesFileNames(RESOURCE_BUNDLE_NAME, locale);
+
+        String message = resolveMessageInBundle(this.primaryBundle, eventCode, candidatePropertiesFileNames);
+
+        if (message == null) {
+            message = resolveMessageInBundle(this.secondaryBundle, eventCode, candidatePropertiesFileNames);
+        }
+
+        return message;
+    }
+
+    private String resolveMessageInBundle(Bundle bundle, String key, List<String> candidatePropertiesFileNames) {
+        for (String candidatePropertiesFileName : candidatePropertiesFileNames) {
+            List<PropertyResourceBundle> resourceBundles = this.resourceBundleLocator.getResourceBundles(bundle, candidatePropertiesFileName);
+            for (PropertyResourceBundle resourceBundle : resourceBundles) {
+                try {
+                    String string = resourceBundle.getString(key);
+                    if (string != null) {
+                        return string;
+                    }
+                } catch (MissingResourceException mre) {
+                    // Continue searching
+                }
+            }
+        }
+        return null;
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/eventlog/impl/logback/LogBackEventLogger.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/eventlog/impl/logback/LogBackEventLogger.java
new file mode 100644
index 0000000..074e55b
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/eventlog/impl/logback/LogBackEventLogger.java
@@ -0,0 +1,103 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.eventlog.impl.logback;
+
+import java.util.Locale;
+
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.medic.eventlog.Level;
+import org.eclipse.virgo.medic.eventlog.LogEvent;
+import org.eclipse.virgo.medic.eventlog.impl.MessageResolver;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.slf4j.MDC;
+import org.slf4j.helpers.MessageFormatter;
+
+
+class LogBackEventLogger implements EventLogger {
+
+    private static final String MDC_KEY_MEDIC_EVENT_CODE = "medic.eventCode";
+
+    private static final String MISSING_MESSAGE_EVENT_CODE = "ME0001W";
+
+    private final Logger localizedLogger = LoggerFactory.getLogger("org.eclipse.virgo.medic.eventlog.localized");
+
+    private final Logger defaultLogger = LoggerFactory.getLogger("org.eclipse.virgo.medic.eventlog.default");
+
+    private final MessageResolver messageResolver;
+
+    private final Locale defaultLocale = Locale.ENGLISH;
+
+    LogBackEventLogger(MessageResolver messageResolver) {
+        this.messageResolver = messageResolver;
+    }
+
+    public void log(String code, Level level, Object... inserts) {
+        this.log(code, level, null, inserts);
+    }
+
+    public void log(LogEvent logEvent, Object... inserts) {
+        this.log(logEvent.getEventCode(), logEvent.getLevel(), inserts);
+    }
+
+    public void log(String eventCode, Level level, Throwable throwable, Object... inserts) {
+        try {
+            String localisedMessage = messageResolver.resolveLogEventMessage(eventCode);
+
+            if (localisedMessage != null) {
+                logMessage(this.localizedLogger, localisedMessage, level, eventCode, throwable, inserts);
+            } else {
+                logMissingMessage(this.localizedLogger, eventCode, throwable, inserts);
+            }
+
+            String defaultMessage = messageResolver.resolveLogEventMessage(eventCode, defaultLocale);
+
+            if (defaultMessage != null) {
+                logMessage(this.defaultLogger, defaultMessage, level, eventCode, throwable, inserts);
+            } else {
+                logMissingMessage(this.defaultLogger, eventCode, throwable, inserts);
+            }
+        } finally {
+            MDC.remove(MDC_KEY_MEDIC_EVENT_CODE);
+        }
+    }
+    
+    public void log(LogEvent logEvent, Throwable throwable, Object... inserts) {
+        this.log(logEvent.getEventCode(), logEvent.getLevel(), throwable, inserts);
+    }
+
+    private void logMissingMessage(Logger logger, String eventCode, Throwable throwable, Object[] inserts) {
+        logMessage(logger, "A message with the key '{}' was not found. The inserts for the message were '{}'", Level.WARNING,
+            MISSING_MESSAGE_EVENT_CODE, throwable, eventCode, inserts);
+    }
+
+    private void logMessage(Logger logger, String message, Level level, String eventCode, Throwable throwable, Object... inserts) {
+        try {
+            MDC.put(MDC_KEY_MEDIC_EVENT_CODE, eventCode);
+            String formattedMessage = MessageFormatter.arrayFormat(message, (Object[]) inserts).getMessage();
+            switch (level) {
+                case ERROR:
+                    logger.error(formattedMessage, throwable);
+                    break;
+                case WARNING:
+                    logger.warn(formattedMessage, throwable);
+                    break;
+                case INFO:
+                    logger.info(formattedMessage, throwable);
+                    break;
+            }
+        } finally {
+            MDC.remove(MDC_KEY_MEDIC_EVENT_CODE);
+        }
+    }
+
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/eventlog/impl/logback/LogBackEventLoggerFactory.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/eventlog/impl/logback/LogBackEventLoggerFactory.java
new file mode 100644
index 0000000..b5d8349
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/eventlog/impl/logback/LogBackEventLoggerFactory.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.eventlog.impl.logback;
+
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.medic.eventlog.EventLoggerFactory;
+import org.eclipse.virgo.medic.eventlog.impl.LocaleResolver;
+import org.eclipse.virgo.medic.eventlog.impl.MessageResolver;
+import org.eclipse.virgo.medic.eventlog.impl.PropertyResourceBundleResolver;
+import org.eclipse.virgo.medic.eventlog.impl.StandardMessageResolver;
+import org.osgi.framework.Bundle;
+
+
+public class LogBackEventLoggerFactory implements EventLoggerFactory {
+
+    private final Bundle secondaryBundle;
+
+    private final PropertyResourceBundleResolver resourceBundleResolver;
+
+    private final LocaleResolver localeResolver;
+
+    public LogBackEventLoggerFactory(PropertyResourceBundleResolver resourceBundleResolver, LocaleResolver localeResolver, Bundle secondaryBundle) {
+        this.secondaryBundle = secondaryBundle;
+        this.resourceBundleResolver = resourceBundleResolver;
+        this.localeResolver = localeResolver;
+    }
+
+    public EventLogger createEventLogger(Bundle primaryBundle) {
+        MessageResolver messageResolver = new StandardMessageResolver(this.localeResolver, resourceBundleResolver, primaryBundle,
+            this.secondaryBundle);
+        return new LogBackEventLogger(messageResolver);
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/impl/LogController.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/impl/LogController.java
new file mode 100755
index 0000000..47bf8a6
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/impl/LogController.java
@@ -0,0 +1,350 @@
+/*******************************************************************************

+ * Copyright (c) 2011 SAP AG

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ *

+ * Contributors:

+ *   Hristo Iliev, SAP AG - initial contribution

+ *******************************************************************************/

+package org.eclipse.virgo.medic.impl;

+

+import org.eclipse.virgo.medic.dump.DumpGenerator;

+import org.eclipse.virgo.medic.dump.impl.DumpContributorPublisher;

+import org.eclipse.virgo.medic.dump.impl.StandardDumpContributorResolver;

+import org.eclipse.virgo.medic.dump.impl.StandardDumpGenerator;

+import org.eclipse.virgo.medic.eventlog.EventLogger;

+import org.eclipse.virgo.medic.eventlog.EventLoggerFactory;

+import org.eclipse.virgo.medic.eventlog.impl.BundleSearchingPropertyResourceBundleResolver;

+import org.eclipse.virgo.medic.eventlog.impl.EventLoggerServiceFactory;

+import org.eclipse.virgo.medic.eventlog.impl.StandardLocaleResolver;

+import org.eclipse.virgo.medic.eventlog.impl.logback.LogBackEventLoggerFactory;

+import org.eclipse.virgo.medic.impl.config.ConfigurationChangeListener;

+import org.eclipse.virgo.medic.impl.config.ConfigurationProvider;

+import org.eclipse.virgo.medic.log.ConfigurationPublicationFailedException;

+import org.eclipse.virgo.medic.log.DelegatingPrintStream;

+import org.eclipse.virgo.medic.log.LoggingConfigurationPublisher;

+import org.eclipse.virgo.medic.log.impl.*;

+import org.eclipse.virgo.medic.log.impl.config.*;

+import org.eclipse.virgo.medic.log.impl.logback.JoranLoggerContextConfigurer;

+import org.eclipse.virgo.medic.log.impl.logback.LoggerContextConfigurer;

+import org.eclipse.virgo.medic.log.impl.logback.StandardContextSelectorDelegate;

+import org.eclipse.virgo.medic.log.logback.DelegatingContextSelector;

+import org.eclipse.virgo.util.osgi.ServiceRegistrationTracker;

+import org.osgi.framework.BundleContext;

+import org.osgi.framework.BundleListener;

+import org.osgi.framework.ServiceFactory;

+import org.osgi.framework.ServiceRegistration;

+import org.slf4j.bridge.SLF4JBridgeHandler;

+

+import java.io.File;

+import java.io.PrintStream;

+import java.util.Arrays;

+import java.util.Dictionary;

+import java.util.Hashtable;

+import java.util.List;

+import java.util.logging.ConsoleHandler;

+import java.util.logging.Handler;

+import java.util.logging.Logger;

+

+public class LogController implements ConfigurationChangeListener {

+    

+    private static final String LOGGER_NAME_SYSERR = "System.err";

+    

+    private static final String LOGGER_NAME_SYSOUT = "System.out";

+    

+    private static final String LOGGER_NAME_SYSERR_DELEGATE = "delegating.System.err";

+    

+    private static final String LOGGER_NAME_SYSOUT_DELEGATE = "delegating.System.out";

+    

+    private static final String PROPERTY_MEDIC_CONFIG_PATH = "org.eclipse.virgo.medic.log.config.path";

+    

+    private static final String DEFAULT_CONTEXT_SELECTOR = "ch.qos.logback.classic.selector.DefaultContextSelector";

+    

+    private static final String PROPERTY_LOGBACK_CONTEXT_SELECTOR = "logback.ContextSelector";

+    

+    private volatile StandardDumpGenerator dumpGenerator;

+    

+    private volatile LogBackEventLoggerFactory eventLoggerFactory;

+    

+    private volatile DumpContributorPublisher dumpContributorPublisher;

+    

+    private volatile PrintStream sysOut = System.out;

+    

+    private volatile PrintStream sysErr = System.err;

+    

+    private volatile ExecutionStackAccessor stackAccessor;

+    

+    private volatile ConsoleHandler javaConsoleHandler;

+    

+    private DelegatingPrintStream delegatingSysOut = new StandardDelegatingPrintStream(System.out);

+    

+    private DelegatingPrintStream delegatingSysErr = new StandardDelegatingPrintStream(System.err);

+    

+    private ServiceRegistration<DelegatingPrintStream> delegatingSysOutRegistration;

+    private ServiceRegistration<DelegatingPrintStream> delegatingSysErrRegistration;

+    

+    private ServiceRegistration<PrintStream> sysOutRegistration;

+    private ServiceRegistration<PrintStream> sysErrRegistration;

+    

+    private static final List<String> DEFAULT_LOGGING_PACKAGES = Arrays.asList(//

+                                                                               "org.apache.commons.logging",//

+                                                                               "org.apache.log4j",//

+                                                                               "org.slf4j",//

+                                                                               "org.slf4j.impl",//

+                                                                               "org.eclipse.virgo.medic.log",//

+                                                                               "org.eclipse.virgo.medic.log.logback",//

+                                                                               "org.eclipse.virgo.medic.log.impl",//

+                                                                               "org.eclipse.virgo.medic.log.impl.logback");

+    

+    private BundleContext bundleContext;

+    private ConfigurationProvider configurationProvider;

+    private ServiceRegistrationTracker registrationTracker;

+    

+    public LogController(BundleContext ctx, ConfigurationProvider cfgProvider, ServiceRegistrationTracker regTracker) throws ConfigurationPublicationFailedException {

+        this.bundleContext = ctx;

+        this.configurationProvider = cfgProvider;

+        this.registrationTracker = regTracker;

+        

+        StandardContextSelectorDelegate delegate = createContextSelectorDelegate(bundleContext);

+        registrationTracker.track(bundleContext.registerService(BundleListener.class.getName(), delegate, null));

+        DelegatingContextSelector.setDelegate(delegate);

+        

+        StandardLoggingConfigurationPublisher loggingConfigurationPublisher = new StandardLoggingConfigurationPublisher(bundleContext);

+        registrationTracker.track(bundleContext.registerService(LoggingConfigurationPublisher.class, loggingConfigurationPublisher, null));

+        

+        publishDefaultConfigurationIfAvailable(bundleContext, loggingConfigurationPublisher);

+        

+        System.setProperty(PROPERTY_LOGBACK_CONTEXT_SELECTOR, DelegatingContextSelector.class.getName());

+        

+        this.stackAccessor = new SecurityManagerExecutionStackAccessor();

+        

+        this.sysOut = System.out;

+        this.sysErr = System.err;

+    }

+    

+    public DumpGenerator dumpStart() {

+        this.dumpGenerator = new StandardDumpGenerator(new StandardDumpContributorResolver(bundleContext), configurationProvider, this.eventLoggerFactory.createEventLogger(bundleContext.getBundle()));

+        registrationTracker.track(bundleContext.registerService(DumpGenerator.class, this.dumpGenerator, null));

+        

+        this.dumpContributorPublisher = new DumpContributorPublisher(bundleContext);

+        this.dumpContributorPublisher.publishDumpContributors();

+        

+        return this.dumpGenerator;

+    }

+    

+    public void dumpStop() {

+        if (this.dumpGenerator != null) {

+            this.dumpGenerator.close();

+        }

+        

+        if (this.dumpContributorPublisher != null) {

+            this.dumpContributorPublisher.retractDumpContributors();

+        }

+    }

+    

+    public void logStart() throws ConfigurationPublicationFailedException {

+        Dictionary<String, Object> configuration = configurationProvider.getConfiguration();

+

+        SLF4JBridgeHandler.install();

+        

+        updateLogConfiguration(configuration);

+    }

+    

+    public void logStop() {

+        System.setProperty(PROPERTY_LOGBACK_CONTEXT_SELECTOR, DEFAULT_CONTEXT_SELECTOR);

+        

+        DelegatingContextSelector.setDelegate(null);

+        

+        if (this.sysOut != null) {

+            System.setOut(this.sysOut);

+        }

+        

+        if (this.sysErr != null) {

+            System.setErr(this.sysErr);

+        }

+        

+        SLF4JBridgeHandler.uninstall();

+        enableJulConsoleLogger();

+    }

+    

+    private void enableJulConsoleLogger() {

+        if (this.javaConsoleHandler != null) {

+            getJavaRootLogger().addHandler(this.javaConsoleHandler);

+        }

+    }

+    

+    private void disableJulConsoleHandler() {

+        // remove console handler from root logger

+        Logger rootLogger = getJavaRootLogger();

+        Handler[] handlers = rootLogger.getHandlers();

+        for (Handler handler : handlers) {

+            if (handler instanceof ConsoleHandler) {

+                this.javaConsoleHandler = (ConsoleHandler) handler;

+                rootLogger.removeHandler(handler);

+            }

+        }

+    }

+    

+    public void eventLogStart() {

+        this.eventLoggerFactory = createFactory(bundleContext);

+        ServiceFactory<EventLogger> serviceFactory = new EventLoggerServiceFactory(this.eventLoggerFactory);

+        registrationTracker.track(bundleContext.registerService(EventLoggerFactory.class, this.eventLoggerFactory, null));

+        registrationTracker.track(bundleContext.registerService(EventLogger.class.getName(), serviceFactory, null));

+    }

+    

+    private PrintStream wrapPrintStream(PrintStream printStream, String loggerName, LoggingLevel loggingLevel, ExecutionStackAccessor stackAccessor, ConfigurationProvider configurationProvider, String configurationProperty) {

+        LoggingPrintStreamWrapper wrapper = new LoggingPrintStreamWrapper(printStream, loggerName, loggingLevel, stackAccessor, configurationProvider, configurationProperty);

+        return wrapper;

+    }

+    

+    private PrintStream decoratePrintStream(PrintStream printStream, String loggerName, LoggingLevel loggingLevel, ExecutionStackAccessor stackAccessor, ConfigurationProvider configurationProvider, String configurationProperty) {

+        TeeLoggingPrintStreamWrapper decorator = new TeeLoggingPrintStreamWrapper(printStream, loggerName, loggingLevel, stackAccessor, configurationProvider, configurationProperty);

+        return decorator;

+    }

+    

+    private ServiceRegistration<PrintStream> publishPrintStream(PrintStream printStream, String name) {

+    	Dictionary<String, String> properties = new Hashtable<String, String>();

+        properties.put("org.eclipse.virgo.medic.log.printStream", name);

+        

+        ServiceRegistration<PrintStream> registration = bundleContext.registerService(PrintStream.class, printStream, properties);

+        registrationTracker.track(registration);

+        

+        return registration;

+    }

+    

+    private ServiceRegistration<DelegatingPrintStream> publishDelegatingPrintStream(DelegatingPrintStream printStream, String name) {

+    	Dictionary<String, String> properties = new Hashtable<String, String>();

+        properties.put("org.eclipse.virgo.medic.log.printStream", name);

+        

+        ServiceRegistration<DelegatingPrintStream> delegatingPrintStreamRegistration = bundleContext.registerService(DelegatingPrintStream.class, printStream, properties);

+        registrationTracker.track(delegatingPrintStreamRegistration);

+        

+        return delegatingPrintStreamRegistration;

+    }

+    

+    private void publishDefaultConfigurationIfAvailable(BundleContext context, StandardLoggingConfigurationPublisher publisher) throws ConfigurationPublicationFailedException {

+        String logConfigPath = context.getProperty(PROPERTY_MEDIC_CONFIG_PATH);

+        if (logConfigPath != null) {

+            File logConfigFile = new File(logConfigPath);

+            if (logConfigFile.exists()) {

+                publisher.publishDefaultConfiguration(new File(logConfigPath));

+            }

+        }

+    }

+    

+    private static StandardContextSelectorDelegate createContextSelectorDelegate(BundleContext bundleContext) {

+        ConfigurationLocator configurationLocator = createConfigurationLocator(bundleContext);

+        CallingBundleResolver loggingCallerLocator = createLoggingCallerLocator();

+        LoggerContextConfigurer loggerContextConfigurer = new JoranLoggerContextConfigurer();

+        return new StandardContextSelectorDelegate(loggingCallerLocator, configurationLocator, bundleContext.getBundle(), loggerContextConfigurer);

+    }

+    

+    /**

+     * Logging configuration is located by searching up to two sources, depending on the bundle doing the logging.

+     * <p/>

+     * Firstly, if and only if the bundle has a specific Medic manifest header, the service registry is searched in

+     * a location specified in the manifest header. Secondly, if the configuration has not already been found, the

+     * the bundle's resources are checked for a Logback configuration file.

+     */

+    private static ConfigurationLocator createConfigurationLocator(BundleContext bundleContext) {

+        return new CompositeConfigurationLocator(new ServiceRegistryConfigurationLocator(bundleContext), new BundleResourceConfigurationLocator());

+    }

+    

+    private static CallingBundleResolver createLoggingCallerLocator() {

+        ClassSelector classSelector = createClassSelector();

+        ExecutionStackAccessor executionStackAccessor = createExecutionStackAccessor();

+        

+        return new StandardCallingBundleResolver(executionStackAccessor, classSelector);

+    }

+    

+    private static ClassSelector createClassSelector() {

+        return new PackageNameFilteringClassSelector(DEFAULT_LOGGING_PACKAGES);

+    }

+    

+    private static ExecutionStackAccessor createExecutionStackAccessor() {

+        return new SecurityManagerExecutionStackAccessor();

+    }

+    

+    private LogBackEventLoggerFactory createFactory(BundleContext context) {

+        BundleSearchingPropertyResourceBundleResolver resourceBundleResolver = new BundleSearchingPropertyResourceBundleResolver();

+        return new LogBackEventLoggerFactory(resourceBundleResolver, new StandardLocaleResolver(), context.getBundle());

+    }

+    

+    private Logger getJavaRootLogger() {

+        return Logger.getLogger("");

+    }

+    

+    @Override

+    public void configurationChanged(ConfigurationProvider provider) {

+        Dictionary<String, Object> configuration = configurationProvider.getConfiguration();

+        updateLogConfiguration(configuration);

+    }

+

+    private synchronized void updateLogConfiguration(Dictionary<String, Object> configuration) {

+        String logSysOutConfiguration = (String)configuration.get(ConfigurationProvider.KEY_LOG_WRAP_SYSOUT);

+        if (Boolean.valueOf(logSysOutConfiguration)) {

+            delegatingSysOutRegistration = publishDelegatingPrintStream(delegatingSysOut, LOGGER_NAME_SYSOUT_DELEGATE);

+            sysOutRegistration = publishPrintStream(this.sysOut, LOGGER_NAME_SYSOUT);

+            

+            System.setOut(wrapPrintStream(System.out, LOGGER_NAME_SYSOUT, LoggingLevel.INFO, stackAccessor, configurationProvider, ConfigurationProvider.KEY_LOG_WRAP_SYSOUT));

+        } else {

+            if (Boolean.FALSE.toString().equals(logSysOutConfiguration)) {

+                if (delegatingSysOutRegistration != null) {

+                    registrationTracker.unregister(delegatingSysOutRegistration);

+                    delegatingSysOutRegistration = null;

+                }

+                if (sysOutRegistration != null) {

+                    registrationTracker.unregister(sysOutRegistration);

+                    sysOutRegistration = null;

+                }

+                System.setOut((PrintStream) delegatingSysOut);

+            } else {

+                delegatingSysOutRegistration = publishDelegatingPrintStream(delegatingSysOut, LOGGER_NAME_SYSOUT_DELEGATE);

+                sysOutRegistration = publishPrintStream(this.sysOut, LOGGER_NAME_SYSOUT);

+

+                System.setOut(decoratePrintStream(System.out, LOGGER_NAME_SYSOUT, LoggingLevel.INFO, stackAccessor, configurationProvider, ConfigurationProvider.KEY_LOG_WRAP_SYSOUT));

+

+                if (!ConfigurationProvider.LOG_TEE_SYSSTREAMS.equals(logSysOutConfiguration)) {

+                    System.out.println("Invalid value '" + logSysOutConfiguration + "' for configuration key '" + ConfigurationProvider.KEY_LOG_WRAP_SYSOUT + "'. Valid values are 'true | tee | false'. Defaulted to 'tee'.");

+                }

+            }

+        }

+

+        String logSysErrConfiguration = (String)configuration.get(ConfigurationProvider.KEY_LOG_WRAP_SYSERR);

+        if (Boolean.valueOf(logSysErrConfiguration)) {

+            delegatingSysErrRegistration = publishDelegatingPrintStream(delegatingSysErr, LOGGER_NAME_SYSERR_DELEGATE);

+            sysErrRegistration = publishPrintStream(this.sysErr, LOGGER_NAME_SYSERR);

+            

+            System.setErr(wrapPrintStream(System.err, LOGGER_NAME_SYSERR, LoggingLevel.ERROR, stackAccessor, configurationProvider, ConfigurationProvider.KEY_LOG_WRAP_SYSERR));

+        } else {

+            if (Boolean.FALSE.toString().equals(logSysErrConfiguration)) {

+                if (delegatingSysErrRegistration != null) {

+                    registrationTracker.unregister(delegatingSysErrRegistration);

+                    delegatingSysErrRegistration = null;

+                }

+                if (sysErrRegistration != null) {

+                    registrationTracker.unregister(sysErrRegistration);

+                    sysErrRegistration = null;

+                }

+                System.setErr((PrintStream) delegatingSysErr);

+            } else {

+                delegatingSysErrRegistration = publishDelegatingPrintStream(delegatingSysErr, LOGGER_NAME_SYSERR_DELEGATE);

+                sysErrRegistration = publishPrintStream(this.sysErr, LOGGER_NAME_SYSERR);

+

+                System.setErr(decoratePrintStream(System.err, LOGGER_NAME_SYSERR, LoggingLevel.ERROR, stackAccessor, configurationProvider, ConfigurationProvider.KEY_LOG_WRAP_SYSERR));

+                

+                if (!ConfigurationProvider.LOG_TEE_SYSSTREAMS.equals(logSysErrConfiguration)) {

+                    System.err.println("Invalid value '" + logSysErrConfiguration + "' for configuration key '" + ConfigurationProvider.KEY_LOG_WRAP_SYSERR + "'. Valid values are 'true | tee | false'. Defaulted to 'tee'.");

+                }

+            }

+        }

+

+        if (Boolean.valueOf((String)configuration.get(ConfigurationProvider.KEY_ENABLE_JUL_CONSOLE_HANDLER))) {

+            enableJulConsoleLogger();

+        } else {

+            disableJulConsoleHandler();

+        }

+    }

+}
\ No newline at end of file
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/impl/MedicActivator.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/impl/MedicActivator.java
new file mode 100644
index 0000000..2588294
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/impl/MedicActivator.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.impl;
+
+import java.lang.management.ManagementFactory;
+
+import javax.management.MBeanServer;
+
+import org.eclipse.equinox.log.ExtendedLogReaderService;
+import org.eclipse.virgo.medic.dump.DumpGenerator;
+import org.eclipse.virgo.medic.impl.config.ConfigurationAdminConfigurationProvider;
+import org.eclipse.virgo.medic.impl.config.ConfigurationProvider;
+import org.eclipse.virgo.medic.log.osgi.OSGiLogServiceListener;
+import org.eclipse.virgo.medic.management.MedicMBeanExporter;
+import org.eclipse.virgo.util.osgi.ServiceRegistrationTracker;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.cm.ConfigurationListener;
+import org.osgi.service.log.LogService;
+import org.slf4j.LoggerFactory;
+
+/**
+ * This class is threadSafe
+ *
+ */
+public final class MedicActivator implements BundleActivator {
+
+    private final ServiceRegistrationTracker registrationTracker = new ServiceRegistrationTracker();
+
+    private volatile ServiceReference<ExtendedLogReaderService> logReaderReference;
+
+    private LogController logController = null;
+
+    private ConfigurationProvider configurationProvider = null;
+
+    private MedicMBeanExporter medicMBeanExporter = null;
+    
+    public void start(BundleContext context) throws Exception {
+        // Avoid logback accidentally obtaining classes from the application class loader.
+        System.setProperty("logback.ignoreTCL", "true");
+        
+        this.configurationProvider = new ConfigurationAdminConfigurationProvider(context);
+        this.registrationTracker.track(context.registerService(ConfigurationListener.class.getName(), configurationProvider, null));
+
+        this.logController = new LogController(context, configurationProvider, registrationTracker);
+
+        configurationProvider.addChangeListener(logController);
+
+        logController.logStart();
+        logController.eventLogStart();
+        DumpGenerator dumpGenerator = logController.dumpStart();
+        
+        //Register the platformMBeanServer with 
+		MBeanServer platformMBeanServer = ManagementFactory.getPlatformMBeanServer();
+		context.registerService(MBeanServer.class, platformMBeanServer, null);
+        this.medicMBeanExporter = new MedicMBeanExporter(configurationProvider, dumpGenerator);
+
+        this.logReaderReference = context.getServiceReference(ExtendedLogReaderService.class);
+        ExtendedLogReaderService logReader = context.getService(this.logReaderReference);
+        logReader.addLogListener(new OSGiLogServiceListener(LoggerFactory.getLogger(LogService.class)));
+    }
+
+    public void stop(BundleContext context) throws Exception {
+    	MedicMBeanExporter medicMBeanExporter2 = this.medicMBeanExporter;
+		if(medicMBeanExporter2 != null){
+    		medicMBeanExporter2.close();
+    	}
+        this.registrationTracker.unregisterAll();
+        ServiceReference<ExtendedLogReaderService> localLogReaderReference = this.logReaderReference;
+        if (localLogReaderReference != null) {
+            context.ungetService(localLogReaderReference);
+        }
+
+        LogController logController2 = logController;
+		ConfigurationProvider configurationProvider2 = configurationProvider;
+		if (configurationProvider2 != null) {
+            configurationProvider2.removeChangeListener(logController2);
+        }
+
+        if (logController2 != null) {
+            logController2.dumpStop();
+            logController2.logStop();
+        }
+    }
+
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/impl/MedicLogEvents.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/impl/MedicLogEvents.java
new file mode 100644
index 0000000..8e3fac6
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/impl/MedicLogEvents.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.impl;
+
+import org.eclipse.virgo.medic.eventlog.Level;
+import org.eclipse.virgo.medic.eventlog.LogEvent;
+
+public enum MedicLogEvents implements LogEvent {
+
+    MISSING_MESSAGE(1, Level.WARNING), //
+    CONTRIBUTION_FAILED(2, Level.WARNING), //
+    DUMP_GENERATED(3, Level.INFO), //
+    DIRECTORY_CREATION_FAILED(4, Level.WARNING), //
+    CONTRIBUTION_ERROR(5, Level.ERROR);
+
+    private static final String PREFIX = "ME";
+
+    private final int code;
+
+    private final Level level;
+
+    private MedicLogEvents(int code, Level level) {
+        this.code = code;
+        this.level = level;
+    }
+
+    public String getEventCode() {
+        return String.format("%s%04d%1.1s", PREFIX, this.code, this.level);
+    }
+
+    public Level getLevel() {
+        return level;
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/impl/config/ConfigurationAdminConfigurationProvider.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/impl/config/ConfigurationAdminConfigurationProvider.java
new file mode 100644
index 0000000..a47ef3f
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/impl/config/ConfigurationAdminConfigurationProvider.java
@@ -0,0 +1,119 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.impl.config;
+
+import java.io.IOException;
+import java.util.Dictionary;
+import java.util.HashSet;
+import java.util.Hashtable;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.cm.ConfigurationEvent;
+import org.osgi.service.cm.ConfigurationListener;
+
+public final class ConfigurationAdminConfigurationProvider implements ConfigurationProvider, ConfigurationListener {
+    
+    private static final String CONFIG_ADMIN_PID = "org.eclipse.virgo.medic";
+
+    private static final Dictionary<String, Object> DEFAULT_CONFIG = createDefaultConfiguration();
+
+    private final BundleContext bundleContext;
+    
+	private volatile Dictionary<String, Object> configuration = DEFAULT_CONFIG;
+
+    private HashSet<ConfigurationChangeListener> listeners;
+    
+    public ConfigurationAdminConfigurationProvider(BundleContext context) {
+        this.bundleContext = context;
+        this.listeners = new HashSet<ConfigurationChangeListener>();
+        initialisePropertiesFromConfigurationAdmin();
+    }
+
+    public Dictionary<String, Object> getConfiguration() {
+        return this.configuration;
+    }
+    
+    
+	private void initialisePropertiesFromConfigurationAdmin() {
+    	ServiceReference<ConfigurationAdmin> configAdminReference = this.bundleContext.getServiceReference(ConfigurationAdmin.class);
+    	
+    	if (configAdminReference != null) {
+    		this.bundleContext.registerService(ConfigurationListener.class.getName(), new MedicConfigurationListener(), null);
+    		setPropertiesFromConfigurationAdmin(configAdminReference);
+    	}
+    }
+    
+    private void setPropertiesFromConfigurationAdmin(ServiceReference<ConfigurationAdmin> configAdminReference) {
+    	ConfigurationAdmin configurationAdmin = this.bundleContext.getService(configAdminReference);
+        
+        if (configurationAdmin != null) {
+            try {
+				Configuration configuration = configurationAdmin.getConfiguration(CONFIG_ADMIN_PID, null);
+                
+				Dictionary<String, Object> properties = configuration.getProperties();
+                
+                if (properties == null) {
+                	properties = DEFAULT_CONFIG; 
+                } else {
+                	DictionaryUtils.mergeGeneral(properties, DEFAULT_CONFIG);
+                }
+                
+				this.configuration = properties;
+            } catch (IOException ioe) {
+            }
+        } else {
+        	this.configuration = DEFAULT_CONFIG;
+        }
+        
+        notifyListeners();
+    }
+
+    private static Dictionary<String, Object> createDefaultConfiguration() {
+        Dictionary<String, Object> configuration = new Hashtable<String, Object>();
+        configuration.put(KEY_DUMP_ROOT_DIRECTORY, ".");
+            configuration.put(KEY_LOG_WRAP_SYSOUT, Boolean.toString(Boolean.TRUE));
+            configuration.put(KEY_LOG_WRAP_SYSERR, Boolean.toString(Boolean.TRUE));
+        return configuration;
+    }    
+    
+    public void addChangeListener(ConfigurationChangeListener listener) {
+        listeners.add(listener);
+    }
+    
+    public boolean removeChangeListener(ConfigurationChangeListener listener) {
+        return listeners.remove(listener);
+    }
+    
+    private void notifyListeners() {
+        for (Object listener: listeners.toArray()) {
+            ((ConfigurationChangeListener) listener).configurationChanged(this);
+        }
+    }
+    
+    private final class MedicConfigurationListener implements ConfigurationListener {
+    	
+		public void configurationEvent(ConfigurationEvent configEvent) {
+			if (CONFIG_ADMIN_PID.equals(configEvent.getPid()) && configEvent.getType() == ConfigurationEvent.CM_UPDATED) {
+				setPropertiesFromConfigurationAdmin((ServiceReference<ConfigurationAdmin>)configEvent.getReference());
+			}			
+		}    	
+    }
+    
+    public void configurationEvent(ConfigurationEvent event) {
+		if (event.getType() == ConfigurationEvent.CM_UPDATED && CONFIG_ADMIN_PID.equals(event.getPid())) {
+			setPropertiesFromConfigurationAdmin((ServiceReference<ConfigurationAdmin>)event.getReference());
+		}
+	}
+}
\ No newline at end of file
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/impl/config/ConfigurationChangeListener.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/impl/config/ConfigurationChangeListener.java
new file mode 100755
index 0000000..f647d94
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/impl/config/ConfigurationChangeListener.java
@@ -0,0 +1,25 @@
+/*******************************************************************************

+ * Copyright (c) 2011 SAP AG

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ *

+ * Contributors:

+ *   Hristo Iliev, SAP AG - initial contribution

+ *******************************************************************************/

+package org.eclipse.virgo.medic.impl.config;

+

+public interface ConfigurationChangeListener {

+

+    /**

+     * Called when the configuration changed.

+     * <p/>

+     * The listener can be called although the configuration is virtually the same - no configuration data

+     * comparison is made.

+     *

+     * @param provider ConfigurationProvider that can be used to obtain the properties.

+     */

+    public void configurationChanged(ConfigurationProvider provider);

+

+}

diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/impl/config/ConfigurationProvider.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/impl/config/ConfigurationProvider.java
new file mode 100644
index 0000000..3a5bb3d
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/impl/config/ConfigurationProvider.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.impl.config;
+
+import java.util.Dictionary;
+
+public interface ConfigurationProvider {
+    
+    public static final String KEY_DUMP_ROOT_DIRECTORY = "dump.root.directory";
+    
+    public static final String KEY_LOG_WRAP_SYSOUT = "log.wrapSysOut";
+    
+    public static final String KEY_LOG_WRAP_SYSERR = "log.wrapSysErr";
+    
+    public static final String LOG_TEE_SYSSTREAMS = "tee";
+    
+    public static final String KEY_LOG_DUMP_BUFFERSIZE = "log.dump.bufferSize";
+    
+    public static final String KEY_LOG_DUMP_LEVEL = "log.dump.level";
+    
+    public static final String KEY_LOG_DUMP_PATTERN = "log.dump.pattern";
+    
+    public static final String KEY_ENABLE_JUL_CONSOLE_HANDLER = "log.jul.consoleHandler";
+    
+    Dictionary<String, Object> getConfiguration();
+    
+    /**
+     * Adds listener that will be notified when the configuration changes
+     * <p/>
+     * Multiple listeners are supported.
+     *
+     * @param listener Listener to be added
+     */
+    public void addChangeListener(ConfigurationChangeListener listener);
+    
+    /**
+     * Removes previously registered listener
+     *
+     * @param listener Listener to be removed
+     * @return Returns <code>true</code> if the lister was registered and <code>false</code> if not
+     */
+    public boolean removeChangeListener(ConfigurationChangeListener listener);
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/impl/config/DictionaryUtils.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/impl/config/DictionaryUtils.java
new file mode 100644
index 0000000..0431fd7
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/impl/config/DictionaryUtils.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.impl.config;
+
+import java.util.Dictionary;
+import java.util.Enumeration;
+
+final class DictionaryUtils {
+
+    static void merge(Dictionary<Object, Object> primary, Dictionary<Object, Object> secondary) {
+        Enumeration<?> keys = secondary.keys();
+        while (keys.hasMoreElements()) {
+            Object key = keys.nextElement();
+            if (primary.get(key) == null) {
+                primary.put(key, secondary.get(key));
+            }
+        }
+    }
+    
+    static <S, T> void mergeGeneral(Dictionary<S, T> primary, Dictionary<S, T> secondary) {
+        Enumeration<S> keys = secondary.keys();
+        while (keys.hasMoreElements()) {
+            S key = keys.nextElement();
+            if (primary.get(key) == null) {
+                primary.put(key, secondary.get(key));
+            }
+        }
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/CallingBundleResolver.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/CallingBundleResolver.java
new file mode 100644
index 0000000..195e368
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/CallingBundleResolver.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log.impl;
+
+import org.osgi.framework.Bundle;
+
+public interface CallingBundleResolver {
+
+    /**
+     * Returns the {@link Bundle} from which the current logging call originated.
+     * 
+     * @return the <code>Bundle</code> that made the logging call
+     */
+    Bundle getCallingBundle();
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/ClassSelector.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/ClassSelector.java
new file mode 100644
index 0000000..a949187
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/ClassSelector.java
@@ -0,0 +1,17 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log.impl;
+
+public interface ClassSelector {
+
+    Class<?> select(Class<?>[] classes);
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/ExecutionStackAccessor.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/ExecutionStackAccessor.java
new file mode 100644
index 0000000..fb0c03a
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/ExecutionStackAccessor.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log.impl;
+
+public interface ExecutionStackAccessor {
+
+    /**
+     * Returns the current execution stack as an array of {@link Class Classes}. The first elements in the array is the
+     * class of this method's caller, the second element is that method's caller, and so on.
+     * 
+     * @return the execution stack
+     */
+    Class<?>[] getExecutionStack();
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/LoggingLevel.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/LoggingLevel.java
new file mode 100644
index 0000000..9420366
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/LoggingLevel.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log.impl;
+
+/**
+ * A fixed set of logging levels used to control logging for wrapped print streams.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Fully thread-safe constants.
+ * 
+ */
+public enum LoggingLevel {
+    WARNING, INFO, DEBUG, ERROR;
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/LoggingPrintStreamWrapper.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/LoggingPrintStreamWrapper.java
new file mode 100644
index 0000000..e97cd0b
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/LoggingPrintStreamWrapper.java
@@ -0,0 +1,519 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log.impl;
+
+import java.io.PrintStream;
+import java.util.Locale;
+
+import org.eclipse.virgo.medic.impl.config.ConfigurationProvider;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * A <code>LoggingPrintStreamWrapper</code> wraps a PrintStream instance and logs, via SLF4j,
+ * all data that is written to it. 
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread-safe.
+ *
+ */
+public final class LoggingPrintStreamWrapper extends PrintStream {
+
+    private static final class StringBuilderThreadLocal extends ThreadLocal<StringBuilder> {
+
+        @Override
+        public StringBuilder initialValue() {
+            return new StringBuilder();
+        }
+    }
+
+    private static final String LOGBACK_PACKAGE_NAME_PREFIX = "ch.qos.logback";
+
+	private final ThreadLocal<StringBuilder> entryBuilders;
+    
+    private Logger logger;
+    
+    private final ExecutionStackAccessor executionStackAccessor;
+    
+    private final ConfigurationProvider configurationProvider;
+    
+    private final String configurationProperty;
+    
+    private final PrintStream originalPrintStream;
+    
+    private final LoggingLevel loggingLevel;
+
+    private final String loggerName;
+
+    private static final String NULL_STRING = "null";
+    
+    /**
+     * Creates a new LoggingPrintStreamWrapper for the given PrintStream. Data written to
+     * the stream is logged via SLF4j to a logger with the supplied <code>loggerName</code>.<br/>
+     * The logging level is determined by the parameter of type {@link LoggingLevel}.
+     * 
+     * @param printStream The PrintStream instance to wrap
+     * @param loggerName The name of the logger
+     * @param loggingLevel The level of the log entries created
+     * @param executionStackAccessor 
+     * @param configurationProvider 
+     * @param configurationProperty 
+     */
+    public LoggingPrintStreamWrapper(PrintStream printStream, String loggerName, LoggingLevel loggingLevel, ExecutionStackAccessor executionStackAccessor, ConfigurationProvider configurationProvider, String configurationProperty) {
+        super(printStream);
+        
+        this.loggerName = loggerName;
+        this.loggingLevel = loggingLevel;
+        
+        this.executionStackAccessor = executionStackAccessor;
+        
+        this.entryBuilders = new StringBuilderThreadLocal();
+        
+        this.configurationProvider = configurationProvider;
+        
+        this.configurationProperty = configurationProperty;
+        
+        this.originalPrintStream = printStream;        
+    }
+
+    /**
+     * Creates a new LoggingPrintStreamWrapper for the given PrintStream. Data written to
+     * the stream is logged via SLF4j to a logger with the supplied <code>loggerName</code>.<br/>
+     * (The logging level is DEBUG by default.)
+     * 
+     * @param printStream The PrintStream instance to wrap
+     * @param loggerName The name of the logger
+     * @param executionStackAccessor
+     * @param configurationProvider
+     * @param configurationProperty
+     */
+    public LoggingPrintStreamWrapper(PrintStream printStream, String loggerName, ExecutionStackAccessor executionStackAccessor, ConfigurationProvider configurationProvider, String configurationProperty) {
+        this(printStream, loggerName, LoggingLevel.DEBUG, executionStackAccessor, configurationProvider, configurationProperty);
+    }
+    
+    @Override
+    public PrintStream append(char c) {
+    	if (!isLoggingEnabled()) {
+    		super.append(c);
+    	} else {
+	    	this.internalAppend(c);
+    	}
+        return this;
+    }
+    
+    private boolean internalAppend(char c) {    	
+        if (c == '\n' || c == '\r') {
+            createEntryAndLog(entryBuilders.get());
+            return true;
+        } else {
+            entryBuilders.get().append(c);
+            return false;
+        }
+    }
+
+    @Override
+    public PrintStream append(CharSequence csq, int start, int end) {
+    	if (!isLoggingEnabled()) {
+    		super.append(csq, start, end);
+    	} else {
+	        this.internalAppend(csq, start, end);
+    	}
+
+        return this;
+    }
+
+    private void internalAppend(CharSequence csq, int start, int end) {
+        for (int i = start; i < end; i++) {
+            boolean loggedEntry = internalAppend(csq.charAt(i));
+            if (loggedEntry && i < (end - 1)) {
+                char c = csq.charAt(i + 1);
+                if (c == '\n' || c == '\r') {
+                    i++;
+                }
+            }
+        }
+    }
+
+    @Override
+    public PrintStream append(CharSequence csq) {
+    	if (!isLoggingEnabled()) {
+    		super.append(csq);
+    	} else {
+	        if(csq == null){
+	        	throw new NullPointerException("Character Sequence to be added to the printStream from source '" + this.loggerName + "' is null");
+	        }
+	        this.internalAppend(csq, 0, csq.length());
+    	}
+    	return this;
+    }
+    
+    @Override
+    public boolean checkError() {
+    	if (!isLoggingEnabled()) {
+    		return super.checkError();
+    	} else {
+    		return false;
+    	}
+    }
+
+    @Override
+    public void close() {
+    	if (!isLoggingEnabled()) {
+    		super.close();
+    	}
+    }
+
+    @Override
+    public void flush() {
+    	if (!isLoggingEnabled()) {
+    		super.flush();
+    	}
+    }
+
+    @Override
+    public PrintStream format(Locale l, String format, Object... args) {
+    	if (!isLoggingEnabled()) {
+    		super.format(l, format, args);
+    	} else {
+    		this.internalPrint(String.format(l, format, args));
+    	}
+        return this;
+    }
+
+    @Override
+    public PrintStream format(String format, Object... args) {
+    	if (!isLoggingEnabled()) {
+    		super.format(format, args);
+    	} else {
+    		this.internalPrint(String.format(format, args));
+    	}
+        return this;
+    }
+
+    @Override
+    public void print(boolean b) {
+    	if (!isLoggingEnabled()) {
+    		super.print(b);
+    	} else {
+    		this.internalPrint(b);
+    	}
+    }
+
+    private void internalPrint(boolean b) {
+        entryBuilders.get().append(b);
+    }
+
+    @Override
+    public void print(char c) {
+    	if (!isLoggingEnabled()) {
+    		super.print(c);
+    	} else {
+    		this.internalAppend(c);
+    	}
+    }
+
+    @Override
+    public void print(char[] ca) {
+    	if (!isLoggingEnabled()) {
+    		super.print(ca);
+    	} else {
+    	    this.internalPrint(ca);
+    	}
+    }
+    
+    private void internalPrint(char[] ca) {
+        final String s = new String(ca);
+        this.internalAppend(s, 0, s.length());
+    }
+
+    @Override
+    public void print(double d) {
+    	if (!isLoggingEnabled()) {
+    		super.print(d);
+    	} else {
+    		this.internalPrint(d);
+    	}
+    }
+
+    private void internalPrint(double d) {
+        entryBuilders.get().append(d);
+    }
+
+    @Override
+    public void print(float f) {
+    	if (!isLoggingEnabled()) {
+    		super.print(f);
+    	} else {
+    		this.internalPrint(f);
+    	}
+    }
+
+    private void internalPrint(float f) {
+        entryBuilders.get().append(f);
+    }
+
+    @Override
+    public void print(int i) {
+    	if (!isLoggingEnabled()) {
+    		super.print(i);
+    	} else {
+    		this.internalPrint(i);
+    	}
+    }
+
+    private void internalPrint(int i) {
+        entryBuilders.get().append(i);
+    }
+
+    @Override
+    public void print(long l) {
+    	if (!isLoggingEnabled()) {
+    		super.print(l);
+    	} else {
+    		this.internalPrint(l);
+    	}
+    }
+
+    private void internalPrint(long l) {
+        entryBuilders.get().append(l);
+    }
+
+    @Override
+    public void print(Object obj) {
+    	if (!isLoggingEnabled()) {
+    		super.print(obj);
+    	} else {
+	        this.internalPrint(obj);
+    	}
+    }
+
+    private void internalPrint(Object obj) {
+        if (obj == null) {
+            entryBuilders.get().append(NULL_STRING);
+        } else {
+            internalPrint(obj.toString().toCharArray());
+        }
+    }
+
+    @Override
+    public void print(String s) {
+    	if (!isLoggingEnabled()) {
+    		super.print(s);
+    	} else {
+	    	this.internalPrint(s);
+    	}
+    }
+    private void internalPrint(String s) {
+        if (s == null) {
+            s = NULL_STRING;
+        }
+        this.internalAppend(s, 0, s.length());
+    }
+
+    @Override
+    public PrintStream printf(Locale l, String format, Object... args) {
+    	if (!isLoggingEnabled()) {
+    		super.printf(l, format, args);
+    	} else {  
+            this.internalPrint(String.format(l, format, args));
+    	}
+    	return this;
+    }
+
+    @Override
+    public PrintStream printf(String format, Object... args) {
+    	if (!isLoggingEnabled()) {
+    		super.printf(format, args);
+    	} else {
+    		this.internalPrint(String.format(format, args));
+    	}
+    	return this;
+    }
+
+    @Override
+    public void println() {
+    	if (!isLoggingEnabled()) {
+    		super.println();
+    	} else { 
+    		createEntryAndLog(entryBuilders.get());
+    	}
+    }
+
+    @Override
+    public void println(boolean x) {
+    	if (!isLoggingEnabled()) {
+    		super.println(x);
+    	} else {
+	        this.internalPrint(x);
+	        createEntryAndLog(entryBuilders.get());
+    	}
+    }
+
+    @Override
+    public void println(char x) {
+    	if (!isLoggingEnabled()) {
+    		super.println(x);
+    	} else { 
+	        this.internalAppend(x);
+	        createEntryAndLog(entryBuilders.get());
+    	}
+    }
+
+    @Override
+    public void println(char[] x) {
+    	if (!isLoggingEnabled()) {
+    		super.println(x);
+    	} else {
+	        this.internalPrint(x);
+	        createEntryAndLog(entryBuilders.get());
+    	}
+    }
+
+    @Override
+    public void println(double x) {
+    	if (!isLoggingEnabled()) {
+    		super.println(x);
+    	} else {
+	        this.internalPrint(x);
+	        createEntryAndLog(entryBuilders.get());
+    	}
+    }
+
+    @Override
+    public void println(float x) {
+    	if (!isLoggingEnabled()) {
+    		super.println(x);
+    	} else {
+	        this.internalPrint(x);
+	        createEntryAndLog(entryBuilders.get());
+    	}
+    }
+
+    @Override
+    public void println(int x) {
+    	if (!isLoggingEnabled()) {
+    		super.println(x);
+    	} else {
+    		this.internalPrint(x);
+    		createEntryAndLog(entryBuilders.get());
+    	}
+    }
+
+    @Override
+    public void println(long x) {
+    	if (!isLoggingEnabled()) {
+    		super.println(x);
+    	} else {
+    		this.internalPrint(x);
+    		createEntryAndLog(entryBuilders.get());
+    	}
+    }
+
+    @Override
+    public void println(Object x) {
+    	if (!isLoggingEnabled()) {
+    		super.println(x);
+    	} else {
+	        this.internalPrint(x);
+	        createEntryAndLog(entryBuilders.get());
+    	}
+    }
+
+    @Override
+    public void println(String x) {
+    	if (!isLoggingEnabled()) {
+    		super.println(x);
+    	} else {
+    		this.internalPrint(x);
+    		createEntryAndLog(entryBuilders.get());
+    	}
+    }
+
+    @Override
+    protected void setError() {
+    	if (!isLoggingEnabled()) {
+    		super.setError();
+    	} 
+    }
+
+    @Override
+    public void write(byte[] buf, int off, int len) {
+    	if (!isLoggingEnabled()) {
+    		super.write(buf, off, len);
+    	} else {
+	        byte[] outputBytes = new byte[len];
+	        System.arraycopy(buf, off, outputBytes, 0, len);
+	        this.internalPrint(new String(outputBytes));
+    	}
+    }
+
+    @Override
+    public void write(int b) {
+    	if (!isLoggingEnabled()) {
+    		super.write(b);
+    	} else {
+	        if (b == '\n' || b == '\r') {
+	            createEntryAndLog(entryBuilders.get());
+	        } else {
+	            entryBuilders.get().append(new String(new byte[] {(byte)b}));
+	        }
+    	}
+    }   
+    
+    private void createEntryAndLog(final StringBuilder stringBuilder) {
+        final String string = stringBuilder.toString();
+        switch (this.loggingLevel) {
+            case DEBUG:     getLogger().debug(string); break;
+            case ERROR:     getLogger().error(string); break;
+            case INFO:      getLogger().info(string);  break;
+            case WARNING:   getLogger().warn(string);  break;
+        }
+        entryBuilders.remove();
+    }
+    
+    private boolean isLoggingEnabled() {
+    	return isEnabledInConfiguration() && !isWithinLogback();
+    }
+
+	private boolean isWithinLogback() {
+		Class<?>[] executionStack = this.executionStackAccessor.getExecutionStack();
+    	
+    	for (Class<?> clazz : executionStack) {
+    		Package pkg = clazz.getPackage();
+    		if (pkg != null) {
+    			String pkgName = pkg.getName();
+    			if (pkgName != null && pkgName.startsWith(LOGBACK_PACKAGE_NAME_PREFIX)) {
+    				return true;
+    			}
+    		}
+    	}
+    	
+    	return false;
+	}
+
+	private boolean isEnabledInConfiguration() {
+		return Boolean.valueOf((String)this.configurationProvider.getConfiguration().get(this.configurationProperty));
+	}
+	
+	public PrintStream getOriginalPrintStream() {
+	    return this.originalPrintStream;
+	}
+
+    private Logger getLogger() {
+        if (this.logger == null) {
+            this.logger = LoggerFactory.getLogger(this.loggerName);
+        }
+        return this.logger;
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/PackageNameFilteringClassSelector.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/PackageNameFilteringClassSelector.java
new file mode 100644
index 0000000..ba2752d
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/PackageNameFilteringClassSelector.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log.impl;
+
+import java.util.List;
+
+public final class PackageNameFilteringClassSelector implements ClassSelector {
+
+    private final List<String> loggingPackages;
+
+    public PackageNameFilteringClassSelector(List<String> loggingPackages) {
+        this.loggingPackages = loggingPackages;
+    }
+
+    public Class<?> select(Class<?>[] classes) {
+        for (Class<?> clazz : classes) {
+            Package pkg = clazz.getPackage();
+            if (pkg != null && !this.loggingPackages.contains(pkg.getName())) {
+                return clazz;
+            }
+        }
+        return null;
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/SecurityManagerExecutionStackAccessor.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/SecurityManagerExecutionStackAccessor.java
new file mode 100644
index 0000000..865a287
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/SecurityManagerExecutionStackAccessor.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log.impl;
+
+public final class SecurityManagerExecutionStackAccessor extends SecurityManager implements ExecutionStackAccessor {
+
+    public Class<?>[] getExecutionStack() {
+        Class<?>[] classes = super.getClassContext();
+        Class<?>[] executionStack = new Class<?>[classes.length - 1];
+
+        System.arraycopy(classes, 1, executionStack, 0, executionStack.length);
+
+        return executionStack;
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/StandardCallingBundleResolver.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/StandardCallingBundleResolver.java
new file mode 100644
index 0000000..34e6d1b
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/StandardCallingBundleResolver.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log.impl;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.FrameworkUtil;
+
+public final class StandardCallingBundleResolver implements CallingBundleResolver {
+
+    private final ExecutionStackAccessor stackAccessor;
+
+    private final ClassSelector classSelector;
+
+    public StandardCallingBundleResolver(ExecutionStackAccessor stackAccessor, ClassSelector classSelector) {
+        this.stackAccessor = stackAccessor;
+        this.classSelector = classSelector;
+    }
+
+    public Bundle getCallingBundle() {
+        Class<?>[] executionStack = this.stackAccessor.getExecutionStack();
+        Class<?> loggingCallersClass = classSelector.select(executionStack);
+        return FrameworkUtil.getBundle(loggingCallersClass);
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/StandardDelegatingPrintStream.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/StandardDelegatingPrintStream.java
new file mode 100644
index 0000000..299c3c8
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/StandardDelegatingPrintStream.java
@@ -0,0 +1,237 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log.impl;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.util.Locale;
+
+import org.eclipse.virgo.medic.log.DelegatingPrintStream;
+
+
+/**
+ * Standard implementation of {@link DelegatingPrintStream}.
+ * 
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe
+ * 
+ */
+public final class StandardDelegatingPrintStream extends PrintStream implements DelegatingPrintStream {
+
+    private static final PrintStream NO_OP_PRINT_STREAM = new PrintStream(new NoOpOutputStream());
+
+    private volatile PrintStream delegate;
+
+    /**
+     * Creates a new <code>StandardDelegatingPrintStream</code> that will delegate to the given <code>delegate</code>.
+     * 
+     * @param delegate The delegate
+     */
+    public StandardDelegatingPrintStream(PrintStream delegate) {
+        super(new NoOpOutputStream());
+        setDelegate(delegate);
+    }
+
+    public void setDelegate(PrintStream printStream) {
+        if (printStream == null) {
+            this.delegate = NO_OP_PRINT_STREAM;
+        } else {
+            this.delegate = printStream;
+        }
+    }
+
+    @Override
+    public PrintStream append(char c) {
+        return delegate.append(c);
+    }
+
+    @Override
+    public PrintStream append(CharSequence csq, int start, int end) {
+        return delegate.append(csq, start, end);
+    }
+
+    @Override
+    public PrintStream append(CharSequence csq) {
+        return delegate.append(csq);
+    }
+
+    @Override
+    public boolean checkError() {
+        return delegate.checkError();
+    }
+
+    @Override
+    public void close() {
+        delegate.close();
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        return delegate.equals(obj);
+    }
+
+    @Override
+    public void flush() {
+        delegate.flush();
+    }
+
+    @Override
+    public PrintStream format(Locale l, String format, Object... args) {
+        return delegate.format(l, format, args);
+    }
+
+    @Override
+    public PrintStream format(String format, Object... args) {
+        return delegate.format(format, args);
+    }
+
+    @Override
+    public int hashCode() {
+        return delegate.hashCode();
+    }
+
+    @Override
+    public void print(boolean b) {
+        delegate.print(b);
+    }
+
+    @Override
+    public void print(char c) {
+        delegate.print(c);
+    }
+
+    @Override
+    public void print(char[] s) {
+        delegate.print(s);
+    }
+
+    @Override
+    public void print(double d) {
+        delegate.print(d);
+    }
+
+    @Override
+    public void print(float f) {
+        delegate.print(f);
+    }
+
+    @Override
+    public void print(int i) {
+        delegate.print(i);
+    }
+
+    @Override
+    public void print(long l) {
+        delegate.print(l);
+    }
+
+    @Override
+    public void print(Object obj) {
+        delegate.print(obj);
+    }
+
+    @Override
+    public void print(String s) {
+        delegate.print(s);
+    }
+
+    @Override
+    public PrintStream printf(Locale l, String format, Object... args) {
+        return delegate.printf(l, format, args);
+    }
+
+    @Override
+    public PrintStream printf(String format, Object... args) {
+        return delegate.printf(format, args);
+    }
+
+    @Override
+    public void println() {
+        delegate.println();
+    }
+
+    @Override
+    public void println(boolean x) {
+        delegate.println(x);
+    }
+
+    @Override
+    public void println(char x) {
+        delegate.println(x);
+    }
+
+    @Override
+    public void println(char[] x) {
+        delegate.println(x);
+    }
+
+    @Override
+    public void println(double x) {
+        delegate.println(x);
+    }
+
+    @Override
+    public void println(float x) {
+        delegate.println(x);
+    }
+
+    @Override
+    public void println(int x) {
+        delegate.println(x);
+    }
+
+    @Override
+    public void println(long x) {
+        delegate.println(x);
+    }
+
+    @Override
+    public void println(Object x) {
+        delegate.println(x);
+    }
+
+    @Override
+    public void println(String x) {
+        delegate.println(x);
+    }
+
+    @Override
+    public String toString() {
+        return delegate.toString();
+    }
+
+    @Override
+    public void write(byte[] buf, int off, int len) {
+        delegate.write(buf, off, len);
+    }
+
+    @Override
+    public void write(byte[] b) throws IOException {
+        delegate.write(b);
+    }
+
+    @Override
+    public void write(int b) {
+        delegate.write(b);
+    }
+
+    private static final class NoOpOutputStream extends OutputStream {
+
+        @Override
+        public void write(int b) throws IOException {
+        }
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/TeeLoggingPrintStreamWrapper.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/TeeLoggingPrintStreamWrapper.java
new file mode 100644
index 0000000..fceac18
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/TeeLoggingPrintStreamWrapper.java
@@ -0,0 +1,513 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log.impl;
+
+import java.io.PrintStream;
+import java.util.Locale;
+
+import org.eclipse.virgo.medic.impl.config.ConfigurationProvider;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * A <code>LoggingPrintStreamWrapper</code> wraps a PrintStream instance and logs, via SLF4j,
+ * all data that is written to it. 
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread-safe.
+ *
+ */
+public final class TeeLoggingPrintStreamWrapper extends PrintStream {
+
+    private static final class StringBuilderThreadLocal extends ThreadLocal<StringBuilder> {
+
+        @Override
+        public StringBuilder initialValue() {
+            return new StringBuilder();
+        }
+    }
+    
+    private static final String GOGO_PACKAGE_NAME_PREFIX = "org.apache.felix.gogo";
+    
+    private static final String TEE_LOGGING_PRINT_STREAM_WRAPPER_NAME = "org.eclipse.virgo.medic.log.impl.TeeLoggingPrintStreamWrapper";
+    
+    private static final String LOGBACK_PACKAGE_NAME_PREFIX = "ch.qos.logback";
+
+	private final ThreadLocal<StringBuilder> entryBuilders;
+    
+    private final Logger logger;
+    
+    private final ExecutionStackAccessor executionStackAccessor;
+    
+    private final ConfigurationProvider configurationProvider;
+    
+    private final String configurationProperty;
+    
+    private final PrintStream originalPrintStream;
+    
+    private final LoggingLevel loggingLevel;
+    
+    private static final String NULL_STRING = "null";
+    
+    /**
+     * Creates a new LoggingPrintStreamWrapper for the given PrintStream. Data written to
+     * the stream is logged via SLF4j to a logger with the supplied <code>loggerName</code>.<br/>
+     * The logging level is determined by the parameter of type {@link LoggingLevel}.
+     * 
+     * @param printStream The PrintStream instance to wrap
+     * @param loggerName The name of the logger
+     * @param loggingLevel The level of the log entries created
+     * @param executionStackAccessor 
+     * @param configurationProvider 
+     * @param configurationProperty 
+     */
+    public TeeLoggingPrintStreamWrapper(PrintStream printStream, String loggerName, LoggingLevel loggingLevel, ExecutionStackAccessor executionStackAccessor, ConfigurationProvider configurationProvider, String configurationProperty) {
+        super(printStream);
+        
+        this.logger = LoggerFactory.getLogger(loggerName);
+        this.loggingLevel = loggingLevel;
+        
+        this.executionStackAccessor = executionStackAccessor;
+        
+        this.entryBuilders = new StringBuilderThreadLocal();
+        
+        this.configurationProvider = configurationProvider;
+        
+        this.configurationProperty = configurationProperty;
+        
+        this.originalPrintStream = printStream;        
+    }
+
+    /**
+     * Creates a new LoggingPrintStreamWrapper for the given PrintStream. Data written to
+     * the stream is logged via SLF4j to a logger with the supplied <code>loggerName</code>.<br/>
+     * (The logging level is DEBUG by default.)
+     * 
+     * @param printStream The PrintStream instance to wrap
+     * @param loggerName The name of the logger
+     * @param executionStackAccessor
+     * @param configurationProvider
+     * @param configurationProperty
+     */
+    public TeeLoggingPrintStreamWrapper(PrintStream printStream, String loggerName, ExecutionStackAccessor executionStackAccessor, ConfigurationProvider configurationProvider, String configurationProperty) {
+        this(printStream, loggerName, LoggingLevel.DEBUG, executionStackAccessor, configurationProvider, configurationProperty);
+    }
+    
+    @Override
+    public PrintStream append(char c) {
+        super.append(c);
+        if (isLoggingEnabled()) {
+	    	this.internalAppend(c);
+    	}
+        return this;
+    }
+    
+    private boolean internalAppend(char c) {    	
+        if (c == '\n' || c == '\r') {
+            createEntryAndLog(entryBuilders.get());
+            return true;
+        } else {
+            entryBuilders.get().append(c);
+            return false;
+        }
+    }
+
+    @Override
+    public PrintStream append(CharSequence csq, int start, int end) {
+        super.append(csq, start, end);
+    	if (isLoggingEnabled()) {
+	        this.internalAppend(csq, start, end);
+    	}
+
+        return this;
+    }
+
+    private void internalAppend(CharSequence csq, int start, int end) {
+        for (int i = start; i < end; i++) {
+            boolean loggedEntry = internalAppend(csq.charAt(i));
+            if (loggedEntry && i < (end - 1)) {
+                char c = csq.charAt(i + 1);
+                if (c == '\n' || c == '\r') {
+                    i++;
+                }
+            }
+        }
+    }
+
+    @Override
+    public PrintStream append(CharSequence csq) {
+        super.append(csq);
+    	if (isLoggingEnabled()) {
+	        if(csq == null){
+	        	throw new NullPointerException("Character Sequence to be added to the printStream from source '" + this.logger.getName() + "' is null");
+	        }
+	        this.internalAppend(csq, 0, csq.length());
+    	}
+    	return this;
+    }
+    
+    @Override
+    public boolean checkError() {
+        if (isLoggingEnabled()) {
+            return false;
+        }
+        return super.checkError();
+    	
+    }
+
+    @Override
+    public void close() {
+        super.close();
+    }
+
+    @Override
+    public void flush() {
+        super.flush();
+    }
+
+    @Override
+    public PrintStream format(Locale l, String format, Object... args) {
+        super.format(l, format, args);
+    	if (isLoggingEnabled()) {
+    		this.internalPrint(String.format(l, format, args));
+    	}
+        return this;
+    }
+
+    @Override
+    public PrintStream format(String format, Object... args) {
+        super.format(format, args);
+    	if (isLoggingEnabled()) {
+    		this.internalPrint(String.format(format, args));
+    	}
+        return this;
+    }
+
+    @Override
+    public void print(boolean b) {
+        super.print(b);
+    	if (isLoggingEnabled()) {
+    		this.internalPrint(b);
+    	}
+    }
+
+    private void internalPrint(boolean b) {
+        entryBuilders.get().append(b);
+    }
+
+    @Override
+    public void print(char c) {
+        super.print(c);
+    	if (isLoggingEnabled()) {
+    		this.internalAppend(c);
+    	}
+    }
+
+    @Override
+    public void print(char[] ca) {
+        super.print(ca);
+    	if (isLoggingEnabled()) {
+    	    this.internalPrint(ca);
+    	}
+    }
+    
+    private void internalPrint(char[] ca) {
+        final String s = new String(ca);
+        this.internalAppend(s, 0, s.length());
+    }
+
+    @Override
+    public void print(double d) {
+        super.print(d);
+    	if (isLoggingEnabled()) {
+    		this.internalPrint(d);
+    	}
+    }
+
+    private void internalPrint(double d) {
+        entryBuilders.get().append(d);
+    }
+
+    @Override
+    public void print(float f) {
+        super.print(f);
+    	if (isLoggingEnabled()) {
+    		this.internalPrint(f);
+    	}
+    }
+
+    private void internalPrint(float f) {
+        entryBuilders.get().append(f);
+    }
+
+    @Override
+    public void print(int i) {
+        super.print(i);
+    	if (isLoggingEnabled()) {
+    		this.internalPrint(i);
+    	}
+    }
+
+    private void internalPrint(int i) {
+        entryBuilders.get().append(i);
+    }
+
+    @Override
+    public void print(long l) {
+        super.print(l);
+    	if (isLoggingEnabled()) {
+    		this.internalPrint(l);
+    	}
+    }
+
+    private void internalPrint(long l) {
+        entryBuilders.get().append(l);
+    }
+
+    @Override
+    public void print(Object obj) {
+        super.print(obj);
+    	if (isLoggingEnabled()) {
+	        this.internalPrint(obj);
+    	}
+    }
+
+    private void internalPrint(Object obj) {
+        if (obj == null) {
+            entryBuilders.get().append(NULL_STRING);
+        } else {
+            internalPrint(obj.toString().toCharArray());
+        }
+    }
+
+    @Override
+    public void print(String s) {
+        super.print(s);
+    	if (isLoggingEnabled()) {
+	    	this.internalPrint(s);
+    	}
+    }
+    private void internalPrint(String s) {
+        if (s == null) {
+            s = NULL_STRING;
+        }
+        this.internalAppend(s, 0, s.length());
+    }
+
+    @Override
+    public PrintStream printf(Locale l, String format, Object... args) {
+        super.printf(l, format, args);
+    	if (isLoggingEnabled()) {
+            this.internalPrint(String.format(l, format, args));
+    	}
+    	return this;
+    }
+
+    @Override
+    public PrintStream printf(String format, Object... args) {
+        super.printf(format, args);
+    	if (isLoggingEnabled()) {
+    		this.internalPrint(String.format(format, args));
+    	}
+    	return this;
+    }
+
+    @Override
+    public void println() {
+        super.println();
+    	if (isLoggingEnabled()) {
+    		createEntryAndLog(entryBuilders.get());
+    	}
+    }
+
+    @Override
+    public void println(boolean x) {
+        super.println(x);
+    	if (isLoggingEnabled()) {
+	        this.internalPrint(x);
+	        createEntryAndLog(entryBuilders.get());
+    	}
+    }
+
+    @Override
+    public void println(char x) {
+        super.println(x);
+    	if (isLoggingEnabled()) {
+	        this.internalAppend(x);
+	        createEntryAndLog(entryBuilders.get());
+    	}
+    }
+
+    @Override
+    public void println(char[] x) {
+        super.println(x);
+    	if (isLoggingEnabled()) {
+	        this.internalPrint(x);
+	        createEntryAndLog(entryBuilders.get());
+    	}
+    }
+
+    @Override
+    public void println(double x) {
+        super.println(x);
+    	if (isLoggingEnabled()) {
+	        this.internalPrint(x);
+	        createEntryAndLog(entryBuilders.get());
+    	}
+    }
+
+    @Override
+    public void println(float x) {
+        super.println(x);
+    	if (isLoggingEnabled()) {
+	        this.internalPrint(x);
+	        createEntryAndLog(entryBuilders.get());
+    	}
+    }
+
+    @Override
+    public void println(int x) {
+        super.println(x);
+    	if (isLoggingEnabled()) {
+    		this.internalPrint(x);
+    		createEntryAndLog(entryBuilders.get());
+    	}
+    }
+
+    @Override
+    public void println(long x) {
+        super.println(x);
+    	if (isLoggingEnabled()) {
+    		this.internalPrint(x);
+    		createEntryAndLog(entryBuilders.get());
+    	}
+    }
+
+    @Override
+    public void println(Object x) {
+        super.println(x);
+    	if (isLoggingEnabled()) {
+	        this.internalPrint(x);
+	        createEntryAndLog(entryBuilders.get());
+    	}
+    }
+
+    @Override
+    public void println(String x) {
+        super.println(x);
+    	if (isLoggingEnabled()) {
+    		this.internalPrint(x);
+    		createEntryAndLog(entryBuilders.get());
+    	}
+    }
+
+    @Override
+    protected void setError() {
+        super.setError();
+    }
+
+    @Override
+    public void write(byte[] buf, int off, int len) {
+        super.write(buf, off, len);
+    	if (isLoggingEnabled()) {
+	        byte[] outputBytes = new byte[len];
+	        System.arraycopy(buf, off, outputBytes, 0, len);
+	        this.internalPrint(new String(outputBytes));
+    	}
+    }
+
+    @Override
+    public void write(int b) {
+        super.write(b);
+    	if (isLoggingEnabled()) {
+	        if (b == '\n' || b == '\r') {
+	            createEntryAndLog(entryBuilders.get());
+	        } else {
+	            entryBuilders.get().append(new String(new byte[] {(byte)b}));
+	        }
+    	}
+    }   
+    
+    private void createEntryAndLog(final StringBuilder stringBuilder) {
+        final String string = stringBuilder.toString();
+        switch (this.loggingLevel) {
+            case DEBUG:     this.logger.debug(string); break;
+            case ERROR:     this.logger.error(string); break;
+            case INFO:      this.logger.info(string);  break;
+            case WARNING:   this.logger.warn(string);  break;
+        }
+        entryBuilders.remove();
+    }
+    
+    private boolean isLoggingEnabled() {
+    	return isEnabledInConfiguration() && !isWithinLogback() && !isWithinTeeOperation() && !isWithinGoGoCall();
+    }
+
+    private boolean isWithinLogback() {
+        return isWithinCallContainingPackage(LOGBACK_PACKAGE_NAME_PREFIX);
+    }
+
+    private boolean isWithinGoGoCall() {
+        return isWithinCallContainingPackage(GOGO_PACKAGE_NAME_PREFIX);
+    }
+
+    private boolean isWithinCallContainingPackage(String expectedPkg) {
+        Class<?>[] executionStack = this.executionStackAccessor.getExecutionStack();
+    	
+    	for (Class<?> clazz : executionStack) {
+    		Package pkg = clazz.getPackage();
+    		if (pkg != null) {
+    			String pkgName = pkg.getName();
+    			if (pkgName != null && pkgName.startsWith(expectedPkg)) {
+    				return true;
+    			}
+    		}
+    	}
+        return false;
+    }
+
+    /**
+     * Checks whether the call already passed by this class and returned again here in the same stack trace. If so we
+     * don't need to log another logging event for these calls, because one was already fired.
+     * 
+     * @return true if the call passed twice or more times by this class, false otherwise
+     */
+    private boolean isWithinTeeOperation() {
+        Class<?>[] executionStack = this.executionStackAccessor.getExecutionStack();
+
+        //Start from index 3 because if we come from this class for the first time 
+        // there are at least three stack trace elements for this call passing:
+        // 1. PrintStream method
+        // 2. isLoggingEnabled
+        // 3. isWithinTeeOperation
+        for (int i = 3; i < executionStack.length; i++) {
+            Class<?> clazz = executionStack[i];
+            if (clazz != null) {
+                String className = clazz.getCanonicalName(); 
+                if (className != null && className.equals(TEE_LOGGING_PRINT_STREAM_WRAPPER_NAME)) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+	private boolean isEnabledInConfiguration() {
+		return ConfigurationProvider.LOG_TEE_SYSSTREAMS.equals((String)this.configurationProvider.getConfiguration().get(this.configurationProperty));
+	}
+	
+	public PrintStream getOriginalPrintStream() {
+	    return this.originalPrintStream;
+	}
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/config/BundleResourceConfigurationLocator.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/config/BundleResourceConfigurationLocator.java
new file mode 100644
index 0000000..6039f7d
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/config/BundleResourceConfigurationLocator.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log.impl.config;
+
+import java.io.IOException;
+import java.net.URL;
+
+import org.eclipse.virgo.medic.log.LoggingConfiguration;
+import org.osgi.framework.Bundle;
+
+
+public final class BundleResourceConfigurationLocator implements ConfigurationLocator {
+
+    public LoggingConfiguration locateConfiguration(Bundle bundle) {
+        if (bundle != null) {
+            URL logBackConfigurationEntry = bundle.getResource("logback.xml");
+
+            if (logBackConfigurationEntry == null) {
+                logBackConfigurationEntry = bundle.getResource("logback-default.xml");
+            }
+
+            if (logBackConfigurationEntry != null) {
+                try {
+                    return new StandardLoggingConfiguration(logBackConfigurationEntry, createContextName(bundle));
+                } catch (IOException ioe) {
+                    // TODO Exception handling
+                }
+            }
+        }
+
+        return null;
+    }
+
+    private static String createContextName(Bundle bundle) {
+        return bundle.getSymbolicName() + "_" + bundle.getVersion();
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/config/CompositeConfigurationLocator.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/config/CompositeConfigurationLocator.java
new file mode 100644
index 0000000..dec1524
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/config/CompositeConfigurationLocator.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log.impl.config;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.virgo.medic.log.LoggingConfiguration;
+import org.osgi.framework.Bundle;
+
+
+public final class CompositeConfigurationLocator implements ConfigurationLocator {
+
+    private final List<ConfigurationLocator> configurationLocators;
+
+    public CompositeConfigurationLocator(ConfigurationLocator... configurationLocators) {
+        this.configurationLocators = Arrays.asList(configurationLocators);
+    }
+
+    public LoggingConfiguration locateConfiguration(Bundle bundle) {
+        for (ConfigurationLocator configurationLocator : this.configurationLocators) {
+            LoggingConfiguration configuration = configurationLocator.locateConfiguration(bundle);
+            if (configuration != null) {
+                return configuration;
+            }
+        }
+        return null;
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/config/ConfigurationLocator.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/config/ConfigurationLocator.java
new file mode 100644
index 0000000..921ade7
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/config/ConfigurationLocator.java
@@ -0,0 +1,21 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log.impl.config;
+
+import org.eclipse.virgo.medic.log.LoggingConfiguration;
+import org.osgi.framework.Bundle;
+
+
+public interface ConfigurationLocator {
+
+    LoggingConfiguration locateConfiguration(Bundle bundle);
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/config/ServiceReferenceUtils.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/config/ServiceReferenceUtils.java
new file mode 100644
index 0000000..488cf45
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/config/ServiceReferenceUtils.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log.impl.config;
+
+import org.osgi.framework.ServiceReference;
+
+class ServiceReferenceUtils {
+
+    static <S> ServiceReference<S> selectServiceReference(ServiceReference<S>[] serviceReferences) {
+        ServiceReference<S> highest = null;
+
+        for (ServiceReference<S> serviceReference : serviceReferences) {
+            if (highest == null || serviceReference.compareTo(highest) > 0) {
+                highest = serviceReference;
+            }
+        }
+
+        return highest;
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/config/ServiceRegistryConfigurationLocator.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/config/ServiceRegistryConfigurationLocator.java
new file mode 100644
index 0000000..3c2d2af
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/config/ServiceRegistryConfigurationLocator.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log.impl.config;
+
+import org.eclipse.virgo.medic.log.LoggingConfiguration;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+
+
+public final class ServiceRegistryConfigurationLocator implements ConfigurationLocator {
+
+    private final BundleContext bundleContext;
+
+    static final String LOGGING_CONFIGURATION_ID_SERVICE_PROPERTY = "org.eclipse.virgo.medic.log.configuration.id";
+
+    private static final String MEDIC_LOGGING_CONFIGURATION_HEADER = "Medic-LoggingConfiguration";
+
+    public ServiceRegistryConfigurationLocator(BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
+    }
+
+    @SuppressWarnings("unchecked")
+	public LoggingConfiguration locateConfiguration(Bundle bundle) {
+        if (bundle != null) {
+            String configurationName = (String) bundle.getHeaders().get(MEDIC_LOGGING_CONFIGURATION_HEADER);
+
+            if (configurationName != null) {
+                try {
+					ServiceReference<LoggingConfiguration>[] serviceReferences = (ServiceReference<LoggingConfiguration>[]) this.bundleContext
+							.getServiceReferences(LoggingConfiguration.class
+									.getName(), "("
+									+ LOGGING_CONFIGURATION_ID_SERVICE_PROPERTY
+									+ "=" + configurationName + ")");
+                    if (serviceReferences != null && serviceReferences.length > 0) {
+                        ServiceReference<LoggingConfiguration> serviceReference = ServiceReferenceUtils.selectServiceReference(serviceReferences);
+                        return (LoggingConfiguration) this.bundleContext.getService(serviceReference);
+                    }
+                } catch (InvalidSyntaxException ise) {
+
+                }
+            }
+        }
+
+        return null;
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/config/StandardLoggingConfiguration.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/config/StandardLoggingConfiguration.java
new file mode 100644
index 0000000..49d4c57
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/config/StandardLoggingConfiguration.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log.impl.config;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.URL;
+
+import org.eclipse.virgo.medic.log.LoggingConfiguration;
+
+class StandardLoggingConfiguration implements LoggingConfiguration {
+
+    private final String configuration;
+
+    private final String name;
+
+    StandardLoggingConfiguration(URL configuration, String name) throws IOException {
+        this(readConfiguration(configuration), name);
+    }
+
+    StandardLoggingConfiguration(File configuration, String name) throws IOException {
+        this(readConfiguration(configuration), name);
+    }
+
+    private StandardLoggingConfiguration(String configuration, String name) {
+        this.configuration = configuration;
+        this.name = name;
+    }
+
+    public String getConfiguration() {
+        return this.configuration;
+    }
+
+    public String getName() {
+        return this.name;
+    }
+
+    private static String readConfiguration(URL configURL) throws IOException {
+        try (BufferedReader reader = new BufferedReader(new InputStreamReader(configURL.openStream(), UTF_8))) {
+            return readConfiguration(reader);
+        }
+    }
+
+    private static String readConfiguration(File configFile) throws IOException {
+        try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(configFile), UTF_8))) {
+            return readConfiguration(reader);
+        }
+    }
+
+    private static String readConfiguration(BufferedReader reader) throws IOException {
+        StringBuilder configurationBuilder = new StringBuilder();
+        String line;
+        while ((line = reader.readLine()) != null) {
+            configurationBuilder.append(line);
+        }
+        return configurationBuilder.toString();
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/config/StandardLoggingConfigurationPublisher.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/config/StandardLoggingConfigurationPublisher.java
new file mode 100644
index 0000000..3472dc7
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/config/StandardLoggingConfigurationPublisher.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log.impl.config;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Dictionary;
+import java.util.Hashtable;
+
+import org.eclipse.virgo.medic.log.ConfigurationPublicationFailedException;
+import org.eclipse.virgo.medic.log.LoggingConfiguration;
+import org.eclipse.virgo.medic.log.LoggingConfigurationPublisher;
+import org.osgi.framework.BundleContext;
+
+
+public class StandardLoggingConfigurationPublisher implements LoggingConfigurationPublisher {
+
+    private final BundleContext context;
+    
+    private static final String DEFAULT_CONFIGURATION_ID = "org.eclipse.virgo.medic";
+
+    public StandardLoggingConfigurationPublisher(BundleContext context) {
+        this.context = context;
+    }
+
+    public void publishConfiguration(File configuration, String id) throws ConfigurationPublicationFailedException {
+        LoggingConfiguration loggingConfiguration = createLoggingConfiguration(configuration, id);
+        Dictionary<String, String> properties = new Hashtable<String, String>();
+
+        properties.put(ServiceRegistryConfigurationLocator.LOGGING_CONFIGURATION_ID_SERVICE_PROPERTY, id);
+        context.registerService(LoggingConfiguration.class.getName(), loggingConfiguration, properties);
+    }
+
+    private static LoggingConfiguration createLoggingConfiguration(File configuration, String id) throws ConfigurationPublicationFailedException {
+        try {
+            return new StandardLoggingConfiguration(configuration, id);
+        } catch (IOException ioe) {
+            throw new ConfigurationPublicationFailedException("Failed to read the configuration from the file '" + configuration.getAbsolutePath()
+                + "'.", ioe);
+        }
+    }
+
+	public void publishDefaultConfiguration(File file) throws ConfigurationPublicationFailedException {
+		publishConfiguration(file, DEFAULT_CONFIGURATION_ID);
+	}
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/logback/ContextSelectorDelegate.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/logback/ContextSelectorDelegate.java
new file mode 100644
index 0000000..cbf8662
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/logback/ContextSelectorDelegate.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log.impl.logback;
+
+import java.util.List;
+
+import ch.qos.logback.classic.LoggerContext;
+
+public interface ContextSelectorDelegate {
+
+    LoggerContext getLoggerContext();
+
+    LoggerContext getLoggerContext(String name);
+
+    LoggerContext detachLoggerContext(String loggerContextName);
+
+    List<String> getContextNames();
+
+    void configureDefaultContext(LoggerContext defaultContext);
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/logback/JoranLoggerContextConfigurer.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/logback/JoranLoggerContextConfigurer.java
new file mode 100644
index 0000000..2863efc
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/logback/JoranLoggerContextConfigurer.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log.impl.logback;
+
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.virgo.medic.log.LoggingConfiguration;
+import org.xml.sax.InputSource;
+
+import ch.qos.logback.classic.LoggerContext;
+import ch.qos.logback.classic.joran.JoranConfigurator;
+import ch.qos.logback.core.joran.spi.JoranException;
+import ch.qos.logback.core.status.Status;
+
+public final class JoranLoggerContextConfigurer implements LoggerContextConfigurer {
+
+    public void applyConfiguration(LoggingConfiguration configuration, LoggerContext loggerContext) throws LoggerContextConfigurationFailedException {
+        JoranConfigurator configurator = new JoranConfigurator();
+        configurator.setContext(loggerContext);
+        String configurationString = configuration.getConfiguration();
+        try {
+            configurator.doConfigure(new InputSource(new StringReader(configurationString)));
+            List<Status> statusList = loggerContext.getStatusManager().getCopyOfStatusList();
+            List<String> failureMessages = new ArrayList<String>();
+            for (Status status : statusList) {
+                if (Status.INFO != status.getLevel()) {
+                    Throwable cause = null;
+                    Throwable t = status.getThrowable();
+                    if (t != null) {
+                        cause = t.getCause();
+                    }
+                    failureMessages.add(status.getMessage() + (cause != null ? " Caused by " + cause + "." : ""));
+                }
+            }
+            reportFailureIfNecessary(failureMessages);
+        } catch (JoranException je) {
+            throw new LoggerContextConfigurationFailedException("Configuration failed", je);
+        }
+    }
+
+    private static void reportFailureIfNecessary(List<String> failureMessages) throws LoggerContextConfigurationFailedException {
+        if (!failureMessages.isEmpty()) {
+            throw new LoggerContextConfigurationFailedException("Configuration failed with the following problems: " + failureMessages);
+        }
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/logback/LoggerContextConfigurationFailedException.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/logback/LoggerContextConfigurationFailedException.java
new file mode 100644
index 0000000..f4daea8
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/logback/LoggerContextConfigurationFailedException.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log.impl.logback;
+
+class LoggerContextConfigurationFailedException extends Exception {
+
+    private static final long serialVersionUID = -4259913727730630284L;
+
+    public LoggerContextConfigurationFailedException(String message) {
+        super(message);
+    }
+
+    public LoggerContextConfigurationFailedException(String message, Throwable cause) {
+        super(message, cause);
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/logback/LoggerContextConfigurer.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/logback/LoggerContextConfigurer.java
new file mode 100644
index 0000000..653cd59
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/logback/LoggerContextConfigurer.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log.impl.logback;
+
+import org.eclipse.virgo.medic.log.LoggingConfiguration;
+
+import ch.qos.logback.classic.LoggerContext;
+
+
+public interface LoggerContextConfigurer {
+
+    void applyConfiguration(LoggingConfiguration configuration, LoggerContext loggerContext) throws LoggerContextConfigurationFailedException;
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/logback/StandardContextSelectorDelegate.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/logback/StandardContextSelectorDelegate.java
new file mode 100644
index 0000000..fc159b8
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/impl/logback/StandardContextSelectorDelegate.java
@@ -0,0 +1,152 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log.impl.logback;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.WeakHashMap;
+
+import org.eclipse.virgo.medic.log.LoggingConfiguration;
+import org.eclipse.virgo.medic.log.impl.CallingBundleResolver;
+import org.eclipse.virgo.medic.log.impl.config.ConfigurationLocator;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleEvent;
+import org.osgi.framework.BundleListener;
+
+import ch.qos.logback.classic.LoggerContext;
+
+
+public class StandardContextSelectorDelegate implements ContextSelectorDelegate, BundleListener {
+
+    private final CallingBundleResolver loggingCallerLocator;
+
+    private final Map<String, LoggerContext> loggerContexts = new HashMap<String, LoggerContext>();
+    
+    private final Map<Bundle, LoggingConfiguration> loggingConfigurations = new WeakHashMap<Bundle, LoggingConfiguration>();
+
+    private final Object monitor = new Object();
+
+    private final ConfigurationLocator configurationLocator;
+
+    private final LoggerContextConfigurer configurer;
+
+    private final Bundle medicBundle;
+
+    public StandardContextSelectorDelegate(CallingBundleResolver loggingCallerLocator, ConfigurationLocator configurationLocator, Bundle medicBundle,
+        LoggerContextConfigurer configurer) {
+        this.loggingCallerLocator = loggingCallerLocator;
+        this.configurationLocator = configurationLocator;
+        this.medicBundle = medicBundle;
+        this.configurer = configurer;
+    }
+
+    public LoggerContext detachLoggerContext(String name) {
+        synchronized (monitor) {
+            return this.loggerContexts.remove(name);
+        }
+    }
+
+    public List<String> getContextNames() {
+        synchronized (this.monitor) {
+            List<String> names = new ArrayList<String>();
+            names.addAll(this.loggerContexts.keySet());
+            return names;
+        }
+    }
+
+    public LoggerContext getLoggerContext() {
+        Bundle callingBundle = this.loggingCallerLocator.getCallingBundle();
+        
+        LoggingConfiguration loggingConfiguration = null;
+        
+        if (callingBundle != null) {
+        	synchronized(this.monitor) {
+        		loggingConfiguration = this.loggingConfigurations.get(callingBundle);
+        	}
+        }
+        
+        if (loggingConfiguration == null) {
+        	loggingConfiguration = locateConfiguration(callingBundle);
+        	if (loggingConfiguration != null && callingBundle != null) {
+	        	synchronized(this.monitor) {
+	        		this.loggingConfigurations.put(callingBundle, loggingConfiguration);	
+	        	}
+        	}
+        }
+
+        if (loggingConfiguration != null) {
+            synchronized (this.monitor) {
+                LoggerContext existingContext = this.loggerContexts.get(loggingConfiguration.getName());
+                if (existingContext != null) {
+                    return existingContext;
+                } else {
+                    LoggerContext configuredContext = createConfiguredContext(loggingConfiguration);
+                    this.loggerContexts.put(loggingConfiguration.getName(), configuredContext);
+                    return configuredContext;
+                }
+            }
+        }
+
+        return null;
+    }
+
+    private LoggingConfiguration locateConfiguration(Bundle callingBundle) {
+        return this.configurationLocator.locateConfiguration(callingBundle);
+    }
+
+    private LoggerContext createConfiguredContext(LoggingConfiguration configuration) {
+        LoggerContext loggerContext = new LoggerContext();
+        loggerContext.setName(configuration.getName());
+
+        try {
+            this.configurer.applyConfiguration(configuration, loggerContext);
+        } catch (LoggerContextConfigurationFailedException lccfe) {
+            lccfe.printStackTrace(System.err);
+        }
+
+        return loggerContext;
+    }
+
+    public LoggerContext getLoggerContext(String name) {
+        synchronized (monitor) {
+            return this.loggerContexts.get(name);
+        }
+    }
+
+    public void configureDefaultContext(LoggerContext defaultContext) {
+        LoggingConfiguration configuration = locateConfiguration(this.medicBundle);
+
+        if (configuration != null) {
+            defaultContext.reset();
+            try {
+                this.configurer.applyConfiguration(configuration, defaultContext);
+
+                // Remember the default context.
+                synchronized (this.monitor) {
+                    this.loggerContexts.put(configuration.getName(), defaultContext);
+                }
+            } catch (LoggerContextConfigurationFailedException lccfe) {
+                lccfe.printStackTrace(System.err);
+            }
+        }
+    }
+
+	public void bundleChanged(BundleEvent event) {
+		if (BundleEvent.UPDATED == event.getType()) {
+			synchronized (this.monitor) {
+				this.loggingConfigurations.remove(event.getBundle());
+			}
+		}
+	}
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/logback/DelegatingContextSelector.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/logback/DelegatingContextSelector.java
new file mode 100644
index 0000000..98c173e
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/logback/DelegatingContextSelector.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log.logback;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.virgo.medic.log.impl.logback.ContextSelectorDelegate;
+
+import ch.qos.logback.classic.LoggerContext;
+import ch.qos.logback.classic.selector.ContextSelector;
+
+public class DelegatingContextSelector implements ContextSelector {
+
+    private static volatile ContextSelectorDelegate delegate;
+
+    private static volatile LoggerContext defaultLoggerContext;
+
+    private static volatile boolean defaultContextConfigured;
+
+    public DelegatingContextSelector(LoggerContext loggerContext) {
+        DelegatingContextSelector.setDefaultLoggerContext(loggerContext);
+    }
+
+    private static void setDefaultLoggerContext(LoggerContext loggerContext) {
+        if (delegate != null) {
+            configureDefaultContextIfNecessary(delegate, loggerContext);
+        }
+        DelegatingContextSelector.defaultLoggerContext = loggerContext;
+    }
+
+    private static void configureDefaultContextIfNecessary(ContextSelectorDelegate delegate, LoggerContext defaultLoggerContext) {
+        if (!defaultContextConfigured) {
+            delegate.configureDefaultContext(defaultLoggerContext);
+            defaultContextConfigured = true;
+        }
+    }
+
+    public LoggerContext detachLoggerContext(String loggerContextName) {
+        if (delegate == null) {
+            return DelegatingContextSelector.defaultLoggerContext;
+        }
+        return delegate.detachLoggerContext(loggerContextName);
+    }
+
+    public List<String> getContextNames() {
+        if (delegate == null) {
+            return Arrays.asList(defaultLoggerContext.getName());
+        }
+        return delegate.getContextNames();
+    }
+
+    public LoggerContext getDefaultLoggerContext() {
+        return DelegatingContextSelector.defaultLoggerContext;
+    }
+
+    public LoggerContext getLoggerContext() {
+        if (delegate == null) {
+            return defaultLoggerContext;
+        }
+
+        LoggerContext loggerContext = delegate.getLoggerContext();
+        if (loggerContext != null) {
+            return loggerContext;
+        }
+
+        return defaultLoggerContext;
+    }
+
+    public LoggerContext getLoggerContext(String name) {
+        if (name.equals(defaultLoggerContext.getName())) {
+            return defaultLoggerContext;
+        }
+        return delegate.getLoggerContext(name);
+    }
+
+    public static void setDelegate(ContextSelectorDelegate delegate) {
+        if (delegate != null) {
+            if (defaultLoggerContext != null) {
+                configureDefaultContextIfNecessary(delegate, defaultLoggerContext);
+            }
+        }
+        DelegatingContextSelector.delegate = delegate;
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/logback/ReroutingAwareConsoleAppender.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/logback/ReroutingAwareConsoleAppender.java
new file mode 100644
index 0000000..21ccd14
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/logback/ReroutingAwareConsoleAppender.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log.logback;
+
+import java.io.OutputStream;
+
+import org.eclipse.virgo.medic.log.impl.LoggingPrintStreamWrapper;
+
+import ch.qos.logback.core.ConsoleAppender;
+
+
+/**
+ * A special {@link ConsoleAppender} that is aware of re-routing of <code>System.out</code> and <code>System.err</code>
+ * and will always use the original <code>System.out</code> and <code>System.err</code>, rather than the ones that are being rerouted.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ * 
+ * @param <E> Event type being logged
+ */
+public class ReroutingAwareConsoleAppender<E> extends ConsoleAppender<E> {
+
+    /**
+     * This is responsible for ensuring the Appender is using the right output stream as it may have been wrapped.
+     */
+    @Override
+    public void setOutputStream(OutputStream outputStream) {
+        if (outputStream instanceof LoggingPrintStreamWrapper) {
+            super.setOutputStream(((LoggingPrintStreamWrapper)outputStream).getOriginalPrintStream());
+        } else {
+            super.setOutputStream(outputStream);
+        }
+    }
+
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/osgi/OSGiLogServiceListener.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/osgi/OSGiLogServiceListener.java
new file mode 100644
index 0000000..1f0d40d
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/log/osgi/OSGiLogServiceListener.java
@@ -0,0 +1,100 @@
+/*
+ * This file is part of the Eclipse Virgo project.
+ *
+ * Copyright (c) 2011 copyright_holder
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    cgfrost - initial contribution
+ */
+
+package org.eclipse.virgo.medic.log.osgi;
+
+import org.osgi.service.log.LogEntry;
+import org.osgi.service.log.LogListener;
+import org.osgi.service.log.LogService;
+import org.slf4j.Logger;
+
+
+/**
+ * TODO Document EquinoxLogServiceImpl
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ * TODO Document concurrent semantics of EquinoxLogServiceImpl
+ */
+public class OSGiLogServiceListener implements LogListener {
+    
+    private final Logger logger;
+    
+    public OSGiLogServiceListener(Logger logger) {
+        this.logger = logger;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+	@Override
+	public void logged(LogEntry entry) {
+		if(entry.getException() == null){
+			this.log(entry.getLevel(), formatMessage(entry));
+		} else {
+			this.log(entry.getLevel(), formatMessage(entry), entry.getException());
+		}
+	}
+	
+	private String formatMessage(LogEntry entry){
+		String message = entry.getMessage();
+		if(entry.getServiceReference() != null){
+			message = String.format("Service %s, %s", entry.getServiceReference().getProperty("service.id").toString(), message);
+		}
+		if(entry.getBundle() != null){
+			message = String.format("Bundle %s_%s, %s", entry.getBundle().getSymbolicName(), entry.getBundle().getVersion().toString(), message);
+		}
+		return message;
+	}
+
+    private void log(int level, String message) {
+        switch (level) {
+            case LogService.LOG_DEBUG : 
+                this.logger.debug(message); 
+                break;
+            case LogService.LOG_INFO : 
+                this.logger.info(message); 
+                break;
+            case LogService.LOG_WARNING : 
+                this.logger.warn(message); 
+                break;
+            case LogService.LOG_ERROR : 
+                this.logger.error(message); 
+                break;
+            default :
+                this.logger.error(String.format("Log Message of unknown severity %d: %s", level, message));
+                break;
+        } 
+    }
+
+    private void log(int level, String message, Throwable exception) {
+        switch (level) {
+            case LogService.LOG_DEBUG : 
+                this.logger.debug(message, exception); 
+                break;
+            case LogService.LOG_INFO : 
+                this.logger.info(message, exception); 
+                break;
+            case LogService.LOG_WARNING : 
+                this.logger.warn(message, exception); 
+                break;
+            case LogService.LOG_ERROR : 
+                this.logger.error(message, exception); 
+                break;
+            default :
+                this.logger.error(String.format("Log Message of unknown severity %d: %s", level, message), exception);
+                break;
+        } 
+    }
+    
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/management/DumpInspector.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/management/DumpInspector.java
new file mode 100644
index 0000000..1a4d902
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/management/DumpInspector.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.virgo.medic.management;
+
+import java.io.IOException;
+import java.text.ParseException;
+
+import javax.management.MXBean;
+
+/**
+ * 
+ * Implementations should be thread safe
+ *
+ */
+@MXBean
+public interface DumpInspector {
+	
+	/**
+	 * Return the currently configured dump directory
+	 * 
+	 * @return 
+	 */
+	String getConfiguredDumpDirectory();
+	
+	/**
+	 * An array of the available dump ids
+	 * 
+	 * @return array of dump ids
+	 * @throws IOException
+	 * @throws ParseException
+	 */
+	String[] getDumps() throws IOException, ParseException;
+	
+	/**
+	 * An array of the available dump items for the given dump with each array 
+	 * containing an array in the order of display name, bean to use for displaying 
+	 * the item (optional). When not given, this bean should be used.
+	 * 
+	 * @param dumpId
+	 * @return array of dump entries
+	 * @throws IOException
+	 */
+	String[][] getDumpEntries(String dumpId) throws IOException;
+	
+	/**
+	 * Return the requested dump item as an array of Strings, one per line
+	 * 
+	 * @param dumpId
+	 * @param item
+	 * @return array of lines from the dump file
+	 */
+	String[] getDumpEntry(String dumpId, String item);
+
+	/**
+	 * Create a new Dump
+	 * 
+	 */
+	void createDump();
+	
+	/**
+	 * Delete the given dump from the file system
+	 * 
+	 * @param dumpId
+	 */
+	void deleteDump(String dumpId);
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/management/FileSystemDumpInspector.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/management/FileSystemDumpInspector.java
new file mode 100644
index 0000000..79e637b
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/management/FileSystemDumpInspector.java
@@ -0,0 +1,174 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.virgo.medic.management;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.RandomAccessFile;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.virgo.medic.dump.DumpGenerator;
+import org.eclipse.virgo.medic.impl.config.ConfigurationProvider;
+import org.eclipse.virgo.util.io.FileSystemUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * 
+ * Utility class for the viewing of produced Dumps.
+ * 
+ * This class is thread safe
+ */
+public class FileSystemDumpInspector implements DumpInspector {
+    
+	private static final String OSGI_STATE_STRING = "OSGi-state";
+
+	private static final long LARGE_FILE_SIZE_LIMIT = 1024000l;
+	
+    private final Logger logger = LoggerFactory.getLogger(FileSystemDumpInspector.class);
+    
+	private final DumpGenerator generator;
+    
+	private final ConfigurationProvider configurationProvider;
+    
+    /**
+     * 
+     * 
+     */
+    public FileSystemDumpInspector(DumpGenerator generator, ConfigurationProvider configurationProvider) {
+		this.generator = generator;
+		this.configurationProvider = configurationProvider;
+	}
+	
+	@Override
+	public String getConfiguredDumpDirectory() {
+		return (String)configurationProvider.getConfiguration().get(ConfigurationProvider.KEY_DUMP_ROOT_DIRECTORY);
+	}
+    
+	@Override
+	public String[] getDumps() throws IOException {
+		File dumpDir = getDumpDirectory();
+		List<String> dumps = new ArrayList<String>();
+		if(dumpDir != null && dumpDir.exists() && dumpDir.isDirectory()){
+			String[] list = FileSystemUtils.list(dumpDir, this.logger);
+			for (String dumpFolderName : list) {
+				File dumpFolder = new File(dumpDir, dumpFolderName);
+				if(dumpFolder.exists() && dumpFolder.isDirectory()){
+					dumps.add(dumpFolderName);
+				}
+			}
+			return dumps.toArray(new String[dumps.size()]);
+		} else {
+			return new String[0];
+		}
+	}
+	
+	@Override
+	public String[][] getDumpEntries(String dumpId) throws IOException {
+		if(dumpId == null){
+			return new String[0][];
+		}
+		File dumpDir = new File(getDumpDirectory(), dumpId);
+		if(dumpDir != null && dumpDir.exists() && dumpDir.isDirectory()){
+			List<String> dumpItems = new ArrayList<String>(Arrays.asList(FileSystemUtils.list(dumpDir, this.logger)));
+			if(dumpItems.contains("osgi.zip") && dumpItems.contains("region.digraph")){
+				dumpItems.add(OSGI_STATE_STRING);
+			}
+			dumpItems.remove("osgi.zip");
+			dumpItems.remove("region.digraph");
+			String[][] result = new String[dumpItems.size()][];
+			for(int i = 0; i < dumpItems.size(); i++) {
+				if(OSGI_STATE_STRING.equals(dumpItems.get(i))){
+					result[i] = new String[]{dumpItems.get(i), "StateDumpInspector/getSummary/" + getConfiguredDumpDirectory().replace("/", "!/") + "!/" + dumpId};
+				}else{
+					result[i] = new String[]{dumpItems.get(i), "DumpInspector/getDumpEntry/" + dumpId + "/" + dumpItems.get(i)};
+				}
+			}
+			return result;
+		} else {
+			return new String[0][];
+		}
+	}
+    
+	@Override
+	public String[] getDumpEntry(String dumpId, String entryName) {
+		if(dumpId == null || entryName == null){
+			return new String[0];
+		}
+		List<String> lines = new ArrayList<String>();
+		File dumpDir = getDumpDirectory();
+		if(dumpDir != null && dumpDir.exists() && dumpDir.isDirectory()){
+			File dumpEntry = new File(dumpDir, dumpId + File.separatorChar + entryName);
+			if(dumpEntry != null){
+				RandomAccessFile reader = null;
+				try {
+					reader = new RandomAccessFile(dumpEntry, "r");
+					while (reader.getFilePointer() < reader.length()){
+						if(reader.getFilePointer() > LARGE_FILE_SIZE_LIMIT){
+							lines.add("File exceeds 1MB, truncated.");
+							break;
+						}
+						String rawLine = reader.readLine();
+						if(rawLine != null){
+							lines.add(this.escapeAngleBrackets(rawLine));
+						}
+					}
+					reader.close();
+				} catch (IOException e) {
+					logger.error("Error while reading dump file " + dumpEntry.getPath(), e);
+					try {
+						if(reader != null){
+							reader.close();
+						}
+					} catch (IOException e1) {
+						// no-op to close stream
+					}
+					// no-op just return the default empty value and let the js deal with it
+				}
+			}
+		}
+		return lines.toArray(new String[lines.size()]);
+	}
+	
+	@Override
+	public void createDump() {
+		generator.generateDump("Generated via JMX");
+	}
+    
+	@Override
+	public void deleteDump(String dumpId) {
+		File dumpDir = getDumpDirectory();
+		if(dumpDir != null && dumpDir.exists() && dumpDir.isDirectory()){
+			File root = new File(dumpDir, dumpId);
+			if(root.exists() && root.isDirectory()){
+				FileSystemUtils.deleteRecursively(root);
+			}
+		}
+	}
+    
+	private File getDumpDirectory(){
+		String dumpDirectory = (String)configurationProvider.getConfiguration().get(ConfigurationProvider.KEY_DUMP_ROOT_DIRECTORY);
+		File dumpDir = new File(dumpDirectory);
+		if(dumpDir.exists() && dumpDir.isDirectory()){
+			return dumpDir;
+		}
+		return null;
+	}
+	
+	private String escapeAngleBrackets(String unfriendlyMarkup) {
+		String processed = unfriendlyMarkup.replace("<", "&#60;");
+		processed = processed.replace(">", "&#62;");
+		return processed;
+	}
+	
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/management/MedicMBeanExporter.java b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/management/MedicMBeanExporter.java
new file mode 100644
index 0000000..98f2c20
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/java/org/eclipse/virgo/medic/management/MedicMBeanExporter.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.virgo.medic.management;
+
+import java.lang.management.ManagementFactory;
+
+import javax.management.MBeanServer;
+import javax.management.ObjectInstance;
+import javax.management.ObjectName;
+
+import org.eclipse.virgo.medic.dump.DumpGenerator;
+import org.eclipse.virgo.medic.impl.config.ConfigurationProvider;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * 
+ * 
+ * 
+ * This class is Thread Safe
+ *
+ */
+public class MedicMBeanExporter {
+	
+    private final Logger logger = LoggerFactory.getLogger(MedicMBeanExporter.class);
+
+    private static final String DOMAIN = "org.eclipse.virgo.kernel";
+    
+    private final MBeanServer server = ManagementFactory.getPlatformMBeanServer();
+
+	private ObjectInstance registeredMBean;
+
+    /**
+     * 
+     * @param serverHome
+     */
+	public MedicMBeanExporter(ConfigurationProvider configurationProvider, DumpGenerator dumpGenerator) {
+		try {
+			ObjectName dumpMBeanName = new ObjectName(String.format("%s:type=Medic,name=DumpInspector", DOMAIN));
+			registeredMBean = this.server.registerMBean(new FileSystemDumpInspector(dumpGenerator, configurationProvider), dumpMBeanName);
+		} catch (Exception e) {
+			logger.error("Unable to register the DumpInspectorMBean", e);
+		} 
+	}
+	
+	/**
+	 * 
+	 */
+	public void close(){
+		ObjectInstance localRegisteredMBean = this.registeredMBean;
+		if(localRegisteredMBean != null){
+			try {
+				this.server.unregisterMBean(localRegisteredMBean.getObjectName());
+				this.registeredMBean = null;
+			} catch (Exception e) {
+				logger.error("Unable to unregister MBean", e);
+			} 
+		}
+	}
+	
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/resources/EventLogMessages.properties b/medic/org.eclipse.virgo.medic.core/src/main/resources/EventLogMessages.properties
new file mode 100644
index 0000000..a4c1d5f
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/resources/EventLogMessages.properties
@@ -0,0 +1,5 @@
+ME0001W=A message with the key '{}' was not found. The inserts for the message were '{}'
+ME0002W=Dump contributor '{}' failed during contribution to dump '{}'
+ME0003I=Dump '{}' generated
+ME0004W=The directory '{}' does not exist and could not be created
+ME0005E=Dump contributor '{}' threw a RuntimeException during contribution to dump '{}'
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/resources/about.html b/medic/org.eclipse.virgo.medic.core/src/main/resources/about.html
new file mode 100644
index 0000000..c258ef5
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/resources/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>June 5, 2006</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/medic/org.eclipse.virgo.medic.core/src/main/resources/logback-default.xml b/medic/org.eclipse.virgo.medic.core/src/main/resources/logback-default.xml
new file mode 100644
index 0000000..2ce23b2
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/main/resources/logback-default.xml
@@ -0,0 +1,39 @@
+<configuration>
+
+	<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-28.28thread %msg %ex%n</Pattern>
+        </encoder>
+	</appender>
+
+	<appender name="EVENT_LOG_STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-28.28thread &lt;%X{medic.eventCode}&gt; %msg %ex%n</Pattern>
+        </encoder>
+	</appender>
+
+	<appender name="EVENT_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<file>serviceability/eventlogs/defaulteventlog.log</file>
+		<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+			<FileNamePattern>serviceability/eventlogs/defaulteventlog_%i.log</FileNamePattern>
+			<MinIndex>1</MinIndex>
+			<MaxIndex>4</MaxIndex>
+		</rollingPolicy>
+		<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+			<MaxFileSize>10MB</MaxFileSize>
+		</triggeringPolicy>
+		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-28.28thread &lt;%X{medic.eventCode}&gt; %msg %ex%n</Pattern>
+        </encoder>
+	</appender>
+
+	<logger name="org.eclipse.virgo.medic.eventlog.localized">
+		<appender-ref ref="EVENT_LOG_STDOUT" />
+		<appender-ref ref="EVENT_LOG_FILE" />
+	</logger>
+
+	<root level="DEBUG">
+		<appender-ref ref="STDOUT" />
+	</root>
+
+</configuration>
diff --git a/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/dump/impl/DumpContributorTrackerTests.java b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/dump/impl/DumpContributorTrackerTests.java
new file mode 100644
index 0000000..4daa113
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/dump/impl/DumpContributorTrackerTests.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.dump.impl;
+
+import static org.easymock.EasyMock.createMock;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertSame;
+
+import java.util.List;
+
+import org.junit.Test;
+import org.osgi.framework.ServiceRegistration;
+
+import org.eclipse.virgo.medic.dump.DumpContributor;
+import org.eclipse.virgo.medic.dump.impl.DumpContributorTracker;
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+
+public class DumpContributorTrackerTests {
+
+    @SuppressWarnings("unchecked")
+	@Test
+    public void serviceAdditionAndRemoval() {
+        StubBundleContext bundleContext = new StubBundleContext();
+        DumpContributor service = createMock(DumpContributor.class);
+        ServiceRegistration<DumpContributor> serviceRegistration = (ServiceRegistration<DumpContributor>)bundleContext.registerService(DumpContributor.class.getName(), service, null);
+
+        DumpContributorTracker tracker = new DumpContributorTracker(bundleContext);
+
+        tracker.addingService(serviceRegistration.getReference());
+        List<DumpContributor> contributors = tracker.getDumpContributors();
+        assertEquals(1, contributors.size());
+        assertSame(service, contributors.get(0));
+
+        tracker.removedService(serviceRegistration.getReference(), service);
+        contributors = tracker.getDumpContributors();
+        assertEquals(0, contributors.size());
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/dump/impl/HeapDumpContributorTests.java b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/dump/impl/HeapDumpContributorTests.java
new file mode 100644
index 0000000..e6877c4
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/dump/impl/HeapDumpContributorTests.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.dump.impl;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.lang.management.ManagementFactory;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.management.MBeanServer;
+
+import org.eclipse.virgo.medic.dump.Dump;
+import org.eclipse.virgo.medic.dump.DumpContributionFailedException;
+import org.eclipse.virgo.medic.dump.DumpContributor;
+import org.eclipse.virgo.medic.dump.impl.heap.HeapDumpContributor;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class HeapDumpContributorTests {
+
+    private static final MBeanServer MBEAN_SERVER = ManagementFactory.getPlatformMBeanServer();
+
+    private static final String HOTSPOT_DIAGNOSTIC_MBEAN_NAME = "com.sun.management:type=HotSpotDiagnostic";
+
+    private final File dumpDirectory = new File("build");
+
+    @Before
+    @After
+    public void cleanupHeadDumps() {
+        File heapDumpFile = new File("build", "heap.out");
+        if (heapDumpFile.exists()) {
+            assertTrue(heapDumpFile.delete());
+        }
+    }
+
+    @Test
+    public void dumpHeap() throws DumpContributionFailedException {
+        DumpContributor contributor = new HeapDumpContributor();
+
+        String cause = "failure";
+        long timestamp = System.currentTimeMillis();
+        Map<String, Object> context = new HashMap<String, Object>();
+
+        Dump dump = new StubDump(cause, timestamp, context, new Throwable[0], dumpDirectory);
+
+        contributor.contribute(dump);
+
+        boolean diagnostMbeanAvailable;
+
+        try {
+            Class<?> diagnosticMbeanClass = Class.forName("com.sun.management.HotSpotDiagnosticMXBean", true,
+                HeapDumpContributor.class.getClassLoader());
+            ManagementFactory.newPlatformMXBeanProxy(MBEAN_SERVER, HOTSPOT_DIAGNOSTIC_MBEAN_NAME, diagnosticMbeanClass);
+            diagnostMbeanAvailable = true;
+        } catch (Exception e) {
+            diagnostMbeanAvailable = false;
+        }
+
+        if (!diagnostMbeanAvailable) {
+            try {
+                Class.forName("sun.management.ManagementFactory").getMethod("getDiagnosticMXBean");
+                diagnostMbeanAvailable = true;
+            } catch (Exception e) {
+                diagnostMbeanAvailable = false;
+            }
+        }
+
+        assertEquals(diagnostMbeanAvailable, new File(this.dumpDirectory, "heap.out").exists());
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/dump/impl/StandardDumpGeneratorTests.java b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/dump/impl/StandardDumpGeneratorTests.java
new file mode 100644
index 0000000..e236464
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/dump/impl/StandardDumpGeneratorTests.java
@@ -0,0 +1,143 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.dump.impl;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.expectLastCall;
+import static org.easymock.EasyMock.isA;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+
+import java.util.Arrays;
+import java.util.Dictionary;
+import java.util.HashMap;
+import java.util.Hashtable;
+
+import org.eclipse.virgo.medic.dump.Dump;
+import org.eclipse.virgo.medic.dump.DumpContributor;
+import org.eclipse.virgo.medic.dump.DumpGenerationFailedException;
+import org.eclipse.virgo.medic.dump.DumpGenerator;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.medic.impl.config.ConfigurationProvider;
+import org.junit.Test;
+
+public class StandardDumpGeneratorTests {
+
+    @Test
+    public void dumpGeneration() throws DumpGenerationFailedException {
+
+        EventLogger eventLogger = createMock(EventLogger.class);
+
+        DumpContributorResolver accessor = createMock(DumpContributorResolver.class);
+        DumpContributor dumpContributor1 = createMock(DumpContributor.class);
+
+        expect(accessor.getDumpContributors()).andReturn(Arrays.asList(dumpContributor1));
+        dumpContributor1.contribute(isA(Dump.class));
+        expectLastCall();
+
+        dumpContributor1.contribute(isA(Dump.class));
+        expect(dumpContributor1.getName()).andReturn("dc1").anyTimes();
+
+        DumpContributor dumpContributor2 = createMock(DumpContributor.class);
+        dumpContributor2.contribute(isA(Dump.class));
+        expect(dumpContributor2.getName()).andReturn("dc2").anyTimes();
+
+        DumpContributor dumpContributor3 = createMock(DumpContributor.class);
+        dumpContributor3.contribute(isA(Dump.class));
+        expectLastCall().andThrow(new RuntimeException());
+        expect(dumpContributor3.getName()).andReturn("dc3").anyTimes();
+
+        expect(accessor.getDumpContributors()).andReturn(Arrays.asList(dumpContributor1, dumpContributor2, dumpContributor3));
+
+        ConfigurationProvider configurationProvider = createMock(ConfigurationProvider.class);
+        Dictionary<String, Object> configuration = new Hashtable<String, Object>();
+        configuration.put(ConfigurationProvider.KEY_DUMP_ROOT_DIRECTORY, "build");
+        expect(configurationProvider.getConfiguration()).andReturn(configuration).anyTimes();
+
+        replay(accessor, dumpContributor1, dumpContributor2, dumpContributor3, configurationProvider);
+
+        DumpGenerator dumpGenerator = new StandardDumpGenerator(accessor, configurationProvider, eventLogger);
+        dumpGenerator.generateDump("foo");
+        dumpGenerator.generateDump("bar", new HashMap<String, Object>());
+
+        verify(accessor, dumpContributor1, dumpContributor2, dumpContributor3, configurationProvider);
+    }
+
+    @Test
+    public void singleExclusion() throws DumpGenerationFailedException {
+        EventLogger eventLogger = createMock(EventLogger.class);
+        DumpContributorResolver accessor = createMock(DumpContributorResolver.class);
+        DumpContributor dumpContributor1 = createMock(DumpContributor.class);
+
+        expect(accessor.getDumpContributors()).andReturn(Arrays.asList(dumpContributor1)).times(2);
+        dumpContributor1.contribute(isA(Dump.class));
+        expect(dumpContributor1.getName()).andReturn("dc1").times(2);
+
+        ConfigurationProvider configurationProvider = createMock(ConfigurationProvider.class);
+        Dictionary<String, Object> configuration = new Hashtable<String, Object>();
+        configuration.put("dump.root.directory", "build");
+        configuration.put("dump.exclusions.foo", "dc1");
+        expect(configurationProvider.getConfiguration()).andReturn(configuration).anyTimes();
+
+        replay(accessor, dumpContributor1, configurationProvider);
+
+        DumpGenerator dumpGenerator = new StandardDumpGenerator(accessor, configurationProvider, eventLogger);
+        dumpGenerator.generateDump("foo");
+        dumpGenerator.generateDump("bar");
+
+        verify(accessor, dumpContributor1, configurationProvider);
+    }
+
+    @Test
+    public void multipleExclusion() throws DumpGenerationFailedException {
+        EventLogger eventLogger = createMock(EventLogger.class);
+        DumpContributorResolver accessor = createMock(DumpContributorResolver.class);
+        DumpContributor dumpContributor1 = createMock(DumpContributor.class);
+        DumpContributor dumpContributor2 = createMock(DumpContributor.class);
+
+        expect(accessor.getDumpContributors()).andReturn(Arrays.asList(dumpContributor1, dumpContributor2)).times(2);
+        dumpContributor1.contribute(isA(Dump.class));
+        dumpContributor2.contribute(isA(Dump.class));
+        expect(dumpContributor1.getName()).andReturn("dc1").times(2);
+        expect(dumpContributor2.getName()).andReturn("dc2").times(2);
+
+        ConfigurationProvider configurationProvider = createMock(ConfigurationProvider.class);
+        Dictionary<String, Object> configuration = new Hashtable<String, Object>();
+        configuration.put("dump.root.directory", "build");
+        configuration.put("dump.exclusions.foo", "dc1, dc2");
+        expect(configurationProvider.getConfiguration()).andReturn(configuration).anyTimes();
+
+        replay(accessor, dumpContributor1, dumpContributor2, configurationProvider);
+
+        DumpGenerator dumpGenerator = new StandardDumpGenerator(accessor, configurationProvider, eventLogger);
+        dumpGenerator.generateDump("foo");
+        dumpGenerator.generateDump("bar");
+
+        verify(accessor, dumpContributor1, dumpContributor2, configurationProvider);
+    }
+
+    @Test
+    public void close() {
+        EventLogger eventLogger = createMock(EventLogger.class);
+        DumpContributorResolver accessor = createMock(DumpContributorResolver.class);
+        ConfigurationProvider configurationProvider = createMock(ConfigurationProvider.class);
+        accessor.close();
+
+        replay(accessor, configurationProvider);
+
+        StandardDumpGenerator dumpGenerator = new StandardDumpGenerator(accessor, configurationProvider, eventLogger);
+        dumpGenerator.close();
+
+        verify(accessor, configurationProvider);
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/dump/impl/StubDump.java b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/dump/impl/StubDump.java
new file mode 100644
index 0000000..fc88eca
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/dump/impl/StubDump.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.dump.impl;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.Map;
+
+import org.eclipse.virgo.medic.dump.Dump;
+import org.eclipse.virgo.medic.dump.DumpContributionFailedException;
+
+
+public class StubDump implements Dump {
+
+    private final File outputDirectory;
+
+    private final String cause;
+
+    private final Map<String, Object> context;
+
+    private final Throwable[] throwables;
+
+    private final long timestamp;
+
+    public StubDump(String cause, long timestamp, Map<String, Object> context, Throwable[] throwables, File outputDirectory) {
+        this.cause = cause;
+        this.timestamp = timestamp;
+        this.context = context;
+        this.throwables = throwables;
+        this.outputDirectory = outputDirectory;
+    }
+
+    public File createFile(String name) {
+        return new File(outputDirectory, name);
+    }
+
+    public FileOutputStream createFileOutputStream(String name) throws DumpContributionFailedException {
+        try {
+            return new FileOutputStream(createFile(name));
+        } catch (FileNotFoundException e) {
+            throw new DumpContributionFailedException("Unable to open output stream '" + name + "'");
+        }
+    }
+
+    public FileWriter createFileWriter(String name) throws DumpContributionFailedException {
+        try {
+            return new FileWriter(createFile(name));
+        } catch (IOException e) {
+            throw new DumpContributionFailedException("Unable to open file writer '" + name + "'");
+        }
+    }
+
+    public String getCause() {
+        return this.cause;
+    }
+
+    public Map<String, Object> getContext() {
+        return this.context;
+    }
+
+    public Throwable[] getThrowables() {
+        return this.throwables;
+    }
+
+    public long getTimestamp() {
+        return this.timestamp;
+    }
+
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/dump/impl/summary/SummaryDumpContributorTests.java b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/dump/impl/summary/SummaryDumpContributorTests.java
new file mode 100644
index 0000000..664da21
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/dump/impl/summary/SummaryDumpContributorTests.java
@@ -0,0 +1,144 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.dump.impl.summary;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.text.DateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.virgo.medic.dump.Dump;
+import org.eclipse.virgo.medic.dump.DumpContributionFailedException;
+import org.eclipse.virgo.medic.dump.DumpContributor;
+import org.eclipse.virgo.medic.dump.impl.StubDump;
+import org.eclipse.virgo.medic.dump.impl.summary.SummaryDumpContributor;
+import org.junit.Test;
+
+
+public class SummaryDumpContributorTests {
+
+    private final DumpContributor dumpContributor = new SummaryDumpContributor();
+
+    private final File dumpDirectory = new File("build");
+
+    private final DateFormat dateFormat = DateFormat.getDateInstance();
+
+    private final DateFormat timeFormat = DateFormat.getTimeInstance(DateFormat.LONG);
+
+    @Test
+    public void dumpWithoutThrowable() throws DumpContributionFailedException, IOException {
+
+        String cause = "failure";
+        long timestamp = System.currentTimeMillis();
+        Map<String, Object> context = new HashMap<String, Object>();
+
+        Dump dump = new StubDump(cause, timestamp, context, new Throwable[0], dumpDirectory);
+
+        this.dumpContributor.contribute(dump);
+
+        File dumpFile = new File(dumpDirectory, "summary.txt");
+        assertTrue(dumpFile.exists());
+        assertDumpContents(dumpFile, timestamp, cause);
+    }
+
+    @Test
+    public void dumpWithThrowable() throws DumpContributionFailedException, IOException {
+
+        String cause = "failure";
+        long timestamp = System.currentTimeMillis();
+        Map<String, Object> context = new HashMap<String, Object>();
+
+        NullPointerException npe = new NullPointerException();
+        npe.fillInStackTrace();
+
+        Dump dump = new StubDump(cause, timestamp, context, new Throwable[] { npe }, dumpDirectory);
+
+        this.dumpContributor.contribute(dump);
+
+        File dumpFile = new File(dumpDirectory, "summary.txt");
+        assertTrue(dumpFile.exists());
+        assertDumpContents(dumpFile, timestamp, cause, npe);
+    }
+
+    private void assertDumpContents(File dumpFile, long timestamp, String cause, Throwable... throwables) throws IOException {
+    	List<String> lines = new ArrayList<String>();
+    	try (BufferedReader input = new BufferedReader(new FileReader(dumpFile))) {
+    		String line;
+    		while ((line = input.readLine()) != null) {
+    			lines.add(line);
+    		}
+		}
+        assertDatePresent(lines, timestamp);
+        assertTimePresent(lines, timestamp);
+        assertCausePresent(lines, cause);
+        assertThrowablesPresent(lines, throwables);
+    }
+
+    private void assertDatePresent(List<String> lines, long timestamp) {
+        String expectedDate = this.dateFormat.format(new Date(timestamp));
+
+        for (String line : lines) {
+            if (line.contains(expectedDate)) {
+                return;
+            }
+        }
+
+        fail(String.format("The date '%s' was not found in the dump", expectedDate));
+    }
+
+    private void assertTimePresent(List<String> lines, long timestamp) {
+        String expectedTime = this.timeFormat.format(new Date(timestamp));
+
+        for (String line : lines) {
+            if (line.contains(expectedTime)) {
+                return;
+            }
+        }
+
+        fail(String.format("The time '%s' was not found in the dump", expectedTime));
+    }
+
+    private void assertCausePresent(List<String> lines, String cause) {
+        String expectedCause = "Cause: " + cause;
+        for (String line : lines) {
+            if (line.contains(expectedCause)) {
+                return;
+            }
+        }
+        fail(String.format("The expected cause entry '%s' was not found in the dump", expectedCause));
+    }
+
+    private void assertThrowablesPresent(List<String> lines, Throwable... throwables) {
+        String expectedException;
+        if (throwables.length == 0) {
+            expectedException = "Exception: None";
+        } else {
+            expectedException = "Exception:";
+        }
+
+        for (String line : lines) {
+            if (line.equals(expectedException)) {
+                return;
+            }
+        }
+        fail(String.format("The expected exception entry '%s' was not found in the dump", expectedException));
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/dump/impl/thread/ThreadDumpContributorTests.java b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/dump/impl/thread/ThreadDumpContributorTests.java
new file mode 100644
index 0000000..0b5f2bb
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/dump/impl/thread/ThreadDumpContributorTests.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.dump.impl.thread;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.virgo.medic.dump.Dump;
+import org.eclipse.virgo.medic.dump.DumpContributionFailedException;
+import org.eclipse.virgo.medic.dump.DumpContributor;
+import org.eclipse.virgo.medic.dump.impl.StubDump;
+import org.eclipse.virgo.medic.dump.impl.thread.Java5ThreadInfoWriter;
+import org.eclipse.virgo.medic.dump.impl.thread.Java5ThreadMXBeanDelegate;
+import org.eclipse.virgo.medic.dump.impl.thread.StandardThreadInfoWriter;
+import org.eclipse.virgo.medic.dump.impl.thread.StandardThreadMXBeanDelegate;
+import org.eclipse.virgo.medic.dump.impl.thread.ThreadDumpContributor;
+import org.junit.Test;
+
+
+public class ThreadDumpContributorTests {
+
+    private final File dumpDirectory = new File("build");
+
+    @Test
+    public void java5ThreadDump() throws DumpContributionFailedException {
+        DumpContributor contributor = new ThreadDumpContributor(new Java5ThreadMXBeanDelegate(), new Java5ThreadInfoWriter());
+        createContribution(contributor);
+    }
+
+    @Test
+    public void standardThreadDump() throws DumpContributionFailedException {
+        DumpContributor contributor = new ThreadDumpContributor(new StandardThreadMXBeanDelegate(), new StandardThreadInfoWriter());
+        createContribution(contributor);
+    }
+
+    private void createContribution(DumpContributor contributor) throws DumpContributionFailedException {
+        String cause = "failure";
+        long timestamp = System.currentTimeMillis();
+        Map<String, Object> context = new HashMap<String, Object>();
+
+        Dump dump = new StubDump(cause, timestamp, context, new Throwable[0], this.dumpDirectory);
+
+        contributor.contribute(dump);
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/eventlog/impl/BundleSearchingPropertyResourceBundleResolverTests.java b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/eventlog/impl/BundleSearchingPropertyResourceBundleResolverTests.java
new file mode 100644
index 0000000..126619f
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/eventlog/impl/BundleSearchingPropertyResourceBundleResolverTests.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.eventlog.impl;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.PropertyResourceBundle;
+import java.util.Vector;
+
+import org.junit.Test;
+
+import org.eclipse.virgo.medic.eventlog.impl.BundleSearchingPropertyResourceBundleResolver;
+import org.eclipse.virgo.medic.eventlog.impl.PropertyResourceBundleResolver;
+import org.eclipse.virgo.test.stubs.framework.FindEntriesDelegate;
+import org.eclipse.virgo.test.stubs.framework.StubBundle;
+
+public class BundleSearchingPropertyResourceBundleResolverTests {
+
+    private final PropertyResourceBundleResolver resourceBundleResolver = new BundleSearchingPropertyResourceBundleResolver();
+
+    @Test
+    public void entryNotFound() {
+        StubBundle bundle = new StubBundle().setFindEntriesDelegate(new FindEntriesDelegate() {
+
+            public Enumeration<URL> findEntries(String path, String pattern, boolean recurse) {
+                return null;
+            }
+        });
+        List<PropertyResourceBundle> resourceBundles = this.resourceBundleResolver.getResourceBundles(bundle, "foo.properties");
+        assertNotNull(resourceBundles);
+        assertEquals(0, resourceBundles.size());
+    }
+
+    @Test
+    public void nonExistentEntry() {
+        StubBundle bundle = new StubBundle().setFindEntriesDelegate(new FindEntriesDelegate() {
+
+            public Enumeration<URL> findEntries(String path, String pattern, boolean recurse) {
+                try {
+                    Vector<URL> urls = new Vector<URL>();
+                    urls.add(new File("does/not/exist").toURI().toURL());
+                    return urls.elements();
+                } catch (MalformedURLException e) {
+                    throw new RuntimeException(e);
+                }
+            }
+        });
+
+        List<PropertyResourceBundle> resourceBundles = this.resourceBundleResolver.getResourceBundles(bundle, "foo.properties");
+        assertNotNull(resourceBundles);
+        assertEquals(0, resourceBundles.size());
+    }
+
+    @Test
+    public void existingEntry() {
+        StubBundle bundle = new StubBundle().setFindEntriesDelegate(new FindEntriesDelegate() {
+
+            public Enumeration<URL> findEntries(String path, String pattern, boolean recurse) {
+                try {
+                    Vector<URL> urls = new Vector<URL>();
+                    urls.add(new File("src/test/resources/messages.properties").toURI().toURL());
+                    return urls.elements();
+                } catch (MalformedURLException e) {
+                    throw new RuntimeException(e);
+                }
+            }
+        });
+
+        List<PropertyResourceBundle> resourceBundles = this.resourceBundleResolver.getResourceBundles(bundle, "foo.properties");
+        assertNotNull(resourceBundles);
+        assertEquals(1, resourceBundles.size());
+        assertEquals("Bar", resourceBundles.get(0).getString("ABC123"));
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/eventlog/impl/ResourceBundleUtilsTests.java b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/eventlog/impl/ResourceBundleUtilsTests.java
new file mode 100644
index 0000000..e6cc909
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/eventlog/impl/ResourceBundleUtilsTests.java
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.eventlog.impl;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.util.List;
+import java.util.Locale;
+
+import org.eclipse.virgo.medic.eventlog.impl.ResourceBundleUtils;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ResourceBundleUtilsTests {
+
+    private Locale defaultLocale;
+
+    @Before
+    public void setDefaultLocale() {
+        this.defaultLocale = Locale.getDefault();
+        Locale.setDefault(new Locale("d", "E", "f"));
+    }
+
+    @After
+    public void restoreDefaultLocale() {
+        Locale.setDefault(this.defaultLocale);
+    }
+
+    @Test
+    public void localeWithVariant() {
+        Locale locale = new Locale("l", "C", "v");
+
+        List<String> candidates = ResourceBundleUtils.generateCandidatePropertiesFileNames("foo", locale);
+
+        assertNotNull(candidates);
+        assertEquals("Expected 7 candidates but got " + candidates, 7, candidates.size());
+
+        assertEquals("foo_l_C_v.properties", candidates.get(0));
+        assertEquals("foo_l_C.properties", candidates.get(1));
+        assertEquals("foo_l.properties", candidates.get(2));
+        assertEquals("foo_d_E_f.properties", candidates.get(3));
+        assertEquals("foo_d_E.properties", candidates.get(4));
+        assertEquals("foo_d.properties", candidates.get(5));
+        assertEquals("foo.properties", candidates.get(6));
+    }
+
+    @Test
+    public void localeWithCountry() {
+        Locale locale = new Locale("l", "C");
+
+        List<String> candidates = ResourceBundleUtils.generateCandidatePropertiesFileNames("foo", locale);
+
+        assertNotNull(candidates);
+        assertEquals("Expected 6 candidates but got " + candidates, 6, candidates.size());
+
+        assertEquals("foo_l_C.properties", candidates.get(0));
+        assertEquals("foo_l.properties", candidates.get(1));
+        assertEquals("foo_d_E_f.properties", candidates.get(2));
+        assertEquals("foo_d_E.properties", candidates.get(3));
+        assertEquals("foo_d.properties", candidates.get(4));
+        assertEquals("foo.properties", candidates.get(5));
+    }
+
+    @Test
+    public void localeWithLanguage() {
+        Locale locale = new Locale("l");
+
+        List<String> candidates = ResourceBundleUtils.generateCandidatePropertiesFileNames("foo", locale);
+
+        assertNotNull(candidates);
+        assertEquals("Expected 5 candidates but got " + candidates, 5, candidates.size());
+
+        assertEquals("foo_l.properties", candidates.get(0));
+        assertEquals("foo_d_E_f.properties", candidates.get(1));
+        assertEquals("foo_d_E.properties", candidates.get(2));
+        assertEquals("foo_d.properties", candidates.get(3));
+        assertEquals("foo.properties", candidates.get(4));
+    }
+
+    @Test
+    public void emptyLocale() {
+        Locale locale = new Locale("");
+
+        List<String> candidates = ResourceBundleUtils.generateCandidatePropertiesFileNames("foo", locale);
+
+        assertNotNull(candidates);
+        assertEquals("Expected 4 candidates but got " + candidates, 4, candidates.size());
+
+        assertEquals("foo_d_E_f.properties", candidates.get(0));
+        assertEquals("foo_d_E.properties", candidates.get(1));
+        assertEquals("foo_d.properties", candidates.get(2));
+        assertEquals("foo.properties", candidates.get(3));
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/eventlog/impl/StandardLocaleResolverTests.java b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/eventlog/impl/StandardLocaleResolverTests.java
new file mode 100644
index 0000000..b26f653
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/eventlog/impl/StandardLocaleResolverTests.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.eventlog.impl;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Locale;
+
+import org.eclipse.virgo.medic.eventlog.impl.StandardLocaleResolver;
+import org.junit.Test;
+
+public class StandardLocaleResolverTests {
+
+    @Test
+    public void getLocale() {
+        assertEquals(Locale.getDefault(), new StandardLocaleResolver().getLocale());
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/eventlog/impl/StandardMessageResolverTests.java b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/eventlog/impl/StandardMessageResolverTests.java
new file mode 100644
index 0000000..3fd3366
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/eventlog/impl/StandardMessageResolverTests.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.eventlog.impl;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.eq;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.isA;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Locale;
+import java.util.PropertyResourceBundle;
+
+import org.junit.Test;
+import org.eclipse.virgo.medic.eventlog.impl.LocaleResolver;
+import org.eclipse.virgo.medic.eventlog.impl.MessageResolver;
+import org.eclipse.virgo.medic.eventlog.impl.PropertyResourceBundleResolver;
+import org.eclipse.virgo.medic.eventlog.impl.StandardMessageResolver;
+import org.eclipse.virgo.test.stubs.framework.StubBundle;
+
+public class StandardMessageResolverTests {
+
+    private final LocaleResolver localeResolver = createMock(LocaleResolver.class);
+
+    private final PropertyResourceBundleResolver resourceBundleResolver = createMock(PropertyResourceBundleResolver.class);
+
+    private final StubBundle primaryBundle = new StubBundle();
+
+    private final StubBundle secondaryBundle = new StubBundle();
+
+    private final MessageResolver messageResolver = new StandardMessageResolver(this.localeResolver, this.resourceBundleResolver, this.primaryBundle,
+        this.secondaryBundle);
+
+    @Test
+    public void resolve() throws FileNotFoundException, IOException {
+        try (InputStream messageProperties = new FileInputStream("src/test/resources/messages.properties")) {
+            expect(this.localeResolver.getLocale()).andReturn(Locale.GERMAN);
+            expect(this.resourceBundleResolver.getResourceBundles(this.primaryBundle, "EventLogMessages_de.properties")).andReturn(
+                Arrays.asList(new PropertyResourceBundle(messageProperties)));
+            replay(this.localeResolver, this.resourceBundleResolver);
+            assertEquals("Bar", this.messageResolver.resolveLogEventMessage("ABC123"));
+            verify(this.localeResolver, this.resourceBundleResolver);
+        }
+    }
+
+    @Test
+    public void resolveWithLocale() throws FileNotFoundException, IOException {
+        try (InputStream messageProperties = new FileInputStream("src/test/resources/messages.properties")) {
+            expect(this.resourceBundleResolver.getResourceBundles(this.primaryBundle, "EventLogMessages_it.properties")).andReturn(
+                Arrays.asList(new PropertyResourceBundle(messageProperties)));
+            replay(this.localeResolver, this.resourceBundleResolver);
+            assertEquals("Bar", this.messageResolver.resolveLogEventMessage("ABC123", Locale.ITALIAN));
+            verify(this.localeResolver, this.resourceBundleResolver);
+        }
+    }
+
+    @Test
+    public void resolveWithMissingResourceBundle() {
+        expect(this.resourceBundleResolver.getResourceBundles(eq(this.primaryBundle), isA(String.class))).andReturn(
+            Collections.<PropertyResourceBundle> emptyList()).atLeastOnce();
+        replay(this.localeResolver, this.resourceBundleResolver);
+        assertNull(this.messageResolver.resolveLogEventMessage("ABC123", Locale.FRANCE));
+        verify(this.localeResolver, this.resourceBundleResolver);
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/eventlog/impl/logback/DefaultOutputAppender.java b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/eventlog/impl/logback/DefaultOutputAppender.java
new file mode 100644
index 0000000..2e142c9
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/eventlog/impl/logback/DefaultOutputAppender.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.eventlog.impl.logback;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import ch.qos.logback.classic.spi.LoggingEvent;
+import ch.qos.logback.core.AppenderBase;
+
+public class DefaultOutputAppender extends AppenderBase<LoggingEvent> {
+
+    private static List<LoggingEvent> loggingEvents = new ArrayList<LoggingEvent>();
+
+    @Override
+    protected void append(LoggingEvent eventObject) {
+        loggingEvents.add(eventObject);
+    }
+
+    static List<LoggingEvent> getAndResetLoggingEvents() {
+        List<LoggingEvent> loggingEvents = DefaultOutputAppender.loggingEvents;
+        DefaultOutputAppender.loggingEvents = new ArrayList<LoggingEvent>();
+        return loggingEvents;
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/eventlog/impl/logback/LocalizedOutputAppender.java b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/eventlog/impl/logback/LocalizedOutputAppender.java
new file mode 100644
index 0000000..670901f
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/eventlog/impl/logback/LocalizedOutputAppender.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.eventlog.impl.logback;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import ch.qos.logback.classic.spi.LoggingEvent;
+import ch.qos.logback.core.AppenderBase;
+
+public class LocalizedOutputAppender extends AppenderBase<LoggingEvent> {
+
+    private static List<LoggingEvent> loggingEvents = new ArrayList<LoggingEvent>();
+
+    @Override
+    protected void append(LoggingEvent eventObject) {
+        loggingEvents.add(eventObject);
+    }
+
+    static List<LoggingEvent> getAndResetLoggingEvents() {
+        List<LoggingEvent> loggingEvents = LocalizedOutputAppender.loggingEvents;
+        LocalizedOutputAppender.loggingEvents = new ArrayList<LoggingEvent>();
+        return loggingEvents;
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/eventlog/impl/logback/LogBackEventLoggerTests.java b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/eventlog/impl/logback/LogBackEventLoggerTests.java
new file mode 100644
index 0000000..e2e445a
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/eventlog/impl/logback/LogBackEventLoggerTests.java
@@ -0,0 +1,122 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.eventlog.impl.logback;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+
+import java.util.List;
+import java.util.Locale;
+
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.medic.eventlog.Level;
+import org.eclipse.virgo.medic.eventlog.impl.MessageResolver;
+import org.eclipse.virgo.medic.eventlog.impl.logback.LogBackEventLogger;
+import org.junit.Test;
+
+import ch.qos.logback.classic.spi.LoggingEvent;
+
+
+public class LogBackEventLoggerTests {
+    
+    @Test
+    public void defaultAndLocalizedOutput() {
+        MessageResolver resolver = createMock(MessageResolver.class);
+        
+        EventLogger eventLogger = new LogBackEventLogger(resolver);
+        
+        expect(resolver.resolveLogEventMessage("UT0001E")).andReturn("the message {} {}");
+        expect(resolver.resolveLogEventMessage("UT0002W")).andReturn("the message {} {}");
+        expect(resolver.resolveLogEventMessage("UT0003I")).andReturn("the message {} {}");
+        expect(resolver.resolveLogEventMessage("UT0001E", Locale.ENGLISH)).andReturn("the english message {} {}");
+        expect(resolver.resolveLogEventMessage("UT0002W", Locale.ENGLISH)).andReturn("the english message {} {}");
+        expect(resolver.resolveLogEventMessage("UT0003I", Locale.ENGLISH)).andReturn("the english message {} {}");
+        replay(resolver);
+        
+        eventLogger.log("UT0001E", Level.ERROR, true, new Integer(63));
+        eventLogger.log("UT0002W", Level.WARNING, true, new Integer(63));
+        eventLogger.log("UT0003I", Level.INFO, true, new Integer(63));
+        
+        verify(resolver);
+        
+        List<LoggingEvent> localizedEvents = LocalizedOutputAppender.getAndResetLoggingEvents();
+        assertEquals(3, localizedEvents.size());
+        
+        LoggingEvent loggingEvent = localizedEvents.get(0);
+        assertEquals(ch.qos.logback.classic.Level.ERROR, loggingEvent.getLevel());
+        assertEquals("the message true 63", loggingEvent.getMessage());
+        assertEquals("UT0001E", loggingEvent.getMDCPropertyMap().get("medic.eventCode"));
+        
+        loggingEvent = localizedEvents.get(1);
+        assertEquals(ch.qos.logback.classic.Level.WARN, loggingEvent.getLevel());
+        assertEquals("the message true 63", loggingEvent.getMessage());
+        assertEquals("UT0002W", loggingEvent.getMDCPropertyMap().get("medic.eventCode"));
+        
+        loggingEvent = localizedEvents.get(2);
+        assertEquals(ch.qos.logback.classic.Level.INFO, loggingEvent.getLevel());
+        assertEquals("the message true 63", loggingEvent.getMessage());
+        assertEquals("UT0003I", loggingEvent.getMDCPropertyMap().get("medic.eventCode"));
+        
+        List<LoggingEvent> defaultEvents = DefaultOutputAppender.getAndResetLoggingEvents();
+        assertEquals(3, defaultEvents.size());
+        
+        loggingEvent = defaultEvents.get(0);
+        assertEquals(ch.qos.logback.classic.Level.ERROR, loggingEvent.getLevel());
+        assertEquals("the english message true 63", loggingEvent.getMessage());
+        //        assertEquals("UT0001E", loggingEvent.getMDCPropertyMap().get("medic.eventCode"));
+        
+        loggingEvent = defaultEvents.get(1);
+        assertEquals(ch.qos.logback.classic.Level.WARN, loggingEvent.getLevel());
+        assertEquals("the english message true 63", loggingEvent.getMessage());
+        //        assertEquals("UT0002W", loggingEvent.getMDCPropertyMap().get("medic.eventCode"));
+        
+        loggingEvent = defaultEvents.get(2);
+        assertEquals(ch.qos.logback.classic.Level.INFO, loggingEvent.getLevel());
+        assertEquals("the english message true 63", loggingEvent.getMessage());
+        //        assertEquals("UT0003I", loggingEvent.getMDCPropertyMap().get("medic.eventCode"));
+    }
+    
+    @Test
+    public void handlingOfMissingMessages() {
+        MessageResolver resolver = createMock(MessageResolver.class);
+        
+        EventLogger eventLogger = new LogBackEventLogger(resolver);
+        
+        expect(resolver.resolveLogEventMessage("UT0001")).andReturn(null);
+        expect(resolver.resolveLogEventMessage("UT0001", Locale.ENGLISH)).andReturn(null);
+        
+        replay(resolver);
+        
+        eventLogger.log("UT0001", Level.ERROR, "apple", "orange", 345);
+        
+        verify(resolver);
+        
+        List<LoggingEvent> defaultEvents = DefaultOutputAppender.getAndResetLoggingEvents();
+        assertEquals(1, defaultEvents.size());
+        LoggingEvent loggingEvent = defaultEvents.get(0);
+        assertEquals(ch.qos.logback.classic.Level.WARN, loggingEvent.getLevel());
+        assertEquals("A message with the key 'UT0001' was not found. The inserts for the message were '[apple, orange, 345]'",
+                     loggingEvent.getMessage());
+        //        assertEquals("ME0001W", loggingEvent.getMDCPropertyMap().get("medic.eventCode"));
+        
+        List<LoggingEvent> localizedEvents = LocalizedOutputAppender.getAndResetLoggingEvents();
+        assertEquals(1, localizedEvents.size());
+        loggingEvent = localizedEvents.get(0);
+        assertEquals(ch.qos.logback.classic.Level.WARN, loggingEvent.getLevel());
+        assertEquals("A message with the key 'UT0001' was not found. The inserts for the message were '[apple, orange, 345]'",
+                     loggingEvent.getMessage());
+        assertEquals("ME0001W", loggingEvent.getMDCPropertyMap().get("medic.eventCode"));
+    }
+}
\ No newline at end of file
diff --git a/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/impl/LogControllerTests.java b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/impl/LogControllerTests.java
new file mode 100755
index 0000000..78e2f1b
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/impl/LogControllerTests.java
@@ -0,0 +1,229 @@
+/*******************************************************************************
+ * Copyright (c) 2011 SAP AG.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Hristo Iliev, SAP AG. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.impl;
+
+import org.eclipse.virgo.medic.impl.config.ConfigurationAdminConfigurationProvider;
+import org.eclipse.virgo.medic.impl.config.ConfigurationProvider;
+import org.eclipse.virgo.medic.log.ConfigurationPublicationFailedException;
+import org.eclipse.virgo.medic.log.DelegatingPrintStream;
+import org.eclipse.virgo.medic.log.impl.LoggingPrintStreamWrapper;
+import org.eclipse.virgo.medic.log.impl.StandardDelegatingPrintStream;
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+import org.eclipse.virgo.util.osgi.ServiceRegistrationTracker;
+import org.junit.Test;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+
+import java.io.IOException;
+import java.io.PrintStream;
+import java.util.Arrays;
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.logging.ConsoleHandler;
+import java.util.logging.Handler;
+import java.util.logging.Logger;
+
+import static org.easymock.EasyMock.*;
+import static org.junit.Assert.*;
+
+public class LogControllerTests {
+    
+    private static final String LOGGER_NAME_SYSERR = "System.err";
+    private static final String LOGGER_NAME_SYSOUT = "System.out";
+    
+    private static final String LOGGER_NAME_SYSERR_DELEGATE = "delegating.System.err";
+    private static final String LOGGER_NAME_SYSOUT_DELEGATE = "delegating.System.out";
+    
+    private final StubBundleContext bundleContext = new StubBundleContext();
+    
+    @Test
+    public void loggingWithWrappedStreams() throws IOException, ConfigurationPublicationFailedException, InvalidSyntaxException {
+        ConfigurationAdmin configurationAdmin = createMock(ConfigurationAdmin.class);
+        Configuration configuration = createMock(Configuration.class);
+        
+        Dictionary<String, Object> properties = new Hashtable<String, Object>();
+        properties.put(ConfigurationProvider.KEY_LOG_WRAP_SYSERR, "true");
+        properties.put(ConfigurationProvider.KEY_LOG_WRAP_SYSOUT, "true");
+        createConfigurationMocks(configurationAdmin, configuration, properties, 1);
+        
+        ConfigurationAdminConfigurationProvider configurationProvider = new ConfigurationAdminConfigurationProvider(this.bundleContext);
+        LogController controller = new LogController(this.bundleContext, configurationProvider, new ServiceRegistrationTracker());
+        
+        controller.logStart();
+        
+        checkPublishedStreamServices(DelegatingPrintStream.class, StandardDelegatingPrintStream.class, LOGGER_NAME_SYSOUT_DELEGATE, LOGGER_NAME_SYSERR_DELEGATE);
+        checkPublishedStreamServices(PrintStream.class, PrintStream.class, LOGGER_NAME_SYSOUT, LOGGER_NAME_SYSERR);
+        
+        assertTrue(System.out instanceof LoggingPrintStreamWrapper);
+        assertTrue(System.err instanceof LoggingPrintStreamWrapper);
+        
+        controller.logStop();
+        
+        assertFalse(System.out instanceof LoggingPrintStreamWrapper);
+        assertFalse(System.err instanceof LoggingPrintStreamWrapper);
+        
+        verify(configurationAdmin, configuration);
+    }
+    
+    @Test
+    public void loggingWithNonWrappedStreams() throws IOException, ConfigurationPublicationFailedException, InvalidSyntaxException {
+        ConfigurationAdmin configurationAdmin = createMock(ConfigurationAdmin.class);
+        Configuration configuration = createMock(Configuration.class);
+        
+        Dictionary<String, Object> properties = new Hashtable<String, Object>();
+        properties.put(ConfigurationProvider.KEY_LOG_WRAP_SYSERR, "false");
+        properties.put(ConfigurationProvider.KEY_LOG_WRAP_SYSOUT, "false");
+        createConfigurationMocks(configurationAdmin, configuration, properties, 1);
+        
+        ConfigurationAdminConfigurationProvider configurationProvider = new ConfigurationAdminConfigurationProvider(this.bundleContext);
+        LogController controller = new LogController(this.bundleContext, configurationProvider, new ServiceRegistrationTracker());
+        
+        controller.logStart();
+        
+        assertTrue(System.out instanceof StandardDelegatingPrintStream);
+        assertTrue(System.err instanceof StandardDelegatingPrintStream);
+        
+        controller.logStop();
+        
+        assertFalse(System.out instanceof LoggingPrintStreamWrapper);
+        assertFalse(System.err instanceof LoggingPrintStreamWrapper);
+        
+        verify(configurationAdmin, configuration);
+    }
+    
+    @Test
+    public void changeFromWrappedToNonWrappedStreams() throws IOException, ConfigurationPublicationFailedException, InvalidSyntaxException {
+        ConfigurationAdmin configurationAdmin = createMock(ConfigurationAdmin.class);
+        Configuration configuration = createMock(Configuration.class);
+
+        Dictionary<String, Object> properties = new Hashtable<String, Object>();
+        properties.put(ConfigurationProvider.KEY_LOG_WRAP_SYSERR, "true");
+        properties.put(ConfigurationProvider.KEY_LOG_WRAP_SYSOUT, "true");
+        createConfigurationMocks(configurationAdmin, configuration, properties, 1);
+        
+        ConfigurationAdminConfigurationProvider configurationProvider = new ConfigurationAdminConfigurationProvider(this.bundleContext);
+        LogController controller = new LogController(this.bundleContext, configurationProvider, new ServiceRegistrationTracker());
+        
+        controller.logStart();
+        
+        properties.put(ConfigurationProvider.KEY_LOG_WRAP_SYSERR, "false");
+        properties.put(ConfigurationProvider.KEY_LOG_WRAP_SYSOUT, "false");
+        controller.configurationChanged(configurationProvider);
+        
+        assertNull(this.bundleContext.getServiceReferences(DelegatingPrintStream.class.getName(), null));
+        
+        assertTrue(System.out instanceof StandardDelegatingPrintStream);
+        assertTrue(System.err instanceof StandardDelegatingPrintStream);
+        
+        controller.logStop();
+        
+        assertFalse(System.out instanceof LoggingPrintStreamWrapper);
+        assertFalse(System.err instanceof LoggingPrintStreamWrapper);
+    }
+    
+    @Test
+    public void loggingWithEnabledJULConsoleHandler() throws IOException, ConfigurationPublicationFailedException {
+        ConfigurationAdmin configurationAdmin = createMock(ConfigurationAdmin.class);
+        Configuration configuration = createMock(Configuration.class);
+        
+        Dictionary<String, Object> properties = new Hashtable<String, Object>();
+        properties.put(ConfigurationProvider.KEY_ENABLE_JUL_CONSOLE_HANDLER, "true");
+        createConfigurationMocks(configurationAdmin, configuration, properties, 1);
+        
+        ConfigurationAdminConfigurationProvider configurationProvider = new ConfigurationAdminConfigurationProvider(this.bundleContext);
+        LogController controller = new LogController(this.bundleContext, configurationProvider, new ServiceRegistrationTracker());
+        
+        controller.logStart();
+        assertTrue(checkForJULConsoleHandler());
+        
+        controller.logStop();
+        assertTrue(checkForJULConsoleHandler());
+        
+        verify(configurationAdmin, configuration);
+    }
+    
+    @Test
+    public void loggingWithDisabledJULConsoleHandler() throws IOException, ConfigurationPublicationFailedException {
+        ConfigurationAdmin configurationAdmin = createMock(ConfigurationAdmin.class);
+        Configuration configuration = createMock(Configuration.class);
+        
+        Dictionary<String, Object> properties = new Hashtable<String, Object>();
+        properties.put(ConfigurationProvider.KEY_ENABLE_JUL_CONSOLE_HANDLER, "false");
+        createConfigurationMocks(configurationAdmin, configuration, properties, 1);
+        
+        ConfigurationAdminConfigurationProvider configurationProvider = new ConfigurationAdminConfigurationProvider(this.bundleContext);
+        LogController controller = new LogController(this.bundleContext, configurationProvider, new ServiceRegistrationTracker());
+        
+        controller.logStart();
+        assertFalse(checkForJULConsoleHandler());
+        
+        controller.logStop();
+        assertTrue(checkForJULConsoleHandler());
+        
+        verify(configurationAdmin, configuration);
+    }
+    
+    private void checkPublishedStreamServices(Class<?> registeredClass, Class<?> serviceClass, String... streamNames) throws InvalidSyntaxException {
+        ServiceReference<?> serviceReferences[] = this.bundleContext.getServiceReferences(registeredClass.getName(), null);
+        
+        for (ServiceReference<?> reference : serviceReferences) {
+            String streamName = (String) reference.getProperty("org.eclipse.virgo.medic.log.printStream");
+            
+            boolean foundMatch = checkForMatchingNames(streamName, streamNames);
+            if (!foundMatch) {
+                fail("Stream name [" + streamName + "] not one of the expected " + Arrays.toString(streamNames));
+            }
+
+            if (!this.bundleContext.getService(reference).getClass().getCanonicalName().contains("gradle")) {
+                assertEquals(serviceClass, this.bundleContext.getService(reference).getClass());
+            }
+        }
+    }
+    
+    private boolean checkForMatchingNames(String streamName, String[] streamNames) {
+        boolean foundMatch = false;
+        for (String name : streamNames) {
+            if (name.equals(streamName)) {
+                foundMatch = true;
+                break;
+            }
+        }
+        return foundMatch;
+    }
+    
+    private ServiceRegistration<?> createConfigurationMocks(ConfigurationAdmin configurationAdmin, Configuration configuration, Dictionary<String, Object> properties, int times) throws IOException {
+        ServiceRegistration<?> serviceRegistration = this.bundleContext.registerService(ConfigurationAdmin.class.getName(), configurationAdmin, null);
+        
+        expect(configurationAdmin.getConfiguration("org.eclipse.virgo.medic", null)).andReturn(configuration).times(times);
+        expect(configuration.getProperties()).andReturn(properties).times(times);
+        
+        replay(configurationAdmin, configuration);
+        
+        return serviceRegistration;
+    }
+    
+    private boolean checkForJULConsoleHandler() {
+        Logger rootLogger = Logger.getLogger("");
+        Handler[] handlers = rootLogger.getHandlers();
+        for (Handler handler : handlers) {
+            if (handler instanceof ConsoleHandler) {
+                return true;
+            }
+        }
+        
+        return false;
+    }
+    
+}
\ No newline at end of file
diff --git a/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/impl/MedicActivatorTests.java b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/impl/MedicActivatorTests.java
new file mode 100644
index 0000000..1f96407
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/impl/MedicActivatorTests.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.impl;
+
+import static org.easymock.EasyMock.createNiceMock;
+import static org.easymock.EasyMock.replay;
+import static org.eclipse.virgo.test.stubs.framework.OSGiAssert.assertServiceListenerCount;
+import static org.eclipse.virgo.test.stubs.framework.OSGiAssert.assertServiceRegistrationCount;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.io.PrintStream;
+import java.lang.management.ManagementFactory;
+
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+
+import org.eclipse.equinox.log.ExtendedLogReaderService;
+import org.eclipse.virgo.medic.dump.DumpContributor;
+import org.eclipse.virgo.medic.dump.DumpGenerator;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.medic.eventlog.EventLoggerFactory;
+import org.eclipse.virgo.medic.log.DelegatingPrintStream;
+import org.eclipse.virgo.medic.log.LoggingConfigurationPublisher;
+import org.eclipse.virgo.test.stubs.framework.StubBundle;
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+import org.eclipse.virgo.test.stubs.support.ObjectClassFilter;
+import org.junit.Test;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleListener;
+import org.osgi.service.cm.ConfigurationListener;
+
+
+public class MedicActivatorTests {
+	
+    private final MBeanServer server = ManagementFactory.getPlatformMBeanServer();
+
+    @Test
+    public void startAndStop() throws Exception {
+        BundleActivator bundleActivator = new MedicActivator();
+        StubBundleContext bundleContext = new StubBundleContext().addFilter(new ObjectClassFilter(DumpContributor.class));
+        bundleContext.addProperty("org.eclipse.virgo.suppress.heap.dumps", "false");
+        bundleContext.addProperty("org.eclipse.virgo.kernel.home", "src/test/resources/testDumps");
+        
+        ExtendedLogReaderService logReaderService = createNiceMock(ExtendedLogReaderService.class);
+        replay(logReaderService);
+        
+        bundleContext.registerService(ExtendedLogReaderService.class, logReaderService, null);
+
+        bundleActivator.start(bundleContext);
+        assertServiceListenerCount(bundleContext, 1);
+        assertServiceRegistrationCount(bundleContext, DumpGenerator.class, 1);
+        assertServiceRegistrationCount(bundleContext, DumpContributor.class, 3);
+        assertServiceRegistrationCount(bundleContext, EventLoggerFactory.class, 1);
+        assertServiceRegistrationCount(bundleContext, EventLogger.class, 1);
+        assertServiceRegistrationCount(bundleContext, LoggingConfigurationPublisher.class, 1);
+        assertServiceRegistrationCount(bundleContext, PrintStream.class, 2);
+        assertServiceRegistrationCount(bundleContext, DelegatingPrintStream.class, 2);
+        assertServiceRegistrationCount(bundleContext, ConfigurationListener.class, 1);
+        assertServiceRegistrationCount(bundleContext, BundleListener.class, 1);
+
+        assertTrue(this.server.isRegistered(new ObjectName("org.eclipse.virgo.kernel:type=Medic,name=DumpInspector")));
+        
+        bundleActivator.stop(bundleContext);
+        
+        assertFalse(this.server.isRegistered(new ObjectName("org.eclipse.virgo.kernel:type=Medic,name=DumpInspector")));
+        
+        assertEquals(2, bundleContext.getServiceRegistrations().size());
+    }        
+
+    @Test
+    public void copeWithNullsDuringStop() throws Exception {
+        BundleActivator bundleActivator = new MedicActivator();
+        BundleContext context = new StubBundleContext(new StubBundle());
+        
+        ExtendedLogReaderService logReaderService = createNiceMock(ExtendedLogReaderService.class);
+        replay(logReaderService);
+        context.registerService(ExtendedLogReaderService.class, logReaderService, null);
+        
+        bundleActivator.stop(context);
+    }
+
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/impl/config/ConfigurationAdminConfigurationProviderTests.java b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/impl/config/ConfigurationAdminConfigurationProviderTests.java
new file mode 100644
index 0000000..cf45e10
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/impl/config/ConfigurationAdminConfigurationProviderTests.java
@@ -0,0 +1,174 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.impl.config;
+
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+import org.junit.Test;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.cm.ConfigurationEvent;
+
+import java.io.IOException;
+import java.util.Dictionary;
+import java.util.Hashtable;
+
+import static org.easymock.EasyMock.*;
+import static org.junit.Assert.*;
+
+public class ConfigurationAdminConfigurationProviderTests implements ConfigurationChangeListener {
+    
+    private static final String CONFIG_ADMIN_PID = "org.eclipse.virgo.medic";
+    
+    private final StubBundleContext bundleContext = new StubBundleContext();
+    
+    private int notificationCount;
+    
+    @Test
+    public void getConfigurationWithoutConfigurationAdmin() {
+        ConfigurationProvider configurationProvider = new ConfigurationAdminConfigurationProvider(bundleContext);
+        Dictionary<String, Object> configuration = configurationProvider.getConfiguration();
+        assertNotNull(configuration);
+        assertEquals(".", configuration.get(ConfigurationProvider.KEY_DUMP_ROOT_DIRECTORY));
+    }
+    
+    @Test
+    public void getConfigurationWithEmptyConfigurationAdminConfiguration() throws IOException {
+        ConfigurationAdmin configurationAdmin = createMock(ConfigurationAdmin.class);
+        Configuration configuration = createMock(Configuration.class);
+        
+        this.bundleContext.registerService(ConfigurationAdmin.class.getName(), configurationAdmin, null);
+        expect(configurationAdmin.getConfiguration("org.eclipse.virgo.medic", null)).andReturn(configuration);
+        expect(configuration.getProperties()).andReturn(null);
+        
+        replay(configurationAdmin, configuration);
+        
+        ConfigurationProvider configurationProvider = new ConfigurationAdminConfigurationProvider(bundleContext);
+        
+        Dictionary<String, Object> configDictionary = configurationProvider.getConfiguration();
+        assertNotNull(configDictionary);
+        assertEquals(".", configDictionary.get(ConfigurationProvider.KEY_DUMP_ROOT_DIRECTORY));
+        
+        verify(configurationAdmin, configuration);
+    }
+    
+    @Test
+    public void getConfigurationWithConfigurationAdminConfiguration() throws IOException {
+        ConfigurationAdmin configurationAdmin = createMock(ConfigurationAdmin.class);
+        Configuration configuration = createMock(Configuration.class);
+        
+        Dictionary<String, Object> properties = new Hashtable<String, Object>();
+        properties.put(ConfigurationProvider.KEY_DUMP_ROOT_DIRECTORY, "build");
+        properties.put("a.b.c", "d.e.f");
+        createConfigurationMocks(configurationAdmin, configuration, properties, 1);
+        
+        ConfigurationProvider configurationProvider = new ConfigurationAdminConfigurationProvider(bundleContext);
+        Dictionary<String, Object> configDictionary = configurationProvider.getConfiguration();
+        assertNotNull(configDictionary);
+        assertEquals("build", configDictionary.get(ConfigurationProvider.KEY_DUMP_ROOT_DIRECTORY));
+        assertEquals("d.e.f", configDictionary.get("a.b.c"));
+        
+        verify(configurationAdmin, configuration);
+    }
+    
+    @Test
+    public void configurationListenerNotification() throws IOException {
+        ConfigurationAdmin configurationAdmin = createMock(ConfigurationAdmin.class);
+        Configuration configuration = createMock(Configuration.class);
+        
+        Dictionary<String, Object> properties = new Hashtable<String, Object>();
+        properties.put(ConfigurationProvider.KEY_DUMP_ROOT_DIRECTORY, "build");
+        properties.put("a.b.c", "d.e.f");
+        ServiceRegistration<ConfigurationAdmin> serviceRegistration = createConfigurationMocks(configurationAdmin, configuration, properties, 5);
+        
+        ConfigurationAdminConfigurationProvider configurationProvider = new ConfigurationAdminConfigurationProvider(bundleContext);
+        ConfigurationEvent event = new ConfigurationEvent(serviceRegistration.getReference(), ConfigurationEvent.CM_UPDATED, null, CONFIG_ADMIN_PID);
+        
+        notificationCount = 0;
+        
+        updateConfigurationAndCheckForNotification(configurationProvider, event, 0);
+        
+        configurationProvider.addChangeListener(this);
+        updateConfigurationAndCheckForNotification(configurationProvider, event, 1);
+        
+        updateConfigurationAndCheckForNotification(configurationProvider, event, 2);
+        
+        configurationProvider.removeChangeListener(this);
+        updateConfigurationAndCheckForNotification(configurationProvider, event, 2);
+        
+        verify(configurationAdmin, configuration);
+    }
+    
+    @Test
+    public void configurationChange() throws IOException {
+        ConfigurationAdmin configurationAdmin = createMock(ConfigurationAdmin.class);
+        Configuration configuration = createMock(Configuration.class);
+        
+        Dictionary<String, Object> properties = new Hashtable<String, Object>();
+        properties.put(ConfigurationProvider.KEY_DUMP_ROOT_DIRECTORY, "build");
+        properties.put("a.b.c", "d.e.f");
+        ServiceRegistration<ConfigurationAdmin> serviceRegistration = createConfigurationMocks(configurationAdmin, configuration, properties, 2);
+        
+        // Initial configuration publishing
+        ConfigurationAdminConfigurationProvider configurationProvider = new ConfigurationAdminConfigurationProvider(bundleContext);
+        ConfigurationEvent event = new ConfigurationEvent(serviceRegistration.getReference(), ConfigurationEvent.CM_UPDATED, null, CONFIG_ADMIN_PID);
+        
+        notificationCount = 0;
+        
+        configurationProvider.addChangeListener(this);
+        updateConfigurationAndCheckForNotification(configurationProvider, event, 1);
+        
+        verify(configurationAdmin, configuration);
+        
+        // Update the configuration
+        Dictionary<String, Object> newProperties = new Hashtable<String, Object>((Hashtable<String, Object>) properties);
+        newProperties.put("1.2.3", "4.5.6");
+        
+        reset(configurationAdmin, configuration);
+        
+        serviceRegistration = createConfigurationMocks(configurationAdmin, configuration, newProperties, 1);
+        event = new ConfigurationEvent(serviceRegistration.getReference(), ConfigurationEvent.CM_UPDATED, null, CONFIG_ADMIN_PID);
+        
+        // Trigger change event
+        configurationProvider.addChangeListener(this);
+        updateConfigurationAndCheckForNotification(configurationProvider, event, 2);
+        
+        Dictionary<String, Object> configDictionary = configurationProvider.getConfiguration();
+        assertNotNull(configDictionary);
+        assertEquals("build", configDictionary.get(ConfigurationProvider.KEY_DUMP_ROOT_DIRECTORY));
+        assertEquals("d.e.f", configDictionary.get("a.b.c"));
+        assertEquals("4.5.6", configDictionary.get("1.2.3"));
+        
+        verify(configurationAdmin, configuration);
+    }
+    
+    private ServiceRegistration<ConfigurationAdmin> createConfigurationMocks(ConfigurationAdmin configurationAdmin, Configuration configuration, Dictionary<String, Object> properties, int times) throws IOException {
+        ServiceRegistration<ConfigurationAdmin> serviceRegistration = this.bundleContext.registerService(ConfigurationAdmin.class, configurationAdmin, null);
+        
+        expect(configurationAdmin.getConfiguration("org.eclipse.virgo.medic", null)).andReturn(configuration).times(times);
+        expect(configuration.getProperties()).andReturn(properties).times(times);
+        
+        replay(configurationAdmin, configuration);
+        
+        return serviceRegistration;
+    }
+    
+    private void updateConfigurationAndCheckForNotification(ConfigurationAdminConfigurationProvider configurationProvider, ConfigurationEvent event, int count) {
+        configurationProvider.configurationEvent(event);
+        assertEquals(count, notificationCount);
+    }
+    
+    @Override
+    public void configurationChanged(ConfigurationProvider configurationProvider) {
+        this.notificationCount++;
+    }
+}
\ No newline at end of file
diff --git a/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/impl/config/DictionaryUtilsTests.java b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/impl/config/DictionaryUtilsTests.java
new file mode 100644
index 0000000..3fac321
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/impl/config/DictionaryUtilsTests.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.impl.config;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Dictionary;
+import java.util.Hashtable;
+
+import org.eclipse.virgo.medic.impl.config.DictionaryUtils;
+import org.junit.Test;
+
+public class DictionaryUtilsTests {
+
+    @Test
+    public void emptyMerge() {
+        Dictionary<Object, Object> primary = new Hashtable<Object, Object>();
+        Dictionary<Object, Object> secondary = new Hashtable<Object, Object>();
+
+        DictionaryUtils.merge(primary, secondary);
+        assertTrue(primary.isEmpty());
+    }
+
+    @Test
+    public void mergeWithoutClash() {
+        Dictionary<Object, Object> primary = new Hashtable<Object, Object>();
+        primary.put("b", "c");
+        Dictionary<Object, Object> secondary = new Hashtable<Object, Object>();
+        secondary.put("a", "b");
+
+        DictionaryUtils.merge(primary, secondary);
+        assertEquals("c", primary.get("b"));
+        assertEquals("b", primary.get("a"));
+    }
+
+    @Test
+    public void mergeWithClash() {
+        Dictionary<Object, Object> primary = new Hashtable<Object, Object>();
+        primary.put("b", "c");
+        Dictionary<Object, Object> secondary = new Hashtable<Object, Object>();
+        secondary.put("b", "b");
+
+        DictionaryUtils.merge(primary, secondary);
+        assertEquals("c", primary.get("b"));
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/log/impl/CapturingAppender.java b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/log/impl/CapturingAppender.java
new file mode 100644
index 0000000..5ca3784
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/log/impl/CapturingAppender.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import ch.qos.logback.classic.spi.LoggingEvent;
+import ch.qos.logback.core.AppenderBase;
+
+public class CapturingAppender extends AppenderBase<LoggingEvent> {
+
+    private static List<LoggingEvent> loggingEvents = new ArrayList<LoggingEvent>();
+
+    @Override
+    protected void append(LoggingEvent eventObject) {
+        loggingEvents.add(eventObject);
+    }
+
+    static List<LoggingEvent> getAndResetLoggingEvents() {
+        List<LoggingEvent> loggingEvents = CapturingAppender.loggingEvents;
+        CapturingAppender.loggingEvents = new ArrayList<LoggingEvent>();
+        return loggingEvents;
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/log/impl/LoggingPrintStreamWrapperTests.java b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/log/impl/LoggingPrintStreamWrapperTests.java
new file mode 100644
index 0000000..e8be2a9
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/log/impl/LoggingPrintStreamWrapperTests.java
@@ -0,0 +1,190 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log.impl;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.junit.Assert.assertEquals;
+
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Locale;
+
+import org.eclipse.virgo.medic.impl.config.ConfigurationChangeListener;
+import org.eclipse.virgo.medic.impl.config.ConfigurationProvider;
+import org.junit.Before;
+import org.junit.Test;
+
+import ch.qos.logback.classic.Logger;
+import ch.qos.logback.classic.spi.LoggingEvent;
+
+public class LoggingPrintStreamWrapperTests {
+
+    private PrintStream wrapper;
+
+	@Test
+    public void test() {
+		produceOutput(this.wrapper);
+
+		List<LoggingEvent> loggingEvents = CapturingAppender.getAndResetLoggingEvents();
+        assertEquals(22, loggingEvents.size());
+
+        assertEquals("abcdefghij", loggingEvents.get(0).getMessage());
+        assertEquals("Three strings", loggingEvents.get(1).getMessage());
+        assertEquals("last one on a new line.", loggingEvents.get(2).getMessage());
+        assertEquals("3,1416", loggingEvents.get(3).getMessage());
+        assertEquals("trueklm", loggingEvents.get(4).getMessage());
+        assertEquals("a123.0456.078910toString", loggingEvents.get(5).getMessage());
+        assertEquals("abcdThree strings", loggingEvents.get(6).getMessage());
+        assertEquals("last one on a new line.", loggingEvents.get(7).getMessage());
+        assertEquals("3,1416", loggingEvents.get(8).getMessage());
+        assertEquals("false", loggingEvents.get(9).getMessage());
+        assertEquals("b", loggingEvents.get(10).getMessage());
+        assertEquals("", loggingEvents.get(11).getMessage());
+        assertEquals("", loggingEvents.get(12).getMessage());
+        assertEquals("abc", loggingEvents.get(13).getMessage());
+        assertEquals("de", loggingEvents.get(14).getMessage());
+        assertEquals("123.0", loggingEvents.get(15).getMessage());
+        assertEquals("456.0", loggingEvents.get(16).getMessage());
+        assertEquals("789", loggingEvents.get(17).getMessage());
+        assertEquals("101112", loggingEvents.get(18).getMessage());
+        assertEquals("toString", loggingEvents.get(19).getMessage());
+        assertEquals("A string with a", loggingEvents.get(20).getMessage());
+        assertEquals("new line in it.", loggingEvents.get(21).getMessage());
+	}
+
+	@Test
+	public void testOutputWithinLoggingCode() {
+		ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        PrintStream printStream = new PrintStream(baos);
+		PrintStream wrapper = new LoggingPrintStreamWrapper(printStream, getClass().getName(), new ExecutionStackAccessor() {
+
+			public Class<?>[] getExecutionStack() {
+				return new Class[] {Logger.class};
+			}
+		}, new StubConfigurationProvider(), "theProperty");
+
+		produceOutput(wrapper);
+
+		List<LoggingEvent> loggingEvents = CapturingAppender.getAndResetLoggingEvents();
+		assertEquals(0, loggingEvents.size());
+	}
+
+	private void produceOutput(PrintStream printStream) {
+        printStream.append('a');
+        printStream.append("bcd");
+        printStream.append("abcdefghij", 4, 10);
+        printStream.println();
+        printStream.format("%s %s%n%s%n", "Three", "strings", "last one on a new line.");
+        printStream.format(Locale.FRANCE, "%.4f%n", Math.PI);
+        printStream.print(true);
+        printStream.print('k');
+        printStream.print(new char[] {'l', 'm', '\r', 'a'});
+        printStream.print(123d);
+        printStream.print(456f);
+        printStream.print(7);
+        printStream.print(8910l);
+        printStream.print(new Object() {@Override public String toString() { return "toString";}});
+        printStream.append('\n');
+        printStream.print("abcd");
+        printStream.printf("%s %s%n%s%n", "Three", "strings", "last one on a new line.");
+        printStream.printf(Locale.FRANCE, "%.4f%n", Math.PI);
+        printStream.println(false);
+        printStream.println('b');
+        printStream.println('\n');
+        printStream.println(new char[] {'a', 'b', 'c', '\n', 'd', 'e'});
+        printStream.println(123d);
+        printStream.println(456f);
+        printStream.println(789);
+        printStream.println(101112l);
+        printStream.println(new Object() {@Override public String toString() { return "toString";}});
+        printStream.println("A string with a\nnew line in it.");
+	}
+
+    @Test
+    public void testByteArrayHandling() {
+        String string = "Some text to be turned into bytes.";
+        String stringWithNewLine = string + "\n";
+        byte[] stringBytes = stringWithNewLine.getBytes(UTF_8);
+
+        wrapper.write(stringBytes, 0, stringBytes.length);
+
+        List<LoggingEvent> loggingEvents = CapturingAppender.getAndResetLoggingEvents();
+        assertEquals(1, loggingEvents.size());
+
+        assertEquals("Some text to be turned into bytes.", loggingEvents.get(0).getMessage());
+    }
+
+    @Test
+    public void testSingleByteHandling() {
+        String string = "Some text to be turned into bytes.";
+        byte[] stringBytes = string.getBytes(UTF_8);
+
+        for (byte b: stringBytes) {
+            wrapper.write(b);
+        }
+        wrapper.println();
+
+        List<LoggingEvent> loggingEvents = CapturingAppender.getAndResetLoggingEvents();
+        assertEquals(1, loggingEvents.size());
+
+        assertEquals("Some text to be turned into bytes.", loggingEvents.get(0).getMessage());
+    }
+
+    @Test
+    public void testPrintNullString(){
+
+        String imNull = null;
+
+        wrapper.println(imNull);
+        wrapper.print(imNull);
+        wrapper.println();
+
+        List<LoggingEvent> loggingEvents = CapturingAppender.getAndResetLoggingEvents();
+        assertEquals(2, loggingEvents.size());
+
+        assertEquals("null", loggingEvents.get(0).getMessage());
+        assertEquals("null", loggingEvents.get(1).getMessage());
+    }
+
+	@Before
+    public void createWrapper() {
+		ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        PrintStream printStream = new PrintStream(baos);
+        this.wrapper = new LoggingPrintStreamWrapper(printStream, getClass().getName(), new SecurityManagerExecutionStackAccessor(), new StubConfigurationProvider(), "theProperty");
+	}
+
+	private final static class StubConfigurationProvider implements ConfigurationProvider {
+
+		private final Hashtable<String, Object> configuration;
+
+		private StubConfigurationProvider() {
+			this.configuration = new Hashtable<String, Object>();
+			this.configuration.put("theProperty", "true");
+		}
+
+		public Dictionary<String, Object> getConfiguration() {
+			return this.configuration;
+		}
+
+        public void addChangeListener(ConfigurationChangeListener listener) {
+            throw new UnsupportedOperationException();
+        }
+
+        public boolean removeChangeListener(ConfigurationChangeListener listener) {
+            throw new UnsupportedOperationException();
+        }
+
+	}
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/log/impl/PackageNameFilteringClassSelectorTests.java b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/log/impl/PackageNameFilteringClassSelectorTests.java
new file mode 100644
index 0000000..9fc65b9
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/log/impl/PackageNameFilteringClassSelectorTests.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log.impl;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import java.util.Arrays;
+
+import org.eclipse.virgo.medic.log.impl.PackageNameFilteringClassSelector;
+import org.junit.Test;
+
+public class PackageNameFilteringClassSelectorTests {
+
+    @Test
+    public void noFiltering() {
+        PackageNameFilteringClassSelector classSelector = new PackageNameFilteringClassSelector(Arrays.asList(""));
+        Class<?> selected = classSelector.select(new Class<?>[] { getClass() });
+        assertEquals(getClass(), selected);
+    }
+
+    @Test
+    public void filterToEmpty() {
+        PackageNameFilteringClassSelector classSelector = new PackageNameFilteringClassSelector(Arrays.asList(getClass().getPackage().getName()));
+        Class<?> selected = classSelector.select(new Class<?>[] { getClass() });
+        assertNull(selected);
+    }
+
+    @Test
+    public void filtered() {
+        PackageNameFilteringClassSelector classSelector = new PackageNameFilteringClassSelector(Arrays.asList(getClass().getPackage().getName()));
+        Class<?> selected = classSelector.select(new Class<?>[] { getClass(), java.util.ArrayList.class });
+        assertEquals(java.util.ArrayList.class, selected);
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/log/impl/SecurityManagerExecutionStackAccessorTests.java b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/log/impl/SecurityManagerExecutionStackAccessorTests.java
new file mode 100644
index 0000000..361fdc7
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/log/impl/SecurityManagerExecutionStackAccessorTests.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log.impl;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import org.eclipse.virgo.medic.log.impl.ExecutionStackAccessor;
+import org.eclipse.virgo.medic.log.impl.SecurityManagerExecutionStackAccessor;
+import org.junit.Test;
+
+public class SecurityManagerExecutionStackAccessorTests {
+
+    @Test
+    public void getClasses() {
+        ExecutionStackAccessor accessor = new SecurityManagerExecutionStackAccessor();
+        Class<?>[] classes = accessor.getExecutionStack();
+        assertNotNull(classes);
+        assertTrue(classes.length > 0);
+        assertEquals("Unexpected class in stack: " + classes[0], SecurityManagerExecutionStackAccessorTests.class, classes[0]);
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/log/impl/StandardDelegatingPrintStreamTests.java b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/log/impl/StandardDelegatingPrintStreamTests.java
new file mode 100644
index 0000000..d71e4cf
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/log/impl/StandardDelegatingPrintStreamTests.java
@@ -0,0 +1,242 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log.impl;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.io.StringWriter;
+import java.util.Locale;
+
+import org.eclipse.virgo.medic.log.impl.StandardDelegatingPrintStream;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ */
+public class StandardDelegatingPrintStreamTests {
+    
+    private final WriterOutputStream writerOutputStream = new WriterOutputStream();    
+            
+    private final StandardDelegatingPrintStream delegatingPrintStream = new StandardDelegatingPrintStream(new PrintStream(writerOutputStream));
+    
+    private static final String LINE_SEPARATOR = System.getProperty("line.separator");
+    
+    @Before
+    public void setLocale() {
+        Locale.setDefault(Locale.ENGLISH);
+    }
+    
+    @Test
+    public void appendChar() {
+        delegatingPrintStream.append('a');
+        assertEquals("a", this.writerOutputStream.getOutput());
+    }
+    
+    @Test
+    public void append() {
+        delegatingPrintStream.append("a");
+        assertEquals("a", this.writerOutputStream.getOutput());
+    }
+    
+    @Test
+    public void appendSegment() {
+        delegatingPrintStream.append("abc", 1, 2);
+        assertEquals("b", this.writerOutputStream.getOutput());
+    }
+    
+    @Test
+    public void format() {
+        delegatingPrintStream.format("%s", "apple");
+        assertEquals("apple", this.writerOutputStream.getOutput());
+    }
+    
+    @Test
+    public void formatWithLocale() {
+        delegatingPrintStream.format(Locale.FRENCH, "%f", 3.1417d);
+        assertEquals("3,141700", this.writerOutputStream.getOutput());
+    }
+    
+    @Test
+    public void printBoolean() {
+        delegatingPrintStream.print("true");
+        assertEquals("true", this.writerOutputStream.getOutput());
+    }
+    
+    @Test
+    public void printChar() {
+        delegatingPrintStream.print('a');
+        assertEquals("a", this.writerOutputStream.getOutput());
+    }
+    
+    @Test
+    public void printCharArray() {
+        delegatingPrintStream.print(new char[] {'a', 'b', 'c'});
+        assertEquals("abc", this.writerOutputStream.getOutput());
+    }
+    
+    @Test
+    public void printDouble() {
+        delegatingPrintStream.print(3.1d);
+        assertEquals("3.1", this.writerOutputStream.getOutput());
+    }
+    
+    @Test
+    public void printFloat() {
+        delegatingPrintStream.print(3.1f);
+        assertEquals("3.1", this.writerOutputStream.getOutput());
+    }
+    
+    @Test
+    public void printInt() {
+        delegatingPrintStream.print(3);
+        assertEquals("3", this.writerOutputStream.getOutput());
+    }
+    
+    @Test
+    public void printLong() {
+        delegatingPrintStream.print(12345678901234567L);
+        assertEquals("12345678901234567", this.writerOutputStream.getOutput());
+    }
+    
+    @Test
+    public void printObject() {
+        delegatingPrintStream.print(new Integer(345));
+        assertEquals("345", this.writerOutputStream.getOutput());
+    }
+    
+    @Test
+    public void printString() {
+        delegatingPrintStream.print("hello");
+        assertEquals("hello", this.writerOutputStream.getOutput());
+    }
+    
+    @Test
+    public void printf() {
+        delegatingPrintStream.printf("%s", "alpha");
+        assertEquals("alpha", this.writerOutputStream.getOutput());
+    }
+    
+    @Test
+    public void printfWithLocale() {
+        delegatingPrintStream.printf(Locale.FRENCH, "%f", 3.1417d);
+        assertEquals("3,141700", this.writerOutputStream.getOutput());
+    }
+    
+    @Test
+    public void println() {
+        delegatingPrintStream.println();
+        assertEquals(LINE_SEPARATOR, this.writerOutputStream.getOutput());
+    }
+    
+    @Test
+    public void printlnBoolean() {
+        delegatingPrintStream.println(true);
+        assertEquals("true" + LINE_SEPARATOR, this.writerOutputStream.getOutput());
+    }
+    
+    @Test
+    public void printlnChar() {
+        delegatingPrintStream.println('a');
+        assertEquals("a" + LINE_SEPARATOR, this.writerOutputStream.getOutput());
+    }
+    
+    @Test
+    public void printlnCharArray() {
+        delegatingPrintStream.println(new char[] {'a', 'b', 'c'});
+        assertEquals("abc" + LINE_SEPARATOR, this.writerOutputStream.getOutput());
+    }
+    
+    @Test
+    public void printlnDouble() {
+        delegatingPrintStream.println(3.1d);
+        assertEquals("3.1" + LINE_SEPARATOR, this.writerOutputStream.getOutput());
+    }
+    
+    @Test
+    public void printlnFloat() {
+        delegatingPrintStream.println(3.1f);
+        assertEquals("3.1" + LINE_SEPARATOR, this.writerOutputStream.getOutput());
+    }
+    
+    @Test
+    public void printlnInt() {
+        delegatingPrintStream.println(3);
+        assertEquals("3" + LINE_SEPARATOR, this.writerOutputStream.getOutput());
+    }
+    
+    @Test
+    public void printlnLong() {
+        delegatingPrintStream.println(12345678901234567L);
+        assertEquals("12345678901234567" + LINE_SEPARATOR, this.writerOutputStream.getOutput());
+    }
+    
+    @Test
+    public void printlnObject() {
+        delegatingPrintStream.println(new Integer(345));
+        assertEquals("345" + LINE_SEPARATOR, this.writerOutputStream.getOutput());
+    }
+    
+    @Test
+    public void printlnString() {
+        delegatingPrintStream.println("hello");
+        assertEquals("hello" + LINE_SEPARATOR, this.writerOutputStream.getOutput());
+    }
+    
+    @Test
+    public void write() {
+        delegatingPrintStream.write('a');
+        assertEquals("a", this.writerOutputStream.getOutput());
+    }
+    
+    @Test
+    public void writeByteArray() throws IOException {
+        delegatingPrintStream.write(new byte[] {'a', 'b', 'c'});
+        assertEquals("abc", this.writerOutputStream.getOutput());
+    }
+    
+    @Test
+    public void writeByteArraySegment() {
+        delegatingPrintStream.write(new byte[] {'a', 'b', 'c'}, 1, 2);
+        assertEquals("bc", this.writerOutputStream.getOutput());
+    }
+    
+    @Test
+    public void setDelegate() {
+        delegatingPrintStream.print("hello");
+        assertEquals("hello", this.writerOutputStream.getOutput());
+        
+        delegatingPrintStream.setDelegate(null);
+        delegatingPrintStream.print("hello");
+        assertEquals("hello", this.writerOutputStream.getOutput());
+        
+        delegatingPrintStream.setDelegate(new PrintStream(this.writerOutputStream));
+        delegatingPrintStream.print("hello");
+        assertEquals("hellohello", this.writerOutputStream.getOutput());
+    }
+    
+    private static final class WriterOutputStream extends OutputStream {        
+        private final StringWriter writer = new StringWriter();
+
+        @Override
+        public void write(int b) throws IOException {
+            writer.write(b);
+        }        
+        
+        public String getOutput() {
+            return this.writer.toString();
+        }
+    }
+}
+
diff --git a/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/log/impl/TeeLoggingPrintStreamWrapperTests.java b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/log/impl/TeeLoggingPrintStreamWrapperTests.java
new file mode 100644
index 0000000..3f89d9f
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/log/impl/TeeLoggingPrintStreamWrapperTests.java
@@ -0,0 +1,203 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log.impl;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.junit.Assert.assertEquals;
+
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Locale;
+
+import org.eclipse.virgo.medic.impl.config.ConfigurationChangeListener;
+import org.eclipse.virgo.medic.impl.config.ConfigurationProvider;
+import org.junit.Before;
+import org.junit.Test;
+
+import ch.qos.logback.classic.Logger;
+import ch.qos.logback.classic.spi.LoggingEvent;
+
+public class TeeLoggingPrintStreamWrapperTests {
+
+    private PrintStream teeWrapper;
+
+    @Test
+    public void test() {
+        produceOutput(this.teeWrapper);
+
+        List<LoggingEvent> loggingEvents = CapturingAppender.getAndResetLoggingEvents();
+        assertEquals(22, loggingEvents.size());
+
+        assertEquals("abcdefghij", loggingEvents.get(0).getMessage());
+        assertEquals("Three strings", loggingEvents.get(1).getMessage());
+        assertEquals("last one on a new line.", loggingEvents.get(2).getMessage());
+        assertEquals("3,1416", loggingEvents.get(3).getMessage());
+        assertEquals("trueklm", loggingEvents.get(4).getMessage());
+        assertEquals("a123.0456.078910toString", loggingEvents.get(5).getMessage());
+        assertEquals("abcdThree strings", loggingEvents.get(6).getMessage());
+        assertEquals("last one on a new line.", loggingEvents.get(7).getMessage());
+        assertEquals("3,1416", loggingEvents.get(8).getMessage());
+        assertEquals("false", loggingEvents.get(9).getMessage());
+        assertEquals("b", loggingEvents.get(10).getMessage());
+        assertEquals("", loggingEvents.get(11).getMessage());
+        assertEquals("", loggingEvents.get(12).getMessage());
+        assertEquals("abc", loggingEvents.get(13).getMessage());
+        assertEquals("de", loggingEvents.get(14).getMessage());
+        assertEquals("123.0", loggingEvents.get(15).getMessage());
+        assertEquals("456.0", loggingEvents.get(16).getMessage());
+        assertEquals("789", loggingEvents.get(17).getMessage());
+        assertEquals("101112", loggingEvents.get(18).getMessage());
+        assertEquals("toString", loggingEvents.get(19).getMessage());
+        assertEquals("A string with a", loggingEvents.get(20).getMessage());
+        assertEquals("new line in it.", loggingEvents.get(21).getMessage());
+    }
+
+    @Test
+    public void testOutputWithinLoggingCode() {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        PrintStream printStream = new PrintStream(baos);
+        PrintStream decorator = new TeeLoggingPrintStreamWrapper(printStream, getClass().getName(), new ExecutionStackAccessor() {
+
+            public Class<?>[] getExecutionStack() {
+                return new Class[] { Logger.class };
+            }
+        }, new StubConfigurationProvider(), "theProperty");
+
+        produceOutput(decorator);
+
+        List<LoggingEvent> loggingEvents = CapturingAppender.getAndResetLoggingEvents();
+        assertEquals(0, loggingEvents.size());
+    }
+
+    private void produceOutput(PrintStream printStream) {
+        printStream.append('a');
+        printStream.append("bcd");
+        printStream.append("abcdefghij", 4, 10);
+        printStream.println();
+        printStream.format("%s %s%n%s%n", "Three", "strings", "last one on a new line.");
+        printStream.format(Locale.FRANCE, "%.4f%n", Math.PI);
+        printStream.print(true);
+        printStream.print('k');
+        printStream.print(new char[] { 'l', 'm', '\r', 'a' });
+        printStream.print(123d);
+        printStream.print(456f);
+        printStream.print(7);
+        printStream.print(8910l);
+        printStream.print(new Object() {
+
+            @Override
+            public String toString() {
+                return "toString";
+            }
+        });
+        printStream.append('\n');
+        printStream.print("abcd");
+        printStream.printf("%s %s%n%s%n", "Three", "strings", "last one on a new line.");
+        printStream.printf(Locale.FRANCE, "%.4f%n", Math.PI);
+        printStream.println(false);
+        printStream.println('b');
+        printStream.println('\n');
+        printStream.println(new char[] { 'a', 'b', 'c', '\n', 'd', 'e' });
+        printStream.println(123d);
+        printStream.println(456f);
+        printStream.println(789);
+        printStream.println(101112l);
+        printStream.println(new Object() {
+
+            @Override
+            public String toString() {
+                return "toString";
+            }
+        });
+        printStream.println("A string with a\nnew line in it.");
+    }
+
+    @Test
+    public void testByteArrayHandling() {
+        String string = "Some text to be turned into bytes.";
+        String stringWithNewLine = string + "\n";
+        byte[] stringBytes = stringWithNewLine.getBytes(UTF_8);
+
+        teeWrapper.write(stringBytes, 0, stringBytes.length);
+
+        List<LoggingEvent> loggingEvents = CapturingAppender.getAndResetLoggingEvents();
+        assertEquals(1, loggingEvents.size());
+
+        assertEquals("Some text to be turned into bytes.", loggingEvents.get(0).getMessage());
+    }
+
+    @Test
+    public void testSingleByteHandling() {
+        String string = "Some text to be turned into bytes.";
+        byte[] stringBytes = string.getBytes(UTF_8);
+
+        for (byte b : stringBytes) {
+            teeWrapper.write(b);
+        }
+        teeWrapper.println();
+
+        List<LoggingEvent> loggingEvents = CapturingAppender.getAndResetLoggingEvents();
+        assertEquals(1, loggingEvents.size());
+
+        assertEquals("Some text to be turned into bytes.", loggingEvents.get(0).getMessage());
+    }
+
+    @Test
+    public void testPrintNullString() {
+
+        String imNull = null;
+
+        teeWrapper.println(imNull);
+        teeWrapper.print(imNull);
+        teeWrapper.println();
+
+        List<LoggingEvent> loggingEvents = CapturingAppender.getAndResetLoggingEvents();
+        assertEquals(2, loggingEvents.size());
+
+        assertEquals("null", loggingEvents.get(0).getMessage());
+        assertEquals("null", loggingEvents.get(1).getMessage());
+    }
+
+    @Before
+    public void createDecorator() {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        PrintStream printStream = new PrintStream(baos);
+        this.teeWrapper = new TeeLoggingPrintStreamWrapper(printStream, getClass().getName(), new SecurityManagerExecutionStackAccessor(),
+            new StubConfigurationProvider(), "theProperty");
+    }
+
+    private static final class StubConfigurationProvider implements ConfigurationProvider {
+
+        private final Hashtable<String, Object> configuration;
+
+        private StubConfigurationProvider() {
+            this.configuration = new Hashtable<String, Object>();
+            this.configuration.put("theProperty", "tee");
+        }
+
+        public Dictionary<String, Object> getConfiguration() {
+            return this.configuration;
+        }
+
+        public void addChangeListener(ConfigurationChangeListener listener) {
+            throw new UnsupportedOperationException();
+        }
+
+        public boolean removeChangeListener(ConfigurationChangeListener listener) {
+            throw new UnsupportedOperationException();
+        }
+
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/log/impl/config/BundleResourceConfigurationLocatorTests.java b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/log/impl/config/BundleResourceConfigurationLocatorTests.java
new file mode 100644
index 0000000..c0fceac
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/log/impl/config/BundleResourceConfigurationLocatorTests.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log.impl.config;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.junit.Test;
+import org.osgi.framework.Version;
+
+import org.eclipse.virgo.medic.log.LoggingConfiguration;
+import org.eclipse.virgo.medic.log.impl.config.BundleResourceConfigurationLocator;
+import org.eclipse.virgo.test.stubs.framework.StubBundle;
+
+public class BundleResourceConfigurationLocatorTests {
+
+    private final BundleResourceConfigurationLocator locator = new BundleResourceConfigurationLocator();
+
+    private final StubBundle bundle = new StubBundle("foo", new Version(1, 2, 3));
+
+    @Test
+    public void configFromBundle() throws MalformedURLException {
+        this.bundle.addResource("logback.xml", new URL("file:src/test/resources/logback.xml"));
+        LoggingConfiguration configuration = this.locator.locateConfiguration(this.bundle);
+        assertNotNull(configuration);
+        assertEquals("foo_1.2.3", configuration.getName());
+    }
+
+    @Test
+    public void defaultConfigFromBundle() throws MalformedURLException {
+        this.bundle.addResource("logback-default.xml", new URL("file:src/test/resources/logback.xml"));
+        LoggingConfiguration configuration = this.locator.locateConfiguration(this.bundle);
+        assertNotNull(configuration);
+        assertEquals("foo_1.2.3", configuration.getName());
+    }
+
+    @Test
+    public void noConfigInBundle() {
+        LoggingConfiguration configuration = this.locator.locateConfiguration(this.bundle);
+        assertNull(configuration);
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/log/impl/config/CompositeConfigurationLocatorTests.java b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/log/impl/config/CompositeConfigurationLocatorTests.java
new file mode 100644
index 0000000..3dc5207
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/log/impl/config/CompositeConfigurationLocatorTests.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log.impl.config;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+import org.eclipse.virgo.medic.log.LoggingConfiguration;
+import org.eclipse.virgo.medic.log.impl.config.CompositeConfigurationLocator;
+import org.eclipse.virgo.medic.log.impl.config.ConfigurationLocator;
+import org.eclipse.virgo.test.stubs.framework.StubBundle;
+
+public class CompositeConfigurationLocatorTests {
+
+    @Test
+    public void configurationFromFirstLocator() {
+        ConfigurationLocator locator1 = createMock(ConfigurationLocator.class);
+        ConfigurationLocator locator2 = createMock(ConfigurationLocator.class);
+
+        ConfigurationLocator compositeLocator = new CompositeConfigurationLocator(locator1, locator2);
+
+        StubBundle bundle = new StubBundle();
+
+        LoggingConfiguration loggingConfiguration = createMock(LoggingConfiguration.class);
+
+        expect(locator1.locateConfiguration(bundle)).andReturn(loggingConfiguration);
+        replay(locator1, locator2);
+
+        assertEquals(loggingConfiguration, compositeLocator.locateConfiguration(bundle));
+
+        verify(locator1, locator2);
+    }
+
+    @Test
+    public void configurationFromSubsequentLocator() {
+        ConfigurationLocator locator1 = createMock(ConfigurationLocator.class);
+        ConfigurationLocator locator2 = createMock(ConfigurationLocator.class);
+
+        ConfigurationLocator compositeLocator = new CompositeConfigurationLocator(locator1, locator2);
+
+        StubBundle bundle = new StubBundle();
+
+        LoggingConfiguration loggingConfiguration = createMock(LoggingConfiguration.class);
+
+        expect(locator1.locateConfiguration(bundle)).andReturn(null);
+        expect(locator2.locateConfiguration(bundle)).andReturn(loggingConfiguration);
+        replay(locator1, locator2);
+
+        assertEquals(loggingConfiguration, compositeLocator.locateConfiguration(bundle));
+
+        verify(locator1, locator2);
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/log/impl/config/ServiceRegistryConfigurationLocatorTests.java b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/log/impl/config/ServiceRegistryConfigurationLocatorTests.java
new file mode 100644
index 0000000..b704f4b
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/log/impl/config/ServiceRegistryConfigurationLocatorTests.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log.impl.config;
+
+import static org.easymock.EasyMock.createMock;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.Map;
+import java.util.TreeMap;
+
+import org.junit.Test;
+
+import org.eclipse.virgo.medic.log.LoggingConfiguration;
+import org.eclipse.virgo.medic.log.impl.config.ServiceRegistryConfigurationLocator;
+import org.eclipse.virgo.test.stubs.framework.StubBundle;
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+import org.eclipse.virgo.test.stubs.support.FalseFilter;
+import org.eclipse.virgo.test.stubs.support.PropertiesFilter;
+
+public class ServiceRegistryConfigurationLocatorTests {
+
+    private final StubBundle bundle = new StubBundle();
+
+    private final StubBundleContext bundleContext = new StubBundleContext();
+
+    private final ServiceRegistryConfigurationLocator locator = new ServiceRegistryConfigurationLocator(this.bundleContext);
+
+    @Test
+    public void noConfigurationInServiceRegistry() {
+        this.bundle.addHeader("Medic-LoggingConfiguration", "foo");
+        this.bundleContext.addFilter(new FalseFilter("(org.eclipse.virgo.medic.log.configuration.id=foo)"));
+        LoggingConfiguration configuration = this.locator.locateConfiguration(this.bundle);
+        assertNull(configuration);
+    }
+
+    @Test
+    public void singleConfigurationInServiceRegistry() {
+        this.bundle.addHeader("Medic-LoggingConfiguration", "foo");
+        LoggingConfiguration loggingConfiguration = createMock(LoggingConfiguration.class);
+        this.bundleContext.addFilter(new PropertiesFilter(getDefaultMap()));
+        this.bundleContext.registerService(LoggingConfiguration.class, loggingConfiguration, getDefaultDictionary());
+        LoggingConfiguration configuration = this.locator.locateConfiguration(this.bundle);
+        assertEquals(loggingConfiguration, configuration);
+    }
+
+    @Test
+    public void multipleConfigurationsInServiceRegistry() {
+        this.bundle.addHeader("Medic-LoggingConfiguration", "foo");
+        LoggingConfiguration loggingConfiguration = createMock(LoggingConfiguration.class);
+        this.bundleContext.addFilter(new PropertiesFilter(getDefaultMap()));
+        this.bundleContext.registerService(LoggingConfiguration.class.getName(), loggingConfiguration, getDefaultDictionary());
+        this.bundleContext.registerService(LoggingConfiguration.class.getName(), loggingConfiguration, getDefaultDictionary());
+        this.bundleContext.registerService(LoggingConfiguration.class.getName(), loggingConfiguration, getDefaultDictionary());
+        LoggingConfiguration configuration = this.locator.locateConfiguration(this.bundle);
+        assertEquals(loggingConfiguration, configuration);
+    }
+
+    @Test
+    public void noHeaderInManifest() {
+        this.locator.locateConfiguration(this.bundle);
+    }
+
+    private Dictionary<String,String> getDefaultDictionary() {
+        Dictionary<String,String> properties = new Hashtable<String,String>();
+        properties.put("org.eclipse.virgo.medic.log.configuration.id", "foo");
+        return properties;
+    }
+
+    private Map<String, Object> getDefaultMap() {
+        Map<String, Object> properties = new TreeMap<String, Object>();
+        properties.put("org.eclipse.virgo.medic.log.configuration.id", "foo");
+        return properties;
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/log/impl/config/StandardLoggingConfigurationPublisherTests.java b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/log/impl/config/StandardLoggingConfigurationPublisherTests.java
new file mode 100644
index 0000000..b5168cb
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/log/impl/config/StandardLoggingConfigurationPublisherTests.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log.impl.config;
+
+import java.io.File;
+
+import org.junit.Test;
+
+import org.eclipse.virgo.medic.log.ConfigurationPublicationFailedException;
+import org.eclipse.virgo.medic.log.LoggingConfigurationPublisher;
+import org.eclipse.virgo.medic.log.impl.config.StandardLoggingConfigurationPublisher;
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+
+public class StandardLoggingConfigurationPublisherTests {
+
+    private final StubBundleContext bundleContext = new StubBundleContext();
+
+    private final LoggingConfigurationPublisher publisher = new StandardLoggingConfigurationPublisher(this.bundleContext);
+
+    @Test(expected = ConfigurationPublicationFailedException.class)
+    public void failedPublication() throws ConfigurationPublicationFailedException {
+        publisher.publishConfiguration(new File("does/not/exist"), "foo");
+    }
+
+    @Test
+    public void publication() throws ConfigurationPublicationFailedException {
+        this.publisher.publishConfiguration(new File("src/test/resources/logback.xml"), "foo");
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/log/impl/logback/JoranLoggerContextConfigurerTests.java b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/log/impl/logback/JoranLoggerContextConfigurerTests.java
new file mode 100644
index 0000000..d8009f1
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/log/impl/logback/JoranLoggerContextConfigurerTests.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log.impl.logback;
+
+import static org.junit.Assert.assertNotNull;
+
+import org.eclipse.virgo.medic.log.LoggingConfiguration;
+import org.eclipse.virgo.medic.log.impl.logback.JoranLoggerContextConfigurer;
+import org.eclipse.virgo.medic.log.impl.logback.LoggerContextConfigurationFailedException;
+import org.eclipse.virgo.medic.log.impl.logback.LoggerContextConfigurer;
+import org.junit.Test;
+
+import ch.qos.logback.classic.LoggerContext;
+
+
+public class JoranLoggerContextConfigurerTests {
+
+    private final LoggerContextConfigurer configurer = new JoranLoggerContextConfigurer();
+
+    @Test(expected = LoggerContextConfigurationFailedException.class)
+    public void malformedXML() throws LoggerContextConfigurationFailedException {
+        LoggingConfiguration configuration = new StubLoggingConfiguration("dslkjgw", "the-config");
+        configurer.applyConfiguration(configuration, new LoggerContext());
+    }
+
+    @Test(expected = LoggerContextConfigurationFailedException.class)
+    public void malformedConfiguration() throws LoggerContextConfigurationFailedException {
+        LoggingConfiguration configuration = new StubLoggingConfiguration("<configuration><appender/></configuration>", "the-config");
+        configurer.applyConfiguration(configuration, new LoggerContext());
+    }
+
+    @Test
+    public void validConfiguration() throws LoggerContextConfigurationFailedException {
+        LoggingConfiguration configuration = new StubLoggingConfiguration("<configuration><logger name=\"abc\"></logger></configuration>",
+            "the-config");
+        LoggerContext loggerContext = new LoggerContext();
+        configurer.applyConfiguration(configuration, loggerContext);
+        assertNotNull(loggerContext.getLogger("abc"));
+    }
+
+    private static final class StubLoggingConfiguration implements LoggingConfiguration {
+
+        private final String configuration;
+
+        private final String name;
+
+        private StubLoggingConfiguration(String configuration, String name) {
+            this.configuration = configuration;
+            this.name = name;
+        }
+
+        public String getConfiguration() {
+            return this.configuration;
+        }
+
+        public String getName() {
+            return this.name;
+        }
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/log/impl/logback/StandardContextSelectorTests.java b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/log/impl/logback/StandardContextSelectorTests.java
new file mode 100644
index 0000000..f00128e
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/log/impl/logback/StandardContextSelectorTests.java
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log.impl.logback;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.eq;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.isA;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+
+import java.util.List;
+
+import org.junit.Test;
+
+import ch.qos.logback.classic.LoggerContext;
+
+
+import org.eclipse.virgo.medic.log.LoggingConfiguration;
+import org.eclipse.virgo.medic.log.impl.CallingBundleResolver;
+import org.eclipse.virgo.medic.log.impl.config.ConfigurationLocator;
+import org.eclipse.virgo.medic.log.impl.logback.LoggerContextConfigurationFailedException;
+import org.eclipse.virgo.medic.log.impl.logback.LoggerContextConfigurer;
+import org.eclipse.virgo.medic.log.impl.logback.StandardContextSelectorDelegate;
+import org.eclipse.virgo.test.stubs.framework.StubBundle;
+
+public class StandardContextSelectorTests {
+
+    private CallingBundleResolver loggingCallerLocator = createMock(CallingBundleResolver.class);
+
+    private ConfigurationLocator configurationLocator = createMock(ConfigurationLocator.class);
+
+    private StubBundle bundle = new StubBundle();
+
+    private LoggerContextConfigurer loggerContextConfigurer = createMock(LoggerContextConfigurer.class);
+
+    private StandardContextSelectorDelegate contextSelectorDelegate = new StandardContextSelectorDelegate(this.loggingCallerLocator,
+        this.configurationLocator, this.bundle, this.loggerContextConfigurer);
+
+    @Test
+    public void loggerContextWithLocatedConfiguration() throws LoggerContextConfigurationFailedException {
+        LoggingConfiguration loggingConfiguration = createMock(LoggingConfiguration.class);
+        expect(loggingConfiguration.getName()).andReturn("the-configuration").atLeastOnce();
+        expect(this.loggingCallerLocator.getCallingBundle()).andReturn(this.bundle).times(2);
+        expect(this.configurationLocator.locateConfiguration(this.bundle)).andReturn(loggingConfiguration).times(1);
+        this.loggerContextConfigurer.applyConfiguration(eq(loggingConfiguration), isA(LoggerContext.class));
+        replay(this.configurationLocator, this.loggingCallerLocator, this.loggerContextConfigurer, loggingConfiguration);
+
+        LoggerContext loggerContext = this.contextSelectorDelegate.getLoggerContext();
+        assertEquals("the-configuration", loggerContext.getName());
+
+        LoggerContext reusedLoggerContext = this.contextSelectorDelegate.getLoggerContext();
+        assertEquals("the-configuration", reusedLoggerContext.getName());
+
+        assertSame(loggerContext, reusedLoggerContext);
+
+        List<String> contextNames = this.contextSelectorDelegate.getContextNames();
+        assertEquals(1, contextNames.size());
+        assertEquals("the-configuration", contextNames.get(0));
+
+        loggerContext = this.contextSelectorDelegate.getLoggerContext("the-configuration");
+        assertNotNull(loggerContext);
+        assertEquals("the-configuration", loggerContext.getName());
+
+        verify(this.configurationLocator, this.loggingCallerLocator, this.loggerContextConfigurer, loggingConfiguration);
+    }
+
+    @Test
+    public void loggerContextWithNoLocatedConfiguration() {
+        expect(this.loggingCallerLocator.getCallingBundle()).andReturn(this.bundle);
+        expect(this.configurationLocator.locateConfiguration(this.bundle)).andReturn(null);
+        replay(this.configurationLocator, this.loggingCallerLocator);
+
+        LoggerContext loggerContext = this.contextSelectorDelegate.getLoggerContext();
+        assertNull(loggerContext);
+        verify(this.configurationLocator, this.loggingCallerLocator);
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/log/logback/DelegatingContextSelectorTests.java b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/log/logback/DelegatingContextSelectorTests.java
new file mode 100644
index 0000000..60f4755
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/log/logback/DelegatingContextSelectorTests.java
@@ -0,0 +1,135 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log.logback;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import java.lang.reflect.Field;
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.virgo.medic.log.impl.logback.ContextSelectorDelegate;
+import org.eclipse.virgo.medic.log.logback.DelegatingContextSelector;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import ch.qos.logback.classic.LoggerContext;
+
+public class DelegatingContextSelectorTests {
+
+    private final ContextSelectorDelegate delegate = createMock(ContextSelectorDelegate.class);
+
+    private final LoggerContext loggerContext = new LoggerContext();
+
+    private DelegatingContextSelector delegatingContextSelector;
+
+    @Before
+    public void resetDefaultContextConfiguredFlag() throws IllegalArgumentException, IllegalAccessException, SecurityException, NoSuchFieldException {
+        Field field = DelegatingContextSelector.class.getDeclaredField("defaultContextConfigured");
+        field.setAccessible(true);
+        field.setBoolean(null, false);
+    }
+
+    @After
+    public void cleanup() {
+        DelegatingContextSelector.setDelegate(null);
+    }
+
+    @Test
+    public void detachLoggerContext() {
+        LoggerContext detachedContext = new LoggerContext();
+
+        expect(this.delegate.detachLoggerContext("foo")).andReturn(detachedContext);
+        expect(this.delegate.detachLoggerContext("foo")).andReturn(null);
+        this.delegate.configureDefaultContext(this.loggerContext);
+
+        replay(this.delegate);
+
+        this.delegatingContextSelector = new DelegatingContextSelector(this.loggerContext);
+        DelegatingContextSelector.setDelegate(this.delegate);
+
+        assertEquals(detachedContext, this.delegatingContextSelector.detachLoggerContext("foo"));
+        assertNull(this.delegatingContextSelector.detachLoggerContext("foo"));
+
+        verify(this.delegate);
+    }
+
+    @Test
+    public void getContextNames() {
+        List<String> contextNames = Arrays.asList("a", "b", "c");
+
+        expect(this.delegate.getContextNames()).andReturn(contextNames);
+        this.delegate.configureDefaultContext(this.loggerContext);
+
+        replay(this.delegate);
+
+        this.delegatingContextSelector = new DelegatingContextSelector(this.loggerContext);
+        DelegatingContextSelector.setDelegate(this.delegate);
+
+        assertEquals(contextNames, this.delegatingContextSelector.getContextNames());
+
+        verify(this.delegate);
+    }
+
+    @Test
+    public void getDefaultLoggerContext() {
+        this.delegate.configureDefaultContext(this.loggerContext);
+        replay(this.delegate);
+
+        this.delegatingContextSelector = new DelegatingContextSelector(this.loggerContext);
+        DelegatingContextSelector.setDelegate(this.delegate);
+
+        verify(this.delegate);
+
+        assertEquals(this.loggerContext, this.delegatingContextSelector.getDefaultLoggerContext());
+    }
+
+    @Test
+    public void getLoggerContext() {
+        LoggerContext context = new LoggerContext();
+
+        expect(this.delegate.getLoggerContext()).andReturn(context);
+        this.delegate.configureDefaultContext(this.loggerContext);
+
+        replay(this.delegate);
+
+        this.delegatingContextSelector = new DelegatingContextSelector(this.loggerContext);
+        DelegatingContextSelector.setDelegate(this.delegate);
+
+        assertEquals(context, this.delegatingContextSelector.getLoggerContext());
+
+        verify(this.delegate);
+    }
+
+    @Test
+    public void getNamedLoggerContext() {
+        LoggerContext context = new LoggerContext();
+
+        expect(this.delegate.getLoggerContext("foo")).andReturn(context);
+        this.delegate.configureDefaultContext(this.loggerContext);
+
+        replay(this.delegate);
+
+        this.delegatingContextSelector = new DelegatingContextSelector(this.loggerContext);
+        DelegatingContextSelector.setDelegate(this.delegate);
+
+        assertEquals(context, this.delegatingContextSelector.getLoggerContext("foo"));
+
+        verify(this.delegate);
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/log/osgi/OSGiLogServiceListenerTests.java b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/log/osgi/OSGiLogServiceListenerTests.java
new file mode 100644
index 0000000..d9f448f
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/log/osgi/OSGiLogServiceListenerTests.java
@@ -0,0 +1,308 @@
+/*
+ * This file is part of the Eclipse Virgo project.
+ *
+ * Copyright (c) 2011 copyright_holder
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    cgfrost - initial contribution
+ */
+
+package org.eclipse.virgo.medic.log.osgi;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expectLastCall;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+
+import org.eclipse.virgo.test.stubs.framework.StubBundle;
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+import org.eclipse.virgo.test.stubs.framework.StubServiceReference;
+import org.eclipse.virgo.test.stubs.framework.StubServiceRegistration;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.Version;
+import org.osgi.service.log.LogEntry;
+import org.osgi.service.log.LogService;
+import org.slf4j.Logger;
+
+/**
+ * 
+ *  OSGiLogServiceImplTests
+ */
+public class OSGiLogServiceListenerTests {
+
+    private static final String TEST_MESSAGE = "Danger Will Robinson, Danger!!!";
+    
+    private static final StubBundle BUNDLE = new StubBundle("org.eclipse.virgo.not.here", Version.emptyVersion);
+    
+    private static final ServiceReference<Object> SERVICE_REF = new StubServiceReference<Object>(3l, 3, new StubServiceRegistration<Object>(new StubBundleContext(BUNDLE), "org.eclipse.virgo.not.here"));
+
+    private static final String SERVICE_PREFIX = "Service 3, ";
+    
+    private static final String BUNDLE_PREFIX = "Bundle org.eclipse.virgo.not.here_0.0.0, ";
+    
+    private static final String INVALID_PREFIX = "Log Message of unknown severity 99: ";
+    
+    private static final Throwable FAIL = new Throwable("Got lost in space");
+    
+    private OSGiLogServiceListener osgiLogListener;
+
+    private Logger logService;
+    
+    /**
+     * @throws java.lang.Exception
+     */
+    @Before
+    public void setUp() throws Exception {
+        this.logService = createMock(Logger.class);
+        this.osgiLogListener = new OSGiLogServiceListener(this.logService);
+    }
+    
+    @After
+    public void setDown() {
+        verify(this.logService);
+    }
+    
+    @Test
+    public void testDebugLog() {
+        this.logService.debug(TEST_MESSAGE);
+        expectLastCall().once();
+        replay(this.logService);
+        this.osgiLogListener.logged(buildLogEntry(null, null, LogService.LOG_DEBUG, TEST_MESSAGE, null));
+    }
+
+    @Test
+    public void testDebugLogThrowable() {
+        this.logService.debug(TEST_MESSAGE, FAIL);
+        expectLastCall().once();
+        replay(this.logService);
+        this.osgiLogListener.logged(buildLogEntry(null, null, LogService.LOG_DEBUG, TEST_MESSAGE, FAIL));
+    }
+
+    @Test
+    public void testDebugLogServiceReference() {
+        this.logService.debug(SERVICE_PREFIX +TEST_MESSAGE);
+        expectLastCall().once();
+        replay(this.logService);
+        this.osgiLogListener.logged(buildLogEntry(SERVICE_REF, null, LogService.LOG_DEBUG, TEST_MESSAGE, null));
+    }
+
+    @Test
+    public void testDebugLogBundle() {
+        this.logService.debug(BUNDLE_PREFIX + TEST_MESSAGE);
+        expectLastCall().once();
+        replay(this.logService);
+        this.osgiLogListener.logged(buildLogEntry(null, BUNDLE, LogService.LOG_DEBUG, TEST_MESSAGE, null));
+    }
+
+    @Test
+    public void testDebugLogServiceReferenceThrowableBundle() {
+        this.logService.debug(BUNDLE_PREFIX + SERVICE_PREFIX + TEST_MESSAGE, FAIL);
+        expectLastCall().once();
+        replay(this.logService);
+        this.osgiLogListener.logged(buildLogEntry(SERVICE_REF, BUNDLE, LogService.LOG_DEBUG, TEST_MESSAGE, FAIL));
+    }
+    
+    @Test
+    public void testInfoLog() {
+        this.logService.info(TEST_MESSAGE);
+        expectLastCall().once();
+        replay(this.logService);
+        this.osgiLogListener.logged(buildLogEntry(null, null, LogService.LOG_INFO, TEST_MESSAGE, null));
+    }
+
+    @Test
+    public void testInfoLogThrowable() {
+        this.logService.info(TEST_MESSAGE, FAIL);
+        expectLastCall().once();
+        replay(this.logService);
+        this.osgiLogListener.logged(buildLogEntry(null, null, LogService.LOG_INFO, TEST_MESSAGE, FAIL));
+    }
+
+    @Test
+    public void testInfoLogServiceReference() {
+        this.logService.info(SERVICE_PREFIX +TEST_MESSAGE);
+        expectLastCall().once();
+        replay(this.logService);
+        this.osgiLogListener.logged(buildLogEntry(SERVICE_REF, null, LogService.LOG_INFO, TEST_MESSAGE, null));
+    }
+
+    @Test
+    public void testInfoLogBundle() {
+        this.logService.info(BUNDLE_PREFIX + TEST_MESSAGE);
+        expectLastCall().once();
+        replay(this.logService);
+        this.osgiLogListener.logged(buildLogEntry(null, BUNDLE, LogService.LOG_INFO, TEST_MESSAGE, null));
+    }
+
+    @Test
+    public void testInfoLogServiceReferenceThrowableBundle() {
+        this.logService.info(BUNDLE_PREFIX + SERVICE_PREFIX + TEST_MESSAGE, FAIL);
+        expectLastCall().once();
+        replay(this.logService);
+        this.osgiLogListener.logged(buildLogEntry(SERVICE_REF, BUNDLE, LogService.LOG_INFO, TEST_MESSAGE, FAIL));
+    }
+
+    @Test
+    public void testWarningLog() {
+        this.logService.warn(TEST_MESSAGE);
+        expectLastCall().once();
+        replay(this.logService);
+        this.osgiLogListener.logged(buildLogEntry(null, null, LogService.LOG_WARNING, TEST_MESSAGE, null));
+    }
+
+    @Test
+    public void testWarningLogThrowable() {
+        this.logService.warn(TEST_MESSAGE, FAIL);
+        expectLastCall().once();
+        replay(this.logService);
+        this.osgiLogListener.logged(buildLogEntry(null, null, LogService.LOG_WARNING, TEST_MESSAGE, FAIL));
+    }
+
+    @Test
+    public void testWarningLogServiceReference() {
+        this.logService.warn(SERVICE_PREFIX +TEST_MESSAGE);
+        expectLastCall().once();
+        replay(this.logService);
+        this.osgiLogListener.logged(buildLogEntry(SERVICE_REF, null, LogService.LOG_WARNING, TEST_MESSAGE, null));
+    }
+
+    @Test
+    public void testWarningLogBundle() {
+        this.logService.warn(BUNDLE_PREFIX + TEST_MESSAGE);
+        expectLastCall().once();
+        replay(this.logService);
+        this.osgiLogListener.logged(buildLogEntry(null, BUNDLE, LogService.LOG_WARNING, TEST_MESSAGE, null));
+    }
+
+    @Test
+    public void testWarningLogServiceReferenceThrowableBundle() {
+        this.logService.warn(BUNDLE_PREFIX + SERVICE_PREFIX + TEST_MESSAGE, FAIL);
+        expectLastCall().once();
+        replay(this.logService);
+        this.osgiLogListener.logged(buildLogEntry(SERVICE_REF, BUNDLE, LogService.LOG_WARNING, TEST_MESSAGE, FAIL));
+    }
+
+    @Test
+    public void testErrorLog() {
+        this.logService.error(TEST_MESSAGE);
+        expectLastCall().once();
+        replay(this.logService);
+        this.osgiLogListener.logged(buildLogEntry(null, null, LogService.LOG_ERROR, TEST_MESSAGE, null));
+    }
+
+    @Test
+    public void testErrorLogThrowable() {
+        this.logService.error(TEST_MESSAGE, FAIL);
+        expectLastCall().once();
+        replay(this.logService);
+        this.osgiLogListener.logged(buildLogEntry(null, null, LogService.LOG_ERROR, TEST_MESSAGE, FAIL));
+    }
+
+    @Test
+    public void testErrorLogServiceReference() {
+        this.logService.error(SERVICE_PREFIX +TEST_MESSAGE);
+        expectLastCall().once();
+        replay(this.logService);
+        this.osgiLogListener.logged(buildLogEntry(SERVICE_REF, null, LogService.LOG_ERROR, TEST_MESSAGE, null));
+    }
+
+    @Test
+    public void testErrorLogBundle() {
+        this.logService.error(BUNDLE_PREFIX + TEST_MESSAGE);
+        expectLastCall().once();
+        replay(this.logService);
+        this.osgiLogListener.logged(buildLogEntry(null, BUNDLE, LogService.LOG_ERROR, TEST_MESSAGE, null));
+    }
+
+    @Test
+    public void testErrorLogServiceReferenceThrowableBundle() {
+        this.logService.error(BUNDLE_PREFIX + SERVICE_PREFIX + TEST_MESSAGE, FAIL);
+        expectLastCall().once();
+        replay(this.logService);
+        this.osgiLogListener.logged(buildLogEntry(SERVICE_REF, BUNDLE, LogService.LOG_ERROR, TEST_MESSAGE, FAIL));
+    }
+
+    @Test
+    public void testInvalidLog() {
+        this.logService.error(INVALID_PREFIX + TEST_MESSAGE);
+        expectLastCall().once();
+        replay(this.logService);
+        this.osgiLogListener.logged(buildLogEntry(null, null, 99, TEST_MESSAGE, null));
+    }
+
+    @Test
+    public void testInvalidLogThrowable() {
+        this.logService.error(INVALID_PREFIX + TEST_MESSAGE, FAIL);
+        expectLastCall().once();
+        replay(this.logService);
+        this.osgiLogListener.logged(buildLogEntry(null, null, 99, TEST_MESSAGE, FAIL));
+    }
+
+    @Test
+    public void testInvalidLogServiceReference() {
+        this.logService.error(INVALID_PREFIX + SERVICE_PREFIX +TEST_MESSAGE);
+        expectLastCall().once();
+        replay(this.logService);
+        this.osgiLogListener.logged(buildLogEntry(SERVICE_REF, null, 99, TEST_MESSAGE, null));
+    }
+
+    @Test
+    public void testInvalidLogBundle() {
+        this.logService.error(INVALID_PREFIX + BUNDLE_PREFIX + TEST_MESSAGE);
+        expectLastCall().once();
+        replay(this.logService);
+        this.osgiLogListener.logged(buildLogEntry(null, BUNDLE, 99, TEST_MESSAGE, null));
+    }
+
+    @Test
+    public void testInvalidLogServiceReferenceThrowableBundle() {
+        this.logService.error(INVALID_PREFIX + BUNDLE_PREFIX + SERVICE_PREFIX + TEST_MESSAGE, FAIL);
+        expectLastCall().once();
+        replay(this.logService);
+        this.osgiLogListener.logged(buildLogEntry(SERVICE_REF, BUNDLE, 99, TEST_MESSAGE, FAIL));
+    }
+    
+    private LogEntry buildLogEntry(final ServiceReference<Object> ref, final Bundle bundle, final int level, final String message, final Throwable fail){
+    	return new LogEntry() {
+			
+			@Override
+			public long getTime() {
+				return 0;
+			}
+			
+			@Override
+			public ServiceReference<?> getServiceReference() {
+				return ref;
+			}
+			
+			@Override
+			public String getMessage() {
+				return message;
+			}
+			
+			@Override
+			public int getLevel() {
+				return level;
+			}
+			
+			@Override
+			public Throwable getException() {
+				return fail;
+			}
+			
+			@Override
+			public Bundle getBundle() {
+				return bundle;
+			}
+		};
+    }
+
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/management/FileSystemDumpInspectorTests.java b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/management/FileSystemDumpInspectorTests.java
new file mode 100644
index 0000000..bf2dde3
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/test/java/org/eclipse/virgo/medic/management/FileSystemDumpInspectorTests.java
@@ -0,0 +1,104 @@
+package org.eclipse.virgo.medic.management;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expectLastCall;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertArrayEquals;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Dictionary;
+import java.util.Hashtable;
+
+import org.eclipse.virgo.medic.dump.DumpGenerator;
+import org.eclipse.virgo.medic.impl.config.ConfigurationChangeListener;
+import org.eclipse.virgo.medic.impl.config.ConfigurationProvider;
+import org.junit.Before;
+import org.junit.Test;
+
+public class FileSystemDumpInspectorTests {
+    
+	private FileSystemDumpInspector fileSystemDumpInspector;
+	
+	private DumpGenerator dumpGenerator;
+    
+	@Before
+	public void setup() {
+		this.dumpGenerator = createMock(DumpGenerator.class);
+		this.fileSystemDumpInspector = new FileSystemDumpInspector(dumpGenerator, new ConfigurationProvider() {
+			
+			@Override
+			public boolean removeChangeListener(ConfigurationChangeListener listener) {
+				return false;
+			}
+			
+			@Override
+			public Dictionary<String, Object> getConfiguration() {
+				Dictionary<String, Object> props = new Hashtable<String, Object>();
+				props.put(KEY_DUMP_ROOT_DIRECTORY, "src/test/resources/testDumps/serviceability/dump");
+				return props;
+			}
+			
+			@Override
+			public void addChangeListener(ConfigurationChangeListener listener) {
+			}
+		});
+	}
+	
+	@Test
+	public void testGetDumps() throws IOException {
+		String[] dumps = fileSystemDumpInspector.getDumps();
+		assertTrue(dumps.length == 1);
+		assertEquals("Unexpected dump found" + dumps[0], "testDump", dumps[0]);
+	}
+	
+	@Test
+	public void testGetDumpEntries() throws IOException {
+		String[][] dumpEntries = fileSystemDumpInspector.getDumpEntries("testDump");
+		assertTrue(dumpEntries.length == 1);
+		assertArrayEquals(new String[]{"testDumpItem.txt", "DumpInspector/getDumpEntry/testDump/testDumpItem.txt"}, dumpEntries[0]);
+	}
+	
+	@Test
+	public void testGetDumpEntriesNotThere() throws IOException {
+		String[][] dumpEntries = fileSystemDumpInspector.getDumpEntries("notHere");
+		assertTrue(dumpEntries.length == 0);
+	}
+	
+	@Test
+	public void testGetDumpEntry() {
+		String[] dumpEntry = fileSystemDumpInspector.getDumpEntry("testDump", "testDumpItem.txt");
+		assertTrue(dumpEntry.length == 2);
+		assertEquals("Unexpected dump found" + dumpEntry[0], "foo", dumpEntry[0]);
+		assertEquals("Unexpected dump found" + dumpEntry[1], "bar", dumpEntry[1]);
+	}
+	
+	@Test
+	public void testGetDumpEntryNotThere() {
+		String[] dumpEntry = fileSystemDumpInspector.getDumpEntry("testDump", "notHere");
+		assertTrue(dumpEntry.length == 0);
+	}
+	
+	@Test
+	public void testCreateDump(){
+		this.dumpGenerator.generateDump("Generated via JMX");
+		expectLastCall().once();
+		replay(this.dumpGenerator);
+		fileSystemDumpInspector.createDump();
+		verify(this.dumpGenerator);
+	}
+	
+	@Test
+	public void testDeleteDump() {
+		File deleteMe = new File("src/test/resources/testDumps/serviceability/dump/deleteMe");
+		deleteMe.mkdir();
+		assertTrue(deleteMe.exists() && deleteMe.isDirectory());
+		fileSystemDumpInspector.deleteDump("deleteMe");
+		assertFalse(deleteMe.exists());
+	}
+    
+}
diff --git a/medic/org.eclipse.virgo.medic.core/src/test/resources/.gitignore b/medic/org.eclipse.virgo.medic.core/src/test/resources/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/test/resources/.gitignore
diff --git a/medic/org.eclipse.virgo.medic.core/src/test/resources/logback-test.xml b/medic/org.eclipse.virgo.medic.core/src/test/resources/logback-test.xml
new file mode 100644
index 0000000..4dedac1
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/test/resources/logback-test.xml
@@ -0,0 +1,59 @@
+<configuration>
+	<root level="debug"/>
+
+	<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+			<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-24.24thread &lt;%X{medic.eventCode}&gt; %msg %ex%n</Pattern>
+    	</encoder>
+  	</appender>
+  	    
+  	<logger name="org.eclipse.virgo.medic.eventlog.localized">
+    	<appender-ref ref="STDOUT" />
+        <appender name="stubAppender" class="org.eclipse.virgo.medic.eventlog.impl.logback.LocalizedOutputAppender">
+			<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+	    		<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-24.24thread &lt;%X{medic.eventCode}&gt; %msg %ex</Pattern>
+    		</encoder>
+  		</appender>
+  		<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+			<file>target/serviceability/eventlog/eventlog.log</file>
+			<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+				<FileNamePattern>target/serviceability/eventlog/eventlog_%i.log</FileNamePattern>
+				<MinIndex>1</MinIndex>
+				<MaxIndex>4</MaxIndex>
+			</rollingPolicy> 
+			<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+			    <MaxFileSize>10MB</MaxFileSize>
+			 </triggeringPolicy>
+    		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+      			<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-24.24thread &lt;%X{medic.eventCode}&gt; %msg %ex%n</Pattern>
+    		</encoder>
+  		</appender>
+  	</logger>
+  	
+  	<logger name="org.eclipse.virgo.medic.eventlog.default">    	
+      	<appender name="stubAppender" class="org.eclipse.virgo.medic.eventlog.impl.logback.DefaultOutputAppender">
+    		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+      			<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-24.24thread &lt;%X{medic.eventCode}&gt; %msg %ex</Pattern>
+    		</encoder>
+    	</appender>
+  	</logger>
+  	
+  	<logger name="org.eclipse.virgo.medic.log.impl.LoggingPrintStreamWrapperTests">
+  		<appender name="capturingAppender" class="org.eclipse.virgo.medic.log.impl.CapturingAppender">
+    		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+      			<Pattern>%msg</Pattern>
+    		</encoder>
+    	</appender>
+    	<appender-ref ref="STDOUT"/>
+  	</logger>
+  	
+  	<logger name="org.eclipse.virgo.medic.log.impl.TeeLoggingPrintStreamWrapperTests">
+  		<appender name="capturingAppender" class="org.eclipse.virgo.medic.log.impl.CapturingAppender">
+    		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+      			<Pattern>%msg</Pattern>
+    		</encoder>
+    	</appender>
+    	<appender-ref ref="STDOUT"/>
+  	</logger>
+  	
+</configuration>
diff --git a/medic/org.eclipse.virgo.medic.core/src/test/resources/logback.xml b/medic/org.eclipse.virgo.medic.core/src/test/resources/logback.xml
new file mode 100644
index 0000000..35b42ac
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/test/resources/logback.xml
@@ -0,0 +1,16 @@
+<configuration>
+	<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+			<Pattern>Bundle1 [%d{yyyy-MM-dd HH:mm:ss.SSS}] %-24.24thread %msg %ex%n</Pattern>
+    	</encoder>
+  	</appender>
+  	
+  	<root level="debug">
+		<appender-ref ref="STDOUT" />
+	</root>
+	
+	<logger name="logger">
+		<appender-ref ref="STDOUT" />
+	</logger>    	
+  	      	
+</configuration>
diff --git a/medic/org.eclipse.virgo.medic.core/src/test/resources/messages.properties b/medic/org.eclipse.virgo.medic.core/src/test/resources/messages.properties
new file mode 100644
index 0000000..bf13b7d
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/test/resources/messages.properties
@@ -0,0 +1 @@
+ABC123=Bar
diff --git a/medic/org.eclipse.virgo.medic.core/src/test/resources/testDumps/serviceability/dump/testDump/testDumpItem.txt b/medic/org.eclipse.virgo.medic.core/src/test/resources/testDumps/serviceability/dump/testDump/testDumpItem.txt
new file mode 100644
index 0000000..a907ec3
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/src/test/resources/testDumps/serviceability/dump/testDump/testDumpItem.txt
@@ -0,0 +1,2 @@
+foo
+bar
\ No newline at end of file
diff --git a/medic/org.eclipse.virgo.medic.core/template.mf b/medic/org.eclipse.virgo.medic.core/template.mf
new file mode 100644
index 0000000..58ff9fd
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.core/template.mf
@@ -0,0 +1,27 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: org.eclipse.virgo.medic.core
+Bundle-Name: Medic Core Implementation
+Bundle-Version: ${version}
+Bundle-Activator: org.eclipse.virgo.medic.impl.MedicActivator
+Import-Template:
+ ch.qos.logback.classic.*;version="${logbackVersion:[=.=.=, +1.0.0)}",
+ ch.qos.logback.core.*;version="${logbackVersion:[=.=.=, +1.0.0)}",
+ org.eclipse.virgo.medic.*;version="${version:[=.=.=, =.+1)}",
+ org.eclipse.virgo.util.*;version="${version:[=.=.=, +1.0.0)}",
+ org.eclipse.equinox.log;version="0",
+ javax.jms;version="0";resolution:=optional,
+ javax.mail.*;version="0";resolution:=optional,
+ javax.management.*;version="0",
+ javax.naming;version="0",
+ javax.servlet.*;version="0";resolution:=optional,
+ javax.sql;version="0",
+ javax.xml.parsers;version="0",
+ org.aspectj.*;version="${aspectjVersion:[=.=.=, +1.0.0)}",
+ org.osgi.framework;version="0",
+ org.osgi.service.*;version="0",
+ org.osgi.util.tracker;version="0",
+ org.slf4j.*;version="${slf4jVersion:[=.=.=, +1.0.0)}",
+ org.xml.sax.*;version="0"
+Medic-LoggingConfiguration: org.eclipse.virgo.medic
+Excluded-Exports: *.impl,*.impl.*
diff --git a/medic/org.eclipse.virgo.medic.integrationtest/.classpath b/medic/org.eclipse.virgo.medic.integrationtest/.classpath
new file mode 100644
index 0000000..4df9547
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.integrationtest/.classpath
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src/main/java">
+		<attributes>
+			<attribute name="com.springsource.server.ide.jdt.core.test.classpathentry" value="false"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="src" path="src/main/resources">
+		<attributes>
+			<attribute name="com.springsource.server.ide.jdt.core.test.classpathentry" value="false"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="src" output="target/test-classes" path="src/test/java">
+		<attributes>
+			<attribute name="com.springsource.server.ide.jdt.core.test.classpathentry" value="false"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="src" output="target/test-classes" path="src/test/resources">
+		<attributes>
+			<attribute name="com.springsource.server.ide.jdt.core.test.classpathentry" value="false"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="var" path="IVY_CACHE/org.junit/com.springsource.org.junit/4.7.0/com.springsource.org.junit-4.7.0.jar" sourcepath="/IVY_CACHE/org.junit/com.springsource.org.junit/4.7.0/com.springsource.org.junit-sources-4.7.0.jar"/>
+	<classpathentry kind="var" path="IVY_CACHE/org.eclipse.virgo.mirrored/org.eclipse.osgi/3.8.1.v20120830-144521/org.eclipse.osgi-3.8.1.v20120830-144521.jar" sourcepath="/IVY_CACHE/org.eclipse.osgi/org.eclipse.osgi/3.7.1.R37x_v20110808-1106/org.eclipse.osgi-sources-3.7.1.R37x_v20110808-1106.jar"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="var" path="IVY_CACHE/org.eclipse.virgo.mirrored/org.slf4j.api/1.7.2.v20121108-1250/org.slf4j.api-1.7.2.v20121108-1250.jar" sourcepath="/IVY_CACHE/org.eclipse.virgo.mirrored/org.slf4j.api/1.7.2.v20121108-1250/org.slf4j.api-sources-1.7.2.v20121108-1250.jar"/>
+	<classpathentry kind="var" path="IVY_CACHE/org.eclipse.virgo.mirrored/ch.qos.logback.classic/1.0.7.v20121108-1250/ch.qos.logback.classic-1.0.7.v20121108-1250.jar" sourcepath="/IVY_CACHE/ch.qos.logback/com.springsource.ch.qos.logback.classic/0.9.24/com.springsource.ch.qos.logback.classic-sources-0.9.24.jar"/>
+	<classpathentry kind="var" path="IVY_CACHE/org.eclipse.virgo.mirrored/ch.qos.logback.core/1.0.7.v20121108-1250/ch.qos.logback.core-1.0.7.v20121108-1250.jar" sourcepath="/IVY_CACHE/ch.qos.logback/com.springsource.ch.qos.logback.core/0.9.24/com.springsource.ch.qos.logback.core-sources-0.9.24.jar"/>
+	<classpathentry kind="var" path="IVY_CACHE/org.eclipse.virgo.test/org.eclipse.virgo.test.stubs/3.7.0.D-20140919122823/org.eclipse.virgo.test.stubs-3.7.0.D-20140919122823.jar" sourcepath="/IVY_CACHE/org.eclipse.virgo.test/org.eclipse.virgo.test.framework/3.7.0.D-20140919122823/org.eclipse.virgo.test.framework-sources-3.7.0.D-20140919122823.jar"/>
+	<classpathentry kind="con" path="org.eclipse.ajdt.core.ASPECTJRT_CONTAINER"/>
+	<classpathentry kind="src" path="/org.eclipse.virgo.medic">
+		<attributes>
+			<attribute name="org.eclipse.ajdt.aspectpath" value="org.eclipse.ajdt.aspectpath"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="var" path="IVY_CACHE/org.eclipse.virgo.util/org.eclipse.virgo.util.common/3.7.0.D-20140919122012/org.eclipse.virgo.util.common-3.7.0.D-20140919122012.jar" sourcepath="/IVY_CACHE/org.eclipse.virgo.util/org.eclipse.virgo.util.common/3.7.0.D-20140919122012/org.eclipse.virgo.util.common-sources-3.7.0.D-20140919122012.jar"/>
+	<classpathentry kind="var" path="IVY_CACHE/org.eclipse.virgo.mirrored/org.eclipse.equinox.cm/1.0.400.v20120319-2029/org.eclipse.equinox.cm-1.0.400.v20120319-2029.jar"/>
+	<classpathentry kind="var" path="IVY_CACHE/org.eclipse.virgo.mirrored/org.eclipse.osgi.services/3.3.0.v20120307-2102/org.eclipse.osgi.services-3.3.0.v20120307-2102.jar"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/medic/org.eclipse.virgo.medic.integrationtest/.externalToolBuilders/com.springsource.server.ide.bundlor.core.builder.launch b/medic/org.eclipse.virgo.medic.integrationtest/.externalToolBuilders/com.springsource.server.ide.bundlor.core.builder.launch
new file mode 100644
index 0000000..5e5d649
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.integrationtest/.externalToolBuilders/com.springsource.server.ide.bundlor.core.builder.launch
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.ant.AntBuilderLaunchConfigurationType">
+<booleanAttribute key="org.eclipse.ui.externaltools.ATTR_BUILDER_ENABLED" value="false"/>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_DISABLED_BUILDER" value="com.springsource.server.ide.bundlor.core.builder"/>
+<mapAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS"/>
+<booleanAttribute key="org.eclipse.ui.externaltools.ATTR_TRIGGERS_CONFIGURED" value="true"/>
+</launchConfiguration>
diff --git a/medic/org.eclipse.virgo.medic.integrationtest/.settings/org.eclipse.virgo.ide.bundlor.core.prefs b/medic/org.eclipse.virgo.medic.integrationtest/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
new file mode 100644
index 0000000..5bf8f0a
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.integrationtest/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
@@ -0,0 +1,5 @@
+#Tue Nov 23 11:21:55 GMT 2010
+org.eclipse.virgo.ide.bundlor.core.bundlor.generated.manifest.autoformatting=true
+org.eclipse.virgo.ide.bundlor.core.byte.code.scanning=true
+org.eclipse.virgo.ide.bundlor.core.template.properties.files=../build.versions;../build.properties
+eclipse.preferences.version=1
diff --git a/medic/org.eclipse.virgo.medic.integrationtest/.springBeans b/medic/org.eclipse.virgo.medic.integrationtest/.springBeans
new file mode 100644
index 0000000..d079ca1
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.integrationtest/.springBeans
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beansProjectDescription>
+	<version>1</version>
+	<pluginVersion><![CDATA[2.2.4.RELEASE]]></pluginVersion>
+	<configSuffixes>
+		<configSuffix><![CDATA[xml]]></configSuffix>
+	</configSuffixes>
+	<enableImports><![CDATA[false]]></enableImports>
+	<configs>
+	</configs>
+	<configSets>
+	</configSets>
+</beansProjectDescription>
diff --git a/medic/org.eclipse.virgo.medic.integrationtest/build.xml b/medic/org.eclipse.virgo.medic.integrationtest/build.xml
new file mode 100644
index 0000000..5fed3aa
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.integrationtest/build.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="org.eclipse.virgo.medic.integrationtest">
+
+	<property file="${basedir}/../build.properties"/>
+	<property file="${basedir}/../build.versions"/>
+	<property name="disable.bundlor" value="true" />
+	<import file="${basedir}/../virgo-build/weaving/default.xml"/>
+    
+</project>
diff --git a/medic/org.eclipse.virgo.medic.integrationtest/ivy.xml b/medic/org.eclipse.virgo.medic.integrationtest/ivy.xml
new file mode 100644
index 0000000..8a403b7
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.integrationtest/ivy.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="http://ivyrep.jayasoft.org/ivy-doc.xsl"?>
+<ivy-module
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:noNamespaceSchemaLocation="http://incubator.apache.org/ivy/schemas/ivy.xsd"
+		version="1.3">
+
+	<info organisation="${project.organisation}" module="${ant.project.name}"/>
+
+	<configurations>
+		<include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>
+	</configurations>
+
+	<publications>
+		<artifact name="${ant.project.name}"/>
+		<artifact name="${ant.project.name}-sources" type="src" ext="jar"/>
+	</publications>
+
+	<dependencies>
+		<dependency org="org.eclipse.virgo.mirrored" name="org.eclipse.osgi" rev="${org.eclipse.osgi}" conf="compile->runtime"/>
+		<dependency org="org.eclipse.virgo.mirrored" name="org.slf4j.api" rev="${org.slf4j.api}" conf="compile->runtime"/>
+        <dependency org="org.eclipse.virgo.mirrored" name="org.slf4j.jul" rev="${org.slf4j.jul}" conf="test->runtime"/>
+		
+		<dependency org="org.eclipse.virgo.medic" name="org.eclipse.virgo.medic" rev="latest.integration" conf="aspects->runtime"/>
+		<dependency org="org.aspectj" name="com.springsource.org.aspectj.runtime" rev="${org.aspectj}" conf="aspects->runtime"/>
+		
+		<dependency org="org.eclipse.virgo.util" name="org.eclipse.virgo.util.common" rev="${org.eclipse.virgo.util}" conf="test->runtime"/>
+		<dependency org="org.eclipse.virgo.util" name="org.eclipse.virgo.util.osgi" rev="${org.eclipse.virgo.util}" conf="test->runtime"/>
+		<dependency org="org.eclipse.virgo.util" name="org.eclipse.virgo.util.io" rev="${org.eclipse.virgo.util}" conf="test->runtime"/>
+		<dependency org="org.eclipse.virgo.util" name="org.eclipse.virgo.util.math" rev="${org.eclipse.virgo.util}" conf="test->runtime"/>
+		<dependency org="org.eclipse.virgo.test" name="org.eclipse.virgo.test.launcher" rev="${org.eclipse.virgo.test}" conf="test->runtime"/>
+		<dependency org="org.eclipse.virgo.test" name="org.eclipse.virgo.test.framework" rev="${org.eclipse.virgo.test}" conf="test->runtime"/>
+		
+		<dependency org="org.junit" name="com.springsource.org.junit" rev="${org.junit}" conf="test->runtime"/>
+		<dependency org="org.eclipse.virgo.mirrored" name="ch.qos.logback.classic" rev="${ch.qos.logback.classic}" conf="test->runtime"/>
+		<dependency org="org.eclipse.virgo.mirrored" name="ch.qos.logback.core" rev="${ch.qos.logback.core}" conf="test->runtime"/>
+		<dependency org="org.eclipse.virgo.mirrored" name="ch.qos.logback.slf4j" rev="${ch.qos.logback.slf4j}" conf="test->runtime"/>
+		
+		<dependency org="org.eclipse.virgo.mirrored" name="org.eclipse.osgi.services" rev="${org.eclipse.osgi.services}" conf="test->runtime"/>
+		<dependency org="org.eclipse.virgo.mirrored" name="org.eclipse.equinox.cm" rev="${org.eclipse.equinox.cm}" conf="test->runtime"/>
+        <dependency org="org.eclipse.virgo.mirrored" name="org.eclipse.equinox.log" rev="${org.eclipse.equinox.log}" conf="test->runtime"/>
+		
+		<!-- Prevent org.eclipse.osgi.services dragging in old Equinox -->
+		<exclude org="org.eclipse.osgi"/>
+	</dependencies>
+
+</ivy-module>
diff --git a/medic/org.eclipse.virgo.medic.integrationtest/src/main/java/.gitignore b/medic/org.eclipse.virgo.medic.integrationtest/src/main/java/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.integrationtest/src/main/java/.gitignore
diff --git a/medic/org.eclipse.virgo.medic.integrationtest/src/main/java/test/TestClass.java b/medic/org.eclipse.virgo.medic.integrationtest/src/main/java/test/TestClass.java
new file mode 100644
index 0000000..fb1de67
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.integrationtest/src/main/java/test/TestClass.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package test;
+
+public class TestClass {
+
+    public void publicTest(boolean throwException) {
+        if (throwException) {
+            throw new RuntimeException();
+        }
+        return;
+    }
+    
+    void packagePrivateTest(boolean throwException) {
+        if (throwException) {
+            throw new RuntimeException();
+        }
+        return;
+    }
+    
+    @SuppressWarnings("unused")
+    private void privateTest(boolean throwException) {
+        if (throwException) {
+            throw new RuntimeException();
+        }
+        return;
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.integrationtest/src/main/resources/.gitignore b/medic/org.eclipse.virgo.medic.integrationtest/src/main/resources/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.integrationtest/src/main/resources/.gitignore
diff --git a/medic/org.eclipse.virgo.medic.integrationtest/src/test/java/org/eclipse/virgo/medic/dump/test/DumpIntegrationTests.java b/medic/org.eclipse.virgo.medic.integrationtest/src/test/java/org/eclipse/virgo/medic/dump/test/DumpIntegrationTests.java
new file mode 100644
index 0000000..af8f2aa
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.integrationtest/src/test/java/org/eclipse/virgo/medic/dump/test/DumpIntegrationTests.java
@@ -0,0 +1,209 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.dump.test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.List;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.slf4j.LoggerFactory;
+
+import org.eclipse.virgo.medic.dump.DumpGenerator;
+import org.eclipse.virgo.test.framework.OsgiTestRunner;
+import org.eclipse.virgo.test.framework.TestFrameworkUtils;
+
+// Medic integration tests do not run in the Eclipse IDE.
+
+@RunWith(OsgiTestRunner.class)
+public class DumpIntegrationTests {
+	
+	private final BundleContext bundleContext = TestFrameworkUtils.getBundleContextForTestClass(getClass());
+	
+	@Before
+	public void deleteDumps() {
+		File dumpsDir = new File("build", "dumps");
+		if (dumpsDir.exists()) {
+			deleteRecursively(dumpsDir);
+		}
+	}
+	
+	private static void deleteRecursively(File file) {
+		if (file.isDirectory()) {
+			File[] files = file.listFiles();
+			if (files != null) {
+				for (File fileInDir : files) {
+					deleteRecursively(fileInDir);
+				}
+			}
+		} 
+		assertTrue(file.delete());
+	}
+	
+	@SuppressWarnings("unchecked")
+	@Test
+	public void dumpGeneratorAvailableFromServiceRegistry() {
+		ServiceReference<DumpGenerator> serviceReference = (ServiceReference<DumpGenerator>)this.bundleContext.getServiceReference(DumpGenerator.class.getName());
+		assertNotNull(serviceReference);
+	}
+	
+	@Test
+	public void dumpDirectoryConfiguration() throws IOException, InterruptedException {
+		Configuration configuration = getConfiguration("org.eclipse.virgo.medic");
+		assertNotNull(configuration);
+		
+		Dictionary<String, String> properties = new Hashtable<String, String>();		
+		properties.put("dump.root.directory", "build/dumps/1");
+		
+		configuration.update(properties);
+		
+		Thread.sleep(2000);
+		
+		ServiceReference<?> serviceReference = this.bundleContext.getServiceReference(DumpGenerator.class.getName());
+		DumpGenerator dumpGenerator = (DumpGenerator)this.bundleContext.getService(serviceReference);
+		dumpGenerator.generateDump("bleurgh");
+		
+		File file = new File("build/dumps/1");
+		assertTrue(file.exists());
+		assertNotNull(file.list());
+		assertEquals(1, file.list().length);
+
+        assertDumpContributionsNumberOf(file.listFiles()[0], 3);               
+        assertDumpContributionsEssential(file.listFiles()[0], "summary.txt", "thread.txt");               
+        assertDumpContributionsAllowable(file.listFiles()[0], "heap.out", "heap.err", "summary.txt", "thread.txt");               
+
+		
+		properties.put("dump.root.directory", "build/dumps/2");
+		configuration.update(properties);
+		
+		Thread.sleep(2000);
+		
+		dumpGenerator.generateDump("bleurgh");
+		
+		file = new File("build/dumps/2");
+		assertTrue(file.exists());
+		assertNotNull(file.list());
+		assertEquals(1, file.list().length);
+
+		assertDumpContributionsNumberOf(file.listFiles()[0], 3);               
+		assertDumpContributionsEssential(file.listFiles()[0], "summary.txt", "thread.txt");               
+		assertDumpContributionsAllowable(file.listFiles()[0], "heap.out", "heap.err", "summary.txt", "thread.txt");               
+
+	}
+	
+	@Test
+	public void exclusionConfiguration() throws IOException, InterruptedException {
+		Configuration configuration = getConfiguration("org.eclipse.virgo.medic");
+		assertNotNull(configuration);
+		
+		Dictionary<String, String> properties = new Hashtable<String, String>();		
+		properties.put("dump.root.directory", "build/dumps/1");
+		properties.put("dump.exclusions.bleurgh", "heap");
+		
+		configuration.update(properties);
+		
+		Thread.sleep(2000);
+		
+		ServiceReference<?> serviceReference = this.bundleContext.getServiceReference(DumpGenerator.class.getName());
+		DumpGenerator dumpGenerator = (DumpGenerator)this.bundleContext.getService(serviceReference);
+		dumpGenerator.generateDump("bleurgh");
+		
+		File file = new File("build/dumps/1");
+		assertTrue(file.exists());
+		assertNotNull(file.list());
+		assertEquals(1, file.list().length);
+
+		assertDumpContributionsNumberOf(file.listFiles()[0], 2);               
+		assertDumpContributionsEssential(file.listFiles()[0], "summary.txt", "thread.txt");               
+
+	}
+	
+	@Test
+	@SuppressWarnings("unchecked")
+	public void logDumpEnabled() throws IOException, InterruptedException {
+		Configuration configuration = getConfiguration("org.eclipse.virgo.medic");
+		assertNotNull(configuration);
+				
+		Dictionary<String, String> properties = new Hashtable<String, String>();				
+		properties.put("dump.root.directory", "build/dumps/1");
+		properties.put("log.dump.level", "ERROR");
+		
+		configuration.update(properties);
+		
+		Thread.sleep(2000);
+		
+		LoggerFactory.getLogger(getClass()).info("Test");
+		
+		ServiceReference<DumpGenerator> serviceReference = (ServiceReference<DumpGenerator>)this.bundleContext.getServiceReference(DumpGenerator.class.getName());
+		DumpGenerator dumpGenerator = (DumpGenerator)this.bundleContext.getService(serviceReference);
+		dumpGenerator.generateDump("bleurgh");
+		
+		File file = new File("build/dumps/1");
+		assertTrue(file.exists());
+		assertNotNull(file.list());
+		assertEquals(1, file.list().length);
+
+		assertDumpContributionsNumberOf(file.listFiles()[0], 3);               
+        assertDumpContributionsEssential(file.listFiles()[0], "summary.txt", "thread.txt");               
+        assertDumpContributionsAllowable(file.listFiles()[0], "heap.out", "heap.err", "summary.txt", "thread.txt");               
+	}
+	
+	private Configuration getConfiguration(String pid) throws IOException {
+		ConfigurationAdmin configurationAdmin = getConfigurationAdmin();
+		assertNotNull(configurationAdmin);
+		
+		return configurationAdmin.getConfiguration(pid);
+	}
+	
+	@SuppressWarnings("unchecked")
+	private ConfigurationAdmin getConfigurationAdmin() {
+		ServiceReference<ConfigurationAdmin> serviceReference = (ServiceReference<ConfigurationAdmin>)this.bundleContext.getServiceReference(ConfigurationAdmin.class.getName());
+		assertNotNull(serviceReference);
+		
+		return (ConfigurationAdmin) this.bundleContext.getService(serviceReference);
+	}
+	
+    private static void assertDumpContributionsNumberOf(File dumpDirectory, int numberAllowed) {
+        assertTrue("No dump directory found or not a directory.", dumpDirectory.exists() && dumpDirectory.isDirectory());
+        File[] files = dumpDirectory.listFiles();
+        assertEquals("Found '" + Arrays.toString(files) + " which is not the right number of files.", numberAllowed, files.length);
+    }
+
+    private static void assertDumpContributionsEssential(File dumpDirectory, String... contributions) {
+        assertTrue("No dump directory found or not a directory.", dumpDirectory.exists() && dumpDirectory.isDirectory());
+        List<String> dumpDirectoryList = Arrays.asList(dumpDirectory.list());
+        for (String fileName : contributions) {
+            assertTrue("The file " + fileName + " was not contributed", dumpDirectoryList.contains(fileName));
+        }
+    }
+
+    private static void assertDumpContributionsAllowable(File dumpDirectory, String... contributions) {
+        assertTrue("No dump directory found or not a directory.", dumpDirectory.exists() && dumpDirectory.isDirectory());
+        List<String> contributionsList = Arrays.asList(contributions);
+        for (String fileName : dumpDirectory.list()) {
+            assertTrue("The file " + fileName + " was not expected", contributionsList.contains(fileName));
+        }
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.integrationtest/src/test/java/org/eclipse/virgo/medic/eventlog/test/EventLogIntegrationTests.java b/medic/org.eclipse.virgo.medic.integrationtest/src/test/java/org/eclipse/virgo/medic/eventlog/test/EventLogIntegrationTests.java
new file mode 100644
index 0000000..7cf4ba6
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.integrationtest/src/test/java/org/eclipse/virgo/medic/eventlog/test/EventLogIntegrationTests.java
@@ -0,0 +1,117 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.eventlog.test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.util.List;
+import java.util.Locale;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.ServiceReference;
+
+import ch.qos.logback.classic.spi.LoggingEvent;
+
+
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.medic.eventlog.EventLoggerFactory;
+import org.eclipse.virgo.medic.eventlog.Level;
+import org.eclipse.virgo.medic.log.appender.StubAppender;
+import org.eclipse.virgo.test.framework.OsgiTestRunner;
+import org.eclipse.virgo.test.framework.TestFrameworkUtils;
+
+//Medic integration tests do not run in the Eclipse IDE.
+
+@RunWith(OsgiTestRunner.class)
+public class EventLogIntegrationTests {
+	
+	private BundleContext bundleContext;
+	
+	private Bundle messageBundle;
+
+    @Before
+    public void before() throws BundleException {
+    	Locale.setDefault(Locale.ITALIAN);
+        this.bundleContext = TestFrameworkUtils.getBundleContextForTestClass(getClass());
+        messageBundle = this.bundleContext.installBundle("file:src/test/resources/message-bundle");
+		this.bundleContext.installBundle("file:src/test/resources/message-fragment");        
+    }
+
+	@Test
+	public void availabilityOfEventLoggerFactory() {
+		ServiceReference<EventLoggerFactory> serviceReference = this.bundleContext.getServiceReference(EventLoggerFactory.class);
+		assertNotNull(serviceReference);
+	}
+	
+	@Test
+	public void availabilityOfEventLogger() {
+		ServiceReference<EventLogger> serviceReference = this.bundleContext.getServiceReference(EventLogger.class);
+		assertNotNull(serviceReference);
+	}
+	
+	@Test
+	public void eventLoggingWithMessageFromCurrentBundle() {
+		ServiceReference<EventLogger> serviceReference = this.bundleContext.getServiceReference(EventLogger.class);
+		assertNotNull(serviceReference);
+		EventLogger eventLogger = this.bundleContext.getService(serviceReference);
+		eventLogger.log("1234", Level.WARNING, "orange", "lemon");
+		
+		List<LoggingEvent> loggingEvent = StubAppender.getAndResetLoggingEvents("default-stub");
+		assertEquals(1, loggingEvent.size());
+		assertEquals("English orange and lemon", loggingEvent.get(0).getMessage());
+		
+		loggingEvent = StubAppender.getAndResetLoggingEvents("localized-stub");
+		assertEquals(1, loggingEvent.size());
+		assertEquals("Italian orange and lemon", loggingEvent.get(0).getMessage());
+		
+	}
+	
+	@Test
+	public void eventLoggingWithMessageFromFragment() throws Exception {
+		ServiceReference<EventLoggerFactory> serviceReference = this.bundleContext.getServiceReference(EventLoggerFactory.class);
+		assertNotNull(serviceReference);
+		EventLoggerFactory eventLoggerFactory = this.bundleContext.getService(serviceReference);		
+		EventLogger eventLogger = eventLoggerFactory.createEventLogger(this.messageBundle);
+		eventLogger.log("3456", Level.WARNING, "oak", "sycamore");
+		
+		List<LoggingEvent> loggingEvent = StubAppender.getAndResetLoggingEvents("default-stub");
+		assertEquals(1, loggingEvent.size());
+		assertEquals("Shared oak and sycamore", loggingEvent.get(0).getMessage());
+		
+		loggingEvent = StubAppender.getAndResetLoggingEvents("localized-stub");
+		assertEquals(1, loggingEvent.size());
+		assertEquals("Shared oak and sycamore", loggingEvent.get(0).getMessage());
+	}
+	
+	@Test
+	public void eventLoggingWithMessageFromSpecificBundle() throws Exception {
+		ServiceReference<EventLoggerFactory> serviceReference = this.bundleContext.getServiceReference(EventLoggerFactory.class);
+		assertNotNull(serviceReference);
+		EventLoggerFactory eventLoggerFactory = this.bundleContext.getService(serviceReference);		
+		EventLogger eventLogger = eventLoggerFactory.createEventLogger(this.messageBundle);
+		eventLogger.log("2345", Level.WARNING, "potato", "cauliflower");
+		
+		List<LoggingEvent> loggingEvent = StubAppender.getAndResetLoggingEvents("default-stub");
+		assertEquals(1, loggingEvent.size());
+		assertEquals("English potato and cauliflower", loggingEvent.get(0).getMessage());
+		
+		loggingEvent = StubAppender.getAndResetLoggingEvents("localized-stub");
+		assertEquals(1, loggingEvent.size());
+		assertEquals("Italian potato and cauliflower", loggingEvent.get(0).getMessage());
+	}		
+}
diff --git a/medic/org.eclipse.virgo.medic.integrationtest/src/test/java/org/eclipse/virgo/medic/log/appender/StubAppender.java b/medic/org.eclipse.virgo.medic.integrationtest/src/test/java/org/eclipse/virgo/medic/log/appender/StubAppender.java
new file mode 100644
index 0000000..4edf14f
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.integrationtest/src/test/java/org/eclipse/virgo/medic/log/appender/StubAppender.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log.appender;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import ch.qos.logback.classic.spi.LoggingEvent;
+import ch.qos.logback.core.AppenderBase;
+
+public final class StubAppender extends AppenderBase<LoggingEvent> {
+
+    private static final Object monitor = new Object();
+
+    private static Map<String, List<LoggingEvent>> loggingEvents = new HashMap<String, List<LoggingEvent>>();
+
+    @Override
+    protected void append(LoggingEvent eventObject) {
+        synchronized (monitor) {
+            getLoggingEventsByName(name).add(eventObject);
+        }
+    }
+
+    public static List<LoggingEvent> getAndResetLoggingEvents(String name) {
+        synchronized (monitor) {
+            List<LoggingEvent> loggingEvents = getLoggingEventsByName(name);
+            List<LoggingEvent> response = new ArrayList<LoggingEvent>(loggingEvents);
+            loggingEvents.clear();
+            return response;
+        }
+    }
+
+    private static List<LoggingEvent> getLoggingEventsByName(String name) {
+        List<LoggingEvent> loggingEventsForName = loggingEvents.get(name);
+        if (loggingEventsForName == null) {
+            loggingEventsForName = new ArrayList<LoggingEvent>();
+            loggingEvents.put(name, loggingEventsForName);
+        }
+        return loggingEventsForName;
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.integrationtest/src/test/java/org/eclipse/virgo/medic/log/test/EntryExitTraceTests.java b/medic/org.eclipse.virgo.medic.integrationtest/src/test/java/org/eclipse/virgo/medic/log/test/EntryExitTraceTests.java
new file mode 100644
index 0000000..75ba3b8
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.integrationtest/src/test/java/org/eclipse/virgo/medic/log/test/EntryExitTraceTests.java
@@ -0,0 +1,156 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log.test;
+
+import static org.junit.Assert.assertEquals;
+
+import java.lang.reflect.Method;
+import java.util.List;
+
+import org.eclipse.virgo.medic.log.appender.StubAppender;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import test.TestClass;
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.spi.LoggingEvent;
+
+
+public class EntryExitTraceTests {
+
+    private final TestClass testClass = new TestClass();
+
+    @BeforeClass
+    public static void ensureConfiguredContextSelectorIsDefaultContextSelector() {
+        System.setProperty("logback.ContextSelector", "ch.qos.logback.classic.selector.DefaultContextSelector");
+    }
+
+    @Test
+    public void testPublicBefore() {
+        testClass.publicTest(false);
+        List<LoggingEvent> loggingEvents = StubAppender.getAndResetLoggingEvents(null);
+        assertEquals(2, loggingEvents.size());
+        LoggingEvent event = loggingEvents.get(0);
+        assertEquals(Level.DEBUG, event.getLevel());
+        assertEquals("> public void test.TestClass.publicTest(boolean)", event.getFormattedMessage());
+        assertEquals("public void test.TestClass.publicTest(boolean)", event.getArgumentArray()[1]);
+    }
+
+    @Test
+    public void testPublicAfterReturn() {
+        testClass.publicTest(false);
+        List<LoggingEvent> loggingEvents = StubAppender.getAndResetLoggingEvents(null);
+        assertEquals(2, loggingEvents.size());
+        LoggingEvent event = loggingEvents.get(1);
+        assertEquals(Level.DEBUG, event.getLevel());
+        assertEquals("< public void test.TestClass.publicTest(boolean)", event.getFormattedMessage());
+        assertEquals("public void test.TestClass.publicTest(boolean)", event.getArgumentArray()[1]);
+    }
+
+    @Test
+    public void testPublicAfterThrowing() {
+        try {
+            testClass.publicTest(true);
+        } catch (Exception e) {
+            List<LoggingEvent> loggingEvents = StubAppender.getAndResetLoggingEvents(null);
+            assertEquals(2, loggingEvents.size());
+            LoggingEvent event = loggingEvents.get(1);
+            assertEquals(Level.DEBUG, event.getLevel());
+            assertEquals("< public void test.TestClass.publicTest(boolean)", event.getFormattedMessage());
+            assertEquals(RuntimeException.class.getName(), event.getThrowableProxy().getClassName());
+        }
+    }
+
+    @Test
+    public void testPackagePrivateBefore() throws Exception {
+        Method method = testClass.getClass().getDeclaredMethod("packagePrivateTest", boolean.class);
+        method.setAccessible(true);
+        method.invoke(testClass, false);
+        List<LoggingEvent> loggingEvents = StubAppender.getAndResetLoggingEvents(null);
+        assertEquals(2, loggingEvents.size());
+        LoggingEvent event = loggingEvents.get(0);
+        assertEquals(Level.TRACE, event.getLevel());
+        assertEquals("> void test.TestClass.packagePrivateTest(boolean)", event.getFormattedMessage());
+        assertEquals("void test.TestClass.packagePrivateTest(boolean)", event.getArgumentArray()[1]);
+    }
+
+    @Test
+    public void testPackagePrivateAfterReturn() throws Exception {
+        Method method = testClass.getClass().getDeclaredMethod("packagePrivateTest", boolean.class);
+        method.setAccessible(true);
+        method.invoke(testClass, false);
+        List<LoggingEvent> loggingEvents = StubAppender.getAndResetLoggingEvents(null);
+        assertEquals(2, loggingEvents.size());
+        LoggingEvent event = loggingEvents.get(1);
+        assertEquals(Level.TRACE, event.getLevel());
+        assertEquals("< void test.TestClass.packagePrivateTest(boolean)", event.getFormattedMessage());
+        assertEquals("void test.TestClass.packagePrivateTest(boolean)", event.getArgumentArray()[1]);
+    }
+
+    @Test
+    public void testPackagePrivateAfterThrowing() {
+        try {
+            Method method = testClass.getClass().getDeclaredMethod("packagePrivateTest", boolean.class);
+            method.setAccessible(true);
+            method.invoke(testClass, true);
+        } catch (Exception e) {
+            List<LoggingEvent> loggingEvents = StubAppender.getAndResetLoggingEvents(null);
+            assertEquals(2, loggingEvents.size());
+            LoggingEvent event = loggingEvents.get(1);
+            assertEquals(Level.TRACE, event.getLevel());
+            assertEquals("< void test.TestClass.packagePrivateTest(boolean)", event.getFormattedMessage());
+            assertEquals(RuntimeException.class.getName(), event.getThrowableProxy().getClassName());
+        }
+    }
+
+    @Test
+    public void testPrivateBefore() throws Exception {
+        Method method = testClass.getClass().getDeclaredMethod("privateTest", boolean.class);
+        method.setAccessible(true);
+        method.invoke(testClass, false);
+        List<LoggingEvent> loggingEvents = StubAppender.getAndResetLoggingEvents(null);
+        assertEquals(2, loggingEvents.size());
+        LoggingEvent event = loggingEvents.get(0);
+        assertEquals(Level.TRACE, event.getLevel());
+        assertEquals("> private void test.TestClass.privateTest(boolean)", event.getFormattedMessage());
+        assertEquals("private void test.TestClass.privateTest(boolean)", event.getArgumentArray()[1]);
+    }
+
+    @Test
+    public void testPrivateAfterReturn() throws Exception {
+        Method method = testClass.getClass().getDeclaredMethod("privateTest", boolean.class);
+        method.setAccessible(true);
+        method.invoke(testClass, false);
+        List<LoggingEvent> loggingEvents = StubAppender.getAndResetLoggingEvents(null);
+        assertEquals(2, loggingEvents.size());
+        LoggingEvent event = loggingEvents.get(1);
+        assertEquals(Level.TRACE, event.getLevel());
+        assertEquals("< private void test.TestClass.privateTest(boolean)", event.getFormattedMessage());
+        assertEquals("private void test.TestClass.privateTest(boolean)", event.getArgumentArray()[1]);
+    }
+
+    @Test
+    public void testPrivateAfterThrowing() {
+        try {
+            Method method = testClass.getClass().getDeclaredMethod("privateTest", boolean.class);
+            method.setAccessible(true);
+            method.invoke(testClass, true);
+        } catch (Exception e) {
+            List<LoggingEvent> loggingEvents = StubAppender.getAndResetLoggingEvents(null);
+            assertEquals(2, loggingEvents.size());
+            LoggingEvent event = loggingEvents.get(1);
+            assertEquals(Level.TRACE, event.getLevel());
+            assertEquals("< private void test.TestClass.privateTest(boolean)", event.getFormattedMessage());
+            assertEquals(RuntimeException.class.getName(), event.getThrowableProxy().getClassName());
+        }
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.integrationtest/src/test/java/org/eclipse/virgo/medic/log/test/MedicLoggingIntegrationTests.java b/medic/org.eclipse.virgo.medic.integrationtest/src/test/java/org/eclipse/virgo/medic/log/test/MedicLoggingIntegrationTests.java
new file mode 100644
index 0000000..8df5219
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.integrationtest/src/test/java/org/eclipse/virgo/medic/log/test/MedicLoggingIntegrationTests.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log.test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+
+
+import org.eclipse.virgo.medic.log.LoggingConfigurationPublisher;
+import org.eclipse.virgo.medic.log.appender.StubAppender;
+import org.eclipse.virgo.test.framework.OsgiTestRunner;
+import org.eclipse.virgo.test.framework.TestFrameworkUtils;
+
+@RunWith(OsgiTestRunner.class)
+public class MedicLoggingIntegrationTests {
+	
+    private BundleContext bundleContext;
+
+    @Before
+    public void before() {
+        this.bundleContext = TestFrameworkUtils.getBundleContextForTestClass(getClass());
+    }
+	
+	@Test
+	public void test() throws BundleException {				
+		bundleContext.installBundle("file:src/test/resources/test-bundle_1").start();
+        allowEventsToPropagate();
+		assertEquals(1, StubAppender.getAndResetLoggingEvents("bundle1-stub").size());
+		
+		bundleContext.installBundle("file:src/test/resources/test-bundle_2").start();
+        allowEventsToPropagate();
+		assertEquals(1, StubAppender.getAndResetLoggingEvents("bundle2-stub").size());
+		
+		bundleContext.installBundle("file:src/test/resources/test-bundle_3").start();
+		allowEventsToPropagate();
+		assertEquals(14, StubAppender.getAndResetLoggingEvents("root-stub").size()); //9 When run in Eclipse
+	}
+	
+	private void allowEventsToPropagate() {
+        try {
+            Thread.sleep(100);
+        } catch (InterruptedException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+	public void availabilityOfConfigurationPublisher() {
+		assertNotNull(bundleContext.getServiceReference(LoggingConfigurationPublisher.class.getName()));
+	}		
+}
diff --git a/medic/org.eclipse.virgo.medic.integrationtest/src/test/java/org/eclipse/virgo/medic/log/test/PrintStreamWrappingTests.java b/medic/org.eclipse.virgo.medic.integrationtest/src/test/java/org/eclipse/virgo/medic/log/test/PrintStreamWrappingTests.java
new file mode 100644
index 0000000..1294fbf
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.integrationtest/src/test/java/org/eclipse/virgo/medic/log/test/PrintStreamWrappingTests.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log.test;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.List;
+
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import ch.qos.logback.classic.spi.LoggingEvent;
+
+import org.eclipse.virgo.medic.log.appender.StubAppender;
+import org.eclipse.virgo.test.framework.OsgiTestRunner;
+
+
+@RunWith(OsgiTestRunner.class)
+public class PrintStreamWrappingTests {
+	
+	@Test
+	@Ignore("[DMS-2879] Test fails on the CI server as it wraps System.out")
+	public void sysOutWrapping() {
+		System.out.println("Hello world!");
+		List<LoggingEvent> loggingEvents = StubAppender.getAndResetLoggingEvents("root-stub");
+		assertEquals(1, loggingEvents.size());
+		assertEquals("Hello world!", loggingEvents.get(0).getMessage());
+	}
+	
+	@Test
+	@Ignore("[DMS-2879] Test fails on the CI server as it wraps System.err")
+	public void sysErrWrapping() {
+		System.err.println("Hello world!");
+		List<LoggingEvent> loggingEvents = StubAppender.getAndResetLoggingEvents("root-stub");
+		assertEquals(1, loggingEvents.size());
+		assertEquals("Hello world!", loggingEvents.get(0).getMessage());
+	}
+}
diff --git a/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/EventLogMessages_en.properties b/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/EventLogMessages_en.properties
new file mode 100644
index 0000000..7a26421
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/EventLogMessages_en.properties
@@ -0,0 +1 @@
+1234=English {} and {}
diff --git a/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/EventLogMessages_it.properties b/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/EventLogMessages_it.properties
new file mode 100644
index 0000000..75634d3
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/EventLogMessages_it.properties
@@ -0,0 +1 @@
+1234=Italian {} and {}
diff --git a/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/META-INF/MANIFEST.MF b/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..8248000
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,17 @@
+Manifest-Version: 1.0
+Tool: Bundlor 1.0.0.RELEASE
+Bundle-Name: Medic Logging Integration Tests
+Bundle-SymbolicName: org.eclipse.virgo.medic.log.test
+Import-Package: ch.qos.logback.classic.spi,
+ ch.qos.logback.core,
+ org.eclipse.virgo.medic.log;version="[3.0, 4.0)",
+ org.eclipse.virgo.medic.log.appender,
+ org.osgi.service.cm,
+ org.osgi.framework;version=0,
+ org.slf4j,
+ org.junit,
+ org.eclipse.virgo.test.framework,
+ org.eclipse.virgo.medic.dump,
+ org.eclipse.virgo.medic.eventlog
+Bundle-Version: 3.0.0
+Bundle-ManifestVersion: 2
\ No newline at end of file
diff --git a/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/META-INF/test.config.properties b/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/META-INF/test.config.properties
new file mode 100644
index 0000000..61b381c
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/META-INF/test.config.properties
@@ -0,0 +1,33 @@
+launcher.bundles=\
+ file:${ivy.cache}/repository/org.aspectj/com.springsource.org.aspectj.runtime/${org.aspectj}/com.springsource.org.aspectj.runtime-${org.aspectj}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.slf4j.api/${org.slf4j.api}/org.slf4j.api-${org.slf4j.api}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.util/org.eclipse.virgo.util.common/${org.eclipse.virgo.util}/org.eclipse.virgo.util.common-${org.eclipse.virgo.util}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.util/org.eclipse.virgo.util.osgi/${org.eclipse.virgo.util}/org.eclipse.virgo.util.osgi-${org.eclipse.virgo.util}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.util/org.eclipse.virgo.util.io/${org.eclipse.virgo.util}/org.eclipse.virgo.util.io-${org.eclipse.virgo.util}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.util/org.eclipse.virgo.util.math/${org.eclipse.virgo.util}/org.eclipse.virgo.util.math-${org.eclipse.virgo.util}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.util/org.eclipse.virgo.util.parser.manifest/${org.eclipse.virgo.util}/org.eclipse.virgo.util.parser.manifest-${org.eclipse.virgo.util}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.eclipse.osgi.services/${org.eclipse.osgi.services}/org.eclipse.osgi.services-${org.eclipse.osgi.services}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.eclipse.equinox.cm/${org.eclipse.equinox.cm}/org.eclipse.equinox.cm-${org.eclipse.equinox.cm}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.eclipse.equinox.log/${org.eclipse.equinox.log}/org.eclipse.equinox.log-${org.eclipse.equinox.log}.jar@start,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/org.slf4j.jul/${org.slf4j.jul}/org.slf4j.jul-${org.slf4j.jul}.jar,\
+ file:../org.eclipse.virgo.medic.logbackcorefragment/target/artifacts/org.eclipse.virgo.medic.logbackcorefragment.jar,\
+ file:../org.eclipse.virgo.medic.logbackclassicfragment/target/artifacts/org.eclipse.virgo.medic.logbackclassicfragment.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/ch.qos.logback.core/${ch.qos.logback.core}/ch.qos.logback.core-${ch.qos.logback.core}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/ch.qos.logback.classic/${ch.qos.logback.classic}/ch.qos.logback.classic-${ch.qos.logback.classic}.jar,\
+ file:${ivy.cache}/repository/org.eclipse.virgo.mirrored/ch.qos.logback.slf4j/${ch.qos.logback.slf4j}/ch.qos.logback.slf4j-${ch.qos.logback.slf4j}.jar,\
+ file:../org.eclipse.virgo.medic/target/artifacts/org.eclipse.virgo.medic.jar@start,\
+ file:../org.eclipse.virgo.medic.core/target/artifacts/org.eclipse.virgo.medic.core.jar@start,\
+ file:src/test/resources/config-fragment,\
+ file:src/test/resources/appender-fragment
+ 
+org.eclipse.virgo.test.properties.include=file:../build.versions,file:../user-ivy.properties
+
+org.eclipse.virgo.suppress.heap.dumps=false
+
+osgi.java.profile.bootdelegation=override
+osgi.parentClassloader=fwk
+osgi.context.bootdelegation=false
+osgi.compatibility.bootdelegation=false
+osgi.console=2401
+osgi.console.enable.builtin=true
+osgi.java.profile=file:src/test/resources/java7-server.profile
diff --git a/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/appender-fragment/META-INF/MANIFEST.MF b/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/appender-fragment/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..55e71f2
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/appender-fragment/META-INF/MANIFEST.MF
@@ -0,0 +1,7 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: appender.fragment
+Fragment-Host: ch.qos.logback.classic
+Export-Package: org.eclipse.virgo.medic.log.appender
+
+ 
diff --git a/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/appender-fragment/org/eclipse/virgo/medic/log/appender/StubAppender.class b/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/appender-fragment/org/eclipse/virgo/medic/log/appender/StubAppender.class
new file mode 100644
index 0000000..46bb1d4
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/appender-fragment/org/eclipse/virgo/medic/log/appender/StubAppender.class
Binary files differ
diff --git a/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/config-fragment/META-INF/MANIFEST.MF b/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/config-fragment/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..cb77330
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/config-fragment/META-INF/MANIFEST.MF
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: config.fragment
+Bundle-Vendor: SpringSource Inc.
+Fragment-Host: org.eclipse.virgo.medic.core
diff --git a/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/config-fragment/logback.xml b/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/config-fragment/logback.xml
new file mode 100644
index 0000000..46dc429
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/config-fragment/logback.xml
@@ -0,0 +1,42 @@
+<configuration>
+	
+	<appender name="localized-console" class="ch.qos.logback.core.ConsoleAppender">
+		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+			<Pattern>Localized: %-24.24thread &lt;%X{medic.eventCode}&gt; %msg %ex%n</Pattern>
+    	</encoder>
+  	</appender>
+  	
+  	<appender name="default-console" class="ch.qos.logback.core.ConsoleAppender">
+		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+			<Pattern>Default:   %-24.24thread &lt;%X{medic.eventCode}&gt; %msg %ex%n</Pattern>
+    	</encoder>
+  	</appender>
+  	
+  	<appender name="root-console" class="ch.qos.logback.core.ConsoleAppender">
+		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+			<Pattern>Root: [%d{yyyy-MM-dd HH:mm:ss.SSS}] %-24.24thread %msg %ex%n</Pattern>
+    	</encoder>
+  	</appender>
+  	
+  	<appender name="root-stub" class="org.eclipse.virgo.medic.log.appender.StubAppender"/>
+  	
+  	<appender name="default-stub" class="org.eclipse.virgo.medic.log.appender.StubAppender"/>		
+  	
+  	<appender name="localized-stub" class="org.eclipse.virgo.medic.log.appender.StubAppender"/>		    
+  	    
+  	<logger name="org.eclipse.virgo.medic.eventlog.localized">
+    	<appender-ref ref="localized-console" />
+    	<appender-ref ref="localized-stub" />
+    </logger>
+    
+    <logger name="org.eclipse.virgo.medic.eventlog.default">
+    	<appender-ref ref="default-console" />
+    	<appender-ref ref="default-stub" />
+    </logger>
+    
+    <root level="debug">
+		<appender-ref ref="root-stub"/>
+		<appender-ref ref="root-console"/>
+	</root>
+    
+</configuration>
diff --git a/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/java7-server.profile b/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/java7-server.profile
new file mode 100644
index 0000000..9a72f39
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/java7-server.profile
@@ -0,0 +1,165 @@
+org.osgi.framework.system.packages = \
+ javax.accessibility,\
+ 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;version="2.0",\
+ javax.jws.soap,\
+ javax.jws.soap;version="2.0",\
+ 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;version="1.0.1",\
+ javax.transaction;version="1.1.0",\
+ javax.transaction.xa,\
+ javax.transaction.xa;version="1.0.1",\
+ javax.transaction.xa;version="1.1.0",\
+ javax.xml,\
+ javax.xml;version="1.0.1",\
+ javax.xml.bind,\
+ javax.xml.bind;version="2.0",\
+ javax.xml.bind.annotation,\
+ javax.xml.bind.annotation;version="2.0",\
+ javax.xml.bind.annotation.adapters,\
+ javax.xml.bind.annotation.adapters;version="2.0",\
+ javax.xml.bind.attachment,\
+ javax.xml.bind.attachment;version="2.0",\
+ javax.xml.bind.helpers,\
+ javax.xml.bind.helpers;version="2.0",\
+ javax.xml.bind.util,\
+ javax.xml.bind.util;version="2.0",\
+ javax.xml.datatype,\
+ javax.xml.namespace,\
+ javax.xml.parsers,\
+ javax.xml.soap,\
+ javax.xml.soap;version="1.3.0",\
+ javax.xml.stream,\
+ javax.xml.stream;version="1.0.1",\
+ javax.xml.stream.events,\
+ javax.xml.stream.events;version="1.0.1",\
+ javax.xml.stream.util,\
+ javax.xml.stream.util;version="1.0.1",\
+ 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.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
+org.osgi.framework.bootdelegation = \
+ com_cenqua_clover,\
+ com.cenqua.*,\
+ com.yourkit.*,\
+ sun.reflect,\
+ sun.reflect.*
+org.osgi.framework.executionenvironment = \
+ OSGi/Minimum-1.0,\
+ OSGi/Minimum-1.1,\
+ J2SE-1.3,\
+ J2SE-1.4,\
+ J2SE-1.5,\
+ J2SE-1.6
+osgi.java.profile.name = SpringSource-dm-Server-Java6
diff --git a/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/logback-test.xml b/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/logback-test.xml
new file mode 100644
index 0000000..a47881b
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/logback-test.xml
@@ -0,0 +1,5 @@
+<configuration>
+	<root level="trace">
+		<appender class="org.eclipse.virgo.medic.log.appender.StubAppender"/>
+	</root>
+</configuration>
diff --git a/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/message-bundle/EventLogMessages_en.properties b/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/message-bundle/EventLogMessages_en.properties
new file mode 100644
index 0000000..54b2ddf
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/message-bundle/EventLogMessages_en.properties
@@ -0,0 +1 @@
+2345=English {} and {}
diff --git a/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/message-bundle/EventLogMessages_it.properties b/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/message-bundle/EventLogMessages_it.properties
new file mode 100644
index 0000000..09d1f6e
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/message-bundle/EventLogMessages_it.properties
@@ -0,0 +1 @@
+2345=Italian {} and {}
diff --git a/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/message-bundle/META-INF/MANIFEST.MF b/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/message-bundle/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..c4c505c
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/message-bundle/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Bundle-SymbolicName: message.bundle
+Bundle-ManifestVersion: 2
diff --git a/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/message-fragment/EventLogMessages.properties b/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/message-fragment/EventLogMessages.properties
new file mode 100644
index 0000000..3e78bfa
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/message-fragment/EventLogMessages.properties
@@ -0,0 +1 @@
+3456=Shared {} and {}
diff --git a/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/message-fragment/META-INF/MANIFEST.MF b/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/message-fragment/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..49ef7bc
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/message-fragment/META-INF/MANIFEST.MF
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0

+Bundle-SymbolicName: message.fragment

+Bundle-ManifestVersion: 2

+Fragment-Host: message.bundle

+

diff --git a/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/test-bundle_1/META-INF/MANIFEST.MF b/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/test-bundle_1/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..2544d2d
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/test-bundle_1/META-INF/MANIFEST.MF
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: test.bundle
+Import-Package: org.osgi.framework, org.slf4j, org.slf4j.spi
+Bundle-Activator: test.TestActivator
+Bundle-Version: 1.0
diff --git a/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/test-bundle_1/logback.xml b/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/test-bundle_1/logback.xml
new file mode 100644
index 0000000..fb6aadb
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/test-bundle_1/logback.xml
@@ -0,0 +1,15 @@
+<configuration>
+	<appender name="STDOUT" class="org.eclipse.virgo.medic.log.logback.ReroutingAwareConsoleAppender">
+		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+			<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-24.24thread %msg %ex%n</pattern>
+    	</encoder>
+  	</appender>
+  	
+  	<appender name="bundle1-stub" class="org.eclipse.virgo.medic.log.appender.StubAppender"/>
+  	
+  	<root level="debug">
+		<appender-ref ref="STDOUT" />
+		<appender-ref ref="bundle1-stub" />
+	</root>
+  	      	
+</configuration>
diff --git a/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/test-bundle_1/test/TestActivator.class b/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/test-bundle_1/test/TestActivator.class
new file mode 100644
index 0000000..2f77b0a
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/test-bundle_1/test/TestActivator.class
Binary files differ
diff --git a/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/test-bundle_2/META-INF/MANIFEST.MF b/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/test-bundle_2/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..a3d659b
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/test-bundle_2/META-INF/MANIFEST.MF
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: test.bundle
+Import-Package: org.osgi.framework, org.slf4j, org.slf4j.spi
+Bundle-Activator: test.TestActivator
+Bundle-Version: 2.0
diff --git a/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/test-bundle_2/logback.xml b/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/test-bundle_2/logback.xml
new file mode 100644
index 0000000..6423138
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/test-bundle_2/logback.xml
@@ -0,0 +1,15 @@
+<configuration>
+	<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+			<pattern>Bundle2 [%d{yyyy-MM-dd HH:mm:ss.SSS}] %-24.24thread %msg %ex%n</pattern>
+    	</encoder>
+  	</appender>
+  	
+  	<appender name="bundle2-stub" class="org.eclipse.virgo.medic.log.appender.StubAppender"/>
+  	
+  	<root level="debug">
+		<appender-ref ref="STDOUT" />
+		<appender-ref ref="bundle2-stub"/>
+	</root>
+  	      	
+</configuration>
diff --git a/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/test-bundle_2/test/TestActivator.class b/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/test-bundle_2/test/TestActivator.class
new file mode 100644
index 0000000..2f77b0a
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/test-bundle_2/test/TestActivator.class
Binary files differ
diff --git a/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/test-bundle_3/META-INF/MANIFEST.MF b/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/test-bundle_3/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..8789b85
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/test-bundle_3/META-INF/MANIFEST.MF
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: test.bundle
+Import-Package: org.osgi.framework, org.slf4j, org.slf4j.spi
+Bundle-Activator: test.TestActivator
+Bundle-Version: 3.0
diff --git a/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/test-bundle_3/test/TestActivator.class b/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/test-bundle_3/test/TestActivator.class
new file mode 100644
index 0000000..2f77b0a
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.integrationtest/src/test/resources/test-bundle_3/test/TestActivator.class
Binary files differ
diff --git a/medic/org.eclipse.virgo.medic.logbackclassicfragment/.settings/org.eclipse.virgo.ide.bundlor.core.prefs b/medic/org.eclipse.virgo.medic.logbackclassicfragment/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
new file mode 100644
index 0000000..b88876d
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.logbackclassicfragment/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
@@ -0,0 +1,5 @@
+#Thu Nov 12 08:44:12 GMT 2009
+org.eclipse.virgo.ide.bundlor.core.bundlor.generated.manifest.autoformatting=true
+org.eclipse.virgo.ide.bundlor.core.byte.code.scanning=true
+org.eclipse.virgo.ide.bundlor.core.template.properties.files=../build.versions;../build.properties
+eclipse.preferences.version=1
diff --git a/medic/org.eclipse.virgo.medic.logbackclassicfragment/.settings/org.springframework.ide.eclipse.core.prefs b/medic/org.eclipse.virgo.medic.logbackclassicfragment/.settings/org.springframework.ide.eclipse.core.prefs
new file mode 100644
index 0000000..00626fc
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.logbackclassicfragment/.settings/org.springframework.ide.eclipse.core.prefs
@@ -0,0 +1,67 @@
+#Wed Aug 19 13:16:35 BST 2009
+eclipse.preferences.version=1
+org.springframework.ide.eclipse.core.builders.enable.aopreferencemodelbuilder=true
+org.springframework.ide.eclipse.core.builders.enable.beanmetadatabuilder=true
+org.springframework.ide.eclipse.core.builders.enable.osgibundleupdater=false
+org.springframework.ide.eclipse.core.enable.project.preferences=false
+org.springframework.ide.eclipse.core.validator.enable.com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.enable.com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.enable.com.springsource.sts.server.quickfix.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.enable.org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.enable.org.springframework.ide.eclipse.core.springvalidator=false
+org.springframework.ide.eclipse.core.validator.enable.org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.applicationSymbolicNameRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.applicationVersionRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleActivationPolicyRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleActivatorRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleManifestVersionRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleNameRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleSymbolicNameRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleVersionRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.exportPackageRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.importRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.parsingProblemsRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.requireBundleRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.AvoidDriverManagerDataSource-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.ImportElementsAtTopRulee-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.ParentBeanSpecifiesAbstractClassRule-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.RefElementRule-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.TooManyBeansInFileRule-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.UnnecessaryValueElementRule-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.UseBeanInheritance-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.legacyxmlusage.jndiobjectfactory-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.importBundleVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.importLibraryVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.importPackageVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.requireBundleVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanAlias-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanClass-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanConstructorArgument-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanDefinition-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanDefinitionHolder-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanFactory-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanInitDestroyMethod-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanProperty-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanReference-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.methodOverride-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.parsingProblems-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.requiredProperty-org.springframework.ide.eclipse.beans.core.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.core.springClasspath-org.springframework.ide.eclipse.core.springvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.action-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.actionstate-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.attribute-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.attributemapper-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.beanaction-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.evaluationaction-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.evaluationresult-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.exceptionhandler-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.import-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.inputattribute-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.mapping-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.outputattribute-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.set-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.state-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.subflowstate-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.transition-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.variable-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.webflowstate-org.springframework.ide.eclipse.webflow.core.validator=true
diff --git a/medic/org.eclipse.virgo.medic.logbackclassicfragment/src/main/resources/about.html b/medic/org.eclipse.virgo.medic.logbackclassicfragment/src/main/resources/about.html
new file mode 100644
index 0000000..c258ef5
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.logbackclassicfragment/src/main/resources/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>June 5, 2006</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/medic/org.eclipse.virgo.medic.logbackclassicfragment/template.mf b/medic/org.eclipse.virgo.medic.logbackclassicfragment/template.mf
new file mode 100644
index 0000000..2284ac7
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.logbackclassicfragment/template.mf
@@ -0,0 +1,8 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: org.eclipse.virgo.medic.logbackclassicfragment
+Bundle-Name: Medic Logback Core Fragment
+Bundle-Version: ${version}
+Fragment-Host: ch.qos.logback.classic;bundle-version="${logbackVersion:[=.=.=, +1.0.0)}"
+Import-Package: 
+ org.eclipse.virgo.medic.log.logback;version="${version:[=.=.=, =.+1)}"
diff --git a/medic/org.eclipse.virgo.medic.logbackcorefragment/.settings/org.eclipse.virgo.ide.bundlor.core.prefs b/medic/org.eclipse.virgo.medic.logbackcorefragment/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
new file mode 100644
index 0000000..b88876d
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.logbackcorefragment/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
@@ -0,0 +1,5 @@
+#Thu Nov 12 08:44:12 GMT 2009
+org.eclipse.virgo.ide.bundlor.core.bundlor.generated.manifest.autoformatting=true
+org.eclipse.virgo.ide.bundlor.core.byte.code.scanning=true
+org.eclipse.virgo.ide.bundlor.core.template.properties.files=../build.versions;../build.properties
+eclipse.preferences.version=1
diff --git a/medic/org.eclipse.virgo.medic.logbackcorefragment/.settings/org.springframework.ide.eclipse.core.prefs b/medic/org.eclipse.virgo.medic.logbackcorefragment/.settings/org.springframework.ide.eclipse.core.prefs
new file mode 100644
index 0000000..00626fc
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.logbackcorefragment/.settings/org.springframework.ide.eclipse.core.prefs
@@ -0,0 +1,67 @@
+#Wed Aug 19 13:16:35 BST 2009
+eclipse.preferences.version=1
+org.springframework.ide.eclipse.core.builders.enable.aopreferencemodelbuilder=true
+org.springframework.ide.eclipse.core.builders.enable.beanmetadatabuilder=true
+org.springframework.ide.eclipse.core.builders.enable.osgibundleupdater=false
+org.springframework.ide.eclipse.core.enable.project.preferences=false
+org.springframework.ide.eclipse.core.validator.enable.com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.enable.com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.enable.com.springsource.sts.server.quickfix.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.enable.org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.enable.org.springframework.ide.eclipse.core.springvalidator=false
+org.springframework.ide.eclipse.core.validator.enable.org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.applicationSymbolicNameRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.applicationVersionRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleActivationPolicyRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleActivatorRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleManifestVersionRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleNameRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleSymbolicNameRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleVersionRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.exportPackageRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.importRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.parsingProblemsRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.requireBundleRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.AvoidDriverManagerDataSource-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.ImportElementsAtTopRulee-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.ParentBeanSpecifiesAbstractClassRule-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.RefElementRule-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.TooManyBeansInFileRule-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.UnnecessaryValueElementRule-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.UseBeanInheritance-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.legacyxmlusage.jndiobjectfactory-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.importBundleVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.importLibraryVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.importPackageVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.requireBundleVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanAlias-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanClass-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanConstructorArgument-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanDefinition-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanDefinitionHolder-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanFactory-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanInitDestroyMethod-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanProperty-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanReference-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.methodOverride-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.parsingProblems-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.requiredProperty-org.springframework.ide.eclipse.beans.core.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.core.springClasspath-org.springframework.ide.eclipse.core.springvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.action-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.actionstate-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.attribute-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.attributemapper-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.beanaction-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.evaluationaction-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.evaluationresult-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.exceptionhandler-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.import-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.inputattribute-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.mapping-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.outputattribute-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.set-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.state-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.subflowstate-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.transition-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.variable-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.webflowstate-org.springframework.ide.eclipse.webflow.core.validator=true
diff --git a/medic/org.eclipse.virgo.medic.logbackcorefragment/src/main/resources/about.html b/medic/org.eclipse.virgo.medic.logbackcorefragment/src/main/resources/about.html
new file mode 100644
index 0000000..c258ef5
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.logbackcorefragment/src/main/resources/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>June 5, 2006</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/medic/org.eclipse.virgo.medic.logbackcorefragment/template.mf b/medic/org.eclipse.virgo.medic.logbackcorefragment/template.mf
new file mode 100644
index 0000000..2425c44
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.logbackcorefragment/template.mf
@@ -0,0 +1,8 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: org.eclipse.virgo.medic.logbackcorefragment
+Bundle-Name: Medic Logback Core Fragment
+Bundle-Version: ${version}
+Fragment-Host: ch.qos.logback.core;bundle-version="${logbackVersion:[=.=.=, +1.0.0)}"
+Import-Package: 
+ org.eclipse.virgo.medic.log.logback;version="${version:[=.=.=, =.+1)}"
diff --git a/medic/org.eclipse.virgo.medic.test/.settings/org.eclipse.virgo.ide.bundlor.core.prefs b/medic/org.eclipse.virgo.medic.test/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
new file mode 100644
index 0000000..bd6b489
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.test/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
@@ -0,0 +1,5 @@
+#Thu Nov 12 08:44:28 GMT 2009
+com.springsource.server.ide.bundlor.core.bundlor.generated.manifest.autoformatting=true
+com.springsource.server.ide.bundlor.core.byte.code.scanning=true
+com.springsource.server.ide.bundlor.core.template.properties.files=../build.versions;../build.properties
+eclipse.preferences.version=1
diff --git a/medic/org.eclipse.virgo.medic.test/.settings/org.eclipse.wst.common.project.facet.core.xml b/medic/org.eclipse.virgo.medic.test/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..92aa290
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.test/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+  <installed facet="org.eclipse.virgo.server.bundle" version="1.0"/>
+</faceted-project>
diff --git a/medic/org.eclipse.virgo.medic.test/.springBeans b/medic/org.eclipse.virgo.medic.test/.springBeans
new file mode 100644
index 0000000..5152991
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.test/.springBeans
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beansProjectDescription>
+	<version>1</version>
+	<pluginVersion><![CDATA[2.2.5.M1]]></pluginVersion>
+	<configSuffixes>
+		<configSuffix><![CDATA[xml]]></configSuffix>
+	</configSuffixes>
+	<enableImports><![CDATA[false]]></enableImports>
+	<configs>
+	</configs>
+	<configSets>
+	</configSets>
+</beansProjectDescription>
diff --git a/medic/org.eclipse.virgo.medic.test/src/main/java/org/eclipse/virgo/medic/test/eventlog/LoggedEvent.java b/medic/org.eclipse.virgo.medic.test/src/main/java/org/eclipse/virgo/medic/test/eventlog/LoggedEvent.java
new file mode 100644
index 0000000..72db818
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.test/src/main/java/org/eclipse/virgo/medic/test/eventlog/LoggedEvent.java
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.test.eventlog;
+
+import java.io.PrintStream;
+
+import org.eclipse.virgo.medic.eventlog.Level;
+
+
+public class LoggedEvent {
+
+    private final String code;
+
+    private final Level level;
+
+    private final Throwable throwable;
+
+    private final Object[] inserts;
+
+    LoggedEvent(String code, Level level, Object... inserts) {
+        this(code, level, null, inserts);
+    }
+
+    LoggedEvent(String code, Level level, Throwable throwable, Object... inserts) {
+        this.code = code;
+        this.level = level;
+        this.throwable = throwable;
+        this.inserts = inserts.clone();
+    }
+
+    /**
+     * Returns the code of the event that was logged.
+     * 
+     * @return the logged event's code.
+     */
+    public String getCode() {
+        return this.code;
+    }
+
+    /**
+     * Returns the level of the event that was logged.
+     * 
+     * @return the logged event's level
+     */
+    public Level getLevel() {
+        return this.level;
+    }
+
+    /**
+     * Returns the <code>Throwable</code> that was logged as part of the event, or <code>null</code> if no
+     * <code>Throwable</code> was logged
+     * 
+     * @return The logged <code>Throwable</code>
+     */
+    public Throwable getThrowable() {
+        return throwable;
+    }
+
+    /**
+     * Returns the inserts that were logged, or an empty array if no inserts were logged.
+     * 
+     * @return The logged inserts, never <code>null</code>.
+     */
+    public Object[] getInserts() {
+        return inserts.clone();
+    }
+    
+    /**
+     * Print (to outStr) a human-readable form of the LoggedEvent, without fancy formatting.
+     * 
+     * @param printStream where to print it
+     */
+    public void print(PrintStream printStream) {
+        printStream.print(String.format("Code: '%s' Level: '%s'", this.code, String.valueOf(this.level)));
+        printInserts(printStream);
+        if (this.throwable!=null) {
+            printStream.print("  Exception: ");
+            this.throwable.printStackTrace(printStream);
+        }
+    }
+    
+    /**
+     * Print inserts.
+     * 
+     * @param outStr where to print them
+     */
+    private void printInserts(PrintStream outStr) {
+        if (inserts.length != 0) {
+            outStr.print(String.format(" Inserts: {'%s'", String.valueOf(this.inserts[0])));
+            for (int ins = 1; ins < this.inserts.length; ++ins) {
+                outStr.print(String.format(", '%s'", String.valueOf(this.inserts[ins])));
+            }
+            outStr.print("}");
+        }
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.test/src/main/java/org/eclipse/virgo/medic/test/eventlog/MockEventLogger.java b/medic/org.eclipse.virgo.medic.test/src/main/java/org/eclipse/virgo/medic/test/eventlog/MockEventLogger.java
new file mode 100644
index 0000000..6f7903c
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.test/src/main/java/org/eclipse/virgo/medic/test/eventlog/MockEventLogger.java
@@ -0,0 +1,164 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.test.eventlog;
+
+import java.io.PrintStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.medic.eventlog.Level;
+import org.eclipse.virgo.medic.eventlog.LogEvent;
+
+
+/**
+ * A mock implementation of {@link EventLogger} for testing purposes. The events that have been logged can be accessed
+ * by calling {@link #getLoggedEvents()}.<br/>
+ * This implementation saves all events for subsequent analysis, and has an option to clear the log for re-use.<br/>
+ * This version also has an operation for asserting that the sequence of events matches a supplied array. This is for
+ * convenient unit tests.
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics:</strong><br/>
+ * Thread-safe during logging, but not for retrieval and re-initialisation.
+ */
+public class MockEventLogger implements EventLogger {
+
+    private final List<LoggedEvent> loggedEvents = new CopyOnWriteArrayList<LoggedEvent>();
+
+    private final boolean noisy;
+
+    private volatile boolean called = false;
+
+    private final PrintStream printStream;
+    
+    public MockEventLogger() {
+        this(false, null);
+    }
+
+    public MockEventLogger(boolean noisy, PrintStream printStream) {
+        this.noisy = noisy;
+        this.printStream = printStream;
+    }
+
+    public void log(LogEvent logEvent, Object... inserts) {
+        this.log(logEvent.getEventCode(), logEvent.getLevel(), inserts);
+    }
+
+    public void log(LogEvent logEvent, Throwable throwable, Object... inserts) {
+        this.log(logEvent.getEventCode(), logEvent.getLevel(), throwable, inserts);
+    }
+
+    public void log(String code, Level level, Object... inserts) {
+        LoggedEvent loggedEvent = new LoggedEvent(code, level, inserts);
+        this.loggedEvents.add(loggedEvent);
+        this.called = true;
+        if (noisy) {
+            loggedEvent.print(this.printStream);
+        }
+    }
+
+    public void log(String code, Level level, Throwable throwable, Object... inserts) {
+        LoggedEvent loggedEvent = new LoggedEvent(code, level, throwable, inserts);
+        this.loggedEvents.add(loggedEvent);
+        this.called = true;
+        if (noisy) {
+            loggedEvent.print(this.printStream);
+        }
+    }
+
+    /**
+     * Returns a <code>List</code> of the events that have been logged. The order of the items in the list corresponds
+     * to the order in which the events were logged. If no events have been logged an empty list is returned.
+     * 
+     * @return the logged events
+     */
+    public List<LoggedEvent> getLoggedEvents() {
+        return this.loggedEvents;
+    }
+
+    /**
+     * @return true if this EventLogger has been called since (re)initialisation.
+     */
+    public boolean getCalled() {
+        return this.called;
+    }
+
+    /**
+     * Reinitialise this EventLogger.
+     */
+    public void reinitialise() {
+        this.called = false;
+        this.loggedEvents.clear();
+    }
+
+    /**
+     * Helper method for unit tests to check sequence of logged events after a test.
+     * 
+     * @param codes sequence of message codes expected
+     * @return true iff sequence of codes matches logged events exactly
+     */
+    public boolean isLogged(String... codes) {
+        if (this.loggedEvents.size() != codes.length) {
+            return false;
+        }
+        int index = 0;
+        for (String code : codes) {
+            if (!code.equals(this.loggedEvents.get(index++).getCode())) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * Helper method for unit tests to check superset of logged events after a test.
+     * 
+     * @param codes sequence of message codes expected to be contained in logged events (in any order)
+     * @return true iff the codes are all in the saved {@link LoggedEvent}s.
+     */
+    public boolean containsLogged(String... codes) {
+        List<String> codeList = new ArrayList<String>();
+        for (LoggedEvent event : this.loggedEvents) {
+            codeList.add(event.getCode());
+        }
+        for (String code : codes) {
+            if (!codeList.contains(code)){
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * Helper method for unit tests to retrieve specific logged events from saved events.
+     * 
+     * @param codes sequence of message codes to have events extracted, in order.
+     * @return LoggedEvents with supplied codes in same sequence from log.
+     */
+    public List<LoggedEvent> getEventsWithCodes(String... codes) {
+        List<LoggedEvent> eventList = new ArrayList<LoggedEvent>();
+        int eventIndex = 0;
+        int loggedEventsSize = this.loggedEvents.size();
+        for (String code : codes) {
+            while (eventIndex < loggedEventsSize) {
+                LoggedEvent loggedEvent = this.loggedEvents.get(eventIndex++);
+                if (code.equals(loggedEvent.getCode())) {
+                    eventList.add(loggedEvent);
+                    break;
+                }
+            }
+        }
+        return eventList;
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.test/src/test/java/org/eclipse/virgo/medic/test/eventlog/LoggedEventTests.java b/medic/org.eclipse.virgo.medic.test/src/test/java/org/eclipse/virgo/medic/test/eventlog/LoggedEventTests.java
new file mode 100644
index 0000000..81a76fc
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.test/src/test/java/org/eclipse/virgo/medic/test/eventlog/LoggedEventTests.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.test.eventlog;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.io.StringWriter;
+import java.io.UnsupportedEncodingException;
+import java.io.Writer;
+
+import org.eclipse.virgo.medic.eventlog.Level;
+import org.junit.Test;
+
+
+public class LoggedEventTests {
+	
+	@Test
+	public void print() throws UnsupportedEncodingException {
+		StringWriter printedWriter = new StringWriter();
+		PrintStream printStream = new PrintStream(new WriterOutputStream(printedWriter), true, UTF_8.name());
+		new LoggedEvent("code", Level.WARNING, "a", 5, true).print(printStream);
+
+		String printed = printedWriter.toString();
+		assertEquals("Code: 'code' Level: 'WARNING' Inserts: {'a', '5', 'true'}", printed);
+	}
+	
+	@Test
+	public void printWithOneInsert() throws UnsupportedEncodingException {
+		StringWriter printedWriter = new StringWriter();
+        PrintStream printStream = new PrintStream(new WriterOutputStream(printedWriter), true, UTF_8.name());
+		
+		new LoggedEvent("code", Level.WARNING, 5).print(printStream);
+		
+		String printed = printedWriter.toString();
+		assertEquals("Code: 'code' Level: 'WARNING' Inserts: {'5'}", printed);
+	}
+	
+	@Test
+	public void printWithNoInserts() throws UnsupportedEncodingException {
+		StringWriter printedWriter = new StringWriter();
+        PrintStream printStream = new PrintStream(new WriterOutputStream(printedWriter), true, UTF_8.name());
+		
+		new LoggedEvent("code", Level.WARNING).print(printStream);
+		
+		String printed = printedWriter.toString();
+		assertEquals("Code: 'code' Level: 'WARNING'", printed);
+	}
+	
+	private static final class WriterOutputStream extends OutputStream {
+		
+		private final Writer writer;
+
+		private WriterOutputStream(Writer writer) {
+			this.writer = writer;
+		}
+		
+		@Override
+		public void write(int b) throws IOException {
+			writer.write(b);
+		}		
+	}
+}
diff --git a/medic/org.eclipse.virgo.medic.test/src/test/java/org/eclipse/virgo/medic/test/eventlog/MockEventLoggerTests.java b/medic/org.eclipse.virgo.medic.test/src/test/java/org/eclipse/virgo/medic/test/eventlog/MockEventLoggerTests.java
new file mode 100644
index 0000000..933e5c0
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.test/src/test/java/org/eclipse/virgo/medic/test/eventlog/MockEventLoggerTests.java
@@ -0,0 +1,168 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.test.eventlog;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.List;
+
+import org.eclipse.virgo.medic.eventlog.Level;
+import org.eclipse.virgo.medic.test.eventlog.LoggedEvent;
+import org.eclipse.virgo.medic.test.eventlog.MockEventLogger;
+import org.junit.Test;
+
+
+public class MockEventLoggerTests {
+
+    private final MockEventLogger eventLogger = new MockEventLogger();
+
+    @Test
+    public void emptyList() {
+        List<LoggedEvent> loggedEvents = this.eventLogger.getLoggedEvents();
+        assertNotNull(loggedEvents);
+        assertEquals(0, loggedEvents.size());
+    }
+
+    @Test
+    public void eventWithoutThrowableWithInserts() {
+        this.eventLogger.log("123", Level.INFO, "a", "b", true);
+
+        List<LoggedEvent> loggedEvents = this.eventLogger.getLoggedEvents();
+        assertNotNull(loggedEvents);
+        assertEquals(1, loggedEvents.size());
+
+        LoggedEvent loggedEvent = loggedEvents.get(0);
+        assertEquals("123", loggedEvent.getCode());
+        assertEquals(Level.INFO, loggedEvent.getLevel());
+        assertNull(loggedEvent.getThrowable());
+        assertArrayEquals(new Object[] { "a", "b", true }, loggedEvent.getInserts());
+    }
+
+    @Test
+    public void eventWithoutThrowableWithoutInserts() {
+        this.eventLogger.log("234", Level.ERROR);
+
+        List<LoggedEvent> loggedEvents = this.eventLogger.getLoggedEvents();
+        assertNotNull(loggedEvents);
+        assertEquals(1, loggedEvents.size());
+
+        LoggedEvent loggedEvent = loggedEvents.get(0);
+        assertEquals("234", loggedEvent.getCode());
+        assertEquals(Level.ERROR, loggedEvent.getLevel());
+        assertNull(loggedEvent.getThrowable());
+        assertNotNull(loggedEvent.getInserts());
+        assertEquals(0, loggedEvent.getInserts().length);
+    }
+
+    @Test
+    public void eventWithThrowableWithInserts() {
+        Throwable throwable = new Throwable();
+        this.eventLogger.log("345", Level.WARNING, throwable, "a", "b", true);
+
+        List<LoggedEvent> loggedEvents = this.eventLogger.getLoggedEvents();
+        assertNotNull(loggedEvents);
+        assertEquals(1, loggedEvents.size());
+
+        LoggedEvent loggedEvent = loggedEvents.get(0);
+        assertEquals("345", loggedEvent.getCode());
+        assertEquals(Level.WARNING, loggedEvent.getLevel());
+        assertEquals(throwable, loggedEvent.getThrowable());
+        assertArrayEquals(new Object[] { "a", "b", true }, loggedEvent.getInserts());
+    }
+
+    @Test
+    public void eventWithThrowableWithoutInserts() {
+        Throwable throwable = new Throwable();
+        this.eventLogger.log("456", Level.ERROR, throwable);
+
+        List<LoggedEvent> loggedEvents = this.eventLogger.getLoggedEvents();
+        assertNotNull(loggedEvents);
+        assertEquals(1, loggedEvents.size());
+
+        LoggedEvent loggedEvent = loggedEvents.get(0);
+        assertEquals("456", loggedEvent.getCode());
+        assertEquals(Level.ERROR, loggedEvent.getLevel());
+        assertEquals(throwable, loggedEvent.getThrowable());
+        assertNotNull(loggedEvent.getInserts());
+        assertEquals(0, loggedEvent.getInserts().length);
+    }
+
+    @Test
+    public void multipleEventsIncludingDuplicates() {
+        this.eventLogger.log("123", Level.INFO);
+        this.eventLogger.log("234", Level.INFO);
+        this.eventLogger.log("345", Level.INFO);
+        this.eventLogger.log("345", Level.INFO);
+        this.eventLogger.log("123", Level.INFO);
+
+        List<LoggedEvent> loggedEvents = this.eventLogger.getLoggedEvents();
+        assertNotNull(loggedEvents);
+        assertEquals(5, loggedEvents.size());
+        assertLoggedEventMatch(loggedEvents.get(0), "123", null, null);
+        assertLoggedEventMatch(loggedEvents.get(1), "234", null, null);
+        assertLoggedEventMatch(loggedEvents.get(2), "345", null, null);
+        assertLoggedEventMatch(loggedEvents.get(3), "345", null, null);
+        assertLoggedEventMatch(loggedEvents.get(4), "123", null, null);
+        assertTrue("Correct event code sequence not detected", this.eventLogger.isLogged("123", "234", "345", "345", "123"));
+        assertFalse("Incorrect event code sequence not detected", this.eventLogger.isLogged("123", "234", "345", "123"));
+        assertFalse("Incorrect event code sequence not detected", this.eventLogger.isLogged("123", "234", "345", "123", "123"));
+    }
+
+    @Test
+    public void retrieveEventSequenceWithCodes() {
+        this.eventLogger.log("123", Level.INFO, new Integer(1));
+        this.eventLogger.log("234", Level.INFO, new Integer(2));
+        this.eventLogger.log("345", Level.INFO, new Integer(3));
+        this.eventLogger.log("345", Level.INFO, new Integer(4));
+        this.eventLogger.log("123", Level.INFO, new Integer(5));
+
+        List<LoggedEvent> loggedEvents = this.eventLogger.getEventsWithCodes("345", "123", "345", "xyz");
+        assertNotNull(loggedEvents);
+        assertEquals(2, loggedEvents.size());
+        assertLoggedEventMatch(loggedEvents.get(0), "345", Level.INFO, null, 3);
+        assertLoggedEventMatch(loggedEvents.get(1), "123", Level.INFO, null, 5);
+    }
+
+    @Test
+    public void containsEventCodeSequence() {
+        this.eventLogger.log("123", Level.INFO);
+        this.eventLogger.log("234", Level.INFO);
+        this.eventLogger.log("345", Level.INFO);
+        this.eventLogger.log("345", Level.INFO);
+        this.eventLogger.log("123", Level.INFO);
+
+        assertTrue("Failed to detect codes 234, 123, 345", this.eventLogger.containsLogged("234","123","345"));
+        assertFalse("Erroneously detected all codes 123, xyz, 234", this.eventLogger.containsLogged("123", "xyz", "234"));
+        this.eventLogger.reinitialise();
+        assertFalse("Detected code 123 after reinitialisation", this.eventLogger.containsLogged("123"));
+        assertTrue("eventLogger not empty after reinitialisation", this.eventLogger.getLoggedEvents().isEmpty());
+    }
+
+    private static void assertLoggedEventMatch(LoggedEvent loggedEvent, String code, Level level, Throwable throwable, Object... inserts) {
+        assertNotNull(loggedEvent);
+        assertEquals("LoggedEvent code", code, loggedEvent.getCode());
+        if (level != null) {
+            assertEquals("LoggedEvent level in " + code, level, loggedEvent.getLevel());
+        }
+        assertEquals("LoggedEvent throwable in " + code, throwable, loggedEvent.getThrowable());
+        assertEquals("Number of inserts in " + code, inserts.length, loggedEvent.getInserts().length);
+        int index = 0;
+        for (Object insert : inserts) {
+            assertEquals("LoggedEvent insert in " + code, insert, loggedEvent.getInserts()[index++]);
+        }
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.test/template.mf b/medic/org.eclipse.virgo.medic.test/template.mf
new file mode 100644
index 0000000..e6b36cb
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.test/template.mf
@@ -0,0 +1,9 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: org.eclipse.virgo.medic.eventlog.test
+Bundle-Name: Medic Event Log Test Bundle
+Bundle-Version: ${version}
+Import-Template: 
+ org.eclipse.virgo.medic.*;version="0"
+Excluded-Imports: 
+ org.junit.*
diff --git a/medic/org.eclipse.virgo.medic.testfragment/.settings/org.eclipse.virgo.ide.bundlor.core.prefs b/medic/org.eclipse.virgo.medic.testfragment/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
new file mode 100644
index 0000000..7392e63
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.testfragment/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
@@ -0,0 +1,5 @@
+#Thu Nov 12 08:44:57 GMT 2009
+com.springsource.server.ide.bundlor.core.bundlor.generated.manifest.autoformatting=true
+com.springsource.server.ide.bundlor.core.byte.code.scanning=true
+com.springsource.server.ide.bundlor.core.template.properties.files=../build.versions;../build.properties
+eclipse.preferences.version=1
diff --git a/medic/org.eclipse.virgo.medic.testfragment/.settings/org.eclipse.wst.common.project.facet.core.xml b/medic/org.eclipse.virgo.medic.testfragment/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..92aa290
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.testfragment/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+  <installed facet="org.eclipse.virgo.server.bundle" version="1.0"/>
+</faceted-project>
diff --git a/medic/org.eclipse.virgo.medic.testfragment/.springBeans b/medic/org.eclipse.virgo.medic.testfragment/.springBeans
new file mode 100644
index 0000000..5152991
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.testfragment/.springBeans
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beansProjectDescription>
+	<version>1</version>
+	<pluginVersion><![CDATA[2.2.5.M1]]></pluginVersion>
+	<configSuffixes>
+		<configSuffix><![CDATA[xml]]></configSuffix>
+	</configSuffixes>
+	<enableImports><![CDATA[false]]></enableImports>
+	<configs>
+	</configs>
+	<configSets>
+	</configSets>
+</beansProjectDescription>
diff --git a/medic/org.eclipse.virgo.medic.testfragment/build.xml b/medic/org.eclipse.virgo.medic.testfragment/build.xml
new file mode 100644
index 0000000..daa4411
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.testfragment/build.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="org.eclipse.virgo.medic.testfragment">
+
+	<property name="clover.coverage" value="0%"/>
+	
+	<property file="${basedir}/../build.properties"/>
+	<property file="${basedir}/../build.versions"/>
+	<import file="${basedir}/../virgo-build/aspect/default.xml"/>
+
+</project>
diff --git a/medic/org.eclipse.virgo.medic.testfragment/ivy.xml b/medic/org.eclipse.virgo.medic.testfragment/ivy.xml
new file mode 100644
index 0000000..d546393
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.testfragment/ivy.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="http://ivyrep.jayasoft.org/ivy-doc.xsl"?>
+<ivy-module
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:noNamespaceSchemaLocation="http://incubator.apache.org/ivy/schemas/ivy.xsd"
+		version="1.3">
+
+	<info organisation="${project.organisation}" module="${ant.project.name}"/>
+
+	<configurations>
+		<include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>
+	</configurations>
+
+	<publications>
+		<artifact name="${ant.project.name}"/>
+		<artifact name="${ant.project.name}-sources" type="src" ext="jar"/>
+	</publications>
+
+	<dependencies>
+		<dependency org="org.eclipse.virgo.mirrored" name="org.eclipse.osgi" rev="${org.eclipse.osgi}" conf="provided->runtime"/>
+		<dependency org="org.eclipse.virgo.mirrored" name="org.slf4j.api" rev="${org.slf4j.api}" conf="aspects->runtime"/>
+		<dependency org="org.aspectj" name="com.springsource.org.aspectj.runtime" rev="${org.aspectj}" conf="aspects->runtime"/>
+	</dependencies>
+
+</ivy-module>
diff --git a/medic/org.eclipse.virgo.medic.testfragment/src/main/java/org/eclipse/virgo/medic/dump/Dump.java b/medic/org.eclipse.virgo.medic.testfragment/src/main/java/org/eclipse/virgo/medic/dump/Dump.java
new file mode 100644
index 0000000..2dd3a81
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.testfragment/src/main/java/org/eclipse/virgo/medic/dump/Dump.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.dump;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.FileWriter;
+import java.io.Writer;
+import java.util.Map;
+
+/**
+ * A <code>Dump</code> represents a dump being generated by a {@link DumpGenerator}. During dump generation
+ * {@link DumpContributor DumpContributors} are called to contribute to the dump. Contributors can request a
+ * {@link Writer}, {@link File}, etc. which they may use to write out their contribution to the dump.
+ */
+public interface Dump {
+
+    /**
+     * Returns a timestamp that identifies that time at which this dump was generated.
+     * 
+     * @return The timestamp of the dump's generation
+     */
+    long getTimestamp();
+
+    /**
+     * Returns the context that is associated with this dump. If there is no associated context an empty
+     * <code>Map</code> is returned.
+     * 
+     * @return The dump's context
+     */
+    Map<String, Object> getContext();
+
+    /**
+     * Returns the {@link Throwable Throwables} associated with this dump.
+     * 
+     * @return The dump's <code>Throwable</code>s
+     */
+    Throwable[] getThrowables();
+
+    /**
+     * Returns the cause of this dump.
+     * 
+     * @return The dump's cause.
+     */
+    String getCause();
+
+    /**
+     * Creates a {@link FileWriter} that writes to a file with the supplied name, within this dump's output location.
+     * @param name 
+     * 
+     * @return a <code>FileWriter</code> to which a contribution to the dump can be written
+     * @throws DumpContributionFailedException 
+     */
+    FileWriter createFileWriter(String name) throws DumpContributionFailedException;
+
+    /**
+     * Creates a {@link FileOutputStream} that writes to a file with the supplied name, within this dump's output
+     * location.
+     * @param name 
+     * 
+     * @return a <code>FileOutputStream</code> to which a contribution to the dump can be written
+     * @throws DumpContributionFailedException 
+     */
+    FileOutputStream createFileOutputStream(String name) throws DumpContributionFailedException;
+
+    /**
+     * Creates a {@link File} with the supplied name, within this dump's output location.
+     * @param name 
+     * 
+     * @return a <code>File</code> to which a contribution to the dump can be written
+     */
+    File createFile(String name);
+
+}
diff --git a/medic/org.eclipse.virgo.medic.testfragment/src/main/java/org/eclipse/virgo/medic/dump/DumpContributionFailedException.java b/medic/org.eclipse.virgo.medic.testfragment/src/main/java/org/eclipse/virgo/medic/dump/DumpContributionFailedException.java
new file mode 100644
index 0000000..edaf464
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.testfragment/src/main/java/org/eclipse/virgo/medic/dump/DumpContributionFailedException.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.dump;
+
+/**
+ * A <code>DumpContributionFailedException</code> is thrown by a {@link DumpContributor} to indicate that a failure has
+ * occurred when it was attempting to make a contribution to a dump.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread-safe.
+ * 
+ */
+public class DumpContributionFailedException extends DumpGenerationFailedException {
+
+    private static final long serialVersionUID = -3196511149954617337L;
+
+    /**
+     * Create a new DumpContributionFailedException with the supplied message that describes the failure
+     * 
+     * @param message The message describing the failure
+     */
+    public DumpContributionFailedException(String message) {
+        super(message);
+    }
+
+    /**
+     * Create a new DumpContributionFailedException with the supplied failure cause and message that describes the
+     * failure
+     * 
+     * @param message The message describing the failure
+     * @param cause The cause of the contribution failure
+     */
+    public DumpContributionFailedException(String message, Throwable cause) {
+        super(message, cause);
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.testfragment/src/main/java/org/eclipse/virgo/medic/dump/DumpContributor.java b/medic/org.eclipse.virgo.medic.testfragment/src/main/java/org/eclipse/virgo/medic/dump/DumpContributor.java
new file mode 100644
index 0000000..ddffe7c
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.testfragment/src/main/java/org/eclipse/virgo/medic/dump/DumpContributor.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.dump;
+
+/**
+ * A <code>DumpContributor</code> is implemented to contribute information to a dump. Contributors are 'registered' with
+ * a {@link DumpGenerator} by publishing them in the service registry.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * <code>DumpContributor</code>s must be thread-safe.
+ */
+public interface DumpContributor {
+
+    /**
+     * Contribute to the supplied {@link Dump}.
+     * 
+     * @param dump The dump to which a contribution may be made.
+     * @throws DumpContributionFailedException if the dump contribution cannot be created
+     */
+    void contribute(Dump dump) throws DumpContributionFailedException;
+
+    /**
+     * Returns the name of this <code>DumpContributor</code>. The name is used by a {@link DumpGenerator} when
+     * determining which contributors should be excluded from contributing to a dump.
+     * 
+     * @return The contributor's name
+     */
+    String getName();
+}
diff --git a/medic/org.eclipse.virgo.medic.testfragment/src/main/java/org/eclipse/virgo/medic/dump/DumpGenerationFailedException.java b/medic/org.eclipse.virgo.medic.testfragment/src/main/java/org/eclipse/virgo/medic/dump/DumpGenerationFailedException.java
new file mode 100644
index 0000000..5dded04
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.testfragment/src/main/java/org/eclipse/virgo/medic/dump/DumpGenerationFailedException.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.dump;
+
+/**
+ * A <code>DumpGenerationFailedException</code> is thrown by a {@link DumpGenerator} to indicate that a failure has
+ * occurred during dump generation.
+ * 
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread-safe.
+ * 
+ */
+public class DumpGenerationFailedException extends Exception {
+
+    private static final long serialVersionUID = -3196511149954617337L;
+
+    /**
+     * Create a new DumpGenerationFailedException with the supplied message that describes the failure
+     * 
+     * @param message The message describing the failure
+     */
+    public DumpGenerationFailedException(String message) {
+        super(message);
+    }
+
+    /**
+     * Create a new DumpGenerationFailedException with the supplied failure cause and message that describes the failure
+     * 
+     * @param message The message describing the failure
+     * @param cause The cause of the generation failure
+     */
+    public DumpGenerationFailedException(String message, Throwable cause) {
+        super(message, cause);
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.testfragment/src/main/java/org/eclipse/virgo/medic/dump/DumpGenerator.java b/medic/org.eclipse.virgo.medic.testfragment/src/main/java/org/eclipse/virgo/medic/dump/DumpGenerator.java
new file mode 100644
index 0000000..2a2d530
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.testfragment/src/main/java/org/eclipse/virgo/medic/dump/DumpGenerator.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.dump;
+
+import java.util.Map;
+
+/**
+ * A <code>DumpGenerator</code> can be used to programatically request the generation of a dump. A
+ * <code>DumpGenerator</code> instance can be obtained from the service registry.
+ * <p />
+ * 
+ * When a dump is requested, the <code>DumpGenerator</code> will, by default, provide all {@link DumpContributor
+ * DumpContributors} that are known to it with an opportunity to contribute to the dump. <code>DumpContributor</code>
+ * instances are made known to a <code>DumpGeneraator</code> by publishing them in the service registry.
+ * <p />
+ * 
+ * A <code>DumpGenerator</code> can be configured to exclude <code>DumpContributor</code>s from contributing to dumps
+ * with a particular cause. TODO Expand the documentation on contributor exclusion
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * <code>DumpGenerator</code>s must be thread-safe.
+ */
+public interface DumpGenerator {
+
+    /**
+     * Generates a dump
+     * 
+     * @param cause the cause of the dump
+     * @param throwables {@link Throwable} instances to be associated with the dump
+     */
+    void generateDump(String cause, Throwable... throwables);
+
+    /**
+     * Generates a dump, with additional context.
+     * 
+     * @param cause the cause of the dump
+     * @param context additional context that can be used by the <code>DumpProvider</code>s
+     * @param throwables {@link Throwable} instances to be associated with the dump
+     */
+    void generateDump(String cause, Map<String, Object> context, Throwable... throwables);
+}
diff --git a/medic/org.eclipse.virgo.medic.testfragment/src/main/java/org/eclipse/virgo/medic/dump/JmxDumpContributionParticipant.java b/medic/org.eclipse.virgo.medic.testfragment/src/main/java/org/eclipse/virgo/medic/dump/JmxDumpContributionParticipant.java
new file mode 100644
index 0000000..28a897d
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.testfragment/src/main/java/org/eclipse/virgo/medic/dump/JmxDumpContributionParticipant.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.dump;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import javax.management.DescriptorKey;
+
+/**
+ * Indicates that this MBean should be treated as a JmxDumpContributionParticipant
+ * <p />
+ * 
+ */
+@Documented
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface JmxDumpContributionParticipant {
+
+    @DescriptorKey("jmxDumpContributionParticipant")
+    boolean value() default true;
+}
diff --git a/medic/org.eclipse.virgo.medic.testfragment/src/main/java/org/eclipse/virgo/medic/eventlog/EventLogger.java b/medic/org.eclipse.virgo.medic.testfragment/src/main/java/org/eclipse/virgo/medic/eventlog/EventLogger.java
new file mode 100644
index 0000000..8e09071
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.testfragment/src/main/java/org/eclipse/virgo/medic/eventlog/EventLogger.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.eventlog;
+
+import java.util.ResourceBundle;
+
+/**
+ * An <code>EventLogger</code> provides support for logging events as human-readable, potentially internationalized,
+ * messages identified by a unique code.
+ * <p />
+ * An <code>EventLogger</code> instance can be obtained directly from the service registry. Such instances will search
+ * the <code>Bundle</code> that obtained the instance, and the <code>EventLogger</code> implementations <code>Bundle</code>
+ * for a properties file that contains entry for the an event's code. The implementation bundle is searched to support
+ * providing properties files in fragment bundles which are attached to the implementation.
+ * <p />
+ * Alternatively, an <code>EventLogger</code> can be obtained from an {@link EventLoggerFactory} allowing a specific
+ * <code>Bundle</code> to be supplied that will be used to search for properties files.
+ * <p />
+ * The algorithm used to find properties files matches that described in
+ * {@link ResourceBundle#getBundle(String, java.util.Locale, ClassLoader) ResourceBundle}, with the exception that no
+ * searching for class files is performed.
+ * <p />
+ * <strong>Concurrent Semantics</strong><br />
+ * Implementations <strong>must</strong> be thread-safe.
+ */
+public interface EventLogger {
+
+    /**
+     * Logs an event in the form of a message identified by the supplied code. The message is resolved by searching the
+     * available {@link ResourceBundle ResourceBundles} for an entry with the key that matches the code.
+     * 
+     * The event is logged at the supplied level, with the supplied inserts being applied to the message.
+     * 
+     * @param code The code of the message to be logged
+     * @param level The level at which the event should be logged
+     * @param inserts The inserts for the message
+     */
+    void log(String code, Level level, Object... inserts);
+
+    /**
+     * Logs an event in the form of a message identified by the supplied code. The message is resolved by searching the
+     * available {@link ResourceBundle ResourceBundles} for an entry with the key that matches the code.
+     * 
+     * The event is logged at the supplied level, with the supplied inserts being applied to the message.
+     * 
+     * @param logEvent The log event to be logged
+     * @param inserts The inserts for the message
+     */
+    void log(LogEvent logEvent, Object... inserts);
+
+    /**
+     * Logs an event in the form of a message identified by the supplied code. The message is resolved by searching the
+     * available {@link ResourceBundle ResourceBundles} for an entry with the key that matches the code.
+     * 
+     * The event is logged at the supplied level, with the supplied inserts being applied to the message. The supplied
+     * <code>Throwable</code> is logged with the message.
+     * 
+     * @param code The code of the message to be logged
+     * @param level The level at which the event should be logged
+     * @param throwable The <code>Throwable</code> to be logged
+     * @param inserts The inserts for the message
+     */
+    void log(String code, Level level, Throwable throwable, Object... inserts);
+
+    /**
+     * Logs an event in the form of a message identified by the supplied code. The message is resolved by searching the
+     * available {@link ResourceBundle ResourceBundles} for an entry with the key that matches the code.
+     * 
+     * The event is logged at the supplied level, with the supplied inserts being applied to the message. The supplied
+     * <code>Throwable</code> is logged with the message.
+     * 
+     * @param logEvent The log event to be logged
+     * @param throwable The <code>Throwable</code> to be logged
+     * @param inserts The inserts for the message
+     */
+    void log(LogEvent logEvent, Throwable throwable, Object... inserts);
+}
diff --git a/medic/org.eclipse.virgo.medic.testfragment/src/main/java/org/eclipse/virgo/medic/eventlog/EventLoggerFactory.java b/medic/org.eclipse.virgo.medic.testfragment/src/main/java/org/eclipse/virgo/medic/eventlog/EventLoggerFactory.java
new file mode 100644
index 0000000..da99120
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.testfragment/src/main/java/org/eclipse/virgo/medic/eventlog/EventLoggerFactory.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.eventlog;
+
+import java.util.ResourceBundle;
+
+import org.osgi.framework.Bundle;
+
+/**
+ * An <code>EventLoggerFactory</code> is used to create an <code>EventLogger</code> instance that will search a specific
+ * bundle, in addition to the EventLogger implementation's bundle, for {@link ResourceBundle ResourceBundles}.
+ * <p />
+ * <strong>Concurrent Semantics</strong><br />
+ * Implementations <strong>must</strong> be thread-safe.
+ */
+public interface EventLoggerFactory {
+
+    /**
+     * Creates a new <code>EventLogger</code> that will search the supplied bundle, in addition to the
+     * <code>EventLogger</code> implementation's bundle, for {@link ResourceBundle ResourceBundles}.
+     * 
+     * @param bundle The <code>Bundle</code> to search for <code>ResourceBundle</code>s.
+     * 
+     * @return The <code>EventLogger</code>
+     */
+    public EventLogger createEventLogger(Bundle bundle);
+}
diff --git a/medic/org.eclipse.virgo.medic.testfragment/src/main/java/org/eclipse/virgo/medic/eventlog/Level.java b/medic/org.eclipse.virgo.medic.testfragment/src/main/java/org/eclipse/virgo/medic/eventlog/Level.java
new file mode 100644
index 0000000..b8d9eae
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.testfragment/src/main/java/org/eclipse/virgo/medic/eventlog/Level.java
@@ -0,0 +1,16 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.eventlog;
+
+public enum Level {
+    ERROR, WARNING, INFO
+}
diff --git a/medic/org.eclipse.virgo.medic.testfragment/src/main/java/org/eclipse/virgo/medic/eventlog/LogEvent.java b/medic/org.eclipse.virgo.medic.testfragment/src/main/java/org/eclipse/virgo/medic/eventlog/LogEvent.java
new file mode 100644
index 0000000..3387160
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.testfragment/src/main/java/org/eclipse/virgo/medic/eventlog/LogEvent.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.eventlog;
+
+/**
+ * A <code>LogEvent</code> encapsulates the details of an event that is to be logged.
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Implementations <strong>must</strong> be thread-safe.
+ * 
+ */
+public interface LogEvent {
+
+    /**
+     * Returns the code that uniquely identifies this <code>LogEvent</code>. Typically, this code is used to locate the
+     * message for the event in a resource bundle.
+     * 
+     * @return The event's code
+     */
+    public String getEventCode();
+
+    /**
+     * Returns the {@link Level} at which this <code>LogEvent</code> should be published.
+     * 
+     * @return The level of the event.
+     */
+    public Level getLevel();
+}
diff --git a/medic/org.eclipse.virgo.medic.testfragment/src/main/java/org/eclipse/virgo/medic/log/ConfigurationPublicationFailedException.java b/medic/org.eclipse.virgo.medic.testfragment/src/main/java/org/eclipse/virgo/medic/log/ConfigurationPublicationFailedException.java
new file mode 100644
index 0000000..e2bbf0e
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.testfragment/src/main/java/org/eclipse/virgo/medic/log/ConfigurationPublicationFailedException.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log;
+
+/**
+ * Thrown by {@link LoggingConfigurationPublisher} when a request to publish logging configuration fails.
+ */
+public class ConfigurationPublicationFailedException extends Exception {
+
+    private static final long serialVersionUID = 4317804271280636565L;
+
+    /**
+     * Creates a new exception with the supplied message and cause.
+     * 
+     * @param message The exception's message
+     * @param cause The exception's cause
+     */
+    public ConfigurationPublicationFailedException(String message, Throwable cause) {
+        super(message, cause);
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.testfragment/src/main/java/org/eclipse/virgo/medic/log/DelegatingPrintStream.java b/medic/org.eclipse.virgo.medic.testfragment/src/main/java/org/eclipse/virgo/medic/log/DelegatingPrintStream.java
new file mode 100644
index 0000000..131f597
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.testfragment/src/main/java/org/eclipse/virgo/medic/log/DelegatingPrintStream.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log;
+
+import java.io.PrintStream;
+
+/**
+ * A <code>DelegatingPrintStream</code> is a {@link PrintStream} implementation that delegates to another
+ * {@link PrintStream} instance and allows the delegate to be changed at runtime.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread-safe.
+ * 
+ */
+public interface DelegatingPrintStream {
+
+    /**
+     * Sets the {@link PrintStream} to be used as a delegate. The given <code>printStream</code> may be
+     * <code>null</code> to disable delegation.
+     * 
+     * @param printStream The delegate, or <code>null</code> to disable delegation.
+     */
+    void setDelegate(PrintStream printStream);
+}
diff --git a/medic/org.eclipse.virgo.medic.testfragment/src/main/java/org/eclipse/virgo/medic/log/EntryExitTrace.aj b/medic/org.eclipse.virgo.medic.testfragment/src/main/java/org/eclipse/virgo/medic/log/EntryExitTrace.aj
new file mode 100644
index 0000000..f8066ce
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.testfragment/src/main/java/org/eclipse/virgo/medic/log/EntryExitTrace.aj
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log;
+
+import org.aspectj.lang.JoinPoint;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * An aspect that will advise any method with entry and exit trace logging.
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+public aspect EntryExitTrace pertypewithin(*) {
+	
+	private volatile Logger logger;
+
+    pointcut medic() : within(org.eclipse.virgo.medic..*);
+    
+    pointcut logback() : within(ch.qos.logback..*) || within(org.slf4j.impl..*);
+    
+    pointcut debugCandidate() : execution(public * *(..)) && !medic() && !logback();
+    
+    pointcut traceCandidate() : execution(!public * *(..)) && !medic() && !logback();
+    
+    before() : debugCandidate() {
+        getLogger(thisJoinPointStaticPart).debug("{} {}", ">", getSignature(thisJoinPointStaticPart));
+    }
+
+    after() returning : debugCandidate()  {
+        getLogger(thisJoinPointStaticPart).debug("{} {}", "<", getSignature(thisJoinPointStaticPart));
+    }
+
+    after() throwing(Throwable t) : debugCandidate()  {
+        Logger logger = getLogger(thisJoinPointStaticPart);
+        if (logger.isDebugEnabled()) {
+            logger.debug(String.format("< %s", getSignature(thisJoinPointStaticPart)), t);
+        }
+    }
+    
+    before() : traceCandidate() {
+        getLogger(thisJoinPointStaticPart).trace("{} {}", ">", getSignature(thisJoinPointStaticPart));
+    }
+
+    after() returning : traceCandidate()  {
+        getLogger(thisJoinPointStaticPart).trace("{} {}", "<", getSignature(thisJoinPointStaticPart));
+    }
+
+    after() throwing(Throwable t) : traceCandidate()  {
+        Logger logger = getLogger(thisJoinPointStaticPart);
+        if (logger.isTraceEnabled()) {
+            logger.trace(String.format("< %s", getSignature(thisJoinPointStaticPart)), t);
+        }
+    }
+
+    private Logger getLogger(JoinPoint.StaticPart sp) {
+    	if (this.logger == null) {
+    		this.logger = LoggerFactory.getLogger(sp.getSignature().getDeclaringType());
+    	}
+    	return this.logger;
+    }
+
+    private String getSignature(JoinPoint.StaticPart sp) {
+        return sp.getSignature().toLongString();
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic.testfragment/src/main/java/org/eclipse/virgo/medic/log/LoggingConfiguration.java b/medic/org.eclipse.virgo.medic.testfragment/src/main/java/org/eclipse/virgo/medic/log/LoggingConfiguration.java
new file mode 100644
index 0000000..4156c90
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.testfragment/src/main/java/org/eclipse/virgo/medic/log/LoggingConfiguration.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log;
+
+public interface LoggingConfiguration {
+
+    String getConfiguration();
+
+    String getName();
+}
diff --git a/medic/org.eclipse.virgo.medic.testfragment/src/main/java/org/eclipse/virgo/medic/log/LoggingConfigurationPublisher.java b/medic/org.eclipse.virgo.medic.testfragment/src/main/java/org/eclipse/virgo/medic/log/LoggingConfigurationPublisher.java
new file mode 100644
index 0000000..e0d3c90
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.testfragment/src/main/java/org/eclipse/virgo/medic/log/LoggingConfigurationPublisher.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log;
+
+import java.io.File;
+
+/**
+ * A <code>LoggingConfigurationPublisher</code> is used to publish {@link LoggingConfiguration} into the service
+ * registry. <code>LoggingConfiguration</code> instances in the service registry are referenced by bundles using the
+ * <code>Medic-LoggingConfiguration</code> manifest header.
+ */
+public interface LoggingConfigurationPublisher {
+
+    /**
+     * Publishes the configuration in the supplied <code>File</code> as a <code>LoggingConfiguration</code> instance,
+     * identified with the supplied id. The published configuration can then be referenced by a bundle using the
+     * <code>Medic-LoggingConfiguration</code> manifest header with a value equal to the supplied id.
+     * 
+     * @param configuration The configuration to be published
+     * @param id The identifier to be applied to the configuration when its published
+     * 
+     * @throws ConfigurationPublicationFailedException if the publication of the configuration fails
+     */
+    void publishConfiguration(File configuration, String id) throws ConfigurationPublicationFailedException;
+}
diff --git a/medic/org.eclipse.virgo.medic.testfragment/src/main/resources/.gitignore b/medic/org.eclipse.virgo.medic.testfragment/src/main/resources/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.testfragment/src/main/resources/.gitignore
diff --git a/medic/org.eclipse.virgo.medic.testfragment/src/test/java/.gitignore b/medic/org.eclipse.virgo.medic.testfragment/src/test/java/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.testfragment/src/test/java/.gitignore
diff --git a/medic/org.eclipse.virgo.medic.testfragment/src/test/resources/.gitignore b/medic/org.eclipse.virgo.medic.testfragment/src/test/resources/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.testfragment/src/test/resources/.gitignore
diff --git a/medic/org.eclipse.virgo.medic.testfragment/template.mf b/medic/org.eclipse.virgo.medic.testfragment/template.mf
new file mode 100644
index 0000000..e8a6f09
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic.testfragment/template.mf
@@ -0,0 +1,12 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: org.eclipse.virgo.medic.testfragment
+Import-Template: 
+ org.aspectj.lang.*;version="${org.aspectj:[=.=.= , +1.0.0)}",
+ javax.management.*;version="0",
+ org.osgi.framework;version="0",
+ org.slf4j.*;version="${org.slf4j.api:[=.=.=, =.+1.0)}"
+Bundle-Version: ${version}
+Bundle-Name: Medic API
+Excluded-Imports: 
+ ch.qos.logback.classic.*
diff --git a/medic/org.eclipse.virgo.medic/.settings/org.eclipse.virgo.ide.bundlor.core.prefs b/medic/org.eclipse.virgo.medic/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
new file mode 100644
index 0000000..0312260
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
@@ -0,0 +1,5 @@
+#Thu Nov 12 08:44:05 GMT 2009
+com.springsource.server.ide.bundlor.core.bundlor.generated.manifest.autoformatting=true
+com.springsource.server.ide.bundlor.core.byte.code.scanning=true
+com.springsource.server.ide.bundlor.core.template.properties.files=../build.versions;../build.properties
+eclipse.preferences.version=1
diff --git a/medic/org.eclipse.virgo.medic/.settings/org.eclipse.wst.common.project.facet.core.xml b/medic/org.eclipse.virgo.medic/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..92aa290
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+  <installed facet="org.eclipse.virgo.server.bundle" version="1.0"/>
+</faceted-project>
diff --git a/medic/org.eclipse.virgo.medic/.settings/org.springframework.ide.eclipse.core.prefs b/medic/org.eclipse.virgo.medic/.settings/org.springframework.ide.eclipse.core.prefs
new file mode 100644
index 0000000..a145ba0
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic/.settings/org.springframework.ide.eclipse.core.prefs
@@ -0,0 +1,68 @@
+#Thu Nov 12 08:44:05 GMT 2009
+eclipse.preferences.version=1
+org.springframework.ide.eclipse.core.builders.enable.aopreferencemodelbuilder=true
+org.springframework.ide.eclipse.core.builders.enable.beanmetadatabuilder=true
+org.springframework.ide.eclipse.core.builders.enable.osgibundleupdater=false
+org.springframework.ide.eclipse.core.enable.project.preferences=false
+org.springframework.ide.eclipse.core.validator.enable.com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.enable.com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.enable.com.springsource.sts.server.quickfix.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.enable.org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.enable.org.springframework.ide.eclipse.core.springvalidator=false
+org.springframework.ide.eclipse.core.validator.enable.org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.applicationSymbolicNameRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.applicationVersionRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleActivationPolicyRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleActivatorRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleManifestVersionRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleSymbolicNameRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleVersionRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.exportPackageRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.importRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.parsingProblemsRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.requireBundleRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.AvoidDriverManagerDataSource-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.ImportElementsAtTopRulee-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.ParentBeanSpecifiesAbstractClassRule-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.RefElementRule-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.TooManyBeansInFileRule-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.UnnecessaryValueElementRule-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.UseBeanInheritance-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.legacyxmlusage.jndiobjectfactory-com.springsource.sts.bestpractices.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.importBundleVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.importLibraryVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.importPackageVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.requireBundleVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.autowire.autowire-org.springframework.ide.eclipse.beans.core.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanAlias-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanClass-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanConstructorArgument-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanDefinition-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanDefinitionHolder-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanFactory-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanInitDestroyMethod-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanProperty-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanReference-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.methodOverride-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.parsingProblems-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.requiredProperty-org.springframework.ide.eclipse.beans.core.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.toolAnnotation-org.springframework.ide.eclipse.beans.core.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.core.springClasspath-org.springframework.ide.eclipse.core.springvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.action-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.actionstate-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.attribute-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.attributemapper-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.beanaction-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.evaluationaction-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.evaluationresult-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.exceptionhandler-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.import-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.inputattribute-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.mapping-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.outputattribute-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.set-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.state-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.subflowstate-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.transition-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.variable-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.webflowstate-org.springframework.ide.eclipse.webflow.core.validator=true
diff --git a/medic/org.eclipse.virgo.medic/.springBeans b/medic/org.eclipse.virgo.medic/.springBeans
new file mode 100644
index 0000000..5152991
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic/.springBeans
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beansProjectDescription>
+	<version>1</version>
+	<pluginVersion><![CDATA[2.2.5.M1]]></pluginVersion>
+	<configSuffixes>
+		<configSuffix><![CDATA[xml]]></configSuffix>
+	</configSuffixes>
+	<enableImports><![CDATA[false]]></enableImports>
+	<configs>
+	</configs>
+	<configSets>
+	</configSets>
+</beansProjectDescription>
diff --git a/medic/org.eclipse.virgo.medic/src/main/java/org/eclipse/virgo/medic/dump/Dump.java b/medic/org.eclipse.virgo.medic/src/main/java/org/eclipse/virgo/medic/dump/Dump.java
new file mode 100644
index 0000000..2d631c2
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic/src/main/java/org/eclipse/virgo/medic/dump/Dump.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.dump;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.FileWriter;
+import java.io.Writer;
+import java.util.Map;
+
+/**
+ * A <code>Dump</code> represents a dump being generated by a {@link DumpGenerator}. During dump generation
+ * {@link DumpContributor DumpContributors} are called to contribute to the dump. Contributors can request a
+ * {@link Writer}, {@link File}, etc. which they may use to write out their contribution to the dump.
+ */
+public interface Dump {
+
+    /**
+     * Returns a timestamp that identifies that time at which this dump was generated.
+     * 
+     * @return The timestamp of the dump's generation
+     */
+    long getTimestamp();
+
+    /**
+     * Returns the context that is associated with this dump. If there is no associated context an empty
+     * <code>Map</code> is returned.
+     * 
+     * @return The dump's context
+     */
+    Map<String, Object> getContext();
+
+    /**
+     * Returns the {@link Throwable Throwables} associated with this dump.
+     * 
+     * @return The dump's <code>Throwable</code>s
+     */
+    Throwable[] getThrowables();
+
+    /**
+     * Returns the cause of this dump.
+     * 
+     * @return The dump's cause.
+     */
+    String getCause();
+
+    /**
+     * Creates a {@link FileWriter} that writes to a file with the supplied name, within this dump's output location.
+     * @param name of file to write to
+     * 
+     * @return a <code>FileWriter</code> to which a contribution to the dump can be written
+     * @throws DumpContributionFailedException 
+     */
+    FileWriter createFileWriter(String name) throws DumpContributionFailedException;
+
+    /**
+     * Creates a {@link FileOutputStream} that writes to a file with the supplied name, within this dump's output
+     * location.
+     * @param name of file to write to
+     * 
+     * @return a <code>FileOutputStream</code> to which a contribution to the dump can be written
+     * @throws DumpContributionFailedException 
+     */
+    FileOutputStream createFileOutputStream(String name) throws DumpContributionFailedException;
+
+    /**
+     * Creates a {@link File} with the supplied name, within this dump's output location.
+     * @param name of file to write to
+     * 
+     * @return a <code>File</code> to which a contribution to the dump can be written
+     */
+    File createFile(String name);
+
+}
diff --git a/medic/org.eclipse.virgo.medic/src/main/java/org/eclipse/virgo/medic/dump/DumpContributionFailedException.java b/medic/org.eclipse.virgo.medic/src/main/java/org/eclipse/virgo/medic/dump/DumpContributionFailedException.java
new file mode 100644
index 0000000..edaf464
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic/src/main/java/org/eclipse/virgo/medic/dump/DumpContributionFailedException.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.dump;
+
+/**
+ * A <code>DumpContributionFailedException</code> is thrown by a {@link DumpContributor} to indicate that a failure has
+ * occurred when it was attempting to make a contribution to a dump.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread-safe.
+ * 
+ */
+public class DumpContributionFailedException extends DumpGenerationFailedException {
+
+    private static final long serialVersionUID = -3196511149954617337L;
+
+    /**
+     * Create a new DumpContributionFailedException with the supplied message that describes the failure
+     * 
+     * @param message The message describing the failure
+     */
+    public DumpContributionFailedException(String message) {
+        super(message);
+    }
+
+    /**
+     * Create a new DumpContributionFailedException with the supplied failure cause and message that describes the
+     * failure
+     * 
+     * @param message The message describing the failure
+     * @param cause The cause of the contribution failure
+     */
+    public DumpContributionFailedException(String message, Throwable cause) {
+        super(message, cause);
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic/src/main/java/org/eclipse/virgo/medic/dump/DumpContributor.java b/medic/org.eclipse.virgo.medic/src/main/java/org/eclipse/virgo/medic/dump/DumpContributor.java
new file mode 100644
index 0000000..ddffe7c
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic/src/main/java/org/eclipse/virgo/medic/dump/DumpContributor.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.dump;
+
+/**
+ * A <code>DumpContributor</code> is implemented to contribute information to a dump. Contributors are 'registered' with
+ * a {@link DumpGenerator} by publishing them in the service registry.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * <code>DumpContributor</code>s must be thread-safe.
+ */
+public interface DumpContributor {
+
+    /**
+     * Contribute to the supplied {@link Dump}.
+     * 
+     * @param dump The dump to which a contribution may be made.
+     * @throws DumpContributionFailedException if the dump contribution cannot be created
+     */
+    void contribute(Dump dump) throws DumpContributionFailedException;
+
+    /**
+     * Returns the name of this <code>DumpContributor</code>. The name is used by a {@link DumpGenerator} when
+     * determining which contributors should be excluded from contributing to a dump.
+     * 
+     * @return The contributor's name
+     */
+    String getName();
+}
diff --git a/medic/org.eclipse.virgo.medic/src/main/java/org/eclipse/virgo/medic/dump/DumpGenerationFailedException.java b/medic/org.eclipse.virgo.medic/src/main/java/org/eclipse/virgo/medic/dump/DumpGenerationFailedException.java
new file mode 100644
index 0000000..5dded04
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic/src/main/java/org/eclipse/virgo/medic/dump/DumpGenerationFailedException.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.dump;
+
+/**
+ * A <code>DumpGenerationFailedException</code> is thrown by a {@link DumpGenerator} to indicate that a failure has
+ * occurred during dump generation.
+ * 
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread-safe.
+ * 
+ */
+public class DumpGenerationFailedException extends Exception {
+
+    private static final long serialVersionUID = -3196511149954617337L;
+
+    /**
+     * Create a new DumpGenerationFailedException with the supplied message that describes the failure
+     * 
+     * @param message The message describing the failure
+     */
+    public DumpGenerationFailedException(String message) {
+        super(message);
+    }
+
+    /**
+     * Create a new DumpGenerationFailedException with the supplied failure cause and message that describes the failure
+     * 
+     * @param message The message describing the failure
+     * @param cause The cause of the generation failure
+     */
+    public DumpGenerationFailedException(String message, Throwable cause) {
+        super(message, cause);
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic/src/main/java/org/eclipse/virgo/medic/dump/DumpGenerator.java b/medic/org.eclipse.virgo.medic/src/main/java/org/eclipse/virgo/medic/dump/DumpGenerator.java
new file mode 100644
index 0000000..c07f9bc
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic/src/main/java/org/eclipse/virgo/medic/dump/DumpGenerator.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.dump;
+
+import java.util.Map;
+
+/**
+ * A <code>DumpGenerator</code> can be used to request the generation of a dump. A
+ * <code>DumpGenerator</code> instance can be obtained from the service registry.
+ * <p />
+ * 
+ * When a dump is requested, the <code>DumpGenerator</code> will, by default, provide all {@link DumpContributor}s
+ * that are known to it with an opportunity to contribute to the dump. <code>DumpContributor</code>
+ * instances are made known to a {@link DumpGenerator} by publishing them in the service registry.
+ * <p />
+ * 
+ * A {@link DumpGenerator} can be configured to exclude {@link DumpContributor}s from contributing to dumps
+ * with a particular cause. <br/>
+ * TODO Expand the documentation on contributor exclusion
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * <code>DumpGenerator</code>s must be thread-safe.
+ */
+public interface DumpGenerator {
+
+    /**
+     * Generates a dump
+     * 
+     * @param cause the cause of the dump
+     * @param throwables {@link Throwable} instances to be associated with the dump
+     */
+    void generateDump(String cause, Throwable... throwables);
+
+    /**
+     * Generates a dump, with additional context.
+     * 
+     * @param cause the cause of the dump
+     * @param context additional context that can be used by the {@link DumpContributor}s
+     * @param throwables {@link Throwable} instances to be associated with the dump
+     */
+    void generateDump(String cause, Map<String, Object> context, Throwable... throwables);
+}
diff --git a/medic/org.eclipse.virgo.medic/src/main/java/org/eclipse/virgo/medic/eventlog/EventLogger.java b/medic/org.eclipse.virgo.medic/src/main/java/org/eclipse/virgo/medic/eventlog/EventLogger.java
new file mode 100644
index 0000000..1ffd641
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic/src/main/java/org/eclipse/virgo/medic/eventlog/EventLogger.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.eventlog;
+
+import java.util.ResourceBundle;
+
+/**
+ * An <code>EventLogger</code> provides support for logging events as human-readable, potentially internationalized,
+ * messages identified by a unique code.
+ * <p />
+ * An <code>EventLogger</code> instance can be obtained directly from the service registry. Such instances will search
+ * the {@link org.osgi.framework.Bundle} that obtained the instance, and the <code>EventLogger</code> implementations <code>Bundle</code>
+ * for a properties file that contains entry for the an event's code. The implementation bundle is searched to support
+ * providing properties files in fragment bundles which are attached to the implementation.
+ * <p />
+ * Alternatively, an <code>EventLogger</code> can be obtained from an {@link EventLoggerFactory} allowing a specific
+ * <code>Bundle</code> to be supplied that will be used to search for properties files.
+ * <p />
+ * The algorithm used to find properties files matches that described in
+ * {@link ResourceBundle#getBundle(String, java.util.Locale, ClassLoader) ResourceBundle}, with the exception that no
+ * searching for class files is performed.
+ * <p />
+ * <strong>Concurrent Semantics</strong><br />
+ * Implementations <strong>must</strong> be thread-safe.
+ */
+public interface EventLogger {
+
+    /**
+     * Logs an event in the form of a message identified by the supplied code. The message is resolved by searching the
+     * available {@link ResourceBundle ResourceBundles} for an entry with the key that matches the code.
+     * 
+     * The event is logged at the supplied level, with the supplied inserts being applied to the message.
+     * 
+     * @param code The code of the message to be logged
+     * @param level The level at which the event should be logged
+     * @param inserts The inserts for the message
+     */
+    void log(String code, Level level, Object... inserts);
+
+    /**
+     * Logs an event in the form of a message identified by the supplied code. The message is resolved by searching the
+     * available {@link ResourceBundle ResourceBundles} for an entry with the key that matches the code.
+     * 
+     * The event is logged at the supplied level, with the supplied inserts being applied to the message.
+     * 
+     * @param logEvent The log event to be logged
+     * @param inserts The inserts for the message
+     */
+    void log(LogEvent logEvent, Object... inserts);
+
+    /**
+     * Logs an event in the form of a message identified by the supplied code. The message is resolved by searching the
+     * available {@link ResourceBundle ResourceBundles} for an entry with the key that matches the code.
+     * 
+     * The event is logged at the supplied level, with the supplied inserts being applied to the message. The supplied
+     * <code>Throwable</code> is logged with the message.
+     * 
+     * @param code The code of the message to be logged
+     * @param level The level at which the event should be logged
+     * @param throwable The <code>Throwable</code> to be logged
+     * @param inserts The inserts for the message
+     */
+    void log(String code, Level level, Throwable throwable, Object... inserts);
+
+    /**
+     * Logs an event in the form of a message identified by the supplied code. The message is resolved by searching the
+     * available {@link ResourceBundle ResourceBundles} for an entry with the key that matches the code.
+     * 
+     * The event is logged at the supplied level, with the supplied inserts being applied to the message. The supplied
+     * <code>Throwable</code> is logged with the message.
+     * 
+     * @param logEvent The log event to be logged
+     * @param throwable The <code>Throwable</code> to be logged
+     * @param inserts The inserts for the message
+     */
+    void log(LogEvent logEvent, Throwable throwable, Object... inserts);
+}
diff --git a/medic/org.eclipse.virgo.medic/src/main/java/org/eclipse/virgo/medic/eventlog/EventLoggerFactory.java b/medic/org.eclipse.virgo.medic/src/main/java/org/eclipse/virgo/medic/eventlog/EventLoggerFactory.java
new file mode 100644
index 0000000..da99120
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic/src/main/java/org/eclipse/virgo/medic/eventlog/EventLoggerFactory.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.eventlog;
+
+import java.util.ResourceBundle;
+
+import org.osgi.framework.Bundle;
+
+/**
+ * An <code>EventLoggerFactory</code> is used to create an <code>EventLogger</code> instance that will search a specific
+ * bundle, in addition to the EventLogger implementation's bundle, for {@link ResourceBundle ResourceBundles}.
+ * <p />
+ * <strong>Concurrent Semantics</strong><br />
+ * Implementations <strong>must</strong> be thread-safe.
+ */
+public interface EventLoggerFactory {
+
+    /**
+     * Creates a new <code>EventLogger</code> that will search the supplied bundle, in addition to the
+     * <code>EventLogger</code> implementation's bundle, for {@link ResourceBundle ResourceBundles}.
+     * 
+     * @param bundle The <code>Bundle</code> to search for <code>ResourceBundle</code>s.
+     * 
+     * @return The <code>EventLogger</code>
+     */
+    public EventLogger createEventLogger(Bundle bundle);
+}
diff --git a/medic/org.eclipse.virgo.medic/src/main/java/org/eclipse/virgo/medic/eventlog/Level.java b/medic/org.eclipse.virgo.medic/src/main/java/org/eclipse/virgo/medic/eventlog/Level.java
new file mode 100644
index 0000000..b8d9eae
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic/src/main/java/org/eclipse/virgo/medic/eventlog/Level.java
@@ -0,0 +1,16 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.eventlog;
+
+public enum Level {
+    ERROR, WARNING, INFO
+}
diff --git a/medic/org.eclipse.virgo.medic/src/main/java/org/eclipse/virgo/medic/eventlog/LogEvent.java b/medic/org.eclipse.virgo.medic/src/main/java/org/eclipse/virgo/medic/eventlog/LogEvent.java
new file mode 100644
index 0000000..3387160
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic/src/main/java/org/eclipse/virgo/medic/eventlog/LogEvent.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.eventlog;
+
+/**
+ * A <code>LogEvent</code> encapsulates the details of an event that is to be logged.
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Implementations <strong>must</strong> be thread-safe.
+ * 
+ */
+public interface LogEvent {
+
+    /**
+     * Returns the code that uniquely identifies this <code>LogEvent</code>. Typically, this code is used to locate the
+     * message for the event in a resource bundle.
+     * 
+     * @return The event's code
+     */
+    public String getEventCode();
+
+    /**
+     * Returns the {@link Level} at which this <code>LogEvent</code> should be published.
+     * 
+     * @return The level of the event.
+     */
+    public Level getLevel();
+}
diff --git a/medic/org.eclipse.virgo.medic/src/main/java/org/eclipse/virgo/medic/log/ConfigurationPublicationFailedException.java b/medic/org.eclipse.virgo.medic/src/main/java/org/eclipse/virgo/medic/log/ConfigurationPublicationFailedException.java
new file mode 100644
index 0000000..e2bbf0e
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic/src/main/java/org/eclipse/virgo/medic/log/ConfigurationPublicationFailedException.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log;
+
+/**
+ * Thrown by {@link LoggingConfigurationPublisher} when a request to publish logging configuration fails.
+ */
+public class ConfigurationPublicationFailedException extends Exception {
+
+    private static final long serialVersionUID = 4317804271280636565L;
+
+    /**
+     * Creates a new exception with the supplied message and cause.
+     * 
+     * @param message The exception's message
+     * @param cause The exception's cause
+     */
+    public ConfigurationPublicationFailedException(String message, Throwable cause) {
+        super(message, cause);
+    }
+}
diff --git a/medic/org.eclipse.virgo.medic/src/main/java/org/eclipse/virgo/medic/log/DelegatingPrintStream.java b/medic/org.eclipse.virgo.medic/src/main/java/org/eclipse/virgo/medic/log/DelegatingPrintStream.java
new file mode 100644
index 0000000..131f597
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic/src/main/java/org/eclipse/virgo/medic/log/DelegatingPrintStream.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log;
+
+import java.io.PrintStream;
+
+/**
+ * A <code>DelegatingPrintStream</code> is a {@link PrintStream} implementation that delegates to another
+ * {@link PrintStream} instance and allows the delegate to be changed at runtime.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread-safe.
+ * 
+ */
+public interface DelegatingPrintStream {
+
+    /**
+     * Sets the {@link PrintStream} to be used as a delegate. The given <code>printStream</code> may be
+     * <code>null</code> to disable delegation.
+     * 
+     * @param printStream The delegate, or <code>null</code> to disable delegation.
+     */
+    void setDelegate(PrintStream printStream);
+}
diff --git a/medic/org.eclipse.virgo.medic/src/main/java/org/eclipse/virgo/medic/log/EntryExitTrace.aj b/medic/org.eclipse.virgo.medic/src/main/java/org/eclipse/virgo/medic/log/EntryExitTrace.aj
new file mode 100644
index 0000000..762118f
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic/src/main/java/org/eclipse/virgo/medic/log/EntryExitTrace.aj
@@ -0,0 +1,100 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log;
+
+import org.aspectj.lang.JoinPoint;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * An aspect that will advise any method with entry and exit trace logging.
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+public aspect EntryExitTrace pertypewithin(*) {
+
+	private volatile Logger logger;
+
+	pointcut medic() : within(org.eclipse.virgo.medic..*);
+
+	pointcut util() : within(org.eclipse.virgo.util..*);
+
+	pointcut repository() : within(org.eclipse.virgo.repository..*);
+
+	// avoid class loading recursion
+	pointcut kernelUserRegion() : within(org.eclipse.virgo.kernel.userregion..*);
+	pointcut webClassLoading() : within(org.eclipse.virgo.web.core.internal..*);
+
+	pointcut logback() : within(ch.qos.logback..*) || within(org.slf4j.impl..*);
+
+    // avoid common methods with little benefit of entry/exit trace logging
+	pointcut setter() : execution(* set*(..));
+	pointcut getter() : execution(* get*(..));
+	pointcut hashCode() : execution(public int hashCode());
+	pointcut equals() : execution(public boolean equals(Object));
+	pointcut toString() : execution(public String toString());
+
+	pointcut debugCandidate() : execution(public * *(..)) && !setter() && !getter() && !hashCode() && !equals() && !toString() && !medic() && !util() && !repository() && !kernelUserRegion() && !webClassLoading() && !logback();
+
+	pointcut traceCandidate() : execution(!public * *(..)) && !setter() && !getter() && !hashCode() && !equals() && !toString() && !medic() && !util() && !repository() && !kernelUserRegion() && !webClassLoading() && !logback();
+
+	before() : debugCandidate() {
+		getLogger(thisJoinPointStaticPart).debug("{} {}", ">",
+				getSignature(thisJoinPointStaticPart));
+	}
+
+	after() returning : debugCandidate()  {
+		getLogger(thisJoinPointStaticPart).debug("{} {}", "<",
+				getSignature(thisJoinPointStaticPart));
+	}
+
+	after() throwing(Throwable t) : debugCandidate()  {
+		Logger logger = getLogger(thisJoinPointStaticPart);
+		if (logger.isDebugEnabled()) {
+			logger.debug(String.format("< %s",
+					getSignature(thisJoinPointStaticPart)), t);
+		}
+	}
+
+	before() : traceCandidate() {
+		getLogger(thisJoinPointStaticPart).trace("{} {}", ">",
+				getSignature(thisJoinPointStaticPart));
+	}
+
+	after() returning : traceCandidate()  {
+		getLogger(thisJoinPointStaticPart).trace("{} {}", "<",
+				getSignature(thisJoinPointStaticPart));
+	}
+
+	after() throwing(Throwable t) : traceCandidate()  {
+		Logger logger = getLogger(thisJoinPointStaticPart);
+		if (logger.isTraceEnabled()) {
+			logger.trace(String.format("< %s",
+					getSignature(thisJoinPointStaticPart)), t);
+		}
+	}
+
+	private Logger getLogger(JoinPoint.StaticPart sp) {
+		if (this.logger == null) {
+			this.logger = LoggerFactory.getLogger(sp.getSignature()
+					.getDeclaringType());
+		}
+		return this.logger;
+	}
+
+	private String getSignature(JoinPoint.StaticPart sp) {
+		return sp.getSignature().toLongString();
+	}
+}
diff --git a/medic/org.eclipse.virgo.medic/src/main/java/org/eclipse/virgo/medic/log/LoggingConfiguration.java b/medic/org.eclipse.virgo.medic/src/main/java/org/eclipse/virgo/medic/log/LoggingConfiguration.java
new file mode 100644
index 0000000..4156c90
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic/src/main/java/org/eclipse/virgo/medic/log/LoggingConfiguration.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log;
+
+public interface LoggingConfiguration {
+
+    String getConfiguration();
+
+    String getName();
+}
diff --git a/medic/org.eclipse.virgo.medic/src/main/java/org/eclipse/virgo/medic/log/LoggingConfigurationPublisher.java b/medic/org.eclipse.virgo.medic/src/main/java/org/eclipse/virgo/medic/log/LoggingConfigurationPublisher.java
new file mode 100644
index 0000000..e0d3c90
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic/src/main/java/org/eclipse/virgo/medic/log/LoggingConfigurationPublisher.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.medic.log;
+
+import java.io.File;
+
+/**
+ * A <code>LoggingConfigurationPublisher</code> is used to publish {@link LoggingConfiguration} into the service
+ * registry. <code>LoggingConfiguration</code> instances in the service registry are referenced by bundles using the
+ * <code>Medic-LoggingConfiguration</code> manifest header.
+ */
+public interface LoggingConfigurationPublisher {
+
+    /**
+     * Publishes the configuration in the supplied <code>File</code> as a <code>LoggingConfiguration</code> instance,
+     * identified with the supplied id. The published configuration can then be referenced by a bundle using the
+     * <code>Medic-LoggingConfiguration</code> manifest header with a value equal to the supplied id.
+     * 
+     * @param configuration The configuration to be published
+     * @param id The identifier to be applied to the configuration when its published
+     * 
+     * @throws ConfigurationPublicationFailedException if the publication of the configuration fails
+     */
+    void publishConfiguration(File configuration, String id) throws ConfigurationPublicationFailedException;
+}
diff --git a/medic/org.eclipse.virgo.medic/src/main/resources/about.html b/medic/org.eclipse.virgo.medic/src/main/resources/about.html
new file mode 100644
index 0000000..c258ef5
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic/src/main/resources/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>June 5, 2006</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/medic/org.eclipse.virgo.medic/src/test/java/.gitignore b/medic/org.eclipse.virgo.medic/src/test/java/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic/src/test/java/.gitignore
diff --git a/medic/org.eclipse.virgo.medic/template.mf b/medic/org.eclipse.virgo.medic/template.mf
new file mode 100644
index 0000000..6a1f899
--- /dev/null
+++ b/medic/org.eclipse.virgo.medic/template.mf
@@ -0,0 +1,10 @@
+IManifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: org.eclipse.virgo.medic
+Import-Template:
+ org.aspectj.*;version="${aspectjVersion:[=.=.= , +1.0.0)}",
+ javax.management.*;version="0",
+ org.osgi.framework;version="0",
+ org.slf4j.*;version="${slf4jVersion:[=.=.0, +1.0.0)}"
+Bundle-Version: ${version}
+Bundle-Name: Medic API
diff --git a/nano/.gitignore b/nano/.gitignore
new file mode 100644
index 0000000..3fbb103
--- /dev/null
+++ b/nano/.gitignore
@@ -0,0 +1,13 @@
+*/src/main/resources/META-INF/MANIFEST.MF
+*/src/test/resources/META-INF/TEST.MF
+target
+integration-repo
+ivy-cache
+.ant-targets-build.xml
+user-ivy.properties
+bin/
+build/
+.settings/
+.project
+.classpath
+
diff --git a/nano/CONTRIBUTING.md b/nano/CONTRIBUTING.md
new file mode 100644
index 0000000..e3a5790
--- /dev/null
+++ b/nano/CONTRIBUTING.md
@@ -0,0 +1,47 @@
+Contributing to Virgo
+=====================
+
+Thanks for your interest in this project.
+
+Project description:
+--------------------
+
+The Virgo Web Server from EclipseRT is a completely module-based Java application server that is designed to run enterprise Java applications and Spring-powered applications with a high degree of flexibility and reliability. It offers a simple yet comprehensive platform to develop, deploy, and service enterprise Java applications.
+The Virgo kernel supports the core concepts of Virgo and is not biased towards the web server, thus enabling other types of server to be created. The kernel can also be used stand-alone as a rich OSGi application platform. A server runtime can easily be constructed by deploying suitable bundles on top of the kernel.
+
+- https://projects.eclipse.org/projects/rt.virgo
+
+Developer resources:
+--------------------
+
+Information regarding source code management, builds, coding standards, and more.
+
+- https://projects.eclipse.org/projects/rt.virgo/developer
+
+Contributor License Agreement:
+------------------------------
+
+Before your contribution can be accepted by the project, you need to create and electronically sign the Eclipse Foundation Contributor License Agreement (CLA).
+
+- http://www.eclipse.org/legal/CLA.php
+
+Contact:
+--------
+
+Contact the project developers via the project's "dev" list.
+
+- https://dev.eclipse.org/mailman/listinfo/virgo-dev
+
+Search for bugs:
+----------------
+
+This project uses Bugzilla to track ongoing development and issues.
+
+- https://bugs.eclipse.org/bugs/buglist.cgi?product=Virgo
+
+Create a new bug:
+-----------------
+
+Be sure to search for existing bugs before you create another one. Remember that contributions are always welcome!
+
+- https://bugs.eclipse.org/bugs/enter_bug.cgi?product=Virgo
\ No newline at end of file
diff --git a/nano/build.gradle b/nano/build.gradle
new file mode 100644
index 0000000..1493ff7
--- /dev/null
+++ b/nano/build.gradle
@@ -0,0 +1,106 @@
+project(':nano:org.eclipse.virgo.nano.core') {
+    dependencies {
+		testCompile group: 'org.easymock', name: 'easymock', version: easymockVersion
+        testCompile project(':test:org.eclipse.virgo.test.stubs')
+        testCompile project(':medic:org.eclipse.virgo.medic.test')
+
+        compile group: "org.slf4j", name: "slf4j-api", version: slf4jVersion
+
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi", version: equinoxVersion, configuration: "compile", ext: "jar"
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi.services", version: osgiServicesVersion, configuration: "compile", ext: "jar"
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.region", version: equinoxRegionVersion, configuration: "compile", ext: "jar"
+
+        compile project(':util:org.eclipse.virgo.util.common')
+        compile project(':util:org.eclipse.virgo.util.io')
+        compile project(':util:org.eclipse.virgo.util.osgi')
+        compile project(':medic:org.eclipse.virgo.medic')
+	}
+}
+
+project(':nano:org.eclipse.virgo.nano.deployer') {
+    dependencies {
+		testCompile group: 'org.easymock', name: 'easymock', version: easymockVersion
+		testCompile project(':medic:org.eclipse.virgo.medic.test')
+
+        compile group: "org.slf4j", name: "slf4j-api", version: slf4jVersion
+
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi", version: equinoxVersion, configuration: "compile", ext: "jar"
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi.services", version: osgiServicesVersion, configuration: "compile", ext: "jar"
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.simpleconfigurator", version: equinoxSimpleConfiguratorVersion, configuration: "compile", ext: "jar"
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.simpleconfigurator.manipulator", version: equinoxSimpleConfiguratorManipulatorVersion, configuration: "compile", ext: "jar"
+
+        compile project(':util:org.eclipse.virgo.util.io')
+		compile project(':util:org.eclipse.virgo.util.osgi.manifest')
+		compile project(':medic:org.eclipse.virgo.medic')
+		compile project(':nano:org.eclipse.virgo.nano.core')
+		compile project(':nano:org.eclipse.virgo.nano.deployer.api')
+		compile project(':nano:org.eclipse.virgo.nano.deployer.hot')
+	}
+}
+
+project(':nano:org.eclipse.virgo.nano.deployer.api') {
+    dependencies {
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi", version: equinoxVersion, configuration: "compile", ext: "jar"
+
+        compile project(':util:org.eclipse.virgo.util.io')
+        compile project(':medic:org.eclipse.virgo.medic')
+        compile project(':nano:org.eclipse.virgo.nano.core')
+    }
+}
+
+project(':nano:org.eclipse.virgo.nano.deployer.hot') {
+    dependencies {
+        testCompile group: 'org.easymock', name: 'easymock', version: easymockVersion
+		testCompile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi", version: equinoxVersion, configuration: "compile", ext: "jar"
+        testCompile project(':medic:org.eclipse.virgo.medic.test')
+
+        testRuntime "org.aspectj:aspectjrt:${project.aspectjVersion}"
+
+        compile group: "org.slf4j", name: "slf4j-api", version: slf4jVersion
+
+        compile project(':util:org.eclipse.virgo.util.io')
+        compile project(':medic:org.eclipse.virgo.medic')
+        compile project(':nano:org.eclipse.virgo.nano.core')
+        compile project(':nano:org.eclipse.virgo.nano.deployer.api')
+    }
+}
+
+project(':nano:org.eclipse.virgo.nano.management') {
+    dependencies {
+        compile group: "org.slf4j", name: "slf4j-api", version: slf4jVersion
+
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi", version: equinoxVersion, configuration: "compile", ext: "jar"
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi.services", version: osgiServicesVersion, configuration: "compile", ext: "jar"
+
+		compile project(':nano:org.eclipse.virgo.nano.deployer.api')
+	}
+}
+
+project(':nano:org.eclipse.virgo.nano.management.controller') {
+    dependencies {
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi", version: equinoxVersion, configuration: "compile", ext: "jar"
+
+		compile project(':nano:org.eclipse.virgo.nano.core')
+		compile project(':nano:org.eclipse.virgo.nano.deployer.api')
+		compile project(':nano:org.eclipse.virgo.nano.management')
+	}
+}
+
+project(':nano:org.eclipse.virgo.nano.services.concurrent') {
+    dependencies {
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi", version: equinoxVersion, configuration: "compile", ext: "jar"
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi.services", version: osgiServicesVersion, configuration: "compile", ext: "jar"
+        compile project(':util:org.eclipse.virgo.util.math')
+        compile project(':medic:org.eclipse.virgo.medic')
+	}
+}
+
+project(':nano:org.eclipse.virgo.nano.services.ds') {
+    dependencies {
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi", version: equinoxVersion, configuration: "compile", ext: "jar"
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi.services", version: osgiServicesVersion, configuration: "compile", ext: "jar"
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.ds", version: equinoxDsVersion, configuration: "compile", ext: "jar"
+        compile project(':medic:org.eclipse.virgo.medic')
+	}
+}
+
diff --git a/nano/org.eclipse.virgo.nano.authentication/.settings/org.eclipse.wst.common.project.facet.core.xml b/nano/org.eclipse.virgo.nano.authentication/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..92aa290
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.authentication/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+  <installed facet="org.eclipse.virgo.server.bundle" version="1.0"/>
+</faceted-project>
diff --git a/nano/org.eclipse.virgo.nano.authentication/src/main/java/org/eclipse/virgo/nano/authentication/CredentialStore.java b/nano/org.eclipse.virgo.nano.authentication/src/main/java/org/eclipse/virgo/nano/authentication/CredentialStore.java
new file mode 100644
index 0000000..ec92a89
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.authentication/src/main/java/org/eclipse/virgo/nano/authentication/CredentialStore.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.authentication;
+
+/**
+ * A container encapsulating a collection of credentials
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations must be threadsafe
+ * 
+ */
+public interface CredentialStore {
+
+    /**
+     * Gets a {@link User} based on a given user name
+     * 
+     * @param name The name of the {@link User} to retrieve
+     * @return The {@link User} represented by the user name or <code>null</code> if one does not exist
+     */
+    User getUser(String name);
+}
diff --git a/nano/org.eclipse.virgo.nano.authentication/src/main/java/org/eclipse/virgo/nano/authentication/KernelLoginModule.java b/nano/org.eclipse.virgo.nano.authentication/src/main/java/org/eclipse/virgo/nano/authentication/KernelLoginModule.java
new file mode 100644
index 0000000..f945943
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.authentication/src/main/java/org/eclipse/virgo/nano/authentication/KernelLoginModule.java
@@ -0,0 +1,130 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.authentication;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.util.Map;
+import java.util.Properties;
+
+import javax.security.auth.Subject;
+import javax.security.auth.callback.Callback;
+import javax.security.auth.callback.CallbackHandler;
+import javax.security.auth.callback.NameCallback;
+import javax.security.auth.callback.PasswordCallback;
+import javax.security.auth.callback.UnsupportedCallbackException;
+import javax.security.auth.login.FailedLoginException;
+import javax.security.auth.login.LoginException;
+import javax.security.auth.spi.LoginModule;
+
+/**
+ * An implementation of {@link LoginModule} that reads a properties file for authentication information. The location of
+ * the properties file is read from the system property <code>org.eclipse.virgo.kernel.authentication.file</code>. If
+ * this property is not set, then instantiation of this {@link LoginModule} will fail.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Not threadsafe
+ * 
+ */
+public final class KernelLoginModule implements LoginModule {
+
+    public static final String FILE_LOCATION = "org.eclipse.virgo.kernel.authentication.file";
+
+    private final CredentialStore credentialStore;
+
+    private volatile Subject subject;
+
+    private volatile CallbackHandler callbackHandler;
+
+    private volatile User user;
+
+    private volatile boolean authenticationResult;
+
+    public KernelLoginModule() {
+        this.credentialStore = PropertiesFileCredentialStoreFactory.create(getProperties());
+    }
+
+    KernelLoginModule(CredentialStore credentialStore) {
+        this.credentialStore = credentialStore;
+    }
+
+    public void initialize(Subject subject, CallbackHandler callbackHandler, Map<String, ?> sharedState, Map<String, ?> options) {
+        this.subject = subject;
+        this.callbackHandler = callbackHandler;
+    }
+
+    public boolean login() throws LoginException {
+        // We do not actually care about these prompts but they must be populated
+        NameCallback nameCallback = new NameCallback("username");
+        PasswordCallback passwordCallback = new PasswordCallback("password", false);
+
+        try {
+            this.callbackHandler.handle(new Callback[] { nameCallback, passwordCallback });
+        } catch (UnsupportedCallbackException e) {
+            throw new FailedLoginException("Unable to get username and password");
+        } catch (IOException e) {
+            throw new FailedLoginException("Unable to get username and password");
+        }
+
+        this.user = this.credentialStore.getUser(nameCallback.getName());
+        this.authenticationResult = this.user.authenticate(new String(passwordCallback.getPassword()));
+
+        if (authenticationResult) {
+            return true;
+        }
+        throw new FailedLoginException("Credentials did not match");
+    }
+
+    public boolean commit() throws LoginException {
+        if (!this.authenticationResult) {
+            this.user = null;
+            return false;
+        }
+
+        this.user.addPrincipals(this.subject);
+        return true;
+    }
+
+    public boolean abort() throws LoginException {
+        this.user = null;
+        return true;
+    }
+
+    public boolean logout() throws LoginException {
+        this.user.removePrincipals(this.subject);
+        this.subject = null;
+        this.user = null;
+        return true;
+    }
+
+    private Properties getProperties() {
+        String fileLocation = System.getProperty(FILE_LOCATION);
+        if (fileLocation == null) {
+            throw new IllegalArgumentException(String.format("System property '%s' must be set to use the %s JAAS Login Module", FILE_LOCATION,
+                this.getClass().getCanonicalName()));
+        }
+
+        try (Reader reader = new InputStreamReader(new FileInputStream(fileLocation), UTF_8)) {
+            Properties properties = new Properties();
+            properties.load(reader);
+            return properties;
+        } catch (IOException e) {
+            throw new IllegalArgumentException(String.format("Unable to load properties file from '%s'", fileLocation), e);
+        }
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.authentication/src/main/java/org/eclipse/virgo/nano/authentication/PropertiesFileCredentialStoreFactory.java b/nano/org.eclipse.virgo.nano.authentication/src/main/java/org/eclipse/virgo/nano/authentication/PropertiesFileCredentialStoreFactory.java
new file mode 100644
index 0000000..941fe0b
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.authentication/src/main/java/org/eclipse/virgo/nano/authentication/PropertiesFileCredentialStoreFactory.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.authentication;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+import static java.lang.String.format;
+
+/**
+ * A factory for a {@link CredentialStore} that reads a {@link Properties} object for authentication information.  The keys of
+ * this {@link Properties} object indicate user name and role information.  A user name and password are identified with
+ * a <code>user.</code> prefix and a role to user mapping is represented with a <code>role.</code> prefix.
+ * <p />
+ *
+ * <pre>
+ * user.admin=springsource
+ * role.superuser=admin
+ * </pre>
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+final class PropertiesFileCredentialStoreFactory {
+
+    private static final String USER_PREFIX = "user.";
+
+    private static final String ROLE_PREFIX = "role.";
+
+    static CredentialStore create(Properties properties) {
+        Map<String, User> credentials = getUsers(properties);
+        assignRoles(properties, credentials);
+        return new ImmutableCredentialStore(credentials);
+    }
+
+    private static Map<String, User> getUsers(Properties properties) {
+        Map<String, User> users = new HashMap<String, User>();
+
+        for(String key : properties.stringPropertyNames()) {
+            if (key.startsWith(USER_PREFIX)) {
+                String username = key.substring(USER_PREFIX.length()).trim();
+                String password = properties.getProperty(key);
+                users.put(username, new User(username, password));
+            }
+        }
+
+        return users;
+    }
+
+    private static void assignRoles(Properties properties, Map<String, User> credentials) {
+        for(String key : properties.stringPropertyNames()) {
+            if (key.startsWith(ROLE_PREFIX)) {
+                String rolename = key.substring(ROLE_PREFIX.length()).trim();
+                Role role = new Role(rolename);
+                assignRole(role, (String) properties.get(key), credentials);
+            }
+        }
+    }
+
+    private static void assignRole(Role role, String usernames, Map<String, User> credentials) {
+        for(String username : usernames.split(",")) {
+            User user = credentials.get(username);
+            if (user != null) {
+                user.addRole(role);
+            } else {
+                throw new IllegalArgumentException(format("Could not assign role '%s' to user '%s', as user does not exist", role.getName(),
+                    username));
+            }
+        }
+    }
+
+    private static class ImmutableCredentialStore implements CredentialStore {
+
+        private final Map<String, User> credentials;
+
+        public ImmutableCredentialStore(Map<String, User> credentials) {
+            this.credentials = credentials;
+        }
+
+        public User getUser(String name) {
+            return this.credentials.get(name);
+        }
+
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.authentication/src/main/java/org/eclipse/virgo/nano/authentication/Role.java b/nano/org.eclipse.virgo.nano.authentication/src/main/java/org/eclipse/virgo/nano/authentication/Role.java
new file mode 100644
index 0000000..d808d02
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.authentication/src/main/java/org/eclipse/virgo/nano/authentication/Role.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.authentication;
+
+import java.security.Principal;
+
+/**
+ * An implementation of {@link Principal} that represents a role that a user can have
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+public final class Role implements Principal {
+
+    private final String name;
+
+    public Role(String name) {
+        this.name = name;
+    }
+
+    public String getName() {
+        return this.name;
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((name == null) ? 0 : name.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (!(obj instanceof Role)) {
+            return false;
+        }
+        Role other = (Role) obj;
+        if (name == null) {
+            if (other.name != null) {
+                return false;
+            }
+        } else if (!name.equals(other.name)) {
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public String toString() {
+        return this.name;
+    }
+
+}
diff --git a/nano/org.eclipse.virgo.nano.authentication/src/main/java/org/eclipse/virgo/nano/authentication/User.java b/nano/org.eclipse.virgo.nano.authentication/src/main/java/org/eclipse/virgo/nano/authentication/User.java
new file mode 100644
index 0000000..6fc69df
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.authentication/src/main/java/org/eclipse/virgo/nano/authentication/User.java
@@ -0,0 +1,145 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.authentication;
+
+import javax.security.auth.Subject;
+import java.security.Principal;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * An implementation of {@link Principal} that represents a user
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+public final class User implements Principal {
+
+    private final String name;
+
+    private final String credential;
+
+    private final Set<Role> roles = new HashSet<Role>();
+
+    private final Object roleMonitor = new Object();
+
+    public User(String name, String password) {
+        this.name = name;
+        this.credential = password;
+    }
+
+    public String getName() {
+        return this.name;
+    }
+
+    /**
+     * Checks that a candidate credential is authentic with respect to this {@link User}
+     * 
+     * @param candidateCredential The candidate credential to check
+     * @return <code>true</code> if candidate credential matches, <code>false</code> otherwise
+     */
+    public boolean authenticate(String candidateCredential) {
+        return this.credential.equals(candidateCredential);
+    }
+
+    /**
+     * Adds all of the {@link Principal}s represented by this {@link User}
+     * 
+     * @param subject The {@link Subject} to configure
+     */
+    public void addPrincipals(Subject subject) {
+        Set<Principal> principals = subject.getPrincipals();
+        synchronized (this.roleMonitor) {
+            principals.add(this);
+            principals.addAll(this.roles);
+        }
+    }
+
+    /**
+     * Removes all of the {@link Principal}s represented by this {@link User}
+     *
+     * @param subject The {@link Subject} to configure}
+     */
+    public void removePrincipals(Subject subject) {
+        Set<Principal> principals = subject.getPrincipals();
+        synchronized (this.roleMonitor) {
+            principals.remove(this);
+            principals.removeAll(this.roles);
+        }
+    }
+
+    /**
+     * Adds a {@link Role} to this {@link User}
+     *
+     * @param role The {@link Role} this user has
+     * @return <tt>true</tt> if this {@link User} did not already contain the specified {@link Role}
+     */
+    public boolean addRole(Role role) {
+        synchronized (this.roleMonitor) {
+            return this.roles.add(role);
+        }
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((name == null) ? 0 : name.hashCode());
+        result = prime * result + ((credential == null) ? 0 : credential.hashCode());
+        result = prime * result + ((roles == null) ? 0 : roles.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (!(obj instanceof User)) {
+            return false;
+        }
+        User other = (User) obj;
+        if (name == null) {
+            if (other.name != null) {
+                return false;
+            }
+        } else if (!name.equals(other.name)) {
+            return false;
+        }
+        if (credential == null) {
+            if (other.credential != null) {
+                return false;
+            }
+        } else if (!credential.equals(other.credential)) {
+            return false;
+        }
+        if (roles == null) {
+            if (other.roles != null) {
+                return false;
+            }
+        } else if (!roles.equals(other.roles)) {
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public String toString() {
+        return this.name;
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.authentication/src/main/resources/about.html b/nano/org.eclipse.virgo.nano.authentication/src/main/resources/about.html
new file mode 100644
index 0000000..c258ef5
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.authentication/src/main/resources/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>June 5, 2006</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/nano/org.eclipse.virgo.nano.authentication/src/test/java/org/eclipse/virgo/nano/authentication/KernelLoginModuleTests.java b/nano/org.eclipse.virgo.nano.authentication/src/test/java/org/eclipse/virgo/nano/authentication/KernelLoginModuleTests.java
new file mode 100644
index 0000000..ca5c60b
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.authentication/src/test/java/org/eclipse/virgo/nano/authentication/KernelLoginModuleTests.java
@@ -0,0 +1,142 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.authentication;
+
+import org.eclipse.virgo.nano.authentication.CredentialStore;
+import org.eclipse.virgo.nano.authentication.KernelLoginModule;
+import org.eclipse.virgo.nano.authentication.User;
+import org.junit.Test;
+import static org.junit.Assert.assertFalse;
+
+import javax.security.auth.Subject;
+import javax.security.auth.login.LoginException;
+import javax.security.auth.login.FailedLoginException;
+import javax.security.auth.callback.*;
+import java.io.IOException;
+
+import static org.junit.Assert.assertTrue;
+
+public class KernelLoginModuleTests {
+
+    private final StubCredentialStore credentialStore = new StubCredentialStore();
+
+    private final Subject subject = new Subject();
+
+    private final KernelLoginModule loginModule = new KernelLoginModule(credentialStore);
+
+    @Test
+    public void loginSuccess() throws LoginException {
+        this.credentialStore.setUser(new User("username", "password"));
+        this.loginModule.initialize(this.subject, new StubCallbackHandler(), null, null);
+        assertTrue(this.loginModule.login());
+    }
+
+    @Test(expected = FailedLoginException.class)
+    public void loginFailure() throws LoginException {
+        this.credentialStore.setUser(new User("username", "different-password"));
+        this.loginModule.initialize(this.subject, new StubCallbackHandler(), null, null);
+        this.loginModule.login();
+    }
+
+    @Test
+    public void loginSuccessCommit() throws LoginException {
+        this.credentialStore.setUser(new User("username", "password"));
+        this.loginModule.initialize(this.subject, new StubCallbackHandler(), null, null);
+        assertTrue(this.loginModule.login());
+
+        assertTrue(this.loginModule.commit());
+        assertTrue(this.subject.getPrincipals().size() != 0);
+    }
+
+    @Test
+    public void loginFailureCommit() throws LoginException {
+        this.credentialStore.setUser(new User("username", "different-password"));
+        this.loginModule.initialize(this.subject, new StubCallbackHandler(), null, null);
+        try {
+            this.loginModule.login();
+        } catch (LoginException e) {
+        }
+
+        assertFalse(this.loginModule.commit());
+        assertTrue(this.subject.getPrincipals().size() == 0);
+    }
+
+    @Test
+    public void abort() throws LoginException {
+        assertTrue(this.loginModule.abort());
+    }
+
+    @Test
+    public void logout() throws LoginException {
+        this.credentialStore.setUser(new User("username", "password"));
+        this.loginModule.initialize(this.subject, new StubCallbackHandler(), null, null);
+        assertTrue(this.loginModule.login());
+
+        assertTrue(this.loginModule.commit());
+        assertTrue(this.subject.getPrincipals().size() != 0);
+
+        assertTrue(this.loginModule.logout());
+        assertTrue(this.subject.getPrincipals().size() == 0);
+    }
+
+    @Test
+    public void getProperties() {
+        System.setProperty(KernelLoginModule.FILE_LOCATION, "src/test/resources/user.properties");
+        new KernelLoginModule();
+        System.clearProperty(KernelLoginModule.FILE_LOCATION);
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void getPropertiesNoSystemProperty() {
+        new KernelLoginModule();
+    }
+
+    private static class StubCredentialStore implements CredentialStore {
+
+        private volatile User user;
+
+        public void setUser(User user) {
+            this.user = user;
+        }
+
+        public User getUser(String name) {
+            return this.user;
+        }
+    }
+
+    private static class StubCallbackHandler implements CallbackHandler {
+
+        private final String username;
+
+        private final String password;
+
+        public StubCallbackHandler() {
+            this("username", "password");
+        }
+
+        public StubCallbackHandler(String username, String password) {
+            this.username = username;
+            this.password = password;
+        }
+
+        public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
+            for(Callback callback : callbacks) {
+                if(callback instanceof NameCallback) {
+                    ((NameCallback) callback).setName(this.username);
+                } else if (callback instanceof PasswordCallback) {
+                    ((PasswordCallback) callback).setPassword(this.password.toCharArray());
+                }
+            }
+        }
+    }
+
+}
diff --git a/nano/org.eclipse.virgo.nano.authentication/src/test/java/org/eclipse/virgo/nano/authentication/PropertiesFileCredentialStoreFactoryTests.java b/nano/org.eclipse.virgo.nano.authentication/src/test/java/org/eclipse/virgo/nano/authentication/PropertiesFileCredentialStoreFactoryTests.java
new file mode 100644
index 0000000..bdb153d
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.authentication/src/test/java/org/eclipse/virgo/nano/authentication/PropertiesFileCredentialStoreFactoryTests.java
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.authentication;
+
+import static org.junit.Assert.*;
+
+import org.eclipse.virgo.nano.authentication.CredentialStore;
+import org.eclipse.virgo.nano.authentication.PropertiesFileCredentialStoreFactory;
+import org.eclipse.virgo.nano.authentication.Role;
+import org.eclipse.virgo.nano.authentication.User;
+import org.junit.Test;
+
+import javax.security.auth.Subject;
+import java.security.Principal;
+import java.util.Properties;
+
+public class PropertiesFileCredentialStoreFactoryTests {
+
+    @Test
+    public void success() {
+        Properties properties = new Properties();
+        properties.put("user.admin", "springsource");
+        properties.put("role.superuser", "admin");
+
+        CredentialStore credentialStore = PropertiesFileCredentialStoreFactory.create(properties);
+        User user = credentialStore.getUser("admin");
+        assertNotNull(user);
+        assertTrue(user.authenticate("springsource"));
+
+        Subject subject = new Subject();
+        user.addPrincipals(subject);
+        assertEquals(2, subject.getPrincipals().size());
+        assertContainsRole(subject, "superuser");
+    }
+
+    @Test
+    public void twoUsersOneRole() {
+        Properties properties = new Properties();
+        properties.put("user.admin1", "springsource");
+        properties.put("user.admin2", "springsource");
+        properties.put("role.superuser", "admin1");
+
+        CredentialStore credentialStore = PropertiesFileCredentialStoreFactory.create(properties);
+        User user1 = credentialStore.getUser("admin1");
+        assertNotNull(user1);
+        assertTrue(user1.authenticate("springsource"));
+        Subject subject1 = new Subject();
+        user1.addPrincipals(subject1);
+        assertEquals(2, subject1.getPrincipals().size());
+        assertContainsRole(subject1, "superuser");
+
+        User user2 = credentialStore.getUser("admin2");
+        assertNotNull(user2);
+        assertTrue(user2.authenticate("springsource"));
+        Subject subject2 = new Subject();
+        user2.addPrincipals(subject2);
+        assertEquals(1, subject2.getPrincipals().size());
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void roleWithIllegalUser() {
+        Properties properties = new Properties();
+        properties.put("user.admin", "springsource");
+        properties.put("role.superuser", "admin1");
+
+        PropertiesFileCredentialStoreFactory.create(properties);
+    }
+
+    private void assertContainsRole(Subject subject, String roleName) {
+        boolean foundRole = false;
+        for(Principal principal : subject.getPrincipals()) {
+            if(principal instanceof Role) {
+                if(principal.getName().equals(roleName)) {
+                    foundRole = true;
+                    break;
+                }
+            }
+        }
+        assertTrue(foundRole);
+    }
+
+}
diff --git a/nano/org.eclipse.virgo.nano.authentication/src/test/java/org/eclipse/virgo/nano/authentication/RoleTests.java b/nano/org.eclipse.virgo.nano.authentication/src/test/java/org/eclipse/virgo/nano/authentication/RoleTests.java
new file mode 100644
index 0000000..d8f5b2a
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.authentication/src/test/java/org/eclipse/virgo/nano/authentication/RoleTests.java
@@ -0,0 +1,87 @@
+/* Copyright (c) 2010 Olivier Girardot
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Olivier Girardot - initial contribution
+ */
+
+package org.eclipse.virgo.nano.authentication;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertNull;
+
+import java.security.Principal;
+
+import org.junit.Test;
+
+/**
+ * This class is for testing {@link Role} class, 
+ * an implementation of the {@link Principal} interface.
+ */
+public class RoleTests {
+
+    private static final String ADMINISTRATOR_ROLE = "Administrator";
+    private static final String TESTER_ROLE = "Tester";
+
+    @Test
+    public void testEqualsWithNull() {
+        assertFalse(new Role(ADMINISTRATOR_ROLE).equals(null));
+    }
+    
+    @Test
+    public void testEqualsWithSameReference() {
+        Role adminRole = new Role(ADMINISTRATOR_ROLE);
+        assertTrue(adminRole.equals(adminRole));
+    }
+    
+    @Test
+    public void testHashCodeWithSameNullParameters() {
+        Role nullRole = new Role(null);
+        assertEquals((new Role(null)).hashCode(), nullRole.hashCode());
+    }
+    
+    @Test
+    public void testHashCodeWithSameNonNullParameters() {
+        Role adminRole = new Role(ADMINISTRATOR_ROLE);
+        assertEquals((new Role(ADMINISTRATOR_ROLE)).hashCode(), adminRole.hashCode());
+    }
+    
+    @Test
+    public void testEqualsWithSameNullParameters() {
+        assertTrue(new Role(null).equals(new Role(null)));
+    }
+    
+    @Test
+    public void testNotEqualsWithDifferentParameters() {
+        assertFalse(new Role(null).equals(new Role(ADMINISTRATOR_ROLE)));
+    }
+    
+    @Test
+    public void testMeaningFullEquals() {
+        Role adminRole = new Role(ADMINISTRATOR_ROLE);
+        Role secAdminRole = new Role(ADMINISTRATOR_ROLE);
+        assertTrue(adminRole.equals(secAdminRole));
+    }
+    
+    @Test
+    public void testEqualsWithDifferentParameters() {
+        Role adminRole = new Role(ADMINISTRATOR_ROLE);
+        Role secAdminRole = new Role(TESTER_ROLE);
+        assertFalse(adminRole.equals(secAdminRole));
+    }
+    
+    @Test
+    public void testEqualsWithWrongType() {
+        assertFalse(new Role(null).equals(new Object()));
+    }
+    
+    @Test
+    public void testToStringWithNull() {
+        assertNull(new Role(null).toString());
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.authentication/src/test/java/org/eclipse/virgo/nano/authentication/UserTests.java b/nano/org.eclipse.virgo.nano.authentication/src/test/java/org/eclipse/virgo/nano/authentication/UserTests.java
new file mode 100644
index 0000000..6d409ab
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.authentication/src/test/java/org/eclipse/virgo/nano/authentication/UserTests.java
@@ -0,0 +1,170 @@
+/* Copyright (c) 2010 Olivier Girardot
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Olivier Girardot - initial contribution
+ */
+
+package org.eclipse.virgo.nano.authentication;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.security.Principal;
+
+import org.junit.Test;
+
+/**
+ * This class is for testing {@link User} class, 
+ * an implementation of the {@link Principal} interface.
+ */
+public class UserTests {
+    private static final String TEST_NAME = "john";
+    private static final String ALT_TEST_NAME = "jane";
+    private static final String TEST_PASSWORD = "#znuvdpo";
+    private static final String ALT_TEST_PASSWORD = "#anjbjvdpo";
+    private static final Role ADMIN_ROLE = new Role("Administrator");
+    private static final Role TESTER_ROLE = new Role("Tester");
+    
+    @Test
+    public void testGetName() {
+        assertEquals(TEST_NAME, new User(TEST_NAME, TEST_PASSWORD).getName());
+    }
+    
+    @Test
+    public void testEqualsWithNull() {
+        assertFalse(new User(TEST_NAME, TEST_PASSWORD).equals(null));
+    }
+    
+    @Test
+    public void testEqualsWithNullFields() {
+        assertTrue(new User(null, null).equals(new User(null, null)));
+    }
+    
+    @Test
+    public void testEqualsWithAlmostNullFields() {
+        assertFalse(new User(null, null).equals(new User(TEST_NAME, TEST_PASSWORD)));
+        assertFalse(new User(null, null).equals(new User(TEST_NAME, null)));
+        assertFalse(new User(null, null).equals(new User(null, TEST_PASSWORD)));
+    }
+    
+    @Test
+    public void testEqualsWithSameReference() {
+        User testUser = new User(TEST_NAME, TEST_PASSWORD);
+        assertTrue(testUser.equals(testUser));
+    }
+    
+    @Test
+    public void testEqualsWithObject() {
+        User testUser = new User(TEST_NAME, TEST_PASSWORD);
+        assertFalse(testUser.equals(new Object()));
+    }
+    
+    @Test
+    public void testEqualsWithSameNameDifferentCredentials() {
+        User refUser = new User(TEST_NAME, TEST_PASSWORD);
+        User candidateUser = new User(TEST_NAME, ALT_TEST_PASSWORD);
+        assertFalse(refUser.equals(candidateUser));
+    }
+    
+    @Test
+    public void testEqualsWithDifferentRoles() {
+        User refUser = new User(TEST_NAME, TEST_PASSWORD);
+        refUser.addRole(ADMIN_ROLE);
+        User candidateUser = new User(TEST_NAME, TEST_PASSWORD);
+        candidateUser.addRole(TESTER_ROLE);
+        assertFalse(refUser.equals(candidateUser));
+    }
+    
+    @Test
+    public void testEqualsWithSameCredentialDifferentNames() {
+        User refUser = new User(TEST_NAME, TEST_PASSWORD);
+        User candidateUser = new User(ALT_TEST_NAME, TEST_PASSWORD);
+        assertFalse(refUser.equals(candidateUser));
+    }
+    
+    @Test
+    public void testEqualsWithSameRoles() {
+        User refUser = new User(TEST_NAME, TEST_PASSWORD);
+        refUser.addRole(ADMIN_ROLE);
+        User candidateUser = new User(ALT_TEST_NAME, ALT_TEST_PASSWORD);
+        candidateUser.addRole(ADMIN_ROLE);
+        assertFalse(refUser.equals(candidateUser));
+    }
+    
+    @Test
+    public void testEqualsWithFullyDifferentUser() {
+        User refUser = new User(TEST_NAME, TEST_PASSWORD);
+        refUser.addRole(ADMIN_ROLE);
+        User candidateUser = new User(ALT_TEST_NAME, ALT_TEST_PASSWORD);
+        candidateUser.addRole(TESTER_ROLE);
+        assertFalse(refUser.equals(candidateUser));
+    }
+    
+    @Test
+    public void testEqualsWithMeaningfullEquality() {
+        User refUser = new User(TEST_NAME, TEST_PASSWORD);
+        refUser.addRole(ADMIN_ROLE);
+        User candidateUser = new User(TEST_NAME, TEST_PASSWORD);
+        candidateUser.addRole(ADMIN_ROLE);
+        assertTrue(refUser.equals(candidateUser));
+    }
+    
+    @Test
+    public void testHashCodeForSameObjects() {
+        User refUser = new User(TEST_NAME, TEST_PASSWORD);
+        refUser.addRole(ADMIN_ROLE);
+        assertEquals(refUser.hashCode(), refUser.hashCode());
+    }
+    
+    @Test
+    public void testHashCodeForDifferentEqualObjects() {
+        User refUser = new User(TEST_NAME, TEST_PASSWORD);
+        refUser.addRole(ADMIN_ROLE);
+        User candidateUser = new User(TEST_NAME, TEST_PASSWORD);
+        candidateUser.addRole(ADMIN_ROLE);
+        assertEquals(refUser.hashCode(), candidateUser.hashCode());
+    }
+    
+    @Test
+    public void testHashCodeForDifferentObjects() {
+        User refUser = new User(TEST_NAME, TEST_PASSWORD);
+        refUser.addRole(ADMIN_ROLE);
+        User candidateUser = new User(ALT_TEST_NAME, ALT_TEST_PASSWORD);
+        candidateUser.addRole(TESTER_ROLE);
+        assertFalse(refUser.hashCode() == candidateUser.hashCode());
+    }
+    
+    @Test
+    public void testHashCodeForSameNullObjects() {
+        User refUser = new User(null, null);
+        refUser.addRole(null);
+        User candidateUser = new User(null, null);
+        candidateUser.addRole(null);
+        assertTrue(refUser.hashCode() == candidateUser.hashCode());
+    }
+    
+    @Test
+    public void testToStringWithNulls() {
+        User refUser = new User(null, null);
+        assertNull(refUser.toString());
+    }
+    
+    @Test
+    public void testToString() {
+        User refUser = new User(TEST_NAME, TEST_PASSWORD);
+        assertEquals(TEST_NAME, refUser.toString());
+    }
+    
+    @Test
+    public void testAuthenticate() {
+        User refUser = new User(TEST_NAME, TEST_PASSWORD);
+        assertTrue(refUser.authenticate(TEST_PASSWORD));
+        assertFalse(refUser.authenticate(ALT_TEST_PASSWORD));
+    }
+}
\ No newline at end of file
diff --git a/nano/org.eclipse.virgo.nano.authentication/src/test/resources/user.properties b/nano/org.eclipse.virgo.nano.authentication/src/test/resources/user.properties
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.authentication/src/test/resources/user.properties
diff --git a/nano/org.eclipse.virgo.nano.authentication/template.mf b/nano/org.eclipse.virgo.nano.authentication/template.mf
new file mode 100644
index 0000000..cada94e
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.authentication/template.mf
@@ -0,0 +1,8 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Virgo Kernel Authentication
+Bundle-SymbolicName: org.eclipse.virgo.nano.authentication
+Bundle-Version: ${version}
+Import-Template: javax.security.*;version="0"
+Excluded-Exports: *.internal.*
+
diff --git a/nano/org.eclipse.virgo.nano.core/.settings/org.eclipse.virgo.ide.bundlor.core.prefs b/nano/org.eclipse.virgo.nano.core/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
new file mode 100644
index 0000000..bf6d2f7
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
@@ -0,0 +1,3 @@
+#Mon Jul 06 09:08:03 BST 2009
+org.eclipse.virgo.ide.bundlor.core.template.properties.files=../build.properties;../build.versions
+eclipse.preferences.version=1
diff --git a/nano/org.eclipse.virgo.nano.core/.settings/org.eclipse.wst.common.project.facet.core.xml b/nano/org.eclipse.virgo.nano.core/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..92aa290
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+  <installed facet="org.eclipse.virgo.server.bundle" version="1.0"/>
+</faceted-project>
diff --git a/nano/org.eclipse.virgo.nano.core/findbugs-exclude.xml b/nano/org.eclipse.virgo.nano.core/findbugs-exclude.xml
new file mode 100644
index 0000000..155cb8c
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/findbugs-exclude.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<FindBugsFilter>
+	<!-- Exclusions -->
+	<Match>
+		<Bug pattern="DM_EXIT"/>
+		<Class name="org.eclipse.virgo.nano.core.internal.ShutdownManager"/>
+		<Method name="immediateShutdown"/>
+	</Match>
+</FindBugsFilter>
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/internal/AssertingService.java b/nano/org.eclipse.virgo.nano.core/src/main/java/internal/AssertingService.java
new file mode 100644
index 0000000..24f170f
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/internal/AssertingService.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package internal;
+
+import org.eclipse.virgo.nano.serviceability.NonNull;
+
+// FIXME Bug 463462 - Move back to test source folder when we know how to weave test classes
+public class AssertingService {
+
+    public AssertingService() {
+    }
+    
+    public AssertingService( @NonNull String a) {
+    }
+    
+    public AssertingService(String a, @NonNull Integer b) {
+    }
+    
+    public AssertingService(String a, Integer b, @NonNull Double c) {
+    }
+    
+    public void test(@NonNull String a) {
+    }
+
+    public void test(@NonNull String a, @NonNull Integer b) {
+    }
+    
+    public void test(String a, Integer b, @NonNull Double d) {
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/config/internal/ConfigurationAdminConfigurationInfo.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/config/internal/ConfigurationAdminConfigurationInfo.java
new file mode 100644
index 0000000..be844f4
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/config/internal/ConfigurationAdminConfigurationInfo.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.config.internal;
+
+import java.io.IOException;
+import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class ConfigurationAdminConfigurationInfo implements ConfigurationInfo {
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private final ConfigurationAdmin configurationAdmin;
+
+    private final String pid;
+
+    public ConfigurationAdminConfigurationInfo(@NonNull ConfigurationAdmin configurationAdmin, String pid) {
+        this.configurationAdmin = configurationAdmin;
+        this.pid = pid;
+    }
+
+    public String getPid() {
+        return this.pid;
+    }
+
+    public Map<String, String> getProperties() {
+        try {
+            Configuration configuration = configurationAdmin.getConfiguration(this.pid, null);
+            Map<String, String> properties = new HashMap<String, String>();
+
+            Dictionary<String, Object> dictionary = configuration.getProperties();
+
+            if (dictionary != null) {
+                Enumeration<String> keys = dictionary.keys();
+                while (keys.hasMoreElements()) {
+                    String key = keys.nextElement();
+                    String value = (String)dictionary.get(key);
+                    properties.put(key, value);
+                }
+            }
+            return properties;
+        } catch (IOException e) {
+            logger.warn("Unable to get configuration for {}", this.pid);
+        }
+        return null;
+    }
+
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/config/internal/ConfigurationAdminDumpContributor.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/config/internal/ConfigurationAdminDumpContributor.java
new file mode 100644
index 0000000..8e23f92
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/config/internal/ConfigurationAdminDumpContributor.java
@@ -0,0 +1,97 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.config.internal;
+
+import static org.eclipse.virgo.util.io.IOUtils.closeQuietly;
+
+import java.io.IOException;
+import java.io.Writer;
+import java.util.Dictionary;
+import java.util.Enumeration;
+
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.eclipse.virgo.medic.dump.Dump;
+import org.eclipse.virgo.medic.dump.DumpContributionFailedException;
+import org.eclipse.virgo.medic.dump.DumpContributor;
+
+public class ConfigurationAdminDumpContributor implements DumpContributor {
+
+    private static final String PROPERTY_PATTERN = "%s:\t%s\n";
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private final ConfigurationAdmin configurationAdmin;
+
+    public ConfigurationAdminDumpContributor(ConfigurationAdmin configurationAdmin) {
+        this.configurationAdmin = configurationAdmin;
+    }
+
+    public void contribute(Dump dump) throws DumpContributionFailedException {
+        StringBuilder sb = new StringBuilder();
+
+        try {
+            for (Configuration configuration : configurationAdmin.listConfigurations(null)) {
+                appendHeader(sb, configuration.getPid());
+                appendProperties(sb, configuration.getProperties());
+                appendFooter(sb);
+            }
+        } catch (Exception e) {
+            logger.warn("Could not enumerate existing configurations");
+        }
+
+        Writer out = null;
+        try {
+            out = dump.createFileWriter("configurationAdmin.properties");
+            out.write(sb.toString());
+        } catch (IOException e) {
+            logger.warn("Could not write configurationAdmin dump");
+        } finally {
+            closeQuietly(out);
+        }
+    }
+
+    public String getName() {
+        return "configurationAdmin";
+    }
+
+    private void appendHeader(StringBuilder sb, String pid) {
+        for (int i = 0; i < pid.length() + 4; i++) {
+            sb.append("#");
+        }
+        sb.append("\n# ").append(pid).append(" #\n");
+        for (int i = 0; i < pid.length() + 4; i++) {
+            sb.append("#");
+        }
+        sb.append("\n\n");
+    }
+
+    private void appendProperties(StringBuilder sb, Dictionary<String, Object> properties) {
+        Enumeration<String> keys = properties.keys();
+        while (keys.hasMoreElements()) {
+            Object key = keys.nextElement();
+            appendProperty(sb, key, properties.get(key));
+        }
+    }
+
+    private void appendProperty(StringBuilder sb, Object key, Object value) {
+        sb.append(String.format(PROPERTY_PATTERN, key, value));
+    }
+
+    private void appendFooter(StringBuilder sb) {
+        sb.append("\n\n");
+    }
+
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/config/internal/ConfigurationInfo.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/config/internal/ConfigurationInfo.java
new file mode 100644
index 0000000..af9de07
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/config/internal/ConfigurationInfo.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.config.internal;
+
+import java.util.Map;
+
+import javax.management.MXBean;
+
+@MXBean
+public interface ConfigurationInfo {
+
+    String getPid();
+
+    Map<String, String> getProperties();
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/config/internal/ConfigurationInitialiser.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/config/internal/ConfigurationInitialiser.java
new file mode 100644
index 0000000..2ed925c
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/config/internal/ConfigurationInitialiser.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.config.internal;
+
+import java.io.IOException;
+
+import org.eclipse.virgo.medic.dump.DumpContributor;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.nano.config.internal.commandline.CommandLinePropertiesSource;
+import org.eclipse.virgo.nano.config.internal.ovf.OvfPropertiesSource;
+import org.eclipse.virgo.util.osgi.ServiceRegistrationTracker;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.cm.ConfigurationAdmin;
+
+/**
+ * ConfigurationInitialiser
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * threadsafe
+ *  
+ */
+public final class ConfigurationInitialiser {
+
+    private final ServiceRegistrationTracker tracker = new ServiceRegistrationTracker();
+        
+    private ConsoleConfigurationConvertor consoleConfigurationConvertor;
+
+    public KernelConfiguration start(BundleContext context, EventLogger eventLogger) throws IOException {
+
+        //The ConfigurationAdmin service is already available because the caller of this method(CoreBundleActivator.activate)
+        //is a DS component that statically requires it
+        ServiceReference<ConfigurationAdmin> configurationAdminReference = context.getServiceReference(ConfigurationAdmin.class);
+
+        ConfigurationAdmin configAdmin = null;
+
+        if (configurationAdminReference != null) {
+            configAdmin = (ConfigurationAdmin) context.getService(configurationAdminReference);
+        }
+
+        if (configAdmin == null) {
+            throw new IllegalStateException("ConfigurationAdmin service missing");
+        }
+        KernelConfiguration configuration = new KernelConfiguration(context);
+
+        publishConfiguration(context, eventLogger, configuration, configAdmin);
+        initializeDumpContributor(context, configAdmin);
+        initializeConsoleConfigurationConvertor(context, configAdmin);
+        return configuration;
+
+    }
+
+    private void publishConfiguration(BundleContext context, EventLogger eventLogger, KernelConfiguration configuration,
+        ConfigurationAdmin configAdmin) throws IOException {
+        PropertiesSource[] sources = new PropertiesSource[] { new UserConfigurationPropertiesSource(configuration.getConfigDirectories()),
+            new OvfPropertiesSource(context, eventLogger), new KernelConfigurationPropertiesSource(configuration),
+            new CommandLinePropertiesSource(context, eventLogger) };
+        ConfigurationPublisher configPublisher = new ConfigurationPublisher(configAdmin, sources);
+        configPublisher.publishConfigurations();
+        configPublisher.registerConfigurationExporterService(context);
+    }
+
+    private void initializeDumpContributor(BundleContext context, ConfigurationAdmin configAdmin) {
+        ConfigurationAdminDumpContributor dumpContributor = new ConfigurationAdminDumpContributor(configAdmin);
+        this.tracker.track(context.registerService(DumpContributor.class.getName(), dumpContributor, null));
+    }
+    
+    private void initializeConsoleConfigurationConvertor(BundleContext context, ConfigurationAdmin configAdmin) {
+        consoleConfigurationConvertor = new ConsoleConfigurationConvertor(context, configAdmin);
+        consoleConfigurationConvertor.start();
+    }
+
+    public void stop() {
+        this.tracker.unregisterAll();
+        consoleConfigurationConvertor.stop();
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/config/internal/ConfigurationPublisher.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/config/internal/ConfigurationPublisher.java
new file mode 100644
index 0000000..cd6c5ed
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/config/internal/ConfigurationPublisher.java
@@ -0,0 +1,125 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.config.internal;
+
+import java.io.IOException;
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Map.Entry;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.eclipse.virgo.nano.core.ConfigurationExporter;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.eclipse.virgo.util.common.IterableEnumeration;
+import org.eclipse.virgo.util.common.StringUtils;
+
+/**
+ * <code>ConfigurationPublisher</code>, publishes kernel configuration to {@link ConfigurationAdmin}.
+ * <p/>
+ * Properties files in {@link KernelConfiguration#getConfigDirectories() config directories} are read in and applied to
+ * {@link Configuration Configurations} owned by <code>ConfigurationAdmin</code>. A file called
+ * <code><i>name</i>.properties</code> results in a <Code>Configuration</code> with the service pid
+ * <code><i>name</i></code>.
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ * 
+ * 
+ */
+final class ConfigurationPublisher {
+
+    private final Logger LOGGER = LoggerFactory.getLogger(this.getClass());
+    
+    private final ConfigurationAdmin configAdmin;
+
+    private final PropertiesSource[] sources;
+
+    private final static String KERNEL_REGION_CONFIGURATION_PID = KernelConfigurationPropertiesSource.KERNEL_CONFIGURATION_PID;
+    
+    private final static String USER_REGION_CONFIGURATION_PID = "org.eclipse.virgo.kernel.userregion";
+
+    ConfigurationPublisher(ConfigurationAdmin configAdmin, PropertiesSource... sources) {
+        this.configAdmin = configAdmin;
+        this.sources = (sources == null ? new PropertiesSource[0] : sources);
+    }
+
+    void publishConfigurations() throws IOException {
+        for (PropertiesSource source : this.sources) {
+            Map<String, Properties> configurationProperties = source.getConfigurationProperties();
+            if (configurationProperties != null) {
+                for (Entry<String, Properties> entry : configurationProperties.entrySet()) {
+                    populateConfigurationWithProperties(entry.getKey(), entry.getValue());
+                }
+            }
+        }
+    }
+    
+    void registerConfigurationExporterService(@NonNull BundleContext context) throws IOException {
+    	ConfigurationExporter configurationExporter = createConfigurationExporterService();
+        context.registerService(ConfigurationExporter.class, configurationExporter, null);
+    }
+
+	private ConfigurationExporter createConfigurationExporterService() throws IOException {
+		Configuration kernelregionConfiguration = this.configAdmin.getConfiguration(KERNEL_REGION_CONFIGURATION_PID);
+    	Configuration userregionConfiguration = this.configAdmin.getConfiguration(USER_REGION_CONFIGURATION_PID);
+    	
+        ConfigurationExporter configurationExporter = new StandardConfigurationExporter(userregionConfiguration, kernelregionConfiguration);
+		return configurationExporter;
+	}
+
+    @SuppressWarnings("unchecked")
+    private void populateConfigurationWithProperties(@NonNull String pid, @NonNull Properties properties) throws IOException {
+        Configuration config = getConfiguration(pid, properties);
+
+        Dictionary configProperties = config.getProperties();
+        if (configProperties == null) {
+            configProperties = new Hashtable();
+        }
+
+        for (Object key : new IterableEnumeration(properties.keys())) {
+            Object value = properties.get(key);
+            configProperties.put(key, value);
+        }
+        try {
+        	config.update(configProperties);
+        } catch (RuntimeException e) {
+			LOGGER.error(String.format("Failed to update configuration for pid '%s'", pid), e);
+		}
+    }
+
+    /**
+     * @param pid
+     * @param properties
+     * @return
+     * @throws IOException 
+     */
+    private Configuration getConfiguration(String pid, Properties properties) throws IOException {
+        Configuration result = null;
+        String factoryPid = properties.getProperty(ConfigurationAdmin.SERVICE_FACTORYPID);
+        if (StringUtils.hasText(factoryPid)) {
+            result = this.configAdmin.createFactoryConfiguration(factoryPid, null);
+        } else {
+            result = this.configAdmin.getConfiguration(pid, null);
+        }
+        return result;
+    }
+
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/config/internal/ConsoleConfigurationConvertor.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/config/internal/ConsoleConfigurationConvertor.java
new file mode 100644
index 0000000..5a22fb4
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/config/internal/ConsoleConfigurationConvertor.java
@@ -0,0 +1,176 @@
+
+package org.eclipse.virgo.nano.config.internal;
+
+import java.io.IOException;
+import java.net.BindException;
+import java.net.ServerSocket;
+import java.util.Dictionary;
+import java.util.Hashtable;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.cm.ConfigurationException;
+import org.osgi.service.cm.ManagedService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * 
+ * This class reads the merged shell configuration and registers it separated in the @link(ConfigurationAdmin).
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread-safe.
+ */
+public class ConsoleConfigurationConvertor {
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private final BundleContext context;
+
+    private final ConfigurationAdmin configAdmin;
+
+    private ServiceRegistration<ManagedService> configuratorRegistration;
+
+    private static final String CONSOLE_PID = "osgi.console";
+
+    private static final String TELNET_PID = "osgi.console.telnet";
+
+    private static final String SSH_PID = "osgi.console.ssh";
+
+    private static final String TELNET_PORT = "telnet.port";
+
+    private static final String TELNET_HOST = "telnet.host";
+
+    private static final String TELNET_ENABLED = "telnet.enabled";
+
+    private static final String SSH_PORT = "ssh.port";
+
+    private static final String SSH_HOST = "ssh.host";
+
+    private static final String SSH_ENABLED = "ssh.enabled";
+
+    private static final String HOST = "host";
+
+    private static final String PORT = "port";
+
+    private static final String ENABLED = "enabled";
+    
+    private static final String TELNET_SERVICE = "telnet";
+    
+    private static final String SSH_SERVICE = "ssh";
+    
+    private static final Object monitor = new Object();
+
+    ConsoleConfigurationConvertor(BundleContext context, ConfigurationAdmin configAdmin) {
+        this.context = context;
+        this.configAdmin = configAdmin;
+    }
+
+    public void start() {
+        Dictionary<String, String> consoleProperties = new Hashtable<String, String>();
+        consoleProperties.put(Constants.SERVICE_PID, CONSOLE_PID);
+        synchronized (ConsoleConfigurationConvertor.monitor) {
+            this.configuratorRegistration = this.context.registerService(ManagedService.class, new ConsoleConfigurator(), consoleProperties);
+        }
+    }
+
+    private void updateConfiguration(String pid, String host, String port, String enabled) {
+    	boolean isPortAvailable;
+    	if (pid.contains(TELNET_SERVICE)) {
+    		isPortAvailable = checkPortAvailability(port, enabled, TELNET_SERVICE);
+    	} else {
+    		isPortAvailable = checkPortAvailability(port, enabled, SSH_SERVICE);
+    	}
+    	
+    	if(!isPortAvailable) {
+    		return;
+    	}
+    	
+        try {
+            Configuration configuration = this.configAdmin.getConfiguration(pid, null);
+            Dictionary<String, String> properties = new Hashtable<String, String>();
+            properties.put(HOST, host);
+            properties.put(PORT, port);
+            properties.put(ENABLED, enabled);
+            configuration.update(properties);
+        } catch (IOException e) {
+            String message = String.format("Unable to update configuration with pid '%s'", pid);
+            this.logger.error(message, e);
+        }
+    }
+    
+    public void stop() {
+    	deleteConfiguration(TELNET_PID);
+    	deleteConfiguration(SSH_PID);
+    	deleteConfiguration(CONSOLE_PID);
+    }
+
+    private void deleteConfiguration(String pid) {
+        try {
+  			Configuration configuration = configAdmin.getConfiguration(pid, null);
+			configuration.delete();
+    	} catch (IOException e) {
+			String message = String.format("Unable to delete configuration with pid: " + pid);
+            this.logger.error(message, e);
+		}
+    }
+    
+    private boolean checkPortAvailability(String portStr, String enabled, String service) {
+    	if ("false".equalsIgnoreCase(enabled)) {
+    		return true;
+    	}
+    	int port = Integer.parseInt(portStr);
+    	ServerSocket socket = null;
+    	try {
+    		socket = new ServerSocket(port);
+    		return true;
+    	} catch (BindException e) {
+    		String message = "Port " + port + " already in use; " + service + " access to console will not be available";
+    		this.logger.error(message, e);
+    	} catch (IOException e) {
+			// do nothing
+		} finally {
+    		if (socket != null) {
+    			try {
+					socket.close();
+				} catch (IOException e) {
+					// do nothing
+				}
+    		}
+    	}
+    	return false;
+    }
+
+    class ConsoleConfigurator implements ManagedService {
+
+        private Dictionary<String,String> properties;
+
+        @SuppressWarnings("unchecked")
+		@Override
+        public void updated(Dictionary props) throws ConfigurationException {
+            if (props != null) {
+                this.properties = props;
+                this.properties.put(Constants.SERVICE_PID, CONSOLE_PID);
+            } else {
+                return;
+            }
+            synchronized (ConsoleConfigurationConvertor.monitor) {
+                ConsoleConfigurationConvertor.this.configuratorRegistration.setProperties(this.properties);
+            }
+
+            String telnetHost = this.properties.get(TELNET_HOST);
+            String telnetPort = this.properties.get(TELNET_PORT);
+            String telnetEnabled = this.properties.get(TELNET_ENABLED);
+            updateConfiguration(TELNET_PID, telnetHost, telnetPort, telnetEnabled);
+
+            String sshHost = this.properties.get(SSH_HOST);
+            String sshPort = this.properties.get(SSH_PORT);
+            String sshEnabled = this.properties.get(SSH_ENABLED);
+            updateConfiguration(SSH_PID, sshHost, sshPort, sshEnabled);
+        }
+    }
+}
\ No newline at end of file
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/config/internal/KernelConfiguration.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/config/internal/KernelConfiguration.java
new file mode 100644
index 0000000..55496ae
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/config/internal/KernelConfiguration.java
@@ -0,0 +1,145 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.config.internal;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.osgi.framework.BundleContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public final class KernelConfiguration {
+
+    private final Logger LOGGER = LoggerFactory.getLogger(this.getClass());
+
+    static final String PROPERTY_KERNEL_CONFIG = "org.eclipse.virgo.kernel.config";
+
+    static final String PROPERTY_KERNEL_HOME = "org.eclipse.virgo.kernel.home";
+
+    static final String PROPERTY_KERNEL_DOMAIN = "org.eclipse.virgo.kernel.domain";
+
+    static final String PROPERTY_KERNEL_STARTUP_WAIT_LIMIT = "org.eclipse.virgo.kernel.startup.wait.limit";
+
+    private static final String DEFAULT_WORK_DIRECTORY_NAME = "work";
+
+    private static final String DEFAULT_CONFIG_DIRECTORY_NAME = "config";
+
+    private static final String DEFAULT_KERNEL_DOMAIN = "org.eclipse.virgo.kernel";
+
+    private static final int DEFAULT_STARTUP_WAIT_LIMIT = 180; // 3 minutes
+
+    private final File homeDirectory;
+
+    private final File[] configDirectories;
+
+    private final File workDirectory;
+
+    private final String domain;
+
+    private final int startupWaitLimit;
+
+    public KernelConfiguration(BundleContext context) {
+        this.homeDirectory = readHomeDirectory(context);
+        this.configDirectories = readConfigDirectories(context);
+        this.workDirectory = new File(this.homeDirectory, DEFAULT_WORK_DIRECTORY_NAME);
+        this.domain = readDomain(context);
+        this.startupWaitLimit = readBundleStartupWaitLimit(context);
+    }
+
+    public File getHomeDirectory() {
+        return homeDirectory;
+    }
+
+    public File[] getConfigDirectories() {
+        return configDirectories.clone();
+    }
+
+    public File getWorkDirectory() {
+        return workDirectory;
+    }
+
+    public String getDomain() {
+        return domain;
+    }
+
+    public int getStartupWaitLimit() {
+        return startupWaitLimit;
+    }
+
+    private static File readHomeDirectory(BundleContext context) {
+        String kernelHomeProperty = readFrameworkProperty(PROPERTY_KERNEL_HOME, context);
+        if (!hasText(kernelHomeProperty)) {
+            throw new IllegalStateException(PROPERTY_KERNEL_HOME + " property must be specified, and must not be empty");
+        } else {
+            return new File(kernelHomeProperty);
+        }
+    }
+
+    private static File[] readConfigDirectories(BundleContext context) {
+        String kernelConfigProperty = readFrameworkProperty(PROPERTY_KERNEL_CONFIG, context);
+        List<File> configDirectories = new ArrayList<File>();
+
+        if (hasText(kernelConfigProperty)) {
+            parseKernelConfigProperty(kernelConfigProperty, configDirectories);
+        }
+
+        if (configDirectories.isEmpty()) {
+            configDirectories.add(new File(DEFAULT_CONFIG_DIRECTORY_NAME));
+        }
+
+        return configDirectories.toArray(new File[configDirectories.size()]);
+    }
+
+    private static void parseKernelConfigProperty(String kernelConfigProperty, List<File> configDirectories) {
+        String[] components = kernelConfigProperty.split(",");
+        for (String component : components) {
+            File configDir = new File(component.trim());
+            if (!configDir.isAbsolute()) {
+                configDir = new File(component.trim());
+            }
+            configDirectories.add(configDir);
+        }
+    }
+
+    private static String readDomain(BundleContext context) {
+        String kernelDomainProperty = readFrameworkProperty(PROPERTY_KERNEL_DOMAIN, context);
+        if (!hasText(kernelDomainProperty)) {
+            kernelDomainProperty = DEFAULT_KERNEL_DOMAIN;
+        }
+        return kernelDomainProperty;
+    }
+
+    private int readBundleStartupWaitLimit(BundleContext context) {
+        String waitLimitProperty = readFrameworkProperty(PROPERTY_KERNEL_STARTUP_WAIT_LIMIT, context);
+        if (!hasText(waitLimitProperty)) {
+          return DEFAULT_STARTUP_WAIT_LIMIT;
+        }
+
+        try {
+            return Integer.parseInt(waitLimitProperty);
+        } catch (NumberFormatException e) {
+            LOGGER.warn("Could not parse property {} with value '{}'. Using default limit {} seconds",
+                        new Object[]{PROPERTY_KERNEL_STARTUP_WAIT_LIMIT, waitLimitProperty, DEFAULT_STARTUP_WAIT_LIMIT});
+            return DEFAULT_STARTUP_WAIT_LIMIT;
+        }
+    }
+
+    private static String readFrameworkProperty(String propertyKey, BundleContext context) {
+        return context.getProperty(propertyKey);
+    }
+
+    private static boolean hasText(String string) {
+        return (string != null && !string.trim().isEmpty());
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/config/internal/KernelConfigurationPropertiesSource.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/config/internal/KernelConfigurationPropertiesSource.java
new file mode 100644
index 0000000..bdcb164
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/config/internal/KernelConfigurationPropertiesSource.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.config.internal;
+
+import java.util.Collections;
+import java.util.Map;
+import java.util.Properties;
+
+/**
+ * Implementation of {@link PropertiesSource} that exposes the {@link KernelConfiguration} as {@link Properties}.
+ * <p />
+ * Ideally the properties exposed from instances of this object should not be overridden by properties from another
+ * source.
+ * <p/>
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.
+ * 
+ */
+final class KernelConfigurationPropertiesSource implements PropertiesSource {
+
+    static final String PROPERTY_WORK_DIRECTORY = "work.directory";
+
+    static final String PROPERTY_HOME_DIRECTORY = "home.directory";
+
+    static final String PROPERTY_DOMAIN = "domain";
+
+    static final String KERNEL_CONFIGURATION_PID = "org.eclipse.virgo.kernel";
+
+    static final String PROPERTY_KERNEL_STARTUP_WAIT_LIMIT = "org.eclipse.virgo.kernel.startup.wait.limit";
+
+    private final KernelConfiguration kernelConfiguration;
+
+    public KernelConfigurationPropertiesSource(KernelConfiguration kernelConfiguration) {
+        this.kernelConfiguration = kernelConfiguration;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Map<String, Properties> getConfigurationProperties() {
+        return Collections.singletonMap(KERNEL_CONFIGURATION_PID, createProperties());
+    }
+
+    private Properties createProperties() {
+        Properties properties = new Properties();
+        properties.put(PROPERTY_DOMAIN, this.kernelConfiguration.getDomain());
+        properties.put(PROPERTY_HOME_DIRECTORY, this.kernelConfiguration.getHomeDirectory().getAbsolutePath());
+        properties.put(PROPERTY_WORK_DIRECTORY, this.kernelConfiguration.getWorkDirectory().getAbsolutePath());
+        properties.put(PROPERTY_KERNEL_STARTUP_WAIT_LIMIT, Integer.toString(this.kernelConfiguration.getStartupWaitLimit()));
+        return properties;
+    }
+
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/config/internal/PropertiesSource.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/config/internal/PropertiesSource.java
new file mode 100644
index 0000000..e21f2c2
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/config/internal/PropertiesSource.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.config.internal;
+
+import java.util.Map;
+import java.util.Properties;
+
+import org.osgi.service.cm.ConfigurationAdmin;
+
+/**
+ * Represents a source for configuration properties. These configuration properties will be exported to
+ * {@link ConfigurationAdmin} under the kernel PID.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations must be threadsafe.
+ * 
+ */
+public interface PropertiesSource {
+
+    /**
+     * Gets all the configuration properties from this source.
+     * <p/>
+     * Each entry in the map represents one configuration. The entry key is the PID of the configuration, and the entry
+     * value is the properties to be exposed under that PID.
+     * 
+     * @return all configuration properties from this source.
+     */
+    Map<String, Properties> getConfigurationProperties();
+
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/config/internal/StandardConfigurationExporter.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/config/internal/StandardConfigurationExporter.java
new file mode 100644
index 0000000..2a6730b
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/config/internal/StandardConfigurationExporter.java
@@ -0,0 +1,42 @@
+package org.eclipse.virgo.nano.config.internal;
+
+import java.util.Dictionary;
+
+import org.eclipse.virgo.nano.core.ConfigurationExporter;
+import org.osgi.service.cm.Configuration;
+
+/**
+ * ConfigurationExporter 
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * threadsafe
+ *  
+ */
+public class StandardConfigurationExporter implements ConfigurationExporter {
+	
+	private Configuration userregionConfiguration;
+	
+	private Configuration kernelregionConfiguration;
+	
+	public StandardConfigurationExporter (Configuration userregionConfiguration, Configuration kernelregionConfiguraion) {
+		this.userregionConfiguration = userregionConfiguration;
+		this.kernelregionConfiguration = kernelregionConfiguraion;
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.virgo.nano.config.internal.ConfigurationExporter#getUserregionConfiguration()
+	 */
+	@Override
+	public Dictionary getUserRegionConfigurationProperties() {
+		return userregionConfiguration.getProperties();
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.virgo.nano.config.internal.ConfigurationExporter#getKernelregionConfiguration()
+	 */
+	@Override
+	public Dictionary getKernelRegionConfigurationProperties() {
+		return kernelregionConfiguration.getProperties();
+	}
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/config/internal/StandardKernelConfig.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/config/internal/StandardKernelConfig.java
new file mode 100644
index 0000000..657a0ba
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/config/internal/StandardKernelConfig.java
@@ -0,0 +1,57 @@
+/*******************************************************************************

+ * Copyright (c) 2008, 2010 SAP AG

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ *

+ * Contributors:

+ *   SAP AG - initial contribution

+ *******************************************************************************/

+

+package org.eclipse.virgo.nano.config.internal;

+

+import org.eclipse.virgo.nano.core.KernelConfig;

+import org.osgi.service.component.ComponentContext;

+import org.slf4j.Logger;

+import org.slf4j.LoggerFactory;

+

+/**

+ * 

+ * This class is the standard implementation for the KernelConfig interface. It enables access to the configurations provided by the kernel core.

+ * <p />

+ *

+ * <strong>Concurrent Semantics</strong><br />

+ * Thread safe.

+ */

+

+public class StandardKernelConfig implements KernelConfig {

+	

+    private final Logger LOGGER = LoggerFactory.getLogger(this.getClass());

+    

+    private ComponentContext context;

+

+    protected void activate(ComponentContext context) {

+        this.context = context;

+        LOGGER.debug("Activating StandardKernelConfig component with properties " + context.getProperties());

+    }

+

+    protected void deactivate(ComponentContext context) {

+        LOGGER.debug("Deactivating StandardKernelConfig component");

+        this.context = null;

+    }

+

+    @Override

+    public String getProperty(String name) {

+        Object value = this.context.getProperties().get(name);

+        LOGGER.debug(KernelConfig.class.getSimpleName() + ".getProperty() is called with name [" + name + "] value is [" + value + "]");

+        if (value instanceof String || value == null) {

+            return (String) value;

+        } else if (value instanceof String[] && ((String[]) value).length > 0) {

+            return ((String[]) value)[0];

+        } else {

+            return value.toString();

+        }

+    }

+

+}

diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/config/internal/UserConfigurationPropertiesSource.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/config/internal/UserConfigurationPropertiesSource.java
new file mode 100644
index 0000000..feca2f8
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/config/internal/UserConfigurationPropertiesSource.java
@@ -0,0 +1,135 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.config.internal;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+import java.util.TreeMap;
+
+import org.eclipse.virgo.util.common.StringUtils;
+import org.eclipse.virgo.util.io.FileSystemUtils;
+import org.eclipse.virgo.util.io.IOUtils;
+import org.osgi.framework.Constants;
+import org.osgi.service.cm.ConfigurationAdmin;
+
+/**
+ * Implementation of {@link PropertiesSource} that loads all the configuration supplied by the kernel user.
+ * 
+ * <p/>
+ * 
+ * User configuration is loaded from all properties files found in the directories listed in the
+ * {@link KernelConfiguration#getConfigDirectories() configuration directories}.
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.
+ * 
+ */
+final class UserConfigurationPropertiesSource implements PropertiesSource {
+
+    private static final String PROPERTIES_FILE_SUFFIX = ".properties";
+
+    private static final FilenameFilter PROPERTIES_FILENAME_FILTER = new FilenameFilter() {
+
+        public boolean accept(File dir, String name) {
+            return name.endsWith(PROPERTIES_FILE_SUFFIX);
+        }
+    };
+
+    private final File[] kernelConfigDirectories;
+
+    /**
+     * Creates a new <code>UserConfigurationPropertiesSource</code> that loads config files from the supplied user
+     * config directories.
+     * 
+     * @param kernelConfigDirectories the directories containing the users kernel config files.
+     */
+    public UserConfigurationPropertiesSource(File[] kernelConfigDirectories) {
+        this.kernelConfigDirectories = kernelConfigDirectories;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Map<String, Properties> getConfigurationProperties() {
+        Map<String, Properties> result = new TreeMap<String, Properties>();
+        for (File dir : this.kernelConfigDirectories) {
+            File[] configFiles = getPropertiesFiles(dir);
+            for (File file : configFiles) {
+                Properties properties = readPropertiesFromFile(file);
+
+                String pid = computePid(file, properties, result.keySet());
+
+                // Last pid encountered wins; no merging is performed
+                result.put(pid, properties);
+            }
+        }
+        return result;
+    }
+
+    private static File[] getPropertiesFiles(File directory) {
+        if (directory.isDirectory()) {
+            return FileSystemUtils.listFiles(directory, PROPERTIES_FILENAME_FILTER);
+        }
+        return new File[0];
+    }
+
+    private Properties readPropertiesFromFile(File file) {
+        if (!file.exists()) {
+            return null;
+        }
+        Properties props = new Properties();
+        InputStream is = null;
+        try {
+            is = new BufferedInputStream(new FileInputStream(file));
+            props.load(is);
+        } catch (IOException ioe) {
+            // silently ignored
+            return null;
+        } finally {
+            IOUtils.closeQuietly(is);
+        }
+        return props;
+    }
+
+    private static String createPid(final File file) {
+        return trimExtension(file.getName());
+    }
+
+    private static String trimExtension(final String name) {
+        int lpDot = name.lastIndexOf('.');
+        return lpDot == -1 ? name : name.substring(0, lpDot);
+    }
+
+    private String computePid(File file, Properties properties, Set<String> existingPids) {
+
+        // check for factory pid in properties
+        String pid = properties.getProperty(ConfigurationAdmin.SERVICE_FACTORYPID);
+        if (StringUtils.hasText(pid)) {
+            // need something unique - so multiple factory pids can be deployed
+            return pid + "-" + createPid(file);
+        }
+        // account for service.pid as a property in the file
+        pid = properties.getProperty(Constants.SERVICE_PID);
+        if (StringUtils.hasText(pid)) {
+            return pid;
+        }
+        return createPid(file);
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/config/internal/commandline/CommandLinePropertiesSource.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/config/internal/commandline/CommandLinePropertiesSource.java
new file mode 100644
index 0000000..bc47c63
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/config/internal/commandline/CommandLinePropertiesSource.java
@@ -0,0 +1,141 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.config.internal.commandline;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import org.osgi.framework.BundleContext;
+
+
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.nano.config.internal.PropertiesSource;
+import org.eclipse.virgo.nano.diagnostics.KernelLogEvents;
+
+public final class CommandLinePropertiesSource implements PropertiesSource {
+	
+	private static final String PROPERTY_USERREGION_COMMANDLINE_ARTIFACTS = "commandLineArtifacts";
+
+	private static final String PROPERTY_UNRECOGNIZED_LAUNCHER_ARGUMENTS = "eclipse.commands";
+	
+	private static final String COMMAND_PREFIX = "-";
+	
+	private static final String COMMAND_PLAN = "plan";
+	
+	private static final String PID_KERNEL_REGION = "org.eclipse.virgo.kernel.userregion";
+	
+	private static final String TEMPLATE_VERSIONED_PLAN_REPOSITORY_URI = "repository:plan/%s/%s";
+	
+	private static final String TEMPLATE_UNVERSIONED_PLAN_REPOSITORY_URI = "repository:plan/%s";
+	
+	private final String unrecognizedArguments;
+	
+	private final EventLogger eventLogger;
+	
+	public CommandLinePropertiesSource(BundleContext bundleContext, EventLogger eventLogger) {
+		this.unrecognizedArguments = bundleContext.getProperty(PROPERTY_UNRECOGNIZED_LAUNCHER_ARGUMENTS);
+		this.eventLogger = eventLogger;
+	}
+
+	public Map<String, Properties> getConfigurationProperties() {
+		
+		Map<String, Properties> configuration = new HashMap<String, Properties>();
+		
+		if (this.unrecognizedArguments != null) {
+			String[] components = this.unrecognizedArguments.split("\n");
+			
+			List<String> arguments = null;
+			String command = null;
+			
+			for (int i = 0; i < components.length; i++) {
+				if (components[i].startsWith(COMMAND_PREFIX)) {
+					if (command != null) {
+						processCommand(command, arguments, configuration);
+					}					
+					command = components[i].substring(COMMAND_PREFIX.length());
+					arguments = new ArrayList<String>();					
+				} else if (arguments != null) {
+					arguments.add(components[i]);
+				}
+			}
+			
+			if (command != null) {
+				processCommand(command, arguments, configuration);
+			}
+		}
+		
+		return configuration;
+	}
+
+	private void processCommand(String command, List<String> arguments, Map<String, Properties> configuration) {
+		if (COMMAND_PLAN.equals(command)) {
+			processPlanCommand(arguments, configuration);
+		}
+	}
+	
+	private void processPlanCommand(List<String> arguments, Map<String, Properties> configuration) {
+		String repositoryUri = null;
+		
+		if (arguments.size() == 1) {
+			repositoryUri = String.format(TEMPLATE_UNVERSIONED_PLAN_REPOSITORY_URI, arguments.get(0));
+		} else if (arguments.size() == 2) {
+			repositoryUri = String.format(TEMPLATE_VERSIONED_PLAN_REPOSITORY_URI, arguments.get(0), arguments.get(1));
+		} else {
+			this.eventLogger.log(KernelLogEvents.KERNEL_PLAN_ARGUMENTS_INCORRECT, arguments.size(), formatArgumentList(arguments));			
+		}
+		
+		if (repositoryUri != null) {
+			Properties properties = getProperties(PID_KERNEL_REGION, configuration);
+			appendProperty(PROPERTY_USERREGION_COMMANDLINE_ARTIFACTS, repositoryUri, properties);
+		}		
+	}
+	
+	private String formatArgumentList(List<String> arguments) {
+		if (arguments.size() == 0) {
+			return "";
+		}
+		
+		StringBuilder argumentsBuilder = new StringBuilder();
+		
+		for (int i = 0; i < arguments.size(); i++) {
+			argumentsBuilder.append(arguments.get(i));
+			if ((i + 1) < arguments.size()) {
+				argumentsBuilder.append(", ");
+			}
+		}
+		
+		return argumentsBuilder.toString();
+	}
+	
+	private Properties getProperties(String pid, Map<String, Properties> configuration) {
+		Properties properties = configuration.get(pid);
+		if (properties == null) {
+			properties = new Properties();
+			configuration.put(pid, properties);
+		}
+		return properties;
+	}
+	
+	private void appendProperty(String key, String value, Properties properties) {
+		String property = properties.getProperty(key);
+		if (property != null) {
+			property = property + "," + value;
+		} else {
+			property = value;
+		}
+		properties.put(key, property);
+	}
+
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/config/internal/ovf/OvfEnvironmentPropertiesReader.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/config/internal/ovf/OvfEnvironmentPropertiesReader.java
new file mode 100644
index 0000000..acad72a
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/config/internal/ovf/OvfEnvironmentPropertiesReader.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.config.internal.ovf;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.util.Properties;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+/**
+ * Simple reader class that reads all properties contained in the <code>PropertySection</code> of an OVF environment
+ * document.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+final class OvfEnvironmentPropertiesReader {
+
+    private static final String ATTRIBUTE_VALUE = "value";
+
+    private static final String ATTRIBUTE_KEY = "key";
+
+    private static final String ELEMENT_PROPERTY = "Property";
+
+    private static final String NAMESPACE_ENVIRONMENT = "http://schemas.dmtf.org/ovf/environment/1";
+
+    /**
+     * Reads all the properties from the OVF whose content is accessible using the supplied {@link Reader}.
+     * 
+     * @param documentReader the reader for the OVF document.
+     * @return the properties contained in the OVF document.
+     */
+    public Properties readProperties(Reader documentReader) {
+        Properties result = new Properties();
+        Document doc = readDocument(documentReader);
+        parseProperties(doc, result);
+        return result;
+    }
+
+    private void parseProperties(Document doc, Properties result) {
+        NodeList propertyElements = doc.getElementsByTagNameNS(NAMESPACE_ENVIRONMENT, ELEMENT_PROPERTY);
+        for (int x = 0; x < propertyElements.getLength(); x++) {
+            Element propertyElement = (Element) propertyElements.item(x);
+            String key = propertyElement.getAttributeNS(NAMESPACE_ENVIRONMENT, ATTRIBUTE_KEY);
+            String value = propertyElement.getAttributeNS(NAMESPACE_ENVIRONMENT, ATTRIBUTE_VALUE);
+            result.setProperty(key, value);
+        }
+    }
+
+    private Document readDocument(Reader documentReader) {
+        try {
+            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+            factory.setNamespaceAware(true);
+            DocumentBuilder builder = factory.newDocumentBuilder();
+            return builder.parse(new InputSource(documentReader));
+        } catch (ParserConfigurationException e) {
+            throw new OvfParseException("Error configuring XML parser.", e);
+        } catch (SAXException e) {
+            throw new OvfParseException("Error parsing OVF XML document.", e);
+        } catch (IOException e) {
+            throw new OvfParseException("Error reading OVF XML document.", e);
+        }
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/config/internal/ovf/OvfParseException.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/config/internal/ovf/OvfParseException.java
new file mode 100644
index 0000000..217dcac
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/config/internal/ovf/OvfParseException.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.config.internal.ovf;
+
+/**
+ * Indicates an exception when parsing an OVF document.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.
+ * 
+ */
+final class OvfParseException extends RuntimeException {
+
+    private static final long serialVersionUID = 8134710938140233L;
+
+    public OvfParseException(String message, Throwable cause) {
+        super(message, cause);
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/config/internal/ovf/OvfPropertiesSource.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/config/internal/ovf/OvfPropertiesSource.java
new file mode 100644
index 0000000..8e2a645
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/config/internal/ovf/OvfPropertiesSource.java
@@ -0,0 +1,164 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.config.internal.ovf;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.eclipse.virgo.nano.diagnostics.KernelLogEvents.OVF_CONFIGURATION_FILE_DOES_NOT_EXIST;
+import static org.eclipse.virgo.nano.diagnostics.KernelLogEvents.OVF_READ_ERROR;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.nano.config.internal.PropertiesSource;
+import org.osgi.framework.BundleContext;
+
+/**
+ * Implementation of {@link PropertiesSource} that reads properties from an OVF document.
+ * <p />
+ * The path to the OVF document is specified using the <code>org.eclipse.virgo.nano.config.ovf</code> framework
+ * property.
+ * <p/>
+ * In order for a property in the OVF document to be exported to OVF its key should have the following format: <br/>
+ * 
+ * <pre>
+ * cm:&lt;pid&gt;:&lt;property-name&gt;
+ * </pre>
+ * 
+ * Any property keys not starting with the <code>cm:</code> prefix are not exported to config admin. Further, any
+ * <code>cm:</code> properties not having both and PID and and name portion will cause an exception.
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.
+ * 
+ */
+public final class OvfPropertiesSource implements PropertiesSource {
+
+    static final String FRAMEWORK_PROPERTY_OVF = "org.eclipse.virgo.nano.config.ovf";
+
+    private static final String PROPERTY_PREFIX = "cm:";
+
+    private static final String PROPERTY_DELIMITER = ":";
+
+    private final BundleContext bundleContext;
+
+    private final EventLogger eventLogger;
+
+    public OvfPropertiesSource(BundleContext bundleContext, EventLogger eventLogger) {
+        this.bundleContext = bundleContext;
+        this.eventLogger = eventLogger;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Map<String, Properties> getConfigurationProperties() {
+        Properties sourceProperties = readSourceProperties();
+        if (sourceProperties != null) {
+            return translateProperties(sourceProperties);
+        } else {
+            return null;
+        }
+    }
+
+    private Map<String, Properties> translateProperties(Properties sourceProperties) {
+        Map<String, Properties> result = new HashMap<String, Properties>();
+        Set<String> propertyNames = sourceProperties.stringPropertyNames();
+        for (String propertyName : propertyNames) {
+            ConfigAdminProperty prop = tryReadConfigAdminProperty(propertyName);
+            if(prop != null) {
+                Properties p = result.get(prop.pid);
+                if(p == null) {
+                    p = new Properties();
+                    result.put(prop.pid, p);
+                }
+                p.setProperty(prop.key, sourceProperties.getProperty(propertyName));
+            }
+        }
+        return result;
+    }
+
+    /**
+     * Attempts to convert a property name into a valid configuration admin property based on the format laid out in
+     * {@link OvfPropertiesSource}.
+     * 
+     * @param propertyName the unparsed property name
+     * @return a {@link ConfigAdminProperty} or <code>null</code> if the property is not prefixed with <code>cm:</code>
+     */
+    private ConfigAdminProperty tryReadConfigAdminProperty(String propertyName) {
+        ConfigAdminProperty result = null;
+        if(propertyName.startsWith(PROPERTY_PREFIX)) {
+            String parsed = propertyName.substring(PROPERTY_PREFIX.length());
+            String[] components = parsed.split(PROPERTY_DELIMITER);
+            if(components.length != 2) {
+                throw new IllegalArgumentException("Invalid configuration admin property '" + propertyName + "' found in OVF.");
+            } else {
+                result = new ConfigAdminProperty();
+                result.pid = components[0];
+                result.key = components[1];
+            }
+        }
+        return result;
+    }
+
+    private Properties readSourceProperties() {
+        Properties result = null;
+        File ovfFile = determineOvfFile();
+        if (ovfFile != null) {
+            if (!ovfFile.exists()) {
+                this.eventLogger.log(OVF_CONFIGURATION_FILE_DOES_NOT_EXIST, ovfFile.getAbsolutePath());
+            } else {
+                result = readOvfFile(ovfFile);
+            }
+
+        }
+        return result;
+    }
+
+    private File determineOvfFile() {
+        File result = null;
+
+        String path = this.bundleContext.getProperty(FRAMEWORK_PROPERTY_OVF);
+        if (path != null) {
+            result = new File(path);
+        }
+
+        return result;
+    }
+
+    private Properties readOvfFile(File ovfFile) {
+        Properties result = null;
+        try (Reader reader = new InputStreamReader(new FileInputStream(ovfFile), UTF_8)) {
+            OvfEnvironmentPropertiesReader ovfReader = new OvfEnvironmentPropertiesReader();
+            result = ovfReader.readProperties(reader);
+        } catch (IOException ex) {
+            this.eventLogger.log(OVF_READ_ERROR, ex, ovfFile.getAbsolutePath());
+        }
+        return result;
+    }
+
+    private static class ConfigAdminProperty {
+
+        String pid;
+
+        String key;
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/AbortableSignal.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/AbortableSignal.java
new file mode 100644
index 0000000..8b776c6
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/AbortableSignal.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.core;
+
+/**
+ * {@link AbortableSignal} is an interface for signalling successful or unsuccessful completion.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations of this class must be thread safe.
+ * 
+ */
+public interface AbortableSignal extends Signal {
+
+	/**
+	 * Notifies the abortion of this Signal, there has been no error but the signal will not complete. 
+	 * If signalFailure or signalCompletion has already been called, the behaviour is undefined.
+	 */
+	void signalAborted();
+	
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/BlockingAbortableSignal.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/BlockingAbortableSignal.java
new file mode 100644
index 0000000..b0334b3
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/BlockingAbortableSignal.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.virgo.nano.core;
+
+import java.util.concurrent.TimeUnit;
+
+
+/**
+ * <p>
+ * A <code>Signal</code> implementation that blocks until notified of completion or abortion.
+ * </p>
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Thread-safe.
+ *
+ */
+public final class BlockingAbortableSignal implements AbortableSignal {
+
+	private volatile boolean aborted = false;
+	
+	private final BlockingSignal blockingSignal;
+	
+	public BlockingAbortableSignal() {
+		this.blockingSignal = new BlockingSignal();
+	}
+
+    /** 
+     * {@inheritDoc}
+     */
+	public void signalSuccessfulCompletion() {
+		this.blockingSignal.signalSuccessfulCompletion();
+	}
+
+    /** 
+     * {@inheritDoc}
+     */
+	public void signalFailure(final Throwable cause) {
+		this.blockingSignal.signalFailure(cause);
+	}
+
+    /** 
+     * {@inheritDoc}
+     */
+	public void signalAborted() {
+		this.aborted = true;
+		this.blockingSignal.signalSuccessfulCompletion();
+	}
+	
+	public boolean isAborted(){
+		return this.aborted;
+	}
+	
+    public boolean awaitCompletion(long period, TimeUnit timeUnit) throws FailureSignalledException {
+    	boolean complete = this.blockingSignal.awaitCompletion(period, timeUnit);
+    	if(aborted){
+    		return false;
+    	}
+    	return complete;
+    }
+	
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/BlockingSignal.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/BlockingSignal.java
new file mode 100644
index 0000000..e04d1fc
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/BlockingSignal.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.core;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
+
+
+/**
+ * A <code>Signal</code> implementation that blocks until notified of completion.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Thread-safe.
+ *
+ */
+public final class BlockingSignal implements Signal {
+    
+    private final CountDownLatch latch = new CountDownLatch(1);
+    
+    private final AtomicReference<Throwable> failure = new AtomicReference<Throwable>();
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void signalFailure(Throwable cause) {
+        this.failure.set(cause);
+        this.latch.countDown();
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void signalSuccessfulCompletion() {
+        this.latch.countDown();
+    }
+    
+    public boolean awaitCompletion(long period, TimeUnit timeUnit) throws FailureSignalledException {
+        try {
+            if (!latch.await(period, timeUnit)) {
+                return false;
+            } else {
+                Throwable failure = this.failure.get();
+                if (failure != null) {
+                    throw new FailureSignalledException(failure);
+                } else {
+                    return true;
+                }
+            }
+        } catch (InterruptedException e) {
+            throw new FailureSignalledException(e);
+        }
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/BundleStarter.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/BundleStarter.java
new file mode 100644
index 0000000..945a69b
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/BundleStarter.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.core;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleException;
+
+
+/**
+ * Provides a mechanism to start {@link Bundle bundles}, and wait until the <code>Bundle</code> is started, including
+ * any asynchronous creation of an application context.
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations <strong>must</strong> be thread safe.
+ * 
+ */
+public interface BundleStarter {
+
+    /**
+     * Starts the supplied {@link Bundle}, driving the supplied signal upon successful or unsuccessful completion
+     * of start processing. If the <code>Bundle</code> constructs an application context, then the
+     * signal will not be driven until application context construction has completed. 
+     * 
+     * @param bundle the <code>Bundle</code> to start.
+     * @param signal the <code>Signal</code> to drive.
+     * @throws BundleException if Bundle {@link Bundle#start()} fails
+     */
+    void start(Bundle bundle, AbortableSignal signal) throws BundleException;
+
+    /**
+     * Starts the supplied {@link Bundle}, driving the supplied signal upon successful or unsuccessful completion
+     * of start processing. If the <code>Bundle</code> constructs an application context, then the
+     * signal will not be driven until application context construction has completed.  The supplied <code>options</code>
+     * are passed to the <code>bundle</code>'s {@link Bundle#start() start} method.
+     * 
+     * @param bundle the <code>Bundle</code> to start.
+     * @param options the options to be passed to the bundle's {@link Bundle#start() start} method.
+     * @param signal the <code>Signal</code> to drive.
+     * @throws BundleException
+     */
+    void start(Bundle bundle, int options, AbortableSignal signal) throws BundleException;
+    
+    /**
+     * Apply tracking to the given <code>Bundle</code> using the given <code>Signal</code> but don't actually start it.
+     * 
+     * @param bundle the <code>Bundle</code> to track.
+     * @param signal the <code>Signal</code> to be notified.
+     */
+    void trackStart(Bundle bundle, AbortableSignal signal);
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/BundleUtils.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/BundleUtils.java
new file mode 100644
index 0000000..b64e063
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/BundleUtils.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.core;
+
+import org.eclipse.virgo.util.common.StringUtils;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.Constants;
+
+/**
+ * <code>BundleUtils</code> provides utility methods for interacting with {@link Bundle Bundles}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread-safe
+ * 
+ */
+public final class BundleUtils {
+
+    /**
+     * Queries whether the supplied {@link Bundle} is a fragment
+     * 
+     * @param bundle the <code>Bundle</code>.
+     * @return <code>true</code> if the <code>Bundle</code> is fragment, otherwise <code>false</code>.
+     */
+    // TODO Move this method into utils project
+    public static boolean isFragmentBundle(Bundle bundle) {
+        String fragmentHostHeader = (String) bundle.getHeaders().get(Constants.FRAGMENT_HOST);
+        return StringUtils.hasText(fragmentHostHeader);
+    }
+
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/ConfigurationExporter.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/ConfigurationExporter.java
new file mode 100644
index 0000000..aeea48e
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/ConfigurationExporter.java
@@ -0,0 +1,24 @@
+package org.eclipse.virgo.nano.core;
+
+import java.util.Dictionary;
+
+/**
+ * This Service exports the user region and kernel region configurations, so that 
+ * they are available to bundles in the user region.
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Implementations should be threadsafe.
+ */
+public interface ConfigurationExporter {
+
+	/**
+	 * Retrieve user region configuration properties
+	 */
+	Dictionary<String, Object> getUserRegionConfigurationProperties();
+
+	/**
+	 * Retrieve kernel region configuration properties
+	 */
+	Dictionary<String, Object> getKernelRegionConfigurationProperties();
+
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/FailureSignalledException.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/FailureSignalledException.java
new file mode 100644
index 0000000..b83cd3c
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/FailureSignalledException.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.core;
+
+
+/**
+ * A <code>FailureSignalledException</code> is used to indicate that a {@link BlockingSignal}
+ * has received a failure signal.
+ *
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Thread-safe
+ *
+ */
+public final class FailureSignalledException extends Exception {
+
+    private static final long serialVersionUID = -8980489442577132319L;
+
+    /**
+     * Creates a new <code>FailureSignalledException</code> with the supplied failure
+     * <code>cause</code>.
+     * 
+     * @param cause the cause of the failure
+     */
+    public FailureSignalledException(Throwable cause) {
+        super(cause);
+    }      
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/FatalKernelException.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/FatalKernelException.java
new file mode 100644
index 0000000..d15c832
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/FatalKernelException.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.core;
+
+import org.eclipse.virgo.nano.serviceability.FatalServerException;
+
+//TODO: merge this with FatalServerException
+/**
+ * Signals an internal error in the kernel.<p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br/>
+ * 
+ * Threadsafe.
+ * 
+ */
+public class FatalKernelException extends FatalServerException {
+
+    private static final long serialVersionUID = 5023385710047479850L;
+
+    /**
+     * Creates a new <code>FatalKernelException</code>.
+     * 
+     * @param message the error message.
+     */
+    public FatalKernelException(String message) {
+        super(message);
+    }
+
+    /**
+     * Creates a new <code>FatalKernelException</code>.
+     * 
+     * @param message the error message.
+     * @param cause the root cause.
+     */
+    public FatalKernelException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/KernelConfig.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/KernelConfig.java
new file mode 100644
index 0000000..e18dad5
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/KernelConfig.java
@@ -0,0 +1,31 @@
+/*******************************************************************************

+ * Copyright (c) 2008, 2010 SAP AG

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ *

+ * Contributors:

+ *   SAP AG - initial contribution

+ *******************************************************************************/

+

+package org.eclipse.virgo.nano.core;

+

+/**

+ * 

+ * Interface defining a way to access kernel's configuration.

+ * <p />

+ *

+ * <strong>Concurrent Semantics</strong><br />

+ * The implementations of this interface must be thread safe.

+ */

+public interface KernelConfig {

+    

+    /**

+     * Obtains the specified property from the ConfigAdmin's configuration provided by the core bundle.

+     * @param name - the name of the wanted property

+     * @return the property's value

+     */

+	public String getProperty(String name);

+

+}

diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/KernelException.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/KernelException.java
new file mode 100644
index 0000000..ffcd153
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/KernelException.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.core;
+
+/**
+ * Signals an error detected by the kernel.
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br/>
+ * 
+ * Threadsafe.
+ * 
+ */
+public class KernelException extends Exception {
+
+    private static final long serialVersionUID = -8441774467715137666L;
+
+    /**
+     * Creates a new {@link KernelException}.
+     * 
+     * @param message the error message.
+     */
+    public KernelException(String message) {
+        super(message);
+    }
+
+    /**
+     * Creates a new {@link KernelException}.
+     * 
+     * @param message the error message.
+     * @param cause the root cause.
+     */
+    public KernelException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/Shutdown.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/Shutdown.java
new file mode 100644
index 0000000..a6eb8d1
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/Shutdown.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.core;
+
+import javax.management.MXBean;
+
+/**
+ * Shutdown control mechanism. Calling {@link #shutdown()} will shut the kernel down gracefully whereas
+ * {@link #immediateShutdown()} will kill the kernel immediately without performing any cleanup actions.
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Implementations are <strong>required</strong> to be thread-safe.
+ * 
+ */
+@MXBean
+public interface Shutdown {
+
+    /**
+     * Shuts down the Server immediately.
+     */
+    void immediateShutdown();
+
+    /**
+     * Shuts down the server in a graceful manner thereby minimising processing required during a subsequent restart.
+     */
+    void shutdown();
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/Signal.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/Signal.java
new file mode 100644
index 0000000..faa3174
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/Signal.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.core;
+
+/**
+ * {@link Signal} is an interface for signalling successful or unsuccessful completion.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations of this class must be thread safe.
+ * 
+ */
+public interface Signal {
+
+    /**
+     * Notifies successful completion. If signalFailure has already been called, the behaviour is undefined.
+     */
+    void signalSuccessfulCompletion();
+
+    /**
+     * Notifies unsuccessful completion with the given {@link Throwable}. If signalCompletion has already been called,
+     * the behaviour is undefined.
+     * 
+     * @param cause a <code>Throwable</code> describing the cause of unsuccessful completion
+     */
+    void signalFailure(Throwable cause);
+
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/internal/AsyncShutdownDecorator.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/internal/AsyncShutdownDecorator.java
new file mode 100644
index 0000000..f3b90c1
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/internal/AsyncShutdownDecorator.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.core.internal;
+
+import org.eclipse.virgo.nano.core.Shutdown;
+
+/**
+ * Decorator for a {@link Shutdown} implementation that performs all operations asynchronously.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.
+ * 
+ */
+final class AsyncShutdownDecorator implements Shutdown {
+
+    private static final String THREAD_NAME = "kernel-shutdown";
+    private final Shutdown delegate;
+
+    public AsyncShutdownDecorator(Shutdown delegate) {
+        this.delegate = delegate;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void immediateShutdown() {
+        new Thread(new Runnable() {
+
+            public void run() {
+                AsyncShutdownDecorator.this.delegate.immediateShutdown();
+            }
+
+        }, THREAD_NAME).start();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void shutdown() {
+        new Thread(new Runnable() {
+
+            public void run() {
+                AsyncShutdownDecorator.this.delegate.shutdown();
+            }
+
+        }, THREAD_NAME).start();
+
+    }
+
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/internal/BundleStartTracker.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/internal/BundleStartTracker.java
new file mode 100644
index 0000000..bf9324f
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/internal/BundleStartTracker.java
@@ -0,0 +1,280 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.core.internal;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ExecutorService;
+
+import org.eclipse.virgo.nano.core.AbortableSignal;
+import org.eclipse.virgo.nano.core.BundleUtils;
+import org.eclipse.virgo.nano.core.Signal;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleEvent;
+import org.osgi.framework.BundleListener;
+import org.osgi.framework.SynchronousBundleListener;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventHandler;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * <code>BundleStartTracker</code> tracks the startup of bundles, including any asynchronous portion of the startup,
+ * notifying a {@link Signal} upon completion (successful or otherwise).
+ * 
+ * <p/>
+ * 
+ * <strong>Note</strong> if the synchronous portion of startup fails, i.e. {@link Bundle#start()} does not return
+ * successfully the <code>Signal</code> is <strong>not</strong> driven and it is the responsibility of the caller of
+ * <code>start</code> to handle the failure.
+ * 
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ * 
+ */
+final class BundleStartTracker implements EventHandler {
+
+    private static final String TOPIC_BLUEPRINT_EVENTS = "org/osgi/service/blueprint/container/";
+
+    private static final String EVENT_REGION_STARTING = "org/eclipse/virgo/kernel/region/STARTING";
+
+    private static final String EVENT_CREATED = TOPIC_BLUEPRINT_EVENTS + "CREATED";
+
+    private static final String EVENT_FAILURE = TOPIC_BLUEPRINT_EVENTS + "FAILURE";
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(BundleStartTracker.class);
+
+    private final Object monitor = new Object();
+
+    private final List<Bundle> bundlesWithCreatedApplicationContexts = new ArrayList<Bundle>();
+
+    private final Map<Bundle, Throwable> failureMap = new HashMap<Bundle, Throwable>();
+
+    private final Map<Bundle, List<AbortableSignal>> signalMap = new HashMap<Bundle, List<AbortableSignal>>();
+
+    private final BundleListener bundleListener = new StartupTrackerBundleListener();
+    
+    private final ExecutorService signalExecutor;
+    
+    BundleStartTracker(ExecutorService signalExecutor) {
+        this.signalExecutor = signalExecutor;
+    }
+
+    void initialize(BundleContext bundleContext) {
+        bundleContext.addBundleListener(this.bundleListener);
+    }
+
+    private void recordApplicationContextCreation(Bundle bundle) {
+        LOGGER.info("Recording created application context for bundle '{}'", bundle);
+
+        synchronized (this.monitor) {
+            this.bundlesWithCreatedApplicationContexts.add(bundle);
+        }
+    }
+
+    private void driveSignalsIfStartCompleted(Bundle bundle, boolean springDmPowered) {
+
+        List<AbortableSignal> signals = null;
+        Throwable failure = null;
+        boolean isActive = isBundleActive(bundle);
+        
+        synchronized (this.monitor) {
+            if (springDmPowered) {
+                boolean created = this.bundlesWithCreatedApplicationContexts.contains(bundle);
+                failure = this.failureMap.get(bundle);
+                
+                if (created && failure != null) {
+                    throw new IllegalStateException("Spring DM has notified an application context both successfully constructed and failed: " + failure);
+                }
+                
+                if (created) {
+                    LOGGER.info("Bundle '{}' has started and its application context is available", bundle);
+                    signals = this.signalMap.remove(bundle);
+                } else if (failure != null) {
+                    LOGGER.info("Bundle '{}' failed to start, the failure was '{}'", bundle, failure);
+                    signals = this.signalMap.remove(bundle);
+                }
+            }
+            else {
+                if (isActive) {
+                    signals = this.signalMap.remove(bundle);
+                }
+            }
+        }
+        // signals to drive
+        if (signals != null) {
+            if (!springDmPowered && isActive) {
+                LOGGER.info("Non-Spring DM powered bundle '{}' has started. Driving signals '{}'.", bundle, signals);
+                driveSignals(signals, false, null);
+            }
+            else {
+                driveSignals(signals, false, failure);
+            }
+        }
+    }
+
+    private void driveSignals(final List<AbortableSignal> signals, final boolean aborted, final Throwable cause) {
+        this.signalExecutor.execute(new Runnable() {
+            public void run() {
+                for (AbortableSignal signal : signals) {
+                    LOGGER.info("Driving signal '{}'", signal);
+                    if (aborted){
+                    	signal.signalAborted();
+                    } else if (cause == null) {
+                        signal.signalSuccessfulCompletion();
+                    } else {
+                        signal.signalFailure(cause);
+                    }
+                }
+            }
+        });        
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void handleEvent(Event event) {
+
+        LOGGER.info("Handling event '{}'", event);
+
+        Throwable cause = null;
+        List<AbortableSignal> signals = null;
+
+        Bundle bundle = (Bundle) event.getProperty("bundle");
+        if (EVENT_FAILURE.equals(event.getTopic())) {
+            cause = (Throwable) event.getProperty("exception");
+            if (cause != null) {
+                synchronized (this.monitor) {
+                    LOGGER.error("Recording application context construction failure '{}' for bundle '{}'", cause, bundle);
+                    this.failureMap.put(bundle, cause);
+                    signals = this.signalMap.remove(bundle);
+                }
+            }
+        } else if (EVENT_CREATED.equals(event.getTopic())) {
+            synchronized (this.monitor) {
+                recordApplicationContextCreation(bundle);
+                signals = this.signalMap.remove(bundle);
+            }
+        } else if (EVENT_REGION_STARTING.equals(event.getTopic())) {
+            initialize((BundleContext) event.getProperty("region.bundleContext"));
+        }
+
+        if (signals != null) {
+            driveSignals(signals, false, cause);
+        }
+    }
+
+    public void trackStart(Bundle bundle, AbortableSignal signal) {
+        if (BundleUtils.isFragmentBundle(bundle)) {
+            throw new IllegalArgumentException("Cannot track the start of a fragment bundle.");
+        }
+
+        boolean springDmPowered = isSpringDmPoweredBundle(bundle);
+
+        boolean bundleActive = isBundleActive(bundle);
+        
+        if (signal != null) {
+            if (springDmPowered || !bundleActive) {
+                List<AbortableSignal> queue;
+                synchronized (this.monitor) {
+                    queue = this.signalMap.get(bundle);
+                    if (queue == null) {
+                        queue = new ArrayList<AbortableSignal>();
+                        this.signalMap.put(bundle, queue);
+                    }
+                    LOGGER.info("Adding signal '{}' for bundle '{}'", signal, bundle);
+                    queue.add(signal);
+                }
+            } else {
+                // !springDmPowered && bundleActive
+                driveSignals(Arrays.asList(signal), false, null);
+            }
+        }
+        driveSignalsIfStartCompleted(bundle, springDmPowered);
+    }
+
+    private static boolean isBundleActive(Bundle bundle) {
+        if (bundle!=null) {
+            return ( bundle.getState() == Bundle.ACTIVE );
+        }
+        return false;
+    }
+
+    private static boolean isSpringDmPoweredBundle(Bundle bundle) {
+        return SpringUtils.isSpringDMPoweredBundle(bundle);
+    }
+
+    private final class StartupTrackerBundleListener implements SynchronousBundleListener {
+
+        private Boolean isLazyBundle = false;
+
+        /**
+         * {@inheritDoc}
+         */
+        public void bundleChanged(BundleEvent event) {
+            Bundle bundle = event.getBundle();
+            if (event.getType() == BundleEvent.STARTED) {
+                List<AbortableSignal> signals = null;
+                if (!isSpringDmPoweredBundle(bundle)) {
+                    synchronized (BundleStartTracker.this.monitor) {
+                        signals = BundleStartTracker.this.signalMap.remove(bundle);
+                    }
+                    if (signals != null) {
+                        LOGGER.info("Non-Spring DM powered bundle '{}' has started. Driving signals '{}'.", bundle, signals);
+                        driveSignals(signals, false, null);
+                    }
+                }
+            }
+            if (event.getType() == BundleEvent.LAZY_ACTIVATION) {
+                this.isLazyBundle = true;
+                LOGGER.info("Bundle '{}' has lazy activation and is in the starting state.", bundle);
+            }
+            if (event.getType() == BundleEvent.STOPPED) {
+                LOGGER.info("Bundle '{}' has stopped. Removing its related tracking state.", bundle);
+                BundleStartTracker.this.cleanup(bundle, this.isLazyBundle, this.isLazyBundle ? null : new RuntimeException("Bundle '" + bundle + "' stopped"));
+            }
+        }
+    }
+
+    /**
+     * Remove tracking state associated with this bundle
+     * @param bundle whose tracking state is removed
+     * @param cause reason for cleaning up
+     */
+    public void cleanup(Bundle bundle, boolean aborted, Throwable cause) {
+        List<AbortableSignal> danglingSignals = null;
+        synchronized (BundleStartTracker.this.monitor) {
+            if (bundle != null) {
+                BundleStartTracker.this.bundlesWithCreatedApplicationContexts.remove(bundle);
+                BundleStartTracker.this.failureMap.remove(bundle);
+                danglingSignals = BundleStartTracker.this.signalMap.remove(bundle);
+            }
+        }
+        if (danglingSignals != null) {
+            driveSignals(danglingSignals, aborted, cause);
+        }
+    }
+
+    /**
+     * 
+     */
+    public void stop() {
+    	this.signalExecutor.shutdownNow();
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/internal/CoreBundleActivator.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/internal/CoreBundleActivator.java
new file mode 100644
index 0000000..f5021a9
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/internal/CoreBundleActivator.java
@@ -0,0 +1,261 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.core.internal;
+
+import java.lang.management.ManagementFactory;
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.SynchronousQueue;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicLong;
+
+import javax.management.InstanceNotFoundException;
+import javax.management.JMException;
+import javax.management.MBeanRegistrationException;
+import javax.management.MBeanServer;
+import javax.management.ObjectInstance;
+import javax.management.ObjectName;
+
+import org.eclipse.virgo.nano.config.internal.KernelConfiguration;
+import org.eclipse.virgo.nano.config.internal.ConfigurationInitialiser;
+import org.eclipse.virgo.nano.core.BundleStarter;
+import org.eclipse.virgo.nano.core.Shutdown;
+import org.eclipse.virgo.nano.core.internal.blueprint.ApplicationContextDependencyMonitor;
+import org.eclipse.virgo.nano.serviceability.dump.internal.RegionDigraphDumpContributor;
+import org.eclipse.virgo.nano.serviceability.dump.internal.ResolutionDumpContributor;
+import org.eclipse.virgo.nano.shim.scope.ScopeFactory;
+import org.eclipse.virgo.nano.shim.scope.internal.StandardScopeFactory;
+import org.eclipse.virgo.nano.shim.serviceability.TracingService;
+import org.eclipse.virgo.nano.shim.serviceability.internal.Slf4jTracingService;
+import org.eclipse.virgo.medic.dump.DumpContributor;
+import org.eclipse.virgo.medic.dump.DumpGenerator;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.util.osgi.ServiceRegistrationTracker;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.launch.Framework;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.event.EventConstants;
+import org.osgi.service.event.EventHandler;
+
+/**
+ * ComponentContext activator that initialises the core of the Kernel.
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Threadsafe.
+ * 
+ */
+public class CoreBundleActivator {
+
+    private static final String START_SIGNALLING_THREAD_NAME_PREFIX = "start-signalling-";
+
+    private static final String PROPERTY_NAME_SERVICE_SCOPE = "org.eclipse.virgo.service.scope";
+    
+    private static final String SERVICE_SCOPE_GLOBAL = "global";
+
+    private static final String EVENT_TOPIC_BLUEPRINT_CONTAINER = "org/osgi/service/blueprint/container/*";
+
+    private static final String EVENT_TOPIC_REGION = "org/eclipse/virgo/kernel/region/*";
+    
+    private static final String MBEAN_VALUE_SHUTDOWN = "Shutdown";
+
+    private static final String MBEAN_KEY_TYPE = "type";
+    
+    private final ServiceRegistrationTracker tracker = new ServiceRegistrationTracker();
+
+    private final ConfigurationInitialiser configurationInitialiser = new ConfigurationInitialiser();
+
+    private volatile StartupTracker startupTracker;
+
+    private volatile ObjectInstance shutdownMBean;
+    
+    private volatile ApplicationContextDependencyMonitor dependencyMonitor;
+    
+    private volatile BundleStartTracker bundleStartTracker;
+
+    public void activate(ComponentContext componentContext) throws Exception {
+        BundleContext context = componentContext.getBundleContext();
+        
+        EventLogger eventLogger = getRequiredService(context, EventLogger.class);
+
+        KernelConfiguration configuration = this.configurationInitialiser.start(context, eventLogger);
+        Shutdown shutdown = initializeShutdownManager(context, eventLogger, configuration);
+        
+        this.bundleStartTracker = createAndRegisterBundleStartTracker(context);    	
+        createAndRegisterBundleStarter(this.bundleStartTracker, context);
+        
+        this.dependencyMonitor = createAndRegisterApplicationContextDependencyMonitor(context, eventLogger);
+        
+        DumpGenerator dumpGenerator = getRequiredService(context, DumpGenerator.class);
+        
+        createAndRegisterStateDumpContributors(context);
+        
+        this.startupTracker = new StartupTracker(context, configuration, configuration.getStartupWaitLimit(), bundleStartTracker, shutdown, dumpGenerator);
+        this.startupTracker.start();
+        
+        initShimServices(context, eventLogger);
+    }
+    
+    private void createAndRegisterStateDumpContributors(BundleContext context) {
+        this.tracker.track(context.registerService(DumpContributor.class, new ResolutionDumpContributor(context), null));
+        this.tracker.track(context.registerService(DumpContributor.class, new RegionDigraphDumpContributor(context), null));
+    }
+
+    private ApplicationContextDependencyMonitor createAndRegisterApplicationContextDependencyMonitor(BundleContext context, EventLogger eventLogger) {
+        ScheduledExecutorService scheduledExecutor = Executors.newScheduledThreadPool(1, new ThreadFactory() {            
+            private AtomicLong threadCount = new AtomicLong(1);
+
+            public Thread newThread(Runnable r) {
+                String name = "service-monitor-thread-" + this.threadCount.getAndIncrement();
+                return new Thread(r, name);                
+            }            
+        });
+        
+        ApplicationContextDependencyMonitor dependencyMonitor = new ApplicationContextDependencyMonitor(scheduledExecutor, eventLogger);
+        
+        Dictionary<String, String> properties = new Hashtable<String, String>();
+        properties.put(EventConstants.EVENT_TOPIC, EVENT_TOPIC_BLUEPRINT_CONTAINER);
+        
+        this.tracker.track(context.registerService(EventHandler.class.getName(), dependencyMonitor, properties));
+        
+       return dependencyMonitor;
+    }
+
+    @SuppressWarnings("unchecked")
+    private BundleStartTracker createAndRegisterBundleStartTracker(BundleContext context) {
+    	BlockingQueue q = new SynchronousQueue();
+    	ThreadPoolExecutor executor = new ThreadPoolExecutor(1, Integer.MAX_VALUE, 60, TimeUnit.SECONDS, q, new PrefixingThreadFactory(START_SIGNALLING_THREAD_NAME_PREFIX), new ThreadPoolExecutor.AbortPolicy());
+    	BundleStartTracker asynchronousStartTracker = new BundleStartTracker(executor);
+    	asynchronousStartTracker.initialize(context);
+    	
+    	Dictionary<String, Object> properties = new Hashtable<String, Object>();
+        properties.put(EventConstants.EVENT_TOPIC, new String[] {EVENT_TOPIC_BLUEPRINT_CONTAINER, EVENT_TOPIC_REGION});        
+        
+        this.tracker.track(context.registerService(new String[] {EventHandler.class.getName()}, asynchronousStartTracker, properties));
+        
+        return asynchronousStartTracker;
+    }
+
+    private BundleStarter createAndRegisterBundleStarter(BundleStartTracker asynchronousStartTracker, BundleContext bundleContext) {
+    	
+        StandardBundleStarter bundleStarter = new StandardBundleStarter(asynchronousStartTracker);
+        Dictionary<String, Object> properties = new Hashtable<String, Object>();
+        properties.put(PROPERTY_NAME_SERVICE_SCOPE, SERVICE_SCOPE_GLOBAL);
+        
+        this.tracker.track(bundleContext.registerService(new String[] {BundleStarter.class.getName()}, bundleStarter, properties));
+        
+        return bundleStarter;
+    }
+
+    public void deactivate(ComponentContext context) throws Exception {
+        this.tracker.unregisterAll();
+        this.startupTracker.stop();
+        this.configurationInitialiser.stop();
+        
+        unregisterShutdownMBean();
+        
+        ApplicationContextDependencyMonitor dependencyMonitor = this.dependencyMonitor;
+        if (dependencyMonitor != null) {
+            this.dependencyMonitor = null;
+            dependencyMonitor.stop();
+        }
+        
+        BundleStartTracker bundleStartTracker = this.bundleStartTracker;
+        if (bundleStartTracker != null) {
+            this.bundleStartTracker = null;
+            bundleStartTracker.stop();
+        }
+    }
+
+    private Shutdown initializeShutdownManager(BundleContext context, EventLogger eventLogger, KernelConfiguration configuration) {
+        Shutdown shutdown = createShutdown(context, eventLogger);
+        this.tracker.track(context.registerService(org.eclipse.virgo.nano.core.Shutdown.class.getName(), shutdown, null));
+
+        registerShutdownMBean(configuration, shutdown);
+        return shutdown;
+    }
+
+    private void registerShutdownMBean(KernelConfiguration configuration, Shutdown shutdown) {
+        MBeanServer server = ManagementFactory.getPlatformMBeanServer();
+
+        try {
+            ObjectName shutdownName = ObjectName.getInstance(configuration.getDomain(), MBEAN_KEY_TYPE, MBEAN_VALUE_SHUTDOWN);
+            this.shutdownMBean = server.registerMBean(new AsyncShutdownDecorator(shutdown), shutdownName);
+        } catch (JMException ex) {
+            throw new IllegalStateException("Unable to register Shutdown MBean", ex);
+        }
+    }
+
+    private void unregisterShutdownMBean() throws MBeanRegistrationException, InstanceNotFoundException {
+        ObjectInstance localShutdownMBean = this.shutdownMBean;
+        if (localShutdownMBean != null) {
+            ManagementFactory.getPlatformMBeanServer().unregisterMBean(localShutdownMBean.getObjectName());
+            this.shutdownMBean = null;
+        }
+    }
+
+    protected Shutdown createShutdown(BundleContext context, EventLogger eventLogger) {
+        Framework framework = (Framework) context.getBundle(0);
+        Runtime runtime = Runtime.getRuntime();
+        ShutdownManager manager = new ShutdownManager(eventLogger, framework, runtime);
+        return manager;
+    }
+
+    private void initShimServices(BundleContext context, EventLogger eventLogger) {
+        ScopeFactory scopeFactory = new StandardScopeFactory(eventLogger);
+        TracingService tracingService = new Slf4jTracingService();
+        this.tracker.track(context.registerService(ScopeFactory.class.getName(), scopeFactory, null));
+        this.tracker.track(context.registerService(TracingService.class.getName(), tracingService, null));
+    }
+
+    private <T> T getRequiredService(BundleContext context, Class<T> clazz) {
+        T result = null;
+        ServiceReference<T> ref = context.getServiceReference(clazz);
+        if (ref != null) {
+            result = context.getService(ref);
+        }
+        if (result == null) {
+            throw new IllegalStateException("Unable to access required service of type '" + clazz.getName() + "' from bundle '"
+                + context.getBundle().getSymbolicName() + "'");
+        }
+        return result;
+    }
+    
+    private class PrefixingThreadFactory implements ThreadFactory {
+		private int threadCount = 0;
+		private final Object threadCountMonitor = new Object();
+		String prefix = "default-thread-prefix";
+		
+		public PrefixingThreadFactory(String prefix) {
+			this.prefix = prefix;
+		}
+		
+		@Override
+		public Thread newThread(Runnable r) {
+			return new Thread(r, nextThreadName());
+		}
+		
+		private String nextThreadName() {
+			int threadNumber = 0;
+			synchronized (this.threadCountMonitor) {
+				this.threadCount++;
+				threadNumber = this.threadCount;
+			}
+			return this.prefix + threadNumber;
+		}
+	}
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/internal/KernelStatus.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/internal/KernelStatus.java
new file mode 100644
index 0000000..6ab1d37
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/internal/KernelStatus.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.core.internal;
+
+final class KernelStatus implements KernelStatusMBean {
+
+    static final String STATUS_STARTING = "STARTING";
+
+    static final String STATUS_STARTED = "STARTED";
+
+    private volatile String status = STATUS_STARTING;
+
+    public String getStatus() {
+        return this.status;
+    }
+
+    public void setStarted() {
+        this.status = STATUS_STARTED;
+    }
+
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/internal/KernelStatusMBean.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/internal/KernelStatusMBean.java
new file mode 100644
index 0000000..9c9275e
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/internal/KernelStatusMBean.java
@@ -0,0 +1,21 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.core.internal;
+
+/**
+ * MBean for kernel status.
+ * 
+ */
+public interface KernelStatusMBean {
+
+    String getStatus();
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/internal/ServerReadinessTracker.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/internal/ServerReadinessTracker.java
new file mode 100644
index 0000000..ece39a0
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/internal/ServerReadinessTracker.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * Copyright (c) 2012 SAP AG
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   SAP AG - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.core.internal;
+
+import org.eclipse.virgo.nano.diagnostics.KernelLogEvents;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventHandler;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.osgi.framework.BundleContext;
+
+public class ServerReadinessTracker implements EventHandler {
+    
+    private static final String TOPIC_RECOVERY_COMPLETED = "org/eclipse/virgo/kernel/deployer/recovery/COMPLETED";
+    private EventLogger eventLogger;
+    private BundleContext bundleContext;
+    
+    /** 
+     * {@inheritDoc}
+     */
+    public void handleEvent(Event event) {
+        if (TOPIC_RECOVERY_COMPLETED.equals(event.getTopic())) {
+            Thread readinessPrinter = new Thread(new ServerReadinessPrinter(this.bundleContext, this.eventLogger));
+            readinessPrinter.setName("startup-readiness");
+            readinessPrinter.start();
+        }
+    }
+    
+    private class ServerReadinessPrinter implements Runnable {
+
+        private BundleContext bundleContext;
+        private EventLogger eventLogger;
+        
+        ServerReadinessPrinter(BundleContext bundleContext, EventLogger logger) {
+            this.bundleContext = bundleContext;
+            this.eventLogger = logger;
+        }
+
+        @Override
+        public void run() {
+            String frameworkStartTimeString = this.bundleContext.getProperty("eclipse.startTime");
+            if (frameworkStartTimeString != null) {
+                Long frameworkStartTime = Long.valueOf(frameworkStartTimeString);
+                long sinceStart = System.currentTimeMillis() - frameworkStartTime;
+                this.eventLogger.log(KernelLogEvents.VIRGO_STARTED, String.valueOf(sinceStart/1000) + "." + String.valueOf(sinceStart%1000));
+            } else {
+                this.eventLogger.log(KernelLogEvents.VIRGO_STARTED_NOTIME);
+            }
+        }
+    }
+    
+    public void activate(BundleContext context) {
+        this.bundleContext = context;
+    }
+    
+    public void deactivate(BundleContext context) {
+        this.bundleContext = null;
+    }
+    
+    public void bindEventLogger(EventLogger logger) {
+        this.eventLogger = logger;
+    }
+    
+    public void unbindEventLogger(EventLogger logger) {
+        this.eventLogger = null;
+    }
+    
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/internal/ServiceReferenceTracker.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/internal/ServiceReferenceTracker.java
new file mode 100644
index 0000000..2db665d
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/internal/ServiceReferenceTracker.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * This file is part of the Virgo Web Server.
+ *
+ * Copyright (c) 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    SpringSource, a division of VMware - initial API and implementation and/or initial documentation
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.core.internal;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+
+
+/**
+ * Utility class that tracks a set of {@link ServiceReference}s for a bundle and allows them to be safely
+ * ungotten.
+ * <p/>
+ * <code>ServiceReferences</code> are tracked in a thread-safe manner, and are ungotten without
+ * holding any locks.
+ * 
+ * @see ServiceReference
+ */
+class ServiceReferenceTracker {
+    
+    private final BundleContext context;
+    
+    private final Object monitor = new Object();
+
+    private Set<ServiceReference<?>> references; // protected by monitor.
+
+    
+    ServiceReferenceTracker(BundleContext context) {
+        this.context = context;
+    }
+    
+    /**
+     * Tracks the supplied {@link ServiceReference}. This <code>ServiceReference</code> will be
+     * {@link BundleContext#ungetService ungotten} during {@link #ungetAll()}.
+     * 
+     * @param reference the <code>ServiceReference</code> to track.
+     * @return the reference itself
+     */
+    public ServiceReference<?> track(ServiceReference<?> reference) {
+        synchronized (this.monitor) {
+            if (this.references == null) {
+                this.references = new HashSet<ServiceReference<?>>();
+            }
+            this.references.add(reference);
+        }
+        return reference;
+    }
+
+    /**
+     * Safely unregisters all the tracked <code>ServiceRegistrations</code>.
+     */
+    public void ungetAll() {
+        Set<ServiceReference<?>> toUnget = null;
+        synchronized (this.monitor) {
+            toUnget = this.references;
+            this.references = null;
+        }
+        if (toUnget != null) {
+            for (ServiceReference<?> serviceReference : toUnget) {
+                try {
+                    this.context.ungetService(serviceReference);
+                } catch (IllegalStateException e) {
+                }
+            }
+        }
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/internal/ShutdownManager.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/internal/ShutdownManager.java
new file mode 100644
index 0000000..5a5dad7
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/internal/ShutdownManager.java
@@ -0,0 +1,211 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.core.internal;
+
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.nano.core.Shutdown;
+import org.eclipse.virgo.nano.diagnostics.KernelLogEvents;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleEvent;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.FrameworkEvent;
+import org.osgi.framework.SynchronousBundleListener;
+import org.osgi.framework.launch.Framework;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Standard implementation of {@link Shutdown} that may be called to initiate JVM shutdown. This class also listens for
+ * <i>unsolicited</i> shutdown (that is, shutdown not initiated by this class) of the JVM or the OSGi framework and
+ * reacts accordingly.
+ * <p />
+ * JVM shutdown may be initiated in either of two ways:
+ * <ol>
+ * <li>By this class (when a program calls one of the methods of the {@link Shutdown} interface). If graceful shutdown
+ * is requested, this class shuts down the OSGi framework and then the JVM. If immediate shutdown is requested, this
+ * class shuts down the JVM.</li>
+ * <li>Not by this class. A {@link Runtime#addShutdownHook(Thread) shutdown hook} previously registered by this class
+ * responds to JVM shutdown by shutting down the OSGi framework before allowing JVM shutdown to continue. Note that
+ * {@link System#exit} must not be called under the shutdown hook as this can block indefinitely (see the javadoc of
+ * {@link Runtime#exit}).</li>
+ * </ol>
+ * If this class attempts to shut down the OSGi framework but this takes longer than {@code SHUTDOWN_TIMOUT}, an error
+ * message is written to the event log and the JVM is halted abruptly with a non-zero exit code.
+ * <p />
+ * When OSGi framework shutdown occurs, a synchronous bundle listener previously registered by this class unregisters
+ * the shutdown hook (unless this class initiated the OSGi framework shutdown in response to an unsolicited JVM
+ * shutdown, in which case the shutdown hook is left in place).</li>
+ * <p />
+ * This class expects some recursive invocations and avoids others:
+ * <ul>
+ * <li>A graceful shutdown request on the {@link Shutdown} interface normally results in the synchronous bundle listener
+ * being driven on OSGi framework shutdown.</li>
+ * <li>An immediate shutdown request on the {@link Shutdown} interface unregisters the shutdown hook so that it is not
+ * driven when the JVM is shut down.</li>
+ * <li>An unsolicited JVM termination prevents the shutdown hook from being unregistered.</li>
+ * </ul>
+ * <p />
+ * So, in summary, the JVM may terminate in the following ways:
+ * <ol>
+ * <li>Solicited graceful shutdown, which attempts to stop the OSGi framework and, if successful, exits the JVM.</li>
+ * <li>Unsolicited graceful shutdown, which attempts to stop the OSGi framework and, if successful, allows JVM
+ * termination to continue.</li>
+ * <li>Solicited immediate shutdown, which exits the JVM.</li>
+ * <li>Solicited halt if an attempt by this class to stop the OSGi framework fails or times out.</li>
+ * <li>Unsolicited halt or other abrupt termination (such as "kill -9" or a power failure), which does not involve this
+ * class.</li>
+ * </ol>
+ * <p />
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+class ShutdownManager implements Shutdown {
+
+    private static final int NORMAL_TERMINATION_EXIT_CODE = 0;
+
+    private static final int GRACEFUL_TERMINATION_FAILURE_EXIT_CODE = 1;
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(ShutdownManager.class);
+
+    private static final long SHUTDOWN_TIMEOUT = TimeUnit.SECONDS.toMillis(30);
+
+    private static final int STATE_RUNNING = 0;
+
+    private static final int STATE_STOPPING = 1;
+
+    private final AtomicInteger state = new AtomicInteger(STATE_RUNNING);
+
+    private final EventLogger eventLogger;
+
+    private final Framework framework;
+
+    private final Runtime runtime;
+
+    private final Thread shutdownHook = new Thread(new Runnable() {
+
+        @Override
+        public void run() {
+            try {
+                // set to stopping so we don't remove the shutdown hook later
+                if (ShutdownManager.this.compareAndSetHookStopping()) {
+                    ShutdownManager.this.doShutdown(false);
+                }
+            } catch (Throwable t) {
+                t.printStackTrace();
+            }
+        }
+
+    });
+
+    public ShutdownManager(EventLogger eventLogger, Framework framework, Runtime runtime) {
+        this.eventLogger = eventLogger;
+        this.framework = framework;
+        this.runtime = runtime;
+        runtime.addShutdownHook(this.shutdownHook);
+        BundleContext bundleContext = framework.getBundleContext();
+        bundleContext.addBundleListener(new ShutdownLoggingListener());
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void shutdown() {
+        doShutdown(true);
+    }
+
+    private void doShutdown(boolean solicitedShutdown) {
+        FrameworkEvent shutdownResponse = null;
+        try {
+            this.framework.stop();
+            shutdownResponse = this.framework.waitForStop(SHUTDOWN_TIMEOUT);
+        } catch (BundleException ex) {
+            LOGGER.error("Error during shutdown.", ex);
+        } catch (InterruptedException ex) {
+            LOGGER.error("Interrupted during shutdown.", ex);
+        }
+
+        if (isSuccessfulStopResponse(shutdownResponse)) {
+            // If this class initiated shutdown, shut down the JVM. Otherwise allow JVM termination to continue.
+            if (solicitedShutdown) {
+                initiateJvmTermination();
+            }
+        } else {
+            // Escalate to JVM halt.
+            this.eventLogger.log(KernelLogEvents.SHUTDOWN_HALTED);
+            haltJvm(GRACEFUL_TERMINATION_FAILURE_EXIT_CODE);
+        }
+    }
+
+    private void initiateJvmTermination() {
+        removeShutdownHook();
+        exitJvm();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void immediateShutdown() {
+        this.eventLogger.log(KernelLogEvents.IMMEDIATE_SHUTDOWN_INITIATED);
+        initiateJvmTermination();
+    }
+
+    /**
+     * This method must not be overridden except by testcases.
+     */
+    protected void exitJvm() {
+        System.exit(NORMAL_TERMINATION_EXIT_CODE);
+    }
+
+    /**
+     * This method must not be overridden except by testcases.
+     */
+    protected void haltJvm(int status) {
+        this.runtime.halt(status);
+    }
+
+    private boolean isSuccessfulStopResponse(FrameworkEvent shutdownResponse) {
+        return shutdownResponse != null && shutdownResponse.getType() == FrameworkEvent.STOPPED;
+    }
+
+    /**
+     * This method must only be called by testcases.
+     */
+    final void removeShutdownHook() {
+        if (compareAndSetHookStopping()) {
+            this.runtime.removeShutdownHook(this.shutdownHook);
+        }
+    }
+
+    private boolean compareAndSetHookStopping() {
+        return this.state.compareAndSet(STATE_RUNNING, STATE_STOPPING);
+    }
+
+    private final class ShutdownLoggingListener implements SynchronousBundleListener {
+
+        @Override
+        public void bundleChanged(BundleEvent event) {
+            BundleContext bundleContext = ShutdownManager.this.framework.getBundleContext();
+            if (BundleEvent.STOPPING == event.getType() && event.getBundle() == bundleContext.getBundle()) {
+                ShutdownManager.this.eventLogger.log(KernelLogEvents.SHUTDOWN_INITIATED);
+                removeShutdownHook();
+            }
+        }
+    }
+
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/internal/SpringUtils.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/internal/SpringUtils.java
new file mode 100644
index 0000000..228734a
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/internal/SpringUtils.java
@@ -0,0 +1,133 @@
+
+package org.eclipse.virgo.nano.core.internal;
+
+import java.net.URL;
+import java.util.Dictionary;
+import java.util.Enumeration;
+
+import org.eclipse.virgo.util.common.StringUtils;
+import org.osgi.framework.Bundle;
+
+/**
+ * Utilities class for covering various Spring features like Spring Context discovery.
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread-safe.
+ * 
+ */
+public class SpringUtils {
+
+    private static final String SPRING_DM_CONTEXT_DIR = "/META-INF/spring/";
+    
+    private static final String BLUEPRINT_CONTEXT_DIR = "/OSGI-INF/blueprint/";
+
+    private static final String CONTEXT_FILES = "*.xml";
+
+    private static final String BUNDLE_URL_PREFIX = "osgibundle:";
+
+    private static final String SPRING_CONTEXT_HEADER = "Spring-Context";
+    
+    private static final String BUNDLE_BLUEPRINT_HEADER = "Bundle-Blueprint";
+
+    private static final String DIRECTIVE_SEPARATOR = ";";
+
+    private static final String CONTEXT_LOCATION_SEPARATOR = ",";
+
+    private static final String CONFIG_WILDCARD = "*";
+
+    /** Default configuration locations */
+    private static final String SPRING_DM_DEFAULT_CONFIG = BUNDLE_URL_PREFIX + SPRING_DM_CONTEXT_DIR + CONTEXT_FILES;
+    private static final String BLUEPRINT_DEFAULT_CONFIG = BUNDLE_URL_PREFIX + BLUEPRINT_CONTEXT_DIR + CONTEXT_FILES;
+
+    private static String[] getSpringContextConfigurations(Bundle bundle) {
+        String[] locations = getSpringContextHeaderLocations(bundle.getHeaders());
+
+        // if no location is specified in the header, try the defaults
+        if (isArrayEmpty(locations)) {
+            // check the default locations if the manifest doesn't provide any info
+            Enumeration<URL> defaultConfig = bundle.findEntries(SPRING_DM_CONTEXT_DIR, CONTEXT_FILES, false);
+            if (defaultConfig != null && defaultConfig.hasMoreElements()) {
+                return new String[] { SPRING_DM_DEFAULT_CONFIG };
+            } else {
+                defaultConfig = bundle.findEntries(BLUEPRINT_CONTEXT_DIR, CONTEXT_FILES, false);
+                if (defaultConfig != null && defaultConfig.hasMoreElements()) {
+                    return new String[] { BLUEPRINT_DEFAULT_CONFIG };
+                } else {
+                    return new String[0];
+                }
+            }
+        } else {
+            return locations;
+        }
+    }
+
+    /**
+     * Returns the location headers (if any) specified by the Spring-Context header (if available). The returned Strings
+     * can be sent to a {@link org.springframework.core.io.ResourceLoader} for loading the configurations.
+     * 
+     * @param headers bundle headers
+     * @return array of locations specified (if any)
+     */
+    static String[] getSpringContextHeaderLocations(Dictionary<String, String> headers) {
+        String header = getSpringContextHeader(headers);
+        String[] ctxEntries;
+        if (StringUtils.hasText(header) && !(';' == header.charAt(0))) {
+            // get the config locations
+            String locations = StringUtils.tokenizeToStringArray(header, DIRECTIVE_SEPARATOR)[0];
+            // parse it into individual token
+            ctxEntries = StringUtils.tokenizeToStringArray(locations, CONTEXT_LOCATION_SEPARATOR);
+            // replace * with a 'digestable' location
+            for (int i = 0; i < ctxEntries.length; i++) {
+                if (CONFIG_WILDCARD.equals(ctxEntries[i]))
+                    ctxEntries[i] = SPRING_DM_DEFAULT_CONFIG;
+            }
+        } else {
+            header = getBundleBlueprintHeader(headers);
+            if (StringUtils.hasText(header) && !(';' == header.charAt(0))) {
+                // get the config locations
+                String locations = StringUtils.tokenizeToStringArray(header, DIRECTIVE_SEPARATOR)[0];
+                // parse it into individual token
+                ctxEntries = StringUtils.tokenizeToStringArray(locations, CONTEXT_LOCATION_SEPARATOR);
+                // replace * with a 'digestable' location
+                for (int i = 0; i < ctxEntries.length; i++) {
+                    if (CONFIG_WILDCARD.equals(ctxEntries[i]))
+                        ctxEntries[i] = BLUEPRINT_DEFAULT_CONFIG;
+                }
+            } else {
+                ctxEntries = new String[0];
+            }
+        }
+        return ctxEntries;
+    }
+
+    static boolean isArrayEmpty(Object[] array) {
+        return (array == null || array.length == 0);
+    }
+
+    static String getSpringContextHeader(Dictionary headers) {
+        Object header = null;
+        if (headers != null) {
+            header = headers.get(SPRING_CONTEXT_HEADER);
+        }
+        return (header != null ? header.toString().trim() : null);
+    }
+
+    static String getBundleBlueprintHeader(Dictionary headers) {
+        Object header = null;
+        if (headers != null) {
+            header = headers.get(BUNDLE_BLUEPRINT_HEADER);
+        }
+        return (header != null ? header.toString().trim() : null);
+    }
+    
+    /**
+     * Queries whether the supplied {@link Bundle} is Spring-DM powered.
+     * 
+     * @param bundle the <code>Bundle</code>.
+     * @return <code>true</code> if the <code>Bundle</code> is Spring-DM powered, otherwise <code>false</code>.
+     */
+    public static boolean isSpringDMPoweredBundle(Bundle bundle) {
+        String[] configurations = getSpringContextConfigurations(bundle);
+        return !isArrayEmpty(configurations);
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/internal/StandardBundleStarter.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/internal/StandardBundleStarter.java
new file mode 100644
index 0000000..a99128e
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/internal/StandardBundleStarter.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.core.internal;
+
+import org.eclipse.virgo.nano.core.AbortableSignal;
+import org.eclipse.virgo.nano.core.BundleStarter;
+import org.eclipse.virgo.nano.core.BundleUtils;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleException;
+
+
+/**
+ * Standard implementation of {@link BundleStarter} that starts the bundle and delegates to a {@link BundleStartTracker}
+ * to track any asynchronous portion of the bundle's startup.
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ * 
+ */
+final class StandardBundleStarter implements BundleStarter {
+
+    private final BundleStartTracker bundleStartTracker;
+
+    private static final int DEFAULT_START_OPTIONS = 0;
+
+    public StandardBundleStarter(BundleStartTracker bundleStartTracker) {
+        this.bundleStartTracker = bundleStartTracker;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void start(Bundle bundle, AbortableSignal signal) throws BundleException {
+        start(bundle, DEFAULT_START_OPTIONS, signal);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void start(Bundle bundle, int options, AbortableSignal signal) throws BundleException {
+        
+        trackStart(bundle, signal);
+        
+        if (bundleNeedsStarting(bundle)) {
+            try {
+                bundle.start(options);
+            } catch (BundleException be) {
+                this.bundleStartTracker.cleanup(bundle, false, be);
+                throw be;
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void trackStart(Bundle bundle, AbortableSignal signal) {
+        if (BundleUtils.isFragmentBundle(bundle)) {
+            throw new IllegalArgumentException("A fragment bundle cannot be started and so start cannot be tracked");
+        }
+        
+        if (signal != null) {
+            this.bundleStartTracker.trackStart(bundle, signal);
+        }
+    }
+
+    private static boolean bundleNeedsStarting(Bundle bundle) {
+        if (bundle != null) {
+            int bundleState = bundle.getState();
+            return (bundleState != Bundle.STARTING && bundleState != Bundle.ACTIVE);
+        }
+        return false;
+    }
+    
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/internal/StartupTracker.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/internal/StartupTracker.java
new file mode 100644
index 0000000..2e49280
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/internal/StartupTracker.java
@@ -0,0 +1,283 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.core.internal;
+
+import java.lang.management.ManagementFactory;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+import javax.management.JMException;
+import javax.management.MBeanServer;
+import javax.management.ObjectInstance;
+import javax.management.ObjectName;
+
+import org.eclipse.virgo.nano.config.internal.KernelConfiguration;
+import org.eclipse.virgo.nano.core.BlockingAbortableSignal;
+import org.eclipse.virgo.nano.core.BundleUtils;
+import org.eclipse.virgo.nano.core.FailureSignalledException;
+import org.eclipse.virgo.nano.core.FatalKernelException;
+import org.eclipse.virgo.nano.core.Shutdown;
+import org.eclipse.virgo.nano.diagnostics.KernelLogEvents;
+import org.eclipse.virgo.medic.dump.DumpGenerator;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * <code>StartupTracker</code> tracks the startup of the Kernel and produces event log entries, and
+ * {@link EventAdmin} events as the kernel starts.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ * 
+ */
+final class StartupTracker {
+
+    private static final String THREAD_NAME_STARTUP_TRACKER = "startup-tracker";
+
+	static final String APPLICATION_CONTEXT_FILTER = "(objectClass=org.springframework.context.ApplicationContext)";
+
+    private static final String KERNEL_EVENT_TOPIC = "org/eclipse/virgo/kernel/";
+
+    private static final String KERNEL_EVENT_STARTING = KERNEL_EVENT_TOPIC + "STARTING";
+
+    private static final String KERNEL_EVENT_STARTED = KERNEL_EVENT_TOPIC + "STARTED";
+
+    private static final String KERNEL_EVENT_START_TIMED_OUT = KERNEL_EVENT_TOPIC + "START_TIMED_OUT";
+    
+    private static final String KERNEL_EVENT_START_ABORTED = KERNEL_EVENT_TOPIC + "START_ABORTED";
+    
+    private static final String KERNEL_EVENT_START_FAILED = KERNEL_EVENT_TOPIC + "START_FAILED";
+    
+    private static final String KERNEL_BSN_PREFIX = "org.eclipse.virgo.kernel";
+    
+    private static final String NANO_CORE_BSN_PREFIX = "org.eclipse.virgo.nano.core";
+    
+    private static final String NANO_AUTH_BSN_PREFIX = "org.eclipse.virgo.nano.authentication";
+    
+    private static final Logger LOGGER = LoggerFactory.getLogger(StartupTracker.class);
+
+    private final KernelStatus status = new KernelStatus();
+    
+    private final KernelConfiguration configuration;
+
+    private final Thread startupTrackingThread;
+    
+    private volatile ObjectInstance statusInstance;
+
+    StartupTracker(BundleContext context, KernelConfiguration configuration, int startupWaitTime, BundleStartTracker asyncBundleStartTracker, Shutdown shutdown, DumpGenerator dumpGenerator) {
+    	Runnable startupTrackingRunnable = new StartupTrackingRunnable(context, startupWaitTime, asyncBundleStartTracker, this.status, shutdown, dumpGenerator);
+        this.startupTrackingThread = new Thread(startupTrackingRunnable, THREAD_NAME_STARTUP_TRACKER);
+        this.configuration = configuration;
+    }
+
+    void start() {
+        registerKernelStatusMBean();
+        this.startupTrackingThread.start();
+    }
+    
+    void stop() {
+        unregisterKernelStatusMBean();
+    }
+
+    private void registerKernelStatusMBean() {
+        MBeanServer server = ManagementFactory.getPlatformMBeanServer();
+        try {
+            ObjectName name = ObjectName.getInstance(StartupTracker.this.configuration.getDomain(), "type", "KernelStatus");
+            this.statusInstance = server.registerMBean(this.status, name);
+        } catch (JMException e) {
+            throw new FatalKernelException("Unable to register KernelStatus MBean", e);
+        }
+    }
+
+    private void unregisterKernelStatusMBean() {
+        MBeanServer server = ManagementFactory.getPlatformMBeanServer();
+        try {
+            ObjectInstance instance = this.statusInstance;
+            if (instance != null && server.isRegistered(instance.getObjectName())) {
+                server.unregisterMBean(this.statusInstance.getObjectName());
+            }
+        } catch (JMException e) {
+            throw new FatalKernelException("Unable to unregister KernelStatus MBean", e);
+        }
+    }
+
+    private final static class StartupTrackingRunnable implements Runnable {        
+
+        private final BundleContext context;
+        
+        private final int startupWaitTime;
+        
+        private final BundleStartTracker asyncBundleStartTracker;
+
+        private final KernelStatus kernelStatus;
+        private final Shutdown shutdown;
+        private final DumpGenerator dumpGenerator;
+        
+        private final ServiceReferenceTracker serviceReferenceTracker;
+        
+        private EventLogger eventLogger = null;
+        private EventAdmin eventAdmin = null;
+        
+        private StartupTrackingRunnable(BundleContext context, int startupWaitTime, BundleStartTracker asyncBundleStartTracker, KernelStatus kernelStatus, Shutdown shutdown, DumpGenerator dumpGenerator) {
+            this.context = context;
+            this.startupWaitTime = startupWaitTime;
+            this.asyncBundleStartTracker = asyncBundleStartTracker;
+            this.kernelStatus = kernelStatus;
+            this.shutdown = shutdown;
+            this.dumpGenerator = dumpGenerator;
+            this.serviceReferenceTracker = new ServiceReferenceTracker(context);
+        }
+
+        public void run() {
+            this.eventLogger = getEventLoggerService();
+            this.eventAdmin = getEventAdminService();
+
+            try {
+                kernelStarting();
+                
+                Bundle[] bundles = this.context.getBundles();
+                
+                try {
+                    long waitTime = TimeUnit.SECONDS.toMillis(this.startupWaitTime);
+
+                    for (Bundle bundle : bundles) {
+
+                        if (!BundleUtils.isFragmentBundle(bundle) && isKernelBundle(bundle)) {
+                            BlockingAbortableSignal signal = new BlockingAbortableSignal();
+
+                            this.asyncBundleStartTracker.trackStart(bundle, signal);
+
+                            LOGGER.debug("Awaiting startup of bundle {} for up to {} milliseconds with signal {}.", new Object[]{bundle, waitTime, signal});
+
+                            long startTime = System.currentTimeMillis();
+                            boolean bundleStarted = signal.awaitCompletion(waitTime, TimeUnit.MILLISECONDS);
+                            waitTime -= System.currentTimeMillis() - startTime;
+
+                            if (!bundleStarted) {
+                                if(signal.isAborted()){
+                                    LOGGER.error("Bundle {} aborted before the Kernel timeout of {} seconds with {} seconds remaining.", new Object[]{bundle, this.startupWaitTime, TimeUnit.MILLISECONDS.toSeconds(waitTime)});
+                                    kernelStartAborted(bundle);
+                                } else if (waitTime <= 0) {
+                                    LOGGER.error("Kernel has failed to start before the timeout of {} seconds.", this.startupWaitTime);
+                                    kernelStartTimedOut();
+                                } else {
+                                    LOGGER.error("Bundle {} did not start within the Kernel timeout of {} seconds.", bundle, this.startupWaitTime);
+                                    kernelStartTimedOut();
+                                }
+                                return;
+                            }
+                        }
+                    }
+                } catch (FailureSignalledException fse) {
+                    kernelStartFailed(fse.getCause());
+                    return;
+                } catch (Exception e) {
+                    kernelStartFailed(e);
+                    return;
+                }
+                
+                kernelStarted();
+            } finally {
+                this.serviceReferenceTracker.ungetAll();
+            }
+        }
+
+        @SuppressWarnings("unchecked")
+        private EventLogger getEventLoggerService() {
+            EventLogger eventLogger = null;
+            ServiceReference<EventLogger> eventLoggerServiceReference = (ServiceReference<EventLogger>) this.context.getServiceReference(EventLogger.class.getName());
+            if (eventLoggerServiceReference != null) {
+                eventLogger = (EventLogger) this.context.getService(this.serviceReferenceTracker.track(eventLoggerServiceReference));
+            }
+            return eventLogger;
+        }
+        
+        @SuppressWarnings("unchecked")
+        private EventAdmin getEventAdminService() {
+            EventAdmin eventAdmin = null;
+            ServiceReference<EventAdmin> eventAdminServiceReference = (ServiceReference<EventAdmin>) this.context.getServiceReference(EventAdmin.class.getName());
+            if (eventAdminServiceReference != null) {
+                eventAdmin = (EventAdmin) this.context.getService(this.serviceReferenceTracker.track(eventAdminServiceReference));
+            }
+            return eventAdmin;
+        }
+        
+        private boolean isKernelBundle(Bundle bundle) {
+        	String symbolicName = bundle.getSymbolicName();
+			return symbolicName != null && (symbolicName.startsWith(KERNEL_BSN_PREFIX) || 
+											symbolicName.startsWith(NANO_AUTH_BSN_PREFIX) || 
+											symbolicName.startsWith(NANO_CORE_BSN_PREFIX));
+        }
+
+        private void kernelStarting() {
+            postEvent(KERNEL_EVENT_STARTING);
+            logEvent(KernelLogEvents.KERNEL_STARTING);
+        }
+
+        private void kernelStarted() {
+            this.kernelStatus.setStarted();
+            postEvent(KERNEL_EVENT_STARTED);
+            logEvent(KernelLogEvents.KERNEL_STARTED);
+        }
+        
+        private void kernelStartAborted(Bundle bundle) {
+            postEvent(KERNEL_EVENT_START_ABORTED);
+            logEvent(KernelLogEvents.KERNEL_EVENT_START_ABORTED, bundle.getSymbolicName(), bundle.getVersion());
+            generateDumpAndShutdown("startupTimedOut", null);
+        }
+        
+        private void kernelStartTimedOut() {
+            postEvent(KERNEL_EVENT_START_TIMED_OUT);
+            logEvent(KernelLogEvents.KERNEL_START_TIMED_OUT, this.startupWaitTime);
+            generateDumpAndShutdown("startupTimedOut", null);
+        }
+        
+        private void kernelStartFailed(Throwable failure) {
+            postEvent(KERNEL_EVENT_START_FAILED);
+            logEvent(KernelLogEvents.KERNEL_START_FAILED, failure);
+            generateDumpAndShutdown("startupFailed", failure);
+        }
+        
+        private void generateDumpAndShutdown(String cause, Throwable failure) {
+            if (failure != null) {
+                this.dumpGenerator.generateDump(cause, failure);
+            } else {
+                this.dumpGenerator.generateDump(cause);
+            }
+            this.shutdown.immediateShutdown();
+        }
+        
+        private void logEvent(KernelLogEvents event, Throwable throwable, Object...args) {
+            if (this.eventLogger != null) {
+                this.eventLogger.log(event, throwable, args);
+            }
+        }
+
+        private void logEvent(KernelLogEvents event, Object... args) {
+            this.logEvent(event, null, args);
+        }
+
+        private void postEvent(String topic) {
+            if (this.eventAdmin != null) {
+                this.eventAdmin.postEvent(new Event(topic, (Map<String, ?>)null));
+            }
+        }
+    }    
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/internal/blueprint/ApplicationContextDependencyMonitor.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/internal/blueprint/ApplicationContextDependencyMonitor.java
new file mode 100644
index 0000000..c88a1f2
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/internal/blueprint/ApplicationContextDependencyMonitor.java
@@ -0,0 +1,320 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.core.internal.blueprint;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ScheduledExecutorService;
+
+import org.osgi.framework.Bundle;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventConstants;
+import org.osgi.service.event.EventHandler;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.nano.diagnostics.KernelLogEvents;
+
+/**
+ * {@link ApplicationContextDependencyMonitor} is a class that tracks the satisfaction of service dependencies needed
+ * during the creation of application contexts and issues log messages for delayed service dependencies.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+public final class ApplicationContextDependencyMonitor implements EventHandler {
+
+    private static final String TOPIC_BLUEPRINT_EVENTS = "org/osgi/service/blueprint/container/";
+
+    private static final String EVENT_WAITING = TOPIC_BLUEPRINT_EVENTS + "WAITING";
+
+    private static final String EVENT_GRACE_PERIOD = TOPIC_BLUEPRINT_EVENTS + "GRACE_PERIOD";
+
+    private static final String EVENT_FAILURE = TOPIC_BLUEPRINT_EVENTS + "FAILURE";
+
+    private static final String EVENT_CREATED = TOPIC_BLUEPRINT_EVENTS + "CREATED";
+
+    private static final int MAXIMUM_WARNING_INTERVAL = 60 * 1000;
+
+    private static final int WARNING_INTERVAL_INCREASE_RATE_PERCENT = 200;
+
+    private static final int INITIAL_WARNING_INTERVAL = 5 * 1000;
+
+    private static final int SLOW_WARNING_INTERVAL = 5 * 60 * 1000;
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private final EventLogger eventLogger;
+
+    private final ScheduledExecutorService scheduledExecutorService;
+
+    private final Map<Bundle, Map<ServiceDependency, Ticker>> tickers = new HashMap<Bundle, Map<ServiceDependency, Ticker>>();
+
+    private final Object monitor = new Object();
+
+    /**
+     * Construct a {@link ApplicationContextDependencyMonitor} which uses the given {@link ScheduledExecutorService} to
+     * schedule its warning messages.
+     * 
+     * @param scheduledExecutorService the {@link ScheduledExecutorService} for scheduling warning messages
+     * @param eventLogger
+     */
+    public ApplicationContextDependencyMonitor(ScheduledExecutorService scheduledExecutorService, EventLogger eventLogger) {
+        this.scheduledExecutorService = scheduledExecutorService;
+        this.eventLogger = eventLogger;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void handleEvent(Event event) {
+        synchronized (this.monitor) {
+            Bundle bundle = (Bundle) event.getProperty(EventConstants.BUNDLE);
+
+            if (EVENT_WAITING.equals(event.getTopic())) {
+                List<ServiceDependency> serviceDependencies = createServiceDependencies(event);
+                if (serviceDependencies != null) {
+                    for (ServiceDependency serviceDependency : serviceDependencies) {
+                        addServiceDependencyTicker(serviceDependency, bundle);
+                    }
+                }
+            } else if (EVENT_GRACE_PERIOD.equals(event.getTopic())) {
+                List<ServiceDependency> remainingUnsatisfiedDependencies = createServiceDependencies(event);
+                if (remainingUnsatisfiedDependencies != null) {
+                    changeInUnsatisfiedDependencies(remainingUnsatisfiedDependencies, bundle);
+                }
+
+            } else if (EVENT_FAILURE.equals(event.getTopic())) {
+                String[] dependenciesArray = (String[]) event.getProperty("dependencies");
+                if (dependenciesArray != null) {
+                    List<ServiceDependency> serviceDependencies = createServiceDependencies(event);
+                    if (serviceDependencies != null) {
+                        serviceDependenciesTimedOut(serviceDependencies, bundle);
+                    }
+                } else {
+                    containerCreationFailed(bundle);
+                }
+            } else if (EVENT_CREATED.equals(event.getTopic())) {
+                containerCreated(bundle);
+            }
+        }
+    }
+
+    private void serviceDependenciesTimedOut(List<ServiceDependency> timedOutDependencies, Bundle bundle) {
+        Map<ServiceDependency, Ticker> bundlesTickers = this.tickers.get(bundle);
+
+        if (bundlesTickers != null) {
+            for (ServiceDependency timedOutDependency : timedOutDependencies) {
+                Ticker ticker = bundlesTickers.remove(timedOutDependency);
+                if (ticker != null) {
+                    dependencyTimedOut(timedOutDependency, ticker, bundle);
+                }
+            }
+        }
+    }
+
+    private void containerCreationFailed(Bundle bundle) {
+        Map<ServiceDependency, Ticker> tickers = this.tickers.remove(bundle);
+        if (tickers != null) {
+            for (Entry<ServiceDependency, Ticker> ticker : tickers.entrySet()) {
+                ticker.getValue().cancel();
+            }
+        }
+    }
+
+    private void containerCreated(Bundle bundle) {
+        Map<ServiceDependency, Ticker> bundlesTickers = this.tickers.remove(bundle);
+
+        if (bundlesTickers != null) {
+            for (Entry<ServiceDependency, Ticker> entry : bundlesTickers.entrySet()) {
+                dependencySatisfied(entry.getKey(), entry.getValue(), bundle);
+            }
+        }
+    }
+
+    private void changeInUnsatisfiedDependencies(List<ServiceDependency> remainingUnsatisfiedDependencies, Bundle bundle) {
+        Map<ServiceDependency, Ticker> tickers = this.tickers.get(bundle);
+
+        if (tickers != null) {
+            Iterator<Entry<ServiceDependency, Ticker>> entries = tickers.entrySet().iterator();
+
+            while (entries.hasNext()) {
+                Entry<ServiceDependency, Ticker> entry = entries.next();
+
+                if (!remainingUnsatisfiedDependencies.contains(entry.getKey())) {
+                    dependencySatisfied(entry.getKey(), entry.getValue(), bundle);
+                    entries.remove();
+                }
+            }
+        }
+    }
+
+    private void dependencySatisfied(ServiceDependency serviceDependency, Ticker ticker, Bundle bundle) {
+        logger.info("Service dependency '{}' has been satisfied", serviceDependency);
+        handleRemovedTicker(ticker, serviceDependency, bundle, true);
+    }
+
+    private void dependencyTimedOut(ServiceDependency serviceDependency, Ticker ticker, Bundle bundle) {
+        logger.info("Service dependency '{}' has timed out", serviceDependency);
+        handleRemovedTicker(ticker, serviceDependency, bundle, false);
+    }
+
+    private void handleRemovedTicker(Ticker ticker, ServiceDependency serviceDependency, Bundle bundle, boolean satisfied) {
+        boolean hasTicked = ticker.cancel();
+        if (hasTicked) {
+            if (satisfied) {
+                this.eventLogger.log(KernelLogEvents.APPLICATION_CONTEXT_DEPENDENCY_SATISFIED, serviceDependency.getBeanName(),
+                    bundle.getSymbolicName(), bundle.getVersion(), serviceDependency.getFilter());
+            } else {
+                this.eventLogger.log(KernelLogEvents.APPLICATION_CONTEXT_DEPENDENCY_TIMED_OUT, serviceDependency.getBeanName(),
+                    bundle.getSymbolicName(), bundle.getVersion(), serviceDependency.getFilter());
+            }
+        }
+    }
+
+    /**
+     * Add a service dependency ticker for the given application context, given associated bundle, and given service
+     * dependency.
+     * 
+     * @param applicationContext the partially constructed application context which needs the service dependency
+     * @param serviceDependency the service dependency
+     * @param bundle the {@link Bundle} associated with the given application context
+     */
+    private void addServiceDependencyTicker(final ServiceDependency serviceDependency, final Bundle bundle) {
+        Map<ServiceDependency, Ticker> serviceDependencyTickers = getServiceDependencyTickers(bundle);
+        if (serviceDependencyTickers.containsKey(serviceDependency)) {
+            logger.warn("Service dependency '{}' already being waited upon", serviceDependency);
+        } else {
+            // Services which are flagged as likely to be slow to be published are given a longer initial warning
+            // interval.
+            boolean slowService = serviceDependency.getFilter().contains("(org.eclipse.virgo.server.slowservice=true)");
+            serviceDependencyTickers.put(serviceDependency, StandardTicker.createExponentialTicker(slowService ? SLOW_WARNING_INTERVAL
+                : INITIAL_WARNING_INTERVAL, WARNING_INTERVAL_INCREASE_RATE_PERCENT, slowService ? SLOW_WARNING_INTERVAL : MAXIMUM_WARNING_INTERVAL,
+                new Callable<Void>() {
+
+                    public Void call() throws Exception {
+                        synchronized (ApplicationContextDependencyMonitor.this.monitor) {
+                            if (bundle.getState() == Bundle.UNINSTALLED) {
+                                ApplicationContextDependencyMonitor.this.containerCreationFailed(bundle);
+                            } else {
+                                eventLogger.log(KernelLogEvents.APPLICATION_CONTEXT_DEPENDENCY_DELAYED, serviceDependency.getBeanName(),
+                                    bundle.getSymbolicName(), bundle.getVersion(), serviceDependency.getFilter());
+                            }
+                            return null;
+                        }
+                    }
+                }, this.scheduledExecutorService));
+        }
+    }
+
+    /**
+     * Get the possibly empty map of service dependency tickers for the given <code>Bundle</code>.
+     * 
+     * @param bundle the <code>Bundle</code> whose application context's service dependencies are required
+     * @return a map of service dependency tickers
+     */
+    private Map<ServiceDependency, Ticker> getServiceDependencyTickers(Bundle bundle) {
+        Map<ServiceDependency, Ticker> tickers = this.tickers.get(bundle);
+        if (tickers == null) {
+            tickers = new HashMap<ServiceDependency, Ticker>();
+            this.tickers.put(bundle, tickers);
+        }
+        return tickers;
+    }
+
+    public void stop() {
+        this.scheduledExecutorService.shutdown();
+    }
+
+    private List<ServiceDependency> createServiceDependencies(Event event) {
+        String[] filters = (String[]) event.getProperty("dependencies");
+        String[] beanNames = (String[]) event.getProperty("bean.name");
+
+        List<ServiceDependency> serviceDependencies = new ArrayList<ServiceDependency>();
+        if (filters != null && beanNames != null) {
+            for (int i = 0; i < filters.length; i++) {
+                serviceDependencies.add(new ServiceDependency(filters[i], beanNames[i]));
+            }
+            return serviceDependencies;
+        }
+
+        /*
+         * Return null when filters is non-null and beanNames is null. Blueprint events sometimes lack this information,
+         * but a corresponding event including bean names is posted by
+         * BlueprintEventPostingOsgiBundleApplicationContextListener on receipt of the underlying Spring DM event. A
+         * return value of null indicates that the caller should ignore this event.
+         */
+        return filters == null ? serviceDependencies : null;
+    }
+
+    private static final class ServiceDependency {
+
+        private final String filter;
+
+        private final String beanName;
+
+        private ServiceDependency(String filter, String beanName) {
+            this.filter = filter;
+            this.beanName = beanName;
+        }
+
+        public String getFilter() {
+            return filter;
+        }
+
+        public String getBeanName() {
+            return beanName;
+        }
+
+        @Override
+        public int hashCode() {
+            final int prime = 31;
+            int result = 1;
+            result = prime * result + beanName.hashCode();
+            result = prime * result + filter.hashCode();
+            return result;
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (this == obj)
+                return true;
+            if (obj == null)
+                return false;
+            if (getClass() != obj.getClass())
+                return false;
+
+            ServiceDependency other = (ServiceDependency) obj;
+
+            if (!beanName.equals(other.beanName))
+                return false;
+
+            if (!filter.equals(other.filter))
+                return false;
+
+            return true;
+        }
+
+        public String toString() {
+            return this.filter + " " + this.beanName;
+        }
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/internal/blueprint/StandardTicker.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/internal/blueprint/StandardTicker.java
new file mode 100644
index 0000000..db989be
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/internal/blueprint/StandardTicker.java
@@ -0,0 +1,256 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.core.internal.blueprint;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicLong;
+
+
+
+
+/**
+ * {@link StandardTicker} provides a heart-beat for tracking unanticipated delays. The heart-beat is configurable using a
+ * policy such as {@link ExponentialHeartBeatPolicy} which lengthens the heart-beat interval exponentially over time
+ * until it reaches a fixed upper bound. On each heart-beat until the ticker is cancelled, an action is called.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ * @param <V> the result type of the action taken on each heart-beat
+ */
+public final class StandardTicker<V> implements Ticker, Callable<V> {
+
+    private static final long OVERDUE = -1;
+
+    private final long creationTimeMillis;
+
+    private long lastTickMillis;
+
+    private final HeartBeatPolicy heartBeatPolicy;
+
+    private long heartBeatIntervalMillis;
+    
+    private boolean tickedAtLeastOnce = false;
+    
+    private boolean cancelled = false;
+    
+    private ScheduledFuture<V> scheduledFuture;
+
+    private final Callable<V> action;
+
+    private final ScheduledExecutorService scheduledExecutorService;
+
+    private Object monitor = new Object();
+
+    /**
+     * Create a {@link Ticker} with the given heart-beat policy, action to be called on each tick, and executor service
+     * for scheduling ticks and set it ticking.
+     * 
+     * @param <V> the action's result type
+     * @param heartBeatPolicy a policy which determines the possibly variable intervals between heartbeats
+     * @param action the thread safe action to be called on each tick
+     * @param scheduledExecutorService the executor service for scheduling ticks
+     * @return the constructed and ticking ticker
+     */
+    public static <V> Ticker createTicker(HeartBeatPolicy heartBeatPolicy, Callable<V> action, ScheduledExecutorService scheduledExecutorService) {
+        StandardTicker<V> ticker = new StandardTicker<V>(heartBeatPolicy, action, scheduledExecutorService);
+        ticker.start();
+        return ticker;
+    }
+
+    /**
+     * Create a {@link Ticker} with an exponential heart beat policy and a given action to be called on each tick and an
+     * executor service for scheduling ticks and set it ticking. The exponential heart beat policy has the given initial
+     * interval which then increases by the given percentage on each tick until the given maximum interval is reached.
+     * 
+     * @param <V> the action's result type
+     * @param initialHeartbeatIntervalMillis the initial interval
+     * @param heartBeatIncreasePercentage the percentage increase on each tick
+     * @param maxHeartBeatIntervalMillis the maximum interval
+     * @param action the thread safe action to be called on each tick
+     * @param scheduledExecutorService the executor service for scheduling ticks
+     * @return the constructed and ticking ticker
+     */
+    public static <V> Ticker createExponentialTicker(long initialHeartbeatIntervalMillis, long heartBeatIncreasePercentage,
+        long maxHeartBeatIntervalMillis, Callable<V> action, ScheduledExecutorService scheduledExecutorService) {
+        return createTicker(new ExponentialHeartBeatPolicy(initialHeartbeatIntervalMillis, heartBeatIncreasePercentage, maxHeartBeatIntervalMillis),
+            action, scheduledExecutorService);
+    }
+
+    /**
+     * Construct a Ticker with the given heart beat policy, action to be called on each tick, and executor service for
+     * scheduling ticks.
+     * 
+     * @param heartBeatPolicy a policy which determines the possibly variable intervals between heartbeats
+     * @param action the thread safe action to be called on each tick
+     * @param scheduledExecutorService the executor service for scheduling ticks
+     */
+    private StandardTicker(HeartBeatPolicy heartBeatPolicy, Callable<V> action, ScheduledExecutorService scheduledExecutorService) {
+        this.heartBeatPolicy = heartBeatPolicy;
+        this.heartBeatIntervalMillis = this.heartBeatPolicy.getNextHeartBeatIntervalMillis();
+        this.creationTimeMillis = System.currentTimeMillis();
+        this.lastTickMillis = this.creationTimeMillis;
+        this.action = action;
+        this.scheduledExecutorService = scheduledExecutorService;
+    }
+
+    /**
+     * Start this ticker ticking.
+     */
+    private void start() {
+        if (getIntervalToNextTickMillis() == OVERDUE) {
+            try {
+                this.call();
+            } catch (Exception e) {
+            }
+        } else {
+            scheduleNextTick();
+        }
+    }
+
+    /**
+     * Schedule the next tick of this ticker.
+     */
+    private void scheduleNextTick() {
+        synchronized (this.monitor) {
+            if (!this.cancelled) {
+                this.scheduledFuture = this.scheduledExecutorService.schedule(this, getIntervalToNextTickMillis(), TimeUnit.MILLISECONDS);
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public V call() throws Exception {
+        boolean ticked = tick();
+        scheduleNextTick();
+        return ticked ? this.action.call() : null;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean cancel() {
+        synchronized (this.monitor) {
+            this.cancelled = true;
+            this.scheduledFuture.cancel(true);
+            return this.tickedAtLeastOnce;
+        }
+    }
+
+    /**
+     * Determine whether a tick is due and, if so, update the ticker state to count down to the next tick and return
+     * <code>true</code>. If no tick is due, do not update the ticker state and return <code>false</code>.
+     * 
+     * @return <code>true</code> if and only if the ticker tickedAtLeastOnce
+     */
+    private boolean tick() {
+        synchronized (this.monitor) {
+            boolean ticked = false;
+            if (!cancelled && getIntervalToNextTickMillis() == OVERDUE) {
+                ticked = true;
+                this.lastTickMillis = getCurrentTimeMillis();
+                this.heartBeatIntervalMillis = this.heartBeatPolicy.getNextHeartBeatIntervalMillis();
+            }
+            this.tickedAtLeastOnce = this.tickedAtLeastOnce || ticked;
+            return ticked;
+        }
+    }
+
+    /**
+     * Get the current time.
+     * 
+     * Pre-condition: the monitor must be held.
+     * 
+     * Post-condition: result >= this.lastTickMillis.
+     * 
+     * @return the current time in milliseconds
+     */
+    private long getCurrentTimeMillis() {
+        long currentTimeMillis = System.currentTimeMillis();
+        if (currentTimeMillis < this.lastTickMillis) {
+        	throw new IllegalArgumentException("Time must not go backwards");
+        }
+        return currentTimeMillis;
+    }
+
+    /**
+     * Get the time interval until the next tick is due, or OVERDUE if the next tick is overdue.
+     * 
+     * @return the time interval in milliseconds, or OVERDUE if the next tick is overdue
+     */
+    private long getIntervalToNextTickMillis() {
+        synchronized (this.monitor) {
+            long intervalSinceLastTickMillis = getCurrentTimeMillis() - this.lastTickMillis;
+            return intervalSinceLastTickMillis < this.heartBeatIntervalMillis ? this.heartBeatIntervalMillis - intervalSinceLastTickMillis : OVERDUE;
+        }
+    }
+
+    /**
+     * {@link ExponentialHeartBeatPolicy} is a {@link HeartBeatPolicy} which returns intervals starting with a given
+     * initial interval and increasing by a given percentage up to a given maximum interval.
+     * <p />
+     * 
+     * <strong>Concurrent Semantics</strong><br />
+     * 
+     * This class is thread safe.
+     */
+    private final static class ExponentialHeartBeatPolicy implements HeartBeatPolicy {
+
+        private final long maxHeartBeatIntervalMillis;
+
+        private final long heartBeatIncreasePercentage;
+
+        private AtomicLong heartBeatIntervalMillis;
+
+        /**
+         * Construct a {@link Ticker.HeartBeatPolicy HeartBeatPolicy} which the given initial interval which then increases by the given
+         * percentage on each tick until the given maximum interval is reached.
+         * 
+         * @param initialHeartbeatIntervalMillis the initial interval
+         * @param heartBeatIncreasePercentage the percentage increase on each tick
+         * @param maxHeartBeatIntervalMillis the maximum interval
+         */
+        public ExponentialHeartBeatPolicy(long initialHeartbeatIntervalMillis, long heartBeatIncreasePercentage, long maxHeartBeatIntervalMillis) {
+            this.heartBeatIntervalMillis = new AtomicLong(initialHeartbeatIntervalMillis);
+            this.heartBeatIncreasePercentage = heartBeatIncreasePercentage;
+            this.maxHeartBeatIntervalMillis = maxHeartBeatIntervalMillis;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public long getNextHeartBeatIntervalMillis() {
+            boolean success = false;
+            long nextHeartBeatIntervalMillis = 0;
+            while (!success) {
+                nextHeartBeatIntervalMillis = this.heartBeatIntervalMillis.get();
+                if (nextHeartBeatIntervalMillis < maxHeartBeatIntervalMillis) {
+                    long newHeartBeatIntervalMillis = Math.min((nextHeartBeatIntervalMillis * (100 + heartBeatIncreasePercentage)) / 100,
+                        maxHeartBeatIntervalMillis);
+                    success = this.heartBeatIntervalMillis.compareAndSet(nextHeartBeatIntervalMillis, newHeartBeatIntervalMillis);
+                } else {
+                    success = true;
+                }
+            }
+            return nextHeartBeatIntervalMillis;
+        }
+
+    }
+
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/internal/blueprint/Ticker.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/internal/blueprint/Ticker.java
new file mode 100644
index 0000000..af74bf9
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/core/internal/blueprint/Ticker.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.core.internal.blueprint;
+
+
+/**
+ * {@link Ticker} provides a heartbeat interface for tracking unanticipated delays. The heartbeat is configurable using
+ * a {@link HeartBeatPolicy}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations of this interface must be thread safe.
+ * 
+ */
+public interface Ticker {
+
+    /**
+     * Cancel this Ticker.
+     *
+     * @return <code>true</code> if and only this Ticker has ticked at least once
+     */
+    boolean cancel();
+
+    /**
+     * {@link HeartBeatPolicy} is an interface for configuring heartbeat intervals.
+     * <p />
+     * 
+     * <strong>Concurrent Semantics</strong><br />
+     * 
+     * Implementations of this interface should be thread safe to avoid potential abuse.
+     */
+    public static interface HeartBeatPolicy {
+
+        /**
+         * Return the heartbeat interval and update the next interval according to the policy.
+         * 
+         * @return the heartbeat interval in milliseconds
+         */
+        long getNextHeartBeatIntervalMillis();
+    }
+
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/diagnostics/KernelLogEvents.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/diagnostics/KernelLogEvents.java
new file mode 100644
index 0000000..843c1e6
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/diagnostics/KernelLogEvents.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.diagnostics;
+
+import org.eclipse.virgo.nano.serviceability.LogEventDelegate;
+import org.eclipse.virgo.medic.eventlog.Level;
+import org.eclipse.virgo.medic.eventlog.LogEvent;
+
+/**
+ * Defines all the {@link LogEvent LogEvents} for the kernel subsystem.
+ * 
+ * <strong>Concurrent Semantics</strong><br/>
+ * 
+ * Implementation is immutable.
+ * 
+ */
+public enum KernelLogEvents implements LogEvent {
+    KERNEL_STARTING(1, Level.INFO), //  
+    KERNEL_STARTED(2, Level.INFO), //
+    KERNEL_START_FAILED(3, Level.ERROR), //
+    KERNEL_START_TIMED_OUT(4, Level.ERROR), //
+    KERNEL_PLAN_ARGUMENTS_INCORRECT(5, Level.WARNING), //
+    KERNEL_EVENT_START_ABORTED(6, Level.ERROR), //
+    VIRGO_STARTED(7, Level.INFO), //
+    VIRGO_STARTED_NOTIME(8, Level.INFO), //
+    
+    SHUTDOWN_INITIATED(10, Level.INFO), //
+    IMMEDIATE_SHUTDOWN_INITIATED(11, Level.INFO), //
+    SHUTDOWN_HALTED(12, Level.ERROR), //
+    
+    APPLICATION_CONTEXT_DEPENDENCY_DELAYED(100, Level.WARNING), //
+    APPLICATION_CONTEXT_DEPENDENCY_SATISFIED(101, Level.INFO), //
+    APPLICATION_CONTEXT_DEPENDENCY_TIMED_OUT(102, Level.ERROR), //
+    
+    OVF_CONFIGURATION_FILE_DOES_NOT_EXIST(200, Level.WARNING), //
+    OVF_READ_ERROR(201, Level.ERROR), //
+    
+    OLD_SCOPING_PROPERTY_USED(300, Level.WARNING);
+
+    private static final String PREFIX = "KE";
+
+    private final LogEventDelegate delegate;
+
+    private KernelLogEvents(int code, Level level) {
+        this.delegate = new LogEventDelegate(PREFIX, code, level);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getEventCode() {
+        return this.delegate.getEventCode();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Level getLevel() {
+        return this.delegate.getLevel();
+    }
+
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/serviceability/Assert.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/serviceability/Assert.java
new file mode 100644
index 0000000..29124f0
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/serviceability/Assert.java
@@ -0,0 +1,255 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.serviceability;
+
+import java.util.Collection;
+import java.util.Map;
+
+/**
+ * A set of useful assertions based on those provided by the Spring Framework's Assert class.
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ * @see org.springframework.util.Assert
+ */
+public final class Assert {
+
+    /**
+     * A <code>FatalAssertionException</code> is thrown when an assertion failure occurs and will result in a dump being
+     * generated.
+     * 
+     * <strong>Concurrent Semantics</strong><br />
+     * 
+     * This class is <strong>thread-safe</strong>.
+     * 
+     */
+    final public static class FatalAssertionException extends RuntimeException {
+
+        private static final long serialVersionUID = -4633344457818398425L;
+
+        /**
+         * Creates a new FatalAssertionException with the supplied message
+         * 
+         * @param message The exception message
+         */
+        public FatalAssertionException(String message) {
+            super(message);
+        }
+    }
+
+    /**
+     * Assert a boolean expression, throwing a <code>FatalAssertionException</code> if the test result is
+     * <code>false</code>.
+     * 
+     * <pre class="code">
+     * Assert.isTrue(i &gt; 0, &quot;The value must be greater than zero&quot;);
+     * </pre>
+     * 
+     * @param expression a boolean expression
+     * @param message the exception message to use if the assertion fails
+     * @param inserts any inserts to include if the message is a format string.
+     * @throws FatalAssertionException if expression is <code>false</code>
+     */
+    public static void isTrue(boolean expression, String message, Object... inserts) {
+        if (!expression) {
+            throw new FatalAssertionException(String.format(message, inserts));
+        }
+    }
+
+    /**
+     * Assert a boolean expression, throwing a <code>FatalAssertionException</code> if the test result is
+     * <code>true</code>.
+     * 
+     * <pre class="code">
+     * Assert.isFalse(state.isBroken(), &quot;The state is broken&quot;);
+     * </pre>
+     * 
+     * @param expression a boolean expression
+     * @param message the exception message to use if the assertion fails
+     * @param inserts any inserts to include if the message is a format string.
+     * @throws FatalAssertionException if expression is <code>false</code>
+     */
+    public static void isFalse(boolean expression, String message, Object... inserts) {
+        if (expression) {
+            throw new FatalAssertionException(String.format(message, inserts));
+        }
+    }
+
+    /**
+     * Assert that an object is <code>null</code>.
+     * 
+     * <pre class="code">
+     * Assert.isNull(value, &quot;The value must be null&quot;);
+     * </pre>
+     * 
+     * @param object the object to check
+     * @param message the exception message to use if the assertion fails
+     * @param inserts any inserts to include if the message is a format string.
+     * @throws FatalAssertionException if the object is not <code>null</code>
+     */
+    public static void isNull(Object object, String message, Object... inserts) {
+        if (object != null) {
+            throw new FatalAssertionException(String.format(message, inserts));
+        }
+    }
+
+    /**
+     * Assert that an object is not <code>null</code>.
+     * 
+     * <pre class="code">
+     * Assert.notNull(clazz, &quot;The class must not be null&quot;);
+     * </pre>
+     * 
+     * @param object the object to check
+     * @param message the exception message to use if the assertion fails
+     * @param inserts any inserts to include if the message is a format string.
+     * @throws FatalAssertionException if the object is <code>null</code>
+     */
+    public static void notNull(Object object, String message, Object... inserts) {
+        if (object == null) {
+            throw new FatalAssertionException(String.format(message, inserts));
+        }
+    }
+
+    /**
+     * Assert that the given String is not empty; that is, it must not be <code>null</code> and not the empty String.
+     * 
+     * <pre class="code">
+     * Assert.hasLength(name, &quot;Name must not be empty&quot;);
+     * </pre>
+     * 
+     * @param text the String to check
+     * @param message the exception message to use if the assertion fails
+     * @param inserts any inserts to include if the message is a format string.
+     * @see org.eclipse.virgo.util.common.StringUtils#hasLength(String)
+     */
+    public static void hasLength(String text, String message, Object... inserts) {
+        if (text == null || text.length() == 0) {
+            throw new FatalAssertionException(String.format(message, inserts));
+        }
+    }
+
+    /**
+     * Assert that an array has elements; that is, it must not be <code>null</code> and must have at least one element.
+     * 
+     * <pre class="code">
+     * Assert.notEmpty(array, &quot;The array must have elements&quot;);
+     * </pre>
+     * 
+     * @param array the array to check
+     * @param message the exception message to use if the assertion fails
+     * @param inserts any inserts to include if the message is a format string.
+     * @throws IllegalArgumentException if the object array is <code>null</code> or has no elements
+     */
+    public static void notEmpty(Object[] array, String message, Object... inserts) {
+        if (array == null || array.length == 0) {
+            throw new FatalAssertionException(String.format(message, inserts));
+        }
+    }
+
+    /**
+     * Assert that a collection has elements; that is, it must not be <code>null</code> and must have at least one
+     * element.
+     * 
+     * <pre class="code">
+     * Assert.notEmpty(collection, &quot;Collection must have elements&quot;);
+     * </pre>
+     * @param <T> Element type of collection
+     * 
+     * @param collection the collection to check
+     * @param message the exception message to use if the assertion fails
+     * @param inserts any inserts to include if the message is a format string.
+     * @throws FatalAssertionException if the collection is <code>null</code> or has no elements
+     */
+    public static <T> void notEmpty(Collection<T> collection, String message, Object... inserts) {
+        if (collection == null || collection.isEmpty()) {
+            throw new FatalAssertionException(String.format(message, inserts));
+        }
+    }
+
+    /**
+     * Assert that a Map has entries; that is, it must not be <code>null</code> and must have at least one entry.
+     * 
+     * <pre class="code">
+     * Assert.notEmpty(map, &quot;Map must have entries&quot;);
+     * </pre>
+     * @param <K> Key type of map
+     * @param <V> Value type of map
+     * 
+     * @param map the map to check
+     * @param message the exception message to use if the assertion fails
+     * @param inserts any inserts to include if the message is a format string.
+     * @throws FatalAssertionException if the map is <code>null</code> or has no entries
+     */
+    public static <K, V> void notEmpty(Map<K, V> map, String message, Object... inserts) {
+        if (map == null || map.isEmpty()) {
+            throw new FatalAssertionException(String.format(message, inserts));
+        }
+    }
+
+    /**
+     * Assert that the provided object is a non-null instance of the provided class.
+     * 
+     * <pre class="code">
+     * Assert.instanceOf(Foo.class, foo);
+     * </pre>
+     * @param <T> Type generic
+     * 
+     * @param type the type to check against
+     * @param obj the object to check
+     * @param message a message which will be prepended to the message produced by the function itself, and which may be
+     *        used to provide context. It should normally end in a ": " or ". " so that the function generate message
+     *        looks ok when prepended to it.
+     * @param inserts any inserts to include if the message is a format string.
+     * @throws FatalAssertionException if the object is not an instance of clazz
+     * @see Class#isInstance
+     */
+    public static <T> void isInstanceOf(Class<T> type, Object obj, String message, Object... inserts) {
+        notNull(type, "The type to check against must not be null");
+        if (!type.isInstance(obj)) {
+            throw new FatalAssertionException(String.format(message, inserts) + "Object of class [" + (obj != null ? obj.getClass().getName() : "null")
+                + "] must be an instance of " + type);
+        }
+    }
+
+    /**
+     * Assert that <code>superType.isAssignableFrom(subType)</code> is <code>true</code>.
+     * 
+     * <pre class="code">
+     * Assert.isAssignable(Number.class, myClass);
+     * </pre>
+     * @param <T> SuperType
+     * @param <U> SubType
+     * 
+     * @param superType the super type to check against
+     * @param subType the sub type to check
+     * @param message a message which will be prepended to the message produced by the function itself, and which may be
+     *        used to provide context. It should normally end in a ": " or ". " so that the function generate message
+     *        looks ok when prepended to it.
+     * @param inserts any inserts to include if the message is a format string.
+     * @throws FatalAssertionException if the classes are not assignable
+     */
+    public static <T, U> void isAssignable(Class<T> superType, Class<U> subType, String message, Object... inserts) {
+        notNull(superType, "Type to check against must not be null");
+        if (subType == null || !superType.isAssignableFrom(subType)) {
+            throw new FatalAssertionException(String.format(message, inserts) + subType + " is not assignable to " + superType);
+        }
+    }
+
+    /*
+     * Prevent instantiation - Java does not allow final abstract classes.
+     */
+    private Assert() {
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/serviceability/FatalServerException.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/serviceability/FatalServerException.java
new file mode 100644
index 0000000..a25863a
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/serviceability/FatalServerException.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.serviceability;
+
+// TODO This exception doesn't cause a crash
+/**
+ * Fatal server exceptions are thrown when a severe error is detected in the
+ * Server which requires the Server to crash after generating diagnostics. This
+ * class is thread safe.
+ * 
+ * Subsystems should throw their own specific subclasses.
+ * 
+ */
+abstract public class FatalServerException extends RuntimeException {
+
+    /**
+     * Stable serial UID.
+     */
+    private static final long serialVersionUID = -4396605664802060768L;
+
+    /**
+     * An aspect will do FFDC when this exception, or subclasses of this
+     * exception, is thrown.
+     * 
+     * @param message an English description of the error
+     */
+    public FatalServerException(String message) {
+        super(message);
+    }
+    
+    public FatalServerException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/serviceability/LogEventDelegate.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/serviceability/LogEventDelegate.java
new file mode 100644
index 0000000..4975549
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/serviceability/LogEventDelegate.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.serviceability;
+
+import org.eclipse.virgo.medic.eventlog.Level;
+import org.eclipse.virgo.medic.eventlog.LogEvent;
+
+public class LogEventDelegate implements LogEvent {
+
+    private final String prefix;
+
+    private final int code;
+
+    private final Level level;
+
+    public LogEventDelegate(String prefix, int code, Level level) {
+        super();
+        this.prefix = prefix;
+        this.code = code;
+        this.level = level;
+    }
+
+    public String getEventCode() {
+        return String.format("%s%04d%1.1s", this.prefix, this.code, this.level);
+    }
+
+    public Level getLevel() {
+        return this.level;
+    }
+
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/serviceability/NonNull.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/serviceability/NonNull.java
new file mode 100644
index 0000000..1981eb1
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/serviceability/NonNull.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.serviceability;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * NonNull is an annotation to automate the insert of a non-null assertion check on a method parameter. The method
+ * taking the annotated parameter(s) is advised by an aspect to inject the assertion check.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This annotation is thread safe.
+ * 
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.PARAMETER)
+@Documented()
+public @interface NonNull {
+
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/serviceability/dump/DumpCoordinator.aj b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/serviceability/dump/DumpCoordinator.aj
new file mode 100644
index 0000000..61aa41b
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/serviceability/dump/DumpCoordinator.aj
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.serviceability.dump;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.eclipse.virgo.medic.dump.DumpGenerator;
+
+/**
+ * Advises throws of {@link RuntimeException} and triggers {@link DumpGenerator#generateDump(String,Throwable...) a dump}.
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.
+ * 
+ */
+public final aspect DumpCoordinator {
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+    
+    private volatile DumpGenerator dumpGenerator;
+
+    private final Object monitor = new Object();
+
+    pointcut serviceability() : within(org.eclipse.virgo.nano.serviceability..*);
+
+    pointcut dumpCandidate() : (execution(* *(..)) || initialization(*.new(..))) && !serviceability();
+
+    after() throwing(RuntimeException e) : dumpCandidate() {
+        if (!FFDCExceptionState.seen(e)) {
+            FFDCExceptionState.record(e);
+
+            synchronized (this.monitor) {
+                if (this.dumpGenerator != null) {
+                    this.dumpGenerator.generateDump("error", e);
+                } else {
+                    logger.warn("No DumpGenerator available");
+                }
+            }
+        }
+    }
+    
+    // TODO Consider using a ServiceTracker
+    public void setBundleContext(BundleContext bundleContext) {
+        ServiceReference<DumpGenerator> serviceReference = bundleContext.getServiceReference(DumpGenerator.class);
+        if (serviceReference != null) {
+            DumpGenerator dumpGenerator = bundleContext.getService(serviceReference);
+            if (dumpGenerator != null) {
+                setDumpGenerator(dumpGenerator);
+            } else {
+                throw new IllegalStateException("DumpGenerator not available in the ServiceRegistry");
+            }
+        }
+    }
+
+    public void setDumpGenerator(DumpGenerator dumpGenerator) {
+        synchronized (this.monitor) {
+            this.dumpGenerator = dumpGenerator;
+        }
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/serviceability/dump/FFDCExceptionState.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/serviceability/dump/FFDCExceptionState.java
new file mode 100644
index 0000000..fdd79bd
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/serviceability/dump/FFDCExceptionState.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.serviceability.dump;
+
+/**
+ * Maintains state about which {@link Throwable} was last seen for the current thread.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * State is thread local.
+ * 
+ */
+final class FFDCExceptionState {
+
+    private static final State STATE = new State();
+
+    /**
+     * Record that the supplied {@link Throwable} has been seen.
+     * 
+     * @param t the <code>Throwable</code>.
+     */
+    public static void record(Throwable t) {
+        STATE.set(t);
+    }
+
+    /**
+     * Query whether the supplied {@link Throwable} or one of its causes has been seen.
+     * 
+     * @param t the <code>Throwable</code>
+     * @return <code>true</code> if the <code>Throwable</code> has been seen, otherwise <code>false</code>.
+     */
+    public static boolean seen(Throwable t) {
+        boolean seen = false;
+        Throwable s = t;
+        do {
+            if (s.equals(STATE.get())) {
+                seen = true;
+                break;
+            }
+            s = s.getCause();
+        } while (s != null);
+        return seen;
+    }
+
+    private static class State extends ThreadLocal<Throwable> {
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override public String toString() {
+            return String.format("FFDC Exception State [lastSeen = '" + get() + "']");
+        }
+
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/serviceability/dump/internal/RegionDigraphDumpContributor.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/serviceability/dump/internal/RegionDigraphDumpContributor.java
new file mode 100644
index 0000000..016210b
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/serviceability/dump/internal/RegionDigraphDumpContributor.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright (c) 2011 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.serviceability.dump.internal;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.OutputStream;
+
+import org.eclipse.equinox.region.RegionDigraph;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.eclipse.virgo.medic.dump.Dump;
+import org.eclipse.virgo.medic.dump.DumpContributionFailedException;
+import org.eclipse.virgo.medic.dump.DumpContributor;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * {@link RegionDigraphDumpContributor} dumps the {@link RegionDigraph} to a file.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread safe.
+ */
+public final class RegionDigraphDumpContributor implements DumpContributor {
+
+    private final BundleContext bundleContext;
+
+    public RegionDigraphDumpContributor(@NonNull BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void contribute(Dump dump) throws DumpContributionFailedException {
+        File outputFile = dump.createFile("region.digraph");
+        ServiceReference<RegionDigraph> serviceReference = this.bundleContext.getServiceReference(RegionDigraph.class);
+        RegionDigraph regionDigraph = this.bundleContext.getService(serviceReference);
+        try {
+            OutputStream output = new FileOutputStream(outputFile);
+            try {
+                regionDigraph.getRegionDigraphPersistence().save(regionDigraph, output);
+            } finally {
+                output.close();
+            }
+        } catch (Exception e) {
+            throw new DumpContributionFailedException("Failed to dump region digraph", e);
+        } finally {
+            this.bundleContext.ungetService(serviceReference);
+        }
+
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String getName() {
+        return "region digraph";
+    }
+
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/serviceability/dump/internal/ResolutionDumpContributor.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/serviceability/dump/internal/ResolutionDumpContributor.java
new file mode 100644
index 0000000..e92b03c
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/serviceability/dump/internal/ResolutionDumpContributor.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.serviceability.dump.internal;
+
+import java.io.File;
+
+import org.eclipse.osgi.service.resolver.PlatformAdmin;
+import org.eclipse.osgi.service.resolver.State;
+import org.osgi.framework.BundleContext;
+
+import org.eclipse.virgo.medic.dump.Dump;
+import org.eclipse.virgo.medic.dump.DumpContributionFailedException;
+import org.eclipse.virgo.medic.dump.DumpContributor;
+
+/**
+ * An implementation of {@link DumpContributor} that generates a resolution state dump.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe
+ * 
+ */
+public class ResolutionDumpContributor implements DumpContributor {
+
+    // The following literal must match DependencyCalculator.RESOLUTION_STATE_KEY in the kernel userregion bundle.
+    public final static String RESOLUTION_STATE_KEY = "resolution.state";
+
+    private final ResolutionStateDumper resolutionStateDumper;
+
+    public ResolutionDumpContributor(BundleContext bundleContext) {
+        PlatformAdmin platformAdmin = bundleContext.getService(bundleContext.getServiceReference(PlatformAdmin.class));
+            //OsgiFrameworkUtils.getService(bundleContext, PlatformAdmin.class).getService();
+        this.resolutionStateDumper = new ResolutionStateDumper(new StandardSystemStateAccessor(platformAdmin), new StandardStateWriter(platformAdmin.getFactory()));
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void contribute(Dump dump) throws DumpContributionFailedException {
+        File outputFile = dump.createFile("osgi.zip");
+        if (dump.getContext().containsKey(RESOLUTION_STATE_KEY)) {
+            resolutionStateDumper.dump(outputFile, (State) dump.getContext().get(RESOLUTION_STATE_KEY));
+        } else {
+            resolutionStateDumper.dump(outputFile);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getName() {
+        return "resolution";
+    }
+
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/serviceability/dump/internal/ResolutionStateDumper.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/serviceability/dump/internal/ResolutionStateDumper.java
new file mode 100644
index 0000000..754e1bf
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/serviceability/dump/internal/ResolutionStateDumper.java
@@ -0,0 +1,102 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.serviceability.dump.internal;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.eclipse.osgi.service.resolver.State;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.eclipse.virgo.util.io.PathReference;
+import org.eclipse.virgo.util.io.ZipUtils;
+
+/**
+ * Utility class that writes the current Equinox resolver {@link State} to a ZIP file.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.
+ * 
+ */
+final class ResolutionStateDumper {
+
+    private static final String ENTRY_NAME_STATE = "state/";
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private final SystemStateAccessor systemStateAccessor;
+    
+    private final StateWriter stateWriter;
+
+    /**
+     * Creates a new <code>ResolutionStateDumper</code>.
+     * @param systemStateAccessor to access live system {@link State}
+     * @param stateWriter to write a {@link State} to permanent storage
+     */
+    public ResolutionStateDumper(SystemStateAccessor systemStateAccessor, StateWriter stateWriter) {
+        this.systemStateAccessor = systemStateAccessor;
+        this.stateWriter = stateWriter;
+    }
+
+    /**
+     * Dump the global resolver {@link State} into a ZIP file at the supplied location.
+     * 
+     * @param outputFile the location to create the ZIP file at.
+     */
+    public void dump(File outputFile) {
+        dump(outputFile, this.systemStateAccessor.getSystemState());
+    }
+
+    /**
+     * Dump a resolver {@link State} into a ZIP file at the supplied location.
+     * 
+     * @param outputFile the location to create the ZIP file at.
+     * @param state the state to dump
+     */
+    public void dump(File outputFile, State state) {        
+        File outdir = new File(getTmpDir(), "resolve-" + System.currentTimeMillis());
+        if (outdir.mkdirs()) {
+            try {
+                this.stateWriter.writeState(state, outdir);
+            } catch (IOException e) {
+                this.logger.error("Unable to write resolver state.", e);
+            }
+        } else {
+            throw new RuntimeException("Unable to create temporary directory '" + outdir.getAbsolutePath() + "'.");
+        }
+
+        try {
+            zipStateDirectory(outputFile, outdir);
+        } catch (IOException e) {
+            this.logger.error("Unable to create ZIP of state dump", e);
+        } finally {
+            if (!new PathReference(outdir).delete(true)) {
+                this.logger.warn("Temporary state directory '%s' was not removed after use.", outdir.getAbsolutePath());
+            }            
+        }
+    }
+
+    private void zipStateDirectory(File outputFile, File dumpDir) throws IOException {
+        PathReference output = new PathReference(outputFile);
+        PathReference toZip = new PathReference(dumpDir);
+
+        ZipUtils.zipTo(toZip, output, ENTRY_NAME_STATE);
+    }
+
+    private String getTmpDir() {
+        String path = System.getProperty("java.io.tmpdir");
+        return path;
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/serviceability/dump/internal/StandardStateWriter.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/serviceability/dump/internal/StandardStateWriter.java
new file mode 100644
index 0000000..a73fc04
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/serviceability/dump/internal/StandardStateWriter.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.serviceability.dump.internal;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.eclipse.osgi.service.resolver.State;
+import org.eclipse.osgi.service.resolver.StateObjectFactory;
+
+
+/**
+ * Standard implementation of {@link StateWriter}.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Thread-safe.
+ *
+ */
+class StandardStateWriter implements StateWriter {
+    
+    private final StateObjectFactory factory;
+    
+    StandardStateWriter(StateObjectFactory factory) {
+        this.factory = factory;
+    }
+
+    /** 
+     * {@inheritDoc} 
+     */
+    public void writeState(State state, File output) throws IOException {
+        this.factory.writeState(state, output);
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/serviceability/dump/internal/StandardSystemStateAccessor.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/serviceability/dump/internal/StandardSystemStateAccessor.java
new file mode 100644
index 0000000..8cfd104
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/serviceability/dump/internal/StandardSystemStateAccessor.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.serviceability.dump.internal;
+
+import org.eclipse.osgi.internal.baseadaptor.StateManager;
+import org.eclipse.osgi.service.resolver.PlatformAdmin;
+import org.eclipse.osgi.service.resolver.State;
+
+/**
+ * Standard implementation of {@link SystemStateAccessor}.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Thread-safe.
+ *
+ */
+final class StandardSystemStateAccessor implements SystemStateAccessor {
+    
+    private final PlatformAdmin platformAdmin;
+            
+    StandardSystemStateAccessor(PlatformAdmin platformAdmin) {
+        this.platformAdmin = platformAdmin;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public State getSystemState() {
+        return ((StateManager)this.platformAdmin).getSystemState();
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/serviceability/dump/internal/StateWriter.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/serviceability/dump/internal/StateWriter.java
new file mode 100644
index 0000000..b7a4424
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/serviceability/dump/internal/StateWriter.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.serviceability.dump.internal;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.eclipse.osgi.service.resolver.State;
+
+
+/**
+ * A <code>StateWriter</code> is used to write a {@link State} to disk.
+ * 
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ * Implementations must be thread-safe.
+ * 
+ */
+public interface StateWriter {
+    
+    /**
+     * Writes the given <code>State</code> to the given <code>output</code> location.
+     * 
+     * @param state The <code>State</code> to write
+     * @param outputDir The directory to which it should be written.
+     * 
+     * @throws IOException if a failure occurs when writing the state
+     */
+    void writeState(State state, File outputDir) throws IOException;
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/serviceability/dump/internal/SystemStateAccessor.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/serviceability/dump/internal/SystemStateAccessor.java
new file mode 100644
index 0000000..cf6e5f3
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/serviceability/dump/internal/SystemStateAccessor.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.serviceability.dump.internal;
+
+import org.eclipse.osgi.service.resolver.State;
+
+
+/**
+ * A <code>SystemStateAccessor</code> provides access to the live system {@link State}.
+ * 
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Thread-safe.
+ *
+ */
+interface SystemStateAccessor {
+    
+    /**
+     * Returns the {@link State} for the system
+     * @return the system <code>State</code>.
+     */
+    State getSystemState();
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/serviceability/enforcement/NonNullAssertionEnforcer.aj b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/serviceability/enforcement/NonNullAssertionEnforcer.aj
new file mode 100644
index 0000000..6acd72a
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/serviceability/enforcement/NonNullAssertionEnforcer.aj
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.serviceability.enforcement;
+
+import org.aspectj.lang.annotation.SuppressAjWarnings;
+import org.eclipse.virgo.nano.serviceability.Assert;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+
+
+/**
+ * Aspect that enforces that parameters annotated with {@link NonNull} are, in fact, non null.
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.
+ * 
+ */
+public final aspect NonNullAssertionEnforcer {
+
+    pointcut serviceability() : within(org.eclipse.virgo.nano.serviceability..*);
+
+    pointcut executingOperationWithNonNullFirstParameter(Object obj) :
+    	!serviceability() && 
+        (execution(* *(@NonNull (*), ..)) || preinitialization(*.new(@NonNull (*), ..))) && args(obj, ..) ;
+
+    pointcut executingOperationWithNonNullSecondParameter(Object obj) :
+        !serviceability() && 
+        (execution(* *(*, @NonNull (*), ..)) || preinitialization(*.new(*, @NonNull (*), ..))) && args(*, obj, ..);
+
+    pointcut executingOperationWithNonNullThirdParameter(Object obj) :
+        !serviceability() && 
+        (execution(* *(*, *, @NonNull (*), ..)) || preinitialization(*.new(*, *, @NonNull (*), ..))) && args(*, * , obj, ..);
+
+    pointcut executingOperationWithNonNullFourthParameter(Object obj) :
+        !serviceability() && 
+        (execution(* *(*, *, *, @NonNull (*), ..)) || preinitialization(*.new(*, *, *, @NonNull (*), ..))) && args(*, *, *, obj, ..);
+
+    pointcut executingOperationWithNonNullFifthParameter(Object obj) :
+        !serviceability() && 
+        (execution(* *(*, *, *, *, @NonNull (*), ..)) || preinitialization(*.new(*, *, *, *, @NonNull (*), ..))) && args(*, *, *, *, obj, ..);
+
+    pointcut executingOperationWithNonNullSixthParameter(Object obj) :
+        !serviceability() && 
+        (execution(* *(*, *, *, *, *, @NonNull (*), ..)) || preinitialization(*.new(*, *, *, *, *, @NonNull (*), ..))) && args(*, *, *, *, *, obj, ..);
+
+    before(Object argValue) : executingOperationWithNonNullFirstParameter(argValue) {
+        Assert.notNull(argValue, "Argument [1] cannot be null");
+    }
+
+    before(Object argValue) : executingOperationWithNonNullSecondParameter(argValue) {
+        Assert.notNull(argValue, "Argument [2] cannot be null");
+    }
+
+    @SuppressAjWarnings({"adviceDidNotMatch"})
+    before(Object argValue) : executingOperationWithNonNullThirdParameter(argValue) {
+        Assert.notNull(argValue, "Argument [3] cannot be null");
+    }
+
+    @SuppressAjWarnings({"adviceDidNotMatch"})
+    before(Object argValue) : executingOperationWithNonNullFourthParameter(argValue) {
+        Assert.notNull(argValue, "Argument [4] cannot be null");
+    }
+
+    @SuppressAjWarnings({"adviceDidNotMatch"})
+    before(Object argValue) : executingOperationWithNonNullFifthParameter(argValue) {
+        Assert.notNull(argValue, "Argument [5] cannot be null");
+    }
+
+    @SuppressAjWarnings({"adviceDidNotMatch"})
+    before(Object argValue) : executingOperationWithNonNullSixthParameter(argValue) {
+        Assert.notNull(argValue, "Argument [6] cannot be null");
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/shim/scope/Scope.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/shim/scope/Scope.java
new file mode 100644
index 0000000..37e853f
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/shim/scope/Scope.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.shim.scope;
+
+/**
+ * {@link Scope} defines a collection of bundles, packages, and services. There is a global scope as well as more local scopes such as those used to contain
+ * multi-bundle applications.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Implementations of this interface must be thread safe.
+ *
+ */
+public interface Scope {
+    
+    public static final String PROPERTY_SERVICE_SCOPE = "org.eclipse.virgo.service.scope";
+    
+    public static final String SCOPE_ID_GLOBAL = "global";
+    
+    public static final String SCOPE_ID_APP = "app";
+
+    /**
+     * Return <code>true</code> if and only if this scope is global.
+     * 
+     * @return <code>true</code> if and only if this scope is global
+     */
+    boolean isGlobal();
+    
+    /**
+     * Return the name of this scope or <code>null</code> if this scope is global.
+     * 
+     * @return the name of this scope or <code>null</code> if this scope is global
+     */
+    String getScopeName();
+    
+    /**
+     * Get the value of the scope property with the given name or <code>null</code> if the scope has no such property.
+     * 
+     * @param propertyName the name of the property
+     * @return the value of the property or <code>null</code> if the scope has no such property
+     */
+    Object getProperty(String propertyName);
+    
+    /**
+     * Set the value of the scope property with the given name to the given value.
+     * 
+     * @param propertyName the name of the property
+     * @param propertyValue the value of the property
+     */
+    void setProperty(String propertyName, Object propertyValue);
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/shim/scope/ScopeFactory.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/shim/scope/ScopeFactory.java
new file mode 100644
index 0000000..b0e91f3
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/shim/scope/ScopeFactory.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.shim.scope;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * Creates {@link Scope} instances for {@link ServiceReference ServiceReferences} and for lookups. <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations of this interface must be thread safe.
+ * 
+ */
+public interface ScopeFactory {
+
+    /**
+     * Get the {@link Scope} containing the given {@link Bundle}.
+     * 
+     * @param bundle the <code>Bundle</code> whose scope is required
+     * @return the <code>Scope</code> containing the given bundle
+     */
+    Scope getBundleScope(Bundle bundle);
+
+    /**
+     * Get the global {@link Scope}.
+     * 
+     * @return the global <code>Scope</code>
+     */
+    Scope getGlobalScope();
+
+    /**
+     * Gets the {@link Scope} under which the referenced service is published.
+     * @param ref service reference
+     * @return the scope
+     */
+    Scope getServiceScope(ServiceReference ref);
+
+    /**
+     * Get the {@link Scope} for the given application scope name.
+     * 
+     * @param applicationScopeName the name of the scope
+     * @return the {@link Scope} with the given name
+     */
+    Scope getApplicationScope(String applicationScopeName);
+
+    /**
+     * Destroy the given application {@link Scope}. Existing <code>Scope</code> instances equivalent to the given
+     * <code>Scope</code> will continue to exist and share properties, but calls to get a <code>Scope</code> with the
+     * same application scope name as the given <code>Scope</code> will produce a new <code>Scope</code> with a distinct
+     * collection of properties. Effectively, this method delimits a 'generation' of an application scope.
+     * 
+     * @param applicationScope the application <code>Scope</code> to be destroyed.
+     */
+    void destroyApplicationScope(Scope applicationScope);
+
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/shim/scope/internal/StandardScopeFactory.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/shim/scope/internal/StandardScopeFactory.java
new file mode 100644
index 0000000..dc00e6a
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/shim/scope/internal/StandardScopeFactory.java
@@ -0,0 +1,304 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.shim.scope.internal;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.nano.diagnostics.KernelLogEvents;
+import org.eclipse.virgo.nano.shim.scope.Scope;
+import org.eclipse.virgo.nano.shim.scope.ScopeFactory;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * Creates {@link Scope} instances for {@link ServiceReference ServiceReferences} and for lookups.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.
+ * 
+ */
+public final class StandardScopeFactory implements ScopeFactory {
+
+    private static final String PROPERTY_BLUEPRINT_CONTEXT_SERVICE_NAME = "org.eclipse.gemini.blueprint.context.service.name";
+
+    private static final String PROPERTY_BEAN_NAME = "org.eclipse.gemini.blueprint.bean.name";
+
+    private final EventLogger eventLogger;
+
+    /*
+     * Share application scope properties between equivalent application scope instances
+     */
+    private final Map<AppScope, ConcurrentHashMap<String, Object>> properties = new HashMap<AppScope, ConcurrentHashMap<String, Object>>();
+
+    public StandardScopeFactory(EventLogger eventLogger) {
+        this.eventLogger = eventLogger;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Scope getBundleScope(Bundle bundle) {
+        return isBundleScoped(bundle) ? createApplicationScope(bundle) : GlobalScope.INSTANCE;
+
+    }
+
+    /**
+     * @param bundle
+     * @return
+     */
+    private Scope createApplicationScope(Bundle bundle) {
+        return getApplicationScope(getScopeName(bundle));
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Scope getGlobalScope() {
+        return GlobalScope.INSTANCE;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Scope getServiceScope(ServiceReference ref) {
+        return Scope.SCOPE_ID_APP.equals(getScopeIdentifier(ref)) ? getBundleScope(ref.getBundle()) : getGlobalScope();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Scope getApplicationScope(String applicationScopeName) {
+        synchronized (this.properties) {
+            AppScope appScope = new AppScope(applicationScopeName);
+            ConcurrentHashMap<String, Object> props = this.properties.get(appScope);
+            if (props == null) {
+                props = new ConcurrentHashMap<String, Object>();
+                this.properties.put(appScope, props);
+            }
+            appScope.setProperties(props);
+
+            return appScope;
+        }
+    }
+
+    private String getScopeIdentifier(ServiceReference ref) {
+        String serviceScope = (String) ref.getProperty(Scope.PROPERTY_SERVICE_SCOPE);
+        if (serviceScope == null) {
+            /*
+             * Tolerate the former property name to avoid breaking dm Server 2.0.x users. Post 2.1.0 the former property
+             * name need not be supported. Issue a warning message to prompt users to change the name.
+             */
+            serviceScope = (String) ref.getProperty("com.springsource.service.scope");
+            if (serviceScope == null) {
+                // Blueprint (application) contexts belong in the global scope.
+                if (ref.getProperty(PROPERTY_BLUEPRINT_CONTEXT_SERVICE_NAME) != null) {
+                    serviceScope = Scope.SCOPE_ID_GLOBAL;
+                }
+                else
+                if (isBundleScoped(ref.getBundle())) {
+                    serviceScope = Scope.SCOPE_ID_APP;
+                } else {
+                    serviceScope = Scope.SCOPE_ID_GLOBAL;
+                }
+            } else {
+                this.eventLogger.log(KernelLogEvents.OLD_SCOPING_PROPERTY_USED, ref.getBundle().getSymbolicName(), ref.getBundle().getVersion(),
+                    ref.getProperty(PROPERTY_BEAN_NAME));
+            }
+        }
+        return serviceScope;
+    }
+
+    private static boolean isBundleScoped(Bundle bundle) {
+        // TODO: reinstate return OsgiFrameworkUtils.getScopeName(bundle) != null;
+        return getScopeName(bundle) != null;
+    }
+
+    private static String getScopeName(Bundle bundle) {
+        // TODO: use OFUtils instead when in proper location
+        return (String) bundle.getHeaders().get("Module-Scope");
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void destroyApplicationScope(Scope applicationScope) {
+        // TODO: reinstate Assert.isTrue(applicationScope instanceof AppScope, "wrong scope type");
+        AppScope appScope = (AppScope) applicationScope;
+        synchronized (this.properties) {
+            this.properties.remove(appScope);
+        }
+    }
+
+    private abstract static class StandardScope implements Scope {
+
+        private volatile ConcurrentHashMap<String, Object> properties;
+
+        protected StandardScope() {
+        }
+
+        final void setProperties(ConcurrentHashMap<String, Object> properties) {
+            // TODO: reinstate Assert.isNull(this.properties, "properties can only be set once");
+            this.properties = properties;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public final Object getProperty(String propertyName) {
+            // TODO: reinstate Assert.isTrue(this.properties != null, "properties not set");
+            return this.properties.get(propertyName);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public final void setProperty(String propertyName, Object propertyValue) {
+            // TODO: reinstate Assert.isTrue(this.properties != null, "properties not set");
+            this.properties.put(propertyName, propertyValue);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public int hashCode() {
+            return 0;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public boolean equals(Object obj) {
+            if (this == obj) {
+                return true;
+            }
+            if (obj == null) {
+                return false;
+            }
+            if (getClass() != obj.getClass()) {
+                return false;
+            }
+            StandardScope other = (StandardScope) obj;
+            /*
+             * Instances that have not had their properties set compare equal (unless overridden by subclasses).
+             * Instances that have had their properties set must use the same properties object reference to compare
+             * equal.
+             */
+            if (properties == null || other.properties == null) {
+                return true;
+            } else if (properties != other.properties) {
+                return false;
+            }
+            return true;
+        }
+
+    }
+
+    private static class GlobalScope extends StandardScope {
+
+        static GlobalScope INSTANCE = new GlobalScope();
+
+        private GlobalScope() {
+            setProperties(new ConcurrentHashMap<String, Object>());
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public int hashCode() {
+            return 316;
+        }
+
+        public boolean equals(Object other) {
+            return other == this || other instanceof GlobalScope;
+        }
+
+        public String toString() {
+            return Scope.SCOPE_ID_GLOBAL;
+        }
+
+        public boolean isGlobal() {
+            return true;
+        }
+
+        public String getScopeName() {
+            // The global scope does not have a name.
+            return null;
+        }
+    }
+
+    private static class AppScope extends StandardScope {
+
+        private final String scopeName;
+
+        public AppScope(String scopeName) {
+            this.scopeName = scopeName;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public int hashCode() {
+            final int prime = 31;
+            int result = super.hashCode();
+            result = prime * result + ((scopeName == null) ? 0 : scopeName.hashCode());
+            return result;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public boolean equals(Object obj) {
+            if (this == obj) {
+                return true;
+            }
+            if (!super.equals(obj)) {
+                return false;
+            }
+            if (getClass() != obj.getClass()) {
+                return false;
+            }
+            AppScope other = (AppScope) obj;
+            if (scopeName == null) {
+                if (other.scopeName != null) {
+                    return false;
+                }
+            } else if (!scopeName.equals(other.scopeName)) {
+                return false;
+            }
+            return true;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public String toString() {
+            return Scope.SCOPE_ID_APP + ":" + this.scopeName;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public boolean isGlobal() {
+            return false;
+        }
+
+        public String getScopeName() {
+            return this.scopeName;
+        }
+    }
+
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/shim/serviceability/TracingService.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/shim/serviceability/TracingService.java
new file mode 100644
index 0000000..340adfd
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/shim/serviceability/TracingService.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.shim.serviceability;
+
+/**
+ * <p>
+ * The Platform's tracing service.
+ * <p/>
+ * <p>
+ * An instance of this interface is available from the OSGi service registry.
+ * </p>
+ * <p>
+ * <strong>Concurrent Semantics</strong><br />
+ * Implementations <strong>must</strong> be thread safe.
+ * </p>
+ * 
+ */
+public interface TracingService {
+
+    /**
+     * Informs the tracing service that the calling thread is within the scope of the application identified by
+     * <code>applicationName</code>. This setting can be cleared, e.g. because the calling thread is no longer in the
+     * scope of an application, by calling this method with <code>null</code>.
+     * 
+     * @param applicationName The name of the application that is in scope on the calling thread.
+     */
+    void setCurrentApplicationName(String applicationName);
+
+    /**
+     * Returns the name of the application that is currently associated with the current thread
+     * 
+     * @return The name of the application associated with the thread.
+     */
+    String getCurrentApplicationName();
+
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/shim/serviceability/internal/Slf4jTracingService.java b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/shim/serviceability/internal/Slf4jTracingService.java
new file mode 100644
index 0000000..f6dccfd
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/java/org/eclipse/virgo/nano/shim/serviceability/internal/Slf4jTracingService.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.shim.serviceability.internal;
+
+import org.eclipse.virgo.nano.shim.serviceability.TracingService;
+import org.slf4j.MDC;
+
+
+public final class Slf4jTracingService implements TracingService {
+
+    public static final String APPLICATION_NAME = "applicationName";
+
+    public String getCurrentApplicationName() {
+        return MDC.get(APPLICATION_NAME);
+    }
+
+    public void setCurrentApplicationName(String applicationName) {
+        MDC.put(APPLICATION_NAME, applicationName);
+    }
+
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/resources/EventLogMessages.properties b/nano/org.eclipse.virgo.nano.core/src/main/resources/EventLogMessages.properties
new file mode 100644
index 0000000..1405dd9
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/resources/EventLogMessages.properties
@@ -0,0 +1,22 @@
+KE0001I = Kernel starting.
+KE0002I = Kernel started.
+KE0003E = Kernel failed to start.
+KE0004E = Kernel failed to start within {} seconds.
+KE0005W = Option -plan requires one or two arguments but {} were provided: '{}'.
+KE0006E = Kernel failed to start due to the aborted start of '{}' version '{}'.
+#Server Readiness Events
+KE0007I = Virgo ready. Started for {}s.
+KE0008I = Virgo ready.
+
+KE0010I = Shutdown initiated.
+KE0011I = Immediate shutdown initiated.
+KE0012E = Shutdown failed - halting JVM.
+
+KE0100W = Reference '{}' in bundle '{}' version '{}' is waiting for service with filter '{}'.
+KE0101I = Reference '{}' in bundle '{}' version '{}' was satisfied by service with filter '{}'.
+KE0102E = Reference '{}' in bundle '{}' version '{}' timed out waiting for service with filter '{}'.
+
+KE0200W = OVF configuration file '{}' does not exist.
+KE0201E = Error reading OVF configuration file '{}'.
+
+KE0300W = Service property in bundle '{}' version '{}' (bean '{}') should be renamed from com.springsource.service.scope to org.eclipse.virgo.service.scope.
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/resources/OSGI-INF/org.eclipse.virgo.nano.config.xml b/nano/org.eclipse.virgo.nano.core/src/main/resources/OSGI-INF/org.eclipse.virgo.nano.config.xml
new file mode 100644
index 0000000..bd47c5d
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/resources/OSGI-INF/org.eclipse.virgo.nano.config.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" immediate="true" name="org.eclipse.virgo.kernel" configuration-policy="require">

+	<implementation class="org.eclipse.virgo.nano.config.internal.StandardKernelConfig" />

+	

+	<service>

+		<provide interface="org.eclipse.virgo.nano.core.KernelConfig" />

+	</service>

+

+</scr:component>

diff --git a/nano/org.eclipse.virgo.nano.core/src/main/resources/OSGI-INF/org.eclipse.virgo.nano.core.xml b/nano/org.eclipse.virgo.nano.core/src/main/resources/OSGI-INF/org.eclipse.virgo.nano.core.xml
new file mode 100644
index 0000000..174e8c5
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/resources/OSGI-INF/org.eclipse.virgo.nano.core.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="org.eclipse.virgo.nano.core" immediate="true">

+	<implementation class="org.eclipse.virgo.nano.core.internal.CoreBundleActivator"/>

+	

+	<reference name="EventLogger"

+		interface="org.eclipse.virgo.medic.eventlog.EventLogger"

+		policy="static"/>

+		

+	<reference name="DumpGenerator"

+		interface="org.eclipse.virgo.medic.dump.DumpGenerator"

+		policy="static"/>

+		

+	<reference name="ConfigAdmin"

+		interface="org.osgi.service.cm.ConfigurationAdmin"

+		policy="static"/>

+		

+  	<reference name="EventAdmin"

+		interface="org.osgi.service.event.EventAdmin"

+		policy="static"/>

+

+</scr:component>

diff --git a/nano/org.eclipse.virgo.nano.core/src/main/resources/OSGI-INF/org.eclipse.virgo.nano.server.readiness.tracker.xml b/nano/org.eclipse.virgo.nano.core/src/main/resources/OSGI-INF/org.eclipse.virgo.nano.server.readiness.tracker.xml
new file mode 100644
index 0000000..a37ca51
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/resources/OSGI-INF/org.eclipse.virgo.nano.server.readiness.tracker.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="Server Readiness Tracker" immediate="true">
+   <implementation class="org.eclipse.virgo.nano.core.internal.ServerReadinessTracker"/>
+ 
+   	<reference name="EventLogger" 
+   	interface="org.eclipse.virgo.medic.eventlog.EventLogger" 
+   	policy="static"
+   	bind="bindEventLogger" 
+   	unbind="unbindEventLogger"/>
+    
+    <property name="event.topics">org/eclipse/virgo/kernel/*</property>
+    
+    <service>
+       <provide interface="org.osgi.service.event.EventHandler"/>
+    </service>
+    
+</scr:component>
diff --git a/nano/org.eclipse.virgo.nano.core/src/main/resources/about.html b/nano/org.eclipse.virgo.nano.core/src/main/resources/about.html
new file mode 100644
index 0000000..c258ef5
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/main/resources/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>June 5, 2006</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/config/internal/ConfigurationAdminConfigurationInfoTests.java b/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/config/internal/ConfigurationAdminConfigurationInfoTests.java
new file mode 100644
index 0000000..c45d058
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/config/internal/ConfigurationAdminConfigurationInfoTests.java
@@ -0,0 +1,87 @@
+/* Copyright (c) 2010 Olivier Girardot
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Olivier Girardot - initial contribution
+ */
+
+package org.eclipse.virgo.nano.config.internal;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import java.io.IOException;
+import java.util.Dictionary;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.Map;
+
+import org.eclipse.virgo.nano.serviceability.Assert.FatalAssertionException;
+import org.eclipse.virgo.test.stubs.service.cm.StubConfigurationAdmin;
+import org.junit.Test;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+
+/**
+ * This class is for testing {@link ConfigurationAdminConfigurationInfo} class, an implementation of the
+ * {@link ConfigurationInfo} interface.
+ */
+public class ConfigurationAdminConfigurationInfoTests {
+
+    private static final String CONFIG_INFO_TEST_PID = "CUSTOM_PID";
+
+    @Test
+    public void testGetPid() {
+        ConfigurationAdmin stubAdmin = new StubConfigurationAdmin();
+        ConfigurationInfo configurationInfo = new ConfigurationAdminConfigurationInfo(stubAdmin, CONFIG_INFO_TEST_PID);
+        assertEquals(CONFIG_INFO_TEST_PID, configurationInfo.getPid());
+    }
+
+    @Test
+    public void testGetPropertiesFromEmptyConfiguration() {
+        ConfigurationAdmin stubAdmin = new StubConfigurationAdmin();
+        ConfigurationInfo configurationInfo = new ConfigurationAdminConfigurationInfo(stubAdmin, CONFIG_INFO_TEST_PID);
+        assertEquals("Properties map should be empty.", new HashMap<String, String>(), configurationInfo.getProperties());
+    }
+
+    @Test
+    public void testFailingConfigurationAdmin() throws IOException {
+        ConfigurationAdmin mockAdmin = createMock(ConfigurationAdmin.class);
+        expect(mockAdmin.getConfiguration(CONFIG_INFO_TEST_PID, null)).andThrow(new IOException("Error trying to load configuration"));
+        replay(mockAdmin);
+
+        ConfigurationInfo configurationInfo = new ConfigurationAdminConfigurationInfo(mockAdmin, CONFIG_INFO_TEST_PID);
+        assertNull(configurationInfo.getProperties());
+    }
+
+    @Test(expected = FatalAssertionException.class)
+    public void testFailingConstructorWithNullConfigurationAdmin() throws IOException {
+        new ConfigurationAdminConfigurationInfo(null, CONFIG_INFO_TEST_PID);
+    }
+
+    @Test
+    public void testGetPropertiesWithFilledConfiguration() throws IOException {
+        ConfigurationAdmin stubAdmin = new StubConfigurationAdmin();
+        Configuration config = stubAdmin.getConfiguration(CONFIG_INFO_TEST_PID, null);
+
+        Dictionary<String, String> dict = new Hashtable<String, String>();
+        dict.put("key", "value");
+
+        config.update(dict);
+
+        ConfigurationInfo configurationInfo = new ConfigurationAdminConfigurationInfo(stubAdmin, CONFIG_INFO_TEST_PID);
+
+        Map<String, String> expectedMap = new HashMap<String, String>();
+        expectedMap.put("service.factoryPid", "CUSTOM_PID");
+        expectedMap.put("service.pid", "CUSTOM_PID");
+        expectedMap.put("key", "value");
+        assertEquals(expectedMap, configurationInfo.getProperties());
+    }
+
+}
\ No newline at end of file
diff --git a/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/config/internal/ConfigurationAdminDumpContributorTests.java b/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/config/internal/ConfigurationAdminDumpContributorTests.java
new file mode 100644
index 0000000..2170d8f
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/config/internal/ConfigurationAdminDumpContributorTests.java
@@ -0,0 +1,127 @@
+/* Copyright (c) 2010 Olivier Girardot
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Olivier Girardot - initial contribution
+ */
+
+package org.eclipse.virgo.nano.config.internal;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.eclipse.virgo.util.io.FileSystemUtils.deleteRecursively;
+import static org.eclipse.virgo.util.io.IOUtils.closeQuietly;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.Writer;
+
+import org.eclipse.virgo.medic.dump.Dump;
+import org.eclipse.virgo.medic.dump.DumpContributionFailedException;
+import org.eclipse.virgo.medic.dump.DumpContributor;
+import org.eclipse.virgo.test.stubs.service.cm.StubConfiguration;
+import org.eclipse.virgo.test.stubs.service.cm.StubConfigurationAdmin;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+
+/**
+ * This class is for testing {@link ConfigurationAdminDumpContributor} class, 
+ * an implementation of the {@link DumpContributor} interface.
+ */
+public class ConfigurationAdminDumpContributorTests {
+
+	private static final String TEST_OUTPUT_FILE_NAME = "Test-dump.out";
+	private static final String NORMAL_OUTPUT_FILE_NAME = "configurationAdmin.properties";
+	private static final String DC_NAME = "configurationAdmin";
+
+	private final File testDumpOutputDir = new File(new File("build"), "ConfigurationAdminDumpTests");
+    private File testDumpOutputFile;
+
+    @Before
+    public void setupTestDir() {
+        deleteRecursively(this.testDumpOutputDir);
+        this.testDumpOutputDir.mkdir();
+        this.testDumpOutputFile = new File(new File("build"), TEST_OUTPUT_FILE_NAME);
+    }
+
+    @After
+    public void deleteTestDir() {
+        deleteRecursively(this.testDumpOutputDir);
+    }
+	
+	@Test
+	public void testGetName() {
+		DumpContributor configAdminDC = new ConfigurationAdminDumpContributor(
+				new StubConfigurationAdmin());
+		assertEquals(DC_NAME, configAdminDC.getName());
+	}
+
+	@Test
+	public void testContribute() throws DumpContributionFailedException, IOException, InvalidSyntaxException {
+		Dump mockDump = createMock(Dump.class);
+
+		StubConfiguration testConfig = new StubConfiguration("test");
+		testConfig.addProperty("service.key", "value");
+
+		FileWriter dumpFileWriter = new FileWriter(testDumpOutputFile);
+		expect(mockDump.createFileWriter(NORMAL_OUTPUT_FILE_NAME)).andReturn(dumpFileWriter);
+		
+		ConfigurationAdmin mockAdmin = createMock(ConfigurationAdmin.class);
+		expect(mockAdmin.listConfigurations(null)).andReturn(new Configuration[]{testConfig});
+
+		replay(mockDump, mockAdmin);
+
+		DumpContributor configAdminDC = new ConfigurationAdminDumpContributor(mockAdmin);
+		configAdminDC.contribute(mockDump);
+
+		verify(mockAdmin, mockDump);
+		
+		assertWriterClosed(dumpFileWriter);
+		assertCorrectContribution(this.testDumpOutputFile);
+	}
+	
+	private static void assertCorrectContribution(File dumpFile) throws IOException {
+        String sb = getFileAsString(dumpFile);
+        
+        assertTrue("Unexpected dump contribution output.",
+              sb.equals("########\n# test #\n########\n\nservice.pid:\ttest\nservice.key:\tvalue\n\n\n") 
+           || sb.equals("########\n# test #\n########\n\nservice.key:\tvalue\nservice.pid:\ttest\n\n\n")
+              );
+	}
+
+    private static String getFileAsString(File dumpFile) throws IOException {
+        StringBuilder sb = new StringBuilder();
+        BufferedReader in = null;
+        try {
+            in = new BufferedReader(new FileReader(dumpFile));
+            while (in.ready())
+                sb.append(in.readLine()).append("\n");
+        } finally {
+            closeQuietly(in);
+        }
+        return sb.toString();
+    }
+	
+	private static void assertWriterClosed(Writer writer) {
+	    try {
+	        writer.flush();
+	        fail("Writer not already flushed, therefore not already closed.");
+	    } catch (IOException expectedAndIgnored) {
+	    }
+	}
+}
\ No newline at end of file
diff --git a/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/config/internal/ConfigurationPublisherTests.java b/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/config/internal/ConfigurationPublisherTests.java
new file mode 100644
index 0000000..3efb93c
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/config/internal/ConfigurationPublisherTests.java
@@ -0,0 +1,190 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.config.internal;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.TreeMap;
+
+import org.eclipse.virgo.test.stubs.service.cm.StubConfigurationAdmin;
+import org.junit.Test;
+import org.osgi.service.cm.Configuration;
+
+/**
+ */
+public class ConfigurationPublisherTests {
+
+    @Test
+    public void testSingleSource() throws IOException {
+        StubPropertiesSource source = new StubPropertiesSource();
+
+        String pid = "single";
+
+        Properties p = new Properties();
+        p.setProperty("foo", "bar");
+
+        source.configurationProperties.put(pid, p);
+
+        StubConfigurationAdmin configAdmin = new StubConfigurationAdmin();
+
+        ConfigurationPublisher publisher = new ConfigurationPublisher(configAdmin, source);
+        publisher.publishConfigurations();
+
+        Configuration configuration = configAdmin.getConfiguration(pid, null);
+        assertConfigurationEquals(configuration, p);
+
+    }
+
+    @Test
+    public void testTwoSources() throws Exception {
+        StubPropertiesSource one = new StubPropertiesSource();
+        StubPropertiesSource two = new StubPropertiesSource();
+
+        // setup one
+        String pidOne = "one";
+
+        Properties propertiesOne = new Properties();
+        propertiesOne.setProperty("foo", "bar");
+
+        one.configurationProperties.put(pidOne, propertiesOne);
+
+        // setup two
+        String pidTwo = "two";
+
+        Properties propertiesTwo = new Properties();
+        propertiesTwo.setProperty("bar", "baz");
+
+        two.configurationProperties.put(pidTwo, propertiesTwo);
+
+        StubConfigurationAdmin configAdmin = new StubConfigurationAdmin();
+
+        ConfigurationPublisher publisher = new ConfigurationPublisher(configAdmin, one, two);
+        publisher.publishConfigurations();
+
+        Configuration configuration = configAdmin.getConfiguration(pidOne, null);
+        assertConfigurationEquals(configuration, propertiesOne);
+
+        configuration = configAdmin.getConfiguration(pidTwo, null);
+        assertConfigurationEquals(configuration, propertiesTwo);
+
+    }
+
+    @Test
+    public void testMultiSourceMerge() throws Exception {
+        StubPropertiesSource one = new StubPropertiesSource();
+        StubPropertiesSource two = new StubPropertiesSource();
+
+        // setup one
+        String pidOne = "one";
+
+        Properties propertiesOne = new Properties();
+        propertiesOne.setProperty("foo", "bar");
+        propertiesOne.setProperty("bar", "baz");
+
+        one.configurationProperties.put(pidOne, propertiesOne);
+
+        // setup two
+        String pidTwo = pidOne;
+
+        Properties propertiesTwo = new Properties();
+        propertiesTwo.setProperty("bat", "boo");
+        propertiesTwo.setProperty("boo", "bof");
+
+        two.configurationProperties.put(pidTwo, propertiesTwo);
+
+        StubConfigurationAdmin configAdmin = new StubConfigurationAdmin();
+
+        ConfigurationPublisher publisher = new ConfigurationPublisher(configAdmin, one, two);
+        publisher.publishConfigurations();
+
+        Configuration configuration = configAdmin.getConfiguration(pidOne, null);
+
+        assertEquals("bar", configuration.getProperties().get("foo"));
+        assertEquals("baz", configuration.getProperties().get("bar"));
+        assertEquals("boo", configuration.getProperties().get("bat"));
+        assertEquals("bof", configuration.getProperties().get("boo"));
+    }
+
+    @Test
+    public void testPublicationIncludingFactoryConfigurations() throws Exception {
+        File[] dirs = new File[] { new File("src/test/resources/UserConfigurationPropertiesSourceTests")};
+
+        UserConfigurationPropertiesSource source = new UserConfigurationPropertiesSource(dirs);
+
+        StubConfigurationAdmin configAdmin = new StubConfigurationAdmin();
+
+        ConfigurationPublisher publisher = new ConfigurationPublisher(configAdmin, source);
+        publisher.publishConfigurations();
+
+        // make sure nothing broke on the way here and file name based pids still work
+        Configuration three = configAdmin.getConfiguration("three", null);
+        assertConfigurationEquals(three, source.getConfigurationProperties().get("three"));
+
+        // check on factories
+        List<Configuration> factories = new ArrayList<Configuration>();
+        Configuration[] all = configAdmin.listConfigurations(null);
+        for (Configuration c : all) {
+            if ("one".equals(c.getFactoryPid())) {
+                factories.add(c);
+            }
+        }
+
+        assertEquals(1, factories.size());
+    }
+    
+    @Test
+    public void testSingleSourceBadConfiguration() throws IOException {
+        StubPropertiesSource source = new StubPropertiesSource();
+
+        String pid = "single";
+
+        Properties p = new Properties();
+        p.setProperty("foo", "bar");
+        p.setProperty("FOO", "barbar");
+
+        source.configurationProperties.put(pid, p);
+
+        StubConfigurationAdmin configAdmin = new StubConfigurationAdmin();
+
+        ConfigurationPublisher publisher = new ConfigurationPublisher(configAdmin, source);
+        publisher.publishConfigurations();
+
+        Configuration configuration = configAdmin.getConfiguration(pid, null);
+        assertEquals(4, configuration.getProperties().size());
+
+    }
+
+    private void assertConfigurationEquals(Configuration configuration, Properties properties) {
+        for (String s : properties.stringPropertyNames()) {
+            assertEquals(properties.getProperty(s), configuration.getProperties().get(s));
+        }
+    }
+
+    private static class StubPropertiesSource implements PropertiesSource {
+
+        private final Map<String, Properties> configurationProperties = new TreeMap<String, Properties>();
+
+        /**
+         * {@inheritDoc}
+         */
+        public Map<String, Properties> getConfigurationProperties() {
+            return this.configurationProperties;
+        }
+
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/config/internal/KernelConfigurationPropertiesSourceTests.java b/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/config/internal/KernelConfigurationPropertiesSourceTests.java
new file mode 100644
index 0000000..772d6d2
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/config/internal/KernelConfigurationPropertiesSourceTests.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.config.internal;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.util.Map;
+import java.util.Properties;
+
+import org.junit.Test;
+
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+
+/**
+ */
+public class KernelConfigurationPropertiesSourceTests {
+
+    @Test
+    public void testGetProperties() {
+        StubBundleContext context = new StubBundleContext();
+        context.addProperty(KernelConfiguration.PROPERTY_KERNEL_HOME, "build/home");
+        
+        KernelConfiguration configuration = new KernelConfiguration(context);
+        
+        KernelConfigurationPropertiesSource source = new KernelConfigurationPropertiesSource(configuration);
+        
+        Map<String, Properties> configurationProperties = source.getConfigurationProperties();
+        Properties properties = configurationProperties.get(KernelConfigurationPropertiesSource.KERNEL_CONFIGURATION_PID);
+        assertNotNull(properties);
+        assertEquals(configuration.getDomain(), properties.getProperty(KernelConfigurationPropertiesSource.PROPERTY_DOMAIN));
+        assertEquals(configuration.getHomeDirectory().getAbsolutePath(), properties.getProperty(KernelConfigurationPropertiesSource.PROPERTY_HOME_DIRECTORY));
+        assertEquals(configuration.getWorkDirectory().getAbsolutePath(), properties.getProperty(KernelConfigurationPropertiesSource.PROPERTY_WORK_DIRECTORY));
+        assertEquals(Integer.toString(configuration.getStartupWaitLimit()), properties.getProperty(KernelConfigurationPropertiesSource.PROPERTY_KERNEL_STARTUP_WAIT_LIMIT));
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/config/internal/KernelConfigurationTests.java b/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/config/internal/KernelConfigurationTests.java
new file mode 100644
index 0000000..cb7aa46
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/config/internal/KernelConfigurationTests.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.config.internal;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.io.File;
+
+import org.junit.Test;
+
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+
+
+/**
+ */
+public class KernelConfigurationTests {
+
+    @Test
+    public void testCreateMinimalKernelConfiguration() {
+        StubBundleContext context = new StubBundleContext();
+        context.addProperty(KernelConfiguration.PROPERTY_KERNEL_HOME, "build");
+        
+        KernelConfiguration configuration = new KernelConfiguration(context);
+        assertEquals(new File("build"), configuration.getHomeDirectory());
+        assertNotNull(configuration.getWorkDirectory());
+        assertNotNull(configuration.getConfigDirectories());
+        assertEquals(1, configuration.getConfigDirectories().length);
+        assertNotNull(configuration.getDomain());
+        assertNotNull(configuration.getStartupWaitLimit());
+    }
+    
+    @Test
+    public void testCustomConfiguration() {
+        StubBundleContext context = new StubBundleContext();
+        context.addProperty(KernelConfiguration.PROPERTY_KERNEL_HOME, "build");
+        context.addProperty(KernelConfiguration.PROPERTY_KERNEL_DOMAIN, "my.domain");
+        context.addProperty(KernelConfiguration.PROPERTY_KERNEL_CONFIG, "foo,bar");
+        context.addProperty(KernelConfiguration.PROPERTY_KERNEL_STARTUP_WAIT_LIMIT, "60");
+        
+        KernelConfiguration configuration = new KernelConfiguration(context);
+        assertEquals(new File("build"), configuration.getHomeDirectory());
+        assertNotNull(configuration.getWorkDirectory());
+        assertNotNull(configuration.getConfigDirectories());
+        assertEquals(2, configuration.getConfigDirectories().length);
+        assertEquals("my.domain", configuration.getDomain());
+        assertEquals(60, configuration.getStartupWaitLimit());
+    }
+    
+    @Test(expected=IllegalStateException.class)
+    public void testMissingKernelHomeProperty() {
+        new KernelConfiguration(new StubBundleContext());
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/config/internal/UserConfigurationPropertiesSourceTests.java b/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/config/internal/UserConfigurationPropertiesSourceTests.java
new file mode 100644
index 0000000..cedb3b2
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/config/internal/UserConfigurationPropertiesSourceTests.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.config.internal;
+
+import java.io.File;
+import java.util.Map;
+import java.util.Properties;
+
+import org.eclipse.virgo.nano.config.internal.UserConfigurationPropertiesSource;
+import org.junit.Test;
+
+
+import static org.junit.Assert.*;
+
+
+/**
+ */
+public class UserConfigurationPropertiesSourceTests {
+
+    @Test
+    public void testReadUserConfiguration() {
+        File[] dirs = new File[]{
+            new File("src/test/resources/" + getClass().getSimpleName())
+        };
+        
+        UserConfigurationPropertiesSource source = new UserConfigurationPropertiesSource(dirs);
+        Map<String, Properties> properties = source.getConfigurationProperties();
+        
+        Properties one = properties.get("one");
+        Properties two = properties.get("two");
+        Properties three = properties.get("three");
+        assertNotNull(one);
+        assertNotNull(two);
+        assertNotNull(three);
+        assertEquals("bar", one.getProperty("baz"));
+        assertEquals("baz", two.getProperty("foo"));
+        assertEquals("three", three.getProperty("foo"));
+    }
+    
+    @Test
+    public void testReadFactoryUserConfiguration() {
+        File[] dirs = new File[]{
+            new File("src/test/resources/" + getClass().getSimpleName())
+        };
+        
+        UserConfigurationPropertiesSource source = new UserConfigurationPropertiesSource(dirs);
+        Map<String, Properties> properties = source.getConfigurationProperties();
+        
+        assertEquals(5, properties.size());
+        
+        Properties one = properties.get("factory.pid-factoryOne");
+        Properties two = properties.get("factory.pid-factoryTwo");
+        
+        assertNotNull(one);
+        assertNotNull(two);
+        assertEquals("one", one.getProperty("foo"));
+        assertEquals("two", two.getProperty("foo"));
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/config/internal/commandline/CommandLinePropertiesSourceTests.java b/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/config/internal/commandline/CommandLinePropertiesSourceTests.java
new file mode 100644
index 0000000..c65ac55
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/config/internal/commandline/CommandLinePropertiesSourceTests.java
@@ -0,0 +1,120 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.config.internal.commandline;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import org.junit.Test;
+
+
+import org.eclipse.virgo.nano.config.internal.PropertiesSource;
+import org.eclipse.virgo.nano.config.internal.commandline.CommandLinePropertiesSource;
+import org.eclipse.virgo.medic.test.eventlog.LoggedEvent;
+import org.eclipse.virgo.medic.test.eventlog.MockEventLogger;
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+
+public class CommandLinePropertiesSourceTests {
+	
+	private StubBundleContext bundleContext = new StubBundleContext();
+	
+	private MockEventLogger eventLogger = new MockEventLogger();
+	
+	@Test
+	public void defaults() {
+		PropertiesSource propertiesSource = new CommandLinePropertiesSource(this.bundleContext, this.eventLogger);
+		Map<String, Properties> configurationProperties = propertiesSource.getConfigurationProperties();
+		
+		Properties properties = configurationProperties.get("org.eclipse.virgo.kernel.userregion");
+		assertEquals(null, properties);
+		
+		assertEquals(0, this.eventLogger.getLoggedEvents().size());
+	}
+	
+	@Test
+	public void singlePlanWithVersion() {
+		this.bundleContext.addProperty("eclipse.commands", "-plan\nfoo\n1");
+		PropertiesSource propertiesSource = new CommandLinePropertiesSource(this.bundleContext, this.eventLogger);
+		Map<String, Properties> configurationProperties = propertiesSource.getConfigurationProperties();
+		
+		Properties properties = configurationProperties.get("org.eclipse.virgo.kernel.userregion");
+		assertNotNull(properties);
+		
+		assertEquals("repository:plan/foo/1", properties.get("commandLineArtifacts"));
+		
+		assertEquals(0, this.eventLogger.getLoggedEvents().size());
+	}
+	
+	@Test
+	public void singlePlanWithoutVersion() {
+		this.bundleContext.addProperty("eclipse.commands", "-plan\nfoo");
+		PropertiesSource propertiesSource = new CommandLinePropertiesSource(this.bundleContext, this.eventLogger);
+		Map<String, Properties> configurationProperties = propertiesSource.getConfigurationProperties();
+		
+		Properties properties = configurationProperties.get("org.eclipse.virgo.kernel.userregion");
+		assertNotNull(properties);
+		
+		assertEquals("repository:plan/foo", properties.get("commandLineArtifacts"));
+		
+		assertEquals(0, this.eventLogger.getLoggedEvents().size());
+	}
+	
+	@Test
+	public void multiplePlans() {
+		this.bundleContext.addProperty("eclipse.commands", "-plan\nfoo\n-plan\nbar\n1.2.3");
+		PropertiesSource propertiesSource = new CommandLinePropertiesSource(this.bundleContext, this.eventLogger);
+		Map<String, Properties> configurationProperties = propertiesSource.getConfigurationProperties();
+		
+		Properties properties = configurationProperties.get("org.eclipse.virgo.kernel.userregion");
+		assertNotNull(properties);
+		
+		assertEquals("repository:plan/foo,repository:plan/bar/1.2.3", properties.get("commandLineArtifacts"));
+		
+		assertEquals(0, this.eventLogger.getLoggedEvents().size());
+	}
+	
+	@Test
+	public void planWithMissingArguments() {
+		this.bundleContext.addProperty("eclipse.commands", "-plan");
+		PropertiesSource propertiesSource = new CommandLinePropertiesSource(this.bundleContext, this.eventLogger);
+		Map<String, Properties> configurationProperties = propertiesSource.getConfigurationProperties();
+		
+		Properties properties = configurationProperties.get("org.eclipse.virgo.kernel.userregion");
+		assertEquals(null, properties);
+		
+		List<LoggedEvent> loggedEvents = this.eventLogger.getLoggedEvents();
+		assertEquals(1, loggedEvents.size());
+		
+		assertArrayEquals(new Object[] {0, ""}, loggedEvents.get(0).getInserts());
+	}
+	
+	@Test
+	public void planWithSurplusArguments() {
+		this.bundleContext.addProperty("eclipse.commands", "-plan\nfoo\nbar\n1.2.3");
+		PropertiesSource propertiesSource = new CommandLinePropertiesSource(this.bundleContext, this.eventLogger);
+		Map<String, Properties> configurationProperties = propertiesSource.getConfigurationProperties();
+		
+		Properties properties = configurationProperties.get("org.eclipse.virgo.kernel.userregion");
+		assertEquals(null, properties);
+		
+		List<LoggedEvent> loggedEvents = this.eventLogger.getLoggedEvents();
+		assertEquals(1, loggedEvents.size());
+		
+		assertArrayEquals(new Object[] {3, "foo, bar, 1.2.3"}, loggedEvents.get(0).getInserts());
+	}
+
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/config/internal/ovf/OvfEnvironmentPropertiesReaderTests.java b/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/config/internal/ovf/OvfEnvironmentPropertiesReaderTests.java
new file mode 100644
index 0000000..d8b6b4a
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/config/internal/ovf/OvfEnvironmentPropertiesReaderTests.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.config.internal.ovf;
+
+import java.io.FileReader;
+import java.util.Properties;
+
+import org.eclipse.virgo.nano.config.internal.ovf.OvfEnvironmentPropertiesReader;
+import org.junit.Test;
+
+
+import static org.junit.Assert.*;
+
+
+/**
+ */
+public class OvfEnvironmentPropertiesReaderTests {
+
+    @Test
+    public void testReadProperties() throws Exception {
+        
+        OvfEnvironmentPropertiesReader reader = new OvfEnvironmentPropertiesReader();
+        Properties props = reader.readProperties(new FileReader("src/test/resources/ovf/environment.xml"));
+        assertEquals("bar", props.getProperty("com.myapp.foo"));
+        assertEquals("baz", props.getProperty("com.myapp.bar"));
+        
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/config/internal/ovf/OvfPropertiesSourceTests.java b/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/config/internal/ovf/OvfPropertiesSourceTests.java
new file mode 100644
index 0000000..d60a06c
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/config/internal/ovf/OvfPropertiesSourceTests.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.config.internal.ovf;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import org.junit.Test;
+
+import org.eclipse.virgo.nano.config.internal.ovf.OvfPropertiesSource;
+import org.eclipse.virgo.nano.diagnostics.KernelLogEvents;
+import org.eclipse.virgo.medic.test.eventlog.LoggedEvent;
+import org.eclipse.virgo.medic.test.eventlog.MockEventLogger;
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+
+/**
+ */
+public class OvfPropertiesSourceTests {
+
+    @Test
+    public void testReadValidFile() {
+        MockEventLogger logger = new MockEventLogger();
+
+        StubBundleContext context = new StubBundleContext();
+        context.addProperty(OvfPropertiesSource.FRAMEWORK_PROPERTY_OVF, "src/test/resources/ovf/valid.xml");
+
+        OvfPropertiesSource source = new OvfPropertiesSource(context, logger);
+        Map<String, Properties> properties = source.getConfigurationProperties();
+        assertNotNull(properties);
+
+        Properties one = properties.get("one");
+        assertNotNull(one);
+        assertEquals("bar", one.getProperty("foo"));
+        assertEquals("baz", one.getProperty("bar"));
+
+        Properties two = properties.get("two");
+        assertNotNull(two);
+        assertEquals("quux", two.getProperty("baz"));
+
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testReadFileWithInvalidProperty() {
+        MockEventLogger logger = new MockEventLogger();
+
+        StubBundleContext context = new StubBundleContext();
+        context.addProperty(OvfPropertiesSource.FRAMEWORK_PROPERTY_OVF, "src/test/resources/ovf/invalid.xml");
+
+        OvfPropertiesSource source = new OvfPropertiesSource(context, logger);
+        source.getConfigurationProperties();
+    }
+
+    @Test
+    public void testReadNonExistentFile() {
+        MockEventLogger logger = new MockEventLogger();
+
+        StubBundleContext context = new StubBundleContext();
+        context.addProperty(OvfPropertiesSource.FRAMEWORK_PROPERTY_OVF, "src/test/resources/ovf/nonexistent.xml");
+
+        OvfPropertiesSource source = new OvfPropertiesSource(context, logger);
+        source.getConfigurationProperties();
+
+        List<LoggedEvent> loggedEvents = logger.getLoggedEvents();
+        assertEquals(1, loggedEvents.size());
+
+        LoggedEvent loggedEvent = loggedEvents.get(0);
+        assertEquals(KernelLogEvents.OVF_CONFIGURATION_FILE_DOES_NOT_EXIST.getEventCode(), loggedEvent.getCode());
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/core/BlockingSignalTests.java b/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/core/BlockingSignalTests.java
new file mode 100644
index 0000000..4337c3d
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/core/BlockingSignalTests.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright (c) 2010 Olivier Girardot
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Olivier Girardot - initial contribution
+ */
+
+package org.eclipse.virgo.nano.core;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.util.Vector;
+import java.util.concurrent.TimeUnit;
+
+import org.junit.Test;
+
+/**
+ * This class is for testing the {@link Signal} implementation {@link BlockingSignal}.
+ *
+ */
+public final class BlockingSignalTests {
+	
+	@Test
+	public void signalCompletionAfterNoFailure() throws Throwable {
+		final BlockingSignal signal = new BlockingSignal();
+		ExceptionCatcherThread testThread = new ExceptionCatcherThread(new Runnable(){
+			public void run() {
+				try {
+					// awaiting for signal completion flag
+					boolean returnSignal = 
+						signal.awaitCompletion(1000, TimeUnit.SECONDS);
+					assertTrue(returnSignal);
+				} catch (FailureSignalledException e) {
+					// this code should not be reached
+					fail();
+				}
+			}
+		});
+		testThread.start();
+		signal.signalSuccessfulCompletion();
+        testThread.join(10);
+        assertFalse("Test thread still alive after delay.", testThread.isAlive());
+		testThread.rethrowUncaughtExceptions();
+	}
+	
+	@Test
+	public void signalCompletionFailsAfterWaitingExceeded() throws Throwable {
+		final BlockingSignal signal = new BlockingSignal();
+		ExceptionCatcherThread testThread = new ExceptionCatcherThread(new Runnable(){
+			public void run() {
+				try {
+					// awaiting for signal completion flag
+					boolean returnSignal = 
+						signal.awaitCompletion(1, TimeUnit.MILLISECONDS);
+					assertFalse(returnSignal);
+				} catch (FailureSignalledException e) {
+					// this code should not be reached
+					fail();
+				}
+			}
+		});
+		testThread.start();
+		Thread.sleep(100);
+		signal.signalSuccessfulCompletion();
+		testThread.join(10);
+		assertFalse("Test thread still alive after delay.", testThread.isAlive());
+		testThread.rethrowUncaughtExceptions();
+	}
+	
+	@Test
+	public void signalCompletionFailsAfterFailureNotifiedToSignal() throws Throwable {
+		final BlockingSignal signal = new BlockingSignal();
+		final Throwable dummyEx = new Exception("Dummy cause");
+		ExceptionCatcherThread testThread = new ExceptionCatcherThread(new Runnable(){
+			public void run() {
+				try {
+					// awaiting for signal completion flag (not storing result, as the code should fail)
+					signal.awaitCompletion(1, TimeUnit.SECONDS);
+					
+					// this code should not be reached
+					// an exception being sent before
+					fail();
+				} catch (FailureSignalledException e) {
+					// We'll check that we actually refer to the correct cause
+					assertSame("Signal failure has incorrect cause.", dummyEx, e.getCause());
+				}
+			}
+		});
+		testThread.start();
+		signal.signalFailure(dummyEx);
+        testThread.join(10);
+        assertFalse("Test thread still alive after delay.", testThread.isAlive());
+		testThread.rethrowUncaughtExceptions();
+	}
+
+	/**
+	 * Special thread designed to record uncaught exceptions
+	 * and re-throw the first of them on demand.
+	 */
+	private class ExceptionCatcherThread extends Thread{
+		private final Vector<Throwable> uncaughtExceptions = new Vector<Throwable>();
+		
+		public ExceptionCatcherThread(Runnable r) {
+			super(r);
+			this.setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
+				public void uncaughtException(Thread t, Throwable e) {
+					uncaughtExceptions.add(e);
+				}
+			});
+		}
+		
+		public void rethrowUncaughtExceptions() throws Throwable {
+			if (!uncaughtExceptions.isEmpty())
+				throw uncaughtExceptions.firstElement();
+		}
+	}
+}
\ No newline at end of file
diff --git a/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/core/internal/BundleStartTrackerTests.java b/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/core/internal/BundleStartTrackerTests.java
new file mode 100644
index 0000000..a5fc55d
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/core/internal/BundleStartTrackerTests.java
@@ -0,0 +1,344 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.core.internal;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.List;
+
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleEvent;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.BundleListener;
+import org.osgi.service.event.Event;
+
+import org.eclipse.virgo.nano.core.AbortableSignal;
+import org.eclipse.virgo.nano.core.internal.BundleStartTracker;
+import org.eclipse.virgo.test.stubs.framework.StubBundle;
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+
+
+/**
+ */
+public class BundleStartTrackerTests {
+    
+    @Test
+    public void startOfBundleThatIsNotPoweredBySpringDm() throws BundleException {
+        StubBundleContext bundleContext = new StubBundleContext();
+        StubBundle bundle = new StubBundle();
+        bundle.setBundleContext(bundleContext);
+        
+        BundleStartTracker bundleStartTracker = new BundleStartTracker(new SyncTaskExecutor());
+        bundleStartTracker.initialize(bundleContext);
+        
+        UnitTestSignal signal = new UnitTestSignal();
+        
+        bundleStartTracker.trackStart(bundle, signal);
+        bundle.start();
+        
+        assertEquals(1, signal.successCount);
+        assertEquals(0, signal.abortCount);
+        assertEquals(0, signal.failures.size());
+        
+        assertEquals(Bundle.ACTIVE, bundle.getState());
+    }
+    
+    @Test
+    public void startOfBundleThatIsPoweredBySpringDm() throws BundleException {
+        StubBundleContext bundleContext = new StubBundleContext();
+        StubBundle bundle = new StubBundle();
+        bundle.addHeader("Spring-Context", "foo");
+        
+        BundleStartTracker bundleStartTracker = new BundleStartTracker(new SyncTaskExecutor());
+        bundleStartTracker.initialize(bundleContext);
+        
+        UnitTestSignal signal = new UnitTestSignal();
+        
+        bundleStartTracker.trackStart(bundle, signal);
+        
+        assertEquals(0, signal.successCount);
+        assertEquals(0, signal.failures.size());
+        
+        bundle.start();
+        
+        Dictionary<String, Object> properties = new Hashtable<String, Object>();
+        properties.put("bundle", bundle);
+        
+        bundleStartTracker.handleEvent(new Event("org/osgi/service/blueprint/container/CREATED", properties));
+        
+        assertEquals(1, signal.successCount);
+        assertEquals(0, signal.abortCount);
+        assertEquals(0, signal.failures.size());
+    }
+    
+    @Test
+    public void startOfLazyActivationBundle() throws BundleException {
+        StubBundleContext bundleContext = new StubBundleContext();
+        StubBundle bundle = new StubBundle();
+        bundle.addHeader("Bundle-ActivationPolicy", "lazy");
+        bundle.setBundleContext(bundleContext);
+        
+        BundleStartTracker bundleStartTracker = new BundleStartTracker(new SyncTaskExecutor());
+        bundleStartTracker.initialize(bundleContext);
+        
+        UnitTestSignal signal = new UnitTestSignal();
+        bundleStartTracker.trackStart(bundle, signal);
+        
+        List<BundleListener> bundleListeners = bundleContext.getBundleListeners();
+        for(BundleListener listener : bundleListeners){
+        	listener.bundleChanged(new BundleEvent(BundleEvent.LAZY_ACTIVATION, bundle));
+        }
+        
+        assertEquals(0, signal.successCount);
+        assertEquals(0, signal.abortCount);
+        assertEquals(0, signal.failures.size());
+        
+        for(BundleListener listener : bundleListeners){
+        	listener.bundleChanged(new BundleEvent(BundleEvent.STOPPED, bundle));
+        }
+
+        assertEquals(0, signal.successCount);
+        assertEquals(1, signal.abortCount);
+        assertEquals(0, signal.failures.size());
+    }
+    
+    @Test
+    public void applicationContextCreationFailureOfBundleThatIsPoweredBySpringDm() throws BundleException {
+        StubBundleContext bundleContext = new StubBundleContext();
+        StubBundle bundle = new StubBundle();
+        bundle.addHeader("Spring-Context", "foo");
+        
+        BundleStartTracker bundleStartTracker = new BundleStartTracker(new SyncTaskExecutor());
+        bundleStartTracker.initialize(bundleContext);
+        
+        UnitTestSignal signal = new UnitTestSignal();
+        
+        bundleStartTracker.trackStart(bundle, signal);
+        
+        assertEquals(0, signal.successCount);
+        assertEquals(0, signal.abortCount);
+        assertEquals(0, signal.failures.size());
+        
+        bundle.start();
+        
+        Dictionary<String, Object> properties = new Hashtable<String, Object>();
+        properties.put("bundle", bundle);
+        Exception failure = new Exception();
+        properties.put("exception", failure);
+        
+        bundleStartTracker.handleEvent(new Event("org/osgi/service/blueprint/container/FAILURE", properties));
+        
+        assertEquals(0, signal.successCount);
+        assertEquals(0, signal.abortCount);
+        assertEquals(1, signal.failures.size());
+        
+        assertTrue(signal.failures.contains(failure));
+    }
+    
+    @Test
+    public void trackingOfSpringDmPoweredBundleThatAlreadyCreatedItsContainer() throws BundleException {
+        StubBundleContext bundleContext = new StubBundleContext();
+        StubBundle bundle = new StubBundle();
+        bundle.addHeader("Spring-Context", "foo");
+        
+        BundleStartTracker bundleStartTracker = new BundleStartTracker(new SyncTaskExecutor());
+        bundleStartTracker.initialize(bundleContext);
+        
+        Dictionary<String, Object> properties = new Hashtable<String, Object>();
+        properties.put("bundle", bundle);
+        
+        bundleStartTracker.handleEvent(new Event("org/osgi/service/blueprint/container/CREATED", properties));
+                
+        UnitTestSignal signal = new UnitTestSignal();
+        
+        bundleStartTracker.trackStart(bundle, signal);
+        
+        assertEquals(1, signal.successCount);
+        assertEquals(0, signal.abortCount);
+        assertEquals(0, signal.failures.size());
+    }
+    
+    @Test
+    public void trackingOfSpringDmPoweredBundleThatHasAlreadyFailedToCreateItsApplicationContext() throws BundleException {
+        StubBundleContext bundleContext = new StubBundleContext();
+        StubBundle bundle = new StubBundle();
+        bundle.addHeader("Spring-Context", "foo");
+        
+        BundleStartTracker bundleStartTracker = new BundleStartTracker(new SyncTaskExecutor());
+        bundleStartTracker.initialize(bundleContext);
+        
+        Dictionary<String, Object> properties = new Hashtable<String, Object>();
+        properties.put("bundle", bundle);
+        Exception failure = new Exception();
+        properties.put("exception", failure);
+        
+        bundleStartTracker.handleEvent(new Event("org/osgi/service/blueprint/container/FAILURE", properties));
+                
+        UnitTestSignal signal = new UnitTestSignal();
+        
+        bundleStartTracker.trackStart(bundle, signal);
+        
+        assertEquals(0, signal.successCount);
+        assertEquals(0, signal.abortCount);
+        assertEquals(1, signal.failures.size());
+        assertTrue(signal.failures.contains(failure));       
+    }
+    
+    @Test
+    public void signalIsOnlyDrivenOnceEvenWithMultipleEventsForStartOfBundleThatIsPoweredBySpringDm() throws BundleException {
+        StubBundleContext bundleContext = new StubBundleContext();
+        StubBundle bundle = new StubBundle();
+        bundle.addHeader("Spring-Context", "foo");
+        
+        BundleStartTracker bundleStartTracker = new BundleStartTracker(new SyncTaskExecutor());
+        bundleStartTracker.initialize(bundleContext);
+        
+        UnitTestSignal signal = new UnitTestSignal();
+        
+        bundleStartTracker.trackStart(bundle, signal);
+        
+        assertEquals(0, signal.successCount);
+        assertEquals(0, signal.abortCount);
+        assertEquals(0, signal.failures.size());
+        
+        Dictionary<String, Object> properties = new Hashtable<String, Object>();
+        properties.put("bundle", bundle);
+        
+        bundleStartTracker.handleEvent(new Event("org/osgi/service/blueprint/container/CREATED", properties));
+        bundleStartTracker.handleEvent(new Event("org/osgi/service/blueprint/container/CREATED", properties));
+        bundleStartTracker.handleEvent(new Event("org/osgi/service/blueprint/container/CREATED", properties));
+        
+        assertEquals(1, signal.successCount);
+        assertEquals(0, signal.abortCount);
+        assertEquals(0, signal.failures.size());
+    }
+    
+    @Test
+    public void signalIsOnlyDrivenOnceEvenWithMultipleEventsForApplicationContextCreationFailureOfBundleThatIsPoweredBySpringDm() throws BundleException {
+        StubBundleContext bundleContext = new StubBundleContext();
+        StubBundle bundle = new StubBundle();
+        bundle.addHeader("Spring-Context", "foo");
+        
+        BundleStartTracker bundleStartTracker = new BundleStartTracker(new SyncTaskExecutor());
+        bundleStartTracker.initialize(bundleContext);
+        
+        UnitTestSignal signal = new UnitTestSignal();
+        
+        bundleStartTracker.trackStart(bundle, signal);
+        
+        assertEquals(0, signal.successCount);
+        assertEquals(0, signal.abortCount);
+        assertEquals(0, signal.failures.size());
+        
+        Dictionary<String, Object> properties = new Hashtable<String, Object>();
+        properties.put("bundle", bundle);
+        Exception failure = new Exception();
+        properties.put("exception", failure);
+        
+        bundleStartTracker.handleEvent(new Event("org/osgi/service/blueprint/container/FAILURE", properties));
+        bundleStartTracker.handleEvent(new Event("org/osgi/service/blueprint/container/FAILURE", properties));
+        bundleStartTracker.handleEvent(new Event("org/osgi/service/blueprint/container/FAILURE", properties));
+        
+        assertEquals(0, signal.successCount);
+        assertEquals(0, signal.abortCount);
+        assertEquals(1, signal.failures.size());
+        
+        assertTrue(signal.failures.contains(failure));
+    }
+    
+    @Test
+    public void createdStateIsCleanedUpWhenBundleIsStopped() throws BundleException {
+        StubBundleContext bundleContext = new StubBundleContext();
+        StubBundle bundle = new StubBundle();
+        bundle.setBundleContext(bundleContext);
+        bundle.addHeader("Spring-Context", "foo");
+        
+        BundleStartTracker bundleStartTracker = new BundleStartTracker(new SyncTaskExecutor());
+        bundleStartTracker.initialize(bundleContext);
+        
+        Dictionary<String, Object> properties = new Hashtable<String, Object>();
+        properties.put("bundle", bundle);
+        
+        bundle.start();        
+        bundleStartTracker.handleEvent(new Event("org/osgi/service/blueprint/container/CREATED", properties));        
+        bundle.stop();
+        
+        UnitTestSignal signal = new UnitTestSignal();
+        
+        bundleStartTracker.trackStart(bundle, signal);
+        
+        assertEquals(0, signal.successCount);
+        assertEquals(0, signal.abortCount);
+        assertEquals(0, signal.failures.size());
+    }
+    
+    @Test
+    public void failureStateIsCleanedUpWhenBundleIsStopped() throws BundleException {
+        StubBundleContext bundleContext = new StubBundleContext();
+        StubBundle bundle = new StubBundle();
+        bundle.setBundleContext(bundleContext);
+        bundle.addHeader("Spring-Context", "foo");
+        
+        BundleStartTracker bundleStartTracker = new BundleStartTracker(new SyncTaskExecutor());
+        bundleStartTracker.initialize(bundleContext);
+        
+        Dictionary<String, Object> properties = new Hashtable<String, Object>();
+        properties.put("bundle", bundle);
+        properties.put("exception", new Exception());
+        
+        bundle.start();        
+        bundleStartTracker.handleEvent(new Event("org/osgi/service/blueprint/container/FAILURE", properties));        
+        bundle.stop();
+        
+        UnitTestSignal signal = new UnitTestSignal();
+        
+        bundleStartTracker.trackStart(bundle, signal);
+        
+        assertEquals(0, signal.successCount);
+        assertEquals(0, signal.abortCount);
+        assertEquals(0, signal.failures.size());
+    }
+    
+    private static final class UnitTestSignal implements AbortableSignal {
+        
+        private final List<Throwable> failures = new ArrayList<Throwable>();
+
+        private int successCount = 0;
+        private int abortCount = 0;
+                
+        /** 
+         * {@inheritDoc}
+         */
+        public void signalFailure(Throwable cause) {            
+            this.failures.add(cause);
+        }
+
+        /** 
+         * {@inheritDoc}
+         */
+        public void signalSuccessfulCompletion() {
+            successCount++;            
+        }
+
+        /** 
+         * {@inheritDoc}
+         */
+		public void signalAborted() {
+			abortCount++;
+		}        
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/core/internal/CoreBundleActivatorTests.java b/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/core/internal/CoreBundleActivatorTests.java
new file mode 100644
index 0000000..564896f
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/core/internal/CoreBundleActivatorTests.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.core.internal;
+
+import static org.easymock.EasyMock.createNiceMock;
+
+import java.io.File;
+
+import org.junit.Test;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.event.EventAdmin;
+
+
+import org.eclipse.osgi.service.resolver.PlatformAdmin;
+import org.eclipse.virgo.test.stubs.service.cm.StubConfigurationAdmin;
+import org.eclipse.virgo.nano.core.Shutdown;
+import org.eclipse.virgo.nano.core.internal.CoreBundleActivator;
+import org.eclipse.virgo.nano.core.internal.StartupTracker;
+import org.eclipse.virgo.medic.dump.DumpGenerator;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.medic.test.eventlog.MockEventLogger;
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+import org.eclipse.virgo.test.stubs.service.component.StubComponentContext;
+import org.eclipse.virgo.test.stubs.service.event.StubEventAdmin;
+
+/**
+ * Test the logic of {@link CoreBundleActivator}
+ * 
+ */
+public class CoreBundleActivatorTests {
+
+    @Test(expected = IllegalStateException.class)
+    public void noConfigService() throws Exception {
+        StubBundleContext bundleContext = new StubBundleContext();
+        StubComponentContext componentContext = new StubComponentContext(bundleContext);
+        bundleContext.addFilter(StartupTracker.APPLICATION_CONTEXT_FILTER, FrameworkUtil.createFilter(StartupTracker.APPLICATION_CONTEXT_FILTER));
+        CoreBundleActivator activator = new TestCoreBundleActivator();
+        activator.activate(componentContext);
+    }
+
+    @Test
+    public void startAndStop() throws Exception {
+        StubBundleContext bundleContext = new StubBundleContext();
+        StubComponentContext componentContext = new StubComponentContext(bundleContext);
+        DumpGenerator dumpGenerator = createNiceMock(DumpGenerator.class);
+        PlatformAdmin platformAdmin = createNiceMock(PlatformAdmin.class);
+        bundleContext.addFilter(StartupTracker.APPLICATION_CONTEXT_FILTER, FrameworkUtil.createFilter(StartupTracker.APPLICATION_CONTEXT_FILTER));
+        bundleContext.registerService(ConfigurationAdmin.class, new StubConfigurationAdmin(), null);
+        bundleContext.registerService(EventLogger.class, new MockEventLogger(), null);
+        bundleContext.registerService(EventAdmin.class, new StubEventAdmin(), null);
+        bundleContext.registerService(DumpGenerator.class, dumpGenerator, null);
+        bundleContext.registerService(PlatformAdmin.class, platformAdmin, null);
+        bundleContext.addProperty("org.eclipse.virgo.kernel.domain", "test");
+        bundleContext.addProperty("org.eclipse.virgo.kernel.home", new File(".").getAbsolutePath());
+
+        CoreBundleActivator activator = new TestCoreBundleActivator();
+        activator.activate(componentContext);
+        activator.deactivate(componentContext);
+    }
+    
+    private static final class TestCoreBundleActivator extends CoreBundleActivator {
+        @Override
+        protected Shutdown createShutdown(BundleContext context, EventLogger eventLogger) {
+            return new Shutdown() {
+                public void immediateShutdown() {                 
+                }
+
+                public void shutdown() {
+                }                
+            };
+        }
+        
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/core/internal/ShutdownManagerTests.java b/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/core/internal/ShutdownManagerTests.java
new file mode 100644
index 0000000..230a871
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/core/internal/ShutdownManagerTests.java
@@ -0,0 +1,135 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.core.internal;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.List;
+
+import org.junit.Test;
+import org.osgi.framework.BundleEvent;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.BundleListener;
+import org.osgi.framework.FrameworkEvent;
+import org.osgi.framework.launch.Framework;
+
+import org.eclipse.virgo.nano.core.internal.ShutdownManager;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.medic.test.eventlog.MockEventLogger;
+import org.eclipse.virgo.test.stubs.framework.StubBundle;
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+
+public class ShutdownManagerTests {
+
+    private final Framework framework = createMock(Framework.class);
+    
+    private final Runtime runtime = Runtime.getRuntime();
+
+    private final MockEventLogger eventLogger = new MockEventLogger();
+
+    private final StubBundle bundle = new StubBundle();
+
+    private final StubBundleContext bundleContext = new StubBundleContext(bundle);
+
+    @Test
+    public void shutdown() throws BundleException, InterruptedException {
+
+        expect(this.framework.getBundleContext()).andReturn(this.bundleContext).anyTimes();
+        this.framework.stop();
+        expect(this.framework.waitForStop(30000)).andReturn(new FrameworkEvent(FrameworkEvent.STOPPED, this.bundle, null));
+
+        replay(this.framework);
+
+        UnitTestShutdownManager shutdownManager = new UnitTestShutdownManager(this.eventLogger, this.framework, this.runtime);
+        shutdownManager.shutdown();
+
+        verify(this.framework);
+        
+        assertTrue(shutdownManager.isExited());
+        assertFalse(shutdownManager.isHalted());
+    }
+
+    @Test
+    public void failedShutdownDrivesImmediateShutdown() throws Exception {
+        expect(this.framework.getBundleContext()).andReturn(this.bundleContext).anyTimes();
+        this.framework.stop();
+        expect(this.framework.waitForStop(30000)).andReturn(new FrameworkEvent(FrameworkEvent.WAIT_TIMEDOUT, this.bundle, null));
+
+        replay(this.framework);
+
+        UnitTestShutdownManager shutdownManager = new UnitTestShutdownManager(this.eventLogger, this.framework, this.runtime);
+        shutdownManager.shutdown();
+
+        verify(this.framework);
+
+        assertTrue(this.eventLogger.isLogged("KE0012E"));
+        assertFalse(shutdownManager.isExited());
+        assertTrue(shutdownManager.isHalted());
+        
+        shutdownManager.removeShutdownHook(); // avoid error messages on the console
+    }
+
+    @Test
+    public void shutdownMessageLogged() {
+        expect(this.framework.getBundleContext()).andReturn(this.bundleContext).anyTimes();
+
+        replay(this.framework);
+        UnitTestShutdownManager shutdownManager = new UnitTestShutdownManager(this.eventLogger, this.framework, this.runtime);
+        verify(this.framework);
+
+        List<BundleListener> bundleListeners = this.bundleContext.getBundleListeners();
+
+        assertEquals(1, bundleListeners.size());
+        bundleListeners.get(0).bundleChanged(new BundleEvent(BundleEvent.STOPPING, this.bundle));
+
+        assertTrue(this.eventLogger.isLogged("KE0010I"));
+        assertFalse(shutdownManager.isExited());
+        assertFalse(shutdownManager.isHalted());
+
+    }
+
+    private static final class UnitTestShutdownManager extends ShutdownManager {
+        
+        private volatile boolean exited = false;
+        
+        private volatile boolean halted = false;
+
+        public UnitTestShutdownManager(EventLogger eventLogger, Framework framework, Runtime runtime) {
+            super(eventLogger, framework, runtime);
+        }
+
+        @Override
+        protected void exitJvm() {
+            this.exited = true;
+        }
+
+        @Override
+        protected void haltJvm(int status) {
+            this.halted = true;
+        }
+        
+        public boolean isExited() {
+            return this.exited;
+        }
+        
+        public boolean isHalted() {
+            return this.halted;
+        }
+    }
+    
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/core/internal/SpringUtilsTests.java b/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/core/internal/SpringUtilsTests.java
new file mode 100644
index 0000000..34d9248
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/core/internal/SpringUtilsTests.java
@@ -0,0 +1,155 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.core.internal;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Dictionary;
+import java.util.Hashtable;
+
+import org.eclipse.virgo.test.stubs.framework.StubBundle;
+import org.junit.Test;
+import org.osgi.framework.Version;
+
+public class SpringUtilsTests {
+
+    @Test
+    public void successfulGetSpringContextHeader() throws Exception {
+        Dictionary<String, String> dict = new Hashtable<String, String>();
+    	dict.put("Spring-Context", "testValue");
+    	dict.put("aHeader", "aValue");
+    	
+    	String result = SpringUtils.getSpringContextHeader(dict);
+    	
+    	assertEquals("testValue", result);
+    }
+
+    @Test
+    public void failedGetSpringContextHeader() {
+    	
+        Dictionary<String, String> dict = new Hashtable<String, String>();
+	    dict.put("aHeader", "aValue");
+	
+	    String result = SpringUtils.getSpringContextHeader(dict);
+	
+	    assertEquals(null, result);
+    }
+    
+    @Test
+    public void successfulGetBundleBlueprintHeader() throws Exception {
+        Dictionary<String, String> dict = new Hashtable<String, String>();
+        dict.put("Bundle-Blueprint", "testValue");
+        dict.put("aHeader", "aValue");
+        
+        String result = SpringUtils.getBundleBlueprintHeader(dict);
+        
+        assertEquals("testValue", result);
+    }
+
+    @Test
+    public void failedGetBundleBlueprintHeader() {
+        
+        Dictionary<String, String> dict = new Hashtable<String, String>();
+        dict.put("aHeader", "aValue");
+    
+        String result = SpringUtils.getBundleBlueprintHeader(dict);
+    
+        assertEquals(null, result);
+    }
+    
+    @Test
+    public void testIsEmptyCheck() {
+        
+        Object[] emptyArray = {};
+        boolean isEmpty = SpringUtils.isArrayEmpty(emptyArray);
+        assertEquals(true, isEmpty);
+        
+        Object[] nonEmptyArray = {"aString"};
+        isEmpty = SpringUtils.isArrayEmpty(nonEmptyArray);
+        assertEquals(false, isEmpty);
+    }
+    
+    @Test
+    public void testGetSpringContextHeaderLocations() {
+        //try single location
+        Dictionary<String, String> dict = new Hashtable<String, String>();
+        dict.put("Spring-Context", "testValue");
+        dict.put("aHeader", "aValue");
+        
+        String[] locations = SpringUtils.getSpringContextHeaderLocations(dict);
+        assertEquals(1, locations.length);
+        assertEquals("testValue", locations[0]);
+        
+        //try with 1+ locations
+        dict = new Hashtable<String, String>();
+        dict.put("Spring-Context", "testValue1,testValue2");
+        dict.put("aHeader", "aValue");
+        
+        locations = SpringUtils.getSpringContextHeaderLocations(dict);
+        assertEquals(2, locations.length);
+        assertEquals("testValue1", locations[0]);
+        assertEquals("testValue2", locations[1]);
+    }
+    
+    @Test
+    public void testGetBundleBlueprintHeaderLocations() {
+        //try single location
+        Dictionary<String, String> dict = new Hashtable<String, String>();
+        dict.put("Bundle-Blueprint", "testValue");
+        dict.put("aHeader", "aValue");
+
+        String[] locations = SpringUtils.getSpringContextHeaderLocations(dict);
+        assertEquals(1, locations.length);
+        assertEquals("testValue", locations[0]);
+        
+        //try with 1+ locations
+        dict = new Hashtable<String, String>();
+        dict.put("Bundle-Blueprint", "testValue1,testValue2");
+        dict.put("aHeader", "aValue");
+        
+        locations = SpringUtils.getSpringContextHeaderLocations(dict);
+        assertEquals(2, locations.length);
+        assertEquals("testValue1", locations[0]);
+        assertEquals("testValue2", locations[1]);
+    }
+
+    
+    @Test
+    public void testIsSpringPoweredBundle() {
+        StubBundle bundle = new StubBundle("org.eclipse.virgo.nano.startuptest", new Version(1,0,0));
+        bundle.addHeader("Spring-Context", "testLocation");
+        
+        boolean isSpringDMPowered = SpringUtils.isSpringDMPoweredBundle(bundle);
+        assertTrue(isSpringDMPowered);
+    }
+
+    @Test
+    public void testIsBlueprintBundleSpringPoweredBundle() {
+        StubBundle bundle = new StubBundle("org.eclipse.virgo.nano.startuptest", new Version(1,0,0));
+        bundle.addHeader("Bundle-Blueprint", "testLocation");
+        
+        boolean isSpringDMPowered = SpringUtils.isSpringDMPoweredBundle(bundle);
+        assertTrue(isSpringDMPowered);
+    }
+    
+    @Test
+    public void testIsBlueprintDisabledBundleNotSpringPoweredBundle() {
+        StubBundle bundle = new StubBundle("org.eclipse.virgo.nano.startuptest", new Version(1,0,0));
+        bundle.addHeader("Bundle-Blueprint", "");
+        
+        boolean isSpringDMPowered = SpringUtils.isSpringDMPoweredBundle(bundle);
+        assertFalse(isSpringDMPowered);
+    }
+   
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/core/internal/StartupTrackerTests.java b/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/core/internal/StartupTrackerTests.java
new file mode 100644
index 0000000..7c6b089
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/core/internal/StartupTrackerTests.java
@@ -0,0 +1,186 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.core.internal;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.lang.management.ManagementFactory;
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.Map;
+
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+
+import org.eclipse.virgo.medic.dump.DumpGenerator;
+import org.eclipse.virgo.nano.config.internal.KernelConfiguration;
+import org.eclipse.virgo.nano.core.Shutdown;
+import org.eclipse.virgo.test.stubs.framework.StubBundle;
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+import org.eclipse.virgo.test.stubs.service.event.StubEventAdmin;
+import org.eclipse.virgo.test.stubs.support.ObjectClassFilter;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Version;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+
+public class StartupTrackerTests {
+
+    private final StubBundleContext bundleContext = new StubBundleContext();
+
+    private final StubEventAdmin eventAdmin = new StubEventAdmin();
+    
+    private final StubBundle bundle = new StubBundle("org.eclipse.virgo.kernel.startuptest", new Version(1,0,0));
+    
+    private final Shutdown shutdown = createMock(Shutdown.class);
+    
+    private final DumpGenerator dumpGenerator = createMock(DumpGenerator.class);
+    
+    @Before
+    public void setup() {               
+        this.bundleContext.addInstalledBundle(bundle);
+
+        this.bundleContext.addProperty("org.eclipse.virgo.kernel.home", "build");
+        this.bundleContext.addProperty("org.eclipse.virgo.kernel.domain", "the-domain");
+        this.bundleContext.addFilter(new ObjectClassFilter("org.springframework.context.ApplicationContext"));
+        this.bundleContext.registerService(EventAdmin.class.getName(), this.eventAdmin, null);
+        
+        this.bundle.setBundleContext(bundleContext);
+    }
+
+    @Test
+    public void successfulStartup() throws Exception {
+        BundleStartTracker bundleStartTracker = new BundleStartTracker(new SyncTaskExecutor());
+        bundleStartTracker.initialize(this.bundleContext);
+        
+		StartupTracker tracker = new StartupTracker(this.bundleContext, new KernelConfiguration(this.bundleContext), 30, bundleStartTracker, this.shutdown, this.dumpGenerator);
+        tracker.start();
+
+        assertTrue(this.eventAdmin.awaitPostingOfEvent(new Event("org/eclipse/virgo/kernel/STARTING", (Map<String, ?>)null), 10000));
+        
+        this.bundle.start();
+        
+        assertTrue(this.eventAdmin.awaitPostingOfEvent(new Event("org/eclipse/virgo/kernel/STARTED", (Map<String, ?>)null), 10000));
+
+        tracker.stop();
+    }
+
+    @Test
+    public void startupTimeout() {
+    	
+        BundleStartTracker bundleStartTracker = new BundleStartTracker(new SyncTaskExecutor());
+        bundleStartTracker.initialize(this.bundleContext);
+        
+        this.bundle.addHeader("Spring-Context", "foo");
+        
+        this.shutdown.immediateShutdown();
+        this.dumpGenerator.generateDump("startupTimedOut");
+        
+        replay(this.shutdown, this.dumpGenerator);
+
+        StartupTracker tracker = new StartupTracker(this.bundleContext, new KernelConfiguration(this.bundleContext), 1, bundleStartTracker, this.shutdown, this.dumpGenerator);
+        tracker.start();
+
+        assertTrue(this.eventAdmin.awaitPostingOfEvent(new Event("org/eclipse/virgo/kernel/STARTING", (Map<String, ?>)null), 10000));
+        assertTrue(this.eventAdmin.awaitPostingOfEvent(new Event("org/eclipse/virgo/kernel/START_TIMED_OUT", (Map<String, ?>)null), 10000));
+
+        waitForABit(500);
+        
+        tracker.stop();
+        
+        verify(this.shutdown);
+        verify(this.dumpGenerator);
+    }
+
+    /**
+     * This method is used to allow actions taken after the events are posted to complete
+     * before making test verification checks. This is an artifact of the testing environment, and the waits
+     * should be no more than about 500 ms.
+     * @param milliSeconds time to wait
+     */
+    private void waitForABit(long milliSeconds) {
+        try {
+            Thread.sleep(milliSeconds);
+        } catch (InterruptedException ignored) {
+        }
+    }
+    
+    @Test
+    public void startupFailed() throws InterruptedException {
+        BundleStartTracker bundleStartTracker = new BundleStartTracker(new SyncTaskExecutor());
+        bundleStartTracker.initialize(this.bundleContext);
+        
+        this.bundle.addHeader("Spring-Context", "foo");
+        
+        this.shutdown.immediateShutdown();
+
+        Exception failure = new Exception();
+        this.dumpGenerator.generateDump("startupFailed", failure);
+        
+        replay(this.shutdown, this.dumpGenerator);
+
+		StartupTracker tracker = new StartupTracker(this.bundleContext, new KernelConfiguration(this.bundleContext), 1, bundleStartTracker, this.shutdown, this.dumpGenerator);
+        tracker.start();
+
+        assertTrue(this.eventAdmin.awaitPostingOfEvent(new Event("org/eclipse/virgo/kernel/STARTING", (Map<String, ?>)null), 10000));
+        
+        Dictionary<String, Object> properties = new Hashtable<String, Object>();
+        properties.put("bundle", bundle);
+        properties.put("exception", failure);
+        
+        bundleStartTracker.handleEvent(new Event("org/osgi/service/blueprint/container/FAILURE", properties));
+        
+        assertTrue(this.eventAdmin.awaitPostingOfEvent(new Event("org/eclipse/virgo/kernel/START_FAILED", (Map<String, ?>)null), 10000));
+
+        waitForABit(500);
+
+        tracker.stop();
+        
+        verify(this.shutdown, this.dumpGenerator);
+    }
+
+
+    @Test
+    public void statusMBeanRegistration() throws Exception {
+        assertMBeanNotRegistered();
+
+        BundleStartTracker bundleStartTracker = new BundleStartTracker(new SyncTaskExecutor());
+        bundleStartTracker.initialize(this.bundleContext);
+        
+        StartupTracker tracker = new StartupTracker(this.bundleContext, new KernelConfiguration(this.bundleContext), 1, bundleStartTracker, this.shutdown, this.dumpGenerator);
+        tracker.start();
+
+        assertMBeanRegistered();
+
+        tracker.stop();
+
+        assertMBeanNotRegistered();
+    }
+
+    private void assertMBeanRegistered() throws Exception {
+        assertTrue(isMBeanRegistered());
+    }
+
+    private void assertMBeanNotRegistered() throws Exception {
+        assertFalse(isMBeanRegistered());
+    }
+
+    private boolean isMBeanRegistered() throws Exception {
+        MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
+        return mBeanServer.isRegistered(new ObjectName("the-domain", "type", "KernelStatus"));
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/core/internal/SyncTaskExecutor.java b/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/core/internal/SyncTaskExecutor.java
new file mode 100644
index 0000000..cceb079
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/core/internal/SyncTaskExecutor.java
@@ -0,0 +1,103 @@
+package org.eclipse.virgo.nano.core.internal;
+
+import static org.junit.Assert.assertNotNull;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+/**
+ * Dummy implementation of the ExecutorService for testing purposes
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread-safe.
+ */
+class SyncTaskExecutor implements ExecutorService {
+	/**
+	 * Executes the given <code>task</code> synchronously, through direct
+	 * invocation of it's {@link Runnable#run() run()} method.
+	 * @throws IllegalArgumentException if the given <code>task</code> is <code>null</code> 
+	 */
+	@Override
+	public void execute(Runnable task) {
+		assertNotNull("Runnable must not be null", task);
+		task.run();
+	}
+
+    @Override
+    public void shutdown() {
+        // No-op
+    }
+
+    @Override
+    public List<Runnable> shutdownNow() {
+        // No-op
+        return null;
+    }
+
+    @Override
+    public boolean isShutdown() {
+        // No-op
+        return false;
+    }
+
+    @Override
+    public boolean isTerminated() {
+        // No-op
+        return false;
+    }
+
+    @Override
+    public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException {
+        // No-op
+        return false;
+    }
+
+    @Override
+    public <T> Future<T> submit(Callable<T> task) {
+        // No-op
+        return null;
+    }
+
+    @Override
+    public <T> Future<T> submit(Runnable task, T result) {
+        // No-op
+        return null;
+    }
+
+    @Override
+    public Future<?> submit(Runnable task) {
+        // No-op
+        return null;
+    }
+
+    @Override
+    public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException {
+        // No-op
+        return null;
+    }
+
+    @Override
+    public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException {
+        // No-op
+        return null;
+    }
+
+    @Override
+    public <T> T invokeAny(Collection<? extends Callable<T>> tasks) throws InterruptedException, ExecutionException {
+        // No-op
+        return null;
+    }
+
+    @Override
+    public <T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException, ExecutionException,
+        TimeoutException {
+        // No-op
+        return null;
+    }
+}
\ No newline at end of file
diff --git a/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/core/internal/blueprint/ApplicationContextDependencyMonitorTests.java b/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/core/internal/blueprint/ApplicationContextDependencyMonitorTests.java
new file mode 100644
index 0000000..5a9ffff
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/core/internal/blueprint/ApplicationContextDependencyMonitorTests.java
@@ -0,0 +1,266 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.core.internal.blueprint;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+
+import org.junit.Test;
+import org.osgi.framework.Version;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventConstants;
+
+import org.eclipse.virgo.nano.core.internal.blueprint.ApplicationContextDependencyMonitor;
+import org.eclipse.virgo.medic.test.eventlog.LoggedEvent;
+import org.eclipse.virgo.medic.test.eventlog.MockEventLogger;
+import org.eclipse.virgo.test.stubs.framework.StubBundle;
+
+/**
+ */
+public class ApplicationContextDependencyMonitorTests {
+
+    private final MockEventLogger eventLogger = new MockEventLogger();
+
+    private final ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
+
+    private final ApplicationContextDependencyMonitor dependencyMonitor = new ApplicationContextDependencyMonitor(executor, eventLogger);
+
+    private final StubBundle bundle = new StubBundle("the.bundle", new Version(1, 2, 3));
+
+    @Test
+    public void loggingOfWaitingEventForMandatoryService() throws InterruptedException {
+        Event event = new Event("org/osgi/service/blueprint/container/WAITING", createProperties("filter", "theBean", true));
+        this.dependencyMonitor.handleEvent(event);
+
+        Thread.sleep(6000);
+
+        List<LoggedEvent> loggedEvents = this.eventLogger.getLoggedEvents();
+        assertEquals(1, loggedEvents.size());
+
+        LoggedEvent loggedEvent = loggedEvents.get(0);
+
+        assertEquals("KE0100W", loggedEvent.getCode());
+        Object[] inserts = loggedEvent.getInserts();
+        assertEquals(4, inserts.length);
+
+        assertEquals("theBean", inserts[0]);
+        assertEquals(this.bundle.getSymbolicName(), inserts[1]);
+        assertEquals(this.bundle.getVersion(), inserts[2]);
+        assertEquals("filter", inserts[3]);
+    }
+
+    @Test
+    public void loggingOfWaitingEventForOptionalService() throws InterruptedException {
+        Event event = new Event("org/osgi/service/blueprint/container/WAITING", createProperties("filter", "theBean", false));
+        this.dependencyMonitor.handleEvent(event);
+
+        Thread.sleep(6000);
+
+        List<LoggedEvent> loggedEvents = this.eventLogger.getLoggedEvents();
+        assertEquals(1, loggedEvents.size());
+
+        LoggedEvent loggedEvent = loggedEvents.get(0);
+
+        assertEquals("KE0100W", loggedEvent.getCode());
+        Object[] inserts = loggedEvent.getInserts();
+        assertEquals(4, inserts.length);
+
+        assertEquals("theBean", inserts[0]);
+        assertEquals(this.bundle.getSymbolicName(), inserts[1]);
+        assertEquals(this.bundle.getVersion(), inserts[2]);
+        assertEquals("filter", inserts[3]);
+    }
+
+    @Test
+    public void loggingOfDependencySatisfied() throws InterruptedException {
+        Event event = new Event("org/osgi/service/blueprint/container/WAITING", createProperties("filter", "theBean", true));
+        this.dependencyMonitor.handleEvent(event);
+
+        Thread.sleep(6000);
+
+        event = new Event("org/osgi/service/blueprint/container/GRACE_PERIOD", createProperties());
+        this.dependencyMonitor.handleEvent(event);
+
+        List<LoggedEvent> loggedEvents = this.eventLogger.getLoggedEvents();
+        assertEquals(2, loggedEvents.size());
+
+        LoggedEvent loggedEvent = loggedEvents.get(1);
+
+        assertEquals("KE0101I", loggedEvent.getCode());
+        Object[] inserts = loggedEvent.getInserts();
+        assertEquals(4, inserts.length);
+
+        assertEquals("theBean", inserts[0]);
+        assertEquals(this.bundle.getSymbolicName(), inserts[1]);
+        assertEquals(this.bundle.getVersion(), inserts[2]);
+        assertEquals("filter", inserts[3]);
+    }
+
+    @Test
+    public void loggingOfMandatoryDependencyTimedOut() throws InterruptedException {
+        Event event = new Event("org/osgi/service/blueprint/container/WAITING", createProperties("filter", "theBean", true));
+        this.dependencyMonitor.handleEvent(event);
+
+        Thread.sleep(6000);
+
+        event = new Event("org/osgi/service/blueprint/container/FAILURE", createProperties("filter", "theBean", true));
+        this.dependencyMonitor.handleEvent(event);
+
+        List<LoggedEvent> loggedEvents = this.eventLogger.getLoggedEvents();
+        assertEquals(2, loggedEvents.size());
+
+        LoggedEvent loggedEvent = loggedEvents.get(1);
+
+        assertEquals("KE0102E", loggedEvent.getCode());
+        Object[] inserts = loggedEvent.getInserts();
+        assertEquals(4, inserts.length);
+
+        assertEquals("theBean", inserts[0]);
+        assertEquals(this.bundle.getSymbolicName(), inserts[1]);
+        assertEquals(this.bundle.getVersion(), inserts[2]);
+        assertEquals("filter", inserts[3]);
+    }
+
+    @Test
+    public void loggingOfOptionalDependencyTimedOut() throws InterruptedException {
+        Event event = new Event("org/osgi/service/blueprint/container/WAITING", createProperties("filter", "theBean", false));
+        this.dependencyMonitor.handleEvent(event);
+
+        Thread.sleep(6000);
+
+        event = new Event("org/osgi/service/blueprint/container/FAILURE", createProperties("filter", "theBean", false));
+        this.dependencyMonitor.handleEvent(event);
+
+        List<LoggedEvent> loggedEvents = this.eventLogger.getLoggedEvents();
+        assertEquals(2, loggedEvents.size());
+
+        LoggedEvent loggedEvent = loggedEvents.get(1);
+
+        assertEquals("KE0102E", loggedEvent.getCode());
+        Object[] inserts = loggedEvent.getInserts();
+        assertEquals(4, inserts.length);
+
+        assertEquals("theBean", inserts[0]);
+        assertEquals(this.bundle.getSymbolicName(), inserts[1]);
+        assertEquals(this.bundle.getVersion(), inserts[2]);
+        assertEquals("filter", inserts[3]);
+    }
+
+    @Test
+    public void containerCreationFailureRemovesTickers() throws InterruptedException {
+        Event event = new Event("org/osgi/service/blueprint/container/WAITING", createProperties("filter", "theBean", true));
+        this.dependencyMonitor.handleEvent(event);
+
+        event = new Event("org/osgi/service/blueprint/container/FAILURE", createProperties());
+        this.dependencyMonitor.handleEvent(event);
+
+        Thread.sleep(3000);
+
+        assertFalse(this.eventLogger.getCalled());
+    }
+
+    @Test
+    public void containerCreationDrivesOutstandingTickers() throws InterruptedException {
+        Event event = new Event("org/osgi/service/blueprint/container/WAITING", createProperties("filter", "theBean", true));
+        this.dependencyMonitor.handleEvent(event);
+
+        Thread.sleep(6000);
+
+        event = new Event("org/osgi/service/blueprint/container/CREATED", createProperties());
+        this.dependencyMonitor.handleEvent(event);
+
+        List<LoggedEvent> loggedEvents = this.eventLogger.getLoggedEvents();
+        assertEquals(2, loggedEvents.size());
+
+        LoggedEvent loggedEvent = loggedEvents.get(1);
+
+        assertEquals("KE0101I", loggedEvent.getCode());
+        Object[] inserts = loggedEvent.getInserts();
+        assertEquals(4, inserts.length);
+
+        assertEquals("theBean", inserts[0]);
+        assertEquals(this.bundle.getSymbolicName(), inserts[1]);
+        assertEquals(this.bundle.getVersion(), inserts[2]);
+        assertEquals("filter", inserts[3]);
+    }
+
+    @Test
+    public void dependencyThatIsSatisfiedQuicklyLogsNothing() throws InterruptedException {
+        Event event = new Event("org/osgi/service/blueprint/container/WAITING", createProperties("filter", "theBean", true));
+        this.dependencyMonitor.handleEvent(event);
+
+        event = new Event("org/osgi/service/blueprint/container/GRACE_PERIOD", createProperties());
+        this.dependencyMonitor.handleEvent(event);
+
+        Thread.sleep(3000);
+
+        List<LoggedEvent> loggedEvents = this.eventLogger.getLoggedEvents();
+        assertEquals(0, loggedEvents.size());
+    }
+
+    @Test
+    public void slowServicesAreGivenLongerToBecomeAvailable() throws InterruptedException {
+        Event event = new Event("org/osgi/service/blueprint/container/WAITING", createProperties("(org.eclipse.virgo.server.slowservice=true)",
+            "theBean", true));
+        this.dependencyMonitor.handleEvent(event);
+
+        Thread.sleep(3000);
+
+        assertFalse(this.eventLogger.getCalled());
+    }
+
+    @Test
+    public void containerCreatedNotWaiting() {
+        Event event = new Event("org/osgi/service/blueprint/container/CREATED", createProperties());
+        this.dependencyMonitor.handleEvent(event);
+    }
+
+    @Test
+    public void changeInUnsatisfiedDependenciesNotWaiting() {
+        Event event = new Event("org/osgi/service/blueprint/container/GRACE_PERIOD", createProperties());
+        this.dependencyMonitor.handleEvent(event);
+    }
+
+    @Test
+    public void serviceDependenciesTimedOutNotWaiting() {
+        Event event = new Event("org/osgi/service/blueprint/container/FAILURE", createProperties("filter", "theBean", false));
+        this.dependencyMonitor.handleEvent(event);
+    }
+
+    @Test
+    public void containerCreationFailedNotWaiting() {
+        Event event = new Event("org/osgi/service/blueprint/container/FAILURE", createProperties());
+        this.dependencyMonitor.handleEvent(event);
+    }
+
+    private Dictionary<String, Object> createProperties(String filter, String beanName, boolean mandatory) {
+        Dictionary<String, Object> properties = createProperties();
+
+        properties.put("dependencies", new String[] { filter });
+        properties.put("bean.name", new String[] { beanName });
+        properties.put("mandatory", new boolean[] { mandatory });
+
+        return properties;
+    }
+
+    private Dictionary<String, Object> createProperties() {
+        Dictionary<String, Object> properties = new Hashtable<>();
+        properties.put(EventConstants.BUNDLE, this.bundle);
+        return properties;
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/core/internal/blueprint/TickerTests.java b/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/core/internal/blueprint/TickerTests.java
new file mode 100644
index 0000000..768e6f2
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/core/internal/blueprint/TickerTests.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.core.internal.blueprint;
+
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+
+import org.eclipse.virgo.nano.core.internal.blueprint.StandardTicker;
+import org.eclipse.virgo.nano.core.internal.blueprint.Ticker;
+import org.junit.Assert;
+import org.junit.Test;
+
+
+/**
+ */
+public class TickerTests {
+    
+    private volatile int ticks;
+    
+    @Test public void testTicker() throws InterruptedException {
+        this.ticks = 0;
+        Ticker ticker = StandardTicker.createExponentialTicker(20, 100, 60 * 1000, new Callable<Void>() {
+
+            public Void call() throws Exception {
+                TickerTests.this.ticks++;
+                return null;
+            }}, new ScheduledThreadPoolExecutor(1));
+        
+        Thread.sleep(2000);
+        ticker.cancel();
+        
+        Assert.assertEquals(6, ticks);
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/serviceability/AssertTests.java b/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/serviceability/AssertTests.java
new file mode 100644
index 0000000..3976b27
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/serviceability/AssertTests.java
@@ -0,0 +1,175 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.serviceability;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.virgo.nano.serviceability.Assert;
+import org.eclipse.virgo.nano.serviceability.Assert.FatalAssertionException;
+import org.junit.Test;
+
+
+/**
+ */
+public class AssertTests {
+
+    @Test
+    public void testHasLength() {
+        try {
+            Assert.hasLength(null, "blah");
+            org.junit.Assert.assertTrue(false);
+        } catch (FatalAssertionException e) {
+        }
+        try {
+            Assert.hasLength("", "blah");
+            org.junit.Assert.assertTrue(false);
+        } catch (FatalAssertionException e) {
+        }
+        Assert.hasLength("x", "blah");
+    }
+
+    @Test
+    public void testIsAssignable() {
+        try {
+            Assert.isAssignable(String.class, Object.class, "blah");
+            org.junit.Assert.assertTrue(false);
+        } catch (FatalAssertionException e) {
+        }
+        try {
+            Assert.isAssignable(null, Object.class, "blah");
+            org.junit.Assert.assertTrue(false);
+        } catch (FatalAssertionException e) {
+        }
+        try {
+            Assert.isAssignable(Object.class, null, "blah");
+            org.junit.Assert.assertTrue(false);
+        } catch (FatalAssertionException e) {
+        }
+        Assert.isAssignable(Object.class, Object.class, "blah");
+        Assert.isAssignable(Object.class, String.class, "blah");
+    }
+
+    @Test
+    public void testIsInstanceOf() {
+        try {
+            Assert.isInstanceOf(Integer.class, "", "blah");
+            org.junit.Assert.assertTrue(false);
+        } catch (FatalAssertionException e) {
+        }
+        try {
+            Assert.isInstanceOf(null, "", "blah");
+            org.junit.Assert.assertTrue(false);
+        } catch (FatalAssertionException e) {
+        }
+        try {
+            Assert.isInstanceOf(Integer.class, null, "blah");
+            org.junit.Assert.assertTrue(false);
+        } catch (FatalAssertionException e) {
+        }
+        Assert.isInstanceOf(String.class, "", "blah");
+    }
+
+    @Test
+    public void testIsNull() {
+        try {
+            Assert.isNull("", "blah");
+            org.junit.Assert.assertTrue(false);
+        } catch (FatalAssertionException e) {
+        }
+        Assert.isNull(null, "blah");
+    }
+
+    @Test
+    public void testIsTrue() {
+        try {
+            Assert.isTrue(false, "blah");
+            org.junit.Assert.assertTrue(false);
+        } catch (FatalAssertionException e) {
+        }
+        Assert.isTrue(true, "blah");
+    }
+    
+    @Test
+    public void testIsFalse() {
+    	try {
+    		Assert.isFalse(true, "blah");
+    		org.junit.Assert.assertTrue(false);
+    	} catch (FatalAssertionException e) {
+    	}
+    	Assert.isFalse(false, "blah");
+    }
+    
+    @Test
+    public void testNotEmptyCollection() {
+        try {
+            Assert.notEmpty(new HashSet<String>(), "blah");
+            org.junit.Assert.assertTrue(false);
+        } catch (FatalAssertionException e) {
+        }
+        try {
+            Assert.notEmpty((Collection<String>)null, "blah");
+            org.junit.Assert.assertTrue(false);
+        } catch (FatalAssertionException e) {
+        }
+        Set<String> a = new HashSet<String>();
+        a.add("x");
+        Assert.notEmpty(a, "blah");
+    }
+    
+    @Test
+    public void testNotEmptyMap() {
+        try {
+            Assert.notEmpty(new HashMap<String, String>(), "blah");
+            org.junit.Assert.assertTrue(false);
+        } catch (FatalAssertionException e) {
+        }
+        try {
+            Assert.notEmpty((Map<String, String>)null, "blah");
+            org.junit.Assert.assertTrue(false);
+        } catch (FatalAssertionException e) {
+        }
+        Map<String, String> a = new HashMap<String, String>();
+        a.put("k", "v");
+        Assert.notEmpty(a, "blah");
+    }
+    
+    @Test
+    public void testNotEmptyArray() {
+        try {
+            Object[] a = {};
+            Assert.notEmpty(a, "blah");
+            org.junit.Assert.assertTrue(false);
+        } catch (FatalAssertionException e) {
+        }
+        try {
+            Assert.notEmpty((Object[])null, "blah");
+            org.junit.Assert.assertTrue(false);
+        } catch (FatalAssertionException e) {
+        }
+        Object[] a = {"x"};
+        Assert.notEmpty(a, "blah");
+    }
+    
+    @Test
+    public void testNotNull() {
+        try {
+            Assert.notNull(null, "blah");
+            org.junit.Assert.assertTrue(false);
+        } catch (FatalAssertionException e) {
+        }
+        Assert.notNull("x", "blah");
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/serviceability/dump/FFDCExceptionStateTests.java b/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/serviceability/dump/FFDCExceptionStateTests.java
new file mode 100644
index 0000000..1876782
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/serviceability/dump/FFDCExceptionStateTests.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.serviceability.dump;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.concurrent.CountDownLatch;
+
+import org.eclipse.virgo.nano.serviceability.dump.FFDCExceptionState;
+import org.junit.Test;
+
+
+public class FFDCExceptionStateTests {
+	
+	@Test
+	public void seen() {
+		Throwable throwable = new Throwable();
+		assertFalse(FFDCExceptionState.seen(throwable));
+		FFDCExceptionState.record(throwable);
+		assertTrue(FFDCExceptionState.seen(throwable));
+	}
+	
+	@Test
+	public void multithreadedSeen() {
+		final Throwable throwable = new Throwable();
+		FFDCExceptionState.record(throwable);
+		assertTrue(FFDCExceptionState.seen(throwable));
+		SeenChecker checker = new SeenChecker(throwable);
+		checker.start();
+		assertFalse(checker.seen());
+	}
+	
+	@Test
+	public void seenAsNestedCause() {
+		Throwable nested = new Throwable();
+		FFDCExceptionState.record(nested);
+		Throwable root = new Throwable(nested);
+		assertTrue(FFDCExceptionState.seen(root));
+	}
+	
+	private class SeenChecker extends Thread {
+		
+		private final Throwable throwable;
+		private volatile boolean seen;
+		private final CountDownLatch latch;
+		
+		public SeenChecker(Throwable throwable) {
+			this.throwable = throwable;
+			this.latch = new CountDownLatch(1);
+		}
+		
+		public boolean seen() {
+			boolean awaiting = true;
+			while (awaiting) {
+				try {
+				    this.latch.await();
+				    awaiting = false;
+				} catch (InterruptedException ie) {
+					
+				}
+			}
+			return this.seen;
+		}
+		
+		public void run() {
+			seen = FFDCExceptionState.seen(throwable);
+			latch.countDown();
+		}
+	}
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/serviceability/dump/internal/ResolutionStateDumperTests.java b/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/serviceability/dump/internal/ResolutionStateDumperTests.java
new file mode 100644
index 0000000..2e2d0d0
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/serviceability/dump/internal/ResolutionStateDumperTests.java
@@ -0,0 +1,115 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.serviceability.dump.internal;
+
+import static org.easymock.EasyMock.createNiceMock;
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.osgi.service.resolver.State;
+import org.eclipse.virgo.util.io.PathReference;
+import org.eclipse.virgo.util.io.ZipUtils;
+import org.junit.Test;
+
+/**
+ */
+public class ResolutionStateDumperTests {
+
+    @Test
+    public void createDump() throws Exception {
+
+        State state = createNiceMock(State.class);
+        StubStateWriter writer = new StubStateWriter();
+
+        byte[] bytes = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
+        writer.addBytes(state, bytes);
+
+        ResolutionStateDumper dumper = new ResolutionStateDumper(new StubSystemStateAccessor(state), writer);
+
+        File outputFile = new File("./build/dump.zip");
+        if (outputFile.exists()) {
+            assertTrue(outputFile.delete());
+        }
+
+        dumper.dump(outputFile);
+
+        assertTrue(outputFile.exists());
+
+        PathReference unzipLocation = new PathReference("build/dump");
+        if (unzipLocation.exists()) {
+            assertTrue(unzipLocation.delete(true));
+        }
+
+        ZipUtils.unzipTo(new PathReference(outputFile), unzipLocation);
+        File stateFile = new File("build/dump/state/state");
+
+        assertTrue(stateFile.exists());
+        assertEquals(10, stateFile.length());
+
+        byte[] actualBytes = new byte[10];
+
+        try (InputStream in = new FileInputStream(stateFile)) {
+            in.read(actualBytes);
+        }
+
+        assertArrayEquals(bytes, actualBytes);
+    }
+
+    private static final class StubSystemStateAccessor implements SystemStateAccessor {
+
+        private final State systemState;
+
+        private StubSystemStateAccessor(State systemState) {
+            this.systemState = systemState;
+        }
+
+        public State getSystemState() {
+            return this.systemState;
+        }
+    }
+
+    private static final class StubStateWriter implements StateWriter {
+
+        private final Map<State, byte[]> stateBytes = new HashMap<State, byte[]>();
+
+        private void addBytes(State state, byte[] bytes) {
+            this.stateBytes.put(state, bytes);
+        }
+
+        public void writeState(State state, File outputDir) throws IOException {
+            byte[] bytes = this.stateBytes.get(state);
+            if (bytes == null) {
+                throw new IOException();
+            } else {
+                FileOutputStream fos = null;
+
+                try {
+                    fos = new FileOutputStream(new File(outputDir, "state"));
+                    fos.write(bytes);
+                } finally {
+                    if (fos != null) {
+                        fos.close();
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/serviceability/enforcement/NonNullAssertionEnforcerTests.java b/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/serviceability/enforcement/NonNullAssertionEnforcerTests.java
new file mode 100644
index 0000000..d9475e1
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/test/java/org/eclipse/virgo/nano/serviceability/enforcement/NonNullAssertionEnforcerTests.java
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.serviceability.enforcement;
+
+import internal.AssertingService;
+
+import java.util.Map;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.eclipse.virgo.nano.serviceability.Assert;
+import org.eclipse.virgo.nano.serviceability.dump.DumpCoordinator;
+import org.eclipse.virgo.medic.dump.DumpGenerator;
+
+public class NonNullAssertionEnforcerTests {
+
+    @Before
+    public void injectDumpGenerator() {
+        DumpCoordinator.aspectOf().setDumpGenerator(new StubDumpGenerator());
+    }
+
+    @Test(expected = Assert.FatalAssertionException.class)
+    public void firstMethodArg() {
+        AssertingService service = new AssertingService();
+        service.test(null);
+    }
+
+    @Test(expected = Assert.FatalAssertionException.class)
+    public void secondMethodArg() {
+        AssertingService service = new AssertingService();
+        service.test("foo", null);
+    }
+
+    @Test(expected = Assert.FatalAssertionException.class)
+    public void thirdMethodArg() {
+        AssertingService service = new AssertingService();
+        service.test("foo", 1, null);
+    }
+
+    @Test(expected = Assert.FatalAssertionException.class)
+    public void firstConstructorArg() {
+        new AssertingService(null);
+    }
+
+    @Test(expected = Assert.FatalAssertionException.class)
+    public void secondConstructorArg() {
+        new AssertingService("foo", null);
+    }
+
+    @Test(expected = Assert.FatalAssertionException.class)
+    public void thirdConstructorArg() {
+        new AssertingService("foo", 1, null);
+    }
+
+    private static class StubDumpGenerator implements DumpGenerator {
+
+        public void generateDump(String cause, Throwable... throwables) {
+        }
+
+        public void generateDump(String cause, Map<String, Object> context, Throwable... throwables) {
+        }
+
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/test/resources/ConfigBundleTests/config_tests_badprops/noprops.properties b/nano/org.eclipse.virgo.nano.core/src/test/resources/ConfigBundleTests/config_tests_badprops/noprops.properties
new file mode 100644
index 0000000..b419c60
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/test/resources/ConfigBundleTests/config_tests_badprops/noprops.properties
@@ -0,0 +1,2 @@
+
+!@£$%^&*()_
diff --git a/nano/org.eclipse.virgo.nano.core/src/test/resources/ConfigBundleTests/config_tests_noprops/noise.config b/nano/org.eclipse.virgo.nano.core/src/test/resources/ConfigBundleTests/config_tests_noprops/noise.config
new file mode 100644
index 0000000..f13418c
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/test/resources/ConfigBundleTests/config_tests_noprops/noise.config
@@ -0,0 +1,11 @@
+{
+	"types": {
+		"int" : 123,
+		"string": "foo",
+		"boolean": true,
+		"path1": "foo/bar",
+		"path2": "/foo/bar",
+		"path3": "../../foo/bar",
+		"path4": "/foo/../bar"
+	}
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/test/resources/ConfigBundleTests/config_tests_noprops/noise2.config b/nano/org.eclipse.virgo.nano.core/src/test/resources/ConfigBundleTests/config_tests_noprops/noise2.config
new file mode 100644
index 0000000..f13418c
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/test/resources/ConfigBundleTests/config_tests_noprops/noise2.config
@@ -0,0 +1,11 @@
+{
+	"types": {
+		"int" : 123,
+		"string": "foo",
+		"boolean": true,
+		"path1": "foo/bar",
+		"path2": "/foo/bar",
+		"path3": "../../foo/bar",
+		"path4": "/foo/../bar"
+	}
+}
diff --git a/nano/org.eclipse.virgo.nano.core/src/test/resources/ConfigBundleTests/config_tests_props1/dup.properties b/nano/org.eclipse.virgo.nano.core/src/test/resources/ConfigBundleTests/config_tests_props1/dup.properties
new file mode 100644
index 0000000..30aee8b
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/test/resources/ConfigBundleTests/config_tests_props1/dup.properties
@@ -0,0 +1,3 @@
+# Properties file for Config Admin service configuration properties.
+test=This is a test string
+dup_prop=Duplicate property one
diff --git a/nano/org.eclipse.virgo.nano.core/src/test/resources/ConfigBundleTests/config_tests_props2/dup.properties b/nano/org.eclipse.virgo.nano.core/src/test/resources/ConfigBundleTests/config_tests_props2/dup.properties
new file mode 100644
index 0000000..f700caf
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/test/resources/ConfigBundleTests/config_tests_props2/dup.properties
@@ -0,0 +1,6 @@
+# Properties file for Config Admin service configuration properties.
+test=This is a test string as well
+dup_prop=Duplicate property two
+hidden=Hidden property
+boolean=false
+integer=1024
diff --git a/nano/org.eclipse.virgo.nano.core/src/test/resources/UserConfigurationPropertiesSourceTests/factoryOne.properties b/nano/org.eclipse.virgo.nano.core/src/test/resources/UserConfigurationPropertiesSourceTests/factoryOne.properties
new file mode 100644
index 0000000..114554c
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/test/resources/UserConfigurationPropertiesSourceTests/factoryOne.properties
@@ -0,0 +1,3 @@
+service.factoryPid = factory.pid
+
+foo=one
\ No newline at end of file
diff --git a/nano/org.eclipse.virgo.nano.core/src/test/resources/UserConfigurationPropertiesSourceTests/factoryTwo.properties b/nano/org.eclipse.virgo.nano.core/src/test/resources/UserConfigurationPropertiesSourceTests/factoryTwo.properties
new file mode 100644
index 0000000..9628820
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/test/resources/UserConfigurationPropertiesSourceTests/factoryTwo.properties
@@ -0,0 +1,3 @@
+service.factoryPid = factory.pid
+
+foo = two
\ No newline at end of file
diff --git a/nano/org.eclipse.virgo.nano.core/src/test/resources/UserConfigurationPropertiesSourceTests/one.properties b/nano/org.eclipse.virgo.nano.core/src/test/resources/UserConfigurationPropertiesSourceTests/one.properties
new file mode 100644
index 0000000..135597f
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/test/resources/UserConfigurationPropertiesSourceTests/one.properties
@@ -0,0 +1 @@
+baz=bar
diff --git a/nano/org.eclipse.virgo.nano.core/src/test/resources/UserConfigurationPropertiesSourceTests/two.properties b/nano/org.eclipse.virgo.nano.core/src/test/resources/UserConfigurationPropertiesSourceTests/two.properties
new file mode 100644
index 0000000..8c9c654
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/test/resources/UserConfigurationPropertiesSourceTests/two.properties
@@ -0,0 +1 @@
+foo=baz
diff --git a/nano/org.eclipse.virgo.nano.core/src/test/resources/UserConfigurationPropertiesSourceTests/withServicePid.properties b/nano/org.eclipse.virgo.nano.core/src/test/resources/UserConfigurationPropertiesSourceTests/withServicePid.properties
new file mode 100644
index 0000000..636ac8c
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/test/resources/UserConfigurationPropertiesSourceTests/withServicePid.properties
@@ -0,0 +1,3 @@
+service.pid = three
+
+foo=three
\ No newline at end of file
diff --git a/nano/org.eclipse.virgo.nano.core/src/test/resources/ovf/environment.xml b/nano/org.eclipse.virgo.nano.core/src/test/resources/ovf/environment.xml
new file mode 100644
index 0000000..9c16f83
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/test/resources/ovf/environment.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Environment xmlns="http://schemas.dmtf.org/ovf/environment/1"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xmlns:ovfenv="http://schemas.dmtf.org/ovf/environment/1"
+    xsi:schemaLocation="http://schemas.dmtf.org/ovf/environment/1 http://schemas.dmtf.org/ovf/environment/1/dsp8027.xsd"
+    ovfenv:id="DB1">
+    
+    <!-- This example reference a local schema file, to validate against online schema use:
+    xsi:schemaLocation="http://schemas.dmtf.org/ovf/envelope/1 http://schemas.dmtf.org/ovf/envelope/1/dsp8027_1.0.0.xsd"
+    -->
+    
+    <!-- Information about hypervisor platform -->
+    <PlatformSection>
+        <Kind>ESX Server</Kind>
+        <Version>3.0.1</Version>
+        <Vendor>VMware, Inc.</Vendor>
+        <Locale>en_US</Locale>
+    </PlatformSection>
+
+    <!--- Properties defined for this virtual machine -->
+    <PropertySection>
+        <Property ovfenv:key="com.myapp.foo" ovfenv:value="bar"/>
+        <Property ovfenv:key="com.myapp.bar" ovfenv:value="baz"/>
+    </PropertySection>
+
+</Environment>
diff --git a/nano/org.eclipse.virgo.nano.core/src/test/resources/ovf/invalid.xml b/nano/org.eclipse.virgo.nano.core/src/test/resources/ovf/invalid.xml
new file mode 100644
index 0000000..ee406ee
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/test/resources/ovf/invalid.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Environment xmlns="http://schemas.dmtf.org/ovf/environment/1"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xmlns:ovfenv="http://schemas.dmtf.org/ovf/environment/1"
+    xsi:schemaLocation="http://schemas.dmtf.org/ovf/environment/1 http://schemas.dmtf.org/ovf/environment/1/dsp8027.xsd"
+    ovfenv:id="DB1">
+    
+    <!-- This example reference a local schema file, to validate against online schema use:
+    xsi:schemaLocation="http://schemas.dmtf.org/ovf/envelope/1 http://schemas.dmtf.org/ovf/envelope/1/dsp8027_1.0.0.xsd"
+    -->
+    
+    <!-- Information about hypervisor platform -->
+    <PlatformSection>
+        <Kind>ESX Server</Kind>
+        <Version>3.0.1</Version>
+        <Vendor>VMware, Inc.</Vendor>
+        <Locale>en_US</Locale>
+    </PlatformSection>
+
+    <!--- Properties defined for this virtual machine -->
+    <PropertySection>
+        <Property ovfenv:key="cm:invalid" ovfenv:value="bar"/>
+    </PropertySection>
+
+</Environment>
diff --git a/nano/org.eclipse.virgo.nano.core/src/test/resources/ovf/valid.xml b/nano/org.eclipse.virgo.nano.core/src/test/resources/ovf/valid.xml
new file mode 100644
index 0000000..aff0fc6
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/src/test/resources/ovf/valid.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Environment xmlns="http://schemas.dmtf.org/ovf/environment/1"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xmlns:ovfenv="http://schemas.dmtf.org/ovf/environment/1"
+    xsi:schemaLocation="http://schemas.dmtf.org/ovf/environment/1 http://schemas.dmtf.org/ovf/environment/1/dsp8027.xsd"
+    ovfenv:id="DB1">
+    
+    <!-- This example reference a local schema file, to validate against online schema use:
+    xsi:schemaLocation="http://schemas.dmtf.org/ovf/envelope/1 http://schemas.dmtf.org/ovf/envelope/1/dsp8027_1.0.0.xsd"
+    -->
+    
+    <!-- Information about hypervisor platform -->
+    <PlatformSection>
+        <Kind>ESX Server</Kind>
+        <Version>3.0.1</Version>
+        <Vendor>VMware, Inc.</Vendor>
+        <Locale>en_US</Locale>
+    </PlatformSection>
+
+    <!--- Properties defined for this virtual machine -->
+    <PropertySection>
+        <Property ovfenv:key="cm:one:foo" ovfenv:value="bar"/>
+        <Property ovfenv:key="cm:one:bar" ovfenv:value="baz"/>
+        <Property ovfenv:key="cm:two:baz" ovfenv:value="quux"/>
+        <Property ovfenv:key="some.random.property" ovfenv:value="value"/>
+    </PropertySection>
+
+</Environment>
diff --git a/nano/org.eclipse.virgo.nano.core/template.mf b/nano/org.eclipse.virgo.nano.core/template.mf
new file mode 100644
index 0000000..12c0c14
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.core/template.mf
@@ -0,0 +1,20 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Virgo Nano Core
+Bundle-SymbolicName: org.eclipse.virgo.nano.core
+Bundle-Version: ${version}
+Service-Component: OSGI-INF/org.eclipse.virgo.nano.config.xml,OSGI-INF/org.eclipse.virgo.nano.core.xml,OSGI-INF/org.eclipse.virgo.nano.server.readiness.tracker.xml
+Import-Template:
+ org.eclipse.virgo.util.*;version="${version:[=.=.=, =.+1)}",
+ org.eclipse.virgo.medic.*;version="${version:[=.=.=, =.+1)}",
+ org.slf4j.*;version="${slf4jVersion:[=.=.=, +1)}",
+ org.aspectj.*;version="${aspectjVersion:[=.=.=, +1)}",
+ javax.management.*;version="0",
+ javax.xml.parsers;version="0",
+ org.osgi.*;version="0",
+ org.eclipse.osgi.*;version="0",
+ org.eclipse.equinox.region.*;version="${equinoxRegionExportedPackageVersion:[=.=.=, =.+1)}",
+ org.w3c.dom;version="0",
+ org.xml.sax;version="0"
+Excluded-Exports:
+ *.internal.*
diff --git a/nano/org.eclipse.virgo.nano.deployer.api/build.properties b/nano/org.eclipse.virgo.nano.deployer.api/build.properties
new file mode 100644
index 0000000..80bc250
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer.api/build.properties
@@ -0,0 +1,6 @@
+source.. = src/main/java/,\
+           src/main/resources/,\
+           src/test/java/,\
+           src/test/resources/
+bin.includes = META-INF/,\
+               .
diff --git a/nano/org.eclipse.virgo.nano.deployer.api/findbugs-exclude.xml b/nano/org.eclipse.virgo.nano.deployer.api/findbugs-exclude.xml
new file mode 100644
index 0000000..98983db
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer.api/findbugs-exclude.xml
@@ -0,0 +1,8 @@
+<FindBugsFilter>
+     <!-- Exclusions -->
+     <Match>
+       	<Bug pattern="ES_COMPARING_PARAMETER_STRING_WITH_EQ"/>
+        <Class name="org.eclipse.virgo.nano.deployer.api.core.module.StandardModule"/>
+        <Method name="unwrapNull"/>
+     </Match>	
+</FindBugsFilter>
diff --git a/nano/org.eclipse.virgo.nano.deployer.api/src/main/java/org/eclipse/virgo/nano/deployer/api/ArtifactIdentity.java b/nano/org.eclipse.virgo.nano.deployer.api/src/main/java/org/eclipse/virgo/nano/deployer/api/ArtifactIdentity.java
new file mode 100644
index 0000000..c522a0c
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer.api/src/main/java/org/eclipse/virgo/nano/deployer/api/ArtifactIdentity.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2012 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   SAP AG - re-factoring
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.deployer.api;
+
+import java.beans.ConstructorProperties;
+
+/**
+ * Identifies an artifact as a type, name, and version tuple.
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread-safe.
+ * 
+ */
+public final class ArtifactIdentity {
+
+    private final String type;
+
+    private final String name;
+
+    private final String version;
+
+    /**
+     * Create a new <code>ArtifactIdentity</code>.
+     * 
+     * @param type The type of the artifact
+     * @param name The name of the artifact
+     * @param version The version of the artifact
+     */
+    @ConstructorProperties( { "type", "name", "version" })
+    public ArtifactIdentity(String type, String name, String version) {
+        this.type = type;
+        this.name = name;
+        this.version = version;
+    }
+
+    /**
+     * Returns the type of the artifact
+     * 
+     * @return the artifact's type
+     */
+    public String getType() {
+        return type;
+    }
+
+    /**
+     * Returns the name of the artifact
+     * 
+     * @return the artifact's name
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * Returns the version of the artifact
+     * 
+     * @return the artifact's version
+     */
+    public String getVersion() {
+        return version;
+    }
+    
+    public String toString() {
+        return String.format("%s:%s:%s", type, name, version);
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.deployer.api/src/main/java/org/eclipse/virgo/nano/deployer/api/DeployedArtefactInfo.java b/nano/org.eclipse.virgo.nano.deployer.api/src/main/java/org/eclipse/virgo/nano/deployer/api/DeployedArtefactInfo.java
new file mode 100644
index 0000000..6e992f9
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer.api/src/main/java/org/eclipse/virgo/nano/deployer/api/DeployedArtefactInfo.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2012 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   SAP AG - re-factoring
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.deployer.api;
+
+import java.util.Date;
+import java.util.Map;
+
+import javax.management.MXBean;
+
+/**
+ * Interface used to expose deployed artefact information
+ */
+@MXBean
+public interface DeployedArtefactInfo {
+
+	/**
+	 * @return The type of the deployed artefact
+	 */
+	String getType();
+	
+	/**
+	 * @return The name of the deployed artefact
+	 */
+	String getName();
+
+	/**
+	 * @return The version of the deployed artefact
+	 */
+	String getVersion();
+
+	/**
+	 * @return The time when this artefact was deployed
+	 */
+	Date getDeployTime();
+
+	/**
+	 * @return The source URI of the deployed artefact
+	 */
+	String getSourceUri();
+	
+	/**
+	 * Returns the properties of the deployed artefact
+	 * @return the artefact's properties.
+	 */
+	Map<String, String> getProperties();
+	
+	/**
+	 * @return The local name of the repository from which the artefact was deployed
+	 */
+	String getRepositoryName();
+}
diff --git a/nano/org.eclipse.virgo.nano.deployer.api/src/main/java/org/eclipse/virgo/nano/deployer/api/Deployer.java b/nano/org.eclipse.virgo.nano.deployer.api/src/main/java/org/eclipse/virgo/nano/deployer/api/Deployer.java
new file mode 100644
index 0000000..53351df
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer.api/src/main/java/org/eclipse/virgo/nano/deployer/api/Deployer.java
@@ -0,0 +1,231 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2012 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   SAP AG - re-factoring
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.deployer.api;
+
+import javax.management.MXBean;
+import javax.management.openmbean.CompositeData;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+
+
+/**
+ * Definition of the Deployer control used to allow the Server to support remote deployment.
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Implementations must be thread-safe.
+ * 
+ */
+@MXBean
+public interface Deployer {
+
+    /**
+     * Deploy an application located at the given URI.
+     * 
+     * @param uri the URI string of the location of the application
+     * @return the {@link DeploymentIdentity} of the deployed application as a {@link CompositeData} object.
+     * @throws DeploymentException
+     */
+    DeploymentIdentity deploy(String uri) throws DeploymentException;
+
+    /**
+     * Deploy an application located at the given URI.
+     * 
+     * @param uri the URI string of the location of the application.
+     * @param recoverable whether or not the application should be recovered on warm restart.
+     * @return the {@link DeploymentIdentity} of the deployed application as a {@link CompositeData} object.
+     * @throws DeploymentException
+     */
+    DeploymentIdentity deploy(String uri, boolean recoverable) throws DeploymentException;
+
+    /**
+     * Undeploy an application with a given symbolic name and version.
+     * 
+     * @param applicationSymbolicName the symbolic name of the application
+     * @param version the version of the application in string form
+     * @throws DeploymentException
+     */
+    void undeploy(String applicationSymbolicName, String version) throws DeploymentException;
+
+    /**
+     * Refresh a single module of the application which was deployed from the given URI.
+     * 
+     * @param uri the URI string from which the application was deployed
+     * @param symbolicName the bundle symbolic name of the module to be refreshed
+     * @throws DeploymentException if the refresh failed
+     */
+    void refresh(String uri, String symbolicName) throws DeploymentException;
+
+    /**
+     * Refresh any bundle with the given symbolic name and version and any bundles cloned from a bundle with the given
+     * symbolic name and version. If no bundles or cloned bundles match the given symbolic name and version, simply
+     * return and do not throw an exception. <br>
+     * <p/> Certain bundles which are critical to the operation of the system may not be refreshed. If an attempt is
+     * made to refresh one of these bundles, a warning message is logged, the bundle is not refreshed, but any clones of
+     * the bundle are refreshed.
+     * 
+     * @param bundleSymbolicName the symbolic name of the bundle
+     * @param bundleVersion the version of the bundle
+     * @throws DeploymentException
+     */
+    void refreshBundle(String bundleSymbolicName, String bundleVersion) throws DeploymentException;
+    
+    //  TODO: Implement install, start, stop and uninstall on Deployer
+    //  The following methods are a draft for the new methods to allow install, start, stop, and
+    //  uninstall to be driven separately over JMX, as opposed to deploy (install and start),
+    //  and undeploy (stop and uninstall).
+    //
+    //  NOTE: These methods have not yet been implemented, calling them will result in an
+    //  UnsupportedOperationException being thrown.
+    //
+    	
+    /**
+	 * Installs the artifact identified by the supplied <code>artifactUri</code>. The artifact
+	 * will be recovered upon warm restart, i.e. equivalent to calling {@link #install(String, boolean)
+	 * install(artifactUri, true)}. If the artifact is already present this method has no effect, and
+	 * the identity of the existing artifact is returned.
+	 * 
+	 * @param artifactUri The uri, as a <code>String</code>, of the artifact to be installed.
+	 * 
+	 * @return The {@link ArtifactIdentity} of the installed artifact as {@link CompositeData}.
+	 * 
+	 * @throws DeploymentException if the install fails
+	 */
+	ArtifactIdentity install(String artifactUri) throws DeploymentException;
+    
+    /**
+	 * Installs the artifact identified by the supplied <code>artifactUri</code>, telling the
+	 * deployer whether or not the artifact should be recovered upon warm restart.  If the artifact is
+	 * already present this method has no effect, and the identity of the existing artifact
+	 * is returned.
+	 * 
+	 * @param artifactUri The uri, as a <code>String</code>, of the artifact to be installed.
+	 * @param recover <code>true</code> if the artifact should be recovered, <code>false</code> if it should not.
+	 * 
+	 * @return The {@link ArtifactIdentity} of the installed artifact as {@link CompositeData}.
+	 * 
+	 * @throws DeploymentException if the install fails
+	 */
+	ArtifactIdentity install(String artifactUri, boolean recover) throws DeploymentException;
+	
+	/**
+	 * Installs the artifact identified by the supplied <code>type</code>, <code>name</code>, and
+	 * <code>version</code>. The artifact will be recovered upon warm restart, i.e. equivalent to calling
+	 * {@link #install(String, String, String, boolean) install(type, name, version, true)}.  If the
+	 * artifact is already present this method has no effect, and the identity of the existing
+	 * artifact is returned.
+	 * 
+	 * @param artifactUri The uri, as a <code>String</code>, of the artifact to be installed.
+	 * @param type The type of the artifact to be installed
+	 * @param name The name of the artifact to be installed
+	 * @param version The version of the artifact to be installed
+	 * 
+	 * @return The {@link ArtifactIdentity} of the installed artifact as {@link CompositeData}.
+	 * 
+	 * @throws DeploymentException if the install fails
+	 */
+	ArtifactIdentity install(String type, String name, String version) throws DeploymentException;
+    
+    /**
+	 * Installs the artifact identified by the supplied <code>type</code>, <code>name</code>, and
+	 * <code>version</code>, telling the deployer whether or not the artifact should be recovered
+	 * upon warm restart. If the artifact is already present this method has no effect, and the
+	 * identity of the existing artifact is returned.
+	 * 
+	 * @param type The type of the artifact to be installed
+	 * @param name The name of the artifact to be installed
+	 * @param version The version of the artifact to be installed
+	 * @param recover <code>true</code> if the artifact should be recovered upon warm restart,
+	 *        <code>false</code> if it should not.
+	 *        
+	 * @return The {@link ArtifactIdentity} of the installed artifact as {@link CompositeData}.
+	 * 
+	 * @throws DeploymentException if the install fails
+	 */
+	ArtifactIdentity install(String type, String name, String version, boolean recover) throws DeploymentException;
+	
+	/**
+	 * Starts the artifact identified by the supplied <code>artifactIdentity</code>. If the artifact
+	 * is already active, this method has no effect.
+	 * 
+	 * @param artifactIdentity The {@link ArtifactIdentity} of the artifact that is to be started.
+	 * 
+	 * @throws DeploymentException if the start fails
+	 * @throws IllegalStateException If the identified artifact is not present
+	 */
+	void start(ArtifactIdentity artifactIdentity) throws DeploymentException, IllegalStateException;
+	
+	/**
+	 * Starts the artifact identified by the supplied <code>type</code>, <code>name</code>, and
+	 * <code>version</code>. If the artifact is already active, this method has no effect.
+	 * 
+	 * @param type The type of the artifact to be started
+	 * @param name The name of the artifact to be started
+	 * @param version The version of the artifact to be started
+	 * 
+	 * @throws DeploymentException if the start fails
+	 * @throws IllegalStateException If the artifact is not present
+	 */
+	void start(String type, String name, String version) throws DeploymentException, IllegalStateException;
+		
+	/**
+	 * Stops the artifact identified by the supplied <code>artifactIdentity</code>. If the artifact is
+	 * not active, this method has no effect.
+	 * 
+	 * @param artifactIdentity The {@link ArtifactIdentity} of the artifact that is to be started.
+	 * 
+	 * @throws DeploymentException if the stop fails
+	 * @throws IllegalStateException If the artifact is not present
+	 */
+	void stop(ArtifactIdentity artifactIdentity) throws DeploymentException, IllegalStateException;
+	
+	/**
+	 * Stops the artifact identified by the supplied <code>type</code>, <code>name</code>, and
+	 * <code>version</code>. If the artifact is not active, this method has no effect.
+	 * 
+	 * @param type The type of the artifact to be stopped
+	 * @param name The name of the artifact to be stopped
+	 * @param version The version of the artifact to be stopped
+	 * 
+	 * @throws DeploymentException if the stop fails
+	 * @throws IllegalStateException If the identified artifact is not present
+	 */
+	void stop(String type, String name, String version) throws DeploymentException, IllegalStateException;
+	
+	/**
+	 * Uninstalls the artifact identified by the supplied <code>artifactIdentity</code>. If
+	 * the artifact is not present, this method has no effect. If the artifact is active an
+	 * {@link IllegalStateException} is thrown, i.e. an active artifact cannot be uninstalled.
+	 * 
+	 * @param artifactIdentity The {@link ArtifactIdentity} of the artifact that is to be uninstalled.
+	 * 
+	 * @throws DeploymentException if the uninstall fails
+	 * @throws IllegalStateException if the artifact is present and is active
+	 */
+	void uninstall(ArtifactIdentity artifactIdentity) throws DeploymentException, IllegalStateException;
+	
+	/**
+	 * Uninstalls the artifact identified by the supplied <code>type</code>, <code>name</code>,
+	 * and <code>version</code>. If the artifact is not present, this method has no effect. If the
+	 * artifact is active an {@link IllegalStateException} is thrown, i.e. an active artifact cannot
+	 * be uninstalled.
+	 * 
+	 * @param type The type of the artifact to be uninstalled
+	 * @param name The name of the artifact to be uninstalled
+	 * @param version The version of the artifact to be uninstalled
+	 * 
+	 * @throws DeploymentException if the uninstall fails
+	 * @throws IllegalStateException if the artifact is present and is started
+	 */
+	void uninstall(String type, String name, String version) throws DeploymentException, IllegalStateException;
+}
diff --git a/nano/org.eclipse.virgo.nano.deployer.api/src/main/java/org/eclipse/virgo/nano/deployer/api/RecoveryMonitor.java b/nano/org.eclipse.virgo.nano.deployer.api/src/main/java/org/eclipse/virgo/nano/deployer/api/RecoveryMonitor.java
new file mode 100644
index 0000000..57777dc
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer.api/src/main/java/org/eclipse/virgo/nano/deployer/api/RecoveryMonitor.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2012 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   SAP AG - re-factoring
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.deployer.api;
+
+import javax.management.MXBean;
+
+/**
+ * MBean for tracking deployer recovery. A notification of type {@value #NOTIFICATION_TYPE} is broadcasted when recovery
+ * completes. <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations <code>must</code> be threadsafe.
+ * 
+ */
+@MXBean
+public interface RecoveryMonitor {
+
+    /**
+     * The type of notification sent when recovery completes.
+     */
+    public static final String NOTIFICATION_TYPE = "org.eclipse.virgo.server.recovery";
+
+    /**
+     * Indicates whether or not recovery is complete.
+     * 
+     * @return <code>true</code> if recovery is complete, otherwise <code>false</code>.
+     */
+    boolean isRecoveryComplete();
+}
diff --git a/nano/org.eclipse.virgo.nano.deployer.api/src/main/java/org/eclipse/virgo/nano/deployer/api/config/ConfigurationDeployer.java b/nano/org.eclipse.virgo.nano.deployer.api/src/main/java/org/eclipse/virgo/nano/deployer/api/config/ConfigurationDeployer.java
new file mode 100644
index 0000000..091ce85
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer.api/src/main/java/org/eclipse/virgo/nano/deployer/api/config/ConfigurationDeployer.java
@@ -0,0 +1,37 @@
+package org.eclipse.virgo.nano.deployer.api.config;
+
+import java.io.IOException;
+import java.util.Properties;
+
+import org.eclipse.virgo.nano.serviceability.NonNull;
+
+/**
+ * Publishes and Deletes configurations from the config admin that is present in the implementor's region
+ *
+ *
+ */
+public interface ConfigurationDeployer {
+	
+	/**
+	 * Publishes configuration with the specified pid and configuration properties in the implementor's config admin
+	 * @param pid - the pid of the published configuration
+	 * @param configurationProperties
+	 * @throws IOException - if the operation isn't successful
+	 */
+	void publishConfiguration(@NonNull String pid, @NonNull Properties configurationProperties) throws IOException;
+	
+	/**
+	 * Deletes the configuration with the specified pid in the implementor's config admin
+	 * @param pid - the pid of the configuration to delete
+	 * @throws IOException - if the operation isn't successful
+	 */
+	void deleteConfiguration(@NonNull String pid) throws IOException;
+	
+	/**
+	 * Gets the configuration with the specified pid in the implementor's config admin
+	 * @param pid - the pid of the published configuration
+	 * @return the configuration properties or null if the pid is not associated with any properties
+	 * @throws IOException - if the operations isn't successful
+	 */
+	Properties getConfiguration(@NonNull String pid) throws IOException;
+}
diff --git a/nano/org.eclipse.virgo.nano.deployer.api/src/main/java/org/eclipse/virgo/nano/deployer/api/core/ApplicationDeployer.java b/nano/org.eclipse.virgo.nano.deployer.api/src/main/java/org/eclipse/virgo/nano/deployer/api/core/ApplicationDeployer.java
new file mode 100644
index 0000000..0218d13
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer.api/src/main/java/org/eclipse/virgo/nano/deployer/api/core/ApplicationDeployer.java
@@ -0,0 +1,234 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2012 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   SAP AG - re-factoring
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.deployer.api.core;
+
+import java.net.URI;
+import java.util.List;
+
+import org.osgi.framework.Version;
+
+/**
+ * The ApplicationDeployer interface is the programmatic interface to the deployer subsystem for deploying applications
+ * and libraries.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations of this interface must be thread safe.
+ * 
+ */
+public interface ApplicationDeployer {
+
+    /**
+     * Deploys the artifact are the supplied <code>location</code>. The supplied <code>options</code> govern how the
+     * installed artifact is handled by the deployed, e.g. if it is recovered and re-installed upon warm restart.
+     * 
+     * @param uri The location of the artifact
+     * @param options The options for the installation
+     * @return The identity of the installed artifact
+     * @throws DeploymentException if installation fails.
+     */
+    DeploymentIdentity install(URI uri, DeploymentOptions options) throws DeploymentException;
+
+    /**
+     * Deploys the artifact are the supplied <code>location</code>. The supplied <code>options</code> govern how the
+     * installed artifact is handled by the deployed, e.g. if it is recovered and re-installed upon warm restart.
+     * <p />
+     * This method is equivalent to calling <code>install(location, new DeploymentOptions())</code>.
+     * 
+     * @param uri The location of the artifact
+     * @param options The options for the installation
+     * @return The identity of the installed artifact
+     * @throws DeploymentException if installation fails.
+     */
+    DeploymentIdentity install(URI uri) throws DeploymentException;
+
+    /**
+     * Deploy an application which may be either an OSGi application or a legacy application such as a WAR. This is used
+     * by admin. and hot deployment. A successfully deployed application is always recovered on warm restart but the
+     * application at the given location is not deleted when the application is undeployed. <br/>
+     * <p />
+     * This method is equivalent to calling <code>deploy(location, new DeploymentOptions())</code>.
+     * 
+     * @param uri the location of the application JAR file
+     * @return the {@link DeploymentIdentity} of the deployed application
+     * @throws DeploymentException
+     */
+    DeploymentIdentity deploy(URI uri) throws DeploymentException;
+
+    /**
+     * Deploys a bunch of deployable artifacts altogether so that if there are dependencies in between,they are resolved
+     * successfully. Note that this may not always be the case if they are deployed one by one through some of the other
+     * deploy methods. Therefore the method is convenient to solve dependency resolution issues that are caused due to
+     * the order in which deployable bundles are deployed.
+     * 
+     * @param uris the location paths of the deployable artifacts
+     * @param options the options for this deployment
+     * @return an array of the successfully deployed applications's {@link DeploymentIdentity}.
+     * @throws DeploymentException
+     */
+    DeploymentIdentity[] bulkDeploy(List<URI> uris, DeploymentOptions options) throws DeploymentException;
+
+    /**
+     * Deploy an application which may be either an OSGi application or a legacy application such as a WAR. This is used
+     * by admin. and hot deployment.
+     * 
+     * @param uri location of the artifact
+     * @param options the options for this deployment
+     * @return the {@link DeploymentIdentity} of the deployed application
+     * @throws DeploymentException
+     */
+    DeploymentIdentity deploy(URI uri, DeploymentOptions options) throws DeploymentException;
+
+    /**
+     * Deploy an artifact from the repository with the given type, name, and version. A successfully deployed
+     * application is always recovered on warm restart. <br/>
+     * <p />
+     * This method is equivalent to calling <code>deploy(type, name, version, new DeploymentOptions())</code>.
+     * 
+     * @param type the type of the artifact to deploy
+     * @param name the name of the artifact to deploy
+     * @param version the {@link Version} of the artifact to deploy
+     * @return the {@link DeploymentIdentity} of the deployed application
+     * @throws DeploymentException
+     */
+    DeploymentIdentity deploy(String type, String name, Version version) throws DeploymentException;
+
+    /**
+     * Deploy an artifact from the repository with the given type, name, and version.<br/>
+     * <p />
+     * If the given {@link DeploymentOptions} specify the artifact is owned by the deployer, then deployment fails and a
+     * deployment exception is thrown. This is to avoid the deployer deleting the artifact from the repository store.
+     * 
+     * @param type the type of the artifact to deploy
+     * @param name the name of the artifact to deploy
+     * @param version the {@link Version} of the artifact to deploy
+     * @param options of the deployment
+     * @return the {@link DeploymentIdentity} of the deployed application which must return <code>false</code> from
+     *         <code>getDeployerOwned</code>
+     * @throws DeploymentException
+     */
+    DeploymentIdentity deploy(String type, String name, Version version, DeploymentOptions options) throws DeploymentException;
+
+    /**
+     * Undeploy an application with a given symbolic name and version.
+     * 
+     * WARNING: there can be ambiguity if applications of distinct types have the same symbolic name and version, so
+     * this method is deprecated.
+     * 
+     * @param applicationSymbolicName the symbolic name of the application
+     * @param version the version of the application in string form
+     * @throws DeploymentException
+     * @deprecated in favour of the undeploy(String, String, String) which takes artifact type as first parameter
+     */
+    @Deprecated
+    void undeploy(String applicationSymbolicName, String version) throws DeploymentException;
+
+    /**
+     * Undeploy an application with a given type, name, and version.
+     * 
+     * @param type the type of the application
+     * @param name the symbolic name of the application
+     * @param version the version of the application in string form
+     * @throws DeploymentException
+     */
+    void undeploy(String type, String name, String version) throws DeploymentException;
+
+    /**
+     * Undeploy an application with a given {@link DeploymentIdentity}. The application may be either an OSGi
+     * application or a legacy application such as a WAR.
+     * <p>
+     * This method is equivalent to calling <code>undeploy(DeploymentIdentity, boolean)</code> with <code>false</code>.
+     * 
+     * @param deploymentIdentity the <code>DeploymentIdentity</code> of the application
+     * @throws DeploymentException
+     */
+    void undeploy(DeploymentIdentity deploymentIdentity) throws DeploymentException;
+
+    /**
+     * Undeploy an application with a given {@link DeploymentIdentity}. The application may be either an OSGi
+     * application or a legacy application such as a WAR.
+     * <p>
+     * The deleted parameter indicates whether the undeployment is a consequence of the artifact having been deleted.
+     * This affects the processing of "deployer owned" artifacts which undeploy would normally delete automatically. If
+     * the undeploy is a consequence of the artifact having been deleted, then undeploy must not delete the artifact
+     * automatically since this may actually delete a "new" artifact which has arrived shortly after the "old" artifact
+     * was deleted.
+     * 
+     * @param deploymentIdentity the <code>DeploymentIdentity</code> of the application
+     * @param deleted <code>true</code> if and only if undeploy is being driven as a consequence of the artifact having
+     *        been deleted
+     * @throws DeploymentException
+     */
+    void undeploy(DeploymentIdentity deploymentIdentity, boolean deleted) throws DeploymentException;
+
+    /**
+     * Refresh a single bundle of the application (PAR or bundle) which was deployed from the given URI and return the
+     * deployment identity of the deployed application. <br/>
+     * If the refresh is promoted to a redeploy then the DeploymentIdentity of the newly deployed application is
+     * returned.
+     * 
+     * @param uri location of the artifact
+     * @param symbolicName the bundle symbolic name of the bundle to be refreshed
+     * @return the {@link DeploymentIdentity} of the deployed application
+     * @throws DeploymentException
+     */
+    DeploymentIdentity refresh(URI uri, String symbolicName) throws DeploymentException;
+
+    /**
+     * Refresh any bundle with the given symbolic name and version and any bundles cloned from a bundle with the given
+     * symbolic name and version. If no bundles or cloned bundles match the given symbolic name and version, simply
+     * return and do not throw an exception. <br/>
+     * <p/>
+     * Certain bundles which are critical to the operation of the system may not be refreshed. If an attempt is made to
+     * refresh one of these bundles, a warning message is logged, the bundle is not refreshed, but any clones of the
+     * bundle are refreshed.
+     * 
+     * @param bundleSymbolicName the symbolic name of the bundle
+     * @param bundleVersion the version of the bundle
+     * @throws DeploymentException
+     */
+    void refreshBundle(String bundleSymbolicName, String bundleVersion) throws DeploymentException;
+
+    /**
+     * Get a list of deployed applications.
+     * 
+     * @return Array of deployed application identities.
+     */
+    DeploymentIdentity[] getDeploymentIdentities();
+
+    /**
+     * Get the {@link DeploymentIdentity} of an application deployed from the given location. If no such application was
+     * found, return <code>null</code>. <br/>
+     * <p />
+     * Although the deployer currently prevents two applications being deployed from the same location without
+     * un-deploying the first application, this restriction may be lifted in the future in which case this method will
+     * return one of potentially many applications deployed from the given location.
+     * 
+     * @param uri location of the artifact
+     * @return a <code>DeploymentIdentity</code> or <code>null</code>
+     */
+    DeploymentIdentity getDeploymentIdentity(URI uri);
+
+    /**
+     * Determine whether or not the given artifact is already deployed. Return <code>true</code> if the given artefact
+     * at its file's last modified time is already deployed. Returns <code>false</false> in case 
+     * 1. The artefact is not deployed at all. 
+     * 2. There was an offline update of the deployed artefact.
+     * The last modified time is only taken into account if the file was deployed on a previous run of the Server.
+     * 
+     * @param uri location of the artifact
+     * @return <code>true</code> if and only if the given artifact at its file's last modified time is already deployed
+     */
+    boolean isDeployed(URI uri);
+}
diff --git a/nano/org.eclipse.virgo.nano.deployer.api/src/main/java/org/eclipse/virgo/nano/deployer/api/core/DeployUriNormaliser.java b/nano/org.eclipse.virgo.nano.deployer.api/src/main/java/org/eclipse/virgo/nano/deployer/api/core/DeployUriNormaliser.java
new file mode 100644
index 0000000..2a027c8
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer.api/src/main/java/org/eclipse/virgo/nano/deployer/api/core/DeployUriNormaliser.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2012 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   SAP AG - re-factoring
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.deployer.api.core;
+
+import java.net.URI;
+
+
+/**
+ * A <code>DeployUriNormaliser</code> is used to normalise deploy {@link URI URIs} such that they're suitable for
+ * consumption by the deployer's internals.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations <strong>must</strong> be thread-safe.
+ * 
+ */
+public interface DeployUriNormaliser {
+
+    /**
+     * Normalises the supplied <code>uri</code> such that it is suitable for consumption by the deployer. If the
+     * <code>uri</code> is not understood, <code>null</code> is returned.
+     * 
+     * @param uri The {@link URI} to normalise
+     * @return The normalised <code>URI</code>.
+     * 
+     * @throws DeploymentException if the <code>uri</code> is understood but it cannot be normalised.
+     */
+    URI normalise(URI uri) throws DeploymentException;
+}
diff --git a/nano/org.eclipse.virgo.nano.deployer.api/src/main/java/org/eclipse/virgo/nano/deployer/api/core/DeployerConfiguration.java b/nano/org.eclipse.virgo.nano.deployer.api/src/main/java/org/eclipse/virgo/nano/deployer/api/core/DeployerConfiguration.java
new file mode 100644
index 0000000..f0093b9
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer.api/src/main/java/org/eclipse/virgo/nano/deployer/api/core/DeployerConfiguration.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2012 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   SAP AG - re-factoring
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.deployer.api.core;
+
+import org.eclipse.virgo.util.io.PathReference;
+
+/**
+ * {@link DeployerConfiguration} provides access to the deployer configuration values.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations of this interface must be thread safe.
+ * 
+ */
+public interface DeployerConfiguration {
+
+    /**
+     * Get the configured deployment timeout.
+     * 
+     * @return the timeout in seconds.
+     */
+    int getDeploymentTimeoutSeconds();
+
+    /**
+     * Get the configured deployment pickup directory.
+     * 
+     * @return the pickup directory as a {@link PathReference}.
+     */
+    PathReference getDeploymentPickupDirectory();
+
+    /**
+     * Get the configured scan interval.
+     *
+     * @return the scan interval in milliseconds.
+     */
+    int getScanIntervalMillis();
+}
diff --git a/nano/org.eclipse.virgo.nano.deployer.api/src/main/java/org/eclipse/virgo/nano/deployer/api/core/DeployerLogEvents.java b/nano/org.eclipse.virgo.nano.deployer.api/src/main/java/org/eclipse/virgo/nano/deployer/api/core/DeployerLogEvents.java
new file mode 100644
index 0000000..9125aad
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer.api/src/main/java/org/eclipse/virgo/nano/deployer/api/core/DeployerLogEvents.java
@@ -0,0 +1,109 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2012 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   SAP AG - re-factoring
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.deployer.api.core;
+
+import org.eclipse.virgo.nano.serviceability.LogEventDelegate;
+import org.eclipse.virgo.medic.eventlog.Level;
+import org.eclipse.virgo.medic.eventlog.LogEvent;
+
+/**
+ * Defines all the {@link LogEvent LogEvents} for the deployer subsystem.
+ * 
+ * <strong>Concurrent Semantics</strong><br/>
+ * 
+ * Implementation is immutable.
+ * 
+ */
+public enum DeployerLogEvents implements LogEvent {
+
+    INSTALLING(0, Level.INFO), //
+    INSTALLED(1, Level.INFO), //
+    INSTALL_FAILURE(2, Level.ERROR), //
+    INSTALL_FAILED(3, Level.ERROR), //
+    STARTING(4, Level.INFO), //
+    STARTED(5, Level.INFO), //
+    START_FAILED(6, Level.ERROR), //
+    REFRESHING(7, Level.INFO), //
+    REFRESHED(8, Level.INFO), //
+    REFRESH_FAILED(9, Level.ERROR), //
+    STOPPING(10, Level.INFO), //
+    STOPPED(11, Level.INFO), //
+    STOP_FAILED(12, Level.ERROR), //
+    UNINSTALLING(13, Level.INFO), //
+    UNINSTALLED(14, Level.INFO), //
+    UNINSTALL_FAILED(15, Level.ERROR), //
+    
+    INSTALL_ARTIFACT_REFRESH_NOT_SUPPORTED(50, Level.WARNING), //
+    
+    NESTED_SCOPES_NOT_SUPPORTED(60, Level.ERROR), //
+    
+    CANNOT_REFRESH_BUNDLE_IDENTITY_CHANGED(70, Level.WARNING), //
+    CANNOT_REFRESH_BUNDLE_AS_SCOPED_AND_EXPORTS_CHANGED(71, Level.WARNING),
+
+    INSTALL_ARTIFACT_DAG_NOT_SUPPORTED(80, Level.ERROR), //
+    
+    WATCHED_REPOSITORY_REFRESH_FAILED(90, Level.WARNING), //
+    WATCHED_REPOSITORIES_REFRESH_FAILED(91, Level.WARNING), //
+ 
+    RECOVERY_FAILED(200, Level.ERROR), //
+
+    DUPLICATE_PACKAGE_DURING_SCOPING(300, Level.ERROR), //
+    DUPLICATE_BSN_IN_SCOPE(301, Level.ERROR), //
+    CONFIG_FILE_ERROR(302, Level.ERROR), //   
+
+    DISCARDING_BUNDLE_UPDATE_LOCATION(400, Level.WARNING), //
+    MISSING_BUNDLE_SYMBOLIC_NAME(401, Level.ERROR), //
+    BUNDLE_MANIFEST_NOT_FOUND(402, Level.ERROR), //
+
+    UNABLE_TO_SATISFY_CONSTRAINTS(500, Level.ERROR), //
+    UNSUPPORTED_URI_SCHEME(501, Level.ERROR), //
+    START_TIMED_OUT(502, Level.ERROR), //    
+    REFRESH_REQUEST_URI_NOT_FOUND(503, Level.ERROR), //
+    REFRESH_REQUEST_COMPLETED(504, Level.INFO), //
+    REFRESH_REQUEST_FAILED(505, Level.ERROR), //
+    UNDEPLOY_ARTEFACT_NOT_FOUND(506, Level.ERROR), //
+    REFRESH_ARTEFACT_NOT_FOUND(507, Level.ERROR), //
+    START_ABORTED(508, Level.INFO), //    
+
+    JAR_UNPACK_ERROR(600, Level.ERROR), //
+
+    ARTIFACT_NOT_FOUND(700, Level.ERROR), //
+    INDETERMINATE_ARTIFACT_TYPE(701, Level.ERROR), //
+    MISSING_ARTIFACT_FACTORY(702, Level.ERROR), //
+
+    REPOSITORY_DEPLOYMENT_URI_MALFORMED(800, Level.ERROR), //
+    REPOSITORY_DEPLOYMENT_INVALID_VERSION(801, Level.ERROR);
+
+    private static final String PREFIX = "DE";
+
+    private final LogEventDelegate delegate;
+
+    private DeployerLogEvents(int code, Level level) {
+        this.delegate = new LogEventDelegate(PREFIX, code, level);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getEventCode() {
+        return this.delegate.getEventCode();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Level getLevel() {
+        return this.delegate.getLevel();
+    }
+
+}
diff --git a/nano/org.eclipse.virgo.nano.deployer.api/src/main/java/org/eclipse/virgo/nano/deployer/api/core/DeploymentException.java b/nano/org.eclipse.virgo.nano.deployer.api/src/main/java/org/eclipse/virgo/nano/deployer/api/core/DeploymentException.java
new file mode 100644
index 0000000..f5f22da
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer.api/src/main/java/org/eclipse/virgo/nano/deployer/api/core/DeploymentException.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2012 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   SAP AG - re-factoring
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.deployer.api.core;
+
+/**
+ * Signals a checked exception to the caller of the deployer subsystem.
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br/>
+ * 
+ * This class is thread safe.
+ * 
+ */
+public class DeploymentException extends Exception {
+
+    private static final long serialVersionUID = -6809659761040724153L;
+
+    private final boolean diagnosed;
+
+    /**
+     * Creates a new <code>DeploymentException</code> with the supplied error message that has not already been
+     * diagnosed. Equivalent to calling {@link #DeploymentException(String, boolean) DeploymentException(message,
+     * false)}.
+     * 
+     * @param message The exception's message
+     */
+    public DeploymentException(String message) {
+        this(message, false);
+
+    }
+
+    /**
+     * Creates a new <code>DeploymentException</code> with the supplied error message. <code>diagnosed</code> can be
+     * used to indicate whether or not this problem has already been diagnosed. If <code>true</code> the caller
+     * <strong>must</strong> ensure that the user has already been given sufficient information to diagnose the problem.
+     * 
+     * @param message The exception's message
+     * @param diagnosed <code>true</code> if already diagnosed, otherwise <code>false</code>.
+     */
+    public DeploymentException(String message, boolean diagnosed) {
+        super(message);
+        this.diagnosed = diagnosed;
+    }
+
+    /**
+     * Creates a new <code>DeploymentException</code>, with the supplied error message and cause, that has not already
+     * been diagnosed. Equivalent to calling {@link #DeploymentException(String, Throwable, boolean)
+     * DeploymentException(message, cause, false)}.
+     * 
+     * @param message The exception's message.
+     * @param cause The exception's cause.
+     */
+    public DeploymentException(String message, Throwable cause) {
+        this(message, cause, false);
+    }
+
+    /**
+     * Creates a new <code>DeploymentException</code> with the supplied error message and cause. <code>diagnosed</code>
+     * can be used to indicate whether or not this problem has already been diagnosed. If <code>true</code> the caller
+     * <strong>must</strong> ensure that the user has already been given sufficient information to diagnose the problem.
+     * 
+     * @param message The exception's message.
+     * @param cause The exception's cause.
+     * @param diagnosed <code>true</code> if already diagnosed, otherwise <code>false</code>.
+     */
+    public DeploymentException(String message, Throwable cause, boolean diagnosed) {
+        super(message, cause);
+        this.diagnosed = diagnosed;
+    }
+
+    /**
+     * Returns <code>true</code> if this exception has already been diagnosed and no further information relating to
+     * this exception needs to be conveyed to the user.
+     * 
+     * @return <code>true</code> if already diagnosed, otherwise <code>false</code>.
+     */
+    public boolean isDiagnosed() {
+        return diagnosed;
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.deployer.api/src/main/java/org/eclipse/virgo/nano/deployer/api/core/DeploymentIdentity.java b/nano/org.eclipse.virgo.nano.deployer.api/src/main/java/org/eclipse/virgo/nano/deployer/api/core/DeploymentIdentity.java
new file mode 100644
index 0000000..401d40c
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer.api/src/main/java/org/eclipse/virgo/nano/deployer/api/core/DeploymentIdentity.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2012 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   SAP AG - re-factoring
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.deployer.api.core;
+
+import java.io.Serializable;
+
+/**
+ * {@link DeploymentIdentity} is an interface for the serializable objects returned when an artefact is deployed.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations of this interface must be thread safe.
+ * 
+ */
+public interface DeploymentIdentity extends Serializable {
+    
+    /**
+     * Get the type of the deployed artefact with this {@link DeploymentIdentity}.
+     * 
+     * @return the type of the deployed artefact
+     */
+    String getType();
+    
+    /**
+     * Get the name of the deployed artefact with this {@link DeploymentIdentity}.
+     * 
+     * @return the symbolic name of the deployed artefact
+     */
+    String getSymbolicName();
+    
+    /**
+     * Get the version of the deployed artefact with this {@link DeploymentIdentity}.
+     * 
+     * @return the version of the deployed artefact
+     */
+    String getVersion();
+
+}
diff --git a/nano/org.eclipse.virgo.nano.deployer.api/src/main/java/org/eclipse/virgo/nano/deployer/api/core/DeploymentOptions.java b/nano/org.eclipse.virgo.nano.deployer.api/src/main/java/org/eclipse/virgo/nano/deployer/api/core/DeploymentOptions.java
new file mode 100644
index 0000000..b1b6bab
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer.api/src/main/java/org/eclipse/virgo/nano/deployer/api/core/DeploymentOptions.java
@@ -0,0 +1,112 @@
+package org.eclipse.virgo.nano.deployer.api.core;
+
+import java.net.URI;
+
+/**
+ * {@link DeploymentOptions} provides a collection of deployment options.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is immutable and therefore thread safe.
+ */
+public class DeploymentOptions {
+
+    public static final DeploymentOptions DEFAULT_DEPLOYMENT_OPTIONS = new DeploymentOptions();
+
+    private final boolean recoverable;
+
+    private final boolean deployerOwned;
+
+    private final boolean synchronous;
+
+    /**
+     * Create default deployment options.
+     */
+    public DeploymentOptions() {
+        this.recoverable = true;
+        this.deployerOwned = false;
+        this.synchronous = true;
+    }
+
+    /**
+     * Create deployment options with the given recoverability, ownership, and synchronisation.
+     * 
+     * @param recoverable <code>true</code> if and only if the application is to persist across Server restarts
+     * @param deployerOwned <code>true</code> if and only if the application at the location specified on deployment
+     *        is to be deleted when the application is undeployed
+     * @param synchronous <code>true</code> if and only if the application should be deployed synchronously
+     */
+    public DeploymentOptions(boolean recoverable, boolean deployerOwned, boolean synchronous) {
+        this.recoverable = recoverable;
+        this.deployerOwned = deployerOwned;
+        this.synchronous = synchronous;
+    }
+
+    /**
+     * Get the recoverability option.
+     * 
+     * @return <code>true</code> if and only if the application is to persist across Server restarts
+     */
+    public boolean getRecoverable() {
+        return this.recoverable;
+    }
+
+    /**
+     * Get the ownership option.
+     * 
+     * @return <code>true</code> if and only if the application at the location specified on deployment is to be
+     *         deleted when the application is undeployed
+     */
+    public boolean getDeployerOwned() {
+        return this.deployerOwned;
+    }
+
+    /**
+     * Get the synchronisation option which is <code>true</code> if and only if the application should be deployed
+     * synchronously.
+     * <p/>
+     * Deploying synchronously means that control does not return to the caller of the
+     * {@link org.eclipse.virgo.nano.deployer.api.core.ApplicationDeployer#deploy(URI, DeploymentOptions) deploy}
+     * method until any application contexts for the application have been built and published in the service
+     * registry or deployment fails or times out.
+     * <p/>
+     * Deploying asynchronously means that control returns to the caller of the
+     * {@link org.eclipse.virgo.nano.deployer.api.core.ApplicationDeployer#deploy(URI, DeploymentOptions) deploy}
+     * method once the application has been started, but not necessarily before any application contexts have been
+     * built and published.
+     * 
+     * @return <code>true</code> if and only if the application should be deployed synchronously
+     */
+    public boolean getSynchronous() {
+        return this.synchronous;
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + (deployerOwned ? 1231 : 1237);
+        result = prime * result + (recoverable ? 1231 : 1237);
+        result = prime * result + (synchronous ? 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;
+        DeploymentOptions other = (DeploymentOptions) obj;
+        if (deployerOwned != other.deployerOwned)
+            return false;
+        if (recoverable != other.recoverable)
+            return false;
+        if (synchronous != other.synchronous)
+            return false;
+        return true;
+    }
+}
\ No newline at end of file
diff --git a/nano/org.eclipse.virgo.nano.deployer.api/src/main/java/org/eclipse/virgo/nano/deployer/api/core/FatalDeploymentException.java b/nano/org.eclipse.virgo.nano.deployer.api/src/main/java/org/eclipse/virgo/nano/deployer/api/core/FatalDeploymentException.java
new file mode 100644
index 0000000..c9553d8
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer.api/src/main/java/org/eclipse/virgo/nano/deployer/api/core/FatalDeploymentException.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2012 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   SAP AG - re-factoring
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.deployer.api.core;
+
+import org.eclipse.virgo.nano.serviceability.FatalServerException;
+
+/**
+ * Signals a fatal exception in the deployer subsystem.<p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br/>
+ * 
+ * Threadsafe.
+ * 
+ */
+public final class FatalDeploymentException extends FatalServerException {
+
+    private static final long serialVersionUID = 8857189976248973019L;
+
+    /** 
+     * Creates a new <code>FatalProfileException</code> with the supplied error message.
+     * 
+     * @param message The exception's message
+     */
+    public FatalDeploymentException(String message) {
+        super(message);
+    }
+
+    /** 
+     * Creates a new <code>FatalProfileException</code> with the supplied error message and cause.
+     * 
+     * @param message The exception's message
+     * @param cause The exception's cause
+     */
+    public FatalDeploymentException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+}
diff --git a/nano/org.eclipse.virgo.nano.deployer.api/src/main/resources/about.html b/nano/org.eclipse.virgo.nano.deployer.api/src/main/resources/about.html
new file mode 100644
index 0000000..c258ef5
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer.api/src/main/resources/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>June 5, 2006</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/nano/org.eclipse.virgo.nano.deployer.api/src/test/java/org/eclipse/virgo/nano/deployer/api/ArtifactIdentityTests.java b/nano/org.eclipse.virgo.nano.deployer.api/src/test/java/org/eclipse/virgo/nano/deployer/api/ArtifactIdentityTests.java
new file mode 100644
index 0000000..fd32e8f
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer.api/src/test/java/org/eclipse/virgo/nano/deployer/api/ArtifactIdentityTests.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.deployer.api;
+
+import static org.junit.Assert.assertEquals;
+
+import org.eclipse.virgo.nano.deployer.api.ArtifactIdentity;
+import org.junit.Test;
+
+
+/**
+ * ArtifactIdentityTests
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Test thread-safe
+ *
+ */
+public class ArtifactIdentityTests {
+    
+    @Test 
+    public void testArtifactIdentityConstruction() {
+        ArtifactIdentity ai = new ArtifactIdentity("type","name","version");
+        assertEquals("type", ai.getType());
+        assertEquals("name", ai.getName());
+        assertEquals("version", ai.getVersion());
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.deployer.api/src/test/java/org/eclipse/virgo/nano/deployer/api/core/DeploymentOptionsTests.java b/nano/org.eclipse.virgo.nano.deployer.api/src/test/java/org/eclipse/virgo/nano/deployer/api/core/DeploymentOptionsTests.java
new file mode 100644
index 0000000..dbda797
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer.api/src/test/java/org/eclipse/virgo/nano/deployer/api/core/DeploymentOptionsTests.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.deployer.api.core;
+
+import static org.junit.Assert.assertEquals;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentOptions;
+import org.junit.Test;
+
+
+/**
+ * <code>DeploymentOptionsTests</code> is a simple test of the {@link DeploymentOptions} class.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ * thread-safe
+ *
+ */
+public class DeploymentOptionsTests {
+    
+    @Test
+    public void constructionDefault() throws Exception {
+        DeploymentOptions deploymentOptions = new DeploymentOptions();
+    
+        assertOptions(deploymentOptions, "default", true, false, true);
+    }
+
+    private static void assertOptions(DeploymentOptions deploymentOptions, String name, boolean recoverable, boolean owned, boolean synchronous) {
+        assertEquals(name + " recoverable option", recoverable, deploymentOptions.getRecoverable());
+        assertEquals(name + " deployerOwned option", owned, deploymentOptions.getDeployerOwned());
+        assertEquals(name + " synchronous option", synchronous, deploymentOptions.getSynchronous());
+    }
+    
+    @Test
+    public void constructionUnowned() throws Exception {
+        DeploymentOptions deploymentOptions = new DeploymentOptions(true, false, true);
+    
+        assertOptions(deploymentOptions, "unowned", true, false, true);
+    }
+    
+    @Test
+    public void constructionOwned() throws Exception {
+        DeploymentOptions deploymentOptions = new DeploymentOptions(true, true, true);
+    
+        assertOptions(deploymentOptions, "owned", true, true, true);
+    }
+    
+    @Test
+    public void constructionNonRecoverable() throws Exception {
+        DeploymentOptions deploymentOptions = new DeploymentOptions(false, false, true);
+    
+        assertOptions(deploymentOptions, "non-recoverable", false, false, true);
+    }
+    
+
+}
diff --git a/nano/org.eclipse.virgo.nano.deployer.api/src/test/resources/.gitignore b/nano/org.eclipse.virgo.nano.deployer.api/src/test/resources/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer.api/src/test/resources/.gitignore
diff --git a/nano/org.eclipse.virgo.nano.deployer.api/template.mf b/nano/org.eclipse.virgo.nano.deployer.api/template.mf
new file mode 100644
index 0000000..41bc7b0
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer.api/template.mf
@@ -0,0 +1,16 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Virgo Deployer API
+Bundle-SymbolicName: org.eclipse.virgo.nano.deployer.api
+Bundle-Version: ${version}
+Import-Template: 
+ org.eclipse.virgo.nano.*;version="${version:[=.=.=, =.+1)}",
+ org.eclipse.virgo.util.*;version="${version:[=.=.=, =.+1)}",
+ org.eclipse.virgo.medic.*;version="${version:[=.=.=, =.+1)}",
+ org.osgi.framework.*;version="0",
+ javax.management.*;version="0",
+ javax.xml.*;version="0",
+ org.xml.*;version="0",
+ org.w3c.*;version="0"
+Excluded-Exports:
+ *.internal.*
diff --git a/nano/org.eclipse.virgo.nano.deployer.hot/findbugs-exclude.xml b/nano/org.eclipse.virgo.nano.deployer.hot/findbugs-exclude.xml
new file mode 100644
index 0000000..d3f5a12
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer.hot/findbugs-exclude.xml
@@ -0,0 +1 @@
+

diff --git a/nano/org.eclipse.virgo.nano.deployer.hot/src/main/java/org/eclipse/virgo/nano/deployer/hot/HotDeployer.java b/nano/org.eclipse.virgo.nano.deployer.hot/src/main/java/org/eclipse/virgo/nano/deployer/hot/HotDeployer.java
new file mode 100644
index 0000000..6fd30ef
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer.hot/src/main/java/org/eclipse/virgo/nano/deployer/hot/HotDeployer.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.deployer.hot;
+
+import java.io.File;
+
+import org.eclipse.virgo.nano.deployer.api.core.ApplicationDeployer;
+import org.eclipse.virgo.nano.deployer.api.core.DeployerConfiguration;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.util.io.FileSystemChecker;
+import org.eclipse.virgo.util.io.PathReference;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Handles hot deployment of application artefacts.
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.
+ * 
+ */
+public final class HotDeployer {
+
+    private static final String EXCLUDE_PATTERN = "\\.DS_Store|\\.state";
+
+    private Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private final Object lifecycleLock = new Object();
+
+    private final File pickupDir;
+    
+    private final Thread thread;
+
+    /**
+     * Creates a new <code>HotDeployer</code>.
+     * 
+     * @param deployerConfiguration the {@link DeployerConfiguration} parameters.
+     * @param deployer the {@link ApplicationDeployer} to deploy to.
+     * @param eventLogger where to log events
+     */
+    public HotDeployer(@NonNull DeployerConfiguration deployerConfiguration, @NonNull ApplicationDeployer deployer, EventLogger eventLogger) {
+        this.pickupDir = createHotDeployDir(deployerConfiguration.getDeploymentPickupDirectory());
+        FileSystemChecker checker = createFileSystemChecker(deployer, eventLogger);
+        this.thread = new Thread(new WatchTask(checker, this.pickupDir, deployerConfiguration.getScanIntervalMillis()), "fs-watcher");
+    }
+
+	private FileSystemChecker createFileSystemChecker(ApplicationDeployer deployer, EventLogger eventLogger) {
+		FileSystemChecker checker = new FileSystemChecker(this.pickupDir, EXCLUDE_PATTERN, this.logger);
+        checker.addListener(new HotDeploymentFileSystemListener(deployer, eventLogger));
+		return checker;
+	}
+
+    /**
+     * Creates the hot deployment directory.
+     * 
+     * @param pickUpDirectoryPath the {@link PathReference} location of the pickup directory.
+     * @return the {@link File} of the hot deployment directory.
+     */
+    private File createHotDeployDir(@NonNull PathReference pickUpDirectoryPath) {
+        if (pickUpDirectoryPath.isFile()) {
+            logger.debug("Deleting stray file from hot deployment directory location '{}'.", pickUpDirectoryPath.getAbsolutePath());
+            pickUpDirectoryPath.delete();
+        }
+        if (!pickUpDirectoryPath.exists()) {
+            logger.info("Creating hot deployment directory at '{}'.", pickUpDirectoryPath.getAbsolutePath());
+            pickUpDirectoryPath.createDirectory();
+        } else {
+            logger.info("Using hot deployment directory at '{}'.", pickUpDirectoryPath.getAbsolutePath());
+        }
+        return pickUpDirectoryPath.toFile();
+    }
+
+    /**
+     * Start the <code>FileSystemWatcher</code>.
+     */
+    public void doStart() {
+        synchronized (this.lifecycleLock) {
+            if (this.thread != null) {
+                this.thread.start();
+                logger.info("Started hot deployer on '{}'.", this.pickupDir);
+            }
+        }
+    }
+
+    /**
+     * Stop the <code>FileSystemWatcher</code>,
+     */
+    public void doStop() {
+        synchronized (this.lifecycleLock) {
+            if (this.thread != null) {
+                logger.info("Stopping hot deployer");
+                this.thread.interrupt();
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String toString() {
+        return String.format("Hot Deployer [pickupDir = %s]", this.pickupDir.getAbsolutePath());
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.deployer.hot/src/main/java/org/eclipse/virgo/nano/deployer/hot/HotDeployerFileSystemListener.java b/nano/org.eclipse.virgo.nano.deployer.hot/src/main/java/org/eclipse/virgo/nano/deployer/hot/HotDeployerFileSystemListener.java
new file mode 100644
index 0000000..81e1f3f
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer.hot/src/main/java/org/eclipse/virgo/nano/deployer/hot/HotDeployerFileSystemListener.java
@@ -0,0 +1,250 @@
+/*******************************************************************************
+ * Copyright (c) 2012 SAP AG
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   SAP AG - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.deployer.hot;
+
+import java.io.File;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.medic.eventlog.LogEvent;
+import org.eclipse.virgo.nano.deployer.api.core.ApplicationDeployer;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentOptions;
+import org.eclipse.virgo.nano.deployer.api.core.FatalDeploymentException;
+import org.eclipse.virgo.nano.serviceability.NonNull;
+import org.eclipse.virgo.util.io.FileSystemEvent;
+import org.eclipse.virgo.util.io.FileSystemListener;
+import org.eclipse.virgo.util.io.PathReference;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * {@link FileSystemListener} that monitors a pickup directory for file system events. When a file is created it is
+ * passed to the {@link ApplicationDeployer} for deployment. When a file is modified, it is re-deployed. When a file is
+ * deleted, the application is undeployed.
+ * <p />
+ * The <code>ApplicationDeployer</code> is responsible for recovering the files deployed via this route and is given
+ * ownership of these files so that undeploying one of them, e.g. by name and version, will delete the corresponding
+ * file in the pickup directory.
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.
+ * 
+ */
+final class HotDeploymentFileSystemListener implements FileSystemListener {
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private final EventLogger eventLogger;
+
+    private final ApplicationDeployer deployer;
+
+    /**
+     * Creates a new <code>HotDeploymentFileSystemListener</code>.
+     * 
+     * @param deployer the {@link ApplicationDeployer} to deploy to.
+     * @param eventLogger where to log events
+     */
+    public HotDeploymentFileSystemListener(@NonNull ApplicationDeployer deployer, EventLogger eventLogger) {
+        this.deployer = deployer;
+        this.eventLogger = eventLogger;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * Reacts to changes in the pickup directory and calls the {@link ApplicationDeployer} as appropriate.
+     */
+    @Override
+    public void onChange(String path, FileSystemEvent event) {
+        String fileName = new PathReference(path).getName();
+        this.eventLogger.log(HotDeployerLogEvents.HOT_DEPLOY_PROCESSING_FILE, event, fileName);
+        try {
+            if (event == FileSystemEvent.CREATED) {
+                this.logger.info("ApplicationDeploying path '{}'.", path);
+                deploy(path);
+            } else if (event == FileSystemEvent.MODIFIED) {
+                this.logger.info("Redeploying path '{}'.", path);
+                deploy(path);
+            } else if (event == FileSystemEvent.DELETED) {
+                this.logger.info("ApplicationUndeploying path '{}'.", path);
+                undeploy(path);
+            } else if (event == FileSystemEvent.INITIAL) {
+                this.logger.info("ApplicationConditionallyDeploying path '{}'.", path);
+                deployIfNotDeployed(path, fileName);
+            }
+        } catch (Exception ex) {
+            ex.printStackTrace(System.out);
+            determineFailureAndLogMessage(event, fileName, ex);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * Reacts to initial event in the pickup directory and calls the bulk deploy method in {@link ApplicationDeployer}.
+     */
+    @Override
+    public void onInitialEvent(List<String> paths) {
+        this.eventLogger.log(HotDeployerLogEvents.HOT_DEPLOY_PROCESSING_FILE, FileSystemEvent.INITIAL, getConcatenatedPaths(paths));
+        try {
+            bulkDeployIfNotDeployed(paths);
+        } catch (Exception ex) {
+            ex.printStackTrace(System.out);
+            determineFailureAndLogMessage(FileSystemEvent.INITIAL, getConcatenatedPaths(paths), ex);
+        }
+    }
+
+    private String getConcatenatedPaths(List<String> paths) {
+        StringBuilder sb = new StringBuilder("");
+        for (String path : paths) {
+            sb.append(new PathReference(path).getName()).append("; ");
+        }
+        return new String(sb);
+    }
+
+    /**
+     * Returns only the source artifacts' URIs that need to be deployed or updated.
+     */
+    private List<URI> getUrisToDeploy(List<String> sourceArtefacts) {
+        List<URI> resultUris = new ArrayList<URI>();
+        for (String sourceArtefact : sourceArtefacts) {
+            if (!isDeployed(sourceArtefact)) {
+                resultUris.add(getDefinitiveUri(sourceArtefact));
+                this.logger.info("ApplicationConditionallyDeploying path '{}'.", sourceArtefact);
+            } else {
+                this.eventLogger.log(HotDeployerLogEvents.HOT_DEPLOY_SKIPPED, sourceArtefact);
+            }
+        }
+        return resultUris;
+    }
+
+    /**
+     * Triggers bulk deployment of source artifacts that are not yet deployed.
+     * 
+     * @param sourceArtefact the source artifact URI string
+     * @throws DeploymentException
+     */
+    private void bulkDeployIfNotDeployed(List<String> sourceArtefacts) throws DeploymentException {
+        this.deployer.bulkDeploy(getUrisToDeploy(sourceArtefacts), new DeploymentOptions(true, true, false));
+    }
+
+    /**
+     * Determines the {@link LogEvent} that corresponds the {@link FileSystemEvent}.
+     */
+    private void determineFailureAndLogMessage(FileSystemEvent event, String fileName, Exception ex) {
+        switch (event) {
+            case CREATED: // fall through
+            case INITIAL:
+                this.eventLogger.log(HotDeployerLogEvents.HOT_DEPLOY_FAILED, ex, fileName);
+                break;
+            case MODIFIED:
+                this.eventLogger.log(HotDeployerLogEvents.HOT_REDEPLOY_FAILED, ex, fileName);
+                break;
+            case DELETED:
+                this.eventLogger.log(HotDeployerLogEvents.HOT_UNDEPLOY_FAILED, ex, fileName);
+                break;
+        }
+    }
+
+    /**
+     * Undeploys the application that corresponds to the supplied source artefact URI.
+     * 
+     * @param sourceArtefact the source artefact URI string
+     * @throws DeploymentException
+     */
+    private void undeploy(String sourceArtefact) throws DeploymentException {
+        DeploymentIdentity deploymentIdentity = getDeploymentIdentity(sourceArtefact);
+        if (deploymentIdentity != null) {
+            this.deployer.undeploy(deploymentIdentity);
+        }
+    }
+
+    /**
+     * Get the {@link DeploymentIdentity} of the given artefact. Return <code>null</code> if the given artefact is not
+     * currently deployed.
+     * 
+     * @param sourceArtefact the source artefact URI string
+     * @return the <code>DeploymentIdentity</code> of the given artefact or <code>null</code>
+     */
+    private DeploymentIdentity getDeploymentIdentity(String sourceArtefact) {
+        return this.deployer.getDeploymentIdentity(getDefinitiveUri(sourceArtefact));
+    }
+
+    /**
+     * Determine whether or not the given artefact is already deployed. Return <code>true</code> if the given artefact
+     * at its file's last modified time is already deployed.
+     * 
+     * @param sourceArtefact the source artefact URI string
+     * @return <code>true</code> if and only if the given artefact at its file's last modified time is already deployed
+     */
+    private boolean isDeployed(String sourceArtefact) {
+        return this.deployer.isDeployed(getDefinitiveUri(sourceArtefact));
+    }
+
+    /**
+     * Converts a string URI to a URI with a predictable format, particularly in the case where the string URI ends in a
+     * file separator.
+     * 
+     * @param sourceArtefact the URI string
+     * @return
+     */
+    private URI getDefinitiveUri(String sourceArtefact) {
+        URI baseUri = new File(sourceArtefact).toURI();
+        if (sourceArtefact.endsWith(File.separator) && !baseUri.toString().endsWith("/")) {
+            try {
+                baseUri = new URI(baseUri.toString() + "/");
+            } catch (URISyntaxException e) {
+                throw new FatalDeploymentException("Unexpected URI syntax problem.", e);
+            }
+        }
+        return baseUri;
+    }
+
+    /**
+     * Deploys the application at the supplied PathReference asynchronously.
+     * 
+     * @param sourceArtefact the source artefact URI string
+     * @throws DeploymentException
+     */
+    private void deploy(String sourceArtefact) throws DeploymentException {
+        this.deployer.deploy(getDefinitiveUri(sourceArtefact), new DeploymentOptions(true, true, false));
+    }
+
+    /**
+     * Deploys the application at the supplied PathReference if it is not already deployed.
+     * 
+     * @param sourceArtefact the source artefact URI string
+     * @param fileName the artefact file name
+     * @throws DeploymentException
+     */
+    private void deployIfNotDeployed(String sourceArtefact, String fileName) throws DeploymentException {
+        if (!isDeployed(sourceArtefact)) {
+            deploy(sourceArtefact);
+        } else {
+            this.eventLogger.log(HotDeployerLogEvents.HOT_DEPLOY_SKIPPED, fileName);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String toString() {
+        return "Hot Deploy Listener";
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.deployer.hot/src/main/java/org/eclipse/virgo/nano/deployer/hot/HotDeployerLogEvents.java b/nano/org.eclipse.virgo.nano.deployer.hot/src/main/java/org/eclipse/virgo/nano/deployer/hot/HotDeployerLogEvents.java
new file mode 100644
index 0000000..513b486
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer.hot/src/main/java/org/eclipse/virgo/nano/deployer/hot/HotDeployerLogEvents.java
@@ -0,0 +1,39 @@
+
+package org.eclipse.virgo.nano.deployer.hot;
+
+import org.eclipse.virgo.nano.serviceability.LogEventDelegate;
+import org.eclipse.virgo.medic.eventlog.Level;
+import org.eclipse.virgo.medic.eventlog.LogEvent;
+
+public enum HotDeployerLogEvents implements LogEvent {
+
+    HOT_DEPLOY_PROCESSING_FILE(1, Level.INFO), //
+    HOT_DEPLOY_FAILED(2, Level.ERROR), //
+    HOT_REDEPLOY_FAILED(3, Level.ERROR), //
+    HOT_UNDEPLOY_FAILED(4, Level.ERROR), //
+    HOT_DEPLOY_SKIPPED(5, Level.INFO);
+
+    private static final String PREFIX = "HD";
+
+    private final LogEventDelegate delegate;
+
+    private HotDeployerLogEvents(int code, Level level) {
+        this.delegate = new LogEventDelegate(PREFIX, code, level);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String getEventCode() {
+        return this.delegate.getEventCode();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Level getLevel() {
+        return this.delegate.getLevel();
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.deployer.hot/src/main/java/org/eclipse/virgo/nano/deployer/hot/WatchTask.java b/nano/org.eclipse.virgo.nano.deployer.hot/src/main/java/org/eclipse/virgo/nano/deployer/hot/WatchTask.java
new file mode 100644
index 0000000..39d0eab
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer.hot/src/main/java/org/eclipse/virgo/nano/deployer/hot/WatchTask.java
@@ -0,0 +1,55 @@
+
+package org.eclipse.virgo.nano.deployer.hot;
+
+import java.io.File;
+
+import org.eclipse.virgo.util.io.FileSystemChecker;
+import org.eclipse.virgo.util.io.FileSystemListener;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Task that monitors a given directory and notifies configured {@link FileSystemListener FileSystemListeners}.
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.
+ * 
+ */
+final class WatchTask implements Runnable {
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private final int scanIntervalMillis;
+
+    private final FileSystemChecker checker;
+
+    private final File watchDir;
+
+    WatchTask(FileSystemChecker checker, File watchDir, int scanIntervalMillis) {
+        this.checker = checker;
+        this.watchDir = watchDir;
+        this.scanIntervalMillis = scanIntervalMillis;
+    }
+
+    /**
+     * Watches the configured directory for modifications.
+     */
+    @Override
+    public void run() {
+        while (!Thread.currentThread().isInterrupted()) {
+            try {
+                Thread.sleep(this.scanIntervalMillis);
+            } catch (InterruptedException e) {
+                break;
+            }
+
+            try {
+                this.checker.check();
+            } catch (Throwable e) {
+                this.logger.error("Error watching directory '{}'", e, this.watchDir.getAbsolutePath());
+            }
+        }
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.deployer.hot/src/main/resources/about.html b/nano/org.eclipse.virgo.nano.deployer.hot/src/main/resources/about.html
new file mode 100644
index 0000000..c258ef5
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer.hot/src/main/resources/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>June 5, 2006</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/nano/org.eclipse.virgo.nano.deployer.hot/src/test/java/org/eclipse/virgo/nano/deployer/hot/HotDeployerFileSystemListenerTests.java b/nano/org.eclipse.virgo.nano.deployer.hot/src/test/java/org/eclipse/virgo/nano/deployer/hot/HotDeployerFileSystemListenerTests.java
new file mode 100644
index 0000000..6852b6f
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer.hot/src/test/java/org/eclipse/virgo/nano/deployer/hot/HotDeployerFileSystemListenerTests.java
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.deployer.hot;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.eq;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.isA;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+
+import java.io.File;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import org.eclipse.virgo.nano.deployer.api.core.ApplicationDeployer;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentOptions;
+import org.eclipse.virgo.nano.deployer.hot.HotDeploymentFileSystemListener;
+import org.eclipse.virgo.medic.test.eventlog.MockEventLogger;
+import org.eclipse.virgo.util.io.FileSystemEvent;
+
+public class HotDeployerFileSystemListenerTests {
+
+    private HotDeploymentFileSystemListener listener;
+
+    private ApplicationDeployer deployer;
+
+    private DeploymentIdentity deploymentIdentity;
+
+    @Before
+    public void initialise() {
+        deployer = createMock(ApplicationDeployer.class);
+        listener = new HotDeploymentFileSystemListener(deployer, new MockEventLogger());
+        deploymentIdentity = createMock(DeploymentIdentity.class);
+    }
+
+    @Test
+    public void appCreated() throws Exception {
+        File app = new File("path/to/app");
+        expect(deployer.deploy(eq(app.toURI()), isA(DeploymentOptions.class))).andReturn(deploymentIdentity);
+        replay(deployer);
+        listener.onChange("path/to/app", FileSystemEvent.CREATED);
+        verify(deployer);
+    }
+
+    @Test
+    public void newAppDuringStartup() throws Exception {
+        File app = new File("path/to/app");
+        expect(deployer.isDeployed(app.toURI())).andReturn(false);
+        expect(deployer.deploy(eq(app.toURI()), isA(DeploymentOptions.class))).andReturn(deploymentIdentity);
+        replay(deployer);
+        listener.onChange("path/to/app", FileSystemEvent.INITIAL);
+        verify(deployer);
+    }
+
+    @Test
+    public void existingAppDuringStartup() throws Exception {
+        File app = new File("path/to/app");
+        expect(deployer.isDeployed(app.toURI())).andReturn(true);
+        replay(deployer);
+        listener.onChange("path/to/app", FileSystemEvent.INITIAL);
+        verify(deployer);
+    }
+
+    @Test
+    public void appModified() throws Exception {
+        File app = new File("path/to/app");
+        expect(deployer.deploy(eq(app.toURI()), isA(DeploymentOptions.class))).andReturn(deploymentIdentity);
+        replay(deployer);
+        listener.onChange("path/to/app", FileSystemEvent.MODIFIED);
+        verify(deployer);
+    }
+
+    @Test
+    public void appDeleted() throws Exception {
+        File app = new File("path/to/app");
+        expect(deployer.getDeploymentIdentity(app.toURI())).andReturn(this.deploymentIdentity);
+        deployer.undeploy(this.deploymentIdentity);
+
+        replay(deployer);
+        listener.onChange("path/to/app", FileSystemEvent.DELETED);
+        verify(deployer);
+    }
+
+    @Test
+    public void nonexistentAppDeleted() throws Exception {
+        File app = new File("path/to/app");
+        expect(deployer.getDeploymentIdentity(app.toURI())).andReturn(null);
+        replay(deployer);
+        listener.onChange("path/to/app", FileSystemEvent.DELETED);
+        verify(deployer);
+    }
+
+}
diff --git a/nano/org.eclipse.virgo.nano.deployer.hot/template.mf b/nano/org.eclipse.virgo.nano.deployer.hot/template.mf
new file mode 100644
index 0000000..1425b2e
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer.hot/template.mf
@@ -0,0 +1,11 @@
+Manifest-Version: 1.0

+Bundle-ManifestVersion: 2

+Bundle-Name: Virgo Hot Deployer

+Bundle-Version: ${version}

+Bundle-SymbolicName: org.eclipse.virgo.nano.deployer.hot

+Import-Template: org.eclipse.virgo.util.*;version="${version:[=.=.=, =.+1)}",

+ org.eclipse.virgo.medic.*;version="${version:[=.=.=, =.+1)}",

+ org.eclipse.virgo.nano.*;version="${version:[=.=.=, =.+1)}",

+ org.slf4j.*;version="0"

+Excluded-Exports: 

+ *.internal.*

diff --git a/nano/org.eclipse.virgo.nano.deployer/build.properties b/nano/org.eclipse.virgo.nano.deployer/build.properties
new file mode 100644
index 0000000..10a236a
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer/build.properties
@@ -0,0 +1,7 @@
+source.. = src/main/java/,\
+           src/main/resources/,\
+           src/test/java/,\
+           src/test/resources/
+bin.includes = META-INF/,\
+			OSGI-INF/
+               .
diff --git a/nano/org.eclipse.virgo.nano.deployer/findbugs-exclude.xml b/nano/org.eclipse.virgo.nano.deployer/findbugs-exclude.xml
new file mode 100644
index 0000000..98983db
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer/findbugs-exclude.xml
@@ -0,0 +1,8 @@
+<FindBugsFilter>
+     <!-- Exclusions -->
+     <Match>
+       	<Bug pattern="ES_COMPARING_PARAMETER_STRING_WITH_EQ"/>
+        <Class name="org.eclipse.virgo.nano.deployer.api.core.module.StandardModule"/>
+        <Method name="unwrapNull"/>
+     </Match>	
+</FindBugsFilter>
diff --git a/nano/org.eclipse.virgo.nano.deployer/src/main/java/org/eclipse/virgo/nano/deployer/NanoDeployerLogEvents.java b/nano/org.eclipse.virgo.nano.deployer/src/main/java/org/eclipse/virgo/nano/deployer/NanoDeployerLogEvents.java
new file mode 100644
index 0000000..2318f1b
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer/src/main/java/org/eclipse/virgo/nano/deployer/NanoDeployerLogEvents.java
@@ -0,0 +1,56 @@
+package org.eclipse.virgo.nano.deployer;
+
+import org.eclipse.virgo.nano.serviceability.LogEventDelegate;
+import org.eclipse.virgo.medic.eventlog.Level;
+import org.eclipse.virgo.medic.eventlog.LogEvent;
+
+public enum NanoDeployerLogEvents implements LogEvent {
+
+    NANO_INSTALLING(1, Level.INFO), //
+    NANO_INSTALLED(2, Level.INFO), //
+    NANO_STARTING(3, Level.INFO), //
+    NANO_STARTED(4, Level.INFO), //
+    NANO_STOPPING(5, Level.INFO), //
+    NANO_STOPPED(6, Level.INFO), //
+    NANO_UNINSTALLING(7, Level.INFO), //
+    NANO_UNINSTALLED(8, Level.INFO), //
+    NANO_WEB_STARTING(9, Level.INFO), //
+    NANO_WEB_STARTED(10, Level.INFO), //
+    NANO_INSTALLING_ERROR(11, Level.ERROR), //
+    NANO_STARTING_ERROR(12, Level.ERROR), //
+    NANO_UPDATING_ERROR(13, Level.ERROR), //
+    NANO_PERSIST_ERROR(14, Level.WARNING), //
+    NANO_UPDATING(15, Level.INFO), //
+    NANO_UPDATED(16, Level.INFO), //
+    NANO_UPDATE_ERROR(17, Level.ERROR), //
+    NANO_UNDEPLOY_ERROR(18, Level.ERROR), //
+    NANO_REFRESHING_HOST(19, Level.INFO), //
+    NANO_REFRESHED_HOST(20, Level.INFO), //
+    NANO_REFRESH_HOST_ERROR(21, Level.ERROR), //
+    NANO_UNRECOGNIZED_TYPE(22, Level.ERROR), //
+    NANO_INVALID_FILE(23, Level.ERROR); //
+
+    private static final String PREFIX = "DE";
+
+    private final LogEventDelegate delegate;
+
+    private NanoDeployerLogEvents(int code, Level level) {
+        this.delegate = new LogEventDelegate(PREFIX, code, level);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String getEventCode() {
+        return this.delegate.getEventCode();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Level getLevel() {
+        return this.delegate.getLevel();
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.deployer/src/main/java/org/eclipse/virgo/nano/deployer/SimpleDeployer.java b/nano/org.eclipse.virgo.nano.deployer/src/main/java/org/eclipse/virgo/nano/deployer/SimpleDeployer.java
new file mode 100644
index 0000000..8fc9f00
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer/src/main/java/org/eclipse/virgo/nano/deployer/SimpleDeployer.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2012 SAP AG
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   SAP AG - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.deployer;
+
+import java.io.File;
+import java.net.URI;
+import java.util.List;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.osgi.framework.Bundle;
+
+public interface SimpleDeployer {
+
+    public final int HOT_DEPLOYED_ARTIFACTS_START_LEVEL = 5;
+
+    public boolean deploy(URI path);
+
+    public boolean install(URI path);
+
+    public boolean start(URI path);
+
+    public boolean update(URI path);
+
+    public boolean undeploy(Bundle bundle);
+
+    public boolean canServeFileType(String fileType);
+
+    public boolean isDeployed(URI path);
+    
+    public boolean isOfflineUpdated(URI path);
+
+    public DeploymentIdentity getDeploymentIdentity(URI path);
+
+    public List<String> getAcceptedFileTypes();
+
+    public boolean isDeployFileValid(File file);
+
+}
diff --git a/nano/org.eclipse.virgo.nano.deployer/src/main/java/org/eclipse/virgo/nano/deployer/StandardDeploymentIdentity.java b/nano/org.eclipse.virgo.nano.deployer/src/main/java/org/eclipse/virgo/nano/deployer/StandardDeploymentIdentity.java
new file mode 100644
index 0000000..b54affe
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer/src/main/java/org/eclipse/virgo/nano/deployer/StandardDeploymentIdentity.java
@@ -0,0 +1,108 @@
+package org.eclipse.virgo.nano.deployer;
+
+/*******************************************************************************
+ * Copyright (c) 2008, 2012 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   SAP AG - re-factoring
+ *******************************************************************************/
+
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.osgi.framework.Version;
+
+/**
+ * {@link StandardDeploymentIdentity} is the implementation of {@link DeploymentIdentity}.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * This class is immutable and therefore thread safe.
+ *
+ */
+public final class StandardDeploymentIdentity implements DeploymentIdentity {
+
+    private static final long serialVersionUID = 67849234293492373L;
+    
+    private final String type;
+    
+    private final String symbolicName;
+    
+    private final String version;
+        
+    /**
+     * Construct a {@link StandardDeploymentIdentity} with the given type, name, and version.
+     * 
+     * @param type the type of the deployed artefact
+     * @param symbolicName the symbolic name of the deployed artefact
+     * @param version the version of the deployed artefact
+     */
+    public StandardDeploymentIdentity(String type, String symbolicName, String version) {
+        this.type = type;
+        this.symbolicName = symbolicName;
+        
+        // Normalise the version to ensure accurate comparisons.
+        this.version = Version.parseVersion(version).toString();
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public String getType() {
+        return this.type;
+    }
+    
+    /** 
+     * {@inheritDoc}
+     */
+    public String getSymbolicName() {
+        return this.symbolicName;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public String getVersion() {
+        return this.version;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((type == null) ? 0 : type.hashCode());
+        result = prime * result + ((symbolicName == null) ? 0 : symbolicName.hashCode());
+        result = prime * result + ((version == null) ? 0 : version.hashCode());
+        return result;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj instanceof StandardDeploymentIdentity) {
+            final StandardDeploymentIdentity other = (StandardDeploymentIdentity) obj;
+            return (type        ==null ? other.type        ==null : type        .equals(other.type        ))
+            &&     (symbolicName==null ? other.symbolicName==null : symbolicName.equals(other.symbolicName))
+            &&     (version     ==null ? other.version     ==null : version     .equals(other.version     ))
+            ;
+        }
+        return false;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override public String toString() {
+        return "DeploymentIdentity(" + getType() + ", " + getSymbolicName() + ", " + getVersion() + ")";
+    }
+
+}
diff --git a/nano/org.eclipse.virgo.nano.deployer/src/main/java/org/eclipse/virgo/nano/deployer/internal/BundleDeployer.java b/nano/org.eclipse.virgo.nano.deployer/src/main/java/org/eclipse/virgo/nano/deployer/internal/BundleDeployer.java
new file mode 100644
index 0000000..8ccb8a8
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer/src/main/java/org/eclipse/virgo/nano/deployer/internal/BundleDeployer.java
@@ -0,0 +1,524 @@
+/*******************************************************************************
+ * Copyright (c) 2012 SAP AG
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   SAP AG - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.deployer.internal;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.URI;
+import java.net.URLDecoder;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.jar.JarFile;
+
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.nano.deployer.NanoDeployerLogEvents;
+import org.eclipse.virgo.nano.deployer.SimpleDeployer;
+import org.eclipse.virgo.nano.deployer.StandardDeploymentIdentity;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.eclipse.virgo.nano.deployer.util.BundleInfosUpdater;
+import org.eclipse.virgo.nano.deployer.util.BundleLocationUtil;
+import org.eclipse.virgo.nano.deployer.util.StatusFileModificator;
+import org.eclipse.virgo.util.io.FileCopyUtils;
+import org.eclipse.virgo.util.io.IOUtils;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifestFactory;
+import org.eclipse.virgo.util.osgi.manifest.FragmentHost;
+import org.eclipse.virgo.util.osgi.manifest.parse.BundleManifestParseException;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+import org.osgi.service.packageadmin.PackageAdmin;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class BundleDeployer implements SimpleDeployer {
+
+    private static final String KERNEL_HOME_PROP = "org.eclipse.virgo.kernel.home";
+
+    private static final String JAR = "jar";
+
+    private static final boolean STATUS_ERROR = false;
+
+    private static final boolean STATUS_OK = true;
+
+    private static final char SLASH = '/';
+
+    private static final String PICKUP_DIR = "pickup";
+
+    private static final String FRAGMEN_HOST_HEADER = "Fragment-Host";
+
+    private static final long LARGE_FILE_COPY_TIMEOUT = 30000;
+
+    private final EventLogger eventLogger;
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private final BundleContext bundleContext;
+
+    private final BundleInfosUpdater bundleInfosUpdater;
+
+    private final PackageAdmin packageAdmin;
+
+    private final File workBundleInstallLocation;
+
+    private final File kernelHomeFile;
+
+    private final File pickupDir;
+
+    public BundleDeployer(BundleContext bundleContext, PackageAdmin packageAdmin, EventLogger eventLogger) {
+        this.eventLogger = eventLogger;
+        this.bundleContext = bundleContext;
+        this.packageAdmin = packageAdmin;
+        String kernelHome = System.getProperty(KERNEL_HOME_PROP);
+        if (kernelHome != null) {
+            this.kernelHomeFile = new File(kernelHome);
+            if (this.kernelHomeFile.exists()) {
+                File bundlesInfoFile = new File(this.kernelHomeFile, "configuration/org.eclipse.equinox.simpleconfigurator/bundles.info");
+                this.bundleInfosUpdater = new BundleInfosUpdater(bundlesInfoFile, this.kernelHomeFile);
+                this.pickupDir = new File(this.kernelHomeFile, PICKUP_DIR);
+                String thisBundleName = this.bundleContext.getBundle().getSymbolicName();
+                String staging = "staging";
+                this.workBundleInstallLocation = new File(this.kernelHomeFile, "work" + File.separator + thisBundleName + File.separator + staging);
+            } else {
+                throw new IllegalStateException("Required location '" + this.kernelHomeFile.getAbsolutePath()
+                    + "' does not exist. Check the value of the '" + KERNEL_HOME_PROP + "' propery");
+            }
+        } else {
+            throw new IllegalStateException("Missing value for required property '" + KERNEL_HOME_PROP + "'");
+        }
+    }
+
+    private Boolean createInstallationFolder() {
+        if (!this.workBundleInstallLocation.exists()) {
+            if (!this.workBundleInstallLocation.mkdirs()) {
+                this.logger.error("Failed to create staging directory '" + this.workBundleInstallLocation.getAbsolutePath()
+                    + "' for bundle deployment.");
+                return false;
+            }
+        }
+        return true;
+    }
+
+    private boolean validateUri(URI uri) {
+        if (!canWrite(uri)) {
+            this.logger.error("Cannot open the file " + uri + " for writing. The configured timeout is " + LARGE_FILE_COPY_TIMEOUT + ".");
+            return false;
+        }
+        return true;
+    }
+
+    private Boolean isFragment(FragmentHost hostHolder) {
+        return hostHolder != null && hostHolder.getBundleSymbolicName() != null;
+    }
+
+    private Boolean isFragment(Bundle bundle) {
+        Enumeration<String> keys = bundle.getHeaders().keys();
+        while (keys.hasMoreElements()) {
+            if (keys.nextElement().equalsIgnoreCase(FRAGMEN_HOST_HEADER)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private void refreshHosts(FragmentHost hostHolder, Bundle fragment) {
+        try {
+            Bundle[] hosts = this.packageAdmin.getBundles(hostHolder.getBundleSymbolicName(), null);
+            if (hosts != null) {
+                this.eventLogger.log(NanoDeployerLogEvents.NANO_REFRESHING_HOST, fragment.getSymbolicName(), fragment.getVersion());
+                this.eventLogger.log(NanoDeployerLogEvents.NANO_REFRESHING_HOST, fragment.getSymbolicName(), fragment.getVersion());
+                this.packageAdmin.refreshPackages(hosts);
+                this.eventLogger.log(NanoDeployerLogEvents.NANO_REFRESHED_HOST, fragment.getSymbolicName(), fragment.getVersion());
+            }
+        } catch (Exception e) {
+            this.eventLogger.log(NanoDeployerLogEvents.NANO_REFRESH_HOST_ERROR, e, fragment.getSymbolicName(), fragment.getVersion());
+        }
+    }
+
+    private void updateBundleInfo(Bundle bundle, File stagedFile, Boolean isFragment) {
+        try {
+            URI location = BundleLocationUtil.getRelativisedURI(this.kernelHomeFile, stagedFile);
+            if (this.bundleInfosUpdater != null && this.bundleInfosUpdater.isAvailable()) {
+                BundleInfosUpdater.registerToBundlesInfo(bundle, location.toString(), isFragment);
+            }
+        } catch (Exception ex) {
+            this.eventLogger.log(NanoDeployerLogEvents.NANO_PERSIST_ERROR, ex, bundle.getSymbolicName(), bundle.getVersion());
+        }
+    }
+
+    @Override
+    public boolean install(URI uri) {
+        this.eventLogger.log(NanoDeployerLogEvents.NANO_INSTALLING, new File(uri).toString());
+        String jarName = extractDecodedJarNameFromString(uri.toString());
+        final long lastModified = new File(uri).lastModified();
+        StatusFileModificator.deleteStatusFile(jarName, this.pickupDir);
+
+        try {
+            if (!validateUri(uri) || !createInstallationFolder()) {
+                this.eventLogger.log(NanoDeployerLogEvents.NANO_INSTALLING_ERROR, uri);
+                StatusFileModificator.createStatusFile(jarName, this.pickupDir, StatusFileModificator.OP_DEPLOY, STATUS_ERROR, -1, lastModified);
+                return STATUS_ERROR;
+            }
+            File stagedFile = getStagedFile(uri);
+            FileCopyUtils.copy(new File(uri), stagedFile);
+
+            // install the bundle
+            final Bundle installed = this.bundleContext.installBundle(BundleLocationUtil.createInstallLocation(this.kernelHomeFile, stagedFile));
+            final FragmentHost hostHolder = getFragmentHostFromDeployedBundleIfExsiting(stagedFile);
+            this.eventLogger.log(NanoDeployerLogEvents.NANO_INSTALLED, installed.getSymbolicName(), installed.getVersion());
+
+            // if fragment, refresh hosts and update bundles.info
+            if (isFragment(hostHolder)) {
+                refreshHosts(hostHolder, installed);
+                updateBundleInfo(installed, stagedFile, true);
+            }
+            StatusFileModificator.createStatusFile(jarName, this.pickupDir, StatusFileModificator.OP_DEPLOY, STATUS_ERROR, installed.getBundleId(),
+                lastModified);
+        } catch (Exception e) {
+            this.eventLogger.log(NanoDeployerLogEvents.NANO_INSTALLING_ERROR, e, uri);
+            StatusFileModificator.createStatusFile(jarName, this.pickupDir, StatusFileModificator.OP_DEPLOY, STATUS_ERROR, -1, lastModified);
+            return STATUS_ERROR;
+        }
+        return STATUS_OK;
+    }
+
+    @Override
+    public boolean start(URI uri) {
+        Bundle installedBundle = getInstalledBundle(uri);
+        String jarName = extractDecodedJarNameFromString(uri.toString());
+        final long lastModified = new File(uri).lastModified();
+        StatusFileModificator.deleteStatusFile(jarName, this.pickupDir);
+
+        File stagedFile = getStagedFile(uri);
+        if (installedBundle != null) {
+            this.eventLogger.log(NanoDeployerLogEvents.NANO_STARTING, installedBundle.getSymbolicName(), installedBundle.getVersion());
+            try {
+                if (!isFragment(installedBundle)) {
+                    installedBundle.start();
+                    updateBundleInfo(installedBundle, stagedFile, false);
+                    this.eventLogger.log(NanoDeployerLogEvents.NANO_STARTED, installedBundle.getSymbolicName(), installedBundle.getVersion());
+                } else {
+                    if (this.logger.isWarnEnabled()) {
+                        this.logger.warn("The installed bundle for the given url [" + uri
+                            + "] is a fragment bundle. Start operation for this url will not be executed.");
+                    }
+                }
+            } catch (Exception e) {
+                this.eventLogger.log(NanoDeployerLogEvents.NANO_STARTING_ERROR, e, installedBundle.getSymbolicName(), installedBundle.getVersion());
+                StatusFileModificator.createStatusFile(jarName, this.pickupDir, StatusFileModificator.OP_DEPLOY, STATUS_ERROR, -1, lastModified);
+                return STATUS_ERROR;
+            }
+        }
+        StatusFileModificator.createStatusFile(jarName, this.pickupDir, StatusFileModificator.OP_DEPLOY, STATUS_OK, installedBundle.getBundleId(),
+            lastModified);
+        return STATUS_OK;
+    }
+
+    @Override
+    public boolean deploy(URI path) {
+        this.eventLogger.log(NanoDeployerLogEvents.NANO_INSTALLING, new File(path).toString());
+        final File deployedFile = new File(path);
+        String jarName = extractDecodedJarNameFromString(path.toString());
+        long lastModified = deployedFile.lastModified();
+        StatusFileModificator.deleteStatusFile(jarName, this.pickupDir);
+
+        if (!canWrite(path)) {
+            this.logger.error("Cannot open the file " + path + " for writing. The configured timeout is " + LARGE_FILE_COPY_TIMEOUT + ".");
+            this.eventLogger.log(NanoDeployerLogEvents.NANO_INSTALLING_ERROR, path);
+            StatusFileModificator.createStatusFile(jarName, this.pickupDir, StatusFileModificator.OP_DEPLOY, STATUS_ERROR, -1, lastModified);
+            return STATUS_ERROR;
+        }
+        final Bundle installed;
+        final FragmentHost hostHolder;
+        File stagedFile = null;
+        try {
+            // copy bundle to work
+            if (!this.workBundleInstallLocation.exists()) {
+                if (!this.workBundleInstallLocation.mkdirs()) {
+                    this.logger.error("Failed to create staging directory '" + this.workBundleInstallLocation.getAbsolutePath()
+                        + "' for bundle deployment.");
+                    this.eventLogger.log(NanoDeployerLogEvents.NANO_INSTALLING_ERROR, path);
+                    StatusFileModificator.createStatusFile(jarName, this.pickupDir, StatusFileModificator.OP_DEPLOY, STATUS_ERROR, -1, lastModified);
+                    return STATUS_ERROR;
+                }
+            }
+            stagedFile = getStagedFile(path);
+            FileCopyUtils.copy(deployedFile, stagedFile);
+            // install the bundle
+            installed = this.bundleContext.installBundle(BundleLocationUtil.createInstallLocation(this.kernelHomeFile, stagedFile));
+            hostHolder = getFragmentHostFromDeployedBundleIfExsiting(stagedFile);
+        } catch (Exception e) {
+            this.eventLogger.log(NanoDeployerLogEvents.NANO_INSTALLING_ERROR, e, path);
+            StatusFileModificator.createStatusFile(jarName, this.pickupDir, StatusFileModificator.OP_DEPLOY, STATUS_ERROR, -1, lastModified);
+            return STATUS_ERROR;
+        }
+        this.eventLogger.log(NanoDeployerLogEvents.NANO_INSTALLED, installed.getSymbolicName(), installed.getVersion());
+
+        if (hostHolder != null && hostHolder.getBundleSymbolicName() != null) {
+            try {
+                Bundle[] hosts = this.packageAdmin.getBundles(hostHolder.getBundleSymbolicName(), null);
+                if (hosts != null) {
+                    this.eventLogger.log(NanoDeployerLogEvents.NANO_REFRESHING_HOST, installed.getSymbolicName(), installed.getVersion());
+                    this.packageAdmin.refreshPackages(hosts);
+                    this.eventLogger.log(NanoDeployerLogEvents.NANO_REFRESHED_HOST, installed.getSymbolicName(), installed.getVersion());
+                }
+            } catch (Exception e) {
+                this.eventLogger.log(NanoDeployerLogEvents.NANO_REFRESH_HOST_ERROR, e, installed.getSymbolicName(), installed.getVersion());
+            }
+        } else {
+            this.eventLogger.log(NanoDeployerLogEvents.NANO_STARTING, installed.getSymbolicName(), installed.getVersion());
+            try {
+                installed.start();
+            } catch (Exception e) {
+                this.eventLogger.log(NanoDeployerLogEvents.NANO_STARTING_ERROR, e, installed.getSymbolicName(), installed.getVersion());
+                StatusFileModificator.createStatusFile(jarName, this.pickupDir, StatusFileModificator.OP_DEPLOY, STATUS_ERROR, -1, lastModified);
+                return STATUS_ERROR;
+            }
+            this.eventLogger.log(NanoDeployerLogEvents.NANO_STARTED, installed.getSymbolicName(), installed.getVersion());
+        }
+        try {
+            if (this.bundleInfosUpdater != null && this.bundleInfosUpdater.isAvailable()) {
+                String bundlesInfoLocation = BundleLocationUtil.getRelativisedURI(this.kernelHomeFile, stagedFile).toString();
+                BundleInfosUpdater.registerToBundlesInfo(installed, bundlesInfoLocation, hostHolder != null
+                    && hostHolder.getBundleSymbolicName() != null);
+            }
+        } catch (Exception e) {
+            this.eventLogger.log(NanoDeployerLogEvents.NANO_PERSIST_ERROR, e, installed.getSymbolicName(), installed.getVersion());
+        }
+
+        StatusFileModificator.createStatusFile(jarName, this.pickupDir, StatusFileModificator.OP_DEPLOY, STATUS_OK, installed.getBundleId(),
+            lastModified);
+        return STATUS_OK;
+    }
+
+    private FragmentHost getFragmentHostFromDeployedBundleIfExsiting(File stagedFile) {
+        try (JarFile bundleJar = new JarFile(stagedFile)) {
+            BundleManifest manifest = BundleManifestFactory.createBundleManifest(new InputStreamReader(
+                bundleJar.getInputStream(bundleJar.getEntry(JarFile.MANIFEST_NAME)), UTF_8));
+            return manifest.getFragmentHost();
+        } catch (IOException ioe) {
+            this.logger.error("Failed to extract the fragment host header from file '" + stagedFile.getAbsolutePath() + "'.", ioe);
+            return null;
+        } catch (BundleManifestParseException bmpe) {
+            return null;
+        }
+    }
+
+    @Override
+    public boolean update(URI path) {
+        final File updatedFile = new File(path);
+        final String jarName = extractDecodedJarNameFromString(path.toString());
+        long lastModified = updatedFile.lastModified();
+        final File matchingStagedFile = new File(this.workBundleInstallLocation, extractJarFileNameFromString(path.toString()));
+        StatusFileModificator.deleteStatusFile(jarName, this.pickupDir);
+
+        if (!canWrite(path)) {
+            this.logger.error("Cannot open the file [" + path + "] for writing. Timeout is [" + LARGE_FILE_COPY_TIMEOUT + "].");
+            this.eventLogger.log(NanoDeployerLogEvents.NANO_UPDATING_ERROR, path);
+            StatusFileModificator.createStatusFile(jarName, this.pickupDir, StatusFileModificator.OP_DEPLOY, STATUS_ERROR, -1, lastModified);
+            return STATUS_ERROR;
+        }
+
+        final Bundle bundle = this.bundleContext.getBundle(BundleLocationUtil.createInstallLocation(this.kernelHomeFile, matchingStagedFile));
+        if (bundle != null) {
+            try {
+                // copy the updated bundle over the old one
+                FileCopyUtils.copy(updatedFile, matchingStagedFile);
+
+                this.eventLogger.log(NanoDeployerLogEvents.NANO_UPDATING, bundle.getSymbolicName(), bundle.getVersion());
+                bundle.update();
+                if (this.packageAdmin != null) {
+                    this.packageAdmin.refreshPackages(new Bundle[] { bundle });
+                    this.logger.info("Update of file with path '" + path + "' is successful.");
+                }
+                this.eventLogger.log(NanoDeployerLogEvents.NANO_UPDATED, bundle.getSymbolicName(), bundle.getVersion());
+            } catch (Exception e) {
+                this.eventLogger.log(NanoDeployerLogEvents.NANO_UPDATE_ERROR, e, bundle.getSymbolicName(), bundle.getVersion());
+                StatusFileModificator.createStatusFile(jarName, this.pickupDir, StatusFileModificator.OP_DEPLOY, STATUS_ERROR, -1, lastModified);
+                return STATUS_ERROR;
+            }
+        } else {
+            deploy(path);
+        }
+        StatusFileModificator.createStatusFile(jarName, this.pickupDir, StatusFileModificator.OP_DEPLOY, STATUS_OK, bundle.getBundleId(),
+            lastModified);
+        return STATUS_OK;
+    }
+
+    @Override
+    public boolean undeploy(Bundle bundle) {
+        if (bundle != null) {
+            String bundleLocation = bundle.getLocation();
+            File stagingFileToDelete = new File(bundleLocation.substring(BundleLocationUtil.REFERENCE_FILE_PREFIX.length()));
+            String jarName = extractDecodedJarNameFromString(bundleLocation);
+            StatusFileModificator.deleteStatusFile(jarName, this.pickupDir);
+
+            final FragmentHost hostHolder = getFragmentHostFromDeployedBundleIfExsiting(stagingFileToDelete);
+            try {
+                if (this.logger.isInfoEnabled()) {
+                    this.logger.info("Removing bundle '" + bundle.getSymbolicName() + "' version '" + bundle.getVersion() + "' from bundles.info.");
+                }
+                if (this.bundleInfosUpdater != null && this.bundleInfosUpdater.isAvailable()) {
+                    String bundlesInfoLocation = BundleLocationUtil.getRelativisedURI(this.kernelHomeFile, stagingFileToDelete).toString();
+                    BundleInfosUpdater.unregisterToBundlesInfo(bundle, bundlesInfoLocation, hostHolder != null
+                        && hostHolder.getBundleSymbolicName() != null);
+                    this.logger.info("Successfully removed bundle '" + bundle.getSymbolicName() + "' version '" + bundle.getVersion()
+                        + "' from bundles.info.");
+                } else {
+                    this.logger.error("BundleInfosUpdater not available. Failed to remove bundle '" + bundle.getSymbolicName() + "' version '"
+                        + bundle.getVersion() + "' from bundles.info.");
+                }
+            } catch (Exception e) {
+                this.logger.warn("Failed to unregister bundle '" + bundle.getSymbolicName() + "' version '" + bundle.getVersion() + "'", e);
+            }
+            try {
+                if (hostHolder == null) {
+                    this.eventLogger.log(NanoDeployerLogEvents.NANO_STOPPING, bundle.getSymbolicName(), bundle.getVersion());
+                    bundle.stop();
+                    this.eventLogger.log(NanoDeployerLogEvents.NANO_STOPPED, bundle.getSymbolicName(), bundle.getVersion());
+                }
+                this.eventLogger.log(NanoDeployerLogEvents.NANO_UNINSTALLING, bundle.getSymbolicName(), bundle.getVersion());
+                bundle.uninstall();
+                this.eventLogger.log(NanoDeployerLogEvents.NANO_UNINSTALLED, bundle.getSymbolicName(), bundle.getVersion());
+
+                if (!stagingFileToDelete.delete()) {
+                    this.logger.warn("Could not delete staging file '" + stagingFileToDelete.getAbsolutePath() + "'");
+                }
+            } catch (BundleException e) {
+                this.eventLogger.log(NanoDeployerLogEvents.NANO_UNDEPLOY_ERROR, e, bundle.getSymbolicName(), bundle.getVersion());
+                StatusFileModificator.createStatusFile(jarName, this.pickupDir, StatusFileModificator.OP_UNDEPLOY, STATUS_ERROR, -1, -1);
+                return STATUS_ERROR;
+            }
+
+            StatusFileModificator.createStatusFile(jarName, this.pickupDir, StatusFileModificator.OP_UNDEPLOY, STATUS_OK, -1, -1);
+        }
+        return STATUS_OK;
+    }
+
+    @Override
+    public boolean canServeFileType(String fileType) {
+        return JAR.equals(fileType);
+    }
+
+    private Bundle getInstalledBundle(URI uri) {
+        return this.bundleContext.getBundle(BundleLocationUtil.createInstallLocation(this.kernelHomeFile, getStagedFile(uri)));
+    }
+
+    private File getStagedFile(URI uri) {
+        File matchingStagingBundle = new File(this.workBundleInstallLocation, extractJarFileNameFromString(uri.toString()));
+        return matchingStagingBundle;
+    }
+
+    @Override
+    public boolean isDeployed(URI path) {
+        if (this.bundleContext.getBundle(BundleLocationUtil.createInstallLocation(this.kernelHomeFile, getStagedFile(path))) == null) {
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public boolean isOfflineUpdated(URI path) {
+        final String jarName = extractDecodedJarNameFromString(path.toString());
+        final File deployFile = new File(path);
+        long deployFileLastModified = deployFile.lastModified();
+        long lastModifiedStatus = StatusFileModificator.getLastModifiedFromStatusFile(jarName, this.pickupDir);
+        if (lastModifiedStatus == -1 || deployFileLastModified == lastModifiedStatus) {
+            return false;
+        }
+        return true;
+    }
+
+    private String extractDecodedJarNameFromString(String path) {
+        final String jarName = path.substring(path.lastIndexOf(SLASH) + 1, path.length() - 4);
+        return URLDecoder.decode(jarName);
+    }
+
+    @Override
+    public DeploymentIdentity getDeploymentIdentity(URI path) {
+        File matchingStagingBundle = getStagedFile(path);
+        Bundle bundle = this.bundleContext.getBundle(BundleLocationUtil.createInstallLocation(this.kernelHomeFile, matchingStagingBundle));
+        if (bundle == null) {
+            return null;
+        }
+        return new StandardDeploymentIdentity(JAR, bundle.getSymbolicName(), bundle.getVersion().toString());
+    }
+
+    private boolean canWrite(URI path) {
+        int tries = -1;
+        boolean isWritable = false;
+        // Some big files are copied very slowly, but the event is received
+        // immediately.
+        // So we will wait 0.5 x 240 i.e. 2 minutes
+        final long timeout = LARGE_FILE_COPY_TIMEOUT / 500;
+        while (tries < timeout) {
+            FileInputStream fis = null;
+            try {
+                fis = new FileInputStream(new File(path));
+                isWritable = true;
+                break;
+            } catch (FileNotFoundException e) {
+                if (this.logger.isInfoEnabled()) {
+                    this.logger.info("File is still locked.", e);
+                }
+            } finally {
+                IOUtils.closeQuietly(fis);
+            }
+            try {
+                Thread.sleep(500);
+            } catch (InterruptedException e) {
+                this.logger.error("InterruptedException occurred.", e);
+            }
+            tries++;
+        }
+        return isWritable;
+    }
+
+    private String extractJarFileNameFromString(String path) {
+        final String jarName = path.substring(path.lastIndexOf(SLASH) + 1);
+        return jarName;
+    }
+
+    @Override
+    public boolean isDeployFileValid(File file) {
+        JarFile jarFile = null;
+        try {
+            jarFile = new JarFile(file);
+        } catch (IOException e) {
+            this.logger.error("The deployed file '" + file.getAbsolutePath() + "' is an invalid zip file.");
+            return false;
+        } finally {
+            try {
+                if (jarFile != null) {
+                    jarFile.close();
+                }
+            } catch (IOException e) {
+                // do nothing
+            }
+        }
+        return true;
+    }
+
+    @Override
+    public List<String> getAcceptedFileTypes() {
+        List<String> types = new ArrayList<String>();
+        types.add(JAR);
+        return types;
+    }
+
+}
diff --git a/nano/org.eclipse.virgo.nano.deployer/src/main/java/org/eclipse/virgo/nano/deployer/internal/StandardApplicationDeployer.java b/nano/org.eclipse.virgo.nano.deployer/src/main/java/org/eclipse/virgo/nano/deployer/internal/StandardApplicationDeployer.java
new file mode 100644
index 0000000..b7334e3
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer/src/main/java/org/eclipse/virgo/nano/deployer/internal/StandardApplicationDeployer.java
@@ -0,0 +1,342 @@
+/*******************************************************************************
+ * Copyright (c) 2012 SAP AG
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   SAP AG - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.deployer.internal;
+
+import static java.lang.Integer.parseInt;
+
+import java.io.File;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.nano.core.KernelConfig;
+import org.eclipse.virgo.nano.deployer.NanoDeployerLogEvents;
+import org.eclipse.virgo.nano.deployer.SimpleDeployer;
+import org.eclipse.virgo.nano.deployer.api.core.ApplicationDeployer;
+import org.eclipse.virgo.nano.deployer.api.core.DeployerConfiguration;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentOptions;
+import org.eclipse.virgo.nano.deployer.support.HotDeployerEnabler;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Version;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.packageadmin.PackageAdmin;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class StandardApplicationDeployer implements ApplicationDeployer {
+
+    private static final String TOPIC_RECOVERY_COMPLETED = "org/eclipse/virgo/kernel/deployer/recovery/COMPLETED";
+
+    private EventLogger eventLogger;
+
+    private PackageAdmin packageAdmin;
+
+    private final List<SimpleDeployer> simpleDeployers = new ArrayList<SimpleDeployer>();
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private KernelConfig kernelConfig;
+
+    private HotDeployerEnabler hotDeployerEnabler = null;
+
+    private BundleContext bundleContext;
+
+    private BundleDeployer defaultDeployer;
+
+    private EventAdmin eventAdmin;
+
+    public void activate(ComponentContext context) throws Exception {
+        this.bundleContext = context.getBundleContext();
+        this.defaultDeployer = new BundleDeployer(context.getBundleContext(), this.packageAdmin, this.eventLogger);
+        this.simpleDeployers.add(this.defaultDeployer);
+
+        recoveryComplete();
+        initialiseHotDeployer();
+
+        // TODO register the deployer MBean when the management classes are factored out in a new bundle.
+        // Deployer deployerMBean = new StandardDeployer(appDeployer);
+    }
+
+    public void deactivate(ComponentContext context) throws Exception {
+        if (this.hotDeployerEnabler != null) {
+            this.hotDeployerEnabler.stopHotDeployer();
+        }
+    }
+
+    private void initialiseHotDeployer() {
+        int deployerTimeout = parseInt(this.kernelConfig.getProperty("deployer.timeout"));
+        String pickupDirectory = this.kernelConfig.getProperty("deployer.pickupDirectory");
+        int scanInterval = parseInt(this.kernelConfig.getProperty("deployer.scanIntervalMillis"));
+        DeployerConfiguration deployerConfiguration = new StandardDeployerConfiguration(deployerTimeout, new File(pickupDirectory), scanInterval);
+        this.hotDeployerEnabler = new HotDeployerEnabler(this, deployerConfiguration, this.eventLogger);
+        this.hotDeployerEnabler.startHotDeployer();
+    }
+
+    @Override
+    public DeploymentIdentity deploy(URI uri) throws DeploymentException {
+        boolean isThereSuitableDeployer = false;
+        for (SimpleDeployer deployer : this.simpleDeployers) {
+            if (deployer.canServeFileType(getFileTypeFromUri(uri))) {
+                isThereSuitableDeployer = true;
+                if (!deployer.isDeployFileValid(new File(uri))) {
+                    this.eventLogger.log(NanoDeployerLogEvents.NANO_INVALID_FILE);
+                } else {
+                    if (deployer.isDeployed(uri)) {
+                        deployer.update(uri);
+                    } else {
+                        deployer.deploy(uri);
+                    }
+                }
+            }
+        }
+        if (!isThereSuitableDeployer) {
+            handleUnsupportedFileType(uri);
+        }
+        return null;
+    }
+
+    @Override
+    public DeploymentIdentity[] bulkDeploy(List<URI> uris, DeploymentOptions options) throws DeploymentException {
+        if (uris != null && !uris.isEmpty()) {
+            installDeployables(uris);
+            startDeployables(uris);
+            return getDeploymentIdentities(uris);
+        } else {
+            this.logger.warn("Cannot perform bulk deploy operation of the given URIs list as it is either empty or null.");
+            return null;
+        }
+    }
+
+    private DeploymentIdentity[] getDeploymentIdentities(List<URI> uris) {
+        List<DeploymentIdentity> accumulatedDIs = new ArrayList<DeploymentIdentity>();
+        for (URI uri : uris) {
+            DeploymentIdentity di = getDeploymentIdentity(uri);
+            if (di != null) {
+                accumulatedDIs.add(di);
+            }
+        }
+        return accumulatedDIs.toArray(new DeploymentIdentity[0]);
+    }
+
+    @Override
+    public void undeploy(DeploymentIdentity deploymentIdentity) throws DeploymentException {
+        if (this.bundleContext != null) {
+            String symbolicName = deploymentIdentity.getSymbolicName();
+            String version = deploymentIdentity.getVersion();
+            List<Bundle> existingBundles = new ArrayList<Bundle>();
+
+            for (Bundle bundle : this.bundleContext.getBundles()) {
+                if (bundle.getSymbolicName().equals(symbolicName) && bundle.getVersion().toString().equals(version)) {
+                    existingBundles.add(bundle);
+                }
+            }
+            if (existingBundles.size() > 1) {
+                this.logger.warn("Multiple bundles matching the marked for uninstall symbolicName-version pair. List of all matches: "
+                    + Arrays.toString(existingBundles.toArray(new Bundle[existingBundles.size()])));
+                this.logger.warn("Uninstalling the last-installed matching bundle " + existingBundles.get(existingBundles.size() - 1).toString());
+            }
+            boolean isThereSuitableDeployer = false;
+            for (SimpleDeployer deployer : this.simpleDeployers) {
+                if (deployer.canServeFileType(deploymentIdentity.getType())) {
+                    isThereSuitableDeployer = true;
+                    deployer.undeploy(existingBundles.get(0));
+                }
+            }
+            if (!isThereSuitableDeployer) {
+                this.defaultDeployer.undeploy(existingBundles.get(0));
+            }
+        }
+    }
+
+    @Override
+    public DeploymentIdentity getDeploymentIdentity(URI uri) {
+        for (SimpleDeployer deployer : this.simpleDeployers) {
+            if (deployer.canServeFileType(getFileTypeFromUri(uri))) {
+                return deployer.getDeploymentIdentity(uri);
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public boolean isDeployed(URI uri) {
+        for (SimpleDeployer simpleDeployer : this.simpleDeployers) {
+            if (simpleDeployer.canServeFileType(getFileTypeFromUri(uri))) {
+                return simpleDeployer.isDeployed(uri) ^ simpleDeployer.isOfflineUpdated(uri);
+            }
+        }
+        return false;
+    }
+
+    private String getFileTypeFromUri(URI uri) {
+        String path = uri.toString();
+        return path.substring(path.lastIndexOf(".") + 1);
+    }
+
+    @Override
+    public DeploymentIdentity deploy(URI uri, DeploymentOptions options) throws DeploymentException {
+        return this.deploy(uri);
+    }
+
+    @Override
+    public DeploymentIdentity deploy(String type, String name, Version version) throws DeploymentException {
+        throw new UnsupportedOperationException("Not supported in Virgo Nano.");
+    }
+
+    @Override
+    public DeploymentIdentity deploy(String type, String name, Version version, DeploymentOptions options) throws DeploymentException {
+        throw new UnsupportedOperationException("Not supported in Virgo Nano.");
+    }
+
+    @Override
+    public void undeploy(String applicationSymbolicName, String version) throws DeploymentException {
+        throw new UnsupportedOperationException("Not supported in Virgo Nano.");
+    }
+
+    @Override
+    public DeploymentIdentity install(URI uri, DeploymentOptions options) throws DeploymentException {
+        throw new UnsupportedOperationException("Not supported in Virgo Nano.");
+    }
+
+    @Override
+    public DeploymentIdentity install(URI uri) throws DeploymentException {
+        throw new UnsupportedOperationException("Not supported in Virgo Nano.");
+    }
+
+    @Override
+    public void undeploy(String type, String name, String version) throws DeploymentException {
+        throw new UnsupportedOperationException("Not supported in Virgo Nano.");
+    }
+
+    @Override
+    public void undeploy(DeploymentIdentity deploymentIdentity, boolean deleted) throws DeploymentException {
+        throw new UnsupportedOperationException("Not supported in Virgo Nano.");
+    }
+
+    @Override
+    public DeploymentIdentity refresh(URI uri, String symbolicName) throws DeploymentException {
+        throw new UnsupportedOperationException("Not supported in Virgo Nano.");
+    }
+
+    @Override
+    public void refreshBundle(String bundleSymbolicName, String bundleVersion) throws DeploymentException {
+        throw new UnsupportedOperationException("Not supported in Virgo Nano.");
+    }
+
+    @Override
+    public DeploymentIdentity[] getDeploymentIdentities() {
+        throw new UnsupportedOperationException("Not supported in Virgo Nano.");
+    }
+
+    public void bindEventLogger(EventLogger logger) {
+        this.eventLogger = logger;
+    }
+
+    public void unbindEventLogger(EventLogger logger) {
+        this.eventLogger = null;
+    }
+
+    public void bindEventAdmin(EventAdmin admin) {
+        this.eventAdmin = admin;
+    }
+
+    public void unbindEventAdmin(EventAdmin admin) {
+        this.eventAdmin = null;
+    }
+
+    public void bindKernelConfig(KernelConfig config) {
+        this.kernelConfig = config;
+    }
+
+    public void unbindKernelConfig(KernelConfig config) {
+        this.kernelConfig = null;
+    }
+
+    public void bindPackageAdmin(PackageAdmin packageAdmin) {
+        this.packageAdmin = packageAdmin;
+    }
+
+    public void unbindPackageAdmin(PackageAdmin packageAdmin) {
+        this.packageAdmin = null;
+    }
+
+    public void bindSimpleDeployer(SimpleDeployer deployer) {
+        this.simpleDeployers.add(deployer);
+    }
+
+    public void unbindSimpleDeployer(SimpleDeployer deployer) {
+        this.simpleDeployers.remove(deployer);
+    }
+
+    private void handleUnsupportedFileType(URI uri) {
+        List<String> acceptedTypes = new ArrayList<String>();
+        for (SimpleDeployer deployer : this.simpleDeployers) {
+            acceptedTypes.addAll(deployer.getAcceptedFileTypes());
+        }
+        this.eventLogger.log(NanoDeployerLogEvents.NANO_UNRECOGNIZED_TYPE, uri, acceptedTypes);
+    }
+
+    private void installDeployables(List<URI> uris) {
+        for (URI uri : uris) {
+            boolean isThereSuitableDeployer = false;
+            for (SimpleDeployer deployer : this.simpleDeployers) {
+                if (deployer.canServeFileType(getFileTypeFromUri(uri))) {
+                    isThereSuitableDeployer = true;
+                    if (!deployer.isDeployFileValid(new File(uri))) {
+                        this.eventLogger.log(NanoDeployerLogEvents.NANO_INVALID_FILE);
+                    } else {
+                        if (deployer.isDeployed(uri)) {
+                            deployer.update(uri);
+                        } else {
+                            deployer.install(uri);
+                        }
+                    }
+                }
+            }
+            if (!isThereSuitableDeployer) {
+                handleUnsupportedFileType(uri);
+            }
+        }
+    }
+
+    private void startDeployables(List<URI> uris) {
+        for (URI uri : uris) {
+            boolean isThereSuitableDeployer = false;
+            for (SimpleDeployer deployer : this.simpleDeployers) {
+                if (deployer.canServeFileType(getFileTypeFromUri(uri))) {
+                    isThereSuitableDeployer = true;
+                    if (!deployer.isDeployFileValid(new File(uri))) {
+                        this.eventLogger.log(NanoDeployerLogEvents.NANO_INVALID_FILE);
+                    } else {
+                        deployer.start(uri);
+                    }
+                }
+            }
+            if (!isThereSuitableDeployer) {
+                handleUnsupportedFileType(uri);
+            }
+        }
+    }
+
+    private void recoveryComplete() {
+        this.eventAdmin.postEvent(new Event(TOPIC_RECOVERY_COMPLETED, (Map<String, ?>) null));
+    }
+
+}
diff --git a/nano/org.eclipse.virgo.nano.deployer/src/main/java/org/eclipse/virgo/nano/deployer/internal/StandardDeployerConfiguration.java b/nano/org.eclipse.virgo.nano.deployer/src/main/java/org/eclipse/virgo/nano/deployer/internal/StandardDeployerConfiguration.java
new file mode 100644
index 0000000..d66810d
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer/src/main/java/org/eclipse/virgo/nano/deployer/internal/StandardDeployerConfiguration.java
@@ -0,0 +1,81 @@
+
+package org.eclipse.virgo.nano.deployer.internal;
+
+/*******************************************************************************
+ * Copyright (c) 2008, 2012 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   SAP AG - re-factoring
+ *******************************************************************************/
+
+import java.io.File;
+
+import org.eclipse.virgo.nano.deployer.api.core.DeployerConfiguration;
+import org.eclipse.virgo.util.io.PathReference;
+
+/**
+ * Standard implementation of {@link DeployerConfiguration}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+public final class StandardDeployerConfiguration implements DeployerConfiguration {
+
+    private final int deploymentTimeoutSeconds;
+
+    private final PathReference deploymentPickupDirectory;
+
+    private final int scanIntervalMillis;
+
+    /**
+     * Construct a deployment configuration using the given <code>deploymentTimeout</code>, and
+     * <code>pickupDirectory</code>.
+     * 
+     * @param deploymentTimeout The timeout period, in seconds
+     * @param pickupDirectory The deployer's pickup directory
+     * @param scanIntervalMillis The deployer's scan interval in milliseconds
+     */
+    public StandardDeployerConfiguration(int deploymentTimeout, File pickupDirectory, int scanIntervalMillis) {
+        this.deploymentTimeoutSeconds = deploymentTimeout;
+        this.deploymentPickupDirectory = new PathReference(pickupDirectory);
+        this.scanIntervalMillis = scanIntervalMillis;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public int getDeploymentTimeoutSeconds() {
+        return this.deploymentTimeoutSeconds;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public PathReference getDeploymentPickupDirectory() {
+        return this.deploymentPickupDirectory;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public int getScanIntervalMillis() {
+        return this.scanIntervalMillis;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String toString() {
+        return String.format("Timeout: '%s', Pickup directory: '%s', Scan interval in millis: '%s'", this.deploymentTimeoutSeconds,
+            this.deploymentPickupDirectory, this.scanIntervalMillis);
+    }
+
+}
diff --git a/nano/org.eclipse.virgo.nano.deployer/src/main/java/org/eclipse/virgo/nano/deployer/management/StandardDeployer.java b/nano/org.eclipse.virgo.nano.deployer/src/main/java/org/eclipse/virgo/nano/deployer/management/StandardDeployer.java
new file mode 100644
index 0000000..ca8a868
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer/src/main/java/org/eclipse/virgo/nano/deployer/management/StandardDeployer.java
@@ -0,0 +1,135 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2012 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   SAP AG - re-factoring
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.deployer.management;
+
+import java.io.File;
+import java.net.URI;
+import java.net.URISyntaxException;
+
+import org.eclipse.virgo.nano.deployer.api.ArtifactIdentity;
+import org.eclipse.virgo.nano.deployer.api.Deployer;
+import org.eclipse.virgo.nano.deployer.api.core.ApplicationDeployer;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentOptions;
+
+
+/**
+ * Standard implementation of the deployer's control.
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread-safe assuming that the ApplicationDeployer is thread-safe.
+ * 
+ */
+public class StandardDeployer implements Deployer {
+
+    private final ApplicationDeployer applicationDeployer;
+
+    public StandardDeployer(ApplicationDeployer applicationDeployer) {
+        this.applicationDeployer = applicationDeployer;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public DeploymentIdentity deploy(String uri) throws DeploymentException {
+        return this.applicationDeployer.deploy(URI.create(uri));
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public DeploymentIdentity deploy(String uri, boolean recoverable) throws DeploymentException {
+        return this.applicationDeployer.deploy(URI.create(uri), new DeploymentOptions(recoverable, false, true));
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @SuppressWarnings("deprecation")
+    public void undeploy(String applicationSymbolicName, String version) throws DeploymentException {
+        this.applicationDeployer.undeploy(applicationSymbolicName, version);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void refresh(String uri, String symbolicName) throws DeploymentException {
+        this.applicationDeployer.refresh(URI.create(uri), symbolicName);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void refreshBundle(String bundleSymbolicName, String bundleVersion) throws DeploymentException {
+        this.applicationDeployer.refreshBundle(bundleSymbolicName, bundleVersion);
+    }
+
+    public ArtifactIdentity install(String artifactUri) throws DeploymentException {
+        DeploymentIdentity deploymentIdentity = this.applicationDeployer.install(createURI(artifactUri), new DeploymentOptions());
+        return new ArtifactIdentity(deploymentIdentity.getType(), deploymentIdentity.getSymbolicName(), deploymentIdentity.getVersion());
+    }
+
+    public ArtifactIdentity install(String artifactUri, boolean recover) throws DeploymentException {
+        DeploymentIdentity deploymentIdentity = this.applicationDeployer.install(createURI(artifactUri), new DeploymentOptions(recover, false, true));
+        return new ArtifactIdentity(deploymentIdentity.getType(), deploymentIdentity.getSymbolicName(), deploymentIdentity.getVersion());
+    }
+
+    public ArtifactIdentity install(String type, String name, String version) throws DeploymentException {
+        throw new UnsupportedOperationException("Not yet implemented, use deploy instead of install and start");
+    }
+
+    public ArtifactIdentity install(String type, String name, String version, boolean recover) throws DeploymentException {
+        throw new UnsupportedOperationException("Not yet implemented, use deploy instead of install and start");
+    }
+
+    public void start(ArtifactIdentity artifactIdentity) throws DeploymentException, IllegalStateException {
+        throw new UnsupportedOperationException("Not yet implemented, use deploy instead of install and start");
+
+    }
+
+    public void start(String type, String name, String version) throws DeploymentException, IllegalStateException {
+        throw new UnsupportedOperationException("Not yet implemented, use deploy instead of install and start");
+    }
+
+    public void stop(ArtifactIdentity artifactIdentity) throws DeploymentException, IllegalStateException {
+        throw new UnsupportedOperationException("Not yet implemented, use undeploy instead of stop and uninstall");
+    }
+
+    public void stop(String type, String name, String version) throws DeploymentException, IllegalStateException {
+        throw new UnsupportedOperationException("Not yet implemented, use undeploy instead of stop and uninstall");
+    }
+
+    public void uninstall(ArtifactIdentity artifactIdentity) throws DeploymentException {
+        throw new UnsupportedOperationException("Not yet implemented, use undeploy instead of stop and uninstall");
+    }
+
+    public void uninstall(String type, String name, String version) throws DeploymentException {
+        throw new UnsupportedOperationException("Not yet implemented, use undeploy instead of stop and uninstall");
+    }
+
+    private URI createURI(String uriString) {
+        URI uri;
+        try {
+            uri = new URI(uriString);
+        } catch (URISyntaxException urise) {
+            throw new IllegalArgumentException(String.format("The location '%s' is not a valid URI", uriString));
+        }
+
+        if ("file".equals(uri.getScheme())) {
+            uri = new File(uri.getSchemeSpecificPart()).toURI();
+        }
+
+        return uri;
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.deployer/src/main/java/org/eclipse/virgo/nano/deployer/support/HotDeployerEnabler.java b/nano/org.eclipse.virgo.nano.deployer/src/main/java/org/eclipse/virgo/nano/deployer/support/HotDeployerEnabler.java
new file mode 100644
index 0000000..2bb8d56
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer/src/main/java/org/eclipse/virgo/nano/deployer/support/HotDeployerEnabler.java
@@ -0,0 +1,32 @@
+package org.eclipse.virgo.nano.deployer.support;
+
+import org.eclipse.virgo.nano.deployer.api.core.ApplicationDeployer;
+import org.eclipse.virgo.nano.deployer.api.core.DeployerConfiguration;
+import org.eclipse.virgo.nano.deployer.hot.HotDeployer;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+
+public class HotDeployerEnabler {
+
+    private final ApplicationDeployer appDeployer;
+    private final EventLogger eventLogger;
+    private final DeployerConfiguration deployerConfiguration;
+    private HotDeployer hotDeployer = null;
+    
+    public HotDeployerEnabler(ApplicationDeployer appDeployer, DeployerConfiguration deployerConfiguration, EventLogger eventLogger) {
+        this.appDeployer = appDeployer;
+        this.eventLogger = eventLogger;
+        this.deployerConfiguration = deployerConfiguration;
+    }
+    
+    public void startHotDeployer() {
+        this.hotDeployer = new HotDeployer(this.deployerConfiguration, this.appDeployer, this.eventLogger);
+        this.hotDeployer.doStart();
+    }
+    
+    public void stopHotDeployer() {
+        if (this.hotDeployer != null) {
+            this.hotDeployer.doStop();
+        }
+    }
+
+}
diff --git a/nano/org.eclipse.virgo.nano.deployer/src/main/java/org/eclipse/virgo/nano/deployer/util/BundleInfosUpdater.java b/nano/org.eclipse.virgo.nano.deployer/src/main/java/org/eclipse/virgo/nano/deployer/util/BundleInfosUpdater.java
new file mode 100644
index 0000000..519485f
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer/src/main/java/org/eclipse/virgo/nano/deployer/util/BundleInfosUpdater.java
@@ -0,0 +1,177 @@
+
+package org.eclipse.virgo.nano.deployer.util;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.List;
+import java.util.jar.Attributes;
+import java.util.jar.JarFile;
+import java.util.jar.Manifest;
+
+import org.eclipse.equinox.internal.simpleconfigurator.manipulator.SimpleConfiguratorManipulatorUtils;
+import org.eclipse.equinox.internal.simpleconfigurator.utils.BundleInfo;
+import org.eclipse.equinox.internal.simpleconfigurator.utils.SimpleConfiguratorUtils;
+import org.eclipse.osgi.util.ManifestElement;
+import org.eclipse.virgo.nano.deployer.SimpleDeployer;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.Constants;
+
+/**
+ * 
+ * Utility class that updates a bundles.info file.
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ * Not thread-safe.
+ */
+public class BundleInfosUpdater {
+
+    private static final String UNKNOWN = "unknown";
+    
+    private static File bundlesInfoFile;
+
+    private static File baseDir;
+
+    private static HashMap<String, BundleInfo> toBeAddedInBundlesInfo;
+
+    private static HashMap<String, BundleInfo> toBeRemovedFromBundlesInfo;
+
+    public BundleInfosUpdater(URL bundlesInfoURL, File base) {
+        bundlesInfoFile = new File(bundlesInfoURL.getFile());
+        toBeAddedInBundlesInfo = new HashMap<String, BundleInfo>();
+        toBeRemovedFromBundlesInfo = new HashMap<String, BundleInfo>();
+        baseDir = base;
+    }
+
+    public BundleInfosUpdater(File bundlesInfo, File base) {
+        bundlesInfoFile = bundlesInfo;
+        toBeAddedInBundlesInfo = new HashMap<String, BundleInfo>();
+        toBeRemovedFromBundlesInfo = new HashMap<String, BundleInfo>();
+        baseDir = base;
+    }
+    
+    public static void registerToBundlesInfo(Bundle bundle, String stagedRelativeLocation, boolean isFragment) throws URISyntaxException, IOException, BundleException {
+        String symbolicName = bundle.getSymbolicName();
+        addBundleToBundlesInfo(symbolicName == null ? UNKNOWN : symbolicName, new URI(stagedRelativeLocation),
+            bundle.getVersion().toString(), SimpleDeployer.HOT_DEPLOYED_ARTIFACTS_START_LEVEL, !isFragment);
+        updateBundleInfosRepository();
+    }    
+
+    public static void unregisterToBundlesInfo(Bundle bundle, String stagedRelativeLocation, boolean isFragment) throws IOException, BundleException, URISyntaxException {
+        String symbolicName = bundle.getSymbolicName();
+        removeBundleFromBundlesInfo(symbolicName == null ? UNKNOWN : symbolicName, new URI(stagedRelativeLocation),
+            bundle.getVersion().toString(), SimpleDeployer.HOT_DEPLOYED_ARTIFACTS_START_LEVEL, !isFragment);
+        updateBundleInfosRepository();
+    }
+
+    // writes an array to a bundles.info file
+    public void addBundlesToBundlesInfo(File[] files) throws IOException, BundleException {
+        for (File currFile : files) {
+            BundleInfo currBundleInfo = bundleFile2BundleInfo(currFile, 4, true);
+            if (currBundleInfo != null) {
+                toBeAddedInBundlesInfo.put(getIdentifier(currBundleInfo), currBundleInfo);
+            }
+        }
+    }
+
+    private static String getIdentifier(BundleInfo bundleInfo) {
+        return bundleInfo.getSymbolicName() + "=" + bundleInfo.getVersion();
+    }
+
+    // writes a single bundle info to a bundles.info file
+    public void addBundleToBundlesInfo(File file, int startLevel, boolean autoStartFlag) throws IOException, BundleException {
+        BundleInfo bundleInfo = bundleFile2BundleInfo(file, startLevel, autoStartFlag);
+        if (bundleInfo != null) {
+            toBeAddedInBundlesInfo.put(getIdentifier(bundleInfo), bundleInfo);
+        }
+    }
+
+    private static void addBundleToBundlesInfo(String bundleSymbolicName, URI url, String bundleVersion, int startLevel, boolean autoStartFlag)
+        throws IOException, BundleException {
+        try {
+            BundleInfo bundleInfo = createBundleInfo(bundleSymbolicName, bundleVersion, url, startLevel, autoStartFlag);
+            if (bundleInfo != null) {
+                toBeAddedInBundlesInfo.put(getIdentifier(bundleInfo), bundleInfo);
+            }
+        } catch (URISyntaxException ex) {
+            throw new IOException(ex.getCause());
+        }
+    }
+
+    private static void removeBundleFromBundlesInfo(String bundleSymbolicName, URI url, String bundleVersion, int startLevel, boolean autoStartFlag)
+        throws IOException, BundleException {
+        try {
+            BundleInfo bundleInfo = createBundleInfo(bundleSymbolicName, bundleVersion, url, startLevel, autoStartFlag);
+            if (bundleInfo != null) {
+                toBeRemovedFromBundlesInfo.put(getIdentifier(bundleInfo), bundleInfo);
+            }
+        } catch (URISyntaxException ex) {
+            throw new IOException(ex.getCause());
+        }
+    }
+
+    public boolean isAvailable() {
+        return bundlesInfoFile.exists();
+    }
+
+    private static HashMap<String, BundleInfo> readBundleInfosInMap(List<BundleInfo> bundleInfos) {
+        HashMap<String, BundleInfo> infos = new HashMap<String, BundleInfo>();
+        for (BundleInfo bundleInfo : bundleInfos) {
+            infos.put(getIdentifier(bundleInfo), bundleInfo);
+        }
+        return infos;
+    }
+
+    @SuppressWarnings("unchecked")
+	private static void updateBundleInfosRepository() throws IOException {
+        List<BundleInfo> readConfiguration = SimpleConfiguratorUtils.readConfiguration(bundlesInfoFile.toURI().toURL(), baseDir == null ? null : baseDir.toURI());
+		HashMap<String, BundleInfo> currentBundleInfos = readBundleInfosInMap(readConfiguration);
+
+        currentBundleInfos.putAll(toBeAddedInBundlesInfo);
+        toBeAddedInBundlesInfo.clear();
+
+        for (String identifier : toBeRemovedFromBundlesInfo.keySet()) {
+            currentBundleInfos.remove(identifier);
+        }
+        toBeRemovedFromBundlesInfo.clear();
+
+        if (bundlesInfoFile.exists()) {
+            String backupName = bundlesInfoFile.getName() + System.currentTimeMillis();
+            File backupFile = new File(bundlesInfoFile.getParentFile(), backupName);
+            if (!bundlesInfoFile.renameTo(backupFile)) {
+                throw new IOException("Fail to rename from (" + bundlesInfoFile + ") to (" + backupFile + ")");
+            }
+        }
+
+        SimpleConfiguratorManipulatorUtils.writeConfiguration(currentBundleInfos.values().toArray(new BundleInfo[currentBundleInfos.size()]),
+            bundlesInfoFile);
+    }
+
+    private static BundleInfo bundleFile2BundleInfo(File file, int startLevel, boolean autoStartFlag) throws IOException, BundleException {
+        try {
+            JarFile jarFile = new JarFile(file);
+            Manifest manifest = jarFile.getManifest();
+            if (manifest != null) {
+                Attributes mainAttributes = manifest.getMainAttributes();
+                String symbName = mainAttributes.getValue(Constants.BUNDLE_SYMBOLICNAME);
+                if (symbName != null) {
+                    ManifestElement[] symbNameHeader = ManifestElement.parseHeader(Constants.BUNDLE_SYMBOLICNAME, symbName);
+                    return createBundleInfo(symbNameHeader[0].getValue(), mainAttributes.getValue(Constants.BUNDLE_VERSION), file.toURI(),
+                        startLevel, autoStartFlag);
+                }
+            }
+            return null;
+        } catch (URISyntaxException ex) {
+            throw new IOException(ex.getCause());
+        }
+    }
+
+    private static BundleInfo createBundleInfo(String symbName, String bundleVersion, URI uri, int startLevel, boolean autoStart)
+        throws URISyntaxException {
+        return new BundleInfo(symbName, bundleVersion, uri, startLevel, autoStart);
+    }
+}
\ No newline at end of file
diff --git a/nano/org.eclipse.virgo.nano.deployer/src/main/java/org/eclipse/virgo/nano/deployer/util/BundleLocationUtil.java b/nano/org.eclipse.virgo.nano.deployer/src/main/java/org/eclipse/virgo/nano/deployer/util/BundleLocationUtil.java
new file mode 100644
index 0000000..4869a08
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer/src/main/java/org/eclipse/virgo/nano/deployer/util/BundleLocationUtil.java
@@ -0,0 +1,17 @@
+package org.eclipse.virgo.nano.deployer.util;
+
+import java.io.File;
+import java.net.URI;
+
+public class BundleLocationUtil {
+    
+    public static final String REFERENCE_FILE_PREFIX = "reference:file:";
+    
+    public static String createInstallLocation(final File kernelHomeFile, final File archiveFile) {
+        return REFERENCE_FILE_PREFIX + getRelativisedURI(kernelHomeFile, archiveFile);
+    }
+    
+    public static URI getRelativisedURI(final File kernelHomeFile, final File archiveFile) {
+        return kernelHomeFile.toURI().relativize(archiveFile.toURI());
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.deployer/src/main/java/org/eclipse/virgo/nano/deployer/util/StatusFileModificator.java b/nano/org.eclipse.virgo.nano.deployer/src/main/java/org/eclipse/virgo/nano/deployer/util/StatusFileModificator.java
new file mode 100644
index 0000000..0d52d70
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer/src/main/java/org/eclipse/virgo/nano/deployer/util/StatusFileModificator.java
@@ -0,0 +1,212 @@
+/*******************************************************************************

+ * Copyright (c) 2012 SAP AG

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ *

+ * Contributors:

+ *   SAP AG - initial contribution

+ *******************************************************************************/

+

+package org.eclipse.virgo.nano.deployer.util;

+

+import java.io.File;

+import java.io.FileInputStream;

+import java.io.FileWriter;

+import java.io.IOException;

+import java.util.Properties;

+

+import org.eclipse.virgo.util.io.IOUtils;

+import org.slf4j.Logger;

+import org.slf4j.LoggerFactory;

+

+/**

+ * The StatusFileModificator class should be used as a utility class to manipulate with deployable status files.

+ * Deployable status files are located in a '.state' folder created in the autodeployment folder (a.k.a the pickup

+ * folder). Status files names are constructed as follows: <deployable_name>.<operation>.<operation_status>, where

+ * deployable_name is the name of the deployable archive without the file extension (such as jar, war); operation - the

+ * operation which result is reported through the status file, possible values: deploy | undeploy; operation_status -

+ * status of the operation, possible values: ok | error; Status files include information about the bundleid and the

+ * lastmodified timestamp of the deployable archive. The latter can be used to check if there have been any offline

+ * updates of the deployable archive (while app server is stopped).

+ * 

+ * Not Thread-safe.

+ */

+public class StatusFileModificator {

+

+    private static final char DOT = '.';

+

+    private static final char NEW_LINE = '\n';

+

+    public static final String SUCCESS_MARK = "ok";

+

+    public static final String ERROR_MARK = "error";

+

+    public static final String OP_DEPLOY = "deploy";

+

+    public static final String OP_UNDEPLOY = "undeploy";

+

+    private static final String STATE_DIR_NAME = ".state";

+

+    private static final String BUNDLE_ID_RECORD = "bundle-id";

+

+    private static final String LAST_MODIFIED = "last-modified";

+

+    private static final String DELIMITER = "=";

+

+    private static final String EMPTY_STRING = "";

+

+    private static final Logger logger = LoggerFactory.getLogger(StatusFileModificator.class);

+

+    private static final String[] STATUS_FILENAMES_SUFFEXES = { DOT + OP_DEPLOY + DOT + SUCCESS_MARK, DOT + OP_DEPLOY + DOT + ERROR_MARK,

+        DOT + OP_UNDEPLOY + DOT + SUCCESS_MARK, DOT + OP_UNDEPLOY + DOT + ERROR_MARK };

+

+    // pattern that matches the deploy status files - ".deploy.(ok|error)"

+    private static final String STATUS_FILENAMES_DEPLOY_PATTERN = DOT + OP_DEPLOY + DOT + '(' + SUCCESS_MARK + '|' + ERROR_MARK + ')';

+

+    /**

+     * Deletes the current status file (if any) for the given deployable archive

+     */

+    public static void deleteStatusFile(String deployableName, File pickupDir) {

+        final File stateDir = new File(pickupDir, STATE_DIR_NAME);

+        if (stateDir.exists()) {

+            for (String fileNameSuffix : STATUS_FILENAMES_SUFFEXES) {

+                deleteFile(new File(stateDir, deployableName + fileNameSuffix));

+            }

+        } else {

+            if (logger.isInfoEnabled()) {

+                logger.info("State directory [" + stateDir.getAbsolutePath() + "] does not exist. Therefore, there is no status file to delete.");

+            }

+        }

+    }

+

+    /**

+     * Deletes the first occurrence of a status file from deploy operation that matches the given war name pattern (if

+     * any). There should be one match only.

+     * 

+     * @return the war name prefix of the deleted status file or empty string, if there's no match found

+     */

+    public static String deleteStatusFileByNamePattern(String warNamePattern, File pickupDir) {

+        final File stateDir = new File(pickupDir, STATE_DIR_NAME);

+        if (stateDir.exists()) {

+            String[] statusFileNames = stateDir.list();

+            if (statusFileNames != null) {

+                for (String stateFileName : statusFileNames) {

+                    if (stateFileName.matches(warNamePattern + STATUS_FILENAMES_DEPLOY_PATTERN)) {

+                        deleteFile(new File(stateDir, stateFileName));

+                        return stateFileName.substring(0, stateFileName.lastIndexOf(OP_DEPLOY) - 1);

+                    }

+                }

+            } else {

+                if (logger.isInfoEnabled()) {

+                    logger.info("State directory [" + stateDir.getAbsolutePath() + "] not listable. Therefore, there is no status file to delete.");

+                }

+            }

+        } else {

+            if (logger.isInfoEnabled()) {

+                logger.info("State directory [" + stateDir.getAbsolutePath() + "] does not exist. Therefore, there is no status file to delete.");

+            }

+        }

+        if (logger.isWarnEnabled()) {

+            logger.warn("Cannot delete any status file, as no status file matches the given warNamePattern [" + warNamePattern + "].");

+        }

+        return EMPTY_STRING;

+    }

+

+    /**

+     * Create status file about the given deplayable archive.

+     * 

+     * @param deployableName - the name of the deplayable artifact

+     * @param pickupDir - auto deployment fodler where the deployable artifact is located. In this folder .state folder

+     *        with the status file is created

+     * @param operation - operation for which status is recorded in status file (i.e. StatusFileModificator.OP_DEPLOY,

+     *        StatusFileModificator.OP_UNDEPLOY)

+     * @param status - true if the operation was executed successfully

+     * @param bundleId - bundleId of the deployable archive

+     * @param lastModified - the deployable archive's latest lastmodified timestamp

+     */

+    public static void createStatusFile(String deployableName, File pickupDir, String operation, boolean status, long bundleId, long lastModified) {

+        final File stateDir = new File(pickupDir, STATE_DIR_NAME);

+        if (!stateDir.exists() && !stateDir.mkdirs()) {

+            logger.error("Cannot create state directory [" + stateDir.getAbsolutePath() + "]. Status file for the operation cannot be created.");

+            return;

+        }

+        final File statusFile = new File(stateDir, deployableName + DOT + operation + DOT + (status ? SUCCESS_MARK : ERROR_MARK));

+        writeStatusFileRecord(statusFile, bundleId, lastModified);

+    }

+

+    /**

+     * Returns the lastmodified timestamp if there is a successful status file for the given deployable archive.

+     * Otherwise -1 is returned.

+     * 

+     * @param deployableName

+     * @param pickupDir

+     * @return

+     */

+    public static long getLastModifiedFromStatusFile(String deployableName, File pickupDir) {

+        final File stateDir = new File(pickupDir, STATE_DIR_NAME);

+        if (!stateDir.exists()) {

+            if (logger.isInfoEnabled()) {

+                logger.info("Checking if last stored state of [" + deployableName + "]." + "The state directory does not exist.");

+            }

+            return -1;

+        } else {

+            // there is no point to check lastmodified in case of other status files

+            File statusFile = new File(stateDir, deployableName + DOT + OP_DEPLOY + DOT + SUCCESS_MARK);

+            if (!statusFile.exists()) {

+                if (logger.isInfoEnabled()) {

+                    logger.info("The status file [" + statusFile.getAbsolutePath() + "] does not exist.");

+                }

+                return -1;

+            }

+            Properties props = loadProperties(statusFile);

+            if (props != null) {

+                String lastModifiedStr = props.getProperty(LAST_MODIFIED);

+                if (lastModifiedStr != null && !EMPTY_STRING.equals(lastModifiedStr)) {

+                    return Long.parseLong(lastModifiedStr);

+                }

+            }

+        }

+        return -1;

+    }

+

+    private static void writeStatusFileRecord(File statusFile, long bundleId, long lastModified) {

+        FileWriter fw = null;

+        try {

+            fw = new FileWriter(statusFile, true);

+            fw.write(BUNDLE_ID_RECORD + DELIMITER + bundleId);

+            fw.write(NEW_LINE);

+            fw.write(LAST_MODIFIED + DELIMITER + lastModified);

+            fw.write(NEW_LINE);

+            fw.flush();

+        } catch (IOException e) {

+            logger.error("Cannot update the status of operation.", e);

+        } finally {

+            IOUtils.closeQuietly(fw);

+        }

+    }

+

+    private static void deleteFile(File file) {

+        if (file.exists() && !file.delete()) {

+            logger.error("Cannot delete file [" + file.getAbsolutePath() + "].");

+        }

+    }

+

+    private static Properties loadProperties(File statusFile) {

+        Properties props = new Properties();

+        FileInputStream fis = null;

+        try {

+            fis = new FileInputStream(statusFile);

+            props.load(fis);

+            return props;

+        } catch (IOException e) {

+            if (logger.isInfoEnabled()) {

+                logger.info("Cannot load file with name [" + statusFile.getAbsolutePath() + "].", e);

+            }

+            return null;

+        } finally {

+            IOUtils.closeQuietly(fis);

+        }

+    }

+}

diff --git a/nano/org.eclipse.virgo.nano.deployer/src/main/resources/EventLogMessages.properties b/nano/org.eclipse.virgo.nano.deployer/src/main/resources/EventLogMessages.properties
new file mode 100644
index 0000000..34f92f6
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer/src/main/resources/EventLogMessages.properties
@@ -0,0 +1,30 @@
+#Nano deployer
+DE0001I = Installing from '{}'.
+DE0002I = Installed bundle '{}' version '{}'.
+DE0003I = Starting bundle '{}' version '{}'.
+DE0004I = Started bundle '{}' version '{}'.
+DE0005I = Stopping bundle '{}' version '{}'.
+DE0006I = Stopped bundle '{}' version '{}'.
+DE0007I = Uninstalling bundle '{}' version '{}'.
+DE0008I = Uninstalled bundle '{}' version '{}'.
+DE0009I = Starting web bundle '{}' version '{}' with context path '{}'.
+DE0010I = Started web bundle '{}' version '{}' with context path '{}'.
+DE0011E = Failed to install file with path '{}'. See the logs for more information.
+DE0012E = Failed to start bundle '{}' version '{}'. See the logs for more information.
+DE0013E = Failed to update file with path '{}'. See the logs for more information.
+DE0014W = Failed to persist bundle '{}' version '{}' in bundles.info. The bundle is available but will be removed after the next restart. Check the logs for more information.
+DE0015I = Updating bundle '{}' version '{}'.
+DE0016I = Updated bundle '{}' version '{}'.
+DE0017E = Failed to update bundle '{}' version '{}'. See the logs for more information.
+DE0018E = Failed to undeploy bundle '{}' version '{}'. See the logs for more information.
+DE0019I = Refreshing bundle hosts of fragment '{}' version '{}'.
+DE0020I = Refreshed bundle hosts of fragment '{}' version '{}'.
+DE0021E = Failed to refresh bundle hosts of fragment '{}' version '{}'. See the logs for more information.
+DE0022E = Can't recognize file type of artifact '{}'. The accepted file types for deployment are {}
+DE0023E = The deployed artifact is invalid. Check the logs for more information.
+#Hot deployer
+HD0001I = Hot deployer processing '{}' event for file '{}'.
+HD0002E = Hot deploy failed for file '{}'.
+HD0003E = Hot re-deploy failed for file '{}'.
+HD0004E = Hot un-deploy failed for file '{}'.
+HD0005I = Hot deploy not performed because file '{}' is already deployed.
diff --git a/nano/org.eclipse.virgo.nano.deployer/src/main/resources/OSGI-INF/org.eclipse.virgo.nano.deployer.xml b/nano/org.eclipse.virgo.nano.deployer/src/main/resources/OSGI-INF/org.eclipse.virgo.nano.deployer.xml
new file mode 100644
index 0000000..79401e3
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer/src/main/resources/OSGI-INF/org.eclipse.virgo.nano.deployer.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="org.eclipse.virgo.nano.deployer" immediate="true">
+	<implementation class="org.eclipse.virgo.nano.deployer.internal.StandardApplicationDeployer"/>
+	
+	<reference name="EventLogger"
+		interface="org.eclipse.virgo.medic.eventlog.EventLogger"
+		policy="static" 
+		cardinality="1..1" 
+		bind="bindEventLogger" 
+		unbind="unbindEventLogger"/>
+		
+	<reference name="EventAdmin"
+		interface="org.osgi.service.event.EventAdmin"
+		policy="static"
+		cardinality="1..1" 
+		bind="bindEventAdmin" 
+		unbind="unbindEventAdmin"/>
+		
+	<reference name="PackageAdmin"
+		interface="org.osgi.service.packageadmin.PackageAdmin"
+		policy="static" 
+		cardinality="1..1" 
+		bind="bindPackageAdmin" 
+		unbind="unbindPackageAdmin"/>
+		
+	<reference name="KernelConfig"
+		interface="org.eclipse.virgo.nano.core.KernelConfig"  
+		policy="static" 
+		cardinality="1..1" 
+		bind="bindKernelConfig" 
+		unbind="unbindKernelConfig"/>
+		
+	<reference name="SimpleDeployer"
+		interface="org.eclipse.virgo.nano.deployer.SimpleDeployer"  
+		policy="dynamic" 
+		cardinality="0..n" 
+		bind="bindSimpleDeployer" 
+		unbind="unbindSimpleDeployer"/>
+ 
+ 	<service>
+    	<provide interface="org.eclipse.virgo.nano.deployer.api.core.ApplicationDeployer"/>
+ 	</service>
+
+</scr:component>
diff --git a/nano/org.eclipse.virgo.nano.deployer/src/main/resources/about.html b/nano/org.eclipse.virgo.nano.deployer/src/main/resources/about.html
new file mode 100644
index 0000000..c258ef5
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer/src/main/resources/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>June 5, 2006</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/nano/org.eclipse.virgo.nano.deployer/src/test/java/org/eclipse/virgo/nano/deployer/hot/integrationtest/HotDeployerTests.java b/nano/org.eclipse.virgo.nano.deployer/src/test/java/org/eclipse/virgo/nano/deployer/hot/integrationtest/HotDeployerTests.java
new file mode 100644
index 0000000..59fc464
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer/src/test/java/org/eclipse/virgo/nano/deployer/hot/integrationtest/HotDeployerTests.java
@@ -0,0 +1,124 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.deployer.hot.integrationtest;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.expectLastCall;
+import static org.easymock.EasyMock.isA;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertTrue;
+
+import java.net.URI;
+
+import org.eclipse.virgo.nano.deployer.api.core.ApplicationDeployer;
+import org.eclipse.virgo.nano.deployer.api.core.DeployerConfiguration;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentOptions;
+import org.eclipse.virgo.nano.deployer.support.HotDeployerEnabler;
+import org.eclipse.virgo.medic.test.eventlog.MockEventLogger;
+import org.eclipse.virgo.util.io.PathReference;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+
+/**
+ */
+@Ignore
+public class HotDeployerTests {
+
+    private static final PathReference PICKUP_DIR = new PathReference("build/pickup");
+
+    private ApplicationDeployer deployer;
+
+    @Before
+    public void setUp() {
+        PICKUP_DIR.createDirectory();
+    }
+
+    @After
+    public void cleanUp() {
+        PICKUP_DIR.delete(true);
+    }
+
+    @Test
+    public void deploy() throws Exception {
+        PathReference sourceFile = new PathReference("src/test/resources/test/dummy.txt");
+        assertTrue(sourceFile.exists());
+
+        this.deployer = createMock(ApplicationDeployer.class);
+        DeploymentIdentity deploymentIdentity = new DeploymentIdentity() {
+
+            private static final long serialVersionUID = 1L;
+
+            public String getType() {
+                return null;
+            }
+
+            public String getSymbolicName() {
+                return null;
+            }
+
+            public String getVersion() {
+                return null;
+            }
+
+        };
+        this.deployer.deploy(isA(URI.class), isA(DeploymentOptions.class));
+        expectLastCall().andReturn(deploymentIdentity);
+        replay(this.deployer);
+
+        DeployerConfiguration deployerConfiguration = createMock(DeployerConfiguration.class);
+        expect(deployerConfiguration.getDeploymentPickupDirectory()).andReturn(new PathReference("build/pickup"));
+        expect(deployerConfiguration.getScanIntervalMillis()).andReturn(1000);
+
+        replay(deployerConfiguration);
+
+        HotDeployerEnabler enabler = new HotDeployerEnabler(this.deployer, deployerConfiguration, new MockEventLogger());
+        enabler.startHotDeployer();
+
+        try {
+            // Deployer.start() is asynchronous: sleep long
+            // enough for it to have started up
+            Thread.sleep(2000);
+        } catch (InterruptedException ie) {
+
+        }
+
+        PathReference copy = sourceFile.copy(PICKUP_DIR);
+        pauseOnCreate(copy, 4000, 4000);
+        enabler.stopHotDeployer();
+
+        verify(this.deployer);
+    }
+
+    private void pauseOnCreate(PathReference pr, long pause, long timeout) {
+        long start = System.currentTimeMillis();
+
+        while (!pr.exists() && System.currentTimeMillis() - start < timeout) {
+            sleep(100);
+        }
+        if (pr.exists()) {
+            sleep(pause);
+        }
+    }
+
+    private void sleep(long millis) {
+        try {
+            Thread.sleep(millis);
+        } catch (InterruptedException e) {
+
+        }
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.deployer/src/test/java/org/eclipse/virgo/nano/deployer/util/StatusFileModificatorTest.java b/nano/org.eclipse.virgo.nano.deployer/src/test/java/org/eclipse/virgo/nano/deployer/util/StatusFileModificatorTest.java
new file mode 100644
index 0000000..3da4226
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer/src/test/java/org/eclipse/virgo/nano/deployer/util/StatusFileModificatorTest.java
@@ -0,0 +1,141 @@
+/*******************************************************************************

+ * Copyright (c) 2012 SAP AG

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ *

+ * Contributors:

+ *   SAP AG - initial contribution

+ *******************************************************************************/

+

+package org.eclipse.virgo.nano.deployer.util;

+

+import static org.junit.Assert.assertTrue;

+

+import java.io.File;

+

+import org.eclipse.virgo.util.io.PathReference;

+import org.junit.After;

+import org.junit.Before;

+import org.junit.Test;

+

+public class StatusFileModificatorTest {

+

+    private static final PathReference PICKUP_DIR = new PathReference("build/pickup");

+

+    private static final PathReference STATE_DIR = new PathReference("build/pickup/.state");

+

+    private static final String[] dummyStatusFiles = { "src/test/resources/test/testapp1.deploy.ok", "src/test/resources/test/testapp1.undeploy.ok",

+        "src/test/resources/test/testapp1.deploy.error", "src/test/resources/test/testapp1.undeploy.error",

+        "src/test/resources/test/testapp2.deploy.ok" };

+

+    private static final String[] strangeStatusFiles = { "src/test/resources/test/test#strangesymbols.undeploy.ok", 

+    	"src/test/resources/test/test#strangesymbols.deploy.ok", "src/test/resources/test/teststrangesymbols.undeploy.ok"};

+    

+    @Before

+    public void setUp() {

+        PICKUP_DIR.createDirectory();

+    }

+

+    @After

+    public void cleanUp() {

+        PICKUP_DIR.delete(true);

+    }

+

+    @Test

+    public void deleteStatusFileTest() throws Exception {

+        STATE_DIR.createDirectory();

+        copyDummyStatusFiles();

+        File stateFolder = STATE_DIR.toFile();

+        File pickupFolder = PICKUP_DIR.toFile();

+        assertTrue(stateFolder.list().length == 5);

+        StatusFileModificator.deleteStatusFile("testapp1", pickupFolder);

+        assertTrue(stateFolder.list().length == 1);

+        assertTrue("Only 'testapp2.deploy.ok' file should be in .state folder : ", stateFolder.list()[0].equals("testapp2.deploy.ok"));

+        StatusFileModificator.deleteStatusFile("testapp2", pickupFolder);

+        assertTrue(stateFolder.list().length == 0);

+    }

+    

+    @Test

+    public void deleteStatusFileByPatternTest() throws Exception {

+        STATE_DIR.createDirectory();

+        copyDummyStatusFiles();

+        File stateFolder = STATE_DIR.toFile();

+        File pickupFolder = PICKUP_DIR.toFile();

+        assertTrue(stateFolder.list().length == 5);

+        String deleted = StatusFileModificator.deleteStatusFileByNamePattern("testapp2", pickupFolder);

+        assertTrue(stateFolder.list().length == 4);

+        assertTrue("Only 'testapp2' file should be deleted : ", deleted.equals("testapp2"));

+        StatusFileModificator.deleteStatusFile("testapp1", pickupFolder);

+        assertTrue(stateFolder.list().length == 0);

+    }

+

+    @Test

+    public void deleteStatusFileByPatternStrangeSymbolsTest() throws Exception {

+        STATE_DIR.createDirectory();

+        copyStrangeStatusFiles();

+        File stateFolder = STATE_DIR.toFile();

+        File pickupFolder = PICKUP_DIR.toFile();

+        assertTrue(stateFolder.list().length == 3);

+        String deleted = StatusFileModificator.deleteStatusFileByNamePattern("test[^a-zA-Z0-9_-]strangesymbols", pickupFolder);

+        assertTrue(stateFolder.list().length == 2);

+        assertTrue("Only 'test#strangesymbols' file should be deleted: ", deleted.equals("test#strangesymbols"));

+        assertTrue("Both undeploy status files should not be deleted: ",

+            stateFolder.list()[0].contains(".undeploy.") && stateFolder.list()[1].contains(".undeploy."));

+    }

+

+    @Test

+    public void createStatusFileOkTest() throws Exception {

+        for (String st : new String[] { StatusFileModificator.OP_DEPLOY, StatusFileModificator.OP_UNDEPLOY }) {

+            StatusFileModificator.createStatusFile("testApp3", PICKUP_DIR.toFile(), st, true, 33, 123456789);

+            File stateDir = STATE_DIR.toFile();

+            assertTrue(stateDir.exists());

+            assertTrue("Invalid .state folder contents:", stateDir.list().length == 1 && stateDir.list()[0].equals("testApp3." + st + ".ok"));

+            StatusFileModificator.deleteStatusFile("testApp3", PICKUP_DIR.toFile());

+        }

+    }

+

+    @Test

+    public void createStatusFileErrorTest() throws Exception {

+        for (String st : new String[] { StatusFileModificator.OP_DEPLOY, StatusFileModificator.OP_UNDEPLOY }) {

+            StatusFileModificator.createStatusFile("testApp4", PICKUP_DIR.toFile(), st, false, 33, 123456789);

+            File stateDir = STATE_DIR.toFile();

+            assertTrue(stateDir.exists());

+            assertTrue("Invalid .state folder contents:", stateDir.list().length == 1 && stateDir.list()[0].equals("testApp4." + st + ".error"));

+            StatusFileModificator.deleteStatusFile("testApp4", PICKUP_DIR.toFile());

+        }

+    }

+

+    @Test

+    public void getLastModifiedFromStatusFileTest() throws Exception {

+        File pickupDir = PICKUP_DIR.toFile();

+        StatusFileModificator.createStatusFile("testApp5", pickupDir, StatusFileModificator.OP_UNDEPLOY, true, 33, 123456789);

+        assertTrue(StatusFileModificator.getLastModifiedFromStatusFile("testApp5", pickupDir) == -1);

+        StatusFileModificator.createStatusFile("testApp6", pickupDir, StatusFileModificator.OP_UNDEPLOY, false, 33, 123456789);

+        assertTrue(StatusFileModificator.getLastModifiedFromStatusFile("testApp6", pickupDir) == -1);

+        StatusFileModificator.createStatusFile("testApp7", pickupDir, StatusFileModificator.OP_DEPLOY, true, 33, 123456789);

+        assertTrue(StatusFileModificator.getLastModifiedFromStatusFile("testApp7", pickupDir) == 123456789);

+        StatusFileModificator.createStatusFile("testApp8", pickupDir, StatusFileModificator.OP_DEPLOY, false, 33, 123456789);

+        assertTrue(StatusFileModificator.getLastModifiedFromStatusFile("testApp8", pickupDir) == -1);

+        assertTrue(StatusFileModificator.getLastModifiedFromStatusFile("testApp9", pickupDir) == -1);

+    }

+

+    private void copyDummyStatusFiles() {

+    	copyStatusFiles(dummyStatusFiles);

+    }

+    

+    private void copyStrangeStatusFiles() {

+    	copyStatusFiles(strangeStatusFiles);

+    }

+    

+    private void copyStatusFiles(String[] files) {

+    	for (String statusFile : files) {

+            PathReference sourceFile = new PathReference(statusFile);

+            assertTrue(sourceFile.exists());

+            PathReference copy = sourceFile.copy(STATE_DIR);

+            assertTrue(copy.exists());

+        }

+    }

+

+}
\ No newline at end of file
diff --git a/nano/org.eclipse.virgo.nano.deployer/src/test/resources/test/dummy.txt b/nano/org.eclipse.virgo.nano.deployer/src/test/resources/test/dummy.txt
new file mode 100644
index 0000000..9f26b63
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer/src/test/resources/test/dummy.txt
@@ -0,0 +1 @@
+Foo
\ No newline at end of file
diff --git "a/nano/org.eclipse.virgo.nano.deployer/src/test/resources/test/test\043strangesymbols.deploy.ok" "b/nano/org.eclipse.virgo.nano.deployer/src/test/resources/test/test\043strangesymbols.deploy.ok"
new file mode 100644
index 0000000..6674615
--- /dev/null
+++ "b/nano/org.eclipse.virgo.nano.deployer/src/test/resources/test/test\043strangesymbols.deploy.ok"
@@ -0,0 +1,2 @@
+bundle-id=197
+last-modified=1345737442754
diff --git "a/nano/org.eclipse.virgo.nano.deployer/src/test/resources/test/test\043strangesymbols.undeploy.ok" "b/nano/org.eclipse.virgo.nano.deployer/src/test/resources/test/test\043strangesymbols.undeploy.ok"
new file mode 100644
index 0000000..6674615
--- /dev/null
+++ "b/nano/org.eclipse.virgo.nano.deployer/src/test/resources/test/test\043strangesymbols.undeploy.ok"
@@ -0,0 +1,2 @@
+bundle-id=197
+last-modified=1345737442754
diff --git a/nano/org.eclipse.virgo.nano.deployer/src/test/resources/test/testapp1.deploy.error b/nano/org.eclipse.virgo.nano.deployer/src/test/resources/test/testapp1.deploy.error
new file mode 100644
index 0000000..6674615
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer/src/test/resources/test/testapp1.deploy.error
@@ -0,0 +1,2 @@
+bundle-id=197
+last-modified=1345737442754
diff --git a/nano/org.eclipse.virgo.nano.deployer/src/test/resources/test/testapp1.deploy.ok b/nano/org.eclipse.virgo.nano.deployer/src/test/resources/test/testapp1.deploy.ok
new file mode 100644
index 0000000..6674615
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer/src/test/resources/test/testapp1.deploy.ok
@@ -0,0 +1,2 @@
+bundle-id=197
+last-modified=1345737442754
diff --git a/nano/org.eclipse.virgo.nano.deployer/src/test/resources/test/testapp1.undeploy.error b/nano/org.eclipse.virgo.nano.deployer/src/test/resources/test/testapp1.undeploy.error
new file mode 100644
index 0000000..6674615
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer/src/test/resources/test/testapp1.undeploy.error
@@ -0,0 +1,2 @@
+bundle-id=197
+last-modified=1345737442754
diff --git a/nano/org.eclipse.virgo.nano.deployer/src/test/resources/test/testapp1.undeploy.ok b/nano/org.eclipse.virgo.nano.deployer/src/test/resources/test/testapp1.undeploy.ok
new file mode 100644
index 0000000..6674615
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer/src/test/resources/test/testapp1.undeploy.ok
@@ -0,0 +1,2 @@
+bundle-id=197
+last-modified=1345737442754
diff --git a/nano/org.eclipse.virgo.nano.deployer/src/test/resources/test/testapp2.deploy.ok b/nano/org.eclipse.virgo.nano.deployer/src/test/resources/test/testapp2.deploy.ok
new file mode 100644
index 0000000..6674615
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer/src/test/resources/test/testapp2.deploy.ok
@@ -0,0 +1,2 @@
+bundle-id=197
+last-modified=1345737442754
diff --git a/nano/org.eclipse.virgo.nano.deployer/src/test/resources/test/teststrangesymbols.undeploy.ok b/nano/org.eclipse.virgo.nano.deployer/src/test/resources/test/teststrangesymbols.undeploy.ok
new file mode 100644
index 0000000..6674615
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer/src/test/resources/test/teststrangesymbols.undeploy.ok
@@ -0,0 +1,2 @@
+bundle-id=197
+last-modified=1345737442754
diff --git a/nano/org.eclipse.virgo.nano.deployer/template.mf b/nano/org.eclipse.virgo.nano.deployer/template.mf
new file mode 100644
index 0000000..aed3ecd
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.deployer/template.mf
@@ -0,0 +1,25 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Virgo Nano Deployer
+Bundle-SymbolicName: org.eclipse.virgo.nano.deployer
+Bundle-Version: ${version}
+Service-Component: OSGI-INF/org.eclipse.virgo.nano.deployer.xml
+Import-Template: 
+ org.eclipse.virgo.nano.*;version="${version:[=.=.=, =.+1)}",
+ org.eclipse.virgo.util.*;version="${version:[=.=.=, =.+1)}",
+ org.eclipse.virgo.medic.*;version="${version:[=.=.=, =.+1)}",
+ org.osgi.framework.*;version="0",
+ org.osgi.service.*;version="0",
+ javax.management.*;version="0",
+ javax.xml.*;version="0",
+ org.xml.*;version="0",
+ org.w3c.*;version="0",
+ org.osgi.service.component;version="0",
+ org.osgi.service.packageadmin;version="0",
+ org.eclipse.equinox.internal.simpleconfigurator.*;version="0",
+ org.eclipse.osgi.util;version="0",
+ org.slf4j;version="0"
+Excluded-Exports:
+ *.internal.*
+Excluded-Imports: 
+ org.eclipse.virgo.nano.deployer
diff --git a/nano/org.eclipse.virgo.nano.management.controller/.gitignore b/nano/org.eclipse.virgo.nano.management.controller/.gitignore
new file mode 100644
index 0000000..c5e82d7
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.management.controller/.gitignore
@@ -0,0 +1 @@
+bin
\ No newline at end of file
diff --git a/nano/org.eclipse.virgo.nano.management.controller/src/main/java/org/eclipse/virgo/nano/management/controller/NanoManagementController.java b/nano/org.eclipse.virgo.nano.management.controller/src/main/java/org/eclipse/virgo/nano/management/controller/NanoManagementController.java
new file mode 100644
index 0000000..2770b6a
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.management.controller/src/main/java/org/eclipse/virgo/nano/management/controller/NanoManagementController.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2012 SAP AG
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   SAP AG - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.management.controller;
+
+import org.eclipse.virgo.nano.core.KernelConfig;
+import org.eclipse.virgo.nano.deployer.api.Deployer;
+import org.eclipse.virgo.nano.deployer.api.RecoveryMonitor;
+import org.eclipse.virgo.nano.management.DefaultManagementExporter;
+import org.osgi.framework.BundleContext;
+
+
+public class NanoManagementController {
+
+    private Deployer deployerMBean;
+    private RecoveryMonitor recoveryMonitorMBean;
+    private KernelConfig kernelConfig;
+    
+    private DefaultManagementExporter<Deployer> deployerMBeanExporter;
+    private DefaultManagementExporter<RecoveryMonitor> recoveryMBeanExporter;
+    
+    public void activate(BundleContext context) {
+        String domainProperty = kernelConfig.getProperty("domain");
+        this.deployerMBeanExporter = new DefaultManagementExporter<Deployer>(deployerMBean, domainProperty + ":category=Control,type=Deployer");
+        this.deployerMBeanExporter.export();
+        
+        this.recoveryMBeanExporter = new DefaultManagementExporter<RecoveryMonitor>(recoveryMonitorMBean, domainProperty + ":category=Control,type=RecoveryMonitor");
+        this.recoveryMBeanExporter.export();
+    }
+    
+    public void deactivate(BundleContext context) {
+        this.deployerMBeanExporter.unExport();
+        this.recoveryMBeanExporter.unExport();
+    }
+
+    public void bindDeployerMBean(Deployer deployer) {
+        this.deployerMBean = deployer;
+    }
+    
+    public void unbindDeployerMBean(Deployer deployer) {
+        this.deployerMBean = null;
+    }
+    
+    public void bindRecoveryMBean(RecoveryMonitor recovery) {
+        this.recoveryMonitorMBean = recovery;
+    }
+    
+    public void unbindRecoveryMBean(RecoveryMonitor recovery) {
+        this.recoveryMonitorMBean = null;
+    }
+    
+    public void bindKernelConfig(KernelConfig config) {
+        this.kernelConfig = config;
+    }
+    
+    public void unbindKernelConfig(KernelConfig config) {
+        this.kernelConfig = null;
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.management.controller/src/main/resources/OSGI-INF/org.eclipse.virgo.nano.management.controller.xml b/nano/org.eclipse.virgo.nano.management.controller/src/main/resources/OSGI-INF/org.eclipse.virgo.nano.management.controller.xml
new file mode 100644
index 0000000..b47e544
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.management.controller/src/main/resources/OSGI-INF/org.eclipse.virgo.nano.management.controller.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="Nano Management Controller" immediate="true">
+   <implementation class="org.eclipse.virgo.nano.management.controller.NanoManagementController"/>
+ 
+   	<reference name="DeployerMBean" 
+   	interface="org.eclipse.virgo.nano.deployer.api.Deployer" 
+   	policy="static"
+   	bind="bindDeployerMBean" 
+   	unbind="unbindDeployerMBean"/>
+   	
+   	<reference name="RecoveryMonitorMBean" 
+   	interface="org.eclipse.virgo.nano.deployer.api.RecoveryMonitor" 
+   	policy="static"
+   	bind="bindRecoveryMBean" 
+   	unbind="unbindRecoveryMBean"/>
+   	
+   	<reference name="KernelConfig" 
+   	interface="org.eclipse.virgo.nano.core.KernelConfig" 
+   	policy="static"
+   	bind="bindKernelConfig" 
+   	unbind="unbindKernelConfig"/>
+    
+</scr:component>
diff --git a/nano/org.eclipse.virgo.nano.management.controller/src/main/resources/about.html b/nano/org.eclipse.virgo.nano.management.controller/src/main/resources/about.html
new file mode 100644
index 0000000..c258ef5
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.management.controller/src/main/resources/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>June 5, 2006</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/nano/org.eclipse.virgo.nano.management.controller/template.mf b/nano/org.eclipse.virgo.nano.management.controller/template.mf
new file mode 100644
index 0000000..f217b5a
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.management.controller/template.mf
@@ -0,0 +1,10 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Virgo Nano MBean Exporter
+Bundle-SymbolicName: org.eclipse.virgo.nano.management.controller
+Bundle-Version: ${version}
+Service-Component: OSGI-INF/org.eclipse.virgo.nano.management.controller.xml
+Import-Template: org.eclipse.virgo.nano.*;version="${version:[=.=.=, +1)}",
+ org.osgi.framework.*;version="0"
+Excluded-Exports: 
+ *
diff --git a/nano/org.eclipse.virgo.nano.management/.gitignore b/nano/org.eclipse.virgo.nano.management/.gitignore
new file mode 100644
index 0000000..c5e82d7
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.management/.gitignore
@@ -0,0 +1 @@
+bin
\ No newline at end of file
diff --git a/nano/org.eclipse.virgo.nano.management/src/main/java/org/eclipse/virgo/nano/management/DefaultManagementExporter.java b/nano/org.eclipse.virgo.nano.management/src/main/java/org/eclipse/virgo/nano/management/DefaultManagementExporter.java
new file mode 100644
index 0000000..5e2082d
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.management/src/main/java/org/eclipse/virgo/nano/management/DefaultManagementExporter.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright (c) 2012 SAP AG
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   SAP AG - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.management;
+
+import java.lang.management.ManagementFactory;
+
+import javax.management.MBeanServer;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Exports an object for management. It is useful to keep a handle to this exporter in order to {@link #unExport()} the
+ * object passed in. In the case where this class is created as part of a Spring bean definition, the object will be
+ * automatically exported and unExported in line with the lifecycle of the {@link ApplicationContext};
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ * 
+ * @param <T> The type of the object to export for management
+ * 
+ */
+public class DefaultManagementExporter<T> {
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private final MBeanServer server = ManagementFactory.getPlatformMBeanServer();
+
+    private final T object;
+
+    private final ObjectName name;
+
+    /**
+     * Create a {@link DefaultManagementExporter}
+     * 
+     * @param object The object to export
+     * @param name The name to export the object to
+     */
+    public DefaultManagementExporter(T object, String name) {
+        this.object = object;
+        this.name = createObjectName(name);
+    }
+
+    private ObjectName createObjectName(String name) {
+        try {
+            return new ObjectName(name);
+        } catch (MalformedObjectNameException e) {
+            throw new RuntimeException("Could not convert String '" + name + "' to ObjectName", e);
+        }
+    }
+
+    /**
+     * Export the object
+     */
+    public void export() {
+        try {
+            logger.debug("Registering object {} with name {} for management", object, name);
+            server.registerMBean(object, name);
+        } catch (Exception e) {
+            logger.error("Unable to register object {} with name {} for management", object, name);
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * Unexport the object
+     */
+    public void unExport() {
+        try {
+            logger.debug("Unregistering bean {} with name {} from management", object, name);
+            server.unregisterMBean(name);
+        } catch (Exception e) {
+            logger.warn("Unable to unregister bean {} with name {} from management", object, name);
+        }
+    }
+
+}
diff --git a/nano/org.eclipse.virgo.nano.management/src/main/java/org/eclipse/virgo/nano/management/deployer/NanoDeployer.java b/nano/org.eclipse.virgo.nano.management/src/main/java/org/eclipse/virgo/nano/management/deployer/NanoDeployer.java
new file mode 100644
index 0000000..af1e884
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.management/src/main/java/org/eclipse/virgo/nano/management/deployer/NanoDeployer.java
@@ -0,0 +1,146 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.management.deployer;
+
+import java.io.File;
+import java.net.URI;
+import java.net.URISyntaxException;
+
+import org.eclipse.virgo.nano.deployer.api.ArtifactIdentity;
+import org.eclipse.virgo.nano.deployer.api.Deployer;
+import org.eclipse.virgo.nano.deployer.api.core.ApplicationDeployer;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentException;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentIdentity;
+import org.eclipse.virgo.nano.deployer.api.core.DeploymentOptions;
+
+
+/**
+ * Standard implementation of the deployer's control.
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread-safe assuming that the ApplicationDeployer is thread-safe.
+ * 
+ */
+public class NanoDeployer implements Deployer {
+
+    private ApplicationDeployer applicationDeployer;
+
+    public NanoDeployer() {
+        this.applicationDeployer = null;
+    }
+    
+    public NanoDeployer(ApplicationDeployer applicationDeployer) {
+        this.applicationDeployer = applicationDeployer;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public DeploymentIdentity deploy(String uri) throws DeploymentException {
+        return this.applicationDeployer.deploy(URI.create(uri));
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public DeploymentIdentity deploy(String uri, boolean recoverable) throws DeploymentException {
+        return this.applicationDeployer.deploy(URI.create(uri), new DeploymentOptions(recoverable, false, true));
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @SuppressWarnings("deprecation")
+    public void undeploy(String applicationSymbolicName, String version) throws DeploymentException {
+        this.applicationDeployer.undeploy(applicationSymbolicName, version);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void refresh(String uri, String symbolicName) throws DeploymentException {
+        this.applicationDeployer.refresh(URI.create(uri), symbolicName);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void refreshBundle(String bundleSymbolicName, String bundleVersion) throws DeploymentException {
+        this.applicationDeployer.refreshBundle(bundleSymbolicName, bundleVersion);
+    }
+
+    public ArtifactIdentity install(String artifactUri) throws DeploymentException {
+        DeploymentIdentity deploymentIdentity = this.applicationDeployer.install(createURI(artifactUri), new DeploymentOptions());
+        return new ArtifactIdentity(deploymentIdentity.getType(), deploymentIdentity.getSymbolicName(), deploymentIdentity.getVersion());
+    }
+
+    public ArtifactIdentity install(String artifactUri, boolean recover) throws DeploymentException {
+        DeploymentIdentity deploymentIdentity = this.applicationDeployer.install(createURI(artifactUri), new DeploymentOptions(recover, false, true));
+        return new ArtifactIdentity(deploymentIdentity.getType(), deploymentIdentity.getSymbolicName(), deploymentIdentity.getVersion());
+    }
+
+    public ArtifactIdentity install(String type, String name, String version) throws DeploymentException {
+        throw new UnsupportedOperationException("Not yet implemented, use deploy instead of install and start");
+    }
+
+    public ArtifactIdentity install(String type, String name, String version, boolean recover) throws DeploymentException {
+        throw new UnsupportedOperationException("Not yet implemented, use deploy instead of install and start");
+    }
+
+    public void start(ArtifactIdentity artifactIdentity) throws DeploymentException, IllegalStateException {
+        throw new UnsupportedOperationException("Not yet implemented, use deploy instead of install and start");
+
+    }
+
+    public void start(String type, String name, String version) throws DeploymentException, IllegalStateException {
+        throw new UnsupportedOperationException("Not yet implemented, use deploy instead of install and start");
+    }
+
+    public void stop(ArtifactIdentity artifactIdentity) throws DeploymentException, IllegalStateException {
+        throw new UnsupportedOperationException("Not yet implemented, use undeploy instead of stop and uninstall");
+    }
+
+    public void stop(String type, String name, String version) throws DeploymentException, IllegalStateException {
+        throw new UnsupportedOperationException("Not yet implemented, use undeploy instead of stop and uninstall");
+    }
+
+    public void uninstall(ArtifactIdentity artifactIdentity) throws DeploymentException {
+        throw new UnsupportedOperationException("Not yet implemented, use undeploy instead of stop and uninstall");
+    }
+
+    public void uninstall(String type, String name, String version) throws DeploymentException {
+        throw new UnsupportedOperationException("Not yet implemented, use undeploy instead of stop and uninstall");
+    }
+
+    private URI createURI(String uriString) {
+        URI uri;
+        try {
+            uri = new URI(uriString);
+        } catch (URISyntaxException urise) {
+            throw new IllegalArgumentException(String.format("The location '%s' is not a valid URI", uriString));
+        }
+
+        if ("file".equals(uri.getScheme())) {
+            uri = new File(uri.getSchemeSpecificPart()).toURI();
+        }
+
+        return uri;
+    }
+    
+    public void bindAppDeployer(ApplicationDeployer deployer) {
+        this.applicationDeployer = deployer;
+    }
+    
+    public void unbindAppDeployer(ApplicationDeployer deployer) {
+        this.applicationDeployer = null;
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.management/src/main/java/org/eclipse/virgo/nano/management/deployer/StandardRecoveryMonitor.java b/nano/org.eclipse.virgo.nano.management/src/main/java/org/eclipse/virgo/nano/management/deployer/StandardRecoveryMonitor.java
new file mode 100644
index 0000000..1a9bdce
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.management/src/main/java/org/eclipse/virgo/nano/management/deployer/StandardRecoveryMonitor.java
@@ -0,0 +1,100 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.management.deployer;
+
+import javax.management.ListenerNotFoundException;
+import javax.management.MBeanNotificationInfo;
+import javax.management.Notification;
+import javax.management.NotificationBroadcaster;
+import javax.management.NotificationBroadcasterSupport;
+import javax.management.NotificationFilter;
+import javax.management.NotificationListener;
+
+import org.eclipse.virgo.nano.deployer.api.RecoveryMonitor;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventHandler;
+
+
+/**
+ * Monitors the process of the deployer recovery process.
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.
+ * 
+ */
+public class StandardRecoveryMonitor implements NotificationBroadcaster, RecoveryMonitor, EventHandler {
+    
+    private static final String TOPIC_RECOVERY_COMPLETED = "org/eclipse/virgo/kernel/deployer/recovery/COMPLETED";
+
+	private final NotificationBroadcasterSupport broadcasterSupport = new NotificationBroadcasterSupport();
+
+	private final Object monitor = new Object();
+
+	private boolean recoveryComplete = false;
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public boolean isRecoveryComplete() {
+		synchronized (this.monitor) {
+			return this.recoveryComplete;
+		}
+	}
+
+	private void signalRecoveryComplete() {
+	    boolean sendNotification = false;
+	    
+		synchronized (this.monitor) {
+			if (!this.recoveryComplete) {
+				this.recoveryComplete = true;
+				sendNotification = true;
+			}
+		} 
+		
+		if (sendNotification) { 
+			this.broadcasterSupport.sendNotification(new Notification(NOTIFICATION_TYPE, this, 1));
+		}
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void addNotificationListener(NotificationListener listener, NotificationFilter filter, Object handback) throws IllegalArgumentException {
+		this.broadcasterSupport.addNotificationListener(listener, filter, handback);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public MBeanNotificationInfo[] getNotificationInfo() {
+		return new MBeanNotificationInfo[] { new MBeanNotificationInfo(new String[] { NOTIFICATION_TYPE }, Notification.class.getName(),
+		        "Deployer Recovery Complete Notification.") };
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void removeNotificationListener(NotificationListener listener) throws ListenerNotFoundException {
+		this.broadcasterSupport.removeNotificationListener(listener);
+	}
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void handleEvent(Event event) {
+        if (TOPIC_RECOVERY_COMPLETED.equals(event.getTopic())) {
+            signalRecoveryComplete();
+        }        
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.management/src/main/resources/OSGI-INF/org.eclipse.virgo.nano.management.deployer.xml b/nano/org.eclipse.virgo.nano.management/src/main/resources/OSGI-INF/org.eclipse.virgo.nano.management.deployer.xml
new file mode 100644
index 0000000..7967f93
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.management/src/main/resources/OSGI-INF/org.eclipse.virgo.nano.management.deployer.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="Nano Deployer MBean" immediate="true">
+   <implementation class="org.eclipse.virgo.nano.management.deployer.NanoDeployer"/>
+    
+   <reference name="ApplicationDeployer" 
+   	interface="org.eclipse.virgo.nano.deployer.api.core.ApplicationDeployer" 
+   	policy="static"
+   	bind="bindAppDeployer" 
+   	unbind="unbindAppDeployer"/>
+   	
+    <service>
+       <provide interface="org.eclipse.virgo.nano.deployer.api.Deployer"/>
+    </service>
+    
+</scr:component>
diff --git a/nano/org.eclipse.virgo.nano.management/src/main/resources/OSGI-INF/org.eclipse.virgo.nano.management.recovery.xml b/nano/org.eclipse.virgo.nano.management/src/main/resources/OSGI-INF/org.eclipse.virgo.nano.management.recovery.xml
new file mode 100644
index 0000000..1c16c99
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.management/src/main/resources/OSGI-INF/org.eclipse.virgo.nano.management.recovery.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="Nano Recovery MBean" immediate="true">
+   <implementation class="org.eclipse.virgo.nano.management.deployer.StandardRecoveryMonitor"/>
+    
+    <property name="event.topics">org/eclipse/virgo/kernel/*</property>
+    
+    <service>
+       <provide interface="org.osgi.service.event.EventHandler"/>
+       <provide interface="org.eclipse.virgo.nano.deployer.api.RecoveryMonitor"/>
+    </service>
+    
+</scr:component>
diff --git a/nano/org.eclipse.virgo.nano.management/src/main/resources/about.html b/nano/org.eclipse.virgo.nano.management/src/main/resources/about.html
new file mode 100644
index 0000000..c258ef5
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.management/src/main/resources/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>June 5, 2006</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/nano/org.eclipse.virgo.nano.management/src/test/java/org/eclipse/virgo/nano/management/deployer/RecoveryMonitorTests.java b/nano/org.eclipse.virgo.nano.management/src/test/java/org/eclipse/virgo/nano/management/deployer/RecoveryMonitorTests.java
new file mode 100644
index 0000000..a9fc4c2
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.management/src/test/java/org/eclipse/virgo/nano/management/deployer/RecoveryMonitorTests.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.management.deployer;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.lang.management.ManagementFactory;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import javax.management.MBeanServer;
+import javax.management.Notification;
+import javax.management.NotificationListener;
+import javax.management.ObjectName;
+
+import org.eclipse.virgo.nano.management.deployer.StandardRecoveryMonitor;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.service.event.Event;
+
+/**
+ */
+public class RecoveryMonitorTests {
+
+    private ObjectName objectName;
+
+    private final MBeanServer server = ManagementFactory.getPlatformMBeanServer();
+
+    @Before public void before() throws Exception {
+        this.objectName = ObjectName.getInstance("deployer:name=Recovery,env=Test");
+    }
+
+    public void after() throws Exception {
+        if (this.server.isRegistered(this.objectName)) {
+            this.server.unregisterMBean(this.objectName);
+        }
+    }
+
+    @Test public void testRecoveryNotification() throws Exception {
+        StandardRecoveryMonitor mbean = new StandardRecoveryMonitor();
+        this.server.registerMBean(mbean, this.objectName);
+        assertFalse(queryRecoveryComplete());
+        final AtomicInteger counter = new AtomicInteger(0);
+        this.server.addNotificationListener(this.objectName, new NotificationListener() {
+
+            public void handleNotification(Notification notification, Object handback) {
+                counter.incrementAndGet();
+            }
+
+        }, null, null);
+        mbean.handleEvent(new Event("org/eclipse/virgo/kernel/deployer/recovery/COMPLETED", (Map<String, ?>)null));
+        assertTrue(queryRecoveryComplete());
+        assertEquals(1, counter.get());
+    }
+
+    private boolean queryRecoveryComplete() throws Exception {
+        return (Boolean) this.server.getAttribute(this.objectName, "RecoveryComplete");
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.management/src/test/resources/.gitignore b/nano/org.eclipse.virgo.nano.management/src/test/resources/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.management/src/test/resources/.gitignore
diff --git a/nano/org.eclipse.virgo.nano.management/template.mf b/nano/org.eclipse.virgo.nano.management/template.mf
new file mode 100644
index 0000000..46d7f4b
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.management/template.mf
@@ -0,0 +1,15 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Virgo Nano MBean Exporter
+Bundle-SymbolicName: org.eclipse.virgo.nano.management
+Bundle-Version: ${version}
+Service-Component: OSGI-INF/org.eclipse.virgo.nano.management.deployer.xml,OSGI-INF/org.eclipse.virgo.nano.management.recovery.xml
+Import-Template: org.eclipse.virgo.medic.*;version="${version:[=.=.=, +1)}",
+ org.eclipse.virgo.nano.*;version="${version:[=.=.=, +1)}",
+ org.eclipse.virgo.util.*;version="${version:[=.=.=, +1)}",
+ org.slf4j;version="0",
+ org.osgi.service.*;version="0",
+ javax.management.*;version="0"
+Excluded-Exports: 
+ *.management.deployer
+ *.internal.*
diff --git a/nano/org.eclipse.virgo.nano.services.concurrent/.settings/org.eclipse.virgo.ide.bundlor.core.prefs b/nano/org.eclipse.virgo.nano.services.concurrent/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
new file mode 100644
index 0000000..c94ef47
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.services.concurrent/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
@@ -0,0 +1,3 @@
+#Fri Aug 07 16:08:57 BST 2009
+org.eclipse.virgo.ide.bundlor.core.template.properties.files=../build.properties;../build.versions
+eclipse.preferences.version=1
diff --git a/nano/org.eclipse.virgo.nano.services.concurrent/.settings/org.eclipse.wst.common.project.facet.core.xml b/nano/org.eclipse.virgo.nano.services.concurrent/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..92aa290
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.services.concurrent/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+  <installed facet="org.eclipse.virgo.server.bundle" version="1.0"/>
+</faceted-project>
diff --git a/nano/org.eclipse.virgo.nano.services.concurrent/.settings/org.springframework.ide.eclipse.core.prefs b/nano/org.eclipse.virgo.nano.services.concurrent/.settings/org.springframework.ide.eclipse.core.prefs
new file mode 100644
index 0000000..fb7dc20
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.services.concurrent/.settings/org.springframework.ide.eclipse.core.prefs
@@ -0,0 +1,67 @@
+#Mon Aug 03 11:32:32 BST 2009
+eclipse.preferences.version=1
+org.springframework.ide.eclipse.core.builders.enable.aopreferencemodelbuilder=true
+org.springframework.ide.eclipse.core.builders.enable.beanmetadatabuilder=true
+org.springframework.ide.eclipse.core.builders.enable.osgibundleupdater=true
+org.springframework.ide.eclipse.core.enable.project.preferences=false
+org.springframework.ide.eclipse.core.validator.enable.com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.enable.com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.enable.com.springsource.sts.server.quickfix.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.enable.org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.enable.org.springframework.ide.eclipse.core.springvalidator=false
+org.springframework.ide.eclipse.core.validator.enable.org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.applicationSymbolicNameRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.applicationVersionRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleActivationPolicyRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleActivatorRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleManifestVersionRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleNameRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleSymbolicNameRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleVersionRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.exportPackageRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.importRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.parsingProblemsRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.requireBundleRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.AvoidDriverManagerDataSource-com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.ImportElementsAtTopRulee-com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.ParentBeanSpecifiesAbstractClassRule-com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.RefElementRule-com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.TooManyBeansInFileRule-com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.UnnecessaryValueElementRule-com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.UseBeanInheritance-com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.legacyxmlusage.jndiobjectfactory-com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.importBundleVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.importLibraryVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.importPackageVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.requireBundleVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanAlias-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanClass-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanConstructorArgument-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanDefinition-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanDefinitionHolder-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanFactory-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanInitDestroyMethod-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanProperty-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanReference-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.methodOverride-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.parsingProblems-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.requiredProperty-org.springframework.ide.eclipse.beans.core.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.core.springClasspath-org.springframework.ide.eclipse.core.springvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.action-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.actionstate-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.attribute-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.attributemapper-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.beanaction-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.evaluationaction-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.evaluationresult-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.exceptionhandler-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.import-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.inputattribute-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.mapping-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.outputattribute-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.set-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.state-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.subflowstate-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.transition-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.variable-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.webflowstate-org.springframework.ide.eclipse.webflow.core.validator=true
diff --git a/nano/org.eclipse.virgo.nano.services.concurrent/.springBeans b/nano/org.eclipse.virgo.nano.services.concurrent/.springBeans
new file mode 100644
index 0000000..618a258
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.services.concurrent/.springBeans
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beansProjectDescription>
+	<version>1</version>
+	<pluginVersion><![CDATA[2.2.8.200911091054-RELEASE]]></pluginVersion>
+	<configSuffixes>
+		<configSuffix><![CDATA[xml]]></configSuffix>
+	</configSuffixes>
+	<enableImports><![CDATA[false]]></enableImports>
+	<configs>
+	</configs>
+	<configSets>
+	</configSets>
+</beansProjectDescription>
diff --git a/nano/org.eclipse.virgo.nano.services.concurrent/src/main/java/org/eclipse/virgo/nano/services/concurrent/ConcurrentLogEvents.java b/nano/org.eclipse.virgo.nano.services.concurrent/src/main/java/org/eclipse/virgo/nano/services/concurrent/ConcurrentLogEvents.java
new file mode 100644
index 0000000..ac70d5e
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.services.concurrent/src/main/java/org/eclipse/virgo/nano/services/concurrent/ConcurrentLogEvents.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.services.concurrent;
+
+import org.eclipse.virgo.medic.eventlog.Level;
+import org.eclipse.virgo.medic.eventlog.LogEvent;
+
+/**
+ * {@link LogEvent} for the concurrent subsystem.
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.
+ * 
+ */
+public enum ConcurrentLogEvents implements LogEvent {
+
+    DEADLOCK_DETECTED(0, Level.ERROR);
+
+    private static final String PREFIX = "CC";
+    
+    private final int code;
+    
+    private final Level level;
+
+    private ConcurrentLogEvents(int code, Level level) {
+        this.code = code;
+        this.level = level;        
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getEventCode() {
+        return String.format("%s%04d%1.1s", PREFIX, this.code, this.level);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Level getLevel() {
+        return this.level;
+    }
+
+}
diff --git a/nano/org.eclipse.virgo.nano.services.concurrent/src/main/java/org/eclipse/virgo/nano/services/concurrent/DeadlockAnalyser.java b/nano/org.eclipse.virgo.nano.services.concurrent/src/main/java/org/eclipse/virgo/nano/services/concurrent/DeadlockAnalyser.java
new file mode 100644
index 0000000..109f099
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.services.concurrent/src/main/java/org/eclipse/virgo/nano/services/concurrent/DeadlockAnalyser.java
@@ -0,0 +1,234 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.services.concurrent;
+
+import java.lang.Thread.State;
+import java.lang.management.ManagementFactory;
+import java.lang.management.ThreadInfo;
+import java.lang.management.ThreadMXBean;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Analyses any deadlocks present in the VM and creates a description of the cycles.
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.
+ * 
+ */
+public class DeadlockAnalyser {
+
+    /**
+     * Result when there are no deadlocks.
+     */
+    private static final Deadlock[] NULL_RESULT = new Deadlock[0];
+
+    /**
+     * The VM {@link ThreadMXBean}.
+     */
+    private final ThreadMXBean threadBean = ManagementFactory.getThreadMXBean();
+
+    /**
+     * Identifies deadlocks in the currently running {@link Thread Threads}.
+     * 
+     * @return the deadlocks; never <code>null</code>.
+     */
+    public Deadlock[] findDeadlocks() {
+        long[] deadlockedThreads = this.threadBean.findMonitorDeadlockedThreads();
+        if (deadlockedThreads == null || deadlockedThreads.length == 0) {
+            return NULL_RESULT;
+        }
+
+        Map<Long, ThreadInfo> threadInfoMap = createThreadInfoMap(deadlockedThreads);
+        Set<LinkedHashSet<ThreadInfo>> cycles = calculateCycles(threadInfoMap);
+        Set<LinkedHashSet<ThreadInfo>> chains = calculateCycleDeadlockChains(threadInfoMap, cycles);
+        cycles.addAll(chains);
+        return createDeadlockDescriptions(cycles);
+    }
+
+    /**
+     * Creates {@link Deadlock} objects for each cycle in the supplied set.
+     * 
+     * @param cycles the cycles.
+     * @return the <code>Deadlocks</code>.
+     */
+    private Deadlock[] createDeadlockDescriptions(Set<LinkedHashSet<ThreadInfo>> cycles) {
+        Deadlock[] result = new Deadlock[cycles.size()];
+        int count = 0;
+        for (Set<ThreadInfo> cycle : cycles) {
+            ThreadInfo[] asArray = cycle.toArray(new ThreadInfo[cycle.size()]);
+            Deadlock d = new Deadlock(asArray);
+            result[count++] = d;
+        }
+        return result;
+    }
+
+    /**
+     * Calculates the cycles in the supplied {@link ThreadInfo} map. A cycle is represented as a {@link LinkedHashSet}
+     * of <code>ThreadInfo</code> objects. The order of the items in the <code>LinkedHashSet</code> reflects cycle
+     * order.
+     * 
+     * @param threadInfoMap the <code>ThreadInfo</code> map.
+     * @return all the cycles.
+     */
+    private Set<LinkedHashSet<ThreadInfo>> calculateCycles(Map<Long, ThreadInfo> threadInfoMap) {
+        Set<LinkedHashSet<ThreadInfo>> cycles = new HashSet<LinkedHashSet<ThreadInfo>>();
+        for (Map.Entry<Long, ThreadInfo> entry : threadInfoMap.entrySet()) {
+            LinkedHashSet<ThreadInfo> cycle = new LinkedHashSet<ThreadInfo>();
+
+            ThreadInfo t = entry.getValue();
+            while (!cycle.contains(t)) {
+                cycle.add(t);
+                t = threadInfoMap.get(t.getLockOwnerId());
+            }
+            if (!cycles.contains(cycle)) {
+                cycles.add(cycle);
+            }
+        }
+
+        return cycles;
+    }
+
+    /**
+     * Calculates deadlock chains where the deadlock occurs from a chain of threads waiting on some lock that is part of
+     * a deadlock cycle. A cycle is represented as a {@link LinkedHashSet} of <code>ThreadInfo</code> objects. The order
+     * of the items in the <code>LinkedHashSet</code> reflects chain order.
+     * 
+     * @param threadInfoMap the <code>ThreadInfo</code> map.
+     * @param cycles the known deadlock cycles.
+     * @return the deadlock chains.
+     */
+    private Set<LinkedHashSet<ThreadInfo>> calculateCycleDeadlockChains(Map<Long, ThreadInfo> threadInfoMap, Set<LinkedHashSet<ThreadInfo>> cycles) {
+        ThreadInfo[] allThreads = this.threadBean.getThreadInfo(this.threadBean.getAllThreadIds());
+        Set<LinkedHashSet<ThreadInfo>> deadlockChain = new HashSet<LinkedHashSet<ThreadInfo>>();
+        Set<Long> knownDeadlockedThreads = threadInfoMap.keySet();
+        for (ThreadInfo threadInfo : allThreads) {
+            State state = threadInfo.getThreadState();
+            if (state == State.BLOCKED && !knownDeadlockedThreads.contains(threadInfo.getThreadId())) {
+                for (LinkedHashSet<ThreadInfo> cycle : cycles) {
+                    if (cycle.contains(threadInfoMap.get(threadInfo.getLockOwnerId()))) {
+                        LinkedHashSet<ThreadInfo> chain = new LinkedHashSet<ThreadInfo>();
+                        ThreadInfo node = threadInfo;
+                        while (!chain.contains(node)) {
+                            chain.add(node);
+                            node = threadInfoMap.get(node.getLockOwnerId());
+                        }
+                        deadlockChain.add(chain);
+                    }
+                }
+            }
+        }
+        return deadlockChain;
+    }
+
+    /**
+     * Creates a mapping of <code>ThreadId +> ThreadInfo</code> for the deadlocked threads.
+     * 
+     * @param threadIds the deadlocked thread ids
+     * @return the mapping.
+     */
+    private Map<Long, ThreadInfo> createThreadInfoMap(long[] threadIds) {
+        ThreadInfo[] threadInfos = this.threadBean.getThreadInfo(threadIds);
+
+        Map<Long, ThreadInfo> threadInfoMap = new HashMap<Long, ThreadInfo>();
+        for (ThreadInfo threadInfo : threadInfos) {
+            threadInfoMap.put(threadInfo.getThreadId(), threadInfo);
+        }
+        return threadInfoMap;
+    }
+
+    /**
+     * Describes a deadlock of two or more threads.
+     * 
+     */
+    public static final class Deadlock {
+
+        private final ThreadInfo[] members;
+
+        private final String description;
+
+        private final Set<Long> memberIds;
+
+        /**
+         * Creates a new {@link Deadlock}.
+         * 
+         * @param members the members of the deadlock in cycle order.
+         */
+        private Deadlock(ThreadInfo[] members) {
+            this.members = members;
+            this.memberIds = new HashSet<Long>(members.length);
+            StringBuilder sb = new StringBuilder();
+            for (int x = 0; x < members.length; x++) {
+                ThreadInfo ti = members[x];
+                sb.append(ti.getThreadName());
+                if (x < members.length) {
+                    sb.append(" > ");
+                }
+
+                if (x == members.length - 1) {
+                    sb.append(ti.getLockOwnerName());
+                }
+                this.memberIds.add(ti.getThreadId());
+            }
+            this.description = sb.toString();
+        }
+
+        /**
+         * Gets the members of the deadlock in cycle order.
+         * 
+         * @return the members of the deadlock.
+         */
+        public ThreadInfo[] getMembers() {
+            return this.members.clone();
+        }
+
+        @Override
+        public String toString() {
+            return this.description;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public int hashCode() {
+            final int prime = 31;
+            int result = 1;
+            result = prime * result + this.memberIds.hashCode();
+            return result;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public boolean equals(Object obj) {
+            if (this == obj) {
+                return true;
+            }
+            if (obj == null) {
+                return false;
+            }
+            if (getClass() != obj.getClass()) {
+                return false;
+            }
+            final Deadlock other = (Deadlock) obj;
+            return other.memberIds.equals(this.memberIds);
+        }
+
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.services.concurrent/src/main/java/org/eclipse/virgo/nano/services/concurrent/DeadlockMonitor.java b/nano/org.eclipse.virgo.nano.services.concurrent/src/main/java/org/eclipse/virgo/nano/services/concurrent/DeadlockMonitor.java
new file mode 100644
index 0000000..60537a1
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.services.concurrent/src/main/java/org/eclipse/virgo/nano/services/concurrent/DeadlockMonitor.java
@@ -0,0 +1,142 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.services.concurrent;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.virgo.nano.services.concurrent.DeadlockAnalyser.Deadlock;
+import org.eclipse.virgo.medic.dump.DumpGenerator;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.util.math.Sets;
+import org.osgi.service.component.ComponentContext;
+
+/**
+ * Monitors all running {@link Thread Threads} and triggers a dump when a deadlock is detected.
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.
+ * 
+ */
+public final class DeadlockMonitor {
+
+    private static final int PERIOD = 10;
+
+    private static final TimeUnit UNIT = TimeUnit.SECONDS;
+
+    private ScheduledExecutorService executorService;
+
+    private DumpGenerator dumpGenerator;
+
+    private EventLogger eventLogger;
+
+    private volatile ScheduledFuture<?> future;
+
+    public void activate(ComponentContext context) {
+        this.executorService = new ScheduledThreadPoolExecutor(1);
+        this.future = this.executorService.scheduleAtFixedRate(new DeadlockMonitorTask(this.dumpGenerator, this.eventLogger), PERIOD, PERIOD, UNIT);
+    }
+    
+    public void deactivate(ComponentContext context) {
+        if (this.executorService != null) {
+            this.executorService.shutdown();
+        }
+
+        if (this.future != null) {
+            this.future.cancel(true);
+        }
+    }
+    
+    public DeadlockMonitor() {
+    }
+    
+    /**
+     * Creates a new <code>DeadlockMonitor</code>.
+     * 
+     * @param executorService the <code>ScheduledExecutorService</code>
+     * @param dumpGenerator the @{link {@link DumpGenerator} to trigger a dump.
+     * @param eventLogger 
+     */
+    public DeadlockMonitor(DumpGenerator dumpGenerator, EventLogger eventLogger) {
+        this.dumpGenerator = dumpGenerator;
+        this.eventLogger = eventLogger;
+    }
+    
+    public void bindEventLogger(EventLogger eventLogger) {
+        this.eventLogger = eventLogger;
+    }
+    public void unbindEventLogger(EventLogger eventLogger) {
+        this.eventLogger = null;
+    }
+    
+    public void bindDumpGenerator(DumpGenerator dumpGenerator) {
+        this.dumpGenerator = dumpGenerator;
+    }
+    public void unbindDumpGenerator(DumpGenerator dumpGenerator) {
+        this.dumpGenerator = null;
+    }
+
+    /**
+     * Task for monitoring threads for deadlocks.
+     * <p/>
+     */
+    private static class DeadlockMonitorTask implements Runnable {
+
+        private final DeadlockAnalyser analyser = new DeadlockAnalyser();
+
+        private final EventLogger eventLogger;
+
+        private final Set<Deadlock> lastSeenDeadlocks = new HashSet<Deadlock>();
+
+        private final Object monitor = new Object();
+
+        private final DumpGenerator dumpGenerator;
+
+        /**
+         * Creates a new <code>DeadlockMonitorTask</code>.
+         * 
+         * @param dumpGenerator the {@link DumpGenerator} to use.
+         * @param eventLogger 
+         */
+        public DeadlockMonitorTask(DumpGenerator dumpGenerator, EventLogger eventLogger) {
+            this.dumpGenerator = dumpGenerator;
+            this.eventLogger = eventLogger;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public void run() {
+            synchronized (this.monitor) {
+                Deadlock[] deadlocks = this.analyser.findDeadlocks();
+                if (deadlocks != null && deadlocks.length > 0) {
+                    Set<Deadlock> asSet = Sets.asSet(deadlocks);
+                    if (!asSet.equals(this.lastSeenDeadlocks)) {
+                        this.eventLogger.log(ConcurrentLogEvents.DEADLOCK_DETECTED);
+                        this.dumpGenerator.generateDump("deadlock");
+                        this.lastSeenDeadlocks.clear();
+                        this.lastSeenDeadlocks.addAll(asSet);
+                    }
+                } else {
+                    this.lastSeenDeadlocks.clear();
+                }
+            }
+        }
+
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.services.concurrent/src/main/resources/EventLogMessages.properties b/nano/org.eclipse.virgo.nano.services.concurrent/src/main/resources/EventLogMessages.properties
new file mode 100644
index 0000000..b41ba26
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.services.concurrent/src/main/resources/EventLogMessages.properties
@@ -0,0 +1 @@
+CC0000E = Deadlock detected. Generating dump.
diff --git a/nano/org.eclipse.virgo.nano.services.concurrent/src/main/resources/OSGI-INF/org.eclipse.virgo.nano.services.concurrent.xml b/nano/org.eclipse.virgo.nano.services.concurrent/src/main/resources/OSGI-INF/org.eclipse.virgo.nano.services.concurrent.xml
new file mode 100644
index 0000000..6a7f948
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.services.concurrent/src/main/resources/OSGI-INF/org.eclipse.virgo.nano.services.concurrent.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" enabled="true" immediate="true" name="org.eclipse.virgo.nano.services.concurrent">
+   <implementation class="org.eclipse.virgo.nano.services.concurrent.DeadlockMonitor"/>
+   
+   <reference name="EventLogger"
+		interface="org.eclipse.virgo.medic.eventlog.EventLogger"
+		policy="dynamic" 
+		cardinality="0..1" 
+		bind="bindEventLogger" 
+		unbind="unbindEventLogger"/>
+		
+	<reference name="DumpGenerator"
+		interface="org.eclipse.virgo.medic.dump.DumpGenerator"
+		policy="static" 
+		cardinality="1..1" 
+		bind="bindDumpGenerator" 
+		unbind="unbindDumpGenerator"/>
+</scr:component>
diff --git a/nano/org.eclipse.virgo.nano.services.concurrent/src/main/resources/about.html b/nano/org.eclipse.virgo.nano.services.concurrent/src/main/resources/about.html
new file mode 100644
index 0000000..c258ef5
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.services.concurrent/src/main/resources/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>June 5, 2006</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/nano/org.eclipse.virgo.nano.services.concurrent/src/test/java/org/eclipse/virgo/nano/services/concurrent/DeadlockAnalyserTests.java b/nano/org.eclipse.virgo.nano.services.concurrent/src/test/java/org/eclipse/virgo/nano/services/concurrent/DeadlockAnalyserTests.java
new file mode 100644
index 0000000..7c5d657
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.services.concurrent/src/test/java/org/eclipse/virgo/nano/services/concurrent/DeadlockAnalyserTests.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.services.concurrent;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import org.eclipse.virgo.nano.services.concurrent.DeadlockAnalyser;
+import org.eclipse.virgo.nano.services.concurrent.DeadlockAnalyser.Deadlock;
+import org.junit.Test;
+
+
+/**
+ */
+public class DeadlockAnalyserTests {
+
+    @Test public void deadlocks() {
+        DeadlockAnalyser da = new DeadlockAnalyser();
+        Deadlock[] before = da.findDeadlocks();
+
+        DeadlockCreatorMBean dc = new DeadlockCreator();
+        dc.createDeadlock(2, 0);
+        dc.createDeadlock(3, 0);
+        dc.createDeadlock(4, 2);
+
+        Deadlock[] deadlocks = da.findDeadlocks();
+        assertNotNull(deadlocks);
+        assertEquals(5 + before.length, deadlocks.length);
+        boolean seen2 = false;
+        boolean seen3 = false;
+        boolean seen4 = false;
+        for (Deadlock deadlock : deadlocks) {
+            switch (deadlock.getMembers().length) {
+                case 2:
+                    seen2 = true;
+                    break;
+                case 3:
+                    seen3 = true;
+                    break;
+                case 4:
+                    seen4 = true;
+                    break;
+            }
+        }
+        assertTrue(seen2);
+        assertTrue(seen3);
+        assertTrue(seen4);
+    }
+
+}
diff --git a/nano/org.eclipse.virgo.nano.services.concurrent/src/test/java/org/eclipse/virgo/nano/services/concurrent/DeadlockCreator.java b/nano/org.eclipse.virgo.nano.services.concurrent/src/test/java/org/eclipse/virgo/nano/services/concurrent/DeadlockCreator.java
new file mode 100644
index 0000000..29c8eb6
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.services.concurrent/src/test/java/org/eclipse/virgo/nano/services/concurrent/DeadlockCreator.java
@@ -0,0 +1,124 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.services.concurrent;
+
+import java.lang.Thread.State;
+import java.util.concurrent.CountDownLatch;
+
+/**
+ */
+public class DeadlockCreator implements DeadlockCreatorMBean {
+
+    public Thread[] createDeadlock(int threadCount, int extraneousCount) {
+        CountDownLatch latch = new CountDownLatch(threadCount);
+        Object[] monitors = new Object[threadCount];
+
+        for (int x = 0; x < threadCount; x++) {
+            monitors[x] = new Object();
+        }
+
+        Thread[] threads = new Thread[threadCount];
+        for (int x = 0; x < threadCount; x++) {
+            int f = x;
+            int s = x == threadCount - 1 ? 0 : x + 1;
+            threads[x] = new Thread(new DeadlockRunnable(latch, monitors[f], monitors[s]));
+            threads[x].start();
+        }
+        try {
+            latch.await();
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+        awaitBlocking(threads);
+
+        Thread[] extraneous = new Thread[extraneousCount];
+        for (int x = 0; x < extraneousCount; x++) {
+            extraneous[x] = new Thread(new ExtraneousRunnable(monitors[0]));
+            extraneous[x].start();
+        }
+        awaitBlocking(extraneous);
+        return threads;
+    }
+
+    void awaitBlocking(Thread[] threads) {
+        for (Thread thread : threads) {
+            while (thread.getState() != State.BLOCKED) {
+                try {
+                    Thread.sleep(30);
+                } catch (InterruptedException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
+    static final class DeadlockRunnable implements Runnable {
+
+        private final CountDownLatch latch;
+
+        private final Object first;
+
+        private final Object second;
+
+        /**
+         * @param latch
+         * @param first
+         * @param second
+         */
+        public DeadlockRunnable(CountDownLatch latch, Object first, Object second) {
+            this.latch = latch;
+            this.first = first;
+            this.second = second;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public void run() {
+            synchronized (this.first) {
+                this.latch.countDown();
+                try {
+                    this.latch.await();
+                } catch (InterruptedException e) {
+                    e.printStackTrace();
+                }
+                synchronized (this.second) {
+                    System.out.println("Running DeadlockRunnable");
+                }
+            }
+        }
+
+    }
+
+    static final class ExtraneousRunnable implements Runnable {
+
+        private final Object monitor;
+
+        /**
+         * @param monitor
+         */
+        public ExtraneousRunnable(Object monitor) {
+            this.monitor = monitor;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public void run() {
+            synchronized (this.monitor) {
+                System.out.println("running ExtraeousRunnable");
+            }
+        }
+
+    }
+
+}
diff --git a/nano/org.eclipse.virgo.nano.services.concurrent/src/test/java/org/eclipse/virgo/nano/services/concurrent/DeadlockCreatorMBean.java b/nano/org.eclipse.virgo.nano.services.concurrent/src/test/java/org/eclipse/virgo/nano/services/concurrent/DeadlockCreatorMBean.java
new file mode 100644
index 0000000..23ae086
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.services.concurrent/src/test/java/org/eclipse/virgo/nano/services/concurrent/DeadlockCreatorMBean.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.services.concurrent;
+
+/**
+ */
+public interface DeadlockCreatorMBean {
+
+    Thread[] createDeadlock(int threadCount, int extraneousCount);
+}
diff --git a/nano/org.eclipse.virgo.nano.services.concurrent/src/test/resources/.gitignore b/nano/org.eclipse.virgo.nano.services.concurrent/src/test/resources/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.services.concurrent/src/test/resources/.gitignore
diff --git a/nano/org.eclipse.virgo.nano.services.concurrent/template.mf b/nano/org.eclipse.virgo.nano.services.concurrent/template.mf
new file mode 100644
index 0000000..89b9203
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.services.concurrent/template.mf
@@ -0,0 +1,15 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Virgo Kernel Services
+Bundle-SymbolicName: org.eclipse.virgo.nano.services.concurrent
+Bundle-Version: ${version}
+Service-Component: OSGI-INF/org.eclipse.virgo.nano.services.concurrent.xml
+Excluded-Exports:
+ *.internal.*
+Import-Template:
+ org.eclipse.virgo.util.*;version="${version:[=.=.=, =.+1)}",
+ org.eclipse.virgo.medic.*;version="${version:[=.=.=, =.+1)}";resolution:=optional,
+ org.aspectj.*;version="${aspectjVersion:[=.=.=, +1)}",
+ org.slf4j.*;version="${slf4jVersion:[=.=.=, +1)}",
+ org.osgi.framework.*;version="0",
+ org.osgi.service.component.*;version="0"
diff --git a/nano/org.eclipse.virgo.nano.services.ds/.settings/org.eclipse.virgo.ide.bundlor.core.prefs b/nano/org.eclipse.virgo.nano.services.ds/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
new file mode 100644
index 0000000..c94ef47
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.services.ds/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
@@ -0,0 +1,3 @@
+#Fri Aug 07 16:08:57 BST 2009
+org.eclipse.virgo.ide.bundlor.core.template.properties.files=../build.properties;../build.versions
+eclipse.preferences.version=1
diff --git a/nano/org.eclipse.virgo.nano.services.ds/.settings/org.eclipse.wst.common.project.facet.core.xml b/nano/org.eclipse.virgo.nano.services.ds/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..92aa290
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.services.ds/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+  <installed facet="org.eclipse.virgo.server.bundle" version="1.0"/>
+</faceted-project>
diff --git a/nano/org.eclipse.virgo.nano.services.ds/.settings/org.springframework.ide.eclipse.core.prefs b/nano/org.eclipse.virgo.nano.services.ds/.settings/org.springframework.ide.eclipse.core.prefs
new file mode 100644
index 0000000..fb7dc20
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.services.ds/.settings/org.springframework.ide.eclipse.core.prefs
@@ -0,0 +1,67 @@
+#Mon Aug 03 11:32:32 BST 2009
+eclipse.preferences.version=1
+org.springframework.ide.eclipse.core.builders.enable.aopreferencemodelbuilder=true
+org.springframework.ide.eclipse.core.builders.enable.beanmetadatabuilder=true
+org.springframework.ide.eclipse.core.builders.enable.osgibundleupdater=true
+org.springframework.ide.eclipse.core.enable.project.preferences=false
+org.springframework.ide.eclipse.core.validator.enable.com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.enable.com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.enable.com.springsource.sts.server.quickfix.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.enable.org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.enable.org.springframework.ide.eclipse.core.springvalidator=false
+org.springframework.ide.eclipse.core.validator.enable.org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.applicationSymbolicNameRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.applicationVersionRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleActivationPolicyRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleActivatorRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleManifestVersionRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleNameRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleSymbolicNameRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleVersionRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.exportPackageRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.importRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.parsingProblemsRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.requireBundleRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.AvoidDriverManagerDataSource-com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.ImportElementsAtTopRulee-com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.ParentBeanSpecifiesAbstractClassRule-com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.RefElementRule-com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.TooManyBeansInFileRule-com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.UnnecessaryValueElementRule-com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.UseBeanInheritance-com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.legacyxmlusage.jndiobjectfactory-com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.importBundleVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.importLibraryVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.importPackageVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.requireBundleVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanAlias-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanClass-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanConstructorArgument-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanDefinition-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanDefinitionHolder-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanFactory-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanInitDestroyMethod-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanProperty-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanReference-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.methodOverride-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.parsingProblems-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.requiredProperty-org.springframework.ide.eclipse.beans.core.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.core.springClasspath-org.springframework.ide.eclipse.core.springvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.action-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.actionstate-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.attribute-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.attributemapper-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.beanaction-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.evaluationaction-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.evaluationresult-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.exceptionhandler-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.import-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.inputattribute-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.mapping-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.outputattribute-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.set-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.state-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.subflowstate-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.transition-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.variable-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.webflowstate-org.springframework.ide.eclipse.webflow.core.validator=true
diff --git a/nano/org.eclipse.virgo.nano.services.ds/.springBeans b/nano/org.eclipse.virgo.nano.services.ds/.springBeans
new file mode 100644
index 0000000..618a258
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.services.ds/.springBeans
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beansProjectDescription>
+	<version>1</version>
+	<pluginVersion><![CDATA[2.2.8.200911091054-RELEASE]]></pluginVersion>
+	<configSuffixes>
+		<configSuffix><![CDATA[xml]]></configSuffix>
+	</configSuffixes>
+	<enableImports><![CDATA[false]]></enableImports>
+	<configs>
+	</configs>
+	<configSets>
+	</configSets>
+</beansProjectDescription>
diff --git a/nano/org.eclipse.virgo.nano.services.ds/src/main/java/org/eclipse/virgo/nano/services/ds/DSMonitor.java b/nano/org.eclipse.virgo.nano.services.ds/src/main/java/org/eclipse/virgo/nano/services/ds/DSMonitor.java
new file mode 100644
index 0000000..8471a52
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.services.ds/src/main/java/org/eclipse/virgo/nano/services/ds/DSMonitor.java
@@ -0,0 +1,98 @@
+
+package org.eclipse.virgo.nano.services.ds;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.felix.scr.Component;
+import org.apache.felix.scr.ScrService;
+import org.osgi.service.component.ComponentContext;
+
+public class DSMonitor {
+
+    private static final int PERIOD = 15;
+
+    private static final TimeUnit UNIT = TimeUnit.SECONDS;
+
+    private ScrService scrService;
+    
+    private Object eventLogger = null;
+    
+    private ScheduledExecutorService executorService;
+
+    private volatile ScheduledFuture<?> future;
+    
+    private Set<Component> unsatisfiedComponents = new HashSet<Component>();
+
+    public void activate(ComponentContext context) {
+        this.executorService = new ScheduledThreadPoolExecutor(1);
+        this.future = this.executorService.scheduleAtFixedRate(new DSMonitorTask(), PERIOD, PERIOD, UNIT);
+    }
+
+    public void deactivate(ComponentContext context) {
+        if (this.executorService != null) {
+            this.executorService.shutdown();
+        }
+
+        if (this.future != null) {
+            this.future.cancel(true);
+        }
+    }
+
+    class DSMonitorTask implements Runnable {
+
+        @Override
+        public void run() {
+            List<Component> components = Arrays.asList(scrService.getComponents());
+            for (Component comp : components) {
+                if (comp.getState() == 4) {
+                    boolean isNewlyUnsatisfied = unsatisfiedComponents.add(comp);
+                    if (isNewlyUnsatisfied) {
+                        if (eventLogger != null) {
+                            new EventLoggerProxy().logUnsatisfiedFound(eventLogger, comp);
+                        } else {
+                            System.err.println("Failed to satisfy declarative service component '"+ comp.getName() +"' from origin bundle '"+ comp.getBundle() +"'.");
+                        }
+                    }
+                }
+            }
+            for (Component possiblySatisfiedComponent: unsatisfiedComponents) {
+                if (!components.contains(possiblySatisfiedComponent)) {
+                    unsatisfiedComponents.remove(possiblySatisfiedComponent);
+   
+                } else {
+                    if (possiblySatisfiedComponent.getState() == 16 || possiblySatisfiedComponent.getState() == 32) {
+                        if (eventLogger != null) {
+                            new EventLoggerProxy().logSatisfied(eventLogger, possiblySatisfiedComponent);
+                        } else {
+                            System.out.println("Successfully resolved declarative service component '"+ possiblySatisfiedComponent.getName() +"' from origin bundle '"+ possiblySatisfiedComponent.getBundle() +"'.");
+                        }
+                        unsatisfiedComponents.remove(possiblySatisfiedComponent);
+                    }
+                }
+            }
+        }
+    }
+
+    public void bindEventLogger(Object eventLogger) {
+        this.eventLogger = eventLogger;
+    }
+
+    public void unbindEventLogger(Object eventLogger) {
+        this.eventLogger = null;
+    }
+
+    public void bindScr(ScrService scr) {
+        this.scrService = scr;
+    }
+
+    public void unbindScr(ScrService scr) {
+        this.scrService = null;
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.services.ds/src/main/java/org/eclipse/virgo/nano/services/ds/DSMonitorLogEvents.java b/nano/org.eclipse.virgo.nano.services.ds/src/main/java/org/eclipse/virgo/nano/services/ds/DSMonitorLogEvents.java
new file mode 100644
index 0000000..19a4737
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.services.ds/src/main/java/org/eclipse/virgo/nano/services/ds/DSMonitorLogEvents.java
@@ -0,0 +1,37 @@
+package org.eclipse.virgo.nano.services.ds;
+
+import org.eclipse.virgo.medic.eventlog.Level;
+import org.eclipse.virgo.medic.eventlog.LogEvent;
+
+public enum DSMonitorLogEvents implements LogEvent {
+
+        UNSATISFIED_DS_COMPONENT_FOUND(0, Level.WARNING),
+        SATISFIED_DS_COMPONENT(1, Level.WARNING);
+
+        private static final String PREFIX = "DS";
+        
+        private final int code;
+        
+        private final Level level;
+
+        private DSMonitorLogEvents(int code, Level level) {
+            this.code = code;
+            this.level = level;        
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public String getEventCode() {
+            return String.format("%s%04d%1.1s", PREFIX, this.code, this.level);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public Level getLevel() {
+            return this.level;
+        }
+
+    }
+
diff --git a/nano/org.eclipse.virgo.nano.services.ds/src/main/java/org/eclipse/virgo/nano/services/ds/EventLoggerProxy.java b/nano/org.eclipse.virgo.nano.services.ds/src/main/java/org/eclipse/virgo/nano/services/ds/EventLoggerProxy.java
new file mode 100644
index 0000000..04fa2e9
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.services.ds/src/main/java/org/eclipse/virgo/nano/services/ds/EventLoggerProxy.java
@@ -0,0 +1,15 @@
+package org.eclipse.virgo.nano.services.ds;
+
+import org.apache.felix.scr.Component;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+
+public class EventLoggerProxy {
+    
+    void logUnsatisfiedFound(Object eventLogger, Component comp) {
+        ((EventLogger)eventLogger).log(DSMonitorLogEvents.UNSATISFIED_DS_COMPONENT_FOUND, comp.getName(), comp.getBundle());
+    }
+    
+    void logSatisfied(Object eventLogger, Component comp) {
+        ((EventLogger)eventLogger).log(DSMonitorLogEvents.UNSATISFIED_DS_COMPONENT_FOUND, comp.getName(), comp.getBundle());
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.services.ds/src/main/resources/EventLogMessages.properties b/nano/org.eclipse.virgo.nano.services.ds/src/main/resources/EventLogMessages.properties
new file mode 100644
index 0000000..145eabe
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.services.ds/src/main/resources/EventLogMessages.properties
@@ -0,0 +1,2 @@
+DS0000W = Failed to satisfy declarative service component '{}' from origin bundle '{}'.
+DS0001W = Successfully satisfied declarative service component '{}' from origin bundle '{}'.
diff --git a/nano/org.eclipse.virgo.nano.services.ds/src/main/resources/OSGI-INF/org.eclipse.virgo.nano.services.ds.xml b/nano/org.eclipse.virgo.nano.services.ds/src/main/resources/OSGI-INF/org.eclipse.virgo.nano.services.ds.xml
new file mode 100644
index 0000000..1d2ea2b
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.services.ds/src/main/resources/OSGI-INF/org.eclipse.virgo.nano.services.ds.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" enabled="true" immediate="true" name="org.eclipse.virgo.nano.services.ds">
+   <implementation class="org.eclipse.virgo.nano.services.ds.DSMonitor"/>
+   
+   <reference name="EventLogger"
+		interface="org.eclipse.virgo.medic.eventlog.EventLogger"
+		policy="dynamic" 
+		cardinality="0..1" 
+		bind="bindEventLogger" 
+		unbind="unbindEventLogger"/>
+	
+	<reference name="ScrService"
+		interface="org.apache.felix.scr.ScrService"
+		policy="static" 
+		cardinality="1..1" 
+		bind="bindScr" 
+		unbind="unbindScr"/>
+		
+</scr:component>
diff --git a/nano/org.eclipse.virgo.nano.services.ds/src/main/resources/about.html b/nano/org.eclipse.virgo.nano.services.ds/src/main/resources/about.html
new file mode 100644
index 0000000..c258ef5
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.services.ds/src/main/resources/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>June 5, 2006</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/nano/org.eclipse.virgo.nano.services.ds/src/test/java/.gitignore b/nano/org.eclipse.virgo.nano.services.ds/src/test/java/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.services.ds/src/test/java/.gitignore
diff --git a/nano/org.eclipse.virgo.nano.services.ds/template.mf b/nano/org.eclipse.virgo.nano.services.ds/template.mf
new file mode 100644
index 0000000..ac2d678
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.services.ds/template.mf
@@ -0,0 +1,13 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Virgo Services DS Support
+Bundle-SymbolicName: org.eclipse.virgo.nano.services.ds
+Bundle-Version: ${version}
+Service-Component: OSGI-INF/org.eclipse.virgo.nano.services.ds.xml
+Excluded-Exports: 
+ *.internal.*
+Import-Template: 
+ org.eclipse.virgo.medic.*;version="${version:[=.=.=, =.+1)}";resolution:=optional,
+ org.osgi.service.component;version="0",
+ org.osgi.framework;version="0",
+ org.apache.felix.scr;version="0"
diff --git a/nano/org.eclipse.virgo.nano.shutdown/src/main/java/org/eclipse/virgo/nano/shutdown/KernelAuthenticationConfiguration.java b/nano/org.eclipse.virgo.nano.shutdown/src/main/java/org/eclipse/virgo/nano/shutdown/KernelAuthenticationConfiguration.java
new file mode 100644
index 0000000..2c66ec7
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.shutdown/src/main/java/org/eclipse/virgo/nano/shutdown/KernelAuthenticationConfiguration.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * This file is part of the Virgo Web Server.
+ *
+ * Copyright (c) 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    SpringSource, a division of VMware - initial API and implementation and/or initial documentation
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.shutdown;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.util.Properties;
+
+/**
+ * {@link KernelAuthenticationConfiguration} encapsulates reading the kernel user properties from the file with path in
+ * the system property named by constant FILE_LOCATION.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread safe.
+ * 
+ */
+final class KernelAuthenticationConfiguration {
+
+    public static final String FILE_LOCATION_PROPERTY = "org.eclipse.virgo.kernel.authentication.file";
+
+    public static final String DEFAULT_USERNAME = "admin";
+
+    public static final String DEFAULT_PASSWORD = "springsource";
+
+    private static final String USER_PREFIX = "user.";
+
+    private static final String ADMIN_ROLE = "role.admin";
+
+    private final String password;
+
+    private final String userName;
+
+    public KernelAuthenticationConfiguration() {
+        this(getProperties(FILE_LOCATION_PROPERTY));
+    }
+
+    KernelAuthenticationConfiguration(Properties props) {
+        String userName = DEFAULT_USERNAME;
+        String password = DEFAULT_PASSWORD;
+
+        if (props != null) {
+            String adminUserName = props.getProperty(ADMIN_ROLE);
+            if (adminUserName != null) {
+                String adminPassword = props.getProperty(USER_PREFIX + adminUserName);
+                if (adminPassword != null) {
+                    userName = adminUserName;
+                    password = adminPassword;
+                }
+            }
+        }
+
+        this.userName = userName;
+        this.password = password;
+    }
+
+    String getPassword() {
+        return password;
+    }
+
+    String getUserName() {
+        return userName;
+    }
+
+    private static Properties getProperties(String fileLocationProperty) {
+        String fileLocation = System.getProperty(fileLocationProperty);
+        if (fileLocation == null) {
+            return null;
+        }
+
+        try (Reader reader = new InputStreamReader(new FileInputStream(fileLocation), UTF_8)) {
+            Properties properties = new Properties();
+            properties.load(reader);
+            return properties;
+        } catch (IOException e) {
+            return null;
+        }
+    }
+
+}
diff --git a/nano/org.eclipse.virgo.nano.shutdown/src/main/java/org/eclipse/virgo/nano/shutdown/ShutdownClient.java b/nano/org.eclipse.virgo.nano.shutdown/src/main/java/org/eclipse/virgo/nano/shutdown/ShutdownClient.java
new file mode 100644
index 0000000..ab4680a
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.shutdown/src/main/java/org/eclipse/virgo/nano/shutdown/ShutdownClient.java
@@ -0,0 +1,135 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.shutdown;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+import javax.management.MBeanServerConnection;
+import javax.management.ObjectName;
+import javax.management.remote.JMXConnector;
+import javax.management.remote.JMXConnectorFactory;
+import javax.management.remote.JMXServiceURL;
+import javax.naming.ServiceUnavailableException;
+
+/**
+ * A stand-alone client for shutdown of the kernel.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong> <br />
+ * Thread-safe.
+ * 
+ */
+public class ShutdownClient {
+
+    private static final String OPERATION_IMMEDIATE_SHUTDOWN = "immediateShutdown";
+
+    private static final String OPERATION_SHUTDOWN = "shutdown";
+
+    private static final String PROPERTY_JMX_REMOTE_CREDENTIALS = "jmx.remote.credentials";
+
+    private static final String JMX_SERVICE_URL_TEMPLATE = "service:jmx:rmi:///jndi/rmi://127.0.0.1:%d/jmxrmi";
+
+    public static void main(String[] args) {
+        new ShutdownClient().performShutdown(args);
+    }
+
+    final void performShutdown(String... args) {
+        ShutdownCommand command = ShutdownCommandParser.parse(args);
+
+        if (command != null) {
+            doShutdown(command);
+        } else {
+            displayUsageAndExit();
+        }
+    }
+
+    protected final void doShutdown(ShutdownCommand command) {
+        try {
+            JMXServiceURL jmxServiceURL = new JMXServiceURL(String.format(JMX_SERVICE_URL_TEMPLATE, command.getPort()));
+
+            Map<String, Object> jmxEnvironment = new HashMap<String, Object>();
+
+            setRemoteCredentials(command, jmxEnvironment);
+
+            JMXConnector connector = JMXConnectorFactory.connect(jmxServiceURL, jmxEnvironment);
+            MBeanServerConnection connection = connector.getMBeanServerConnection();
+
+            ObjectName shutdownMBeanName = new ObjectName(command.getDomain(), "type", "Shutdown");
+
+            if (command.isImmediate()) {
+                connection.invoke(shutdownMBeanName, OPERATION_IMMEDIATE_SHUTDOWN, null, null);
+            } else {
+                connection.invoke(shutdownMBeanName, OPERATION_SHUTDOWN, null, null);
+            }
+
+            connector.close();
+        } catch (IOException ioe) {
+            Throwable cause = ioe.getCause();
+            if (cause instanceof ServiceUnavailableException) {
+                reportServerUnreachable();
+            } else {
+                reportShutdownFailure(ioe);
+            }
+        } catch (Exception e) {
+            reportShutdownFailure(e);
+        }
+    }
+
+    private void setRemoteCredentials(ShutdownCommand command, Map<String, Object> jmxEnvironment) {
+        KernelAuthenticationConfiguration kac = null;
+
+        String userName = command.getUsername();
+        if (userName == null) {
+            kac = new KernelAuthenticationConfiguration();
+            userName = kac.getUserName();
+        }
+
+        String password = command.getPassword();
+        if (password == null) {
+            if (kac == null) {
+                kac = new KernelAuthenticationConfiguration();
+            }
+            password = kac.getPassword();
+        }
+
+        jmxEnvironment.put(PROPERTY_JMX_REMOTE_CREDENTIALS, new String[] { userName, password });
+    }
+
+    protected void reportServerUnreachable() {
+        System.out.println("The Server could not be reached, it may already be stopped.");
+    }
+
+    protected void reportShutdownFailure(Exception failure) {
+        failure.printStackTrace();
+    }
+
+    private void displayUsageAndExit() {
+        System.out.println("Usage: shutdown [-options]");
+        System.out.println("Available options:");
+        System.out.println("    -jmxport nnnn     Specifies the management port of the kernel");
+        System.out.println("                      instance which is to be shutdown.");
+        System.out.println("    -immediate        Specifies that the kernel should be shutdown");
+        System.out.println("                      immediately.");
+        System.out.println("    -username         Specifies the username to use for the");
+        System.out.println("                      connection to the kernel.");
+        System.out.println("    -password         Specifies the password to use for the");
+        System.out.println("                      connection to the kernel.");
+        System.out.println("    -domain           Specifies the JMX management domain for the");
+        System.out.println("                      kernel.");
+        exit();
+    }
+
+    protected void exit() {
+        System.exit(1);
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.shutdown/src/main/java/org/eclipse/virgo/nano/shutdown/ShutdownCommand.java b/nano/org.eclipse.virgo.nano.shutdown/src/main/java/org/eclipse/virgo/nano/shutdown/ShutdownCommand.java
new file mode 100644
index 0000000..eb8a170
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.shutdown/src/main/java/org/eclipse/virgo/nano/shutdown/ShutdownCommand.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.shutdown;
+
+/**
+ * A <code>ShutdownCommand</code> is created by a {@link ShutdownCommandParser} to encapsulate
+ * the parsed shutdown configuration.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong> <br />
+ * <strong>Not</strong> thread-safe.
+ * 
+ */
+final class ShutdownCommand {
+	
+    private static final String DEFAULT_DOMAIN = "org.eclipse.virgo.kernel";
+
+    private static final int DEFAULT_PORT = 9875;
+    
+    private String password;
+    
+    private String username;
+    
+    private String domain = DEFAULT_DOMAIN;
+    
+    private int port = DEFAULT_PORT;
+    
+    private boolean immediate = false;
+
+	String getPassword() {
+		return password;
+	}
+
+	void setPassword(String password) {
+		this.password = password;
+	}
+
+	String getUsername() {
+		return username;
+	}
+
+	void setUsername(String username) {
+		this.username = username;
+	}
+
+	String getDomain() {
+		return domain;
+	}
+
+	void setDomain(String domain) {
+		this.domain = domain;
+	}
+
+	int getPort() {
+		return port;
+	}
+
+	void setPort(int port) {
+		this.port = port;
+	}
+
+	boolean isImmediate() {
+		return immediate;
+	}
+
+	void setImmediate(boolean immediate) {
+		this.immediate = immediate;
+	}
+}
diff --git a/nano/org.eclipse.virgo.nano.shutdown/src/main/java/org/eclipse/virgo/nano/shutdown/ShutdownCommandParser.java b/nano/org.eclipse.virgo.nano.shutdown/src/main/java/org/eclipse/virgo/nano/shutdown/ShutdownCommandParser.java
new file mode 100644
index 0000000..27ba37c
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.shutdown/src/main/java/org/eclipse/virgo/nano/shutdown/ShutdownCommandParser.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.shutdown;
+
+/**
+ * A <code>ShutdownCommandParser</code> is used to parse a series of arguments
+ * into a {@link ShutdownCommand}.
+ *
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong> <br />
+ * Thread-safe.
+ * 
+ */
+final class ShutdownCommandParser {
+	
+    private static final String OPTION_DOMAIN = "-domain";
+
+    private static final String OPTION_IMMEDIATE = "-immediate";
+
+    private static final String OPTION_JMXPORT = "-jmxport";
+
+    private static final String OPTION_PASSWORD = "-password";
+
+    private static final String OPTION_USERNAME = "-username";
+	
+	static ShutdownCommand parse(String... args) {
+		
+		ShutdownCommand command = new ShutdownCommand();
+		
+		if (args.length > 0) {
+            for (int i = 0; i < args.length; i++) {
+                if (args[i].equals(OPTION_USERNAME)) {
+                    if (i < args.length - 1) {
+                        command.setUsername(args[++i]);
+                    } else {
+                        return null;
+                    }
+                } else if (args[i].equals(OPTION_PASSWORD)) {
+                    if (i < args.length - 1) {
+                        command.setPassword(args[++i]);
+                    } else {
+                        return null;
+                    }
+                } else if (args[i].equals(OPTION_JMXPORT)) {
+                    if (i < args.length - 1) {
+                        try {
+                            command.setPort(Integer.parseInt(args[++i]));
+                        } catch (NumberFormatException nfe) {
+                            return null;
+                        }
+                    } else {
+                        return null;
+                    }
+                } else if (args[i].equals(OPTION_IMMEDIATE)) {
+                    command.setImmediate(true);
+                } else if (args[i].equals(OPTION_DOMAIN)) {
+                    if (i < args.length - 1) {
+                        command.setDomain(args[++i]);
+                    } else {
+                        return null;
+                    }
+                } else {
+                    return null;
+                }
+            }
+        }
+		
+		return command;
+	}
+}
diff --git a/nano/org.eclipse.virgo.nano.shutdown/src/main/resources/.gitignore b/nano/org.eclipse.virgo.nano.shutdown/src/main/resources/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.shutdown/src/main/resources/.gitignore
diff --git a/nano/org.eclipse.virgo.nano.shutdown/src/main/resources/about.html b/nano/org.eclipse.virgo.nano.shutdown/src/main/resources/about.html
new file mode 100644
index 0000000..c258ef5
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.shutdown/src/main/resources/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>June 5, 2006</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/nano/org.eclipse.virgo.nano.shutdown/src/test/java/org/eclipse/virgo/nano/shutdown/KernelAuthenticationConfigurationTests.java b/nano/org.eclipse.virgo.nano.shutdown/src/test/java/org/eclipse/virgo/nano/shutdown/KernelAuthenticationConfigurationTests.java
new file mode 100644
index 0000000..fae9442
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.shutdown/src/test/java/org/eclipse/virgo/nano/shutdown/KernelAuthenticationConfigurationTests.java
@@ -0,0 +1,134 @@
+/*******************************************************************************
+ * This file is part of the Virgo Web Server.
+ *
+ * Copyright (c) 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    SpringSource, a division of VMware - initial API and implementation and/or initial documentation
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.shutdown;
+
+import java.util.Properties;
+
+import junit.framework.Assert;
+
+import org.eclipse.virgo.nano.shutdown.KernelAuthenticationConfiguration;
+import org.junit.Test;
+
+public class KernelAuthenticationConfigurationTests {
+
+    @Test
+    public void testSystemProperty() {
+        try {
+            System.setProperty(KernelAuthenticationConfiguration.FILE_LOCATION_PROPERTY, "src/test/resources/test.users.properties");
+            KernelAuthenticationConfiguration kac = new KernelAuthenticationConfiguration();
+
+            Assert.assertEquals("testuser", kac.getUserName());
+            Assert.assertEquals("testpw", kac.getPassword());
+        } finally {
+            System.clearProperty(KernelAuthenticationConfiguration.FILE_LOCATION_PROPERTY);
+        }
+    }
+
+    @Test
+    public void testBadFile() {
+        try {
+            System.setProperty(KernelAuthenticationConfiguration.FILE_LOCATION_PROPERTY, "src/test/resources/users.nosuch.properties");
+            KernelAuthenticationConfiguration kac = new KernelAuthenticationConfiguration();
+            assertDefaults(kac);
+        } finally {
+            System.clearProperty(KernelAuthenticationConfiguration.FILE_LOCATION_PROPERTY);
+        }
+    }
+
+    private void assertDefaults(KernelAuthenticationConfiguration kac) {
+        Assert.assertEquals(KernelAuthenticationConfiguration.DEFAULT_USERNAME, kac.getUserName());
+        Assert.assertEquals(KernelAuthenticationConfiguration.DEFAULT_PASSWORD, kac.getPassword());
+    }
+
+    @Test
+    public void testMissingProperty() {
+        KernelAuthenticationConfiguration kac = new KernelAuthenticationConfiguration();
+        assertDefaults(kac);
+    }
+    
+    @Test
+    public void testMissingProperties() {
+        KernelAuthenticationConfiguration kac = new KernelAuthenticationConfiguration(null);
+        assertDefaults(kac);
+    }
+
+    @Test
+    public void testValidProperties() {
+        Properties props = new Properties();
+        props.put("user.u", "p");
+        props.put("role.admin", "u");
+        KernelAuthenticationConfiguration kac = new KernelAuthenticationConfiguration(props);
+        Assert.assertEquals("u", kac.getUserName());
+        Assert.assertEquals("p", kac.getPassword());
+    }
+    
+    @Test
+    public void testMissingRole() {
+        Properties props = new Properties();
+        props.put("user.u", "p");
+        KernelAuthenticationConfiguration kac = new KernelAuthenticationConfiguration(props);
+        assertDefaults(kac);
+    }
+
+    @Test
+    public void testMissingAdmin() {
+        Properties props = new Properties();
+        props.put("user.u", "p");
+        props.put("role.admin", "v");
+        KernelAuthenticationConfiguration kac = new KernelAuthenticationConfiguration(props);
+        assertDefaults(kac);
+    }
+
+    @Test
+    public void testEmptyUsername() {
+        Properties props = new Properties();
+        props.put("user.", "pw");
+        props.put("role.admin", "");
+        KernelAuthenticationConfiguration kac = new KernelAuthenticationConfiguration(props);
+        Assert.assertEquals("", kac.getUserName());
+        Assert.assertEquals("pw", kac.getPassword());
+
+    }
+    
+    @Test
+    public void testEmptyPassword() {
+        Properties props = new Properties();
+        props.put("user.u", "");
+        props.put("role.admin", "u");
+        KernelAuthenticationConfiguration kac = new KernelAuthenticationConfiguration(props);
+        Assert.assertEquals("u", kac.getUserName());
+        Assert.assertEquals("", kac.getPassword());
+    }
+    
+    @Test
+    public void testNonStringKey() {
+        Properties props = new Properties();
+        props.put(new Object(), "");
+        props.put("user." + KernelAuthenticationConfiguration.DEFAULT_USERNAME, KernelAuthenticationConfiguration.DEFAULT_PASSWORD);
+        props.put("role.admin", KernelAuthenticationConfiguration.DEFAULT_USERNAME);
+        KernelAuthenticationConfiguration kac = new KernelAuthenticationConfiguration(props);
+        assertDefaults(kac);
+    }
+    
+    @Test
+    public void testNonStringValue() {
+        Properties props = new Properties();
+        props.put("user.u", new Object());
+        KernelAuthenticationConfiguration kac = new KernelAuthenticationConfiguration(props);
+        assertDefaults(kac);
+    }
+
+    
+    
+}
diff --git a/nano/org.eclipse.virgo.nano.shutdown/src/test/java/org/eclipse/virgo/nano/shutdown/Shutdown.java b/nano/org.eclipse.virgo.nano.shutdown/src/test/java/org/eclipse/virgo/nano/shutdown/Shutdown.java
new file mode 100644
index 0000000..cd72082
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.shutdown/src/test/java/org/eclipse/virgo/nano/shutdown/Shutdown.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.shutdown;
+
+import javax.management.MXBean;
+
+@MXBean
+public interface Shutdown {
+	
+	void shutdown();
+	
+	void immediateShutdown();
+}
diff --git a/nano/org.eclipse.virgo.nano.shutdown/src/test/java/org/eclipse/virgo/nano/shutdown/ShutdownClientTests.java b/nano/org.eclipse.virgo.nano.shutdown/src/test/java/org/eclipse/virgo/nano/shutdown/ShutdownClientTests.java
new file mode 100644
index 0000000..5041580
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.shutdown/src/test/java/org/eclipse/virgo/nano/shutdown/ShutdownClientTests.java
@@ -0,0 +1,301 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.shutdown;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.io.Serializable;
+import java.lang.management.ManagementFactory;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.rmi.RemoteException;
+import java.rmi.registry.LocateRegistry;
+import java.rmi.server.RMIClientSocketFactory;
+import java.rmi.server.RMIServerSocketFactory;
+import java.security.Permission;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.management.MBeanServer;
+import javax.management.ObjectInstance;
+import javax.management.ObjectName;
+import javax.management.remote.JMXConnectorServer;
+import javax.management.remote.JMXConnectorServerFactory;
+import javax.management.remote.JMXServiceURL;
+import javax.management.remote.rmi.RMIConnectorServer;
+
+import org.eclipse.virgo.nano.shutdown.ShutdownClient;
+import org.eclipse.virgo.nano.shutdown.ShutdownCommand;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class ShutdownClientTests {
+
+    private static SecurityManager securityManager = System.getSecurityManager();
+
+    @BeforeClass
+    public static void installSecurityManager() {
+        System.setSecurityManager(new UnitTestSecurityManager());
+    }
+
+    @AfterClass
+    public static void reinstateSecurityManager() {
+        System.setSecurityManager(securityManager);
+    }
+
+    @Test(expected = RuntimeException.class)
+    public void malformedCommandCausesExit() {
+        UnitTestShutdownClient client = new UnitTestShutdownClient();
+        client.performShutdown("-alpha");
+    }
+
+    @Test
+    public void unreachableMBeanServerReportsServerUnreachable() throws Exception {
+        UnitTestShutdownClient client = new UnitTestShutdownClient();
+
+        ShutdownCommand command = new ShutdownCommand();
+        command.setPort(14); // privileged unassigned port - should never be open
+
+        client.doShutdown(command);
+
+        assertTrue(client.serverUnreachable);
+        assertFalse(client.exited);
+        assertFalse(client.shutdownFailureReported);
+    }
+
+    @Test
+    public void missingShutdownMBeanReportsShutdownFailure() throws Exception {
+        UnitTestShutdownClient client = new UnitTestShutdownClient();
+
+        ShutdownCommand command = new ShutdownCommand();
+
+        JMXConnectorServer server = bootstrapMBeanServer(9875);
+
+        try {
+            client.doShutdown(command);
+
+            assertFalse(client.serverUnreachable);
+            assertFalse(client.exited);
+            assertTrue(client.shutdownFailureReported);
+        } finally {
+            server.stop();
+        }
+    }
+
+    @Test
+    public void immediateShutdownInvokesImmediateShutdownOperation() throws Exception {
+        UnitTestShutdownClient client = new UnitTestShutdownClient();
+
+        ShutdownCommand command = new ShutdownCommand();
+        command.setImmediate(true);
+
+        JMXConnectorServer server = bootstrapMBeanServer(9875);
+
+        UnitTestShutdown shutdown = new UnitTestShutdown();
+
+        ObjectInstance shutdownMBean = registerShutdownMBean(shutdown, "org.eclipse.virgo.kernel");
+
+        try {
+            client.doShutdown(command);
+
+            assertFalse(client.serverUnreachable);
+            assertFalse(client.exited);
+            assertFalse(client.shutdownFailureReported);
+
+            assertTrue(shutdown.immediateShutdown);
+            assertFalse(shutdown.shutdown);
+        } finally {
+            server.stop();
+            ManagementFactory.getPlatformMBeanServer().unregisterMBean(shutdownMBean.getObjectName());
+        }
+    }
+
+    @Test
+    public void shutdownInvokesShutdownOperation() throws Exception {
+        UnitTestShutdownClient client = new UnitTestShutdownClient();
+
+        ShutdownCommand command = new ShutdownCommand();
+
+        JMXConnectorServer server = bootstrapMBeanServer(9875);
+
+        UnitTestShutdown shutdown = new UnitTestShutdown();
+
+        ObjectInstance shutdownMBean = registerShutdownMBean(shutdown, "org.eclipse.virgo.kernel");
+
+        try {
+            client.doShutdown(command);
+
+            assertFalse(client.serverUnreachable);
+            assertFalse(client.exited);
+            assertFalse(client.shutdownFailureReported);
+
+            assertFalse(shutdown.immediateShutdown);
+            assertTrue(shutdown.shutdown);
+        } finally {
+            server.stop();
+            ManagementFactory.getPlatformMBeanServer().unregisterMBean(shutdownMBean.getObjectName());
+        }
+    }
+
+    @Test
+    public void clientUsesDomainSpecifiedInCommand() throws Exception {
+        UnitTestShutdownClient client = new UnitTestShutdownClient();
+
+        ShutdownCommand command = new ShutdownCommand();
+        command.setDomain("the.domain");
+
+        JMXConnectorServer server = bootstrapMBeanServer(9875);
+
+        UnitTestShutdown shutdown = new UnitTestShutdown();
+
+        ObjectInstance shutdownMBean = registerShutdownMBean(shutdown, "the.domain");
+
+        try {
+            client.doShutdown(command);
+
+            assertFalse(client.serverUnreachable);
+            assertFalse(client.exited);
+            assertFalse(client.shutdownFailureReported);
+        } finally {
+            server.stop();
+            ManagementFactory.getPlatformMBeanServer().unregisterMBean(shutdownMBean.getObjectName());
+        }
+    }
+
+    @Test
+    public void clientUsesPortSpecifiedInCommand() throws Exception {
+
+        ShutdownCommand command = new ShutdownCommand();
+        command.setPort(9999);
+
+        UnitTestShutdown shutdown = new UnitTestShutdown();
+
+        ObjectInstance shutdownMBean = registerShutdownMBean(shutdown, "the.domain");
+
+        UnitTestShutdownClient client = new UnitTestShutdownClient();
+
+        JMXConnectorServer server = bootstrapMBeanServer(9999);
+
+        try {
+            assertFalse(client.serverUnreachable);
+            assertFalse(client.exited);
+            assertFalse(client.shutdownFailureReported);
+        } finally {
+            server.stop();
+            ManagementFactory.getPlatformMBeanServer().unregisterMBean(shutdownMBean.getObjectName());
+        }
+    }
+
+    private JMXConnectorServer bootstrapMBeanServer(int port) throws Exception {
+
+        createRegistry(port);
+
+        MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
+
+        Map<String, Object> env = new HashMap<String, Object>();
+
+        env.put(RMIConnectorServer.RMI_CLIENT_SOCKET_FACTORY_ATTRIBUTE, new UnitTestClientSocketFactory());
+
+        env.put(RMIConnectorServer.RMI_SERVER_SOCKET_FACTORY_ATTRIBUTE, new UnitTestServerSocketFactory());
+
+        JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://:" + port + "/jmxrmi");
+        JMXConnectorServer server = JMXConnectorServerFactory.newJMXConnectorServer(url, env, mbs);
+        server.start();
+
+        return server;
+    }
+
+    private void createRegistry(int port) {
+        try {
+            LocateRegistry.createRegistry(port);
+        } catch (RemoteException ignored) {
+        }
+    }
+
+    private static final class UnitTestClientSocketFactory implements RMIClientSocketFactory, Serializable {
+
+        private static final long serialVersionUID = 4445230934659082311L;
+
+        public Socket createSocket(String host, int port) throws IOException {
+            return new Socket(host, port);
+        }
+    }
+
+    private static final class UnitTestServerSocketFactory implements RMIServerSocketFactory, Serializable {
+
+        private static final long serialVersionUID = 5261406192116261111L;
+
+        public ServerSocket createServerSocket(int port) throws IOException {
+            return new ServerSocket(port);
+        }
+    }
+
+    private ObjectInstance registerShutdownMBean(Shutdown shutdown, String domain) throws Exception {
+        MBeanServer server = ManagementFactory.getPlatformMBeanServer();
+        return server.registerMBean(shutdown, new ObjectName(domain + ":type=Shutdown"));
+    }
+
+    private final class UnitTestShutdownClient extends ShutdownClient {
+
+        private boolean serverUnreachable = false;
+
+        private boolean exited = false;
+
+        private boolean shutdownFailureReported = false;
+
+        @Override
+        protected void exit() {
+            throw new RuntimeException();
+        }
+
+        @Override
+        protected void reportServerUnreachable() {
+            super.reportServerUnreachable();
+            this.serverUnreachable = true;
+        }
+
+        @Override
+        protected void reportShutdownFailure(Exception failure) {
+            super.reportShutdownFailure(failure);
+            this.shutdownFailureReported = true;
+        }
+    }
+
+    private static final class UnitTestShutdown implements Shutdown {
+
+        private boolean immediateShutdown;
+
+        private boolean shutdown;
+
+        public void immediateShutdown() {
+            this.immediateShutdown = true;
+        }
+
+        public void shutdown() {
+            this.shutdown = true;
+        }
+    }
+
+    private static final class UnitTestSecurityManager extends SecurityManager {
+
+        @Override
+        public void checkPermission(Permission perm, Object context) {
+        }
+
+        @Override
+        public void checkPermission(Permission perm) {
+        }
+    }
+}
diff --git a/nano/org.eclipse.virgo.nano.shutdown/src/test/java/org/eclipse/virgo/nano/shutdown/ShutdownCommandParserTests.java b/nano/org.eclipse.virgo.nano.shutdown/src/test/java/org/eclipse/virgo/nano/shutdown/ShutdownCommandParserTests.java
new file mode 100644
index 0000000..d0c68df
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.shutdown/src/test/java/org/eclipse/virgo/nano/shutdown/ShutdownCommandParserTests.java
@@ -0,0 +1,107 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.shutdown;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import org.eclipse.virgo.nano.shutdown.ShutdownCommand;
+import org.eclipse.virgo.nano.shutdown.ShutdownCommandParser;
+import org.junit.Test;
+
+public class ShutdownCommandParserTests {
+	
+	@Test
+	public void nullReturnedForUnrecognisedArgument() {
+		assertNull(ShutdownCommandParser.parse("-foo"));
+	}
+	
+	@Test
+	public void nullReturnedForMissingUsername() {
+		assertNull(ShutdownCommandParser.parse("-username"));
+	}
+	
+	@Test
+	public void nullReturnedForMissingPassword() {
+		assertNull(ShutdownCommandParser.parse("-password"));
+	}
+	
+	@Test
+	public void nullReturnedForJmxPort() {
+		assertNull(ShutdownCommandParser.parse("-jmxport"));
+	}
+	
+	@Test
+	public void nullReturnedForMissingDomain() {
+		assertNull(ShutdownCommandParser.parse("-domain"));
+	}
+	
+	@Test 
+	public void nullReturnedForNonIntegerPort() {
+		assertNull(ShutdownCommandParser.parse("-jmxport", "1alpha345"));
+	}
+	
+	@Test
+	public void defaultValuesWhenNoOptionsAreSpecified() {
+		ShutdownCommand command = ShutdownCommandParser.parse();
+		assertNotNull(command);
+		
+		assertEquals("org.eclipse.virgo.kernel", command.getDomain());
+		assertNull(command.getPassword());
+		assertEquals(9875, command.getPort());
+		assertNull(command.getUsername());
+		assertFalse(command.isImmediate());
+	}
+	
+	@Test
+	public void specificUsername() {
+		ShutdownCommand command = ShutdownCommandParser.parse("-username", "user");
+		assertNotNull(command);
+		
+		assertEquals("user", command.getUsername());
+	}
+	
+	@Test
+	public void specificPassword() {
+		ShutdownCommand command = ShutdownCommandParser.parse("-password", "secret");
+		assertNotNull(command);
+		
+		assertEquals("secret", command.getPassword());
+	}
+	
+	@Test
+	public void specificDomain() {
+		ShutdownCommand command = ShutdownCommandParser.parse("-domain", "the.jmx.domain");
+		assertNotNull(command);
+		
+		assertEquals("the.jmx.domain", command.getDomain());
+	}
+	
+	@Test
+	public void specificPort() {
+		ShutdownCommand command = ShutdownCommandParser.parse("-jmxport", "1234");
+		assertNotNull(command);
+		
+		assertEquals(1234, command.getPort());
+	}
+	
+	@Test
+	public void immediate() {
+		ShutdownCommand command = ShutdownCommandParser.parse("-immediate");
+		assertNotNull(command);
+		
+		assertTrue(command.isImmediate());
+	}
+}
diff --git a/nano/org.eclipse.virgo.nano.shutdown/src/test/resources/test.users.properties b/nano/org.eclipse.virgo.nano.shutdown/src/test/resources/test.users.properties
new file mode 100644
index 0000000..754ee2b
--- /dev/null
+++ b/nano/org.eclipse.virgo.nano.shutdown/src/test/resources/test.users.properties
@@ -0,0 +1,10 @@
+##################
+# User definitions
+##################
+user.testuser=testpw
+
+
+##################
+# Role definitions
+##################
+role.admin=testuser
\ No newline at end of file
diff --git a/org.eclipse.virgo.site/build.gradle b/org.eclipse.virgo.site/build.gradle
new file mode 100644
index 0000000..f7b7f55
--- /dev/null
+++ b/org.eclipse.virgo.site/build.gradle
@@ -0,0 +1,644 @@
+import org.apache.tools.ant.filters.ReplaceTokens
+
+import static virgobuild.UpdateSitePlugin.CREATE_P2_REPOSITORY_TASK_NAME
+import static virgobuild.UpdateSitePlugin.PRE_NORMALIZED_BUNDLES_DIR_NAME
+import static virgobuild.VirgoToolsPlugin.installProduct
+import static virgobuild.VirgoToolsPlugin.publishProduct
+
+import virgobuild.Constants
+
+apply plugin: virgobuild.UpdateSitePlugin
+apply plugin: 'org.hidetake.ssh'
+
+buildscript {
+    repositories { jcenter() }
+    dependencies { classpath 'org.hidetake:gradle-ssh-plugin:1.1.2' }
+}
+
+updateSite {
+    extraResources = files('epl-v10.html', 'notice.html', 'p2.index')
+    hook { Project project ->
+        postProcessing(project)
+    }
+    signing { File unsignedFolder, File signedFolder ->
+        if (gradle.taskGraph.hasTask(uploadUpdateSite)) {
+            signByEclipseService(unsignedFolder, signedFolder)
+        } else {
+            signLocally(unsignedFolder, signedFolder)
+        }
+    }
+    mutateArtifactsXml { Node artifactsXml ->
+        addExtraPropertiesToArtifactsXml(artifactsXml)
+    }
+}
+
+remotes {
+    eclipseDotOrg {
+        host = ECLIPSE_ORG_FTP_HOST
+        user =  ECLIPSE_ORG_FTP_USER
+        password = ECLIPSE_ORG_FTP_PASSWORD
+        knownHosts = project.rootProject.file('gradle/ssh/known_hosts')
+    }
+}
+
+dependencies {
+    localPlugin project(':kernel:org.eclipse.virgo.kernel.agent.dm')
+    localPlugin project(':kernel:org.eclipse.virgo.kernel.artifact')
+    localPlugin project(':kernel:org.eclipse.virgo.kernel.deployer')
+    localPlugin project(':kernel:org.eclipse.virgo.kernel.deployer.dm')
+    localPlugin project(':kernel:org.eclipse.virgo.kernel.dmfragment')
+    localPlugin project(':kernel:org.eclipse.virgo.kernel.equinox.extensions')
+    localPlugin project(':kernel:org.eclipse.virgo.kernel.kerneldmfragment')
+    localPlugin project(':kernel:org.eclipse.virgo.kernel.model')
+    localPlugin project(':kernel:org.eclipse.virgo.kernel.osgi')
+    localPlugin project(':kernel:org.eclipse.virgo.kernel.services')
+    localPlugin project(':kernel:org.eclipse.virgo.kernel.userregion')
+    localPlugin project(':kernel:org.eclipse.virgo.kernel.userregionfactory')
+    localPlugin project(':kernel:org.eclipse.virgo.management.console')
+    localPlugin project(':kernel:org.eclipse.virgo.management.fragment')
+    localPlugin project(':kernel:org.eclipse.virgo.shell.command')
+
+    localPlugin project(':medic:org.eclipse.virgo.medic')
+    localPlugin project(':medic:org.eclipse.virgo.medic.core')
+    localPlugin project(':medic:org.eclipse.virgo.medic.logbackclassicfragment')
+    localPlugin project(':medic:org.eclipse.virgo.medic.logbackcorefragment')
+
+    localPlugin project(':nano:org.eclipse.virgo.nano.core')
+    localPlugin project(':nano:org.eclipse.virgo.nano.deployer')
+    localPlugin project(':nano:org.eclipse.virgo.nano.deployer.api')
+    localPlugin project(':nano:org.eclipse.virgo.nano.deployer.hot')
+    localPlugin project(':nano:org.eclipse.virgo.nano.management')
+    localPlugin project(':nano:org.eclipse.virgo.nano.management.controller')
+    localPlugin project(':nano:org.eclipse.virgo.nano.services.concurrent')
+    localPlugin project(':nano:org.eclipse.virgo.nano.services.ds')
+
+    localPlugin project(':repository:org.eclipse.virgo.repository')
+    // TODO - review if all those signedExternalPlugins are signed
+    signedExternalPlugin group: 'org.eclipse.virgo.mirrored', name: 'org.apache.commons.codec', version: commonsCodecVersion, ext: "jar"
+    // optional requirement for org.springframework.core
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.apache.commons.logging", version: commonsLoggingVersion, ext: "jar"
+
+    signedExternalPlugin group: 'org.eclipse.virgo.mirrored', name: 'oevm.org.apache.commons.httpclient', version: commonsHttpClientVersion, ext: "jar"
+
+    localPlugin project(':util:org.eclipse.virgo.util.common')
+    localPlugin project(':util:org.eclipse.virgo.util.env')
+    localPlugin project(':util:org.eclipse.virgo.util.io')
+    localPlugin project(':util:org.eclipse.virgo.util.jmx')
+    localPlugin project(':util:org.eclipse.virgo.util.math')
+    localPlugin project(':util:org.eclipse.virgo.util.osgi')
+    localPlugin project(':util:org.eclipse.virgo.util.osgi.manifest')
+    localPlugin project(':util:org.eclipse.virgo.util.parser.launcher')
+    localPlugin project(':util:org.eclipse.virgo.util.parser.manifest')
+
+    localPlugin project(':web:org.eclipse.virgo.web.core')
+    localPlugin project(':web:org.eclipse.virgo.web.dm')
+    localPlugin project(':web:org.eclipse.virgo.web.tomcat.support')
+    localPlugin project(':web:org.eclipse.virgo.web.enterprise.appdeployer')
+    localPlugin project(':web:org.eclipse.virgo.web.enterprise.applistener')
+    localPlugin project(':web:org.eclipse.virgo.web.enterprise.catalina.fragment.webbeans')
+    localPlugin project(':web:org.eclipse.virgo.web.enterprise.javax.persistence.extension')
+    localPlugin project(':web:org.eclipse.virgo.web.enterprise.javax.persistence.provider.initializer')
+    localPlugin project(':web:org.eclipse.virgo.web.enterprise.jsf.support')
+    localPlugin project(':web:org.eclipse.virgo.web.enterprise.openejb.fragment.bval')
+    localPlugin project(':web:org.eclipse.virgo.web.enterprise.openejb.fragment.jotm')
+    localPlugin project(':web:org.eclipse.virgo.web.enterprise.openejb.fragment.jpa')
+    localPlugin project(':web:org.eclipse.virgo.web.enterprise.openejb.fragment.webbeans')
+    localPlugin project(':web:org.eclipse.virgo.web.enterprise.openejb.initialiser')
+    localPlugin project(':web:org.eclipse.virgo.web.enterprise.openejb.jpa.integration')
+    localPlugin project(':web:org.eclipse.virgo.web.enterprise.openejb.tomcat.factory')
+    localPlugin project(':web:org.eclipse.virgo.web.enterprise.openwebbeans.initialiser')
+    localPlugin project(':web:org.eclipse.virgo.web.enterprise.persistence.openejb.classloading.hook')
+    localPlugin project(':web:org.eclipse.virgo.web.enterprise.security')
+    localPlugin project(':web:org.eclipse.virgo.web.enterprise.security.openejb.classloading.hook')
+    localPlugin project(':web:org.eclipse.virgo.web.enterprise.security.valve')
+    localPlugin project(':web:org.eclipse.virgo.web.enterprise.services.accessor')
+    localPlugin project(':web:org.eclipse.virgo.web.servlet.adapter')
+    localPlugin project(':web:org.eclipse.virgo.web.spring.integration')
+    localPlugin project(':web:org.eclipse.virgo.web.war.deployer')
+
+    // TODO - review if all those signedExternalPlugins are signed
+    signedExternalPlugin group: "org.slf4j", name: "slf4j-api", version: slf4jVersion
+    // exports package org.apache.commons.logging (jcl - Jakarta Commons Logging)
+    signedExternalPlugin group: "org.slf4j", name: "slf4j-jcl", version: slf4jVersion
+    signedExternalPlugin group: "org.slf4j", name: "slf4j-log4j12", version: slf4jVersion
+    signedExternalPlugin group: "org.slf4j", name: "jul-to-slf4j", version: slf4jVersion
+
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.aspectj.weaver", version: aspectjVersion, ext: "jar"
+
+    // TODO - rename feature to region'_'
+    localFeature project(':org.eclipse.virgo.site:org.eclipse.equinox.regions')
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.region", version: equinoxRegionVersion, configuration: "compile", ext: "jar"
+
+    localFeature project(':org.eclipse.virgo.site:org.eclipse.virgo.core')
+    localFeature project(':org.eclipse.virgo.site:org.eclipse.virgo.ds')
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi", version: equinoxVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi.services", version: osgiServicesVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.common", version: equinoxCommonVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.ds", version: equinoxDsVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.event", version: equinoxEventVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.util", version: equinoxUtilVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.cm", version: equinoxCmVersion, configuration: "compile", ext: "jar"
+
+    localFeature project(':org.eclipse.virgo.site:org.eclipse.virgo.kernel')
+
+    localFeature project(':org.eclipse.virgo.site:org.eclipse.equinox.http.jetty')
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.http.jetty", version: equinoxHttpJettyVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.http.servlet", version: equinoxHttpServletVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.jetty.continuation", version: jettyVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.jetty.http", version: jettyVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.jetty.io", version: jettyVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.jetty.security", version: jettyVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.jetty.server", version: jettyVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.jetty.servlet", version: jettyVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.jetty.util", version: jettyVersion, configuration: "compile", ext: "jar"
+
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "javax.servlet", version: javaxServletVersion, configuration: "runtime", ext: "jar"
+
+    localFeature project(':org.eclipse.virgo.site:org.eclipse.rap')
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.rap.rwt", version: rapRwtVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.rap.rwt.osgi", version: rapRwtOsgiVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.core.commands", version: eclipseCoreCommandsVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.rap.jface", version: rapJfaceVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "com.ibm.icu.base", version: icuBaseVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.core.databinding", version: eclipseCoreDatabindingVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.core.databinding.property", version: eclipseCoreDatabindingPropertyVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.core.databinding.observable", version: eclipseCoreDatabindingObservableVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.rap.jface.databinding", version: rapJfaceDatabindingVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.rap.ui", version: rapUiVersion, configuration: "compile", ext: "jar"
+
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "javax.servlet", version: javaxServletVersion, configuration: "runtime", ext: "jar"
+
+    localFeature project(':org.eclipse.virgo.site:org.eclipse.virgo.kernel.springintegration')
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.springframework.expression", version: springframeworkVersion, ext: "jar"
+
+    localFeature project(':org.eclipse.virgo.site:org.eclipse.virgo.management')
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "osgi.enterprise", version: osgiEnterpriseVersion, configuration: "compile", ext: "jar" // contains org.osgi.jmx
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.gemini.management", version: geminiManagementVersion, configuration: "compile", ext: "jar"
+
+    localFeature project(':org.eclipse.virgo.site:org.eclipse.virgo.medic')
+    signedExternalPlugin group: "ch.qos.logback", name: "logback-core", version: logbackVersion
+    signedExternalPlugin group: "ch.qos.logback", name: "logback-classic", version: logbackVersion
+
+    localFeature project(':org.eclipse.virgo.site:org.eclipse.virgo.nano.deployer')
+    localFeature project(':org.eclipse.virgo.site:org.eclipse.virgo.nano.mbeans')
+    localFeature project(':org.eclipse.virgo.site:org.eclipse.virgo.nano.mbeans.controller')
+
+    localFeature project(':org.eclipse.virgo.site:org.eclipse.virgo.shell')
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.console", version: equinoxConsoleVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.console.ssh", version: equinoxConsoleSshVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.apache.mina.core", version: minaCoreVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.apache.sshd.core", version: apacheSshdCoreVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.apache.felix.gogo.command", version: gogoCommandVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.apache.felix.gogo.runtime", version: gogoRuntimeVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.apache.felix.gogo.shell", version: gogoShellVersion, configuration: "compile", ext: "jar"
+
+    localFeature project(':org.eclipse.virgo.site:org.eclipse.virgo.simpleconfigurator')
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.simpleconfigurator", version: equinoxSimpleConfiguratorVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.simpleconfigurator.manipulator", version: equinoxSimpleConfiguratorManipulatorVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.frameworkadmin", version: equinoxFrameworkadminVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.frameworkadmin.equinox", version: equinoxFrameworkadminEquinoxVersion, configuration: "compile", ext: "jar"
+
+    // TODO - rename feature to org.eclipse.gemini.blueprint
+    localFeature project(':org.eclipse.virgo.site:org.eclipse.virgo.springdm')
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "oevm.org.aopalliance", version: orgAopAllianceVersion, ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.springframework.aop", version: springframeworkVersion, ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.springframework.beans", version: springframeworkVersion, ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.springframework.context", version: springframeworkVersion, ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.springframework.core", version: springframeworkVersion, ext: "jar"
+    signedExternalPlugin group: "org.eclipse.gemini.blueprint", name: "gemini-blueprint-io", version: geminiBlueprintVersion, ext: "jar"
+    signedExternalPlugin group: "org.eclipse.gemini.blueprint", name: "gemini-blueprint-core", version: geminiBlueprintVersion, ext: "jar"
+    signedExternalPlugin group: "org.eclipse.gemini.blueprint", name: "gemini-blueprint-extender", version: geminiBlueprintVersion, ext: "jar"
+
+    // nano base
+    // TODO - merge to oev.nano.services ?
+    localFeature project(':org.eclipse.virgo.site:org.eclipse.virgo.services.concurrent')
+    localFeature project(':org.eclipse.virgo.site:org.eclipse.virgo.services.ds')
+
+    // TODO - merge with management features above?
+    localFeature project(':org.eclipse.virgo.site:org.eclipse.virgo.webconsole.deps')
+
+    signedExternalPlugin group: "commons-fileupload", name: "commons-fileupload", version: commonsFileuploadVersion, ext: "jar"
+    signedExternalPlugin group: "commons-io", name: "commons-io", version: commonsIoVersion, ext: "jar"
+    signedExternalPlugin group: "org.jolokia", name: "jolokia-osgi", version: jolokiaVersion, ext: "jar"
+
+    // nano full
+    localFeature project(':org.eclipse.virgo.site:org.eclipse.virgo.p2.provisioning')
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.core.contenttype", version: eclipseCoreContenttypeVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.core.jobs", version: eclipseCoreJobsVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.core.net", version: eclipseCoreNetVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.core.runtime", version: eclipseCoreRuntimeVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.ecf", version: eclipseEcfVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.ecf.filetransfer", version: eclipseEcfFiletransferVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.ecf.identity", version: eclipseEcfIdentityVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.ecf.provider.filetransfer", version: eclipseEcfProviderFiletransferVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.ecf.ssl", version: eclipseEcfSslVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.app", version: equinoxAppVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.preferences", version: equinoxPreferencesVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.registry", version: equinoxRegistryVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.security", version: equinoxSecurityVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.sat4j.core", version: sat4jCoreVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.sat4j.pb", version: sat4jPbVersion, configuration: "compile", ext: "jar"
+
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.p2.artifact.repository", version: p2ArtifactRepositoryVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.p2.console", version: p2ConsoleVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.p2.core", version: p2CoreVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.p2.director", version: p2DirectorVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.p2.engine", version: p2EngineVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.p2.garbagecollector", version: p2GarbageCollectorVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.p2.jarprocessor", version: p2JarProcessorVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.p2.metadata", version: p2MetadataVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.p2.metadata.repository", version: p2MetadataRepositoryVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.p2.publisher", version: p2PublisherVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.p2.publisher.eclipse", version: p2PublisherEclipseVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.p2.repository", version: p2RepositoryVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.p2.touchpoint.eclipse", version: p2TouchpointEclipseVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.p2.touchpoint.natives", version: p2TouchpointNativesVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.p2.transport.ecf", version: p2TransportEcfVersion, configuration: "compile", ext: "jar"
+
+    localFeature project(':org.eclipse.virgo.site:org.eclipse.virgo.nano.war.deployer')
+    localFeature project(':org.eclipse.virgo.site:org.eclipse.virgo.enterprise')
+    localFeature project(':org.eclipse.virgo.site:org.eclipse.gemini.web')
+    signedExternalPlugin group: "org.eclipse.gemini", name: "org.eclipse.gemini.web.core", version: geminiWebVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.gemini", name: "org.eclipse.gemini.web.extender", version: geminiWebVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.gemini", name: "org.eclipse.gemini.web.tomcat", version: geminiWebVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.gemini", name: "org.eclipse.gemini.web.jaspic.fragment", version: geminiWebVersion, configuration: "compile", ext: "jar"
+
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.apache.log4j", version: apacheLog4jVersion, configuration: "compile", ext: "jar"
+
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.objectweb.asm", version: objectwebAsmVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "javassist", version: javassistVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "scannotation", version: scannotationVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.apache.bval", version: apacheBvalVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.quartz", version: quartzVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.ow2.jotm.jotm-core", version: jotmVersion, configuration: "compile", ext: "jar"
+
+    signedExternalPlugin group: "javax.interceptor", name: "javax.interceptor-api", version: javaxInterceptorVersion
+    signedExternalPlugin group: "javax.transaction", name: "javax.transaction-api", version: javaxTransactionVersion
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "javax.annotation", version: javaxAnnotationVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "javax.ejb", version: javaxEjbVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "javax.inject", version: javaxInjectVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "javax.jms", version: javaxJmsVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "javax.persistence", version: javaxPersistenceVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "javax.resource", version: javaxResourceVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "javax.security.auth.message", version: javaxSecurityAuthMessageVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "javax.security.jacc", version: javaxSecurityJaccVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "javax.servlet.jsp.jstl", name: "javax.servlet.jsp.jstl-api", version: javaxServletJspJstlApiVersion
+    signedExternalPlugin group: "org.glassfish.web", name: "javax.servlet.jsp.jstl", version: javaxServletJspJstlImplVersion
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "javax.validation", version: javaxValidationVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "javax.wsdl", version: javaxWsdlVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "javax.ws.rs", version: javaxWsRsVersion, configuration: "compile", ext: "jar"
+
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.glassfish.javax.faces", version: glassfishJavaxFacesVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.glassfish.com.sun.faces", version: glassfishComSunFacesVersion, configuration: "compile", ext: "jar"
+
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.apache.geronimo.components.connector", version: geronimoComponentsConnectorVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.apache.geronimo.components.transaction", version: geronimoComponentsTransactionVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.apache.geronimo.specs.j2ee.management", version: geronimoSpecsJ2eeManagementVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.apache.geronimo.specs.osgi.locator", version: geronimoSpecsOsgiLocatorVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.apache.geronimo.specs.osgi.registry", version: geronimoSpecsOsgiRegistryVersion, configuration: "compile", ext: "jar"
+
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.apache.commons.beanutils", version: commonsBeanutilsVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "oevm.org.apache.commons.cli", version: commonsCliVersion, ext: "jar"
+    signedExternalPlugin group: "commons-collections", name: "commons-collections", version: commonsCollectionsVersion
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.apache.commons.lang", version: commonsLangVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.apache.commons.dbcp", version: commonsDbcpVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.apache.commons.pool", version: commonsPoolVersion, configuration: "compile", ext: "jar"
+
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "cdi.api", version: cdiApiVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.apache.openejb.api", version: apacheOpenejbVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.apache.openejb.core", version: apacheOpenejbCoreVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.apache.openejb.javaagent", version: apacheOpenejbVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.apache.openejb.jee", version: apacheOpenejbVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.apache.openejb.loader", version: apacheOpenejbVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.apache.openejb.jpa-integration", version: apacheOpenejbVersion, configuration: "compile", ext: "jar"
+
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.apache.openwebbeans.ee", version: apacheOpenwebbeansEEVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.apache.openwebbeans.ee.common", version: apacheOpenwebbeansVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.apache.openwebbeans.ejb", version: apacheOpenwebbeansEEVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.apache.openwebbeans.impl", version: apacheOpenwebbeansVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.apache.openwebbeans.jsf", version: apacheOpenwebbeansVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.apache.openwebbeans.spi", version: apacheOpenwebbeansVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.apache.openwebbeans.tomcat7", version: apacheOpenwebbeansTomcat7Version, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.apache.openwebbeans.web", version: apacheOpenwebbeansVersion, configuration: "compile", ext: "jar"
+
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.apache.xbean.asm", version: apacheXBeanAsmVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.apache.xbean.bundleutils", version: apacheXBeanBundleutilsVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.apache.xbean.finder", version: apacheXBeanFinderVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.apache.xbean.naming", version: apacheXBeanNamingVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.apache.xbean.reflect", version: apacheXBeanReflectVersion, configuration: "compile", ext: "jar"
+
+    // Tomcat Runtime
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "javax.el", version: javaxElVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "com.sun.mail", name: "javax.mail", version: javaxMailVersion
+    // TODO - check CQ and put version into properties
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "javax.activation", version: '1.1.0.v201211130549', configuration: "compile", ext: "jar"
+
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "javax.servlet.jsp", version: javaxServletJspVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "javax.websocket", version: javaxWebsocketVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "javax.xml.rpc", version: javaxXmlRpcVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.apache.catalina", version: apacheCatalinaVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.apache.catalina.ha", version: apacheCatalinaVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.apache.catalina.tribes", version: apacheCatalinaVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.apache.coyote", version: apacheCatalinaVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.apache.el", version: apacheCatalinaVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.apache.jasper", version: apacheCatalinaVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.apache.juli", version: apacheCatalinaVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.apache.tomcat.api", version: apacheCatalinaVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.apache.tomcat.util", version: apacheCatalinaVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.apache.tomcat.jni", version: apacheCatalinaVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.apache.tomcat.websocket", version: apacheCatalinaVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.jdt.core.compiler.batch", version: eclipseJdtCoreCompilerBatchVersion, configuration: "compile", ext: "jar"
+
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.persistence.antlr", version: eclipsePersistenceAntlrVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.persistence.asm", version: eclipsePersistenceAsmVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.persistence.core", version: eclipsePersistenceCoreVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.persistence.jpa", version: eclipsePersistenceJpaVersion, configuration: "compile", ext: "jar"
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.eclipse.persistence.jpa.jpql", version: eclipsePersistenceJpaJpqlVersion, configuration: "compile", ext: "jar"
+
+    signedExternalPlugin group: "org.eclipse.virgo.mirrored", name: "org.apache.derby", version: apacheDerbyVersion, configuration: "compile", ext: "jar"
+
+    signedExternalPlugin project(':web:org.eclipse.virgo.web.enterprise.appdeployer')
+    signedExternalPlugin project(':web:org.eclipse.virgo.web.enterprise.applistener')
+    signedExternalPlugin project(':web:org.eclipse.virgo.web.enterprise.catalina.fragment.webbeans')
+    signedExternalPlugin project(':web:org.eclipse.virgo.web.enterprise.javax.persistence.extension')
+    signedExternalPlugin project(':web:org.eclipse.virgo.web.enterprise.javax.persistence.provider.initializer')
+    signedExternalPlugin project(':web:org.eclipse.virgo.web.enterprise.jsf.support')
+    signedExternalPlugin project(':web:org.eclipse.virgo.web.enterprise.openejb.fragment.bval')
+    signedExternalPlugin project(':web:org.eclipse.virgo.web.enterprise.openejb.fragment.jotm')
+    signedExternalPlugin project(':web:org.eclipse.virgo.web.enterprise.openejb.fragment.jpa')
+    signedExternalPlugin project(':web:org.eclipse.virgo.web.enterprise.openejb.fragment.webbeans')
+    signedExternalPlugin project(':web:org.eclipse.virgo.web.enterprise.openejb.initialiser')
+    signedExternalPlugin project(':web:org.eclipse.virgo.web.enterprise.openejb.tomcat.factory')
+    signedExternalPlugin project(':web:org.eclipse.virgo.web.enterprise.openwebbeans.initialiser')
+    signedExternalPlugin project(':web:org.eclipse.virgo.web.enterprise.persistence.openejb.classloading.hook')
+    signedExternalPlugin project(':web:org.eclipse.virgo.web.enterprise.security')
+    signedExternalPlugin project(':web:org.eclipse.virgo.web.enterprise.security.openejb.classloading.hook')
+    signedExternalPlugin project(':web:org.eclipse.virgo.web.enterprise.security.valve')
+    signedExternalPlugin project(':web:org.eclipse.virgo.web.enterprise.services.accessor')
+    signedExternalPlugin project(':web:org.eclipse.virgo.web.war.deployer')
+
+    localFeature project(':org.eclipse.virgo.site:org.eclipse.virgo.tools')
+}
+
+task zipUpdateSite(type: Zip, dependsOn : createP2Repository) {
+    from "${buildDir}/repository"
+    baseName 'repository'
+}
+
+task uploadUpdateSite(dependsOn : createP2Repository) {
+    description = "Uploads the generated update site to the eclipse.org server."
+
+    doLast {
+        // folder structure
+        // releases                    (main folder - composite update site if release repository)
+        //  |--1.0                     (version folder - always a composite update site)
+        //     |--1.0.0.v20150413-1512 (repository folder - simple update site)
+
+        // define the folder structure
+        def releaseTypeFolder = "${ECLIPSE_ORG_FTP_UPDATE_SITES_PATH}/${releaseTypeFolder(project)}"
+        def versionFolder = "${releaseTypeFolder}/${releaseVersion()}"
+        def repositoryFolder = "${versionFolder}/${project.version}"
+
+        // create composite update site for the root of the release repository and for the versions folder
+        def config = eclipsebuild.BuildshipConfig.on(project)
+        def compositeFolders = config.isRelease() ? [
+            releaseTypeFolder,
+            versionFolder
+        ]: [versionFolder]
+
+        // upload the update site and update the composite descriptors
+        ssh.run {
+            session(remotes.eclipseDotOrg) {
+                // create the leaf directory if not exist
+                execute "mkdir -p $repositoryFolder"
+
+                // copy the update site from the build directory to the remote location
+                put from: files { file("$buildDir/repository").listFiles() }, into: repositoryFolder
+
+                // recreate the compositeArtifacts.jar and the compositeContent.jar files
+                compositeFolders.each { execute("""cd ${it}
+                      ${file('updateCompositeUpdateSite.sh').text}""") }
+            }
+        }
+    }
+}
+
+// utility methods
+def releaseTypeFolder(Project project) {
+    def config = eclipsebuild.BuildshipConfig.on(project)
+    if(config.isRelease()) {
+        "releases"
+    } else if(config.isMilestone()){
+        "milestones"
+    } else if(config.isSnapshot()) {
+        "snapshots"
+    } else {
+        throw new IllegalStateException("BuildshipConfig must either be a release, milestone, or snapshot.")
+    }
+}
+
+def releaseVersion() {
+    // crop the major.minor segment from the version number
+    def matcher = version =~ /(\d+\.\d+)\.\d+\..*/
+    matcher[0][1]
+}
+
+private void postProcessing(project) {
+}
+
+private void signByEclipseService(unsignedFolder, signedFolder) {
+    ssh.run {
+        session(remotes.eclipseDotOrg) {
+            // the remote folder where the jars are signed
+            def remoteFolder = "${ECLIPSE_ORG_TEMP_PATH}/${signedFolder.name}"
+
+            // clean up the folder used for signing if the previous build failed
+            execute """rm -rf $remoteFolder
+                    mkdir -p $remoteFolder"""
+
+            // transfer the unsigned files to the remote host
+            put from: file(unsignedFolder).listFiles() as List, into: remoteFolder
+
+            // perform the signing
+            execute """ cd $remoteFolder
+                    # iterate all jars in the subfolders
+                    for jar in \$(find `pwd` -name '*.jar');
+                    do
+                        # save the signed jar into a temporary file copy and write it's content to the unsigned jar
+                        curl -o signed.jar -F filedata=@\$jar http://build.eclipse.org:31338/sign
+                        cp signed.jar \$jar
+                        rm signed.jar
+                    done
+                    """
+
+            // retrieve the signed content from the remote host into the build/signed-bundles folder
+            get from: remoteFolder, into: signedFolder.parentFile
+
+            // clean up the remote folder
+            execute "rm -rf $remoteFolder"
+        }
+    }
+}
+
+private void signLocally(File unsignedFolder, File signedFolder) {
+    def unsignedPluginsDir = new File(unsignedFolder, "plugins")
+    def unsignedFeaturesDir = new File(unsignedFolder, "features")
+    def signedPluginsDir = new File(signedFolder, "plugins")
+    def signedFeaturesDir = new File(signedFolder, "features")
+
+    signedPluginsDir.mkdirs()
+    signedFeaturesDir.mkdirs()
+
+    if (System.properties['skip.local.signing'] == 'true') {
+        project.logger.warn("Skipping local signing process!")
+        project.copy { from unsignedPluginsDir into signedPluginsDir }
+        project.copy { from unsignedFeaturesDir into signedFeaturesDir }
+    }
+
+    // TODO - add assert "keystore exists" - otherwise print this help!
+    // How to generate you own Java Key Store for local signing:
+    // $ keytool -genkey -alias virgo -keystore virgo.jks -storepass changeme -keypass development -dname "cn=Florian Waibel, ou=Virgo, o=EclipseSource, c=DE" -validity 365
+    // Verify the keystore on the command line:
+    // $ jarsigner -keystore virgo.jks -storepass changeme -keypass development org.eclipse.virgo.util.env-3.7.0.M2.jar virgo
+    // $ jarsigner -verify -verbose -certs org.eclipse.virgo.util.env-3.7.0.M2.jar
+    File targetDir = signedPluginsDir
+    def signBundle = {
+        if (System.properties['skip.local.signing'] != 'true') {
+            project.logger.info("Sign '${it.absolutePath}'")
+            project.ant.signjar(
+                    verbose: 'true',
+                    destDir: targetDir,
+                    alias: 'virgo',
+                    jar: it,
+                    keystore: project.findProject(':').file('config/signing/virgo.jks'),
+                    storepass: 'changeme',
+                    keypass: 'development',
+                    sigalg: 'SHA1withDSA',
+                    digestalg: 'SHA1',
+                    preservelastmodified: 'true')
+        }
+    }
+
+    unsignedPluginsDir.listFiles().each signBundle
+    targetDir = signedFeaturesDir
+    unsignedFeaturesDir.listFiles().each signBundle
+}
+
+private void addExtraPropertiesToArtifactsXml(Node artifactsXml) {
+    // modify the artifacts.xml file only when it is deployed to the eclipse.org servers
+    if (ECLIPSE_ORG_MIRROR_PATH) {
+        // add p2.mirrorsUrl to the properties section
+        // https://wiki.eclipse.org/Equinox/p2/p2.mirrorsURL
+        def mainPropertiesNode = artifactsXml.depthFirst().find { it.parent()?.name() == 'repository' && it.name() == 'properties' }
+        new Node(mainPropertiesNode, 'property', ['name': 'p2.mirrorsURL', 'value': calculateP2MirrorsUrl(project)] )
+
+        // add download.stats property to each installable unit
+        // https://wiki.eclipse.org/Equinox_p2_download_stats#Enabling_stats_in_your_repository
+        new Node(mainPropertiesNode, 'property', ['name': 'p2.statsURI', 'value': calculateStatsUri(project)])
+        mainPropertiesNode.@size = mainPropertiesNode.children().size()
+
+        // add <property name="download.stats" value="feature-id"/> node to the features
+        artifactsXml.depthFirst().findAll {
+            it.parent()?.parent()?.name() == 'artifacts' &&
+                    it.parent()?.name() == 'artifact' &&
+                    it.parent()?.@classifier == 'org.eclipse.update.feature' &&
+                    it.name() == 'properties'
+        }.each {
+            new Node(it, 'property', ['name': 'download.stats', 'value': it.parent().@id ] )
+            it.@size = it.children().size()
+        }
+    }
+}
+
+def calculateP2MirrorsUrl(Project project) {
+    def repositoryPath = "${ECLIPSE_ORG_MIRROR_PATH}/${releaseTypeFolder(project)}/${releaseVersion()}/${project.version}"
+    "http://www.eclipse.org/downloads/download.php?file=${repositoryPath}&format=xml"
+}
+
+def calculateStatsUri(Project project) {
+    "http://download.eclipse.org/stats/virgo/${releaseTypeFolder(project)}/${releaseVersion()}"
+}
+
+// TODO - think about a way to trigger :org.eclipse.virgo.site:publishBase and :org.eclipse.virgo.site:publishKernelBase after site creation
+project.tasks.addRule("Pattern: publish<ID>") { String taskName ->
+    if (taskName.startsWith("publish")) {
+        project.task (taskName, dependsOn: [
+            ":org.eclipse.virgo.site:${CREATE_P2_REPOSITORY_TASK_NAME}",
+        ]) {
+            def product = 'undefined'
+            switch (taskName.toString() - 'publish') {
+                case 'Base': product = 'base'; break
+                case 'KernelBase': product = 'kernel-base'; break
+                case 'NanoCore': product = 'nano-core'; break
+                case 'NanoBase': product = 'nano-base'; break
+                case 'Nano': product = 'nano'; break
+                case 'NanoFull': product = 'nano-full'; break
+            }
+            group = Constants.gradleTaskGroupName
+            description = "Publishes a product to a p2 repository. The publishing uses ANY environment configurations."
+
+            // TODO rework to something like createP2repository.outputs.repository?
+            // File repositoryDir = file(project.rootProject.tasks[":org.eclipse.virgo.site:${CREATE_P2_REPOSITORY_TASK_NAME}"].buildDir + "/repository/")
+            File repositoryDir = project.file("${project.rootProject.projectDir}/org.eclipse.virgo.site/build/repository/")
+            File productFileLocation = project.file("${project.projectDir}/publish_resources/products/${product}/${product}.product")
+            File javaProfileLocation = project.file("${project.projectDir}/src/main/dist/configuration/java-server.profile")
+
+            inputs.dir repositoryDir
+            inputs.file productFileLocation
+            inputs.file javaProfileLocation
+
+            doLast { publishProduct(project, repositoryDir, productFileLocation, javaProfileLocation) }
+        }
+    }
+}
+
+// for testing purposes only
+task ('installProductNanoBase', dependsOn: [
+    'publishNanoCore',
+    'publishNanoBase'
+]) {
+
+    description = "Installs a Virgo product to a desired destination. Default profile(roaming) is VIRGOProfile, the environment cofigurations are ANY."
+
+    def product = 'nano-base'
+    def shortProduct = 'VNB'
+    def destinationDir = file("${buildDir}/${shortProduct}/${product}")
+    def productIu = "${product}.product"
+
+    doLast() { installProduct(project, productIu, destinationDir) }
+}
+
+// for testing purposes only
+task ('installProductNano', dependsOn: [
+    'publishNanoCore',
+    'publishNanoBase',
+    'publishNano',
+]) {
+
+    description = "Installs a Virgo product to a desired destination. Default profile(roaming) is VIRGOProfile, the environment cofigurations are ANY."
+
+    def product = 'nano'
+    def shortProduct = 'VN'
+    def destinationDir = file("${buildDir}/${shortProduct}/${product}")
+    def productIu = "${product}.product"
+
+    doLast() { installProduct(project, productIu, destinationDir) }
+}
+
+// for testing purposes only
+task ('installProductNanoFull', dependsOn: [
+    'publishNanoCore',
+    'publishNanoBase',
+    'publishNano',
+    'publishNanoFull',
+]) {
+
+    description = "Installs a Virgo product to a desired destination. Default profile(roaming) is VIRGOProfile, the environment cofigurations are ANY."
+
+    def product = 'nano-full'
+    def shortProduct = 'VNF'
+    def destinationDir = file("${buildDir}/${shortProduct}/${product}")
+    def productIu = "${product}.product"
+
+    doLast() { installProduct(project, productIu, destinationDir) }
+}
diff --git a/org.eclipse.virgo.site/category.xml b/org.eclipse.virgo.site/category.xml
new file mode 100644
index 0000000..866ea52
--- /dev/null
+++ b/org.eclipse.virgo.site/category.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<site pack200="true">
+    <!-- TODO add 2nd category 3rd party libraries? -->
+    <category-def name="virgo" label="Virgo from EclipseRT">
+    	<description>
+    		A module-based Java application server.  
+    	</description>
+    </category-def>
+    <!-- TODO rename to org.eclipse.equinox.region -->
+    <feature id="org.eclipse.equinox.regions"
+        url="features/org.eclipse.equinox.regions_0.0.0.jar"
+        version="0.0.0">
+        <category name="virgo" />
+    </feature>
+    <feature id="org.eclipse.virgo.core"
+        url="features/org.eclipse.virgo.core_0.0.0.jar"
+        version="0.0.0">
+        <category name="virgo" />
+    </feature>
+    <!-- TODO rename to org.eclipse.equinox.ds -->
+    <feature id="org.eclipse.virgo.ds"
+        url="features/org.eclipse.virgo.ds_0.0.0.jar"
+        version="0.0.0">
+        <category name="virgo" />
+    </feature>
+    <feature id="org.eclipse.virgo.kernel"
+        url="features/org.eclipse.virgo.kernel_0.0.0.jar"
+        version="0.0.0">
+        <category name="virgo" />
+    </feature>
+    <feature id="org.eclipse.equinox.http.jetty"
+        url="features/org.eclipse.equinox.http.jetty_0.0.0.jar"
+        version="0.0.0">
+        <category name="virgo" />
+    </feature>
+    <!-- TODO rename to gemini.blueprint -->
+    <feature id="org.eclipse.virgo.kernel.springintegration"
+        url="features/org.eclipse.virgo.kernel.springintegration_0.0.0.jar"
+        version="0.0.0">
+        <category name="virgo" />
+    </feature>
+    <feature id="org.eclipse.virgo.management"
+        url="features/org.eclipse.virgo.management_0.0.0.jar"
+        version="0.0.0">
+        <category name="virgo" />
+    </feature>
+    <feature id="org.eclipse.virgo.medic"
+        url="features/org.eclipse.virgo.medic_0.0.0.jar"
+        version="0.0.0">
+        <category name="virgo" />
+    </feature>
+    <feature id="org.eclipse.virgo.nano.mbeans"
+        url="features/org.eclipse.virgo.nano.mbeans_0.0.0.jar"
+        version="0.0.0">
+        <category name="virgo" />
+    </feature>
+    <feature id="org.eclipse.virgo.shell"
+        url="features/org.eclipse.virgo.shell_0.0.0.jar"
+        version="0.0.0">
+        <category name="virgo" />
+    </feature>
+    <feature id="org.eclipse.virgo.simpleconfigurator"
+        url="features/org.eclipse.virgo.simpleconfigurator_0.0.0.jar"
+        version="0.0.0">
+        <category name="virgo" />
+    </feature>
+    <!-- TODO rename to org.eclipse.gemini.blueprint -->
+    <feature id="org.eclipse.virgo.springdm"
+        url="features/org.eclipse.virgo.springdm_0.0.0.jar"
+        version="0.0.0">
+        <category name="virgo" />
+    </feature>
+
+    <feature id="org.eclipse.virgo.tools"
+        url="features/org.eclipse.virgo.tools_0.0.0.jar"
+        version="0.0.0">
+        <category name="virgo" />
+    </feature>
+</site>
diff --git a/org.eclipse.virgo.site/epl-v10.html b/org.eclipse.virgo.site/epl-v10.html
new file mode 100644
index 0000000..fd39122
--- /dev/null
+++ b/org.eclipse.virgo.site/epl-v10.html
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Public License - Version 1.0</title>
+<style type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </style>
+
+</head>
+
+<body lang="EN-US">
+
+<h2>Eclipse Public License - v 1.0</h2>
+
+<p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</p>
+
+<p><b>1. DEFINITIONS</b></p>
+
+<p>&quot;Contribution&quot; means:</p>
+
+<p class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</p>
+<p class="list">b) in the case of each subsequent Contributor:</p>
+<p class="list">i) changes to the Program, and</p>
+<p class="list">ii) additions to the Program;</p>
+<p class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</p>
+
+<p>&quot;Contributor&quot; means any person or entity that distributes
+the Program.</p>
+
+<p>&quot;Licensed Patents&quot; mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</p>
+
+<p>&quot;Program&quot; means the Contributions distributed in accordance
+with this Agreement.</p>
+
+<p>&quot;Recipient&quot; means anyone who receives the Program under
+this Agreement, including all Contributors.</p>
+
+<p><b>2. GRANT OF RIGHTS</b></p>
+
+<p class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</p>
+
+<p class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</p>
+
+<p class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</p>
+
+<p class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</p>
+
+<p><b>3. REQUIREMENTS</b></p>
+
+<p>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</p>
+
+<p class="list">a) it complies with the terms and conditions of this
+Agreement; and</p>
+
+<p class="list">b) its license agreement:</p>
+
+<p class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</p>
+
+<p class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</p>
+
+<p class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</p>
+
+<p class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</p>
+
+<p>When the Program is made available in source code form:</p>
+
+<p class="list">a) it must be made available under this Agreement; and</p>
+
+<p class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</p>
+
+<p>Contributors may not remove or alter any copyright notices contained
+within the Program.</p>
+
+<p>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</p>
+
+<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
+
+<p>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+(&quot;Commercial Contributor&quot;) hereby agrees to defend and
+indemnify every other Contributor (&quot;Indemnified Contributor&quot;)
+against any losses, damages and costs (collectively &quot;Losses&quot;)
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</p>
+
+<p>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</p>
+
+<p><b>5. NO WARRANTY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</p>
+
+<p><b>6. DISCLAIMER OF LIABILITY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
+
+<p><b>7. GENERAL</b></p>
+
+<p>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</p>
+
+<p>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</p>
+
+<p>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</p>
+
+<p>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</p>
+
+<p>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</p>
+
+</body>
+
+</html>
diff --git a/org.eclipse.virgo.site/gradle.properties b/org.eclipse.virgo.site/gradle.properties
new file mode 100644
index 0000000..b3cfac7
--- /dev/null
+++ b/org.eclipse.virgo.site/gradle.properties
@@ -0,0 +1,17 @@
+# sftp server url
+ECLIPSE_ORG_FTP_HOST=
+
+# sftp username
+ECLIPSE_ORG_FTP_USER=
+
+# sftp password
+ECLIPSE_ORG_FTP_PASSWORD=
+
+# sftp absolute path to the root of the updates-sites
+ECLIPSE_ORG_FTP_UPDATE_SITES_PATH=
+
+# relative path to the root of the temp folder used for signing the jars remotely
+ECLIPSE_ORG_TEMP_PATH=
+
+# relative path to the root of the update-sites mirror
+ECLIPSE_ORG_MIRROR_PATH=
diff --git a/org.eclipse.virgo.site/notice.html b/org.eclipse.virgo.site/notice.html
new file mode 100644
index 0000000..c3d34c3
--- /dev/null
+++ b/org.eclipse.virgo.site/notice.html
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Foundation Software User Agreement</title>
+</head>
+
+<body lang="EN-US">
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>April 9, 2014</p>
+
+<h3>Usage Of Content</h3>
+
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
+
+<h3>Applicable Licenses</h3>
+
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
+   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
+
+<ul>
+       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
+       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
+       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
+      and/or Fragments associated with that Feature.</li>
+       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
+Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+       <li>The top-level (root) directory</li>
+       <li>Plug-in and Fragment directories</li>
+       <li>Inside Plug-ins and Fragments packaged as JARs</li>
+       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
+       <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
+installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+       <li>Eclipse Distribution License Version 1.0 (available at <a href="http://www.eclipse.org/licenses/edl-v10.html">http://www.eclipse.org/licenses/edl-v1.0.html</a>)</li>
+       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+
+<h3>Use of Provisioning Technology</h3>
+
+<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
+   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
+   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
+   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
+       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
+   (&quot;Specification&quot;).</p>
+
+<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
+   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
+   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
+   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
+
+<ol>
+       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
+       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
+       product.</li>
+       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
+       accessed and copied to the Target Machine.</li>
+       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
+       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
+       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
+       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
+       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
+</ol>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+
+<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
+</body>
+</html>
diff --git a/org.eclipse.virgo.site/org.eclipse.equinox.http.jetty/build.gradle b/org.eclipse.virgo.site/org.eclipse.equinox.http.jetty/build.gradle
new file mode 100644
index 0000000..32bcbb5
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.equinox.http.jetty/build.gradle
@@ -0,0 +1 @@
+apply plugin: eclipsebuild.FeaturePlugin
diff --git a/org.eclipse.virgo.site/org.eclipse.equinox.http.jetty/build.properties b/org.eclipse.virgo.site/org.eclipse.equinox.http.jetty/build.properties
new file mode 100644
index 0000000..a13e18b
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.equinox.http.jetty/build.properties
@@ -0,0 +1,5 @@
+bin.includes = feature.xml,\
+               feature.properties,\
+               epl-v10.html,\
+               eclipse_update_120.jpg,\
+               p2.inf
diff --git a/org.eclipse.virgo.site/org.eclipse.equinox.http.jetty/eclipse_update_120.jpg b/org.eclipse.virgo.site/org.eclipse.equinox.http.jetty/eclipse_update_120.jpg
new file mode 100755
index 0000000..bfdf708
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.equinox.http.jetty/eclipse_update_120.jpg
Binary files differ
diff --git a/org.eclipse.virgo.site/org.eclipse.equinox.http.jetty/epl-v10.html b/org.eclipse.virgo.site/org.eclipse.equinox.http.jetty/epl-v10.html
new file mode 100755
index 0000000..eecc800
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.equinox.http.jetty/epl-v10.html
@@ -0,0 +1,258 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!-- saved from url=(0049)http://www.eclipse.org/org/documents/epl-v10.html -->
+<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+
+<TITLE>Eclipse Public License - Version 1.0</TITLE>
+<STYLE type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </STYLE>
+
+</HEAD><BODY lang="EN-US">
+
+<H2>Eclipse Public License - v 1.0</H2>
+
+<P>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</P>
+
+<P><B>1. DEFINITIONS</B></P>
+
+<P>"Contribution" means:</P>
+
+<P class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</P>
+<P class="list">b) in the case of each subsequent Contributor:</P>
+<P class="list">i) changes to the Program, and</P>
+<P class="list">ii) additions to the Program;</P>
+<P class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</P>
+
+<P>"Contributor" means any person or entity that distributes
+the Program.</P>
+
+<P>"Licensed Patents" mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</P>
+
+<P>"Program" means the Contributions distributed in accordance
+with this Agreement.</P>
+
+<P>"Recipient" means anyone who receives the Program under
+this Agreement, including all Contributors.</P>
+
+<P><B>2. GRANT OF RIGHTS</B></P>
+
+<P class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</P>
+
+<P class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</P>
+
+<P class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</P>
+
+<P class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</P>
+
+<P><B>3. REQUIREMENTS</B></P>
+
+<P>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</P>
+
+<P class="list">a) it complies with the terms and conditions of this
+Agreement; and</P>
+
+<P class="list">b) its license agreement:</P>
+
+<P class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</P>
+
+<P class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</P>
+
+<P class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</P>
+
+<P class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</P>
+
+<P>When the Program is made available in source code form:</P>
+
+<P class="list">a) it must be made available under this Agreement; and</P>
+
+<P class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</P>
+
+<P>Contributors may not remove or alter any copyright notices contained
+within the Program.</P>
+
+<P>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</P>
+
+<P><B>4. COMMERCIAL DISTRIBUTION</B></P>
+
+<P>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+("Commercial Contributor") hereby agrees to defend and
+indemnify every other Contributor ("Indemnified Contributor")
+against any losses, damages and costs (collectively "Losses")
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</P>
+
+<P>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</P>
+
+<P><B>5. NO WARRANTY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</P>
+
+<P><B>6. DISCLAIMER OF LIABILITY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</P>
+
+<P><B>7. GENERAL</B></P>
+
+<P>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</P>
+
+<P>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</P>
+
+<P>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</P>
+
+<P>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</P>
+
+<P>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</P>
+
+
+
+
+</BODY></HTML>
\ No newline at end of file
diff --git a/org.eclipse.virgo.site/org.eclipse.equinox.http.jetty/feature.properties b/org.eclipse.virgo.site/org.eclipse.equinox.http.jetty/feature.properties
new file mode 100644
index 0000000..f5e4797
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.equinox.http.jetty/feature.properties
@@ -0,0 +1,180 @@
+###############################################################################
+# Copyright (c) 2011 SAP AG
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# and Apache License v2.0 which accompanies this distribution.
+# The Eclipse Public License is available at
+#   http://www.eclipse.org/legal/epl-v10.html
+# and the Apache License v2.0 is available at
+#   http://www.opensource.org/licenses/apache2.0.php.
+# You may elect to redistribute this code under either of these licenses.
+#
+# Contributors:
+#   Borislav Kapukaranov - initial contribution
+###############################################################################
+# feature.properties
+# contains externalized strings for feature.xml
+# "%foo" in feature.xml corresponds to the key "foo" in this file
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# This file should be translated.
+
+# "featureName" property - name of the feature
+featureName=Eclipse Equinox HTTP Service Feature
+
+# "providerName" property - name of the company that provides the feature
+providerName=Eclipse.org
+
+# "updateSiteName" property - label for the update site
+
+# "description" property - description of the feature
+description=This feature provides the Equinox HTTP Service bundle.\n\
+
+# "copyright" property - text of the "Feature Update Copyright"
+copyright=\
+Copyright (c) 2009, 2010, 2011 VMware Inc. and others\n\
+\n\
+All rights reserved. This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License v1.0\n\
+and Apache License v2.0 which accompanies this distribution.\n\
+The Eclipse Public License is available at\n\
+http://www.eclipse.org/legal/epl-v10.html\n\
+and the Apache License v2.0 is available at\n\
+http://www.opensource.org/licenses/apache2.0.php.\n\
+You may elect to redistribute this code under either of these\n\
+licenses.\n\
+\n\
+Contributors:\n\
+VMware Inc. - initial contribution\n\
+
+# "licenseURL" property - URL of the "Feature License"
+# do not translate value - just change to point to a locale-specific HTML page
+licenseURL=license.html
+
+# "license" property - text of the "Feature Update License"
+# should be plain text version of license agreement pointed to be "licenseURL"
+license=\
+Eclipse Foundation Software User Agreement\n\
+February 1, 2011\n\
+\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
+OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
+USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
+AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
+NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
+AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
+AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
+OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
+TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
+OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
+BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
+\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the\n\
+Eclipse Foundation is provided to you under the terms and conditions of\n\
+the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
+provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
+For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code,\n\
+documentation and other files maintained in the Eclipse Foundation source code\n\
+repository ("Repository") in software modules ("Modules") and made available\n\
+as downloadable archives ("Downloads").\n\
+\n\
+       - Content may be structured and packaged into modules to facilitate delivering,\n\
+         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
+         plug-in fragments ("Fragments"), and features ("Features").\n\
+       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
+         in a directory named "plugins".\n\
+       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
+         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
+         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
+         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
+         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be\n\
+contained in files named "about.html" ("Abouts"). The terms and\n\
+conditions governing Features and Included Features should be contained\n\
+in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
+Licenses may be located in any directory of a Download or Module\n\
+including, but not limited to the following locations:\n\
+\n\
+       - The top-level (root) directory\n\
+       - Plug-in and Fragment directories\n\
+       - Inside Plug-ins and Fragments packaged as JARs\n\
+       - Sub-directories of the directory named "src" of certain Plug-ins\n\
+       - Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
+Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
+Update License") during the installation process. If the Feature contains\n\
+Included Features, the Feature Update License should either provide you\n\
+with the terms and conditions governing the Included Features or inform\n\
+you where you can locate them. Feature Update Licenses may be found in\n\
+the "license" property of files named "feature.properties" found within a Feature.\n\
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
+terms and conditions (or references to such terms and conditions) that\n\
+govern your use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
+TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
+SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+       - Eclipse Distribution License Version 1.0 (available at http://www.eclipse.org/licenses/edl-v1.0.html)\n\
+       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
+TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
+is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
+govern that particular Content.\n\
+\n\
+\n\Use of Provisioning Technology\n\
+\n\
+The Eclipse Foundation makes available provisioning software, examples of which include,\n\
+but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
+the purpose of allowing users to install software, documentation, information and/or\n\
+other materials (collectively "Installable Software"). This capability is provided with\n\
+the intent of allowing such users to install, extend and update Eclipse-based products.\n\
+Information about packaging Installable Software is available at\n\
+http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
+\n\
+You may use Provisioning Technology to allow other parties to install Installable Software.\n\
+You shall be responsible for enabling the applicable license agreements relating to the\n\
+Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
+in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
+making it available in accordance with the Specification, you further acknowledge your\n\
+agreement to, and the acquisition of all necessary rights to permit the following:\n\
+\n\
+       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
+          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
+          extending or updating the functionality of an Eclipse-based product.\n\
+       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
+          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
+       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
+          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
+          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
+          with the Specification. Such Installable Software Agreement must inform the user of the\n\
+          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
+          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
+          indication of agreement by the user, the provisioning Technology will complete installation\n\
+          of the Installable Software.\n\
+\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are\n\
+currently may have restrictions on the import, possession, and use,\n\
+and/or re-export to another country, of encryption software. BEFORE\n\
+using any encryption software, please check the country's laws,\n\
+regulations and policies concerning the import, possession, or use, and\n\
+re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
+########### end of license property ##########################################
\ No newline at end of file
diff --git a/org.eclipse.virgo.site/org.eclipse.equinox.http.jetty/feature.xml b/org.eclipse.virgo.site/org.eclipse.equinox.http.jetty/feature.xml
new file mode 100755
index 0000000..d921df3
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.equinox.http.jetty/feature.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="org.eclipse.equinox.http.jetty"
+      label="%featureName"
+      version="@EQUINOX.HTTP.JETTY.VERSION@"
+      provider-name="%providerName"
+      image="eclipse_update_120.jpg">
+
+   <description url="http://www.eclipse.org/virgo/">
+      %description
+   </description>
+
+   <copyright url="http://www.eclipse.org/virgo/">
+      %copyright
+   </copyright>
+
+   <license url="%licenseURL">
+      %license
+   </license>
+
+   <plugin
+         id="org.eclipse.equinox.http.jetty"
+         download-size="0"
+         install-size="0"
+         version="@EQUINOX.HTTP.JETTY.VERSION@"
+         unpack="false"/>
+
+	     <plugin
+	           id="org.eclipse.jetty.continuation"
+	           download-size="0"
+	           install-size="0"
+	           version="@JETTY.VERSION@"
+	           unpack="false"/>
+
+	     <plugin
+	           id="org.eclipse.jetty.http"
+	           download-size="0"
+	           install-size="0"
+	           version="@JETTY.VERSION@"
+	           unpack="false"/>
+
+	     <plugin
+	           id="org.eclipse.jetty.io"
+	           download-size="0"
+	           install-size="0"
+	           version="@JETTY.VERSION@"
+	           unpack="false"/>
+
+	     <plugin
+	           id="org.eclipse.jetty.security"
+	           download-size="0"
+	           install-size="0"
+	           version="@JETTY.VERSION@"
+	           unpack="false"/>
+
+	     <plugin
+	           id="org.eclipse.jetty.server"
+	           download-size="0"
+	           install-size="0"
+	           version="@JETTY.VERSION@"
+	           unpack="false"/>
+
+	     <plugin
+	           id="org.eclipse.jetty.servlet"
+	           download-size="0"
+	           install-size="0"
+	           version="@JETTY.VERSION@"
+	           unpack="false"/>
+
+	     <plugin
+	           id="org.eclipse.jetty.util"
+	           download-size="0"
+	           install-size="0"
+	           version="@JETTY.VERSION@"
+	           unpack="false"/>
+
+</feature>
diff --git a/org.eclipse.virgo.site/org.eclipse.equinox.http.jetty/license.html b/org.eclipse.virgo.site/org.eclipse.equinox.http.jetty/license.html
new file mode 100755
index 0000000..f19c483
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.equinox.http.jetty/license.html
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Foundation Software User Agreement</title>
+</head>
+
+<body lang="EN-US">
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>February 1, 2011</p>
+
+<h3>Usage Of Content</h3>
+
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
+
+<h3>Applicable Licenses</h3>
+
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
+   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
+
+<ul>
+       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
+       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
+       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
+      and/or Fragments associated with that Feature.</li>
+       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
+Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+       <li>The top-level (root) directory</li>
+       <li>Plug-in and Fragment directories</li>
+       <li>Inside Plug-ins and Fragments packaged as JARs</li>
+       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
+       <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
+installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+       <li>Eclipse Distribution License Version 1.0 (available at <a href="http://www.eclipse.org/licenses/edl-v10.html">http://www.eclipse.org/licenses/edl-v1.0.html</a>)</li>
+       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+
+<h3>Use of Provisioning Technology</h3>
+
+<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
+   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
+   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
+   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
+       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
+   (&quot;Specification&quot;).</p>
+
+<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
+   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
+   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
+   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
+
+<ol>
+       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
+       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
+       product.</li>
+       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
+       accessed and copied to the Target Machine.</li>
+       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
+       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
+       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
+       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
+       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
+</ol>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+
+<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
+</body>
+</html>
diff --git a/org.eclipse.virgo.site/org.eclipse.equinox.regions/build.gradle b/org.eclipse.virgo.site/org.eclipse.equinox.regions/build.gradle
new file mode 100644
index 0000000..32bcbb5
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.equinox.regions/build.gradle
@@ -0,0 +1 @@
+apply plugin: eclipsebuild.FeaturePlugin
diff --git a/org.eclipse.virgo.site/org.eclipse.equinox.regions/build.properties b/org.eclipse.virgo.site/org.eclipse.equinox.regions/build.properties
new file mode 100644
index 0000000..db80add
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.equinox.regions/build.properties
@@ -0,0 +1,4 @@
+bin.includes = feature.xml,\
+               feature.properties,\
+               epl-v10.html,\
+               eclipse_update_120.jpg
diff --git a/org.eclipse.virgo.site/org.eclipse.equinox.regions/eclipse_update_120.jpg b/org.eclipse.virgo.site/org.eclipse.equinox.regions/eclipse_update_120.jpg
new file mode 100755
index 0000000..bfdf708
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.equinox.regions/eclipse_update_120.jpg
Binary files differ
diff --git a/org.eclipse.virgo.site/org.eclipse.equinox.regions/epl-v10.html b/org.eclipse.virgo.site/org.eclipse.equinox.regions/epl-v10.html
new file mode 100755
index 0000000..eecc800
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.equinox.regions/epl-v10.html
@@ -0,0 +1,258 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!-- saved from url=(0049)http://www.eclipse.org/org/documents/epl-v10.html -->
+<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+
+<TITLE>Eclipse Public License - Version 1.0</TITLE>
+<STYLE type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </STYLE>
+
+</HEAD><BODY lang="EN-US">
+
+<H2>Eclipse Public License - v 1.0</H2>
+
+<P>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</P>
+
+<P><B>1. DEFINITIONS</B></P>
+
+<P>"Contribution" means:</P>
+
+<P class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</P>
+<P class="list">b) in the case of each subsequent Contributor:</P>
+<P class="list">i) changes to the Program, and</P>
+<P class="list">ii) additions to the Program;</P>
+<P class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</P>
+
+<P>"Contributor" means any person or entity that distributes
+the Program.</P>
+
+<P>"Licensed Patents" mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</P>
+
+<P>"Program" means the Contributions distributed in accordance
+with this Agreement.</P>
+
+<P>"Recipient" means anyone who receives the Program under
+this Agreement, including all Contributors.</P>
+
+<P><B>2. GRANT OF RIGHTS</B></P>
+
+<P class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</P>
+
+<P class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</P>
+
+<P class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</P>
+
+<P class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</P>
+
+<P><B>3. REQUIREMENTS</B></P>
+
+<P>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</P>
+
+<P class="list">a) it complies with the terms and conditions of this
+Agreement; and</P>
+
+<P class="list">b) its license agreement:</P>
+
+<P class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</P>
+
+<P class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</P>
+
+<P class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</P>
+
+<P class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</P>
+
+<P>When the Program is made available in source code form:</P>
+
+<P class="list">a) it must be made available under this Agreement; and</P>
+
+<P class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</P>
+
+<P>Contributors may not remove or alter any copyright notices contained
+within the Program.</P>
+
+<P>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</P>
+
+<P><B>4. COMMERCIAL DISTRIBUTION</B></P>
+
+<P>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+("Commercial Contributor") hereby agrees to defend and
+indemnify every other Contributor ("Indemnified Contributor")
+against any losses, damages and costs (collectively "Losses")
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</P>
+
+<P>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</P>
+
+<P><B>5. NO WARRANTY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</P>
+
+<P><B>6. DISCLAIMER OF LIABILITY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</P>
+
+<P><B>7. GENERAL</B></P>
+
+<P>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</P>
+
+<P>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</P>
+
+<P>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</P>
+
+<P>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</P>
+
+<P>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</P>
+
+
+
+
+</BODY></HTML>
\ No newline at end of file
diff --git a/org.eclipse.virgo.site/org.eclipse.equinox.regions/feature.properties b/org.eclipse.virgo.site/org.eclipse.equinox.regions/feature.properties
new file mode 100644
index 0000000..460662e
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.equinox.regions/feature.properties
@@ -0,0 +1,189 @@
+###############################################################################
+# Copyright (c) 2011 SAP AG
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# and Apache License v2.0 which accompanies this distribution.
+# The Eclipse Public License is available at
+#   http://www.eclipse.org/legal/epl-v10.html
+# and the Apache License v2.0 is available at
+#   http://www.opensource.org/licenses/apache2.0.php.
+# You may elect to redistribute this code under either of these licenses.
+#
+# Contributors:
+#   Borislav Kapukaranov - initial contribution
+###############################################################################
+# feature.properties
+# contains externalized strings for feature.xml
+# "%foo" in feature.xml corresponds to the key "foo" in this file
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# This file should be translated.
+
+# "featureName" property - name of the feature
+featureName=Eclipse Virgo Regions Feature
+
+# "providerName" property - name of the company that provides the feature
+providerName=Eclipse.org
+
+# "updateSiteName" property - label for the update site
+
+# "description" property - description of the feature
+description=This feature provides region support in Virgo Kernel.\n\
+
+# "copyright" property - text of the "Feature Update Copyright"
+copyright=\
+Copyright (c) 2009, 2010, 2011 VMware Inc. and others\n\
+\n\
+All rights reserved. This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License v1.0\n\
+and Apache License v2.0 which accompanies this distribution.\n\
+The Eclipse Public License is available at\n\
+http://www.eclipse.org/legal/epl-v10.html\n\
+and the Apache License v2.0 is available at\n\
+http://www.opensource.org/licenses/apache2.0.php.\n\
+You may elect to redistribute this code under either of these\n\
+licenses.\n\
+\n\
+Contributors:\n\
+VMware Inc. - initial contribution\n\
+
+# "licenseURL" property - URL of the "Feature License"
+# do not translate value - just change to point to a locale-specific HTML page
+licenseURL=license.html
+
+# "license" property - text of the "Feature Update License"
+# should be plain text version of license agreement pointed to be "licenseURL"
+license=\
+Eclipse Foundation Software User Agreement\n\
+April 14, 2010\n\
+\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION,\n\
+INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS\n\
+(COLLECTIVELY "CONTENT"). USE OF THE CONTENT IS GOVERNED BY THE TERMS\n\
+AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF\n\
+LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.\n\
+BY USING THE CONTENT, YOU AGREE THAT YOUR USE OF THE CONTENT IS\n\
+GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY\n\
+APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
+BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS\n\
+AGREEMENT AND THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE\n\
+AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY\n\
+NOT USE THE CONTENT.\n\
+\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the Eclipse Foundation\n\
+is provided to you under the terms and conditions of the Eclipse Public\n\
+License Version 1.0 ("EPL"). A copy of the EPL is provided with this\n\
+Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
+For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code,\n\
+documentation and other files maintained in the Eclipse Foundation source code\n\
+repository ("Repository") in software modules ("Modules") and made available\n\
+as downloadable archives ("Downloads").\n\
+\n\
+- Content may be structured and packaged into modules to facilitate delivering,\n\
+extending, and upgrading the Content. Typical modules may include plug-ins\n\
+("Plug-ins"), plug-in fragments ("Fragments"), and features ("Features").\n\
+- Each Plug-in or Fragment may be packaged as a sub-directory or JAR\n\
+(Java tm ARchive) in a directory named "plugins".\n\
+- A Feature is a bundle of one or more Plug-ins and/or Fragments and associated\n\
+material. Each Feature may be packaged as a sub-directory in a directory named\n\
+"features". Within a Feature, files named "feature.xml" may contain a list\n\
+of the names and version numbers of the Plug-ins and/or Fragments associated\n\
+with that Feature.\n\
+- Features may also include other Features ("Included Features").\n\
+Within a Feature, files named "feature.xml" may contain a list of the\n\
+names and version numbers of Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be\n\
+contained in files named "about.html" ("Abouts"). The terms and\n\
+conditions governing Features and Included Features should be contained\n\
+in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
+Licenses may be located in any directory of a Download or Module\n\
+including, but not limited to the following locations:\n\
+\n\
+- The top-level (root) directory\n\
+- Plug-in and Fragment directories\n\
+- Inside Plug-ins and Fragments packaged as JARs\n\
+- Sub-directories of the directory named "src" of certain Plug-ins\n\
+- Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed\n\
+using the Provisioning Technology (as defined below), you must agree to a\n\
+license ("Feature Update License") during the installation process.\n\
+If the Feature contains\n\
+Included Features, the Feature Update License should either provide\n\
+you with the terms and conditions governing the Included Features or inform\n\
+you where you can locate them. Feature Update Licenses may be found in\n\
+the "license" property of files named "feature.properties" found within a Feature.\n\
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms\n\
+and conditions (or references to such terms and conditions) that govern your\n\
+use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
+TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
+SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+- Common Public License Version 1.0 (available at\n\
+http://www.eclipse.org/legal/cpl-v10.html)\n\
+- Apache Software License 1.1 (available at\n\
+http://www.apache.org/licenses/LICENSE)\n\
+- Apache Software License 2.0 (available at\n\
+http://www.apache.org/licenses/LICENSE-2.0)\n\
+- Metro Link Public License 1.00 (available at\n\
+http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+- Mozilla Public License Version 1.1 (available at\n\
+http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS\n\
+PRIOR TO USE OF THE CONTENT. If no About, Feature License, or Feature\n\
+Update License is provided, please contact the Eclipse Foundation to\n\
+determine what terms and conditions govern that particular Content.\n\
+\n\
+Use of Provisioning Technology\n\
+\n\
+The Eclipse Foundation makes available provisioning software, examples\n\
+of which include, but are not limited to, p2 and the Eclipse Update Manager\n\
+("Provisioning Technology") for the purpose of allowing users to install software,\n\
+documentation, information and/or other materials (collectively "Installable Software").\n\
+This capability is provided with the intent of allowing such users to install,\n\
+extend and update Eclipse-based products.\n\
+Information about packaging Installable Software is available at\n\
+http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
+\n\
+You may use Provisioning Technology to allow other parties to install Installable Software.\n\
+You shall be responsible for enabling the applicable license agreements relating\n\
+to the Installable Software to be presented to, and accepted by,\n\
+the users of the Provisioning Technology in accordance with the Specification.\n\
+By using Provisioning Technology in such a manner and making it available in accordance\n\
+with the Specification, you further acknowledge your agreement to,\n\
+and the acquisition of all necessary rights to permit the following:\n\
+\n\
+- A series of actions may occur ("Provisioning Process") in which a user may execute the\n\
+Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
+extending or updating the functionality of an Eclipse-based product.\n\
+- During the Provisioning Process, the Provisioning Technology may cause third party\n\
+Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
+- Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
+govern the use of the Installable Software ("Installable Software Agreement")\n\
+and such Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
+with the Specification. Such Installable Software Agreement must inform the user of the terms and\n\
+conditions that govern the Installable Software and must solicit acceptance by the end user in\n\
+the manner prescribed in such Installable Software Agreement.\n\
+Upon such indication of agreement by the user, the provisioning Technology\n\
+will complete installation of the Installable Software.\n\
+\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are\n\
+currently may have restrictions on the import, possession, and use,\n\
+and/or re-export to another country, of encryption software. BEFORE\n\
+using any encryption software, please check the country's laws,\n\
+regulations and policies concerning the import, possession, or use,\n\
+and re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n\
diff --git a/org.eclipse.virgo.site/org.eclipse.equinox.regions/feature.xml b/org.eclipse.virgo.site/org.eclipse.equinox.regions/feature.xml
new file mode 100755
index 0000000..e23caf6
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.equinox.regions/feature.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="org.eclipse.equinox.regions"
+      label="%featureName"
+      version="@REGION.VERSION@"
+      provider-name="%providerName"
+      image="eclipse_update_120.jpg">
+
+   <description url="http://www.eclipse.org/virgo/">
+      %description
+   </description>
+
+   <copyright url="http://www.eclipse.org/virgo/">
+      %copyright
+   </copyright>
+
+   <license url="%licenseURL">
+      %license
+   </license>
+
+   <plugin
+         id="org.eclipse.equinox.region"
+         download-size="0"
+         install-size="0"
+         version="@REGION.VERSION@"
+         unpack="false"
+         autostart="true"/>         
+
+</feature>
diff --git a/org.eclipse.virgo.site/org.eclipse.gemini.web/build.gradle b/org.eclipse.virgo.site/org.eclipse.gemini.web/build.gradle
new file mode 100644
index 0000000..32bcbb5
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.gemini.web/build.gradle
@@ -0,0 +1 @@
+apply plugin: eclipsebuild.FeaturePlugin
diff --git a/org.eclipse.virgo.site/org.eclipse.gemini.web/build.properties b/org.eclipse.virgo.site/org.eclipse.gemini.web/build.properties
new file mode 100644
index 0000000..64f93a9
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.gemini.web/build.properties
@@ -0,0 +1 @@
+bin.includes = feature.xml
diff --git a/org.eclipse.virgo.site/org.eclipse.gemini.web/eclipse_update_120.jpg b/org.eclipse.virgo.site/org.eclipse.gemini.web/eclipse_update_120.jpg
new file mode 100755
index 0000000..bfdf708
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.gemini.web/eclipse_update_120.jpg
Binary files differ
diff --git a/org.eclipse.virgo.site/org.eclipse.gemini.web/epl-v10.html b/org.eclipse.virgo.site/org.eclipse.gemini.web/epl-v10.html
new file mode 100755
index 0000000..eecc800
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.gemini.web/epl-v10.html
@@ -0,0 +1,258 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!-- saved from url=(0049)http://www.eclipse.org/org/documents/epl-v10.html -->
+<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+
+<TITLE>Eclipse Public License - Version 1.0</TITLE>
+<STYLE type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </STYLE>
+
+</HEAD><BODY lang="EN-US">
+
+<H2>Eclipse Public License - v 1.0</H2>
+
+<P>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</P>
+
+<P><B>1. DEFINITIONS</B></P>
+
+<P>"Contribution" means:</P>
+
+<P class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</P>
+<P class="list">b) in the case of each subsequent Contributor:</P>
+<P class="list">i) changes to the Program, and</P>
+<P class="list">ii) additions to the Program;</P>
+<P class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</P>
+
+<P>"Contributor" means any person or entity that distributes
+the Program.</P>
+
+<P>"Licensed Patents" mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</P>
+
+<P>"Program" means the Contributions distributed in accordance
+with this Agreement.</P>
+
+<P>"Recipient" means anyone who receives the Program under
+this Agreement, including all Contributors.</P>
+
+<P><B>2. GRANT OF RIGHTS</B></P>
+
+<P class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</P>
+
+<P class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</P>
+
+<P class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</P>
+
+<P class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</P>
+
+<P><B>3. REQUIREMENTS</B></P>
+
+<P>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</P>
+
+<P class="list">a) it complies with the terms and conditions of this
+Agreement; and</P>
+
+<P class="list">b) its license agreement:</P>
+
+<P class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</P>
+
+<P class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</P>
+
+<P class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</P>
+
+<P class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</P>
+
+<P>When the Program is made available in source code form:</P>
+
+<P class="list">a) it must be made available under this Agreement; and</P>
+
+<P class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</P>
+
+<P>Contributors may not remove or alter any copyright notices contained
+within the Program.</P>
+
+<P>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</P>
+
+<P><B>4. COMMERCIAL DISTRIBUTION</B></P>
+
+<P>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+("Commercial Contributor") hereby agrees to defend and
+indemnify every other Contributor ("Indemnified Contributor")
+against any losses, damages and costs (collectively "Losses")
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</P>
+
+<P>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</P>
+
+<P><B>5. NO WARRANTY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</P>
+
+<P><B>6. DISCLAIMER OF LIABILITY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</P>
+
+<P><B>7. GENERAL</B></P>
+
+<P>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</P>
+
+<P>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</P>
+
+<P>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</P>
+
+<P>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</P>
+
+<P>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</P>
+
+
+
+
+</BODY></HTML>
\ No newline at end of file
diff --git a/org.eclipse.virgo.site/org.eclipse.gemini.web/feature.properties b/org.eclipse.virgo.site/org.eclipse.gemini.web/feature.properties
new file mode 100644
index 0000000..1b652a6
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.gemini.web/feature.properties
@@ -0,0 +1,180 @@
+###############################################################################
+# Copyright (c) 2011 SAP AG
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# and Apache License v2.0 which accompanies this distribution.
+# The Eclipse Public License is available at
+#   http://www.eclipse.org/legal/epl-v10.html
+# and the Apache License v2.0 is available at
+#   http://www.opensource.org/licenses/apache2.0.php.
+# You may elect to redistribute this code under either of these licenses.
+#
+# Contributors:
+#   Borislav Kapukaranov - initial contribution
+###############################################################################
+# feature.properties
+# contains externalized strings for feature.xml
+# "%foo" in feature.xml corresponds to the key "foo" in this file
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# This file should be translated.
+
+# "featureName" property - name of the feature
+featureName=Eclipse Gemini Web Container Feature
+
+# "providerName" property - name of the company that provides the feature
+providerName=Eclipse.org
+
+# "updateSiteName" property - label for the update site
+
+# "description" property - description of the feature
+description=This is a minimal feature of Gemini Web for Virgo.\n\
+
+# "copyright" property - text of the "Feature Update Copyright"
+copyright=\
+Copyright (c) 2009, 2010, 2011 VMware Inc. and others\n\
+\n\
+All rights reserved. This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License v1.0\n\
+and Apache License v2.0 which accompanies this distribution.\n\
+The Eclipse Public License is available at\n\
+http://www.eclipse.org/legal/epl-v10.html\n\
+and the Apache License v2.0 is available at\n\
+http://www.opensource.org/licenses/apache2.0.php.\n\
+You may elect to redistribute this code under either of these\n\
+licenses.\n\
+\n\
+Contributors:\n\
+VMware Inc. - initial contribution\n\
+
+# "licenseURL" property - URL of the "Feature License"
+# do not translate value - just change to point to a locale-specific HTML page
+licenseURL=license.html
+
+# "license" property - text of the "Feature Update License"
+# should be plain text version of license agreement pointed to be "licenseURL"
+license=\
+Eclipse Foundation Software User Agreement\n\
+February 1, 2011\n\
+\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
+OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
+USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
+AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
+NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
+AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
+AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
+OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
+TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
+OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
+BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
+\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the\n\
+Eclipse Foundation is provided to you under the terms and conditions of\n\
+the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
+provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
+For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code,\n\
+documentation and other files maintained in the Eclipse Foundation source code\n\
+repository ("Repository") in software modules ("Modules") and made available\n\
+as downloadable archives ("Downloads").\n\
+\n\
+       - Content may be structured and packaged into modules to facilitate delivering,\n\
+         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
+         plug-in fragments ("Fragments"), and features ("Features").\n\
+       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
+         in a directory named "plugins".\n\
+       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
+         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
+         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
+         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
+         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be\n\
+contained in files named "about.html" ("Abouts"). The terms and\n\
+conditions governing Features and Included Features should be contained\n\
+in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
+Licenses may be located in any directory of a Download or Module\n\
+including, but not limited to the following locations:\n\
+\n\
+       - The top-level (root) directory\n\
+       - Plug-in and Fragment directories\n\
+       - Inside Plug-ins and Fragments packaged as JARs\n\
+       - Sub-directories of the directory named "src" of certain Plug-ins\n\
+       - Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
+Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
+Update License") during the installation process. If the Feature contains\n\
+Included Features, the Feature Update License should either provide you\n\
+with the terms and conditions governing the Included Features or inform\n\
+you where you can locate them. Feature Update Licenses may be found in\n\
+the "license" property of files named "feature.properties" found within a Feature.\n\
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
+terms and conditions (or references to such terms and conditions) that\n\
+govern your use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
+TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
+SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+       - Eclipse Distribution License Version 1.0 (available at http://www.eclipse.org/licenses/edl-v1.0.html)\n\
+       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
+TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
+is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
+govern that particular Content.\n\
+\n\
+\n\Use of Provisioning Technology\n\
+\n\
+The Eclipse Foundation makes available provisioning software, examples of which include,\n\
+but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
+the purpose of allowing users to install software, documentation, information and/or\n\
+other materials (collectively "Installable Software"). This capability is provided with\n\
+the intent of allowing such users to install, extend and update Eclipse-based products.\n\
+Information about packaging Installable Software is available at\n\
+http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
+\n\
+You may use Provisioning Technology to allow other parties to install Installable Software.\n\
+You shall be responsible for enabling the applicable license agreements relating to the\n\
+Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
+in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
+making it available in accordance with the Specification, you further acknowledge your\n\
+agreement to, and the acquisition of all necessary rights to permit the following:\n\
+\n\
+       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
+          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
+          extending or updating the functionality of an Eclipse-based product.\n\
+       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
+          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
+       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
+          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
+          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
+          with the Specification. Such Installable Software Agreement must inform the user of the\n\
+          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
+          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
+          indication of agreement by the user, the provisioning Technology will complete installation\n\
+          of the Installable Software.\n\
+\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are\n\
+currently may have restrictions on the import, possession, and use,\n\
+and/or re-export to another country, of encryption software. BEFORE\n\
+using any encryption software, please check the country's laws,\n\
+regulations and policies concerning the import, possession, or use, and\n\
+re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
+########### end of license property ##########################################
\ No newline at end of file
diff --git a/org.eclipse.virgo.site/org.eclipse.gemini.web/feature.xml b/org.eclipse.virgo.site/org.eclipse.gemini.web/feature.xml
new file mode 100755
index 0000000..300f3ae
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.gemini.web/feature.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="org.eclipse.gemini.web"
+      label="%featureName"
+      version="@GEMINI.WEB.VERSION@"
+      provider-name="%providerName"
+      image="eclipse_update_120.jpg">
+
+   <description url="http://www.eclipse.org/virgo/">
+      %description
+   </description>
+
+   <copyright url="http://www.eclipse.org/virgo/">
+      %copyright
+   </copyright>
+
+   <license url="%licenseURL">
+      %license
+   </license>
+
+   <plugin
+         id="org.eclipse.gemini.web.tomcat"
+         download-size="0"
+         install-size="0"
+         version="@GEMINI.WEB.VERSION@"
+         unpack="false"
+         autostart="true"/>
+
+   <plugin
+         id="org.eclipse.gemini.web.extender"
+         download-size="0"
+         install-size="0"
+         version="@GEMINI.WEB.VERSION@"
+         unpack="false"
+         autostart="true"/>
+
+   <plugin
+         id="org.eclipse.gemini.web.core"
+         download-size="0"
+         install-size="0"
+         version="@GEMINI.WEB.VERSION@"
+         unpack="false"
+         autostart="true"/>
+
+   <plugin
+         id="org.eclipse.gemini.web.jaspic.fragment"
+         download-size="0"
+         install-size="0"
+         version="@GEMINI.WEB.VERSION@"
+         unpack="false"/>
+    
+    <plugin
+        id="org.apache.jasper"
+        download-size="0"
+        install-size="0"
+        version="@CATALINA.VERSION@"
+        unpack="false"/>
+    
+    <plugin
+        id="org.apache.catalina.ha"
+        download-size="0"
+        install-size="0"
+        version="@CATALINA.VERSION@"
+        unpack="false"/>
+    
+    <plugin
+        id="org.apache.catalina.tribes"
+        download-size="0"
+        install-size="0"
+        version="@CATALINA.VERSION@"
+        unpack="false"/>
+    
+    <plugin
+        id="org.apache.tomcat.jni"
+        download-size="0"
+        install-size="0"
+        version="@CATALINA.VERSION@"
+        unpack="false"/>
+    
+    <plugin
+        id="javax.websocket"
+        download-size="0"
+        install-size="0"
+        version="@JAVAX.WEBSOCKET@"
+        unpack="false"/>
+
+</feature>
diff --git a/org.eclipse.virgo.site/org.eclipse.gemini.web/license.html b/org.eclipse.virgo.site/org.eclipse.gemini.web/license.html
new file mode 100755
index 0000000..f19c483
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.gemini.web/license.html
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Foundation Software User Agreement</title>
+</head>
+
+<body lang="EN-US">
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>February 1, 2011</p>
+
+<h3>Usage Of Content</h3>
+
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
+
+<h3>Applicable Licenses</h3>
+
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
+   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
+
+<ul>
+       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
+       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
+       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
+      and/or Fragments associated with that Feature.</li>
+       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
+Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+       <li>The top-level (root) directory</li>
+       <li>Plug-in and Fragment directories</li>
+       <li>Inside Plug-ins and Fragments packaged as JARs</li>
+       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
+       <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
+installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+       <li>Eclipse Distribution License Version 1.0 (available at <a href="http://www.eclipse.org/licenses/edl-v10.html">http://www.eclipse.org/licenses/edl-v1.0.html</a>)</li>
+       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+
+<h3>Use of Provisioning Technology</h3>
+
+<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
+   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
+   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
+   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
+       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
+   (&quot;Specification&quot;).</p>
+
+<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
+   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
+   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
+   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
+
+<ol>
+       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
+       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
+       product.</li>
+       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
+       accessed and copied to the Target Machine.</li>
+       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
+       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
+       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
+       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
+       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
+</ol>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+
+<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
+</body>
+</html>
diff --git a/org.eclipse.virgo.site/org.eclipse.rap/META-INF/ECLIPSE_.RSA b/org.eclipse.virgo.site/org.eclipse.rap/META-INF/ECLIPSE_.RSA
new file mode 100755
index 0000000..ddb5866
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.rap/META-INF/ECLIPSE_.RSA
Binary files differ
diff --git a/org.eclipse.virgo.site/org.eclipse.rap/META-INF/ECLIPSE_.SF b/org.eclipse.virgo.site/org.eclipse.rap/META-INF/ECLIPSE_.SF
new file mode 100755
index 0000000..488a09a
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.rap/META-INF/ECLIPSE_.SF
@@ -0,0 +1,27 @@
+Signature-Version: 1.0
+SHA1-Digest-Manifest: NlvNW+IFdOxPX0MLSELjWJj64OY=
+Created-By: 1.6.0 (IBM Corporation)
+SHA1-Digest-Manifest-Main-Attributes: ITZ414UJvchvI155VLrDHd0wXW0=
+
+Name: epl-v10.html
+SHA1-Digest: 5M5yOPanU8Bh0NNt4hucpomfnos=
+
+Name: META-INF/maven/org.eclipse.rap/org.eclipse.rap.feature/pom.prope
+ rties
+SHA1-Digest: XDRL1tpjtbc0U+yqGpGLBi7Mf5U=
+
+Name: p2.inf
+SHA1-Digest: jAH9XhnRBXKzC16znblEaBFv1xI=
+
+Name: META-INF/maven/org.eclipse.rap/org.eclipse.rap.feature/pom.xml
+SHA1-Digest: uAw8vyh/XWOKERX5WwTo9ZnoxLw=
+
+Name: license.html
+SHA1-Digest: leexLIIUuWA4wkAPsn1Q3CxJw/0=
+
+Name: feature.properties
+SHA1-Digest: +QqioQiSPCYao6tvRN4Pz1La7yo=
+
+Name: feature.xml
+SHA1-Digest: 93mEAHMH6F3xvQpECKwSrs4FMVg=
+
diff --git a/org.eclipse.virgo.site/org.eclipse.rap/META-INF/MANIFEST.MF b/org.eclipse.virgo.site/org.eclipse.rap/META-INF/MANIFEST.MF
new file mode 100755
index 0000000..fe53df8
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.rap/META-INF/MANIFEST.MF
@@ -0,0 +1,28 @@
+Manifest-Version: 1.0
+Build-Jdk: 1.6.0_45
+Built-By: genie.rt.rap
+Archiver-Version: Plexus Archiver
+Created-By: Apache Maven
+
+Name: epl-v10.html
+SHA1-Digest: NWZsVPJAYSVwfmPtqxLykU2FynY=
+
+Name: META-INF/maven/org.eclipse.rap/org.eclipse.rap.feature/pom.prope
+ rties
+SHA1-Digest: F8wm9360y8wEsjC325GUrUEFA5U=
+
+Name: p2.inf
+SHA1-Digest: 8jNlA+t4uBa/ntDwzpl09daVYcA=
+
+Name: META-INF/maven/org.eclipse.rap/org.eclipse.rap.feature/pom.xml
+SHA1-Digest: n0UEh5h6S0kW/Eev3Eb+DOeMpG8=
+
+Name: license.html
+SHA1-Digest: Z5WKoRSIDCgQNswUpOU/oSPE2a0=
+
+Name: feature.properties
+SHA1-Digest: JCUqinpGTwQuT94B6PNLFK0iE6s=
+
+Name: feature.xml
+SHA1-Digest: 9/Hc/lXeIU53a9klFaWKRFro2OU=
+
diff --git a/org.eclipse.virgo.site/org.eclipse.rap/META-INF/maven/org.eclipse.rap/org.eclipse.rap.feature/pom.properties b/org.eclipse.virgo.site/org.eclipse.rap/META-INF/maven/org.eclipse.rap/org.eclipse.rap.feature/pom.properties
new file mode 100755
index 0000000..72509ad
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.rap/META-INF/maven/org.eclipse.rap/org.eclipse.rap.feature/pom.properties
@@ -0,0 +1,5 @@
+#Generated by Maven
+#Tue Feb 10 13:07:33 EST 2015
+version=2.3.2-SNAPSHOT
+groupId=org.eclipse.rap
+artifactId=org.eclipse.rap.feature
diff --git a/org.eclipse.virgo.site/org.eclipse.rap/META-INF/maven/org.eclipse.rap/org.eclipse.rap.feature/pom.xml b/org.eclipse.virgo.site/org.eclipse.rap/META-INF/maven/org.eclipse.rap/org.eclipse.rap.feature/pom.xml
new file mode 100755
index 0000000..87cf0e4
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.rap/META-INF/maven/org.eclipse.rap/org.eclipse.rap.feature/pom.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Copyright (C) 2011, 2015 EclipseSource and others
+  All rights reserved. This program and the accompanying materials
+  are made available under the terms of the Eclipse Public License v1.0
+  which accompanies this distribution, and is available at
+  http://www.eclipse.org/legal/epl-v10.html
+
+  Contributors:
+     EclipseSource - initial implementation
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.eclipse.rap</groupId>
+    <artifactId>org.eclipse.rap.runtime-parent</artifactId>
+    <version>2.3.2-SNAPSHOT</version>
+    <relativePath>../../releng/org.eclipse.rap.build/pom.xml</relativePath>
+  </parent>
+
+  <artifactId>org.eclipse.rap.feature</artifactId>
+  <packaging>eclipse-feature</packaging>
+
+</project>
diff --git a/org.eclipse.virgo.site/org.eclipse.rap/build.gradle b/org.eclipse.virgo.site/org.eclipse.rap/build.gradle
new file mode 100644
index 0000000..32bcbb5
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.rap/build.gradle
@@ -0,0 +1 @@
+apply plugin: eclipsebuild.FeaturePlugin
diff --git a/org.eclipse.virgo.site/org.eclipse.rap/build.properties b/org.eclipse.virgo.site/org.eclipse.rap/build.properties
new file mode 100644
index 0000000..a13e18b
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.rap/build.properties
@@ -0,0 +1,5 @@
+bin.includes = feature.xml,\
+               feature.properties,\
+               epl-v10.html,\
+               eclipse_update_120.jpg,\
+               p2.inf
diff --git a/org.eclipse.virgo.site/org.eclipse.rap/epl-v10.html b/org.eclipse.virgo.site/org.eclipse.rap/epl-v10.html
new file mode 100755
index 0000000..3998fce
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.rap/epl-v10.html
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Public License - Version 1.0</title>
+<style type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </style>
+
+</head>
+
+<body lang="EN-US">
+
+<h2>Eclipse Public License - v 1.0</h2>
+
+<p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</p>
+
+<p><b>1. DEFINITIONS</b></p>
+
+<p>&quot;Contribution&quot; means:</p>
+
+<p class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</p>
+<p class="list">b) in the case of each subsequent Contributor:</p>
+<p class="list">i) changes to the Program, and</p>
+<p class="list">ii) additions to the Program;</p>
+<p class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</p>
+
+<p>&quot;Contributor&quot; means any person or entity that distributes
+the Program.</p>
+
+<p>&quot;Licensed Patents&quot; mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</p>
+
+<p>&quot;Program&quot; means the Contributions distributed in accordance
+with this Agreement.</p>
+
+<p>&quot;Recipient&quot; means anyone who receives the Program under
+this Agreement, including all Contributors.</p>
+
+<p><b>2. GRANT OF RIGHTS</b></p>
+
+<p class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</p>
+
+<p class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</p>
+
+<p class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</p>
+
+<p class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</p>
+
+<p><b>3. REQUIREMENTS</b></p>
+
+<p>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</p>
+
+<p class="list">a) it complies with the terms and conditions of this
+Agreement; and</p>
+
+<p class="list">b) its license agreement:</p>
+
+<p class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</p>
+
+<p class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</p>
+
+<p class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</p>
+
+<p class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</p>
+
+<p>When the Program is made available in source code form:</p>
+
+<p class="list">a) it must be made available under this Agreement; and</p>
+
+<p class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</p>
+
+<p>Contributors may not remove or alter any copyright notices contained
+within the Program.</p>
+
+<p>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</p>
+
+<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
+
+<p>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+(&quot;Commercial Contributor&quot;) hereby agrees to defend and
+indemnify every other Contributor (&quot;Indemnified Contributor&quot;)
+against any losses, damages and costs (collectively &quot;Losses&quot;)
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</p>
+
+<p>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</p>
+
+<p><b>5. NO WARRANTY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</p>
+
+<p><b>6. DISCLAIMER OF LIABILITY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
+
+<p><b>7. GENERAL</b></p>
+
+<p>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</p>
+
+<p>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</p>
+
+<p>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</p>
+
+<p>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</p>
+
+<p>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</p>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/org.eclipse.virgo.site/org.eclipse.rap/feature.properties b/org.eclipse.virgo.site/org.eclipse.rap/feature.properties
new file mode 100755
index 0000000..2779a2d
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.rap/feature.properties
@@ -0,0 +1,158 @@
+################################################################################
+# Copyright (c) 2007, 2015 Innoopract Informationssysteme GmbH and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#    Innoopract Informationssysteme GmbH - initial API and implementation
+#    EclipseSource - ongoing development
+################################################################################
+
+description = \
+Contains the RAP Runtime bundles.\n\
+Include it in your target platform to develop RAP applications.\n\
+*** DO NOT INSTALL IN YOUR IDE ***
+
+copyright = \
+Copyright (c) 2007, 2015 Innoopract Informationssysteme GmbH and others.\n\
+All rights reserved. This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License v1.0\n\
+which accompanies this distribution, and is available at\n\
+http://www.eclipse.org/legal/epl-v10.html\n\
+\n\
+Contributors:\n\
+   Innoopract Informationssysteme GmbH - initial API and implementation\n\
+   EclipseSource - ongoing development
+
+# "licenseURL" property - URL of the "Feature License"
+# do not translate value - just change to point to a locale-specific HTML page
+licenseURL=license.html
+
+# "license" property - text of the "Feature Update License"
+# should be plain text version of license agreement pointed to be "licenseURL"
+license=\
+Eclipse Foundation Software User Agreement\n\
+April 9, 2014\n\
+\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
+OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
+USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
+AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
+NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
+AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
+AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
+OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
+TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
+OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
+BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
+\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the\n\
+Eclipse Foundation is provided to you under the terms and conditions of\n\
+the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
+provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
+For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code,\n\
+documentation and other files maintained in the Eclipse Foundation source code\n\
+repository ("Repository") in software modules ("Modules") and made available\n\
+as downloadable archives ("Downloads").\n\
+\n\
+\t- Content may be structured and packaged into modules to facilitate delivering,\n\
+\t  extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
+\t  plug-in fragments ("Fragments"), and features ("Features").\n\
+\t- Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
+\t  in a directory named "plugins".\n\
+\t- A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
+\t  Each Feature may be packaged as a sub-directory in a directory named "features".\n\
+\t  Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
+\t  numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+\t- Features may also include other Features ("Included Features"). Within a Feature, files\n\
+\t  named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be\n\
+contained in files named "about.html" ("Abouts"). The terms and\n\
+conditions governing Features and Included Features should be contained\n\
+in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
+Licenses may be located in any directory of a Download or Module\n\
+including, but not limited to the following locations:\n\
+\n\
+\t- The top-level (root) directory\n\
+\t- Plug-in and Fragment directories\n\
+\t- Inside Plug-ins and Fragments packaged as JARs\n\
+\t- Sub-directories of the directory named "src" of certain Plug-ins\n\
+\t- Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
+Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
+Update License") during the installation process. If the Feature contains\n\
+Included Features, the Feature Update License should either provide you\n\
+with the terms and conditions governing the Included Features or inform\n\
+you where you can locate them. Feature Update Licenses may be found in\n\
+the "license" property of files named "feature.properties" found within a Feature.\n\
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
+terms and conditions (or references to such terms and conditions) that\n\
+govern your use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
+TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
+SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+\t- Eclipse Distribution License Version 1.0 (available at http://www.eclipse.org/licenses/edl-v1.0.html)\n\
+\t- Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+\t- Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+\t- Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+\t- Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
+TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
+is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
+govern that particular Content.\n\
+\n\
+\n\Use of Provisioning Technology\n\
+\n\
+The Eclipse Foundation makes available provisioning software, examples of which include,\n\
+but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
+the purpose of allowing users to install software, documentation, information and/or\n\
+other materials (collectively "Installable Software"). This capability is provided with\n\
+the intent of allowing such users to install, extend and update Eclipse-based products.\n\
+Information about packaging Installable Software is available at\n\
+http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
+\n\
+You may use Provisioning Technology to allow other parties to install Installable Software.\n\
+You shall be responsible for enabling the applicable license agreements relating to the\n\
+Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
+in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
+making it available in accordance with the Specification, you further acknowledge your\n\
+agreement to, and the acquisition of all necessary rights to permit the following:\n\
+\n\
+\t1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
+\t   the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
+\t   extending or updating the functionality of an Eclipse-based product.\n\
+\t2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
+\t   Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
+\t3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
+\t   govern the use of the Installable Software ("Installable Software Agreement") and such\n\
+\t   Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
+\t   with the Specification. Such Installable Software Agreement must inform the user of the\n\
+\t   terms and conditions that govern the Installable Software and must solicit acceptance by\n\
+\t   the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
+\t   indication of agreement by the user, the provisioning Technology will complete installation\n\
+\t   of the Installable Software.\n\
+\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are\n\
+currently may have restrictions on the import, possession, and use,\n\
+and/or re-export to another country, of encryption software. BEFORE\n\
+using any encryption software, please check the country's laws,\n\
+regulations and policies concerning the import, possession, or use, and\n\
+re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
+########### end of license property ##########################################
diff --git a/org.eclipse.virgo.site/org.eclipse.rap/feature.xml b/org.eclipse.virgo.site/org.eclipse.rap/feature.xml
new file mode 100755
index 0000000..e98b944
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.rap/feature.xml
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="org.eclipse.rap"
+      label="Virgo RAP Server components"
+      version="2.3.2.20150128-1013"
+      provider-name="Eclipse.org - Virgo RAP Server components">
+
+   <description url="http://www.eclipse.org/rap/">
+      %description
+   </description>
+
+   <copyright>
+      %copyright
+   </copyright>
+
+   <license url="%licenseURL">
+      %license
+   </license>
+
+   <url>
+      <update label="RAP 2.3 Repository" url="http://download.eclipse.org/rt/rap/2.3/"/>
+   </url>
+
+   <plugin
+         id="org.eclipse.rap.rwt"
+         download-size="2813"
+         install-size="7126"
+         version="2.3.2.20150128-1013"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.rap.rwt.osgi"
+         download-size="35"
+         install-size="78"
+         version="2.3.2.20150119-1706"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.rap.jface"
+         download-size="994"
+         install-size="1978"
+         version="2.3.2.20150119-1706"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.rap.jface.databinding"
+         download-size="266"
+         install-size="535"
+         version="2.3.2.20150119-1706"
+         unpack="false"/>
+
+ <!--
+   <plugin
+         id="org.eclipse.rap.ui"
+         download-size="155"
+         install-size="274"
+         version="2.3.2.20150119-1706"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.rap.ui.forms"
+         download-size="285"
+         install-size="575"
+         version="2.3.2.20150119-1706"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.rap.ui.views"
+         download-size="76"
+         install-size="142"
+         version="2.3.2.20150119-1706"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.rap.ui.workbench"
+         download-size="3473"
+         install-size="7209"
+         version="2.3.2.20150119-1706"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.rap.ui.cheatsheets"
+         download-size="310"
+         install-size="634"
+         version="2.3.2.20150119-1706"
+         unpack="false"/>
+-->
+
+</feature>
diff --git a/org.eclipse.virgo.site/org.eclipse.rap/license.html b/org.eclipse.virgo.site/org.eclipse.rap/license.html
new file mode 100755
index 0000000..c3d34c3
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.rap/license.html
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Foundation Software User Agreement</title>
+</head>
+
+<body lang="EN-US">
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>April 9, 2014</p>
+
+<h3>Usage Of Content</h3>
+
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
+
+<h3>Applicable Licenses</h3>
+
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
+   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
+
+<ul>
+       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
+       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
+       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
+      and/or Fragments associated with that Feature.</li>
+       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
+Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+       <li>The top-level (root) directory</li>
+       <li>Plug-in and Fragment directories</li>
+       <li>Inside Plug-ins and Fragments packaged as JARs</li>
+       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
+       <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
+installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+       <li>Eclipse Distribution License Version 1.0 (available at <a href="http://www.eclipse.org/licenses/edl-v10.html">http://www.eclipse.org/licenses/edl-v1.0.html</a>)</li>
+       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+
+<h3>Use of Provisioning Technology</h3>
+
+<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
+   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
+   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
+   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
+       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
+   (&quot;Specification&quot;).</p>
+
+<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
+   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
+   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
+   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
+
+<ol>
+       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
+       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
+       product.</li>
+       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
+       accessed and copied to the Target Machine.</li>
+       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
+       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
+       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
+       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
+       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
+</ol>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+
+<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
+</body>
+</html>
diff --git a/org.eclipse.virgo.site/org.eclipse.rap/p2.inf b/org.eclipse.virgo.site/org.eclipse.rap/p2.inf
new file mode 100755
index 0000000..e57a5b9
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.rap/p2.inf
@@ -0,0 +1,41 @@
+# Prevent installation if other IUs are already installed with a negative requirement.
+
+requires.0.name = org.eclipse.jface
+requires.0.namespace = org.eclipse.equinox.p2.iu
+requires.0.min = 0
+requires.0.max = 0
+
+requires.1.name = org.eclipse.jface.databinding
+requires.1.namespace = org.eclipse.equinox.p2.iu
+requires.1.min = 0
+requires.1.max = 0
+
+requires.2.name = org.eclipse.swt
+requires.2.namespace = org.eclipse.equinox.p2.iu
+requires.2.min = 0
+requires.2.max = 0
+
+requires.3.name = org.eclipse.ui
+requires.3.namespace = org.eclipse.equinox.p2.iu
+requires.3.min = 0
+requires.3.max = 0
+
+requires.4.name = org.eclipse.ui.cheatsheets
+requires.4.namespace = org.eclipse.equinox.p2.iu
+requires.4.min = 0
+requires.4.max = 0
+
+requires.5.name = org.eclipse.ui.forms
+requires.5.namespace = org.eclipse.equinox.p2.iu
+requires.5.min = 0
+requires.5.max = 0
+
+requires.6.name = org.eclipse.ui.views
+requires.6.namespace = org.eclipse.equinox.p2.iu
+requires.6.min = 0
+requires.6.max = 0
+
+requires.7.name = org.eclipse.ui.workbench
+requires.7.namespace = org.eclipse.equinox.p2.iu
+requires.7.min = 0
+requires.7.max = 0
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.core/build.gradle b/org.eclipse.virgo.site/org.eclipse.virgo.core/build.gradle
new file mode 100644
index 0000000..32bcbb5
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.core/build.gradle
@@ -0,0 +1 @@
+apply plugin: eclipsebuild.FeaturePlugin
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.core/build.properties b/org.eclipse.virgo.site/org.eclipse.virgo.core/build.properties
new file mode 100644
index 0000000..db80add
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.core/build.properties
@@ -0,0 +1,4 @@
+bin.includes = feature.xml,\
+               feature.properties,\
+               epl-v10.html,\
+               eclipse_update_120.jpg
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.core/eclipse_update_120.jpg b/org.eclipse.virgo.site/org.eclipse.virgo.core/eclipse_update_120.jpg
new file mode 100755
index 0000000..bfdf708
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.core/eclipse_update_120.jpg
Binary files differ
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.core/epl-v10.html b/org.eclipse.virgo.site/org.eclipse.virgo.core/epl-v10.html
new file mode 100755
index 0000000..eecc800
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.core/epl-v10.html
@@ -0,0 +1,258 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!-- saved from url=(0049)http://www.eclipse.org/org/documents/epl-v10.html -->
+<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+
+<TITLE>Eclipse Public License - Version 1.0</TITLE>
+<STYLE type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </STYLE>
+
+</HEAD><BODY lang="EN-US">
+
+<H2>Eclipse Public License - v 1.0</H2>
+
+<P>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</P>
+
+<P><B>1. DEFINITIONS</B></P>
+
+<P>"Contribution" means:</P>
+
+<P class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</P>
+<P class="list">b) in the case of each subsequent Contributor:</P>
+<P class="list">i) changes to the Program, and</P>
+<P class="list">ii) additions to the Program;</P>
+<P class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</P>
+
+<P>"Contributor" means any person or entity that distributes
+the Program.</P>
+
+<P>"Licensed Patents" mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</P>
+
+<P>"Program" means the Contributions distributed in accordance
+with this Agreement.</P>
+
+<P>"Recipient" means anyone who receives the Program under
+this Agreement, including all Contributors.</P>
+
+<P><B>2. GRANT OF RIGHTS</B></P>
+
+<P class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</P>
+
+<P class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</P>
+
+<P class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</P>
+
+<P class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</P>
+
+<P><B>3. REQUIREMENTS</B></P>
+
+<P>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</P>
+
+<P class="list">a) it complies with the terms and conditions of this
+Agreement; and</P>
+
+<P class="list">b) its license agreement:</P>
+
+<P class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</P>
+
+<P class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</P>
+
+<P class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</P>
+
+<P class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</P>
+
+<P>When the Program is made available in source code form:</P>
+
+<P class="list">a) it must be made available under this Agreement; and</P>
+
+<P class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</P>
+
+<P>Contributors may not remove or alter any copyright notices contained
+within the Program.</P>
+
+<P>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</P>
+
+<P><B>4. COMMERCIAL DISTRIBUTION</B></P>
+
+<P>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+("Commercial Contributor") hereby agrees to defend and
+indemnify every other Contributor ("Indemnified Contributor")
+against any losses, damages and costs (collectively "Losses")
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</P>
+
+<P>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</P>
+
+<P><B>5. NO WARRANTY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</P>
+
+<P><B>6. DISCLAIMER OF LIABILITY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</P>
+
+<P><B>7. GENERAL</B></P>
+
+<P>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</P>
+
+<P>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</P>
+
+<P>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</P>
+
+<P>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</P>
+
+<P>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</P>
+
+
+
+
+</BODY></HTML>
\ No newline at end of file
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.core/feature.properties b/org.eclipse.virgo.site/org.eclipse.virgo.core/feature.properties
new file mode 100644
index 0000000..3e16034
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.core/feature.properties
@@ -0,0 +1,180 @@
+###############################################################################
+# Copyright (c) 2011 SAP AG
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# and Apache License v2.0 which accompanies this distribution.
+# The Eclipse Public License is available at
+#   http://www.eclipse.org/legal/epl-v10.html
+# and the Apache License v2.0 is available at
+#   http://www.opensource.org/licenses/apache2.0.php.
+# You may elect to redistribute this code under either of these licenses.
+#
+# Contributors:
+#   Borislav Kapukaranov - initial contribution
+###############################################################################
+# feature.properties
+# contains externalized strings for feature.xml
+# "%foo" in feature.xml corresponds to the key "foo" in this file
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# This file should be translated.
+
+# "featureName" property - name of the feature
+featureName=Eclipse Virgo Core Feature
+
+# "providerName" property - name of the company that provides the feature
+providerName=Eclipse.org
+
+# "updateSiteName" property - label for the update site
+
+# "description" property - description of the feature
+description=This feature provides the Core features of a Eclipse Virgo OSGi container such as enhanced supportability and deployment mechanisms.\n\
+
+# "copyright" property - text of the "Feature Update Copyright"
+copyright=\
+Copyright (c) 2009, 2010, 2011 VMware Inc. and others\n\
+\n\
+All rights reserved. This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License v1.0\n\
+and Apache License v2.0 which accompanies this distribution.\n\
+The Eclipse Public License is available at\n\
+http://www.eclipse.org/legal/epl-v10.html\n\
+and the Apache License v2.0 is available at\n\
+http://www.opensource.org/licenses/apache2.0.php.\n\
+You may elect to redistribute this code under either of these\n\
+licenses.\n\
+\n\
+Contributors:\n\
+VMware Inc. - initial contribution\n\
+
+# "licenseURL" property - URL of the "Feature License"
+# do not translate value - just change to point to a locale-specific HTML page
+licenseURL=license.html
+
+# "license" property - text of the "Feature Update License"
+# should be plain text version of license agreement pointed to be "licenseURL"
+license=\
+Eclipse Foundation Software User Agreement\n\
+February 1, 2011\n\
+\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
+OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
+USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
+AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
+NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
+AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
+AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
+OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
+TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
+OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
+BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
+\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the\n\
+Eclipse Foundation is provided to you under the terms and conditions of\n\
+the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
+provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
+For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code,\n\
+documentation and other files maintained in the Eclipse Foundation source code\n\
+repository ("Repository") in software modules ("Modules") and made available\n\
+as downloadable archives ("Downloads").\n\
+\n\
+       - Content may be structured and packaged into modules to facilitate delivering,\n\
+         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
+         plug-in fragments ("Fragments"), and features ("Features").\n\
+       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
+         in a directory named "plugins".\n\
+       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
+         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
+         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
+         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
+         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be\n\
+contained in files named "about.html" ("Abouts"). The terms and\n\
+conditions governing Features and Included Features should be contained\n\
+in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
+Licenses may be located in any directory of a Download or Module\n\
+including, but not limited to the following locations:\n\
+\n\
+       - The top-level (root) directory\n\
+       - Plug-in and Fragment directories\n\
+       - Inside Plug-ins and Fragments packaged as JARs\n\
+       - Sub-directories of the directory named "src" of certain Plug-ins\n\
+       - Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
+Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
+Update License") during the installation process. If the Feature contains\n\
+Included Features, the Feature Update License should either provide you\n\
+with the terms and conditions governing the Included Features or inform\n\
+you where you can locate them. Feature Update Licenses may be found in\n\
+the "license" property of files named "feature.properties" found within a Feature.\n\
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
+terms and conditions (or references to such terms and conditions) that\n\
+govern your use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
+TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
+SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+       - Eclipse Distribution License Version 1.0 (available at http://www.eclipse.org/licenses/edl-v1.0.html)\n\
+       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
+TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
+is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
+govern that particular Content.\n\
+\n\
+\n\Use of Provisioning Technology\n\
+\n\
+The Eclipse Foundation makes available provisioning software, examples of which include,\n\
+but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
+the purpose of allowing users to install software, documentation, information and/or\n\
+other materials (collectively "Installable Software"). This capability is provided with\n\
+the intent of allowing such users to install, extend and update Eclipse-based products.\n\
+Information about packaging Installable Software is available at\n\
+http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
+\n\
+You may use Provisioning Technology to allow other parties to install Installable Software.\n\
+You shall be responsible for enabling the applicable license agreements relating to the\n\
+Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
+in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
+making it available in accordance with the Specification, you further acknowledge your\n\
+agreement to, and the acquisition of all necessary rights to permit the following:\n\
+\n\
+       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
+          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
+          extending or updating the functionality of an Eclipse-based product.\n\
+       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
+          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
+       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
+          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
+          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
+          with the Specification. Such Installable Software Agreement must inform the user of the\n\
+          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
+          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
+          indication of agreement by the user, the provisioning Technology will complete installation\n\
+          of the Installable Software.\n\
+\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are\n\
+currently may have restrictions on the import, possession, and use,\n\
+and/or re-export to another country, of encryption software. BEFORE\n\
+using any encryption software, please check the country's laws,\n\
+regulations and policies concerning the import, possession, or use, and\n\
+re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
+########### end of license property ##########################################
\ No newline at end of file
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.core/feature.xml b/org.eclipse.virgo.site/org.eclipse.virgo.core/feature.xml
new file mode 100755
index 0000000..b53f5b1
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.core/feature.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="org.eclipse.virgo.core"
+      label="%featureName"
+      version="@VIRGO.VERSION@"
+      provider-name="%providerName"
+      image="eclipse_update_120.jpg">
+
+   <description url="http://www.eclipse.org/virgo/">
+      %description
+   </description>
+
+   <copyright url="http://www.eclipse.org/virgo/">
+      %copyright
+   </copyright>
+
+   <license url="%licenseURL">
+      %license
+   </license>
+
+   <requires>
+      <import feature="org.eclipse.virgo.ds" version="0.0.0"/>
+   </requires>
+
+   <plugin
+         id="org.eclipse.virgo.nano.core"
+         download-size="0"
+         install-size="0"
+         version="@VIRGO.VERSION@"
+         unpack="false"
+         autostart="true"/>
+    <plugin
+         id="org.eclipse.virgo.nano.deployer.api"
+         download-size="0"
+         install-size="0"
+         version="@VIRGO.VERSION@"
+         unpack="false"/>
+    <plugin
+         id="org.eclipse.virgo.nano.deployer.hot"
+         download-size="0"
+         install-size="0"
+         version="@VIRGO.VERSION@"
+         unpack="false"/>
+
+</feature>
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.core/license.html b/org.eclipse.virgo.site/org.eclipse.virgo.core/license.html
new file mode 100755
index 0000000..f19c483
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.core/license.html
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Foundation Software User Agreement</title>
+</head>
+
+<body lang="EN-US">
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>February 1, 2011</p>
+
+<h3>Usage Of Content</h3>
+
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
+
+<h3>Applicable Licenses</h3>
+
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
+   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
+
+<ul>
+       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
+       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
+       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
+      and/or Fragments associated with that Feature.</li>
+       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
+Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+       <li>The top-level (root) directory</li>
+       <li>Plug-in and Fragment directories</li>
+       <li>Inside Plug-ins and Fragments packaged as JARs</li>
+       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
+       <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
+installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+       <li>Eclipse Distribution License Version 1.0 (available at <a href="http://www.eclipse.org/licenses/edl-v10.html">http://www.eclipse.org/licenses/edl-v1.0.html</a>)</li>
+       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+
+<h3>Use of Provisioning Technology</h3>
+
+<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
+   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
+   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
+   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
+       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
+   (&quot;Specification&quot;).</p>
+
+<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
+   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
+   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
+   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
+
+<ol>
+       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
+       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
+       product.</li>
+       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
+       accessed and copied to the Target Machine.</li>
+       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
+       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
+       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
+       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
+       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
+</ol>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+
+<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
+</body>
+</html>
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.ds/build.gradle b/org.eclipse.virgo.site/org.eclipse.virgo.ds/build.gradle
new file mode 100644
index 0000000..32bcbb5
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.ds/build.gradle
@@ -0,0 +1 @@
+apply plugin: eclipsebuild.FeaturePlugin
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.ds/build.properties b/org.eclipse.virgo.site/org.eclipse.virgo.ds/build.properties
new file mode 100644
index 0000000..a13e18b
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.ds/build.properties
@@ -0,0 +1,5 @@
+bin.includes = feature.xml,\
+               feature.properties,\
+               epl-v10.html,\
+               eclipse_update_120.jpg,\
+               p2.inf
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.ds/eclipse_update_120.jpg b/org.eclipse.virgo.site/org.eclipse.virgo.ds/eclipse_update_120.jpg
new file mode 100755
index 0000000..bfdf708
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.ds/eclipse_update_120.jpg
Binary files differ
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.ds/epl-v10.html b/org.eclipse.virgo.site/org.eclipse.virgo.ds/epl-v10.html
new file mode 100755
index 0000000..eecc800
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.ds/epl-v10.html
@@ -0,0 +1,258 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!-- saved from url=(0049)http://www.eclipse.org/org/documents/epl-v10.html -->
+<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+
+<TITLE>Eclipse Public License - Version 1.0</TITLE>
+<STYLE type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </STYLE>
+
+</HEAD><BODY lang="EN-US">
+
+<H2>Eclipse Public License - v 1.0</H2>
+
+<P>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</P>
+
+<P><B>1. DEFINITIONS</B></P>
+
+<P>"Contribution" means:</P>
+
+<P class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</P>
+<P class="list">b) in the case of each subsequent Contributor:</P>
+<P class="list">i) changes to the Program, and</P>
+<P class="list">ii) additions to the Program;</P>
+<P class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</P>
+
+<P>"Contributor" means any person or entity that distributes
+the Program.</P>
+
+<P>"Licensed Patents" mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</P>
+
+<P>"Program" means the Contributions distributed in accordance
+with this Agreement.</P>
+
+<P>"Recipient" means anyone who receives the Program under
+this Agreement, including all Contributors.</P>
+
+<P><B>2. GRANT OF RIGHTS</B></P>
+
+<P class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</P>
+
+<P class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</P>
+
+<P class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</P>
+
+<P class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</P>
+
+<P><B>3. REQUIREMENTS</B></P>
+
+<P>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</P>
+
+<P class="list">a) it complies with the terms and conditions of this
+Agreement; and</P>
+
+<P class="list">b) its license agreement:</P>
+
+<P class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</P>
+
+<P class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</P>
+
+<P class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</P>
+
+<P class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</P>
+
+<P>When the Program is made available in source code form:</P>
+
+<P class="list">a) it must be made available under this Agreement; and</P>
+
+<P class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</P>
+
+<P>Contributors may not remove or alter any copyright notices contained
+within the Program.</P>
+
+<P>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</P>
+
+<P><B>4. COMMERCIAL DISTRIBUTION</B></P>
+
+<P>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+("Commercial Contributor") hereby agrees to defend and
+indemnify every other Contributor ("Indemnified Contributor")
+against any losses, damages and costs (collectively "Losses")
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</P>
+
+<P>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</P>
+
+<P><B>5. NO WARRANTY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</P>
+
+<P><B>6. DISCLAIMER OF LIABILITY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</P>
+
+<P><B>7. GENERAL</B></P>
+
+<P>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</P>
+
+<P>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</P>
+
+<P>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</P>
+
+<P>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</P>
+
+<P>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</P>
+
+
+
+
+</BODY></HTML>
\ No newline at end of file
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.ds/feature.properties b/org.eclipse.virgo.site/org.eclipse.virgo.ds/feature.properties
new file mode 100644
index 0000000..899db35
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.ds/feature.properties
@@ -0,0 +1,180 @@
+###############################################################################
+# Copyright (c) 2011 SAP AG
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# and Apache License v2.0 which accompanies this distribution.
+# The Eclipse Public License is available at
+#   http://www.eclipse.org/legal/epl-v10.html
+# and the Apache License v2.0 is available at
+#   http://www.opensource.org/licenses/apache2.0.php.
+# You may elect to redistribute this code under either of these licenses.
+#
+# Contributors:
+#   Borislav Kapukaranov - initial contribution
+###############################################################################
+# feature.properties
+# contains externalized strings for feature.xml
+# "%foo" in feature.xml corresponds to the key "foo" in this file
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# This file should be translated.
+
+# "featureName" property - name of the feature
+featureName=Eclipse Equinox Declarative Services Feature
+
+# "providerName" property - name of the company that provides the feature
+providerName=Eclipse.org
+
+# "updateSiteName" property - label for the update site
+
+# "description" property - description of the feature
+description=This feature provides the Equinox Declarative Services feature.\n\
+
+# "copyright" property - text of the "Feature Update Copyright"
+copyright=\
+Copyright (c) 2009, 2010, 2011 VMware Inc. and others\n\
+\n\
+All rights reserved. This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License v1.0\n\
+and Apache License v2.0 which accompanies this distribution.\n\
+The Eclipse Public License is available at\n\
+http://www.eclipse.org/legal/epl-v10.html\n\
+and the Apache License v2.0 is available at\n\
+http://www.opensource.org/licenses/apache2.0.php.\n\
+You may elect to redistribute this code under either of these\n\
+licenses.\n\
+\n\
+Contributors:\n\
+VMware Inc. - initial contribution\n\
+
+# "licenseURL" property - URL of the "Feature License"
+# do not translate value - just change to point to a locale-specific HTML page
+licenseURL=license.html
+
+# "license" property - text of the "Feature Update License"
+# should be plain text version of license agreement pointed to be "licenseURL"
+license=\
+Eclipse Foundation Software User Agreement\n\
+February 1, 2011\n\
+\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
+OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
+USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
+AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
+NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
+AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
+AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
+OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
+TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
+OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
+BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
+\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the\n\
+Eclipse Foundation is provided to you under the terms and conditions of\n\
+the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
+provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
+For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code,\n\
+documentation and other files maintained in the Eclipse Foundation source code\n\
+repository ("Repository") in software modules ("Modules") and made available\n\
+as downloadable archives ("Downloads").\n\
+\n\
+       - Content may be structured and packaged into modules to facilitate delivering,\n\
+         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
+         plug-in fragments ("Fragments"), and features ("Features").\n\
+       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
+         in a directory named "plugins".\n\
+       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
+         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
+         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
+         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
+         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be\n\
+contained in files named "about.html" ("Abouts"). The terms and\n\
+conditions governing Features and Included Features should be contained\n\
+in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
+Licenses may be located in any directory of a Download or Module\n\
+including, but not limited to the following locations:\n\
+\n\
+       - The top-level (root) directory\n\
+       - Plug-in and Fragment directories\n\
+       - Inside Plug-ins and Fragments packaged as JARs\n\
+       - Sub-directories of the directory named "src" of certain Plug-ins\n\
+       - Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
+Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
+Update License") during the installation process. If the Feature contains\n\
+Included Features, the Feature Update License should either provide you\n\
+with the terms and conditions governing the Included Features or inform\n\
+you where you can locate them. Feature Update Licenses may be found in\n\
+the "license" property of files named "feature.properties" found within a Feature.\n\
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
+terms and conditions (or references to such terms and conditions) that\n\
+govern your use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
+TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
+SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+       - Eclipse Distribution License Version 1.0 (available at http://www.eclipse.org/licenses/edl-v1.0.html)\n\
+       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
+TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
+is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
+govern that particular Content.\n\
+\n\
+\n\Use of Provisioning Technology\n\
+\n\
+The Eclipse Foundation makes available provisioning software, examples of which include,\n\
+but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
+the purpose of allowing users to install software, documentation, information and/or\n\
+other materials (collectively "Installable Software"). This capability is provided with\n\
+the intent of allowing such users to install, extend and update Eclipse-based products.\n\
+Information about packaging Installable Software is available at\n\
+http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
+\n\
+You may use Provisioning Technology to allow other parties to install Installable Software.\n\
+You shall be responsible for enabling the applicable license agreements relating to the\n\
+Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
+in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
+making it available in accordance with the Specification, you further acknowledge your\n\
+agreement to, and the acquisition of all necessary rights to permit the following:\n\
+\n\
+       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
+          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
+          extending or updating the functionality of an Eclipse-based product.\n\
+       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
+          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
+       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
+          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
+          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
+          with the Specification. Such Installable Software Agreement must inform the user of the\n\
+          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
+          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
+          indication of agreement by the user, the provisioning Technology will complete installation\n\
+          of the Installable Software.\n\
+\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are\n\
+currently may have restrictions on the import, possession, and use,\n\
+and/or re-export to another country, of encryption software. BEFORE\n\
+using any encryption software, please check the country's laws,\n\
+regulations and policies concerning the import, possession, or use, and\n\
+re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
+########### end of license property ##########################################
\ No newline at end of file
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.ds/feature.xml b/org.eclipse.virgo.site/org.eclipse.virgo.ds/feature.xml
new file mode 100755
index 0000000..19c643f
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.ds/feature.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="org.eclipse.virgo.ds"
+      label="%featureName"
+      version="@EQUINOX.DS.VERSION@"
+      provider-name="%providerName"
+      image="eclipse_update_120.jpg">
+
+   <description url="http://www.eclipse.org/virgo/">
+      %description
+   </description>
+
+   <copyright url="http://www.eclipse.org/virgo/">
+      %copyright
+   </copyright>
+
+   <license url="%licenseURL">
+      %license
+   </license>
+
+   <plugin
+         id="org.eclipse.equinox.ds"
+         download-size="0"
+         install-size="0"
+         version="@EQUINOX.DS.VERSION@"
+         unpack="false"/>
+
+</feature>
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.ds/license.html b/org.eclipse.virgo.site/org.eclipse.virgo.ds/license.html
new file mode 100755
index 0000000..f19c483
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.ds/license.html
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Foundation Software User Agreement</title>
+</head>
+
+<body lang="EN-US">
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>February 1, 2011</p>
+
+<h3>Usage Of Content</h3>
+
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
+
+<h3>Applicable Licenses</h3>
+
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
+   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
+
+<ul>
+       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
+       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
+       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
+      and/or Fragments associated with that Feature.</li>
+       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
+Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+       <li>The top-level (root) directory</li>
+       <li>Plug-in and Fragment directories</li>
+       <li>Inside Plug-ins and Fragments packaged as JARs</li>
+       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
+       <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
+installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+       <li>Eclipse Distribution License Version 1.0 (available at <a href="http://www.eclipse.org/licenses/edl-v10.html">http://www.eclipse.org/licenses/edl-v1.0.html</a>)</li>
+       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+
+<h3>Use of Provisioning Technology</h3>
+
+<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
+   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
+   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
+   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
+       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
+   (&quot;Specification&quot;).</p>
+
+<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
+   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
+   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
+   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
+
+<ol>
+       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
+       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
+       product.</li>
+       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
+       accessed and copied to the Target Machine.</li>
+       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
+       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
+       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
+       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
+       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
+</ol>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+
+<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
+</body>
+</html>
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.enterprise/build.gradle b/org.eclipse.virgo.site/org.eclipse.virgo.enterprise/build.gradle
new file mode 100644
index 0000000..32bcbb5
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.enterprise/build.gradle
@@ -0,0 +1 @@
+apply plugin: eclipsebuild.FeaturePlugin
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.enterprise/build.properties b/org.eclipse.virgo.site/org.eclipse.virgo.enterprise/build.properties
new file mode 100644
index 0000000..a13e18b
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.enterprise/build.properties
@@ -0,0 +1,5 @@
+bin.includes = feature.xml,\
+               feature.properties,\
+               epl-v10.html,\
+               eclipse_update_120.jpg,\
+               p2.inf
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.enterprise/eclipse_update_120.jpg b/org.eclipse.virgo.site/org.eclipse.virgo.enterprise/eclipse_update_120.jpg
new file mode 100755
index 0000000..bfdf708
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.enterprise/eclipse_update_120.jpg
Binary files differ
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.enterprise/epl-v10.html b/org.eclipse.virgo.site/org.eclipse.virgo.enterprise/epl-v10.html
new file mode 100755
index 0000000..eecc800
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.enterprise/epl-v10.html
@@ -0,0 +1,258 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!-- saved from url=(0049)http://www.eclipse.org/org/documents/epl-v10.html -->
+<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+
+<TITLE>Eclipse Public License - Version 1.0</TITLE>
+<STYLE type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </STYLE>
+
+</HEAD><BODY lang="EN-US">
+
+<H2>Eclipse Public License - v 1.0</H2>
+
+<P>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</P>
+
+<P><B>1. DEFINITIONS</B></P>
+
+<P>"Contribution" means:</P>
+
+<P class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</P>
+<P class="list">b) in the case of each subsequent Contributor:</P>
+<P class="list">i) changes to the Program, and</P>
+<P class="list">ii) additions to the Program;</P>
+<P class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</P>
+
+<P>"Contributor" means any person or entity that distributes
+the Program.</P>
+
+<P>"Licensed Patents" mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</P>
+
+<P>"Program" means the Contributions distributed in accordance
+with this Agreement.</P>
+
+<P>"Recipient" means anyone who receives the Program under
+this Agreement, including all Contributors.</P>
+
+<P><B>2. GRANT OF RIGHTS</B></P>
+
+<P class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</P>
+
+<P class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</P>
+
+<P class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</P>
+
+<P class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</P>
+
+<P><B>3. REQUIREMENTS</B></P>
+
+<P>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</P>
+
+<P class="list">a) it complies with the terms and conditions of this
+Agreement; and</P>
+
+<P class="list">b) its license agreement:</P>
+
+<P class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</P>
+
+<P class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</P>
+
+<P class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</P>
+
+<P class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</P>
+
+<P>When the Program is made available in source code form:</P>
+
+<P class="list">a) it must be made available under this Agreement; and</P>
+
+<P class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</P>
+
+<P>Contributors may not remove or alter any copyright notices contained
+within the Program.</P>
+
+<P>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</P>
+
+<P><B>4. COMMERCIAL DISTRIBUTION</B></P>
+
+<P>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+("Commercial Contributor") hereby agrees to defend and
+indemnify every other Contributor ("Indemnified Contributor")
+against any losses, damages and costs (collectively "Losses")
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</P>
+
+<P>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</P>
+
+<P><B>5. NO WARRANTY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</P>
+
+<P><B>6. DISCLAIMER OF LIABILITY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</P>
+
+<P><B>7. GENERAL</B></P>
+
+<P>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</P>
+
+<P>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</P>
+
+<P>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</P>
+
+<P>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</P>
+
+<P>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</P>
+
+
+
+
+</BODY></HTML>
\ No newline at end of file
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.enterprise/feature.properties b/org.eclipse.virgo.site/org.eclipse.virgo.enterprise/feature.properties
new file mode 100644
index 0000000..99c78c0
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.enterprise/feature.properties
@@ -0,0 +1,180 @@
+###############################################################################
+# Copyright (c) 2011 SAP AG
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# and Apache License v2.0 which accompanies this distribution.
+# The Eclipse Public License is available at
+#   http://www.eclipse.org/legal/epl-v10.html
+# and the Apache License v2.0 is available at
+#   http://www.opensource.org/licenses/apache2.0.php.
+# You may elect to redistribute this code under either of these licenses.
+#
+# Contributors:
+#   Borislav Kapukaranov - initial contribution
+###############################################################################
+# feature.properties
+# contains externalized strings for feature.xml
+# "%foo" in feature.xml corresponds to the key "foo" in this file
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# This file should be translated.
+
+# "featureName" property - name of the feature
+featureName=Eclipse Virgo Web Enterprise Integration
+
+# "providerName" property - name of the company that provides the feature
+providerName=Eclipse.org
+
+# "updateSiteName" property - label for the update site
+
+# "description" property - description of the feature
+description=This feature provides the enterprise Virgo Web features.\n\
+
+# "copyright" property - text of the "Feature Update Copyright"
+copyright=\
+Copyright (c) 2009, 2010, 2011 VMware Inc. and others\n\
+\n\
+All rights reserved. This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License v1.0\n\
+and Apache License v2.0 which accompanies this distribution.\n\
+The Eclipse Public License is available at\n\
+http://www.eclipse.org/legal/epl-v10.html\n\
+and the Apache License v2.0 is available at\n\
+http://www.opensource.org/licenses/apache2.0.php.\n\
+You may elect to redistribute this code under either of these\n\
+licenses.\n\
+\n\
+Contributors:\n\
+VMware Inc. - initial contribution\n\
+
+# "licenseURL" property - URL of the "Feature License"
+# do not translate value - just change to point to a locale-specific HTML page
+licenseURL=license.html
+
+# "license" property - text of the "Feature Update License"
+# should be plain text version of license agreement pointed to be "licenseURL"
+license=\
+Eclipse Foundation Software User Agreement\n\
+February 1, 2011\n\
+\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
+OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
+USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
+AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
+NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
+AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
+AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
+OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
+TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
+OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
+BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
+\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the\n\
+Eclipse Foundation is provided to you under the terms and conditions of\n\
+the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
+provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
+For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code,\n\
+documentation and other files maintained in the Eclipse Foundation source code\n\
+repository ("Repository") in software modules ("Modules") and made available\n\
+as downloadable archives ("Downloads").\n\
+\n\
+       - Content may be structured and packaged into modules to facilitate delivering,\n\
+         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
+         plug-in fragments ("Fragments"), and features ("Features").\n\
+       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
+         in a directory named "plugins".\n\
+       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
+         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
+         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
+         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
+         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be\n\
+contained in files named "about.html" ("Abouts"). The terms and\n\
+conditions governing Features and Included Features should be contained\n\
+in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
+Licenses may be located in any directory of a Download or Module\n\
+including, but not limited to the following locations:\n\
+\n\
+       - The top-level (root) directory\n\
+       - Plug-in and Fragment directories\n\
+       - Inside Plug-ins and Fragments packaged as JARs\n\
+       - Sub-directories of the directory named "src" of certain Plug-ins\n\
+       - Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
+Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
+Update License") during the installation process. If the Feature contains\n\
+Included Features, the Feature Update License should either provide you\n\
+with the terms and conditions governing the Included Features or inform\n\
+you where you can locate them. Feature Update Licenses may be found in\n\
+the "license" property of files named "feature.properties" found within a Feature.\n\
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
+terms and conditions (or references to such terms and conditions) that\n\
+govern your use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
+TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
+SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+       - Eclipse Distribution License Version 1.0 (available at http://www.eclipse.org/licenses/edl-v1.0.html)\n\
+       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
+TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
+is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
+govern that particular Content.\n\
+\n\
+\n\Use of Provisioning Technology\n\
+\n\
+The Eclipse Foundation makes available provisioning software, examples of which include,\n\
+but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
+the purpose of allowing users to install software, documentation, information and/or\n\
+other materials (collectively "Installable Software"). This capability is provided with\n\
+the intent of allowing such users to install, extend and update Eclipse-based products.\n\
+Information about packaging Installable Software is available at\n\
+http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
+\n\
+You may use Provisioning Technology to allow other parties to install Installable Software.\n\
+You shall be responsible for enabling the applicable license agreements relating to the\n\
+Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
+in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
+making it available in accordance with the Specification, you further acknowledge your\n\
+agreement to, and the acquisition of all necessary rights to permit the following:\n\
+\n\
+       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
+          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
+          extending or updating the functionality of an Eclipse-based product.\n\
+       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
+          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
+       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
+          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
+          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
+          with the Specification. Such Installable Software Agreement must inform the user of the\n\
+          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
+          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
+          indication of agreement by the user, the provisioning Technology will complete installation\n\
+          of the Installable Software.\n\
+\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are\n\
+currently may have restrictions on the import, possession, and use,\n\
+and/or re-export to another country, of encryption software. BEFORE\n\
+using any encryption software, please check the country's laws,\n\
+regulations and policies concerning the import, possession, or use, and\n\
+re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
+########### end of license property ##########################################
\ No newline at end of file
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.enterprise/feature.xml b/org.eclipse.virgo.site/org.eclipse.virgo.enterprise/feature.xml
new file mode 100755
index 0000000..a0d1834
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.enterprise/feature.xml
Binary files differ
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.enterprise/license.html b/org.eclipse.virgo.site/org.eclipse.virgo.enterprise/license.html
new file mode 100755
index 0000000..f19c483
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.enterprise/license.html
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Foundation Software User Agreement</title>
+</head>
+
+<body lang="EN-US">
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>February 1, 2011</p>
+
+<h3>Usage Of Content</h3>
+
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
+
+<h3>Applicable Licenses</h3>
+
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
+   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
+
+<ul>
+       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
+       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
+       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
+      and/or Fragments associated with that Feature.</li>
+       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
+Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+       <li>The top-level (root) directory</li>
+       <li>Plug-in and Fragment directories</li>
+       <li>Inside Plug-ins and Fragments packaged as JARs</li>
+       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
+       <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
+installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+       <li>Eclipse Distribution License Version 1.0 (available at <a href="http://www.eclipse.org/licenses/edl-v10.html">http://www.eclipse.org/licenses/edl-v1.0.html</a>)</li>
+       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+
+<h3>Use of Provisioning Technology</h3>
+
+<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
+   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
+   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
+   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
+       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
+   (&quot;Specification&quot;).</p>
+
+<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
+   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
+   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
+   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
+
+<ol>
+       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
+       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
+       product.</li>
+       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
+       accessed and copied to the Target Machine.</li>
+       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
+       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
+       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
+       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
+       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
+</ol>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+
+<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
+</body>
+</html>
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.kernel.springintegration/build.gradle b/org.eclipse.virgo.site/org.eclipse.virgo.kernel.springintegration/build.gradle
new file mode 100644
index 0000000..32bcbb5
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.kernel.springintegration/build.gradle
@@ -0,0 +1 @@
+apply plugin: eclipsebuild.FeaturePlugin
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.kernel.springintegration/build.properties b/org.eclipse.virgo.site/org.eclipse.virgo.kernel.springintegration/build.properties
new file mode 100644
index 0000000..db80add
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.kernel.springintegration/build.properties
@@ -0,0 +1,4 @@
+bin.includes = feature.xml,\
+               feature.properties,\
+               epl-v10.html,\
+               eclipse_update_120.jpg
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.kernel.springintegration/eclipse_update_120.jpg b/org.eclipse.virgo.site/org.eclipse.virgo.kernel.springintegration/eclipse_update_120.jpg
new file mode 100755
index 0000000..bfdf708
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.kernel.springintegration/eclipse_update_120.jpg
Binary files differ
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.kernel.springintegration/epl-v10.html b/org.eclipse.virgo.site/org.eclipse.virgo.kernel.springintegration/epl-v10.html
new file mode 100755
index 0000000..eecc800
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.kernel.springintegration/epl-v10.html
@@ -0,0 +1,258 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!-- saved from url=(0049)http://www.eclipse.org/org/documents/epl-v10.html -->
+<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+
+<TITLE>Eclipse Public License - Version 1.0</TITLE>
+<STYLE type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </STYLE>
+
+</HEAD><BODY lang="EN-US">
+
+<H2>Eclipse Public License - v 1.0</H2>
+
+<P>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</P>
+
+<P><B>1. DEFINITIONS</B></P>
+
+<P>"Contribution" means:</P>
+
+<P class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</P>
+<P class="list">b) in the case of each subsequent Contributor:</P>
+<P class="list">i) changes to the Program, and</P>
+<P class="list">ii) additions to the Program;</P>
+<P class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</P>
+
+<P>"Contributor" means any person or entity that distributes
+the Program.</P>
+
+<P>"Licensed Patents" mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</P>
+
+<P>"Program" means the Contributions distributed in accordance
+with this Agreement.</P>
+
+<P>"Recipient" means anyone who receives the Program under
+this Agreement, including all Contributors.</P>
+
+<P><B>2. GRANT OF RIGHTS</B></P>
+
+<P class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</P>
+
+<P class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</P>
+
+<P class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</P>
+
+<P class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</P>
+
+<P><B>3. REQUIREMENTS</B></P>
+
+<P>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</P>
+
+<P class="list">a) it complies with the terms and conditions of this
+Agreement; and</P>
+
+<P class="list">b) its license agreement:</P>
+
+<P class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</P>
+
+<P class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</P>
+
+<P class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</P>
+
+<P class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</P>
+
+<P>When the Program is made available in source code form:</P>
+
+<P class="list">a) it must be made available under this Agreement; and</P>
+
+<P class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</P>
+
+<P>Contributors may not remove or alter any copyright notices contained
+within the Program.</P>
+
+<P>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</P>
+
+<P><B>4. COMMERCIAL DISTRIBUTION</B></P>
+
+<P>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+("Commercial Contributor") hereby agrees to defend and
+indemnify every other Contributor ("Indemnified Contributor")
+against any losses, damages and costs (collectively "Losses")
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</P>
+
+<P>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</P>
+
+<P><B>5. NO WARRANTY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</P>
+
+<P><B>6. DISCLAIMER OF LIABILITY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</P>
+
+<P><B>7. GENERAL</B></P>
+
+<P>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</P>
+
+<P>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</P>
+
+<P>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</P>
+
+<P>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</P>
+
+<P>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</P>
+
+
+
+
+</BODY></HTML>
\ No newline at end of file
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.kernel.springintegration/feature.properties b/org.eclipse.virgo.site/org.eclipse.virgo.kernel.springintegration/feature.properties
new file mode 100644
index 0000000..7dc7197
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.kernel.springintegration/feature.properties
@@ -0,0 +1,189 @@
+###############################################################################
+# Copyright (c) 2011 SAP AG
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# and Apache License v2.0 which accompanies this distribution.
+# The Eclipse Public License is available at
+#   http://www.eclipse.org/legal/epl-v10.html
+# and the Apache License v2.0 is available at
+#   http://www.opensource.org/licenses/apache2.0.php.
+# You may elect to redistribute this code under either of these licenses.
+#
+# Contributors:
+#   Borislav Kapukaranov - initial contribution
+###############################################################################
+# feature.properties
+# contains externalized strings for feature.xml
+# "%foo" in feature.xml corresponds to the key "foo" in this file
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# This file should be translated.
+
+# "featureName" property - name of the feature
+featureName=Eclipse Virgo Kernel Spring Integration Feature
+
+# "providerName" property - name of the company that provides the feature
+providerName=Eclipse.org
+
+# "updateSiteName" property - label for the update site
+
+# "description" property - description of the feature
+description=This feature provides two spring bundles essential for the complete integration with Spring Framework that are otherwise optionally required.\n\
+
+# "copyright" property - text of the "Feature Update Copyright"
+copyright=\
+Copyright (c) 2009, 2010, 2011 VMware Inc. and others\n\
+\n\
+All rights reserved. This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License v1.0\n\
+and Apache License v2.0 which accompanies this distribution.\n\
+The Eclipse Public License is available at\n\
+http://www.eclipse.org/legal/epl-v10.html\n\
+and the Apache License v2.0 is available at\n\
+http://www.opensource.org/licenses/apache2.0.php.\n\
+You may elect to redistribute this code under either of these\n\
+licenses.\n\
+\n\
+Contributors:\n\
+VMware Inc. - initial contribution\n\
+
+# "licenseURL" property - URL of the "Feature License"
+# do not translate value - just change to point to a locale-specific HTML page
+licenseURL=license.html
+
+# "license" property - text of the "Feature Update License"
+# should be plain text version of license agreement pointed to be "licenseURL"
+license=\
+Eclipse Foundation Software User Agreement\n\
+April 14, 2010\n\
+\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION,\n\
+INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS\n\
+(COLLECTIVELY "CONTENT"). USE OF THE CONTENT IS GOVERNED BY THE TERMS\n\
+AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF\n\
+LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.\n\
+BY USING THE CONTENT, YOU AGREE THAT YOUR USE OF THE CONTENT IS\n\
+GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY\n\
+APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
+BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS\n\
+AGREEMENT AND THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE\n\
+AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY\n\
+NOT USE THE CONTENT.\n\
+\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the Eclipse Foundation\n\
+is provided to you under the terms and conditions of the Eclipse Public\n\
+License Version 1.0 ("EPL"). A copy of the EPL is provided with this\n\
+Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
+For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code,\n\
+documentation and other files maintained in the Eclipse Foundation source code\n\
+repository ("Repository") in software modules ("Modules") and made available\n\
+as downloadable archives ("Downloads").\n\
+\n\
+- Content may be structured and packaged into modules to facilitate delivering,\n\
+extending, and upgrading the Content. Typical modules may include plug-ins\n\
+("Plug-ins"), plug-in fragments ("Fragments"), and features ("Features").\n\
+- Each Plug-in or Fragment may be packaged as a sub-directory or JAR\n\
+(Java tm ARchive) in a directory named "plugins".\n\
+- A Feature is a bundle of one or more Plug-ins and/or Fragments and associated\n\
+material. Each Feature may be packaged as a sub-directory in a directory named\n\
+"features". Within a Feature, files named "feature.xml" may contain a list\n\
+of the names and version numbers of the Plug-ins and/or Fragments associated\n\
+with that Feature.\n\
+- Features may also include other Features ("Included Features").\n\
+Within a Feature, files named "feature.xml" may contain a list of the\n\
+names and version numbers of Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be\n\
+contained in files named "about.html" ("Abouts"). The terms and\n\
+conditions governing Features and Included Features should be contained\n\
+in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
+Licenses may be located in any directory of a Download or Module\n\
+including, but not limited to the following locations:\n\
+\n\
+- The top-level (root) directory\n\
+- Plug-in and Fragment directories\n\
+- Inside Plug-ins and Fragments packaged as JARs\n\
+- Sub-directories of the directory named "src" of certain Plug-ins\n\
+- Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed\n\
+using the Provisioning Technology (as defined below), you must agree to a\n\
+license ("Feature Update License") during the installation process.\n\
+If the Feature contains\n\
+Included Features, the Feature Update License should either provide\n\
+you with the terms and conditions governing the Included Features or inform\n\
+you where you can locate them. Feature Update Licenses may be found in\n\
+the "license" property of files named "feature.properties" found within a Feature.\n\
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms\n\
+and conditions (or references to such terms and conditions) that govern your\n\
+use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
+TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
+SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+- Common Public License Version 1.0 (available at\n\
+http://www.eclipse.org/legal/cpl-v10.html)\n\
+- Apache Software License 1.1 (available at\n\
+http://www.apache.org/licenses/LICENSE)\n\
+- Apache Software License 2.0 (available at\n\
+http://www.apache.org/licenses/LICENSE-2.0)\n\
+- Metro Link Public License 1.00 (available at\n\
+http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+- Mozilla Public License Version 1.1 (available at\n\
+http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS\n\
+PRIOR TO USE OF THE CONTENT. If no About, Feature License, or Feature\n\
+Update License is provided, please contact the Eclipse Foundation to\n\
+determine what terms and conditions govern that particular Content.\n\
+\n\
+Use of Provisioning Technology\n\
+\n\
+The Eclipse Foundation makes available provisioning software, examples\n\
+of which include, but are not limited to, p2 and the Eclipse Update Manager\n\
+("Provisioning Technology") for the purpose of allowing users to install software,\n\
+documentation, information and/or other materials (collectively "Installable Software").\n\
+This capability is provided with the intent of allowing such users to install,\n\
+extend and update Eclipse-based products.\n\
+Information about packaging Installable Software is available at\n\
+http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
+\n\
+You may use Provisioning Technology to allow other parties to install Installable Software.\n\
+You shall be responsible for enabling the applicable license agreements relating\n\
+to the Installable Software to be presented to, and accepted by,\n\
+the users of the Provisioning Technology in accordance with the Specification.\n\
+By using Provisioning Technology in such a manner and making it available in accordance\n\
+with the Specification, you further acknowledge your agreement to,\n\
+and the acquisition of all necessary rights to permit the following:\n\
+\n\
+- A series of actions may occur ("Provisioning Process") in which a user may execute the\n\
+Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
+extending or updating the functionality of an Eclipse-based product.\n\
+- During the Provisioning Process, the Provisioning Technology may cause third party\n\
+Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
+- Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
+govern the use of the Installable Software ("Installable Software Agreement")\n\
+and such Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
+with the Specification. Such Installable Software Agreement must inform the user of the terms and\n\
+conditions that govern the Installable Software and must solicit acceptance by the end user in\n\
+the manner prescribed in such Installable Software Agreement.\n\
+Upon such indication of agreement by the user, the provisioning Technology\n\
+will complete installation of the Installable Software.\n\
+\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are\n\
+currently may have restrictions on the import, possession, and use,\n\
+and/or re-export to another country, of encryption software. BEFORE\n\
+using any encryption software, please check the country's laws,\n\
+regulations and policies concerning the import, possession, or use,\n\
+and re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n\
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.kernel.springintegration/feature.xml b/org.eclipse.virgo.site/org.eclipse.virgo.kernel.springintegration/feature.xml
new file mode 100755
index 0000000..e206df0
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.kernel.springintegration/feature.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="org.eclipse.virgo.kernel.springintegration"
+      label="%featureName"
+      version="@VIRGO.VERSION@"
+      provider-name="%providerName"
+      image="eclipse_update_120.jpg">
+
+   <description url="http://www.eclipse.org/virgo/">
+      %description
+   </description>
+
+   <copyright url="http://www.eclipse.org/virgo/">
+      %copyright
+   </copyright>
+
+   <license url="%licenseURL">
+      %license
+   </license>
+
+    <plugin
+         id="org.springframework.expression"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>        
+
+</feature>
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.kernel/build.gradle b/org.eclipse.virgo.site/org.eclipse.virgo.kernel/build.gradle
new file mode 100644
index 0000000..32bcbb5
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.kernel/build.gradle
@@ -0,0 +1 @@
+apply plugin: eclipsebuild.FeaturePlugin
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.kernel/build.properties b/org.eclipse.virgo.site/org.eclipse.virgo.kernel/build.properties
new file mode 100644
index 0000000..db80add
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.kernel/build.properties
@@ -0,0 +1,4 @@
+bin.includes = feature.xml,\
+               feature.properties,\
+               epl-v10.html,\
+               eclipse_update_120.jpg
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.kernel/eclipse_update_120.jpg b/org.eclipse.virgo.site/org.eclipse.virgo.kernel/eclipse_update_120.jpg
new file mode 100755
index 0000000..bfdf708
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.kernel/eclipse_update_120.jpg
Binary files differ
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.kernel/epl-v10.html b/org.eclipse.virgo.site/org.eclipse.virgo.kernel/epl-v10.html
new file mode 100755
index 0000000..eecc800
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.kernel/epl-v10.html
@@ -0,0 +1,258 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!-- saved from url=(0049)http://www.eclipse.org/org/documents/epl-v10.html -->
+<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+
+<TITLE>Eclipse Public License - Version 1.0</TITLE>
+<STYLE type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </STYLE>
+
+</HEAD><BODY lang="EN-US">
+
+<H2>Eclipse Public License - v 1.0</H2>
+
+<P>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</P>
+
+<P><B>1. DEFINITIONS</B></P>
+
+<P>"Contribution" means:</P>
+
+<P class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</P>
+<P class="list">b) in the case of each subsequent Contributor:</P>
+<P class="list">i) changes to the Program, and</P>
+<P class="list">ii) additions to the Program;</P>
+<P class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</P>
+
+<P>"Contributor" means any person or entity that distributes
+the Program.</P>
+
+<P>"Licensed Patents" mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</P>
+
+<P>"Program" means the Contributions distributed in accordance
+with this Agreement.</P>
+
+<P>"Recipient" means anyone who receives the Program under
+this Agreement, including all Contributors.</P>
+
+<P><B>2. GRANT OF RIGHTS</B></P>
+
+<P class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</P>
+
+<P class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</P>
+
+<P class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</P>
+
+<P class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</P>
+
+<P><B>3. REQUIREMENTS</B></P>
+
+<P>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</P>
+
+<P class="list">a) it complies with the terms and conditions of this
+Agreement; and</P>
+
+<P class="list">b) its license agreement:</P>
+
+<P class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</P>
+
+<P class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</P>
+
+<P class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</P>
+
+<P class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</P>
+
+<P>When the Program is made available in source code form:</P>
+
+<P class="list">a) it must be made available under this Agreement; and</P>
+
+<P class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</P>
+
+<P>Contributors may not remove or alter any copyright notices contained
+within the Program.</P>
+
+<P>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</P>
+
+<P><B>4. COMMERCIAL DISTRIBUTION</B></P>
+
+<P>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+("Commercial Contributor") hereby agrees to defend and
+indemnify every other Contributor ("Indemnified Contributor")
+against any losses, damages and costs (collectively "Losses")
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</P>
+
+<P>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</P>
+
+<P><B>5. NO WARRANTY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</P>
+
+<P><B>6. DISCLAIMER OF LIABILITY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</P>
+
+<P><B>7. GENERAL</B></P>
+
+<P>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</P>
+
+<P>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</P>
+
+<P>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</P>
+
+<P>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</P>
+
+<P>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</P>
+
+
+
+
+</BODY></HTML>
\ No newline at end of file
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.kernel/feature.properties b/org.eclipse.virgo.site/org.eclipse.virgo.kernel/feature.properties
new file mode 100644
index 0000000..42761e8
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.kernel/feature.properties
@@ -0,0 +1,189 @@
+###############################################################################
+# Copyright (c) 2011 SAP AG
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# and Apache License v2.0 which accompanies this distribution.
+# The Eclipse Public License is available at
+#   http://www.eclipse.org/legal/epl-v10.html
+# and the Apache License v2.0 is available at
+#   http://www.opensource.org/licenses/apache2.0.php.
+# You may elect to redistribute this code under either of these licenses.
+#
+# Contributors:
+#   Borislav Kapukaranov - initial contribution
+###############################################################################
+# feature.properties
+# contains externalized strings for feature.xml
+# "%foo" in feature.xml corresponds to the key "foo" in this file
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# This file should be translated.
+
+# "featureName" property - name of the feature
+featureName=Eclipse Virgo Kernel Feature
+
+# "providerName" property - name of the company that provides the feature
+providerName=Eclipse.org
+
+# "updateSiteName" property - label for the update site
+
+# "description" property - description of the feature
+description=This feature provides the Kernel features of a Eclipse Virgo OSGi container such as deployment and repository mechanisms. Region support is enabled by this feature.\n\
+
+# "copyright" property - text of the "Feature Update Copyright"
+copyright=\
+Copyright (c) 2009, 2010, 2011 VMware Inc. and others\n\
+\n\
+All rights reserved. This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License v1.0\n\
+and Apache License v2.0 which accompanies this distribution.\n\
+The Eclipse Public License is available at\n\
+http://www.eclipse.org/legal/epl-v10.html\n\
+and the Apache License v2.0 is available at\n\
+http://www.opensource.org/licenses/apache2.0.php.\n\
+You may elect to redistribute this code under either of these\n\
+licenses.\n\
+\n\
+Contributors:\n\
+VMware Inc. - initial contribution\n\
+
+# "licenseURL" property - URL of the "Feature License"
+# do not translate value - just change to point to a locale-specific HTML page
+licenseURL=license.html
+
+# "license" property - text of the "Feature Update License"
+# should be plain text version of license agreement pointed to be "licenseURL"
+license=\
+Eclipse Foundation Software User Agreement\n\
+April 14, 2010\n\
+\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION,\n\
+INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS\n\
+(COLLECTIVELY "CONTENT"). USE OF THE CONTENT IS GOVERNED BY THE TERMS\n\
+AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF\n\
+LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.\n\
+BY USING THE CONTENT, YOU AGREE THAT YOUR USE OF THE CONTENT IS\n\
+GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY\n\
+APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
+BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS\n\
+AGREEMENT AND THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE\n\
+AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY\n\
+NOT USE THE CONTENT.\n\
+\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the Eclipse Foundation\n\
+is provided to you under the terms and conditions of the Eclipse Public\n\
+License Version 1.0 ("EPL"). A copy of the EPL is provided with this\n\
+Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
+For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code,\n\
+documentation and other files maintained in the Eclipse Foundation source code\n\
+repository ("Repository") in software modules ("Modules") and made available\n\
+as downloadable archives ("Downloads").\n\
+\n\
+- Content may be structured and packaged into modules to facilitate delivering,\n\
+extending, and upgrading the Content. Typical modules may include plug-ins\n\
+("Plug-ins"), plug-in fragments ("Fragments"), and features ("Features").\n\
+- Each Plug-in or Fragment may be packaged as a sub-directory or JAR\n\
+(Java tm ARchive) in a directory named "plugins".\n\
+- A Feature is a bundle of one or more Plug-ins and/or Fragments and associated\n\
+material. Each Feature may be packaged as a sub-directory in a directory named\n\
+"features". Within a Feature, files named "feature.xml" may contain a list\n\
+of the names and version numbers of the Plug-ins and/or Fragments associated\n\
+with that Feature.\n\
+- Features may also include other Features ("Included Features").\n\
+Within a Feature, files named "feature.xml" may contain a list of the\n\
+names and version numbers of Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be\n\
+contained in files named "about.html" ("Abouts"). The terms and\n\
+conditions governing Features and Included Features should be contained\n\
+in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
+Licenses may be located in any directory of a Download or Module\n\
+including, but not limited to the following locations:\n\
+\n\
+- The top-level (root) directory\n\
+- Plug-in and Fragment directories\n\
+- Inside Plug-ins and Fragments packaged as JARs\n\
+- Sub-directories of the directory named "src" of certain Plug-ins\n\
+- Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed\n\
+using the Provisioning Technology (as defined below), you must agree to a\n\
+license ("Feature Update License") during the installation process.\n\
+If the Feature contains\n\
+Included Features, the Feature Update License should either provide\n\
+you with the terms and conditions governing the Included Features or inform\n\
+you where you can locate them. Feature Update Licenses may be found in\n\
+the "license" property of files named "feature.properties" found within a Feature.\n\
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms\n\
+and conditions (or references to such terms and conditions) that govern your\n\
+use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
+TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
+SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+- Common Public License Version 1.0 (available at\n\
+http://www.eclipse.org/legal/cpl-v10.html)\n\
+- Apache Software License 1.1 (available at\n\
+http://www.apache.org/licenses/LICENSE)\n\
+- Apache Software License 2.0 (available at\n\
+http://www.apache.org/licenses/LICENSE-2.0)\n\
+- Metro Link Public License 1.00 (available at\n\
+http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+- Mozilla Public License Version 1.1 (available at\n\
+http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS\n\
+PRIOR TO USE OF THE CONTENT. If no About, Feature License, or Feature\n\
+Update License is provided, please contact the Eclipse Foundation to\n\
+determine what terms and conditions govern that particular Content.\n\
+\n\
+Use of Provisioning Technology\n\
+\n\
+The Eclipse Foundation makes available provisioning software, examples\n\
+of which include, but are not limited to, p2 and the Eclipse Update Manager\n\
+("Provisioning Technology") for the purpose of allowing users to install software,\n\
+documentation, information and/or other materials (collectively "Installable Software").\n\
+This capability is provided with the intent of allowing such users to install,\n\
+extend and update Eclipse-based products.\n\
+Information about packaging Installable Software is available at\n\
+http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
+\n\
+You may use Provisioning Technology to allow other parties to install Installable Software.\n\
+You shall be responsible for enabling the applicable license agreements relating\n\
+to the Installable Software to be presented to, and accepted by,\n\
+the users of the Provisioning Technology in accordance with the Specification.\n\
+By using Provisioning Technology in such a manner and making it available in accordance\n\
+with the Specification, you further acknowledge your agreement to,\n\
+and the acquisition of all necessary rights to permit the following:\n\
+\n\
+- A series of actions may occur ("Provisioning Process") in which a user may execute the\n\
+Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
+extending or updating the functionality of an Eclipse-based product.\n\
+- During the Provisioning Process, the Provisioning Technology may cause third party\n\
+Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
+- Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
+govern the use of the Installable Software ("Installable Software Agreement")\n\
+and such Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
+with the Specification. Such Installable Software Agreement must inform the user of the terms and\n\
+conditions that govern the Installable Software and must solicit acceptance by the end user in\n\
+the manner prescribed in such Installable Software Agreement.\n\
+Upon such indication of agreement by the user, the provisioning Technology\n\
+will complete installation of the Installable Software.\n\
+\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are\n\
+currently may have restrictions on the import, possession, and use,\n\
+and/or re-export to another country, of encryption software. BEFORE\n\
+using any encryption software, please check the country's laws,\n\
+regulations and policies concerning the import, possession, or use,\n\
+and re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n\
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.kernel/feature.xml b/org.eclipse.virgo.site/org.eclipse.virgo.kernel/feature.xml
new file mode 100755
index 0000000..99e893b
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.kernel/feature.xml
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+	id="org.eclipse.virgo.kernel"
+	label="%featureName"
+	version="@VIRGO.VERSION@"
+	provider-name="%providerName"
+	image="eclipse_update_120.jpg">
+
+	<description url="http://www.eclipse.org/virgo/">
+		%description
+	</description>
+
+	<copyright url="http://www.eclipse.org/virgo/">
+		%copyright
+	</copyright>
+
+	<license url="%licenseURL">
+		%license
+	</license>
+
+	<requires>
+		<import feature="org.eclipse.virgo.core" version="0.0.0"/>
+		<import feature="org.eclipse.equinox.regions" version="0.0.0"/>
+	</requires>
+
+   <plugin
+		id="org.eclipse.virgo.kernel.deployer"
+		download-size="0"
+		install-size="0"
+		version="@VIRGO.VERSION@"
+		unpack="false"
+		autostart="true"/>
+   <plugin
+		id="org.eclipse.virgo.kernel.equinox.extensions"
+		download-size="0"
+		install-size="0"
+		version="@VIRGO.VERSION@"
+		unpack="false"
+		autostart="false"/>
+	<plugin
+		id="org.eclipse.virgo.repository"
+		download-size="0"
+		install-size="0"
+		version="@VIRGO.VERSION@"
+		unpack="false"
+		autostart="true"/>
+	<plugin
+		id="org.eclipse.virgo.kernel.agent.dm"
+		download-size="0"
+		install-size="0"
+		version="@VIRGO.VERSION@"
+		unpack="false"
+		autostart="true"/>
+	<plugin
+		id="org.eclipse.virgo.kernel.artifact"
+		download-size="0"
+		install-size="0"
+		version="@VIRGO.VERSION@"
+		unpack="false"
+		autostart="true"/>
+	<plugin
+		id="org.eclipse.virgo.kernel.services"
+		download-size="0"
+		install-size="0"
+		version="@VIRGO.VERSION@"
+		unpack="false"
+		autostart="true"/>
+	<plugin
+		id="org.eclipse.virgo.kernel.model"
+		download-size="0"
+		install-size="0"
+		version="@VIRGO.VERSION@"
+		unpack="false"
+		autostart="true"/>
+	<plugin
+		id="org.eclipse.virgo.kernel.osgi"
+		download-size="0"
+		install-size="0"
+		version="@VIRGO.VERSION@"
+		unpack="false"
+		autostart="true"/>
+	<plugin
+		id="org.eclipse.virgo.kernel.userregionfactory"
+		download-size="0"
+		install-size="0"
+		version="@VIRGO.VERSION@"
+		unpack="false"
+		autostart="true"/>
+	<plugin
+		id="org.eclipse.virgo.kernel.kerneldmfragment"
+		download-size="0"
+		install-size="0"
+		version="@VIRGO.VERSION@"
+		unpack="false"/>
+
+</feature>
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.management/build.gradle b/org.eclipse.virgo.site/org.eclipse.virgo.management/build.gradle
new file mode 100644
index 0000000..32bcbb5
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.management/build.gradle
@@ -0,0 +1 @@
+apply plugin: eclipsebuild.FeaturePlugin
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.management/build.properties b/org.eclipse.virgo.site/org.eclipse.virgo.management/build.properties
new file mode 100644
index 0000000..db80add
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.management/build.properties
@@ -0,0 +1,4 @@
+bin.includes = feature.xml,\
+               feature.properties,\
+               epl-v10.html,\
+               eclipse_update_120.jpg
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.management/eclipse_update_120.jpg b/org.eclipse.virgo.site/org.eclipse.virgo.management/eclipse_update_120.jpg
new file mode 100755
index 0000000..bfdf708
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.management/eclipse_update_120.jpg
Binary files differ
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.management/epl-v10.html b/org.eclipse.virgo.site/org.eclipse.virgo.management/epl-v10.html
new file mode 100755
index 0000000..eecc800
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.management/epl-v10.html
@@ -0,0 +1,258 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!-- saved from url=(0049)http://www.eclipse.org/org/documents/epl-v10.html -->
+<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+
+<TITLE>Eclipse Public License - Version 1.0</TITLE>
+<STYLE type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </STYLE>
+
+</HEAD><BODY lang="EN-US">
+
+<H2>Eclipse Public License - v 1.0</H2>
+
+<P>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</P>
+
+<P><B>1. DEFINITIONS</B></P>
+
+<P>"Contribution" means:</P>
+
+<P class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</P>
+<P class="list">b) in the case of each subsequent Contributor:</P>
+<P class="list">i) changes to the Program, and</P>
+<P class="list">ii) additions to the Program;</P>
+<P class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</P>
+
+<P>"Contributor" means any person or entity that distributes
+the Program.</P>
+
+<P>"Licensed Patents" mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</P>
+
+<P>"Program" means the Contributions distributed in accordance
+with this Agreement.</P>
+
+<P>"Recipient" means anyone who receives the Program under
+this Agreement, including all Contributors.</P>
+
+<P><B>2. GRANT OF RIGHTS</B></P>
+
+<P class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</P>
+
+<P class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</P>
+
+<P class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</P>
+
+<P class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</P>
+
+<P><B>3. REQUIREMENTS</B></P>
+
+<P>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</P>
+
+<P class="list">a) it complies with the terms and conditions of this
+Agreement; and</P>
+
+<P class="list">b) its license agreement:</P>
+
+<P class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</P>
+
+<P class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</P>
+
+<P class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</P>
+
+<P class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</P>
+
+<P>When the Program is made available in source code form:</P>
+
+<P class="list">a) it must be made available under this Agreement; and</P>
+
+<P class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</P>
+
+<P>Contributors may not remove or alter any copyright notices contained
+within the Program.</P>
+
+<P>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</P>
+
+<P><B>4. COMMERCIAL DISTRIBUTION</B></P>
+
+<P>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+("Commercial Contributor") hereby agrees to defend and
+indemnify every other Contributor ("Indemnified Contributor")
+against any losses, damages and costs (collectively "Losses")
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</P>
+
+<P>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</P>
+
+<P><B>5. NO WARRANTY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</P>
+
+<P><B>6. DISCLAIMER OF LIABILITY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</P>
+
+<P><B>7. GENERAL</B></P>
+
+<P>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</P>
+
+<P>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</P>
+
+<P>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</P>
+
+<P>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</P>
+
+<P>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</P>
+
+
+
+
+</BODY></HTML>
\ No newline at end of file
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.management/feature.properties b/org.eclipse.virgo.site/org.eclipse.virgo.management/feature.properties
new file mode 100644
index 0000000..61c85d2
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.management/feature.properties
@@ -0,0 +1,189 @@
+###############################################################################
+# Copyright (c) 2011 SAP AG
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# and Apache License v2.0 which accompanies this distribution.
+# The Eclipse Public License is available at
+#   http://www.eclipse.org/legal/epl-v10.html
+# and the Apache License v2.0 is available at
+#   http://www.opensource.org/licenses/apache2.0.php.
+# You may elect to redistribute this code under either of these licenses.
+#
+# Contributors:
+#   Borislav Kapukaranov - initial contribution
+###############################################################################
+# feature.properties
+# contains externalized strings for feature.xml
+# "%foo" in feature.xml corresponds to the key "foo" in this file
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# This file should be translated.
+
+# "featureName" property - name of the feature
+featureName=Eclipse Virgo Management Feature
+
+# "providerName" property - name of the company that provides the feature
+providerName=Eclipse.org
+
+# "updateSiteName" property - label for the update site
+
+# "description" property - description of the feature
+description=This feature provides OSGi JMX support for Virgo.\n\
+
+# "copyright" property - text of the "Feature Update Copyright"
+copyright=\
+Copyright (c) 2009, 2010, 2011 VMware Inc. and others\n\
+\n\
+All rights reserved. This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License v1.0\n\
+and Apache License v2.0 which accompanies this distribution.\n\
+The Eclipse Public License is available at\n\
+http://www.eclipse.org/legal/epl-v10.html\n\
+and the Apache License v2.0 is available at\n\
+http://www.opensource.org/licenses/apache2.0.php.\n\
+You may elect to redistribute this code under either of these\n\
+licenses.\n\
+\n\
+Contributors:\n\
+VMware Inc. - initial contribution\n\
+
+# "licenseURL" property - URL of the "Feature License"
+# do not translate value - just change to point to a locale-specific HTML page
+licenseURL=license.html
+
+# "license" property - text of the "Feature Update License"
+# should be plain text version of license agreement pointed to be "licenseURL"
+license=\
+Eclipse Foundation Software User Agreement\n\
+April 14, 2010\n\
+\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION,\n\
+INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS\n\
+(COLLECTIVELY "CONTENT"). USE OF THE CONTENT IS GOVERNED BY THE TERMS\n\
+AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF\n\
+LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.\n\
+BY USING THE CONTENT, YOU AGREE THAT YOUR USE OF THE CONTENT IS\n\
+GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY\n\
+APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
+BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS\n\
+AGREEMENT AND THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE\n\
+AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY\n\
+NOT USE THE CONTENT.\n\
+\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the Eclipse Foundation\n\
+is provided to you under the terms and conditions of the Eclipse Public\n\
+License Version 1.0 ("EPL"). A copy of the EPL is provided with this\n\
+Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
+For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code,\n\
+documentation and other files maintained in the Eclipse Foundation source code\n\
+repository ("Repository") in software modules ("Modules") and made available\n\
+as downloadable archives ("Downloads").\n\
+\n\
+- Content may be structured and packaged into modules to facilitate delivering,\n\
+extending, and upgrading the Content. Typical modules may include plug-ins\n\
+("Plug-ins"), plug-in fragments ("Fragments"), and features ("Features").\n\
+- Each Plug-in or Fragment may be packaged as a sub-directory or JAR\n\
+(Java tm ARchive) in a directory named "plugins".\n\
+- A Feature is a bundle of one or more Plug-ins and/or Fragments and associated\n\
+material. Each Feature may be packaged as a sub-directory in a directory named\n\
+"features". Within a Feature, files named "feature.xml" may contain a list\n\
+of the names and version numbers of the Plug-ins and/or Fragments associated\n\
+with that Feature.\n\
+- Features may also include other Features ("Included Features").\n\
+Within a Feature, files named "feature.xml" may contain a list of the\n\
+names and version numbers of Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be\n\
+contained in files named "about.html" ("Abouts"). The terms and\n\
+conditions governing Features and Included Features should be contained\n\
+in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
+Licenses may be located in any directory of a Download or Module\n\
+including, but not limited to the following locations:\n\
+\n\
+- The top-level (root) directory\n\
+- Plug-in and Fragment directories\n\
+- Inside Plug-ins and Fragments packaged as JARs\n\
+- Sub-directories of the directory named "src" of certain Plug-ins\n\
+- Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed\n\
+using the Provisioning Technology (as defined below), you must agree to a\n\
+license ("Feature Update License") during the installation process.\n\
+If the Feature contains\n\
+Included Features, the Feature Update License should either provide\n\
+you with the terms and conditions governing the Included Features or inform\n\
+you where you can locate them. Feature Update Licenses may be found in\n\
+the "license" property of files named "feature.properties" found within a Feature.\n\
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms\n\
+and conditions (or references to such terms and conditions) that govern your\n\
+use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
+TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
+SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+- Common Public License Version 1.0 (available at\n\
+http://www.eclipse.org/legal/cpl-v10.html)\n\
+- Apache Software License 1.1 (available at\n\
+http://www.apache.org/licenses/LICENSE)\n\
+- Apache Software License 2.0 (available at\n\
+http://www.apache.org/licenses/LICENSE-2.0)\n\
+- Metro Link Public License 1.00 (available at\n\
+http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+- Mozilla Public License Version 1.1 (available at\n\
+http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS\n\
+PRIOR TO USE OF THE CONTENT. If no About, Feature License, or Feature\n\
+Update License is provided, please contact the Eclipse Foundation to\n\
+determine what terms and conditions govern that particular Content.\n\
+\n\
+Use of Provisioning Technology\n\
+\n\
+The Eclipse Foundation makes available provisioning software, examples\n\
+of which include, but are not limited to, p2 and the Eclipse Update Manager\n\
+("Provisioning Technology") for the purpose of allowing users to install software,\n\
+documentation, information and/or other materials (collectively "Installable Software").\n\
+This capability is provided with the intent of allowing such users to install,\n\
+extend and update Eclipse-based products.\n\
+Information about packaging Installable Software is available at\n\
+http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
+\n\
+You may use Provisioning Technology to allow other parties to install Installable Software.\n\
+You shall be responsible for enabling the applicable license agreements relating\n\
+to the Installable Software to be presented to, and accepted by,\n\
+the users of the Provisioning Technology in accordance with the Specification.\n\
+By using Provisioning Technology in such a manner and making it available in accordance\n\
+with the Specification, you further acknowledge your agreement to,\n\
+and the acquisition of all necessary rights to permit the following:\n\
+\n\
+- A series of actions may occur ("Provisioning Process") in which a user may execute the\n\
+Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
+extending or updating the functionality of an Eclipse-based product.\n\
+- During the Provisioning Process, the Provisioning Technology may cause third party\n\
+Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
+- Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
+govern the use of the Installable Software ("Installable Software Agreement")\n\
+and such Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
+with the Specification. Such Installable Software Agreement must inform the user of the terms and\n\
+conditions that govern the Installable Software and must solicit acceptance by the end user in\n\
+the manner prescribed in such Installable Software Agreement.\n\
+Upon such indication of agreement by the user, the provisioning Technology\n\
+will complete installation of the Installable Software.\n\
+\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are\n\
+currently may have restrictions on the import, possession, and use,\n\
+and/or re-export to another country, of encryption software. BEFORE\n\
+using any encryption software, please check the country's laws,\n\
+regulations and policies concerning the import, possession, or use,\n\
+and re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n\
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.management/feature.xml b/org.eclipse.virgo.site/org.eclipse.virgo.management/feature.xml
new file mode 100755
index 0000000..2009f56
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.management/feature.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+	  id="org.eclipse.virgo.management"
+	  label="%featureName"
+	  version="@VIRGO.VERSION@"
+	  provider-name="%providerName"
+	  image="eclipse_update_120.jpg">
+
+   <description url="http://www.eclipse.org/gemini/management/">
+	  %description
+   </description>
+
+   <copyright url="http://www.eclipse.org/gemini/management/">
+	  %copyright
+   </copyright>
+
+   <license url="%licenseURL">
+	  %license
+   </license>
+	
+	<plugin
+		id="org.eclipse.virgo.management.fragment"
+		download-size="0"
+		install-size="0"
+		version="@VIRGO.VERSION@"
+		unpack="false"
+		autostart="true"/>
+	
+   <plugin
+		id="org.eclipse.gemini.management"
+		download-size="0"
+		install-size="0"
+		version="@GEMINI.MANAGEMENT.VERSION@"
+		unpack="false"
+		autostart="true"/>
+
+	<plugin
+		id="osgi.enterprise"
+		download-size="0"
+		install-size="0"
+		version="@OSGI.ENTERPRISE.VERSION@"
+		unpack="false"/>
+
+</feature>
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.medic/build.gradle b/org.eclipse.virgo.site/org.eclipse.virgo.medic/build.gradle
new file mode 100644
index 0000000..32bcbb5
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.medic/build.gradle
@@ -0,0 +1 @@
+apply plugin: eclipsebuild.FeaturePlugin
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.medic/build.properties b/org.eclipse.virgo.site/org.eclipse.virgo.medic/build.properties
new file mode 100644
index 0000000..db80add
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.medic/build.properties
@@ -0,0 +1,4 @@
+bin.includes = feature.xml,\
+               feature.properties,\
+               epl-v10.html,\
+               eclipse_update_120.jpg
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.medic/eclipse_update_120.jpg b/org.eclipse.virgo.site/org.eclipse.virgo.medic/eclipse_update_120.jpg
new file mode 100755
index 0000000..bfdf708
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.medic/eclipse_update_120.jpg
Binary files differ
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.medic/epl-v10.html b/org.eclipse.virgo.site/org.eclipse.virgo.medic/epl-v10.html
new file mode 100755
index 0000000..eecc800
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.medic/epl-v10.html
@@ -0,0 +1,258 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!-- saved from url=(0049)http://www.eclipse.org/org/documents/epl-v10.html -->
+<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+
+<TITLE>Eclipse Public License - Version 1.0</TITLE>
+<STYLE type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </STYLE>
+
+</HEAD><BODY lang="EN-US">
+
+<H2>Eclipse Public License - v 1.0</H2>
+
+<P>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</P>
+
+<P><B>1. DEFINITIONS</B></P>
+
+<P>"Contribution" means:</P>
+
+<P class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</P>
+<P class="list">b) in the case of each subsequent Contributor:</P>
+<P class="list">i) changes to the Program, and</P>
+<P class="list">ii) additions to the Program;</P>
+<P class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</P>
+
+<P>"Contributor" means any person or entity that distributes
+the Program.</P>
+
+<P>"Licensed Patents" mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</P>
+
+<P>"Program" means the Contributions distributed in accordance
+with this Agreement.</P>
+
+<P>"Recipient" means anyone who receives the Program under
+this Agreement, including all Contributors.</P>
+
+<P><B>2. GRANT OF RIGHTS</B></P>
+
+<P class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</P>
+
+<P class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</P>
+
+<P class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</P>
+
+<P class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</P>
+
+<P><B>3. REQUIREMENTS</B></P>
+
+<P>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</P>
+
+<P class="list">a) it complies with the terms and conditions of this
+Agreement; and</P>
+
+<P class="list">b) its license agreement:</P>
+
+<P class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</P>
+
+<P class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</P>
+
+<P class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</P>
+
+<P class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</P>
+
+<P>When the Program is made available in source code form:</P>
+
+<P class="list">a) it must be made available under this Agreement; and</P>
+
+<P class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</P>
+
+<P>Contributors may not remove or alter any copyright notices contained
+within the Program.</P>
+
+<P>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</P>
+
+<P><B>4. COMMERCIAL DISTRIBUTION</B></P>
+
+<P>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+("Commercial Contributor") hereby agrees to defend and
+indemnify every other Contributor ("Indemnified Contributor")
+against any losses, damages and costs (collectively "Losses")
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</P>
+
+<P>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</P>
+
+<P><B>5. NO WARRANTY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</P>
+
+<P><B>6. DISCLAIMER OF LIABILITY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</P>
+
+<P><B>7. GENERAL</B></P>
+
+<P>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</P>
+
+<P>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</P>
+
+<P>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</P>
+
+<P>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</P>
+
+<P>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</P>
+
+
+
+
+</BODY></HTML>
\ No newline at end of file
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.medic/feature.properties b/org.eclipse.virgo.site/org.eclipse.virgo.medic/feature.properties
new file mode 100644
index 0000000..cd17847
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.medic/feature.properties
@@ -0,0 +1,180 @@
+###############################################################################
+# Copyright (c) 2011 SAP AG
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# and Apache License v2.0 which accompanies this distribution.
+# The Eclipse Public License is available at
+#   http://www.eclipse.org/legal/epl-v10.html
+# and the Apache License v2.0 is available at
+#   http://www.opensource.org/licenses/apache2.0.php.
+# You may elect to redistribute this code under either of these licenses.
+#
+# Contributors:
+#   Borislav Kapukaranov - initial contribution
+###############################################################################
+# feature.properties
+# contains externalized strings for feature.xml
+# "%foo" in feature.xml corresponds to the key "foo" in this file
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# This file should be translated.
+
+# "featureName" property - name of the feature
+featureName=Eclipse Virgo Medic Feature
+
+# "providerName" property - name of the company that provides the feature
+providerName=Eclipse.org
+
+# "updateSiteName" property - label for the update site
+
+# "description" property - description of the feature
+description=This feature provides the Logging and Diagnostics features of an Eclipse Virgo OSGi container.\n\
+
+# "copyright" property - text of the "Feature Update Copyright"
+copyright=\
+Copyright (c) 2009, 2010, 2011 VMware Inc. and others\n\
+\n\
+All rights reserved. This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License v1.0\n\
+and Apache License v2.0 which accompanies this distribution.\n\
+The Eclipse Public License is available at\n\
+http://www.eclipse.org/legal/epl-v10.html\n\
+and the Apache License v2.0 is available at\n\
+http://www.opensource.org/licenses/apache2.0.php.\n\
+You may elect to redistribute this code under either of these\n\
+licenses.\n\
+\n\
+Contributors:\n\
+VMware Inc. - initial contribution\n\
+
+# "licenseURL" property - URL of the "Feature License"
+# do not translate value - just change to point to a locale-specific HTML page
+licenseURL=license.html
+
+# "license" property - text of the "Feature Update License"
+# should be plain text version of license agreement pointed to be "licenseURL"
+license=\
+Eclipse Foundation Software User Agreement\n\
+February 1, 2011\n\
+\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
+OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
+USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
+AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
+NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
+AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
+AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
+OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
+TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
+OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
+BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
+\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the\n\
+Eclipse Foundation is provided to you under the terms and conditions of\n\
+the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
+provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
+For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code,\n\
+documentation and other files maintained in the Eclipse Foundation source code\n\
+repository ("Repository") in software modules ("Modules") and made available\n\
+as downloadable archives ("Downloads").\n\
+\n\
+       - Content may be structured and packaged into modules to facilitate delivering,\n\
+         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
+         plug-in fragments ("Fragments"), and features ("Features").\n\
+       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
+         in a directory named "plugins".\n\
+       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
+         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
+         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
+         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
+         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be\n\
+contained in files named "about.html" ("Abouts"). The terms and\n\
+conditions governing Features and Included Features should be contained\n\
+in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
+Licenses may be located in any directory of a Download or Module\n\
+including, but not limited to the following locations:\n\
+\n\
+       - The top-level (root) directory\n\
+       - Plug-in and Fragment directories\n\
+       - Inside Plug-ins and Fragments packaged as JARs\n\
+       - Sub-directories of the directory named "src" of certain Plug-ins\n\
+       - Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
+Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
+Update License") during the installation process. If the Feature contains\n\
+Included Features, the Feature Update License should either provide you\n\
+with the terms and conditions governing the Included Features or inform\n\
+you where you can locate them. Feature Update Licenses may be found in\n\
+the "license" property of files named "feature.properties" found within a Feature.\n\
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
+terms and conditions (or references to such terms and conditions) that\n\
+govern your use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
+TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
+SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+       - Eclipse Distribution License Version 1.0 (available at http://www.eclipse.org/licenses/edl-v1.0.html)\n\
+       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
+TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
+is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
+govern that particular Content.\n\
+\n\
+\n\Use of Provisioning Technology\n\
+\n\
+The Eclipse Foundation makes available provisioning software, examples of which include,\n\
+but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
+the purpose of allowing users to install software, documentation, information and/or\n\
+other materials (collectively "Installable Software"). This capability is provided with\n\
+the intent of allowing such users to install, extend and update Eclipse-based products.\n\
+Information about packaging Installable Software is available at\n\
+http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
+\n\
+You may use Provisioning Technology to allow other parties to install Installable Software.\n\
+You shall be responsible for enabling the applicable license agreements relating to the\n\
+Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
+in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
+making it available in accordance with the Specification, you further acknowledge your\n\
+agreement to, and the acquisition of all necessary rights to permit the following:\n\
+\n\
+       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
+          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
+          extending or updating the functionality of an Eclipse-based product.\n\
+       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
+          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
+       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
+          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
+          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
+          with the Specification. Such Installable Software Agreement must inform the user of the\n\
+          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
+          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
+          indication of agreement by the user, the provisioning Technology will complete installation\n\
+          of the Installable Software.\n\
+\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are\n\
+currently may have restrictions on the import, possession, and use,\n\
+and/or re-export to another country, of encryption software. BEFORE\n\
+using any encryption software, please check the country's laws,\n\
+regulations and policies concerning the import, possession, or use, and\n\
+re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
+########### end of license property ##########################################
\ No newline at end of file
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.medic/feature.xml b/org.eclipse.virgo.site/org.eclipse.virgo.medic/feature.xml
new file mode 100755
index 0000000..fdc1e5b
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.medic/feature.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="org.eclipse.virgo.medic"
+      label="%featureName"
+      version="@VIRGO.VERSION@"
+      provider-name="%providerName"
+      image="eclipse_update_120.jpg">
+
+   <description url="http://www.eclipse.org/virgo/">
+      %description
+   </description>
+
+   <copyright url="http://www.eclipse.org/virgo/">
+      %copyright
+   </copyright>
+
+   <license url="%licenseURL">
+      %license
+   </license>
+
+   <plugin
+         id="org.eclipse.virgo.medic"
+         download-size="0"
+         install-size="0"
+         version="@VIRGO.VERSION@"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.virgo.medic.core"
+         download-size="0"
+         install-size="0"
+         version="@VIRGO.VERSION@"
+         unpack="false"/>
+   <plugin
+         id="org.eclipse.virgo.medic.logbackcorefragment"
+         download-size="0"
+         install-size="0"
+         version="@VIRGO.VERSION@"
+         unpack="false"/>
+   <plugin
+         id="org.eclipse.virgo.medic.logbackclassicfragment"
+         download-size="0"
+         install-size="0"
+         version="@VIRGO.VERSION@"
+         unpack="false"/>
+   <plugin
+         id="ch.qos.logback.classic"
+         download-size="0"
+         install-size="0"
+         version="@LOGBACK.CLASSIC.VERSION@"
+         unpack="false"/>
+   <plugin
+         id="ch.qos.logback.core"
+         download-size="0"
+         install-size="0"
+         version="@LOGBACK.CORE.VERSION@"
+         unpack="false"/>
+   <plugin
+         id="slf4j.api"
+         download-size="0"
+         install-size="0"
+         version="@SLF4J.API@"
+         unpack="false"/>
+</feature>
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.medic/license.html b/org.eclipse.virgo.site/org.eclipse.virgo.medic/license.html
new file mode 100755
index 0000000..f19c483
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.medic/license.html
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Foundation Software User Agreement</title>
+</head>
+
+<body lang="EN-US">
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>February 1, 2011</p>
+
+<h3>Usage Of Content</h3>
+
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
+
+<h3>Applicable Licenses</h3>
+
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
+   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
+
+<ul>
+       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
+       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
+       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
+      and/or Fragments associated with that Feature.</li>
+       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
+Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+       <li>The top-level (root) directory</li>
+       <li>Plug-in and Fragment directories</li>
+       <li>Inside Plug-ins and Fragments packaged as JARs</li>
+       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
+       <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
+installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+       <li>Eclipse Distribution License Version 1.0 (available at <a href="http://www.eclipse.org/licenses/edl-v10.html">http://www.eclipse.org/licenses/edl-v1.0.html</a>)</li>
+       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+
+<h3>Use of Provisioning Technology</h3>
+
+<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
+   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
+   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
+   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
+       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
+   (&quot;Specification&quot;).</p>
+
+<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
+   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
+   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
+   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
+
+<ol>
+       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
+       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
+       product.</li>
+       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
+       accessed and copied to the Target Machine.</li>
+       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
+       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
+       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
+       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
+       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
+</ol>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+
+<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
+</body>
+</html>
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.nano.deployer/build.gradle b/org.eclipse.virgo.site/org.eclipse.virgo.nano.deployer/build.gradle
new file mode 100644
index 0000000..32bcbb5
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.nano.deployer/build.gradle
@@ -0,0 +1 @@
+apply plugin: eclipsebuild.FeaturePlugin
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.nano.deployer/build.properties b/org.eclipse.virgo.site/org.eclipse.virgo.nano.deployer/build.properties
new file mode 100644
index 0000000..db80add
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.nano.deployer/build.properties
@@ -0,0 +1,4 @@
+bin.includes = feature.xml,\
+               feature.properties,\
+               epl-v10.html,\
+               eclipse_update_120.jpg
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.nano.deployer/eclipse_update_120.jpg b/org.eclipse.virgo.site/org.eclipse.virgo.nano.deployer/eclipse_update_120.jpg
new file mode 100755
index 0000000..bfdf708
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.nano.deployer/eclipse_update_120.jpg
Binary files differ
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.nano.deployer/epl-v10.html b/org.eclipse.virgo.site/org.eclipse.virgo.nano.deployer/epl-v10.html
new file mode 100755
index 0000000..eecc800
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.nano.deployer/epl-v10.html
@@ -0,0 +1,258 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!-- saved from url=(0049)http://www.eclipse.org/org/documents/epl-v10.html -->
+<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+
+<TITLE>Eclipse Public License - Version 1.0</TITLE>
+<STYLE type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </STYLE>
+
+</HEAD><BODY lang="EN-US">
+
+<H2>Eclipse Public License - v 1.0</H2>
+
+<P>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</P>
+
+<P><B>1. DEFINITIONS</B></P>
+
+<P>"Contribution" means:</P>
+
+<P class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</P>
+<P class="list">b) in the case of each subsequent Contributor:</P>
+<P class="list">i) changes to the Program, and</P>
+<P class="list">ii) additions to the Program;</P>
+<P class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</P>
+
+<P>"Contributor" means any person or entity that distributes
+the Program.</P>
+
+<P>"Licensed Patents" mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</P>
+
+<P>"Program" means the Contributions distributed in accordance
+with this Agreement.</P>
+
+<P>"Recipient" means anyone who receives the Program under
+this Agreement, including all Contributors.</P>
+
+<P><B>2. GRANT OF RIGHTS</B></P>
+
+<P class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</P>
+
+<P class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</P>
+
+<P class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</P>
+
+<P class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</P>
+
+<P><B>3. REQUIREMENTS</B></P>
+
+<P>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</P>
+
+<P class="list">a) it complies with the terms and conditions of this
+Agreement; and</P>
+
+<P class="list">b) its license agreement:</P>
+
+<P class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</P>
+
+<P class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</P>
+
+<P class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</P>
+
+<P class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</P>
+
+<P>When the Program is made available in source code form:</P>
+
+<P class="list">a) it must be made available under this Agreement; and</P>
+
+<P class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</P>
+
+<P>Contributors may not remove or alter any copyright notices contained
+within the Program.</P>
+
+<P>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</P>
+
+<P><B>4. COMMERCIAL DISTRIBUTION</B></P>
+
+<P>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+("Commercial Contributor") hereby agrees to defend and
+indemnify every other Contributor ("Indemnified Contributor")
+against any losses, damages and costs (collectively "Losses")
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</P>
+
+<P>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</P>
+
+<P><B>5. NO WARRANTY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</P>
+
+<P><B>6. DISCLAIMER OF LIABILITY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</P>
+
+<P><B>7. GENERAL</B></P>
+
+<P>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</P>
+
+<P>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</P>
+
+<P>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</P>
+
+<P>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</P>
+
+<P>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</P>
+
+
+
+
+</BODY></HTML>
\ No newline at end of file
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.nano.deployer/feature.properties b/org.eclipse.virgo.site/org.eclipse.virgo.nano.deployer/feature.properties
new file mode 100644
index 0000000..739a5d9
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.nano.deployer/feature.properties
@@ -0,0 +1,180 @@
+###############################################################################
+# Copyright (c) 2011 SAP AG
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# and Apache License v2.0 which accompanies this distribution.
+# The Eclipse Public License is available at
+#   http://www.eclipse.org/legal/epl-v10.html
+# and the Apache License v2.0 is available at
+#   http://www.opensource.org/licenses/apache2.0.php.
+# You may elect to redistribute this code under either of these licenses.
+#
+# Contributors:
+#   Borislav Kapukaranov - initial contribution
+###############################################################################
+# feature.properties
+# contains externalized strings for feature.xml
+# "%foo" in feature.xml corresponds to the key "foo" in this file
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# This file should be translated.
+
+# "featureName" property - name of the feature
+featureName=Eclipse Virgo Nano WAR Deployer Feature
+
+# "providerName" property - name of the company that provides the feature
+providerName=Eclipse.org
+
+# "updateSiteName" property - label for the update site
+
+# "description" property - description of the feature
+description=This feature provides the war deployment capabilities of a Virgo Nano instance.\n\
+
+# "copyright" property - text of the "Feature Update Copyright"
+copyright=\
+Copyright (c) 2009, 2010, 2011, 2012 VMware Inc. and others\n\
+\n\
+All rights reserved. This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License v1.0\n\
+and Apache License v2.0 which accompanies this distribution.\n\
+The Eclipse Public License is available at\n\
+http://www.eclipse.org/legal/epl-v10.html\n\
+and the Apache License v2.0 is available at\n\
+http://www.opensource.org/licenses/apache2.0.php.\n\
+You may elect to redistribute this code under either of these\n\
+licenses.\n\
+\n\
+Contributors:\n\
+VMware Inc. - initial contribution\n\
+
+# "licenseURL" property - URL of the "Feature License"
+# do not translate value - just change to point to a locale-specific HTML page
+licenseURL=license.html
+
+# "license" property - text of the "Feature Update License"
+# should be plain text version of license agreement pointed to be "licenseURL"
+license=\
+Eclipse Foundation Software User Agreement\n\
+February 1, 2011\n\
+\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
+OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
+USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
+AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
+NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
+AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
+AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
+OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
+TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
+OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
+BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
+\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the\n\
+Eclipse Foundation is provided to you under the terms and conditions of\n\
+the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
+provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
+For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code,\n\
+documentation and other files maintained in the Eclipse Foundation source code\n\
+repository ("Repository") in software modules ("Modules") and made available\n\
+as downloadable archives ("Downloads").\n\
+\n\
+       - Content may be structured and packaged into modules to facilitate delivering,\n\
+         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
+         plug-in fragments ("Fragments"), and features ("Features").\n\
+       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
+         in a directory named "plugins".\n\
+       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
+         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
+         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
+         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
+         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be\n\
+contained in files named "about.html" ("Abouts"). The terms and\n\
+conditions governing Features and Included Features should be contained\n\
+in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
+Licenses may be located in any directory of a Download or Module\n\
+including, but not limited to the following locations:\n\
+\n\
+       - The top-level (root) directory\n\
+       - Plug-in and Fragment directories\n\
+       - Inside Plug-ins and Fragments packaged as JARs\n\
+       - Sub-directories of the directory named "src" of certain Plug-ins\n\
+       - Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
+Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
+Update License") during the installation process. If the Feature contains\n\
+Included Features, the Feature Update License should either provide you\n\
+with the terms and conditions governing the Included Features or inform\n\
+you where you can locate them. Feature Update Licenses may be found in\n\
+the "license" property of files named "feature.properties" found within a Feature.\n\
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
+terms and conditions (or references to such terms and conditions) that\n\
+govern your use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
+TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
+SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+       - Eclipse Distribution License Version 1.0 (available at http://www.eclipse.org/licenses/edl-v1.0.html)\n\
+       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
+TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
+is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
+govern that particular Content.\n\
+\n\
+\n\Use of Provisioning Technology\n\
+\n\
+The Eclipse Foundation makes available provisioning software, examples of which include,\n\
+but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
+the purpose of allowing users to install software, documentation, information and/or\n\
+other materials (collectively "Installable Software"). This capability is provided with\n\
+the intent of allowing such users to install, extend and update Eclipse-based products.\n\
+Information about packaging Installable Software is available at\n\
+http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
+\n\
+You may use Provisioning Technology to allow other parties to install Installable Software.\n\
+You shall be responsible for enabling the applicable license agreements relating to the\n\
+Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
+in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
+making it available in accordance with the Specification, you further acknowledge your\n\
+agreement to, and the acquisition of all necessary rights to permit the following:\n\
+\n\
+       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
+          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
+          extending or updating the functionality of an Eclipse-based product.\n\
+       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
+          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
+       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
+          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
+          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
+          with the Specification. Such Installable Software Agreement must inform the user of the\n\
+          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
+          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
+          indication of agreement by the user, the provisioning Technology will complete installation\n\
+          of the Installable Software.\n\
+\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are\n\
+currently may have restrictions on the import, possession, and use,\n\
+and/or re-export to another country, of encryption software. BEFORE\n\
+using any encryption software, please check the country's laws,\n\
+regulations and policies concerning the import, possession, or use, and\n\
+re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
+########### end of license property ##########################################
\ No newline at end of file
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.nano.deployer/feature.xml b/org.eclipse.virgo.site/org.eclipse.virgo.nano.deployer/feature.xml
new file mode 100755
index 0000000..619cc8b
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.nano.deployer/feature.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="org.eclipse.virgo.nano.deployer"
+      label="%featureName"
+      version="@VIRGO.VERSION@"
+      provider-name="%providerName"
+      image="eclipse_update_120.jpg">
+
+   <description url="http://www.eclipse.org/virgo/">
+      %description
+   </description>
+
+   <copyright url="http://www.eclipse.org/virgo/">
+      %copyright
+   </copyright>
+
+   <license url="%licenseURL">
+      %license
+   </license>
+
+   <requires>
+      <import feature="org.eclipse.virgo.ds" version="0.0.0"/>
+   </requires>
+
+    <plugin
+    id="org.eclipse.equinox.event"
+    download-size="0"
+    install-size="0"
+    version="@EQUINOX.EVENT@"
+    unpack="false"/>
+
+    <plugin
+         id="org.eclipse.virgo.nano.deployer"
+         download-size="0"
+         install-size="0"
+         version="@VIRGO.VERSION@"
+         unpack="false"/>
+
+</feature>
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.nano.deployer/license.html b/org.eclipse.virgo.site/org.eclipse.virgo.nano.deployer/license.html
new file mode 100755
index 0000000..f19c483
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.nano.deployer/license.html
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Foundation Software User Agreement</title>
+</head>
+
+<body lang="EN-US">
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>February 1, 2011</p>
+
+<h3>Usage Of Content</h3>
+
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
+
+<h3>Applicable Licenses</h3>
+
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
+   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
+
+<ul>
+       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
+       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
+       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
+      and/or Fragments associated with that Feature.</li>
+       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
+Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+       <li>The top-level (root) directory</li>
+       <li>Plug-in and Fragment directories</li>
+       <li>Inside Plug-ins and Fragments packaged as JARs</li>
+       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
+       <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
+installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+       <li>Eclipse Distribution License Version 1.0 (available at <a href="http://www.eclipse.org/licenses/edl-v10.html">http://www.eclipse.org/licenses/edl-v1.0.html</a>)</li>
+       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+
+<h3>Use of Provisioning Technology</h3>
+
+<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
+   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
+   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
+   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
+       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
+   (&quot;Specification&quot;).</p>
+
+<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
+   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
+   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
+   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
+
+<ol>
+       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
+       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
+       product.</li>
+       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
+       accessed and copied to the Target Machine.</li>
+       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
+       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
+       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
+       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
+       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
+</ol>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+
+<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
+</body>
+</html>
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.nano.mbeans.controller/build.gradle b/org.eclipse.virgo.site/org.eclipse.virgo.nano.mbeans.controller/build.gradle
new file mode 100644
index 0000000..32bcbb5
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.nano.mbeans.controller/build.gradle
@@ -0,0 +1 @@
+apply plugin: eclipsebuild.FeaturePlugin
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.nano.mbeans.controller/build.properties b/org.eclipse.virgo.site/org.eclipse.virgo.nano.mbeans.controller/build.properties
new file mode 100644
index 0000000..a13e18b
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.nano.mbeans.controller/build.properties
@@ -0,0 +1,5 @@
+bin.includes = feature.xml,\
+               feature.properties,\
+               epl-v10.html,\
+               eclipse_update_120.jpg,\
+               p2.inf
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.nano.mbeans.controller/eclipse_update_120.jpg b/org.eclipse.virgo.site/org.eclipse.virgo.nano.mbeans.controller/eclipse_update_120.jpg
new file mode 100755
index 0000000..bfdf708
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.nano.mbeans.controller/eclipse_update_120.jpg
Binary files differ
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.nano.mbeans.controller/epl-v10.html b/org.eclipse.virgo.site/org.eclipse.virgo.nano.mbeans.controller/epl-v10.html
new file mode 100755
index 0000000..eecc800
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.nano.mbeans.controller/epl-v10.html
@@ -0,0 +1,258 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!-- saved from url=(0049)http://www.eclipse.org/org/documents/epl-v10.html -->
+<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+
+<TITLE>Eclipse Public License - Version 1.0</TITLE>
+<STYLE type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </STYLE>
+
+</HEAD><BODY lang="EN-US">
+
+<H2>Eclipse Public License - v 1.0</H2>
+
+<P>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</P>
+
+<P><B>1. DEFINITIONS</B></P>
+
+<P>"Contribution" means:</P>
+
+<P class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</P>
+<P class="list">b) in the case of each subsequent Contributor:</P>
+<P class="list">i) changes to the Program, and</P>
+<P class="list">ii) additions to the Program;</P>
+<P class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</P>
+
+<P>"Contributor" means any person or entity that distributes
+the Program.</P>
+
+<P>"Licensed Patents" mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</P>
+
+<P>"Program" means the Contributions distributed in accordance
+with this Agreement.</P>
+
+<P>"Recipient" means anyone who receives the Program under
+this Agreement, including all Contributors.</P>
+
+<P><B>2. GRANT OF RIGHTS</B></P>
+
+<P class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</P>
+
+<P class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</P>
+
+<P class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</P>
+
+<P class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</P>
+
+<P><B>3. REQUIREMENTS</B></P>
+
+<P>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</P>
+
+<P class="list">a) it complies with the terms and conditions of this
+Agreement; and</P>
+
+<P class="list">b) its license agreement:</P>
+
+<P class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</P>
+
+<P class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</P>
+
+<P class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</P>
+
+<P class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</P>
+
+<P>When the Program is made available in source code form:</P>
+
+<P class="list">a) it must be made available under this Agreement; and</P>
+
+<P class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</P>
+
+<P>Contributors may not remove or alter any copyright notices contained
+within the Program.</P>
+
+<P>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</P>
+
+<P><B>4. COMMERCIAL DISTRIBUTION</B></P>
+
+<P>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+("Commercial Contributor") hereby agrees to defend and
+indemnify every other Contributor ("Indemnified Contributor")
+against any losses, damages and costs (collectively "Losses")
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</P>
+
+<P>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</P>
+
+<P><B>5. NO WARRANTY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</P>
+
+<P><B>6. DISCLAIMER OF LIABILITY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</P>
+
+<P><B>7. GENERAL</B></P>
+
+<P>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</P>
+
+<P>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</P>
+
+<P>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</P>
+
+<P>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</P>
+
+<P>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</P>
+
+
+
+
+</BODY></HTML>
\ No newline at end of file
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.nano.mbeans.controller/feature.properties b/org.eclipse.virgo.site/org.eclipse.virgo.nano.mbeans.controller/feature.properties
new file mode 100644
index 0000000..f63f711
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.nano.mbeans.controller/feature.properties
@@ -0,0 +1,180 @@
+###############################################################################
+# Copyright (c) 2011 SAP AG
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# and Apache License v2.0 which accompanies this distribution.
+# The Eclipse Public License is available at
+#   http://www.eclipse.org/legal/epl-v10.html
+# and the Apache License v2.0 is available at
+#   http://www.opensource.org/licenses/apache2.0.php.
+# You may elect to redistribute this code under either of these licenses.
+#
+# Contributors:
+#   Borislav Kapukaranov - initial contribution
+###############################################################################
+# feature.properties
+# contains externalized strings for feature.xml
+# "%foo" in feature.xml corresponds to the key "foo" in this file
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# This file should be translated.
+
+# "featureName" property - name of the feature
+featureName=Virgo Nano MBeans Controller
+
+# "providerName" property - name of the company that provides the feature
+providerName=Eclipse.org
+
+# "updateSiteName" property - label for the update site
+
+# "description" property - description of the feature
+description=This feature provides the Virgo Nano MBean controller which takes care of exporting them to the MBean server.\n\
+
+# "copyright" property - text of the "Feature Update Copyright"
+copyright=\
+Copyright (c) 2009, 2010, 2011 VMware Inc. and others\n\
+\n\
+All rights reserved. This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License v1.0\n\
+and Apache License v2.0 which accompanies this distribution.\n\
+The Eclipse Public License is available at\n\
+http://www.eclipse.org/legal/epl-v10.html\n\
+and the Apache License v2.0 is available at\n\
+http://www.opensource.org/licenses/apache2.0.php.\n\
+You may elect to redistribute this code under either of these\n\
+licenses.\n\
+\n\
+Contributors:\n\
+VMware Inc. - initial contribution\n\
+
+# "licenseURL" property - URL of the "Feature License"
+# do not translate value - just change to point to a locale-specific HTML page
+licenseURL=license.html
+
+# "license" property - text of the "Feature Update License"
+# should be plain text version of license agreement pointed to be "licenseURL"
+license=\
+Eclipse Foundation Software User Agreement\n\
+February 1, 2011\n\
+\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
+OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
+USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
+AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
+NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
+AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
+AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
+OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
+TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
+OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
+BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
+\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the\n\
+Eclipse Foundation is provided to you under the terms and conditions of\n\
+the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
+provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
+For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code,\n\
+documentation and other files maintained in the Eclipse Foundation source code\n\
+repository ("Repository") in software modules ("Modules") and made available\n\
+as downloadable archives ("Downloads").\n\
+\n\
+       - Content may be structured and packaged into modules to facilitate delivering,\n\
+         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
+         plug-in fragments ("Fragments"), and features ("Features").\n\
+       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
+         in a directory named "plugins".\n\
+       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
+         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
+         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
+         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
+         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be\n\
+contained in files named "about.html" ("Abouts"). The terms and\n\
+conditions governing Features and Included Features should be contained\n\
+in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
+Licenses may be located in any directory of a Download or Module\n\
+including, but not limited to the following locations:\n\
+\n\
+       - The top-level (root) directory\n\
+       - Plug-in and Fragment directories\n\
+       - Inside Plug-ins and Fragments packaged as JARs\n\
+       - Sub-directories of the directory named "src" of certain Plug-ins\n\
+       - Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
+Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
+Update License") during the installation process. If the Feature contains\n\
+Included Features, the Feature Update License should either provide you\n\
+with the terms and conditions governing the Included Features or inform\n\
+you where you can locate them. Feature Update Licenses may be found in\n\
+the "license" property of files named "feature.properties" found within a Feature.\n\
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
+terms and conditions (or references to such terms and conditions) that\n\
+govern your use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
+TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
+SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+       - Eclipse Distribution License Version 1.0 (available at http://www.eclipse.org/licenses/edl-v1.0.html)\n\
+       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
+TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
+is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
+govern that particular Content.\n\
+\n\
+\n\Use of Provisioning Technology\n\
+\n\
+The Eclipse Foundation makes available provisioning software, examples of which include,\n\
+but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
+the purpose of allowing users to install software, documentation, information and/or\n\
+other materials (collectively "Installable Software"). This capability is provided with\n\
+the intent of allowing such users to install, extend and update Eclipse-based products.\n\
+Information about packaging Installable Software is available at\n\
+http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
+\n\
+You may use Provisioning Technology to allow other parties to install Installable Software.\n\
+You shall be responsible for enabling the applicable license agreements relating to the\n\
+Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
+in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
+making it available in accordance with the Specification, you further acknowledge your\n\
+agreement to, and the acquisition of all necessary rights to permit the following:\n\
+\n\
+       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
+          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
+          extending or updating the functionality of an Eclipse-based product.\n\
+       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
+          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
+       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
+          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
+          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
+          with the Specification. Such Installable Software Agreement must inform the user of the\n\
+          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
+          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
+          indication of agreement by the user, the provisioning Technology will complete installation\n\
+          of the Installable Software.\n\
+\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are\n\
+currently may have restrictions on the import, possession, and use,\n\
+and/or re-export to another country, of encryption software. BEFORE\n\
+using any encryption software, please check the country's laws,\n\
+regulations and policies concerning the import, possession, or use, and\n\
+re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
+########### end of license property ##########################################
\ No newline at end of file
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.nano.mbeans.controller/feature.xml b/org.eclipse.virgo.site/org.eclipse.virgo.nano.mbeans.controller/feature.xml
new file mode 100755
index 0000000..598d243
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.nano.mbeans.controller/feature.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="org.eclipse.virgo.nano.mbeans.controller"
+      label="%featureName"
+      version="@VIRGO.VERSION@"
+      provider-name="%providerName"
+      image="eclipse_update_120.jpg">
+
+   <description url="http://www.eclipse.org/virgo/">
+      %description
+   </description>
+
+   <copyright url="http://www.eclipse.org/virgo/">
+      %copyright
+   </copyright>
+
+   <license url="%licenseURL">
+      %license
+   </license>
+
+   <plugin
+         id="org.eclipse.virgo.nano.management.controller"
+         download-size="0"
+         install-size="0"
+         version="@VIRGO.VERSION@"
+         unpack="false"
+         autostart="true"/>
+
+</feature>
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.nano.mbeans.controller/license.html b/org.eclipse.virgo.site/org.eclipse.virgo.nano.mbeans.controller/license.html
new file mode 100755
index 0000000..f19c483
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.nano.mbeans.controller/license.html
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Foundation Software User Agreement</title>
+</head>
+
+<body lang="EN-US">
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>February 1, 2011</p>
+
+<h3>Usage Of Content</h3>
+
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
+
+<h3>Applicable Licenses</h3>
+
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
+   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
+
+<ul>
+       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
+       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
+       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
+      and/or Fragments associated with that Feature.</li>
+       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
+Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+       <li>The top-level (root) directory</li>
+       <li>Plug-in and Fragment directories</li>
+       <li>Inside Plug-ins and Fragments packaged as JARs</li>
+       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
+       <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
+installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+       <li>Eclipse Distribution License Version 1.0 (available at <a href="http://www.eclipse.org/licenses/edl-v10.html">http://www.eclipse.org/licenses/edl-v1.0.html</a>)</li>
+       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+
+<h3>Use of Provisioning Technology</h3>
+
+<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
+   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
+   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
+   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
+       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
+   (&quot;Specification&quot;).</p>
+
+<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
+   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
+   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
+   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
+
+<ol>
+       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
+       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
+       product.</li>
+       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
+       accessed and copied to the Target Machine.</li>
+       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
+       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
+       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
+       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
+       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
+</ol>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+
+<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
+</body>
+</html>
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.nano.mbeans/build.gradle b/org.eclipse.virgo.site/org.eclipse.virgo.nano.mbeans/build.gradle
new file mode 100644
index 0000000..32bcbb5
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.nano.mbeans/build.gradle
@@ -0,0 +1 @@
+apply plugin: eclipsebuild.FeaturePlugin
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.nano.mbeans/build.properties b/org.eclipse.virgo.site/org.eclipse.virgo.nano.mbeans/build.properties
new file mode 100644
index 0000000..a13e18b
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.nano.mbeans/build.properties
@@ -0,0 +1,5 @@
+bin.includes = feature.xml,\
+               feature.properties,\
+               epl-v10.html,\
+               eclipse_update_120.jpg,\
+               p2.inf
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.nano.mbeans/eclipse_update_120.jpg b/org.eclipse.virgo.site/org.eclipse.virgo.nano.mbeans/eclipse_update_120.jpg
new file mode 100755
index 0000000..bfdf708
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.nano.mbeans/eclipse_update_120.jpg
Binary files differ
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.nano.mbeans/epl-v10.html b/org.eclipse.virgo.site/org.eclipse.virgo.nano.mbeans/epl-v10.html
new file mode 100755
index 0000000..eecc800
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.nano.mbeans/epl-v10.html
@@ -0,0 +1,258 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!-- saved from url=(0049)http://www.eclipse.org/org/documents/epl-v10.html -->
+<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+
+<TITLE>Eclipse Public License - Version 1.0</TITLE>
+<STYLE type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </STYLE>
+
+</HEAD><BODY lang="EN-US">
+
+<H2>Eclipse Public License - v 1.0</H2>
+
+<P>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</P>
+
+<P><B>1. DEFINITIONS</B></P>
+
+<P>"Contribution" means:</P>
+
+<P class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</P>
+<P class="list">b) in the case of each subsequent Contributor:</P>
+<P class="list">i) changes to the Program, and</P>
+<P class="list">ii) additions to the Program;</P>
+<P class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</P>
+
+<P>"Contributor" means any person or entity that distributes
+the Program.</P>
+
+<P>"Licensed Patents" mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</P>
+
+<P>"Program" means the Contributions distributed in accordance
+with this Agreement.</P>
+
+<P>"Recipient" means anyone who receives the Program under
+this Agreement, including all Contributors.</P>
+
+<P><B>2. GRANT OF RIGHTS</B></P>
+
+<P class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</P>
+
+<P class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</P>
+
+<P class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</P>
+
+<P class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</P>
+
+<P><B>3. REQUIREMENTS</B></P>
+
+<P>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</P>
+
+<P class="list">a) it complies with the terms and conditions of this
+Agreement; and</P>
+
+<P class="list">b) its license agreement:</P>
+
+<P class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</P>
+
+<P class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</P>
+
+<P class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</P>
+
+<P class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</P>
+
+<P>When the Program is made available in source code form:</P>
+
+<P class="list">a) it must be made available under this Agreement; and</P>
+
+<P class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</P>
+
+<P>Contributors may not remove or alter any copyright notices contained
+within the Program.</P>
+
+<P>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</P>
+
+<P><B>4. COMMERCIAL DISTRIBUTION</B></P>
+
+<P>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+("Commercial Contributor") hereby agrees to defend and
+indemnify every other Contributor ("Indemnified Contributor")
+against any losses, damages and costs (collectively "Losses")
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</P>
+
+<P>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</P>
+
+<P><B>5. NO WARRANTY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</P>
+
+<P><B>6. DISCLAIMER OF LIABILITY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</P>
+
+<P><B>7. GENERAL</B></P>
+
+<P>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</P>
+
+<P>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</P>
+
+<P>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</P>
+
+<P>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</P>
+
+<P>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</P>
+
+
+
+
+</BODY></HTML>
\ No newline at end of file
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.nano.mbeans/feature.properties b/org.eclipse.virgo.site/org.eclipse.virgo.nano.mbeans/feature.properties
new file mode 100644
index 0000000..23cf8a2
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.nano.mbeans/feature.properties
@@ -0,0 +1,180 @@
+###############################################################################
+# Copyright (c) 2011 SAP AG
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# and Apache License v2.0 which accompanies this distribution.
+# The Eclipse Public License is available at
+#   http://www.eclipse.org/legal/epl-v10.html
+# and the Apache License v2.0 is available at
+#   http://www.opensource.org/licenses/apache2.0.php.
+# You may elect to redistribute this code under either of these licenses.
+#
+# Contributors:
+#   Borislav Kapukaranov - initial contribution
+###############################################################################
+# feature.properties
+# contains externalized strings for feature.xml
+# "%foo" in feature.xml corresponds to the key "foo" in this file
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# This file should be translated.
+
+# "featureName" property - name of the feature
+featureName=Virgo Nano MBeans
+
+# "providerName" property - name of the company that provides the feature
+providerName=Eclipse.org
+
+# "updateSiteName" property - label for the update site
+
+# "description" property - description of the feature
+description=This feature provides the standard Nano MBean controls such as Deployer and also common for Virgo MBeans such as the Recovery Monitor.\n\
+
+# "copyright" property - text of the "Feature Update Copyright"
+copyright=\
+Copyright (c) 2009, 2010, 2011 VMware Inc. and others\n\
+\n\
+All rights reserved. This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License v1.0\n\
+and Apache License v2.0 which accompanies this distribution.\n\
+The Eclipse Public License is available at\n\
+http://www.eclipse.org/legal/epl-v10.html\n\
+and the Apache License v2.0 is available at\n\
+http://www.opensource.org/licenses/apache2.0.php.\n\
+You may elect to redistribute this code under either of these\n\
+licenses.\n\
+\n\
+Contributors:\n\
+VMware Inc. - initial contribution\n\
+
+# "licenseURL" property - URL of the "Feature License"
+# do not translate value - just change to point to a locale-specific HTML page
+licenseURL=license.html
+
+# "license" property - text of the "Feature Update License"
+# should be plain text version of license agreement pointed to be "licenseURL"
+license=\
+Eclipse Foundation Software User Agreement\n\
+February 1, 2011\n\
+\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
+OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
+USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
+AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
+NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
+AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
+AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
+OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
+TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
+OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
+BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
+\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the\n\
+Eclipse Foundation is provided to you under the terms and conditions of\n\
+the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
+provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
+For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code,\n\
+documentation and other files maintained in the Eclipse Foundation source code\n\
+repository ("Repository") in software modules ("Modules") and made available\n\
+as downloadable archives ("Downloads").\n\
+\n\
+       - Content may be structured and packaged into modules to facilitate delivering,\n\
+         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
+         plug-in fragments ("Fragments"), and features ("Features").\n\
+       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
+         in a directory named "plugins".\n\
+       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
+         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
+         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
+         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
+         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be\n\
+contained in files named "about.html" ("Abouts"). The terms and\n\
+conditions governing Features and Included Features should be contained\n\
+in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
+Licenses may be located in any directory of a Download or Module\n\
+including, but not limited to the following locations:\n\
+\n\
+       - The top-level (root) directory\n\
+       - Plug-in and Fragment directories\n\
+       - Inside Plug-ins and Fragments packaged as JARs\n\
+       - Sub-directories of the directory named "src" of certain Plug-ins\n\
+       - Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
+Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
+Update License") during the installation process. If the Feature contains\n\
+Included Features, the Feature Update License should either provide you\n\
+with the terms and conditions governing the Included Features or inform\n\
+you where you can locate them. Feature Update Licenses may be found in\n\
+the "license" property of files named "feature.properties" found within a Feature.\n\
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
+terms and conditions (or references to such terms and conditions) that\n\
+govern your use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
+TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
+SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+       - Eclipse Distribution License Version 1.0 (available at http://www.eclipse.org/licenses/edl-v1.0.html)\n\
+       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
+TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
+is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
+govern that particular Content.\n\
+\n\
+\n\Use of Provisioning Technology\n\
+\n\
+The Eclipse Foundation makes available provisioning software, examples of which include,\n\
+but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
+the purpose of allowing users to install software, documentation, information and/or\n\
+other materials (collectively "Installable Software"). This capability is provided with\n\
+the intent of allowing such users to install, extend and update Eclipse-based products.\n\
+Information about packaging Installable Software is available at\n\
+http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
+\n\
+You may use Provisioning Technology to allow other parties to install Installable Software.\n\
+You shall be responsible for enabling the applicable license agreements relating to the\n\
+Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
+in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
+making it available in accordance with the Specification, you further acknowledge your\n\
+agreement to, and the acquisition of all necessary rights to permit the following:\n\
+\n\
+       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
+          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
+          extending or updating the functionality of an Eclipse-based product.\n\
+       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
+          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
+       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
+          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
+          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
+          with the Specification. Such Installable Software Agreement must inform the user of the\n\
+          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
+          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
+          indication of agreement by the user, the provisioning Technology will complete installation\n\
+          of the Installable Software.\n\
+\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are\n\
+currently may have restrictions on the import, possession, and use,\n\
+and/or re-export to another country, of encryption software. BEFORE\n\
+using any encryption software, please check the country's laws,\n\
+regulations and policies concerning the import, possession, or use, and\n\
+re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
+########### end of license property ##########################################
\ No newline at end of file
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.nano.mbeans/feature.xml b/org.eclipse.virgo.site/org.eclipse.virgo.nano.mbeans/feature.xml
new file mode 100755
index 0000000..7b10cdb
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.nano.mbeans/feature.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="org.eclipse.virgo.nano.mbeans"
+      label="%featureName"
+      version="@VIRGO.VERSION@"
+      provider-name="%providerName"
+      image="eclipse_update_120.jpg">
+
+   <description url="http://www.eclipse.org/virgo/">
+      %description
+   </description>
+
+   <copyright url="http://www.eclipse.org/virgo/">
+      %copyright
+   </copyright>
+
+   <license url="%licenseURL">
+      %license
+   </license>
+
+    <plugin
+    id="org.eclipse.virgo.util.jmx"
+    download-size="0"
+    install-size="0"
+    version="@VIRGO.VERSION@"
+    unpack="false"/>
+    
+   <plugin
+         id="org.eclipse.virgo.nano.management"
+         download-size="0"
+         install-size="0"
+         version="@VIRGO.VERSION@"
+         unpack="false"
+         autostart="true"/>
+
+</feature>
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.nano.mbeans/license.html b/org.eclipse.virgo.site/org.eclipse.virgo.nano.mbeans/license.html
new file mode 100755
index 0000000..f19c483
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.nano.mbeans/license.html
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Foundation Software User Agreement</title>
+</head>
+
+<body lang="EN-US">
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>February 1, 2011</p>
+
+<h3>Usage Of Content</h3>
+
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
+
+<h3>Applicable Licenses</h3>
+
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
+   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
+
+<ul>
+       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
+       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
+       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
+      and/or Fragments associated with that Feature.</li>
+       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
+Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+       <li>The top-level (root) directory</li>
+       <li>Plug-in and Fragment directories</li>
+       <li>Inside Plug-ins and Fragments packaged as JARs</li>
+       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
+       <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
+installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+       <li>Eclipse Distribution License Version 1.0 (available at <a href="http://www.eclipse.org/licenses/edl-v10.html">http://www.eclipse.org/licenses/edl-v1.0.html</a>)</li>
+       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+
+<h3>Use of Provisioning Technology</h3>
+
+<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
+   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
+   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
+   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
+       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
+   (&quot;Specification&quot;).</p>
+
+<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
+   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
+   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
+   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
+
+<ol>
+       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
+       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
+       product.</li>
+       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
+       accessed and copied to the Target Machine.</li>
+       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
+       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
+       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
+       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
+       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
+</ol>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+
+<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
+</body>
+</html>
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.nano.war.deployer/build.gradle b/org.eclipse.virgo.site/org.eclipse.virgo.nano.war.deployer/build.gradle
new file mode 100644
index 0000000..32bcbb5
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.nano.war.deployer/build.gradle
@@ -0,0 +1 @@
+apply plugin: eclipsebuild.FeaturePlugin
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.nano.war.deployer/build.properties b/org.eclipse.virgo.site/org.eclipse.virgo.nano.war.deployer/build.properties
new file mode 100644
index 0000000..db80add
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.nano.war.deployer/build.properties
@@ -0,0 +1,4 @@
+bin.includes = feature.xml,\
+               feature.properties,\
+               epl-v10.html,\
+               eclipse_update_120.jpg
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.nano.war.deployer/eclipse_update_120.jpg b/org.eclipse.virgo.site/org.eclipse.virgo.nano.war.deployer/eclipse_update_120.jpg
new file mode 100755
index 0000000..bfdf708
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.nano.war.deployer/eclipse_update_120.jpg
Binary files differ
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.nano.war.deployer/epl-v10.html b/org.eclipse.virgo.site/org.eclipse.virgo.nano.war.deployer/epl-v10.html
new file mode 100755
index 0000000..eecc800
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.nano.war.deployer/epl-v10.html
@@ -0,0 +1,258 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!-- saved from url=(0049)http://www.eclipse.org/org/documents/epl-v10.html -->
+<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+
+<TITLE>Eclipse Public License - Version 1.0</TITLE>
+<STYLE type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </STYLE>
+
+</HEAD><BODY lang="EN-US">
+
+<H2>Eclipse Public License - v 1.0</H2>
+
+<P>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</P>
+
+<P><B>1. DEFINITIONS</B></P>
+
+<P>"Contribution" means:</P>
+
+<P class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</P>
+<P class="list">b) in the case of each subsequent Contributor:</P>
+<P class="list">i) changes to the Program, and</P>
+<P class="list">ii) additions to the Program;</P>
+<P class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</P>
+
+<P>"Contributor" means any person or entity that distributes
+the Program.</P>
+
+<P>"Licensed Patents" mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</P>
+
+<P>"Program" means the Contributions distributed in accordance
+with this Agreement.</P>
+
+<P>"Recipient" means anyone who receives the Program under
+this Agreement, including all Contributors.</P>
+
+<P><B>2. GRANT OF RIGHTS</B></P>
+
+<P class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</P>
+
+<P class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</P>
+
+<P class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</P>
+
+<P class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</P>
+
+<P><B>3. REQUIREMENTS</B></P>
+
+<P>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</P>
+
+<P class="list">a) it complies with the terms and conditions of this
+Agreement; and</P>
+
+<P class="list">b) its license agreement:</P>
+
+<P class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</P>
+
+<P class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</P>
+
+<P class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</P>
+
+<P class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</P>
+
+<P>When the Program is made available in source code form:</P>
+
+<P class="list">a) it must be made available under this Agreement; and</P>
+
+<P class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</P>
+
+<P>Contributors may not remove or alter any copyright notices contained
+within the Program.</P>
+
+<P>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</P>
+
+<P><B>4. COMMERCIAL DISTRIBUTION</B></P>
+
+<P>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+("Commercial Contributor") hereby agrees to defend and
+indemnify every other Contributor ("Indemnified Contributor")
+against any losses, damages and costs (collectively "Losses")
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</P>
+
+<P>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</P>
+
+<P><B>5. NO WARRANTY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</P>
+
+<P><B>6. DISCLAIMER OF LIABILITY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</P>
+
+<P><B>7. GENERAL</B></P>
+
+<P>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</P>
+
+<P>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</P>
+
+<P>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</P>
+
+<P>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</P>
+
+<P>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</P>
+
+
+
+
+</BODY></HTML>
\ No newline at end of file
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.nano.war.deployer/feature.properties b/org.eclipse.virgo.site/org.eclipse.virgo.nano.war.deployer/feature.properties
new file mode 100644
index 0000000..aaad62e
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.nano.war.deployer/feature.properties
@@ -0,0 +1,180 @@
+###############################################################################
+# Copyright (c) 2011 SAP AG
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# and Apache License v2.0 which accompanies this distribution.
+# The Eclipse Public License is available at
+#   http://www.eclipse.org/legal/epl-v10.html
+# and the Apache License v2.0 is available at
+#   http://www.opensource.org/licenses/apache2.0.php.
+# You may elect to redistribute this code under either of these licenses.
+#
+# Contributors:
+#   Borislav Kapukaranov - initial contribution
+###############################################################################
+# feature.properties
+# contains externalized strings for feature.xml
+# "%foo" in feature.xml corresponds to the key "foo" in this file
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# This file should be translated.
+
+# "featureName" property - name of the feature
+featureName=Eclipse Virgo Nano Deployer Feature
+
+# "providerName" property - name of the company that provides the feature
+providerName=Eclipse.org
+
+# "updateSiteName" property - label for the update site
+
+# "description" property - description of the feature
+description=This feature provides the deployment and hot-deployment capabilities of a Virgo Nano instance.\n\
+
+# "copyright" property - text of the "Feature Update Copyright"
+copyright=\
+Copyright (c) 2009, 2010, 2011, 2012 VMware Inc. and others\n\
+\n\
+All rights reserved. This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License v1.0\n\
+and Apache License v2.0 which accompanies this distribution.\n\
+The Eclipse Public License is available at\n\
+http://www.eclipse.org/legal/epl-v10.html\n\
+and the Apache License v2.0 is available at\n\
+http://www.opensource.org/licenses/apache2.0.php.\n\
+You may elect to redistribute this code under either of these\n\
+licenses.\n\
+\n\
+Contributors:\n\
+VMware Inc. - initial contribution\n\
+
+# "licenseURL" property - URL of the "Feature License"
+# do not translate value - just change to point to a locale-specific HTML page
+licenseURL=license.html
+
+# "license" property - text of the "Feature Update License"
+# should be plain text version of license agreement pointed to be "licenseURL"
+license=\
+Eclipse Foundation Software User Agreement\n\
+February 1, 2011\n\
+\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
+OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
+USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
+AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
+NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
+AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
+AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
+OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
+TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
+OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
+BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
+\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the\n\
+Eclipse Foundation is provided to you under the terms and conditions of\n\
+the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
+provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
+For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code,\n\
+documentation and other files maintained in the Eclipse Foundation source code\n\
+repository ("Repository") in software modules ("Modules") and made available\n\
+as downloadable archives ("Downloads").\n\
+\n\
+       - Content may be structured and packaged into modules to facilitate delivering,\n\
+         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
+         plug-in fragments ("Fragments"), and features ("Features").\n\
+       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
+         in a directory named "plugins".\n\
+       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
+         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
+         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
+         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
+         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be\n\
+contained in files named "about.html" ("Abouts"). The terms and\n\
+conditions governing Features and Included Features should be contained\n\
+in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
+Licenses may be located in any directory of a Download or Module\n\
+including, but not limited to the following locations:\n\
+\n\
+       - The top-level (root) directory\n\
+       - Plug-in and Fragment directories\n\
+       - Inside Plug-ins and Fragments packaged as JARs\n\
+       - Sub-directories of the directory named "src" of certain Plug-ins\n\
+       - Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
+Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
+Update License") during the installation process. If the Feature contains\n\
+Included Features, the Feature Update License should either provide you\n\
+with the terms and conditions governing the Included Features or inform\n\
+you where you can locate them. Feature Update Licenses may be found in\n\
+the "license" property of files named "feature.properties" found within a Feature.\n\
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
+terms and conditions (or references to such terms and conditions) that\n\
+govern your use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
+TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
+SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+       - Eclipse Distribution License Version 1.0 (available at http://www.eclipse.org/licenses/edl-v1.0.html)\n\
+       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
+TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
+is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
+govern that particular Content.\n\
+\n\
+\n\Use of Provisioning Technology\n\
+\n\
+The Eclipse Foundation makes available provisioning software, examples of which include,\n\
+but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
+the purpose of allowing users to install software, documentation, information and/or\n\
+other materials (collectively "Installable Software"). This capability is provided with\n\
+the intent of allowing such users to install, extend and update Eclipse-based products.\n\
+Information about packaging Installable Software is available at\n\
+http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
+\n\
+You may use Provisioning Technology to allow other parties to install Installable Software.\n\
+You shall be responsible for enabling the applicable license agreements relating to the\n\
+Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
+in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
+making it available in accordance with the Specification, you further acknowledge your\n\
+agreement to, and the acquisition of all necessary rights to permit the following:\n\
+\n\
+       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
+          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
+          extending or updating the functionality of an Eclipse-based product.\n\
+       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
+          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
+       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
+          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
+          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
+          with the Specification. Such Installable Software Agreement must inform the user of the\n\
+          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
+          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
+          indication of agreement by the user, the provisioning Technology will complete installation\n\
+          of the Installable Software.\n\
+\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are\n\
+currently may have restrictions on the import, possession, and use,\n\
+and/or re-export to another country, of encryption software. BEFORE\n\
+using any encryption software, please check the country's laws,\n\
+regulations and policies concerning the import, possession, or use, and\n\
+re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
+########### end of license property ##########################################
\ No newline at end of file
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.nano.war.deployer/feature.xml b/org.eclipse.virgo.site/org.eclipse.virgo.nano.war.deployer/feature.xml
new file mode 100755
index 0000000..3430884
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.nano.war.deployer/feature.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="org.eclipse.virgo.nano.war.deployer"
+      label="%featureName"
+      version="@VIRGO.VERSION@"
+      provider-name="%providerName"
+      image="eclipse_update_120.jpg">
+
+   <description url="http://www.eclipse.org/virgo/">
+      %description
+   </description>
+
+   <copyright url="http://www.eclipse.org/virgo/">
+      %copyright
+   </copyright>
+
+   <license url="%licenseURL">
+      %license
+   </license>
+
+   <requires>
+      <import feature="org.eclipse.virgo.ds" version="0.0.0"/>
+   </requires>
+
+    <plugin
+         id="org.eclipse.virgo.web.war.deployer"
+         download-size="0"
+         install-size="0"
+         version="@VIRGO.VERSION@"
+         unpack="false"
+         autostart="true"/>
+
+</feature>
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.nano.war.deployer/license.html b/org.eclipse.virgo.site/org.eclipse.virgo.nano.war.deployer/license.html
new file mode 100755
index 0000000..f19c483
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.nano.war.deployer/license.html
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Foundation Software User Agreement</title>
+</head>
+
+<body lang="EN-US">
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>February 1, 2011</p>
+
+<h3>Usage Of Content</h3>
+
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
+
+<h3>Applicable Licenses</h3>
+
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
+   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
+
+<ul>
+       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
+       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
+       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
+      and/or Fragments associated with that Feature.</li>
+       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
+Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+       <li>The top-level (root) directory</li>
+       <li>Plug-in and Fragment directories</li>
+       <li>Inside Plug-ins and Fragments packaged as JARs</li>
+       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
+       <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
+installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+       <li>Eclipse Distribution License Version 1.0 (available at <a href="http://www.eclipse.org/licenses/edl-v10.html">http://www.eclipse.org/licenses/edl-v1.0.html</a>)</li>
+       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+
+<h3>Use of Provisioning Technology</h3>
+
+<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
+   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
+   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
+   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
+       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
+   (&quot;Specification&quot;).</p>
+
+<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
+   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
+   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
+   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
+
+<ol>
+       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
+       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
+       product.</li>
+       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
+       accessed and copied to the Target Machine.</li>
+       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
+       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
+       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
+       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
+       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
+</ol>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+
+<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
+</body>
+</html>
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.p2.provisioning/build.gradle b/org.eclipse.virgo.site/org.eclipse.virgo.p2.provisioning/build.gradle
new file mode 100644
index 0000000..32bcbb5
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.p2.provisioning/build.gradle
@@ -0,0 +1 @@
+apply plugin: eclipsebuild.FeaturePlugin
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.p2.provisioning/build.properties b/org.eclipse.virgo.site/org.eclipse.virgo.p2.provisioning/build.properties
new file mode 100644
index 0000000..a13e18b
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.p2.provisioning/build.properties
@@ -0,0 +1,5 @@
+bin.includes = feature.xml,\
+               feature.properties,\
+               epl-v10.html,\
+               eclipse_update_120.jpg,\
+               p2.inf
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.p2.provisioning/eclipse_update_120.jpg b/org.eclipse.virgo.site/org.eclipse.virgo.p2.provisioning/eclipse_update_120.jpg
new file mode 100755
index 0000000..bfdf708
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.p2.provisioning/eclipse_update_120.jpg
Binary files differ
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.p2.provisioning/epl-v10.html b/org.eclipse.virgo.site/org.eclipse.virgo.p2.provisioning/epl-v10.html
new file mode 100755
index 0000000..eecc800
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.p2.provisioning/epl-v10.html
@@ -0,0 +1,258 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!-- saved from url=(0049)http://www.eclipse.org/org/documents/epl-v10.html -->
+<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+
+<TITLE>Eclipse Public License - Version 1.0</TITLE>
+<STYLE type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </STYLE>
+
+</HEAD><BODY lang="EN-US">
+
+<H2>Eclipse Public License - v 1.0</H2>
+
+<P>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</P>
+
+<P><B>1. DEFINITIONS</B></P>
+
+<P>"Contribution" means:</P>
+
+<P class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</P>
+<P class="list">b) in the case of each subsequent Contributor:</P>
+<P class="list">i) changes to the Program, and</P>
+<P class="list">ii) additions to the Program;</P>
+<P class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</P>
+
+<P>"Contributor" means any person or entity that distributes
+the Program.</P>
+
+<P>"Licensed Patents" mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</P>
+
+<P>"Program" means the Contributions distributed in accordance
+with this Agreement.</P>
+
+<P>"Recipient" means anyone who receives the Program under
+this Agreement, including all Contributors.</P>
+
+<P><B>2. GRANT OF RIGHTS</B></P>
+
+<P class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</P>
+
+<P class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</P>
+
+<P class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</P>
+
+<P class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</P>
+
+<P><B>3. REQUIREMENTS</B></P>
+
+<P>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</P>
+
+<P class="list">a) it complies with the terms and conditions of this
+Agreement; and</P>
+
+<P class="list">b) its license agreement:</P>
+
+<P class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</P>
+
+<P class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</P>
+
+<P class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</P>
+
+<P class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</P>
+
+<P>When the Program is made available in source code form:</P>
+
+<P class="list">a) it must be made available under this Agreement; and</P>
+
+<P class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</P>
+
+<P>Contributors may not remove or alter any copyright notices contained
+within the Program.</P>
+
+<P>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</P>
+
+<P><B>4. COMMERCIAL DISTRIBUTION</B></P>
+
+<P>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+("Commercial Contributor") hereby agrees to defend and
+indemnify every other Contributor ("Indemnified Contributor")
+against any losses, damages and costs (collectively "Losses")
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</P>
+
+<P>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</P>
+
+<P><B>5. NO WARRANTY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</P>
+
+<P><B>6. DISCLAIMER OF LIABILITY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</P>
+
+<P><B>7. GENERAL</B></P>
+
+<P>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</P>
+
+<P>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</P>
+
+<P>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</P>
+
+<P>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</P>
+
+<P>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</P>
+
+
+
+
+</BODY></HTML>
\ No newline at end of file
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.p2.provisioning/feature.properties b/org.eclipse.virgo.site/org.eclipse.virgo.p2.provisioning/feature.properties
new file mode 100644
index 0000000..56fa945
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.p2.provisioning/feature.properties
@@ -0,0 +1,180 @@
+###############################################################################
+# Copyright (c) 2011 SAP AG
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# and Apache License v2.0 which accompanies this distribution.
+# The Eclipse Public License is available at
+#   http://www.eclipse.org/legal/epl-v10.html
+# and the Apache License v2.0 is available at
+#   http://www.opensource.org/licenses/apache2.0.php.
+# You may elect to redistribute this code under either of these licenses.
+#
+# Contributors:
+#   Borislav Kapukaranov - initial contribution
+###############################################################################
+# feature.properties
+# contains externalized strings for feature.xml
+# "%foo" in feature.xml corresponds to the key "foo" in this file
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# This file should be translated.
+
+# "featureName" property - name of the feature
+featureName=Eclipse Virgo p2 Provisioning Feature
+
+# "providerName" property - name of the company that provides the feature
+providerName=Eclipse.org
+
+# "updateSiteName" property - label for the update site
+
+# "description" property - description of the feature
+description=This feature provides the p2 provisioning add-on for Virgo. It enables complete p2 provisioning.\n\
+
+# "copyright" property - text of the "Feature Update Copyright"
+copyright=\
+Copyright (c) 2009, 2010, 2011 VMware Inc. and others\n\
+\n\
+All rights reserved. This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License v1.0\n\
+and Apache License v2.0 which accompanies this distribution.\n\
+The Eclipse Public License is available at\n\
+http://www.eclipse.org/legal/epl-v10.html\n\
+and the Apache License v2.0 is available at\n\
+http://www.opensource.org/licenses/apache2.0.php.\n\
+You may elect to redistribute this code under either of these\n\
+licenses.\n\
+\n\
+Contributors:\n\
+VMware Inc. - initial contribution\n\
+
+# "licenseURL" property - URL of the "Feature License"
+# do not translate value - just change to point to a locale-specific HTML page
+licenseURL=license.html
+
+# "license" property - text of the "Feature Update License"
+# should be plain text version of license agreement pointed to be "licenseURL"
+license=\
+Eclipse Foundation Software User Agreement\n\
+February 1, 2011\n\
+\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
+OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
+USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
+AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
+NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
+AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
+AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
+OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
+TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
+OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
+BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
+\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the\n\
+Eclipse Foundation is provided to you under the terms and conditions of\n\
+the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
+provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
+For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code,\n\
+documentation and other files maintained in the Eclipse Foundation source code\n\
+repository ("Repository") in software modules ("Modules") and made available\n\
+as downloadable archives ("Downloads").\n\
+\n\
+       - Content may be structured and packaged into modules to facilitate delivering,\n\
+         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
+         plug-in fragments ("Fragments"), and features ("Features").\n\
+       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
+         in a directory named "plugins".\n\
+       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
+         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
+         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
+         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
+         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be\n\
+contained in files named "about.html" ("Abouts"). The terms and\n\
+conditions governing Features and Included Features should be contained\n\
+in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
+Licenses may be located in any directory of a Download or Module\n\
+including, but not limited to the following locations:\n\
+\n\
+       - The top-level (root) directory\n\
+       - Plug-in and Fragment directories\n\
+       - Inside Plug-ins and Fragments packaged as JARs\n\
+       - Sub-directories of the directory named "src" of certain Plug-ins\n\
+       - Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
+Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
+Update License") during the installation process. If the Feature contains\n\
+Included Features, the Feature Update License should either provide you\n\
+with the terms and conditions governing the Included Features or inform\n\
+you where you can locate them. Feature Update Licenses may be found in\n\
+the "license" property of files named "feature.properties" found within a Feature.\n\
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
+terms and conditions (or references to such terms and conditions) that\n\
+govern your use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
+TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
+SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+       - Eclipse Distribution License Version 1.0 (available at http://www.eclipse.org/licenses/edl-v1.0.html)\n\
+       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
+TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
+is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
+govern that particular Content.\n\
+\n\
+\n\Use of Provisioning Technology\n\
+\n\
+The Eclipse Foundation makes available provisioning software, examples of which include,\n\
+but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
+the purpose of allowing users to install software, documentation, information and/or\n\
+other materials (collectively "Installable Software"). This capability is provided with\n\
+the intent of allowing such users to install, extend and update Eclipse-based products.\n\
+Information about packaging Installable Software is available at\n\
+http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
+\n\
+You may use Provisioning Technology to allow other parties to install Installable Software.\n\
+You shall be responsible for enabling the applicable license agreements relating to the\n\
+Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
+in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
+making it available in accordance with the Specification, you further acknowledge your\n\
+agreement to, and the acquisition of all necessary rights to permit the following:\n\
+\n\
+       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
+          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
+          extending or updating the functionality of an Eclipse-based product.\n\
+       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
+          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
+       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
+          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
+          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
+          with the Specification. Such Installable Software Agreement must inform the user of the\n\
+          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
+          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
+          indication of agreement by the user, the provisioning Technology will complete installation\n\
+          of the Installable Software.\n\
+\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are\n\
+currently may have restrictions on the import, possession, and use,\n\
+and/or re-export to another country, of encryption software. BEFORE\n\
+using any encryption software, please check the country's laws,\n\
+regulations and policies concerning the import, possession, or use, and\n\
+re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
+########### end of license property ##########################################
\ No newline at end of file
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.p2.provisioning/feature.xml b/org.eclipse.virgo.site/org.eclipse.virgo.p2.provisioning/feature.xml
new file mode 100755
index 0000000..4ad9f00
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.p2.provisioning/feature.xml
@@ -0,0 +1,280 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="org.eclipse.virgo.p2.provisioning"
+      label="%featureName"
+      version="1.0.0"
+      provider-name="%providerName"
+      image="eclipse_update_120.jpg">
+
+   <description url="http://www.eclipse.org/virgo/">
+      %description
+   </description>
+
+   <copyright url="http://www.eclipse.org/virgo/">
+      %copyright
+   </copyright>
+
+   <license url="%licenseURL">
+      %license
+   </license>
+   
+   <requires>
+      <import feature="org.eclipse.virgo.simpleconfigurator" version="0.0.0"/>
+   </requires>
+
+   <plugin
+         id="org.eclipse.core.contenttype"
+         download-size="0"
+         install-size="0"
+         version="@CONTENTTYPE.VERSION@"
+         unpack="false"
+         autostart="true"/>
+
+   <plugin
+         id="org.eclipse.core.jobs"
+         download-size="0"
+         install-size="0"
+         version="@JOBS.VERSION@"
+         unpack="false"
+         autostart="true"/>
+
+   <plugin
+         id="org.eclipse.core.runtime"
+         download-size="0"
+         install-size="0"
+         version="@CORE.VERSION@"
+         unpack="false"
+         autostart="true"/>
+
+    <plugin
+    id="org.eclipse.core.net"
+    download-size="0"
+    install-size="0"
+    version="@CORE.NET.VERSION@"
+    unpack="false"/>
+
+   <plugin
+         id="org.eclipse.ecf"
+         download-size="0"
+         install-size="0"
+         version="@ECF.VERSION@"
+         unpack="false"
+         autostart="true"/>
+
+   <plugin
+         id="org.eclipse.ecf.filetransfer"
+         download-size="0"
+         install-size="0"
+         version="@ECF.FT.VERSION@"
+         unpack="false"
+         autostart="true"/>
+
+   <plugin
+         id="org.eclipse.ecf.identity"
+         download-size="0"
+         install-size="0"
+         version="@ECF.I.VERSION@"
+         unpack="false"
+         autostart="true"/>
+
+   <plugin
+         id="org.eclipse.ecf.provider.filetransfer"
+         download-size="0"
+         install-size="0"
+         version="@ECF.P.FT.VERSION@"
+         unpack="false"
+         autostart="true"/>
+
+   <plugin
+         id="org.eclipse.ecf.ssl"
+         download-size="0"
+         install-size="0"
+         version="@ECF.SSL.VERSION@"
+         unpack="false"
+         autostart="true"/>
+
+   <plugin
+         id="org.eclipse.equinox.app"
+         download-size="0"
+         install-size="0"
+         version="@EQUINOX.APP.VERSION@"
+         unpack="false"
+         autostart="true"/>
+
+   <plugin
+         id="org.eclipse.equinox.common"
+         download-size="0"
+         install-size="0"
+         version="@EQUINOX.COMMON.VERSION@"
+         unpack="false"
+         autostart="true"/>
+
+   <plugin
+         id="org.eclipse.equinox.frameworkadmin"
+         download-size="0"
+         install-size="0"
+         version="@EQUINOX.FRKA.VERSION@"
+         unpack="false"
+         autostart="true"/>
+
+   <plugin
+         id="org.eclipse.equinox.frameworkadmin.equinox"
+         download-size="0"
+         install-size="0"
+         version="@EQUINOX.FRKA.E.VERSION@"
+         unpack="false"
+         autostart="true"/>
+
+   <plugin
+         id="org.eclipse.equinox.p2.artifact.repository"
+         download-size="0"
+         install-size="0"
+         version="@P2.A.R.VERSION@"
+         unpack="false"
+         autostart="true"/>
+
+   <plugin
+         id="org.eclipse.equinox.p2.console"
+         download-size="0"
+         install-size="0"
+         version="@P2.CONSOLE.VERSION@"
+         unpack="false"
+         autostart="true"/>
+
+   <plugin
+         id="org.eclipse.equinox.p2.core"
+         download-size="0"
+         install-size="0"
+         version="@P2.CORE.VERSION@"
+         unpack="false"
+         autostart="true"/>
+
+   <plugin
+         id="org.eclipse.equinox.p2.director"
+         download-size="0"
+         install-size="0"
+         version="@P2.DIRECTOR.VERSION@"
+         unpack="false"
+         autostart="true"/>
+
+   <plugin
+         id="org.eclipse.equinox.p2.engine"
+         download-size="0"
+         install-size="0"
+         version="@P2.ENGINE.VERSION@"
+         unpack="false"
+         autostart="true"/>
+
+   <plugin
+         id="org.eclipse.equinox.p2.garbagecollector"
+         download-size="0"
+         install-size="0"
+         version="@P2.GC.VERSION@"
+         unpack="false"
+         autostart="true"/>
+
+   <plugin
+         id="org.eclipse.equinox.p2.jarprocessor"
+         download-size="0"
+         install-size="0"
+         version="@P2.JP.VERSION@"
+         unpack="false"
+         autostart="true"/>
+
+   <plugin
+         id="org.eclipse.equinox.p2.metadata"
+         download-size="0"
+         install-size="0"
+         version="@P2.METADATA.VERSION@"
+         unpack="false"
+         autostart="true"/>
+
+   <plugin
+         id="org.eclipse.equinox.p2.metadata.repository"
+         download-size="0"
+         install-size="0"
+         version="@P2.M.R.VERSION@"
+         unpack="false"
+         autostart="true"/>
+
+   <plugin
+         id="org.eclipse.equinox.p2.publisher"
+         download-size="0"
+         install-size="0"
+         version="@P2.PUBLISHER.VERSION@"
+         unpack="false"
+         autostart="true"/>
+
+   <plugin
+         id="org.eclipse.equinox.p2.publisher.eclipse"
+         download-size="0"
+         install-size="0"
+         version="@P2.P.E.VERSION@"
+         unpack="false"
+         autostart="true"/>
+
+   <plugin
+         id="org.eclipse.equinox.p2.repository"
+         download-size="0"
+         install-size="0"
+         version="@P2.REPOSITORY.VERSION@"
+         unpack="false"
+         autostart="true"/>
+
+   <plugin
+         id="org.eclipse.equinox.p2.touchpoint.eclipse"
+         download-size="0"
+         install-size="0"
+         version="@P2.T.E.VERSION@"
+         unpack="false"
+         autostart="true"/>
+
+   <plugin
+         id="org.eclipse.equinox.p2.touchpoint.natives"
+         download-size="0"
+         install-size="0"
+         version="@P2.T.N.VERSION@"
+         unpack="false"
+         autostart="true"/>
+
+   <plugin
+         id="org.eclipse.equinox.p2.transport.ecf"
+         download-size="0"
+         install-size="0"
+         version="@P2.T.ECF.VERSION@"
+         unpack="false"
+         autostart="true"/>
+
+   <plugin
+         id="org.eclipse.equinox.preferences"
+         download-size="0"
+         install-size="0"
+         version="@EQUINOX.PFRCS.VERSION@"
+         unpack="false"
+         autostart="true"/>
+
+   <plugin
+         id="org.eclipse.equinox.registry"
+         download-size="0"
+         install-size="0"
+         version="@EQUINOX.REGISTRY.VERSION@"
+         unpack="false"
+         autostart="true"/>
+
+   <plugin
+         id="org.eclipse.equinox.security"
+         download-size="0"
+         install-size="0"
+         version="@EQUINOX.SECURITY.VERSION@"
+         unpack="false"
+         autostart="true"/>
+
+   <plugin
+         id="org.eclipse.equinox.simpleconfigurator.manipulator"
+         download-size="0"
+         install-size="0"
+         version="@EQUINOX.SC.M.VERSION@"
+         unpack="false"
+         autostart="true"/>
+
+</feature>
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.p2.provisioning/license.html b/org.eclipse.virgo.site/org.eclipse.virgo.p2.provisioning/license.html
new file mode 100755
index 0000000..f19c483
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.p2.provisioning/license.html
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Foundation Software User Agreement</title>
+</head>
+
+<body lang="EN-US">
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>February 1, 2011</p>
+
+<h3>Usage Of Content</h3>
+
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
+
+<h3>Applicable Licenses</h3>
+
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
+   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
+
+<ul>
+       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
+       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
+       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
+      and/or Fragments associated with that Feature.</li>
+       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
+Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+       <li>The top-level (root) directory</li>
+       <li>Plug-in and Fragment directories</li>
+       <li>Inside Plug-ins and Fragments packaged as JARs</li>
+       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
+       <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
+installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+       <li>Eclipse Distribution License Version 1.0 (available at <a href="http://www.eclipse.org/licenses/edl-v10.html">http://www.eclipse.org/licenses/edl-v1.0.html</a>)</li>
+       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+
+<h3>Use of Provisioning Technology</h3>
+
+<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
+   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
+   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
+   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
+       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
+   (&quot;Specification&quot;).</p>
+
+<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
+   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
+   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
+   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
+
+<ol>
+       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
+       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
+       product.</li>
+       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
+       accessed and copied to the Target Machine.</li>
+       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
+       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
+       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
+       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
+       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
+</ol>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+
+<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
+</body>
+</html>
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.services.concurrent/build.gradle b/org.eclipse.virgo.site/org.eclipse.virgo.services.concurrent/build.gradle
new file mode 100644
index 0000000..32bcbb5
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.services.concurrent/build.gradle
@@ -0,0 +1 @@
+apply plugin: eclipsebuild.FeaturePlugin
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.services.concurrent/build.properties b/org.eclipse.virgo.site/org.eclipse.virgo.services.concurrent/build.properties
new file mode 100644
index 0000000..db80add
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.services.concurrent/build.properties
@@ -0,0 +1,4 @@
+bin.includes = feature.xml,\
+               feature.properties,\
+               epl-v10.html,\
+               eclipse_update_120.jpg
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.services.concurrent/eclipse_update_120.jpg b/org.eclipse.virgo.site/org.eclipse.virgo.services.concurrent/eclipse_update_120.jpg
new file mode 100755
index 0000000..bfdf708
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.services.concurrent/eclipse_update_120.jpg
Binary files differ
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.services.concurrent/epl-v10.html b/org.eclipse.virgo.site/org.eclipse.virgo.services.concurrent/epl-v10.html
new file mode 100755
index 0000000..eecc800
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.services.concurrent/epl-v10.html
@@ -0,0 +1,258 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!-- saved from url=(0049)http://www.eclipse.org/org/documents/epl-v10.html -->
+<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+
+<TITLE>Eclipse Public License - Version 1.0</TITLE>
+<STYLE type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </STYLE>
+
+</HEAD><BODY lang="EN-US">
+
+<H2>Eclipse Public License - v 1.0</H2>
+
+<P>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</P>
+
+<P><B>1. DEFINITIONS</B></P>
+
+<P>"Contribution" means:</P>
+
+<P class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</P>
+<P class="list">b) in the case of each subsequent Contributor:</P>
+<P class="list">i) changes to the Program, and</P>
+<P class="list">ii) additions to the Program;</P>
+<P class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</P>
+
+<P>"Contributor" means any person or entity that distributes
+the Program.</P>
+
+<P>"Licensed Patents" mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</P>
+
+<P>"Program" means the Contributions distributed in accordance
+with this Agreement.</P>
+
+<P>"Recipient" means anyone who receives the Program under
+this Agreement, including all Contributors.</P>
+
+<P><B>2. GRANT OF RIGHTS</B></P>
+
+<P class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</P>
+
+<P class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</P>
+
+<P class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</P>
+
+<P class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</P>
+
+<P><B>3. REQUIREMENTS</B></P>
+
+<P>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</P>
+
+<P class="list">a) it complies with the terms and conditions of this
+Agreement; and</P>
+
+<P class="list">b) its license agreement:</P>
+
+<P class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</P>
+
+<P class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</P>
+
+<P class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</P>
+
+<P class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</P>
+
+<P>When the Program is made available in source code form:</P>
+
+<P class="list">a) it must be made available under this Agreement; and</P>
+
+<P class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</P>
+
+<P>Contributors may not remove or alter any copyright notices contained
+within the Program.</P>
+
+<P>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</P>
+
+<P><B>4. COMMERCIAL DISTRIBUTION</B></P>
+
+<P>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+("Commercial Contributor") hereby agrees to defend and
+indemnify every other Contributor ("Indemnified Contributor")
+against any losses, damages and costs (collectively "Losses")
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</P>
+
+<P>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</P>
+
+<P><B>5. NO WARRANTY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</P>
+
+<P><B>6. DISCLAIMER OF LIABILITY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</P>
+
+<P><B>7. GENERAL</B></P>
+
+<P>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</P>
+
+<P>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</P>
+
+<P>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</P>
+
+<P>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</P>
+
+<P>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</P>
+
+
+
+
+</BODY></HTML>
\ No newline at end of file
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.services.concurrent/feature.properties b/org.eclipse.virgo.site/org.eclipse.virgo.services.concurrent/feature.properties
new file mode 100644
index 0000000..6e3b258
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.services.concurrent/feature.properties
@@ -0,0 +1,180 @@
+###############################################################################
+# Copyright (c) 2011 SAP AG
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# and Apache License v2.0 which accompanies this distribution.
+# The Eclipse Public License is available at
+#   http://www.eclipse.org/legal/epl-v10.html
+# and the Apache License v2.0 is available at
+#   http://www.opensource.org/licenses/apache2.0.php.
+# You may elect to redistribute this code under either of these licenses.
+#
+# Contributors:
+#   Borislav Kapukaranov - initial contribution
+###############################################################################
+# feature.properties
+# contains externalized strings for feature.xml
+# "%foo" in feature.xml corresponds to the key "foo" in this file
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# This file should be translated.
+
+# "featureName" property - name of the feature
+featureName=Eclipse Virgo Diagnostics Concurrent Feature
+
+# "providerName" property - name of the company that provides the feature
+providerName=Eclipse.org
+
+# "updateSiteName" property - label for the update site
+
+# "description" property - description of the feature
+description=This feature provides concurrent diagnostics of a Eclipse Virgo OSGi container such as deadlock detection.\n\
+
+# "copyright" property - text of the "Feature Update Copyright"
+copyright=\
+Copyright (c) 2009, 2010, 2011 VMware Inc. and others\n\
+\n\
+All rights reserved. This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License v1.0\n\
+and Apache License v2.0 which accompanies this distribution.\n\
+The Eclipse Public License is available at\n\
+http://www.eclipse.org/legal/epl-v10.html\n\
+and the Apache License v2.0 is available at\n\
+http://www.opensource.org/licenses/apache2.0.php.\n\
+You may elect to redistribute this code under either of these\n\
+licenses.\n\
+\n\
+Contributors:\n\
+VMware Inc. - initial contribution\n\
+
+# "licenseURL" property - URL of the "Feature License"
+# do not translate value - just change to point to a locale-specific HTML page
+licenseURL=license.html
+
+# "license" property - text of the "Feature Update License"
+# should be plain text version of license agreement pointed to be "licenseURL"
+license=\
+Eclipse Foundation Software User Agreement\n\
+February 1, 2011\n\
+\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
+OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
+USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
+AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
+NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
+AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
+AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
+OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
+TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
+OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
+BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
+\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the\n\
+Eclipse Foundation is provided to you under the terms and conditions of\n\
+the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
+provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
+For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code,\n\
+documentation and other files maintained in the Eclipse Foundation source code\n\
+repository ("Repository") in software modules ("Modules") and made available\n\
+as downloadable archives ("Downloads").\n\
+\n\
+       - Content may be structured and packaged into modules to facilitate delivering,\n\
+         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
+         plug-in fragments ("Fragments"), and features ("Features").\n\
+       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
+         in a directory named "plugins".\n\
+       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
+         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
+         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
+         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
+         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be\n\
+contained in files named "about.html" ("Abouts"). The terms and\n\
+conditions governing Features and Included Features should be contained\n\
+in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
+Licenses may be located in any directory of a Download or Module\n\
+including, but not limited to the following locations:\n\
+\n\
+       - The top-level (root) directory\n\
+       - Plug-in and Fragment directories\n\
+       - Inside Plug-ins and Fragments packaged as JARs\n\
+       - Sub-directories of the directory named "src" of certain Plug-ins\n\
+       - Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
+Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
+Update License") during the installation process. If the Feature contains\n\
+Included Features, the Feature Update License should either provide you\n\
+with the terms and conditions governing the Included Features or inform\n\
+you where you can locate them. Feature Update Licenses may be found in\n\
+the "license" property of files named "feature.properties" found within a Feature.\n\
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
+terms and conditions (or references to such terms and conditions) that\n\
+govern your use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
+TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
+SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+       - Eclipse Distribution License Version 1.0 (available at http://www.eclipse.org/licenses/edl-v1.0.html)\n\
+       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
+TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
+is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
+govern that particular Content.\n\
+\n\
+\n\Use of Provisioning Technology\n\
+\n\
+The Eclipse Foundation makes available provisioning software, examples of which include,\n\
+but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
+the purpose of allowing users to install software, documentation, information and/or\n\
+other materials (collectively "Installable Software"). This capability is provided with\n\
+the intent of allowing such users to install, extend and update Eclipse-based products.\n\
+Information about packaging Installable Software is available at\n\
+http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
+\n\
+You may use Provisioning Technology to allow other parties to install Installable Software.\n\
+You shall be responsible for enabling the applicable license agreements relating to the\n\
+Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
+in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
+making it available in accordance with the Specification, you further acknowledge your\n\
+agreement to, and the acquisition of all necessary rights to permit the following:\n\
+\n\
+       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
+          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
+          extending or updating the functionality of an Eclipse-based product.\n\
+       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
+          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
+       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
+          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
+          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
+          with the Specification. Such Installable Software Agreement must inform the user of the\n\
+          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
+          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
+          indication of agreement by the user, the provisioning Technology will complete installation\n\
+          of the Installable Software.\n\
+\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are\n\
+currently may have restrictions on the import, possession, and use,\n\
+and/or re-export to another country, of encryption software. BEFORE\n\
+using any encryption software, please check the country's laws,\n\
+regulations and policies concerning the import, possession, or use, and\n\
+re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
+########### end of license property ##########################################
\ No newline at end of file
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.services.concurrent/feature.xml b/org.eclipse.virgo.site/org.eclipse.virgo.services.concurrent/feature.xml
new file mode 100755
index 0000000..bc40ec4
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.services.concurrent/feature.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="org.eclipse.virgo.services.concurrent"
+      label="%featureName"
+      version="@VIRGO.VERSION@"
+      provider-name="%providerName"
+      image="eclipse_update_120.jpg">
+
+   <description url="http://www.eclipse.org/virgo/">
+      %description
+   </description>
+
+   <copyright url="http://www.eclipse.org/virgo/">
+      %copyright
+   </copyright>
+
+   <license url="%licenseURL">
+      %license
+   </license>
+
+
+    <plugin
+        id="org.eclipse.virgo.nano.services.concurrent"
+        download-size="0"
+        install-size="0"
+        version="@VIRGO.VERSION@"
+        unpack="false"
+        autostart="true"/>
+
+</feature>
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.services.concurrent/license.html b/org.eclipse.virgo.site/org.eclipse.virgo.services.concurrent/license.html
new file mode 100755
index 0000000..f19c483
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.services.concurrent/license.html
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Foundation Software User Agreement</title>
+</head>
+
+<body lang="EN-US">
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>February 1, 2011</p>
+
+<h3>Usage Of Content</h3>
+
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
+
+<h3>Applicable Licenses</h3>
+
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
+   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
+
+<ul>
+       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
+       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
+       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
+      and/or Fragments associated with that Feature.</li>
+       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
+Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+       <li>The top-level (root) directory</li>
+       <li>Plug-in and Fragment directories</li>
+       <li>Inside Plug-ins and Fragments packaged as JARs</li>
+       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
+       <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
+installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+       <li>Eclipse Distribution License Version 1.0 (available at <a href="http://www.eclipse.org/licenses/edl-v10.html">http://www.eclipse.org/licenses/edl-v1.0.html</a>)</li>
+       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+
+<h3>Use of Provisioning Technology</h3>
+
+<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
+   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
+   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
+   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
+       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
+   (&quot;Specification&quot;).</p>
+
+<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
+   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
+   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
+   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
+
+<ol>
+       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
+       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
+       product.</li>
+       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
+       accessed and copied to the Target Machine.</li>
+       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
+       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
+       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
+       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
+       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
+</ol>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+
+<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
+</body>
+</html>
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.services.ds/build.gradle b/org.eclipse.virgo.site/org.eclipse.virgo.services.ds/build.gradle
new file mode 100644
index 0000000..32bcbb5
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.services.ds/build.gradle
@@ -0,0 +1 @@
+apply plugin: eclipsebuild.FeaturePlugin
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.services.ds/build.properties b/org.eclipse.virgo.site/org.eclipse.virgo.services.ds/build.properties
new file mode 100644
index 0000000..db80add
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.services.ds/build.properties
@@ -0,0 +1,4 @@
+bin.includes = feature.xml,\
+               feature.properties,\
+               epl-v10.html,\
+               eclipse_update_120.jpg
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.services.ds/eclipse_update_120.jpg b/org.eclipse.virgo.site/org.eclipse.virgo.services.ds/eclipse_update_120.jpg
new file mode 100755
index 0000000..bfdf708
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.services.ds/eclipse_update_120.jpg
Binary files differ
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.services.ds/epl-v10.html b/org.eclipse.virgo.site/org.eclipse.virgo.services.ds/epl-v10.html
new file mode 100755
index 0000000..eecc800
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.services.ds/epl-v10.html
@@ -0,0 +1,258 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!-- saved from url=(0049)http://www.eclipse.org/org/documents/epl-v10.html -->
+<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+
+<TITLE>Eclipse Public License - Version 1.0</TITLE>
+<STYLE type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </STYLE>
+
+</HEAD><BODY lang="EN-US">
+
+<H2>Eclipse Public License - v 1.0</H2>
+
+<P>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</P>
+
+<P><B>1. DEFINITIONS</B></P>
+
+<P>"Contribution" means:</P>
+
+<P class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</P>
+<P class="list">b) in the case of each subsequent Contributor:</P>
+<P class="list">i) changes to the Program, and</P>
+<P class="list">ii) additions to the Program;</P>
+<P class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</P>
+
+<P>"Contributor" means any person or entity that distributes
+the Program.</P>
+
+<P>"Licensed Patents" mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</P>
+
+<P>"Program" means the Contributions distributed in accordance
+with this Agreement.</P>
+
+<P>"Recipient" means anyone who receives the Program under
+this Agreement, including all Contributors.</P>
+
+<P><B>2. GRANT OF RIGHTS</B></P>
+
+<P class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</P>
+
+<P class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</P>
+
+<P class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</P>
+
+<P class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</P>
+
+<P><B>3. REQUIREMENTS</B></P>
+
+<P>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</P>
+
+<P class="list">a) it complies with the terms and conditions of this
+Agreement; and</P>
+
+<P class="list">b) its license agreement:</P>
+
+<P class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</P>
+
+<P class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</P>
+
+<P class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</P>
+
+<P class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</P>
+
+<P>When the Program is made available in source code form:</P>
+
+<P class="list">a) it must be made available under this Agreement; and</P>
+
+<P class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</P>
+
+<P>Contributors may not remove or alter any copyright notices contained
+within the Program.</P>
+
+<P>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</P>
+
+<P><B>4. COMMERCIAL DISTRIBUTION</B></P>
+
+<P>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+("Commercial Contributor") hereby agrees to defend and
+indemnify every other Contributor ("Indemnified Contributor")
+against any losses, damages and costs (collectively "Losses")
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</P>
+
+<P>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</P>
+
+<P><B>5. NO WARRANTY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</P>
+
+<P><B>6. DISCLAIMER OF LIABILITY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</P>
+
+<P><B>7. GENERAL</B></P>
+
+<P>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</P>
+
+<P>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</P>
+
+<P>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</P>
+
+<P>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</P>
+
+<P>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</P>
+
+
+
+
+</BODY></HTML>
\ No newline at end of file
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.services.ds/feature.properties b/org.eclipse.virgo.site/org.eclipse.virgo.services.ds/feature.properties
new file mode 100644
index 0000000..e76d968
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.services.ds/feature.properties
@@ -0,0 +1,180 @@
+###############################################################################
+# Copyright (c) 2011 SAP AG
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# and Apache License v2.0 which accompanies this distribution.
+# The Eclipse Public License is available at
+#   http://www.eclipse.org/legal/epl-v10.html
+# and the Apache License v2.0 is available at
+#   http://www.opensource.org/licenses/apache2.0.php.
+# You may elect to redistribute this code under either of these licenses.
+#
+# Contributors:
+#   Borislav Kapukaranov - initial contribution
+###############################################################################
+# feature.properties
+# contains externalized strings for feature.xml
+# "%foo" in feature.xml corresponds to the key "foo" in this file
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# This file should be translated.
+
+# "featureName" property - name of the feature
+featureName=Eclipse Virgo Diagnostics DS Feature
+
+# "providerName" property - name of the company that provides the feature
+providerName=Eclipse.org
+
+# "updateSiteName" property - label for the update site
+
+# "description" property - description of the feature
+description=This feature provides DS supportability features of a Eclipse Virgo OSGi container such as unsatisfied services detection.\n\
+
+# "copyright" property - text of the "Feature Update Copyright"
+copyright=\
+Copyright (c) 2009, 2010, 2011 VMware Inc. and others\n\
+\n\
+All rights reserved. This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License v1.0\n\
+and Apache License v2.0 which accompanies this distribution.\n\
+The Eclipse Public License is available at\n\
+http://www.eclipse.org/legal/epl-v10.html\n\
+and the Apache License v2.0 is available at\n\
+http://www.opensource.org/licenses/apache2.0.php.\n\
+You may elect to redistribute this code under either of these\n\
+licenses.\n\
+\n\
+Contributors:\n\
+VMware Inc. - initial contribution\n\
+
+# "licenseURL" property - URL of the "Feature License"
+# do not translate value - just change to point to a locale-specific HTML page
+licenseURL=license.html
+
+# "license" property - text of the "Feature Update License"
+# should be plain text version of license agreement pointed to be "licenseURL"
+license=\
+Eclipse Foundation Software User Agreement\n\
+February 1, 2011\n\
+\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
+OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
+USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
+AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
+NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
+AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
+AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
+OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
+TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
+OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
+BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
+\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the\n\
+Eclipse Foundation is provided to you under the terms and conditions of\n\
+the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
+provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
+For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code,\n\
+documentation and other files maintained in the Eclipse Foundation source code\n\
+repository ("Repository") in software modules ("Modules") and made available\n\
+as downloadable archives ("Downloads").\n\
+\n\
+       - Content may be structured and packaged into modules to facilitate delivering,\n\
+         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
+         plug-in fragments ("Fragments"), and features ("Features").\n\
+       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
+         in a directory named "plugins".\n\
+       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
+         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
+         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
+         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
+         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be\n\
+contained in files named "about.html" ("Abouts"). The terms and\n\
+conditions governing Features and Included Features should be contained\n\
+in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
+Licenses may be located in any directory of a Download or Module\n\
+including, but not limited to the following locations:\n\
+\n\
+       - The top-level (root) directory\n\
+       - Plug-in and Fragment directories\n\
+       - Inside Plug-ins and Fragments packaged as JARs\n\
+       - Sub-directories of the directory named "src" of certain Plug-ins\n\
+       - Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
+Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
+Update License") during the installation process. If the Feature contains\n\
+Included Features, the Feature Update License should either provide you\n\
+with the terms and conditions governing the Included Features or inform\n\
+you where you can locate them. Feature Update Licenses may be found in\n\
+the "license" property of files named "feature.properties" found within a Feature.\n\
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
+terms and conditions (or references to such terms and conditions) that\n\
+govern your use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
+TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
+SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+       - Eclipse Distribution License Version 1.0 (available at http://www.eclipse.org/licenses/edl-v1.0.html)\n\
+       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
+TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
+is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
+govern that particular Content.\n\
+\n\
+\n\Use of Provisioning Technology\n\
+\n\
+The Eclipse Foundation makes available provisioning software, examples of which include,\n\
+but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
+the purpose of allowing users to install software, documentation, information and/or\n\
+other materials (collectively "Installable Software"). This capability is provided with\n\
+the intent of allowing such users to install, extend and update Eclipse-based products.\n\
+Information about packaging Installable Software is available at\n\
+http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
+\n\
+You may use Provisioning Technology to allow other parties to install Installable Software.\n\
+You shall be responsible for enabling the applicable license agreements relating to the\n\
+Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
+in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
+making it available in accordance with the Specification, you further acknowledge your\n\
+agreement to, and the acquisition of all necessary rights to permit the following:\n\
+\n\
+       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
+          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
+          extending or updating the functionality of an Eclipse-based product.\n\
+       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
+          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
+       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
+          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
+          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
+          with the Specification. Such Installable Software Agreement must inform the user of the\n\
+          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
+          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
+          indication of agreement by the user, the provisioning Technology will complete installation\n\
+          of the Installable Software.\n\
+\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are\n\
+currently may have restrictions on the import, possession, and use,\n\
+and/or re-export to another country, of encryption software. BEFORE\n\
+using any encryption software, please check the country's laws,\n\
+regulations and policies concerning the import, possession, or use, and\n\
+re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
+########### end of license property ##########################################
\ No newline at end of file
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.services.ds/feature.xml b/org.eclipse.virgo.site/org.eclipse.virgo.services.ds/feature.xml
new file mode 100755
index 0000000..00884ed
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.services.ds/feature.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="org.eclipse.virgo.services.ds"
+      label="%featureName"
+      version="@VIRGO.VERSION@"
+      provider-name="%providerName"
+      image="eclipse_update_120.jpg">
+
+   <description url="http://www.eclipse.org/virgo/">
+      %description
+   </description>
+
+   <copyright url="http://www.eclipse.org/virgo/">
+      %copyright
+   </copyright>
+
+   <license url="%licenseURL">
+      %license
+   </license>
+
+    <plugin
+        id="org.eclipse.virgo.nano.services.ds"
+        download-size="0"
+        install-size="0"
+        version="@VIRGO.VERSION@"
+        unpack="false"
+        autostart="true"/>
+
+</feature>
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.services.ds/license.html b/org.eclipse.virgo.site/org.eclipse.virgo.services.ds/license.html
new file mode 100755
index 0000000..f19c483
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.services.ds/license.html
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Foundation Software User Agreement</title>
+</head>
+
+<body lang="EN-US">
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>February 1, 2011</p>
+
+<h3>Usage Of Content</h3>
+
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
+
+<h3>Applicable Licenses</h3>
+
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
+   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
+
+<ul>
+       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
+       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
+       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
+      and/or Fragments associated with that Feature.</li>
+       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
+Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+       <li>The top-level (root) directory</li>
+       <li>Plug-in and Fragment directories</li>
+       <li>Inside Plug-ins and Fragments packaged as JARs</li>
+       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
+       <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
+installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+       <li>Eclipse Distribution License Version 1.0 (available at <a href="http://www.eclipse.org/licenses/edl-v10.html">http://www.eclipse.org/licenses/edl-v1.0.html</a>)</li>
+       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+
+<h3>Use of Provisioning Technology</h3>
+
+<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
+   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
+   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
+   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
+       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
+   (&quot;Specification&quot;).</p>
+
+<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
+   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
+   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
+   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
+
+<ol>
+       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
+       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
+       product.</li>
+       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
+       accessed and copied to the Target Machine.</li>
+       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
+       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
+       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
+       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
+       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
+</ol>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+
+<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
+</body>
+</html>
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.shell/build.gradle b/org.eclipse.virgo.site/org.eclipse.virgo.shell/build.gradle
new file mode 100644
index 0000000..32bcbb5
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.shell/build.gradle
@@ -0,0 +1 @@
+apply plugin: eclipsebuild.FeaturePlugin
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.shell/build.properties b/org.eclipse.virgo.site/org.eclipse.virgo.shell/build.properties
new file mode 100644
index 0000000..db80add
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.shell/build.properties
@@ -0,0 +1,4 @@
+bin.includes = feature.xml,\
+               feature.properties,\
+               epl-v10.html,\
+               eclipse_update_120.jpg
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.shell/eclipse_update_120.jpg b/org.eclipse.virgo.site/org.eclipse.virgo.shell/eclipse_update_120.jpg
new file mode 100755
index 0000000..bfdf708
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.shell/eclipse_update_120.jpg
Binary files differ
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.shell/epl-v10.html b/org.eclipse.virgo.site/org.eclipse.virgo.shell/epl-v10.html
new file mode 100755
index 0000000..eecc800
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.shell/epl-v10.html
@@ -0,0 +1,258 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!-- saved from url=(0049)http://www.eclipse.org/org/documents/epl-v10.html -->
+<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+
+<TITLE>Eclipse Public License - Version 1.0</TITLE>
+<STYLE type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </STYLE>
+
+</HEAD><BODY lang="EN-US">
+
+<H2>Eclipse Public License - v 1.0</H2>
+
+<P>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</P>
+
+<P><B>1. DEFINITIONS</B></P>
+
+<P>"Contribution" means:</P>
+
+<P class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</P>
+<P class="list">b) in the case of each subsequent Contributor:</P>
+<P class="list">i) changes to the Program, and</P>
+<P class="list">ii) additions to the Program;</P>
+<P class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</P>
+
+<P>"Contributor" means any person or entity that distributes
+the Program.</P>
+
+<P>"Licensed Patents" mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</P>
+
+<P>"Program" means the Contributions distributed in accordance
+with this Agreement.</P>
+
+<P>"Recipient" means anyone who receives the Program under
+this Agreement, including all Contributors.</P>
+
+<P><B>2. GRANT OF RIGHTS</B></P>
+
+<P class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</P>
+
+<P class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</P>
+
+<P class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</P>
+
+<P class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</P>
+
+<P><B>3. REQUIREMENTS</B></P>
+
+<P>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</P>
+
+<P class="list">a) it complies with the terms and conditions of this
+Agreement; and</P>
+
+<P class="list">b) its license agreement:</P>
+
+<P class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</P>
+
+<P class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</P>
+
+<P class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</P>
+
+<P class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</P>
+
+<P>When the Program is made available in source code form:</P>
+
+<P class="list">a) it must be made available under this Agreement; and</P>
+
+<P class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</P>
+
+<P>Contributors may not remove or alter any copyright notices contained
+within the Program.</P>
+
+<P>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</P>
+
+<P><B>4. COMMERCIAL DISTRIBUTION</B></P>
+
+<P>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+("Commercial Contributor") hereby agrees to defend and
+indemnify every other Contributor ("Indemnified Contributor")
+against any losses, damages and costs (collectively "Losses")
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</P>
+
+<P>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</P>
+
+<P><B>5. NO WARRANTY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</P>
+
+<P><B>6. DISCLAIMER OF LIABILITY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</P>
+
+<P><B>7. GENERAL</B></P>
+
+<P>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</P>
+
+<P>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</P>
+
+<P>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</P>
+
+<P>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</P>
+
+<P>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</P>
+
+
+
+
+</BODY></HTML>
\ No newline at end of file
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.shell/feature.properties b/org.eclipse.virgo.site/org.eclipse.virgo.shell/feature.properties
new file mode 100644
index 0000000..73c2850
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.shell/feature.properties
@@ -0,0 +1,180 @@
+###############################################################################
+# Copyright (c) 2011 SAP AG
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# and Apache License v2.0 which accompanies this distribution.
+# The Eclipse Public License is available at
+#   http://www.eclipse.org/legal/epl-v10.html
+# and the Apache License v2.0 is available at
+#   http://www.opensource.org/licenses/apache2.0.php.
+# You may elect to redistribute this code under either of these licenses.
+#
+# Contributors:
+#   Borislav Kapukaranov - initial contribution
+###############################################################################
+# feature.properties
+# contains externalized strings for feature.xml
+# "%foo" in feature.xml corresponds to the key "foo" in this file
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# This file should be translated.
+
+# "featureName" property - name of the feature
+featureName=Eclipse Virgo Shell Feature
+
+# "providerName" property - name of the company that provides the feature
+providerName=Eclipse.org
+
+# "updateSiteName" property - label for the update site
+
+# "description" property - description of the feature
+description=This feature provides the Shell feature of an Eclipse Virgo OSGi container. It is based on the Equinox console.\n\
+
+# "copyright" property - text of the "Feature Update Copyright"
+copyright=\
+Copyright (c) 2009, 2010, 2011 VMware Inc. and others\n\
+\n\
+All rights reserved. This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License v1.0\n\
+and Apache License v2.0 which accompanies this distribution.\n\
+The Eclipse Public License is available at\n\
+http://www.eclipse.org/legal/epl-v10.html\n\
+and the Apache License v2.0 is available at\n\
+http://www.opensource.org/licenses/apache2.0.php.\n\
+You may elect to redistribute this code under either of these\n\
+licenses.\n\
+\n\
+Contributors:\n\
+VMware Inc. - initial contribution\n\
+
+# "licenseURL" property - URL of the "Feature License"
+# do not translate value - just change to point to a locale-specific HTML page
+licenseURL=license.html
+
+# "license" property - text of the "Feature Update License"
+# should be plain text version of license agreement pointed to be "licenseURL"
+license=\
+Eclipse Foundation Software User Agreement\n\
+February 1, 2011\n\
+\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
+OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
+USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
+AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
+NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
+AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
+AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
+OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
+TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
+OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
+BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
+\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the\n\
+Eclipse Foundation is provided to you under the terms and conditions of\n\
+the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
+provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
+For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code,\n\
+documentation and other files maintained in the Eclipse Foundation source code\n\
+repository ("Repository") in software modules ("Modules") and made available\n\
+as downloadable archives ("Downloads").\n\
+\n\
+       - Content may be structured and packaged into modules to facilitate delivering,\n\
+         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
+         plug-in fragments ("Fragments"), and features ("Features").\n\
+       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
+         in a directory named "plugins".\n\
+       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
+         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
+         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
+         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
+         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be\n\
+contained in files named "about.html" ("Abouts"). The terms and\n\
+conditions governing Features and Included Features should be contained\n\
+in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
+Licenses may be located in any directory of a Download or Module\n\
+including, but not limited to the following locations:\n\
+\n\
+       - The top-level (root) directory\n\
+       - Plug-in and Fragment directories\n\
+       - Inside Plug-ins and Fragments packaged as JARs\n\
+       - Sub-directories of the directory named "src" of certain Plug-ins\n\
+       - Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
+Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
+Update License") during the installation process. If the Feature contains\n\
+Included Features, the Feature Update License should either provide you\n\
+with the terms and conditions governing the Included Features or inform\n\
+you where you can locate them. Feature Update Licenses may be found in\n\
+the "license" property of files named "feature.properties" found within a Feature.\n\
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
+terms and conditions (or references to such terms and conditions) that\n\
+govern your use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
+TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
+SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+       - Eclipse Distribution License Version 1.0 (available at http://www.eclipse.org/licenses/edl-v1.0.html)\n\
+       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
+TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
+is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
+govern that particular Content.\n\
+\n\
+\n\Use of Provisioning Technology\n\
+\n\
+The Eclipse Foundation makes available provisioning software, examples of which include,\n\
+but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
+the purpose of allowing users to install software, documentation, information and/or\n\
+other materials (collectively "Installable Software"). This capability is provided with\n\
+the intent of allowing such users to install, extend and update Eclipse-based products.\n\
+Information about packaging Installable Software is available at\n\
+http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
+\n\
+You may use Provisioning Technology to allow other parties to install Installable Software.\n\
+You shall be responsible for enabling the applicable license agreements relating to the\n\
+Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
+in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
+making it available in accordance with the Specification, you further acknowledge your\n\
+agreement to, and the acquisition of all necessary rights to permit the following:\n\
+\n\
+       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
+          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
+          extending or updating the functionality of an Eclipse-based product.\n\
+       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
+          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
+       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
+          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
+          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
+          with the Specification. Such Installable Software Agreement must inform the user of the\n\
+          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
+          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
+          indication of agreement by the user, the provisioning Technology will complete installation\n\
+          of the Installable Software.\n\
+\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are\n\
+currently may have restrictions on the import, possession, and use,\n\
+and/or re-export to another country, of encryption software. BEFORE\n\
+using any encryption software, please check the country's laws,\n\
+regulations and policies concerning the import, possession, or use, and\n\
+re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
+########### end of license property ##########################################
\ No newline at end of file
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.shell/feature.xml b/org.eclipse.virgo.site/org.eclipse.virgo.shell/feature.xml
new file mode 100755
index 0000000..1750ee5
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.shell/feature.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="org.eclipse.virgo.shell"
+      label="%featureName"
+      version="@VIRGO.VERSION@"
+      provider-name="%providerName"
+      image="eclipse_update_120.jpg">
+
+   <description url="http://www.eclipse.org/virgo/">
+      %description
+   </description>
+
+   <copyright url="http://www.eclipse.org/virgo/">
+      %copyright
+   </copyright>
+
+   <license url="%licenseURL">
+      %license
+   </license>
+
+   <plugin
+         id="org.apache.mina.core"
+         download-size="0"
+         install-size="0"
+         version="@MINA.CORE.VERSION@"
+         unpack="false"
+         autostart="true"/>
+
+   <plugin
+         id="org.apache.sshd.core"
+         download-size="0"
+         install-size="0"
+         version="@SSHD.CORE.VERSION@"
+         unpack="false"
+         autostart="true"/>
+
+   <plugin
+         id="org.apache.felix.gogo.command"
+         download-size="0"
+         install-size="0"
+         version="@FELIX.GOGO.COMMAND.VERSION@"
+         unpack="false"
+         autostart="true"/>
+
+   <plugin
+         id="org.apache.felix.gogo.runtime"
+         download-size="0"
+         install-size="0"
+         version="@FELIX.GOGO.RUNTIME.VERSION@"
+         unpack="false"
+         autostart="true"/>
+
+   <plugin
+         id="org.apache.felix.gogo.shell"
+         download-size="0"
+         install-size="0"
+         version="@FELIX.GOGO.SHELL.VERSION@"
+         unpack="false"
+         autostart="true"/>
+
+   <plugin
+         id="org.eclipse.equinox.console"
+         download-size="0"
+         install-size="0"
+         version="@EQUINOX.CONSOLE.VERSION@"
+         unpack="false"
+         autostart="true"/>
+         
+   <plugin
+         id="org.eclipse.equinox.console.ssh"
+         download-size="0"
+         install-size="0"
+         version="@EQUINOX.CONSOLE.SSH.VERSION@"
+         unpack="false"
+         autostart="true"/>
+
+   <plugin
+         id="org.eclipse.virgo.shell.command"
+         download-size="0"
+         install-size="0"
+         version="@VIRGO.VERSION@"
+         unpack="false"
+         autostart="true"/>
+
+</feature>
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.shell/license.html b/org.eclipse.virgo.site/org.eclipse.virgo.shell/license.html
new file mode 100755
index 0000000..f19c483
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.shell/license.html
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Foundation Software User Agreement</title>
+</head>
+
+<body lang="EN-US">
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>February 1, 2011</p>
+
+<h3>Usage Of Content</h3>
+
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
+
+<h3>Applicable Licenses</h3>
+
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
+   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
+
+<ul>
+       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
+       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
+       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
+      and/or Fragments associated with that Feature.</li>
+       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
+Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+       <li>The top-level (root) directory</li>
+       <li>Plug-in and Fragment directories</li>
+       <li>Inside Plug-ins and Fragments packaged as JARs</li>
+       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
+       <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
+installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+       <li>Eclipse Distribution License Version 1.0 (available at <a href="http://www.eclipse.org/licenses/edl-v10.html">http://www.eclipse.org/licenses/edl-v1.0.html</a>)</li>
+       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+
+<h3>Use of Provisioning Technology</h3>
+
+<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
+   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
+   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
+   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
+       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
+   (&quot;Specification&quot;).</p>
+
+<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
+   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
+   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
+   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
+
+<ol>
+       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
+       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
+       product.</li>
+       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
+       accessed and copied to the Target Machine.</li>
+       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
+       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
+       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
+       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
+       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
+</ol>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+
+<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
+</body>
+</html>
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.simpleconfigurator/build.gradle b/org.eclipse.virgo.site/org.eclipse.virgo.simpleconfigurator/build.gradle
new file mode 100644
index 0000000..32bcbb5
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.simpleconfigurator/build.gradle
@@ -0,0 +1 @@
+apply plugin: eclipsebuild.FeaturePlugin
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.simpleconfigurator/build.properties b/org.eclipse.virgo.site/org.eclipse.virgo.simpleconfigurator/build.properties
new file mode 100644
index 0000000..a13e18b
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.simpleconfigurator/build.properties
@@ -0,0 +1,5 @@
+bin.includes = feature.xml,\
+               feature.properties,\
+               epl-v10.html,\
+               eclipse_update_120.jpg,\
+               p2.inf
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.simpleconfigurator/eclipse_update_120.jpg b/org.eclipse.virgo.site/org.eclipse.virgo.simpleconfigurator/eclipse_update_120.jpg
new file mode 100755
index 0000000..bfdf708
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.simpleconfigurator/eclipse_update_120.jpg
Binary files differ
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.simpleconfigurator/epl-v10.html b/org.eclipse.virgo.site/org.eclipse.virgo.simpleconfigurator/epl-v10.html
new file mode 100755
index 0000000..eecc800
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.simpleconfigurator/epl-v10.html
@@ -0,0 +1,258 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!-- saved from url=(0049)http://www.eclipse.org/org/documents/epl-v10.html -->
+<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+
+<TITLE>Eclipse Public License - Version 1.0</TITLE>
+<STYLE type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </STYLE>
+
+</HEAD><BODY lang="EN-US">
+
+<H2>Eclipse Public License - v 1.0</H2>
+
+<P>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</P>
+
+<P><B>1. DEFINITIONS</B></P>
+
+<P>"Contribution" means:</P>
+
+<P class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</P>
+<P class="list">b) in the case of each subsequent Contributor:</P>
+<P class="list">i) changes to the Program, and</P>
+<P class="list">ii) additions to the Program;</P>
+<P class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</P>
+
+<P>"Contributor" means any person or entity that distributes
+the Program.</P>
+
+<P>"Licensed Patents" mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</P>
+
+<P>"Program" means the Contributions distributed in accordance
+with this Agreement.</P>
+
+<P>"Recipient" means anyone who receives the Program under
+this Agreement, including all Contributors.</P>
+
+<P><B>2. GRANT OF RIGHTS</B></P>
+
+<P class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</P>
+
+<P class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</P>
+
+<P class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</P>
+
+<P class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</P>
+
+<P><B>3. REQUIREMENTS</B></P>
+
+<P>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</P>
+
+<P class="list">a) it complies with the terms and conditions of this
+Agreement; and</P>
+
+<P class="list">b) its license agreement:</P>
+
+<P class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</P>
+
+<P class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</P>
+
+<P class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</P>
+
+<P class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</P>
+
+<P>When the Program is made available in source code form:</P>
+
+<P class="list">a) it must be made available under this Agreement; and</P>
+
+<P class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</P>
+
+<P>Contributors may not remove or alter any copyright notices contained
+within the Program.</P>
+
+<P>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</P>
+
+<P><B>4. COMMERCIAL DISTRIBUTION</B></P>
+
+<P>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+("Commercial Contributor") hereby agrees to defend and
+indemnify every other Contributor ("Indemnified Contributor")
+against any losses, damages and costs (collectively "Losses")
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</P>
+
+<P>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</P>
+
+<P><B>5. NO WARRANTY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</P>
+
+<P><B>6. DISCLAIMER OF LIABILITY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</P>
+
+<P><B>7. GENERAL</B></P>
+
+<P>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</P>
+
+<P>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</P>
+
+<P>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</P>
+
+<P>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</P>
+
+<P>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</P>
+
+
+
+
+</BODY></HTML>
\ No newline at end of file
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.simpleconfigurator/feature.properties b/org.eclipse.virgo.site/org.eclipse.virgo.simpleconfigurator/feature.properties
new file mode 100644
index 0000000..4399294
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.simpleconfigurator/feature.properties
@@ -0,0 +1,180 @@
+###############################################################################
+# Copyright (c) 2011 SAP AG
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# and Apache License v2.0 which accompanies this distribution.
+# The Eclipse Public License is available at
+#   http://www.eclipse.org/legal/epl-v10.html
+# and the Apache License v2.0 is available at
+#   http://www.opensource.org/licenses/apache2.0.php.
+# You may elect to redistribute this code under either of these licenses.
+#
+# Contributors:
+#   Borislav Kapukaranov - initial contribution
+###############################################################################
+# feature.properties
+# contains externalized strings for feature.xml
+# "%foo" in feature.xml corresponds to the key "foo" in this file
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# This file should be translated.
+
+# "featureName" property - name of the feature
+featureName=Eclipse Virgo Simple Configurator Feature
+
+# "providerName" property - name of the company that provides the feature
+providerName=Eclipse.org
+
+# "updateSiteName" property - label for the update site
+
+# "description" property - description of the feature
+description=This feature provides Equinox's simple configurator for Virgo. It enables more readable initial bundles configuration.\n\
+
+# "copyright" property - text of the "Feature Update Copyright"
+copyright=\
+Copyright (c) 2009, 2010, 2011 VMware Inc. and others\n\
+\n\
+All rights reserved. This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License v1.0\n\
+and Apache License v2.0 which accompanies this distribution.\n\
+The Eclipse Public License is available at\n\
+http://www.eclipse.org/legal/epl-v10.html\n\
+and the Apache License v2.0 is available at\n\
+http://www.opensource.org/licenses/apache2.0.php.\n\
+You may elect to redistribute this code under either of these\n\
+licenses.\n\
+\n\
+Contributors:\n\
+VMware Inc. - initial contribution\n\
+
+# "licenseURL" property - URL of the "Feature License"
+# do not translate value - just change to point to a locale-specific HTML page
+licenseURL=license.html
+
+# "license" property - text of the "Feature Update License"
+# should be plain text version of license agreement pointed to be "licenseURL"
+license=\
+Eclipse Foundation Software User Agreement\n\
+February 1, 2011\n\
+\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
+OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
+USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
+AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
+NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
+AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
+AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
+OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
+TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
+OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
+BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
+\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the\n\
+Eclipse Foundation is provided to you under the terms and conditions of\n\
+the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
+provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
+For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code,\n\
+documentation and other files maintained in the Eclipse Foundation source code\n\
+repository ("Repository") in software modules ("Modules") and made available\n\
+as downloadable archives ("Downloads").\n\
+\n\
+       - Content may be structured and packaged into modules to facilitate delivering,\n\
+         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
+         plug-in fragments ("Fragments"), and features ("Features").\n\
+       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
+         in a directory named "plugins".\n\
+       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
+         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
+         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
+         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
+         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be\n\
+contained in files named "about.html" ("Abouts"). The terms and\n\
+conditions governing Features and Included Features should be contained\n\
+in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
+Licenses may be located in any directory of a Download or Module\n\
+including, but not limited to the following locations:\n\
+\n\
+       - The top-level (root) directory\n\
+       - Plug-in and Fragment directories\n\
+       - Inside Plug-ins and Fragments packaged as JARs\n\
+       - Sub-directories of the directory named "src" of certain Plug-ins\n\
+       - Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
+Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
+Update License") during the installation process. If the Feature contains\n\
+Included Features, the Feature Update License should either provide you\n\
+with the terms and conditions governing the Included Features or inform\n\
+you where you can locate them. Feature Update Licenses may be found in\n\
+the "license" property of files named "feature.properties" found within a Feature.\n\
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
+terms and conditions (or references to such terms and conditions) that\n\
+govern your use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
+TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
+SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+       - Eclipse Distribution License Version 1.0 (available at http://www.eclipse.org/licenses/edl-v1.0.html)\n\
+       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
+TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
+is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
+govern that particular Content.\n\
+\n\
+\n\Use of Provisioning Technology\n\
+\n\
+The Eclipse Foundation makes available provisioning software, examples of which include,\n\
+but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
+the purpose of allowing users to install software, documentation, information and/or\n\
+other materials (collectively "Installable Software"). This capability is provided with\n\
+the intent of allowing such users to install, extend and update Eclipse-based products.\n\
+Information about packaging Installable Software is available at\n\
+http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
+\n\
+You may use Provisioning Technology to allow other parties to install Installable Software.\n\
+You shall be responsible for enabling the applicable license agreements relating to the\n\
+Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
+in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
+making it available in accordance with the Specification, you further acknowledge your\n\
+agreement to, and the acquisition of all necessary rights to permit the following:\n\
+\n\
+       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
+          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
+          extending or updating the functionality of an Eclipse-based product.\n\
+       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
+          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
+       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
+          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
+          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
+          with the Specification. Such Installable Software Agreement must inform the user of the\n\
+          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
+          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
+          indication of agreement by the user, the provisioning Technology will complete installation\n\
+          of the Installable Software.\n\
+\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are\n\
+currently may have restrictions on the import, possession, and use,\n\
+and/or re-export to another country, of encryption software. BEFORE\n\
+using any encryption software, please check the country's laws,\n\
+regulations and policies concerning the import, possession, or use, and\n\
+re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
+########### end of license property ##########################################
\ No newline at end of file
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.simpleconfigurator/feature.xml b/org.eclipse.virgo.site/org.eclipse.virgo.simpleconfigurator/feature.xml
new file mode 100755
index 0000000..e37e8da
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.simpleconfigurator/feature.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="org.eclipse.virgo.simpleconfigurator"
+      label="%featureName"
+      version="@VIRGO.VERSION@"
+      provider-name="%providerName"
+      image="eclipse_update_120.jpg">
+
+   <description url="http://www.eclipse.org/virgo/">
+      %description
+   </description>
+
+   <copyright url="http://www.eclipse.org/virgo/">
+      %copyright
+   </copyright>
+
+   <license url="%licenseURL">
+      %license
+   </license>
+
+   <plugin
+         id="org.eclipse.equinox.simpleconfigurator"
+         download-size="0"
+         install-size="0"
+         version="@EQUINOX.SC.VERSION@"
+         unpack="false"/>
+
+</feature>
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.simpleconfigurator/license.html b/org.eclipse.virgo.site/org.eclipse.virgo.simpleconfigurator/license.html
new file mode 100755
index 0000000..f19c483
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.simpleconfigurator/license.html
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Foundation Software User Agreement</title>
+</head>
+
+<body lang="EN-US">
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>February 1, 2011</p>
+
+<h3>Usage Of Content</h3>
+
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
+
+<h3>Applicable Licenses</h3>
+
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
+   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
+
+<ul>
+       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
+       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
+       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
+      and/or Fragments associated with that Feature.</li>
+       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
+Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+       <li>The top-level (root) directory</li>
+       <li>Plug-in and Fragment directories</li>
+       <li>Inside Plug-ins and Fragments packaged as JARs</li>
+       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
+       <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
+installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+       <li>Eclipse Distribution License Version 1.0 (available at <a href="http://www.eclipse.org/licenses/edl-v10.html">http://www.eclipse.org/licenses/edl-v1.0.html</a>)</li>
+       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+
+<h3>Use of Provisioning Technology</h3>
+
+<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
+   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
+   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
+   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
+       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
+   (&quot;Specification&quot;).</p>
+
+<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
+   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
+   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
+   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
+
+<ol>
+       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
+       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
+       product.</li>
+       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
+       accessed and copied to the Target Machine.</li>
+       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
+       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
+       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
+       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
+       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
+</ol>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+
+<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
+</body>
+</html>
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.springdm/build.gradle b/org.eclipse.virgo.site/org.eclipse.virgo.springdm/build.gradle
new file mode 100644
index 0000000..32bcbb5
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.springdm/build.gradle
@@ -0,0 +1 @@
+apply plugin: eclipsebuild.FeaturePlugin
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.springdm/build.properties b/org.eclipse.virgo.site/org.eclipse.virgo.springdm/build.properties
new file mode 100644
index 0000000..64f93a9
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.springdm/build.properties
@@ -0,0 +1 @@
+bin.includes = feature.xml
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.springdm/eclipse_update_120.jpg b/org.eclipse.virgo.site/org.eclipse.virgo.springdm/eclipse_update_120.jpg
new file mode 100755
index 0000000..bfdf708
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.springdm/eclipse_update_120.jpg
Binary files differ
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.springdm/epl-v10.html b/org.eclipse.virgo.site/org.eclipse.virgo.springdm/epl-v10.html
new file mode 100755
index 0000000..eecc800
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.springdm/epl-v10.html
@@ -0,0 +1,258 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!-- saved from url=(0049)http://www.eclipse.org/org/documents/epl-v10.html -->
+<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+
+<TITLE>Eclipse Public License - Version 1.0</TITLE>
+<STYLE type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </STYLE>
+
+</HEAD><BODY lang="EN-US">
+
+<H2>Eclipse Public License - v 1.0</H2>
+
+<P>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</P>
+
+<P><B>1. DEFINITIONS</B></P>
+
+<P>"Contribution" means:</P>
+
+<P class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</P>
+<P class="list">b) in the case of each subsequent Contributor:</P>
+<P class="list">i) changes to the Program, and</P>
+<P class="list">ii) additions to the Program;</P>
+<P class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</P>
+
+<P>"Contributor" means any person or entity that distributes
+the Program.</P>
+
+<P>"Licensed Patents" mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</P>
+
+<P>"Program" means the Contributions distributed in accordance
+with this Agreement.</P>
+
+<P>"Recipient" means anyone who receives the Program under
+this Agreement, including all Contributors.</P>
+
+<P><B>2. GRANT OF RIGHTS</B></P>
+
+<P class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</P>
+
+<P class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</P>
+
+<P class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</P>
+
+<P class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</P>
+
+<P><B>3. REQUIREMENTS</B></P>
+
+<P>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</P>
+
+<P class="list">a) it complies with the terms and conditions of this
+Agreement; and</P>
+
+<P class="list">b) its license agreement:</P>
+
+<P class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</P>
+
+<P class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</P>
+
+<P class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</P>
+
+<P class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</P>
+
+<P>When the Program is made available in source code form:</P>
+
+<P class="list">a) it must be made available under this Agreement; and</P>
+
+<P class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</P>
+
+<P>Contributors may not remove or alter any copyright notices contained
+within the Program.</P>
+
+<P>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</P>
+
+<P><B>4. COMMERCIAL DISTRIBUTION</B></P>
+
+<P>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+("Commercial Contributor") hereby agrees to defend and
+indemnify every other Contributor ("Indemnified Contributor")
+against any losses, damages and costs (collectively "Losses")
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</P>
+
+<P>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</P>
+
+<P><B>5. NO WARRANTY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</P>
+
+<P><B>6. DISCLAIMER OF LIABILITY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</P>
+
+<P><B>7. GENERAL</B></P>
+
+<P>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</P>
+
+<P>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</P>
+
+<P>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</P>
+
+<P>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</P>
+
+<P>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</P>
+
+
+
+
+</BODY></HTML>
\ No newline at end of file
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.springdm/feature.properties b/org.eclipse.virgo.site/org.eclipse.virgo.springdm/feature.properties
new file mode 100644
index 0000000..cd15877
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.springdm/feature.properties
@@ -0,0 +1,180 @@
+###############################################################################
+# Copyright (c) 2011 SAP AG
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# and Apache License v2.0 which accompanies this distribution.
+# The Eclipse Public License is available at
+#   http://www.eclipse.org/legal/epl-v10.html
+# and the Apache License v2.0 is available at
+#   http://www.opensource.org/licenses/apache2.0.php.
+# You may elect to redistribute this code under either of these licenses.
+#
+# Contributors:
+#   Borislav Kapukaranov - initial contribution
+###############################################################################
+# feature.properties
+# contains externalized strings for feature.xml
+# "%foo" in feature.xml corresponds to the key "foo" in this file
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# This file should be translated.
+
+# "featureName" property - name of the feature
+featureName=Eclipse Virgo SpringDM Feature
+
+# "providerName" property - name of the company that provides the feature
+providerName=Eclipse.org
+
+# "updateSiteName" property - label for the update site
+
+# "description" property - description of the feature
+description=This feature provides a SpringDM add-on for Virgo. It includes the standard SpringDM bundles.\n\
+
+# "copyright" property - text of the "Feature Update Copyright"
+copyright=\
+Copyright (c) 2009, 2010, 2011 VMware Inc. and others\n\
+\n\
+All rights reserved. This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License v1.0\n\
+and Apache License v2.0 which accompanies this distribution.\n\
+The Eclipse Public License is available at\n\
+http://www.eclipse.org/legal/epl-v10.html\n\
+and the Apache License v2.0 is available at\n\
+http://www.opensource.org/licenses/apache2.0.php.\n\
+You may elect to redistribute this code under either of these\n\
+licenses.\n\
+\n\
+Contributors:\n\
+VMware Inc. - initial contribution\n\
+
+# "licenseURL" property - URL of the "Feature License"
+# do not translate value - just change to point to a locale-specific HTML page
+licenseURL=license.html
+
+# "license" property - text of the "Feature Update License"
+# should be plain text version of license agreement pointed to be "licenseURL"
+license=\
+Eclipse Foundation Software User Agreement\n\
+February 1, 2011\n\
+\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
+OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
+USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
+AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
+NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
+AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
+AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
+OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
+TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
+OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
+BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
+\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the\n\
+Eclipse Foundation is provided to you under the terms and conditions of\n\
+the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
+provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
+For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code,\n\
+documentation and other files maintained in the Eclipse Foundation source code\n\
+repository ("Repository") in software modules ("Modules") and made available\n\
+as downloadable archives ("Downloads").\n\
+\n\
+       - Content may be structured and packaged into modules to facilitate delivering,\n\
+         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
+         plug-in fragments ("Fragments"), and features ("Features").\n\
+       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
+         in a directory named "plugins".\n\
+       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
+         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
+         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
+         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
+         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be\n\
+contained in files named "about.html" ("Abouts"). The terms and\n\
+conditions governing Features and Included Features should be contained\n\
+in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
+Licenses may be located in any directory of a Download or Module\n\
+including, but not limited to the following locations:\n\
+\n\
+       - The top-level (root) directory\n\
+       - Plug-in and Fragment directories\n\
+       - Inside Plug-ins and Fragments packaged as JARs\n\
+       - Sub-directories of the directory named "src" of certain Plug-ins\n\
+       - Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
+Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
+Update License") during the installation process. If the Feature contains\n\
+Included Features, the Feature Update License should either provide you\n\
+with the terms and conditions governing the Included Features or inform\n\
+you where you can locate them. Feature Update Licenses may be found in\n\
+the "license" property of files named "feature.properties" found within a Feature.\n\
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
+terms and conditions (or references to such terms and conditions) that\n\
+govern your use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
+TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
+SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+       - Eclipse Distribution License Version 1.0 (available at http://www.eclipse.org/licenses/edl-v1.0.html)\n\
+       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
+TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
+is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
+govern that particular Content.\n\
+\n\
+\n\Use of Provisioning Technology\n\
+\n\
+The Eclipse Foundation makes available provisioning software, examples of which include,\n\
+but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
+the purpose of allowing users to install software, documentation, information and/or\n\
+other materials (collectively "Installable Software"). This capability is provided with\n\
+the intent of allowing such users to install, extend and update Eclipse-based products.\n\
+Information about packaging Installable Software is available at\n\
+http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
+\n\
+You may use Provisioning Technology to allow other parties to install Installable Software.\n\
+You shall be responsible for enabling the applicable license agreements relating to the\n\
+Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
+in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
+making it available in accordance with the Specification, you further acknowledge your\n\
+agreement to, and the acquisition of all necessary rights to permit the following:\n\
+\n\
+       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
+          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
+          extending or updating the functionality of an Eclipse-based product.\n\
+       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
+          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
+       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
+          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
+          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
+          with the Specification. Such Installable Software Agreement must inform the user of the\n\
+          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
+          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
+          indication of agreement by the user, the provisioning Technology will complete installation\n\
+          of the Installable Software.\n\
+\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are\n\
+currently may have restrictions on the import, possession, and use,\n\
+and/or re-export to another country, of encryption software. BEFORE\n\
+using any encryption software, please check the country's laws,\n\
+regulations and policies concerning the import, possession, or use, and\n\
+re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
+########### end of license property ##########################################
\ No newline at end of file
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.springdm/feature.xml b/org.eclipse.virgo.site/org.eclipse.virgo.springdm/feature.xml
new file mode 100755
index 0000000..05c6dc3
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.springdm/feature.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="org.eclipse.virgo.springdm"
+      label="%featureName"
+      version="@SPRING.DM.VERSION@"
+      provider-name="%providerName"
+      image="eclipse_update_120.jpg">
+
+   <description url="http://www.eclipse.org/virgo/">
+      %description
+   </description>
+
+   <copyright url="http://www.eclipse.org/virgo/">
+      %copyright
+   </copyright>
+
+   <license url="%licenseURL">
+      %license
+   </license>
+
+   <plugin
+         id="org.eclipse.gemini.blueprint.core"
+         download-size="0"
+         install-size="0"
+         version="@SPRING.DM.VERSION@"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.gemini.blueprint.extender"
+         download-size="0"
+         install-size="0"
+         version="@SPRING.DM.VERSION@"
+         unpack="false"
+         autostart="true"/>
+
+   <plugin
+         id="org.eclipse.gemini.blueprint.io"
+         download-size="0"
+         install-size="0"
+         version="@SPRING.DM.VERSION@"
+         unpack="false"/>
+
+</feature>
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.springdm/license.html b/org.eclipse.virgo.site/org.eclipse.virgo.springdm/license.html
new file mode 100755
index 0000000..f19c483
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.springdm/license.html
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Foundation Software User Agreement</title>
+</head>
+
+<body lang="EN-US">
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>February 1, 2011</p>
+
+<h3>Usage Of Content</h3>
+
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
+
+<h3>Applicable Licenses</h3>
+
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
+   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
+
+<ul>
+       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
+       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
+       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
+      and/or Fragments associated with that Feature.</li>
+       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
+Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+       <li>The top-level (root) directory</li>
+       <li>Plug-in and Fragment directories</li>
+       <li>Inside Plug-ins and Fragments packaged as JARs</li>
+       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
+       <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
+installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+       <li>Eclipse Distribution License Version 1.0 (available at <a href="http://www.eclipse.org/licenses/edl-v10.html">http://www.eclipse.org/licenses/edl-v1.0.html</a>)</li>
+       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+
+<h3>Use of Provisioning Technology</h3>
+
+<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
+   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
+   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
+   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
+       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
+   (&quot;Specification&quot;).</p>
+
+<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
+   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
+   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
+   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
+
+<ol>
+       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
+       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
+       product.</li>
+       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
+       accessed and copied to the Target Machine.</li>
+       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
+       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
+       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
+       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
+       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
+</ol>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+
+<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
+</body>
+</html>
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.tools/build.gradle b/org.eclipse.virgo.site/org.eclipse.virgo.tools/build.gradle
new file mode 100644
index 0000000..32bcbb5
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.tools/build.gradle
@@ -0,0 +1 @@
+apply plugin: eclipsebuild.FeaturePlugin
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.tools/build.properties b/org.eclipse.virgo.site/org.eclipse.virgo.tools/build.properties
new file mode 100644
index 0000000..db80add
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.tools/build.properties
@@ -0,0 +1,4 @@
+bin.includes = feature.xml,\
+               feature.properties,\
+               epl-v10.html,\
+               eclipse_update_120.jpg
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.tools/eclipse_update_120.jpg b/org.eclipse.virgo.site/org.eclipse.virgo.tools/eclipse_update_120.jpg
new file mode 100755
index 0000000..bfdf708
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.tools/eclipse_update_120.jpg
Binary files differ
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.tools/epl-v10.html b/org.eclipse.virgo.site/org.eclipse.virgo.tools/epl-v10.html
new file mode 100755
index 0000000..eecc800
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.tools/epl-v10.html
@@ -0,0 +1,258 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!-- saved from url=(0049)http://www.eclipse.org/org/documents/epl-v10.html -->
+<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+
+<TITLE>Eclipse Public License - Version 1.0</TITLE>
+<STYLE type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </STYLE>
+
+</HEAD><BODY lang="EN-US">
+
+<H2>Eclipse Public License - v 1.0</H2>
+
+<P>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</P>
+
+<P><B>1. DEFINITIONS</B></P>
+
+<P>"Contribution" means:</P>
+
+<P class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</P>
+<P class="list">b) in the case of each subsequent Contributor:</P>
+<P class="list">i) changes to the Program, and</P>
+<P class="list">ii) additions to the Program;</P>
+<P class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</P>
+
+<P>"Contributor" means any person or entity that distributes
+the Program.</P>
+
+<P>"Licensed Patents" mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</P>
+
+<P>"Program" means the Contributions distributed in accordance
+with this Agreement.</P>
+
+<P>"Recipient" means anyone who receives the Program under
+this Agreement, including all Contributors.</P>
+
+<P><B>2. GRANT OF RIGHTS</B></P>
+
+<P class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</P>
+
+<P class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</P>
+
+<P class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</P>
+
+<P class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</P>
+
+<P><B>3. REQUIREMENTS</B></P>
+
+<P>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</P>
+
+<P class="list">a) it complies with the terms and conditions of this
+Agreement; and</P>
+
+<P class="list">b) its license agreement:</P>
+
+<P class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</P>
+
+<P class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</P>
+
+<P class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</P>
+
+<P class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</P>
+
+<P>When the Program is made available in source code form:</P>
+
+<P class="list">a) it must be made available under this Agreement; and</P>
+
+<P class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</P>
+
+<P>Contributors may not remove or alter any copyright notices contained
+within the Program.</P>
+
+<P>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</P>
+
+<P><B>4. COMMERCIAL DISTRIBUTION</B></P>
+
+<P>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+("Commercial Contributor") hereby agrees to defend and
+indemnify every other Contributor ("Indemnified Contributor")
+against any losses, damages and costs (collectively "Losses")
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</P>
+
+<P>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</P>
+
+<P><B>5. NO WARRANTY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</P>
+
+<P><B>6. DISCLAIMER OF LIABILITY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</P>
+
+<P><B>7. GENERAL</B></P>
+
+<P>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</P>
+
+<P>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</P>
+
+<P>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</P>
+
+<P>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</P>
+
+<P>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</P>
+
+
+
+
+</BODY></HTML>
\ No newline at end of file
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.tools/feature.properties b/org.eclipse.virgo.site/org.eclipse.virgo.tools/feature.properties
new file mode 100644
index 0000000..3e5853e
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.tools/feature.properties
@@ -0,0 +1,180 @@
+###############################################################################
+# Copyright (c) 2011 SAP AG
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# and Apache License v2.0 which accompanies this distribution.
+# The Eclipse Public License is available at
+#   http://www.eclipse.org/legal/epl-v10.html
+# and the Apache License v2.0 is available at
+#   http://www.opensource.org/licenses/apache2.0.php.
+# You may elect to redistribute this code under either of these licenses.
+#
+# Contributors:
+#   Borislav Kapukaranov - initial contribution
+###############################################################################
+# feature.properties
+# contains externalized strings for feature.xml
+# "%foo" in feature.xml corresponds to the key "foo" in this file
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# This file should be translated.
+
+# "featureName" property - name of the feature
+featureName=Eclipse Virgo Tools Feature
+
+# "providerName" property - name of the company that provides the feature
+providerName=Eclipse.org
+
+# "updateSiteName" property - label for the update site
+
+# "description" property - description of the feature
+description=This feature packages the internal tools of a Eclipse Virgo OSGi container (for reuse within the Virgo Tooling).\n\
+
+# "copyright" property - text of the "Feature Update Copyright"
+copyright=\
+Copyright (c) 2009, 2010, 2011 VMware Inc. and others\n\
+\n\
+All rights reserved. This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License v1.0\n\
+and Apache License v2.0 which accompanies this distribution.\n\
+The Eclipse Public License is available at\n\
+http://www.eclipse.org/legal/epl-v10.html\n\
+and the Apache License v2.0 is available at\n\
+http://www.opensource.org/licenses/apache2.0.php.\n\
+You may elect to redistribute this code under either of these\n\
+licenses.\n\
+\n\
+Contributors:\n\
+VMware Inc. - initial contribution\n\
+
+# "licenseURL" property - URL of the "Feature License"
+# do not translate value - just change to point to a locale-specific HTML page
+licenseURL=license.html
+
+# "license" property - text of the "Feature Update License"
+# should be plain text version of license agreement pointed to be "licenseURL"
+license=\
+Eclipse Foundation Software User Agreement\n\
+February 1, 2011\n\
+\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
+OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
+USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
+AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
+NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
+AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
+AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
+OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
+TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
+OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
+BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
+\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the\n\
+Eclipse Foundation is provided to you under the terms and conditions of\n\
+the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
+provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
+For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code,\n\
+documentation and other files maintained in the Eclipse Foundation source code\n\
+repository ("Repository") in software modules ("Modules") and made available\n\
+as downloadable archives ("Downloads").\n\
+\n\
+       - Content may be structured and packaged into modules to facilitate delivering,\n\
+         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
+         plug-in fragments ("Fragments"), and features ("Features").\n\
+       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
+         in a directory named "plugins".\n\
+       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
+         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
+         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
+         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
+         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be\n\
+contained in files named "about.html" ("Abouts"). The terms and\n\
+conditions governing Features and Included Features should be contained\n\
+in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
+Licenses may be located in any directory of a Download or Module\n\
+including, but not limited to the following locations:\n\
+\n\
+       - The top-level (root) directory\n\
+       - Plug-in and Fragment directories\n\
+       - Inside Plug-ins and Fragments packaged as JARs\n\
+       - Sub-directories of the directory named "src" of certain Plug-ins\n\
+       - Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
+Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
+Update License") during the installation process. If the Feature contains\n\
+Included Features, the Feature Update License should either provide you\n\
+with the terms and conditions governing the Included Features or inform\n\
+you where you can locate them. Feature Update Licenses may be found in\n\
+the "license" property of files named "feature.properties" found within a Feature.\n\
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
+terms and conditions (or references to such terms and conditions) that\n\
+govern your use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
+TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
+SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+       - Eclipse Distribution License Version 1.0 (available at http://www.eclipse.org/licenses/edl-v1.0.html)\n\
+       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
+TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
+is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
+govern that particular Content.\n\
+\n\
+\n\Use of Provisioning Technology\n\
+\n\
+The Eclipse Foundation makes available provisioning software, examples of which include,\n\
+but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
+the purpose of allowing users to install software, documentation, information and/or\n\
+other materials (collectively "Installable Software"). This capability is provided with\n\
+the intent of allowing such users to install, extend and update Eclipse-based products.\n\
+Information about packaging Installable Software is available at\n\
+http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
+\n\
+You may use Provisioning Technology to allow other parties to install Installable Software.\n\
+You shall be responsible for enabling the applicable license agreements relating to the\n\
+Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
+in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
+making it available in accordance with the Specification, you further acknowledge your\n\
+agreement to, and the acquisition of all necessary rights to permit the following:\n\
+\n\
+       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
+          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
+          extending or updating the functionality of an Eclipse-based product.\n\
+       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
+          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
+       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
+          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
+          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
+          with the Specification. Such Installable Software Agreement must inform the user of the\n\
+          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
+          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
+          indication of agreement by the user, the provisioning Technology will complete installation\n\
+          of the Installable Software.\n\
+\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are\n\
+currently may have restrictions on the import, possession, and use,\n\
+and/or re-export to another country, of encryption software. BEFORE\n\
+using any encryption software, please check the country's laws,\n\
+regulations and policies concerning the import, possession, or use, and\n\
+re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
+########### end of license property ##########################################
\ No newline at end of file
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.tools/feature.xml b/org.eclipse.virgo.site/org.eclipse.virgo.tools/feature.xml
new file mode 100755
index 0000000..ca5195a
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.tools/feature.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="org.eclipse.virgo.tools"
+      label="%featureName"
+      version="@VIRGO.VERSION@"
+      provider-name="%providerName"
+      image="eclipse_update_120.jpg">
+
+   <description url="http://www.eclipse.org/virgo/">
+      %description
+   </description>
+
+   <copyright url="http://www.eclipse.org/virgo/">
+      %copyright
+   </copyright>
+
+   <license url="%licenseURL">
+      %license
+   </license>
+
+   <plugin
+         id="org.eclipse.virgo.util.common"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"
+         autostart="true"/>
+
+   <plugin
+         id="org.eclipse.virgo.util.io"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"
+         autostart="true"/>
+
+   <plugin
+         id="org.eclipse.virgo.util.jmx"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"
+         autostart="true"/>
+
+   <plugin
+         id="org.eclipse.virgo.util.math"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"
+         autostart="true"/>
+
+   <plugin
+         id="org.eclipse.virgo.util.osgi"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"
+         autostart="true"/>
+
+   <plugin
+         id="org.eclipse.virgo.util.osgi.manifest"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"
+         autostart="true"/>
+
+   <plugin
+         id="org.eclipse.virgo.util.parser.manifest"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"
+         autostart="true"/>
+
+   <plugin
+         id="org.eclipse.virgo.repository"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"
+         autostart="true"/>
+
+   <plugin
+         id="org.eclipse.virgo.medic"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"
+         autostart="true"/>
+
+</feature>
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.tools/license.html b/org.eclipse.virgo.site/org.eclipse.virgo.tools/license.html
new file mode 100755
index 0000000..f19c483
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.tools/license.html
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Foundation Software User Agreement</title>
+</head>
+
+<body lang="EN-US">
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>February 1, 2011</p>
+
+<h3>Usage Of Content</h3>
+
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
+
+<h3>Applicable Licenses</h3>
+
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
+   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
+
+<ul>
+       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
+       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
+       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
+      and/or Fragments associated with that Feature.</li>
+       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
+Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+       <li>The top-level (root) directory</li>
+       <li>Plug-in and Fragment directories</li>
+       <li>Inside Plug-ins and Fragments packaged as JARs</li>
+       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
+       <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
+installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+       <li>Eclipse Distribution License Version 1.0 (available at <a href="http://www.eclipse.org/licenses/edl-v10.html">http://www.eclipse.org/licenses/edl-v1.0.html</a>)</li>
+       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+
+<h3>Use of Provisioning Technology</h3>
+
+<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
+   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
+   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
+   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
+       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
+   (&quot;Specification&quot;).</p>
+
+<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
+   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
+   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
+   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
+
+<ol>
+       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
+       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
+       product.</li>
+       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
+       accessed and copied to the Target Machine.</li>
+       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
+       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
+       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
+       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
+       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
+</ol>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+
+<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
+</body>
+</html>
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.webconsole.deps/build.gradle b/org.eclipse.virgo.site/org.eclipse.virgo.webconsole.deps/build.gradle
new file mode 100644
index 0000000..32bcbb5
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.webconsole.deps/build.gradle
@@ -0,0 +1 @@
+apply plugin: eclipsebuild.FeaturePlugin
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.webconsole.deps/build.properties b/org.eclipse.virgo.site/org.eclipse.virgo.webconsole.deps/build.properties
new file mode 100644
index 0000000..a13e18b
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.webconsole.deps/build.properties
@@ -0,0 +1,5 @@
+bin.includes = feature.xml,\
+               feature.properties,\
+               epl-v10.html,\
+               eclipse_update_120.jpg,\
+               p2.inf
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.webconsole.deps/eclipse_update_120.jpg b/org.eclipse.virgo.site/org.eclipse.virgo.webconsole.deps/eclipse_update_120.jpg
new file mode 100755
index 0000000..bfdf708
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.webconsole.deps/eclipse_update_120.jpg
Binary files differ
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.webconsole.deps/epl-v10.html b/org.eclipse.virgo.site/org.eclipse.virgo.webconsole.deps/epl-v10.html
new file mode 100755
index 0000000..eecc800
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.webconsole.deps/epl-v10.html
@@ -0,0 +1,258 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!-- saved from url=(0049)http://www.eclipse.org/org/documents/epl-v10.html -->
+<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+
+<TITLE>Eclipse Public License - Version 1.0</TITLE>
+<STYLE type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </STYLE>
+
+</HEAD><BODY lang="EN-US">
+
+<H2>Eclipse Public License - v 1.0</H2>
+
+<P>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</P>
+
+<P><B>1. DEFINITIONS</B></P>
+
+<P>"Contribution" means:</P>
+
+<P class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</P>
+<P class="list">b) in the case of each subsequent Contributor:</P>
+<P class="list">i) changes to the Program, and</P>
+<P class="list">ii) additions to the Program;</P>
+<P class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</P>
+
+<P>"Contributor" means any person or entity that distributes
+the Program.</P>
+
+<P>"Licensed Patents" mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</P>
+
+<P>"Program" means the Contributions distributed in accordance
+with this Agreement.</P>
+
+<P>"Recipient" means anyone who receives the Program under
+this Agreement, including all Contributors.</P>
+
+<P><B>2. GRANT OF RIGHTS</B></P>
+
+<P class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</P>
+
+<P class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</P>
+
+<P class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</P>
+
+<P class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</P>
+
+<P><B>3. REQUIREMENTS</B></P>
+
+<P>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</P>
+
+<P class="list">a) it complies with the terms and conditions of this
+Agreement; and</P>
+
+<P class="list">b) its license agreement:</P>
+
+<P class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</P>
+
+<P class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</P>
+
+<P class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</P>
+
+<P class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</P>
+
+<P>When the Program is made available in source code form:</P>
+
+<P class="list">a) it must be made available under this Agreement; and</P>
+
+<P class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</P>
+
+<P>Contributors may not remove or alter any copyright notices contained
+within the Program.</P>
+
+<P>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</P>
+
+<P><B>4. COMMERCIAL DISTRIBUTION</B></P>
+
+<P>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+("Commercial Contributor") hereby agrees to defend and
+indemnify every other Contributor ("Indemnified Contributor")
+against any losses, damages and costs (collectively "Losses")
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</P>
+
+<P>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</P>
+
+<P><B>5. NO WARRANTY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</P>
+
+<P><B>6. DISCLAIMER OF LIABILITY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</P>
+
+<P><B>7. GENERAL</B></P>
+
+<P>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</P>
+
+<P>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</P>
+
+<P>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</P>
+
+<P>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</P>
+
+<P>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</P>
+
+
+
+
+</BODY></HTML>
\ No newline at end of file
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.webconsole.deps/feature.properties b/org.eclipse.virgo.site/org.eclipse.virgo.webconsole.deps/feature.properties
new file mode 100644
index 0000000..f30a8e2
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.webconsole.deps/feature.properties
@@ -0,0 +1,180 @@
+###############################################################################
+# Copyright (c) 2011 SAP AG
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# and Apache License v2.0 which accompanies this distribution.
+# The Eclipse Public License is available at
+#   http://www.eclipse.org/legal/epl-v10.html
+# and the Apache License v2.0 is available at
+#   http://www.opensource.org/licenses/apache2.0.php.
+# You may elect to redistribute this code under either of these licenses.
+#
+# Contributors:
+#   Borislav Kapukaranov - initial contribution
+###############################################################################
+# feature.properties
+# contains externalized strings for feature.xml
+# "%foo" in feature.xml corresponds to the key "foo" in this file
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# This file should be translated.
+
+# "featureName" property - name of the feature
+featureName=Virgo Web Admin Console Feature
+
+# "providerName" property - name of the company that provides the feature
+providerName=Eclipse.org
+
+# "updateSiteName" property - label for the update site
+
+# "description" property - description of the feature
+description=This feature provides Virgo's web management console.\n\
+
+# "copyright" property - text of the "Feature Update Copyright"
+copyright=\
+Copyright (c) 2009, 2010, 2011 VMware Inc. and others\n\
+\n\
+All rights reserved. This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License v1.0\n\
+and Apache License v2.0 which accompanies this distribution.\n\
+The Eclipse Public License is available at\n\
+http://www.eclipse.org/legal/epl-v10.html\n\
+and the Apache License v2.0 is available at\n\
+http://www.opensource.org/licenses/apache2.0.php.\n\
+You may elect to redistribute this code under either of these\n\
+licenses.\n\
+\n\
+Contributors:\n\
+VMware Inc. - initial contribution\n\
+
+# "licenseURL" property - URL of the "Feature License"
+# do not translate value - just change to point to a locale-specific HTML page
+licenseURL=license.html
+
+# "license" property - text of the "Feature Update License"
+# should be plain text version of license agreement pointed to be "licenseURL"
+license=\
+Eclipse Foundation Software User Agreement\n\
+February 1, 2011\n\
+\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
+OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
+USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
+AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
+NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
+AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
+AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
+OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
+TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
+OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
+BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
+\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the\n\
+Eclipse Foundation is provided to you under the terms and conditions of\n\
+the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
+provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
+For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code,\n\
+documentation and other files maintained in the Eclipse Foundation source code\n\
+repository ("Repository") in software modules ("Modules") and made available\n\
+as downloadable archives ("Downloads").\n\
+\n\
+       - Content may be structured and packaged into modules to facilitate delivering,\n\
+         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
+         plug-in fragments ("Fragments"), and features ("Features").\n\
+       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
+         in a directory named "plugins".\n\
+       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
+         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
+         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
+         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
+         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be\n\
+contained in files named "about.html" ("Abouts"). The terms and\n\
+conditions governing Features and Included Features should be contained\n\
+in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
+Licenses may be located in any directory of a Download or Module\n\
+including, but not limited to the following locations:\n\
+\n\
+       - The top-level (root) directory\n\
+       - Plug-in and Fragment directories\n\
+       - Inside Plug-ins and Fragments packaged as JARs\n\
+       - Sub-directories of the directory named "src" of certain Plug-ins\n\
+       - Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
+Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
+Update License") during the installation process. If the Feature contains\n\
+Included Features, the Feature Update License should either provide you\n\
+with the terms and conditions governing the Included Features or inform\n\
+you where you can locate them. Feature Update Licenses may be found in\n\
+the "license" property of files named "feature.properties" found within a Feature.\n\
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
+terms and conditions (or references to such terms and conditions) that\n\
+govern your use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
+TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
+SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+       - Eclipse Distribution License Version 1.0 (available at http://www.eclipse.org/licenses/edl-v1.0.html)\n\
+       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
+TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
+is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
+govern that particular Content.\n\
+\n\
+\n\Use of Provisioning Technology\n\
+\n\
+The Eclipse Foundation makes available provisioning software, examples of which include,\n\
+but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
+the purpose of allowing users to install software, documentation, information and/or\n\
+other materials (collectively "Installable Software"). This capability is provided with\n\
+the intent of allowing such users to install, extend and update Eclipse-based products.\n\
+Information about packaging Installable Software is available at\n\
+http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
+\n\
+You may use Provisioning Technology to allow other parties to install Installable Software.\n\
+You shall be responsible for enabling the applicable license agreements relating to the\n\
+Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
+in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
+making it available in accordance with the Specification, you further acknowledge your\n\
+agreement to, and the acquisition of all necessary rights to permit the following:\n\
+\n\
+       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
+          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
+          extending or updating the functionality of an Eclipse-based product.\n\
+       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
+          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
+       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
+          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
+          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
+          with the Specification. Such Installable Software Agreement must inform the user of the\n\
+          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
+          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
+          indication of agreement by the user, the provisioning Technology will complete installation\n\
+          of the Installable Software.\n\
+\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are\n\
+currently may have restrictions on the import, possession, and use,\n\
+and/or re-export to another country, of encryption software. BEFORE\n\
+using any encryption software, please check the country's laws,\n\
+regulations and policies concerning the import, possession, or use, and\n\
+re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
+########### end of license property ##########################################
\ No newline at end of file
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.webconsole.deps/feature.xml b/org.eclipse.virgo.site/org.eclipse.virgo.webconsole.deps/feature.xml
new file mode 100755
index 0000000..7fb9e20
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.webconsole.deps/feature.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="org.eclipse.virgo.webconsole.deps"
+      label="%featureName"
+      version="@VIRGO.VERSION@"
+      provider-name="%providerName"
+      image="eclipse_update_120.jpg">
+
+   <description url="http://www.eclipse.org/virgo/">
+      %description
+   </description>
+
+   <copyright url="http://www.eclipse.org/virgo/">
+      %copyright
+   </copyright>
+
+   <license url="%licenseURL">
+      %license
+   </license>
+    
+    <plugin
+    id="org.eclipse.gemini.management"
+    download-size="0"
+    install-size="0"
+    version="@GEMINI.MANAGEMENT.VERSION@"
+    unpack="false"/>
+    
+    <plugin
+    id="org.eclipse.virgo.management.fragment"
+    download-size="0"
+    install-size="0"
+    version="@VIRGO.VERSION@"
+    unpack="false"/>
+    
+    <plugin
+    id="org.apache.commons.fileupload"
+    download-size="0"
+    install-size="0"
+    version="@C.FILEUPLOAD.VERSION@"
+    unpack="false"/>
+    
+    <plugin
+    id="org.apache.commons.io"
+    download-size="0"
+    install-size="0"
+    version="@C.IO.VERSION@"
+    unpack="false"/>
+    
+    <plugin
+    id="org.jolokia.osgi"
+    download-size="0"
+    install-size="0"
+    version="@JOLOKIA.VERSION@"
+    unpack="false"/>
+    
+    <plugin
+    id="javax.servlet"
+    download-size="0"
+    install-size="0"
+    version="@JAVAX.SERVLET@"
+    unpack="false"/>
+    
+</feature>
diff --git a/org.eclipse.virgo.site/org.eclipse.virgo.webconsole.deps/license.html b/org.eclipse.virgo.site/org.eclipse.virgo.webconsole.deps/license.html
new file mode 100755
index 0000000..f19c483
--- /dev/null
+++ b/org.eclipse.virgo.site/org.eclipse.virgo.webconsole.deps/license.html
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Foundation Software User Agreement</title>
+</head>
+
+<body lang="EN-US">
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>February 1, 2011</p>
+
+<h3>Usage Of Content</h3>
+
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
+
+<h3>Applicable Licenses</h3>
+
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
+   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
+
+<ul>
+       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
+       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
+       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
+      and/or Fragments associated with that Feature.</li>
+       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
+Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+       <li>The top-level (root) directory</li>
+       <li>Plug-in and Fragment directories</li>
+       <li>Inside Plug-ins and Fragments packaged as JARs</li>
+       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
+       <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
+installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+       <li>Eclipse Distribution License Version 1.0 (available at <a href="http://www.eclipse.org/licenses/edl-v10.html">http://www.eclipse.org/licenses/edl-v1.0.html</a>)</li>
+       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+
+<h3>Use of Provisioning Technology</h3>
+
+<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
+   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
+   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
+   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
+       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
+   (&quot;Specification&quot;).</p>
+
+<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
+   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
+   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
+   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
+
+<ol>
+       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
+       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
+       product.</li>
+       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
+       accessed and copied to the Target Machine.</li>
+       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
+       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
+       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
+       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
+       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
+</ol>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+
+<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
+</body>
+</html>
diff --git a/org.eclipse.virgo.site/p2.index b/org.eclipse.virgo.site/p2.index
new file mode 100644
index 0000000..4c62321
--- /dev/null
+++ b/org.eclipse.virgo.site/p2.index
@@ -0,0 +1,3 @@
+version = 1
+ metadata.repository.factory.order = content.xml,\!
+ artifact.repository.factory.order = artifacts.xml,\!
\ No newline at end of file
diff --git a/org.eclipse.virgo.site/publish_resources/products/base/base.product b/org.eclipse.virgo.site/publish_resources/products/base/base.product
new file mode 100755
index 0000000..e5ebdd3
--- /dev/null
+++ b/org.eclipse.virgo.site/publish_resources/products/base/base.product
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<?pde version="3.5"?>

+

+<product name="Eclipse Virgo Base Product" uid="base.product" version="1.0.0" useFeatures="true" includeLaunchers="false">

+

+   <configIni use="default">

+   </configIni>

+   

+   <vm>

+   </vm>

+

+   <plugins>

+   </plugins>

+

+   <features>

+      <feature id="org.eclipse.virgo.core" version="0.0.0"/>

+      <feature id="org.eclipse.virgo.medic" version="0.0.0"/>

+      <feature id="org.eclipse.virgo.shell" version="0.0.0"/>

+      <feature id="org.eclipse.virgo.ds" version="0.0.0"/>

+      <feature id="org.eclipse.virgo.nano.mbeans" version="0.0.0"/>

+	  <feature id="org.eclipse.virgo.simpleconfigurator" version="0.0.0"/>

+   </features>

+   

+   <configurations>

+		<plugin id="org.eclipse.equinox.cm" autoStart="true" />

+		<plugin id="org.eclipse.equinox.simpleconfigurator" autoStart="true" startLevel="1"/>

+		<plugin id="org.eclipse.equinox.event" autoStart="true" />

+		<plugin id="org.eclipse.equinox.common" autoStart="true" />

+		<plugin id="org.eclipse.equinox.console.supportability" autoStart="true" />

+		<plugin id="org.eclipse.equinox.region" autoStart="true" />

+		<plugin id="org.eclipse.equinox.util" autoStart="true" />

+		<plugin id="org.eclipse.osgi.services" autoStart="true" />

+		<plugin id="org.eclipse.virgo.medic" autoStart="true" startLevel="3"/>

+		<plugin id="org.eclipse.virgo.medic.core" autoStart="true" startLevel="3"/>

+		<plugin id="org.eclipse.equinox.ds" autoStart="true" startLevel="3"/>

+		<plugin id="org.eclipse.virgo.util.osgi" autoStart="true"/>

+		

+		<property name="osgi.compatibility.bootdelegation" value="false"/>

+		<property name="equinox.use.ds" value="true"/>

+		<property name="osgi.console.enable.builtin" value="false"/>

+		<property name="gosh.args" value="--nointeractive"/>

+		<property name="osgi.console.ssh.useDefaultSecureStorage" value="false"/>

+		<property name="osgi.console.useConfigAdmin" value="true"/>

+		<property name="osgi.parentClassloader" value="fwk"/>

+		<property name="equinox.refresh.duplicate.bsn" value="false"/>

+		<property name="eclipse.bundle.setTCCL" value="false"/>

+		<property name="org.eclipse.virgo.suppress.heap.dumps" value="false"/>

+		<property name="osgi.bundlefile.limit" value="500"/>

+		<property name="osgi.java.profile.bootdelegation" value="override"/>

+		<property name="osgi.compatibility.eagerStart.LazyActivation" value="false"/>

+		<property name="osgi.support.multipleHosts" value="true"/>

+		<property name="org.eclipse.virgo.medic.log.config.path" value="configuration/serviceability.xml"/>

+		<property name="osgi.context.bootdelegation" value="false"/>

+		<property name="eclipse.enableStateSaver" value="false"/>

+		<property name="osgi.hook.configurators.include" value="org.eclipse.virgo.kernel.equinox.extensions.hooks.ExtensionsHookConfigurator"/>

+		<property name="org.eclipse.virgo.kernel.startup.wait.limit" value="180"/>
+		<property name="gosh.home" value="configuration"/>

+	</configurations>

+

+</product>

diff --git a/org.eclipse.virgo.site/publish_resources/products/kernel-base/kernel-base.product b/org.eclipse.virgo.site/publish_resources/products/kernel-base/kernel-base.product
new file mode 100755
index 0000000..ae13b01
--- /dev/null
+++ b/org.eclipse.virgo.site/publish_resources/products/kernel-base/kernel-base.product
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<?pde version="3.5"?>

+

+<product name="Eclipse Virgo Kernel Base Product" uid="kernel-base.product" version="1.0.0" useFeatures="true" includeLaunchers="false">

+

+   <configIni use="default">

+   </configIni>

+   

+   <vm>

+   </vm>

+

+   <plugins>

+   </plugins>

+

+   <features>

+      <feature id="org.eclipse.virgo.kernel" version="0.0.0"/>

+      <feature id="org.eclipse.virgo.kernel.springintegration" version="0.0.0"/>

+      <feature id="org.eclipse.virgo.springdm" version="0.0.0"/>

+      <feature id="org.eclipse.virgo.management" version="0.0.0" />

+   </features>

+

+   <configurations>

+		<plugin id="org.apache.commons.codec" autoStart="true"/>

+		<plugin id="oevm.org.apache.commons.httpclient" autoStart="true"/>

+ 

+		<property name="org.osgi.framework.bsnversion" value="multiple"/>

+		<property name="osgi.clean" value="true"/>

+		<property name="org.osgi.service.http.port" value="8080"/>

+		<property name="org.jolokia.listenForHttpService" value="false"/>

+		<property name="org.jolokia.useRestrictorService" value="true"/>

+	</configurations>

+

+</product>

diff --git a/org.eclipse.virgo.site/publish_resources/products/kernel-base/p2.inf b/org.eclipse.virgo.site/publish_resources/products/kernel-base/p2.inf
new file mode 100644
index 0000000..bdbdfc7
--- /dev/null
+++ b/org.eclipse.virgo.site/publish_resources/products/kernel-base/p2.inf
@@ -0,0 +1,18 @@
+###############################################################################
+# Copyright (c) 2011 SAP AG
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# and Apache License v2.0 which accompanies this distribution.
+# The Eclipse Public License is available at
+#   http://www.eclipse.org/legal/epl-v10.html
+# and the Apache License v2.0 is available at
+#   http://www.opensource.org/licenses/apache2.0.php.
+# You may elect to redistribute this code under either of these licenses.
+#
+# Contributors:
+#   Borislav Kapukaranov - initial contribution
+###############################################################################
+requires.0.name = base.product
+requires.0.namespace = org.eclipse.equinox.p2.iu
+requires.0.range = 0.0.0
diff --git a/org.eclipse.virgo.site/publish_resources/products/nano-base/nano-base.product b/org.eclipse.virgo.site/publish_resources/products/nano-base/nano-base.product
new file mode 100755
index 0000000..3c796af
--- /dev/null
+++ b/org.eclipse.virgo.site/publish_resources/products/nano-base/nano-base.product
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<?pde version="3.5"?>

+

+<product name="Eclipse Virgo Nano Product" uid="nano-base.product" version="1.0.0" useFeatures="true" includeLaunchers="false">

+

+   <configIni use="default">

+   </configIni>

+   

+   <vm>

+   </vm>

+

+   <plugins>

+   </plugins>

+

+   <features>

+	  <feature id="org.eclipse.virgo.nano.deployer" version="0.0.0"/>

+      <feature id="org.eclipse.virgo.nano.mbeans.controller" version="0.0.0"/>

+	  <feature id="org.eclipse.virgo.services.concurrent" version="0.0.0"/>

+	  <feature id="org.eclipse.virgo.services.ds" version="0.0.0"/>

+	  <feature id="org.eclipse.virgo.webconsole.deps" version="0.0.0"/>

+   </features>

+   

+   <configurations>

+      <plugin id="org.jolokia.osgi" autoStart="true" />

+   	  <plugin id="org.eclipse.gemini.management" autoStart="true" />

+   	  <plugin id="org.eclipse.equinox.http" autoStart="true" />

+

+	  <plugin id="org.eclipse.virgo.nano.core" autoStart="true" startLevel="4"/>

+	  <plugin id="org.eclipse.virgo.nano.deployer" autoStart="true" startLevel="5"/>

+	  <property name="org.eclipse.virgo.fschecker.initialEventMode" value="bulk"/>

+   </configurations>	

+

+</product>

diff --git a/org.eclipse.virgo.site/publish_resources/products/nano-base/p2.inf b/org.eclipse.virgo.site/publish_resources/products/nano-base/p2.inf
new file mode 100644
index 0000000..57cf7df
--- /dev/null
+++ b/org.eclipse.virgo.site/publish_resources/products/nano-base/p2.inf
@@ -0,0 +1,18 @@
+###############################################################################
+# Copyright (c) 2011 SAP AG
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# and Apache License v2.0 which accompanies this distribution.
+# The Eclipse Public License is available at
+#   http://www.eclipse.org/legal/epl-v10.html
+# and the Apache License v2.0 is available at
+#   http://www.opensource.org/licenses/apache2.0.php.
+# You may elect to redistribute this code under either of these licenses.
+#
+# Contributors:
+#   Borislav Kapukaranov - initial contribution
+###############################################################################
+requires.0.name = nano-core.product
+requires.0.namespace = org.eclipse.equinox.p2.iu
+requires.0.range = 0.0.0
diff --git a/org.eclipse.virgo.site/publish_resources/products/nano-core/nano-core.product b/org.eclipse.virgo.site/publish_resources/products/nano-core/nano-core.product
new file mode 100755
index 0000000..553c970
--- /dev/null
+++ b/org.eclipse.virgo.site/publish_resources/products/nano-core/nano-core.product
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<?pde version="3.5"?>

+

+<product name="Eclipse Virgo Base Product" uid="nano-core.product" version="1.0.0" useFeatures="true" includeLaunchers="false">

+

+   <configIni use="default">

+   </configIni>

+   

+   <vm>

+   </vm>

+

+   <plugins>

+   </plugins>

+

+   <features>

+      <feature id="org.eclipse.virgo.core" version="0.0.0"/>

+      <feature id="org.eclipse.virgo.medic" version="0.0.0"/>

+      <feature id="org.eclipse.virgo.shell" version="0.0.0"/>

+      <feature id="org.eclipse.virgo.ds" version="0.0.0"/>

+      <feature id="org.eclipse.virgo.nano.mbeans" version="0.0.0"/>

+	  <feature id="org.eclipse.virgo.simpleconfigurator" version="0.0.0"/>

+   </features>

+   

+   <configurations>

+		<plugin id="org.eclipse.equinox.cm" autoStart="true" />

+		<plugin id="org.eclipse.equinox.simpleconfigurator" autoStart="true" startLevel="1"/>

+		<plugin id="org.eclipse.equinox.event" autoStart="true" />

+		<plugin id="org.eclipse.equinox.common" autoStart="true" />

+		<plugin id="org.eclipse.equinox.console.supportability" autoStart="true" />

+		<plugin id="org.eclipse.equinox.region" autoStart="true" />

+		<plugin id="org.eclipse.equinox.util" autoStart="true" />

+		<plugin id="org.eclipse.osgi.services" autoStart="true" />

+		<plugin id="org.eclipse.virgo.medic" autoStart="true" startLevel="3"/>

+		<plugin id="org.eclipse.virgo.medic.core" autoStart="true" startLevel="3"/>

+		<plugin id="org.eclipse.equinox.ds" autoStart="true" startLevel="3"/>

+		<plugin id="org.eclipse.virgo.util.osgi" autoStart="true"/>

+		

+		<property name="osgi.compatibility.bootdelegation" value="false"/>

+		<property name="equinox.use.ds" value="true"/>

+		<property name="osgi.console.enable.builtin" value="false"/>

+		<property name="gosh.args" value="--nointeractive"/>

+		<property name="osgi.console.ssh.useDefaultSecureStorage" value="false"/>

+		<property name="osgi.console.useConfigAdmin" value="true"/>

+		<property name="osgi.parentClassloader" value="fwk"/>

+		<property name="equinox.refresh.duplicate.bsn" value="false"/>

+		<property name="eclipse.bundle.setTCCL" value="false"/>

+		<property name="org.eclipse.virgo.suppress.heap.dumps" value="false"/>

+		<property name="osgi.bundlefile.limit" value="500"/>

+		<property name="osgi.java.profile.bootdelegation" value="override"/>

+		<property name="osgi.compatibility.eagerStart.LazyActivation" value="false"/>

+		<property name="osgi.support.multipleHosts" value="true"/>

+		<property name="org.eclipse.virgo.medic.log.config.path" value="configuration/serviceability.xml"/>

+		<property name="osgi.context.bootdelegation" value="false"/>

+		<property name="eclipse.enableStateSaver" value="false"/>

+		<property name="org.eclipse.virgo.kernel.startup.wait.limit" value="180"/>

+		<property name="gosh.home" value="configuration"/>

+	</configurations>

+

+</product>

diff --git a/org.eclipse.virgo.site/updateCompositeUpdateSite.sh b/org.eclipse.virgo.site/updateCompositeUpdateSite.sh
new file mode 100755
index 0000000..6ff3d71
--- /dev/null
+++ b/org.eclipse.virgo.site/updateCompositeUpdateSite.sh
@@ -0,0 +1,58 @@
+#!/bin/sh
+
+# count the child directories and create a 'child' node for each one
+children=""
+numOfChildren=0
+for directory in */ ; do
+    children="$children<child location='$directory'/> "
+    ((numOfChildren++))
+done
+
+# define the repository name and the timestamp
+repository='Virgo'
+timestamp=$(date +%s)
+
+# create compositeArtifacts.xml
+cat > compositeArtifacts.xml <<EOF
+<?xml version='1.0' encoding='UTF-8'?>
+<?compositeArtifactRepository version='1.0.0'?>
+<repository name='$repository' type='org.eclipse.equinox.internal.p2.artifact.repository.CompositeArtifactRepository' version='1.0.0'>
+   <properties size='3'>
+    <property name='p2.timestamp' value='$timestamp'/>
+    <property name='p2.compressed' value='true'/>
+    <property name='p2.atomic.composite.loading' value='true'/>
+  </properties>
+  <children size='$numOfChildren'>
+    $children
+  </children>
+</repository>
+EOF
+
+# create compositeContent.xml
+cat > compositeContent.xml <<EOF
+<?xml version='1.0' encoding='UTF-8'?>
+<?compositeMetadataRepository version='1.0.0'?>
+<repository name='$repository' type='org.eclipse.equinox.internal.p2.metadata.repository.CompositeMetadataRepository' version='1.0.0'>
+   <properties size='3'>
+    <property name='p2.timestamp' value='$timestamp'/>
+    <property name='p2.compressed' value='true'/>
+    <property name='p2.atomic.composite.loading' value='true'/>
+  </properties>
+  <children size='$numOfChildren'>
+    $children
+  </children>
+</repository>
+EOF
+
+# create p2.index file
+cat > p2.index <<"EOF"
+version=1
+metadata.repository.factory.order=compositeContent.xml,\!
+artifact.repository.factory.order=compositeArtifacts.xml,\!
+EOF
+
+# package the xml files into jars and delete them
+jar cvMf compositeArtifacts.jar compositeArtifacts.xml > /dev/null
+jar cvMf compositeContent.jar compositeContent.xml > /dev/null
+rm compositeArtifacts.xml
+rm compositeContent.xml
diff --git a/packaging/.gitignore b/packaging/.gitignore
new file mode 100644
index 0000000..c8ddb39
--- /dev/null
+++ b/packaging/.gitignore
@@ -0,0 +1,12 @@
+*/src/main/resources/META-INF/MANIFEST.MF
+*/src/test/resources/META-INF/TEST.MF
+target
+integration-repo
+ivy-cache
+.ant-targets-build.xml
+user-ivy.properties
+build/
+.settings/
+.project
+.classpath
+*.iml
diff --git a/packaging/CONTRIBUTING.md b/packaging/CONTRIBUTING.md
new file mode 100644
index 0000000..e3a5790
--- /dev/null
+++ b/packaging/CONTRIBUTING.md
@@ -0,0 +1,47 @@
+Contributing to Virgo
+=====================
+
+Thanks for your interest in this project.
+
+Project description:
+--------------------
+
+The Virgo Web Server from EclipseRT is a completely module-based Java application server that is designed to run enterprise Java applications and Spring-powered applications with a high degree of flexibility and reliability. It offers a simple yet comprehensive platform to develop, deploy, and service enterprise Java applications.
+The Virgo kernel supports the core concepts of Virgo and is not biased towards the web server, thus enabling other types of server to be created. The kernel can also be used stand-alone as a rich OSGi application platform. A server runtime can easily be constructed by deploying suitable bundles on top of the kernel.
+
+- https://projects.eclipse.org/projects/rt.virgo
+
+Developer resources:
+--------------------
+
+Information regarding source code management, builds, coding standards, and more.
+
+- https://projects.eclipse.org/projects/rt.virgo/developer
+
+Contributor License Agreement:
+------------------------------
+
+Before your contribution can be accepted by the project, you need to create and electronically sign the Eclipse Foundation Contributor License Agreement (CLA).
+
+- http://www.eclipse.org/legal/CLA.php
+
+Contact:
+--------
+
+Contact the project developers via the project's "dev" list.
+
+- https://dev.eclipse.org/mailman/listinfo/virgo-dev
+
+Search for bugs:
+----------------
+
+This project uses Bugzilla to track ongoing development and issues.
+
+- https://bugs.eclipse.org/bugs/buglist.cgi?product=Virgo
+
+Create a new bug:
+-----------------
+
+Be sure to search for existing bugs before you create another one. Remember that contributions are always welcome!
+
+- https://bugs.eclipse.org/bugs/enter_bug.cgi?product=Virgo
\ No newline at end of file
diff --git a/packaging/build.gradle b/packaging/build.gradle
new file mode 100644
index 0000000..2ed2274
--- /dev/null
+++ b/packaging/build.gradle
@@ -0,0 +1,220 @@
+def packageConfiguration(configurationName, configuration, target) {
+    println "Copy the ${configurationName} artifacts:"
+    configuration.each { File file -> println file.name }
+    println "to '${target}'."
+    copy {
+        from configuration into target
+        // TODO - gradle-build remove backward compatibility? Why an underscore?
+        // replace first hyphen with underscore
+        rename(/(.+?)-(.+)/, '$1_$2')
+    }
+}
+
+configure([
+        project(':packaging:nano'),
+        project(':packaging:kernel'),
+        project(':packaging:jetty-server'),
+        project(':packaging:tomcat-server'),
+]) {
+    dependencies {
+        // TODO - rename to virgoLib, virgoLibPersistence, virgoLibEndorsed and virgoPickup?!
+        nanoLib project(':kernel:org.eclipse.virgo.kernel.equinox.extensions')
+        nanoLib project(':nano:org.eclipse.virgo.nano.authentication')
+        nanoLib project(':nano:org.eclipse.virgo.nano.shutdown')
+        nanoLib project(':util:org.eclipse.virgo.util.env')
+        nanoLib group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.launcher", version: equinoxLauncherVersion, configuration: "compile", ext: "jar"
+
+        nanoLibPersistence project(':web:org.eclipse.virgo.web.enterprise.openejb.jpa.integration')
+
+        nanoLibEndorsed group: "org.eclipse.virgo.mirrored", name: "javax.annotation", version: javaxAnnotationVersion, configuration: "compile", ext: "jar"
+        nanoLibEndorsed group: "javax.interceptor", name: "javax.interceptor-api", version: javaxInterceptorVersion
+        nanoLibEndorsed group: "javax.transaction", name: "javax.transaction-api", version: javaxTransactionVersion
+
+        nanoPickup project(':kernel:org.eclipse.virgo.management.console')
+    }
+}
+
+project(':packaging:nano') { dependencies {} }
+
+if (System.properties['skip.smoke.tests'] != 'true') {
+    project(':packaging:nano:org.eclipse.virgo.nano.smoketest') { dependencies {} }
+}
+
+configure([
+        project(':packaging:kernel'),
+        project(':packaging:jetty-server'),
+        project(':packaging:tomcat-server'),
+]) {
+    dependencies {
+        kernelPluginsExtras project(':kernel:org.eclipse.virgo.kernel.userregion')
+
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi.services", version: osgiServicesVersion, configuration: "compile", ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "osgi.enterprise", version: osgiEnterpriseVersion, configuration: "compile", ext: "jar"
+        // contains org.osgi.jmx
+
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.ds", version: equinoxDsVersion, configuration: "compile", ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.util", version: equinoxUtilVersion, configuration: "compile", ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.region", version: equinoxRegionVersion, configuration: "compile", ext: "jar"
+
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "oevm.org.aopalliance", version: orgAopAllianceVersion, ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.apache.commons.codec", version: commonsCodecVersion, ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.springframework.aop", version: springframeworkVersion, ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.springframework.beans", version: springframeworkVersion, ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.springframework.context", version: springframeworkVersion, ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.springframework.core", version: springframeworkVersion, ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.springframework.expression", version: springframeworkVersion, ext: "jar"
+
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "com.squareup.okio", version: okioVersion, ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "com.squareup.okhttp3", version: okhttp3Version, ext: "jar"
+
+        repositoryExt group: "org.eclipse.gemini.blueprint", name: "gemini-blueprint-io", version: geminiBlueprintVersion, ext: "jar"
+        repositoryExt group: "org.eclipse.gemini.blueprint", name: "gemini-blueprint-core", version: geminiBlueprintVersion, ext: "jar"
+        repositoryExt group: "org.eclipse.gemini.blueprint", name: "gemini-blueprint-extender", version: geminiBlueprintVersion, ext: "jar"
+        repositoryExt group: "org.eclipse.gemini.blueprint", name: "gemini-blueprint-extensions", version: geminiBlueprintVersion, ext: "jar"
+
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.eclipse.gemini.management", version: geminiManagementVersion, configuration: "compile", ext: "jar"
+        repositoryExt project(':kernel:org.eclipse.virgo.management.fragment')
+
+        repositoryExt project(':kernel:org.eclipse.virgo.kernel.agent.dm')
+        repositoryExt project(':kernel:org.eclipse.virgo.kernel.deployer.dm')
+        repositoryExt project(':kernel:org.eclipse.virgo.kernel.dmfragment')
+
+        repositoryExt group: "commons-io", name: "commons-io", version: commonsIoVersion, ext: "jar"
+        repositoryExt group: "commons-fileupload", name: "commons-fileupload", version: commonsFileuploadVersion, ext: "jar"
+        repositoryExt group: "org.jolokia", name: "jolokia-osgi", version: jolokiaVersion, ext: "jar"
+    }
+}
+
+configure([
+        project(':packaging:kernel'),
+]) { dependencies {} }
+
+configure([
+        project(':packaging:jetty-server'),
+        project(':packaging:tomcat-server'),
+]) {
+    dependencies {
+        repositoryExt project(':medic:org.eclipse.virgo.medic')
+        repositoryExt project(':medic:org.eclipse.virgo.medic.core')
+        repositoryExt project(':web:org.eclipse.virgo.web.dm')
+
+        // 3rd party dependencies from Spring Framework
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "javax.jms", version: javaxJmsVersion, configuration: "compile", ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "javax.servlet", version: javaxServletVersion, configuration: "compile", ext: "jar"
+
+        // missing Spring Framework dependencies
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.springframework.aspects", version: springframeworkVersion, ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.springframework.context.support", version: springframeworkVersion, ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.springframework.jdbc", version: springframeworkVersion, ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.springframework.messaging", version: springframeworkVersion, ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.springframework.jms", version: springframeworkVersion, ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.springframework.orm", version: springframeworkVersion, ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.springframework.oxm", version: springframeworkVersion, ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.springframework.transaction", version: springframeworkVersion, ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.springframework.web", version: springframeworkVersion, ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.springframework.webmvc", version: springframeworkVersion, ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.springframework.webmvc.portlet", version: springframeworkVersion, ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.springframework.websocket", version: springframeworkVersion, ext: "jar"
+
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.aspectj.weaver", version: aspectjVersion, ext: "jar"
+
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "oevm.javax.portlet", version: javaxPortletVersion, ext: "jar"
+
+        repositoryExt group: "javax.servlet.jsp.jstl", name: "javax.servlet.jsp.jstl-api", version: javaxServletJspJstlApiVersion
+        repositoryExt group: "org.glassfish.web", name: "javax.servlet.jsp.jstl", version: javaxServletJspJstlImplVersion
+
+        nanoPickup project(':apps:org.eclipse.virgo.apps.splash')
+    }
+}
+
+configure([
+        project(':packaging:jetty-server'),
+]) {
+    dependencies {
+        repositoryExt project(':web:org.eclipse.virgo.web.servlet.adapter')
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.eclipse.jetty.continuation", version: jettyVersion, configuration: "compile", ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.eclipse.jetty.deploy", version: jettyVersion, configuration: "compile", ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.eclipse.jetty.http", version: jettyVersion, configuration: "compile", ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.eclipse.jetty.io", version: jettyVersion, configuration: "compile", ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.eclipse.jetty.osgi.boot", version: jettyVersion, configuration: "compile", ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.eclipse.jetty.security", version: jettyVersion, configuration: "compile", ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.eclipse.jetty.server", version: jettyVersion, configuration: "compile", ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.eclipse.jetty.servlet", version: jettyVersion, configuration: "compile", ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.eclipse.jetty.util", version: jettyVersion, configuration: "compile", ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.eclipse.jetty.webapp", version: jettyVersion, configuration: "compile", ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.eclipse.jetty.xml", version: jettyVersion, configuration: "compile", ext: "jar"
+
+        /* TODO think about adding additional Jetty bundles - e.g. for WebSocket support
+         packaging/jetty-server/build/install/virgo-jetty-server/repository/ext/org.eclipse.jetty.ajp_8.1.16.v20140903.jar
+         packaging/jetty-server/build/install/virgo-jetty-server/repository/ext/org.eclipse.jetty.annotations_8.1.16.v20140903.jar
+         packaging/jetty-server/build/install/virgo-jetty-server/repository/ext/org.eclipse.jetty.client_8.1.16.v20140903.jar
+         packaging/jetty-server/build/install/virgo-jetty-server/repository/ext/org.eclipse.jetty.jmx_8.1.16.v20140903.jar
+         packaging/jetty-server/build/install/virgo-jetty-server/repository/ext/org.eclipse.jetty.jndi_8.1.16.v20140903.jar
+         packaging/jetty-server/build/install/virgo-jetty-server/repository/ext/org.eclipse.jetty.osgi.boot.jsp_8.1.16.v20140903.jar
+         packaging/jetty-server/build/install/virgo-jetty-server/repository/ext/org.eclipse.jetty.plus_8.1.16.v20140903.jar
+         packaging/jetty-server/build/install/virgo-jetty-server/repository/ext/org.eclipse.jetty.policy_8.1.16.v20140903.jar
+         packaging/jetty-server/build/install/virgo-jetty-server/repository/ext/org.eclipse.jetty.rewrite_8.1.16.v20140903.jar
+         packaging/jetty-server/build/install/virgo-jetty-server/repository/ext/org.eclipse.jetty.servlets_8.1.16.v20140903.jar
+         packaging/jetty-server/build/install/virgo-jetty-server/repository/ext/org.eclipse.jetty.websocket_8.1.16.v20140903.jar
+         */
+    }
+}
+
+configure([
+        project(':packaging:tomcat-server'),
+]) {
+    dependencies {
+        repositoryExt project(':web:org.eclipse.virgo.web.core')
+        repositoryExt project(':web:org.eclipse.virgo.web.tomcat.support')
+        repositoryExt project(':web:org.eclipse.virgo.web.servlet.adapter')
+        repositoryExt project(':web:org.eclipse.virgo.web.spring.integration')
+
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "javax.annotation", version: javaxAnnotationVersion, configuration: "compile", ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "javax.ejb", version: javaxEjbVersion, configuration: "compile", ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "javax.el", version: javaxElVersion, configuration: "compile", ext: "jar"
+        repositoryExt group: "com.sun.mail", name: "javax.mail", version: javaxMailVersion
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "javax.persistence", version: javaxPersistenceVersion, configuration: "compile", ext: "jar"
+
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "javax.servlet", version: javaxServletVersion, configuration: "compile", ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "javax.servlet.jsp", version: javaxServletJspVersion, configuration: "compile", ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "javax.security.auth.message", version: javaxSecurityAuthMessageVersion, configuration: "compile", ext: "jar"
+
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "javax.xml.rpc", version: javaxXmlRpcVersion, configuration: "compile", ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "javax.websocket", version: javaxWebsocketVersion, configuration: "compile", ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.event", version: equinoxEventVersion, configuration: "compile", ext: "jar"
+
+        repositoryExt group: "commons-io", name: "commons-io", version: commonsIoVersion, ext: "jar"
+        repositoryExt group: "commons-fileupload", name: "commons-fileupload", version: commonsFileuploadVersion, ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "oevm.org.apache.taglibs.standard", version: apacheTaglibsStandardVersion, ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi.services", version: osgiServicesVersion, configuration: "compile", ext: "jar"
+        repositoryExt group: "org.slf4j", name: "slf4j-api", version: slf4jVersion
+        repositoryExt group: "org.slf4j", name: "slf4j-jcl", version: slf4jVersion
+        repositoryExt group: "org.slf4j", name: "jul-to-slf4j", version: slf4jVersion
+        repositoryExt group: "org.slf4j", name: "slf4j-log4j12", version: slf4jVersion
+
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.eclipse.jdt.core.compiler.batch", version: eclipseJdtCoreCompilerBatchVersion, configuration: "compile", ext: "jar"
+
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "javax.websocket", version: javaxWebsocketVersion, configuration: "compile", ext: "jar"
+
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.apache.catalina", version: apacheCatalinaVersion, configuration: "compile", ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.apache.catalina.ha", version: apacheCatalinaVersion, configuration: "compile", ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.apache.catalina.tribes", version: apacheCatalinaVersion, configuration: "compile", ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.apache.coyote", version: apacheCatalinaVersion, configuration: "compile", ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.apache.el", version: apacheCatalinaVersion, configuration: "compile", ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.apache.jasper", version: apacheCatalinaVersion, configuration: "compile", ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.apache.juli", version: apacheCatalinaVersion, configuration: "compile", ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.apache.tomcat.api", version: apacheCatalinaVersion, configuration: "compile", ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.apache.tomcat.util", version: apacheCatalinaVersion, configuration: "compile", ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.apache.tomcat.util.scan", version: apacheCatalinaVersion, configuration: "compile", ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.apache.tomcat.jni", version: apacheCatalinaVersion, configuration: "compile", ext: "jar"
+        repositoryExt group: "org.eclipse.virgo.mirrored", name: "org.apache.tomcat.websocket", version: apacheCatalinaVersion, configuration: "compile", ext: "jar"
+
+        repositoryExt group: "org.eclipse.gemini", name: "org.eclipse.gemini.web.core", version: geminiWebVersion, configuration: "compile", ext: "jar"
+        repositoryExt group: "org.eclipse.gemini", name: "org.eclipse.gemini.web.tomcat", version: geminiWebVersion, configuration: "compile", ext: "jar"
+        repositoryExt group: "org.eclipse.gemini", name: "org.eclipse.gemini.web.jaspic.fragment", version: geminiWebVersion, configuration: "compile", ext: "jar"
+
+        // TODO - gradle-build build :apps:repository.par
+        //        <dependency org="org.eclipse.virgo.apps" name="org.eclipse.virgo.apps.repository" rev="${org.eclipse.virgo.apps}" conf="pickup->runtime"/>
+        //        nanoPickup project(':apps:org.eclipse.virgo.apps.repository')
+    }
+}
diff --git a/packaging/doc/code-style/eclipse/eclipse_code-style_clean-up.xml b/packaging/doc/code-style/eclipse/eclipse_code-style_clean-up.xml
new file mode 100644
index 0000000..eb204f0
--- /dev/null
+++ b/packaging/doc/code-style/eclipse/eclipse_code-style_clean-up.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<profiles version="2">
+<profile kind="CleanUpProfile" name="Virgo Web Server - Code Clean Up" version="2">
+<setting id="cleanup.remove_unused_private_fields" value="true"/>
+<setting id="cleanup.always_use_parentheses_in_expressions" value="false"/>
+<setting id="cleanup.never_use_blocks" value="false"/>
+<setting id="cleanup.remove_unused_private_methods" value="true"/>
+<setting id="cleanup.add_missing_deprecated_annotations" value="true"/>
+<setting id="cleanup.convert_to_enhanced_for_loop" value="false"/>
+<setting id="cleanup.remove_unnecessary_nls_tags" value="true"/>
+<setting id="cleanup.sort_members" value="false"/>
+<setting id="cleanup.remove_unused_local_variables" value="true"/>
+<setting id="cleanup.never_use_parentheses_in_expressions" value="true"/>
+<setting id="cleanup.remove_unused_private_members" value="true"/>
+<setting id="cleanup.remove_unnecessary_casts" value="true"/>
+<setting id="cleanup.make_parameters_final" value="false"/>
+<setting id="cleanup.use_this_for_non_static_field_access" value="true"/>
+<setting id="cleanup.remove_private_constructors" value="true"/>
+<setting id="cleanup.use_blocks" value="true"/>
+<setting id="cleanup.always_use_this_for_non_static_method_access" value="false"/>
+<setting id="cleanup.remove_trailing_whitespaces_all" value="true"/>
+<setting id="cleanup.always_use_this_for_non_static_field_access" value="true"/>
+<setting id="cleanup.use_this_for_non_static_field_access_only_if_necessary" value="false"/>
+<setting id="cleanup.add_default_serial_version_id" value="false"/>
+<setting id="cleanup.make_type_abstract_if_missing_method" value="false"/>
+<setting id="cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class" value="true"/>
+<setting id="cleanup.make_variable_declarations_final" value="true"/>
+<setting id="cleanup.add_missing_nls_tags" value="false"/>
+<setting id="cleanup.format_source_code" value="true"/>
+<setting id="cleanup.qualify_static_method_accesses_with_declaring_class" value="false"/>
+<setting id="cleanup.add_missing_override_annotations" value="true"/>
+<setting id="cleanup.remove_unused_private_types" value="true"/>
+<setting id="cleanup.add_missing_methods" value="false"/>
+<setting id="cleanup.make_local_variable_final" value="false"/>
+<setting id="cleanup.correct_indentation" value="false"/>
+<setting id="cleanup.remove_unused_imports" value="true"/>
+<setting id="cleanup.remove_trailing_whitespaces_ignore_empty" value="false"/>
+<setting id="cleanup.make_private_fields_final" value="true"/>
+<setting id="cleanup.add_generated_serial_version_id" value="true"/>
+<setting id="cleanup.organize_imports" value="true"/>
+<setting id="cleanup.remove_trailing_whitespaces" value="true"/>
+<setting id="cleanup.sort_members_all" value="false"/>
+<setting id="cleanup.use_blocks_only_for_return_and_throw" value="false"/>
+<setting id="cleanup.add_missing_annotations" value="true"/>
+<setting id="cleanup.use_parentheses_in_expressions" value="true"/>
+<setting id="cleanup.qualify_static_field_accesses_with_declaring_class" value="false"/>
+<setting id="cleanup.use_this_for_non_static_method_access_only_if_necessary" value="true"/>
+<setting id="cleanup.use_this_for_non_static_method_access" value="false"/>
+<setting id="cleanup.qualify_static_member_accesses_through_instances_with_declaring_class" value="true"/>
+<setting id="cleanup.add_serial_version_id" value="true"/>
+<setting id="cleanup.format_source_code_changes_only" value="false"/>
+<setting id="cleanup.qualify_static_member_accesses_with_declaring_class" value="true"/>
+<setting id="cleanup.always_use_blocks" value="true"/>
+</profile>
+</profiles>
diff --git a/packaging/doc/code-style/eclipse/eclipse_code-style_formatter.xml b/packaging/doc/code-style/eclipse/eclipse_code-style_formatter.xml
new file mode 100644
index 0000000..00717d9
--- /dev/null
+++ b/packaging/doc/code-style/eclipse/eclipse_code-style_formatter.xml
@@ -0,0 +1,269 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<profiles version="11">
+<profile kind="CodeFormatterProfile" name="Virgo Web Server - Code Formatter" version="11">
+<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_field" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression" value="80"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_binary_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_array_initializer" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_package" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.continuation_indentation" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_binary_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_package" value="1"/>
+<setting id="org.eclipse.jdt.core.compiler.source" value="1.5"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_line_comments" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.join_wrapped_lines" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_member_type" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.align_type_members_on_columns" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_unary_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.indent_parameter_description" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.lineSplit" value="150"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.indentation.size" value="4"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_assignment" value="0"/>
+<setting id="org.eclipse.jdt.core.compiler.problem.assertIdentifier" value="error"/>
+<setting id="org.eclipse.jdt.core.formatter.tabulation.char" value="space"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_body" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_method" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_switch" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.compiler.problem.enumIdentifier" value="error"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_ellipsis" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_method_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.compact_else_if" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_constant" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.indent_root_tags" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.tabulation.size" value="4"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_empty_lines" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression" value="16"/>
+<setting id="org.eclipse.jdt.core.compiler.compliance" value="1.5"/>
+<setting id="org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_unary_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_binary_expression" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode" value="enabled"/>
+<setting id="org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant" value="80"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_javadoc_comments" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.line_length" value="120"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_import_groups" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.wrap_before_binary_operator" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_block" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.join_lines_in_comments" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_if" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_html" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_source_code" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.jdt.core.compiler.codegen.targetPlatform" value="1.5"/>
+<setting id="org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_header" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_block_comments" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_type_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_imports" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line" value="false"/>
+</profile>
+</profiles>
diff --git a/packaging/doc/code-style/eclipse/eclipse_code-style_templates.xml b/packaging/doc/code-style/eclipse/eclipse_code-style_templates.xml
new file mode 100644
index 0000000..3da4e1f
--- /dev/null
+++ b/packaging/doc/code-style/eclipse/eclipse_code-style_templates.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><templates><template autoinsert="false" context="gettercomment_context" deleted="false" description="Comment for getter method" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name="gettercomment">/**
+ * @return 
+ */</template><template autoinsert="false" context="settercomment_context" deleted="false" description="Comment for setter method" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.settercomment" name="settercomment">/**
+ * @param 
+ */</template><template autoinsert="true" context="constructorcomment_context" deleted="false" description="Comment for created constructors" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name="constructorcomment">/**
+ * ${tags}
+ */</template><template autoinsert="false" context="filecomment_context" deleted="false" description="Comment for created Java files" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.filecomment" name="filecomment">/*
+ * This file is part of the Eclipse Virgo project.
+ *
+ * Copyright (c) ${year} copyright_holder
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    ${user} - initial contribution
+ */
+</template><template autoinsert="false" context="typecomment_context" deleted="false" description="Comment for created types" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.typecomment" name="typecomment">/**
+ * ${todo} Document ${type_name}
+ * &lt;p /&gt;
+ *
+ * &lt;strong&gt;Concurrent Semantics&lt;/strong&gt;&lt;br /&gt;
+ * ${todo} Document concurrent semantics of ${type_name}
+ */</template><template autoinsert="false" context="fieldcomment_context" deleted="false" description="Comment for fields" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name="fieldcomment"/><template autoinsert="true" context="methodcomment_context" deleted="false" description="Comment for non-overriding methods" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name="methodcomment">/**
+ * ${tags}
+ */</template><template autoinsert="false" context="overridecomment_context" deleted="false" description="Comment for overriding methods" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name="overridecomment">/** 
+ * {@inheritDoc}
+ */</template><template autoinsert="true" context="delegatecomment_context" deleted="false" description="Comment for delegate methods" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name="delegatecomment">/**
+ * ${tags}
+ * ${see_to_target}
+ */</template><template autoinsert="true" context="newtype_context" deleted="false" description="Newly created files" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.newtype" name="newtype">${filecomment}
+${package_declaration}
+
+${typecomment}
+${type_declaration}</template><template autoinsert="true" context="classbody_context" deleted="false" description="Code in new class type bodies" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.classbody" name="classbody">
+</template><template autoinsert="true" context="interfacebody_context" deleted="false" description="Code in new interface type bodies" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name="interfacebody">
+</template><template autoinsert="true" context="enumbody_context" deleted="false" description="Code in new enum type bodies" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.enumbody" name="enumbody">
+</template><template autoinsert="true" context="annotationbody_context" deleted="false" description="Code in new annotation type bodies" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name="annotationbody">
+</template><template autoinsert="true" context="catchblock_context" deleted="false" description="Code in new catch blocks" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.catchblock" name="catchblock">// ${todo} Auto-generated catch block
+${exception_var}.printStackTrace();</template><template autoinsert="true" context="methodbody_context" deleted="false" description="Code in created method stubs" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.methodbody" name="methodbody">// ${todo} Auto-generated method stub
+${body_statement}</template><template autoinsert="true" context="constructorbody_context" deleted="false" description="Code in created constructor stubs" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name="constructorbody">${body_statement}
+// ${todo} Auto-generated constructor stub</template><template autoinsert="true" context="getterbody_context" deleted="false" description="Code in created getters" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.getterbody" name="getterbody">return ${field};</template><template autoinsert="true" context="setterbody_context" deleted="false" description="Code in created setters" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.setterbody" name="setterbody">${field} = ${param};</template><template autoinsert="true" context="gettercomment_context" deleted="false" description="Comment for getter function" enabled="true" id="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name="gettercomment">/**
+ * @return the ${bare_field_name}
+ */</template><template autoinsert="true" context="settercomment_context" deleted="false" description="Comment for setter function" enabled="true" id="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name="settercomment">/**
+ * @param ${param} the ${bare_field_name} to set
+ */</template><template autoinsert="true" context="constructorcomment_context" deleted="false" description="Comment for created constructors" enabled="true" id="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name="constructorcomment">/**
+ * ${tags}
+ */</template><template autoinsert="true" context="filecomment_context" deleted="false" description="Comment for created JavaScript files" enabled="true" id="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name="filecomment">/**
+ * 
+ */</template><template autoinsert="false" context="typecomment_context" deleted="false" description="Comment for created types" enabled="true" id="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name="typecomment">/**
+ * ${tags}
+ */</template><template autoinsert="true" context="fieldcomment_context" deleted="false" description="Comment for vars" enabled="true" id="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name="fieldcomment">/**
+ * 
+ */</template><template autoinsert="true" context="methodcomment_context" deleted="false" description="Comment for non-overriding function" enabled="true" id="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name="methodcomment">/**
+ * ${tags}
+ */</template><template autoinsert="true" context="overridecomment_context" deleted="false" description="Comment for overriding functions" enabled="true" id="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name="overridecomment">/* (non-Jsdoc)
+ * ${see_to_overridden}
+ */</template><template autoinsert="true" context="delegatecomment_context" deleted="false" description="Comment for delegate functions" enabled="true" id="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name="delegatecomment">/**
+ * ${tags}
+ * ${see_to_target}
+ */</template><template autoinsert="true" context="newtype_context" deleted="false" description="Newly created files" enabled="true" id="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name="newtype">${filecomment}
+${package_declaration}
+
+${typecomment}
+${type_declaration}</template><template autoinsert="true" context="classbody_context" deleted="false" description="Code in new class type bodies" enabled="true" id="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name="classbody">
+</template><template autoinsert="true" context="catchblock_context" deleted="false" description="Code in new catch blocks" enabled="true" id="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name="catchblock">// ${todo} Auto-generated catch block
+${exception_var}.printStackTrace();</template><template autoinsert="true" context="methodbody_context" deleted="false" description="Code in created function stubs" enabled="true" id="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name="methodbody">// ${todo} Auto-generated function stub
+${body_statement}</template><template autoinsert="true" context="constructorbody_context" deleted="false" description="Code in created constructor stubs" enabled="true" id="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name="constructorbody">${body_statement}
+// ${todo} Auto-generated constructor stub</template><template autoinsert="true" context="getterbody_context" deleted="false" description="Code in created getters" enabled="true" id="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name="getterbody">return ${field};</template><template autoinsert="true" context="setterbody_context" deleted="false" description="Code in created setters" enabled="true" id="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name="setterbody">${field} = ${param};</template></templates>
\ No newline at end of file
diff --git a/packaging/jetty-server/build-jetty-server.xml b/packaging/jetty-server/build-jetty-server.xml
new file mode 100644
index 0000000..7dc1b8d
--- /dev/null
+++ b/packaging/jetty-server/build-jetty-server.xml
@@ -0,0 +1,282 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="build-jetty-server" default="precommit" xmlns:ivy="antlib:org.apache.ivy.ant">
+
+    <property name="jetty-server.basedir" value="${basedir}/jetty-server"/>
+    
+	<path id="bundles">
+		<pathelement location="${jetty-server.basedir}/org.eclipse.virgo.jetty.sample.tags"/>
+		<pathelement location="${jetty-server.basedir}/org.eclipse.virgo.jetty.web"/>
+	</path>
+
+	<target name="precommit" />
+	<target name="ivy.init" />
+
+	<property file="${basedir}/../build.properties"/>
+	<property file="${basedir}/../build.versions"/>
+	<property file="${basedir}/../build/virgo.properties" />
+	<import file="${basedir}/../virgo-build/multi-bundle/default.xml"/>
+    
+	<target name="vjs.package-resources-and-products" depends="ivy.init">
+		<delete dir="${package.output.dir}" quiet="true"/>
+		<mkdir dir="${package.output.dir}"/>
+
+		<property name="jetty.server.resources" value="${jetty-server.target.dir}/jetty_server_resources"/>
+        <property name="jetty.server.scripts" value="${jetty-server.target.dir}/jetty_server_scripts"/>
+        <property name="repository.ext" value="${jetty.server.resources}/repository/ext"/>
+        <property name="repository.usr" value="${jetty.server.resources}/repository/usr"/>
+        
+        <unzip src="${p2.repository.dir}/binary/kernel_specific_resources_1.0.0" dest="${jetty.server.resources}">
+			<globmapper from="kernel_specific_resources_1.0.0/*" to="*"/>
+		</unzip>
+        <unzip src="${p2.repository.dir}/binary/scripts_1.0.0" dest="${jetty.server.scripts}">
+			<globmapper from="scripts_1.0.0/*" to="*"/>
+		</unzip>
+        
+		<mkdir dir="${repository.usr}"/>
+		
+		<antcall target="jetty.package.config"/>
+		<antcall target="jetty.package.docs"/>
+		<antcall target="jetty.package.lib"/>
+		<antcall target="jetty.package.pickup"/>
+		<antcall target="jetty.package.repository"/>
+		<antcall target="jetty.package.resources"/>
+		<antcall target="package.jetty"/>
+        <antcall target="package.jetty.scripts"/>
+        <antcall target="jetty.package.publish"/>
+    </target>
+    
+    <target name="vjs.prepare-bundles-and-features" depends="ivy.init">
+        <!--prepare jetty server features for publishing -->
+        <copy todir="${jetty-server.target.dir}/assembly/features" failonerror="true">
+            <fileset dir="${jetty-server.basedir}/publish_resources/features"/>
+        </copy>
+    </target>
+
+    <target name="vjs.publish-bundles-and-features" depends="ivy.init">
+        <antcall target="p2.publish-bundles-features">
+            <param name="repository" value="${p2.repository.dir}"/>
+            <param name="source" value="${jetty-server.target.dir}/assembly"/>
+        </antcall>
+        <echo message="Published Virgo Jetty Server bundles and features to ${p2.repository.dir}."/>
+    </target>
+    
+    <target name="vjs.clean-up" depends="ivy.init">
+        <delete dir="${jetty.server.resources.location}" quiet="true"/>
+        <delete dir="${jetty.server.scripts.location}" quiet="true"/>
+        <delete dir="${jetty-server.target.dir}/assembly" quiet="true"/>
+        <delete dir="${jetty-server.target.dir}" quiet="true"/>
+    </target>
+    
+    <target name="vjs.package-distro">
+        <property name="vjs.package.dir" value="${package.dir}/VJS"/>
+        
+        <antcall target="p2.install-virgo-product">
+            <param name="repository" value="${p2.repository.dir}"/>
+            <param name="destination" value="${vjs.package.dir}/virgo-jetty-server-${bundle.version}"/>
+            <param name="product.iu" value="jetty-server.product"/>
+        </antcall>
+        <echo message="Installed Virgo Jetty Server for distribution purposes."/>
+        
+        <mkdir dir="${artifacts.dir}"/>
+        
+        <delete dir="${vjs.package.dir}/virgo-jetty-server-${bundle.version}/Eclipse.app" quiet="true"/>
+        
+		<zip destfile="${artifacts.dir}/virgo-jetty-server-${bundle.version}.zip">
+			<zipfileset dir="${vjs.package.dir}" includes="virgo-jetty-server-${bundle.version}/bin/*.sh" filemode="755"/>
+			<zipfileset dir="${vjs.package.dir}" includes="virgo-jetty-server-${bundle.version}/configuration/org.eclipse.virgo.kernel.jmxremote.access.properties" filemode="600"/>
+			<zipfileset dir="${vjs.package.dir}">
+				<exclude name="virgo-jetty-server-${bundle.version}/bin/*.sh"/>
+				<exclude name="virgo-jetty-server-${bundle.version}/configuration/org.eclipse.virgo.kernel.jmxremote.access.properties"/>
+			</zipfileset>
+		</zip>
+    </target>
+
+    <target name="jetty.package.publish">
+        <property name="jetty.server.resources.location" value="${jetty-server.target.dir}/jetty_server_resources_zipped"/>
+		<zip destfile="${jetty.server.resources.location}/binary/jetty_server_resources">
+			<zipfileset dir="${jetty.server.resources}"/>
+		</zip>
+        <delete dir="${jetty.server.resources}" quiet="true"/>
+        
+        <property name="jetty.server.scripts.location" value="${jetty-server.target.dir}/jetty_server_scripts_zipped"/>
+		<zip destfile="${jetty.server.scripts.location}/binary/jetty_server_scripts">
+			<zipfileset dir="${jetty.server.scripts}"/>
+		</zip>
+        <delete dir="${jetty.server.scripts}" quiet="true"/>
+        
+        <!-- proceed with publish -->
+        <property name="p2.products.location" value="${jetty-server.basedir}/publish_resources/products"/>
+        <antcall target="p2.publish-binary">
+            <param name="repository" value="${p2.repository.dir}"/>
+            <param name="source" value="${jetty.server.resources.location}"/>
+        </antcall>
+        <echo message="Published the jetty server resources to ${p2.repository.dir}."/>
+        
+        <antcall target="p2.publish-binary-chmod">
+            <param name="repository" value="${p2.repository.dir}"/>
+            <param name="source" value="${jetty.server.scripts.location}"/>
+            <param name="chmod.args" value="startup.sh@/bin#755,dmk.sh@/bin#755,checkJava.sh@/bin#755,jconsole.sh@/bin#755,setupClasspath.sh@/bin#755,shutdown.sh@/bin#755"/>
+        </antcall>
+        <echo message="Published the jetty server scripts to ${p2.repository.dir}."/>
+        
+        <antcall target="p2.publish-product">
+            <param name="repository" value="${p2.repository.dir}"/>
+            <param name="product.file.location" value="${p2.products.location}/jetty-server/jetty-server.product"/>
+        </antcall>
+        <echo message="Published jetty server product to ${p2.repository.dir}."/>
+    </target>
+    
+	<target name="jetty.package.config">
+		<copy todir="${jetty.server.resources}/configuration" failonerror="true" overwrite="true">
+			<fileset dir="${jetty-server.basedir}/configuration"/>
+		</copy>
+
+		<replaceregexp match="# osgi\.console=2401"
+			replace="osgi.console=2401" flags="s"
+			file="${jetty.server.resources}/configuration/org.eclipse.virgo.kernel.userregion.properties"/>
+
+		<replaceregexp match="initialArtifacts =.*\.blueprint"
+			replace="initialArtifacts=repository:plan/org.eclipse.virgo.kernel.userregion.blueprint, repository:plan/org.eclipse.virgo.jetty.web" flags="s"
+			file="${jetty.server.resources}/configuration/org.eclipse.virgo.kernel.userregion.properties"/>
+
+		<replaceregexp match=" javax\.servlet\.\*;.*?,\\.*? "
+			replace=" " flags="s"
+			file="${jetty.server.resources}/configuration/org.eclipse.virgo.kernel.userregion.properties"/>			                
+
+		<replaceregexp match="virgo-kernel" replace="virgo-jetty-server" flags="g"
+				file="${jetty.server.resources}/configuration/serviceability.xml"/>
+	</target>
+
+	<target name="jetty.package.docs" depends="ivy.init">
+		<ivy:resolve resolveId="copy.path" file="${jetty-server.basedir}/docs-ivy.xml" transitive="false" conf="docs"/>
+		<ivy:retrieve resolveId="copy.path" pattern="${jetty-server.target.dir}/docs/[artifact]-[revision].[ext]" conf="docs" type="zip, pdf"/>
+
+		<copy todir="${jetty.server.resources}/docs/user-guide/pdf" flatten="true">
+			<fileset dir="${jetty-server.target.dir}/docs">
+				<include name="**/virgo-user-guide*.pdf"/>
+			</fileset>
+		</copy>
+
+		<copy todir="${jetty.server.resources}/docs/programmer-guide/pdf" flatten="true">
+			<fileset dir="${jetty-server.target.dir}/docs">
+				<include name="**/virgo-programmer-guide*.pdf"/>
+			</fileset>
+		</copy>
+
+		<unzip dest="${jetty.server.resources}/docs/user-guide">
+			<fileset dir="${jetty-server.target.dir}/docs">
+		        <include name="**/virgo-user-guide*.zip"/>
+		    </fileset>
+		</unzip>
+
+		<unzip dest="${jetty.server.resources}/docs/programmer-guide">
+			<fileset dir="${jetty-server.target.dir}/docs">
+		        <include name="**/virgo-programmer-guide*.zip"/>
+		    </fileset>
+		</unzip>
+
+	</target>
+
+	<target name="jetty.package.lib">
+		<echo file="${jetty.server.resources}/lib/.version" append="true"
+				message="virgo.server.version=${bundle.version}&#xa;"/>
+	</target>
+
+	<target name="jetty.package.pickup" depends="ivy.init">
+		<ivy:resolve resolveId="copy.path" file="${jetty-server.basedir}/pickup-ivy.xml" transitive="true"/>
+		<ivy:retrieve resolveId="copy.path" pattern="${jetty.server.resources}/pickup/[artifact]-[revision].[ext]" type="jar, war, wab" conf="pickup"/>
+		<ivy:retrieve resolveId="copy.path" pattern="${jetty.server.resources}/pickup/[artifact]-[revision].[ext]" type="plan" conf="pickup-plan"/>
+		<ivy:retrieve resolveId="copy.path" pattern="${repository.ext}/[artifact]-[revision].[ext]" type="jar, war, wab" conf="pickup-plan"/>
+	</target>
+
+	<target name="jetty.package.repository" depends="ivy.init">
+		<ivy:resolve resolveId="copy.path" file="${jetty-server.basedir}/repository-ivy.xml" transitive="false"/>
+		<ivy:retrieve resolveId="copy.path" pattern="${repository.ext}/[artifact]-[revision].[ext]" conf="ext" type="library,jar,plan"/>
+
+		<ivy:resolve resolveId="copy.path" file="${jetty-server.basedir}/repository-ivy.xml" transitive="true"/>
+		<ivy:retrieve resolveId="copy.path" pattern="${repository.ext}/[artifact]-[revision].[ext]" conf="transitive" type="library,jar,plan" />
+		
+		<copy todir="${repository.ext}" failonerror="true">
+			<fileset dir="${jetty-server.basedir}/jettybundles"/>
+		</copy>
+	</target>
+
+	<target name="jetty.package.resources">
+		<copy todir="${jetty.server.resources}" failonerror="true">
+			<fileset dir="${jetty-server.basedir}/resources"/>
+		</copy>
+	</target>
+	
+	<target name="package.jetty">
+		<mkdir dir="${jetty.server.resources}/jetty"/>
+		
+		<copy todir="${jetty.server.resources}/jetty" failonerror="true">
+			<fileset dir="${jetty-server.basedir}/jetty"/>
+		</copy>		
+	</target>
+    
+    <target name="package.jetty.scripts">
+    
+        <!-- \ must be double escaped \\\\ and new lines must be given with the ascii code thus the strange chars-->
+		
+		<replaceregexp match="# parse the standard arguments"
+			replace="# parse the standard arguments &#10;    JETTY_HOME=$KERNEL_HOME/jetty" flags="m"
+			file="${jetty.server.scripts}/bin/dmk.sh" />
+
+		<replaceregexp match="-Djava.io.tmpdir"
+			replace="-Djetty.home=$JETTY_HOME \\\\&#10;       -Djava.io.tmpdir" flags="m"
+			file="${jetty.server.scripts}/bin/dmk.sh" />
+		
+		<replaceregexp match='set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Djava.io.tmpdir="%TMP_DIR%"'
+			replace='set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Djetty.home="%KERNEL_HOME%\\\\jetty"&#10;      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Djava.io.tmpdir="%TMP_DIR%"' flags="m"
+			file="${jetty.server.scripts}/bin/dmk.bat" />
+    </target>
+    
+    <target name="publish-updatesite-download">
+        <fail message="The 'project.name' property must be set on this project.">
+            <condition>
+                <not>
+                    <isset property="project.name"/>
+                </not>
+            </condition>
+        </fail>
+        <checksum file="${updatesite.output.file}" algorithm="sha1"/>
+        <sshexec host="build.eclipse.org" 
+                username="${eclipse.committerId}" 
+                keyfile="${key.file}" 
+                passphrase="${passphrase}"
+                command="mkdir -pv /home/data/httpd/download.eclipse.org/virgo/updatesite-zipped/${bundle.version}"/>
+        <sshexec host="build.eclipse.org" 
+                username="${eclipse.committerId}" 
+                keyfile="${key.file}" 
+                passphrase="${passphrase}"
+                command="mkdir -pv /home/data/httpd/download.eclipse.org/virgo/updatesite/${bundle.version}"/>
+        <scp localFile="${updatesite.output.file}"
+                todir="${eclipse.committerId}@build.eclipse.org:/home/data/httpd/download.eclipse.org/virgo/updatesite-zipped/${bundle.version}" 
+                keyfile="${key.file}"
+                passphrase="${passphrase}" />
+        <scp localFile="${updatesite.output.file}.sha1"
+                todir="${eclipse.committerId}@build.eclipse.org:/home/data/httpd/download.eclipse.org/virgo/updatesite-zipped/${bundle.version}" 
+                keyfile="${key.file}"
+                passphrase="${passphrase}" />
+        <sshexec host="build.eclipse.org" 
+                username="${eclipse.committerId}" 
+                keyfile="${key.file}" 
+                passphrase="${passphrase}"
+                command="unzip /home/data/httpd/download.eclipse.org/virgo/updatesite-zipped/${bundle.version}/${updatesite.file.name} -d /home/data/httpd/download.eclipse.org/virgo/updatesite/${bundle.version}"/>
+    </target>
+
+	<target name="smoke-test-jetty-server" description="Runs a smoke test on the packaged build">
+		<path id="smoke.test.bundles">
+			<pathelement location="${jetty-server.basedir}/org.eclipse.virgo.jetty.smoketest" />
+		</path>
+		<antcall target="test.pre"/>
+		<all-bundles target="test-package" buildpathRef="smoke.test.bundles">
+			<property name="package.output.file" value="${artifacts.dir}/virgo-jetty-server-${bundle.version}.zip"/>
+			<property name="package.basename" value="virgo-jetty-server-${bundle.version}"/>
+			<property name="test-results.output.dir" value="${test-results.output.dir}"/>
+		</all-bundles>
+		<antcall target="test.post"/>
+	</target>
+
+</project>
diff --git a/packaging/jetty-server/build.gradle b/packaging/jetty-server/build.gradle
new file mode 100644
index 0000000..e9541a6
--- /dev/null
+++ b/packaging/jetty-server/build.gradle
@@ -0,0 +1,75 @@
+import org.apache.tools.ant.filters.ReplaceTokens
+
+import static virgobuild.VirgoToolsPlugin.installProduct
+import static virgobuild.VirgoToolsPlugin.publishProduct
+
+apply plugin: 'distribution'
+
+distributions {
+    main {
+        baseName = 'virgo-jetty-server'
+        contents {
+            exclude ( '**/placeholder' )
+            from ( 'src/main/filtered' ) {
+                include ( '**/*.properties' )
+                include ( '**/.version' )
+                filter(ReplaceTokens, tokens: tokenMap) // tokens are used in e.g. oev.kernel.userregion.properties
+            }
+            from ( 'src/main/filtered' ) {
+                include ( 'bin/*.sh' )
+                fileMode 0755
+            }
+            from ( 'src/main/filtered' ) {
+                include ( '**/*.libd' )
+                filter(ReplaceTokens, tokens: tokenMap)
+            }
+            from ( "${buildDir}/VJS/jetty-server/" ) { exclude ( 'Eclipse.app' ) }
+            from ( "${buildDir}/common_resources/" )
+        }
+    }
+}
+
+task ('assembleJettyServer', dependsOn: [
+    'installProductJettyServer',
+    'packageResourcesAndProducts'
+]) {
+    installDist.dependsOn(['assembleJettyServer'])
+    distZip.dependsOn(['assembleJettyServer'])
+}
+
+task ('packageResourcesAndProducts') {
+    doLast {
+        packageConfiguration('lib', configurations.nanoLib, file("${buildDir}/common_resources/lib/"))
+        packageConfiguration('libPersistence', configurations.nanoLibPersistence, file("${buildDir}/common_resources/lib/persistence/"))
+        packageConfiguration('libEndorsed', configurations.nanoLibEndorsed, file("${buildDir}/common_resources/lib/endorsed/"))
+        packageConfiguration('pluginsExtras', configurations.kernelPluginsExtras, file("${buildDir}/common_resources/plugins/"))
+        packageConfiguration('repositoryExt', configurations.repositoryExt, file("${buildDir}/common_resources/repository/ext/"))
+        packageConfiguration('pickup', configurations.nanoPickup, file("${buildDir}/common_resources/pickup/"))
+    }
+}
+
+task ('publishJettyServer', dependsOn: [
+    ':org.eclipse.virgo.site:publishBase',
+    ':org.eclipse.virgo.site:publishKernelBase',
+]) {
+    description = "Publishes a product to a p2 repository. The publishing uses ANY environment configurations."
+
+    def product = 'jetty-server'
+    def productFileLocation = file("${projectDir}/publish_resources/products/${product}/${product}.product")
+    def javaProfileLocation = file("${projectDir}/src/main/dist/configuration/java-server.profile")
+
+    doLast() { publishProduct(project, productFileLocation, javaProfileLocation) }
+}
+
+task ('installProductJettyServer', dependsOn: [
+    'publishJettyServer',
+]) {
+    description = "Installs a Virgo product to a desired destination. Default profile(roaming) is VIRGOProfile, the environment cofigurations are ANY."
+
+    def product = 'jetty-server'
+    def shortProduct = 'VJS'
+    def destinationDir = file("${buildDir}/${shortProduct}/${product}")
+    def productIu = "${product}.product"
+
+    doLast() { installProduct(project, productIu, destinationDir) }
+}
diff --git a/packaging/jetty-server/docs-ivy.xml b/packaging/jetty-server/docs-ivy.xml
new file mode 100644
index 0000000..2dc986a
--- /dev/null
+++ b/packaging/jetty-server/docs-ivy.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="http://ivyrep.jayasoft.org/ivy-doc.xsl"?>
+<ivy-module xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://incubator.apache.org/ivy/schemas/ivy.xsd" version="1.3">
+	
+	<info organisation="${project.organisation}" module="${ant.project.name}" />
+	
+	<configurations>
+		<include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>	
+		<conf name="docs" visibility="public" description="Documentation"/>
+	</configurations>
+	
+	<dependencies>
+		<dependency org="org.eclipse.virgo.documentation" name="virgo-programmer-guide" rev="${org.eclipse.virgo.documentation}" conf="docs->*"/>
+		<dependency org="org.eclipse.virgo.documentation" name="virgo-user-guide" rev="${org.eclipse.virgo.documentation}" conf="docs->*"/>
+	</dependencies>
+
+</ivy-module>
+
diff --git a/packaging/jetty-server/org.eclipse.virgo.jetty.smoketest/.gitignore b/packaging/jetty-server/org.eclipse.virgo.jetty.smoketest/.gitignore
new file mode 100644
index 0000000..fe99505
--- /dev/null
+++ b/packaging/jetty-server/org.eclipse.virgo.jetty.smoketest/.gitignore
@@ -0,0 +1,2 @@
+bin
+
diff --git a/packaging/jetty-server/org.eclipse.virgo.jetty.smoketest/build.xml b/packaging/jetty-server/org.eclipse.virgo.jetty.smoketest/build.xml
new file mode 100644
index 0000000..768ea15
--- /dev/null
+++ b/packaging/jetty-server/org.eclipse.virgo.jetty.smoketest/build.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="org.eclipse.virgo.jetty.smoketest">
+
+	<property file="${basedir}/../../../build.properties"/>
+	<property file="${basedir}/../../../build.versions"/>
+	<property file="${basedir}/../../../build/virgo.properties" />
+	<import file="${basedir}/../../../virgo-build/standard/default.xml"/>
+	<import file="${basedir}/../test-package.xml"/>
+
+	<property name="apps.dir" value="${basedir}/apps"/>
+	
+	<target name="startup.pre">
+		<copy todir="${pickup.dir}">
+			<fileset dir="${apps.dir}"/>
+		</copy>
+	</target>
+
+	<target name="shutdown.post">
+		<echo message="Testing warm restart"/>
+		<sleep seconds="120"/> <!-- bug 364734: avoid previous instance overlapping with the new -->
+		<antcall target="startup"/>
+		<antcall target="test.do"/>
+		<antcall target="shutdown"/>
+        <sleep seconds="30"/>
+		<delete quiet="true">
+			<fileset dir="${pickup.dir}">
+				<exclude name="*admin*"/>
+				<exclude name="*splash*"/>
+			</fileset>
+		</delete>
+	</target>
+
+</project>
diff --git a/packaging/jetty-server/org.eclipse.virgo.jetty.smoketest/ivy.xml b/packaging/jetty-server/org.eclipse.virgo.jetty.smoketest/ivy.xml
new file mode 100644
index 0000000..eaedfdb
--- /dev/null
+++ b/packaging/jetty-server/org.eclipse.virgo.jetty.smoketest/ivy.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="http://ivyrep.jayasoft.org/ivy-doc.xsl"?>
+<ivy-module
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:noNamespaceSchemaLocation="http://incubator.apache.org/ivy/schemas/ivy.xsd"
+		version="1.3">
+
+	<info organisation="${project.organisation}" module="${ant.project.name}"/>
+
+	<configurations>
+		<include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>
+	</configurations>
+
+	<publications>
+		<artifact name="${ant.project.name}"/>
+		<artifact name="${ant.project.name}-sources" type="src" ext="jar"/>
+	</publications>
+
+	<dependencies>
+		<dependency org="org.junit" name="com.springsource.org.junit" rev="${org.junit}" conf="test->runtime"/>
+		<dependency org="org.apache.commons" name="com.springsource.org.apache.commons.httpclient" rev="${org.apache.commons.httpclient}" conf="test->runtime"/>
+	</dependencies>
+
+</ivy-module>
diff --git a/packaging/jetty-server/org.eclipse.virgo.jetty.smoketest/src/smokeTest/java/org/eclipse/virgo/jetty/smoketest/JettyServerSmokeTests.java b/packaging/jetty-server/org.eclipse.virgo.jetty.smoketest/src/smokeTest/java/org/eclipse/virgo/jetty/smoketest/JettyServerSmokeTests.java
new file mode 100644
index 0000000..15b06ee
--- /dev/null
+++ b/packaging/jetty-server/org.eclipse.virgo.jetty.smoketest/src/smokeTest/java/org/eclipse/virgo/jetty/smoketest/JettyServerSmokeTests.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.jetty.smoketest;
+
+import static org.apache.http.HttpStatus.SC_OK;
+import static org.eclipse.virgo.test.tools.UrlWaitLatch.waitFor;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.nullValue;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeThat;
+
+import org.eclipse.virgo.test.tools.AbstractSmokeTests;
+import org.eclipse.virgo.test.tools.JmxUtils;
+import org.eclipse.virgo.test.tools.ServerUtils;
+import org.eclipse.virgo.test.tools.UrlWaitLatch;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class JettyServerSmokeTests extends AbstractSmokeTests {
+
+    private static final String OEV_JETTY_SAMPLE_TAGS_JAR = "org.eclipse.virgo.jetty.sample.tags.jar";
+
+    private static final String VIRGO_FLAVOR = "jetty-server";
+
+    @Override
+    protected String getVirgoFlavor() {
+        return VIRGO_FLAVOR;
+    }
+
+    @BeforeClass
+    public static void initJmxConnection() {
+        JmxUtils.virgoHome = ServerUtils.getHome(VIRGO_FLAVOR);
+    }
+
+    @Test
+    public void jettyServerShouldBeStarted() throws Exception {
+        assertTrue(JmxUtils.isKernelStarted());
+    }
+
+    @Test
+    public void splashScreenShouldBeAccessable() throws Exception {
+        assertEquals(SC_OK, waitFor("http://localhost:8080/"));
+    }
+
+    @Test
+    public void adminScreenShouldBeAccessableWithDefaultCredentials() {
+        assertEquals(SC_OK, waitFor("http://localhost:8080/admin/content", "admin", "admin"));
+    }
+
+    @Test
+    public void tagLibsScreenShouldBeAccessable() throws Exception {
+        // TODO - check why this test fails on Virgo HIPP - this test doesn't run offline either. Could be a proxy issue...
+        assumeThat(System.getProperty("eclipse.build"), is(nullValue()));
+
+        deployTestBundles(VIRGO_FLAVOR, OEV_JETTY_SAMPLE_TAGS_JAR);
+
+        UrlWaitLatch.waitFor("http://localhost:8080/taglibs/app/sample.htm");
+
+        undeployTestBundles(VIRGO_FLAVOR, OEV_JETTY_SAMPLE_TAGS_JAR);
+    }
+
+}
diff --git a/packaging/jetty-server/org.eclipse.virgo.jetty.smoketest/src/smokeTest/resources/bundles/org.eclipse.virgo.jetty.sample.tags.jar b/packaging/jetty-server/org.eclipse.virgo.jetty.smoketest/src/smokeTest/resources/bundles/org.eclipse.virgo.jetty.sample.tags.jar
new file mode 100644
index 0000000..0f2fddc
--- /dev/null
+++ b/packaging/jetty-server/org.eclipse.virgo.jetty.smoketest/src/smokeTest/resources/bundles/org.eclipse.virgo.jetty.sample.tags.jar
Binary files differ
diff --git a/packaging/jetty-server/pickup-ivy.xml b/packaging/jetty-server/pickup-ivy.xml
new file mode 100644
index 0000000..e2fe010
--- /dev/null
+++ b/packaging/jetty-server/pickup-ivy.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="http://ivyrep.jayasoft.org/ivy-doc.xsl"?>
+<ivy-module xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://incubator.apache.org/ivy/schemas/ivy.xsd" version="1.3">
+	
+	<info organisation="${project.organisation}" module="${ant.project.name}" />
+	
+	<configurations>
+		<include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>	
+		<conf name="pickup" visibility="public" description="Dependencies to be packaged in pickup"/>
+		<conf name="pickup-plan" visibility="public" description="Plans to be packaged in pickup, with dependencies to be packaged in repostiory/bundles/ext"/>
+	</configurations>
+	
+	<dependencies>	    
+		<dependency org="org.eclipse.virgo.apps" name="org.eclipse.virgo.apps.splash" rev="${org.eclipse.virgo.apps}" conf="pickup->runtime"/>
+	</dependencies>
+
+</ivy-module>
+
diff --git a/packaging/jetty-server/publish_resources/products/jetty-server/jetty-server.product b/packaging/jetty-server/publish_resources/products/jetty-server/jetty-server.product
new file mode 100755
index 0000000..4281e78
--- /dev/null
+++ b/packaging/jetty-server/publish_resources/products/jetty-server/jetty-server.product
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<?pde version="3.5"?>

+

+<product name="Eclipse Virgo Kernel Product" uid="jetty-server.product" version="1.0.0" useFeatures="true" includeLaunchers="false">

+

+   <configIni use="default">

+   </configIni>

+   

+   <vm>

+   </vm>

+

+   <plugins>

+   </plugins>

+

+   <features>

+   </features>

+

+   <configurations>

+		<plugin id="org.apache.felix.gogo.command" autoStart="true"/>

+		<plugin id="org.apache.felix.gogo.runtime" autoStart="true"/>

+		<plugin id="org.apache.felix.gogo.shell" autoStart="true"/>

+		<plugin id="org.apache.mina.core" autoStart="true"/>

+		<plugin id="org.apache.sshd.core" autoStart="true"/>

+		<plugin id="org.eclipse.equinox.console" autoStart="true"/>

+		<plugin id="org.eclipse.equinox.console.ssh" autoStart="true"/>

+

+		<plugin id="org.eclipse.gemini.blueprint.extender" autoStart="true"/>

+		<plugin id="org.eclipse.gemini.management" autoStart="true"/>

+

+		<plugin id="org.eclipse.virgo.kernel.agent.dm" autoStart="true"/>

+		<plugin id="org.eclipse.virgo.kernel.artifact" autoStart="true"/>

+		<plugin id="org.eclipse.virgo.kernel.deployer" autoStart="true"/>

+		<plugin id="org.eclipse.virgo.kernel.model" autoStart="true"/>

+		<plugin id="org.eclipse.virgo.kernel.osgi" autoStart="true"/>

+		<plugin id="org.eclipse.virgo.kernel.services" autoStart="true"/>

+		<plugin id="org.eclipse.virgo.kernel.userregionfactory" autoStart="true"/>

+

+		<plugin id="org.eclipse.virgo.nano.core" autoStart="true"/>

+		<plugin id="org.eclipse.virgo.nano.management" autoStart="true"/>

+		<plugin id="org.eclipse.virgo.repository" autoStart="true"/>

+		<plugin id="" autoStart="true"/>

+	</configurations>

+

+</product>

diff --git a/packaging/jetty-server/publish_resources/products/jetty-server/p2.inf b/packaging/jetty-server/publish_resources/products/jetty-server/p2.inf
new file mode 100644
index 0000000..4c6f109
--- /dev/null
+++ b/packaging/jetty-server/publish_resources/products/jetty-server/p2.inf
@@ -0,0 +1,18 @@
+###############################################################################
+# Copyright (c) 2011 SAP AG
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# and Apache License v2.0 which accompanies this distribution.
+# The Eclipse Public License is available at
+#   http://www.eclipse.org/legal/epl-v10.html
+# and the Apache License v2.0 is available at
+#   http://www.opensource.org/licenses/apache2.0.php.
+# You may elect to redistribute this code under either of these licenses.
+#
+# Contributors:
+#   Borislav Kapukaranov - initial contribution
+###############################################################################
+requires.0.name = kernel-base.product
+requires.0.namespace = org.eclipse.equinox.p2.iu
+requires.0.range = 0.0.0
diff --git a/packaging/jetty-server/repository-ivy.xml b/packaging/jetty-server/repository-ivy.xml
new file mode 100644
index 0000000..1ec411b
--- /dev/null
+++ b/packaging/jetty-server/repository-ivy.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="http://ivyrep.jayasoft.org/ivy-doc.xsl"?>
+<ivy-module xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://incubator.apache.org/ivy/schemas/ivy.xsd" version="1.3">
+
+	<info organisation="${project.organisation}" module="${ant.project.name}" />
+
+	<configurations>
+		<include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>
+		<conf name="ext" visibility="public" description="Dependencies to be packaged in repository/bundles/ext"/>
+		<conf name="transitive" visibility="public" description="Dependencies to be packaged with their transitive dependencies in repository/ext"/>
+	</configurations>
+
+	<dependencies>
+		<dependency org="org.springframework" name="org.springframework.spring-library" rev="${org.springframework}" conf="ext->runtime"/>
+		<dependency org="org.eclipse.virgo.jetty" name="org.eclipse.virgo.jetty.web" rev="latest.integration" />
+		<dependency org="org.eclipse.virgo.web" name="org.eclipse.virgo.web.dm" rev="${org.eclipse.virgo.web}" conf="ext->runtime"/>
+		
+		<dependency org="org.eclipse.virgo.mirrored" name="javax.ejb" rev="${javax.ejb}" conf="ext->runtime"/>
+		<dependency org="org.eclipse.virgo.mirrored" name="javax.jms" rev="${javax.jms}" conf="ext->runtime"/>
+		<dependency org="javax.portlet" name="com.springsource.javax.portlet" rev="${javax.portlet}" conf="ext->runtime"/>
+		<dependency org="javax.servlet" name="com.springsource.javax.servlet.jsp.jstl" rev="${javax.servlet.jsp.jstl}" conf="ext->runtime"/>
+		<dependency org="org.eclipse.virgo.mirrored" name="javax.xml.rpc" rev="${javax.xml.rpc}" conf="ext->runtime"/>
+		<dependency org="org.aopalliance" name="com.springsource.org.aopalliance" rev="${org.aopalliance}" conf="ext->runtime"/>
+		<dependency org="org.apache.commons" name="com.springsource.org.apache.commons.codec" rev="${org.apache.commons.codec}" conf="ext->runtime"/>
+		<dependency org="org.apache.commons" name="com.springsource.org.apache.commons.fileupload" rev="${org.apache.commons.fileupload}" conf="ext->runtime"/>
+		<dependency org="org.apache.commons" name="com.springsource.org.apache.commons.httpclient" rev="${org.apache.commons.httpclient}" conf="ext->runtime"/>
+		<dependency org="org.apache.commons" name="com.springsource.org.apache.commons.io" rev="${org.apache.commons.io}" conf="ext->runtime"/>
+		
+		<dependency org="org.eclipse.virgo.mirrored" name="com.springsource.org.aspectj.weaver" rev="${org.aspectj}" conf="ext->runtime"/>
+		<dependency org="org.eclipse.virgo.mirrored" name="org.eclipse.equinox.event" rev="${org.eclipse.equinox.event}" conf="ext->compile"/>
+		<dependency org="org.eclipse.virgo.mirrored" name="org.eclipse.osgi.services" rev="${org.eclipse.osgi.services}" conf="ext->compile"/>
+		<dependency org="org.eclipse.virgo.mirrored" name="org.slf4j.api" rev="${org.slf4j.api}" conf="ext->runtime"/>
+		<dependency org="org.eclipse.virgo.mirrored" name="org.slf4j.jcl" rev="${org.slf4j.jcl}" conf="ext->runtime"/>
+		<dependency org="org.eclipse.virgo.mirrored" name="org.slf4j.log4j" rev="${org.slf4j.log4j}" conf="ext->runtime"/>	
+		<dependency org="org.eclipse.virgo.mirrored" name="org.slf4j.jul" rev="${org.slf4j.jul}" conf="ext->runtime"/>
+		<dependency org="org.springframework" name="org.springframework.aop" rev="${org.springframework}" conf="ext->runtime"/>
+		<dependency org="org.springframework" name="org.springframework.asm" rev="${org.springframework}" conf="ext->runtime"/>		
+		<dependency org="org.springframework" name="org.springframework.aspects" rev="${org.springframework}" conf="ext->runtime"/>
+		<dependency org="org.springframework" name="org.springframework.beans" rev="${org.springframework}" conf="ext->runtime"/>
+		<dependency org="org.springframework" name="org.springframework.context" rev="${org.springframework}" conf="ext->runtime"/>
+		<dependency org="org.springframework" name="org.springframework.context.support" rev="${org.springframework}" conf="ext->runtime"/>
+		<dependency org="org.springframework" name="org.springframework.core" rev="${org.springframework}" conf="ext->runtime"/>
+		<dependency org="org.springframework" name="org.springframework.expression" rev="${org.springframework}" conf="ext->runtime"/>
+		<dependency org="org.springframework" name="org.springframework.jdbc" rev="${org.springframework}" conf="ext->runtime"/>
+		<dependency org="org.springframework" name="org.springframework.jms" rev="${org.springframework}" conf="ext->runtime"/>
+		<dependency org="org.springframework" name="org.springframework.orm" rev="${org.springframework}" conf="ext->runtime"/>
+		<dependency org="org.springframework" name="org.springframework.oxm" rev="${org.springframework}" conf="ext->runtime"/>
+		<dependency org="org.springframework" name="org.springframework.transaction" rev="${org.springframework}" conf="ext->runtime"/>
+		<dependency org="org.springframework" name="org.springframework.web" rev="${org.springframework}" conf="ext->runtime"/>
+		<dependency org="org.springframework" name="org.springframework.web.portlet" rev="${org.springframework}" conf="ext->runtime"/>
+		<dependency org="org.springframework" name="org.springframework.web.servlet" rev="${org.springframework}" conf="ext->runtime"/>
+		<dependency org="org.eclipse.gemini" name="org.eclipse.gemini.blueprint.core" rev="${org.eclipse.gemini.blueprint}" conf="ext->runtime"/>
+		<dependency org="org.eclipse.gemini" name="org.eclipse.gemini.blueprint.extender" rev="${org.eclipse.gemini.blueprint}" conf="ext->runtime"/>
+		<dependency org="org.eclipse.gemini" name="org.eclipse.gemini.blueprint.io" rev="${org.eclipse.gemini.blueprint}" conf="ext->runtime"/>
+		
+		<exclude org="org.aspectj" module="com.springsource.org.aspectj.runtime"/>
+		<exclude org="org.apache.commons" module="com.springsource.org.apache.commons.logging"/>
+		<exclude org="javax.servlet" module="javax.servlet" />
+        <exclude org="javax.jms" module="com.springsource.javax.jms" />
+		<exclude org="org.eclipse.osgi" module="org.eclipse.osgi"/>
+        <exclude org="org.eclipse.virgo.mirrored" module="org.eclipse.osgi"/>
+		<exclude org="org.eclipse.virgo.util"/>
+		<exclude org="javax.xml.ws"/>
+		
+		<override org="org.springframework" rev="${org.springframework}"/>
+	</dependencies>
+
+</ivy-module>
+
diff --git a/packaging/jetty-server/src/main/dist/About.html b/packaging/jetty-server/src/main/dist/About.html
new file mode 100644
index 0000000..231c60d
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/About.html
@@ -0,0 +1,104 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<!-- saved from url=(0047)http://www.eclipse.org/legal/epl/longabout.html -->
+<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+
+<TITLE>About</TITLE>
+</HEAD><BODY lang="EN-US">
+<H2>About This Content</H2>
+ 
+<P>3 August 2011</P>	
+<H3>License</H3>
+
+<P>The Eclipse Foundation makes available all content in this plug-in ("Content").  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL").  A copy of the EPL is available 
+at <A href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</A>.
+For purposes of the EPL, "Program" will mean the Content.</P>
+
+<P>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <A href="http://www.eclipse.org/">http://www.eclipse.org</A>.</P>
+
+		
+		<H3>Third Party Content</H3>
+		<P>The Content includes items that have been sourced from third parties as set out below. If you 
+		did not receive this Content directly from the Eclipse Foundation, the following is provided 
+		for informational purposes only, and you should look to the Redistributor's license for 
+		terms and conditions of use.</P>
+		
+		<h4>Kernel Third Party Content</h4>
+		<p>This is listed in the <a href="AboutKernel.html">Kernel's About file</a>.
+		
+		<h4>
+			<a href="about_files/apache-v20.txt">Apache License 2.0</a>
+		</h4>
+		This product contains software developed by the Apache Software Foundation (<a href="http://www.apache.org">http://www.apache.org</a>).
+		<ul>
+		</ul>
+		<h4>
+			<a href="about_files/asm.txt">ASM License</a>
+		</h4>
+		<ul>
+			<li>
+				ASM 3.1.0 - binary and source is available from the <a href="http://asm.ow2.org/">ASM project</a>
+			</li>
+		</ul>
+
+		<h4>
+			<a href="about_files/cddl-10.txt">Common Development and Distribution License 1.0</a>
+		</h4>
+		<ul>
+			<li>
+				javax.activation 1.1.0 - <a href="http://www.springsource.com/repository/app/bundle/version/download?name=com.springsource.javax.activation&version=1.1.0&type=binary">binary</a> and <a href="http://www.springsource.com/repository/app/bundle/version/download?name=com.springsource.javax.activation&version=1.1.0&type=source">source</a> is available from the SpringSource <a href="http://www.springsource.com/repository/app/">Enterprise Bundle Repository</a>
+			</li>
+			<li>
+				javax.ejb 3.1.1 - binary and source available from the <a href="http://glassfish.java.net/">Glassfish project</a> (Dual-licensed CDDL 1.0 or GPL 2. Virgo elects to use CDDL 1.0.)
+			</li>
+			<li>
+				javax.el 2.2.0 - binary and source available from the <a href="http://glassfish.java.net/">Glassfish project</a> (Dual-licensed CDDL 1.0 or GPL 2. Virgo elects to use CDDL 1.0.)
+			</li>
+			<li>
+				javax.jms 1.1.0 - binary and source available from the <a href="http://glassfish.java.net/">Glassfish project</a> (Dual-licensed CDDL 1.0 or GPL 2. Virgo elects to use CDDL 1.0.)
+			</li>
+			<li>
+				javax.mail.glassfish 1.4.1 - binary and source are available from the <a href="http://glassfish.java.net/">GlassFish project</a>
+			</li>
+			<li>
+				<!-- Note that the EBR states this JAR has an Apache license, but CQ 3940 says it has a CDDL license, so we assume the CQ is correct. -->
+				javax.portlet 2.0.0 - <a href="http://www.springsource.com/repository/app/bundle/version/download?name=com.springsource.javax.portlet&version=2.0.0&type=binary">binary</a> and <a href="http://www.springsource.com/repository/app/bundle/version/download?name=com.springsource.javax.portlet&version=2.0.0&type=source">source</a> is available from the SpringSource <a href="http://www.springsource.com/repository/app/">Enterprise Bundle Repository</a>
+			</li>
+			<li>
+				<!-- Refer to CQ 5019/4710 -->
+				javax.servlet.jsp 2.2.0 - binary and source available from the <a href="http://glassfish.java.net/">Glassfish project</a> (Dual-licensed CDDL 1.0 or GPL 2. Virgo elects to use CDDL 1.0.)
+			</li>
+			<li>
+				javax.servlet.jsp.jstl 1.2.0 - <a href="http://ebr.springsource.com/repository/app/bundle/version/download?name=com.springsource.javax.servlet.jsp.jstl&version=1.2.0.v20110517&type=binary">binary</a> and <a href="http://ebr.springsource.com/repository/app/bundle/version/download?name=com.springsource.javax.servlet.jsp.jstl&version=1.2.0.v20110517&type=source">source</a> is available from the SpringSource <a href="http://www.springsource.com/repository/app/">Enterprise Bundle Repository</a> (Dual-licensed CDDL or Apache License 2.0. Virgo elects to use CDDL.)
+			</li>
+			<li>
+				javax.xml.rpc 1.1.0 - <a href="http://www.springsource.com/repository/app/bundle/version/download?name=com.springsource.javax.xml.rpc&version=1.1.0&type=binary">binary</a> and <a href="http://www.springsource.com/repository/app/bundle/version/download?name=com.springsource.javax.xml.rpc&version=1.1.0&type=source">source</a> is available from the SpringSource <a href="http://www.springsource.com/repository/app/">Enterprise Bundle Repository</a>
+			</li>
+			<li>
+				com.sun.el 2.2.0 - binary and source are available from the <a href="http://jsp.java.net/">GlassFish JavaServer Pages project</a>
+			</li>
+			<li>
+				org.apache.jasper.glassfish 2.2.2 - binary and source are available from the <a href="http://jsp.java.net/">GlassFish JavaServer Pages project</a>
+			</li>
+			<li>
+				org.apache.taglibs.standard.glassfish 1.2.0 - binary and source are available from the <a href="http://jsp.java.net/">GlassFish JavaServer Pages project</a>
+			</li>
+		</ul>
+		<h4>
+			<a href="about_files/LICENSE-asm.html">New BSD License</a>
+		</h4>
+		<ul>
+			<li>
+				org.objectweb.asm 3.1.0 - binary and source are available from the
+				<a href="http://asm.objectweb.org/">ASM project</a>
+			</li>
+		</ul>
+
+
+</BODY></HTML>
\ No newline at end of file
diff --git a/packaging/jetty-server/src/main/dist/AboutKernel.html b/packaging/jetty-server/src/main/dist/AboutKernel.html
new file mode 100644
index 0000000..6bc942a
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/AboutKernel.html
@@ -0,0 +1,70 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<!-- saved from url=(0047)http://www.eclipse.org/legal/epl/longabout.html -->
+<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+
+<TITLE>About</TITLE>
+</HEAD><BODY lang="EN-US">
+<H2>About This Content</H2>
+ 
+<P>13 December 2012</P>	
+<H3>License</H3>
+
+<P>The Eclipse Foundation makes available all content in this plug-in ("Content").  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL").  A copy of the EPL is available 
+at <A href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</A>.
+For purposes of the EPL, "Program" will mean the Content.</P>
+
+<P>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <A href="http://www.eclipse.org/">http://www.eclipse.org</A>.</P>
+
+		
+		<H3>Third Party Content</H3>
+		<P>The Content includes items that have been sourced from third parties as set out below. If you 
+		did not receive this Content directly from the Eclipse Foundation, the following is provided 
+		for informational purposes only, and you should look to the Redistributor's license for 
+		terms and conditions of use.</P>
+
+		<h4>Nano Third Party Content</h4>
+		<p>This is listed in <a href="AboutNano.html">Nano's About file</a>.
+
+		
+		<h4>
+			<a href="about_files/apache-v20.txt">Apache License 2.0</a>
+		</h4>
+		This product contains software developed by the Apache Software Foundation (<a href="http://www.apache.org">http://www.apache.org</a>).
+		<ul>
+			<li>
+				Apache Commons Codec 1.3.0 - binary and source is available from the <a href="http://commons.apache.org/codec/">Apache Commons Codec project</a>
+			</li>
+			<li>
+				Apache HttpClient 3.1.0 - binary and source is available from the <a href="http://hc.apache.org/httpclient-3.x/">Apache HttpClient project</a>
+			</li>
+			<li>
+				Spring Framework 3.1.0.RELEASE - binary and source is available from the
+				<a href="http://www.springsource.com/download/community">Spring Framework project</a>
+			</li>
+		</ul>
+		<h4>
+			<a href="about_files/asm.txt">ASM License</a>
+		</h4>
+		<ul>
+			<li>
+				ASM 2.2.3 - binary and source is available from the <a href="http://asm.ow2.org/">ASM project</a>
+			</li>
+		</ul>
+		<h4>
+			<a href="http://en.wikipedia.org/wiki/Public_domain">Public Domain</a>
+		</h4>
+		<ul>
+			<li>
+				AOP Alliance 1.0.0 - binary and source is available from the
+				<a href="http://aopalliance.sourceforge.net/">AOP Alliance project</a>
+			</li>
+		</ul>
+
+</BODY></HTML>
\ No newline at end of file
diff --git a/packaging/jetty-server/src/main/dist/AboutNano.html b/packaging/jetty-server/src/main/dist/AboutNano.html
new file mode 100644
index 0000000..f1edaee
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/AboutNano.html
@@ -0,0 +1,99 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<!-- saved from url=(0047)http://www.eclipse.org/legal/epl/longabout.html -->
+<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+
+<TITLE>About</TITLE>
+</HEAD><BODY lang="EN-US">
+<H2>About This Content</H2>
+ 
+<P>13 December 2012</P>	
+<H3>License</H3>
+
+<P>The Eclipse Foundation makes available all content in this plug-in ("Content").  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL").  A copy of the EPL is available 
+at <A href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</A>.
+For purposes of the EPL, "Program" will mean the Content.</P>
+
+<P>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <A href="http://www.eclipse.org/">http://www.eclipse.org</A>.</P>
+
+		
+		<H3>Third Party Content</H3>
+		<P>The Content includes items that have been sourced from third parties as set out below. If you 
+		did not receive this Content directly from the Eclipse Foundation, the following is provided 
+		for informational purposes only, and you should look to the Redistributor's license for 
+		terms and conditions of use.</P>
+		
+		<h4>
+			<a href="about_files/apache-v20.txt">Apache License 2.0</a>
+		</h4>
+		This product contains software developed by the Apache Software Foundation (<a href="http://www.apache.org">http://www.apache.org</a>).
+		<ul>
+			<li>
+				Apache Commons FileUpload 1.2.0 - binary and source are available from the <a href="http://commons.apache.org/fileupload/">Apache Commons FileUpload project</a>
+			</li>
+			<li>
+				Apache Commons IO 1.4.0 - binary and source are available from the <a href="http://commons.apache.org/io/">Apache Commons IO project</a>
+			</li>
+			<li>
+				Apache Felix Gogo 0.10.0 - binary and source is available from the <a href="http://felix.apache.org">Apache Felix project</a>
+			</li>
+			<li>
+				Apache MINA Core 2.0.2 - binary and source is available from the <a href="http://mina.apache.org/">Apache MINA project</a>
+			</li>
+			<li>
+				Apache MINA SSHD Core 0.5.0 - binary and source is available from the <a href="http://mina.apache.org/">Apache MINA project</a>
+			</li>
+			<li>
+				javax.transaction 1.1.1 - binary and source are available from the <a href="http://geronimo.apache.org/">Apache Geronimo project</a>
+			</li>
+			<li>
+				Jolokia OSGi 1.0.2 - binary and source are available from the <a href="http://www.jolokia.org/">Jolokia project</a>
+			</li>
+			<li>
+				OSGi Enterprise 4.2 - binary and source are available from the <a href="https://www.osgi.org/members/Release42/HomePage">OSGi Alliance</a>
+			</li>
+		</ul>
+		<h4>
+			<a href="about_files/LICENSE-AspectJ.html">AspectJ License</a>
+		</h4>
+		<ul>
+			<li>
+				AspectJ Weaver 1.6.12 - binary and source is available from the <a href="http://eclipse.org/aspectj">AspectJ project</a>
+			</li>
+		</ul>
+		<h4>
+			<a href="about_files/cddl-10.txt">Common Development and Distribution License 1.0</a>
+		</h4>
+		<ul>
+			<li>
+				javax.annotation 1.1.0 - binary and source is available from the
+				<a href="http://glassfish.java.net/">GlassFish Project</a> (Dual-licensed CDDL 1.0 or GPL 2. Virgo elects to use CDDL 1.0.)
+			</li>
+		</ul>
+
+		<h4>
+			<a href="epl-v10.html">Eclipse Public License 1.0</a>
+		</h4>
+		<ul>
+			<li>
+				Logback 1.0.7 - binary and source is available from the
+				<a href="http://logback.qos.ch/">Logback project</a> (Dual-licensed EPL or LGPL. Virgo elects to use EPL.)
+			</li>
+		</ul>
+		<h4>
+			<a href="about_files/slf4j.txt">SLF4J License</a>
+		</h4>
+		<ul>
+			<li>
+				Simple Logging Facade for Java (SLF4J) 1.7.2 - binary and source is available from the
+				<a href="http://www.slf4j.org/">SLF4J Project</a>
+			</li>
+		</ul>
+
+</BODY></HTML>
\ No newline at end of file
diff --git a/packaging/jetty-server/src/main/dist/about_files/LICENSE-AspectJ.html b/packaging/jetty-server/src/main/dist/about_files/LICENSE-AspectJ.html
new file mode 100644
index 0000000..8f7d0a4
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/about_files/LICENSE-AspectJ.html
@@ -0,0 +1,91 @@
+<html>
+
+<head>
+<title>AspectJ License</title>
+
+
+</head>
+
+<BODY BGCOLOR="white">
+
+<h2 align="center"><b>AspectJ<sup><small>TM</small></sup>
+                      Compiler and Core Tools License</b></h2>
+
+<p>This is a binary-only release.&nbsp; Source code
+is available from
+<a href="http://eclipse.org/aspectj">http://eclipse.org/aspectj</a></p>
+
+<p>The Eclipse Foundation makes available all content in this distribution ("Content").  
+		Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
+		Eclipse Public License Version 1.0 ("EPL").  A copy of the EPL is available 
+		at <a href="../../org/documents/epl-v10.php">http://www.eclipse.org/legal/epl-v10.html</a>.
+		For purposes of the EPL, "Program" will mean the Content.</p>
+
+		<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+		being redistributed by another party ("Redistributor") and different terms and conditions may
+		apply to your use of any object code in the Content.  Check the Redistributor's license 
+		that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+		indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+		and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+		
+		<h3>Third Party Content</h3>
+		<p>The Content includes items that have been sourced from third parties as set out below. If you 
+		did not receive this Content directly from the Eclipse Foundation, the following is provided 
+		for informational purposes only, and you should look to the Redistributor?s license for 
+		terms and conditions of use.</p>
+		<em>
+
+		<h4>BCEL v5.1</h4>
+		<p>This product contains software developed by the
+         Apache Software Foundation (<a href="http://www.apache.org/">http://www.apache.org</a>).</p>
+ 
+		<p>AspectJ includes a modified version of the Apache Jakarta Byte Code Engineering Library (BCEL) v5.1.
+		BCEL is available at <a href="http://jakarta.apache.org/bcel/">http://jakarta.apache.org/bcel/</a>. Source
+		code for the modified version of BCEL is available at Eclipse.org in the AspectJ source tree. This code
+		is made available under the Apache Software License v1.1</p>
+		
+		<h4>ASM v2.2.1</h4> 
+		<p>AspectJ includes a binary version of ASM v2.2.1 (<a href="http://asm.objectweb.org/index.html">http://asm.objectweb.org/</a>)
+		The source code for ASM is available from the ObjectWeb download site at 
+		<a href="http://asm.objectweb.org/download/">http://asm.objectweb.org/download/</a>. 
+		<p>The ASM license is available at <a href="http://asm.objectweb.org/license.html">http://asm.objectweb.org/license.html</a>. 
+		The license is also reproduced here:
+		</p>
+
+<pre>Copyright (c) 2000-2005 INRIA, France Telecom
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holders nor the names of its
+   contributors may be used to endorse or promote products derived from
+   this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGE.
+</pre>
+
+</em>
+
+</body>
+
+</html>
diff --git a/packaging/jetty-server/src/main/dist/about_files/apache-v20.txt b/packaging/jetty-server/src/main/dist/about_files/apache-v20.txt
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/about_files/apache-v20.txt
@@ -0,0 +1,202 @@
+
+                                 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/packaging/jetty-server/src/main/dist/about_files/asm.txt b/packaging/jetty-server/src/main/dist/about_files/asm.txt
new file mode 100644
index 0000000..c5aba7b
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/about_files/asm.txt
@@ -0,0 +1,29 @@
+Copyright (c) 2000-2011 INRIA, France Telecom
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holders nor the names of its
+   contributors may be used to endorse or promote products derived from
+   this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/packaging/jetty-server/src/main/dist/about_files/cddl-10.txt b/packaging/jetty-server/src/main/dist/about_files/cddl-10.txt
new file mode 100644
index 0000000..9709055
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/about_files/cddl-10.txt
@@ -0,0 +1,380 @@
+COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0
+
+1. Definitions.
+
+1.1. "Contributor" means each individual or entity that
+creates or contributes to the creation of Modifications.
+
+1.2. "Contributor Version" means the combination of the
+Original Software, prior Modifications used by a
+Contributor (if any), and the Modifications made by that
+particular Contributor.
+
+1.3. "Covered Software" means (a) the Original Software, or
+(b) Modifications, or (c) the combination of files
+containing Original Software with files containing
+Modifications, in each case including portions thereof.
+
+1.4. "Executable" means the Covered Software in any form
+other than Source Code.
+
+1.5. "Initial Developer" means the individual or entity
+that first makes Original Software available under this
+License.
+
+1.6. "Larger Work" means a work which combines Covered
+Software or portions thereof with code not governed by the
+terms of this License.
+
+1.7. "License" means this document.
+
+1.8. "Licensable" means having the right to grant, to the
+maximum extent possible, whether at the time of the initial
+grant or subsequently acquired, any and all of the rights
+conveyed herein.
+
+1.9. "Modifications" means the Source Code and Executable
+form of any of the following:
+
+A. Any file that results from an addition to,
+deletion from or modification of the contents of a
+file containing Original Software or previous
+Modifications;
+
+B. Any new file that contains any part of the
+Original Software or previous Modification; or
+
+C. Any new file that is contributed or otherwise made
+available under the terms of this License.
+
+1.10. "Original Software" means the Source Code and
+Executable form of computer software code that is
+originally released under this License.
+
+1.11. "Patent Claims" means any patent claim(s), now owned
+or hereafter acquired, including without limitation,
+method, process, and apparatus claims, in any patent
+Licensable by grantor.
+
+1.12. "Source Code" means (a) the common form of computer
+software code in which modifications are made and (b)
+associated documentation included in or with such code.
+
+1.13. "You" (or "Your") means an individual or a legal
+entity exercising rights under, and complying with all of
+the terms of, this License. For legal entities, "You"
+includes any entity which controls, is controlled by, or is
+under common control with You. For purposes of this
+definition, "control" means (a) the power, direct or
+indirect, to cause the direction or management of such
+entity, whether by contract or otherwise, or (b) ownership
+of more than fifty percent (50%) of the outstanding shares
+or beneficial ownership of such entity.
+
+2. License Grants.
+
+2.1. The Initial Developer Grant.
+
+Conditioned upon Your compliance with Section 3.1 below and
+subject to third party intellectual property claims, the
+Initial Developer hereby grants You a world-wide,
+royalty-free, non-exclusive license:
+
+(a) under intellectual property rights (other than
+patent or trademark) Licensable by Initial Developer,
+to use, reproduce, modify, display, perform,
+sublicense and distribute the Original Software (or
+portions thereof), with or without Modifications,
+and/or as part of a Larger Work; and
+
+(b) under Patent Claims infringed by the making,
+using or selling of Original Software, to make, have
+made, use, practice, sell, and offer for sale, and/or
+otherwise dispose of the Original Software (or
+portions thereof).
+
+(c) The licenses granted in Sections 2.1(a) and (b)
+are effective on the date Initial Developer first
+distributes or otherwise makes the Original Software
+available to a third party under the terms of this
+License.
+
+(d) Notwithstanding Section 2.1(b) above, no patent
+license is granted: (1) for code that You delete from
+the Original Software, or (2) for infringements
+caused by: (i) the modification of the Original
+Software, or (ii) the combination of the Original
+Software with other software or devices.
+
+2.2. Contributor Grant.
+
+Conditioned upon Your compliance with Section 3.1 below and
+subject to third party intellectual property claims, each
+Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than
+patent or trademark) Licensable by Contributor to
+use, reproduce, modify, display, perform, sublicense
+and distribute the Modifications created by such
+Contributor (or portions thereof), either on an
+unmodified basis, with other Modifications, as
+Covered Software and/or as part of a Larger Work; and
+
+(b) under Patent Claims infringed by the making,
+using, or selling of Modifications made by that
+Contributor either alone and/or in combination with
+its Contributor Version (or portions of such
+combination), to make, use, sell, offer for sale,
+have made, and/or otherwise dispose of: (1)
+Modifications made by that Contributor (or portions
+thereof); and (2) the combination of Modifications
+made by that Contributor with its Contributor Version
+(or portions of such combination).
+
+(c) The licenses granted in Sections 2.2(a) and
+2.2(b) are effective on the date Contributor first
+distributes or otherwise makes the Modifications
+available to a third party.
+
+(d) Notwithstanding Section 2.2(b) above, no patent
+license is granted: (1) for any code that Contributor
+has deleted from the Contributor Version; (2) for
+infringements caused by: (i) third party
+modifications of Contributor Version, or (ii) the
+combination of Modifications made by that Contributor
+with other software (except as part of the
+Contributor Version) or other devices; or (3) under
+Patent Claims infringed by Covered Software in the
+absence of Modifications made by that Contributor.
+
+3. Distribution Obligations.
+
+3.1. Availability of Source Code.
+
+Any Covered Software that You distribute or otherwise make
+available in Executable form must also be made available in
+Source Code form and that Source Code form must be
+distributed only under the terms of this License. You must
+include a copy of this License with every copy of the
+Source Code form of the Covered Software You distribute or
+otherwise make available. You must inform recipients of any
+such Covered Software in Executable form as to how they can
+obtain such Covered Software in Source Code form in a
+reasonable manner on or through a medium customarily used
+for software exchange.
+
+3.2. Modifications.
+
+The Modifications that You create or to which You
+contribute are governed by the terms of this License. You
+represent that You believe Your Modifications are Your
+original creation(s) and/or You have sufficient rights to
+grant the rights conveyed by this License.
+
+3.3. Required Notices.
+
+You must include a notice in each of Your Modifications
+that identifies You as the Contributor of the Modification.
+You may not remove or alter any copyright, patent or
+trademark notices contained within the Covered Software, or
+any notices of licensing or any descriptive text giving
+attribution to any Contributor or the Initial Developer.
+
+3.4. Application of Additional Terms.
+
+You may not offer or impose any terms on any Covered
+Software in Source Code form that alters or restricts the
+applicable version of this License or the recipients'
+rights hereunder. You may choose to offer, and to charge a
+fee for, warranty, support, indemnity or liability
+obligations to one or more recipients of Covered Software.
+However, you may do so only on Your own behalf, and not on
+behalf of the Initial Developer or any Contributor. You
+must make it absolutely clear that any such warranty,
+support, indemnity or liability obligation is offered by
+You alone, and You hereby agree to indemnify the Initial
+Developer and every Contributor for any liability incurred
+by the Initial Developer or such Contributor as a result of
+warranty, support, indemnity or liability terms You offer.
+
+3.5. Distribution of Executable Versions.
+
+You may distribute the Executable form of the Covered
+Software under the terms of this License or under the terms
+of a license of Your choice, which may contain terms
+different from this License, provided that You are in
+compliance with the terms of this License and that the
+license for the Executable form does not attempt to limit
+or alter the recipient's rights in the Source Code form
+from the rights set forth in this License. If You
+distribute the Covered Software in Executable form under a
+different license, You must make it absolutely clear that
+any terms which differ from this License are offered by You
+alone, not by the Initial Developer or Contributor. You
+hereby agree to indemnify the Initial Developer and every
+Contributor for any liability incurred by the Initial
+Developer or such Contributor as a result of any such terms
+You offer.
+
+3.6. Larger Works.
+
+You may create a Larger Work by combining Covered Software
+with other code not governed by the terms of this License
+and distribute the Larger Work as a single product. In such
+a case, You must make sure the requirements of this License
+are fulfilled for the Covered Software.
+
+4. Versions of the License.
+
+4.1. New Versions.
+
+Sun Microsystems, Inc. is the initial license steward and
+may publish revised and/or new versions of this License
+from time to time. Each version will be given a
+distinguishing version number. Except as provided in
+Section 4.3, no one other than the license steward has the
+right to modify this License.
+
+4.2. Effect of New Versions.
+
+You may always continue to use, distribute or otherwise
+make the Covered Software available under the terms of the
+version of the License under which You originally received
+the Covered Software. If the Initial Developer includes a
+notice in the Original Software prohibiting it from being
+distributed or otherwise made available under any
+subsequent version of the License, You must distribute and
+make the Covered Software available under the terms of the
+version of the License under which You originally received
+the Covered Software. Otherwise, You may also choose to
+use, distribute or otherwise make the Covered Software
+available under the terms of any subsequent version of the
+License published by the license steward.
+
+4.3. Modified Versions.
+
+When You are an Initial Developer and You want to create a
+new license for Your Original Software, You may create and
+use a modified version of this License if You: (a) rename
+the license and remove any references to the name of the
+license steward (except to note that the license differs
+from this License); and (b) otherwise make it clear that
+the license contains terms which differ from this License.
+
+5. DISCLAIMER OF WARRANTY.
+
+COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS"
+BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
+INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED
+SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR
+PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND
+PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY
+COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE
+INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF
+ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF
+WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF
+ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS
+DISCLAIMER.
+
+6. TERMINATION.
+
+6.1. This License and the rights granted hereunder will
+terminate automatically if You fail to comply with terms
+herein and fail to cure such breach within 30 days of
+becoming aware of the breach. Provisions which, by their
+nature, must remain in effect beyond the termination of
+this License shall survive.
+
+6.2. If You assert a patent infringement claim (excluding
+declaratory judgment actions) against Initial Developer or
+a Contributor (the Initial Developer or Contributor against
+whom You assert such claim is referred to as "Participant")
+alleging that the Participant Software (meaning the
+Contributor Version where the Participant is a Contributor
+or the Original Software where the Participant is the
+Initial Developer) directly or indirectly infringes any
+patent, then any and all rights granted directly or
+indirectly to You by such Participant, the Initial
+Developer (if the Initial Developer is not the Participant)
+and all Contributors under Sections 2.1 and/or 2.2 of this
+License shall, upon 60 days notice from Participant
+terminate prospectively and automatically at the expiration
+of such 60 day notice period, unless if within such 60 day
+period You withdraw Your claim with respect to the
+Participant Software against such Participant either
+unilaterally or pursuant to a written agreement with
+Participant.
+
+6.3. In the event of termination under Sections 6.1 or 6.2
+above, all end user licenses that have been validly granted
+by You or any distributor hereunder prior to termination
+(excluding licenses granted to You by any distributor)
+shall survive termination.
+
+7. LIMITATION OF LIABILITY.
+
+UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
+(INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE
+INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF
+COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE
+LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR
+CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT
+LIMITATION, DAMAGES FOR LOST PROFITS, LOSS OF GOODWILL, WORK
+STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
+COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN
+INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
+LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL
+INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT
+APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO
+NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR
+CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT
+APPLY TO YOU.
+
+8. U.S. GOVERNMENT END USERS.
+
+The Covered Software is a "commercial item," as that term is
+defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial
+computer software" (as that term is defined at 48 C.F.R. ¤
+252.227-7014(a)(1)) and "commercial computer software
+documentation" as such terms are used in 48 C.F.R. 12.212 (Sept.
+1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1
+through 227.7202-4 (June 1995), all U.S. Government End Users
+acquire Covered Software with only those rights set forth herein.
+This U.S. Government Rights clause is in lieu of, and supersedes,
+any other FAR, DFAR, or other clause or provision that addresses
+Government rights in computer software under this License.
+
+9. MISCELLANEOUS.
+
+This License represents the complete agreement concerning subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the
+extent necessary to make it enforceable. This License shall be
+governed by the law of the jurisdiction specified in a notice
+contained within the Original Software (except to the extent
+applicable law, if any, provides otherwise), excluding such
+jurisdiction's conflict-of-law provisions. Any litigation
+relating to this License shall be subject to the jurisdiction of
+the courts located in the jurisdiction and venue specified in a
+notice contained within the Original Software, with the losing
+party responsible for costs, including, without limitation, court
+costs and reasonable attorneys' fees and expenses. The
+application of the United Nations Convention on Contracts for the
+International Sale of Goods is expressly excluded. Any law or
+regulation which provides that the language of a contract shall
+be construed against the drafter shall not apply to this License.
+You agree that You alone are responsible for compliance with the
+United States export administration regulations (and the export
+control laws and regulation of any other countries) when You use,
+distribute or otherwise make available any Covered Software.
+
+10. RESPONSIBILITY FOR CLAIMS.
+
+As between Initial Developer and the Contributors, each party is
+responsible for claims and damages arising, directly or
+indirectly, out of its utilization of rights under this License
+and You agree to work with Initial Developer and Contributors to
+distribute such responsibility on an equitable basis. Nothing
+herein is intended or shall be deemed to constitute any admission
+of liability.
diff --git a/packaging/jetty-server/src/main/dist/about_files/cpl-10.txt b/packaging/jetty-server/src/main/dist/about_files/cpl-10.txt
new file mode 100644
index 0000000..eb9ef5b
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/about_files/cpl-10.txt
@@ -0,0 +1,92 @@
+Common Public License - v 1.0
+
+Updated 16 Apr 2009
+
+As of 25 Feb 2009, IBM has assigned the Agreement Steward role for the CPL to the Eclipse Foundation. Eclipse has designated the Eclipse Public License (EPL) as the follow-on version of the CPL.
+
+
+THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
+
+
+1. DEFINITIONS
+
+"Contribution" means:
+
+a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and
+b) in the case of each subsequent Contributor:
+i)	 changes to the Program, and
+ii)	 additions to the Program;
+where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.
+
+"Contributor" means any person or entity that distributes the Program.
+
+
+"Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.
+
+
+"Program" means the Contributions distributed in accordance with this Agreement.
+
+
+"Recipient" means anyone who receives the Program under this Agreement, including all Contributors.
+
+
+2. GRANT OF RIGHTS
+
+a)	Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.
+b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder.
+c)	Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program.
+d)	Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement.
+3. REQUIREMENTS
+
+A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:
+
+a)	it complies with the terms and conditions of this Agreement; and
+b)	its license agreement:
+i)	effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose;
+ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits;
+iii)	states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and
+iv)	states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange.
+When the Program is made available in source code form:
+
+a)	it must be made available under this Agreement; and
+b)	a copy of this Agreement must be included with each copy of the Program.
+
+Contributors may not remove or alter any copyright notices contained within the Program.
+
+
+Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution.
+
+
+4. COMMERCIAL DISTRIBUTION
+
+Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense.
+
+
+For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.
+
+
+5. NO WARRANTY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. 
+
+
+6. DISCLAIMER OF LIABILITY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+
+7. GENERAL
+
+If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
+
+
+If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed. In addition, if Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed.
+
+
+All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive. 
+
+
+Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. IBM is the initial Agreement Steward. IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved.
+
+
+This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation.
\ No newline at end of file
diff --git a/packaging/jetty-server/src/main/dist/about_files/mpl-1.1.txt b/packaging/jetty-server/src/main/dist/about_files/mpl-1.1.txt
new file mode 100644
index 0000000..06f9651
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/about_files/mpl-1.1.txt
@@ -0,0 +1,469 @@
+                          MOZILLA PUBLIC LICENSE
+                                Version 1.1
+
+                              ---------------
+
+1. Definitions.
+
+     1.0.1. "Commercial Use" means distribution or otherwise making the
+     Covered Code available to a third party.
+
+     1.1. "Contributor" means each entity that creates or contributes to
+     the creation of Modifications.
+
+     1.2. "Contributor Version" means the combination of the Original
+     Code, prior Modifications used by a Contributor, and the Modifications
+     made by that particular Contributor.
+
+     1.3. "Covered Code" means the Original Code or Modifications or the
+     combination of the Original Code and Modifications, in each case
+     including portions thereof.
+
+     1.4. "Electronic Distribution Mechanism" means a mechanism generally
+     accepted in the software development community for the electronic
+     transfer of data.
+
+     1.5. "Executable" means Covered Code in any form other than Source
+     Code.
+
+     1.6. "Initial Developer" means the individual or entity identified
+     as the Initial Developer in the Source Code notice required by Exhibit
+     A.
+
+     1.7. "Larger Work" means a work which combines Covered Code or
+     portions thereof with code not governed by the terms of this License.
+
+     1.8. "License" means this document.
+
+     1.8.1. "Licensable" means having the right to grant, to the maximum
+     extent possible, whether at the time of the initial grant or
+     subsequently acquired, any and all of the rights conveyed herein.
+
+     1.9. "Modifications" means any addition to or deletion from the
+     substance or structure of either the Original Code or any previous
+     Modifications. When Covered Code is released as a series of files, a
+     Modification is:
+          A. Any addition to or deletion from the contents of a file
+          containing Original Code or previous Modifications.
+
+          B. Any new file that contains any part of the Original Code or
+          previous Modifications.
+
+     1.10. "Original Code" means Source Code of computer software code
+     which is described in the Source Code notice required by Exhibit A as
+     Original Code, and which, at the time of its release under this
+     License is not already Covered Code governed by this License.
+
+     1.10.1. "Patent Claims" means any patent claim(s), now owned or
+     hereafter acquired, including without limitation,  method, process,
+     and apparatus claims, in any patent Licensable by grantor.
+
+     1.11. "Source Code" means the preferred form of the Covered Code for
+     making modifications to it, including all modules it contains, plus
+     any associated interface definition files, scripts used to control
+     compilation and installation of an Executable, or source code
+     differential comparisons against either the Original Code or another
+     well known, available Covered Code of the Contributor's choice. The
+     Source Code can be in a compressed or archival form, provided the
+     appropriate decompression or de-archiving software is widely available
+     for no charge.
+
+     1.12. "You" (or "Your")  means an individual or a legal entity
+     exercising rights under, and complying with all of the terms of, this
+     License or a future version of this License issued under Section 6.1.
+     For legal entities, "You" includes any entity which controls, is
+     controlled by, or is under common control with You. For purposes of
+     this definition, "control" means (a) the power, direct or indirect,
+     to cause the direction or management of such entity, whether by
+     contract or otherwise, or (b) ownership of more than fifty percent
+     (50%) of the outstanding shares or beneficial ownership of such
+     entity.
+
+2. Source Code License.
+
+     2.1. The Initial Developer Grant.
+     The Initial Developer hereby grants You a world-wide, royalty-free,
+     non-exclusive license, subject to third party intellectual property
+     claims:
+          (a)  under intellectual property rights (other than patent or
+          trademark) Licensable by Initial Developer to use, reproduce,
+          modify, display, perform, sublicense and distribute the Original
+          Code (or portions thereof) with or without Modifications, and/or
+          as part of a Larger Work; and
+
+          (b) under Patents Claims infringed by the making, using or
+          selling of Original Code, to make, have made, use, practice,
+          sell, and offer for sale, and/or otherwise dispose of the
+          Original Code (or portions thereof).
+
+          (c) the licenses granted in this Section 2.1(a) and (b) are
+          effective on the date Initial Developer first distributes
+          Original Code under the terms of this License.
+
+          (d) Notwithstanding Section 2.1(b) above, no patent license is
+          granted: 1) for code that You delete from the Original Code; 2)
+          separate from the Original Code;  or 3) for infringements caused
+          by: i) the modification of the Original Code or ii) the
+          combination of the Original Code with other software or devices.
+
+     2.2. Contributor Grant.
+     Subject to third party intellectual property claims, each Contributor
+     hereby grants You a world-wide, royalty-free, non-exclusive license
+
+          (a)  under intellectual property rights (other than patent or
+          trademark) Licensable by Contributor, to use, reproduce, modify,
+          display, perform, sublicense and distribute the Modifications
+          created by such Contributor (or portions thereof) either on an
+          unmodified basis, with other Modifications, as Covered Code
+          and/or as part of a Larger Work; and
+
+          (b) under Patent Claims infringed by the making, using, or
+          selling of  Modifications made by that Contributor either alone
+          and/or in combination with its Contributor Version (or portions
+          of such combination), to make, use, sell, offer for sale, have
+          made, and/or otherwise dispose of: 1) Modifications made by that
+          Contributor (or portions thereof); and 2) the combination of
+          Modifications made by that Contributor with its Contributor
+          Version (or portions of such combination).
+
+          (c) the licenses granted in Sections 2.2(a) and 2.2(b) are
+          effective on the date Contributor first makes Commercial Use of
+          the Covered Code.
+
+          (d)    Notwithstanding Section 2.2(b) above, no patent license is
+          granted: 1) for any code that Contributor has deleted from the
+          Contributor Version; 2)  separate from the Contributor Version;
+          3)  for infringements caused by: i) third party modifications of
+          Contributor Version or ii)  the combination of Modifications made
+          by that Contributor with other software  (except as part of the
+          Contributor Version) or other devices; or 4) under Patent Claims
+          infringed by Covered Code in the absence of Modifications made by
+          that Contributor.
+
+3. Distribution Obligations.
+
+     3.1. Application of License.
+     The Modifications which You create or to which You contribute are
+     governed by the terms of this License, including without limitation
+     Section 2.2. The Source Code version of Covered Code may be
+     distributed only under the terms of this License or a future version
+     of this License released under Section 6.1, and You must include a
+     copy of this License with every copy of the Source Code You
+     distribute. You may not offer or impose any terms on any Source Code
+     version that alters or restricts the applicable version of this
+     License or the recipients' rights hereunder. However, You may include
+     an additional document offering the additional rights described in
+     Section 3.5.
+
+     3.2. Availability of Source Code.
+     Any Modification which You create or to which You contribute must be
+     made available in Source Code form under the terms of this License
+     either on the same media as an Executable version or via an accepted
+     Electronic Distribution Mechanism to anyone to whom you made an
+     Executable version available; and if made available via Electronic
+     Distribution Mechanism, must remain available for at least twelve (12)
+     months after the date it initially became available, or at least six
+     (6) months after a subsequent version of that particular Modification
+     has been made available to such recipients. You are responsible for
+     ensuring that the Source Code version remains available even if the
+     Electronic Distribution Mechanism is maintained by a third party.
+
+     3.3. Description of Modifications.
+     You must cause all Covered Code to which You contribute to contain a
+     file documenting the changes You made to create that Covered Code and
+     the date of any change. You must include a prominent statement that
+     the Modification is derived, directly or indirectly, from Original
+     Code provided by the Initial Developer and including the name of the
+     Initial Developer in (a) the Source Code, and (b) in any notice in an
+     Executable version or related documentation in which You describe the
+     origin or ownership of the Covered Code.
+
+     3.4. Intellectual Property Matters
+          (a) Third Party Claims.
+          If Contributor has knowledge that a license under a third party's
+          intellectual property rights is required to exercise the rights
+          granted by such Contributor under Sections 2.1 or 2.2,
+          Contributor must include a text file with the Source Code
+          distribution titled "LEGAL" which describes the claim and the
+          party making the claim in sufficient detail that a recipient will
+          know whom to contact. If Contributor obtains such knowledge after
+          the Modification is made available as described in Section 3.2,
+          Contributor shall promptly modify the LEGAL file in all copies
+          Contributor makes available thereafter and shall take other steps
+          (such as notifying appropriate mailing lists or newsgroups)
+          reasonably calculated to inform those who received the Covered
+          Code that new knowledge has been obtained.
+
+          (b) Contributor APIs.
+          If Contributor's Modifications include an application programming
+          interface and Contributor has knowledge of patent licenses which
+          are reasonably necessary to implement that API, Contributor must
+          also include this information in the LEGAL file.
+
+               (c)    Representations.
+          Contributor represents that, except as disclosed pursuant to
+          Section 3.4(a) above, Contributor believes that Contributor's
+          Modifications are Contributor's original creation(s) and/or
+          Contributor has sufficient rights to grant the rights conveyed by
+          this License.
+
+     3.5. Required Notices.
+     You must duplicate the notice in Exhibit A in each file of the Source
+     Code.  If it is not possible to put such notice in a particular Source
+     Code file due to its structure, then You must include such notice in a
+     location (such as a relevant directory) where a user would be likely
+     to look for such a notice.  If You created one or more Modification(s)
+     You may add your name as a Contributor to the notice described in
+     Exhibit A.  You must also duplicate this License in any documentation
+     for the Source Code where You describe recipients' rights or ownership
+     rights relating to Covered Code.  You may choose to offer, and to
+     charge a fee for, warranty, support, indemnity or liability
+     obligations to one or more recipients of Covered Code. However, You
+     may do so only on Your own behalf, and not on behalf of the Initial
+     Developer or any Contributor. You must make it absolutely clear than
+     any such warranty, support, indemnity or liability obligation is
+     offered by You alone, and You hereby agree to indemnify the Initial
+     Developer and every Contributor for any liability incurred by the
+     Initial Developer or such Contributor as a result of warranty,
+     support, indemnity or liability terms You offer.
+
+     3.6. Distribution of Executable Versions.
+     You may distribute Covered Code in Executable form only if the
+     requirements of Section 3.1-3.5 have been met for that Covered Code,
+     and if You include a notice stating that the Source Code version of
+     the Covered Code is available under the terms of this License,
+     including a description of how and where You have fulfilled the
+     obligations of Section 3.2. The notice must be conspicuously included
+     in any notice in an Executable version, related documentation or
+     collateral in which You describe recipients' rights relating to the
+     Covered Code. You may distribute the Executable version of Covered
+     Code or ownership rights under a license of Your choice, which may
+     contain terms different from this License, provided that You are in
+     compliance with the terms of this License and that the license for the
+     Executable version does not attempt to limit or alter the recipient's
+     rights in the Source Code version from the rights set forth in this
+     License. If You distribute the Executable version under a different
+     license You must make it absolutely clear that any terms which differ
+     from this License are offered by You alone, not by the Initial
+     Developer or any Contributor. You hereby agree to indemnify the
+     Initial Developer and every Contributor for any liability incurred by
+     the Initial Developer or such Contributor as a result of any such
+     terms You offer.
+
+     3.7. Larger Works.
+     You may create a Larger Work by combining Covered Code with other code
+     not governed by the terms of this License and distribute the Larger
+     Work as a single product. In such a case, You must make sure the
+     requirements of this License are fulfilled for the Covered Code.
+
+4. Inability to Comply Due to Statute or Regulation.
+
+     If it is impossible for You to comply with any of the terms of this
+     License with respect to some or all of the Covered Code due to
+     statute, judicial order, or regulation then You must: (a) comply with
+     the terms of this License to the maximum extent possible; and (b)
+     describe the limitations and the code they affect. Such description
+     must be included in the LEGAL file described in Section 3.4 and must
+     be included with all distributions of the Source Code. Except to the
+     extent prohibited by statute or regulation, such description must be
+     sufficiently detailed for a recipient of ordinary skill to be able to
+     understand it.
+
+5. Application of this License.
+
+     This License applies to code to which the Initial Developer has
+     attached the notice in Exhibit A and to related Covered Code.
+
+6. Versions of the License.
+
+     6.1. New Versions.
+     Netscape Communications Corporation ("Netscape") may publish revised
+     and/or new versions of the License from time to time. Each version
+     will be given a distinguishing version number.
+
+     6.2. Effect of New Versions.
+     Once Covered Code has been published under a particular version of the
+     License, You may always continue to use it under the terms of that
+     version. You may also choose to use such Covered Code under the terms
+     of any subsequent version of the License published by Netscape. No one
+     other than Netscape has the right to modify the terms applicable to
+     Covered Code created under this License.
+
+     6.3. Derivative Works.
+     If You create or use a modified version of this License (which you may
+     only do in order to apply it to code which is not already Covered Code
+     governed by this License), You must (a) rename Your license so that
+     the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape",
+     "MPL", "NPL" or any confusingly similar phrase do not appear in your
+     license (except to note that your license differs from this License)
+     and (b) otherwise make it clear that Your version of the license
+     contains terms which differ from the Mozilla Public License and
+     Netscape Public License. (Filling in the name of the Initial
+     Developer, Original Code or Contributor in the notice described in
+     Exhibit A shall not of themselves be deemed to be modifications of
+     this License.)
+
+7. DISCLAIMER OF WARRANTY.
+
+     COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS,
+     WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+     WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF
+     DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING.
+     THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE
+     IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT,
+     YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE
+     COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER
+     OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF
+     ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
+
+8. TERMINATION.
+
+     8.1.  This License and the rights granted hereunder will terminate
+     automatically if You fail to comply with terms herein and fail to cure
+     such breach within 30 days of becoming aware of the breach. All
+     sublicenses to the Covered Code which are properly granted shall
+     survive any termination of this License. Provisions which, by their
+     nature, must remain in effect beyond the termination of this License
+     shall survive.
+
+     8.2.  If You initiate litigation by asserting a patent infringement
+     claim (excluding declatory judgment actions) against Initial Developer
+     or a Contributor (the Initial Developer or Contributor against whom
+     You file such action is referred to as "Participant")  alleging that:
+
+     (a)  such Participant's Contributor Version directly or indirectly
+     infringes any patent, then any and all rights granted by such
+     Participant to You under Sections 2.1 and/or 2.2 of this License
+     shall, upon 60 days notice from Participant terminate prospectively,
+     unless if within 60 days after receipt of notice You either: (i)
+     agree in writing to pay Participant a mutually agreeable reasonable
+     royalty for Your past and future use of Modifications made by such
+     Participant, or (ii) withdraw Your litigation claim with respect to
+     the Contributor Version against such Participant.  If within 60 days
+     of notice, a reasonable royalty and payment arrangement are not
+     mutually agreed upon in writing by the parties or the litigation claim
+     is not withdrawn, the rights granted by Participant to You under
+     Sections 2.1 and/or 2.2 automatically terminate at the expiration of
+     the 60 day notice period specified above.
+
+     (b)  any software, hardware, or device, other than such Participant's
+     Contributor Version, directly or indirectly infringes any patent, then
+     any rights granted to You by such Participant under Sections 2.1(b)
+     and 2.2(b) are revoked effective as of the date You first made, used,
+     sold, distributed, or had made, Modifications made by that
+     Participant.
+
+     8.3.  If You assert a patent infringement claim against Participant
+     alleging that such Participant's Contributor Version directly or
+     indirectly infringes any patent where such claim is resolved (such as
+     by license or settlement) prior to the initiation of patent
+     infringement litigation, then the reasonable value of the licenses
+     granted by such Participant under Sections 2.1 or 2.2 shall be taken
+     into account in determining the amount or value of any payment or
+     license.
+
+     8.4.  In the event of termination under Sections 8.1 or 8.2 above,
+     all end user license agreements (excluding distributors and resellers)
+     which have been validly granted by You or any distributor hereunder
+     prior to termination shall survive termination.
+
+9. LIMITATION OF LIABILITY.
+
+     UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
+     (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL
+     DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE,
+     OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR
+     ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY
+     CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL,
+     WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
+     COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN
+     INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
+     LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY
+     RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW
+     PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE
+     EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO
+     THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
+
+10. U.S. GOVERNMENT END USERS.
+
+     The Covered Code is a "commercial item," as that term is defined in
+     48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer
+     software" and "commercial computer software documentation," as such
+     terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48
+     C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995),
+     all U.S. Government End Users acquire Covered Code with only those
+     rights set forth herein.
+
+11. MISCELLANEOUS.
+
+     This License represents the complete agreement concerning subject
+     matter hereof. If any provision of this License is held to be
+     unenforceable, such provision shall be reformed only to the extent
+     necessary to make it enforceable. This License shall be governed by
+     California law provisions (except to the extent applicable law, if
+     any, provides otherwise), excluding its conflict-of-law provisions.
+     With respect to disputes in which at least one party is a citizen of,
+     or an entity chartered or registered to do business in the United
+     States of America, any litigation relating to this License shall be
+     subject to the jurisdiction of the Federal Courts of the Northern
+     District of California, with venue lying in Santa Clara County,
+     California, with the losing party responsible for costs, including
+     without limitation, court costs and reasonable attorneys' fees and
+     expenses. The application of the United Nations Convention on
+     Contracts for the International Sale of Goods is expressly excluded.
+     Any law or regulation which provides that the language of a contract
+     shall be construed against the drafter shall not apply to this
+     License.
+
+12. RESPONSIBILITY FOR CLAIMS.
+
+     As between Initial Developer and the Contributors, each party is
+     responsible for claims and damages arising, directly or indirectly,
+     out of its utilization of rights under this License and You agree to
+     work with Initial Developer and Contributors to distribute such
+     responsibility on an equitable basis. Nothing herein is intended or
+     shall be deemed to constitute any admission of liability.
+
+13. MULTIPLE-LICENSED CODE.
+
+     Initial Developer may designate portions of the Covered Code as
+     "Multiple-Licensed".  "Multiple-Licensed" means that the Initial
+     Developer permits you to utilize portions of the Covered Code under
+     Your choice of the NPL or the alternative licenses, if any, specified
+     by the Initial Developer in the file described in Exhibit A.
+
+EXHIBIT A -Mozilla Public License.
+
+     ``The contents of this file are subject to the Mozilla Public License
+     Version 1.1 (the "License"); you may not use this file except in
+     compliance with the License. You may obtain a copy of the License at
+     http://www.mozilla.org/MPL/
+
+     Software distributed under the License is distributed on an "AS IS"
+     basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+     License for the specific language governing rights and limitations
+     under the License.
+
+     The Original Code is ______________________________________.
+
+     The Initial Developer of the Original Code is ________________________.
+     Portions created by ______________________ are Copyright (C) ______
+     _______________________. All Rights Reserved.
+
+     Contributor(s): ______________________________________.
+
+     Alternatively, the contents of this file may be used under the terms
+     of the _____ license (the  "[___] License"), in which case the
+     provisions of [______] License are applicable instead of those
+     above.  If you wish to allow use of your version of this file only
+     under the terms of the [____] License and not to allow others to use
+     your version of this file under the MPL, indicate your decision by
+     deleting  the provisions above and replace  them with the notice and
+     other provisions required by the [___] License.  If you do not delete
+     the provisions above, a recipient may use your version of this file
+     under either the MPL or the [___] License."
+
+     [NOTE: The text of this Exhibit A may differ slightly from the text of
+     the notices in the Source Code files of the Original Code. You should
+     use the text of this Exhibit A rather than the text found in the
+     Original Code Source Code for Your Modifications.]
diff --git a/packaging/jetty-server/src/main/dist/about_files/new-bsd.txt b/packaging/jetty-server/src/main/dist/about_files/new-bsd.txt
new file mode 100644
index 0000000..1d256c2
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/about_files/new-bsd.txt
@@ -0,0 +1,19 @@
+BSD-style License
+Redistribution and use in source and binary forms, with or without modification, 
+are permitted provided that the following conditions are met:
+Redistributions of source code must retain the above copyright notice, 
+this list of conditions and the following disclaimer.
+Redistributions in binary form must reproduce the above copyright notice, 
+this list of conditions and the following disclaimer in the documentation 
+and/or other materials provided with the distribution.
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 
+PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, 
+OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 
+STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
+POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
diff --git a/packaging/jetty-server/src/main/dist/about_files/slf4j.txt b/packaging/jetty-server/src/main/dist/about_files/slf4j.txt
new file mode 100644
index 0000000..371607c
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/about_files/slf4j.txt
@@ -0,0 +1,20 @@
+Copyright (c) 2004-2008 QOS.ch
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/packaging/jetty-server/src/main/dist/bin/checkJava.bat b/packaging/jetty-server/src/main/dist/bin/checkJava.bat
new file mode 100644
index 0000000..8df7848
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/bin/checkJava.bat
@@ -0,0 +1,17 @@
+@echo off
+rem Script for checking we have the right version of Java.
+
+if "%JAVA_HOME%" == "" (
+  echo The JAVA_HOME environment variable is not defined.
+  exit /B 1
+)
+if "%CLASSPATH%" == "" (
+  echo The CLASSPATH environment variable is not defined.
+  exit /B 1
+)
+
+rem Run java version check with the discovered java jvm.
+"%JAVA_HOME%\bin\java" -classpath "%CLASSPATH%" org.eclipse.virgo.util.env.JavaVersionChecker
+
+rem If non-zero exit then either we cannot find the checker or the Java version is incorrect.
+if not "%ERRORLEVEL%"=="0" exit /B %ERRORLEVEL%
diff --git a/packaging/jetty-server/src/main/dist/bin/dmk.bat b/packaging/jetty-server/src/main/dist/bin/dmk.bat
new file mode 100644
index 0000000..80948bf
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/bin/dmk.bat
@@ -0,0 +1,287 @@
+@echo off
+rem Script for starting and stopping the kernel
+
+if "%OS%" == "Windows_NT" setlocal
+
+rem Derive full path for script (includes trailing backslash)
+  set SCRIPT_DIR=%~dp0
+
+if exist "%SCRIPT_DIR%setupVars.bat" (
+  call "%SCRIPT_DIR%setupVars.bat"
+  if not "%ERRORLEVEL%"=="0" (
+    if "%OS%" == "Windows_NT" endlocal
+    exit /B %ERRORLEVEL%
+  )
+) else (
+  echo Cannot set up environment. "setupVars.bat" file missing.
+  if "%OS%" == "Windows_NT" endlocal
+  exit /B 1
+)
+
+rem Select command we are to run
+
+  rem First parm is command
+    set COMMAND=%~1
+    rem Rest are parameters - shift done in subroutines
+   
+  rem Switch on COMMAND in {"start","stop"}
+
+    if "%COMMAND%" == "start" (
+      call :doStartCommand %*
+      if "%OS%" == "Windows_NT" endlocal
+      exit /B 0
+    )
+
+    if "%COMMAND%" == "stop"  (
+      call :doStopCommand  %*
+      if "%OS%" == "Windows_NT" endlocal
+      exit /B 0
+    )
+
+    echo Unknown command: %COMMAND%
+    if "%OS%" == "Windows_NT" endlocal
+    exit /B 1
+
+rem ------------------ Subroutines
+rem ------------------------------
+:doStartCommand
+
+  shift
+  rem The shift must be here :()
+
+  rem Check further file that needs to exist
+  for %%I in ("%KERNEL_HOME%\bin\jmxPermissions.vbs") do if not exist "%%~I" (
+    echo File "%%~I" does not exist but is required to continue.
+    exit /B 1
+  )
+
+  rem Set defaults
+    set CONFIG_DIR=%KERNEL_HOME%\configuration
+    set CLEAN_FLAG=
+    set NO_START_FLAG=
+    set DEBUG_FLAG=
+    set DEBUG_PORT=8000
+    set SUSPEND=n
+    if not defined JMX_PORT set JMX_PORT=9875
+    if not defined KEYSTORE_PASSWORD set KEYSTORE_PASSWORD=changeit
+    set ADDITIONAL_ARGS=
+
+  rem Loop through options
+
+  :startOptionLoop
+  if "%~1"=="" goto endStartOptionLoop
+  if "%~1"=="-debug"             goto debug
+  if "%~1"=="-clean"             goto clean
+  if "%~1"=="-configDir"         goto configDir
+  if "%~1"=="-jmxport"           goto jmxport
+  if "%~1"=="-keystore"          goto keystore
+  if "%~1"=="-keystorePassword"  goto keystorePassword
+  if "%~1"=="-noStart"           goto noStart
+  if "%~1"=="-suspend"           goto suspend
+  if "%~1"=="-shell"             goto shell
+
+  set ADDITIONAL_ARGS=%ADDITIONAL_ARGS% "%~1"
+
+  :continueStartOptionLoop
+    shift
+    goto startOptionLoop
+
+  :debug
+    set DEBUG_FLAG=1
+    set PORT_CANDIDATE=%~2
+    if not "%PORT_CANDIDATE:~0,1%"=="-" (
+      set DEBUG_PORT=%PORT_CANDIDATE%
+      shift
+    )
+    goto continueStartOptionLoop
+  :clean
+    set CLEAN_FLAG=1
+    goto continueStartOptionLoop
+  :configDir
+    set CONFIG_DIR=%~2
+    rem unless absolute, treat as relative to kernel home
+    if "%CONFIG_DIR:~1%"=="\" goto absoluteConfigDir
+    if "%CONFIG_DIR:~1,2%"==":\" goto absoluteConfigDir
+    set CONFIG_DIR=%KERNEL_HOME%\%CONFIG_DIR%
+  :absoluteConfigDir
+    shift
+    goto continueStartOptionLoop
+  :jmxport
+    set JMX_PORT=%~2
+    shift
+    goto continueStartOptionLoop
+  :keystore
+    set KEYSTORE_PATH=%~2
+    shift
+    goto continueStartOptionLoop
+  :keystorePassword
+    set KEYSTORE_PASSWORD=%~2
+    shift
+    goto continueStartOptionLoop
+  :noStart
+    set NO_START_FLAG=1
+    goto continueStartOptionLoop
+  :suspend
+    set SUSPEND=y
+    goto continueStartOptionLoop
+  :shell
+    set SHELL_FLAG=1
+    goto continueStartOptionLoop
+
+  :endStartOptionLoop
+
+  
+  rem Adjust permissions if necessary
+    cscript //NoLogo "%KERNEL_HOME%\bin\jmxPermissions.vbs" "%CONFIG_DIR%\"
+
+  rem Adjust options now all are known
+    if "%KEYSTORE_PATH%"=="" set KEYSTORE_PATH=%CONFIG_DIR%\keystore
+    if not "%DEBUG_FLAG%"=="" set DEBUG_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,address=%DEBUG_PORT%,server=y,suspend=%SUSPEND%
+
+  rem do Clean work:
+    if not "%CLEAN_FLAG%"=="" (
+      echo Cleaning the serviceability and working directories...
+      rmdir /Q /S "%KERNEL_HOME%\serviceability" 2>nul
+      rmdir /Q /S "%KERNEL_HOME%\work" 2>nul
+      
+      set LAUNCH_OPTS=%LAUNCH_OPTS% -clean
+    )
+
+  rem do Shell work:
+    if not "%SHELL_FLAG%"=="" ( 
+      echo "Warning: Kernel shell not supported; -shell option ignored."
+      rem set LAUNCH_OPTS=%LAUNCH_OPTS% -Forg.eclipse.virgo.kernel.shell.local=true
+    )
+
+  rem Set JMX options
+    set JMX_OPTS=%JMX_OPTS% -Dcom.sun.management.jmxremote.port=%JMX_PORT% 
+    set JMX_OPTS=%JMX_OPTS% -Dcom.sun.management.jmxremote.authenticate=true 
+    set JMX_OPTS=%JMX_OPTS% -Dcom.sun.management.jmxremote.login.config=virgo-kernel 
+    set JMX_OPTS=%JMX_OPTS% -Dcom.sun.management.jmxremote.access.file="%CONFIG_DIR%\org.eclipse.virgo.kernel.jmxremote.access.properties" 
+    set JMX_OPTS=%JMX_OPTS% -Djavax.net.ssl.keyStore="%KEYSTORE_PATH%" 
+    set JMX_OPTS=%JMX_OPTS% -Djavax.net.ssl.keyStorePassword=%KEYSTORE_PASSWORD% 
+    set JMX_OPTS=%JMX_OPTS% -Dcom.sun.management.jmxremote.ssl=true 
+    set JMX_OPTS=%JMX_OPTS% -Dcom.sun.management.jmxremote.ssl.need.client.auth=false
+
+    if not "%NO_START_FLAG%"=="" goto :eof
+    rem ensure that the tmp directory exists:
+      set TMP_DIR="%KERNEL_HOME%\work\tmp"
+      if not exist "%TMP_DIR%" mkdir "%TMP_DIR%"
+
+       set JAVA_OPTS=-Xmx1024m -XX:MaxPermSize=512m %JAVA_OPTS%
+    rem Run the server
+  
+      rem Marshall parameters
+      set KERNEL_JAVA_PARMS=%JAVA_OPTS% %DEBUG_OPTS% %JMX_OPTS%
+
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -XX:+HeapDumpOnOutOfMemoryError 
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -XX:ErrorFile="%KERNEL_HOME%\serviceability\error.log" 
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -XX:HeapDumpPath="%KERNEL_HOME%\serviceability\heap_dump.hprof"
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Djava.security.auth.login.config="%CONFIG_DIR%\org.eclipse.virgo.kernel.authentication.config" 
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dorg.eclipse.virgo.kernel.authentication.file="%CONFIG_DIR%\org.eclipse.virgo.kernel.users.properties" 
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Djetty.home="%KERNEL_HOME%\jetty"
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Djava.io.tmpdir="%TMP_DIR%" 
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dorg.eclipse.virgo.kernel.home="%KERNEL_HOME%" 
+	  set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dosgi.java.profile="file:%CONFIG_DIR%\java-server.profile"
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dssh.server.keystore="%CONFIG_DIR%/hostkey.ser"
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dorg.eclipse.virgo.kernel.config="%CONFIG_DIR%"
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dosgi.sharedConfiguration.area="%CONFIG_DIR%"
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Declipse.ignoreApp="true" 
+	  set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dosgi.install.area="%KERNEL_HOME%"
+	  set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dosgi.configuration.area="%KERNEL_HOME%\work" 
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dosgi.frameworkClassPath="%FWCLASSPATH%"
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Djava.endorsed.dirs="%KERNEL_HOME%\lib\endorsed"
+      
+      rem If Windows 10 set system property os.name=win32, see https://bugs.eclipse.org/bugs/show_bug.cgi?id=486353	
+	  for /f "tokens=4 delims=] " %%i in ('ver') do set VIRGO_DETECTED_WIN_VERSION=%%i 
+      if "%VIRGO_DETECTED_WIN_VERSION:~0,1%"=="1" set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dos.name=win32
+  
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -classpath "%CLASSPATH%" 
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% org.eclipse.equinox.launcher.Main
+	  set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -noExit
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% %LAUNCH_OPTS%
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% %ADDITIONAL_ARGS%
+
+      rem Now run it
+        PUSHD %KERNEL_HOME%
+        "%JAVA_HOME%\bin\java" %KERNEL_JAVA_PARMS%
+        POPD
+
+goto :eof
+
+rem ------------------------------
+:doStopCommand
+  
+  shift
+  rem The shift must be here :()
+
+  rem Set defaults
+  set CONFIG_DIR=%KERNEL_HOME%\configuration
+  if not defined TRUSTSTORE_PATH set TRUSTSTORE_PATH=%CONFIG_DIR%\keystore
+  if not defined TRUSTSTORE_PASSWORD set TRUSTSTORE_PASSWORD=changeit
+  if not defined JMX_PORT set JMX_PORT=9875
+  set OTHER_ARGS=
+
+  rem Loop through options
+  :stopOptionLoop
+
+  if "%~1"=="" goto endStopOptionLoop  
+  if "%~1"=="-truststore" goto truststoreStop
+  if "%~1"=="-truststorePassword" goto truststorePasswordStop
+  if "%~1"=="-configDir" goto configDirStop 
+  if "%~1"=="-jmxport" goto jmxportStop
+  
+  set OTHER_ARGS=%OTHER_ARGS% "%~1"
+    
+  :continueStopOptionLoop
+  shift
+  goto stopOptionLoop
+
+  :truststoreStop
+  set TRUSTSTORE_PATH=%~2
+  shift
+  goto continueStopOptionLoop
+
+  :truststorePasswordStop
+  set TRUSTSTORE_PASSWORD=%~2
+  shift
+  goto continueStopOptionLoop
+
+  :configDirStop
+    set CONFIG_DIR=%~2
+    rem unless absolute, treat as relative to kernel home
+    if "%CONFIG_DIR:~1%"=="\" goto absoluteConfigDirStop
+    if "%CONFIG_DIR:~1,2%"==":\" goto absoluteConfigDirStop
+    set CONFIG_DIR=%KERNEL_HOME%\%CONFIG_DIR%
+  :absoluteConfigDirStop
+    shift
+    goto continueStopOptionLoop
+
+  :jmxportStop
+  set JMX_PORT=%~2
+  shift
+  goto continueStopOptionLoop
+
+  :endStopOptionLoop
+
+  rem Call shutdown client
+
+    rem Extend JMX options
+    set JMX_OPTS=%JMX_OPTS% -Djavax.net.ssl.trustStore="%TRUSTSTORE_PATH%"
+    set JMX_OPTS=%JMX_OPTS% -Djavax.net.ssl.trustStorePassword=%TRUSTSTORE_PASSWORD%
+    set OTHER_ARGS=%OTHER_ARGS% -jmxport %JMX_PORT%
+
+    rem Marshall parameters
+    set SHUTDOWN_PARMS= %JAVA_OPTS% %JMX_OPTS%
+    set SHUTDOWN_PARMS=%SHUTDOWN_PARMS% -classpath "%CLASSPATH%"
+    set SHUTDOWN_PARMS=%SHUTDOWN_PARMS% -Dorg.eclipse.virgo.kernel.home="%KERNEL_HOME%"
+    set SHUTDOWN_PARMS=%SHUTDOWN_PARMS% -Dorg.eclipse.virgo.kernel.authentication.file="%CONFIG_DIR%\org.eclipse.virgo.kernel.users.properties"
+    set SHUTDOWN_PARMS=%SHUTDOWN_PARMS% org.eclipse.virgo.nano.shutdown.ShutdownClient
+    set SHUTDOWN_PARMS=%SHUTDOWN_PARMS% %OTHER_ARGS%
+
+    rem Run Java program
+    PUSHD %KERNEL_HOME%
+    "%JAVA_HOME%\bin\java" %SHUTDOWN_PARMS%
+    POPD
+
+goto :eof
diff --git a/packaging/jetty-server/src/main/dist/bin/jconsole.bat b/packaging/jetty-server/src/main/dist/bin/jconsole.bat
new file mode 100644
index 0000000..4cbe553
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/bin/jconsole.bat
@@ -0,0 +1,54 @@
+@echo off
+rem Script for starting jconsole
+
+if "%OS%" == "Windows_NT" setlocal
+
+rem Find root drive and path for current bat file directory (includes trailing backslash)
+  set SCRIPT_DIR=%~dp0
+
+if exist "%SCRIPT_DIR%setupVars.bat" (
+  call "%SCRIPT_DIR%setupVars.bat"
+  if not "%ERRORLEVEL%"=="0" (
+    if "%OS%" == "Windows_NT" endlocal
+    exit /B %ERRORLEVEL%
+  )
+) else (
+  echo Cannot set up environment. "setupVars.bat" file missing.
+  if "%OS%" == "Windows_NT" endlocal
+  exit /B 1
+)
+
+rem Set defaults
+  set TRUSTSTORE_PATH=%KERNEL_HOME%\configuration\keystore
+  set TRUSTSTORE_PASSWORD=changeit
+  set OTHER_ARGS=
+  
+:Loop
+  if "%~1"=="" goto EndLoop
+
+  if "%~1"=="-truststore" (
+    set TRUSTSTORE_PATH=%~2
+    shift
+    shift
+    goto Loop
+  ) 
+  if "%~1"=="-truststorePassword" (
+    set TRUSTSTORE_PASSWORD=%~2
+    shift
+    shift
+    goto Loop
+  )
+  rem Accumulate extra parameters.
+    set OTHER_ARGS=%OTHER_ARGS% "%~1"
+    shift
+  goto Loop
+:EndLoop
+
+set JMX_OPTS=%JMX_OPTS% -J-Dcom.sun.tools.jconsole.mbeans.keyPropertyList=category,type 
+set JMX_OPTS=%JMX_OPTS% -J-Djavax.net.ssl.trustStore="%TRUSTSTORE_PATH%" 
+set JMX_OPTS=%JMX_OPTS% -J-Djavax.net.ssl.trustStorePassword=%TRUSTSTORE_PASSWORD%
+
+"%JAVA_HOME%\bin\jconsole" %JMX_OPTS% %OTHER_ARGS%
+
+if "%OS%" == "Windows_NT" endlocal
+goto :eof
diff --git a/packaging/jetty-server/src/main/dist/bin/jmxPermissions.vbs b/packaging/jetty-server/src/main/dist/bin/jmxPermissions.vbs
new file mode 100644
index 0000000..0184607
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/bin/jmxPermissions.vbs
@@ -0,0 +1,81 @@
+configFolder = Wscript.Arguments.Item(0)
+
+'WScript.Echo "Fixing permissions on " & configFolder
+
+Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2") 'Load up WMI with the right dll
+
+Dim files(0)
+files(0) = "org.eclipse.virgo.kernel.jmxremote.access.properties"
+
+For Each file In files
+	updateInheritance(configFolder & file)
+	updateOwnership(configFolder & file)
+	updatePermissions(configFolder & file)
+Next 
+
+Sub updateInheritance(file)
+	'WScript.Echo "Updating inheritance of " & file
+	
+	Const SE_DACL_PRESENT = 4
+	Const SE_DACL_PROTECTED = 4096
+	Const SE_SELF_RELATIVE = 32768
+
+	Set objFileSecSetting = objWMIService.Get("Win32_LogicalFileSecuritySetting.Path='" & file & "'")
+    objFileSecSetting.GetSecurityDescriptor objSecurityDescriptor
+
+	objSecurityDescriptor.ControlFlags = SE_DACL_PRESENT + SE_DACL_PROTECTED + SE_SELF_RELATIVE
+
+	Set objMethod = objFileSecSetting.Methods_("SetSecurityDescriptor")
+	Set objInParam = objMethod.inParameters.SpawnInstance_()
+	objInParam.Properties_.item("Descriptor") = objSecurityDescriptor
+	objFileSecSetting.ExecMethod_ "SetSecurityDescriptor", objInParam
+	
+	'WScript.Echo "Updated inheritance of " & file
+End Sub
+
+Sub updateOwnership(file)
+	'WScript.Echo "Updating ownership of " & file
+	Set objDataFile = objWMIService.Get("CIM_DataFile.Name='" & file & "'")
+
+	Set objMethod = objDataFile.Methods_("TakeOwnerShipEx")
+	Set objInParam = objMethod.inParameters.SpawnInstance_()
+
+	objDataFile.ExecMethod_ "TakeOwnerShipEx", objInParam
+
+	'WScript.Echo "Updated ownership of " & file
+End Sub
+
+Sub updatePermissions(file)	
+	'WScript.Echo "Updating permissions of " & file
+	
+	Set objFileSecSetting = objWMIService.Get("Win32_LogicalFileSecuritySetting.Path='" & file & "'")
+    objFileSecSetting.GetSecurityDescriptor objSecurityDescriptor
+
+	Set WshNetwork = WScript.CreateObject("WScript.Network")
+	
+	Dim foundAce
+	foundAce = "false"
+	
+	'Search for an ACE for the current user as there is no robust, portable way of creating such an ACE from scratch in VBScript.
+	Dim specificAce(0)
+	For Each ace in objSecurityDescriptor.DACL
+		If ace.Trustee.Name = WshNetwork.UserName Then
+			Set specificAce(0) = ace
+			foundAce = "true"
+		End If
+	Next
+	
+	If foundAce = "true" Then
+		objSecurityDescriptor.DACL = specificAce
+
+		Set objMethod = objFileSecSetting.Methods_("SetSecurityDescriptor")
+		Set objInParam = objMethod.inParameters.SpawnInstance_()
+		objInParam.Properties_.item("Descriptor") = objSecurityDescriptor
+		objFileSecSetting.ExecMethod_ "SetSecurityDescriptor", objInParam
+		
+		'WScript.Echo "Updated permissions of " & file
+	Else
+		WScript.Echo "WARNING: jmxPermissions.vbs did not update the permissions of " & file & ". Check the file has the correct permissions."
+	End If
+	
+End Sub
diff --git a/packaging/jetty-server/src/main/dist/bin/setupClasspath.bat b/packaging/jetty-server/src/main/dist/bin/setupClasspath.bat
new file mode 100644
index 0000000..30e157c
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/bin/setupClasspath.bat
@@ -0,0 +1,31 @@
+@echo off
+rem Check JAVA_HOME and KERNEL_HOME variables
+if "%JAVA_HOME%" == "" (
+  echo The JAVA_HOME environment variable is not defined.
+  exit /B 1
+)
+if "%KERNEL_HOME%" == "" (
+  echo The KERNEL_HOME environment variable is not defined.
+  exit /B 1
+)
+
+rem Construct the CLASSPATH list from the Kernel lib directory.
+for %%G in ("%KERNEL_HOME%\lib\*.jar") do call :AppendToClasspath "%%G"
+for %%G in ("%KERNEL_HOME%\plugins\org.eclipse.osgi_*.jar") do call :AppendToClasspath "%%G"
+for %%G in ("%KERNEL_HOME%\plugins\org.eclipse.equinox.console.ssh_*.jar") do call :AppendToClasspath "%%G"
+
+rem Check if there are JAR files in the lib directory.
+if "%CLASSPATH%" == "" (
+  echo No JAR files found in %KERNEL_HOME%\lib
+  exit /B 1
+)
+
+rem Remove leading semi-colon if present
+if "%CLASSPATH:~0,1%"==";" set CLASSPATH=%CLASSPATH:~1%
+if "%FWCLASSPATH:~0,1%"=="," set FWCLASSPATH=%FWCLASSPATH:~1%
+exit /B 0
+
+:AppendToClasspath
+  set CLASSPATH=%CLASSPATH%;%~1
+  set FWCLASSPATH=%FWCLASSPATH%,file:///%~1
+  goto :eof
diff --git a/packaging/jetty-server/src/main/dist/bin/setupVars.bat b/packaging/jetty-server/src/main/dist/bin/setupVars.bat
new file mode 100644
index 0000000..a5d7772
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/bin/setupVars.bat
@@ -0,0 +1,31 @@
+@echo off
+rem Set up env vars needed for dmk.bat and jconsole.bat (with user-pluggable mods if present)
+
+if "%SCRIPT_DIR%"=="" (
+  echo Called setupVars.bat out of context.
+  exit /B 1
+)
+
+rem Derive KERNEL_HOME full path from script's parent (no backslash)
+  for %%I in ("%SCRIPT_DIR%..") do set KERNEL_HOME=%%~fsI
+
+rem Check files exist (exit if not)
+  set ChkLst="%KERNEL_HOME%\bin\setupClasspath.bat","%KERNEL_HOME%\bin\checkJava.bat"
+
+  for %%I in (%ChkLst%) do if not exist "%%~I" (
+    echo File "%%~I" does not exist but is required.
+    exit /B 1
+  )
+
+rem set up the classpath (check result)
+  call "%KERNEL_HOME%\bin\setupClasspath.bat"
+  if not "%ERRORLEVEL%" == "0" exit /B %ERRORLEVEL%
+
+rem Run Java Version check (uses JAVA_HOME) (check result)
+  call "%KERNEL_HOME%\bin\checkJava.bat"
+  if not "%ERRORLEVEL%" == "0" exit /B %ERRORLEVEL%
+	
+rem Execute user setenv script if needed (ignore result)
+  if exist "%KERNEL_HOME%\bin\setenv.bat" call "%KERNEL_HOME%\bin\setenv.bat"
+
+goto :eof
diff --git a/packaging/jetty-server/src/main/dist/bin/shutdown.bat b/packaging/jetty-server/src/main/dist/bin/shutdown.bat
new file mode 100644
index 0000000..a2a1ff4
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/bin/shutdown.bat
@@ -0,0 +1,8 @@
+@ECHO OFF
+IF "%OS%" == "Windows_NT" SETLOCAL
+
+SET SCRIPT_DIR=%~dp0%
+SET EXECUTABLE=dmk.bat
+
+call "%SCRIPT_DIR%%EXECUTABLE%" stop %*
+if not "%ERRORLEVEL%"=="0" exit /B %ERRORLEVEL%
diff --git a/packaging/jetty-server/src/main/dist/bin/startup.bat b/packaging/jetty-server/src/main/dist/bin/startup.bat
new file mode 100644
index 0000000..76e1618
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/bin/startup.bat
@@ -0,0 +1,8 @@
+@ECHO OFF
+IF "%OS%" == "Windows_NT" SETLOCAL
+
+SET SCRIPT_DIR=%~dp0%
+SET EXECUTABLE=dmk.bat
+
+call "%SCRIPT_DIR%%EXECUTABLE%" start %*
+if not "%ERRORLEVEL%"=="0" exit /B %ERRORLEVEL%
diff --git a/packaging/jetty-server/src/main/dist/configuration/etc/gosh_profile b/packaging/jetty-server/src/main/dist/configuration/etc/gosh_profile
new file mode 100644
index 0000000..f0c9b5e
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/configuration/etc/gosh_profile
@@ -0,0 +1,39 @@
+# default gosh_profile
+# only read if etc/gosh_profile doesn't exist relative to the System property
+# gosh.home or failing that the current directory.
+
+# catch all exceptions from this script to avoid it aborting startup
+try {
+
+  # ensure equinox commands are found first
+  SCOPE = equinox:*
+
+  # add methods on BundleContext object as commands
+  #addcommand context ${.context} (${.context} class)
+  # bug: above invokes (String, Object, String) instead of (String, Object, Class)
+  addcommand context ${.context}
+
+  # add methods on System object as commands
+  addcommand system (((${.context} bundles) 0) loadclass java.lang.System)
+
+  # alias to print full stack trace
+  e = { $exception printStackTrace }
+
+  ## disable console auto-formatting of each result
+  #  you will then need to explicitly use the 'format' command
+  #  to print the result of commands that don't write to stdout.
+  #.Gogo.format = false
+
+  ## disable printing the formatted result of a command into pipelines
+  #.Format.Pipe = false
+
+  # set prompt
+  prompt = 'osgi> '
+
+  # print welcome message
+  # cat ($0 resolve motd)
+} {
+    echo "$0: ERROR: $exception"
+}
+
+# end
diff --git a/packaging/jetty-server/src/main/dist/configuration/java-server.profile b/packaging/jetty-server/src/main/dist/configuration/java-server.profile
new file mode 100644
index 0000000..8d5c5a6
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/configuration/java-server.profile
@@ -0,0 +1,227 @@
+org.osgi.framework.system.packages = \
+ javax.accessibility,\
+ javax.activation,\
+ javax.activation;version="1.1.1",\
+ javax.activity,\
+ javax.annotation,\
+ javax.annotation;version="1.0.0",\
+ javax.annotation;version="1.1.0",\
+ 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;version="2.0",\
+ javax.jws.soap,\
+ javax.jws.soap;version="2.0",\
+ 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.script;version="1.1",\
+ 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.nimbus,\
+ 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;version="1.0.1",\
+ javax.transaction;version="1.1.0",\
+ javax.transaction.xa,\
+ javax.transaction.xa;version="1.0.1",\
+ javax.transaction.xa;version="1.1.0",\
+ javax.xml,\
+ javax.xml;version="1.0.1",\
+ javax.xml.bind,\
+ javax.xml.bind;version="2.0",\
+ javax.xml.bind.annotation,\
+ javax.xml.bind.annotation;version="2.0",\
+ javax.xml.bind.annotation.adapters,\
+ javax.xml.bind.annotation.adapters;version="2.0",\
+ javax.xml.bind.attachment,\
+ javax.xml.bind.attachment;version="2.0",\
+ javax.xml.bind.helpers,\
+ javax.xml.bind.helpers;version="2.0",\
+ javax.xml.bind.util,\
+ javax.xml.bind.util;version="2.0",\
+ javax.xml.crypto,\
+ javax.xml.crypto;version="1.0",\
+ javax.xml.crypto.dom,\
+ javax.xml.crypto.dom;version="1.0",\
+ javax.xml.crypto.dsig,\
+ javax.xml.crypto.dsig;version="1.0",\
+ javax.xml.crypto.dsig.dom,\
+ javax.xml.crypto.dsig.dom;version="1.0",\
+ javax.xml.crypto.dsig.keyinfo,\
+ javax.xml.crypto.dsig.keyinfo;version="1.0",\
+ javax.xml.crypto.dsig.spec,\
+ javax.xml.crypto.dsig.spec;version="1.0",\
+ javax.xml.datatype,\
+ javax.xml.namespace,\
+ javax.xml.parsers,\
+ javax.xml.soap,\
+ javax.xml.soap;version="1.3.0",\
+ javax.xml.stream,\
+ javax.xml.stream;version="1.0.1",\
+ javax.xml.stream.events,\
+ javax.xml.stream.events;version="1.0.1",\
+ javax.xml.stream.util,\
+ javax.xml.stream.util;version="1.0.1",\
+ 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;version="2.1.1",\
+ javax.xml.ws.handler,\
+ javax.xml.ws.handler;version="2.1.1",\
+ javax.xml.ws.handler.soap,\
+ javax.xml.ws.handler.soap;version="2.1.1",\
+ javax.xml.ws.http,\
+ javax.xml.ws.http;version="2.1.1",\
+ javax.xml.ws.soap,\
+ javax.xml.ws.soap;version="2.1.1",\
+ javax.xml.ws.spi,\
+ javax.xml.ws.spi;version="2.1.1",\
+ javax.xml.ws.spi.http,\
+ javax.xml.ws.spi.http;version="2.1.1",\
+ javax.xml.ws.wsaddressing,\
+ javax.xml.ws.wsaddressing;version="2.1.1",\
+ javax.xml.xpath,\
+ org.eclipse.virgo.kernel.equinox.extensions,\
+ org.eclipse.virgo.kernel.equinox.extensions;version="3.7.0",\
+ org.eclipse.virgo.kernel.equinox.extensions.hooks,\
+ org.eclipse.virgo.kernel.equinox.extensions.hooks;version="3.7.0",\
+ 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.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
+org.osgi.framework.bootdelegation = \
+ org.eclipse.virgo.nano.authentication,\
+ javax.*,\
+ javax.xml.*,\
+ org.apache.xerces.jaxp.*,\
+ org.ietf.jgss,\
+ org.omg.*,\
+ org.w3c.*,\
+ org.xml.*,\
+ sun.*,\
+ com.sun.*
+org.osgi.framework.executionenvironment = \
+ OSGi/Minimum-1.0,\
+ OSGi/Minimum-1.1,\
+ OSGi/Minimum-1.2,\
+ JRE-1.1,\
+ J2SE-1.2,\
+ J2SE-1.3,\
+ J2SE-1.4,\
+ J2SE-1.5,\
+ JavaSE-1.6,\
+ JavaSE-1.7
+org.osgi.framework.system.capabilities = \
+ osgi.ee; osgi.ee="OSGi/Minimum"; version:List<Version>="1.0, 1.1, 1.2",\
+ osgi.ee; osgi.ee="JRE"; version:List<Version>="1.0, 1.1",\
+ osgi.ee; osgi.ee="JavaSE"; version:List<Version>="1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7"
+osgi.java.profile.name = Virgo-Java7
diff --git a/packaging/jetty-server/src/main/dist/configuration/keystore b/packaging/jetty-server/src/main/dist/configuration/keystore
new file mode 100644
index 0000000..9684caa
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/configuration/keystore
Binary files differ
diff --git a/packaging/jetty-server/src/main/dist/configuration/org.eclipse.virgo.kernel.authentication.config b/packaging/jetty-server/src/main/dist/configuration/org.eclipse.virgo.kernel.authentication.config
new file mode 100644
index 0000000..44c5d21
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/configuration/org.eclipse.virgo.kernel.authentication.config
@@ -0,0 +1,6 @@
+virgo-kernel {
+	org.eclipse.virgo.nano.authentication.KernelLoginModule REQUIRED;
+};
+equinox_console {
+	org.eclipse.virgo.nano.authentication.KernelLoginModule REQUIRED;
+};
diff --git a/packaging/jetty-server/src/main/dist/configuration/org.eclipse.virgo.kernel.jmxremote.access.properties b/packaging/jetty-server/src/main/dist/configuration/org.eclipse.virgo.kernel.jmxremote.access.properties
new file mode 100644
index 0000000..ba89979
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/configuration/org.eclipse.virgo.kernel.jmxremote.access.properties
@@ -0,0 +1 @@
+admin=readwrite
diff --git a/packaging/jetty-server/src/main/dist/configuration/org.eclipse.virgo.kernel.properties b/packaging/jetty-server/src/main/dist/configuration/org.eclipse.virgo.kernel.properties
new file mode 100644
index 0000000..c72631f
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/configuration/org.eclipse.virgo.kernel.properties
@@ -0,0 +1,9 @@
+########################
+# Deployer Configuration
+########################
+# Note: use 0 to disable deployment timeouts
+deployer.timeout=300
+deployer.pickupDirectory=pickup
+deployer.scanIntervalMillis=1000
+deployer.unpackBundles=true
+
diff --git a/packaging/jetty-server/src/main/dist/configuration/org.eclipse.virgo.kernel.users.properties b/packaging/jetty-server/src/main/dist/configuration/org.eclipse.virgo.kernel.users.properties
new file mode 100644
index 0000000..7ab19e1
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/configuration/org.eclipse.virgo.kernel.users.properties
@@ -0,0 +1,9 @@
+##################
+# User definitions
+##################
+user.admin=admin
+
+##################
+# Role definitions
+##################
+role.admin=admin
diff --git a/packaging/jetty-server/src/main/dist/configuration/org.eclipse.virgo.medic.properties b/packaging/jetty-server/src/main/dist/configuration/org.eclipse.virgo.medic.properties
new file mode 100644
index 0000000..5c5f1cf
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/configuration/org.eclipse.virgo.medic.properties
@@ -0,0 +1,7 @@
+dump.root.directory=serviceability/dump
+log.wrapSysOut=true
+log.wrapSysErr=true
+log.dump.level=DEBUG
+log.dump.bufferSize=10000
+log.dump.pattern=[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-28.28thread %-64.64logger{64} %X{medic.eventCode} %msg %ex%n
+log.jul.consoleHandler=false
diff --git a/packaging/jetty-server/src/main/dist/configuration/org.eclipse.virgo.repository.properties b/packaging/jetty-server/src/main/dist/configuration/org.eclipse.virgo.repository.properties
new file mode 100644
index 0000000..5e7de2b
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/configuration/org.eclipse.virgo.repository.properties
@@ -0,0 +1,7 @@
+ext.type=external
+ext.searchPattern=repository/ext/{artifact}
+
+usr.type=watched
+usr.watchDirectory=repository/usr
+
+chain=ext,usr
diff --git a/packaging/jetty-server/src/main/dist/configuration/osgi.console.properties b/packaging/jetty-server/src/main/dist/configuration/osgi.console.properties
new file mode 100644
index 0000000..5400fc1
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/configuration/osgi.console.properties
@@ -0,0 +1,6 @@
+telnet.enabled=false
+telnet.port=2401
+telnet.host=localhost
+ssh.enabled=false
+ssh.port=2402
+ssh.host=localhost
\ No newline at end of file
diff --git a/packaging/jetty-server/src/main/dist/configuration/serviceability.xml b/packaging/jetty-server/src/main/dist/configuration/serviceability.xml
new file mode 100644
index 0000000..05e9d49
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/configuration/serviceability.xml
@@ -0,0 +1,81 @@
+<configuration>
+
+	<jmxConfigurator />
+
+	<contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"/>
+
+	<appender name="SIFTED_LOG_FILE" class="ch.qos.logback.classic.sift.SiftingAppender">
+		<discriminator>
+			<Key>applicationName</Key>
+			<DefaultValue>virgo-jetty-server</DefaultValue>
+		</discriminator>
+		<sift>
+			<appender name="${applicationName}_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+				<file>serviceability/logs/${applicationName}/log.log</file>
+				<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+					<FileNamePattern>serviceability/logs/${applicationName}/log_%i.log</FileNamePattern>
+					<MinIndex>1</MinIndex>
+					<MaxIndex>4</MaxIndex>
+				</rollingPolicy>
+				<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+					<MaxFileSize>10MB</MaxFileSize>
+				</triggeringPolicy>
+				<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+					<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-5level %-28.28thread %-64.64logger{64} %X{medic.eventCode} %msg %ex%n</Pattern>
+				</encoder>
+			</appender>
+		</sift>
+	</appender>
+	
+	<appender name="LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<file>serviceability/logs/log.log</file>
+		<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+			<FileNamePattern>serviceability/logs/log_%i.log</FileNamePattern>
+			<MinIndex>1</MinIndex>
+			<MaxIndex>4</MaxIndex>
+		</rollingPolicy>
+		<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+			<MaxFileSize>10MB</MaxFileSize>
+		</triggeringPolicy>
+		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+			<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-5level %-28.28thread %-64.64logger{64} %X{medic.eventCode} %msg %ex%n</Pattern>
+		</encoder>
+	</appender>
+
+	<appender name="EVENT_LOG_STDOUT" class="org.eclipse.virgo.medic.log.logback.ReroutingAwareConsoleAppender">
+		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+			<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-28.28thread &lt;%X{medic.eventCode}&gt; %msg %ex%n</Pattern>
+		</encoder>
+	</appender>
+
+	<appender name="EVENT_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<file>serviceability/eventlogs/eventlog.log</file>
+		<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+			<FileNamePattern>serviceability/eventlogs/eventlog_%i.log</FileNamePattern>
+			<MinIndex>1</MinIndex>
+			<MaxIndex>4</MaxIndex>
+		</rollingPolicy>
+		<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+			<MaxFileSize>10MB</MaxFileSize>
+		</triggeringPolicy>
+		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+			<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-28.28thread &lt;%X{medic.eventCode}&gt; %msg %ex%n</Pattern>
+		</encoder>
+	</appender>
+
+	<logger level="INFO" additivity="false" name="org.eclipse.virgo.medic.eventlog.localized">
+		<appender-ref ref="EVENT_LOG_STDOUT" />
+		<appender-ref ref="EVENT_LOG_FILE" />
+	</logger>
+	
+	<logger level="INFO" additivity="false" name="org.eclipse.virgo.medic.eventlog.default">
+		<appender-ref ref="SIFTED_LOG_FILE" />
+		<appender-ref ref="LOG_FILE" />
+	</logger>
+
+	<root level="INFO">
+		<appender-ref ref="SIFTED_LOG_FILE" />
+		<appender-ref ref="LOG_FILE" />
+	</root>
+
+</configuration>
diff --git a/packaging/jetty-server/src/main/dist/epl-v10.html b/packaging/jetty-server/src/main/dist/epl-v10.html
new file mode 100644
index 0000000..eecc800
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/epl-v10.html
@@ -0,0 +1,258 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!-- saved from url=(0049)http://www.eclipse.org/org/documents/epl-v10.html -->
+<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+
+<TITLE>Eclipse Public License - Version 1.0</TITLE>
+<STYLE type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </STYLE>
+
+</HEAD><BODY lang="EN-US">
+
+<H2>Eclipse Public License - v 1.0</H2>
+
+<P>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</P>
+
+<P><B>1. DEFINITIONS</B></P>
+
+<P>"Contribution" means:</P>
+
+<P class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</P>
+<P class="list">b) in the case of each subsequent Contributor:</P>
+<P class="list">i) changes to the Program, and</P>
+<P class="list">ii) additions to the Program;</P>
+<P class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</P>
+
+<P>"Contributor" means any person or entity that distributes
+the Program.</P>
+
+<P>"Licensed Patents" mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</P>
+
+<P>"Program" means the Contributions distributed in accordance
+with this Agreement.</P>
+
+<P>"Recipient" means anyone who receives the Program under
+this Agreement, including all Contributors.</P>
+
+<P><B>2. GRANT OF RIGHTS</B></P>
+
+<P class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</P>
+
+<P class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</P>
+
+<P class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</P>
+
+<P class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</P>
+
+<P><B>3. REQUIREMENTS</B></P>
+
+<P>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</P>
+
+<P class="list">a) it complies with the terms and conditions of this
+Agreement; and</P>
+
+<P class="list">b) its license agreement:</P>
+
+<P class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</P>
+
+<P class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</P>
+
+<P class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</P>
+
+<P class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</P>
+
+<P>When the Program is made available in source code form:</P>
+
+<P class="list">a) it must be made available under this Agreement; and</P>
+
+<P class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</P>
+
+<P>Contributors may not remove or alter any copyright notices contained
+within the Program.</P>
+
+<P>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</P>
+
+<P><B>4. COMMERCIAL DISTRIBUTION</B></P>
+
+<P>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+("Commercial Contributor") hereby agrees to defend and
+indemnify every other Contributor ("Indemnified Contributor")
+against any losses, damages and costs (collectively "Losses")
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</P>
+
+<P>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</P>
+
+<P><B>5. NO WARRANTY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</P>
+
+<P><B>6. DISCLAIMER OF LIABILITY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</P>
+
+<P><B>7. GENERAL</B></P>
+
+<P>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</P>
+
+<P>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</P>
+
+<P>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</P>
+
+<P>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</P>
+
+<P>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</P>
+
+
+
+
+</BODY></HTML>
\ No newline at end of file
diff --git a/packaging/jetty-server/src/main/dist/jetty/etc/jetty.xml b/packaging/jetty-server/src/main/dist/jetty/etc/jetty.xml
new file mode 100644
index 0000000..4851924
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/jetty/etc/jetty.xml
@@ -0,0 +1,210 @@
+<?xml version="1.0"?>
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
+
+
+<!-- =============================================================== -->
+<!-- Configure the Jetty Server                                      -->
+<!--                                                                 -->
+<!-- Documentation of this file format can be found at:              -->
+<!-- http://wiki.eclipse.org/Jetty/Reference/jetty.xml_syntax        -->
+<!-- =============================================================== -->
+
+<Configure id="Server" class="org.eclipse.jetty.server.Server">
+
+	<!-- jetty.xml -->
+
+    <!-- =========================================================== -->
+    <!-- Server Thread Pool                                          -->
+    <!-- =========================================================== -->
+    <Set name="ThreadPool">
+      <!-- Default queued blocking threadpool -->
+      <New class="org.eclipse.jetty.util.thread.QueuedThreadPool">
+        <Set name="minThreads">10</Set>
+        <Set name="maxThreads">200</Set>
+        <Set name="detailedDump">false</Set>
+      </New>
+    </Set>
+
+
+    <!-- =========================================================== -->
+    <!-- Set handler Collection Structure                            --> 
+    <!-- =========================================================== -->
+    <Set name="handler">
+      <New id="Handlers" class="org.eclipse.jetty.server.handler.HandlerCollection">
+        <Set name="handlers">
+         <Array type="org.eclipse.jetty.server.Handler">
+           <Item>
+             <New id="Contexts" class="org.eclipse.jetty.server.handler.ContextHandlerCollection"/>
+           </Item>
+           <Item>
+             <New id="DefaultHandler" class="org.eclipse.jetty.server.handler.DefaultHandler"/>
+           </Item>
+           <Item>
+             <New id="RequestLog" class="org.eclipse.jetty.server.handler.RequestLogHandler"/>
+           </Item>
+         </Array>
+        </Set>
+      </New>
+    </Set>
+
+
+    <!-- =========================================================== -->
+    <!-- extra options                                               -->
+    <!-- =========================================================== -->
+    <Set name="stopAtShutdown">true</Set>
+    <Set name="sendServerVersion">true</Set>
+    <Set name="sendDateHeader">true</Set>
+    <Set name="gracefulShutdown">1000</Set>
+    <Set name="dumpAfterStart">false</Set>
+    <Set name="dumpBeforeStop">false</Set>
+
+
+    <!-- =========================================================== -->
+    <!-- Add connector                                               -->
+    <!-- =========================================================== -->
+
+    <Call name="addConnector">
+      <Arg>
+          <New class="org.eclipse.jetty.server.nio.SelectChannelConnector">
+            <Set name="host"><Property name="jetty.host" /></Set>
+            <Set name="port"><Property name="jetty.port" default="8080"/></Set>
+            <Set name="maxIdleTime">300000</Set>
+            <Set name="Acceptors">2</Set>
+            <Set name="statsOn">false</Set>
+            <Set name="confidentialPort">8443</Set>
+        <Set name="lowResourcesConnections">20000</Set>
+        <Set name="lowResourcesMaxIdleTime">5000</Set>
+          </New>
+      </Arg>
+    </Call>
+
+	<Call name="addConnector">
+		<Arg>
+			<New class="org.eclipse.jetty.server.ssl.SslSelectChannelConnector">
+				<Set name="Port">
+					<Property name="jetty.port.ssl" default="8443"/>
+				</Set>
+				<Set name="maxIdleTime">30000</Set>
+				<Set name="Acceptors">2</Set>
+				<Set name="AcceptQueueSize">100</Set>
+				<Set name="Keystore"><Property name="jetty.home" default="."/>/etc/keystore</Set>
+				<Set name="Password">OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4</Set>
+				<Set name="KeyPassword">OBF:1u2u1wml1z7s1z7a1wnl1u2g</Set>
+				<Set name="truststore"><Property name="jetty.home" default="."/>/etc/keystore</Set>
+				<Set name="trustPassword">OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4</Set>
+			</New>
+		</Arg>
+	</Call>
+
+	<!-- jetty-deployer.xml -->
+
+    <!-- =========================================================== -->
+    <!-- Configure the deployment manager                            -->
+    <!-- =========================================================== -->
+    <Call name="addBean">
+      <Arg>
+        <New id="DeploymentManager" class="org.eclipse.jetty.deploy.DeploymentManager">
+          <Set name="useStandardBindings">false</Set>
+          <Set name="lifeCycleBindings">
+            <Array type="org.eclipse.jetty.deploy.AppLifeCycle$Binding">
+              <Item>
+                <New class="org.eclipse.jetty.osgi.boot.OSGiDeployer"/>
+              </Item>
+              <Item>
+               <New class="org.eclipse.jetty.deploy.bindings.StandardStarter"/>
+              </Item>
+              <Item>
+                <New class="org.eclipse.jetty.deploy.bindings.StandardStopper"/>
+              </Item>
+              <Item>
+              <New class="org.eclipse.jetty.osgi.boot.OSGiUndeployer"/>
+              </Item>
+            </Array>
+          </Set>
+          <Set name="contexts">
+            <Ref id="Contexts" />
+          </Set>
+          <Call name="setContextAttribute">
+            <Arg>org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern</Arg>
+            <Arg>.*/jsp-api-[^/]*\.jar$|.*/jsp-[^/]*\.jar$</Arg>
+          </Call>
+          <!-- Providers of OSGi Apps -->
+          <!-- Call name="addAppProvider" -->
+            <!-- Arg -->
+              <!-- New class="org.eclipse.jetty.osgi.boot.OSGiAppProvider" -->
+              <!--
+                <Set name="defaultsDescriptor"><Property name="jetty.home" default="."/>/etc/webdefault.xml</Set>
+              -->
+              <!--
+                <Set name="scanInterval">5</Set>
+                <Set name="contextXmlDir"><Property name="jetty.home" default="." />/contexts</Set>
+                -->
+                <!-- comma separated list of bundle symbolic names that contain custom tag libraries (*.tld files) -->
+                <!-- if those bundles don't exist or can't be loaded no errors or warning will be issued!          -->
+                <!-- This default value plugs in the tld files of the reference implementation of JSF              -->
+                <!--
+                 <Set name="tldBundles"><Property name="org.eclipse.jetty.osgi.tldbundles" default="javax.faces.jsf-impl" /></Set>
+              </New>
+            </Arg>
+          </Call>
+          -->
+        </New>
+      </Arg>
+    </Call>
+
+	<!-- =========================================================== -->
+	<!-- Enable support for tlds in other bundles                    -->
+	<!-- =========================================================== -->
+	<Call name="setAttribute">
+          <Arg>org.eclipse.jetty.webapp.configuration</Arg>
+          <Arg>
+            <Array id="plusConfigOSGi" type="java.lang.String">
+              <Item>org.eclipse.jetty.webapp.WebInfConfiguration</Item>
+              <Item>org.eclipse.jetty.webapp.WebXmlConfiguration</Item>
+              <Item>org.eclipse.jetty.webapp.MetaInfConfiguration</Item>
+              <Item>org.eclipse.jetty.webapp.FragmentConfiguration</Item>
+              <Item>org.eclipse.jetty.webapp.JettyWebXmlConfiguration</Item>
+              <Item>org.eclipse.jetty.osgi.boot.jsp.TagLibOSGiConfiguration</Item>
+            </Array>
+          </Arg>
+	</Call>
+
+	<!-- =========================================================== -->
+	<!-- Configure Authentication Login Service                      -->
+	<!-- Realms may be configured for the entire server here, or     -->
+	<!-- they can be configured for a specific web app in a context  -->
+	<!-- configuration (see $(jetty.home)/contexts/test.xml for an   -->
+	<!-- example).                                                   -->
+	<!-- =========================================================== -->
+	<Call name="addBean">
+		<Arg>
+			<New class="org.eclipse.jetty.security.HashLoginService">
+				<Set name="name">Virgo Admin Console</Set>
+				<Set name="config"><Property name="jetty.home" default="."/>/etc/realm.properties</Set>
+				<Set name="refreshInterval">0</Set>
+			</New>
+		</Arg>
+	</Call>
+	
+	<!-- =========================================================== -->
+	<!-- Configure Request Log                                       -->
+	<!-- Request logs  may be configured for the entire server here, -->
+	<!-- or they can be configured for a specific web app in a       -->
+	<!-- contexts configuration (see $(jetty.home)/contexts/test.xml -->
+	<!-- for an example).                                            -->
+	<!-- =========================================================== -->
+	<Ref id="RequestLog">
+		<Set name="requestLog">
+			<New id="RequestLogImpl" class="org.eclipse.jetty.server.NCSARequestLog">
+				<Set name="filename"><Property name="jetty.home" default="."/>/logs/yyyy_mm_dd.request.log</Set>
+				<Set name="filenameDateFormat">yyyy_MM_dd</Set>
+				<Set name="retainDays">90</Set>
+				<Set name="append">true</Set>
+				<Set name="extended">false</Set>
+				<Set name="logCookies">false</Set>
+				<Set name="LogTimeZone">GMT</Set>
+			</New>
+		</Set>
+	</Ref>
+
+</Configure>
diff --git a/packaging/jetty-server/src/main/dist/jetty/etc/keystore b/packaging/jetty-server/src/main/dist/jetty/etc/keystore
new file mode 100644
index 0000000..08f6cda
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/jetty/etc/keystore
Binary files differ
diff --git a/packaging/jetty-server/src/main/dist/jetty/etc/realm.properties b/packaging/jetty-server/src/main/dist/jetty/etc/realm.properties
new file mode 100644
index 0000000..9ebdf2d
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/jetty/etc/realm.properties
@@ -0,0 +1,17 @@
+#
+# This file defines users passwords and roles for a HashUserRealm
+#
+# The format is
+#  <username>: <password>[,<rolename> ...]
+#
+# Passwords may be clear text, obfuscated or checksummed.  The class 
+# org.eclipse.util.Password should be used to generate obfuscated
+# passwords or password checksums
+#
+# If DIGEST Authentication is used, the password must be in a recoverable
+# format, either plain text or OBF:.
+#
+admin: OBF:1u2a1toa1w8v1tok1u30,user,admin
+
+# This entry is for digest auth.  The credential is a MD5 hash of username:realmname:password
+digest: MD5:6e120743ad67abfbc385bc2bb754e297,user
diff --git a/packaging/jetty-server/src/main/dist/jetty/etc/webdefault.xml b/packaging/jetty-server/src/main/dist/jetty/etc/webdefault.xml
new file mode 100644
index 0000000..482b12d
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/jetty/etc/webdefault.xml
@@ -0,0 +1,426 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<!-- ===================================================================== -->
+<!-- This file contains the default descriptor for web applications.       -->
+<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+<!-- The intent of this descriptor is to include jetty specific or common  -->
+<!-- configuration for all webapps.   If a context has a webdefault.xml    -->
+<!-- descriptor, it is applied before the contexts own web.xml file        -->
+<!--                                                                       -->
+<!-- A context may be assigned a default descriptor by:                    -->
+<!--  + Calling WebApplicationContext.setDefaultsDescriptor                -->
+<!--  + Passed an arg to addWebApplications                                -->
+<!--                                                                       -->
+<!-- This file is used both as the resource within the jetty.jar (which is -->
+<!-- used as the default if no explicit defaults descriptor is set) and it -->
+<!-- is copied to the etc directory of the Jetty distro and explicitly     -->
+<!-- by the jetty.xml file.                                                -->
+<!--                                                                       -->
+<!-- ===================================================================== -->
+<web-app 
+   xmlns="http://java.sun.com/xml/ns/javaee" 
+   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
+   metadata-complete="true"
+   version="2.5"> 
+
+  <description>
+    Default web.xml file.  
+    This file is applied to a Web application before it's own WEB_INF/web.xml file
+  </description>
+
+  <!-- ==================================================================== -->
+  <!-- Removes static references to beans from javax.el.BeanELResolver to   -->
+  <!-- ensure webapp classloader can be released on undeploy                -->
+  <!-- ==================================================================== -->
+  <listener>
+   <listener-class>org.eclipse.jetty.servlet.listener.ELContextCleaner</listener-class>
+  </listener>
+  
+  <!-- ==================================================================== -->
+  <!-- Removes static cache of Methods from java.beans.Introspector to      -->
+  <!-- ensure webapp classloader can be released on undeploy                -->
+  <!-- ==================================================================== -->  
+  <listener>
+   <listener-class>org.eclipse.jetty.servlet.listener.IntrospectorCleaner</listener-class>
+  </listener>
+  
+
+  <!-- ==================================================================== -->
+  <!-- Context params to control Session Cookies                            -->
+  <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
+  <!-- UNCOMMENT TO ACTIVATE
+  <context-param>
+    <param-name>org.eclipse.jetty.servlet.SessionDomain</param-name>
+    <param-value>127.0.0.1</param-value>
+  </context-param>
+
+  <context-param>
+    <param-name>org.eclipse.jetty.servlet.SessionPath</param-name>
+    <param-value>/</param-value>
+  </context-param>
+
+  <context-param>
+    <param-name>org.eclipse.jetty.servlet.MaxAge</param-name>
+    <param-value>-1</param-value>
+  </context-param>
+  -->
+
+
+  <!-- ==================================================================== -->
+  <!-- The default servlet.                                                 -->
+  <!-- This servlet, normally mapped to /, provides the handling for static -->
+  <!-- content, OPTIONS and TRACE methods for the context.                  -->
+  <!-- The following initParameters are supported:                          -->
+  <!--                                                                      -->
+  <!--   acceptRanges     If true, range requests and responses are         -->
+  <!--                    supported                                         -->
+  <!--                                                                      -->
+  <!--   dirAllowed       If true, directory listings are returned if no    -->
+  <!--                    welcome file is found. Else 403 Forbidden.        -->
+  <!--                                                                      -->
+  <!--   welcomeServlets  If true, attempt to dispatch to welcome files     -->
+  <!--                    that are servlets, if no matching static          -->
+  <!--                    resources can be found.                           -->
+  <!--                                                                      -->
+  <!--   redirectWelcome  If true, redirect welcome file requests           -->
+  <!--                    else use request dispatcher forwards              -->
+  <!--                                                                      -->
+  <!--   gzip             If set to true, then static content will be served--> 
+  <!--                    as gzip content encoded if a matching resource is -->
+  <!--                    found ending with ".gz"                           -->
+  <!--                                                                      -->
+  <!--   resoureBase      Can be set to replace the context resource base   -->
+  <!--                                                                      -->
+  <!--   relativeResourceBase                                               -->
+  <!--                    Set with a pathname relative to the base of the   -->
+  <!--                    servlet context root. Useful for only serving     -->
+  <!--                    static content from only specific subdirectories. -->
+  <!--                                                                      -->
+  <!--   useFileMappedBuffer                                                -->
+  <!--                    If set to true (the default), a  memory mapped    -->
+  <!--                    file buffer will be used to serve static content  -->
+  <!--                    when using an NIO connector. Setting this value   -->
+  <!--                    to false means that a direct buffer will be used  -->
+  <!--                    instead. If you are having trouble with Windows   -->
+  <!--                    file locking, set this to false.                  -->
+  <!--                                                                      -->
+  <!--  cacheControl      If set, all static content will have this value   -->
+  <!--                    set as the cache-control header.                  -->
+  <!--                                                                      -->
+  <!--  maxCacheSize      Maximum size of the static resource cache         -->
+  <!--                                                                      -->
+  <!--  maxCachedFileSize Maximum size of any single file in the cache      -->
+  <!--                                                                      -->
+  <!--  maxCachedFiles    Maximum number of files in the cache              -->
+  <!--                                                                      -->
+  <!--  cacheType         "nio", "bio" or "both" to determine the type(s)   -->
+  <!--                    of resource cache. A bio cached buffer may be used-->
+  <!--                    by nio but is not as efficient as a nio buffer.   -->
+  <!--                    An nio cached buffer may not be used by bio.      -->
+  <!--                                                                      -->
+  <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
+  <servlet>
+    <servlet-name>default</servlet-name>
+    <servlet-class>org.eclipse.jetty.servlet.DefaultServlet</servlet-class>
+    <init-param>
+      <param-name>aliases</param-name>
+      <param-value>false</param-value>
+    </init-param>
+    <init-param>
+      <param-name>acceptRanges</param-name>
+      <param-value>true</param-value>
+    </init-param>
+    <init-param>
+      <param-name>dirAllowed</param-name>
+      <param-value>true</param-value>
+    </init-param>
+    <init-param>
+      <param-name>welcomeServlets</param-name>
+        <param-value>false</param-value>
+      </init-param>
+    <init-param>
+      <param-name>redirectWelcome</param-name>
+      <param-value>false</param-value>
+    </init-param>
+    <init-param>
+      <param-name>maxCacheSize</param-name>
+      <param-value>256000000</param-value>
+    </init-param>
+    <init-param>
+      <param-name>maxCachedFileSize</param-name>
+      <param-value>10000000</param-value>
+    </init-param>
+    <init-param>
+      <param-name>maxCachedFiles</param-name>
+      <param-value>2048</param-value>
+    </init-param>
+    <init-param>
+      <param-name>gzip</param-name>
+      <param-value>true</param-value>
+    </init-param>
+    <init-param>
+      <param-name>useFileMappedBuffer</param-name>
+      <param-value>false</param-value>
+    </init-param>
+    <!--
+    <init-param>
+      <param-name>resourceCache</param-name>
+      <param-value>resourceCache</param-value>
+    </init-param>
+    -->
+    <!--
+    <init-param>
+      <param-name>cacheControl</param-name>
+      <param-value>max-age=3600,public</param-value>
+    </init-param>
+    -->
+    <load-on-startup>0</load-on-startup>
+  </servlet> 
+
+  <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
+  
+
+  <!-- ==================================================================== -->
+  <!-- JSP Servlet                                                          -->
+  <!-- This is the jasper JSP servlet from the jakarta project              -->
+  <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
+  <!-- The JSP page compiler and execution servlet, which is the mechanism  -->
+  <!-- used by Glassfish to support JSP pages.  Traditionally, this servlet -->
+  <!-- is mapped to URL patterh "*.jsp".  This servlet supports the         -->
+  <!-- following initialization parameters (default values are in square    -->
+  <!-- brackets):                                                           -->
+  <!--                                                                      -->
+  <!--   checkInterval       If development is false and reloading is true, -->
+  <!--                       background compiles are enabled. checkInterval -->
+  <!--                       is the time in seconds between checks to see   -->
+  <!--                       if a JSP page needs to be recompiled. [300]    -->
+  <!--                                                                      -->
+  <!--   compiler            Which compiler Ant should use to compile JSP   -->
+  <!--                       pages.  See the Ant documenation for more      -->
+  <!--                       information. [javac]                           -->
+  <!--                                                                      -->
+  <!--   classdebuginfo      Should the class file be compiled with         -->
+  <!--                       debugging information?  [true]                 -->
+  <!--                                                                      -->
+  <!--   classpath           What class path should I use while compiling   -->
+  <!--                       generated servlets?  [Created dynamically      -->
+  <!--                       based on the current web application]          -->
+  <!--                       Set to ? to make the container explicitly set  -->
+  <!--                       this parameter.                                -->
+  <!--                                                                      -->
+  <!--   development         Is Jasper used in development mode (will check -->
+  <!--                       for JSP modification on every access)?  [true] -->
+  <!--                                                                      -->
+  <!--   enablePooling       Determines whether tag handler pooling is      -->
+  <!--                       enabled  [true]                                -->
+  <!--                                                                      -->
+  <!--   fork                Tell Ant to fork compiles of JSP pages so that -->
+  <!--                       a separate JVM is used for JSP page compiles   -->
+  <!--                       from the one Tomcat is running in. [true]      -->
+  <!--                                                                      -->
+  <!--   ieClassId           The class-id value to be sent to Internet      -->
+  <!--                       Explorer when using <jsp:plugin> tags.         -->
+  <!--                       [clsid:8AD9C840-044E-11D1-B3E9-00805F499D93]   -->
+  <!--                                                                      -->
+  <!--   javaEncoding        Java file encoding to use for generating java  -->
+  <!--                       source files. [UTF-8]                          -->
+  <!--                                                                      -->
+  <!--   keepgenerated       Should we keep the generated Java source code  -->
+  <!--                       for each page instead of deleting it? [true]   -->
+  <!--                                                                      -->
+  <!--   logVerbosityLevel   The level of detailed messages to be produced  -->
+  <!--                       by this servlet.  Increasing levels cause the  -->
+  <!--                       generation of more messages.  Valid values are -->
+  <!--                       FATAL, ERROR, WARNING, INFORMATION, and DEBUG. -->
+  <!--                       [WARNING]                                      -->
+  <!--                                                                      -->
+  <!--   mappedfile          Should we generate static content with one     -->
+  <!--                       print statement per input line, to ease        -->
+  <!--                       debugging?  [false]                            -->
+  <!--                                                                      -->
+  <!--                                                                      -->
+  <!--   reloading           Should Jasper check for modified JSPs?  [true] -->
+  <!--                                                                      -->
+  <!--   suppressSmap        Should the generation of SMAP info for JSR45   -->
+  <!--                       debugging be suppressed?  [false]              -->
+  <!--                                                                      -->
+  <!--   dumpSmap            Should the SMAP info for JSR45 debugging be    -->
+  <!--                       dumped to a file? [false]                      -->
+  <!--                       False if suppressSmap is true                  -->
+  <!--                                                                      -->
+  <!--   scratchdir          What scratch directory should we use when      -->
+  <!--                       compiling JSP pages?  [default work directory  -->
+  <!--                       for the current web application]               -->
+  <!--                                                                      -->
+  <!--   tagpoolMaxSize      The maximum tag handler pool size  [5]         -->
+  <!--                                                                      -->
+  <!--   xpoweredBy          Determines whether X-Powered-By response       -->
+  <!--                       header is added by generated servlet  [false]  -->
+  <!--                                                                      -->
+  <!-- If you wish to use Jikes to compile JSP pages:                       -->
+  <!--   Set the init parameter "compiler" to "jikes".  Define              -->
+  <!--   the property "-Dbuild.compiler.emacs=true" when starting Jetty     -->
+  <!--   to cause Jikes to emit error messages in a format compatible with  -->
+  <!--   Jasper.                                                            -->
+  <!--   If you get an error reporting that jikes can't use UTF-8 encoding, -->
+  <!--   try setting the init parameter "javaEncoding" to "ISO-8859-1".     -->
+  <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
+  <servlet id="jsp">
+    <servlet-name>jsp</servlet-name>
+    <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
+    <init-param>
+        <param-name>logVerbosityLevel</param-name>
+        <param-value>DEBUG</param-value>
+    </init-param>
+    <init-param>
+        <param-name>fork</param-name>
+        <param-value>false</param-value>
+    </init-param>
+    <init-param>
+        <param-name>xpoweredBy</param-name>
+        <param-value>false</param-value>
+    </init-param>
+    <!--  
+    <init-param>
+        <param-name>classpath</param-name>
+        <param-value>?</param-value>
+    </init-param>
+    -->
+    <load-on-startup>0</load-on-startup>
+  </servlet>
+
+  <servlet-mapping> 
+    <servlet-name>jsp</servlet-name> 
+    <url-pattern>*.jsp</url-pattern> 
+    <url-pattern>*.jspf</url-pattern>
+    <url-pattern>*.jspx</url-pattern>
+    <url-pattern>*.xsp</url-pattern>
+    <url-pattern>*.JSP</url-pattern> 
+    <url-pattern>*.JSPF</url-pattern>
+    <url-pattern>*.JSPX</url-pattern>
+    <url-pattern>*.XSP</url-pattern>
+  </servlet-mapping>
+  
+  <!-- ==================================================================== -->
+  <!-- Dynamic Servlet Invoker.                                             -->
+  <!-- This servlet invokes anonymous servlets that have not been defined   -->
+  <!-- in the web.xml or by other means. The first element of the pathInfo  -->
+  <!-- of a request passed to the envoker is treated as a servlet name for  -->
+  <!-- an existing servlet, or as a class name of a new servlet.            -->
+  <!-- This servlet is normally mapped to /servlet/*                        -->
+  <!-- This servlet support the following initParams:                       -->
+  <!--                                                                      -->
+  <!--  nonContextServlets       If false, the invoker can only load        -->
+  <!--                           servlets from the contexts classloader.    -->
+  <!--                           This is false by default and setting this  -->
+  <!--                           to true may have security implications.    -->
+  <!--                                                                      -->
+  <!--  verbose                  If true, log dynamic loads                 -->
+  <!--                                                                      -->
+  <!--  *                        All other parameters are copied to the     -->
+  <!--                           each dynamic servlet as init parameters    -->
+  <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
+  <!-- Uncomment for dynamic invocation
+  <servlet>
+    <servlet-name>invoker</servlet-name>
+    <servlet-class>org.eclipse.jetty.servlet.Invoker</servlet-class>
+    <init-param>
+      <param-name>verbose</param-name>
+      <param-value>false</param-value>
+    </init-param>
+    <init-param>
+      <param-name>nonContextServlets</param-name>
+      <param-value>false</param-value>
+    </init-param>
+    <init-param>
+      <param-name>dynamicParam</param-name>
+      <param-value>anyValue</param-value>
+    </init-param>
+    <load-on-startup>0</load-on-startup>
+  </servlet>
+
+  <servlet-mapping> <servlet-name>invoker</servlet-name> <url-pattern>/servlet/*</url-pattern> </servlet-mapping>
+  -->
+
+
+
+  <!-- ==================================================================== -->
+  <session-config>
+    <session-timeout>30</session-timeout>
+  </session-config>
+
+  <!-- ==================================================================== -->
+  <!-- Default MIME mappings                                                -->
+  <!-- The default MIME mappings are provided by the mime.properties        -->
+  <!-- resource in the org.eclipse.jetty.server.jar file.  Additional or modified  -->
+  <!-- mappings may be specified here                                       -->
+  <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
+  <!-- UNCOMMENT TO ACTIVATE
+  <mime-mapping>
+    <extension>mysuffix</extension>
+    <mime-type>mymime/type</mime-type>
+  </mime-mapping>
+  -->
+
+  <!-- ==================================================================== -->
+  <welcome-file-list>
+    <welcome-file>index.html</welcome-file>
+    <welcome-file>index.htm</welcome-file>
+    <welcome-file>index.jsp</welcome-file>
+  </welcome-file-list>
+
+  <!-- ==================================================================== -->
+  <locale-encoding-mapping-list>
+    <locale-encoding-mapping><locale>ar</locale><encoding>ISO-8859-6</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>be</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>bg</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>ca</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>cs</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>da</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>de</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>el</locale><encoding>ISO-8859-7</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>en</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>es</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>et</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>fi</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>fr</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>hr</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>hu</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>is</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>it</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>iw</locale><encoding>ISO-8859-8</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>ja</locale><encoding>Shift_JIS</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>ko</locale><encoding>EUC-KR</encoding></locale-encoding-mapping>     
+    <locale-encoding-mapping><locale>lt</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>lv</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>mk</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>nl</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>no</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>pl</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>pt</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>ro</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>ru</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>sh</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>sk</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>sl</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>sq</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>sr</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>sv</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>tr</locale><encoding>ISO-8859-9</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>uk</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>zh</locale><encoding>GB2312</encoding></locale-encoding-mapping>
+    <locale-encoding-mapping><locale>zh_TW</locale><encoding>Big5</encoding></locale-encoding-mapping>   
+  </locale-encoding-mapping-list>
+  
+  <security-constraint>
+    <web-resource-collection>
+      <web-resource-name>Disable TRACE</web-resource-name>
+      <url-pattern>/</url-pattern>
+      <http-method>TRACE</http-method>
+    </web-resource-collection>
+    <auth-constraint/>
+  </security-constraint>
+  
+</web-app>
+
diff --git a/packaging/jetty-server/src/main/dist/jetty/logs/placeholder b/packaging/jetty-server/src/main/dist/jetty/logs/placeholder
new file mode 100644
index 0000000..8e1a7d7
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/jetty/logs/placeholder
@@ -0,0 +1 @@
+ignore placeholder to create empty jetty/logs folder in distribution
diff --git a/packaging/jetty-server/src/main/dist/notice.html b/packaging/jetty-server/src/main/dist/notice.html
new file mode 100644
index 0000000..0ee73f4
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/notice.html
@@ -0,0 +1,104 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<!-- saved from url=(0044)http://www.eclipse.org/legal/epl/notice.html -->
+<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+
+<TITLE>Eclipse Foundation Software User Agreement</TITLE>
+</HEAD><BODY lang="EN-US">
+<H2>Eclipse Foundation Software User Agreement</H2>
+<P>April 14, 2010</P>
+
+<H3>Usage Of Content</H3>
+
+<P>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+   (COLLECTIVELY "CONTENT").  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</P>
+
+<H3>Applicable Licenses</H3>
+
+<P>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+   ("EPL").  A copy of the EPL is provided with this Content and is also available at <A href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</A>.
+   For purposes of the EPL, "Program" will mean the Content.</P>
+
+<P>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
+   repository ("Repository") in software modules ("Modules") and made available as downloadable archives ("Downloads").</P>
+
+<UL>
+       <LI>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins ("Plug-ins"), plug-in fragments ("Fragments"), and features ("Features").</LI>
+       <LI>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java™ ARchive) in a directory named "plugins".</LI>
+       <LI>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named "features".  Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of the Plug-ins
+      and/or Fragments associated with that Feature.</LI>
+       <LI>Features may also include other Features ("Included Features"). Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of Included Features.</LI>
+</UL>
+
+<P>The terms and conditions governing Plug-ins and Fragments should be contained in files named "about.html" ("Abouts"). The terms and conditions governing Features and
+Included Features should be contained in files named "license.html" ("Feature Licenses").  Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</P>
+
+<UL>
+       <LI>The top-level (root) directory</LI>
+       <LI>Plug-in and Fragment directories</LI>
+       <LI>Inside Plug-ins and Fragments packaged as JARs</LI>
+       <LI>Sub-directories of the directory named "src" of certain Plug-ins</LI>
+       <LI>Feature directories</LI>
+</UL>
+
+<P>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license ("Feature Update License") during the
+installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them.  Feature Update Licenses may be found in the "license" property of files named "feature.properties" found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</P>
+
+<P>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</P>
+
+<UL>
+       <LI>Common Public License Version 1.0 (available at <A href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</A>)</LI>
+       <LI>Apache Software License 1.1 (available at <A href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</A>)</LI>
+       <LI>Apache Software License 2.0 (available at <A href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</A>)</LI>
+       <LI>Metro Link Public License 1.00 (available at <A href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</A>)</LI>
+       <LI>Mozilla Public License Version 1.1 (available at <A href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</A>)</LI>
+</UL>
+
+<P>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</P>
+
+
+<H3>Use of Provisioning Technology</H3>
+
+<P>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
+   Update Manager ("Provisioning Technology") for the purpose of allowing users to install software, documentation, information and/or
+   other materials (collectively "Installable Software"). This capability is provided with the intent of allowing such users to
+   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <A href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</A>
+   ("Specification").</P>
+
+<P>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
+   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
+   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
+   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</P>
+
+<OL>
+       <LI>A series of actions may occur ("Provisioning Process") in which a user may execute the Provisioning Technology
+       on a machine ("Target Machine") with the intent of installing, extending or updating the functionality of an Eclipse-based
+       product.</LI>
+       <LI>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
+       accessed and copied to the Target Machine.</LI>
+       <LI>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
+       Software ("Installable Software Agreement") and such Installable Software Agreement shall be accessed from the Target
+       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
+       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
+       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</LI>
+</OL>
+
+<H3>Cryptography</H3>
+
+<P>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+   possession, or use, and re-export of encryption software, to see if this is permitted.</P>
+
+<P><SMALL>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</SMALL></P>
+
+
+</BODY></HTML>
\ No newline at end of file
diff --git a/packaging/jetty-server/src/main/dist/repository/ext/com.springsource.org.apache.commons.httpclient-3.1.0.jar b/packaging/jetty-server/src/main/dist/repository/ext/com.springsource.org.apache.commons.httpclient-3.1.0.jar
new file mode 100644
index 0000000..ae8b9e9
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/repository/ext/com.springsource.org.apache.commons.httpclient-3.1.0.jar
Binary files differ
diff --git a/packaging/jetty-server/src/main/dist/repository/ext/com.sun.el-2.2.0.v201108011116.jar b/packaging/jetty-server/src/main/dist/repository/ext/com.sun.el-2.2.0.v201108011116.jar
new file mode 100644
index 0000000..856fba9
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/repository/ext/com.sun.el-2.2.0.v201108011116.jar
Binary files differ
diff --git a/packaging/jetty-server/src/main/dist/repository/ext/javax.activation-1.1.0.v201105071233.jar b/packaging/jetty-server/src/main/dist/repository/ext/javax.activation-1.1.0.v201105071233.jar
new file mode 100644
index 0000000..cb35913
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/repository/ext/javax.activation-1.1.0.v201105071233.jar
Binary files differ
diff --git a/packaging/jetty-server/src/main/dist/repository/ext/javax.annotation-1.1.0.v201108011116.jar b/packaging/jetty-server/src/main/dist/repository/ext/javax.annotation-1.1.0.v201108011116.jar
new file mode 100644
index 0000000..10dce5a
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/repository/ext/javax.annotation-1.1.0.v201108011116.jar
Binary files differ
diff --git a/packaging/jetty-server/src/main/dist/repository/ext/javax.el-2.2.0.v201108011116.jar b/packaging/jetty-server/src/main/dist/repository/ext/javax.el-2.2.0.v201108011116.jar
new file mode 100644
index 0000000..cb98282
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/repository/ext/javax.el-2.2.0.v201108011116.jar
Binary files differ
diff --git a/packaging/jetty-server/src/main/dist/repository/ext/javax.mail.glassfish-1.4.1.v201005082020.jar b/packaging/jetty-server/src/main/dist/repository/ext/javax.mail.glassfish-1.4.1.v201005082020.jar
new file mode 100644
index 0000000..f2dda8a
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/repository/ext/javax.mail.glassfish-1.4.1.v201005082020.jar
Binary files differ
diff --git a/packaging/jetty-server/src/main/dist/repository/ext/javax.servlet.jsp-2.2.0.v201112011158.jar b/packaging/jetty-server/src/main/dist/repository/ext/javax.servlet.jsp-2.2.0.v201112011158.jar
new file mode 100644
index 0000000..dc2fbb0
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/repository/ext/javax.servlet.jsp-2.2.0.v201112011158.jar
Binary files differ
diff --git a/packaging/jetty-server/src/main/dist/repository/ext/javax.servlet_3.0.0.v201112011016.jar b/packaging/jetty-server/src/main/dist/repository/ext/javax.servlet_3.0.0.v201112011016.jar
new file mode 100644
index 0000000..4904343
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/repository/ext/javax.servlet_3.0.0.v201112011016.jar
Binary files differ
diff --git a/packaging/jetty-server/src/main/dist/repository/ext/javax.transaction-1.1.1.v201105210645.jar b/packaging/jetty-server/src/main/dist/repository/ext/javax.transaction-1.1.1.v201105210645.jar
new file mode 100644
index 0000000..d142d5f
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/repository/ext/javax.transaction-1.1.1.v201105210645.jar
Binary files differ
diff --git a/packaging/jetty-server/src/main/dist/repository/ext/org.apache.jasper.glassfish-2.2.2.v201112011158.jar b/packaging/jetty-server/src/main/dist/repository/ext/org.apache.jasper.glassfish-2.2.2.v201112011158.jar
new file mode 100644
index 0000000..8415c70
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/repository/ext/org.apache.jasper.glassfish-2.2.2.v201112011158.jar
Binary files differ
diff --git a/packaging/jetty-server/src/main/dist/repository/ext/org.apache.taglibs.standard.glassfish-1.2.0.v201112081803.jar b/packaging/jetty-server/src/main/dist/repository/ext/org.apache.taglibs.standard.glassfish-1.2.0.v201112081803.jar
new file mode 100644
index 0000000..27682db
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/repository/ext/org.apache.taglibs.standard.glassfish-1.2.0.v201112081803.jar
Binary files differ
diff --git a/packaging/jetty-server/src/main/dist/repository/ext/org.eclipse.jdt.core-3.7.1.jar b/packaging/jetty-server/src/main/dist/repository/ext/org.eclipse.jdt.core-3.7.1.jar
new file mode 100644
index 0000000..a76e9da
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/repository/ext/org.eclipse.jdt.core-3.7.1.jar
Binary files differ
diff --git a/packaging/jetty-server/src/main/dist/repository/ext/org.eclipse.virgo.kernel.userregion.blueprint.plan b/packaging/jetty-server/src/main/dist/repository/ext/org.eclipse.virgo.kernel.userregion.blueprint.plan
new file mode 100644
index 0000000..5efb538
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/repository/ext/org.eclipse.virgo.kernel.userregion.blueprint.plan
@@ -0,0 +1,15 @@
+<plan name="org.eclipse.virgo.kernel.userregion.blueprint" version="3.7.1" scoped="false" atomic="false"
+	  xmlns="http://www.eclipse.org/virgo/schema/plan"
+	  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	  xsi:schemaLocation="http://www.eclipse.org/virgo/schema/plan http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+	<artifact type="bundle" name="org.eclipse.gemini.blueprint.core" version="[2.1, 3)"/>
+	<artifact type="bundle" name="org.eclipse.gemini.blueprint.extender" version="[2.1, 3)"/>
+	<artifact type="bundle" name="org.eclipse.gemini.blueprint.io" version="[2.1, 3)"/>
+	<artifact type="bundle" name="org.eclipse.gemini.blueprint.extensions" version="[2.1, 3)"/>
+	<artifact type="bundle" name="org.eclipse.virgo.kernel.agent.dm" version="[3.7.1, 4.0)"/>
+	<artifact type="bundle" name="org.eclipse.virgo.kernel.deployer.dm" version="[3.7.1, 4.0)"/>
+	<artifact type="bundle" name="org.eclipse.equinox.ds" version="0.0.0"/>
+	<artifact type="bundle" name="org.eclipse.equinox.util" version="0.0.0"/>
+	<artifact type="configuration" name="osgi.console" version="0"/>
+</plan>
diff --git a/packaging/jetty-server/src/main/dist/repository/ext/org.eclipse.virgo.management.plan b/packaging/jetty-server/src/main/dist/repository/ext/org.eclipse.virgo.management.plan
new file mode 100644
index 0000000..b7ad494
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/repository/ext/org.eclipse.virgo.management.plan
@@ -0,0 +1,10 @@
+<plan name="org.eclipse.virgo.management" version="3.7.1" scoped="false" atomic="false"
+			xmlns="http://www.eclipse.org/virgo/schema/plan"
+			xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+			xsi:schemaLocation="http://www.eclipse.org/virgo/schema/plan http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+		<artifact type="bundle" name="osgi.enterprise" version="[4.2, 5)"/>
+		<artifact type="bundle" name="org.eclipse.gemini.management" version="[1.0, 2)"/>
+		<artifact type="bundle" name="org.eclipse.virgo.management.fragment" version="[3.6, 4)"/>
+		
+</plan>
diff --git a/packaging/jetty-server/src/main/dist/repository/ext/org.eclipse.virgo.web.jetty.plan b/packaging/jetty-server/src/main/dist/repository/ext/org.eclipse.virgo.web.jetty.plan
new file mode 100644
index 0000000..f1ae9d0
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/repository/ext/org.eclipse.virgo.web.jetty.plan
@@ -0,0 +1,12 @@
+<plan name="org.eclipse.virgo.web.jetty" version="3.7.1" scoped="false" atomic="false"
+                xmlns="http://www.eclipse.org/virgo/schema/plan"
+				xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+				xsi:schemaLocation="
+				        http://www.eclipse.org/virgo/schema/plan 
+				        http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+		
+		<artifact type="bundle" name="org.eclipse.jetty.osgi.boot" version="[8.1, 9.0)"/>
+		<artifact type="bundle" name="org.eclipse.virgo.web.dm" version="[3.1, 4.0)"/>
+
+        <artifact type="bundle" name="org.eclipse.virgo.web.servlet.adapter" version="[3.0, 4.0)"/>
+</plan>
diff --git a/packaging/jetty-server/src/main/dist/repository/ext/org.objectweb.asm-3.1.0.v200803061910.jar b/packaging/jetty-server/src/main/dist/repository/ext/org.objectweb.asm-3.1.0.v200803061910.jar
new file mode 100644
index 0000000..6803610
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/repository/ext/org.objectweb.asm-3.1.0.v200803061910.jar
Binary files differ
diff --git a/packaging/jetty-server/src/main/dist/repository/ext/osgi.console.properties b/packaging/jetty-server/src/main/dist/repository/ext/osgi.console.properties
new file mode 100644
index 0000000..310943b
--- /dev/null
+++ b/packaging/jetty-server/src/main/dist/repository/ext/osgi.console.properties
@@ -0,0 +1,6 @@
+telnet.enabled=false
+telnet.port=2501
+telnet.host=localhost
+ssh.enabled=false
+ssh.port=2502
+ssh.host=localhost
\ No newline at end of file
diff --git a/packaging/jetty-server/src/main/filtered/bin/checkJava.sh b/packaging/jetty-server/src/main/filtered/bin/checkJava.sh
new file mode 100644
index 0000000..a06ecd5
--- /dev/null
+++ b/packaging/jetty-server/src/main/filtered/bin/checkJava.sh
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+#
+# make adjustment when running under cygwin
+#
+if $cygwin; then
+    CLASSPATH=$(cygpath -wp "$CLASSPATH")
+fi
+
+if [ -z "$JAVA_HOME" ]
+then
+  	JAVA_EXECUTABLE=java
+else
+  	JAVA_EXECUTABLE=$JAVA_HOME/bin/java
+fi
+
+# Run java version check with the discovered java jvm.
+$JAVA_EXECUTABLE \
+	-classpath "$CLASSPATH" \
+	org.eclipse.virgo.util.env.JavaVersionChecker
+
+# If non-zero exit then either we cannot find the check or the java version is incorrect.
+if [ $? != 0 ]
+then
+	exit 1
+fi
diff --git a/packaging/jetty-server/src/main/filtered/bin/dmk.sh b/packaging/jetty-server/src/main/filtered/bin/dmk.sh
new file mode 100755
index 0000000..aae69f2
--- /dev/null
+++ b/packaging/jetty-server/src/main/filtered/bin/dmk.sh
@@ -0,0 +1,286 @@
+#!/bin/bash
+
+SCRIPT="$0"
+
+# SCRIPT may be an arbitrarily deep series of symlinks. Loop until we have the concrete path.
+while [ -h "$SCRIPT" ] ; do
+  ls=`ls -ld "$SCRIPT"`
+  # Drop everything prior to ->
+  link=`expr "$ls" : '.*-> \(.*\)$'`
+  if expr "$link" : '/.*' > /dev/null; then
+    SCRIPT="$link"
+  else
+    SCRIPT=`dirname "$SCRIPT"`/"$link"
+  fi
+done
+
+# determine kernel home
+KERNEL_HOME=`dirname "$SCRIPT"`/..
+
+# make KERNEL_HOME absolute
+KERNEL_HOME=`cd "$KERNEL_HOME"; pwd`
+
+# execute user setenv script if needed
+if [ -r "$KERNEL_HOME/bin/setenv.sh" ]
+then
+	. $KERNEL_HOME/bin/setenv.sh
+fi
+
+# setup classpath and java environment
+. "$KERNEL_HOME/bin/setupClasspath.sh"
+
+# Run java version check with the discovered java jvm.
+. "$KERNEL_HOME/bin/checkJava.sh"
+
+shopt -s extglob
+	
+# parse the command we executing
+COMMAND=$1
+shift;
+	
+if [ "$COMMAND" = "start" ]
+then
+	
+	# parse the standard arguments
+	CONFIG_DIR=$KERNEL_HOME/configuration
+	CLEAN_FLAG=
+	NO_START_FLAG=
+
+	SHELL_FLAG=
+	
+	DEBUG_FLAG=
+	DEBUG_PORT=8000
+	SUSPEND=n
+	if [ -z "$JMX_PORT" ]
+	then
+		JMX_PORT=9875
+	fi
+	
+	if [ -z "$KEYSTORE_PASSWORD" ]
+	then
+		KEYSTORE_PASSWORD=changeit
+	fi
+	
+	ADDITIONAL_ARGS=
+
+	while (($# > 0))
+		do
+		case $1 in
+		-debug)
+				DEBUG_FLAG=1
+				if [[ "$2" == +([0-9]) ]]
+				then
+					DEBUG_PORT=$2
+					shift;
+				fi
+				;;
+		-clean)
+				CLEAN_FLAG=1
+				;;
+		-configDir)
+				CONFIG_DIR=$2
+				shift;
+				;;
+		-jmxport)
+				JMX_PORT=$2
+				shift;
+				;;
+		-keystore)
+				KEYSTORE_PATH=$2
+				shift;
+				;;
+		-keystorePassword)
+				KEYSTORE_PASSWORD=$2
+				shift;
+				;;
+		-noStart)
+				NO_START_FLAG=1
+				;;
+				
+		-suspend)
+				SUSPEND=y
+				;;
+		-shell)
+				SHELL_FLAG=1
+				;;
+		*)
+				ADDITIONAL_ARGS="$ADDITIONAL_ARGS $1"
+				;;
+		esac
+		shift
+	done
+	
+	# start the kernel
+	if [[ "$CONFIG_DIR" != /* ]]
+	then
+	    CONFIG_DIR=$KERNEL_HOME/$CONFIG_DIR
+	fi
+
+	if [ -z "$KEYSTORE_PATH" ]
+	then
+	    KEYSTORE_PATH=$CONFIG_DIR/keystore
+	fi
+
+	if [ "$DEBUG_FLAG" ]
+	then
+		DEBUG_OPTS=" \
+			-Xdebug \
+			-Xrunjdwp:transport=dt_socket,address=$DEBUG_PORT,server=y,suspend=$SUSPEND"
+	fi
+
+	if [ "$CLEAN_FLAG" ]
+	then
+        echo "Cleaning the serviceability and working directories..."
+        rm -rf "$KERNEL_HOME/work"
+        rm -rf "$KERNEL_HOME/serviceability"
+
+        LAUNCH_OPTS="$LAUNCH_OPTS -clean" #equivalent to setting osgi.clean to "true"
+	fi
+	
+	if [ "$SHELL_FLAG" ]
+	then
+	    echo "Warning: Kernel shell not supported; -shell option ignored."
+		# LAUNCH_OPTS="$LAUNCH_OPTS -Forg.eclipse.virgo.kernel.shell.local=true"
+	fi
+
+    ACCESS_PROPERTIES=$CONFIG_DIR/org.eclipse.virgo.kernel.jmxremote.access.properties
+    AUTH_LOGIN=$CONFIG_DIR/org.eclipse.virgo.kernel.authentication.config
+    AUTH_FILE=$CONFIG_DIR/org.eclipse.virgo.kernel.users.properties
+    CONFIG_AREA=$KERNEL_HOME/work
+    JAVA_PROFILE=$KERNEL_HOME/configuration/java-server.profile
+
+    if $cygwin; then
+        ACCESS_PROPERTIES=$(cygpath -wp $ACCESS_PROPERTIES)
+        AUTH_LOGIN=$(cygpath -wp $AUTH_LOGIN)
+        AUTH_FILE=$(cygpath -wp $AUTH_FILE)
+        KERNEL_HOME=$(cygpath -wp $KERNEL_HOME)
+        CONFIG_DIR=$(cygpath -wp $CONFIG_DIR)
+        CONFIG_AREA=$(cygpath -wp $CONFIG_AREA)
+        JAVA_PROFILE=$(cygpath -wp $JAVA_PROFILE)
+    fi
+	
+	# Set the required permissions on the JMX configuration files
+	chmod 600 "$ACCESS_PROPERTIES"
+
+   	if [ -z "$JAVA_HOME" ]
+    then
+      	JAVA_EXECUTABLE=java
+    else
+     	JAVA_EXECUTABLE=$JAVA_HOME/bin/java
+    fi
+
+	# If we get here we have the correct Java version.
+	
+	if [ -z "$NO_START_FLAG" ]
+	then
+		TMP_DIR=$KERNEL_HOME/work/tmp
+		# Ensure that the tmp directory exists
+		mkdir -p "$TMP_DIR"
+
+        JAVA_OPTS="-Xmx1024m \
+                    -XX:MaxPermSize=512m $JAVA_OPTS"
+
+		cd "$KERNEL_HOME"; exec $JAVA_EXECUTABLE \
+			$JAVA_OPTS \
+			$DEBUG_OPTS \
+			$JMX_OPTS \
+			-XX:+HeapDumpOnOutOfMemoryError \
+			-XX:ErrorFile="$KERNEL_HOME/serviceability/error.log" \
+			-XX:HeapDumpPath="$KERNEL_HOME/serviceability/heap_dump.hprof" \
+			-Djava.security.auth.login.config="$AUTH_LOGIN" \
+			-Dorg.eclipse.virgo.kernel.authentication.file="$AUTH_FILE" \
+			-Djava.io.tmpdir="$TMP_DIR" \
+			-Dorg.eclipse.virgo.kernel.home="$KERNEL_HOME" \
+			-Dorg.eclipse.virgo.kernel.config="$CONFIG_DIR" \
+			-Dosgi.sharedConfiguration.area="$CONFIG_DIR" \
+			-Dosgi.java.profile="file:$JAVA_PROFILE" \
+            -Declipse.ignoreApp=true \
+            -Dosgi.install.area="$KERNEL_HOME" \
+            -Dosgi.configuration.area="$CONFIG_AREA" \
+            -Dssh.server.keystore="$CONFIG_DIR/hostkey.ser" \
+            -Dosgi.frameworkClassPath="$FWCLASSPATH" \
+            -Djava.endorsed.dirs="$KERNEL_HOME/lib/endorsed" \
+            -Dcom.sun.management.jmxremote.port=$JMX_PORT \
+		    -Dcom.sun.management.jmxremote.authenticate=true \
+	    	-Dcom.sun.management.jmxremote.login.config=virgo-kernel \
+    		-Dcom.sun.management.jmxremote.access.file="$ACCESS_PROPERTIES" \
+		    -Djavax.net.ssl.keyStore="$KEYSTORE_PATH" \
+		    -Djavax.net.ssl.keyStorePassword="$KEYSTORE_PASSWORD" \
+		    -Dcom.sun.management.jmxremote.ssl=true \
+		    -Dcom.sun.management.jmxremote.ssl.need.client.auth=false \
+            -classpath "$CLASSPATH" \
+			org.eclipse.equinox.launcher.Main \
+            -noExit \
+			$LAUNCH_OPTS \
+			$ADDITIONAL_ARGS
+	fi
+elif [ "$COMMAND" = "stop" ]
+then
+
+	CONFIG_DIR="$KERNEL_HOME/configuration"
+
+	#parse args for the script
+	if [ -z "$TRUSTSTORE_PATH" ]
+	then
+		TRUSTSTORE_PATH=$CONFIG_DIR/keystore
+	fi
+	
+	if [ -z "$TRUSTSTORE_PASSWORD" ]	
+	then
+		TRUSTSTORE_PASSWORD=changeit
+	fi
+
+	if [ -z "$JMX_PORT" ]
+	then
+		JMX_PORT=9875
+	fi
+
+	shopt -s extglob
+
+	while (($# > 0))
+		do
+		case $1 in
+		-truststore)
+				TRUSTSTORE_PATH=$2
+				shift;
+				;;
+		-truststorePassword)
+				TRUSTSTORE_PASSWORD=$2
+				shift;
+				;;
+		-configDir)
+				CONFIG_DIR=$2
+				shift;
+				;;
+		-jmxport)
+				JMX_PORT=$2
+				shift;
+				;;
+		*)
+			OTHER_ARGS+=" $1"
+			;;
+		esac
+		shift
+	done
+
+	OTHER_ARGS+=" -jmxport $JMX_PORT"
+
+    if $cygwin; then
+        KERNEL_HOME=$(cygpath -wp $KERNEL_HOME)
+        CONFIG_DIR=$(cygpath -wp $CONFIG_DIR)
+    fi
+
+	exec $JAVA_EXECUTABLE \
+	     $JAVA_OPTS \
+	     $JMX_OPTS \
+		-classpath "$CLASSPATH" \
+		-Djavax.net.ssl.trustStore="$TRUSTSTORE_PATH" \
+		-Djavax.net.ssl.trustStorePassword="$TRUSTSTORE_PASSWORD" \
+		-Dorg.eclipse.virgo.kernel.home="$KERNEL_HOME" \
+		-Dorg.eclipse.virgo.kernel.authentication.file="$CONFIG_DIR/org.eclipse.virgo.kernel.users.properties" \
+		org.eclipse.virgo.nano.shutdown.ShutdownClient $OTHER_ARGS
+	
+else
+	echo "Unknown command: ${COMMAND}"
+fi
+
diff --git a/packaging/jetty-server/src/main/filtered/bin/jconsole.sh b/packaging/jetty-server/src/main/filtered/bin/jconsole.sh
new file mode 100644
index 0000000..0dfbcbf
--- /dev/null
+++ b/packaging/jetty-server/src/main/filtered/bin/jconsole.sh
@@ -0,0 +1,53 @@
+#!/bin/bash
+
+if [ -z "$JAVA_HOME" ]
+then
+    echo The JAVA_HOME environment variable is not defined
+    exit 1
+fi
+
+SCRIPT="$0"
+
+# SCRIPT may be an arbitrarily deep series of symlinks. Loop until we have the concrete path.
+while [ -h "$SCRIPT" ] ; do 
+  ls=`ls -ld "$SCRIPT"`
+  # Drop everything prior to ->
+  link=`expr "$ls" : '.*-> \(.*\)$'`
+  if expr "$link" : '/.*' > /dev/null; then
+    SCRIPT="$link"
+  else
+    SCRIPT=`dirname "$SCRIPT"`/"$link"
+  fi
+done
+ 
+KERNEL_HOME=`dirname "$SCRIPT"`/..
+KERNEL_HOME=`cd $KERNEL_HOME; pwd`
+
+#parse args for the script
+TRUSTSTORE_PATH=$KERNEL_HOME/configuration/keystore
+TRUSTSTORE_PASSWORD=changeit
+
+shopt -s extglob
+
+while (($# > 0))
+	do
+	case $1 in
+	-truststore)
+			TRUSTSTORE_PATH=$2
+			shift;
+			;;
+	-truststorePassword)
+			TRUSTSTORE_PASSWORD=$2
+			shift;
+			;;
+	esac
+	shift
+done
+
+JMX_OPTS=" \
+	$JMX_OPTS \
+	-J-Dcom.sun.tools.jconsole.mbeans.keyPropertyList=category,type \
+	-J-Djavax.net.ssl.trustStore=$TRUSTSTORE_PATH \
+	-J-Djavax.net.ssl.trustStorePassword=$TRUSTSTORE_PASSWORD"
+
+$JAVA_HOME/bin/jconsole $JMX_OPTS
diff --git a/packaging/jetty-server/src/main/filtered/bin/setupClasspath.sh b/packaging/jetty-server/src/main/filtered/bin/setupClasspath.sh
new file mode 100644
index 0000000..741e0e3
--- /dev/null
+++ b/packaging/jetty-server/src/main/filtered/bin/setupClasspath.sh
@@ -0,0 +1,40 @@
+#!/bin/bash
+
+# make sure we have JAVA_HOME set
+if [ -z "$JAVA_HOME" ]
+then
+	echo The JAVA_HOME environment variable is not defined. Using PATH instead.
+fi
+
+CLASSPATH=
+FWCLASSPATH=
+
+#  Create the classpath for bootstrapping the Server from all the JARs in lib
+for file in "$KERNEL_HOME"/lib/*
+do
+	if [[ $file == *.jar ]]
+	then
+		CLASSPATH=$CLASSPATH:$KERNEL_HOME/lib/${file##*/}
+		FWCLASSPATH=$FWCLASSPATH,file:$KERNEL_HOME/lib/${file##*/}
+	fi
+done
+
+#  Append the osgi jar to the classpath
+for file in "$KERNEL_HOME"/plugins/org.eclipse.osgi_*.jar
+do
+	CLASSPATH=$CLASSPATH:$KERNEL_HOME/plugins/${file##*/}
+	FWCLASSPATH=$FWCLASSPATH,file:$KERNEL_HOME/plugins/${file##*/}
+done
+
+#  Append the console.supportability jar to the classpath to enable ssh
+for file in "$KERNEL_HOME"/plugins/org.eclipse.equinox.console.ssh_*.jar
+do
+	CLASSPATH=$CLASSPATH:$KERNEL_HOME/plugins/${file##*/}
+done
+
+# make sure we have CLASSPATH set
+if [ -z "$CLASSPATH" ]
+then
+	echo No JAR files found in $KERNEL_HOME/lib
+	exit 1
+fi
diff --git a/packaging/jetty-server/src/main/filtered/bin/shutdown.sh b/packaging/jetty-server/src/main/filtered/bin/shutdown.sh
new file mode 100644
index 0000000..1960446
--- /dev/null
+++ b/packaging/jetty-server/src/main/filtered/bin/shutdown.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+
+SCRIPT="$0"
+
+# SCRIPT may be an arbitrarily deep series of symlinks. Loop until we have the concrete path.
+while [ -h "$SCRIPT" ] ; do
+  ls=`ls -ld "$SCRIPT"`
+  # Drop everything prior to ->
+  link=`expr "$ls" : '.*-> \(.*\)$'`
+  if expr "$link" : '/.*' > /dev/null; then
+    SCRIPT="$link"
+  else
+    SCRIPT=`dirname "$SCRIPT"`/"$link"
+  fi
+done
+
+SCRIPT_DIR=`dirname $SCRIPT`
+EXECUTABLE="dmk.sh"
+
+#
+# identify yourself when running under cygwin
+#
+cygwin=false
+case "$(uname)" in
+    CYGWIN*) cygwin=true ;;
+esac
+export cygwin
+
+exec "$SCRIPT_DIR"/"$EXECUTABLE" stop "$@"
diff --git a/packaging/jetty-server/src/main/filtered/bin/startup.sh b/packaging/jetty-server/src/main/filtered/bin/startup.sh
new file mode 100644
index 0000000..69e43b7
--- /dev/null
+++ b/packaging/jetty-server/src/main/filtered/bin/startup.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+
+SCRIPT="$0"
+
+# SCRIPT may be an arbitrarily deep series of symlinks. Loop until we have the concrete path.
+while [ -h "$SCRIPT" ] ; do
+  ls=`ls -ld "$SCRIPT"`
+  # Drop everything prior to ->
+  link=`expr "$ls" : '.*-> \(.*\)$'`
+  if expr "$link" : '/.*' > /dev/null; then
+    SCRIPT="$link"
+  else
+    SCRIPT=`dirname "$SCRIPT"`/"$link"
+  fi
+done
+
+SCRIPT_DIR=`dirname $SCRIPT`
+EXECUTABLE="dmk.sh"
+
+#
+# identify yourself when running under cygwin
+#
+cygwin=false
+case "$(uname)" in
+    CYGWIN*) cygwin=true ;;
+esac
+export cygwin
+
+exec "$SCRIPT_DIR"/"$EXECUTABLE" start "$@"
diff --git a/packaging/jetty-server/src/main/filtered/configuration/org.eclipse.virgo.kernel.userregion.properties b/packaging/jetty-server/src/main/filtered/configuration/org.eclipse.virgo.kernel.userregion.properties
new file mode 100644
index 0000000..bf57be3
--- /dev/null
+++ b/packaging/jetty-server/src/main/filtered/configuration/org.eclipse.virgo.kernel.userregion.properties
@@ -0,0 +1,94 @@
+baseBundles = \
+ file:plugins/org.eclipse.equinox.cm_@EQUINOX.CONFIGADMIN.VERSION@.jar@start,\
+ file:plugins/org.eclipse.virgo.kernel.userregion_@VIRGO.VERSION@.jar@start,\
+ file:plugins/org.eclipse.virgo.shell.command_@VIRGO.VERSION@.jar@start,\
+ file:plugins/org.eclipse.osgi.services_@OSGI.SERVICES.VERSION@.jar@start,\
+ file:plugins/org.apache.mina.core_@MINA.CORE.VERSION@.jar@start,\
+ file:plugins/org.apache.felix.gogo.command_@FELIX.GOGO.COMMAND.VERSION@.jar@start,\
+ file:plugins/org.apache.felix.gogo.runtime_@FELIX.GOGO.RUNTIME.VERSION@.jar@start,\
+ file:plugins/org.apache.felix.gogo.shell_@FELIX.GOGO.SHELL.VERSION@.jar@start,\
+ file:plugins/org.eclipse.equinox.console_@EQUINOX.CONSOLE.VERSION@.jar@start,\
+ file:plugins/org.eclipse.equinox.console.ssh_@EQUINOX.CONSOLE.SSH.VERSION@.jar@start,\
+ file:plugins/org.apache.sshd.core_@SSHD.CORE.VERSION@.jar@start
+
+bundleImports = org.eclipse.osgi;bundle-version="0"
+
+packageImports =\
+ org.eclipse.virgo.kernel.artifact.*;version="0",\
+ org.eclipse.virgo.nano.core;version="0",\
+ org.eclipse.virgo.nano.deployer.api.*;version="0",\
+ org.eclipse.virgo.nano.deployer.api;version="0",\
+ org.eclipse.virgo.nano.deployer;version="0",\
+ org.eclipse.virgo.kernel.deployer.core.event;version="0",\
+ org.eclipse.virgo.kernel.install.*;version="0",\
+ org.eclipse.virgo.kernel.osgi.*;version="0",\
+ org.eclipse.virgo.kernel.model;version="0",\
+ org.eclipse.virgo.kernel.model.management;version="0",\
+ org.eclipse.virgo.kernel.module;version="0",\
+ org.eclipse.virgo.kernel.equinox.extensions.hooks;version="0",\
+ org.eclipse.virgo.nano.serviceability;version="0",\
+ org.eclipse.virgo.nano.serviceability.*;version="0",\
+ org.eclipse.virgo.kernel.services.work;version="0",\
+ org.eclipse.virgo.nano.shim.*;version="0",\
+ org.eclipse.virgo.medic.*;version="0",\
+ org.eclipse.virgo.repository;version="0",\
+ org.eclipse.virgo.repository.*;version="0",\
+ org.eclipse.virgo.util.*;version="0",\
+ org.apache.commons.logging;version="[1.0.0,2.0.0)",\
+ org.apache.commons.logging.impl;version="[1.0.0,2.0.0)",\
+ org.aspectj.*;version="[1.6.5.RELEASE,2.0.0)",\
+ org.osgi.service.event;version="0",\
+ org.osgi.service.log;version="0",\
+ org.osgi.service.http;version="0",\
+ javax.servlet;version="2.6.0",\
+ org.eclipse.equinox.region;version="1",\
+ ch.qos.logback.*;version="[1.0.0,2.0.0)",\
+ org.slf4j;version="[1.6.4,2)",\
+ org.slf4j.helpers;version="[1.6.4,2)",\
+ org.slf4j.spi;version="[1.6.4,2)",\
+ org.springframework.util;version="[4.2.1,5)"
+
+serviceImports =\
+ org.eclipse.equinox.region.Region,\
+ org.eclipse.equinox.region.RegionDigraph,\
+ org.osgi.framework.hooks.resolver.ResolverHookFactory,\
+ org.eclipse.virgo.nano.deployer.api.core.ApplicationDeployer,\
+ org.eclipse.virgo.nano.deployer.api.core.DeployUriNormaliser,\
+ org.eclipse.virgo.kernel.install.artifact.ScopeServiceRepository,\
+ org.eclipse.virgo.kernel.services.work.WorkArea,\
+ org.eclipse.virgo.repository.ArtifactBridge,\
+ org.eclipse.virgo.repository.RepositoryFactory,\
+ org.eclipse.virgo.repository.HashGenerator,\
+ org.eclipse.virgo.medic.eventlog.EventLoggerFactory,\
+ org.eclipse.virgo.repository.Repository,\
+ org.eclipse.virgo.nano.core.Shutdown,\
+ org.osgi.service.event.EventAdmin,\
+ org.osgi.service.log.LogService,\
+ org.osgi.service.http.HttpService,\
+ org.eclipse.virgo.medic.eventlog.EventLogger,\
+ org.eclipse.virgo.medic.dump.DumpGenerator,\
+ org.eclipse.virgo.nano.shim.scope.ScopeFactory,\
+ org.eclipse.virgo.nano.shim.serviceability.TracingService,\
+ org.eclipse.virgo.kernel.model.RuntimeArtifactRepository,\
+ org.eclipse.virgo.kernel.model.management.RuntimeArtifactModelObjectNameCreator,\
+ org.eclipse.osgi.service.resolver.PlatformAdmin,\
+ org.osgi.service.packageadmin.PackageAdmin,\
+ org.eclipse.virgo.nano.core.ConfigurationExporter,\
+ javax.management.MBeanServer
+
+serviceExports =\
+ org.eclipse.virgo.kernel.install.artifact.InstallArtifactLifecycleListener,\
+ org.eclipse.virgo.kernel.install.artifact.ArtifactIdentityDeterminer,\
+ org.eclipse.virgo.kernel.install.pipeline.stage.transform.Transformer,\
+ org.eclipse.virgo.kernel.module.ModuleContextAccessor,\
+ org.eclipse.virgo.medic.dump.DumpContributor,\
+ org.eclipse.virgo.kernel.osgi.quasi.QuasiFrameworkFactory,\
+ org.eclipse.virgo.kernel.osgi.framework.OsgiFramework,\
+ org.eclipse.virgo.kernel.osgi.framework.ImportExpander,\
+ org.eclipse.virgo.kernel.osgi.framework.PackageAdminUtil,\
+ org.eclipse.equinox.region.Region,\
+ org.osgi.service.event.EventHandler,\
+ org.osgi.framework.BundleContext,\
+ org.eclipse.virgo.nano.deployer.api.config.ConfigurationDeployer
+
+initialArtifacts=repository:plan/org.eclipse.virgo.kernel.userregion.blueprint, repository:plan/org.eclipse.virgo.web.jetty,repository:plan/org.eclipse.virgo.management
diff --git a/packaging/jetty-server/src/main/filtered/lib/.version b/packaging/jetty-server/src/main/filtered/lib/.version
new file mode 100644
index 0000000..57985f4
--- /dev/null
+++ b/packaging/jetty-server/src/main/filtered/lib/.version
@@ -0,0 +1 @@
+virgo.server.version=@VIRGO.VERSION@
diff --git a/packaging/jetty-server/src/main/filtered/repository/ext/org.springframework.spring-library.libd b/packaging/jetty-server/src/main/filtered/repository/ext/org.springframework.spring-library.libd
new file mode 100644
index 0000000..b8d132b
--- /dev/null
+++ b/packaging/jetty-server/src/main/filtered/repository/ext/org.springframework.spring-library.libd
@@ -0,0 +1,22 @@
+Library-SymbolicName: org.springframework.spring
+Library-Version: @SPRING.VERSION@
+Library-Name: Spring Framework
+Import-Bundle: 
+ org.springframework.aop;version="[@SPRING.VERSION@, @SPRING.VERSION@]",
+ org.springframework.aspects;version="[@SPRING.VERSION@, @SPRING.VERSION@]",
+ org.springframework.beans;version="[@SPRING.VERSION@, @SPRING.VERSION@]",
+ org.springframework.context;version="[@SPRING.VERSION@, @SPRING.VERSION@]",
+ org.springframework.context.support;version="[@SPRING.VERSION@, @SPRING.VERSION@]",
+ org.springframework.core;version="[@SPRING.VERSION@, @SPRING.VERSION@]",
+ org.springframework.expression;version="[@SPRING.VERSION@, @SPRING.VERSION@]",
+ org.springframework.jdbc;version="[@SPRING.VERSION@, @SPRING.VERSION@]",
+ org.springframework.jms;version="[@SPRING.VERSION@, @SPRING.VERSION@]",
+ org.springframework.orm;version="[@SPRING.VERSION@, @SPRING.VERSION@]",
+ org.springframework.oxm;version="[@SPRING.VERSION@, @SPRING.VERSION@]",
+ org.springframework.transaction;version="[@SPRING.VERSION@, @SPRING.VERSION@]",
+ org.springframework.web;version="[@SPRING.VERSION@, @SPRING.VERSION@]",
+ org.springframework.webmvc;version="[@SPRING.VERSION@, @SPRING.VERSION@]",
+ org.springframework.webmvc.portlet;version="[@SPRING.VERSION@, @SPRING.VERSION@]",
+ org.springframework.websocket;version="[@SPRING.VERSION@, @SPRING.VERSION@]",
+ oevm.org.aopalliance;version="[1.0.0, 1.0.0]",
+ javax.jms;version="[1,2)"
diff --git a/packaging/jetty-server/test-package.xml b/packaging/jetty-server/test-package.xml
new file mode 100644
index 0000000..d6bebd9
--- /dev/null
+++ b/packaging/jetty-server/test-package.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="test-package">
+
+	<property name="test.staging.dir" value="${target.dir}/test-expanded"/>
+	<property name="test.package.dir" value="${test.staging.dir}/virgo-jetty-server-${bundle.version}"/>
+	<property name="pickup.dir" value="${test.package.dir}/pickup"/>
+
+	<target name="test-package"
+			description="Runs a test on the packaged build">
+		<antcall target="unzip.package"/>
+		<antcall target="startup.pre"/>
+		<antcall target="startup"/>
+		<antcall target="startup.post"/>
+		<antcall target="test.do"/>
+		<antcall target="shutdown.pre"/>
+		<antcall target="shutdown"/>
+		<antcall target="shutdown.post"/>
+	</target>
+
+	<target name="unzip.package">
+		<delete dir="${test.staging.dir}" quiet="true"/>
+		<mkdir dir="${test.staging.dir}"/>
+		<unzip src="${package.output.file}" dest="${test.staging.dir}"/>
+		<chmod perm="755">
+			<fileset dir="${test.package.dir}/bin">
+				<include name="*.sh"/>
+			</fileset>
+		</chmod>
+		<chmod perm="600">
+			<fileset dir="${test.package.dir}/configuration">
+				<include name="org.eclipse.virgo.kernel.jmxremote.access.properties"/>
+			</fileset>
+		</chmod>
+	</target>
+
+	<target name="startup.pre"/>
+
+	<target name="startup" depends="shutdown">
+		<echo message="Starting Up Virgo Server" />
+
+		<exec dir="${test.package.dir}" osfamily="unix" spawn="true" executable="bin/startup.sh"/>
+		
+		<exec dir="${test.package.dir}" osfamily="windows" spawn="true" executable="cmd">
+			<arg line="/c bin\startup.bat" />
+		</exec>
+
+		<waitfor maxwait="5" maxwaitunit="minute" timeoutproperty="start.failed">
+			<http url="http://localhost:8080/"/>
+		</waitfor>
+		<fail if="start.failed" message="Virgo Jetty Server start up failed"/>
+	</target>
+	
+	<target name="startup.clean" depends="shutdown">
+		<echo message="Clean Starting of Virgo Server" />
+
+		<exec dir="${test.package.dir}" osfamily="unix" spawn="true" executable="bin/startup.sh">
+			<arg line="-clean" />
+		</exec>
+		
+		<exec dir="${test.package.dir}" osfamily="windows" spawn="true" executable="cmd">
+			<arg line="/c bin\startup.bat" />
+			<arg line="-clean" />
+		</exec>
+
+		<waitfor maxwait="5" maxwaitunit="minute" timeoutproperty="start.failed">
+			<http url="http://localhost:8080/"/>
+		</waitfor>
+		<fail if="start.failed" message="Virgo Jetty Server clean start up failed"/>
+	</target>
+
+	<target name="startup.post"/>
+
+	<target name="shutdown.pre"/>
+
+	<target name="shutdown">
+		<echo message="Shutting Down Virgo Server" />
+
+		<exec dir="${test.package.dir}" osfamily="unix" spawn="true" executable="bin/shutdown.sh"/>
+		<exec dir="${test.package.dir}" osfamily="windows" spawn="true" executable="cmd">
+			<arg line="/c bin\shutdown.bat" />
+		</exec>
+
+		<waitfor maxwait="5" maxwaitunit="minute" timeoutproperty="shutdown.failed">
+			<not>
+				<http url="http://localhost:8080/"/>
+			</not>
+		</waitfor>
+		<fail if="shutdown.failed" message="Virgo Jetty Server shutdown failed"/>
+	</target>
+
+</project>
diff --git a/packaging/kernel/build.gradle b/packaging/kernel/build.gradle
new file mode 100644
index 0000000..93e076b
--- /dev/null
+++ b/packaging/kernel/build.gradle
@@ -0,0 +1,78 @@
+import org.apache.tools.ant.filters.ReplaceTokens
+
+import static virgobuild.VirgoToolsPlugin.DOWNLOAD_VIRGO_BUILD_TOOLS_TASK_NAME
+import static virgobuild.VirgoToolsPlugin.installProduct
+import static virgobuild.VirgoToolsPlugin.publishProduct
+
+import virgobuild.Config
+
+apply plugin: 'distribution'
+
+distributions {
+    main {
+        baseName = 'virgo-kernel'
+        contents {
+            from ( 'src/main/filtered' ) {
+                include ( '**/*.properties' )
+                include ( '**/.version' )
+                filter(ReplaceTokens, tokens: tokenMap) // tokens are used in e.g. oev.kernel.userregion.properties
+            }
+            from ( 'src/main/filtered' ) {
+                include ( 'bin/*.sh' )
+                fileMode 0755
+            }
+            from ( "${buildDir}/VK/kernel/" ) { exclude ( 'Eclipse.app' ) }
+            from ( "${buildDir}/common_resources/" )
+        }
+    }
+}
+
+task ('assembleKernel', dependsOn: [
+    'installProductKernel',
+    'packageResourcesAndProducts'
+]) {
+    installDist.dependsOn(['assembleKernel'])
+    distZip.dependsOn(['assembleKernel'])
+}
+
+task ('packageResourcesAndProducts', dependsOn: [
+    ':kernel:org.eclipse.virgo.kernel.equinox.extensions:jar',
+    ':kernel:org.eclipse.virgo.management.console:war',
+    ':nano:org.eclipse.virgo.nano.authentication:jar',
+    ':nano:org.eclipse.virgo.nano.shutdown:jar',
+    ':util:org.eclipse.virgo.util.env:jar',
+]) {
+    doLast {
+        packageConfiguration('lib', configurations.nanoLib, file("${buildDir}/common_resources/lib/"))
+        packageConfiguration('libPersistence', configurations.nanoLibPersistence, file("${buildDir}/common_resources/lib/persistence/"))
+        packageConfiguration('libEndorsed', configurations.nanoLibEndorsed, file("${buildDir}/common_resources/lib/endorsed/"))
+        packageConfiguration('pluginsExtras', configurations.kernelPluginsExtras, file("${buildDir}/common_resources/plugins"))
+        packageConfiguration('repositoryExt', configurations.repositoryExt, file("${buildDir}/common_resources/repository/ext"))
+        packageConfiguration('pickup', configurations.nanoPickup, file("${buildDir}/common_resources/pickup/"))
+    }
+}
+
+task ('publishKernel', dependsOn: [
+    ':org.eclipse.virgo.site:publishBase',
+    ':org.eclipse.virgo.site:publishKernelBase',
+]) {
+    description = "Publishes a product to a p2 repository. The publishing uses ANY environment configurations."
+
+    def product = 'kernel'
+    def productFileLocation = file("${projectDir}/publish_resources/products/${product}/${product}.product")
+    def javaProfileLocation = file("${projectDir}/src/main/dist/configuration/java-server.profile")
+
+    doLast() { publishProduct(project, productFileLocation, javaProfileLocation) }
+}
+
+task ('installProductKernel', dependsOn: ['publishKernel',]) {
+
+    description = "Installs a Virgo product to a desired destination. Default profile(roaming) is VIRGOProfile, the environment cofigurations are ANY."
+
+    def product = 'kernel'
+    def shortProduct = 'VK'
+    def destinationDir = file("${buildDir}/${shortProduct}/${product}")
+    def productIu = "${product}.product"
+
+    doLast() { installProduct(project, productIu, destinationDir) }
+}
diff --git a/packaging/kernel/org.eclipse.virgo.kernel.smoketest/.gitignore b/packaging/kernel/org.eclipse.virgo.kernel.smoketest/.gitignore
new file mode 100644
index 0000000..fe99505
--- /dev/null
+++ b/packaging/kernel/org.eclipse.virgo.kernel.smoketest/.gitignore
@@ -0,0 +1,2 @@
+bin
+
diff --git a/packaging/kernel/org.eclipse.virgo.kernel.smoketest/src/smokeTest/java/org/eclipse/virgo/kernel/smoketest/KernelSmokeTests.java b/packaging/kernel/org.eclipse.virgo.kernel.smoketest/src/smokeTest/java/org/eclipse/virgo/kernel/smoketest/KernelSmokeTests.java
new file mode 100644
index 0000000..7b19986
--- /dev/null
+++ b/packaging/kernel/org.eclipse.virgo.kernel.smoketest/src/smokeTest/java/org/eclipse/virgo/kernel/smoketest/KernelSmokeTests.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.kernel.smoketest;
+
+import static org.apache.http.HttpStatus.SC_OK;
+import static org.eclipse.virgo.test.tools.JmxUtils.isKernelStarted;
+import static org.eclipse.virgo.test.tools.UrlWaitLatch.waitFor;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.eclipse.virgo.test.tools.AbstractSmokeTests;
+import org.eclipse.virgo.test.tools.JmxUtils;
+import org.eclipse.virgo.test.tools.ServerUtils;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class KernelSmokeTests extends AbstractSmokeTests {
+
+    private static final String VIRGO_FLAVOR = "kernel";
+
+    @Override
+    protected String getVirgoFlavor() {
+        return VIRGO_FLAVOR;
+    }
+
+    @BeforeClass
+    public static void initJmxConnection() {
+        JmxUtils.virgoHome = ServerUtils.getHome(VIRGO_FLAVOR);
+    }
+
+    @Test
+    public void virgoKernelShouldBeStarted() throws Exception {
+        assertTrue(isKernelStarted());
+    }
+
+    @Test
+    public void adminScreenShouldBeAccessableWithDefaultCredentials() {
+        assertEquals(SC_OK, waitFor("http://localhost:8080/admin/content", "admin", "admin"));
+    }
+
+}
diff --git a/packaging/kernel/publish_resources/products/kernel/kernel.product b/packaging/kernel/publish_resources/products/kernel/kernel.product
new file mode 100755
index 0000000..597442d
--- /dev/null
+++ b/packaging/kernel/publish_resources/products/kernel/kernel.product
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<?pde version="3.5"?>

+

+<product name="Eclipse Virgo Kernel Product" uid="kernel.product" version="1.0.0" useFeatures="true" includeLaunchers="false">

+

+	<configIni use="default">

+	</configIni>

+

+	<vm>

+	</vm>

+

+	<plugins>

+	</plugins>

+

+	<features>

+		<feature id="org.eclipse.equinox.http.jetty" version="0.0.0"/>

+	</features>
+

+   <configurations>

+		<plugin id="org.apache.felix.gogo.command" autoStart="true"/>

+		<plugin id="org.apache.felix.gogo.runtime" autoStart="true"/>

+		<plugin id="org.apache.felix.gogo.shell" autoStart="true"/>

+		<plugin id="org.apache.mina.core" autoStart="true"/>

+		<plugin id="org.apache.sshd.core" autoStart="true"/>

+		<plugin id="org.eclipse.equinox.console" autoStart="true"/>

+		<plugin id="org.eclipse.equinox.console.ssh" autoStart="true"/>

+

+		<plugin id="org.eclipse.equinox.http.jetty" autoStart="true"/>

+		<plugin id="org.eclipse.equinox.http.servlet" autoStart="true"/>

+		<plugin id="org.eclipse.gemini.blueprint.extender" autoStart="true"/>

+		<plugin id="org.eclipse.gemini.management" autoStart="true"/>

+

+		<plugin id="org.eclipse.virgo.kernel.agent.dm" autoStart="true"/>

+		<plugin id="org.eclipse.virgo.kernel.artifact" autoStart="true"/>

+		<plugin id="org.eclipse.virgo.kernel.deployer" autoStart="true"/>

+		<plugin id="org.eclipse.virgo.kernel.model" autoStart="true"/>

+		<plugin id="org.eclipse.virgo.kernel.osgi" autoStart="true"/>

+		<plugin id="org.eclipse.virgo.kernel.services" autoStart="true"/>

+		<plugin id="org.eclipse.virgo.kernel.userregionfactory" autoStart="true"/>

+

+		<plugin id="org.eclipse.virgo.nano.core" autoStart="true"/>

+		<plugin id="org.eclipse.virgo.nano.management" autoStart="true"/>

+		<plugin id="org.eclipse.virgo.repository" autoStart="true"/>

+

+	  <property name="org.osgi.service.http.port" value="8080"/>

+

+	</configurations>

+

+</product>

diff --git a/packaging/kernel/publish_resources/products/kernel/p2.inf b/packaging/kernel/publish_resources/products/kernel/p2.inf
new file mode 100644
index 0000000..4c6f109
--- /dev/null
+++ b/packaging/kernel/publish_resources/products/kernel/p2.inf
@@ -0,0 +1,18 @@
+###############################################################################
+# Copyright (c) 2011 SAP AG
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# and Apache License v2.0 which accompanies this distribution.
+# The Eclipse Public License is available at
+#   http://www.eclipse.org/legal/epl-v10.html
+# and the Apache License v2.0 is available at
+#   http://www.opensource.org/licenses/apache2.0.php.
+# You may elect to redistribute this code under either of these licenses.
+#
+# Contributors:
+#   Borislav Kapukaranov - initial contribution
+###############################################################################
+requires.0.name = kernel-base.product
+requires.0.namespace = org.eclipse.equinox.p2.iu
+requires.0.range = 0.0.0
diff --git a/packaging/kernel/src/main/dist/AboutKernel.html b/packaging/kernel/src/main/dist/AboutKernel.html
new file mode 100644
index 0000000..6bc942a
--- /dev/null
+++ b/packaging/kernel/src/main/dist/AboutKernel.html
@@ -0,0 +1,70 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<!-- saved from url=(0047)http://www.eclipse.org/legal/epl/longabout.html -->
+<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+
+<TITLE>About</TITLE>
+</HEAD><BODY lang="EN-US">
+<H2>About This Content</H2>
+ 
+<P>13 December 2012</P>	
+<H3>License</H3>
+
+<P>The Eclipse Foundation makes available all content in this plug-in ("Content").  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL").  A copy of the EPL is available 
+at <A href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</A>.
+For purposes of the EPL, "Program" will mean the Content.</P>
+
+<P>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <A href="http://www.eclipse.org/">http://www.eclipse.org</A>.</P>
+
+		
+		<H3>Third Party Content</H3>
+		<P>The Content includes items that have been sourced from third parties as set out below. If you 
+		did not receive this Content directly from the Eclipse Foundation, the following is provided 
+		for informational purposes only, and you should look to the Redistributor's license for 
+		terms and conditions of use.</P>
+
+		<h4>Nano Third Party Content</h4>
+		<p>This is listed in <a href="AboutNano.html">Nano's About file</a>.
+
+		
+		<h4>
+			<a href="about_files/apache-v20.txt">Apache License 2.0</a>
+		</h4>
+		This product contains software developed by the Apache Software Foundation (<a href="http://www.apache.org">http://www.apache.org</a>).
+		<ul>
+			<li>
+				Apache Commons Codec 1.3.0 - binary and source is available from the <a href="http://commons.apache.org/codec/">Apache Commons Codec project</a>
+			</li>
+			<li>
+				Apache HttpClient 3.1.0 - binary and source is available from the <a href="http://hc.apache.org/httpclient-3.x/">Apache HttpClient project</a>
+			</li>
+			<li>
+				Spring Framework 3.1.0.RELEASE - binary and source is available from the
+				<a href="http://www.springsource.com/download/community">Spring Framework project</a>
+			</li>
+		</ul>
+		<h4>
+			<a href="about_files/asm.txt">ASM License</a>
+		</h4>
+		<ul>
+			<li>
+				ASM 2.2.3 - binary and source is available from the <a href="http://asm.ow2.org/">ASM project</a>
+			</li>
+		</ul>
+		<h4>
+			<a href="http://en.wikipedia.org/wiki/Public_domain">Public Domain</a>
+		</h4>
+		<ul>
+			<li>
+				AOP Alliance 1.0.0 - binary and source is available from the
+				<a href="http://aopalliance.sourceforge.net/">AOP Alliance project</a>
+			</li>
+		</ul>
+
+</BODY></HTML>
\ No newline at end of file
diff --git a/packaging/kernel/src/main/dist/AboutNano.html b/packaging/kernel/src/main/dist/AboutNano.html
new file mode 100644
index 0000000..f1edaee
--- /dev/null
+++ b/packaging/kernel/src/main/dist/AboutNano.html
@@ -0,0 +1,99 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<!-- saved from url=(0047)http://www.eclipse.org/legal/epl/longabout.html -->
+<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+
+<TITLE>About</TITLE>
+</HEAD><BODY lang="EN-US">
+<H2>About This Content</H2>
+ 
+<P>13 December 2012</P>	
+<H3>License</H3>
+
+<P>The Eclipse Foundation makes available all content in this plug-in ("Content").  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL").  A copy of the EPL is available 
+at <A href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</A>.
+For purposes of the EPL, "Program" will mean the Content.</P>
+
+<P>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <A href="http://www.eclipse.org/">http://www.eclipse.org</A>.</P>
+
+		
+		<H3>Third Party Content</H3>
+		<P>The Content includes items that have been sourced from third parties as set out below. If you 
+		did not receive this Content directly from the Eclipse Foundation, the following is provided 
+		for informational purposes only, and you should look to the Redistributor's license for 
+		terms and conditions of use.</P>
+		
+		<h4>
+			<a href="about_files/apache-v20.txt">Apache License 2.0</a>
+		</h4>
+		This product contains software developed by the Apache Software Foundation (<a href="http://www.apache.org">http://www.apache.org</a>).
+		<ul>
+			<li>
+				Apache Commons FileUpload 1.2.0 - binary and source are available from the <a href="http://commons.apache.org/fileupload/">Apache Commons FileUpload project</a>
+			</li>
+			<li>
+				Apache Commons IO 1.4.0 - binary and source are available from the <a href="http://commons.apache.org/io/">Apache Commons IO project</a>
+			</li>
+			<li>
+				Apache Felix Gogo 0.10.0 - binary and source is available from the <a href="http://felix.apache.org">Apache Felix project</a>
+			</li>
+			<li>
+				Apache MINA Core 2.0.2 - binary and source is available from the <a href="http://mina.apache.org/">Apache MINA project</a>
+			</li>
+			<li>
+				Apache MINA SSHD Core 0.5.0 - binary and source is available from the <a href="http://mina.apache.org/">Apache MINA project</a>
+			</li>
+			<li>
+				javax.transaction 1.1.1 - binary and source are available from the <a href="http://geronimo.apache.org/">Apache Geronimo project</a>
+			</li>
+			<li>
+				Jolokia OSGi 1.0.2 - binary and source are available from the <a href="http://www.jolokia.org/">Jolokia project</a>
+			</li>
+			<li>
+				OSGi Enterprise 4.2 - binary and source are available from the <a href="https://www.osgi.org/members/Release42/HomePage">OSGi Alliance</a>
+			</li>
+		</ul>
+		<h4>
+			<a href="about_files/LICENSE-AspectJ.html">AspectJ License</a>
+		</h4>
+		<ul>
+			<li>
+				AspectJ Weaver 1.6.12 - binary and source is available from the <a href="http://eclipse.org/aspectj">AspectJ project</a>
+			</li>
+		</ul>
+		<h4>
+			<a href="about_files/cddl-10.txt">Common Development and Distribution License 1.0</a>
+		</h4>
+		<ul>
+			<li>
+				javax.annotation 1.1.0 - binary and source is available from the
+				<a href="http://glassfish.java.net/">GlassFish Project</a> (Dual-licensed CDDL 1.0 or GPL 2. Virgo elects to use CDDL 1.0.)
+			</li>
+		</ul>
+
+		<h4>
+			<a href="epl-v10.html">Eclipse Public License 1.0</a>
+		</h4>
+		<ul>
+			<li>
+				Logback 1.0.7 - binary and source is available from the
+				<a href="http://logback.qos.ch/">Logback project</a> (Dual-licensed EPL or LGPL. Virgo elects to use EPL.)
+			</li>
+		</ul>
+		<h4>
+			<a href="about_files/slf4j.txt">SLF4J License</a>
+		</h4>
+		<ul>
+			<li>
+				Simple Logging Facade for Java (SLF4J) 1.7.2 - binary and source is available from the
+				<a href="http://www.slf4j.org/">SLF4J Project</a>
+			</li>
+		</ul>
+
+</BODY></HTML>
\ No newline at end of file
diff --git a/packaging/kernel/src/main/dist/about_files/LICENSE-AspectJ.html b/packaging/kernel/src/main/dist/about_files/LICENSE-AspectJ.html
new file mode 100644
index 0000000..8f7d0a4
--- /dev/null
+++ b/packaging/kernel/src/main/dist/about_files/LICENSE-AspectJ.html
@@ -0,0 +1,91 @@
+<html>
+
+<head>
+<title>AspectJ License</title>
+
+
+</head>
+
+<BODY BGCOLOR="white">
+
+<h2 align="center"><b>AspectJ<sup><small>TM</small></sup>
+                      Compiler and Core Tools License</b></h2>
+
+<p>This is a binary-only release.&nbsp; Source code
+is available from
+<a href="http://eclipse.org/aspectj">http://eclipse.org/aspectj</a></p>
+
+<p>The Eclipse Foundation makes available all content in this distribution ("Content").  
+		Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
+		Eclipse Public License Version 1.0 ("EPL").  A copy of the EPL is available 
+		at <a href="../../org/documents/epl-v10.php">http://www.eclipse.org/legal/epl-v10.html</a>.
+		For purposes of the EPL, "Program" will mean the Content.</p>
+
+		<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+		being redistributed by another party ("Redistributor") and different terms and conditions may
+		apply to your use of any object code in the Content.  Check the Redistributor's license 
+		that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+		indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+		and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+		
+		<h3>Third Party Content</h3>
+		<p>The Content includes items that have been sourced from third parties as set out below. If you 
+		did not receive this Content directly from the Eclipse Foundation, the following is provided 
+		for informational purposes only, and you should look to the Redistributor?s license for 
+		terms and conditions of use.</p>
+		<em>
+
+		<h4>BCEL v5.1</h4>
+		<p>This product contains software developed by the
+         Apache Software Foundation (<a href="http://www.apache.org/">http://www.apache.org</a>).</p>
+ 
+		<p>AspectJ includes a modified version of the Apache Jakarta Byte Code Engineering Library (BCEL) v5.1.
+		BCEL is available at <a href="http://jakarta.apache.org/bcel/">http://jakarta.apache.org/bcel/</a>. Source
+		code for the modified version of BCEL is available at Eclipse.org in the AspectJ source tree. This code
+		is made available under the Apache Software License v1.1</p>
+		
+		<h4>ASM v2.2.1</h4> 
+		<p>AspectJ includes a binary version of ASM v2.2.1 (<a href="http://asm.objectweb.org/index.html">http://asm.objectweb.org/</a>)
+		The source code for ASM is available from the ObjectWeb download site at 
+		<a href="http://asm.objectweb.org/download/">http://asm.objectweb.org/download/</a>. 
+		<p>The ASM license is available at <a href="http://asm.objectweb.org/license.html">http://asm.objectweb.org/license.html</a>. 
+		The license is also reproduced here:
+		</p>
+
+<pre>Copyright (c) 2000-2005 INRIA, France Telecom
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holders nor the names of its
+   contributors may be used to endorse or promote products derived from
+   this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGE.
+</pre>
+
+</em>
+
+</body>
+
+</html>
diff --git a/packaging/kernel/src/main/dist/about_files/apache-v20.txt b/packaging/kernel/src/main/dist/about_files/apache-v20.txt
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/packaging/kernel/src/main/dist/about_files/apache-v20.txt
@@ -0,0 +1,202 @@
+
+                                 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/packaging/kernel/src/main/dist/about_files/asm.txt b/packaging/kernel/src/main/dist/about_files/asm.txt
new file mode 100644
index 0000000..c5aba7b
--- /dev/null
+++ b/packaging/kernel/src/main/dist/about_files/asm.txt
@@ -0,0 +1,29 @@
+Copyright (c) 2000-2011 INRIA, France Telecom
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holders nor the names of its
+   contributors may be used to endorse or promote products derived from
+   this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/packaging/kernel/src/main/dist/about_files/cddl-10.txt b/packaging/kernel/src/main/dist/about_files/cddl-10.txt
new file mode 100644
index 0000000..9709055
--- /dev/null
+++ b/packaging/kernel/src/main/dist/about_files/cddl-10.txt
@@ -0,0 +1,380 @@
+COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0
+
+1. Definitions.
+
+1.1. "Contributor" means each individual or entity that
+creates or contributes to the creation of Modifications.
+
+1.2. "Contributor Version" means the combination of the
+Original Software, prior Modifications used by a
+Contributor (if any), and the Modifications made by that
+particular Contributor.
+
+1.3. "Covered Software" means (a) the Original Software, or
+(b) Modifications, or (c) the combination of files
+containing Original Software with files containing
+Modifications, in each case including portions thereof.
+
+1.4. "Executable" means the Covered Software in any form
+other than Source Code.
+
+1.5. "Initial Developer" means the individual or entity
+that first makes Original Software available under this
+License.
+
+1.6. "Larger Work" means a work which combines Covered
+Software or portions thereof with code not governed by the
+terms of this License.
+
+1.7. "License" means this document.
+
+1.8. "Licensable" means having the right to grant, to the
+maximum extent possible, whether at the time of the initial
+grant or subsequently acquired, any and all of the rights
+conveyed herein.
+
+1.9. "Modifications" means the Source Code and Executable
+form of any of the following:
+
+A. Any file that results from an addition to,
+deletion from or modification of the contents of a
+file containing Original Software or previous
+Modifications;
+
+B. Any new file that contains any part of the
+Original Software or previous Modification; or
+
+C. Any new file that is contributed or otherwise made
+available under the terms of this License.
+
+1.10. "Original Software" means the Source Code and
+Executable form of computer software code that is
+originally released under this License.
+
+1.11. "Patent Claims" means any patent claim(s), now owned
+or hereafter acquired, including without limitation,
+method, process, and apparatus claims, in any patent
+Licensable by grantor.
+
+1.12. "Source Code" means (a) the common form of computer
+software code in which modifications are made and (b)
+associated documentation included in or with such code.
+
+1.13. "You" (or "Your") means an individual or a legal
+entity exercising rights under, and complying with all of
+the terms of, this License. For legal entities, "You"
+includes any entity which controls, is controlled by, or is
+under common control with You. For purposes of this
+definition, "control" means (a) the power, direct or
+indirect, to cause the direction or management of such
+entity, whether by contract or otherwise, or (b) ownership
+of more than fifty percent (50%) of the outstanding shares
+or beneficial ownership of such entity.
+
+2. License Grants.
+
+2.1. The Initial Developer Grant.
+
+Conditioned upon Your compliance with Section 3.1 below and
+subject to third party intellectual property claims, the
+Initial Developer hereby grants You a world-wide,
+royalty-free, non-exclusive license:
+
+(a) under intellectual property rights (other than
+patent or trademark) Licensable by Initial Developer,
+to use, reproduce, modify, display, perform,
+sublicense and distribute the Original Software (or
+portions thereof), with or without Modifications,
+and/or as part of a Larger Work; and
+
+(b) under Patent Claims infringed by the making,
+using or selling of Original Software, to make, have
+made, use, practice, sell, and offer for sale, and/or
+otherwise dispose of the Original Software (or
+portions thereof).
+
+(c) The licenses granted in Sections 2.1(a) and (b)
+are effective on the date Initial Developer first
+distributes or otherwise makes the Original Software
+available to a third party under the terms of this
+License.
+
+(d) Notwithstanding Section 2.1(b) above, no patent
+license is granted: (1) for code that You delete from
+the Original Software, or (2) for infringements
+caused by: (i) the modification of the Original
+Software, or (ii) the combination of the Original
+Software with other software or devices.
+
+2.2. Contributor Grant.
+
+Conditioned upon Your compliance with Section 3.1 below and
+subject to third party intellectual property claims, each
+Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than
+patent or trademark) Licensable by Contributor to
+use, reproduce, modify, display, perform, sublicense
+and distribute the Modifications created by such
+Contributor (or portions thereof), either on an
+unmodified basis, with other Modifications, as
+Covered Software and/or as part of a Larger Work; and
+
+(b) under Patent Claims infringed by the making,
+using, or selling of Modifications made by that
+Contributor either alone and/or in combination with
+its Contributor Version (or portions of such
+combination), to make, use, sell, offer for sale,
+have made, and/or otherwise dispose of: (1)
+Modifications made by that Contributor (or portions
+thereof); and (2) the combination of Modifications
+made by that Contributor with its Contributor Version
+(or portions of such combination).
+
+(c) The licenses granted in Sections 2.2(a) and
+2.2(b) are effective on the date Contributor first
+distributes or otherwise makes the Modifications
+available to a third party.
+
+(d) Notwithstanding Section 2.2(b) above, no patent
+license is granted: (1) for any code that Contributor
+has deleted from the Contributor Version; (2) for
+infringements caused by: (i) third party
+modifications of Contributor Version, or (ii) the
+combination of Modifications made by that Contributor
+with other software (except as part of the
+Contributor Version) or other devices; or (3) under
+Patent Claims infringed by Covered Software in the
+absence of Modifications made by that Contributor.
+
+3. Distribution Obligations.
+
+3.1. Availability of Source Code.
+
+Any Covered Software that You distribute or otherwise make
+available in Executable form must also be made available in
+Source Code form and that Source Code form must be
+distributed only under the terms of this License. You must
+include a copy of this License with every copy of the
+Source Code form of the Covered Software You distribute or
+otherwise make available. You must inform recipients of any
+such Covered Software in Executable form as to how they can
+obtain such Covered Software in Source Code form in a
+reasonable manner on or through a medium customarily used
+for software exchange.
+
+3.2. Modifications.
+
+The Modifications that You create or to which You
+contribute are governed by the terms of this License. You
+represent that You believe Your Modifications are Your
+original creation(s) and/or You have sufficient rights to
+grant the rights conveyed by this License.
+
+3.3. Required Notices.
+
+You must include a notice in each of Your Modifications
+that identifies You as the Contributor of the Modification.
+You may not remove or alter any copyright, patent or
+trademark notices contained within the Covered Software, or
+any notices of licensing or any descriptive text giving
+attribution to any Contributor or the Initial Developer.
+
+3.4. Application of Additional Terms.
+
+You may not offer or impose any terms on any Covered
+Software in Source Code form that alters or restricts the
+applicable version of this License or the recipients'
+rights hereunder. You may choose to offer, and to charge a
+fee for, warranty, support, indemnity or liability
+obligations to one or more recipients of Covered Software.
+However, you may do so only on Your own behalf, and not on
+behalf of the Initial Developer or any Contributor. You
+must make it absolutely clear that any such warranty,
+support, indemnity or liability obligation is offered by
+You alone, and You hereby agree to indemnify the Initial
+Developer and every Contributor for any liability incurred
+by the Initial Developer or such Contributor as a result of
+warranty, support, indemnity or liability terms You offer.
+
+3.5. Distribution of Executable Versions.
+
+You may distribute the Executable form of the Covered
+Software under the terms of this License or under the terms
+of a license of Your choice, which may contain terms
+different from this License, provided that You are in
+compliance with the terms of this License and that the
+license for the Executable form does not attempt to limit
+or alter the recipient's rights in the Source Code form
+from the rights set forth in this License. If You
+distribute the Covered Software in Executable form under a
+different license, You must make it absolutely clear that
+any terms which differ from this License are offered by You
+alone, not by the Initial Developer or Contributor. You
+hereby agree to indemnify the Initial Developer and every
+Contributor for any liability incurred by the Initial
+Developer or such Contributor as a result of any such terms
+You offer.
+
+3.6. Larger Works.
+
+You may create a Larger Work by combining Covered Software
+with other code not governed by the terms of this License
+and distribute the Larger Work as a single product. In such
+a case, You must make sure the requirements of this License
+are fulfilled for the Covered Software.
+
+4. Versions of the License.
+
+4.1. New Versions.
+
+Sun Microsystems, Inc. is the initial license steward and
+may publish revised and/or new versions of this License
+from time to time. Each version will be given a
+distinguishing version number. Except as provided in
+Section 4.3, no one other than the license steward has the
+right to modify this License.
+
+4.2. Effect of New Versions.
+
+You may always continue to use, distribute or otherwise
+make the Covered Software available under the terms of the
+version of the License under which You originally received
+the Covered Software. If the Initial Developer includes a
+notice in the Original Software prohibiting it from being
+distributed or otherwise made available under any
+subsequent version of the License, You must distribute and
+make the Covered Software available under the terms of the
+version of the License under which You originally received
+the Covered Software. Otherwise, You may also choose to
+use, distribute or otherwise make the Covered Software
+available under the terms of any subsequent version of the
+License published by the license steward.
+
+4.3. Modified Versions.
+
+When You are an Initial Developer and You want to create a
+new license for Your Original Software, You may create and
+use a modified version of this License if You: (a) rename
+the license and remove any references to the name of the
+license steward (except to note that the license differs
+from this License); and (b) otherwise make it clear that
+the license contains terms which differ from this License.
+
+5. DISCLAIMER OF WARRANTY.
+
+COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS"
+BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
+INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED
+SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR
+PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND
+PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY
+COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE
+INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF
+ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF
+WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF
+ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS
+DISCLAIMER.
+
+6. TERMINATION.
+
+6.1. This License and the rights granted hereunder will
+terminate automatically if You fail to comply with terms
+herein and fail to cure such breach within 30 days of
+becoming aware of the breach. Provisions which, by their
+nature, must remain in effect beyond the termination of
+this License shall survive.
+
+6.2. If You assert a patent infringement claim (excluding
+declaratory judgment actions) against Initial Developer or
+a Contributor (the Initial Developer or Contributor against
+whom You assert such claim is referred to as "Participant")
+alleging that the Participant Software (meaning the
+Contributor Version where the Participant is a Contributor
+or the Original Software where the Participant is the
+Initial Developer) directly or indirectly infringes any
+patent, then any and all rights granted directly or
+indirectly to You by such Participant, the Initial
+Developer (if the Initial Developer is not the Participant)
+and all Contributors under Sections 2.1 and/or 2.2 of this
+License shall, upon 60 days notice from Participant
+terminate prospectively and automatically at the expiration
+of such 60 day notice period, unless if within such 60 day
+period You withdraw Your claim with respect to the
+Participant Software against such Participant either
+unilaterally or pursuant to a written agreement with
+Participant.
+
+6.3. In the event of termination under Sections 6.1 or 6.2
+above, all end user licenses that have been validly granted
+by You or any distributor hereunder prior to termination
+(excluding licenses granted to You by any distributor)
+shall survive termination.
+
+7. LIMITATION OF LIABILITY.
+
+UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
+(INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE
+INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF
+COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE
+LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR
+CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT
+LIMITATION, DAMAGES FOR LOST PROFITS, LOSS OF GOODWILL, WORK
+STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
+COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN
+INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
+LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL
+INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT
+APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO
+NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR
+CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT
+APPLY TO YOU.
+
+8. U.S. GOVERNMENT END USERS.
+
+The Covered Software is a "commercial item," as that term is
+defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial
+computer software" (as that term is defined at 48 C.F.R. ¤
+252.227-7014(a)(1)) and "commercial computer software
+documentation" as such terms are used in 48 C.F.R. 12.212 (Sept.
+1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1
+through 227.7202-4 (June 1995), all U.S. Government End Users
+acquire Covered Software with only those rights set forth herein.
+This U.S. Government Rights clause is in lieu of, and supersedes,
+any other FAR, DFAR, or other clause or provision that addresses
+Government rights in computer software under this License.
+
+9. MISCELLANEOUS.
+
+This License represents the complete agreement concerning subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the
+extent necessary to make it enforceable. This License shall be
+governed by the law of the jurisdiction specified in a notice
+contained within the Original Software (except to the extent
+applicable law, if any, provides otherwise), excluding such
+jurisdiction's conflict-of-law provisions. Any litigation
+relating to this License shall be subject to the jurisdiction of
+the courts located in the jurisdiction and venue specified in a
+notice contained within the Original Software, with the losing
+party responsible for costs, including, without limitation, court
+costs and reasonable attorneys' fees and expenses. The
+application of the United Nations Convention on Contracts for the
+International Sale of Goods is expressly excluded. Any law or
+regulation which provides that the language of a contract shall
+be construed against the drafter shall not apply to this License.
+You agree that You alone are responsible for compliance with the
+United States export administration regulations (and the export
+control laws and regulation of any other countries) when You use,
+distribute or otherwise make available any Covered Software.
+
+10. RESPONSIBILITY FOR CLAIMS.
+
+As between Initial Developer and the Contributors, each party is
+responsible for claims and damages arising, directly or
+indirectly, out of its utilization of rights under this License
+and You agree to work with Initial Developer and Contributors to
+distribute such responsibility on an equitable basis. Nothing
+herein is intended or shall be deemed to constitute any admission
+of liability.
diff --git a/packaging/kernel/src/main/dist/about_files/cpl-10.txt b/packaging/kernel/src/main/dist/about_files/cpl-10.txt
new file mode 100644
index 0000000..eb9ef5b
--- /dev/null
+++ b/packaging/kernel/src/main/dist/about_files/cpl-10.txt
@@ -0,0 +1,92 @@
+Common Public License - v 1.0
+
+Updated 16 Apr 2009
+
+As of 25 Feb 2009, IBM has assigned the Agreement Steward role for the CPL to the Eclipse Foundation. Eclipse has designated the Eclipse Public License (EPL) as the follow-on version of the CPL.
+
+
+THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
+
+
+1. DEFINITIONS
+
+"Contribution" means:
+
+a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and
+b) in the case of each subsequent Contributor:
+i)	 changes to the Program, and
+ii)	 additions to the Program;
+where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.
+
+"Contributor" means any person or entity that distributes the Program.
+
+
+"Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.
+
+
+"Program" means the Contributions distributed in accordance with this Agreement.
+
+
+"Recipient" means anyone who receives the Program under this Agreement, including all Contributors.
+
+
+2. GRANT OF RIGHTS
+
+a)	Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.
+b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder.
+c)	Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program.
+d)	Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement.
+3. REQUIREMENTS
+
+A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:
+
+a)	it complies with the terms and conditions of this Agreement; and
+b)	its license agreement:
+i)	effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose;
+ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits;
+iii)	states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and
+iv)	states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange.
+When the Program is made available in source code form:
+
+a)	it must be made available under this Agreement; and
+b)	a copy of this Agreement must be included with each copy of the Program.
+
+Contributors may not remove or alter any copyright notices contained within the Program.
+
+
+Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution.
+
+
+4. COMMERCIAL DISTRIBUTION
+
+Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense.
+
+
+For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.
+
+
+5. NO WARRANTY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. 
+
+
+6. DISCLAIMER OF LIABILITY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+
+7. GENERAL
+
+If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
+
+
+If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed. In addition, if Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed.
+
+
+All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive. 
+
+
+Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. IBM is the initial Agreement Steward. IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved.
+
+
+This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation.
\ No newline at end of file
diff --git a/packaging/kernel/src/main/dist/about_files/mpl-1.1.txt b/packaging/kernel/src/main/dist/about_files/mpl-1.1.txt
new file mode 100644
index 0000000..06f9651
--- /dev/null
+++ b/packaging/kernel/src/main/dist/about_files/mpl-1.1.txt
@@ -0,0 +1,469 @@
+                          MOZILLA PUBLIC LICENSE
+                                Version 1.1
+
+                              ---------------
+
+1. Definitions.
+
+     1.0.1. "Commercial Use" means distribution or otherwise making the
+     Covered Code available to a third party.
+
+     1.1. "Contributor" means each entity that creates or contributes to
+     the creation of Modifications.
+
+     1.2. "Contributor Version" means the combination of the Original
+     Code, prior Modifications used by a Contributor, and the Modifications
+     made by that particular Contributor.
+
+     1.3. "Covered Code" means the Original Code or Modifications or the
+     combination of the Original Code and Modifications, in each case
+     including portions thereof.
+
+     1.4. "Electronic Distribution Mechanism" means a mechanism generally
+     accepted in the software development community for the electronic
+     transfer of data.
+
+     1.5. "Executable" means Covered Code in any form other than Source
+     Code.
+
+     1.6. "Initial Developer" means the individual or entity identified
+     as the Initial Developer in the Source Code notice required by Exhibit
+     A.
+
+     1.7. "Larger Work" means a work which combines Covered Code or
+     portions thereof with code not governed by the terms of this License.
+
+     1.8. "License" means this document.
+
+     1.8.1. "Licensable" means having the right to grant, to the maximum
+     extent possible, whether at the time of the initial grant or
+     subsequently acquired, any and all of the rights conveyed herein.
+
+     1.9. "Modifications" means any addition to or deletion from the
+     substance or structure of either the Original Code or any previous
+     Modifications. When Covered Code is released as a series of files, a
+     Modification is:
+          A. Any addition to or deletion from the contents of a file
+          containing Original Code or previous Modifications.
+
+          B. Any new file that contains any part of the Original Code or
+          previous Modifications.
+
+     1.10. "Original Code" means Source Code of computer software code
+     which is described in the Source Code notice required by Exhibit A as
+     Original Code, and which, at the time of its release under this
+     License is not already Covered Code governed by this License.
+
+     1.10.1. "Patent Claims" means any patent claim(s), now owned or
+     hereafter acquired, including without limitation,  method, process,
+     and apparatus claims, in any patent Licensable by grantor.
+
+     1.11. "Source Code" means the preferred form of the Covered Code for
+     making modifications to it, including all modules it contains, plus
+     any associated interface definition files, scripts used to control
+     compilation and installation of an Executable, or source code
+     differential comparisons against either the Original Code or another
+     well known, available Covered Code of the Contributor's choice. The
+     Source Code can be in a compressed or archival form, provided the
+     appropriate decompression or de-archiving software is widely available
+     for no charge.
+
+     1.12. "You" (or "Your")  means an individual or a legal entity
+     exercising rights under, and complying with all of the terms of, this
+     License or a future version of this License issued under Section 6.1.
+     For legal entities, "You" includes any entity which controls, is
+     controlled by, or is under common control with You. For purposes of
+     this definition, "control" means (a) the power, direct or indirect,
+     to cause the direction or management of such entity, whether by
+     contract or otherwise, or (b) ownership of more than fifty percent
+     (50%) of the outstanding shares or beneficial ownership of such
+     entity.
+
+2. Source Code License.
+
+     2.1. The Initial Developer Grant.
+     The Initial Developer hereby grants You a world-wide, royalty-free,
+     non-exclusive license, subject to third party intellectual property
+     claims:
+          (a)  under intellectual property rights (other than patent or
+          trademark) Licensable by Initial Developer to use, reproduce,
+          modify, display, perform, sublicense and distribute the Original
+          Code (or portions thereof) with or without Modifications, and/or
+          as part of a Larger Work; and
+
+          (b) under Patents Claims infringed by the making, using or
+          selling of Original Code, to make, have made, use, practice,
+          sell, and offer for sale, and/or otherwise dispose of the
+          Original Code (or portions thereof).
+
+          (c) the licenses granted in this Section 2.1(a) and (b) are
+          effective on the date Initial Developer first distributes
+          Original Code under the terms of this License.
+
+          (d) Notwithstanding Section 2.1(b) above, no patent license is
+          granted: 1) for code that You delete from the Original Code; 2)
+          separate from the Original Code;  or 3) for infringements caused
+          by: i) the modification of the Original Code or ii) the
+          combination of the Original Code with other software or devices.
+
+     2.2. Contributor Grant.
+     Subject to third party intellectual property claims, each Contributor
+     hereby grants You a world-wide, royalty-free, non-exclusive license
+
+          (a)  under intellectual property rights (other than patent or
+          trademark) Licensable by Contributor, to use, reproduce, modify,
+          display, perform, sublicense and distribute the Modifications
+          created by such Contributor (or portions thereof) either on an
+          unmodified basis, with other Modifications, as Covered Code
+          and/or as part of a Larger Work; and
+
+          (b) under Patent Claims infringed by the making, using, or
+          selling of  Modifications made by that Contributor either alone
+          and/or in combination with its Contributor Version (or portions
+          of such combination), to make, use, sell, offer for sale, have
+          made, and/or otherwise dispose of: 1) Modifications made by that
+          Contributor (or portions thereof); and 2) the combination of
+          Modifications made by that Contributor with its Contributor
+          Version (or portions of such combination).
+
+          (c) the licenses granted in Sections 2.2(a) and 2.2(b) are
+          effective on the date Contributor first makes Commercial Use of
+          the Covered Code.
+
+          (d)    Notwithstanding Section 2.2(b) above, no patent license is
+          granted: 1) for any code that Contributor has deleted from the
+          Contributor Version; 2)  separate from the Contributor Version;
+          3)  for infringements caused by: i) third party modifications of
+          Contributor Version or ii)  the combination of Modifications made
+          by that Contributor with other software  (except as part of the
+          Contributor Version) or other devices; or 4) under Patent Claims
+          infringed by Covered Code in the absence of Modifications made by
+          that Contributor.
+
+3. Distribution Obligations.
+
+     3.1. Application of License.
+     The Modifications which You create or to which You contribute are
+     governed by the terms of this License, including without limitation
+     Section 2.2. The Source Code version of Covered Code may be
+     distributed only under the terms of this License or a future version
+     of this License released under Section 6.1, and You must include a
+     copy of this License with every copy of the Source Code You
+     distribute. You may not offer or impose any terms on any Source Code
+     version that alters or restricts the applicable version of this
+     License or the recipients' rights hereunder. However, You may include
+     an additional document offering the additional rights described in
+     Section 3.5.
+
+     3.2. Availability of Source Code.
+     Any Modification which You create or to which You contribute must be
+     made available in Source Code form under the terms of this License
+     either on the same media as an Executable version or via an accepted
+     Electronic Distribution Mechanism to anyone to whom you made an
+     Executable version available; and if made available via Electronic
+     Distribution Mechanism, must remain available for at least twelve (12)
+     months after the date it initially became available, or at least six
+     (6) months after a subsequent version of that particular Modification
+     has been made available to such recipients. You are responsible for
+     ensuring that the Source Code version remains available even if the
+     Electronic Distribution Mechanism is maintained by a third party.
+
+     3.3. Description of Modifications.
+     You must cause all Covered Code to which You contribute to contain a
+     file documenting the changes You made to create that Covered Code and
+     the date of any change. You must include a prominent statement that
+     the Modification is derived, directly or indirectly, from Original
+     Code provided by the Initial Developer and including the name of the
+     Initial Developer in (a) the Source Code, and (b) in any notice in an
+     Executable version or related documentation in which You describe the
+     origin or ownership of the Covered Code.
+
+     3.4. Intellectual Property Matters
+          (a) Third Party Claims.
+          If Contributor has knowledge that a license under a third party's
+          intellectual property rights is required to exercise the rights
+          granted by such Contributor under Sections 2.1 or 2.2,
+          Contributor must include a text file with the Source Code
+          distribution titled "LEGAL" which describes the claim and the
+          party making the claim in sufficient detail that a recipient will
+          know whom to contact. If Contributor obtains such knowledge after
+          the Modification is made available as described in Section 3.2,
+          Contributor shall promptly modify the LEGAL file in all copies
+          Contributor makes available thereafter and shall take other steps
+          (such as notifying appropriate mailing lists or newsgroups)
+          reasonably calculated to inform those who received the Covered
+          Code that new knowledge has been obtained.
+
+          (b) Contributor APIs.
+          If Contributor's Modifications include an application programming
+          interface and Contributor has knowledge of patent licenses which
+          are reasonably necessary to implement that API, Contributor must
+          also include this information in the LEGAL file.
+
+               (c)    Representations.
+          Contributor represents that, except as disclosed pursuant to
+          Section 3.4(a) above, Contributor believes that Contributor's
+          Modifications are Contributor's original creation(s) and/or
+          Contributor has sufficient rights to grant the rights conveyed by
+          this License.
+
+     3.5. Required Notices.
+     You must duplicate the notice in Exhibit A in each file of the Source
+     Code.  If it is not possible to put such notice in a particular Source
+     Code file due to its structure, then You must include such notice in a
+     location (such as a relevant directory) where a user would be likely
+     to look for such a notice.  If You created one or more Modification(s)
+     You may add your name as a Contributor to the notice described in
+     Exhibit A.  You must also duplicate this License in any documentation
+     for the Source Code where You describe recipients' rights or ownership
+     rights relating to Covered Code.  You may choose to offer, and to
+     charge a fee for, warranty, support, indemnity or liability
+     obligations to one or more recipients of Covered Code. However, You
+     may do so only on Your own behalf, and not on behalf of the Initial
+     Developer or any Contributor. You must make it absolutely clear than
+     any such warranty, support, indemnity or liability obligation is
+     offered by You alone, and You hereby agree to indemnify the Initial
+     Developer and every Contributor for any liability incurred by the
+     Initial Developer or such Contributor as a result of warranty,
+     support, indemnity or liability terms You offer.
+
+     3.6. Distribution of Executable Versions.
+     You may distribute Covered Code in Executable form only if the
+     requirements of Section 3.1-3.5 have been met for that Covered Code,
+     and if You include a notice stating that the Source Code version of
+     the Covered Code is available under the terms of this License,
+     including a description of how and where You have fulfilled the
+     obligations of Section 3.2. The notice must be conspicuously included
+     in any notice in an Executable version, related documentation or
+     collateral in which You describe recipients' rights relating to the
+     Covered Code. You may distribute the Executable version of Covered
+     Code or ownership rights under a license of Your choice, which may
+     contain terms different from this License, provided that You are in
+     compliance with the terms of this License and that the license for the
+     Executable version does not attempt to limit or alter the recipient's
+     rights in the Source Code version from the rights set forth in this
+     License. If You distribute the Executable version under a different
+     license You must make it absolutely clear that any terms which differ
+     from this License are offered by You alone, not by the Initial
+     Developer or any Contributor. You hereby agree to indemnify the
+     Initial Developer and every Contributor for any liability incurred by
+     the Initial Developer or such Contributor as a result of any such
+     terms You offer.
+
+     3.7. Larger Works.
+     You may create a Larger Work by combining Covered Code with other code
+     not governed by the terms of this License and distribute the Larger
+     Work as a single product. In such a case, You must make sure the
+     requirements of this License are fulfilled for the Covered Code.
+
+4. Inability to Comply Due to Statute or Regulation.
+
+     If it is impossible for You to comply with any of the terms of this
+     License with respect to some or all of the Covered Code due to
+     statute, judicial order, or regulation then You must: (a) comply with
+     the terms of this License to the maximum extent possible; and (b)
+     describe the limitations and the code they affect. Such description
+     must be included in the LEGAL file described in Section 3.4 and must
+     be included with all distributions of the Source Code. Except to the
+     extent prohibited by statute or regulation, such description must be
+     sufficiently detailed for a recipient of ordinary skill to be able to
+     understand it.
+
+5. Application of this License.
+
+     This License applies to code to which the Initial Developer has
+     attached the notice in Exhibit A and to related Covered Code.
+
+6. Versions of the License.
+
+     6.1. New Versions.
+     Netscape Communications Corporation ("Netscape") may publish revised
+     and/or new versions of the License from time to time. Each version
+     will be given a distinguishing version number.
+
+     6.2. Effect of New Versions.
+     Once Covered Code has been published under a particular version of the
+     License, You may always continue to use it under the terms of that
+     version. You may also choose to use such Covered Code under the terms
+     of any subsequent version of the License published by Netscape. No one
+     other than Netscape has the right to modify the terms applicable to
+     Covered Code created under this License.
+
+     6.3. Derivative Works.
+     If You create or use a modified version of this License (which you may
+     only do in order to apply it to code which is not already Covered Code
+     governed by this License), You must (a) rename Your license so that
+     the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape",
+     "MPL", "NPL" or any confusingly similar phrase do not appear in your
+     license (except to note that your license differs from this License)
+     and (b) otherwise make it clear that Your version of the license
+     contains terms which differ from the Mozilla Public License and
+     Netscape Public License. (Filling in the name of the Initial
+     Developer, Original Code or Contributor in the notice described in
+     Exhibit A shall not of themselves be deemed to be modifications of
+     this License.)
+
+7. DISCLAIMER OF WARRANTY.
+
+     COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS,
+     WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+     WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF
+     DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING.
+     THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE
+     IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT,
+     YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE
+     COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER
+     OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF
+     ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
+
+8. TERMINATION.
+
+     8.1.  This License and the rights granted hereunder will terminate
+     automatically if You fail to comply with terms herein and fail to cure
+     such breach within 30 days of becoming aware of the breach. All
+     sublicenses to the Covered Code which are properly granted shall
+     survive any termination of this License. Provisions which, by their
+     nature, must remain in effect beyond the termination of this License
+     shall survive.
+
+     8.2.  If You initiate litigation by asserting a patent infringement
+     claim (excluding declatory judgment actions) against Initial Developer
+     or a Contributor (the Initial Developer or Contributor against whom
+     You file such action is referred to as "Participant")  alleging that:
+
+     (a)  such Participant's Contributor Version directly or indirectly
+     infringes any patent, then any and all rights granted by such
+     Participant to You under Sections 2.1 and/or 2.2 of this License
+     shall, upon 60 days notice from Participant terminate prospectively,
+     unless if within 60 days after receipt of notice You either: (i)
+     agree in writing to pay Participant a mutually agreeable reasonable
+     royalty for Your past and future use of Modifications made by such
+     Participant, or (ii) withdraw Your litigation claim with respect to
+     the Contributor Version against such Participant.  If within 60 days
+     of notice, a reasonable royalty and payment arrangement are not
+     mutually agreed upon in writing by the parties or the litigation claim
+     is not withdrawn, the rights granted by Participant to You under
+     Sections 2.1 and/or 2.2 automatically terminate at the expiration of
+     the 60 day notice period specified above.
+
+     (b)  any software, hardware, or device, other than such Participant's
+     Contributor Version, directly or indirectly infringes any patent, then
+     any rights granted to You by such Participant under Sections 2.1(b)
+     and 2.2(b) are revoked effective as of the date You first made, used,
+     sold, distributed, or had made, Modifications made by that
+     Participant.
+
+     8.3.  If You assert a patent infringement claim against Participant
+     alleging that such Participant's Contributor Version directly or
+     indirectly infringes any patent where such claim is resolved (such as
+     by license or settlement) prior to the initiation of patent
+     infringement litigation, then the reasonable value of the licenses
+     granted by such Participant under Sections 2.1 or 2.2 shall be taken
+     into account in determining the amount or value of any payment or
+     license.
+
+     8.4.  In the event of termination under Sections 8.1 or 8.2 above,
+     all end user license agreements (excluding distributors and resellers)
+     which have been validly granted by You or any distributor hereunder
+     prior to termination shall survive termination.
+
+9. LIMITATION OF LIABILITY.
+
+     UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
+     (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL
+     DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE,
+     OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR
+     ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY
+     CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL,
+     WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
+     COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN
+     INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
+     LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY
+     RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW
+     PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE
+     EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO
+     THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
+
+10. U.S. GOVERNMENT END USERS.
+
+     The Covered Code is a "commercial item," as that term is defined in
+     48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer
+     software" and "commercial computer software documentation," as such
+     terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48
+     C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995),
+     all U.S. Government End Users acquire Covered Code with only those
+     rights set forth herein.
+
+11. MISCELLANEOUS.
+
+     This License represents the complete agreement concerning subject
+     matter hereof. If any provision of this License is held to be
+     unenforceable, such provision shall be reformed only to the extent
+     necessary to make it enforceable. This License shall be governed by
+     California law provisions (except to the extent applicable law, if
+     any, provides otherwise), excluding its conflict-of-law provisions.
+     With respect to disputes in which at least one party is a citizen of,
+     or an entity chartered or registered to do business in the United
+     States of America, any litigation relating to this License shall be
+     subject to the jurisdiction of the Federal Courts of the Northern
+     District of California, with venue lying in Santa Clara County,
+     California, with the losing party responsible for costs, including
+     without limitation, court costs and reasonable attorneys' fees and
+     expenses. The application of the United Nations Convention on
+     Contracts for the International Sale of Goods is expressly excluded.
+     Any law or regulation which provides that the language of a contract
+     shall be construed against the drafter shall not apply to this
+     License.
+
+12. RESPONSIBILITY FOR CLAIMS.
+
+     As between Initial Developer and the Contributors, each party is
+     responsible for claims and damages arising, directly or indirectly,
+     out of its utilization of rights under this License and You agree to
+     work with Initial Developer and Contributors to distribute such
+     responsibility on an equitable basis. Nothing herein is intended or
+     shall be deemed to constitute any admission of liability.
+
+13. MULTIPLE-LICENSED CODE.
+
+     Initial Developer may designate portions of the Covered Code as
+     "Multiple-Licensed".  "Multiple-Licensed" means that the Initial
+     Developer permits you to utilize portions of the Covered Code under
+     Your choice of the NPL or the alternative licenses, if any, specified
+     by the Initial Developer in the file described in Exhibit A.
+
+EXHIBIT A -Mozilla Public License.
+
+     ``The contents of this file are subject to the Mozilla Public License
+     Version 1.1 (the "License"); you may not use this file except in
+     compliance with the License. You may obtain a copy of the License at
+     http://www.mozilla.org/MPL/
+
+     Software distributed under the License is distributed on an "AS IS"
+     basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+     License for the specific language governing rights and limitations
+     under the License.
+
+     The Original Code is ______________________________________.
+
+     The Initial Developer of the Original Code is ________________________.
+     Portions created by ______________________ are Copyright (C) ______
+     _______________________. All Rights Reserved.
+
+     Contributor(s): ______________________________________.
+
+     Alternatively, the contents of this file may be used under the terms
+     of the _____ license (the  "[___] License"), in which case the
+     provisions of [______] License are applicable instead of those
+     above.  If you wish to allow use of your version of this file only
+     under the terms of the [____] License and not to allow others to use
+     your version of this file under the MPL, indicate your decision by
+     deleting  the provisions above and replace  them with the notice and
+     other provisions required by the [___] License.  If you do not delete
+     the provisions above, a recipient may use your version of this file
+     under either the MPL or the [___] License."
+
+     [NOTE: The text of this Exhibit A may differ slightly from the text of
+     the notices in the Source Code files of the Original Code. You should
+     use the text of this Exhibit A rather than the text found in the
+     Original Code Source Code for Your Modifications.]
diff --git a/packaging/kernel/src/main/dist/about_files/new-bsd.txt b/packaging/kernel/src/main/dist/about_files/new-bsd.txt
new file mode 100644
index 0000000..1d256c2
--- /dev/null
+++ b/packaging/kernel/src/main/dist/about_files/new-bsd.txt
@@ -0,0 +1,19 @@
+BSD-style License
+Redistribution and use in source and binary forms, with or without modification, 
+are permitted provided that the following conditions are met:
+Redistributions of source code must retain the above copyright notice, 
+this list of conditions and the following disclaimer.
+Redistributions in binary form must reproduce the above copyright notice, 
+this list of conditions and the following disclaimer in the documentation 
+and/or other materials provided with the distribution.
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 
+PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, 
+OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 
+STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
+POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
diff --git a/packaging/kernel/src/main/dist/about_files/slf4j.txt b/packaging/kernel/src/main/dist/about_files/slf4j.txt
new file mode 100644
index 0000000..371607c
--- /dev/null
+++ b/packaging/kernel/src/main/dist/about_files/slf4j.txt
@@ -0,0 +1,20 @@
+Copyright (c) 2004-2008 QOS.ch
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/packaging/kernel/src/main/dist/bin/checkJava.bat b/packaging/kernel/src/main/dist/bin/checkJava.bat
new file mode 100644
index 0000000..8df7848
--- /dev/null
+++ b/packaging/kernel/src/main/dist/bin/checkJava.bat
@@ -0,0 +1,17 @@
+@echo off
+rem Script for checking we have the right version of Java.
+
+if "%JAVA_HOME%" == "" (
+  echo The JAVA_HOME environment variable is not defined.
+  exit /B 1
+)
+if "%CLASSPATH%" == "" (
+  echo The CLASSPATH environment variable is not defined.
+  exit /B 1
+)
+
+rem Run java version check with the discovered java jvm.
+"%JAVA_HOME%\bin\java" -classpath "%CLASSPATH%" org.eclipse.virgo.util.env.JavaVersionChecker
+
+rem If non-zero exit then either we cannot find the checker or the Java version is incorrect.
+if not "%ERRORLEVEL%"=="0" exit /B %ERRORLEVEL%
diff --git a/packaging/kernel/src/main/dist/bin/dmk.bat b/packaging/kernel/src/main/dist/bin/dmk.bat
new file mode 100644
index 0000000..d35aca1
--- /dev/null
+++ b/packaging/kernel/src/main/dist/bin/dmk.bat
@@ -0,0 +1,286 @@
+@echo off
+rem Script for starting and stopping the kernel
+
+if "%OS%" == "Windows_NT" setlocal
+
+rem Derive full path for script (includes trailing backslash)
+  set SCRIPT_DIR=%~dp0
+
+if exist "%SCRIPT_DIR%setupVars.bat" (
+  call "%SCRIPT_DIR%setupVars.bat"
+  if not "%ERRORLEVEL%"=="0" (
+    if "%OS%" == "Windows_NT" endlocal
+    exit /B %ERRORLEVEL%
+  )
+) else (
+  echo Cannot set up environment. "setupVars.bat" file missing.
+  if "%OS%" == "Windows_NT" endlocal
+  exit /B 1
+)
+
+rem Select command we are to run
+
+  rem First parm is command
+    set COMMAND=%~1
+    rem Rest are parameters - shift done in subroutines
+   
+  rem Switch on COMMAND in {"start","stop"}
+
+    if "%COMMAND%" == "start" (
+      call :doStartCommand %*
+      if "%OS%" == "Windows_NT" endlocal
+      exit /B 0
+    )
+
+    if "%COMMAND%" == "stop"  (
+      call :doStopCommand  %*
+      if "%OS%" == "Windows_NT" endlocal
+      exit /B 0
+    )
+
+    echo Unknown command: %COMMAND%
+    if "%OS%" == "Windows_NT" endlocal
+    exit /B 1
+
+rem ------------------ Subroutines
+rem ------------------------------
+:doStartCommand
+
+  shift
+  rem The shift must be here :()
+
+  rem Check further file that needs to exist
+  for %%I in ("%KERNEL_HOME%\bin\jmxPermissions.vbs") do if not exist "%%~I" (
+    echo File "%%~I" does not exist but is required to continue.
+    exit /B 1
+  )
+
+  rem Set defaults
+    set CONFIG_DIR=%KERNEL_HOME%\configuration
+    set CLEAN_FLAG=
+    set NO_START_FLAG=
+    set DEBUG_FLAG=
+    set DEBUG_PORT=8000
+    set SUSPEND=n
+    if not defined JMX_PORT set JMX_PORT=9875
+    if not defined KEYSTORE_PASSWORD set KEYSTORE_PASSWORD=changeit
+    set ADDITIONAL_ARGS=
+
+  rem Loop through options
+
+  :startOptionLoop
+  if "%~1"=="" goto endStartOptionLoop
+  if "%~1"=="-debug"             goto debug
+  if "%~1"=="-clean"             goto clean
+  if "%~1"=="-configDir"         goto configDir
+  if "%~1"=="-jmxport"           goto jmxport
+  if "%~1"=="-keystore"          goto keystore
+  if "%~1"=="-keystorePassword"  goto keystorePassword
+  if "%~1"=="-noStart"           goto noStart
+  if "%~1"=="-suspend"           goto suspend
+  if "%~1"=="-shell"             goto shell
+
+  set ADDITIONAL_ARGS=%ADDITIONAL_ARGS% "%~1"
+
+  :continueStartOptionLoop
+    shift
+    goto startOptionLoop
+
+  :debug
+    set DEBUG_FLAG=1
+    set PORT_CANDIDATE=%~2
+    if not "%PORT_CANDIDATE:~0,1%"=="-" (
+      set DEBUG_PORT=%PORT_CANDIDATE%
+      shift
+    )
+    goto continueStartOptionLoop
+  :clean
+    set CLEAN_FLAG=1
+    goto continueStartOptionLoop
+  :configDir
+    set CONFIG_DIR=%~2
+    rem unless absolute, treat as relative to kernel home
+    if "%CONFIG_DIR:~1%"=="\" goto absoluteConfigDir
+    if "%CONFIG_DIR:~1,2%"==":\" goto absoluteConfigDir
+    set CONFIG_DIR=%KERNEL_HOME%\%CONFIG_DIR%
+  :absoluteConfigDir
+    shift
+    goto continueStartOptionLoop
+  :jmxport
+    set JMX_PORT=%~2
+    shift
+    goto continueStartOptionLoop
+  :keystore
+    set KEYSTORE_PATH=%~2
+    shift
+    goto continueStartOptionLoop
+  :keystorePassword
+    set KEYSTORE_PASSWORD=%~2
+    shift
+    goto continueStartOptionLoop
+  :noStart
+    set NO_START_FLAG=1
+    goto continueStartOptionLoop
+  :suspend
+    set SUSPEND=y
+    goto continueStartOptionLoop
+  :shell
+    set SHELL_FLAG=1
+    goto continueStartOptionLoop
+
+  :endStartOptionLoop
+
+  
+  rem Adjust permissions if necessary
+    cscript //NoLogo "%KERNEL_HOME%\bin\jmxPermissions.vbs" "%CONFIG_DIR%\"
+
+  rem Adjust options now all are known
+    if "%KEYSTORE_PATH%"=="" set KEYSTORE_PATH=%CONFIG_DIR%\keystore
+    if not "%DEBUG_FLAG%"=="" set DEBUG_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,address=%DEBUG_PORT%,server=y,suspend=%SUSPEND%
+
+  rem do Clean work:
+    if not "%CLEAN_FLAG%"=="" (
+      echo Cleaning the serviceability and working directories...
+      rmdir /Q /S "%KERNEL_HOME%\serviceability" 2>nul
+      rmdir /Q /S "%KERNEL_HOME%\work" 2>nul
+      
+      set LAUNCH_OPTS=%LAUNCH_OPTS% -clean
+    )
+
+  rem do Shell work:
+    if not "%SHELL_FLAG%"=="" ( 
+      echo "Warning: Kernel shell not supported; -shell option ignored."
+      rem set LAUNCH_OPTS=%LAUNCH_OPTS% -Forg.eclipse.virgo.kernel.shell.local=true
+    )
+
+  rem Set JMX options
+    set JMX_OPTS=%JMX_OPTS% -Dcom.sun.management.jmxremote.port=%JMX_PORT% 
+    set JMX_OPTS=%JMX_OPTS% -Dcom.sun.management.jmxremote.authenticate=true 
+    set JMX_OPTS=%JMX_OPTS% -Dcom.sun.management.jmxremote.login.config=virgo-kernel 
+    set JMX_OPTS=%JMX_OPTS% -Dcom.sun.management.jmxremote.access.file="%CONFIG_DIR%\org.eclipse.virgo.kernel.jmxremote.access.properties" 
+    set JMX_OPTS=%JMX_OPTS% -Djavax.net.ssl.keyStore="%KEYSTORE_PATH%" 
+    set JMX_OPTS=%JMX_OPTS% -Djavax.net.ssl.keyStorePassword=%KEYSTORE_PASSWORD% 
+    set JMX_OPTS=%JMX_OPTS% -Dcom.sun.management.jmxremote.ssl=true 
+    set JMX_OPTS=%JMX_OPTS% -Dcom.sun.management.jmxremote.ssl.need.client.auth=false
+
+    if not "%NO_START_FLAG%"=="" goto :eof
+    rem ensure that the tmp directory exists:
+      set TMP_DIR="%KERNEL_HOME%\work\tmp"
+      if not exist "%TMP_DIR%" mkdir "%TMP_DIR%"
+
+       set JAVA_OPTS=-Xmx1024m -XX:MaxPermSize=512m %JAVA_OPTS%
+    rem Run the server
+  
+      rem Marshall parameters
+      set KERNEL_JAVA_PARMS=%JAVA_OPTS% %DEBUG_OPTS% %JMX_OPTS%
+
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -XX:+HeapDumpOnOutOfMemoryError 
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -XX:ErrorFile="%KERNEL_HOME%\serviceability\error.log" 
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -XX:HeapDumpPath="%KERNEL_HOME%\serviceability\heap_dump.hprof"
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Djava.security.auth.login.config="%CONFIG_DIR%\org.eclipse.virgo.kernel.authentication.config" 
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dorg.eclipse.virgo.kernel.authentication.file="%CONFIG_DIR%\org.eclipse.virgo.kernel.users.properties" 
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Djava.io.tmpdir="%TMP_DIR%" 
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dorg.eclipse.virgo.kernel.home="%KERNEL_HOME%" 
+	  set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dosgi.java.profile="file:%CONFIG_DIR%\java-server.profile"
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dssh.server.keystore="%CONFIG_DIR%/hostkey.ser"
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dorg.eclipse.virgo.kernel.config="%CONFIG_DIR%"
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dosgi.sharedConfiguration.area="%CONFIG_DIR%"
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Declipse.ignoreApp="true" 
+	  set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dosgi.install.area="%KERNEL_HOME%"
+	  set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dosgi.configuration.area="%KERNEL_HOME%\work" 
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dosgi.frameworkClassPath="%FWCLASSPATH%"
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Djava.endorsed.dirs="%KERNEL_HOME%\lib\endorsed"
+      
+      rem If Windows 10 set system property os.name=win32, see https://bugs.eclipse.org/bugs/show_bug.cgi?id=486353	
+	  for /f "tokens=4 delims=] " %%i in ('ver') do set VIRGO_DETECTED_WIN_VERSION=%%i 
+      if "%VIRGO_DETECTED_WIN_VERSION:~0,1%"=="1" set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dos.name=win32
+        
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -classpath "%CLASSPATH%" 
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% org.eclipse.equinox.launcher.Main
+	  set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -noExit
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% %LAUNCH_OPTS%
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% %ADDITIONAL_ARGS%
+
+      rem Now run it
+        PUSHD %KERNEL_HOME%
+        "%JAVA_HOME%\bin\java" %KERNEL_JAVA_PARMS%
+        POPD
+
+goto :eof
+
+rem ------------------------------
+:doStopCommand
+  
+  shift
+  rem The shift must be here :()
+
+  rem Set defaults
+  set CONFIG_DIR=%KERNEL_HOME%\configuration
+  if not defined TRUSTSTORE_PATH set TRUSTSTORE_PATH=%CONFIG_DIR%\keystore
+  if not defined TRUSTSTORE_PASSWORD set TRUSTSTORE_PASSWORD=changeit
+  if not defined JMX_PORT set JMX_PORT=9875
+  set OTHER_ARGS=
+
+  rem Loop through options
+  :stopOptionLoop
+
+  if "%~1"=="" goto endStopOptionLoop  
+  if "%~1"=="-truststore" goto truststoreStop
+  if "%~1"=="-truststorePassword" goto truststorePasswordStop
+  if "%~1"=="-configDir" goto configDirStop 
+  if "%~1"=="-jmxport" goto jmxportStop
+  
+  set OTHER_ARGS=%OTHER_ARGS% "%~1"
+    
+  :continueStopOptionLoop
+  shift
+  goto stopOptionLoop
+
+  :truststoreStop
+  set TRUSTSTORE_PATH=%~2
+  shift
+  goto continueStopOptionLoop
+
+  :truststorePasswordStop
+  set TRUSTSTORE_PASSWORD=%~2
+  shift
+  goto continueStopOptionLoop
+
+  :configDirStop
+    set CONFIG_DIR=%~2
+    rem unless absolute, treat as relative to kernel home
+    if "%CONFIG_DIR:~1%"=="\" goto absoluteConfigDirStop
+    if "%CONFIG_DIR:~1,2%"==":\" goto absoluteConfigDirStop
+    set CONFIG_DIR=%KERNEL_HOME%\%CONFIG_DIR%
+  :absoluteConfigDirStop
+    shift
+    goto continueStopOptionLoop
+
+  :jmxportStop
+  set JMX_PORT=%~2
+  shift
+  goto continueStopOptionLoop
+
+  :endStopOptionLoop
+
+  rem Call shutdown client
+
+    rem Extend JMX options
+    set JMX_OPTS=%JMX_OPTS% -Djavax.net.ssl.trustStore="%TRUSTSTORE_PATH%"
+    set JMX_OPTS=%JMX_OPTS% -Djavax.net.ssl.trustStorePassword=%TRUSTSTORE_PASSWORD%
+    set OTHER_ARGS=%OTHER_ARGS% -jmxport %JMX_PORT%
+
+    rem Marshall parameters
+    set SHUTDOWN_PARMS= %JAVA_OPTS% %JMX_OPTS%
+    set SHUTDOWN_PARMS=%SHUTDOWN_PARMS% -classpath "%CLASSPATH%"
+    set SHUTDOWN_PARMS=%SHUTDOWN_PARMS% -Dorg.eclipse.virgo.kernel.home="%KERNEL_HOME%"
+    set SHUTDOWN_PARMS=%SHUTDOWN_PARMS% -Dorg.eclipse.virgo.kernel.authentication.file="%CONFIG_DIR%\org.eclipse.virgo.kernel.users.properties"
+    set SHUTDOWN_PARMS=%SHUTDOWN_PARMS% org.eclipse.virgo.nano.shutdown.ShutdownClient
+    set SHUTDOWN_PARMS=%SHUTDOWN_PARMS% %OTHER_ARGS%
+
+    rem Run Java program
+    PUSHD %KERNEL_HOME%
+    "%JAVA_HOME%\bin\java" %SHUTDOWN_PARMS%
+    POPD
+
+goto :eof
diff --git a/packaging/kernel/src/main/dist/bin/jconsole.bat b/packaging/kernel/src/main/dist/bin/jconsole.bat
new file mode 100644
index 0000000..4cbe553
--- /dev/null
+++ b/packaging/kernel/src/main/dist/bin/jconsole.bat
@@ -0,0 +1,54 @@
+@echo off
+rem Script for starting jconsole
+
+if "%OS%" == "Windows_NT" setlocal
+
+rem Find root drive and path for current bat file directory (includes trailing backslash)
+  set SCRIPT_DIR=%~dp0
+
+if exist "%SCRIPT_DIR%setupVars.bat" (
+  call "%SCRIPT_DIR%setupVars.bat"
+  if not "%ERRORLEVEL%"=="0" (
+    if "%OS%" == "Windows_NT" endlocal
+    exit /B %ERRORLEVEL%
+  )
+) else (
+  echo Cannot set up environment. "setupVars.bat" file missing.
+  if "%OS%" == "Windows_NT" endlocal
+  exit /B 1
+)
+
+rem Set defaults
+  set TRUSTSTORE_PATH=%KERNEL_HOME%\configuration\keystore
+  set TRUSTSTORE_PASSWORD=changeit
+  set OTHER_ARGS=
+  
+:Loop
+  if "%~1"=="" goto EndLoop
+
+  if "%~1"=="-truststore" (
+    set TRUSTSTORE_PATH=%~2
+    shift
+    shift
+    goto Loop
+  ) 
+  if "%~1"=="-truststorePassword" (
+    set TRUSTSTORE_PASSWORD=%~2
+    shift
+    shift
+    goto Loop
+  )
+  rem Accumulate extra parameters.
+    set OTHER_ARGS=%OTHER_ARGS% "%~1"
+    shift
+  goto Loop
+:EndLoop
+
+set JMX_OPTS=%JMX_OPTS% -J-Dcom.sun.tools.jconsole.mbeans.keyPropertyList=category,type 
+set JMX_OPTS=%JMX_OPTS% -J-Djavax.net.ssl.trustStore="%TRUSTSTORE_PATH%" 
+set JMX_OPTS=%JMX_OPTS% -J-Djavax.net.ssl.trustStorePassword=%TRUSTSTORE_PASSWORD%
+
+"%JAVA_HOME%\bin\jconsole" %JMX_OPTS% %OTHER_ARGS%
+
+if "%OS%" == "Windows_NT" endlocal
+goto :eof
diff --git a/packaging/kernel/src/main/dist/bin/jmxPermissions.vbs b/packaging/kernel/src/main/dist/bin/jmxPermissions.vbs
new file mode 100644
index 0000000..0184607
--- /dev/null
+++ b/packaging/kernel/src/main/dist/bin/jmxPermissions.vbs
@@ -0,0 +1,81 @@
+configFolder = Wscript.Arguments.Item(0)
+
+'WScript.Echo "Fixing permissions on " & configFolder
+
+Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2") 'Load up WMI with the right dll
+
+Dim files(0)
+files(0) = "org.eclipse.virgo.kernel.jmxremote.access.properties"
+
+For Each file In files
+	updateInheritance(configFolder & file)
+	updateOwnership(configFolder & file)
+	updatePermissions(configFolder & file)
+Next 
+
+Sub updateInheritance(file)
+	'WScript.Echo "Updating inheritance of " & file
+	
+	Const SE_DACL_PRESENT = 4
+	Const SE_DACL_PROTECTED = 4096
+	Const SE_SELF_RELATIVE = 32768
+
+	Set objFileSecSetting = objWMIService.Get("Win32_LogicalFileSecuritySetting.Path='" & file & "'")
+    objFileSecSetting.GetSecurityDescriptor objSecurityDescriptor
+
+	objSecurityDescriptor.ControlFlags = SE_DACL_PRESENT + SE_DACL_PROTECTED + SE_SELF_RELATIVE
+
+	Set objMethod = objFileSecSetting.Methods_("SetSecurityDescriptor")
+	Set objInParam = objMethod.inParameters.SpawnInstance_()
+	objInParam.Properties_.item("Descriptor") = objSecurityDescriptor
+	objFileSecSetting.ExecMethod_ "SetSecurityDescriptor", objInParam
+	
+	'WScript.Echo "Updated inheritance of " & file
+End Sub
+
+Sub updateOwnership(file)
+	'WScript.Echo "Updating ownership of " & file
+	Set objDataFile = objWMIService.Get("CIM_DataFile.Name='" & file & "'")
+
+	Set objMethod = objDataFile.Methods_("TakeOwnerShipEx")
+	Set objInParam = objMethod.inParameters.SpawnInstance_()
+
+	objDataFile.ExecMethod_ "TakeOwnerShipEx", objInParam
+
+	'WScript.Echo "Updated ownership of " & file
+End Sub
+
+Sub updatePermissions(file)	
+	'WScript.Echo "Updating permissions of " & file
+	
+	Set objFileSecSetting = objWMIService.Get("Win32_LogicalFileSecuritySetting.Path='" & file & "'")
+    objFileSecSetting.GetSecurityDescriptor objSecurityDescriptor
+
+	Set WshNetwork = WScript.CreateObject("WScript.Network")
+	
+	Dim foundAce
+	foundAce = "false"
+	
+	'Search for an ACE for the current user as there is no robust, portable way of creating such an ACE from scratch in VBScript.
+	Dim specificAce(0)
+	For Each ace in objSecurityDescriptor.DACL
+		If ace.Trustee.Name = WshNetwork.UserName Then
+			Set specificAce(0) = ace
+			foundAce = "true"
+		End If
+	Next
+	
+	If foundAce = "true" Then
+		objSecurityDescriptor.DACL = specificAce
+
+		Set objMethod = objFileSecSetting.Methods_("SetSecurityDescriptor")
+		Set objInParam = objMethod.inParameters.SpawnInstance_()
+		objInParam.Properties_.item("Descriptor") = objSecurityDescriptor
+		objFileSecSetting.ExecMethod_ "SetSecurityDescriptor", objInParam
+		
+		'WScript.Echo "Updated permissions of " & file
+	Else
+		WScript.Echo "WARNING: jmxPermissions.vbs did not update the permissions of " & file & ". Check the file has the correct permissions."
+	End If
+	
+End Sub
diff --git a/packaging/kernel/src/main/dist/bin/setupClasspath.bat b/packaging/kernel/src/main/dist/bin/setupClasspath.bat
new file mode 100644
index 0000000..30e157c
--- /dev/null
+++ b/packaging/kernel/src/main/dist/bin/setupClasspath.bat
@@ -0,0 +1,31 @@
+@echo off
+rem Check JAVA_HOME and KERNEL_HOME variables
+if "%JAVA_HOME%" == "" (
+  echo The JAVA_HOME environment variable is not defined.
+  exit /B 1
+)
+if "%KERNEL_HOME%" == "" (
+  echo The KERNEL_HOME environment variable is not defined.
+  exit /B 1
+)
+
+rem Construct the CLASSPATH list from the Kernel lib directory.
+for %%G in ("%KERNEL_HOME%\lib\*.jar") do call :AppendToClasspath "%%G"
+for %%G in ("%KERNEL_HOME%\plugins\org.eclipse.osgi_*.jar") do call :AppendToClasspath "%%G"
+for %%G in ("%KERNEL_HOME%\plugins\org.eclipse.equinox.console.ssh_*.jar") do call :AppendToClasspath "%%G"
+
+rem Check if there are JAR files in the lib directory.
+if "%CLASSPATH%" == "" (
+  echo No JAR files found in %KERNEL_HOME%\lib
+  exit /B 1
+)
+
+rem Remove leading semi-colon if present
+if "%CLASSPATH:~0,1%"==";" set CLASSPATH=%CLASSPATH:~1%
+if "%FWCLASSPATH:~0,1%"=="," set FWCLASSPATH=%FWCLASSPATH:~1%
+exit /B 0
+
+:AppendToClasspath
+  set CLASSPATH=%CLASSPATH%;%~1
+  set FWCLASSPATH=%FWCLASSPATH%,file:///%~1
+  goto :eof
diff --git a/packaging/kernel/src/main/dist/bin/setupVars.bat b/packaging/kernel/src/main/dist/bin/setupVars.bat
new file mode 100644
index 0000000..a5d7772
--- /dev/null
+++ b/packaging/kernel/src/main/dist/bin/setupVars.bat
@@ -0,0 +1,31 @@
+@echo off
+rem Set up env vars needed for dmk.bat and jconsole.bat (with user-pluggable mods if present)
+
+if "%SCRIPT_DIR%"=="" (
+  echo Called setupVars.bat out of context.
+  exit /B 1
+)
+
+rem Derive KERNEL_HOME full path from script's parent (no backslash)
+  for %%I in ("%SCRIPT_DIR%..") do set KERNEL_HOME=%%~fsI
+
+rem Check files exist (exit if not)
+  set ChkLst="%KERNEL_HOME%\bin\setupClasspath.bat","%KERNEL_HOME%\bin\checkJava.bat"
+
+  for %%I in (%ChkLst%) do if not exist "%%~I" (
+    echo File "%%~I" does not exist but is required.
+    exit /B 1
+  )
+
+rem set up the classpath (check result)
+  call "%KERNEL_HOME%\bin\setupClasspath.bat"
+  if not "%ERRORLEVEL%" == "0" exit /B %ERRORLEVEL%
+
+rem Run Java Version check (uses JAVA_HOME) (check result)
+  call "%KERNEL_HOME%\bin\checkJava.bat"
+  if not "%ERRORLEVEL%" == "0" exit /B %ERRORLEVEL%
+	
+rem Execute user setenv script if needed (ignore result)
+  if exist "%KERNEL_HOME%\bin\setenv.bat" call "%KERNEL_HOME%\bin\setenv.bat"
+
+goto :eof
diff --git a/packaging/kernel/src/main/dist/bin/shutdown.bat b/packaging/kernel/src/main/dist/bin/shutdown.bat
new file mode 100644
index 0000000..a2a1ff4
--- /dev/null
+++ b/packaging/kernel/src/main/dist/bin/shutdown.bat
@@ -0,0 +1,8 @@
+@ECHO OFF
+IF "%OS%" == "Windows_NT" SETLOCAL
+
+SET SCRIPT_DIR=%~dp0%
+SET EXECUTABLE=dmk.bat
+
+call "%SCRIPT_DIR%%EXECUTABLE%" stop %*
+if not "%ERRORLEVEL%"=="0" exit /B %ERRORLEVEL%
diff --git a/packaging/kernel/src/main/dist/bin/startup.bat b/packaging/kernel/src/main/dist/bin/startup.bat
new file mode 100644
index 0000000..76e1618
--- /dev/null
+++ b/packaging/kernel/src/main/dist/bin/startup.bat
@@ -0,0 +1,8 @@
+@ECHO OFF
+IF "%OS%" == "Windows_NT" SETLOCAL
+
+SET SCRIPT_DIR=%~dp0%
+SET EXECUTABLE=dmk.bat
+
+call "%SCRIPT_DIR%%EXECUTABLE%" start %*
+if not "%ERRORLEVEL%"=="0" exit /B %ERRORLEVEL%
diff --git a/packaging/kernel/src/main/dist/configuration/etc/gosh_profile b/packaging/kernel/src/main/dist/configuration/etc/gosh_profile
new file mode 100644
index 0000000..f0c9b5e
--- /dev/null
+++ b/packaging/kernel/src/main/dist/configuration/etc/gosh_profile
@@ -0,0 +1,39 @@
+# default gosh_profile
+# only read if etc/gosh_profile doesn't exist relative to the System property
+# gosh.home or failing that the current directory.
+
+# catch all exceptions from this script to avoid it aborting startup
+try {
+
+  # ensure equinox commands are found first
+  SCOPE = equinox:*
+
+  # add methods on BundleContext object as commands
+  #addcommand context ${.context} (${.context} class)
+  # bug: above invokes (String, Object, String) instead of (String, Object, Class)
+  addcommand context ${.context}
+
+  # add methods on System object as commands
+  addcommand system (((${.context} bundles) 0) loadclass java.lang.System)
+
+  # alias to print full stack trace
+  e = { $exception printStackTrace }
+
+  ## disable console auto-formatting of each result
+  #  you will then need to explicitly use the 'format' command
+  #  to print the result of commands that don't write to stdout.
+  #.Gogo.format = false
+
+  ## disable printing the formatted result of a command into pipelines
+  #.Format.Pipe = false
+
+  # set prompt
+  prompt = 'osgi> '
+
+  # print welcome message
+  # cat ($0 resolve motd)
+} {
+    echo "$0: ERROR: $exception"
+}
+
+# end
diff --git a/packaging/kernel/src/main/dist/configuration/java-server.profile b/packaging/kernel/src/main/dist/configuration/java-server.profile
new file mode 100644
index 0000000..8d5c5a6
--- /dev/null
+++ b/packaging/kernel/src/main/dist/configuration/java-server.profile
@@ -0,0 +1,227 @@
+org.osgi.framework.system.packages = \
+ javax.accessibility,\
+ javax.activation,\
+ javax.activation;version="1.1.1",\
+ javax.activity,\
+ javax.annotation,\
+ javax.annotation;version="1.0.0",\
+ javax.annotation;version="1.1.0",\
+ 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;version="2.0",\
+ javax.jws.soap,\
+ javax.jws.soap;version="2.0",\
+ 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.script;version="1.1",\
+ 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.nimbus,\
+ 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;version="1.0.1",\
+ javax.transaction;version="1.1.0",\
+ javax.transaction.xa,\
+ javax.transaction.xa;version="1.0.1",\
+ javax.transaction.xa;version="1.1.0",\
+ javax.xml,\
+ javax.xml;version="1.0.1",\
+ javax.xml.bind,\
+ javax.xml.bind;version="2.0",\
+ javax.xml.bind.annotation,\
+ javax.xml.bind.annotation;version="2.0",\
+ javax.xml.bind.annotation.adapters,\
+ javax.xml.bind.annotation.adapters;version="2.0",\
+ javax.xml.bind.attachment,\
+ javax.xml.bind.attachment;version="2.0",\
+ javax.xml.bind.helpers,\
+ javax.xml.bind.helpers;version="2.0",\
+ javax.xml.bind.util,\
+ javax.xml.bind.util;version="2.0",\
+ javax.xml.crypto,\
+ javax.xml.crypto;version="1.0",\
+ javax.xml.crypto.dom,\
+ javax.xml.crypto.dom;version="1.0",\
+ javax.xml.crypto.dsig,\
+ javax.xml.crypto.dsig;version="1.0",\
+ javax.xml.crypto.dsig.dom,\
+ javax.xml.crypto.dsig.dom;version="1.0",\
+ javax.xml.crypto.dsig.keyinfo,\
+ javax.xml.crypto.dsig.keyinfo;version="1.0",\
+ javax.xml.crypto.dsig.spec,\
+ javax.xml.crypto.dsig.spec;version="1.0",\
+ javax.xml.datatype,\
+ javax.xml.namespace,\
+ javax.xml.parsers,\
+ javax.xml.soap,\
+ javax.xml.soap;version="1.3.0",\
+ javax.xml.stream,\
+ javax.xml.stream;version="1.0.1",\
+ javax.xml.stream.events,\
+ javax.xml.stream.events;version="1.0.1",\
+ javax.xml.stream.util,\
+ javax.xml.stream.util;version="1.0.1",\
+ 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;version="2.1.1",\
+ javax.xml.ws.handler,\
+ javax.xml.ws.handler;version="2.1.1",\
+ javax.xml.ws.handler.soap,\
+ javax.xml.ws.handler.soap;version="2.1.1",\
+ javax.xml.ws.http,\
+ javax.xml.ws.http;version="2.1.1",\
+ javax.xml.ws.soap,\
+ javax.xml.ws.soap;version="2.1.1",\
+ javax.xml.ws.spi,\
+ javax.xml.ws.spi;version="2.1.1",\
+ javax.xml.ws.spi.http,\
+ javax.xml.ws.spi.http;version="2.1.1",\
+ javax.xml.ws.wsaddressing,\
+ javax.xml.ws.wsaddressing;version="2.1.1",\
+ javax.xml.xpath,\
+ org.eclipse.virgo.kernel.equinox.extensions,\
+ org.eclipse.virgo.kernel.equinox.extensions;version="3.7.0",\
+ org.eclipse.virgo.kernel.equinox.extensions.hooks,\
+ org.eclipse.virgo.kernel.equinox.extensions.hooks;version="3.7.0",\
+ 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.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
+org.osgi.framework.bootdelegation = \
+ org.eclipse.virgo.nano.authentication,\
+ javax.*,\
+ javax.xml.*,\
+ org.apache.xerces.jaxp.*,\
+ org.ietf.jgss,\
+ org.omg.*,\
+ org.w3c.*,\
+ org.xml.*,\
+ sun.*,\
+ com.sun.*
+org.osgi.framework.executionenvironment = \
+ OSGi/Minimum-1.0,\
+ OSGi/Minimum-1.1,\
+ OSGi/Minimum-1.2,\
+ JRE-1.1,\
+ J2SE-1.2,\
+ J2SE-1.3,\
+ J2SE-1.4,\
+ J2SE-1.5,\
+ JavaSE-1.6,\
+ JavaSE-1.7
+org.osgi.framework.system.capabilities = \
+ osgi.ee; osgi.ee="OSGi/Minimum"; version:List<Version>="1.0, 1.1, 1.2",\
+ osgi.ee; osgi.ee="JRE"; version:List<Version>="1.0, 1.1",\
+ osgi.ee; osgi.ee="JavaSE"; version:List<Version>="1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7"
+osgi.java.profile.name = Virgo-Java7
diff --git a/packaging/kernel/src/main/dist/configuration/keystore b/packaging/kernel/src/main/dist/configuration/keystore
new file mode 100644
index 0000000..9684caa
--- /dev/null
+++ b/packaging/kernel/src/main/dist/configuration/keystore
Binary files differ
diff --git a/packaging/kernel/src/main/dist/configuration/org.eclipse.virgo.kernel.authentication.config b/packaging/kernel/src/main/dist/configuration/org.eclipse.virgo.kernel.authentication.config
new file mode 100644
index 0000000..44c5d21
--- /dev/null
+++ b/packaging/kernel/src/main/dist/configuration/org.eclipse.virgo.kernel.authentication.config
@@ -0,0 +1,6 @@
+virgo-kernel {
+	org.eclipse.virgo.nano.authentication.KernelLoginModule REQUIRED;
+};
+equinox_console {
+	org.eclipse.virgo.nano.authentication.KernelLoginModule REQUIRED;
+};
diff --git a/packaging/kernel/src/main/dist/configuration/org.eclipse.virgo.kernel.jmxremote.access.properties b/packaging/kernel/src/main/dist/configuration/org.eclipse.virgo.kernel.jmxremote.access.properties
new file mode 100644
index 0000000..ba89979
--- /dev/null
+++ b/packaging/kernel/src/main/dist/configuration/org.eclipse.virgo.kernel.jmxremote.access.properties
@@ -0,0 +1 @@
+admin=readwrite
diff --git a/packaging/kernel/src/main/dist/configuration/org.eclipse.virgo.kernel.properties b/packaging/kernel/src/main/dist/configuration/org.eclipse.virgo.kernel.properties
new file mode 100644
index 0000000..c72631f
--- /dev/null
+++ b/packaging/kernel/src/main/dist/configuration/org.eclipse.virgo.kernel.properties
@@ -0,0 +1,9 @@
+########################
+# Deployer Configuration
+########################
+# Note: use 0 to disable deployment timeouts
+deployer.timeout=300
+deployer.pickupDirectory=pickup
+deployer.scanIntervalMillis=1000
+deployer.unpackBundles=true
+
diff --git a/packaging/kernel/src/main/dist/configuration/org.eclipse.virgo.kernel.users.properties b/packaging/kernel/src/main/dist/configuration/org.eclipse.virgo.kernel.users.properties
new file mode 100644
index 0000000..7ab19e1
--- /dev/null
+++ b/packaging/kernel/src/main/dist/configuration/org.eclipse.virgo.kernel.users.properties
@@ -0,0 +1,9 @@
+##################
+# User definitions
+##################
+user.admin=admin
+
+##################
+# Role definitions
+##################
+role.admin=admin
diff --git a/packaging/kernel/src/main/dist/configuration/org.eclipse.virgo.medic.properties b/packaging/kernel/src/main/dist/configuration/org.eclipse.virgo.medic.properties
new file mode 100644
index 0000000..5c5f1cf
--- /dev/null
+++ b/packaging/kernel/src/main/dist/configuration/org.eclipse.virgo.medic.properties
@@ -0,0 +1,7 @@
+dump.root.directory=serviceability/dump
+log.wrapSysOut=true
+log.wrapSysErr=true
+log.dump.level=DEBUG
+log.dump.bufferSize=10000
+log.dump.pattern=[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-28.28thread %-64.64logger{64} %X{medic.eventCode} %msg %ex%n
+log.jul.consoleHandler=false
diff --git a/packaging/kernel/src/main/dist/configuration/org.eclipse.virgo.repository.properties b/packaging/kernel/src/main/dist/configuration/org.eclipse.virgo.repository.properties
new file mode 100644
index 0000000..5e7de2b
--- /dev/null
+++ b/packaging/kernel/src/main/dist/configuration/org.eclipse.virgo.repository.properties
@@ -0,0 +1,7 @@
+ext.type=external
+ext.searchPattern=repository/ext/{artifact}
+
+usr.type=watched
+usr.watchDirectory=repository/usr
+
+chain=ext,usr
diff --git a/packaging/kernel/src/main/dist/configuration/osgi.console.properties b/packaging/kernel/src/main/dist/configuration/osgi.console.properties
new file mode 100644
index 0000000..5400fc1
--- /dev/null
+++ b/packaging/kernel/src/main/dist/configuration/osgi.console.properties
@@ -0,0 +1,6 @@
+telnet.enabled=false
+telnet.port=2401
+telnet.host=localhost
+ssh.enabled=false
+ssh.port=2402
+ssh.host=localhost
\ No newline at end of file
diff --git a/packaging/kernel/src/main/dist/configuration/serviceability.xml b/packaging/kernel/src/main/dist/configuration/serviceability.xml
new file mode 100644
index 0000000..6c250de
--- /dev/null
+++ b/packaging/kernel/src/main/dist/configuration/serviceability.xml
@@ -0,0 +1,81 @@
+<configuration>
+
+	<jmxConfigurator />
+
+	<contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"/>
+
+	<appender name="SIFTED_LOG_FILE" class="ch.qos.logback.classic.sift.SiftingAppender">
+		<discriminator>
+			<Key>applicationName</Key>
+			<DefaultValue>virgo-kernel</DefaultValue>
+		</discriminator>
+		<sift>
+			<appender name="${applicationName}_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+				<file>serviceability/logs/${applicationName}/log.log</file>
+				<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+					<FileNamePattern>serviceability/logs/${applicationName}/log_%i.log</FileNamePattern>
+					<MinIndex>1</MinIndex>
+					<MaxIndex>4</MaxIndex>
+				</rollingPolicy>
+				<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+					<MaxFileSize>10MB</MaxFileSize>
+				</triggeringPolicy>
+				<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+					<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-5level %-28.28thread %-64.64logger{64} %X{medic.eventCode} %msg %ex%n</Pattern>
+				</encoder>
+			</appender>
+		</sift>
+	</appender>
+	
+	<appender name="LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<file>serviceability/logs/log.log</file>
+		<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+			<FileNamePattern>serviceability/logs/log_%i.log</FileNamePattern>
+			<MinIndex>1</MinIndex>
+			<MaxIndex>4</MaxIndex>
+		</rollingPolicy>
+		<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+			<MaxFileSize>10MB</MaxFileSize>
+		</triggeringPolicy>
+		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+			<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-5level %-28.28thread %-64.64logger{64} %X{medic.eventCode} %msg %ex%n</Pattern>
+		</encoder>
+	</appender>
+
+	<appender name="EVENT_LOG_STDOUT" class="org.eclipse.virgo.medic.log.logback.ReroutingAwareConsoleAppender">
+		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+			<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-28.28thread &lt;%X{medic.eventCode}&gt; %msg %ex%n</Pattern>
+		</encoder>
+	</appender>
+
+	<appender name="EVENT_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<file>serviceability/eventlogs/eventlog.log</file>
+		<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+			<FileNamePattern>serviceability/eventlogs/eventlog_%i.log</FileNamePattern>
+			<MinIndex>1</MinIndex>
+			<MaxIndex>4</MaxIndex>
+		</rollingPolicy>
+		<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+			<MaxFileSize>10MB</MaxFileSize>
+		</triggeringPolicy>
+		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+			<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-28.28thread &lt;%X{medic.eventCode}&gt; %msg %ex%n</Pattern>
+		</encoder>
+	</appender>
+
+	<logger level="INFO" additivity="false" name="org.eclipse.virgo.medic.eventlog.localized">
+		<appender-ref ref="EVENT_LOG_STDOUT" />
+		<appender-ref ref="EVENT_LOG_FILE" />
+	</logger>
+	
+	<logger level="INFO" additivity="false" name="org.eclipse.virgo.medic.eventlog.default">
+		<appender-ref ref="SIFTED_LOG_FILE" />
+		<appender-ref ref="LOG_FILE" />
+	</logger>
+
+	<root level="INFO">
+		<appender-ref ref="SIFTED_LOG_FILE" />
+		<appender-ref ref="LOG_FILE" />
+	</root>
+
+</configuration>
diff --git a/packaging/kernel/src/main/dist/epl-v10.html b/packaging/kernel/src/main/dist/epl-v10.html
new file mode 100644
index 0000000..eecc800
--- /dev/null
+++ b/packaging/kernel/src/main/dist/epl-v10.html
@@ -0,0 +1,258 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!-- saved from url=(0049)http://www.eclipse.org/org/documents/epl-v10.html -->
+<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+
+<TITLE>Eclipse Public License - Version 1.0</TITLE>
+<STYLE type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </STYLE>
+
+</HEAD><BODY lang="EN-US">
+
+<H2>Eclipse Public License - v 1.0</H2>
+
+<P>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</P>
+
+<P><B>1. DEFINITIONS</B></P>
+
+<P>"Contribution" means:</P>
+
+<P class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</P>
+<P class="list">b) in the case of each subsequent Contributor:</P>
+<P class="list">i) changes to the Program, and</P>
+<P class="list">ii) additions to the Program;</P>
+<P class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</P>
+
+<P>"Contributor" means any person or entity that distributes
+the Program.</P>
+
+<P>"Licensed Patents" mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</P>
+
+<P>"Program" means the Contributions distributed in accordance
+with this Agreement.</P>
+
+<P>"Recipient" means anyone who receives the Program under
+this Agreement, including all Contributors.</P>
+
+<P><B>2. GRANT OF RIGHTS</B></P>
+
+<P class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</P>
+
+<P class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</P>
+
+<P class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</P>
+
+<P class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</P>
+
+<P><B>3. REQUIREMENTS</B></P>
+
+<P>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</P>
+
+<P class="list">a) it complies with the terms and conditions of this
+Agreement; and</P>
+
+<P class="list">b) its license agreement:</P>
+
+<P class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</P>
+
+<P class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</P>
+
+<P class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</P>
+
+<P class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</P>
+
+<P>When the Program is made available in source code form:</P>
+
+<P class="list">a) it must be made available under this Agreement; and</P>
+
+<P class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</P>
+
+<P>Contributors may not remove or alter any copyright notices contained
+within the Program.</P>
+
+<P>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</P>
+
+<P><B>4. COMMERCIAL DISTRIBUTION</B></P>
+
+<P>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+("Commercial Contributor") hereby agrees to defend and
+indemnify every other Contributor ("Indemnified Contributor")
+against any losses, damages and costs (collectively "Losses")
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</P>
+
+<P>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</P>
+
+<P><B>5. NO WARRANTY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</P>
+
+<P><B>6. DISCLAIMER OF LIABILITY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</P>
+
+<P><B>7. GENERAL</B></P>
+
+<P>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</P>
+
+<P>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</P>
+
+<P>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</P>
+
+<P>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</P>
+
+<P>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</P>
+
+
+
+
+</BODY></HTML>
\ No newline at end of file
diff --git a/packaging/kernel/src/main/dist/notice.html b/packaging/kernel/src/main/dist/notice.html
new file mode 100644
index 0000000..0ee73f4
--- /dev/null
+++ b/packaging/kernel/src/main/dist/notice.html
@@ -0,0 +1,104 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<!-- saved from url=(0044)http://www.eclipse.org/legal/epl/notice.html -->
+<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+
+<TITLE>Eclipse Foundation Software User Agreement</TITLE>
+</HEAD><BODY lang="EN-US">
+<H2>Eclipse Foundation Software User Agreement</H2>
+<P>April 14, 2010</P>
+
+<H3>Usage Of Content</H3>
+
+<P>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+   (COLLECTIVELY "CONTENT").  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</P>
+
+<H3>Applicable Licenses</H3>
+
+<P>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+   ("EPL").  A copy of the EPL is provided with this Content and is also available at <A href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</A>.
+   For purposes of the EPL, "Program" will mean the Content.</P>
+
+<P>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
+   repository ("Repository") in software modules ("Modules") and made available as downloadable archives ("Downloads").</P>
+
+<UL>
+       <LI>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins ("Plug-ins"), plug-in fragments ("Fragments"), and features ("Features").</LI>
+       <LI>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java™ ARchive) in a directory named "plugins".</LI>
+       <LI>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named "features".  Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of the Plug-ins
+      and/or Fragments associated with that Feature.</LI>
+       <LI>Features may also include other Features ("Included Features"). Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of Included Features.</LI>
+</UL>
+
+<P>The terms and conditions governing Plug-ins and Fragments should be contained in files named "about.html" ("Abouts"). The terms and conditions governing Features and
+Included Features should be contained in files named "license.html" ("Feature Licenses").  Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</P>
+
+<UL>
+       <LI>The top-level (root) directory</LI>
+       <LI>Plug-in and Fragment directories</LI>
+       <LI>Inside Plug-ins and Fragments packaged as JARs</LI>
+       <LI>Sub-directories of the directory named "src" of certain Plug-ins</LI>
+       <LI>Feature directories</LI>
+</UL>
+
+<P>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license ("Feature Update License") during the
+installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them.  Feature Update Licenses may be found in the "license" property of files named "feature.properties" found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</P>
+
+<P>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</P>
+
+<UL>
+       <LI>Common Public License Version 1.0 (available at <A href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</A>)</LI>
+       <LI>Apache Software License 1.1 (available at <A href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</A>)</LI>
+       <LI>Apache Software License 2.0 (available at <A href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</A>)</LI>
+       <LI>Metro Link Public License 1.00 (available at <A href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</A>)</LI>
+       <LI>Mozilla Public License Version 1.1 (available at <A href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</A>)</LI>
+</UL>
+
+<P>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</P>
+
+
+<H3>Use of Provisioning Technology</H3>
+
+<P>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
+   Update Manager ("Provisioning Technology") for the purpose of allowing users to install software, documentation, information and/or
+   other materials (collectively "Installable Software"). This capability is provided with the intent of allowing such users to
+   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <A href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</A>
+   ("Specification").</P>
+
+<P>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
+   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
+   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
+   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</P>
+
+<OL>
+       <LI>A series of actions may occur ("Provisioning Process") in which a user may execute the Provisioning Technology
+       on a machine ("Target Machine") with the intent of installing, extending or updating the functionality of an Eclipse-based
+       product.</LI>
+       <LI>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
+       accessed and copied to the Target Machine.</LI>
+       <LI>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
+       Software ("Installable Software Agreement") and such Installable Software Agreement shall be accessed from the Target
+       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
+       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
+       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</LI>
+</OL>
+
+<H3>Cryptography</H3>
+
+<P>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+   possession, or use, and re-export of encryption software, to see if this is permitted.</P>
+
+<P><SMALL>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</SMALL></P>
+
+
+</BODY></HTML>
\ No newline at end of file
diff --git a/packaging/kernel/src/main/dist/repository/ext/org.eclipse.virgo.kernel.userregion.blueprint.plan b/packaging/kernel/src/main/dist/repository/ext/org.eclipse.virgo.kernel.userregion.blueprint.plan
new file mode 100644
index 0000000..5efb538
--- /dev/null
+++ b/packaging/kernel/src/main/dist/repository/ext/org.eclipse.virgo.kernel.userregion.blueprint.plan
@@ -0,0 +1,15 @@
+<plan name="org.eclipse.virgo.kernel.userregion.blueprint" version="3.7.1" scoped="false" atomic="false"
+	  xmlns="http://www.eclipse.org/virgo/schema/plan"
+	  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	  xsi:schemaLocation="http://www.eclipse.org/virgo/schema/plan http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+	<artifact type="bundle" name="org.eclipse.gemini.blueprint.core" version="[2.1, 3)"/>
+	<artifact type="bundle" name="org.eclipse.gemini.blueprint.extender" version="[2.1, 3)"/>
+	<artifact type="bundle" name="org.eclipse.gemini.blueprint.io" version="[2.1, 3)"/>
+	<artifact type="bundle" name="org.eclipse.gemini.blueprint.extensions" version="[2.1, 3)"/>
+	<artifact type="bundle" name="org.eclipse.virgo.kernel.agent.dm" version="[3.7.1, 4.0)"/>
+	<artifact type="bundle" name="org.eclipse.virgo.kernel.deployer.dm" version="[3.7.1, 4.0)"/>
+	<artifact type="bundle" name="org.eclipse.equinox.ds" version="0.0.0"/>
+	<artifact type="bundle" name="org.eclipse.equinox.util" version="0.0.0"/>
+	<artifact type="configuration" name="osgi.console" version="0"/>
+</plan>
diff --git a/packaging/kernel/src/main/dist/repository/ext/org.eclipse.virgo.management.plan b/packaging/kernel/src/main/dist/repository/ext/org.eclipse.virgo.management.plan
new file mode 100644
index 0000000..b7ad494
--- /dev/null
+++ b/packaging/kernel/src/main/dist/repository/ext/org.eclipse.virgo.management.plan
@@ -0,0 +1,10 @@
+<plan name="org.eclipse.virgo.management" version="3.7.1" scoped="false" atomic="false"
+			xmlns="http://www.eclipse.org/virgo/schema/plan"
+			xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+			xsi:schemaLocation="http://www.eclipse.org/virgo/schema/plan http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+		<artifact type="bundle" name="osgi.enterprise" version="[4.2, 5)"/>
+		<artifact type="bundle" name="org.eclipse.gemini.management" version="[1.0, 2)"/>
+		<artifact type="bundle" name="org.eclipse.virgo.management.fragment" version="[3.6, 4)"/>
+		
+</plan>
diff --git a/packaging/kernel/src/main/dist/repository/ext/osgi.console.properties b/packaging/kernel/src/main/dist/repository/ext/osgi.console.properties
new file mode 100755
index 0000000..310943b
--- /dev/null
+++ b/packaging/kernel/src/main/dist/repository/ext/osgi.console.properties
@@ -0,0 +1,6 @@
+telnet.enabled=false
+telnet.port=2501
+telnet.host=localhost
+ssh.enabled=false
+ssh.port=2502
+ssh.host=localhost
\ No newline at end of file
diff --git a/packaging/kernel/src/main/filtered/bin/checkJava.sh b/packaging/kernel/src/main/filtered/bin/checkJava.sh
new file mode 100755
index 0000000..a06ecd5
--- /dev/null
+++ b/packaging/kernel/src/main/filtered/bin/checkJava.sh
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+#
+# make adjustment when running under cygwin
+#
+if $cygwin; then
+    CLASSPATH=$(cygpath -wp "$CLASSPATH")
+fi
+
+if [ -z "$JAVA_HOME" ]
+then
+  	JAVA_EXECUTABLE=java
+else
+  	JAVA_EXECUTABLE=$JAVA_HOME/bin/java
+fi
+
+# Run java version check with the discovered java jvm.
+$JAVA_EXECUTABLE \
+	-classpath "$CLASSPATH" \
+	org.eclipse.virgo.util.env.JavaVersionChecker
+
+# If non-zero exit then either we cannot find the check or the java version is incorrect.
+if [ $? != 0 ]
+then
+	exit 1
+fi
diff --git a/packaging/kernel/src/main/filtered/bin/dmk.sh b/packaging/kernel/src/main/filtered/bin/dmk.sh
new file mode 100755
index 0000000..aae69f2
--- /dev/null
+++ b/packaging/kernel/src/main/filtered/bin/dmk.sh
@@ -0,0 +1,286 @@
+#!/bin/bash
+
+SCRIPT="$0"
+
+# SCRIPT may be an arbitrarily deep series of symlinks. Loop until we have the concrete path.
+while [ -h "$SCRIPT" ] ; do
+  ls=`ls -ld "$SCRIPT"`
+  # Drop everything prior to ->
+  link=`expr "$ls" : '.*-> \(.*\)$'`
+  if expr "$link" : '/.*' > /dev/null; then
+    SCRIPT="$link"
+  else
+    SCRIPT=`dirname "$SCRIPT"`/"$link"
+  fi
+done
+
+# determine kernel home
+KERNEL_HOME=`dirname "$SCRIPT"`/..
+
+# make KERNEL_HOME absolute
+KERNEL_HOME=`cd "$KERNEL_HOME"; pwd`
+
+# execute user setenv script if needed
+if [ -r "$KERNEL_HOME/bin/setenv.sh" ]
+then
+	. $KERNEL_HOME/bin/setenv.sh
+fi
+
+# setup classpath and java environment
+. "$KERNEL_HOME/bin/setupClasspath.sh"
+
+# Run java version check with the discovered java jvm.
+. "$KERNEL_HOME/bin/checkJava.sh"
+
+shopt -s extglob
+	
+# parse the command we executing
+COMMAND=$1
+shift;
+	
+if [ "$COMMAND" = "start" ]
+then
+	
+	# parse the standard arguments
+	CONFIG_DIR=$KERNEL_HOME/configuration
+	CLEAN_FLAG=
+	NO_START_FLAG=
+
+	SHELL_FLAG=
+	
+	DEBUG_FLAG=
+	DEBUG_PORT=8000
+	SUSPEND=n
+	if [ -z "$JMX_PORT" ]
+	then
+		JMX_PORT=9875
+	fi
+	
+	if [ -z "$KEYSTORE_PASSWORD" ]
+	then
+		KEYSTORE_PASSWORD=changeit
+	fi
+	
+	ADDITIONAL_ARGS=
+
+	while (($# > 0))
+		do
+		case $1 in
+		-debug)
+				DEBUG_FLAG=1
+				if [[ "$2" == +([0-9]) ]]
+				then
+					DEBUG_PORT=$2
+					shift;
+				fi
+				;;
+		-clean)
+				CLEAN_FLAG=1
+				;;
+		-configDir)
+				CONFIG_DIR=$2
+				shift;
+				;;
+		-jmxport)
+				JMX_PORT=$2
+				shift;
+				;;
+		-keystore)
+				KEYSTORE_PATH=$2
+				shift;
+				;;
+		-keystorePassword)
+				KEYSTORE_PASSWORD=$2
+				shift;
+				;;
+		-noStart)
+				NO_START_FLAG=1
+				;;
+				
+		-suspend)
+				SUSPEND=y
+				;;
+		-shell)
+				SHELL_FLAG=1
+				;;
+		*)
+				ADDITIONAL_ARGS="$ADDITIONAL_ARGS $1"
+				;;
+		esac
+		shift
+	done
+	
+	# start the kernel
+	if [[ "$CONFIG_DIR" != /* ]]
+	then
+	    CONFIG_DIR=$KERNEL_HOME/$CONFIG_DIR
+	fi
+
+	if [ -z "$KEYSTORE_PATH" ]
+	then
+	    KEYSTORE_PATH=$CONFIG_DIR/keystore
+	fi
+
+	if [ "$DEBUG_FLAG" ]
+	then
+		DEBUG_OPTS=" \
+			-Xdebug \
+			-Xrunjdwp:transport=dt_socket,address=$DEBUG_PORT,server=y,suspend=$SUSPEND"
+	fi
+
+	if [ "$CLEAN_FLAG" ]
+	then
+        echo "Cleaning the serviceability and working directories..."
+        rm -rf "$KERNEL_HOME/work"
+        rm -rf "$KERNEL_HOME/serviceability"
+
+        LAUNCH_OPTS="$LAUNCH_OPTS -clean" #equivalent to setting osgi.clean to "true"
+	fi
+	
+	if [ "$SHELL_FLAG" ]
+	then
+	    echo "Warning: Kernel shell not supported; -shell option ignored."
+		# LAUNCH_OPTS="$LAUNCH_OPTS -Forg.eclipse.virgo.kernel.shell.local=true"
+	fi
+
+    ACCESS_PROPERTIES=$CONFIG_DIR/org.eclipse.virgo.kernel.jmxremote.access.properties
+    AUTH_LOGIN=$CONFIG_DIR/org.eclipse.virgo.kernel.authentication.config
+    AUTH_FILE=$CONFIG_DIR/org.eclipse.virgo.kernel.users.properties
+    CONFIG_AREA=$KERNEL_HOME/work
+    JAVA_PROFILE=$KERNEL_HOME/configuration/java-server.profile
+
+    if $cygwin; then
+        ACCESS_PROPERTIES=$(cygpath -wp $ACCESS_PROPERTIES)
+        AUTH_LOGIN=$(cygpath -wp $AUTH_LOGIN)
+        AUTH_FILE=$(cygpath -wp $AUTH_FILE)
+        KERNEL_HOME=$(cygpath -wp $KERNEL_HOME)
+        CONFIG_DIR=$(cygpath -wp $CONFIG_DIR)
+        CONFIG_AREA=$(cygpath -wp $CONFIG_AREA)
+        JAVA_PROFILE=$(cygpath -wp $JAVA_PROFILE)
+    fi
+	
+	# Set the required permissions on the JMX configuration files
+	chmod 600 "$ACCESS_PROPERTIES"
+
+   	if [ -z "$JAVA_HOME" ]
+    then
+      	JAVA_EXECUTABLE=java
+    else
+     	JAVA_EXECUTABLE=$JAVA_HOME/bin/java
+    fi
+
+	# If we get here we have the correct Java version.
+	
+	if [ -z "$NO_START_FLAG" ]
+	then
+		TMP_DIR=$KERNEL_HOME/work/tmp
+		# Ensure that the tmp directory exists
+		mkdir -p "$TMP_DIR"
+
+        JAVA_OPTS="-Xmx1024m \
+                    -XX:MaxPermSize=512m $JAVA_OPTS"
+
+		cd "$KERNEL_HOME"; exec $JAVA_EXECUTABLE \
+			$JAVA_OPTS \
+			$DEBUG_OPTS \
+			$JMX_OPTS \
+			-XX:+HeapDumpOnOutOfMemoryError \
+			-XX:ErrorFile="$KERNEL_HOME/serviceability/error.log" \
+			-XX:HeapDumpPath="$KERNEL_HOME/serviceability/heap_dump.hprof" \
+			-Djava.security.auth.login.config="$AUTH_LOGIN" \
+			-Dorg.eclipse.virgo.kernel.authentication.file="$AUTH_FILE" \
+			-Djava.io.tmpdir="$TMP_DIR" \
+			-Dorg.eclipse.virgo.kernel.home="$KERNEL_HOME" \
+			-Dorg.eclipse.virgo.kernel.config="$CONFIG_DIR" \
+			-Dosgi.sharedConfiguration.area="$CONFIG_DIR" \
+			-Dosgi.java.profile="file:$JAVA_PROFILE" \
+            -Declipse.ignoreApp=true \
+            -Dosgi.install.area="$KERNEL_HOME" \
+            -Dosgi.configuration.area="$CONFIG_AREA" \
+            -Dssh.server.keystore="$CONFIG_DIR/hostkey.ser" \
+            -Dosgi.frameworkClassPath="$FWCLASSPATH" \
+            -Djava.endorsed.dirs="$KERNEL_HOME/lib/endorsed" \
+            -Dcom.sun.management.jmxremote.port=$JMX_PORT \
+		    -Dcom.sun.management.jmxremote.authenticate=true \
+	    	-Dcom.sun.management.jmxremote.login.config=virgo-kernel \
+    		-Dcom.sun.management.jmxremote.access.file="$ACCESS_PROPERTIES" \
+		    -Djavax.net.ssl.keyStore="$KEYSTORE_PATH" \
+		    -Djavax.net.ssl.keyStorePassword="$KEYSTORE_PASSWORD" \
+		    -Dcom.sun.management.jmxremote.ssl=true \
+		    -Dcom.sun.management.jmxremote.ssl.need.client.auth=false \
+            -classpath "$CLASSPATH" \
+			org.eclipse.equinox.launcher.Main \
+            -noExit \
+			$LAUNCH_OPTS \
+			$ADDITIONAL_ARGS
+	fi
+elif [ "$COMMAND" = "stop" ]
+then
+
+	CONFIG_DIR="$KERNEL_HOME/configuration"
+
+	#parse args for the script
+	if [ -z "$TRUSTSTORE_PATH" ]
+	then
+		TRUSTSTORE_PATH=$CONFIG_DIR/keystore
+	fi
+	
+	if [ -z "$TRUSTSTORE_PASSWORD" ]	
+	then
+		TRUSTSTORE_PASSWORD=changeit
+	fi
+
+	if [ -z "$JMX_PORT" ]
+	then
+		JMX_PORT=9875
+	fi
+
+	shopt -s extglob
+
+	while (($# > 0))
+		do
+		case $1 in
+		-truststore)
+				TRUSTSTORE_PATH=$2
+				shift;
+				;;
+		-truststorePassword)
+				TRUSTSTORE_PASSWORD=$2
+				shift;
+				;;
+		-configDir)
+				CONFIG_DIR=$2
+				shift;
+				;;
+		-jmxport)
+				JMX_PORT=$2
+				shift;
+				;;
+		*)
+			OTHER_ARGS+=" $1"
+			;;
+		esac
+		shift
+	done
+
+	OTHER_ARGS+=" -jmxport $JMX_PORT"
+
+    if $cygwin; then
+        KERNEL_HOME=$(cygpath -wp $KERNEL_HOME)
+        CONFIG_DIR=$(cygpath -wp $CONFIG_DIR)
+    fi
+
+	exec $JAVA_EXECUTABLE \
+	     $JAVA_OPTS \
+	     $JMX_OPTS \
+		-classpath "$CLASSPATH" \
+		-Djavax.net.ssl.trustStore="$TRUSTSTORE_PATH" \
+		-Djavax.net.ssl.trustStorePassword="$TRUSTSTORE_PASSWORD" \
+		-Dorg.eclipse.virgo.kernel.home="$KERNEL_HOME" \
+		-Dorg.eclipse.virgo.kernel.authentication.file="$CONFIG_DIR/org.eclipse.virgo.kernel.users.properties" \
+		org.eclipse.virgo.nano.shutdown.ShutdownClient $OTHER_ARGS
+	
+else
+	echo "Unknown command: ${COMMAND}"
+fi
+
diff --git a/packaging/kernel/src/main/filtered/bin/jconsole.sh b/packaging/kernel/src/main/filtered/bin/jconsole.sh
new file mode 100755
index 0000000..0dfbcbf
--- /dev/null
+++ b/packaging/kernel/src/main/filtered/bin/jconsole.sh
@@ -0,0 +1,53 @@
+#!/bin/bash
+
+if [ -z "$JAVA_HOME" ]
+then
+    echo The JAVA_HOME environment variable is not defined
+    exit 1
+fi
+
+SCRIPT="$0"
+
+# SCRIPT may be an arbitrarily deep series of symlinks. Loop until we have the concrete path.
+while [ -h "$SCRIPT" ] ; do 
+  ls=`ls -ld "$SCRIPT"`
+  # Drop everything prior to ->
+  link=`expr "$ls" : '.*-> \(.*\)$'`
+  if expr "$link" : '/.*' > /dev/null; then
+    SCRIPT="$link"
+  else
+    SCRIPT=`dirname "$SCRIPT"`/"$link"
+  fi
+done
+ 
+KERNEL_HOME=`dirname "$SCRIPT"`/..
+KERNEL_HOME=`cd $KERNEL_HOME; pwd`
+
+#parse args for the script
+TRUSTSTORE_PATH=$KERNEL_HOME/configuration/keystore
+TRUSTSTORE_PASSWORD=changeit
+
+shopt -s extglob
+
+while (($# > 0))
+	do
+	case $1 in
+	-truststore)
+			TRUSTSTORE_PATH=$2
+			shift;
+			;;
+	-truststorePassword)
+			TRUSTSTORE_PASSWORD=$2
+			shift;
+			;;
+	esac
+	shift
+done
+
+JMX_OPTS=" \
+	$JMX_OPTS \
+	-J-Dcom.sun.tools.jconsole.mbeans.keyPropertyList=category,type \
+	-J-Djavax.net.ssl.trustStore=$TRUSTSTORE_PATH \
+	-J-Djavax.net.ssl.trustStorePassword=$TRUSTSTORE_PASSWORD"
+
+$JAVA_HOME/bin/jconsole $JMX_OPTS
diff --git a/packaging/kernel/src/main/filtered/bin/setupClasspath.sh b/packaging/kernel/src/main/filtered/bin/setupClasspath.sh
new file mode 100755
index 0000000..741e0e3
--- /dev/null
+++ b/packaging/kernel/src/main/filtered/bin/setupClasspath.sh
@@ -0,0 +1,40 @@
+#!/bin/bash
+
+# make sure we have JAVA_HOME set
+if [ -z "$JAVA_HOME" ]
+then
+	echo The JAVA_HOME environment variable is not defined. Using PATH instead.
+fi
+
+CLASSPATH=
+FWCLASSPATH=
+
+#  Create the classpath for bootstrapping the Server from all the JARs in lib
+for file in "$KERNEL_HOME"/lib/*
+do
+	if [[ $file == *.jar ]]
+	then
+		CLASSPATH=$CLASSPATH:$KERNEL_HOME/lib/${file##*/}
+		FWCLASSPATH=$FWCLASSPATH,file:$KERNEL_HOME/lib/${file##*/}
+	fi
+done
+
+#  Append the osgi jar to the classpath
+for file in "$KERNEL_HOME"/plugins/org.eclipse.osgi_*.jar
+do
+	CLASSPATH=$CLASSPATH:$KERNEL_HOME/plugins/${file##*/}
+	FWCLASSPATH=$FWCLASSPATH,file:$KERNEL_HOME/plugins/${file##*/}
+done
+
+#  Append the console.supportability jar to the classpath to enable ssh
+for file in "$KERNEL_HOME"/plugins/org.eclipse.equinox.console.ssh_*.jar
+do
+	CLASSPATH=$CLASSPATH:$KERNEL_HOME/plugins/${file##*/}
+done
+
+# make sure we have CLASSPATH set
+if [ -z "$CLASSPATH" ]
+then
+	echo No JAR files found in $KERNEL_HOME/lib
+	exit 1
+fi
diff --git a/packaging/kernel/src/main/filtered/bin/shutdown.sh b/packaging/kernel/src/main/filtered/bin/shutdown.sh
new file mode 100755
index 0000000..1960446
--- /dev/null
+++ b/packaging/kernel/src/main/filtered/bin/shutdown.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+
+SCRIPT="$0"
+
+# SCRIPT may be an arbitrarily deep series of symlinks. Loop until we have the concrete path.
+while [ -h "$SCRIPT" ] ; do
+  ls=`ls -ld "$SCRIPT"`
+  # Drop everything prior to ->
+  link=`expr "$ls" : '.*-> \(.*\)$'`
+  if expr "$link" : '/.*' > /dev/null; then
+    SCRIPT="$link"
+  else
+    SCRIPT=`dirname "$SCRIPT"`/"$link"
+  fi
+done
+
+SCRIPT_DIR=`dirname $SCRIPT`
+EXECUTABLE="dmk.sh"
+
+#
+# identify yourself when running under cygwin
+#
+cygwin=false
+case "$(uname)" in
+    CYGWIN*) cygwin=true ;;
+esac
+export cygwin
+
+exec "$SCRIPT_DIR"/"$EXECUTABLE" stop "$@"
diff --git a/packaging/kernel/src/main/filtered/bin/startup.sh b/packaging/kernel/src/main/filtered/bin/startup.sh
new file mode 100755
index 0000000..69e43b7
--- /dev/null
+++ b/packaging/kernel/src/main/filtered/bin/startup.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+
+SCRIPT="$0"
+
+# SCRIPT may be an arbitrarily deep series of symlinks. Loop until we have the concrete path.
+while [ -h "$SCRIPT" ] ; do
+  ls=`ls -ld "$SCRIPT"`
+  # Drop everything prior to ->
+  link=`expr "$ls" : '.*-> \(.*\)$'`
+  if expr "$link" : '/.*' > /dev/null; then
+    SCRIPT="$link"
+  else
+    SCRIPT=`dirname "$SCRIPT"`/"$link"
+  fi
+done
+
+SCRIPT_DIR=`dirname $SCRIPT`
+EXECUTABLE="dmk.sh"
+
+#
+# identify yourself when running under cygwin
+#
+cygwin=false
+case "$(uname)" in
+    CYGWIN*) cygwin=true ;;
+esac
+export cygwin
+
+exec "$SCRIPT_DIR"/"$EXECUTABLE" start "$@"
diff --git a/packaging/kernel/src/main/filtered/configuration/org.eclipse.virgo.kernel.userregion.properties b/packaging/kernel/src/main/filtered/configuration/org.eclipse.virgo.kernel.userregion.properties
new file mode 100644
index 0000000..b376727
--- /dev/null
+++ b/packaging/kernel/src/main/filtered/configuration/org.eclipse.virgo.kernel.userregion.properties
@@ -0,0 +1,95 @@
+baseBundles = \
+ file:plugins/org.eclipse.equinox.cm_@EQUINOX.CONFIGADMIN.VERSION@.jar@start,\
+ file:plugins/org.eclipse.virgo.kernel.userregion_@VIRGO.VERSION@.jar@start,\
+ file:plugins/org.eclipse.virgo.shell.command_@VIRGO.VERSION@.jar@start,\
+ file:plugins/org.eclipse.osgi.services_@OSGI.SERVICES.VERSION@.jar@start,\
+ file:plugins/org.apache.mina.core_@MINA.CORE.VERSION@.jar@start,\
+ file:plugins/org.apache.felix.gogo.command_@FELIX.GOGO.COMMAND.VERSION@.jar@start,\
+ file:plugins/org.apache.felix.gogo.runtime_@FELIX.GOGO.RUNTIME.VERSION@.jar@start,\
+ file:plugins/org.apache.felix.gogo.shell_@FELIX.GOGO.SHELL.VERSION@.jar@start,\
+ file:plugins/org.eclipse.equinox.console_@EQUINOX.CONSOLE.VERSION@.jar@start,\
+ file:plugins/org.eclipse.equinox.console.ssh_@EQUINOX.CONSOLE.SSH.VERSION@.jar@start,\
+ file:plugins/org.apache.sshd.core_@SSHD.CORE.VERSION@.jar@start
+
+bundleImports = org.eclipse.osgi;bundle-version="0"
+
+packageImports =\
+ org.eclipse.virgo.kernel.artifact.*;version="0",\
+ org.eclipse.virgo.nano.core;version="0",\
+ org.eclipse.virgo.nano.deployer.api.*;version="0",\
+ org.eclipse.virgo.nano.deployer.api;version="0",\
+ org.eclipse.virgo.nano.deployer;version="0",\
+ org.eclipse.virgo.kernel.deployer.core.event;version="0",\
+ org.eclipse.virgo.kernel.install.*;version="0",\
+ org.eclipse.virgo.kernel.osgi.*;version="0",\
+ org.eclipse.virgo.kernel.model;version="0",\
+ org.eclipse.virgo.kernel.model.management;version="0",\
+ org.eclipse.virgo.kernel.module;version="0",\
+ org.eclipse.virgo.kernel.equinox.extensions.hooks;version="0",\
+ org.eclipse.virgo.nano.serviceability;version="0",\
+ org.eclipse.virgo.nano.serviceability.*;version="0",\
+ org.eclipse.virgo.kernel.services.work;version="0",\
+ org.eclipse.virgo.nano.shim.*;version="0",\
+ org.eclipse.virgo.medic.*;version="0",\
+ org.eclipse.virgo.repository;version="0",\
+ org.eclipse.virgo.repository.*;version="0",\
+ org.eclipse.virgo.util.*;version="0",\
+ org.apache.commons.logging;version="[1.0.0,2.0.0)",\
+ org.apache.commons.logging.impl;version="[1.0.0,2.0.0)",\
+ org.aspectj.*;version="[1.6.5.RELEASE,2.0.0)",\
+ org.osgi.service.event;version="0",\
+ org.osgi.service.log;version="0",\
+ org.osgi.service.http;version="0",\
+ javax.servlet;version="3.1.0",\
+ javax.servlet.*;version="3.1.0",\
+ org.eclipse.equinox.region;version="1",\
+ ch.qos.logback.*;version="[1.0.0,2.0.0)",\
+ org.slf4j;version="[1.6.4,2)",\
+ org.slf4j.helpers;version="[1.6.4,2)",\
+ org.slf4j.spi;version="[1.6.4,2)",\
+ org.springframework.util;version="[4.2.1,5)"
+
+serviceImports =\
+ org.eclipse.equinox.region.Region,\
+ org.eclipse.equinox.region.RegionDigraph,\
+ org.osgi.framework.hooks.resolver.ResolverHookFactory,\
+ org.eclipse.virgo.nano.deployer.api.core.ApplicationDeployer,\
+ org.eclipse.virgo.nano.deployer.api.core.DeployUriNormaliser,\
+ org.eclipse.virgo.kernel.install.artifact.ScopeServiceRepository,\
+ org.eclipse.virgo.kernel.services.work.WorkArea,\
+ org.eclipse.virgo.repository.ArtifactBridge,\
+ org.eclipse.virgo.repository.RepositoryFactory,\
+ org.eclipse.virgo.repository.HashGenerator,\
+ org.eclipse.virgo.medic.eventlog.EventLoggerFactory,\
+ org.eclipse.virgo.repository.Repository,\
+ org.eclipse.virgo.nano.core.Shutdown,\
+ org.osgi.service.event.EventAdmin,\
+ org.osgi.service.log.LogService,\
+ org.osgi.service.http.HttpService,\
+ org.eclipse.virgo.medic.eventlog.EventLogger,\
+ org.eclipse.virgo.medic.dump.DumpGenerator,\
+ org.eclipse.virgo.nano.shim.scope.ScopeFactory,\
+ org.eclipse.virgo.nano.shim.serviceability.TracingService,\
+ org.eclipse.virgo.kernel.model.RuntimeArtifactRepository,\
+ org.eclipse.virgo.kernel.model.management.RuntimeArtifactModelObjectNameCreator,\
+ org.eclipse.osgi.service.resolver.PlatformAdmin,\
+ org.osgi.service.packageadmin.PackageAdmin,\
+ org.eclipse.virgo.nano.core.ConfigurationExporter,\
+ javax.management.MBeanServer
+
+serviceExports =\
+ org.eclipse.virgo.kernel.install.artifact.InstallArtifactLifecycleListener,\
+ org.eclipse.virgo.kernel.install.artifact.ArtifactIdentityDeterminer,\
+ org.eclipse.virgo.kernel.install.pipeline.stage.transform.Transformer,\
+ org.eclipse.virgo.kernel.module.ModuleContextAccessor,\
+ org.eclipse.virgo.medic.dump.DumpContributor,\
+ org.eclipse.virgo.kernel.osgi.quasi.QuasiFrameworkFactory,\
+ org.eclipse.virgo.kernel.osgi.framework.OsgiFramework,\
+ org.eclipse.virgo.kernel.osgi.framework.ImportExpander,\
+ org.eclipse.virgo.kernel.osgi.framework.PackageAdminUtil,\
+ org.eclipse.equinox.region.Region,\
+ org.osgi.service.event.EventHandler,\
+ org.osgi.framework.BundleContext,\
+ org.eclipse.virgo.nano.deployer.api.config.ConfigurationDeployer
+
+initialArtifacts = repository:plan/org.eclipse.virgo.kernel.userregion.blueprint,repository:plan/org.eclipse.virgo.management
diff --git a/packaging/kernel/src/main/filtered/lib/.version b/packaging/kernel/src/main/filtered/lib/.version
new file mode 100644
index 0000000..f453b4a
--- /dev/null
+++ b/packaging/kernel/src/main/filtered/lib/.version
@@ -0,0 +1 @@
+virgo.kernel.version=@VIRGO.VERSION@
diff --git a/packaging/nano/build.gradle b/packaging/nano/build.gradle
new file mode 100644
index 0000000..111cf0c
--- /dev/null
+++ b/packaging/nano/build.gradle
@@ -0,0 +1,168 @@
+import org.apache.tools.ant.filters.ReplaceTokens
+
+import static virgobuild.VirgoToolsPlugin.DOWNLOAD_VIRGO_BUILD_TOOLS_TASK_NAME
+import static virgobuild.VirgoToolsPlugin.installProduct
+import static virgobuild.VirgoToolsPlugin.publishProduct
+
+import virgobuild.Config
+
+apply plugin: 'distribution'
+
+distributions {
+    main {
+        baseName = 'virgo-nano'
+        contents {
+            from ( 'src/main/filtered' ) {
+                include ( '**/*.properties' )
+                include ( '**/.version' )
+                filter(ReplaceTokens, tokens: tokenMap) // tokens are used in e.g. oev.kernel.userregion.properties
+            }
+            from ( 'src/main/filtered' ) {
+                include ( 'bin/*.sh' )
+                fileMode 0755
+            }
+            from ( "${buildDir}/VN/nano/" ) {
+                exclude ( 'Eclipse.app' )
+                // Remove unwanted *kernel* bundles from nano deliverable
+                exclude('plugins/*.kernel.*')
+            }
+            from ( "${buildDir}/common_resources/" )
+        }
+    }
+    full {
+        baseName = 'virgo-nano-full'
+        contents {
+            from ( 'src/main/filtered' ) {
+                include ( '**/*.properties' )
+                include ( '**/.version' )
+                filter(ReplaceTokens, tokens: tokenMap) // tokens are used in e.g. oev.kernel.userregion.properties
+            }
+            from ( 'src/main/filtered' ) {
+                include ( 'bin/*.sh' )
+                fileMode 0755
+            }
+            from ( 'src/main/dist' ) {
+            }
+            from ( 'src/full/dist' ) {
+            }
+            from ( "${buildDir}/VNF/nano-full/" ) {
+                exclude ( 'Eclipse.app' )
+                // Remove unwanted *kernel* bundles from nano deliverable
+                exclude('plugins/*.kernel.*')
+            }
+            from ( "${buildDir}/common_resources/" )
+        }
+    }
+    rap {
+        baseName = 'virgo-nano-rap'
+        contents {
+            from ( 'src/main/filtered' ) {
+                include ( '**/*.properties' )
+                include ( '**/.version' )
+                filter(ReplaceTokens, tokens: tokenMap) // tokens are used in e.g. oev.kernel.userregion.properties
+            }
+            from ( 'src/main/filtered' ) {
+                include ( 'bin/*.sh' )
+                fileMode 0755
+            }
+            from ( 'src/main/dist' ) {
+            }
+            from ( "${buildDir}/VNR/nano-rap/" ) {
+                exclude ( 'Eclipse.app' )
+                // Remove unwanted *kernel* bundles from nano deliverable
+                exclude('plugins/*.kernel.*')
+            }
+            from ( "${buildDir}/common_resources/" )
+        }
+    }
+}
+
+task ('assembleNano', dependsOn: [
+    'installProductNano',
+    'installProductNanoFull',
+    'installProductNanoRap',
+    'packageResourcesAndProducts'
+]) {
+    installDist.dependsOn(['assembleNano'])
+    installFullDist.dependsOn(['assembleNano'])
+    installRapDist.dependsOn(['installProductNanoRap'])
+    distZip.dependsOn(['assembleNano'])
+    fullDistZip.dependsOn(['assembleNano'])
+    rapDistZip.dependsOn(['installProductNanoRap'])
+}
+
+task ('packageResourcesAndProducts', dependsOn: [
+    ':kernel:org.eclipse.virgo.kernel.equinox.extensions:jar',
+    ':kernel:org.eclipse.virgo.management.console:war',
+    ':nano:org.eclipse.virgo.nano.authentication:jar',
+    ':nano:org.eclipse.virgo.nano.shutdown:jar',
+    ':util:org.eclipse.virgo.util.env:jar',
+]) {
+    doLast {
+        packageConfiguration('lib', configurations.nanoLib, file("${buildDir}/common_resources/lib/"))
+        packageConfiguration('libPersistence', configurations.nanoLibPersistence, file("${buildDir}/common_resources/lib/persistence/"))
+        packageConfiguration('libEndorsed', configurations.nanoLibEndorsed, file("${buildDir}/common_resources/lib/endorsed/"))
+        packageConfiguration('pickup', configurations.nanoPickup, file("${buildDir}/common_resources/pickup/"))
+    }
+}
+
+// start in debug mode with gradle publish<ID>
+tasks.addRule("Pattern: publish<ID>") { String taskName ->
+    if (taskName.startsWith("publish")) {
+        task (taskName, dependsOn: [
+            ':org.eclipse.virgo.site:publishBase',
+            ':org.eclipse.virgo.site:publishNanoBase',
+        ]) {
+            def product = 'undefined'
+            switch (taskName.toString() - 'publish') {
+                case 'Nano': product = 'nano'; break
+                case 'NanoFull': product = 'nano-full'; break
+                case 'NanoRap': product = 'nano-rap'; break
+            }
+
+            description = "Publishes a product to a p2 repository. The publishing uses ANY environment configurations."
+
+            File repositoryDir = project.file("${project.rootProject.projectDir}/org.eclipse.virgo.site/build/repository/")
+            def productFileLocation = file("${projectDir}/publish_resources/products/${product}/${product}.product")
+            def javaProfileLocation = file("${projectDir}/src/main/dist/configuration/java-server.profile")
+
+            doLast() { publishProduct(project, repositoryDir, productFileLocation, javaProfileLocation) }
+        }
+    }
+}
+
+task ('groupPublish', dependsOn: [
+    ':org.eclipse.virgo.site:publishNanoCore',
+    ':org.eclipse.virgo.site:publishNanoBase',
+    'publishNano',
+    'publishNanoFull',
+    'publishNanoRap',
+]){ }
+
+tasks.addRule("Pattern: installProduct<ID>") { String taskName ->
+    if (taskName.startsWith("installProduct")) {
+        task (taskName, dependsOn: ['groupPublish',]) {
+            def product = 'undefined'
+            def shortProduct = 'undefined'
+            switch (taskName.toString() - 'installProduct') {
+                case 'Nano': product = 'nano'; shortProduct = "VN"; break;
+                case 'NanoFull': product = 'nano-full'; shortProduct = "VNF"; break;
+                case 'NanoRap': product = 'nano-rap'; shortProduct = "VNR"; break;
+            }
+
+            description = "Installs a Virgo product to a desired destination. Default profile(roaming) is VIRGOProfile, the environment cofigurations are ANY."
+
+            File repositoryDir = project.file("${project.rootProject.projectDir}/org.eclipse.virgo.site/build/repository/")
+            def destinationDir = file("${buildDir}/${shortProduct}/${product}")
+            def productIu = "${product}.product"
+
+            doLast() { installProduct(project, productIu, repositoryDir, destinationDir) }
+        }
+    }
+}
+
+task ('groupInstall', dependsOn: [
+    'installProductNano',
+    'installProductNanoFull',
+    'installProductNanoRap',
+]){ }
diff --git a/packaging/nano/org.eclipse.virgo.nano.smoketest/.gitignore b/packaging/nano/org.eclipse.virgo.nano.smoketest/.gitignore
new file mode 100644
index 0000000..fe99505
--- /dev/null
+++ b/packaging/nano/org.eclipse.virgo.nano.smoketest/.gitignore
@@ -0,0 +1,2 @@
+bin
+
diff --git a/packaging/nano/org.eclipse.virgo.nano.smoketest/build.xml b/packaging/nano/org.eclipse.virgo.nano.smoketest/build.xml
new file mode 100644
index 0000000..2d28c77
--- /dev/null
+++ b/packaging/nano/org.eclipse.virgo.nano.smoketest/build.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="org.eclipse.virgo.nano.smoketest">
+
+	<property file="${basedir}/../../../build.properties"/>
+	<property file="${basedir}/../../../build.versions"/>
+	<property file="${basedir}/../../../build/virgo.properties" />
+	<import file="${basedir}/../../../virgo-build/standard/default.xml"/>
+	<import file="${basedir}/../test-package.xml"/>
+
+</project>
diff --git a/packaging/nano/org.eclipse.virgo.nano.smoketest/ivy.xml b/packaging/nano/org.eclipse.virgo.nano.smoketest/ivy.xml
new file mode 100644
index 0000000..98ca4fc
--- /dev/null
+++ b/packaging/nano/org.eclipse.virgo.nano.smoketest/ivy.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ivy-module xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd" version="2.0">
+
+	<info organisation="${project.organisation}" module="${ant.project.name}" />
+
+	<configurations>
+		<include file="${virgo.build.dir}/common/default-ivy-configurations.xml" />
+	</configurations>
+
+	<publications>
+		<artifact name="${ant.project.name}" />
+		<artifact name="${ant.project.name}-sources" type="src" ext="jar" />
+	</publications>
+
+	<dependencies>
+        <dependency org="org.junit" name="com.springsource.org.junit" rev="${org.junit}" conf="test->runtime" />
+		<dependency org="org.eclipse.virgo.util" name="org.eclipse.virgo.util.io" rev="${org.eclipse.virgo.util}" conf="test->runtime"/>
+		
+		<override org="org.eclipse.virgo.util" rev="${org.eclipse.virgo.util}"/>
+	</dependencies>
+
+</ivy-module>
diff --git a/packaging/nano/org.eclipse.virgo.nano.smoketest/src/smokeTest/java/org/eclipse/virgo/nano/smoketest/NanoFullSmokeTests.java b/packaging/nano/org.eclipse.virgo.nano.smoketest/src/smokeTest/java/org/eclipse/virgo/nano/smoketest/NanoFullSmokeTests.java
new file mode 100644
index 0000000..6809a67
--- /dev/null
+++ b/packaging/nano/org.eclipse.virgo.nano.smoketest/src/smokeTest/java/org/eclipse/virgo/nano/smoketest/NanoFullSmokeTests.java
@@ -0,0 +1,100 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2012 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   SAP AG - re-factoring
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.smoketest;
+
+import static org.apache.http.HttpStatus.SC_OK;
+import static org.apache.http.HttpStatus.SC_UNAUTHORIZED;
+import static org.eclipse.virgo.test.tools.JmxUtils.isDefaultJmxPortAvailable;
+import static org.eclipse.virgo.test.tools.JmxUtils.isKernelStarted;
+import static org.eclipse.virgo.test.tools.JmxUtils.waitForVirgoServerShutdownFully;
+import static org.eclipse.virgo.test.tools.UrlWaitLatch.waitFor;
+import static org.eclipse.virgo.test.tools.VirgoServerShutdownThread.shutdown;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.virgo.test.tools.AbstractSmokeTests;
+import org.eclipse.virgo.test.tools.JmxUtils;
+import org.eclipse.virgo.test.tools.ServerUtils;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+
+public class NanoFullSmokeTests extends AbstractSmokeTests {
+
+    private static final String VIRGO_FLAVOR = "nano-full";
+
+    private static final String JAVA_PROFILE_TESTER_1_0_0_JAR = "java.profile.tester_1.0.0.jar";
+
+    @Override
+    protected String getVirgoFlavor() {
+        return VIRGO_FLAVOR;
+    }
+
+    @BeforeClass
+    public static void initJmxConnection() {
+        JmxUtils.virgoHome = ServerUtils.getHome(VIRGO_FLAVOR);
+    }
+
+    @Before
+    public void startServer() throws Exception {
+        // cleanup
+        undeployTestBundles(VIRGO_FLAVOR, JAVA_PROFILE_TESTER_1_0_0_JAR);
+        super.startServer();
+    }
+
+    @Test
+    public void virgoNanoFullShouldBeStarted() throws Exception {
+        assertTrue(isKernelStarted());
+    }
+
+    @Test
+    public void testNanoFullJavaProfileSetCorrectly() throws Exception {
+        assertTrue(isKernelStarted());
+
+        // deploy bundle that should kill the server if the test is successful
+        deployTestBundles(VIRGO_FLAVOR, JAVA_PROFILE_TESTER_1_0_0_JAR);
+
+        // wait for deployment
+        TimeUnit.SECONDS.sleep(10);
+        if (isDefaultJmxPortAvailable()) {
+            // success, we expect the server to be killed with this deployment unit
+            return;
+        }
+
+        // the server is still running - shutdown and fail
+        shutdown(ServerUtils.getBinDir(getVirgoFlavor()));
+        assertTrue(waitForVirgoServerShutdownFully());
+        fail("Virgo java profile not properly set - Nano was supposed to be killed if the test was successful.");
+    }
+
+    @Test
+    @Ignore("Splash is not available in Virgo Nano Full")
+    public void splashScreenShouldBeAccessable() throws Exception {
+        assertEquals(SC_OK, waitFor("http://localhost:8080/"));
+    }
+
+    @Test
+    public void adminScreenShouldBeDeniedWithWrongCredentials() {
+        assertEquals(SC_UNAUTHORIZED, waitFor("http://localhost:8080/admin/content", "foo", "bar"));
+    }
+
+    @Test
+    public void adminScreenShouldBeAccessableWithDefaultCredentials() {
+        assertEquals(SC_OK, waitFor("http://localhost:8080/admin/content", "admin", "admin"));
+    }
+
+}
diff --git a/packaging/nano/org.eclipse.virgo.nano.smoketest/src/smokeTest/java/org/eclipse/virgo/nano/smoketest/NanoSmokeTests.java b/packaging/nano/org.eclipse.virgo.nano.smoketest/src/smokeTest/java/org/eclipse/virgo/nano/smoketest/NanoSmokeTests.java
new file mode 100644
index 0000000..1756d93
--- /dev/null
+++ b/packaging/nano/org.eclipse.virgo.nano.smoketest/src/smokeTest/java/org/eclipse/virgo/nano/smoketest/NanoSmokeTests.java
@@ -0,0 +1,100 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2012 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *   SAP AG - re-factoring
+ *******************************************************************************/
+
+package org.eclipse.virgo.nano.smoketest;
+
+import static org.apache.http.HttpStatus.SC_OK;
+import static org.apache.http.HttpStatus.SC_UNAUTHORIZED;
+import static org.eclipse.virgo.test.tools.JmxUtils.isDefaultJmxPortAvailable;
+import static org.eclipse.virgo.test.tools.JmxUtils.isKernelStarted;
+import static org.eclipse.virgo.test.tools.JmxUtils.waitForVirgoServerShutdownFully;
+import static org.eclipse.virgo.test.tools.UrlWaitLatch.waitFor;
+import static org.eclipse.virgo.test.tools.VirgoServerShutdownThread.shutdown;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.virgo.test.tools.AbstractSmokeTests;
+import org.eclipse.virgo.test.tools.JmxUtils;
+import org.eclipse.virgo.test.tools.ServerUtils;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+
+public class NanoSmokeTests extends AbstractSmokeTests {
+
+    private static final String VIRGO_FLAVOR = "nano";
+
+    private static final String JAVA_PROFILE_TESTER_1_0_0_JAR = "java.profile.tester_1.0.0.jar";
+
+    @Override
+    protected String getVirgoFlavor() {
+        return VIRGO_FLAVOR;
+    }
+
+    @BeforeClass
+    public static void initJmxConnection() {
+        JmxUtils.virgoHome = ServerUtils.getHome(VIRGO_FLAVOR);
+    }
+
+    @Before
+    public void startServer() throws Exception {
+        // cleanup
+        undeployTestBundles(VIRGO_FLAVOR, JAVA_PROFILE_TESTER_1_0_0_JAR);
+        super.startServer();
+    }
+
+    @Test
+    public void virgoNanoShouldBeStarted() throws Exception {
+        assertTrue(isKernelStarted());
+    }
+
+    @Test
+    public void testNanoJavaProfileSetCorrectly() throws Exception {
+        assertTrue(isKernelStarted());
+
+        // deploy bundle that should kill the server if the test is successful
+        deployTestBundles(VIRGO_FLAVOR, JAVA_PROFILE_TESTER_1_0_0_JAR);
+
+        // wait for deployment
+        TimeUnit.SECONDS.sleep(10);
+        if (isDefaultJmxPortAvailable()) {
+            // success, we expect the server to be killed with this deployment unit
+            return;
+        }
+
+        // the server is still running - shutdown and fail
+        shutdown(ServerUtils.getBinDir(getVirgoFlavor()));
+        assertTrue(waitForVirgoServerShutdownFully());
+        fail("Virgo java profile not properly set - Nano was supposed to be killed if the test was successful.");
+    }
+
+    @Test
+    @Ignore("Splash is not available in Virgo Nano")
+    public void splashScreenShouldBeAccessable() throws Exception {
+        assertEquals(SC_OK, waitFor("http://localhost:8080/"));
+    }
+
+    @Test
+    public void adminScreenShouldBeDeniedWithWrongCredentials() {
+        assertEquals(SC_UNAUTHORIZED, waitFor("http://localhost:8080/admin/content", "foo", "bar"));
+    }
+
+    @Test
+    public void adminScreenShouldBeAccessableWithDefaultCredentials() {
+        assertEquals(SC_OK, waitFor("http://localhost:8080/admin/content", "admin", "admin"));
+    }
+
+}
diff --git a/packaging/nano/org.eclipse.virgo.nano.smoketest/src/smokeTest/resources/bundles/java.profile.tester_1.0.0.jar b/packaging/nano/org.eclipse.virgo.nano.smoketest/src/smokeTest/resources/bundles/java.profile.tester_1.0.0.jar
new file mode 100644
index 0000000..42ea4bf
--- /dev/null
+++ b/packaging/nano/org.eclipse.virgo.nano.smoketest/src/smokeTest/resources/bundles/java.profile.tester_1.0.0.jar
Binary files differ
diff --git a/packaging/nano/publish_resources/products/nano-full/nano-full.product b/packaging/nano/publish_resources/products/nano-full/nano-full.product
new file mode 100755
index 0000000..d51169c
--- /dev/null
+++ b/packaging/nano/publish_resources/products/nano-full/nano-full.product
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<?pde version="3.5"?>

+

+<product name="Eclipse Virgo Nano Full Product" uid="nano-full.product" version="1.0.0" useFeatures="true" includeLaunchers="false">

+

+   <configIni use="default">

+   </configIni>

+

+   <vm>

+   </vm>

+

+   <plugins>

+   </plugins>

+

+   <features>

+	  <feature id="org.eclipse.virgo.p2.provisioning" version="0.0.0"/>

+	  <feature id="org.eclipse.gemini.web" version="0.0.0"/>

+	  <feature id="org.eclipse.virgo.nano.war.deployer" version="0.0.0"/>

+	  <feature id="org.eclipse.virgo.enterprise" version="0.0.0"/>

+   </features>

+

+   <configurations>

+		<plugin id="org.eclipse.virgo.web.enterprise.openejb.initialiser" autoStart="true" startLevel="3" />

+		<plugin id="org.eclipse.virgo.web.enterprise.appdeployer" autoStart="true" startLevel="3" />

+		<plugin id="org.eclipse.virgo.web.enterprise.services.accessor" autoStart="true" startLevel="3" />

+		<plugin id="osgi.enterprise" autoStart="true"/>

+		<plugin id="org.eclipse.virgo.web.enterprise.javax.persistence.provider.initializer" autoStart="true"/>

+		<plugin id="org.eclipse.gemini.web.core" autoStart="true" startLevel="4" />

+		<plugin id="org.eclipse.gemini.web.tomcat" autoStart="true" startLevel="4" />

+		<plugin id="org.eclipse.gemini.web.extender" autoStart="true" startLevel="4" />

+

+		<property name="equinox.use.ds" value="true"/>

+		<property name="api.bundles" value="javassist;bundle-version=3.17.1.GA,org.apache.el;bundle-version=7.0.32.v201211081135"/>

+		<property name="impl.bundles" value="org.eclipse.persistence.jpa;bundle-version=2.4.1.v20121003-ad44345,org.eclipse.persistence.core;bundle-version=2.4.1.v20121003-ad44345,org.apache.openwebbeans.impl;bundle-version=1.1.7.v201304201405,org.apache.openwebbeans.web;bundle-version=1.1.7.v201304201405,org.apache.openwebbeans.jsf;bundle-version=1.1.7.v201304201405"/>

+		<property name="post.api.bundles" value="org.eclipse.persistence.jpa;bundle-version=2.4.1.v20121003-ad44345,org.eclipse.persistence.core;bundle-version=2.4.1.v20121003-ad44345"/>

+		<property name="openejb.deployments.classpath.exclude" value=".*"/>

+		<property name="openejb.deployments.classpath.include" value=""/>

+		<property name="openejb.deployments.classpath" value="false"/>

+		<property name="openejb.read-all.persistence.xml" value="true"/>

+		<property name="register.default.datasources" value="false"/>

+		<property name="org.eclipse.virgo.jarscanner.bundles" value="org.glassfish.web.javax.servlet.jsp.jstl,org.glassfish.com.sun.faces"/>

+		<property name="com.sun.faces.InjectionProvider" value="org.eclipse.virgo.web.enterprise.jsf.support.VirgoJsfInjectionProvider"/>

+		<property name="javax.persistence.provider" value="org.eclipse.persistence.jpa.PersistenceProvider"/>

+		<property name="org.eclipse.gemini.web.tomcat.config.path" value="configuration/tomcat-server.xml"/>

+		<property name="org.eclipse.virgo.update.timeout" value="60000"/>

+		<property name="openejb.jpa.force.javax.persistence.provider" value="false"/>

+		<property name="persistence.integration.jar.name" value="org.eclipse.virgo.web.enterprise.openejb.jpa.integration"/>

+   </configurations>

+

+</product>

diff --git a/packaging/nano/publish_resources/products/nano-full/p2.inf b/packaging/nano/publish_resources/products/nano-full/p2.inf
new file mode 100644
index 0000000..d499d83
--- /dev/null
+++ b/packaging/nano/publish_resources/products/nano-full/p2.inf
@@ -0,0 +1,18 @@
+###############################################################################
+# Copyright (c) 2011 SAP AG
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# and Apache License v2.0 which accompanies this distribution.
+# The Eclipse Public License is available at
+#   http://www.eclipse.org/legal/epl-v10.html
+# and the Apache License v2.0 is available at
+#   http://www.opensource.org/licenses/apache2.0.php.
+# You may elect to redistribute this code under either of these licenses.
+#
+# Contributors:
+#   Borislav Kapukaranov - initial contribution
+###############################################################################
+requires.0.name = nano-base.product
+requires.0.namespace = org.eclipse.equinox.p2.iu
+requires.0.range = 0.0.0
diff --git a/packaging/nano/publish_resources/products/nano-rap/nano-rap.product b/packaging/nano/publish_resources/products/nano-rap/nano-rap.product
new file mode 100755
index 0000000..7d9411e
--- /dev/null
+++ b/packaging/nano/publish_resources/products/nano-rap/nano-rap.product
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<?pde version="3.5"?>

+

+<product name="Eclipse Virgo RAP Product" uid="nano-rap.product" version="1.0.0" useFeatures="true" includeLaunchers="false">

+

+   <configIni use="default">

+   </configIni>

+   

+   <vm>

+   </vm>

+

+   <plugins>

+   </plugins>

+

+   <features>

+	  <feature id="org.eclipse.equinox.http.jetty" version="0.0.0"/>

+	  <feature id="org.eclipse.rap" version="0.0.0"/>

+	  <feature id="org.eclipse.virgo.nano.deployer" version="0.0.0"/>

+	  <feature id="org.eclipse.virgo.nano.mbeans.controller" version="0.0.0"/>

+	  <feature id="org.eclipse.virgo.services.concurrent" version="0.0.0"/>

+	  <feature id="org.eclipse.virgo.services.ds" version="0.0.0"/>

+	  <feature id="org.eclipse.virgo.webconsole.deps" version="0.0.0"/>

+   </features>

+   

+   <configurations>

+   	  <plugin id="org.eclipse.gemini.management" autoStart="true" />

+      <plugin id="org.eclipse.equinox.http.jetty" autoStart="true"/>

+      <plugin id="org.eclipse.equinox.http.servlet" autoStart="true"/>

+	  <plugin id="org.eclipse.virgo.nano.core" autoStart="true" startLevel="4"/>

+	  <plugin id="org.eclipse.virgo.nano.deployer" autoStart="true" startLevel="5"/>

+      <plugin id="org.jolokia.osgi" autoStart="true" />

+

+	  <property name="org.osgi.service.http.port" value="8080"/>

+

+	  <property name="org.eclipse.virgo.fschecker.initialEventMode" value="bulk"/>

+   </configurations>

+

+</product>

diff --git a/packaging/nano/publish_resources/products/nano-rap/p2.inf b/packaging/nano/publish_resources/products/nano-rap/p2.inf
new file mode 100644
index 0000000..bdbdfc7
--- /dev/null
+++ b/packaging/nano/publish_resources/products/nano-rap/p2.inf
@@ -0,0 +1,18 @@
+###############################################################################
+# Copyright (c) 2011 SAP AG
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# and Apache License v2.0 which accompanies this distribution.
+# The Eclipse Public License is available at
+#   http://www.eclipse.org/legal/epl-v10.html
+# and the Apache License v2.0 is available at
+#   http://www.opensource.org/licenses/apache2.0.php.
+# You may elect to redistribute this code under either of these licenses.
+#
+# Contributors:
+#   Borislav Kapukaranov - initial contribution
+###############################################################################
+requires.0.name = base.product
+requires.0.namespace = org.eclipse.equinox.p2.iu
+requires.0.range = 0.0.0
diff --git a/packaging/nano/publish_resources/products/nano/nano.product b/packaging/nano/publish_resources/products/nano/nano.product
new file mode 100755
index 0000000..f4ad9fe
--- /dev/null
+++ b/packaging/nano/publish_resources/products/nano/nano.product
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<?pde version="3.5"?>

+

+<product name="Eclipse Virgo Nano Product" uid="nano.product" version="1.0.0" useFeatures="true" includeLaunchers="false">

+

+   <configIni use="default">

+   </configIni>

+   

+   <vm>

+   </vm>

+

+   <plugins>

+   </plugins>

+

+   <features>

+	  <feature id="org.eclipse.equinox.http.jetty" version="0.0.0"/>

+   </features>

+   

+   <configurations>

+      <plugin id="org.eclipse.equinox.http.jetty" autoStart="true"/>

+      <plugin id="org.eclipse.equinox.http.servlet" autoStart="true"/>

+

+	  <property name="org.osgi.service.http.port" value="8080"/>

+   </configurations>

+

+</product>

diff --git a/packaging/nano/publish_resources/products/nano/p2.inf b/packaging/nano/publish_resources/products/nano/p2.inf
new file mode 100644
index 0000000..d499d83
--- /dev/null
+++ b/packaging/nano/publish_resources/products/nano/p2.inf
@@ -0,0 +1,18 @@
+###############################################################################
+# Copyright (c) 2011 SAP AG
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# and Apache License v2.0 which accompanies this distribution.
+# The Eclipse Public License is available at
+#   http://www.eclipse.org/legal/epl-v10.html
+# and the Apache License v2.0 is available at
+#   http://www.opensource.org/licenses/apache2.0.php.
+# You may elect to redistribute this code under either of these licenses.
+#
+# Contributors:
+#   Borislav Kapukaranov - initial contribution
+###############################################################################
+requires.0.name = nano-base.product
+requires.0.namespace = org.eclipse.equinox.p2.iu
+requires.0.range = 0.0.0
diff --git a/packaging/nano/rapbundles/org.eclipse.core.databinding.beans_1.2.200.v20140214-0004.jar b/packaging/nano/rapbundles/org.eclipse.core.databinding.beans_1.2.200.v20140214-0004.jar
new file mode 100644
index 0000000..ddc7d05
--- /dev/null
+++ b/packaging/nano/rapbundles/org.eclipse.core.databinding.beans_1.2.200.v20140214-0004.jar
Binary files differ
diff --git a/packaging/nano/src/full/dist/AboutNanoWeb.html b/packaging/nano/src/full/dist/AboutNanoWeb.html
new file mode 100644
index 0000000..bba9959
--- /dev/null
+++ b/packaging/nano/src/full/dist/AboutNanoWeb.html
@@ -0,0 +1,178 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<!-- saved from url=(0047)http://www.eclipse.org/legal/epl/longabout.html -->
+<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+
+<TITLE>About</TITLE>
+</HEAD><BODY lang="EN-US">
+<H2>About This Content</H2>
+ 
+<P>13 December 2012</P>	
+<H3>License</H3>
+
+<P>The Eclipse Foundation makes available all content in this plug-in ("Content").  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL").  A copy of the EPL is available 
+at <A href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</A>.
+For purposes of the EPL, "Program" will mean the Content.</P>
+
+<P>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <A href="http://www.eclipse.org/">http://www.eclipse.org</A>.</P>
+
+		
+		<H3>Third Party Content</H3>
+		<P>The Content includes items that have been sourced from third parties as set out below. If you 
+		did not receive this Content directly from the Eclipse Foundation, the following is provided 
+		for informational purposes only, and you should look to the Redistributor's license for 
+		terms and conditions of use.</P>
+		
+    <h4>Nano Third Party Content</h4>
+    <p>This is listed in <a href="AboutNano.html">Nano's About file</a>.
+
+    
+		<h4>
+			<a href="about_files/apache-v20.txt">Apache License 2.0</a>
+		</h4>
+		This product contains software developed by the Apache Software Foundation (<a href="http://www.apache.org">http://www.apache.org</a>).
+		<ul>
+            <li>
+				Apache Commons BeanUtils 1.8.0 - binary and source are available from the <a href="http://commons.apache.org/beanutils/">Apache Commons BeanUtils project</a>
+			</li>
+            <li>
+				Apache Commons Collections 3.2.0 - binary and source are available from the <a href="http://commons.apache.org/collections/">Apache Commons Collections project</a>
+			</li>
+            <li>
+				Apache Commons DBCP 1.4.0 - binary and source are available from the <a href="http://commons.apache.org/dbcp/">Apache Commons DBCP project</a>
+			</li>
+            <li>
+				Apache Commons Lang 2.6.0 - binary and source are available from the <a href="http://commons.apache.org/lang/">Apache Commons Lang project</a>
+			</li>
+            <li>
+				Apache Commons Pool 1.6.0 - binary and source are available from the <a href="http://commons.apache.org/pool/">Apache Commons Pool project</a>
+			</li>
+            <li>
+				Apache OpenEjb 4.0.0-beta2 - binary and source are available from the <a href="http://tomee.apache.org/">Tomee and OpenEjb project</a>
+			</li>
+            <li>
+				Apache OpenWebBeans 1.1.3 - binary and source are available from the <a href="http://openwebbeans.apache.org/owb/index.html">OpenWebBeans project</a>
+			</li>
+            <li>
+				Apache BVal 0.3.0 - binary and source are available from the <a href="http://incubator.apache.org/bval/cwiki/index.html">BVal project</a>
+			</li>
+            <li>
+				Apache Derby 10.8.2.2 - binary and source are available from the <a href="http://db.apache.org/derby/releases/release-10.8.2.2.cgi">Apache Derby project</a>
+			</li>
+            <li>
+				Apache Xbean 3.9 - binary and source are available from the <a href="https://repository.apache.org/content/groups/public/org/apache/xbean/xbean/3.9/">XBean Maven repository</a>
+			</li>
+            <li>
+				Apache Standard Taglibs 1.1.2.v20110517 - binary and source is available from the <a href="http://tomcat.apache.org/taglibs/index.html">Apache Taglibs project</a>
+			</li>
+			<li>
+				Apache Tomcat 7.0.26 - binary and source is available from the <a href="http://tomcat.apache.org/">Apache Tomcat project</a>
+			</li>
+            <li>
+				Apache Geronimo Components 3.1.1 - binary and source is available from the <a href="http://geronimo.apache.org/">Apache Geronimo Components project</a>
+			</li>
+            <li>
+				Apache Geronimo Specs OSGi 1.1.0 - binary and source is available from the <a href="http://geronimo.apache.org/">Apache Geronimo Specs OSGi project</a>
+			</li>
+            <li>
+				Scannotation 1.0.2 - binary and source is available from the <a href="http://sourceforge.net/projects/scannotation/">Scannotation project</a>
+			</li>
+            <li>
+				Quartz 1.6.0 - binary and source is available from the <a href="http://www.quartz-scheduler.org/">Quartz project</a>
+			</li>
+            <li>
+				JSTL implementation 1.2.0 - binary and source is available from the <a href="http://jstl.java.net/">JSTL project</a> (Dual-licensed CDDL 1.0 or APL 2. Virgo elects to use APL 2.)
+			</li>
+		</ul>
+		<h4>
+			<a href="about_files/cddl-10.txt">Common Development and Distribution License 1.0</a>
+		</h4>
+		<ul>
+            <li>
+				javax.faces 2.1.6 - binary and source is available from the
+				<a href="http://javaserverfaces.java.net/">GlassFish Project</a> (Dual-licensed CDDL 1.0 or GPL 2. Virgo elects to use CDDL 1.0.)
+			</li>
+            <li>
+				java server faces 2.1.6 - binary and source is available from the
+				<a href="http://javaserverfaces.java.net/">GlassFish Project</a> (Dual-licensed CDDL 1.0 or GPL 2. Virgo elects to use CDDL 1.0.)
+			</li>
+		</ul>
+        <h4>
+            <a href="about_files/new-bsd.txt">New BSD License</a>
+        </h4>
+        <ul>
+            <li>
+                JOTM 2.1.9 - binary and source is available from the <a href="http://jotm.ow2.org/xwiki/bin/view/Main/">JOTM Project</a>
+            </li>
+        </ul>
+        <h4>
+            <a href="about_files/mpl-1.1.txt">Mozilla Public License 1.1</a>
+        </h4>
+        <ul>
+            <li>
+                Javassist 3.13.0 - binary and source is available from the <a href="http://www.csg.is.titech.ac.jp/~chiba/javassist/">Javassist Project</a>
+            </li>
+        </ul>
+        <h4>
+            Third-party APIs
+        </h4>
+        <p>These third-party APIs are taken from Eclipse Orbit. You can obtain sources and binaries by searching the repositories <a href="http://download.eclipse.org/tools/orbit/downloads/">here</a></p>
+        <li>
+            javax.transaction 1.1.1.v201105210645 - <a href="about_files/apache-v20.txt">Apache License 2.0</a>
+        </li>
+        <li>
+            javax.annotation 1.1.0.v201108011116 - <a href="about_files/cddl-10.txt">Common Development and Distribution License 1.0</a>
+        </li>
+        <li>
+            javax.ejb 3.1.1.v201204261316 - <a href="about_files/cddl-10.txt">Common Development and Distribution License 1.0</a>
+        </li>
+        <li>
+            javax.el 2.2.0.v201108011116 - <a href="about_files/cddl-10.txt">Common Development and Distribution License 1.0</a>, <a href="about_files/apache-v20.txt">Apache License 2.0</a> (Dual-licensed CDDL 1.0 or APL 2. Virgo elects to use APL 2.)
+        </li>
+        <li>
+            javax.inject 1.0.0.v20091030 - <a href="about_files/apache-v20.txt">Apache License 2.0</a>
+        </li>
+        <li>
+            javax.jms 1.1.0.v201205091237 - <a href="about_files/cddl-10.txt">Common Development and Distribution License 1.0</a>
+        </li>
+        <li>
+            javax.mail 1.4.0.v201005080615 - <a href="about_files/apache-v20.txt">Apache License 2.0</a>
+        </li>
+        <li>
+            javax.resource 1.6.0.v201204270900 - <a href="about_files/cddl-10.txt">Common Development and Distribution License 1.0</a>
+        </li>
+        <li>
+            javax.security.auth.message 1.0.0.v201108011116 - <a href="about_files/apache-v20.txt">Apache License 2.0</a>
+        </li>
+        <li>
+            javax.security.jacc 1.4.0.v201205031350 - <a href="about_files/cddl-10.txt">Common Development and Distribution License 1.0</a>
+        </li>
+        <li>
+            javax.servlet 3.0.0.v201112011016 - <a href="about_files/cddl-10.txt">Common Development and Distribution License 1.0</a>, <a href="about_files/apache-v20.txt">Apache License 2.0</a> (Dual-licensed CDDL 1.0 or APL 2. Virgo elects to use APL 2.)
+        </li>
+        <li>
+            javax.servlet.jsp 2.2.0.v201112011158 - <a href="about_files/cddl-10.txt">Common Development and Distribution License 1.0</a>, <a href="about_files/apache-v20.txt">Apache License 2.0</a> (Dual-licensed CDDL 1.0 or APL 2. Virgo elects to use APL 2.)
+        </li>
+        <li>
+            javax.servlet.jsp.jstl 1.2.0.v201105211821 - <a href="about_files/cddl-10.txt">Common Development and Distribution License 1.0</a>, <a href="about_files/apache-v20.txt">Apache License 2.0</a> (Dual-licensed CDDL 1.0 or APL 2. Virgo elects to use APL 2.)
+        </li>
+        <li>
+            javax.validation 1.0.0.GA_v201205091237 - <a href="about_files/apache-v20.txt">Apache License 2.0</a>
+        </li>
+        <li>
+            javax.ws.rs 1.1.1.v20101004-1200 - <a href="about_files/cddl-10.txt">Common Development and Distribution License 1.0</a>
+        </li>
+        <li>
+            javax.wsdl 1.6.2.v20101204054 - <a href="about_files/cpl-10.txt">Common Public License 1.0</a>
+        </li>
+        <li>
+            javax.xml.rpc 1.1.0.v201005080400 - <a href="about_files/cddl-10.txt">Common Development and Distribution License 1.0</a>
+        </li>
+
+</BODY></HTML>
\ No newline at end of file
diff --git a/packaging/nano/src/full/dist/configuration/context.xml b/packaging/nano/src/full/dist/configuration/context.xml
new file mode 100644
index 0000000..8237aae
--- /dev/null
+++ b/packaging/nano/src/full/dist/configuration/context.xml
@@ -0,0 +1,9 @@
+<Context sendRedirectBody="true">

+    <Valve className="org.eclipse.virgo.web.enterprise.security.valve.OpenEjbSecurityInitializationValve"/>

+    <Listener className="org.eclipse.virgo.web.enterprise.openwebbeans.initialiser.VirgoContextLifecycleListener"/>

+    <Listener className="org.eclipse.virgo.web.enterprise.applistener.internal.NamingResourcesListener"/>

+    <Manager sessionIdLength ="32" maxInactiveInterval="1200" pathname=""/>

+    <Listener className="org.eclipse.virgo.web.enterprise.applistener.internal.OpenEjbApplicationListener"/>

+    <Resource name="UserTransaction" auth="Container" type="javax.transaction.UserTransaction"/>

+    <Transaction factory="org.objectweb.jotm.UserTransactionFactory" jotm.timeout="60"/>

+</Context>
\ No newline at end of file
diff --git a/packaging/nano/src/full/dist/configuration/openejb.xml b/packaging/nano/src/full/dist/configuration/openejb.xml
new file mode 100644
index 0000000..badc0cf
--- /dev/null
+++ b/packaging/nano/src/full/dist/configuration/openejb.xml
@@ -0,0 +1,159 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<openejb>
+
+
+<Container id="My Singleton Container" type="SINGLETON">
+  # Specifies the maximum time an invocation could wait for the
+  # singleton bean instance to become available before giving up.
+  #
+  # After the timeout is reached a javax.ejb.ConcurrentAccessTimeoutException
+  # will be thrown.
+  #
+  # Usable time units: nanoseconds, microseconds, milliseconds,
+  # seconds, minutes, hours, days.  Or any combination such as
+  # "1 hour and 27 minutes and 10 seconds"
+
+  AccessTimeout = 30 seconds
+
+</Container>
+
+
+<Container id="My Stateful Container" type="STATEFUL">
+  # Specifies the maximum time an invocation could wait for the
+  # stateful bean instance to become available before giving up.
+  #
+  # After the timeout is reached a javax.ejb.ConcurrentAccessTimeoutException
+  # will be thrown.
+  #
+  # Usable time units: nanoseconds, microseconds, milliseconds,
+  # seconds, minutes, hours, days.  Or any combination such as
+  # "1 hour and 27 minutes and 10 seconds"
+
+  AccessTimeout = 30 seconds
+
+  #  The passivator is responsible for writing beans to disk
+  #  at passivation time. Different passivators can be used
+  #  by setting this property to the fully qualified class name
+  #  of the PassivationStrategy implementation. The passivator
+  #  is not responsible for invoking any callbacks or other
+  #  processing, its only responsibly is to write the bean state
+  #  to disk.
+  #
+  #  Known implementations:
+  #     org.apache.openejb.core.stateful.RAFPassivater
+  #     org.apache.openejb.core.stateful.SimplePassivater
+
+  Passivator   org.apache.openejb.core.stateful.SimplePassivater
+
+  #  Specifies the time to wait between invocations. This
+  #  value is measured in minutes. A value of 5 would
+  #  result in a time-out of 5 minutes between invocations.
+  #  A value of zero would mean no timeout.
+
+  TimeOut  20
+
+  #  Specifies the size of the bean pools for this
+  #  stateful SessionBean container.
+
+  Capacity  1000
+
+  #  Property name that specifies the number of instances
+  #  to passivate at one time when doing bulk passivation.
+  #  Must be less than the PoolSize.
+
+  BulkPassivate  100
+
+</Container>
+
+
+<Container id="My Stateless Container" type="STATELESS">
+
+  # Specifies the time an invokation should wait for an instance
+  # of the pool to become available.
+  #
+  # After the timeout is reached, if an instance in the pool cannot
+  # be obtained, the method invocation will fail.
+  #
+  # Usable time units: nanoseconds, microseconds, milliseconds,
+  # seconds, minutes, hours, days.  Or any combination such as
+  # "1 hour and 27 minutes and 10 seconds"
+
+  AccessTimeout = 30 seconds
+
+  # Specifies the size of the bean pools for this stateless
+  # SessionBean container.  If StrictPooling is not used, instances
+  # will still be created beyond this number if there is demand, but
+  # they will not be returned to the pool and instead will be
+  # immediately destroyed.
+
+  MaxSize = 10
+
+  # Specifies the minimum number of bean instances that should be in
+  # the pool for each bean.  Pools are prefilled to the minimum on
+  # startup.  Note this will create start order dependencies between
+  # other beans that also eagerly start, such as other @Stateless
+  # beans with a minimum or @Singleton beans using @Startup.  The
+  # @DependsOn annotation can be used to appropriately influence
+  # start order.
+  #
+  # The minimum pool size is rigidly maintained.  Instances in the
+  # minimum side of the pool are not eligible for IdleTimeout or
+  # GarbageCollection, but are subject to MaxAge and flushing.
+  #
+  # If the pool is flushed it is immediately refilled to the minimum
+  # size with MaxAgeOffset applied.  If an instance from the minimum
+  # side of the pool reaches its MaxAge, it is also immediately
+  # replaced.  Replacement is done in a background queue using the
+  # number of threads specified by CallbackThreads.
+
+  MinSize = 0
+
+  # StrictPooling tells the container what to do when the pool
+  # reaches it's maximum size and there are incoming requests that
+  # need instances.
+  #
+  # With strict pooling, requests will have to wait for instances to
+  # become available. The pool size will never grow beyond the the
+  # set MaxSize value.  The maximum amount of time a request should
+  # wait is specified via the AccessTimeout setting.
+  #
+  # Without strict pooling, the container will create temporary
+  # instances to meet demand. The instances will last for just one
+  # method invocation and then are removed.
+  #
+  # Setting StrictPooling to false and MaxSize to 0 will result in
+  # no pooling. Instead instances will be created on demand and live
+  # for exactly one method call before being removed.
+
+  StrictPooling = true
+
+  # Specifies the maximum time that an instance should live before
+  # it should be retired and removed from use.  This will happen
+  # gracefully.  Useful for situations where bean instances are
+  # designed to hold potentially expensive resources such as memory
+  # or file handles and need to be periodically cleared out.
+  #
+  # Usable time units: nanoseconds, microseconds, milliseconds,
+  # seconds, minutes, hours, days.  Or any combination such as
+  # "1 hour and 27 minutes and 10 seconds"
+
+  MaxAge = 0 hours
+
+  # Specifies the maximum time that an instance should be allowed to
+  # sit idly in the pool without use before it should be retired and
+  # removed.
+  #
+  # Usable time units: nanoseconds, microseconds, milliseconds,
+  # seconds, minutes, hours, days.  Or any combination such as
+  # "1 hour and 27 minutes and 10 seconds"
+
+  IdleTimeout = 0 minutes
+
+</Container>
+    
+<TransactionManager id="jotm" provider="javax.transaction#jotm">
+</TransactionManager>
+
+<SecurityService id="Standard Security Service" provider="org.eclipse.virgo.web.enterprise.security#Standard Security Service"/>
+
+</openejb>
diff --git a/packaging/nano/src/full/dist/configuration/tomcat-server.xml b/packaging/nano/src/full/dist/configuration/tomcat-server.xml
new file mode 100644
index 0000000..047ae67
--- /dev/null
+++ b/packaging/nano/src/full/dist/configuration/tomcat-server.xml
@@ -0,0 +1,54 @@
+<?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.
+-->
+<Server>
+  <!--APR library loader. Documentation at /docs/apr.html -->
+  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
+  <!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html -->
+  <!-- Prevent memory leaks due to use of particular java/javax APIs-->
+  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
+  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
+  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
+
+  <Service name="Catalina">
+    <Connector port="8080" protocol="HTTP/1.1"
+               connectionTimeout="20000"
+               redirectPort="8443" />
+
+    <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
+               maxThreads="150" scheme="https" secure="true"
+               clientAuth="false" sslProtocol="TLS"
+               keystoreFile="configuration/keystore"
+               keystorePass="changeit"/>
+
+    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
+
+    <Engine name="Catalina" defaultHost="localhost">
+      <Realm className="org.apache.catalina.realm.JAASRealm" appName="virgo-kernel"
+             userClassNames="org.eclipse.virgo.nano.authentication.User"
+             roleClassNames="org.eclipse.virgo.nano.authentication.Role"/>
+
+      <Host name="localhost" appBase=""
+            unpackWARs="false" autoDeploy="false"
+            deployOnStartup="false" createDirs="false">
+
+        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="serviceability/logs/access"
+               prefix="localhost_access_log." suffix=".txt" pattern="common" resolveHosts="false"/>
+      </Host>
+    </Engine>
+  </Service>
+</Server>
diff --git a/packaging/nano/src/main/dist/AboutNano.html b/packaging/nano/src/main/dist/AboutNano.html
new file mode 100644
index 0000000..f1edaee
--- /dev/null
+++ b/packaging/nano/src/main/dist/AboutNano.html
@@ -0,0 +1,99 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<!-- saved from url=(0047)http://www.eclipse.org/legal/epl/longabout.html -->
+<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+
+<TITLE>About</TITLE>
+</HEAD><BODY lang="EN-US">
+<H2>About This Content</H2>
+ 
+<P>13 December 2012</P>	
+<H3>License</H3>
+
+<P>The Eclipse Foundation makes available all content in this plug-in ("Content").  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL").  A copy of the EPL is available 
+at <A href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</A>.
+For purposes of the EPL, "Program" will mean the Content.</P>
+
+<P>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <A href="http://www.eclipse.org/">http://www.eclipse.org</A>.</P>
+
+		
+		<H3>Third Party Content</H3>
+		<P>The Content includes items that have been sourced from third parties as set out below. If you 
+		did not receive this Content directly from the Eclipse Foundation, the following is provided 
+		for informational purposes only, and you should look to the Redistributor's license for 
+		terms and conditions of use.</P>
+		
+		<h4>
+			<a href="about_files/apache-v20.txt">Apache License 2.0</a>
+		</h4>
+		This product contains software developed by the Apache Software Foundation (<a href="http://www.apache.org">http://www.apache.org</a>).
+		<ul>
+			<li>
+				Apache Commons FileUpload 1.2.0 - binary and source are available from the <a href="http://commons.apache.org/fileupload/">Apache Commons FileUpload project</a>
+			</li>
+			<li>
+				Apache Commons IO 1.4.0 - binary and source are available from the <a href="http://commons.apache.org/io/">Apache Commons IO project</a>
+			</li>
+			<li>
+				Apache Felix Gogo 0.10.0 - binary and source is available from the <a href="http://felix.apache.org">Apache Felix project</a>
+			</li>
+			<li>
+				Apache MINA Core 2.0.2 - binary and source is available from the <a href="http://mina.apache.org/">Apache MINA project</a>
+			</li>
+			<li>
+				Apache MINA SSHD Core 0.5.0 - binary and source is available from the <a href="http://mina.apache.org/">Apache MINA project</a>
+			</li>
+			<li>
+				javax.transaction 1.1.1 - binary and source are available from the <a href="http://geronimo.apache.org/">Apache Geronimo project</a>
+			</li>
+			<li>
+				Jolokia OSGi 1.0.2 - binary and source are available from the <a href="http://www.jolokia.org/">Jolokia project</a>
+			</li>
+			<li>
+				OSGi Enterprise 4.2 - binary and source are available from the <a href="https://www.osgi.org/members/Release42/HomePage">OSGi Alliance</a>
+			</li>
+		</ul>
+		<h4>
+			<a href="about_files/LICENSE-AspectJ.html">AspectJ License</a>
+		</h4>
+		<ul>
+			<li>
+				AspectJ Weaver 1.6.12 - binary and source is available from the <a href="http://eclipse.org/aspectj">AspectJ project</a>
+			</li>
+		</ul>
+		<h4>
+			<a href="about_files/cddl-10.txt">Common Development and Distribution License 1.0</a>
+		</h4>
+		<ul>
+			<li>
+				javax.annotation 1.1.0 - binary and source is available from the
+				<a href="http://glassfish.java.net/">GlassFish Project</a> (Dual-licensed CDDL 1.0 or GPL 2. Virgo elects to use CDDL 1.0.)
+			</li>
+		</ul>
+
+		<h4>
+			<a href="epl-v10.html">Eclipse Public License 1.0</a>
+		</h4>
+		<ul>
+			<li>
+				Logback 1.0.7 - binary and source is available from the
+				<a href="http://logback.qos.ch/">Logback project</a> (Dual-licensed EPL or LGPL. Virgo elects to use EPL.)
+			</li>
+		</ul>
+		<h4>
+			<a href="about_files/slf4j.txt">SLF4J License</a>
+		</h4>
+		<ul>
+			<li>
+				Simple Logging Facade for Java (SLF4J) 1.7.2 - binary and source is available from the
+				<a href="http://www.slf4j.org/">SLF4J Project</a>
+			</li>
+		</ul>
+
+</BODY></HTML>
\ No newline at end of file
diff --git a/packaging/nano/src/main/dist/about_files/LICENSE-AspectJ.html b/packaging/nano/src/main/dist/about_files/LICENSE-AspectJ.html
new file mode 100644
index 0000000..8f7d0a4
--- /dev/null
+++ b/packaging/nano/src/main/dist/about_files/LICENSE-AspectJ.html
@@ -0,0 +1,91 @@
+<html>
+
+<head>
+<title>AspectJ License</title>
+
+
+</head>
+
+<BODY BGCOLOR="white">
+
+<h2 align="center"><b>AspectJ<sup><small>TM</small></sup>
+                      Compiler and Core Tools License</b></h2>
+
+<p>This is a binary-only release.&nbsp; Source code
+is available from
+<a href="http://eclipse.org/aspectj">http://eclipse.org/aspectj</a></p>
+
+<p>The Eclipse Foundation makes available all content in this distribution ("Content").  
+		Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
+		Eclipse Public License Version 1.0 ("EPL").  A copy of the EPL is available 
+		at <a href="../../org/documents/epl-v10.php">http://www.eclipse.org/legal/epl-v10.html</a>.
+		For purposes of the EPL, "Program" will mean the Content.</p>
+
+		<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+		being redistributed by another party ("Redistributor") and different terms and conditions may
+		apply to your use of any object code in the Content.  Check the Redistributor's license 
+		that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+		indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+		and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+		
+		<h3>Third Party Content</h3>
+		<p>The Content includes items that have been sourced from third parties as set out below. If you 
+		did not receive this Content directly from the Eclipse Foundation, the following is provided 
+		for informational purposes only, and you should look to the Redistributor?s license for 
+		terms and conditions of use.</p>
+		<em>
+
+		<h4>BCEL v5.1</h4>
+		<p>This product contains software developed by the
+         Apache Software Foundation (<a href="http://www.apache.org/">http://www.apache.org</a>).</p>
+ 
+		<p>AspectJ includes a modified version of the Apache Jakarta Byte Code Engineering Library (BCEL) v5.1.
+		BCEL is available at <a href="http://jakarta.apache.org/bcel/">http://jakarta.apache.org/bcel/</a>. Source
+		code for the modified version of BCEL is available at Eclipse.org in the AspectJ source tree. This code
+		is made available under the Apache Software License v1.1</p>
+		
+		<h4>ASM v2.2.1</h4> 
+		<p>AspectJ includes a binary version of ASM v2.2.1 (<a href="http://asm.objectweb.org/index.html">http://asm.objectweb.org/</a>)
+		The source code for ASM is available from the ObjectWeb download site at 
+		<a href="http://asm.objectweb.org/download/">http://asm.objectweb.org/download/</a>. 
+		<p>The ASM license is available at <a href="http://asm.objectweb.org/license.html">http://asm.objectweb.org/license.html</a>. 
+		The license is also reproduced here:
+		</p>
+
+<pre>Copyright (c) 2000-2005 INRIA, France Telecom
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holders nor the names of its
+   contributors may be used to endorse or promote products derived from
+   this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGE.
+</pre>
+
+</em>
+
+</body>
+
+</html>
diff --git a/packaging/nano/src/main/dist/about_files/apache-v20.txt b/packaging/nano/src/main/dist/about_files/apache-v20.txt
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/packaging/nano/src/main/dist/about_files/apache-v20.txt
@@ -0,0 +1,202 @@
+
+                                 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/packaging/nano/src/main/dist/about_files/asm.txt b/packaging/nano/src/main/dist/about_files/asm.txt
new file mode 100644
index 0000000..c5aba7b
--- /dev/null
+++ b/packaging/nano/src/main/dist/about_files/asm.txt
@@ -0,0 +1,29 @@
+Copyright (c) 2000-2011 INRIA, France Telecom
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holders nor the names of its
+   contributors may be used to endorse or promote products derived from
+   this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/packaging/nano/src/main/dist/about_files/cddl-10.txt b/packaging/nano/src/main/dist/about_files/cddl-10.txt
new file mode 100644
index 0000000..9709055
--- /dev/null
+++ b/packaging/nano/src/main/dist/about_files/cddl-10.txt
@@ -0,0 +1,380 @@
+COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0
+
+1. Definitions.
+
+1.1. "Contributor" means each individual or entity that
+creates or contributes to the creation of Modifications.
+
+1.2. "Contributor Version" means the combination of the
+Original Software, prior Modifications used by a
+Contributor (if any), and the Modifications made by that
+particular Contributor.
+
+1.3. "Covered Software" means (a) the Original Software, or
+(b) Modifications, or (c) the combination of files
+containing Original Software with files containing
+Modifications, in each case including portions thereof.
+
+1.4. "Executable" means the Covered Software in any form
+other than Source Code.
+
+1.5. "Initial Developer" means the individual or entity
+that first makes Original Software available under this
+License.
+
+1.6. "Larger Work" means a work which combines Covered
+Software or portions thereof with code not governed by the
+terms of this License.
+
+1.7. "License" means this document.
+
+1.8. "Licensable" means having the right to grant, to the
+maximum extent possible, whether at the time of the initial
+grant or subsequently acquired, any and all of the rights
+conveyed herein.
+
+1.9. "Modifications" means the Source Code and Executable
+form of any of the following:
+
+A. Any file that results from an addition to,
+deletion from or modification of the contents of a
+file containing Original Software or previous
+Modifications;
+
+B. Any new file that contains any part of the
+Original Software or previous Modification; or
+
+C. Any new file that is contributed or otherwise made
+available under the terms of this License.
+
+1.10. "Original Software" means the Source Code and
+Executable form of computer software code that is
+originally released under this License.
+
+1.11. "Patent Claims" means any patent claim(s), now owned
+or hereafter acquired, including without limitation,
+method, process, and apparatus claims, in any patent
+Licensable by grantor.
+
+1.12. "Source Code" means (a) the common form of computer
+software code in which modifications are made and (b)
+associated documentation included in or with such code.
+
+1.13. "You" (or "Your") means an individual or a legal
+entity exercising rights under, and complying with all of
+the terms of, this License. For legal entities, "You"
+includes any entity which controls, is controlled by, or is
+under common control with You. For purposes of this
+definition, "control" means (a) the power, direct or
+indirect, to cause the direction or management of such
+entity, whether by contract or otherwise, or (b) ownership
+of more than fifty percent (50%) of the outstanding shares
+or beneficial ownership of such entity.
+
+2. License Grants.
+
+2.1. The Initial Developer Grant.
+
+Conditioned upon Your compliance with Section 3.1 below and
+subject to third party intellectual property claims, the
+Initial Developer hereby grants You a world-wide,
+royalty-free, non-exclusive license:
+
+(a) under intellectual property rights (other than
+patent or trademark) Licensable by Initial Developer,
+to use, reproduce, modify, display, perform,
+sublicense and distribute the Original Software (or
+portions thereof), with or without Modifications,
+and/or as part of a Larger Work; and
+
+(b) under Patent Claims infringed by the making,
+using or selling of Original Software, to make, have
+made, use, practice, sell, and offer for sale, and/or
+otherwise dispose of the Original Software (or
+portions thereof).
+
+(c) The licenses granted in Sections 2.1(a) and (b)
+are effective on the date Initial Developer first
+distributes or otherwise makes the Original Software
+available to a third party under the terms of this
+License.
+
+(d) Notwithstanding Section 2.1(b) above, no patent
+license is granted: (1) for code that You delete from
+the Original Software, or (2) for infringements
+caused by: (i) the modification of the Original
+Software, or (ii) the combination of the Original
+Software with other software or devices.
+
+2.2. Contributor Grant.
+
+Conditioned upon Your compliance with Section 3.1 below and
+subject to third party intellectual property claims, each
+Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than
+patent or trademark) Licensable by Contributor to
+use, reproduce, modify, display, perform, sublicense
+and distribute the Modifications created by such
+Contributor (or portions thereof), either on an
+unmodified basis, with other Modifications, as
+Covered Software and/or as part of a Larger Work; and
+
+(b) under Patent Claims infringed by the making,
+using, or selling of Modifications made by that
+Contributor either alone and/or in combination with
+its Contributor Version (or portions of such
+combination), to make, use, sell, offer for sale,
+have made, and/or otherwise dispose of: (1)
+Modifications made by that Contributor (or portions
+thereof); and (2) the combination of Modifications
+made by that Contributor with its Contributor Version
+(or portions of such combination).
+
+(c) The licenses granted in Sections 2.2(a) and
+2.2(b) are effective on the date Contributor first
+distributes or otherwise makes the Modifications
+available to a third party.
+
+(d) Notwithstanding Section 2.2(b) above, no patent
+license is granted: (1) for any code that Contributor
+has deleted from the Contributor Version; (2) for
+infringements caused by: (i) third party
+modifications of Contributor Version, or (ii) the
+combination of Modifications made by that Contributor
+with other software (except as part of the
+Contributor Version) or other devices; or (3) under
+Patent Claims infringed by Covered Software in the
+absence of Modifications made by that Contributor.
+
+3. Distribution Obligations.
+
+3.1. Availability of Source Code.
+
+Any Covered Software that You distribute or otherwise make
+available in Executable form must also be made available in
+Source Code form and that Source Code form must be
+distributed only under the terms of this License. You must
+include a copy of this License with every copy of the
+Source Code form of the Covered Software You distribute or
+otherwise make available. You must inform recipients of any
+such Covered Software in Executable form as to how they can
+obtain such Covered Software in Source Code form in a
+reasonable manner on or through a medium customarily used
+for software exchange.
+
+3.2. Modifications.
+
+The Modifications that You create or to which You
+contribute are governed by the terms of this License. You
+represent that You believe Your Modifications are Your
+original creation(s) and/or You have sufficient rights to
+grant the rights conveyed by this License.
+
+3.3. Required Notices.
+
+You must include a notice in each of Your Modifications
+that identifies You as the Contributor of the Modification.
+You may not remove or alter any copyright, patent or
+trademark notices contained within the Covered Software, or
+any notices of licensing or any descriptive text giving
+attribution to any Contributor or the Initial Developer.
+
+3.4. Application of Additional Terms.
+
+You may not offer or impose any terms on any Covered
+Software in Source Code form that alters or restricts the
+applicable version of this License or the recipients'
+rights hereunder. You may choose to offer, and to charge a
+fee for, warranty, support, indemnity or liability
+obligations to one or more recipients of Covered Software.
+However, you may do so only on Your own behalf, and not on
+behalf of the Initial Developer or any Contributor. You
+must make it absolutely clear that any such warranty,
+support, indemnity or liability obligation is offered by
+You alone, and You hereby agree to indemnify the Initial
+Developer and every Contributor for any liability incurred
+by the Initial Developer or such Contributor as a result of
+warranty, support, indemnity or liability terms You offer.
+
+3.5. Distribution of Executable Versions.
+
+You may distribute the Executable form of the Covered
+Software under the terms of this License or under the terms
+of a license of Your choice, which may contain terms
+different from this License, provided that You are in
+compliance with the terms of this License and that the
+license for the Executable form does not attempt to limit
+or alter the recipient's rights in the Source Code form
+from the rights set forth in this License. If You
+distribute the Covered Software in Executable form under a
+different license, You must make it absolutely clear that
+any terms which differ from this License are offered by You
+alone, not by the Initial Developer or Contributor. You
+hereby agree to indemnify the Initial Developer and every
+Contributor for any liability incurred by the Initial
+Developer or such Contributor as a result of any such terms
+You offer.
+
+3.6. Larger Works.
+
+You may create a Larger Work by combining Covered Software
+with other code not governed by the terms of this License
+and distribute the Larger Work as a single product. In such
+a case, You must make sure the requirements of this License
+are fulfilled for the Covered Software.
+
+4. Versions of the License.
+
+4.1. New Versions.
+
+Sun Microsystems, Inc. is the initial license steward and
+may publish revised and/or new versions of this License
+from time to time. Each version will be given a
+distinguishing version number. Except as provided in
+Section 4.3, no one other than the license steward has the
+right to modify this License.
+
+4.2. Effect of New Versions.
+
+You may always continue to use, distribute or otherwise
+make the Covered Software available under the terms of the
+version of the License under which You originally received
+the Covered Software. If the Initial Developer includes a
+notice in the Original Software prohibiting it from being
+distributed or otherwise made available under any
+subsequent version of the License, You must distribute and
+make the Covered Software available under the terms of the
+version of the License under which You originally received
+the Covered Software. Otherwise, You may also choose to
+use, distribute or otherwise make the Covered Software
+available under the terms of any subsequent version of the
+License published by the license steward.
+
+4.3. Modified Versions.
+
+When You are an Initial Developer and You want to create a
+new license for Your Original Software, You may create and
+use a modified version of this License if You: (a) rename
+the license and remove any references to the name of the
+license steward (except to note that the license differs
+from this License); and (b) otherwise make it clear that
+the license contains terms which differ from this License.
+
+5. DISCLAIMER OF WARRANTY.
+
+COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS"
+BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
+INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED
+SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR
+PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND
+PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY
+COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE
+INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF
+ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF
+WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF
+ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS
+DISCLAIMER.
+
+6. TERMINATION.
+
+6.1. This License and the rights granted hereunder will
+terminate automatically if You fail to comply with terms
+herein and fail to cure such breach within 30 days of
+becoming aware of the breach. Provisions which, by their
+nature, must remain in effect beyond the termination of
+this License shall survive.
+
+6.2. If You assert a patent infringement claim (excluding
+declaratory judgment actions) against Initial Developer or
+a Contributor (the Initial Developer or Contributor against
+whom You assert such claim is referred to as "Participant")
+alleging that the Participant Software (meaning the
+Contributor Version where the Participant is a Contributor
+or the Original Software where the Participant is the
+Initial Developer) directly or indirectly infringes any
+patent, then any and all rights granted directly or
+indirectly to You by such Participant, the Initial
+Developer (if the Initial Developer is not the Participant)
+and all Contributors under Sections 2.1 and/or 2.2 of this
+License shall, upon 60 days notice from Participant
+terminate prospectively and automatically at the expiration
+of such 60 day notice period, unless if within such 60 day
+period You withdraw Your claim with respect to the
+Participant Software against such Participant either
+unilaterally or pursuant to a written agreement with
+Participant.
+
+6.3. In the event of termination under Sections 6.1 or 6.2
+above, all end user licenses that have been validly granted
+by You or any distributor hereunder prior to termination
+(excluding licenses granted to You by any distributor)
+shall survive termination.
+
+7. LIMITATION OF LIABILITY.
+
+UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
+(INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE
+INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF
+COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE
+LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR
+CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT
+LIMITATION, DAMAGES FOR LOST PROFITS, LOSS OF GOODWILL, WORK
+STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
+COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN
+INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
+LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL
+INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT
+APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO
+NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR
+CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT
+APPLY TO YOU.
+
+8. U.S. GOVERNMENT END USERS.
+
+The Covered Software is a "commercial item," as that term is
+defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial
+computer software" (as that term is defined at 48 C.F.R. ¤
+252.227-7014(a)(1)) and "commercial computer software
+documentation" as such terms are used in 48 C.F.R. 12.212 (Sept.
+1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1
+through 227.7202-4 (June 1995), all U.S. Government End Users
+acquire Covered Software with only those rights set forth herein.
+This U.S. Government Rights clause is in lieu of, and supersedes,
+any other FAR, DFAR, or other clause or provision that addresses
+Government rights in computer software under this License.
+
+9. MISCELLANEOUS.
+
+This License represents the complete agreement concerning subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the
+extent necessary to make it enforceable. This License shall be
+governed by the law of the jurisdiction specified in a notice
+contained within the Original Software (except to the extent
+applicable law, if any, provides otherwise), excluding such
+jurisdiction's conflict-of-law provisions. Any litigation
+relating to this License shall be subject to the jurisdiction of
+the courts located in the jurisdiction and venue specified in a
+notice contained within the Original Software, with the losing
+party responsible for costs, including, without limitation, court
+costs and reasonable attorneys' fees and expenses. The
+application of the United Nations Convention on Contracts for the
+International Sale of Goods is expressly excluded. Any law or
+regulation which provides that the language of a contract shall
+be construed against the drafter shall not apply to this License.
+You agree that You alone are responsible for compliance with the
+United States export administration regulations (and the export
+control laws and regulation of any other countries) when You use,
+distribute or otherwise make available any Covered Software.
+
+10. RESPONSIBILITY FOR CLAIMS.
+
+As between Initial Developer and the Contributors, each party is
+responsible for claims and damages arising, directly or
+indirectly, out of its utilization of rights under this License
+and You agree to work with Initial Developer and Contributors to
+distribute such responsibility on an equitable basis. Nothing
+herein is intended or shall be deemed to constitute any admission
+of liability.
diff --git a/packaging/nano/src/main/dist/about_files/cpl-10.txt b/packaging/nano/src/main/dist/about_files/cpl-10.txt
new file mode 100644
index 0000000..eb9ef5b
--- /dev/null
+++ b/packaging/nano/src/main/dist/about_files/cpl-10.txt
@@ -0,0 +1,92 @@
+Common Public License - v 1.0
+
+Updated 16 Apr 2009
+
+As of 25 Feb 2009, IBM has assigned the Agreement Steward role for the CPL to the Eclipse Foundation. Eclipse has designated the Eclipse Public License (EPL) as the follow-on version of the CPL.
+
+
+THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
+
+
+1. DEFINITIONS
+
+"Contribution" means:
+
+a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and
+b) in the case of each subsequent Contributor:
+i)	 changes to the Program, and
+ii)	 additions to the Program;
+where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.
+
+"Contributor" means any person or entity that distributes the Program.
+
+
+"Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.
+
+
+"Program" means the Contributions distributed in accordance with this Agreement.
+
+
+"Recipient" means anyone who receives the Program under this Agreement, including all Contributors.
+
+
+2. GRANT OF RIGHTS
+
+a)	Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.
+b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder.
+c)	Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program.
+d)	Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement.
+3. REQUIREMENTS
+
+A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:
+
+a)	it complies with the terms and conditions of this Agreement; and
+b)	its license agreement:
+i)	effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose;
+ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits;
+iii)	states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and
+iv)	states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange.
+When the Program is made available in source code form:
+
+a)	it must be made available under this Agreement; and
+b)	a copy of this Agreement must be included with each copy of the Program.
+
+Contributors may not remove or alter any copyright notices contained within the Program.
+
+
+Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution.
+
+
+4. COMMERCIAL DISTRIBUTION
+
+Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense.
+
+
+For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.
+
+
+5. NO WARRANTY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. 
+
+
+6. DISCLAIMER OF LIABILITY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+
+7. GENERAL
+
+If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
+
+
+If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed. In addition, if Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed.
+
+
+All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive. 
+
+
+Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. IBM is the initial Agreement Steward. IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved.
+
+
+This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation.
\ No newline at end of file
diff --git a/packaging/nano/src/main/dist/about_files/mpl-1.1.txt b/packaging/nano/src/main/dist/about_files/mpl-1.1.txt
new file mode 100644
index 0000000..06f9651
--- /dev/null
+++ b/packaging/nano/src/main/dist/about_files/mpl-1.1.txt
@@ -0,0 +1,469 @@
+                          MOZILLA PUBLIC LICENSE
+                                Version 1.1
+
+                              ---------------
+
+1. Definitions.
+
+     1.0.1. "Commercial Use" means distribution or otherwise making the
+     Covered Code available to a third party.
+
+     1.1. "Contributor" means each entity that creates or contributes to
+     the creation of Modifications.
+
+     1.2. "Contributor Version" means the combination of the Original
+     Code, prior Modifications used by a Contributor, and the Modifications
+     made by that particular Contributor.
+
+     1.3. "Covered Code" means the Original Code or Modifications or the
+     combination of the Original Code and Modifications, in each case
+     including portions thereof.
+
+     1.4. "Electronic Distribution Mechanism" means a mechanism generally
+     accepted in the software development community for the electronic
+     transfer of data.
+
+     1.5. "Executable" means Covered Code in any form other than Source
+     Code.
+
+     1.6. "Initial Developer" means the individual or entity identified
+     as the Initial Developer in the Source Code notice required by Exhibit
+     A.
+
+     1.7. "Larger Work" means a work which combines Covered Code or
+     portions thereof with code not governed by the terms of this License.
+
+     1.8. "License" means this document.
+
+     1.8.1. "Licensable" means having the right to grant, to the maximum
+     extent possible, whether at the time of the initial grant or
+     subsequently acquired, any and all of the rights conveyed herein.
+
+     1.9. "Modifications" means any addition to or deletion from the
+     substance or structure of either the Original Code or any previous
+     Modifications. When Covered Code is released as a series of files, a
+     Modification is:
+          A. Any addition to or deletion from the contents of a file
+          containing Original Code or previous Modifications.
+
+          B. Any new file that contains any part of the Original Code or
+          previous Modifications.
+
+     1.10. "Original Code" means Source Code of computer software code
+     which is described in the Source Code notice required by Exhibit A as
+     Original Code, and which, at the time of its release under this
+     License is not already Covered Code governed by this License.
+
+     1.10.1. "Patent Claims" means any patent claim(s), now owned or
+     hereafter acquired, including without limitation,  method, process,
+     and apparatus claims, in any patent Licensable by grantor.
+
+     1.11. "Source Code" means the preferred form of the Covered Code for
+     making modifications to it, including all modules it contains, plus
+     any associated interface definition files, scripts used to control
+     compilation and installation of an Executable, or source code
+     differential comparisons against either the Original Code or another
+     well known, available Covered Code of the Contributor's choice. The
+     Source Code can be in a compressed or archival form, provided the
+     appropriate decompression or de-archiving software is widely available
+     for no charge.
+
+     1.12. "You" (or "Your")  means an individual or a legal entity
+     exercising rights under, and complying with all of the terms of, this
+     License or a future version of this License issued under Section 6.1.
+     For legal entities, "You" includes any entity which controls, is
+     controlled by, or is under common control with You. For purposes of
+     this definition, "control" means (a) the power, direct or indirect,
+     to cause the direction or management of such entity, whether by
+     contract or otherwise, or (b) ownership of more than fifty percent
+     (50%) of the outstanding shares or beneficial ownership of such
+     entity.
+
+2. Source Code License.
+
+     2.1. The Initial Developer Grant.
+     The Initial Developer hereby grants You a world-wide, royalty-free,
+     non-exclusive license, subject to third party intellectual property
+     claims:
+          (a)  under intellectual property rights (other than patent or
+          trademark) Licensable by Initial Developer to use, reproduce,
+          modify, display, perform, sublicense and distribute the Original
+          Code (or portions thereof) with or without Modifications, and/or
+          as part of a Larger Work; and
+
+          (b) under Patents Claims infringed by the making, using or
+          selling of Original Code, to make, have made, use, practice,
+          sell, and offer for sale, and/or otherwise dispose of the
+          Original Code (or portions thereof).
+
+          (c) the licenses granted in this Section 2.1(a) and (b) are
+          effective on the date Initial Developer first distributes
+          Original Code under the terms of this License.
+
+          (d) Notwithstanding Section 2.1(b) above, no patent license is
+          granted: 1) for code that You delete from the Original Code; 2)
+          separate from the Original Code;  or 3) for infringements caused
+          by: i) the modification of the Original Code or ii) the
+          combination of the Original Code with other software or devices.
+
+     2.2. Contributor Grant.
+     Subject to third party intellectual property claims, each Contributor
+     hereby grants You a world-wide, royalty-free, non-exclusive license
+
+          (a)  under intellectual property rights (other than patent or
+          trademark) Licensable by Contributor, to use, reproduce, modify,
+          display, perform, sublicense and distribute the Modifications
+          created by such Contributor (or portions thereof) either on an
+          unmodified basis, with other Modifications, as Covered Code
+          and/or as part of a Larger Work; and
+
+          (b) under Patent Claims infringed by the making, using, or
+          selling of  Modifications made by that Contributor either alone
+          and/or in combination with its Contributor Version (or portions
+          of such combination), to make, use, sell, offer for sale, have
+          made, and/or otherwise dispose of: 1) Modifications made by that
+          Contributor (or portions thereof); and 2) the combination of
+          Modifications made by that Contributor with its Contributor
+          Version (or portions of such combination).
+
+          (c) the licenses granted in Sections 2.2(a) and 2.2(b) are
+          effective on the date Contributor first makes Commercial Use of
+          the Covered Code.
+
+          (d)    Notwithstanding Section 2.2(b) above, no patent license is
+          granted: 1) for any code that Contributor has deleted from the
+          Contributor Version; 2)  separate from the Contributor Version;
+          3)  for infringements caused by: i) third party modifications of
+          Contributor Version or ii)  the combination of Modifications made
+          by that Contributor with other software  (except as part of the
+          Contributor Version) or other devices; or 4) under Patent Claims
+          infringed by Covered Code in the absence of Modifications made by
+          that Contributor.
+
+3. Distribution Obligations.
+
+     3.1. Application of License.
+     The Modifications which You create or to which You contribute are
+     governed by the terms of this License, including without limitation
+     Section 2.2. The Source Code version of Covered Code may be
+     distributed only under the terms of this License or a future version
+     of this License released under Section 6.1, and You must include a
+     copy of this License with every copy of the Source Code You
+     distribute. You may not offer or impose any terms on any Source Code
+     version that alters or restricts the applicable version of this
+     License or the recipients' rights hereunder. However, You may include
+     an additional document offering the additional rights described in
+     Section 3.5.
+
+     3.2. Availability of Source Code.
+     Any Modification which You create or to which You contribute must be
+     made available in Source Code form under the terms of this License
+     either on the same media as an Executable version or via an accepted
+     Electronic Distribution Mechanism to anyone to whom you made an
+     Executable version available; and if made available via Electronic
+     Distribution Mechanism, must remain available for at least twelve (12)
+     months after the date it initially became available, or at least six
+     (6) months after a subsequent version of that particular Modification
+     has been made available to such recipients. You are responsible for
+     ensuring that the Source Code version remains available even if the
+     Electronic Distribution Mechanism is maintained by a third party.
+
+     3.3. Description of Modifications.
+     You must cause all Covered Code to which You contribute to contain a
+     file documenting the changes You made to create that Covered Code and
+     the date of any change. You must include a prominent statement that
+     the Modification is derived, directly or indirectly, from Original
+     Code provided by the Initial Developer and including the name of the
+     Initial Developer in (a) the Source Code, and (b) in any notice in an
+     Executable version or related documentation in which You describe the
+     origin or ownership of the Covered Code.
+
+     3.4. Intellectual Property Matters
+          (a) Third Party Claims.
+          If Contributor has knowledge that a license under a third party's
+          intellectual property rights is required to exercise the rights
+          granted by such Contributor under Sections 2.1 or 2.2,
+          Contributor must include a text file with the Source Code
+          distribution titled "LEGAL" which describes the claim and the
+          party making the claim in sufficient detail that a recipient will
+          know whom to contact. If Contributor obtains such knowledge after
+          the Modification is made available as described in Section 3.2,
+          Contributor shall promptly modify the LEGAL file in all copies
+          Contributor makes available thereafter and shall take other steps
+          (such as notifying appropriate mailing lists or newsgroups)
+          reasonably calculated to inform those who received the Covered
+          Code that new knowledge has been obtained.
+
+          (b) Contributor APIs.
+          If Contributor's Modifications include an application programming
+          interface and Contributor has knowledge of patent licenses which
+          are reasonably necessary to implement that API, Contributor must
+          also include this information in the LEGAL file.
+
+               (c)    Representations.
+          Contributor represents that, except as disclosed pursuant to
+          Section 3.4(a) above, Contributor believes that Contributor's
+          Modifications are Contributor's original creation(s) and/or
+          Contributor has sufficient rights to grant the rights conveyed by
+          this License.
+
+     3.5. Required Notices.
+     You must duplicate the notice in Exhibit A in each file of the Source
+     Code.  If it is not possible to put such notice in a particular Source
+     Code file due to its structure, then You must include such notice in a
+     location (such as a relevant directory) where a user would be likely
+     to look for such a notice.  If You created one or more Modification(s)
+     You may add your name as a Contributor to the notice described in
+     Exhibit A.  You must also duplicate this License in any documentation
+     for the Source Code where You describe recipients' rights or ownership
+     rights relating to Covered Code.  You may choose to offer, and to
+     charge a fee for, warranty, support, indemnity or liability
+     obligations to one or more recipients of Covered Code. However, You
+     may do so only on Your own behalf, and not on behalf of the Initial
+     Developer or any Contributor. You must make it absolutely clear than
+     any such warranty, support, indemnity or liability obligation is
+     offered by You alone, and You hereby agree to indemnify the Initial
+     Developer and every Contributor for any liability incurred by the
+     Initial Developer or such Contributor as a result of warranty,
+     support, indemnity or liability terms You offer.
+
+     3.6. Distribution of Executable Versions.
+     You may distribute Covered Code in Executable form only if the
+     requirements of Section 3.1-3.5 have been met for that Covered Code,
+     and if You include a notice stating that the Source Code version of
+     the Covered Code is available under the terms of this License,
+     including a description of how and where You have fulfilled the
+     obligations of Section 3.2. The notice must be conspicuously included
+     in any notice in an Executable version, related documentation or
+     collateral in which You describe recipients' rights relating to the
+     Covered Code. You may distribute the Executable version of Covered
+     Code or ownership rights under a license of Your choice, which may
+     contain terms different from this License, provided that You are in
+     compliance with the terms of this License and that the license for the
+     Executable version does not attempt to limit or alter the recipient's
+     rights in the Source Code version from the rights set forth in this
+     License. If You distribute the Executable version under a different
+     license You must make it absolutely clear that any terms which differ
+     from this License are offered by You alone, not by the Initial
+     Developer or any Contributor. You hereby agree to indemnify the
+     Initial Developer and every Contributor for any liability incurred by
+     the Initial Developer or such Contributor as a result of any such
+     terms You offer.
+
+     3.7. Larger Works.
+     You may create a Larger Work by combining Covered Code with other code
+     not governed by the terms of this License and distribute the Larger
+     Work as a single product. In such a case, You must make sure the
+     requirements of this License are fulfilled for the Covered Code.
+
+4. Inability to Comply Due to Statute or Regulation.
+
+     If it is impossible for You to comply with any of the terms of this
+     License with respect to some or all of the Covered Code due to
+     statute, judicial order, or regulation then You must: (a) comply with
+     the terms of this License to the maximum extent possible; and (b)
+     describe the limitations and the code they affect. Such description
+     must be included in the LEGAL file described in Section 3.4 and must
+     be included with all distributions of the Source Code. Except to the
+     extent prohibited by statute or regulation, such description must be
+     sufficiently detailed for a recipient of ordinary skill to be able to
+     understand it.
+
+5. Application of this License.
+
+     This License applies to code to which the Initial Developer has
+     attached the notice in Exhibit A and to related Covered Code.
+
+6. Versions of the License.
+
+     6.1. New Versions.
+     Netscape Communications Corporation ("Netscape") may publish revised
+     and/or new versions of the License from time to time. Each version
+     will be given a distinguishing version number.
+
+     6.2. Effect of New Versions.
+     Once Covered Code has been published under a particular version of the
+     License, You may always continue to use it under the terms of that
+     version. You may also choose to use such Covered Code under the terms
+     of any subsequent version of the License published by Netscape. No one
+     other than Netscape has the right to modify the terms applicable to
+     Covered Code created under this License.
+
+     6.3. Derivative Works.
+     If You create or use a modified version of this License (which you may
+     only do in order to apply it to code which is not already Covered Code
+     governed by this License), You must (a) rename Your license so that
+     the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape",
+     "MPL", "NPL" or any confusingly similar phrase do not appear in your
+     license (except to note that your license differs from this License)
+     and (b) otherwise make it clear that Your version of the license
+     contains terms which differ from the Mozilla Public License and
+     Netscape Public License. (Filling in the name of the Initial
+     Developer, Original Code or Contributor in the notice described in
+     Exhibit A shall not of themselves be deemed to be modifications of
+     this License.)
+
+7. DISCLAIMER OF WARRANTY.
+
+     COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS,
+     WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+     WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF
+     DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING.
+     THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE
+     IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT,
+     YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE
+     COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER
+     OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF
+     ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
+
+8. TERMINATION.
+
+     8.1.  This License and the rights granted hereunder will terminate
+     automatically if You fail to comply with terms herein and fail to cure
+     such breach within 30 days of becoming aware of the breach. All
+     sublicenses to the Covered Code which are properly granted shall
+     survive any termination of this License. Provisions which, by their
+     nature, must remain in effect beyond the termination of this License
+     shall survive.
+
+     8.2.  If You initiate litigation by asserting a patent infringement
+     claim (excluding declatory judgment actions) against Initial Developer
+     or a Contributor (the Initial Developer or Contributor against whom
+     You file such action is referred to as "Participant")  alleging that:
+
+     (a)  such Participant's Contributor Version directly or indirectly
+     infringes any patent, then any and all rights granted by such
+     Participant to You under Sections 2.1 and/or 2.2 of this License
+     shall, upon 60 days notice from Participant terminate prospectively,
+     unless if within 60 days after receipt of notice You either: (i)
+     agree in writing to pay Participant a mutually agreeable reasonable
+     royalty for Your past and future use of Modifications made by such
+     Participant, or (ii) withdraw Your litigation claim with respect to
+     the Contributor Version against such Participant.  If within 60 days
+     of notice, a reasonable royalty and payment arrangement are not
+     mutually agreed upon in writing by the parties or the litigation claim
+     is not withdrawn, the rights granted by Participant to You under
+     Sections 2.1 and/or 2.2 automatically terminate at the expiration of
+     the 60 day notice period specified above.
+
+     (b)  any software, hardware, or device, other than such Participant's
+     Contributor Version, directly or indirectly infringes any patent, then
+     any rights granted to You by such Participant under Sections 2.1(b)
+     and 2.2(b) are revoked effective as of the date You first made, used,
+     sold, distributed, or had made, Modifications made by that
+     Participant.
+
+     8.3.  If You assert a patent infringement claim against Participant
+     alleging that such Participant's Contributor Version directly or
+     indirectly infringes any patent where such claim is resolved (such as
+     by license or settlement) prior to the initiation of patent
+     infringement litigation, then the reasonable value of the licenses
+     granted by such Participant under Sections 2.1 or 2.2 shall be taken
+     into account in determining the amount or value of any payment or
+     license.
+
+     8.4.  In the event of termination under Sections 8.1 or 8.2 above,
+     all end user license agreements (excluding distributors and resellers)
+     which have been validly granted by You or any distributor hereunder
+     prior to termination shall survive termination.
+
+9. LIMITATION OF LIABILITY.
+
+     UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
+     (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL
+     DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE,
+     OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR
+     ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY
+     CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL,
+     WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
+     COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN
+     INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
+     LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY
+     RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW
+     PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE
+     EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO
+     THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
+
+10. U.S. GOVERNMENT END USERS.
+
+     The Covered Code is a "commercial item," as that term is defined in
+     48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer
+     software" and "commercial computer software documentation," as such
+     terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48
+     C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995),
+     all U.S. Government End Users acquire Covered Code with only those
+     rights set forth herein.
+
+11. MISCELLANEOUS.
+
+     This License represents the complete agreement concerning subject
+     matter hereof. If any provision of this License is held to be
+     unenforceable, such provision shall be reformed only to the extent
+     necessary to make it enforceable. This License shall be governed by
+     California law provisions (except to the extent applicable law, if
+     any, provides otherwise), excluding its conflict-of-law provisions.
+     With respect to disputes in which at least one party is a citizen of,
+     or an entity chartered or registered to do business in the United
+     States of America, any litigation relating to this License shall be
+     subject to the jurisdiction of the Federal Courts of the Northern
+     District of California, with venue lying in Santa Clara County,
+     California, with the losing party responsible for costs, including
+     without limitation, court costs and reasonable attorneys' fees and
+     expenses. The application of the United Nations Convention on
+     Contracts for the International Sale of Goods is expressly excluded.
+     Any law or regulation which provides that the language of a contract
+     shall be construed against the drafter shall not apply to this
+     License.
+
+12. RESPONSIBILITY FOR CLAIMS.
+
+     As between Initial Developer and the Contributors, each party is
+     responsible for claims and damages arising, directly or indirectly,
+     out of its utilization of rights under this License and You agree to
+     work with Initial Developer and Contributors to distribute such
+     responsibility on an equitable basis. Nothing herein is intended or
+     shall be deemed to constitute any admission of liability.
+
+13. MULTIPLE-LICENSED CODE.
+
+     Initial Developer may designate portions of the Covered Code as
+     "Multiple-Licensed".  "Multiple-Licensed" means that the Initial
+     Developer permits you to utilize portions of the Covered Code under
+     Your choice of the NPL or the alternative licenses, if any, specified
+     by the Initial Developer in the file described in Exhibit A.
+
+EXHIBIT A -Mozilla Public License.
+
+     ``The contents of this file are subject to the Mozilla Public License
+     Version 1.1 (the "License"); you may not use this file except in
+     compliance with the License. You may obtain a copy of the License at
+     http://www.mozilla.org/MPL/
+
+     Software distributed under the License is distributed on an "AS IS"
+     basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+     License for the specific language governing rights and limitations
+     under the License.
+
+     The Original Code is ______________________________________.
+
+     The Initial Developer of the Original Code is ________________________.
+     Portions created by ______________________ are Copyright (C) ______
+     _______________________. All Rights Reserved.
+
+     Contributor(s): ______________________________________.
+
+     Alternatively, the contents of this file may be used under the terms
+     of the _____ license (the  "[___] License"), in which case the
+     provisions of [______] License are applicable instead of those
+     above.  If you wish to allow use of your version of this file only
+     under the terms of the [____] License and not to allow others to use
+     your version of this file under the MPL, indicate your decision by
+     deleting  the provisions above and replace  them with the notice and
+     other provisions required by the [___] License.  If you do not delete
+     the provisions above, a recipient may use your version of this file
+     under either the MPL or the [___] License."
+
+     [NOTE: The text of this Exhibit A may differ slightly from the text of
+     the notices in the Source Code files of the Original Code. You should
+     use the text of this Exhibit A rather than the text found in the
+     Original Code Source Code for Your Modifications.]
diff --git a/packaging/nano/src/main/dist/about_files/new-bsd.txt b/packaging/nano/src/main/dist/about_files/new-bsd.txt
new file mode 100644
index 0000000..1d256c2
--- /dev/null
+++ b/packaging/nano/src/main/dist/about_files/new-bsd.txt
@@ -0,0 +1,19 @@
+BSD-style License
+Redistribution and use in source and binary forms, with or without modification, 
+are permitted provided that the following conditions are met:
+Redistributions of source code must retain the above copyright notice, 
+this list of conditions and the following disclaimer.
+Redistributions in binary form must reproduce the above copyright notice, 
+this list of conditions and the following disclaimer in the documentation 
+and/or other materials provided with the distribution.
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 
+PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, 
+OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 
+STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
+POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
diff --git a/packaging/nano/src/main/dist/about_files/slf4j.txt b/packaging/nano/src/main/dist/about_files/slf4j.txt
new file mode 100644
index 0000000..371607c
--- /dev/null
+++ b/packaging/nano/src/main/dist/about_files/slf4j.txt
@@ -0,0 +1,20 @@
+Copyright (c) 2004-2008 QOS.ch
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/packaging/nano/src/main/dist/bin/checkJava.bat b/packaging/nano/src/main/dist/bin/checkJava.bat
new file mode 100644
index 0000000..8df7848
--- /dev/null
+++ b/packaging/nano/src/main/dist/bin/checkJava.bat
@@ -0,0 +1,17 @@
+@echo off
+rem Script for checking we have the right version of Java.
+
+if "%JAVA_HOME%" == "" (
+  echo The JAVA_HOME environment variable is not defined.
+  exit /B 1
+)
+if "%CLASSPATH%" == "" (
+  echo The CLASSPATH environment variable is not defined.
+  exit /B 1
+)
+
+rem Run java version check with the discovered java jvm.
+"%JAVA_HOME%\bin\java" -classpath "%CLASSPATH%" org.eclipse.virgo.util.env.JavaVersionChecker
+
+rem If non-zero exit then either we cannot find the checker or the Java version is incorrect.
+if not "%ERRORLEVEL%"=="0" exit /B %ERRORLEVEL%
diff --git a/packaging/nano/src/main/dist/bin/dmk.bat b/packaging/nano/src/main/dist/bin/dmk.bat
new file mode 100644
index 0000000..d35aca1
--- /dev/null
+++ b/packaging/nano/src/main/dist/bin/dmk.bat
@@ -0,0 +1,286 @@
+@echo off
+rem Script for starting and stopping the kernel
+
+if "%OS%" == "Windows_NT" setlocal
+
+rem Derive full path for script (includes trailing backslash)
+  set SCRIPT_DIR=%~dp0
+
+if exist "%SCRIPT_DIR%setupVars.bat" (
+  call "%SCRIPT_DIR%setupVars.bat"
+  if not "%ERRORLEVEL%"=="0" (
+    if "%OS%" == "Windows_NT" endlocal
+    exit /B %ERRORLEVEL%
+  )
+) else (
+  echo Cannot set up environment. "setupVars.bat" file missing.
+  if "%OS%" == "Windows_NT" endlocal
+  exit /B 1
+)
+
+rem Select command we are to run
+
+  rem First parm is command
+    set COMMAND=%~1
+    rem Rest are parameters - shift done in subroutines
+   
+  rem Switch on COMMAND in {"start","stop"}
+
+    if "%COMMAND%" == "start" (
+      call :doStartCommand %*
+      if "%OS%" == "Windows_NT" endlocal
+      exit /B 0
+    )
+
+    if "%COMMAND%" == "stop"  (
+      call :doStopCommand  %*
+      if "%OS%" == "Windows_NT" endlocal
+      exit /B 0
+    )
+
+    echo Unknown command: %COMMAND%
+    if "%OS%" == "Windows_NT" endlocal
+    exit /B 1
+
+rem ------------------ Subroutines
+rem ------------------------------
+:doStartCommand
+
+  shift
+  rem The shift must be here :()
+
+  rem Check further file that needs to exist
+  for %%I in ("%KERNEL_HOME%\bin\jmxPermissions.vbs") do if not exist "%%~I" (
+    echo File "%%~I" does not exist but is required to continue.
+    exit /B 1
+  )
+
+  rem Set defaults
+    set CONFIG_DIR=%KERNEL_HOME%\configuration
+    set CLEAN_FLAG=
+    set NO_START_FLAG=
+    set DEBUG_FLAG=
+    set DEBUG_PORT=8000
+    set SUSPEND=n
+    if not defined JMX_PORT set JMX_PORT=9875
+    if not defined KEYSTORE_PASSWORD set KEYSTORE_PASSWORD=changeit
+    set ADDITIONAL_ARGS=
+
+  rem Loop through options
+
+  :startOptionLoop
+  if "%~1"=="" goto endStartOptionLoop
+  if "%~1"=="-debug"             goto debug
+  if "%~1"=="-clean"             goto clean
+  if "%~1"=="-configDir"         goto configDir
+  if "%~1"=="-jmxport"           goto jmxport
+  if "%~1"=="-keystore"          goto keystore
+  if "%~1"=="-keystorePassword"  goto keystorePassword
+  if "%~1"=="-noStart"           goto noStart
+  if "%~1"=="-suspend"           goto suspend
+  if "%~1"=="-shell"             goto shell
+
+  set ADDITIONAL_ARGS=%ADDITIONAL_ARGS% "%~1"
+
+  :continueStartOptionLoop
+    shift
+    goto startOptionLoop
+
+  :debug
+    set DEBUG_FLAG=1
+    set PORT_CANDIDATE=%~2
+    if not "%PORT_CANDIDATE:~0,1%"=="-" (
+      set DEBUG_PORT=%PORT_CANDIDATE%
+      shift
+    )
+    goto continueStartOptionLoop
+  :clean
+    set CLEAN_FLAG=1
+    goto continueStartOptionLoop
+  :configDir
+    set CONFIG_DIR=%~2
+    rem unless absolute, treat as relative to kernel home
+    if "%CONFIG_DIR:~1%"=="\" goto absoluteConfigDir
+    if "%CONFIG_DIR:~1,2%"==":\" goto absoluteConfigDir
+    set CONFIG_DIR=%KERNEL_HOME%\%CONFIG_DIR%
+  :absoluteConfigDir
+    shift
+    goto continueStartOptionLoop
+  :jmxport
+    set JMX_PORT=%~2
+    shift
+    goto continueStartOptionLoop
+  :keystore
+    set KEYSTORE_PATH=%~2
+    shift
+    goto continueStartOptionLoop
+  :keystorePassword
+    set KEYSTORE_PASSWORD=%~2
+    shift
+    goto continueStartOptionLoop
+  :noStart
+    set NO_START_FLAG=1
+    goto continueStartOptionLoop
+  :suspend
+    set SUSPEND=y
+    goto continueStartOptionLoop
+  :shell
+    set SHELL_FLAG=1
+    goto continueStartOptionLoop
+
+  :endStartOptionLoop
+
+  
+  rem Adjust permissions if necessary
+    cscript //NoLogo "%KERNEL_HOME%\bin\jmxPermissions.vbs" "%CONFIG_DIR%\"
+
+  rem Adjust options now all are known
+    if "%KEYSTORE_PATH%"=="" set KEYSTORE_PATH=%CONFIG_DIR%\keystore
+    if not "%DEBUG_FLAG%"=="" set DEBUG_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,address=%DEBUG_PORT%,server=y,suspend=%SUSPEND%
+
+  rem do Clean work:
+    if not "%CLEAN_FLAG%"=="" (
+      echo Cleaning the serviceability and working directories...
+      rmdir /Q /S "%KERNEL_HOME%\serviceability" 2>nul
+      rmdir /Q /S "%KERNEL_HOME%\work" 2>nul
+      
+      set LAUNCH_OPTS=%LAUNCH_OPTS% -clean
+    )
+
+  rem do Shell work:
+    if not "%SHELL_FLAG%"=="" ( 
+      echo "Warning: Kernel shell not supported; -shell option ignored."
+      rem set LAUNCH_OPTS=%LAUNCH_OPTS% -Forg.eclipse.virgo.kernel.shell.local=true
+    )
+
+  rem Set JMX options
+    set JMX_OPTS=%JMX_OPTS% -Dcom.sun.management.jmxremote.port=%JMX_PORT% 
+    set JMX_OPTS=%JMX_OPTS% -Dcom.sun.management.jmxremote.authenticate=true 
+    set JMX_OPTS=%JMX_OPTS% -Dcom.sun.management.jmxremote.login.config=virgo-kernel 
+    set JMX_OPTS=%JMX_OPTS% -Dcom.sun.management.jmxremote.access.file="%CONFIG_DIR%\org.eclipse.virgo.kernel.jmxremote.access.properties" 
+    set JMX_OPTS=%JMX_OPTS% -Djavax.net.ssl.keyStore="%KEYSTORE_PATH%" 
+    set JMX_OPTS=%JMX_OPTS% -Djavax.net.ssl.keyStorePassword=%KEYSTORE_PASSWORD% 
+    set JMX_OPTS=%JMX_OPTS% -Dcom.sun.management.jmxremote.ssl=true 
+    set JMX_OPTS=%JMX_OPTS% -Dcom.sun.management.jmxremote.ssl.need.client.auth=false
+
+    if not "%NO_START_FLAG%"=="" goto :eof
+    rem ensure that the tmp directory exists:
+      set TMP_DIR="%KERNEL_HOME%\work\tmp"
+      if not exist "%TMP_DIR%" mkdir "%TMP_DIR%"
+
+       set JAVA_OPTS=-Xmx1024m -XX:MaxPermSize=512m %JAVA_OPTS%
+    rem Run the server
+  
+      rem Marshall parameters
+      set KERNEL_JAVA_PARMS=%JAVA_OPTS% %DEBUG_OPTS% %JMX_OPTS%
+
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -XX:+HeapDumpOnOutOfMemoryError 
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -XX:ErrorFile="%KERNEL_HOME%\serviceability\error.log" 
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -XX:HeapDumpPath="%KERNEL_HOME%\serviceability\heap_dump.hprof"
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Djava.security.auth.login.config="%CONFIG_DIR%\org.eclipse.virgo.kernel.authentication.config" 
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dorg.eclipse.virgo.kernel.authentication.file="%CONFIG_DIR%\org.eclipse.virgo.kernel.users.properties" 
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Djava.io.tmpdir="%TMP_DIR%" 
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dorg.eclipse.virgo.kernel.home="%KERNEL_HOME%" 
+	  set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dosgi.java.profile="file:%CONFIG_DIR%\java-server.profile"
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dssh.server.keystore="%CONFIG_DIR%/hostkey.ser"
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dorg.eclipse.virgo.kernel.config="%CONFIG_DIR%"
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dosgi.sharedConfiguration.area="%CONFIG_DIR%"
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Declipse.ignoreApp="true" 
+	  set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dosgi.install.area="%KERNEL_HOME%"
+	  set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dosgi.configuration.area="%KERNEL_HOME%\work" 
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dosgi.frameworkClassPath="%FWCLASSPATH%"
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Djava.endorsed.dirs="%KERNEL_HOME%\lib\endorsed"
+      
+      rem If Windows 10 set system property os.name=win32, see https://bugs.eclipse.org/bugs/show_bug.cgi?id=486353	
+	  for /f "tokens=4 delims=] " %%i in ('ver') do set VIRGO_DETECTED_WIN_VERSION=%%i 
+      if "%VIRGO_DETECTED_WIN_VERSION:~0,1%"=="1" set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dos.name=win32
+        
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -classpath "%CLASSPATH%" 
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% org.eclipse.equinox.launcher.Main
+	  set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -noExit
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% %LAUNCH_OPTS%
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% %ADDITIONAL_ARGS%
+
+      rem Now run it
+        PUSHD %KERNEL_HOME%
+        "%JAVA_HOME%\bin\java" %KERNEL_JAVA_PARMS%
+        POPD
+
+goto :eof
+
+rem ------------------------------
+:doStopCommand
+  
+  shift
+  rem The shift must be here :()
+
+  rem Set defaults
+  set CONFIG_DIR=%KERNEL_HOME%\configuration
+  if not defined TRUSTSTORE_PATH set TRUSTSTORE_PATH=%CONFIG_DIR%\keystore
+  if not defined TRUSTSTORE_PASSWORD set TRUSTSTORE_PASSWORD=changeit
+  if not defined JMX_PORT set JMX_PORT=9875
+  set OTHER_ARGS=
+
+  rem Loop through options
+  :stopOptionLoop
+
+  if "%~1"=="" goto endStopOptionLoop  
+  if "%~1"=="-truststore" goto truststoreStop
+  if "%~1"=="-truststorePassword" goto truststorePasswordStop
+  if "%~1"=="-configDir" goto configDirStop 
+  if "%~1"=="-jmxport" goto jmxportStop
+  
+  set OTHER_ARGS=%OTHER_ARGS% "%~1"
+    
+  :continueStopOptionLoop
+  shift
+  goto stopOptionLoop
+
+  :truststoreStop
+  set TRUSTSTORE_PATH=%~2
+  shift
+  goto continueStopOptionLoop
+
+  :truststorePasswordStop
+  set TRUSTSTORE_PASSWORD=%~2
+  shift
+  goto continueStopOptionLoop
+
+  :configDirStop
+    set CONFIG_DIR=%~2
+    rem unless absolute, treat as relative to kernel home
+    if "%CONFIG_DIR:~1%"=="\" goto absoluteConfigDirStop
+    if "%CONFIG_DIR:~1,2%"==":\" goto absoluteConfigDirStop
+    set CONFIG_DIR=%KERNEL_HOME%\%CONFIG_DIR%
+  :absoluteConfigDirStop
+    shift
+    goto continueStopOptionLoop
+
+  :jmxportStop
+  set JMX_PORT=%~2
+  shift
+  goto continueStopOptionLoop
+
+  :endStopOptionLoop
+
+  rem Call shutdown client
+
+    rem Extend JMX options
+    set JMX_OPTS=%JMX_OPTS% -Djavax.net.ssl.trustStore="%TRUSTSTORE_PATH%"
+    set JMX_OPTS=%JMX_OPTS% -Djavax.net.ssl.trustStorePassword=%TRUSTSTORE_PASSWORD%
+    set OTHER_ARGS=%OTHER_ARGS% -jmxport %JMX_PORT%
+
+    rem Marshall parameters
+    set SHUTDOWN_PARMS= %JAVA_OPTS% %JMX_OPTS%
+    set SHUTDOWN_PARMS=%SHUTDOWN_PARMS% -classpath "%CLASSPATH%"
+    set SHUTDOWN_PARMS=%SHUTDOWN_PARMS% -Dorg.eclipse.virgo.kernel.home="%KERNEL_HOME%"
+    set SHUTDOWN_PARMS=%SHUTDOWN_PARMS% -Dorg.eclipse.virgo.kernel.authentication.file="%CONFIG_DIR%\org.eclipse.virgo.kernel.users.properties"
+    set SHUTDOWN_PARMS=%SHUTDOWN_PARMS% org.eclipse.virgo.nano.shutdown.ShutdownClient
+    set SHUTDOWN_PARMS=%SHUTDOWN_PARMS% %OTHER_ARGS%
+
+    rem Run Java program
+    PUSHD %KERNEL_HOME%
+    "%JAVA_HOME%\bin\java" %SHUTDOWN_PARMS%
+    POPD
+
+goto :eof
diff --git a/packaging/nano/src/main/dist/bin/jconsole.bat b/packaging/nano/src/main/dist/bin/jconsole.bat
new file mode 100644
index 0000000..4cbe553
--- /dev/null
+++ b/packaging/nano/src/main/dist/bin/jconsole.bat
@@ -0,0 +1,54 @@
+@echo off
+rem Script for starting jconsole
+
+if "%OS%" == "Windows_NT" setlocal
+
+rem Find root drive and path for current bat file directory (includes trailing backslash)
+  set SCRIPT_DIR=%~dp0
+
+if exist "%SCRIPT_DIR%setupVars.bat" (
+  call "%SCRIPT_DIR%setupVars.bat"
+  if not "%ERRORLEVEL%"=="0" (
+    if "%OS%" == "Windows_NT" endlocal
+    exit /B %ERRORLEVEL%
+  )
+) else (
+  echo Cannot set up environment. "setupVars.bat" file missing.
+  if "%OS%" == "Windows_NT" endlocal
+  exit /B 1
+)
+
+rem Set defaults
+  set TRUSTSTORE_PATH=%KERNEL_HOME%\configuration\keystore
+  set TRUSTSTORE_PASSWORD=changeit
+  set OTHER_ARGS=
+  
+:Loop
+  if "%~1"=="" goto EndLoop
+
+  if "%~1"=="-truststore" (
+    set TRUSTSTORE_PATH=%~2
+    shift
+    shift
+    goto Loop
+  ) 
+  if "%~1"=="-truststorePassword" (
+    set TRUSTSTORE_PASSWORD=%~2
+    shift
+    shift
+    goto Loop
+  )
+  rem Accumulate extra parameters.
+    set OTHER_ARGS=%OTHER_ARGS% "%~1"
+    shift
+  goto Loop
+:EndLoop
+
+set JMX_OPTS=%JMX_OPTS% -J-Dcom.sun.tools.jconsole.mbeans.keyPropertyList=category,type 
+set JMX_OPTS=%JMX_OPTS% -J-Djavax.net.ssl.trustStore="%TRUSTSTORE_PATH%" 
+set JMX_OPTS=%JMX_OPTS% -J-Djavax.net.ssl.trustStorePassword=%TRUSTSTORE_PASSWORD%
+
+"%JAVA_HOME%\bin\jconsole" %JMX_OPTS% %OTHER_ARGS%
+
+if "%OS%" == "Windows_NT" endlocal
+goto :eof
diff --git a/packaging/nano/src/main/dist/bin/jmxPermissions.vbs b/packaging/nano/src/main/dist/bin/jmxPermissions.vbs
new file mode 100644
index 0000000..0184607
--- /dev/null
+++ b/packaging/nano/src/main/dist/bin/jmxPermissions.vbs
@@ -0,0 +1,81 @@
+configFolder = Wscript.Arguments.Item(0)
+
+'WScript.Echo "Fixing permissions on " & configFolder
+
+Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2") 'Load up WMI with the right dll
+
+Dim files(0)
+files(0) = "org.eclipse.virgo.kernel.jmxremote.access.properties"
+
+For Each file In files
+	updateInheritance(configFolder & file)
+	updateOwnership(configFolder & file)
+	updatePermissions(configFolder & file)
+Next 
+
+Sub updateInheritance(file)
+	'WScript.Echo "Updating inheritance of " & file
+	
+	Const SE_DACL_PRESENT = 4
+	Const SE_DACL_PROTECTED = 4096
+	Const SE_SELF_RELATIVE = 32768
+
+	Set objFileSecSetting = objWMIService.Get("Win32_LogicalFileSecuritySetting.Path='" & file & "'")
+    objFileSecSetting.GetSecurityDescriptor objSecurityDescriptor
+
+	objSecurityDescriptor.ControlFlags = SE_DACL_PRESENT + SE_DACL_PROTECTED + SE_SELF_RELATIVE
+
+	Set objMethod = objFileSecSetting.Methods_("SetSecurityDescriptor")
+	Set objInParam = objMethod.inParameters.SpawnInstance_()
+	objInParam.Properties_.item("Descriptor") = objSecurityDescriptor
+	objFileSecSetting.ExecMethod_ "SetSecurityDescriptor", objInParam
+	
+	'WScript.Echo "Updated inheritance of " & file
+End Sub
+
+Sub updateOwnership(file)
+	'WScript.Echo "Updating ownership of " & file
+	Set objDataFile = objWMIService.Get("CIM_DataFile.Name='" & file & "'")
+
+	Set objMethod = objDataFile.Methods_("TakeOwnerShipEx")
+	Set objInParam = objMethod.inParameters.SpawnInstance_()
+
+	objDataFile.ExecMethod_ "TakeOwnerShipEx", objInParam
+
+	'WScript.Echo "Updated ownership of " & file
+End Sub
+
+Sub updatePermissions(file)	
+	'WScript.Echo "Updating permissions of " & file
+	
+	Set objFileSecSetting = objWMIService.Get("Win32_LogicalFileSecuritySetting.Path='" & file & "'")
+    objFileSecSetting.GetSecurityDescriptor objSecurityDescriptor
+
+	Set WshNetwork = WScript.CreateObject("WScript.Network")
+	
+	Dim foundAce
+	foundAce = "false"
+	
+	'Search for an ACE for the current user as there is no robust, portable way of creating such an ACE from scratch in VBScript.
+	Dim specificAce(0)
+	For Each ace in objSecurityDescriptor.DACL
+		If ace.Trustee.Name = WshNetwork.UserName Then
+			Set specificAce(0) = ace
+			foundAce = "true"
+		End If
+	Next
+	
+	If foundAce = "true" Then
+		objSecurityDescriptor.DACL = specificAce
+
+		Set objMethod = objFileSecSetting.Methods_("SetSecurityDescriptor")
+		Set objInParam = objMethod.inParameters.SpawnInstance_()
+		objInParam.Properties_.item("Descriptor") = objSecurityDescriptor
+		objFileSecSetting.ExecMethod_ "SetSecurityDescriptor", objInParam
+		
+		'WScript.Echo "Updated permissions of " & file
+	Else
+		WScript.Echo "WARNING: jmxPermissions.vbs did not update the permissions of " & file & ". Check the file has the correct permissions."
+	End If
+	
+End Sub
diff --git a/packaging/nano/src/main/dist/bin/setupClasspath.bat b/packaging/nano/src/main/dist/bin/setupClasspath.bat
new file mode 100644
index 0000000..30e157c
--- /dev/null
+++ b/packaging/nano/src/main/dist/bin/setupClasspath.bat
@@ -0,0 +1,31 @@
+@echo off
+rem Check JAVA_HOME and KERNEL_HOME variables
+if "%JAVA_HOME%" == "" (
+  echo The JAVA_HOME environment variable is not defined.
+  exit /B 1
+)
+if "%KERNEL_HOME%" == "" (
+  echo The KERNEL_HOME environment variable is not defined.
+  exit /B 1
+)
+
+rem Construct the CLASSPATH list from the Kernel lib directory.
+for %%G in ("%KERNEL_HOME%\lib\*.jar") do call :AppendToClasspath "%%G"
+for %%G in ("%KERNEL_HOME%\plugins\org.eclipse.osgi_*.jar") do call :AppendToClasspath "%%G"
+for %%G in ("%KERNEL_HOME%\plugins\org.eclipse.equinox.console.ssh_*.jar") do call :AppendToClasspath "%%G"
+
+rem Check if there are JAR files in the lib directory.
+if "%CLASSPATH%" == "" (
+  echo No JAR files found in %KERNEL_HOME%\lib
+  exit /B 1
+)
+
+rem Remove leading semi-colon if present
+if "%CLASSPATH:~0,1%"==";" set CLASSPATH=%CLASSPATH:~1%
+if "%FWCLASSPATH:~0,1%"=="," set FWCLASSPATH=%FWCLASSPATH:~1%
+exit /B 0
+
+:AppendToClasspath
+  set CLASSPATH=%CLASSPATH%;%~1
+  set FWCLASSPATH=%FWCLASSPATH%,file:///%~1
+  goto :eof
diff --git a/packaging/nano/src/main/dist/bin/setupVars.bat b/packaging/nano/src/main/dist/bin/setupVars.bat
new file mode 100644
index 0000000..a5d7772
--- /dev/null
+++ b/packaging/nano/src/main/dist/bin/setupVars.bat
@@ -0,0 +1,31 @@
+@echo off
+rem Set up env vars needed for dmk.bat and jconsole.bat (with user-pluggable mods if present)
+
+if "%SCRIPT_DIR%"=="" (
+  echo Called setupVars.bat out of context.
+  exit /B 1
+)
+
+rem Derive KERNEL_HOME full path from script's parent (no backslash)
+  for %%I in ("%SCRIPT_DIR%..") do set KERNEL_HOME=%%~fsI
+
+rem Check files exist (exit if not)
+  set ChkLst="%KERNEL_HOME%\bin\setupClasspath.bat","%KERNEL_HOME%\bin\checkJava.bat"
+
+  for %%I in (%ChkLst%) do if not exist "%%~I" (
+    echo File "%%~I" does not exist but is required.
+    exit /B 1
+  )
+
+rem set up the classpath (check result)
+  call "%KERNEL_HOME%\bin\setupClasspath.bat"
+  if not "%ERRORLEVEL%" == "0" exit /B %ERRORLEVEL%
+
+rem Run Java Version check (uses JAVA_HOME) (check result)
+  call "%KERNEL_HOME%\bin\checkJava.bat"
+  if not "%ERRORLEVEL%" == "0" exit /B %ERRORLEVEL%
+	
+rem Execute user setenv script if needed (ignore result)
+  if exist "%KERNEL_HOME%\bin\setenv.bat" call "%KERNEL_HOME%\bin\setenv.bat"
+
+goto :eof
diff --git a/packaging/nano/src/main/dist/bin/shutdown.bat b/packaging/nano/src/main/dist/bin/shutdown.bat
new file mode 100644
index 0000000..a2a1ff4
--- /dev/null
+++ b/packaging/nano/src/main/dist/bin/shutdown.bat
@@ -0,0 +1,8 @@
+@ECHO OFF
+IF "%OS%" == "Windows_NT" SETLOCAL
+
+SET SCRIPT_DIR=%~dp0%
+SET EXECUTABLE=dmk.bat
+
+call "%SCRIPT_DIR%%EXECUTABLE%" stop %*
+if not "%ERRORLEVEL%"=="0" exit /B %ERRORLEVEL%
diff --git a/packaging/nano/src/main/dist/bin/startup.bat b/packaging/nano/src/main/dist/bin/startup.bat
new file mode 100644
index 0000000..76e1618
--- /dev/null
+++ b/packaging/nano/src/main/dist/bin/startup.bat
@@ -0,0 +1,8 @@
+@ECHO OFF
+IF "%OS%" == "Windows_NT" SETLOCAL
+
+SET SCRIPT_DIR=%~dp0%
+SET EXECUTABLE=dmk.bat
+
+call "%SCRIPT_DIR%%EXECUTABLE%" start %*
+if not "%ERRORLEVEL%"=="0" exit /B %ERRORLEVEL%
diff --git a/packaging/nano/src/main/dist/configuration/etc/gosh_profile b/packaging/nano/src/main/dist/configuration/etc/gosh_profile
new file mode 100755
index 0000000..f0c9b5e
--- /dev/null
+++ b/packaging/nano/src/main/dist/configuration/etc/gosh_profile
@@ -0,0 +1,39 @@
+# default gosh_profile
+# only read if etc/gosh_profile doesn't exist relative to the System property
+# gosh.home or failing that the current directory.
+
+# catch all exceptions from this script to avoid it aborting startup
+try {
+
+  # ensure equinox commands are found first
+  SCOPE = equinox:*
+
+  # add methods on BundleContext object as commands
+  #addcommand context ${.context} (${.context} class)
+  # bug: above invokes (String, Object, String) instead of (String, Object, Class)
+  addcommand context ${.context}
+
+  # add methods on System object as commands
+  addcommand system (((${.context} bundles) 0) loadclass java.lang.System)
+
+  # alias to print full stack trace
+  e = { $exception printStackTrace }
+
+  ## disable console auto-formatting of each result
+  #  you will then need to explicitly use the 'format' command
+  #  to print the result of commands that don't write to stdout.
+  #.Gogo.format = false
+
+  ## disable printing the formatted result of a command into pipelines
+  #.Format.Pipe = false
+
+  # set prompt
+  prompt = 'osgi> '
+
+  # print welcome message
+  # cat ($0 resolve motd)
+} {
+    echo "$0: ERROR: $exception"
+}
+
+# end
diff --git a/packaging/nano/src/main/dist/configuration/java-server.profile b/packaging/nano/src/main/dist/configuration/java-server.profile
new file mode 100644
index 0000000..8d5c5a6
--- /dev/null
+++ b/packaging/nano/src/main/dist/configuration/java-server.profile
@@ -0,0 +1,227 @@
+org.osgi.framework.system.packages = \
+ javax.accessibility,\
+ javax.activation,\
+ javax.activation;version="1.1.1",\
+ javax.activity,\
+ javax.annotation,\
+ javax.annotation;version="1.0.0",\
+ javax.annotation;version="1.1.0",\
+ 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;version="2.0",\
+ javax.jws.soap,\
+ javax.jws.soap;version="2.0",\
+ 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.script;version="1.1",\
+ 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.nimbus,\
+ 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;version="1.0.1",\
+ javax.transaction;version="1.1.0",\
+ javax.transaction.xa,\
+ javax.transaction.xa;version="1.0.1",\
+ javax.transaction.xa;version="1.1.0",\
+ javax.xml,\
+ javax.xml;version="1.0.1",\
+ javax.xml.bind,\
+ javax.xml.bind;version="2.0",\
+ javax.xml.bind.annotation,\
+ javax.xml.bind.annotation;version="2.0",\
+ javax.xml.bind.annotation.adapters,\
+ javax.xml.bind.annotation.adapters;version="2.0",\
+ javax.xml.bind.attachment,\
+ javax.xml.bind.attachment;version="2.0",\
+ javax.xml.bind.helpers,\
+ javax.xml.bind.helpers;version="2.0",\
+ javax.xml.bind.util,\
+ javax.xml.bind.util;version="2.0",\
+ javax.xml.crypto,\
+ javax.xml.crypto;version="1.0",\
+ javax.xml.crypto.dom,\
+ javax.xml.crypto.dom;version="1.0",\
+ javax.xml.crypto.dsig,\
+ javax.xml.crypto.dsig;version="1.0",\
+ javax.xml.crypto.dsig.dom,\
+ javax.xml.crypto.dsig.dom;version="1.0",\
+ javax.xml.crypto.dsig.keyinfo,\
+ javax.xml.crypto.dsig.keyinfo;version="1.0",\
+ javax.xml.crypto.dsig.spec,\
+ javax.xml.crypto.dsig.spec;version="1.0",\
+ javax.xml.datatype,\
+ javax.xml.namespace,\
+ javax.xml.parsers,\
+ javax.xml.soap,\
+ javax.xml.soap;version="1.3.0",\
+ javax.xml.stream,\
+ javax.xml.stream;version="1.0.1",\
+ javax.xml.stream.events,\
+ javax.xml.stream.events;version="1.0.1",\
+ javax.xml.stream.util,\
+ javax.xml.stream.util;version="1.0.1",\
+ 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;version="2.1.1",\
+ javax.xml.ws.handler,\
+ javax.xml.ws.handler;version="2.1.1",\
+ javax.xml.ws.handler.soap,\
+ javax.xml.ws.handler.soap;version="2.1.1",\
+ javax.xml.ws.http,\
+ javax.xml.ws.http;version="2.1.1",\
+ javax.xml.ws.soap,\
+ javax.xml.ws.soap;version="2.1.1",\
+ javax.xml.ws.spi,\
+ javax.xml.ws.spi;version="2.1.1",\
+ javax.xml.ws.spi.http,\
+ javax.xml.ws.spi.http;version="2.1.1",\
+ javax.xml.ws.wsaddressing,\
+ javax.xml.ws.wsaddressing;version="2.1.1",\
+ javax.xml.xpath,\
+ org.eclipse.virgo.kernel.equinox.extensions,\
+ org.eclipse.virgo.kernel.equinox.extensions;version="3.7.0",\
+ org.eclipse.virgo.kernel.equinox.extensions.hooks,\
+ org.eclipse.virgo.kernel.equinox.extensions.hooks;version="3.7.0",\
+ 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.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
+org.osgi.framework.bootdelegation = \
+ org.eclipse.virgo.nano.authentication,\
+ javax.*,\
+ javax.xml.*,\
+ org.apache.xerces.jaxp.*,\
+ org.ietf.jgss,\
+ org.omg.*,\
+ org.w3c.*,\
+ org.xml.*,\
+ sun.*,\
+ com.sun.*
+org.osgi.framework.executionenvironment = \
+ OSGi/Minimum-1.0,\
+ OSGi/Minimum-1.1,\
+ OSGi/Minimum-1.2,\
+ JRE-1.1,\
+ J2SE-1.2,\
+ J2SE-1.3,\
+ J2SE-1.4,\
+ J2SE-1.5,\
+ JavaSE-1.6,\
+ JavaSE-1.7
+org.osgi.framework.system.capabilities = \
+ osgi.ee; osgi.ee="OSGi/Minimum"; version:List<Version>="1.0, 1.1, 1.2",\
+ osgi.ee; osgi.ee="JRE"; version:List<Version>="1.0, 1.1",\
+ osgi.ee; osgi.ee="JavaSE"; version:List<Version>="1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7"
+osgi.java.profile.name = Virgo-Java7
diff --git a/packaging/nano/src/main/dist/configuration/keystore b/packaging/nano/src/main/dist/configuration/keystore
new file mode 100644
index 0000000..9684caa
--- /dev/null
+++ b/packaging/nano/src/main/dist/configuration/keystore
Binary files differ
diff --git a/packaging/nano/src/main/dist/configuration/org.eclipse.virgo.kernel.authentication.config b/packaging/nano/src/main/dist/configuration/org.eclipse.virgo.kernel.authentication.config
new file mode 100644
index 0000000..44c5d21
--- /dev/null
+++ b/packaging/nano/src/main/dist/configuration/org.eclipse.virgo.kernel.authentication.config
@@ -0,0 +1,6 @@
+virgo-kernel {
+	org.eclipse.virgo.nano.authentication.KernelLoginModule REQUIRED;
+};
+equinox_console {
+	org.eclipse.virgo.nano.authentication.KernelLoginModule REQUIRED;
+};
diff --git a/packaging/nano/src/main/dist/configuration/org.eclipse.virgo.kernel.jmxremote.access.properties b/packaging/nano/src/main/dist/configuration/org.eclipse.virgo.kernel.jmxremote.access.properties
new file mode 100644
index 0000000..ba89979
--- /dev/null
+++ b/packaging/nano/src/main/dist/configuration/org.eclipse.virgo.kernel.jmxremote.access.properties
@@ -0,0 +1 @@
+admin=readwrite
diff --git a/packaging/nano/src/main/dist/configuration/org.eclipse.virgo.kernel.properties b/packaging/nano/src/main/dist/configuration/org.eclipse.virgo.kernel.properties
new file mode 100644
index 0000000..c72631f
--- /dev/null
+++ b/packaging/nano/src/main/dist/configuration/org.eclipse.virgo.kernel.properties
@@ -0,0 +1,9 @@
+########################
+# Deployer Configuration
+########################
+# Note: use 0 to disable deployment timeouts
+deployer.timeout=300
+deployer.pickupDirectory=pickup
+deployer.scanIntervalMillis=1000
+deployer.unpackBundles=true
+
diff --git a/packaging/nano/src/main/dist/configuration/org.eclipse.virgo.kernel.users.properties b/packaging/nano/src/main/dist/configuration/org.eclipse.virgo.kernel.users.properties
new file mode 100644
index 0000000..7ab19e1
--- /dev/null
+++ b/packaging/nano/src/main/dist/configuration/org.eclipse.virgo.kernel.users.properties
@@ -0,0 +1,9 @@
+##################
+# User definitions
+##################
+user.admin=admin
+
+##################
+# Role definitions
+##################
+role.admin=admin
diff --git a/packaging/nano/src/main/dist/configuration/org.eclipse.virgo.medic.properties b/packaging/nano/src/main/dist/configuration/org.eclipse.virgo.medic.properties
new file mode 100644
index 0000000..5c5f1cf
--- /dev/null
+++ b/packaging/nano/src/main/dist/configuration/org.eclipse.virgo.medic.properties
@@ -0,0 +1,7 @@
+dump.root.directory=serviceability/dump
+log.wrapSysOut=true
+log.wrapSysErr=true
+log.dump.level=DEBUG
+log.dump.bufferSize=10000
+log.dump.pattern=[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-28.28thread %-64.64logger{64} %X{medic.eventCode} %msg %ex%n
+log.jul.consoleHandler=false
diff --git a/packaging/nano/src/main/dist/configuration/osgi.console.properties b/packaging/nano/src/main/dist/configuration/osgi.console.properties
new file mode 100644
index 0000000..5400fc1
--- /dev/null
+++ b/packaging/nano/src/main/dist/configuration/osgi.console.properties
@@ -0,0 +1,6 @@
+telnet.enabled=false
+telnet.port=2401
+telnet.host=localhost
+ssh.enabled=false
+ssh.port=2402
+ssh.host=localhost
\ No newline at end of file
diff --git a/packaging/nano/src/main/dist/configuration/serviceability.xml b/packaging/nano/src/main/dist/configuration/serviceability.xml
new file mode 100644
index 0000000..a0cad7e
--- /dev/null
+++ b/packaging/nano/src/main/dist/configuration/serviceability.xml
@@ -0,0 +1,81 @@
+<configuration>
+
+	<jmxConfigurator />
+
+	<contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"/>
+
+	<appender name="SIFTED_LOG_FILE" class="ch.qos.logback.classic.sift.SiftingAppender">
+		<discriminator>
+			<Key>applicationName</Key>
+			<DefaultValue>virgo-nano</DefaultValue>
+		</discriminator>
+		<sift>
+			<appender name="${applicationName}_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+				<file>serviceability/logs/${applicationName}/log.log</file>
+				<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+					<FileNamePattern>serviceability/logs/${applicationName}/log_%i.log</FileNamePattern>
+					<MinIndex>1</MinIndex>
+					<MaxIndex>4</MaxIndex>
+				</rollingPolicy>
+				<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+					<MaxFileSize>10MB</MaxFileSize>
+				</triggeringPolicy>
+				<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+					<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-5level %-28.28thread %-64.64logger{64} %X{medic.eventCode} %msg %ex%n</Pattern>
+				</encoder>
+			</appender>
+		</sift>
+	</appender>
+	
+	<appender name="LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<file>serviceability/logs/log.log</file>
+		<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+			<FileNamePattern>serviceability/logs/log_%i.log</FileNamePattern>
+			<MinIndex>1</MinIndex>
+			<MaxIndex>4</MaxIndex>
+		</rollingPolicy>
+		<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+			<MaxFileSize>10MB</MaxFileSize>
+		</triggeringPolicy>
+		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+			<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-5level %-28.28thread %-64.64logger{64} %X{medic.eventCode} %msg %ex%n</Pattern>
+		</encoder>
+	</appender>
+
+	<appender name="EVENT_LOG_STDOUT" class="org.eclipse.virgo.medic.log.logback.ReroutingAwareConsoleAppender">
+		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+			<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-28.28thread &lt;%X{medic.eventCode}&gt; %msg %ex%n</Pattern>
+		</encoder>
+	</appender>
+
+	<appender name="EVENT_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<file>serviceability/eventlogs/eventlog.log</file>
+		<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+			<FileNamePattern>serviceability/eventlogs/eventlog_%i.log</FileNamePattern>
+			<MinIndex>1</MinIndex>
+			<MaxIndex>4</MaxIndex>
+		</rollingPolicy>
+		<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+			<MaxFileSize>10MB</MaxFileSize>
+		</triggeringPolicy>
+		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+			<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-28.28thread &lt;%X{medic.eventCode}&gt; %msg %ex%n</Pattern>
+		</encoder>
+	</appender>
+
+	<logger level="INFO" additivity="false" name="org.eclipse.virgo.medic.eventlog.localized">
+		<appender-ref ref="EVENT_LOG_STDOUT" />
+		<appender-ref ref="EVENT_LOG_FILE" />
+	</logger>
+	
+	<logger level="INFO" additivity="false" name="org.eclipse.virgo.medic.eventlog.default">
+		<appender-ref ref="SIFTED_LOG_FILE" />
+		<appender-ref ref="LOG_FILE" />
+	</logger>
+
+	<root level="INFO">
+		<appender-ref ref="SIFTED_LOG_FILE" />
+		<appender-ref ref="LOG_FILE" />
+	</root>
+
+</configuration>
diff --git a/packaging/nano/src/main/dist/epl-v10.html b/packaging/nano/src/main/dist/epl-v10.html
new file mode 100644
index 0000000..eecc800
--- /dev/null
+++ b/packaging/nano/src/main/dist/epl-v10.html
@@ -0,0 +1,258 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!-- saved from url=(0049)http://www.eclipse.org/org/documents/epl-v10.html -->
+<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+
+<TITLE>Eclipse Public License - Version 1.0</TITLE>
+<STYLE type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </STYLE>
+
+</HEAD><BODY lang="EN-US">
+
+<H2>Eclipse Public License - v 1.0</H2>
+
+<P>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</P>
+
+<P><B>1. DEFINITIONS</B></P>
+
+<P>"Contribution" means:</P>
+
+<P class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</P>
+<P class="list">b) in the case of each subsequent Contributor:</P>
+<P class="list">i) changes to the Program, and</P>
+<P class="list">ii) additions to the Program;</P>
+<P class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</P>
+
+<P>"Contributor" means any person or entity that distributes
+the Program.</P>
+
+<P>"Licensed Patents" mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</P>
+
+<P>"Program" means the Contributions distributed in accordance
+with this Agreement.</P>
+
+<P>"Recipient" means anyone who receives the Program under
+this Agreement, including all Contributors.</P>
+
+<P><B>2. GRANT OF RIGHTS</B></P>
+
+<P class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</P>
+
+<P class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</P>
+
+<P class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</P>
+
+<P class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</P>
+
+<P><B>3. REQUIREMENTS</B></P>
+
+<P>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</P>
+
+<P class="list">a) it complies with the terms and conditions of this
+Agreement; and</P>
+
+<P class="list">b) its license agreement:</P>
+
+<P class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</P>
+
+<P class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</P>
+
+<P class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</P>
+
+<P class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</P>
+
+<P>When the Program is made available in source code form:</P>
+
+<P class="list">a) it must be made available under this Agreement; and</P>
+
+<P class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</P>
+
+<P>Contributors may not remove or alter any copyright notices contained
+within the Program.</P>
+
+<P>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</P>
+
+<P><B>4. COMMERCIAL DISTRIBUTION</B></P>
+
+<P>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+("Commercial Contributor") hereby agrees to defend and
+indemnify every other Contributor ("Indemnified Contributor")
+against any losses, damages and costs (collectively "Losses")
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</P>
+
+<P>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</P>
+
+<P><B>5. NO WARRANTY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</P>
+
+<P><B>6. DISCLAIMER OF LIABILITY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</P>
+
+<P><B>7. GENERAL</B></P>
+
+<P>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</P>
+
+<P>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</P>
+
+<P>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</P>
+
+<P>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</P>
+
+<P>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</P>
+
+
+
+
+</BODY></HTML>
\ No newline at end of file
diff --git a/packaging/nano/src/main/dist/notice.html b/packaging/nano/src/main/dist/notice.html
new file mode 100644
index 0000000..0ee73f4
--- /dev/null
+++ b/packaging/nano/src/main/dist/notice.html
@@ -0,0 +1,104 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<!-- saved from url=(0044)http://www.eclipse.org/legal/epl/notice.html -->
+<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+
+<TITLE>Eclipse Foundation Software User Agreement</TITLE>
+</HEAD><BODY lang="EN-US">
+<H2>Eclipse Foundation Software User Agreement</H2>
+<P>April 14, 2010</P>
+
+<H3>Usage Of Content</H3>
+
+<P>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+   (COLLECTIVELY "CONTENT").  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</P>
+
+<H3>Applicable Licenses</H3>
+
+<P>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+   ("EPL").  A copy of the EPL is provided with this Content and is also available at <A href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</A>.
+   For purposes of the EPL, "Program" will mean the Content.</P>
+
+<P>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
+   repository ("Repository") in software modules ("Modules") and made available as downloadable archives ("Downloads").</P>
+
+<UL>
+       <LI>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins ("Plug-ins"), plug-in fragments ("Fragments"), and features ("Features").</LI>
+       <LI>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java™ ARchive) in a directory named "plugins".</LI>
+       <LI>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named "features".  Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of the Plug-ins
+      and/or Fragments associated with that Feature.</LI>
+       <LI>Features may also include other Features ("Included Features"). Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of Included Features.</LI>
+</UL>
+
+<P>The terms and conditions governing Plug-ins and Fragments should be contained in files named "about.html" ("Abouts"). The terms and conditions governing Features and
+Included Features should be contained in files named "license.html" ("Feature Licenses").  Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</P>
+
+<UL>
+       <LI>The top-level (root) directory</LI>
+       <LI>Plug-in and Fragment directories</LI>
+       <LI>Inside Plug-ins and Fragments packaged as JARs</LI>
+       <LI>Sub-directories of the directory named "src" of certain Plug-ins</LI>
+       <LI>Feature directories</LI>
+</UL>
+
+<P>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license ("Feature Update License") during the
+installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them.  Feature Update Licenses may be found in the "license" property of files named "feature.properties" found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</P>
+
+<P>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</P>
+
+<UL>
+       <LI>Common Public License Version 1.0 (available at <A href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</A>)</LI>
+       <LI>Apache Software License 1.1 (available at <A href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</A>)</LI>
+       <LI>Apache Software License 2.0 (available at <A href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</A>)</LI>
+       <LI>Metro Link Public License 1.00 (available at <A href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</A>)</LI>
+       <LI>Mozilla Public License Version 1.1 (available at <A href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</A>)</LI>
+</UL>
+
+<P>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</P>
+
+
+<H3>Use of Provisioning Technology</H3>
+
+<P>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
+   Update Manager ("Provisioning Technology") for the purpose of allowing users to install software, documentation, information and/or
+   other materials (collectively "Installable Software"). This capability is provided with the intent of allowing such users to
+   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <A href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</A>
+   ("Specification").</P>
+
+<P>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
+   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
+   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
+   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</P>
+
+<OL>
+       <LI>A series of actions may occur ("Provisioning Process") in which a user may execute the Provisioning Technology
+       on a machine ("Target Machine") with the intent of installing, extending or updating the functionality of an Eclipse-based
+       product.</LI>
+       <LI>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
+       accessed and copied to the Target Machine.</LI>
+       <LI>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
+       Software ("Installable Software Agreement") and such Installable Software Agreement shall be accessed from the Target
+       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
+       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
+       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</LI>
+</OL>
+
+<H3>Cryptography</H3>
+
+<P>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+   possession, or use, and re-export of encryption software, to see if this is permitted.</P>
+
+<P><SMALL>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</SMALL></P>
+
+
+</BODY></HTML>
\ No newline at end of file
diff --git a/packaging/nano/src/main/filtered/bin/checkJava.sh b/packaging/nano/src/main/filtered/bin/checkJava.sh
new file mode 100755
index 0000000..a06ecd5
--- /dev/null
+++ b/packaging/nano/src/main/filtered/bin/checkJava.sh
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+#
+# make adjustment when running under cygwin
+#
+if $cygwin; then
+    CLASSPATH=$(cygpath -wp "$CLASSPATH")
+fi
+
+if [ -z "$JAVA_HOME" ]
+then
+  	JAVA_EXECUTABLE=java
+else
+  	JAVA_EXECUTABLE=$JAVA_HOME/bin/java
+fi
+
+# Run java version check with the discovered java jvm.
+$JAVA_EXECUTABLE \
+	-classpath "$CLASSPATH" \
+	org.eclipse.virgo.util.env.JavaVersionChecker
+
+# If non-zero exit then either we cannot find the check or the java version is incorrect.
+if [ $? != 0 ]
+then
+	exit 1
+fi
diff --git a/packaging/nano/src/main/filtered/bin/dmk.sh b/packaging/nano/src/main/filtered/bin/dmk.sh
new file mode 100755
index 0000000..aae69f2
--- /dev/null
+++ b/packaging/nano/src/main/filtered/bin/dmk.sh
@@ -0,0 +1,286 @@
+#!/bin/bash
+
+SCRIPT="$0"
+
+# SCRIPT may be an arbitrarily deep series of symlinks. Loop until we have the concrete path.
+while [ -h "$SCRIPT" ] ; do
+  ls=`ls -ld "$SCRIPT"`
+  # Drop everything prior to ->
+  link=`expr "$ls" : '.*-> \(.*\)$'`
+  if expr "$link" : '/.*' > /dev/null; then
+    SCRIPT="$link"
+  else
+    SCRIPT=`dirname "$SCRIPT"`/"$link"
+  fi
+done
+
+# determine kernel home
+KERNEL_HOME=`dirname "$SCRIPT"`/..
+
+# make KERNEL_HOME absolute
+KERNEL_HOME=`cd "$KERNEL_HOME"; pwd`
+
+# execute user setenv script if needed
+if [ -r "$KERNEL_HOME/bin/setenv.sh" ]
+then
+	. $KERNEL_HOME/bin/setenv.sh
+fi
+
+# setup classpath and java environment
+. "$KERNEL_HOME/bin/setupClasspath.sh"
+
+# Run java version check with the discovered java jvm.
+. "$KERNEL_HOME/bin/checkJava.sh"
+
+shopt -s extglob
+	
+# parse the command we executing
+COMMAND=$1
+shift;
+	
+if [ "$COMMAND" = "start" ]
+then
+	
+	# parse the standard arguments
+	CONFIG_DIR=$KERNEL_HOME/configuration
+	CLEAN_FLAG=
+	NO_START_FLAG=
+
+	SHELL_FLAG=
+	
+	DEBUG_FLAG=
+	DEBUG_PORT=8000
+	SUSPEND=n
+	if [ -z "$JMX_PORT" ]
+	then
+		JMX_PORT=9875
+	fi
+	
+	if [ -z "$KEYSTORE_PASSWORD" ]
+	then
+		KEYSTORE_PASSWORD=changeit
+	fi
+	
+	ADDITIONAL_ARGS=
+
+	while (($# > 0))
+		do
+		case $1 in
+		-debug)
+				DEBUG_FLAG=1
+				if [[ "$2" == +([0-9]) ]]
+				then
+					DEBUG_PORT=$2
+					shift;
+				fi
+				;;
+		-clean)
+				CLEAN_FLAG=1
+				;;
+		-configDir)
+				CONFIG_DIR=$2
+				shift;
+				;;
+		-jmxport)
+				JMX_PORT=$2
+				shift;
+				;;
+		-keystore)
+				KEYSTORE_PATH=$2
+				shift;
+				;;
+		-keystorePassword)
+				KEYSTORE_PASSWORD=$2
+				shift;
+				;;
+		-noStart)
+				NO_START_FLAG=1
+				;;
+				
+		-suspend)
+				SUSPEND=y
+				;;
+		-shell)
+				SHELL_FLAG=1
+				;;
+		*)
+				ADDITIONAL_ARGS="$ADDITIONAL_ARGS $1"
+				;;
+		esac
+		shift
+	done
+	
+	# start the kernel
+	if [[ "$CONFIG_DIR" != /* ]]
+	then
+	    CONFIG_DIR=$KERNEL_HOME/$CONFIG_DIR
+	fi
+
+	if [ -z "$KEYSTORE_PATH" ]
+	then
+	    KEYSTORE_PATH=$CONFIG_DIR/keystore
+	fi
+
+	if [ "$DEBUG_FLAG" ]
+	then
+		DEBUG_OPTS=" \
+			-Xdebug \
+			-Xrunjdwp:transport=dt_socket,address=$DEBUG_PORT,server=y,suspend=$SUSPEND"
+	fi
+
+	if [ "$CLEAN_FLAG" ]
+	then
+        echo "Cleaning the serviceability and working directories..."
+        rm -rf "$KERNEL_HOME/work"
+        rm -rf "$KERNEL_HOME/serviceability"
+
+        LAUNCH_OPTS="$LAUNCH_OPTS -clean" #equivalent to setting osgi.clean to "true"
+	fi
+	
+	if [ "$SHELL_FLAG" ]
+	then
+	    echo "Warning: Kernel shell not supported; -shell option ignored."
+		# LAUNCH_OPTS="$LAUNCH_OPTS -Forg.eclipse.virgo.kernel.shell.local=true"
+	fi
+
+    ACCESS_PROPERTIES=$CONFIG_DIR/org.eclipse.virgo.kernel.jmxremote.access.properties
+    AUTH_LOGIN=$CONFIG_DIR/org.eclipse.virgo.kernel.authentication.config
+    AUTH_FILE=$CONFIG_DIR/org.eclipse.virgo.kernel.users.properties
+    CONFIG_AREA=$KERNEL_HOME/work
+    JAVA_PROFILE=$KERNEL_HOME/configuration/java-server.profile
+
+    if $cygwin; then
+        ACCESS_PROPERTIES=$(cygpath -wp $ACCESS_PROPERTIES)
+        AUTH_LOGIN=$(cygpath -wp $AUTH_LOGIN)
+        AUTH_FILE=$(cygpath -wp $AUTH_FILE)
+        KERNEL_HOME=$(cygpath -wp $KERNEL_HOME)
+        CONFIG_DIR=$(cygpath -wp $CONFIG_DIR)
+        CONFIG_AREA=$(cygpath -wp $CONFIG_AREA)
+        JAVA_PROFILE=$(cygpath -wp $JAVA_PROFILE)
+    fi
+	
+	# Set the required permissions on the JMX configuration files
+	chmod 600 "$ACCESS_PROPERTIES"
+
+   	if [ -z "$JAVA_HOME" ]
+    then
+      	JAVA_EXECUTABLE=java
+    else
+     	JAVA_EXECUTABLE=$JAVA_HOME/bin/java
+    fi
+
+	# If we get here we have the correct Java version.
+	
+	if [ -z "$NO_START_FLAG" ]
+	then
+		TMP_DIR=$KERNEL_HOME/work/tmp
+		# Ensure that the tmp directory exists
+		mkdir -p "$TMP_DIR"
+
+        JAVA_OPTS="-Xmx1024m \
+                    -XX:MaxPermSize=512m $JAVA_OPTS"
+
+		cd "$KERNEL_HOME"; exec $JAVA_EXECUTABLE \
+			$JAVA_OPTS \
+			$DEBUG_OPTS \
+			$JMX_OPTS \
+			-XX:+HeapDumpOnOutOfMemoryError \
+			-XX:ErrorFile="$KERNEL_HOME/serviceability/error.log" \
+			-XX:HeapDumpPath="$KERNEL_HOME/serviceability/heap_dump.hprof" \
+			-Djava.security.auth.login.config="$AUTH_LOGIN" \
+			-Dorg.eclipse.virgo.kernel.authentication.file="$AUTH_FILE" \
+			-Djava.io.tmpdir="$TMP_DIR" \
+			-Dorg.eclipse.virgo.kernel.home="$KERNEL_HOME" \
+			-Dorg.eclipse.virgo.kernel.config="$CONFIG_DIR" \
+			-Dosgi.sharedConfiguration.area="$CONFIG_DIR" \
+			-Dosgi.java.profile="file:$JAVA_PROFILE" \
+            -Declipse.ignoreApp=true \
+            -Dosgi.install.area="$KERNEL_HOME" \
+            -Dosgi.configuration.area="$CONFIG_AREA" \
+            -Dssh.server.keystore="$CONFIG_DIR/hostkey.ser" \
+            -Dosgi.frameworkClassPath="$FWCLASSPATH" \
+            -Djava.endorsed.dirs="$KERNEL_HOME/lib/endorsed" \
+            -Dcom.sun.management.jmxremote.port=$JMX_PORT \
+		    -Dcom.sun.management.jmxremote.authenticate=true \
+	    	-Dcom.sun.management.jmxremote.login.config=virgo-kernel \
+    		-Dcom.sun.management.jmxremote.access.file="$ACCESS_PROPERTIES" \
+		    -Djavax.net.ssl.keyStore="$KEYSTORE_PATH" \
+		    -Djavax.net.ssl.keyStorePassword="$KEYSTORE_PASSWORD" \
+		    -Dcom.sun.management.jmxremote.ssl=true \
+		    -Dcom.sun.management.jmxremote.ssl.need.client.auth=false \
+            -classpath "$CLASSPATH" \
+			org.eclipse.equinox.launcher.Main \
+            -noExit \
+			$LAUNCH_OPTS \
+			$ADDITIONAL_ARGS
+	fi
+elif [ "$COMMAND" = "stop" ]
+then
+
+	CONFIG_DIR="$KERNEL_HOME/configuration"
+
+	#parse args for the script
+	if [ -z "$TRUSTSTORE_PATH" ]
+	then
+		TRUSTSTORE_PATH=$CONFIG_DIR/keystore
+	fi
+	
+	if [ -z "$TRUSTSTORE_PASSWORD" ]	
+	then
+		TRUSTSTORE_PASSWORD=changeit
+	fi
+
+	if [ -z "$JMX_PORT" ]
+	then
+		JMX_PORT=9875
+	fi
+
+	shopt -s extglob
+
+	while (($# > 0))
+		do
+		case $1 in
+		-truststore)
+				TRUSTSTORE_PATH=$2
+				shift;
+				;;
+		-truststorePassword)
+				TRUSTSTORE_PASSWORD=$2
+				shift;
+				;;
+		-configDir)
+				CONFIG_DIR=$2
+				shift;
+				;;
+		-jmxport)
+				JMX_PORT=$2
+				shift;
+				;;
+		*)
+			OTHER_ARGS+=" $1"
+			;;
+		esac
+		shift
+	done
+
+	OTHER_ARGS+=" -jmxport $JMX_PORT"
+
+    if $cygwin; then
+        KERNEL_HOME=$(cygpath -wp $KERNEL_HOME)
+        CONFIG_DIR=$(cygpath -wp $CONFIG_DIR)
+    fi
+
+	exec $JAVA_EXECUTABLE \
+	     $JAVA_OPTS \
+	     $JMX_OPTS \
+		-classpath "$CLASSPATH" \
+		-Djavax.net.ssl.trustStore="$TRUSTSTORE_PATH" \
+		-Djavax.net.ssl.trustStorePassword="$TRUSTSTORE_PASSWORD" \
+		-Dorg.eclipse.virgo.kernel.home="$KERNEL_HOME" \
+		-Dorg.eclipse.virgo.kernel.authentication.file="$CONFIG_DIR/org.eclipse.virgo.kernel.users.properties" \
+		org.eclipse.virgo.nano.shutdown.ShutdownClient $OTHER_ARGS
+	
+else
+	echo "Unknown command: ${COMMAND}"
+fi
+
diff --git a/packaging/nano/src/main/filtered/bin/jconsole.sh b/packaging/nano/src/main/filtered/bin/jconsole.sh
new file mode 100755
index 0000000..0dfbcbf
--- /dev/null
+++ b/packaging/nano/src/main/filtered/bin/jconsole.sh
@@ -0,0 +1,53 @@
+#!/bin/bash
+
+if [ -z "$JAVA_HOME" ]
+then
+    echo The JAVA_HOME environment variable is not defined
+    exit 1
+fi
+
+SCRIPT="$0"
+
+# SCRIPT may be an arbitrarily deep series of symlinks. Loop until we have the concrete path.
+while [ -h "$SCRIPT" ] ; do 
+  ls=`ls -ld "$SCRIPT"`
+  # Drop everything prior to ->
+  link=`expr "$ls" : '.*-> \(.*\)$'`
+  if expr "$link" : '/.*' > /dev/null; then
+    SCRIPT="$link"
+  else
+    SCRIPT=`dirname "$SCRIPT"`/"$link"
+  fi
+done
+ 
+KERNEL_HOME=`dirname "$SCRIPT"`/..
+KERNEL_HOME=`cd $KERNEL_HOME; pwd`
+
+#parse args for the script
+TRUSTSTORE_PATH=$KERNEL_HOME/configuration/keystore
+TRUSTSTORE_PASSWORD=changeit
+
+shopt -s extglob
+
+while (($# > 0))
+	do
+	case $1 in
+	-truststore)
+			TRUSTSTORE_PATH=$2
+			shift;
+			;;
+	-truststorePassword)
+			TRUSTSTORE_PASSWORD=$2
+			shift;
+			;;
+	esac
+	shift
+done
+
+JMX_OPTS=" \
+	$JMX_OPTS \
+	-J-Dcom.sun.tools.jconsole.mbeans.keyPropertyList=category,type \
+	-J-Djavax.net.ssl.trustStore=$TRUSTSTORE_PATH \
+	-J-Djavax.net.ssl.trustStorePassword=$TRUSTSTORE_PASSWORD"
+
+$JAVA_HOME/bin/jconsole $JMX_OPTS
diff --git a/packaging/nano/src/main/filtered/bin/setupClasspath.sh b/packaging/nano/src/main/filtered/bin/setupClasspath.sh
new file mode 100755
index 0000000..741e0e3
--- /dev/null
+++ b/packaging/nano/src/main/filtered/bin/setupClasspath.sh
@@ -0,0 +1,40 @@
+#!/bin/bash
+
+# make sure we have JAVA_HOME set
+if [ -z "$JAVA_HOME" ]
+then
+	echo The JAVA_HOME environment variable is not defined. Using PATH instead.
+fi
+
+CLASSPATH=
+FWCLASSPATH=
+
+#  Create the classpath for bootstrapping the Server from all the JARs in lib
+for file in "$KERNEL_HOME"/lib/*
+do
+	if [[ $file == *.jar ]]
+	then
+		CLASSPATH=$CLASSPATH:$KERNEL_HOME/lib/${file##*/}
+		FWCLASSPATH=$FWCLASSPATH,file:$KERNEL_HOME/lib/${file##*/}
+	fi
+done
+
+#  Append the osgi jar to the classpath
+for file in "$KERNEL_HOME"/plugins/org.eclipse.osgi_*.jar
+do
+	CLASSPATH=$CLASSPATH:$KERNEL_HOME/plugins/${file##*/}
+	FWCLASSPATH=$FWCLASSPATH,file:$KERNEL_HOME/plugins/${file##*/}
+done
+
+#  Append the console.supportability jar to the classpath to enable ssh
+for file in "$KERNEL_HOME"/plugins/org.eclipse.equinox.console.ssh_*.jar
+do
+	CLASSPATH=$CLASSPATH:$KERNEL_HOME/plugins/${file##*/}
+done
+
+# make sure we have CLASSPATH set
+if [ -z "$CLASSPATH" ]
+then
+	echo No JAR files found in $KERNEL_HOME/lib
+	exit 1
+fi
diff --git a/packaging/nano/src/main/filtered/bin/shutdown.sh b/packaging/nano/src/main/filtered/bin/shutdown.sh
new file mode 100755
index 0000000..1960446
--- /dev/null
+++ b/packaging/nano/src/main/filtered/bin/shutdown.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+
+SCRIPT="$0"
+
+# SCRIPT may be an arbitrarily deep series of symlinks. Loop until we have the concrete path.
+while [ -h "$SCRIPT" ] ; do
+  ls=`ls -ld "$SCRIPT"`
+  # Drop everything prior to ->
+  link=`expr "$ls" : '.*-> \(.*\)$'`
+  if expr "$link" : '/.*' > /dev/null; then
+    SCRIPT="$link"
+  else
+    SCRIPT=`dirname "$SCRIPT"`/"$link"
+  fi
+done
+
+SCRIPT_DIR=`dirname $SCRIPT`
+EXECUTABLE="dmk.sh"
+
+#
+# identify yourself when running under cygwin
+#
+cygwin=false
+case "$(uname)" in
+    CYGWIN*) cygwin=true ;;
+esac
+export cygwin
+
+exec "$SCRIPT_DIR"/"$EXECUTABLE" stop "$@"
diff --git a/packaging/nano/src/main/filtered/bin/startup.sh b/packaging/nano/src/main/filtered/bin/startup.sh
new file mode 100755
index 0000000..69e43b7
--- /dev/null
+++ b/packaging/nano/src/main/filtered/bin/startup.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+
+SCRIPT="$0"
+
+# SCRIPT may be an arbitrarily deep series of symlinks. Loop until we have the concrete path.
+while [ -h "$SCRIPT" ] ; do
+  ls=`ls -ld "$SCRIPT"`
+  # Drop everything prior to ->
+  link=`expr "$ls" : '.*-> \(.*\)$'`
+  if expr "$link" : '/.*' > /dev/null; then
+    SCRIPT="$link"
+  else
+    SCRIPT=`dirname "$SCRIPT"`/"$link"
+  fi
+done
+
+SCRIPT_DIR=`dirname $SCRIPT`
+EXECUTABLE="dmk.sh"
+
+#
+# identify yourself when running under cygwin
+#
+cygwin=false
+case "$(uname)" in
+    CYGWIN*) cygwin=true ;;
+esac
+export cygwin
+
+exec "$SCRIPT_DIR"/"$EXECUTABLE" start "$@"
diff --git a/packaging/nano/src/main/filtered/lib/.version b/packaging/nano/src/main/filtered/lib/.version
new file mode 100644
index 0000000..46d3a96
--- /dev/null
+++ b/packaging/nano/src/main/filtered/lib/.version
@@ -0,0 +1 @@
+virgo.nano.version=@VIRGO.VERSION@
diff --git a/packaging/scripts/add-license-xml.sh b/packaging/scripts/add-license-xml.sh
new file mode 100755
index 0000000..4e42057
--- /dev/null
+++ b/packaging/scripts/add-license-xml.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+dir=`dirname $0`
+dir=`cd $dir;pwd`
+
+template="$dir/header-xml.awk"
+license="$dir/license-xml.txt"
+
+# avoid tr objecting to certain characters
+export LC_ALL=C
+
+for f in $(find . -iname "*.xml")
+do
+fin=$f
+fout="$f.out"
+
+# ensure newlines are used in place of carriage returns so we do not corrupt the file
+tr '\r' '\n' < $fin | awk -f $template -v license_file=$license > $fout
+mv $fout $fin
+done
diff --git a/packaging/scripts/add-license.sh b/packaging/scripts/add-license.sh
new file mode 100755
index 0000000..03ce8fa
--- /dev/null
+++ b/packaging/scripts/add-license.sh
@@ -0,0 +1,21 @@
+#!/usr/bin/env bash
+dir=`dirname $0`
+dir=`cd $dir;pwd`
+
+template="$dir/header.awk"
+license="$dir/license.txt"
+
+# avoid tr objecting to certain characters
+export LC_ALL=C
+
+for f in $(find . -iname "*.java" -or -iname "*.aj")
+do
+fin=$f
+fout="$f.out"
+fbak="$f.bak"
+cp $fin $fbak
+
+# ensure newlines are used in place of carriage returns so we do not corrupt the file
+tr '\r' '\n' < $fin | awk -f $template -v license_file=$license > $fout
+mv $fout $fin
+done
diff --git a/packaging/scripts/delete-authors-and-since.sh b/packaging/scripts/delete-authors-and-since.sh
new file mode 100755
index 0000000..0a2241e
--- /dev/null
+++ b/packaging/scripts/delete-authors-and-since.sh
@@ -0,0 +1,16 @@
+#!/usr/bin/env bash
+dir=`dirname $0`
+dir=`cd $dir;pwd`
+
+# avoid tr objecting to certain characters
+export LC_ALL=C
+
+for f in $(find . -iname "*.java" -or -iname "*.aj")
+do
+fin=$f
+fout="$f.out"
+
+# ensure newlines are used in place of carriage returns so we do not corrupt the file
+tr '\r' '\n' < $fin | awk 'match($0,"@author") == 0 && match($0,"@since") == 0 {print $0}' > $fout
+mv $fout $fin
+done
diff --git a/packaging/scripts/dual-license.txt b/packaging/scripts/dual-license.txt
new file mode 100644
index 0000000..9be765c
--- /dev/null
+++ b/packaging/scripts/dual-license.txt
@@ -0,0 +1,15 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 VMware Inc.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * and Apache License v2.0 which accompanies this distribution. 
+ * The Eclipse Public License is available at
+ *   http://www.eclipse.org/legal/epl-v10.html
+ * and the Apache License v2.0 is available at 
+ *   http://www.opensource.org/licenses/apache2.0.php.
+ * You may elect to redistribute this code under either of these licenses.  
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
\ No newline at end of file
diff --git a/packaging/scripts/header-xml.awk b/packaging/scripts/header-xml.awk
new file mode 100644
index 0000000..c671aa0
--- /dev/null
+++ b/packaging/scripts/header-xml.awk
@@ -0,0 +1,8 @@
+BEGIN {header=0}
+header==0 {print}
+$1 == "<?xml" {print_header()}
+
+function print_header() {
+	while ((getline line < license_file) > 0)
+       print line
+}
\ No newline at end of file
diff --git a/packaging/scripts/header.awk b/packaging/scripts/header.awk
new file mode 100644
index 0000000..862f207
--- /dev/null
+++ b/packaging/scripts/header.awk
@@ -0,0 +1,9 @@
+BEGIN {header=0}
+$1 == "package" {header=1; print_header()}
+header==1 {print}
+
+function print_header() {
+	while ((getline line < license_file) > 0)
+       print line
+	print ""
+}
\ No newline at end of file
diff --git a/packaging/scripts/lib/console.rb b/packaging/scripts/lib/console.rb
new file mode 100644
index 0000000..446e427
--- /dev/null
+++ b/packaging/scripts/lib/console.rb
@@ -0,0 +1,22 @@
+class Console
+
+  def initialize
+    ObjectSpace.define_finalizer( self, self.class.finalize )
+  end
+
+  def set_title(prefix, title)
+    print "\033]0;#{prefix}: #{title}\007"
+  end
+
+  def clear_title
+    print "\033]0;\007"
+  end
+
+  def self.finalize
+    proc {
+      print "\033]0;\007"
+      puts "Virgo script finished execution."
+    }
+  end
+
+end
\ No newline at end of file
diff --git a/packaging/scripts/lib/repository.rb b/packaging/scripts/lib/repository.rb
new file mode 100644
index 0000000..b8d2cc2
--- /dev/null
+++ b/packaging/scripts/lib/repository.rb
@@ -0,0 +1,208 @@
+$LOAD_PATH << File.expand_path(File.dirname(__FILE__))
+
+require 'version'
+require 'fileutils'
+
+class Repository
+
+  attr_reader :name
+  attr_reader :targets
+  attr_reader :clone_command
+  attr_reader :bundle_version
+  attr_reader :path
+  attr_reader :master_branch
+
+  def initialize(repo_root, name, path, variable, bundle_version = nil, master_branch = 'master', targets = 'clean clean-integration test publish-ivy')
+    if repo_root.nil?
+      abort('Repository Git Root cannot be nil for repository ' + @name)
+    end
+    @repo_root = repo_root
+      
+    if name.nil?
+      abort('Name cannot be nil')
+    end
+    @name = name
+
+    if path.nil? || path == ''
+      abort('Repository path cannot be nil for repository ' + @name)
+    end
+    @path = File.expand_path(path)
+
+    @variable = variable
+
+    @bundle_version = bundle_version
+
+    if targets.nil?
+      abort('Repository build targets cannot be nil for repository ' + @name)
+    end
+    @targets = targets
+
+    if master_branch.nil?
+      abort('Repository master branch cannot be nil for repository ' + @name)
+    end
+    @master_branch = master_branch
+    
+    @clone_command = 'git clone -b ' + @master_branch + " " + @repo_root + @name + '.git ' + @path 
+  end
+
+  def checkout(quietly=false)
+    if File.exist?(@path)
+      puts '  Deleting old checkout at ' + @path
+      FileUtils.rm_rf(@path)
+    end
+    tonull = " > /dev/null 2>&1"
+    puts '  Checking out ' + @path
+    execute(@clone_command + (quietly ? tonull : ""))
+    Dir.chdir(@path)
+    execute('git submodule update --init' + (quietly ? tonull : ""))
+    if @bundle_version.nil? 
+      create_new_bundle_version_from_properties
+    end
+  end
+
+  def create_release_branch(version, build_stamp, release_type, versions)
+    create_branch(@bundle_version)
+    update_build_properties(version, build_stamp, release_type)
+    update_build_versions(versions)
+  end
+
+  def update_versions(versions)
+    create_branch(@bundle_version)
+    puts '  Updating versions'
+    versions.sort.reverse.each do |var_version|
+      Version.update(var_version[0], var_version[1], @path, true)
+    end
+    execute('cd ' + @path + '; git commit --allow-empty -a -m "[RIPPLOR] Updated versions"')
+  end
+
+  def build(committerId, log_file)
+    puts '  Building:'
+    puts '    BUNDLE_VERSION: ' + @bundle_version
+    puts '    TARGETS: ' + @targets
+    
+    execute('ant -f ' + @path + '/build-*/build.xml -Dvirgo.deps.location=integration-repo -Declipse.committerId=' + committerId + ' -Dbundle.version=' + @bundle_version + ' ' + @targets + ' >> ' + log_file)
+  end
+
+  def create_tag
+    puts '    Creating tag ' + @bundle_version
+    Dir.chdir(@path)
+
+    puts "hello"+"world"
+    execute('git tag -a -m "[RELEASELOR] ' + @bundle_version + '" ' + @bundle_version)
+  end
+
+  def update_master_branch(new_version, versions)
+    create_branch(new_version)
+    update_build_properties(new_version)
+    update_build_versions(versions)
+  end
+
+  def versions
+    versions = Hash.new
+    
+    IO.foreach(@path + '/build.versions') do |line|
+      if line =~ /([^=]*)=(.*)/
+        if !($1.strip[-6..-1] == '-RANGE')
+          versions[$1.strip] = $2.strip 
+        end
+      end
+    end
+  
+    versions[@variable] = @bundle_version
+    versions
+  end
+
+  def push(new_version=nil)
+    new_version = @bundle_version if new_version.nil?
+    puts 'Pushing ' + @name
+    Dir.chdir(@path)
+    execute('git push origin ' + new_version + ':' + @master_branch + ' --tags')
+  end
+  
+  def update_virgo_build(new_version)
+    puts '  Updating to Virgo Build version \'' + new_version + '\''
+    Dir.chdir(@path + "/virgo-build")
+    execute("git pull origin master:master ")
+    execute("git fetch --tags")
+    execute("git checkout " + new_version)
+    Dir.chdir(@path)
+    execute('git commit --allow-empty -a -m "[UPDATE BUILDLOR] Updated Virgo Build to \'' + new_version + '\'"')
+  end
+  
+  def fork(branch_name)
+    create_branch(branch_name)
+  end
+  
+  def push_fork(branch_name)
+    puts 'Pushing ' + @name
+    Dir.chdir(@path)
+    execute('git push origin ' + branch_name)
+  end
+  
+  def update_version(new_version)
+    create_branch(new_version)
+    update_build_properties(new_version, nil, 'integration', 'VERSIONOR')
+  end
+
+########################################################################################################################
+
+  private
+
+  def create_branch(name)
+    puts('  Creating branch ' + name + ' -> ' + @master_branch)
+    execute('cd ' + @path + '; git checkout -q -b ' + name + ' --track origin/' + @master_branch)
+  end
+  
+  def create_new_bundle_version_from_properties
+    version = nil
+    IO.foreach(@path + '/build.properties') do |line|
+      version = $1.strip if line =~ /^version=(.*)/
+    end
+
+    @bundle_version = version + '.D-' + Time.now.utc.strftime("%Y%m%d%H%M%S")
+  end
+
+  def update_build_properties(version, build_stamp = nil, release_type = 'integration', name = 'RELEASELOR')
+    properties = @path + '/build.properties'
+    puts '    Updating properties'
+    lines = IO.readlines(properties)
+    lines.each do |line|
+      if line =~ /^version/
+        line.gsub!(/^version.*/, 'version=' + version)
+        
+        if(!build_stamp.nil?)
+          lines.insert(lines.index(line) + 2, 'build.stamp=' + build_stamp + $/)
+        end
+      elsif line =~ /^release\.type/
+        line.gsub!(/^release\.type.*/, 'release.type=' + release_type)
+      end
+    end
+    write_file(properties, lines)
+    execute('cd ' + @path + '; git commit --allow-empty -a -m "[' + name + '] Updated properties"')
+  end
+
+  def update_build_versions(versions)
+    puts '    Updating versions'
+    versions.sort.reverse.each do |var_version|
+      Version.update(var_version[0], var_version[1], @path, true)
+    end
+    execute('cd ' + @path + '; git commit --allow-empty -a -m "[RELEASELOR] Updated versions"')
+  end
+
+  def execute(command)
+    output = `#{command}`
+    if $?.to_i != 0
+      abort('Execution Failed')
+    end
+    output
+  end
+
+  def write_file(path, lines)
+    file = File.new(path, 'w')
+    lines.each do |line|
+      file.write(line)
+    end
+    file.close
+  end
+
+end
\ No newline at end of file
diff --git a/packaging/scripts/lib/version.rb b/packaging/scripts/lib/version.rb
new file mode 100644
index 0000000..a32b642
--- /dev/null
+++ b/packaging/scripts/lib/version.rb
@@ -0,0 +1,81 @@
+require 'find'
+
+class Version
+
+  @@SEARCH_EXTENSIONS = [
+    'classpath',
+    'iml',
+    'java',
+    'properties',
+    'versions',
+    'xml'
+  ]
+
+  def self.update(variable, version, root, verbose=false)  
+    existing_version = nil
+    IO.foreach(root + '/build.versions') do |line|
+      existing_version = $1.strip if line !~ /^\s*#/ && line =~ /#{variable}=(.*)/
+    end
+    
+    if existing_version.nil?
+      puts '      No variable <' + variable + '> found in ./build.versions file.'
+    else
+      if existing_version != version
+        puts '      Updating <' + variable + '> from "' + existing_version + '" to "' + version + '"'
+        puts '       (-------: files in which <' + variable + '> is found with a version string are listed, those updated so prefixed)' if verbose
+        changesMade = false
+        Find.find(root) do |path|
+          Find.prune if dirAtPath?(path,["ivy-cache","target","integration-repo","virgo-build"])
+          if FileTest.file?(path) && @@SEARCH_EXTENSIONS.include?(get_extension(path))
+            lines = IO.readlines(path)
+            changed = false
+            encountered = false
+            lines.each do |line|
+              if line =~ /#{variable}[^0-9A-Za-z]/
+                encountered = true if line =~ /([0-9]+\.[0-9]+(\.[0-9]+(\.[0-9A-Za-z_\-]+)?)?)/
+                changed = true if line.gsub!(/#{existing_version}/, version)
+              end
+            end
+      
+            if changed
+              puts '        updated: ' + path if verbose
+              write_file(path, lines)
+              changesMade = true
+            else
+              puts '        -------: ' + path if verbose && encountered
+            end
+          end
+        end
+        puts '        No files found using <' + variable + '> with version "' + existing_version + '"' if verbose && !changesMade
+      else
+        puts '      Variable <' + variable + '> not updated, version already set as "' + version + '"'
+      end
+    end
+  end
+
+########################################################################################################################
+
+  private
+
+  def self.dirAtPath?(path, dirs)
+    dirs.include?(path.split("/")[-1])
+  end
+  
+  def self.get_extension(path)
+    match_data = path.match('/.*\.(.*)')
+    if match_data.nil?
+      nil
+    else
+      match_data[1]
+    end
+  end
+  
+  def self.write_file(path, lines)
+    file = File.new(path, 'w')
+    lines.each do |line|
+      file.write(line)
+    end
+    file.close
+  end
+  
+end
\ No newline at end of file
diff --git a/packaging/scripts/license-xml.txt b/packaging/scripts/license-xml.txt
new file mode 100644
index 0000000..7c63fb2
--- /dev/null
+++ b/packaging/scripts/license-xml.txt
@@ -0,0 +1,12 @@
+<!--
+ ******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ ******************************************************************************
+-->
\ No newline at end of file
diff --git a/packaging/scripts/license.txt b/packaging/scripts/license.txt
new file mode 100644
index 0000000..183efa2
--- /dev/null
+++ b/packaging/scripts/license.txt
@@ -0,0 +1,10 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
\ No newline at end of file
diff --git a/packaging/scripts/releaselor/options.rb b/packaging/scripts/releaselor/options.rb
new file mode 100644
index 0000000..59e3fce
--- /dev/null
+++ b/packaging/scripts/releaselor/options.rb
@@ -0,0 +1,112 @@
+require "rubygems"
+require "choice"
+require "etc"
+
+Choice.options do
+
+  header('')
+  header('Required arguments:')
+
+  option :version, :required => true do
+    short('-v')
+    long('--version=VERSION')
+    desc('The version number of the release')
+  end
+
+  option :build_stamp, :required => true do
+    short('-q')
+    long('--build-stamp=BUILD-STAMP')
+    desc('The build stamp for the release, e.g. M01, RELEASE')
+  end
+
+  option :release_type, :required => true do
+    short('-t')
+    long('--release-type=RELEASE-TYPE')
+    desc('The release type for the release, e.g. milestone, release')
+  end
+
+  option :new_version, :required => true do
+    short('-n')
+    long('--new-version=NEW-VERSION')
+    desc('The new version number to be used after the release')
+  end
+
+  separator('')
+  separator('Optional arguments:')
+
+  option :build_version, :required => false do
+    short('-b')
+    long('--virgo-build-version=VIRGO-BUILD-VERSION')
+    validate(/\d(.\d(.\d(.([\w_-])+)?)?)?/)
+    desc('The version to update Virgo Build to')
+  end
+
+  option :repository_map, :required => false do
+    short('-m')
+    long('--map=REPOSITORY-MAP')
+    default('~/repository.map')
+    desc('The property file containing a mapping from a repository name to a location')
+    desc('(defaults to ~/repository.map)')
+  end
+
+  option :remote_user, :required => false do
+   short('-u')
+   long('--remote-user=REMOTE-USER')
+   default(Etc.getlogin)
+   desc('User id to use for remote repository access')
+   desc('(defaults to local login id)')
+  end
+
+  option :product_release, :required => false do
+   short('-r')
+   long('--product-release=PRODUCT')
+   desc('The product to be released, kernel, web-server, virgo, full-product')
+   desc('(defaults to releasing all the virgo repos)')
+  end
+
+  option :branch_name, :required => false do
+   short('-c')
+   long('--branch=BRANCH-NAME')
+   default('master')
+   desc('The branch to be released')
+   desc('(defaults to master)')
+  end
+
+  option :gemini_version, :required => false do
+    short('-g')
+    long('--gemini-version=GEMINI-BUILD-VERSION')
+    desc('When producing a full-product build the Gemini version must be given')
+  end
+
+  option :gemini_build_stamp, :required => false do
+    short('-h')
+    long('--gemini-build-stamp=GEMINI-BUILD-STAMP')
+    desc('The build stamp for the Gemini Web release, e.g. M01, RELEASE')
+  end
+  
+  option :gemini_release_type, :required => false do
+    short('-j')
+    long('--gemini-release-type=GEMINI-RELEASE-TYPE')
+    desc('The release type for the Gemini Web release, e.g. milestone, release')
+  end
+
+  option :gemini_new_version, :required => false do
+    short('-k')
+    long('--gemini-new-version=GEMINI-NEW-VERSION')
+    desc('The new Gemini Web version number to be used after the release')
+  end
+  
+  option :gemini_branch_name, :required => false do
+   short('-d')
+   long('--gemini-branch=BRANCH-NAME')
+   default('master')
+   desc('The Gemini Web branch to be released')
+   desc('(defaults to master)')
+  end
+   
+  option :dryrun?, :required => false do
+   long('--dry-run')
+   desc('Show what would happen but do not actually do anything')
+  end
+
+end
diff --git a/packaging/scripts/releaselor/releaselor.rb b/packaging/scripts/releaselor/releaselor.rb
new file mode 100755
index 0000000..fe4111e
--- /dev/null
+++ b/packaging/scripts/releaselor/releaselor.rb
@@ -0,0 +1,204 @@
+#!/usr/bin/env ruby -wKU
+$LOAD_PATH << File.expand_path(File.dirname(__FILE__))
+$LOAD_PATH << File.expand_path(File.dirname(__FILE__) + '/../lib')
+
+require 'repository'
+require 'options'
+require 'console'
+
+args = Choice.choices
+SCRIPT_NAME = "releaselor"
+
+bundle_version = args[:version] + '.' + args[:build_stamp]
+if args[:product_release] == 'full-product'
+  gemini_version = args[:gemini_version] + '.' + args[:gemini_build_stamp]
+end
+release_from_branch = args[:branch_name]
+gemini_release_from_branch = args[:gemini_branch_name]
+
+DRY_RUN = args[:dryrun?].nil? ? false : true
+puts "This is a dry run..." if DRY_RUN
+
+if File.exist?(File.expand_path(args[:repository_map]))
+  paths = Hash.new
+  IO.foreach(File.expand_path(args[:repository_map])) do |line|
+	paths[$1.strip] = $2.strip if line =~ /([^=]*)=(.*)/
+  end
+else
+    paths = {
+        'util' => 'util',
+        'test' => 'test',
+        'medic' => 'medic',
+        'nano' => 'nano',
+        'artifact-repository' => 'artifact-repository',
+        'kernel' => 'kernel',
+        'kernel-tools' => 'kernel-tools',
+        'web' => 'web',
+        'snaps' => 'snaps',
+        'apps' => 'apps',
+        'documentation' => 'documentation',
+        'packaging' => 'packaging',
+        'gemini-web' => 'gemini-web' 
+    }
+end
+
+virgo_eclipse_repo_root = 'ssh://' + args[:remote_user] + '@git.eclipse.org/gitroot/virgo/org.eclipse.virgo.'
+gemini_eclipse_repo_root = 'ssh://' + args[:remote_user] + '@git.eclipse.org/gitroot/gemini.web/org.eclipse.gemini.web.'
+default_targets = 'clean clean-integration test publish-ivy publish-maven'
+clean_all_targets = 'clean clean-all-integration clean-ivy test publish-ivy publish-maven'
+
+
+if args[:product_release] == 'full-product'
+
+  ALL_REPOS = [
+	Repository.new(virgo_eclipse_repo_root,	 'util',					paths['util'],					'org.eclipse.virgo.util',			bundle_version, release_from_branch,		clean_all_targets),
+	Repository.new(virgo_eclipse_repo_root,	 'test',					paths['test'],					'org.eclipse.virgo.test',			bundle_version, release_from_branch,		default_targets),
+	Repository.new(virgo_eclipse_repo_root,	 'medic',					paths['medic'],					'org.eclipse.virgo.medic',			bundle_version, release_from_branch,		default_targets),
+	Repository.new(virgo_eclipse_repo_root,	 'nano',					paths['nano'],					'org.eclipse.virgo.nano',			bundle_version, release_from_branch,		'clean clean-integration test publish-ivy publish-maven'),
+	Repository.new(virgo_eclipse_repo_root,	 'artifact-repository',		paths['artifact-repository'],	'org.eclipse.virgo.repository',		bundle_version, release_from_branch,		default_targets),
+	Repository.new(virgo_eclipse_repo_root,	 'kernel',					paths['kernel'],				'org.eclipse.virgo.kernel',			bundle_version, release_from_branch,		'clean clean-integration test publish-ivy publish-maven'),
+	Repository.new(virgo_eclipse_repo_root,	 'kernel-tools',			paths['kernel-tools'],			'org.eclipse.virgo.kernel-tools',	bundle_version, release_from_branch,		default_targets),
+	Repository.new(gemini_eclipse_repo_root, 'gemini-web-container',	paths['gemini-web'],			'org.eclipse.gemini.web',			gemini_version, gemini_release_from_branch, 'clean clean-integration test doc package publish-ivy publish-maven'),
+	Repository.new(virgo_eclipse_repo_root,	 'web',						paths['web'],					'org.eclipse.virgo.web',			bundle_version, release_from_branch,		default_targets),
+	Repository.new(virgo_eclipse_repo_root,	 'snaps',					paths['snaps'],					'org.eclipse.virgo.snaps',			bundle_version, release_from_branch,		'clean clean-integration test package publish-ivy publish-maven publish-build publish-download'),
+	Repository.new(virgo_eclipse_repo_root,	 'apps',					paths['apps'],					'org.eclipse.virgo.apps',			bundle_version, release_from_branch,		default_targets),
+	Repository.new(virgo_eclipse_repo_root,	 'documentation',			paths['documentation'],			'org.eclipse.virgo.documentation',	bundle_version, release_from_branch,		'clean clean-integration doc-html package publish-ivy publish-download'),
+    Repository.new(virgo_eclipse_repo_root, 'packaging',                      paths['packaging'],             'org.eclipse.virgo.packaging',		bundle_version,        
+        release_from_branch,        'clean clean-integration test package-signed smoke-test publish-ivy publish-packages-build publish-packages-download publish-updatesite-download')
+  ]
+
+elsif args[:product_release] == 'kernel'
+
+  ALL_REPOS = [
+	Repository.new(virgo_eclipse_repo_root, 'util',						paths['util'],					'org.eclipse.virgo.util',			bundle_version, release_from_branch,		clean_all_targets),
+	Repository.new(virgo_eclipse_repo_root, 'test',						paths['test'],					'org.eclipse.virgo.test',			bundle_version, release_from_branch,		default_targets),
+	Repository.new(virgo_eclipse_repo_root, 'medic',					paths['medic'],					'org.eclipse.virgo.medic',			bundle_version, release_from_branch,		default_targets),
+	Repository.new(virgo_eclipse_repo_root,	 'nano',					paths['nano'],					'org.eclipse.virgo.nano',			bundle_version, release_from_branch,		'clean clean-integration test package publish-ivy publish-maven publish-multiple-nano-packages-build publish-updatesite-build publish-multiple-nano-packages-download'),
+	Repository.new(virgo_eclipse_repo_root, 'artifact-repository',		paths['artifact-repository'],	'org.eclipse.virgo.repository',		bundle_version, release_from_branch,		default_targets),
+	Repository.new(virgo_eclipse_repo_root, 'kernel',					paths['kernel'],				'org.eclipse.virgo.kernel',			bundle_version, release_from_branch,		'clean clean-integration test package smoke-test publish-ivy publish-maven publish-package-build publish-updatesite-build publish-package-download'),
+	Repository.new(virgo_eclipse_repo_root, 'kernel-tools',				paths['kernel-tools'],			'org.eclipse.virgo.kernel-tools',	bundle_version, release_from_branch,		default_targets)
+  ]
+
+elsif args[:product_release] == 'web-server'
+
+  ALL_REPOS = [
+	Repository.new(virgo_eclipse_repo_root, 'web',						paths['web'],					'org.eclipse.virgo.web',			bundle_version, release_from_branch,		clean_all_targets),
+	Repository.new(virgo_eclipse_repo_root, 'snaps',					paths['snaps'],					'org.eclipse.virgo.snaps',			bundle_version, release_from_branch,		'clean clean-integration test package publish-ivy publish-maven publish-build publish-download'),
+	Repository.new(virgo_eclipse_repo_root, 'apps',						paths['apps'],					'org.eclipse.virgo.apps',			bundle_version, release_from_branch,		default_targets),
+	Repository.new(virgo_eclipse_repo_root, 'documentation',			paths['documentation'],			'org.eclipse.virgo.documentation',	bundle_version, release_from_branch,		'clean clean-integration doc-html package publish-ivy publish-download'),
+    Repository.new(virgo_eclipse_repo_root, 'packaging',                      paths['packaging'],             'org.eclipse.virgo.packaging',		bundle_version,        
+        release_from_branch,        'clean clean-integration test package-signed smoke-test publish-ivy publish-packages-build publish-packages-download publish-updatesite-download')
+  ]
+
+elsif args[:product_release] == 'virgo'
+
+  ALL_REPOS = [
+	Repository.new(virgo_eclipse_repo_root, 'util',						paths['util'],					'org.eclipse.virgo.util',			bundle_version, release_from_branch,		clean_all_targets),
+	Repository.new(virgo_eclipse_repo_root, 'test',						paths['test'],					'org.eclipse.virgo.test',			bundle_version, release_from_branch,		default_targets),
+	Repository.new(virgo_eclipse_repo_root, 'medic',					paths['medic'],					'org.eclipse.virgo.medic',			bundle_version, release_from_branch,		default_targets),
+	Repository.new(virgo_eclipse_repo_root,	 'nano',					paths['nano'],					'org.eclipse.virgo.nano',			bundle_version, release_from_branch,		'clean clean-integration test publish-ivy publish-maven'),
+	Repository.new(virgo_eclipse_repo_root, 'artifact-repository',		paths['artifact-repository'],	'org.eclipse.virgo.repository',		bundle_version, release_from_branch,		default_targets),
+	Repository.new(virgo_eclipse_repo_root, 'kernel',					paths['kernel'],				'org.eclipse.virgo.kernel',			bundle_version, release_from_branch,		'clean clean-integration test publish-ivy publish-maven'),
+	Repository.new(virgo_eclipse_repo_root, 'kernel-tools',				paths['kernel-tools'],			'org.eclipse.virgo.kernel-tools',	bundle_version, release_from_branch,		default_targets),
+	Repository.new(virgo_eclipse_repo_root, 'web',						paths['web'],					'org.eclipse.virgo.web',			bundle_version, release_from_branch,		default_targets),
+	Repository.new(virgo_eclipse_repo_root, 'snaps',					paths['snaps'],					'org.eclipse.virgo.snaps',			bundle_version, release_from_branch,		'clean clean-integration test package publish-ivy publish-maven publish-build publish-download'),
+	Repository.new(virgo_eclipse_repo_root, 'apps',						paths['apps'],					'org.eclipse.virgo.apps',			bundle_version, release_from_branch,		default_targets),
+	Repository.new(virgo_eclipse_repo_root, 'documentation',			paths['documentation'],			'org.eclipse.virgo.documentation',	bundle_version, release_from_branch,		'clean clean-integration doc-html package publish-ivy publish-download'),
+    Repository.new(virgo_eclipse_repo_root, 'packaging',                      paths['packaging'],             'org.eclipse.virgo.packaging',		bundle_version,        
+        release_from_branch,        'clean clean-integration test package-signed smoke-test publish-ivy publish-packages-build publish-packages-download publish-updatesite-download')
+  ]
+
+else
+
+  ALL_REPOS = [
+	Repository.new(virgo_eclipse_repo_root, 'util',					paths['util'],					'org.eclipse.virgo.util',				bundle_version, release_from_branch,		clean_all_targets),
+	Repository.new(virgo_eclipse_repo_root, 'test',					paths['test'],					'org.eclipse.virgo.test',				bundle_version, release_from_branch,		default_targets),
+	Repository.new(virgo_eclipse_repo_root, 'medic',				paths['medic'],					'org.eclipse.virgo.medic',				bundle_version, release_from_branch,		default_targets),
+	Repository.new(virgo_eclipse_repo_root, 'artifact-repository',	paths['artifact-repository'],	'org.eclipse.virgo.repository',			bundle_version, release_from_branch,		default_targets),
+	Repository.new(virgo_eclipse_repo_root,	 'nano',				paths['nano'],					'org.eclipse.virgo.nano',				bundle_version, release_from_branch,		 'clean clean-integration test publish-ivy publish-maven'),
+	Repository.new(virgo_eclipse_repo_root, 'artifact-repository',	paths['artifact-repository'],	'org.eclipse.virgo.repository',			bundle_version, release_from_branch,		default_targets),
+	Repository.new(virgo_eclipse_repo_root, 'kernel',				paths['kernel'],				'org.eclipse.virgo.kernel',				bundle_version, release_from_branch,		'clean clean-integration test publish-ivy publish-maven'),
+	Repository.new(virgo_eclipse_repo_root, 'kernel-tools',			paths['kernel-tools'],			'org.eclipse.virgo.kernel-tools',		bundle_version, release_from_branch,		default_targets),
+	Repository.new(virgo_eclipse_repo_root, 'web',					paths['web'],					'org.eclipse.virgo.web',				bundle_version, release_from_branch,		default_targets),
+	Repository.new(virgo_eclipse_repo_root, 'snaps',				paths['snaps'],					'org.eclipse.virgo.snaps',				bundle_version, release_from_branch,		'clean clean-integration test package publish-ivy publish-maven publish-build publish-download'),
+	Repository.new(virgo_eclipse_repo_root, 'apps',					paths['apps'],					'org.eclipse.virgo.apps',				bundle_version, release_from_branch,		default_targets),
+	Repository.new(virgo_eclipse_repo_root, 'documentation',		paths['documentation'],			'org.eclipse.virgo.documentation',		bundle_version, release_from_branch,		'clean clean-integration doc-html package publish-ivy publish-download'),
+    Repository.new(virgo_eclipse_repo_root, 'packaging',                      paths['packaging'],             'org.eclipse.virgo.packaging',		bundle_version,        
+        release_from_branch,        'clean clean-integration test package-signed smoke-test publish-ivy publish-packages-build publish-packages-download publish-updatesite-download')
+    ]
+
+end
+
+log_file=File.expand_path('./release.log')
+start_time = Time.new
+accumulate_versions = Hash.new
+console = Console.new
+
+begin
+
+  ALL_REPOS.each do |repo|
+	puts 'Releasing ' + repo.name
+	puts '    checkout with "' + repo.clone_command + '"' if DRY_RUN
+	console.set_title(SCRIPT_NAME, "#{repo.name} Checkout")
+	repo.checkout(true)
+	if DRY_RUN
+	  puts "  Create Release branch " + args[:version] + ", " + args[:build_stamp] + ", " + args[:release_type]
+	  puts "	using versions: "
+	  accumulate_versions.sort.each {|keyval| puts "	  " + keyval[0] + " = " + keyval[1]}
+	  if !args[:build_version].nil?
+		puts '	updating Virgo Build to \'' + args[:build_version] + '\''
+	  end
+	  puts "  Building " + repo.name
+	  puts "  Create tag " + repo.bundle_version
+	  puts "  Update Master branch " + args[:new_version]
+	else
+	  console.set_title(SCRIPT_NAME, "#{repo.name} Create release branch")
+	  if repo.name == 'gemini-web-container'
+		repo.create_release_branch(args[:gemini_version], args[:gemini_build_stamp], args[:gemini_release_type], accumulate_versions)
+	  else
+		repo.create_release_branch(args[:version], args[:build_stamp], args[:release_type], accumulate_versions)
+	  end
+	  if !args[:build_version].nil?
+		console.set_title(SCRIPT_NAME, "#{repo.name} Update Virgo build")
+		repo.update_virgo_build(args[:build_version])
+	  end
+	  console.set_title(SCRIPT_NAME, "#{repo.name} Build")
+	  repo.build(args[:remote_user], log_file)
+	  console.set_title(SCRIPT_NAME, "#{repo.name} Create tag")
+	  repo.create_tag
+	  console.set_title(SCRIPT_NAME, "#{repo.name} Update master branch")
+	  if repo.name == 'gemini-web-container'
+		repo.update_master_branch(args[:gemini_new_version], accumulate_versions)
+	  else
+		repo.update_master_branch(args[:new_version], accumulate_versions)
+	  end
+	end
+	accumulate_versions = (repo.versions).merge(accumulate_versions)
+  end
+
+  console.set_title(SCRIPT_NAME, "Push?")
+
+  if !DRY_RUN
+	puts 'Execution Time: ' + Time.at(Time.new - start_time).utc.strftime('%R:%S')
+	puts ''
+
+	print 'Do you want to push? (y/n) '
+	commit_ok = STDIN.gets.chomp
+	if commit_ok =~ /y.*/
+	  ALL_REPOS.each do |repo|
+		console.set_title(SCRIPT_NAME, "#{repo.name} Push")
+		if repo.name == 'gemini-web-container'
+		  repo.push(args[:gemini_new_version])
+		else
+		  repo.push(args[:new_version])
+		end
+	  end
+	end
+  end
+
+  console.clear_title
+
+rescue
+  console.set_title(SCRIPT_NAME, "Error")
+end
+
diff --git a/packaging/scripts/ripplor/options.rb b/packaging/scripts/ripplor/options.rb
new file mode 100644
index 0000000..8d0e5d1
--- /dev/null
+++ b/packaging/scripts/ripplor/options.rb
@@ -0,0 +1,61 @@
+require "rubygems"
+require "choice"
+require "etc"
+
+Choice.options do
+
+  header('')
+  header('Required arguments:')
+
+  option :start_repo, :required => true do
+    short('-r')
+    long('--repo=REPO')
+    desc('The name of the starting repo')
+  end
+
+  separator('')
+  separator('Optional arguments:')
+
+  option :build_version, :required => false do
+    short('-b')
+    long('--virgo-build-version=VIRGO-BUILD-VERSION')
+    validate(/\d(.\d(.\d(.([\w_-])+)?)?)?/)
+    desc('The version to update Virgo Build to')
+  end
+
+  option :version, :required => false do
+    short('-v')
+    long('--version=VARIABLE:VERSION[,...]')
+    validate(/.*:.*(,.*:.*)*/)
+    desc('Versions to substitute during the ripple')
+  end
+
+  option :repository_map, :required => false do
+    short('-m')
+    long('--map=REPO-MAP')
+    default('~/repository.map')
+    desc('The property file containing a mapping from a repository name to a location')
+    desc('(defaults to ~/repository.map)')
+  end
+
+  option :remote_user, :required => false do
+   short('-u')
+   long('--remote-user=REMOTE-USER')
+   default(Etc.getlogin)
+   desc('User id to use for remote repository access')
+  end
+  
+  option :branch_name, :required => false do
+   short('-c')
+   long('--branch=BRANCH-NAME')
+   default('master')
+   desc('The branch to be rippled')
+   desc('(defaults to master)')
+  end
+   
+  option :dryrun?, :required => false do
+   long('--dry-run')
+   desc('Show what would happen but do not actually do anything')
+  end
+   
+end
diff --git a/packaging/scripts/ripplor/ripplor.rb b/packaging/scripts/ripplor/ripplor.rb
new file mode 100755
index 0000000..bd0f889
--- /dev/null
+++ b/packaging/scripts/ripplor/ripplor.rb
@@ -0,0 +1,118 @@
+#!/usr/bin/env ruby -KU
+$LOAD_PATH << File.expand_path(File.dirname(__FILE__))
+$LOAD_PATH << File.expand_path(File.dirname(__FILE__) + '/../lib')
+
+require 'repository'
+require 'options'
+require 'console'
+
+args = Choice.choices
+SCRIPT_NAME = "ripplor"
+
+DRY_RUN = args[:dryrun?].nil? ? false : true
+puts "This is a dry run..." if DRY_RUN
+
+if File.exist?(File.expand_path(args[:repository_map]))
+  paths = Hash.new
+  IO.foreach(File.expand_path(args[:repository_map])) do |line|
+	paths[$1.strip] = $2.strip if line =~ /([^=]*)=(.*)/
+  end
+else
+  paths = {
+	'util' => 'util',
+	'test' => 'test',
+	'medic' => 'medic',
+	'nano' => 'nano',
+	'artifact-repository' => 'artifact-repository',
+	'kernel' => 'kernel',
+	'kernel-tools' => 'kernel-tools',
+	'web' => 'web',
+	'snaps' => 'snaps',
+	'apps' => 'apps',
+	'documentation' => 'documentation',
+    'packaging' => 'packaging'  
+  }
+end
+
+eclipse_repo_root = 'ssh://' + args[:remote_user] + '@git.eclipse.org/gitroot/virgo/org.eclipse.virgo.'
+ripple_branch = args[:branch_name]
+
+ALL_REPOS = [
+  Repository.new(eclipse_repo_root, 'util',					paths['util'],					'org.eclipse.virgo.util',				nil, ripple_branch),
+  Repository.new(eclipse_repo_root, 'test',					paths['test'],					'org.eclipse.virgo.test',				nil, ripple_branch),
+  Repository.new(eclipse_repo_root, 'medic',				paths['medic'],					'org.eclipse.virgo.medic',				nil, ripple_branch),
+  Repository.new(eclipse_repo_root, 'nano',					paths['nano'],					'org.eclipse.virgo.nano',				nil, ripple_branch),
+  Repository.new(eclipse_repo_root, 'artifact-repository',	paths['artifact-repository'],	'org.eclipse.virgo.repository',			nil, ripple_branch),
+  Repository.new(eclipse_repo_root, 'kernel',				paths['kernel'],				'org.eclipse.virgo.kernel',				nil, ripple_branch),
+  Repository.new(eclipse_repo_root, 'kernel-tools',			paths['kernel-tools'],			'org.eclipse.virgo.kernel-tools',		nil, ripple_branch),
+  Repository.new(eclipse_repo_root, 'web',					paths['web'],					'org.eclipse.virgo.web',				nil, ripple_branch),
+  Repository.new(eclipse_repo_root, 'snaps',				paths['snaps'],					'org.eclipse.virgo.snaps',				nil, ripple_branch, 'clean clean-integration test package publish-ivy publish-build'),
+  Repository.new(eclipse_repo_root, 'apps',					paths['apps'],					'org.eclipse.virgo.apps',				nil, ripple_branch),
+  Repository.new(eclipse_repo_root, 'documentation',		paths['documentation'],			'org.eclipse.virgo.documentation',		nil, ripple_branch, 'clean clean-integration doc-html publish-ivy'),
+  Repository.new(eclipse_repo_root, 'packaging',			paths['packaging'],             'org.eclipse.virgo.packaging',			nil, ripple_branch, 'clean clean-integration test package smoke-test publish-ivy publish-packages-build')
+]
+
+repos = Array.new
+repo_found = false
+ALL_REPOS.each do |repo|
+  if repo_found || repo.name == args[:start_repo]
+	repos << repo
+	repo_found = true
+  end
+end
+
+log_file=File.expand_path('./ripple.log')
+start_time = Time.new
+
+versions = Hash.new
+if !args[:version].nil?
+  args[:version].split(",").each do |v|
+	versions[$1.strip] = $2.strip if v =~ /(.*):(.*)/
+  end
+end
+
+console = Console.new
+
+begin
+
+  repos.each do |repo|
+	puts 'Rippling ' + repo.name
+	puts '	checkout with "' + repo.clone_command + '"' if DRY_RUN
+	console.set_title(SCRIPT_NAME, "#{repo.name} Checkout")
+	repo.checkout if !DRY_RUN
+	if !DRY_RUN && repo.name == args[:start_repo]
+		puts '  Cleaning the Ivy Cache'
+        system('ant -f ' + repo.path + '/build-*/build.xml clean-all-integration clean-ivy >> ' + log_file)
+	end
+	puts '	update_versions ...' if DRY_RUN
+	console.set_title(SCRIPT_NAME, "#{repo.name} Update")
+	repo.update_versions(versions) if !DRY_RUN
+	if !args[:build_version].nil?
+	  repo.update_virgo_build(args[:build_version]) if !DRY_RUN
+	end
+	puts '	build with user: ' + args[:remote_user] + ' and TARGETS: ' + repo.targets if DRY_RUN
+	console.set_title(SCRIPT_NAME, "#{repo.name} Build")
+	repo.build(args[:remote_user], log_file) if !DRY_RUN
+	versions.merge!(repo.versions) if !DRY_RUN
+  end
+
+  console.set_title(SCRIPT_NAME, "Push?")
+
+  if !DRY_RUN
+	puts 'Execution Time: ' + Time.at(Time.new - start_time).utc.strftime('%R:%S')
+
+	print 'Do you want to push? (y/n) '
+	commit_ok = STDIN.gets.chomp
+	if commit_ok =~ /y.*/
+	  repos.each do |repo|
+		console.set_title(SCRIPT_NAME, "#{repo.name} Push")
+		repo.push
+	  end
+	end
+  end
+
+  console.clear_title
+
+rescue
+  console.set_title(SCRIPT_NAME, "Error")
+end
diff --git a/packaging/scripts/update-dependency.rb b/packaging/scripts/update-dependency.rb
new file mode 100755
index 0000000..f4ff1e2
--- /dev/null
+++ b/packaging/scripts/update-dependency.rb
@@ -0,0 +1,30 @@
+#!/usr/bin/env ruby -wKU
+$LOAD_PATH << File.expand_path(File.dirname(__FILE__))
+
+require 'rubygems'
+require 'choice'
+require 'lib/version'
+require 'fileutils'
+
+Choice.options do
+
+  header('')
+  header('Required arguments:')
+
+  option :variable, :required => true do
+    short('-v')
+    long('--variable=VARIABLE')
+    desc('The variable name to update')
+  end
+
+  option :new_version, :required => true do
+    short('-n')
+    long('--new-version=NEW-VERSION')
+    validate(/\d(.\d(.\d(.([\w_-])+)?)?)?/)
+    desc('The version to update to')
+  end
+
+end
+
+args = Choice.choices
+Version.update(args[:variable], args[:new_version], FileUtils.pwd, true)
diff --git a/packaging/scripts/update-virgo-build.rb b/packaging/scripts/update-virgo-build.rb
new file mode 100755
index 0000000..ca0af9c
--- /dev/null
+++ b/packaging/scripts/update-virgo-build.rb
@@ -0,0 +1,45 @@
+#!/usr/bin/env ruby -wKU
+$LOAD_PATH << File.expand_path(File.dirname(__FILE__))
+
+require "rubygems"
+require "choice"
+require "etc"
+
+Choice.options do
+
+  header('')
+  header('Required arguments:')
+
+  option :new_version, :required => true do
+    short('-n')
+    long('--new-version=NEW-VERSION')
+    validate(/\d(.\d(.\d(.([\w_-])+)?)?)?/)
+    desc('The version to update to')
+  end
+  
+end
+
+puts 'Updating to Virgo-Build version \'' + Choice.choices[:new_version] + '\''
+
+def execute(command)
+  output = `#{command}`
+  if $?.to_i != 0
+    abort('Execution Failed, aborted.')
+  end
+  output
+end
+
+def do_update(path, new_version)
+  puts '  Updating to Virgo Build version \'' + new_version + '\''
+  Dir.chdir(path)
+  execute("git submodule update --init")
+  Dir.chdir(path + "/virgo-build")
+  execute("git pull origin master:master ")
+  execute("git fetch --tags")
+  execute("git checkout " + new_version)
+  Dir.chdir(path)
+  execute('git commit --allow-empty -a -m "[UPDATE BUILDLOR] Updated Virgo Build to \'' + new_version + '\'"')
+end
+
+do_update(Dir.pwd, Choice.choices[:new_version])
+
diff --git a/packaging/scripts/virgo-build-updatlor/options.rb b/packaging/scripts/virgo-build-updatlor/options.rb
new file mode 100644
index 0000000..32f14f2
--- /dev/null
+++ b/packaging/scripts/virgo-build-updatlor/options.rb
@@ -0,0 +1,51 @@
+require "rubygems"
+require "choice"
+require "etc"
+
+Choice.options do
+
+  header('')
+  header('Required arguments:')
+
+  option :build_version, :required => true do
+    short('-b')
+    long('--virgo-build-version=VIRGO-BUILD-VERSION')
+    validate(/\d(.\d(.\d(.([\w_-])+)?)?)?/)
+    desc('The version to update Virgo Build to')
+  end
+  
+  separator('')
+  separator('Optional arguments:')
+  
+  option :remote_user, :required => false do
+    short('-u')
+    long('--remote-user=REMOTE-USER')
+    default(Etc.getlogin)
+    desc('User id to use for remote repository access')
+  end
+  
+  option :repository_map, :required => false do
+    short('-m')
+    long('--map=REPOSITORY-MAP')
+    default('~/repository.map')
+    desc('The property file containing a mapping from a repository name to a location')
+    desc('(defaults to ~/repository.map)')
+  end
+  
+  option :branch_name, :required => false do
+   short('-c')
+   long('--branch=BRANCH-NAME')
+   default('master')
+   desc('The branch to be updated')
+   desc('(defaults to master)')
+  end
+
+  option :gemini_branch_name, :required => false do
+   short('-d')
+   long('--gemini-branch=BRANCH-NAME')
+   default('master')
+   desc('The Gemini Web branch to be updated')
+   desc('(defaults to master)')
+  end
+   
+end
diff --git a/packaging/scripts/virgo-build-updatlor/update-virgo-build-all.rb b/packaging/scripts/virgo-build-updatlor/update-virgo-build-all.rb
new file mode 100755
index 0000000..464603c
--- /dev/null
+++ b/packaging/scripts/virgo-build-updatlor/update-virgo-build-all.rb
@@ -0,0 +1,101 @@
+#!/usr/bin/env ruby -wKU
+$LOAD_PATH << File.expand_path(File.dirname(__FILE__))
+$LOAD_PATH << File.expand_path(File.dirname(__FILE__) + '/../lib')
+
+require 'repository'
+require "rubygems"
+require "etc"
+
+require 'options'
+
+args = Choice.choices
+
+if File.exist?(File.expand_path(args[:repository_map]))
+  paths = Hash.new
+  IO.foreach(File.expand_path(args[:repository_map])) do |line|
+    paths[$1.strip] = $2.strip if line =~ /([^=]*)=(.*)/
+  end
+else
+  paths = {
+    'eclipse-mirror' => 'eclipse-mirror',
+    'util' => 'util',
+    'test' => 'test',
+    'medic' => 'medic',
+    'nano' => 'nano',
+    'artifact-repository' => 'artifact-repository',
+    'kernel' => 'kernel',
+    'kernel-tools' => 'kernel-tools',
+    'web' => 'web',
+    'snaps' => 'snaps',
+    'apps' => 'apps',
+    'documentation' => 'documentation',
+    'packaging' => 'packaging',
+    'performance-test' => 'performance-test',
+    'system-verification-tests' => 'system-verification-tests',
+    'kernel-system-verification-tests' => 'kernel-system-verification-tests',
+    'samples' => 'samples'
+  }
+end
+
+update_branch = args[:branch_name]
+gemini_update_branch = args[:gemini_branch_name]
+
+local_repo_root = 'git@git.springsource.org:virgo/'
+virgo_repo_root = 'ssh://' + args[:remote_user] + '@git.eclipse.org/gitroot/virgo/org.eclipse.virgo.'
+gemini_web_repo_root = 'ssh://' + args[:remote_user] + '@git.eclipse.org/gitroot/gemini.web/org.eclipse.gemini.web.'
+
+VIRGO_PERMISSION_REPOS = [
+  Repository.new(virgo_repo_root, 'samples',                            paths['samples'],                           nil, nil, update_branch),
+  Repository.new(virgo_repo_root, 'packaging',                          paths['packaging'],                         nil, nil, update_branch),
+  Repository.new(virgo_repo_root, 'documentation',                      paths['documentation'],                     nil, nil, update_branch),
+  Repository.new(virgo_repo_root, 'apps',                               paths['apps'],                              nil, nil, update_branch),
+  Repository.new(virgo_repo_root, 'snaps',                              paths['snaps'],                             nil, nil, update_branch),
+  Repository.new(virgo_repo_root, 'web',                                paths['web'],                               nil, nil, update_branch),
+  Repository.new(virgo_repo_root, 'kernel',                             paths['kernel'],                            nil, nil, update_branch),
+  Repository.new(virgo_repo_root, 'artifact-repository',                paths['artifact-repository'],               nil, nil, update_branch),
+  Repository.new(virgo_repo_root, 'nano',                               paths['nano'],                              nil, nil, update_branch),
+  Repository.new(virgo_repo_root, 'medic',                              paths['medic'],                             nil, nil, update_branch),
+  Repository.new(virgo_repo_root, 'test',                               paths['test'],                              nil, nil, update_branch),
+  Repository.new(virgo_repo_root, 'util',                               paths['util'],                              nil, nil, update_branch),
+  Repository.new(virgo_repo_root, 'eclipse-mirror',                     paths['eclipse-mirror'],                    nil, nil, update_branch),
+  Repository.new(virgo_repo_root, 'performance-test',                   paths['performance-test'],                  nil, nil, update_branch),
+  Repository.new(virgo_repo_root, 'system-verification-tests',          paths['system-verification-tests'],         nil, nil, update_branch),
+  Repository.new(virgo_repo_root, 'kernel-system-verification-tests',   paths['kernel-system-verification-tests'],  nil, nil, update_branch),
+  Repository.new(virgo_repo_root, 'kernel-tools',                       paths['kernel-tools'],                      nil, nil, update_branch)
+]
+
+ 
+ALL_REPOS = VIRGO_PERMISSION_REPOS
+
+start_time = Time.new
+
+ALL_REPOS.each do |repo|
+  puts 'Updating ' + repo.name
+  puts '  Checkout with "' + repo.clone_command + '"' 
+  repo.checkout
+  repo.update_virgo_build(args[:build_version])
+  puts ''
+end
+
+puts 'Execution Time: ' + Time.at(Time.new - start_time).utc.strftime('%R:%S')
+
+print 'Do you want to push? (y/n) '
+commit_ok = STDIN.gets.chomp
+if commit_ok =~ /y.*/
+  ALL_REPOS.each do |repo|
+    begin
+      if repo.name == 'gemini-web-container'
+        repo.push(args[:gemini_branch_name])
+      else
+        repo.push(args[:branch_name])
+      end
+    rescue SystemExit
+      if VIRGO_PERMISSION_REPOS.include?(repo)
+        abort("\nFATAL: Push failed for #{repo.name}")
+      end
+      puts "\nWARNING: Push failed for #{repo.name}"
+    end
+  end
+end
+
+
diff --git a/packaging/scripts/virgo-forker/fork.rb b/packaging/scripts/virgo-forker/fork.rb
new file mode 100755
index 0000000..1f35db1
--- /dev/null
+++ b/packaging/scripts/virgo-forker/fork.rb
@@ -0,0 +1,88 @@
+#!/usr/bin/env ruby -wKU
+$LOAD_PATH << File.expand_path(File.dirname(__FILE__))
+$LOAD_PATH << File.expand_path(File.dirname(__FILE__) + '/../lib')
+
+require 'repository'
+require "rubygems"
+require "etc"
+
+require 'options'
+
+args = Choice.choices
+
+if File.exist?(File.expand_path(args[:repository_map]))
+  paths = Hash.new
+  IO.foreach(File.expand_path(args[:repository_map])) do |line|
+    paths[$1.strip] = $2.strip if line =~ /([^=]*)=(.*)/
+  end
+else
+  paths = {
+      'eclipse-mirror' => 'eclipse-mirror',
+      'util' => 'util',
+      'test' => 'test',
+      'medic' => 'medic',
+      'nano' => 'nano',
+      'artifact-repository' => 'artifact-repository',
+      'kernel' => 'kernel',
+      'kernel-tools' => 'kernel-tools',
+      'web' => 'web',
+      'snaps' => 'snaps',
+      'apps' => 'apps',
+      'documentation' => 'documentation',
+      'packaging' => 'packaging'  
+  }
+end
+
+update_branch = args[:from_branch]
+
+local_repo_root = 'git@git.springsource.org:virgo/'
+virgo_repo_root = 'ssh://' + args[:remote_user] + '@git.eclipse.org/gitroot/virgo/org.eclipse.virgo.'
+
+ALL_REPOS = [
+  Repository.new(virgo_repo_root, 'packaging',                             paths['packaging'],                       nil, nil, update_branch),
+  Repository.new(virgo_repo_root, 'documentation',                         paths['documentation'],                    nil, nil, update_branch),
+  Repository.new(virgo_repo_root, 'apps',                                  paths['apps'],                             nil, nil, update_branch),
+  Repository.new(virgo_repo_root, 'snaps',                                 paths['snaps'],                            nil, nil, update_branch),
+  Repository.new(virgo_repo_root, 'web',                                   paths['web'],                              nil, nil, update_branch),
+  Repository.new(virgo_repo_root, 'kernel-tools',                          paths['kernel-tools'],                     nil, nil, update_branch),
+  Repository.new(virgo_repo_root, 'kernel',                                paths['kernel'],                           nil, nil, update_branch),
+  Repository.new(virgo_repo_root, 'nano',                                  paths['nano'],                             nil, nil, update_branch),
+  Repository.new(virgo_repo_root, 'artifact-repository',                   paths['artifact-repository'],              nil, nil, update_branch),
+  Repository.new(virgo_repo_root, 'medic',                                 paths['medic'],                            nil, nil, update_branch),
+  Repository.new(virgo_repo_root, 'test',                                  paths['test'],                             nil, nil, update_branch),
+  Repository.new(virgo_repo_root, 'util',                                  paths['util'],                             nil, nil, update_branch),
+  Repository.new(virgo_repo_root, 'eclipse-mirror',                        paths['eclipse-mirror'],                   nil, nil, update_branch)
+]
+
+
+to_branch = args[:to_branch]
+
+start_time = Time.new
+
+ALL_REPOS.each do |repo|
+  puts 'Repo: ' + repo.name
+  puts '  Checkout with "' + repo.clone_command + '"' 
+  repo.checkout(true)
+  repo.fork(to_branch)
+  puts ''
+end
+
+puts 'Execution Time: ' + Time.at(Time.new - start_time).utc.strftime('%R:%S')
+
+print 'Do you want to push? (y/n) '
+commit_ok = STDIN.gets.chomp
+if commit_ok =~ /y.*/
+  ALL_REPOS.each do |repo|
+    begin
+      repo.push_fork(to_branch)
+      puts ''
+    rescue SystemExit
+      if VIRGO_PERMISSION_REPOS.include?(repo)
+        abort("\nFATAL: Push failed for #{repo.name}")
+      end
+      puts "\nWARNING: Push failed for #{repo.name}"
+    end
+  end
+end
+
+
diff --git a/packaging/scripts/virgo-forker/options.rb b/packaging/scripts/virgo-forker/options.rb
new file mode 100644
index 0000000..8dd4ecf
--- /dev/null
+++ b/packaging/scripts/virgo-forker/options.rb
@@ -0,0 +1,41 @@
+require "rubygems"
+require "choice"
+require "etc"
+
+Choice.options do
+
+  header('')
+  header('Required arguments:')
+
+  option :to_branch, :required => true do
+    short('-t')
+    long('--to-branch=TO-BRANCH')
+    desc('Branch to fork to')
+  end
+  
+  separator('')
+  separator('Optional arguments:')
+  
+  option :remote_user, :required => false do
+    short('-u')
+    long('--remote-user=REMOTE-USER')
+    default(Etc.getlogin)
+    desc('User id to use for remote repository access')
+  end
+  
+  option :from_branch, :required => false do
+    short('-f')
+    long('--from-branch=FROM-BRANCH')
+    default('master')
+    desc('Branch to fork from')
+  end
+  
+  option :repository_map, :required => false do
+    short('-m')
+    long('--map=REPOSITORY-MAP')
+    default('~/repository.map')
+    desc('The property file containing a mapping from a repository name to a location')
+    desc('(defaults to ~/repository.map)')
+  end
+  
+end
diff --git a/packaging/scripts/virgo-version-updater/options.rb b/packaging/scripts/virgo-version-updater/options.rb
new file mode 100644
index 0000000..6d2c8f4
--- /dev/null
+++ b/packaging/scripts/virgo-version-updater/options.rb
@@ -0,0 +1,41 @@
+require "rubygems"
+require "choice"
+require "etc"
+
+Choice.options do
+
+  header('')
+  header('Required arguments:')
+
+  option :new_version, :required => true do
+    short('-n')
+    long('--new-version=NEW-VERSION')
+    desc('New version to set')
+  end
+  
+  separator('')
+  separator('Optional arguments:')
+  
+  option :remote_user, :required => false do
+    short('-u')
+    long('--remote-user=REMOTE-USER')
+    default(Etc.getlogin)
+    desc('User id to use for remote repository access')
+  end
+  
+  option :branch, :required => false do
+    short('-f')
+    long('--branch=BRANCH')
+    default('master')
+    desc('Branch to update')
+  end
+  
+  option :repository_map, :required => false do
+    short('-m')
+    long('--map=REPOSITORY-MAP')
+    default('~/repository.map')
+    desc('The property file containing a mapping from a repository name to a location')
+    desc('(defaults to ~/repository.map)')
+  end
+  
+end
diff --git a/packaging/scripts/virgo-version-updater/versionor.rb b/packaging/scripts/virgo-version-updater/versionor.rb
new file mode 100755
index 0000000..81e229d
--- /dev/null
+++ b/packaging/scripts/virgo-version-updater/versionor.rb
@@ -0,0 +1,88 @@
+#!/usr/bin/env ruby -wKU
+$LOAD_PATH << File.expand_path(File.dirname(__FILE__))
+$LOAD_PATH << File.expand_path(File.dirname(__FILE__) + '/../lib')
+
+require 'repository'
+require "rubygems"
+require "etc"
+
+require 'options'
+
+args = Choice.choices
+
+if File.exist?(File.expand_path(args[:repository_map]))
+  paths = Hash.new
+  IO.foreach(File.expand_path(args[:repository_map])) do |line|
+    paths[$1.strip] = $2.strip if line =~ /([^=]*)=(.*)/
+  end
+else
+  paths = {
+      'eclipse-mirror' => 'eclipse-mirror',
+      'util' => 'util',
+      'test' => 'test',
+      'medic' => 'medic',
+      'nano' => 'nano',
+      'artifact-repository' => 'artifact-repository',
+      'kernel' => 'kernel',
+      'kernel-tools' => 'kernel-tools',
+      'web' => 'web',
+      'snaps' => 'snaps',
+      'apps' => 'apps',
+      'documentation' => 'documentation',
+      'packaging' => 'packaging'  
+  }
+end
+
+update_branch = args[:branch]
+
+local_repo_root = 'git@git.springsource.org:virgo/'
+virgo_repo_root = 'ssh://' + args[:remote_user] + '@git.eclipse.org/gitroot/virgo/org.eclipse.virgo.'
+
+ALL_REPOS = [
+  Repository.new(virgo_repo_root, 'packaging',                             paths['packaging'],                        nil, nil, update_branch),
+  Repository.new(virgo_repo_root, 'documentation',                         paths['documentation'],                    nil, nil, update_branch),
+  Repository.new(virgo_repo_root, 'apps',                                  paths['apps'],                             nil, nil, update_branch),
+  Repository.new(virgo_repo_root, 'snaps',                                 paths['snaps'],                            nil, nil, update_branch),
+  Repository.new(virgo_repo_root, 'web',                                   paths['web'],                              nil, nil, update_branch),
+  Repository.new(virgo_repo_root, 'kernel-tools',                          paths['kernel-tools'],                     nil, nil, update_branch),
+  Repository.new(virgo_repo_root, 'kernel',                                paths['kernel'],                           nil, nil, update_branch),
+  Repository.new(virgo_repo_root, 'nano',                                  paths['nano'],                             nil, nil, update_branch),
+  Repository.new(virgo_repo_root, 'artifact-repository',                   paths['artifact-repository'],              nil, nil, update_branch),
+  Repository.new(virgo_repo_root, 'medic',                                 paths['medic'],                            nil, nil, update_branch),
+  Repository.new(virgo_repo_root, 'test',                                  paths['test'],                             nil, nil, update_branch),
+  Repository.new(virgo_repo_root, 'util',                                  paths['util'],                             nil, nil, update_branch),
+  Repository.new(virgo_repo_root, 'eclipse-mirror',                        paths['eclipse-mirror'],                   nil, nil, update_branch)
+]
+
+
+new_version = args[:new_version]
+
+start_time = Time.new
+
+ALL_REPOS.each do |repo|
+  puts 'Repo: ' + repo.name
+  puts '  Checkout with "' + repo.clone_command + '"' 
+  repo.checkout(true)
+  repo.update_version(new_version)
+  puts ''
+end
+
+puts 'Execution Time: ' + Time.at(Time.new - start_time).utc.strftime('%R:%S')
+
+print 'Do you want to push? (y/n) '
+commit_ok = STDIN.gets.chomp
+if commit_ok =~ /y.*/
+  ALL_REPOS.each do |repo|
+    begin
+      repo.push(new_version)
+      puts ''
+    rescue SystemExit
+      if VIRGO_PERMISSION_REPOS.include?(repo)
+        abort("\nFATAL: Push failed for #{repo.name}")
+      end
+      puts "\nWARNING: Push failed for #{repo.name}"
+    end
+  end
+end
+
+
diff --git a/packaging/tomcat-server/build.gradle b/packaging/tomcat-server/build.gradle
new file mode 100644
index 0000000..c321bf9
--- /dev/null
+++ b/packaging/tomcat-server/build.gradle
@@ -0,0 +1,79 @@
+import org.apache.tools.ant.filters.ReplaceTokens
+
+import static virgobuild.VirgoToolsPlugin.installProduct
+import static virgobuild.VirgoToolsPlugin.publishProduct
+
+apply plugin: 'distribution'
+
+distributions {
+    main {
+        baseName = 'virgo-tomcat-server'
+        contents {
+            from ( 'src/main/filtered' ) {
+                include ( '**/*.properties' )
+                include ( '**/.version' )
+                filter(ReplaceTokens, tokens: tokenMap) // tokens are used in e.g. oev.kernel.userregion.properties
+            }
+            from ( 'src/main/filtered' ) {
+                include ( 'bin/*.sh' )
+                fileMode 0755
+            }
+            from ( 'src/main/filtered' ) {
+                include ( '**/*.libd' )
+                filter(ReplaceTokens, tokens: tokenMap)
+            }
+            from ( "${buildDir}/VTS/tomcat-server/" ) { exclude ( 'Eclipse.app' ) }
+            from ( "${buildDir}/common_resources/" )
+        }
+    }
+}
+
+task ('assembleTomcatServer', dependsOn: [
+    'installProductTomcatServer',
+    'packageResourcesAndProducts'
+]) {
+    installDist.dependsOn(['assembleTomcatServer'])
+    distZip.dependsOn(['assembleTomcatServer'])
+}
+
+task ('packageResourcesAndProducts', dependsOn: [
+    ':kernel:org.eclipse.virgo.kernel.equinox.extensions:jar',
+    ':kernel:org.eclipse.virgo.management.console:war',
+    ':nano:org.eclipse.virgo.nano.authentication:jar',
+    ':nano:org.eclipse.virgo.nano.shutdown:jar',
+    ':util:org.eclipse.virgo.util.env:jar',
+]) {
+    doLast {
+        packageConfiguration('lib', configurations.nanoLib, file("${buildDir}/common_resources/lib/"))
+        packageConfiguration('libPersistence', configurations.nanoLibPersistence, file("${buildDir}/common_resources/lib/persistence/"))
+        packageConfiguration('libEndorsed', configurations.nanoLibEndorsed, file("${buildDir}/common_resources/lib/endorsed/"))
+        packageConfiguration('pluginsExtras', configurations.kernelPluginsExtras, file("${buildDir}/common_resources/plugins/"))
+        packageConfiguration('repositoryExt', configurations.repositoryExt, file("${buildDir}/common_resources/repository/ext/"))
+        packageConfiguration('pickup', configurations.nanoPickup, file("${buildDir}/common_resources/pickup/"))
+    }
+}
+
+task ('publishTomcatServer', dependsOn: [
+    ':org.eclipse.virgo.site:publishBase',
+    ':org.eclipse.virgo.site:publishKernelBase',
+]) {
+    description = "Publishes a product to a p2 repository. The publishing uses ANY environment configurations."
+
+    def product = 'tomcat-server'
+    def productFileLocation = file("${projectDir}/publish_resources/products/${product}/${product}.product")
+    def javaProfileLocation = file("${projectDir}/src/main/dist/configuration/java-server.profile")
+
+    doLast() { publishProduct(project, productFileLocation, javaProfileLocation) }
+}
+
+task ('installProductTomcatServer', dependsOn: ['publishTomcatServer',]) {
+
+    description = "Installs a Virgo product to a desired destination. Default profile(roaming) is VIRGOProfile, the environment cofigurations are ANY."
+
+    def product = 'tomcat-server'
+    def shortProduct = 'VTS'
+    def destinationDir = file("${buildDir}/${shortProduct}/${product}")
+    def productIu = "${product}.product"
+
+    doLast() { installProduct(project, productIu, destinationDir) }
+}
diff --git a/packaging/tomcat-server/org.eclipse.virgo.tomcat.smoketest/.gitignore b/packaging/tomcat-server/org.eclipse.virgo.tomcat.smoketest/.gitignore
new file mode 100644
index 0000000..fe99505
--- /dev/null
+++ b/packaging/tomcat-server/org.eclipse.virgo.tomcat.smoketest/.gitignore
@@ -0,0 +1,2 @@
+bin
+
diff --git a/packaging/tomcat-server/org.eclipse.virgo.tomcat.smoketest/src/smokeTest/java/org/eclipse/virgo/tomcat/smoketest/TomcatServerSmokeTests.java b/packaging/tomcat-server/org.eclipse.virgo.tomcat.smoketest/src/smokeTest/java/org/eclipse/virgo/tomcat/smoketest/TomcatServerSmokeTests.java
new file mode 100644
index 0000000..5b88ced
--- /dev/null
+++ b/packaging/tomcat-server/org.eclipse.virgo.tomcat.smoketest/src/smokeTest/java/org/eclipse/virgo/tomcat/smoketest/TomcatServerSmokeTests.java
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.tomcat.smoketest;
+
+import static org.apache.http.HttpStatus.SC_OK;
+import static org.eclipse.virgo.test.tools.UrlWaitLatch.waitFor;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.eclipse.virgo.test.tools.AbstractSmokeTests;
+import org.eclipse.virgo.test.tools.JmxUtils;
+import org.eclipse.virgo.test.tools.ServerUtils;
+import org.eclipse.virgo.test.tools.UrlWaitLatch;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class TomcatServerSmokeTests extends AbstractSmokeTests {
+
+    private static final String FORMTAGS_PAR = "formtags-par.par";
+
+    private static final String VIRGO_FLAVOR = "tomcat-server";
+
+    @Override
+    protected String getVirgoFlavor() {
+        return VIRGO_FLAVOR;
+    }
+
+    @BeforeClass
+    public static void initJmxConnection() {
+        JmxUtils.virgoHome = ServerUtils.getHome(VIRGO_FLAVOR);
+    }
+
+    @Test
+    public void tomcatServerShouldBeStarted() throws Exception {
+        assertTrue(JmxUtils.isKernelStarted());
+    }
+
+    @Test
+    public void splashScreenShouldBeAccessable() throws Exception {
+        assertEquals(SC_OK, waitFor("http://localhost:8080/"));
+    }
+
+    @Test
+    public void adminScreenShouldBeAccessableWithDefaultCredentials() {
+        assertEquals(SC_OK, waitFor("http://localhost:8080/admin/content", "admin", "admin"));
+    }
+
+    private static final String BASE_URL = "http://localhost:8080/formtags-par/";
+
+    @Test
+    public void testFormTagsListScreen() throws Exception {
+        deployTestBundles(VIRGO_FLAVOR, FORMTAGS_PAR);
+        UrlWaitLatch.waitFor(BASE_URL + "list.htm");
+        undeployTestBundles(VIRGO_FLAVOR, FORMTAGS_PAR);
+    }
+
+    @Test
+    public void testFormTagsFormScreen() throws Exception {
+        deployTestBundles(VIRGO_FLAVOR, FORMTAGS_PAR);
+        UrlWaitLatch.waitFor(BASE_URL + "form.htm?id=1");
+        undeployTestBundles(VIRGO_FLAVOR, FORMTAGS_PAR);
+    }
+
+}
diff --git a/packaging/tomcat-server/org.eclipse.virgo.tomcat.smoketest/src/smokeTest/resources/bundles/formtags-par.par b/packaging/tomcat-server/org.eclipse.virgo.tomcat.smoketest/src/smokeTest/resources/bundles/formtags-par.par
new file mode 100755
index 0000000..3a80a7e
--- /dev/null
+++ b/packaging/tomcat-server/org.eclipse.virgo.tomcat.smoketest/src/smokeTest/resources/bundles/formtags-par.par
Binary files differ
diff --git a/packaging/tomcat-server/publish_resources/products/tomcat-server/p2.inf b/packaging/tomcat-server/publish_resources/products/tomcat-server/p2.inf
new file mode 100644
index 0000000..4c6f109
--- /dev/null
+++ b/packaging/tomcat-server/publish_resources/products/tomcat-server/p2.inf
@@ -0,0 +1,18 @@
+###############################################################################
+# Copyright (c) 2011 SAP AG
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# and Apache License v2.0 which accompanies this distribution.
+# The Eclipse Public License is available at
+#   http://www.eclipse.org/legal/epl-v10.html
+# and the Apache License v2.0 is available at
+#   http://www.opensource.org/licenses/apache2.0.php.
+# You may elect to redistribute this code under either of these licenses.
+#
+# Contributors:
+#   Borislav Kapukaranov - initial contribution
+###############################################################################
+requires.0.name = kernel-base.product
+requires.0.namespace = org.eclipse.equinox.p2.iu
+requires.0.range = 0.0.0
diff --git a/packaging/tomcat-server/publish_resources/products/tomcat-server/tomcat-server.product b/packaging/tomcat-server/publish_resources/products/tomcat-server/tomcat-server.product
new file mode 100755
index 0000000..5f31a14
--- /dev/null
+++ b/packaging/tomcat-server/publish_resources/products/tomcat-server/tomcat-server.product
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<?pde version="3.5"?>

+

+<product name="Eclipse Virgo Kernel Product" uid="tomcat-server.product" version="1.0.0" useFeatures="true" includeLaunchers="false">

+

+   <configIni use="default">

+   </configIni>

+   

+   <vm>

+   </vm>

+

+   <plugins>

+   </plugins>

+

+   <features>

+   <!--

+      <feature id="org.eclipse.virgo.tomcat.resources" version="0.0.0"/>

+      <feature id="org.eclipse.virgo.scripts" version="0.0.0"/>

+	-->

+   </features>

+   

+   <configurations>

+		<property name="org.eclipse.gemini.web.tomcat.config.path" value="configuration/tomcat-server.xml"/>

+

+		<!-- TODO - move shared configuration to kernel-base? product? -->

+		<plugin id="org.apache.felix.gogo.command" autoStart="true"/>

+		<plugin id="org.apache.felix.gogo.runtime" autoStart="true"/>

+		<plugin id="org.apache.felix.gogo.shell" autoStart="true"/>

+		<plugin id="org.apache.mina.core" autoStart="true"/>

+		<plugin id="org.apache.sshd.core" autoStart="true"/>

+		<plugin id="org.eclipse.equinox.console" autoStart="true"/>

+		<plugin id="org.eclipse.equinox.console.ssh" autoStart="true"/>

+

+		<plugin id="org.eclipse.gemini.blueprint.extender" autoStart="true"/>

+		<plugin id="org.eclipse.gemini.management" autoStart="true"/>

+

+		<plugin id="org.eclipse.virgo.kernel.agent.dm" autoStart="true"/>

+		<plugin id="org.eclipse.virgo.kernel.artifact" autoStart="true"/>

+		<plugin id="org.eclipse.virgo.kernel.deployer" autoStart="true"/>

+		<plugin id="org.eclipse.virgo.kernel.model" autoStart="true"/>

+		<plugin id="org.eclipse.virgo.kernel.osgi" autoStart="true"/>

+		<plugin id="org.eclipse.virgo.kernel.services" autoStart="true"/>

+		<plugin id="org.eclipse.virgo.kernel.userregionfactory" autoStart="true"/>

+

+		<plugin id="org.eclipse.virgo.nano.core" autoStart="true"/>

+		<plugin id="org.eclipse.virgo.nano.management" autoStart="true"/>

+		<plugin id="org.eclipse.virgo.repository" autoStart="true"/>

+		<plugin id="" autoStart="true"/>

+	</configurations>

+

+</product>

diff --git a/packaging/tomcat-server/src/main/dist/About.html b/packaging/tomcat-server/src/main/dist/About.html
new file mode 100644
index 0000000..2f03cd7
--- /dev/null
+++ b/packaging/tomcat-server/src/main/dist/About.html
@@ -0,0 +1,81 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<!-- saved from url=(0047)http://www.eclipse.org/legal/epl/longabout.html -->
+<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+
+<TITLE>About</TITLE>
+</HEAD><BODY lang="EN-US">
+<H2>About This Content</H2>
+ 
+<P>13 December 2012</P>	
+<H3>License</H3>
+
+<P>The Eclipse Foundation makes available all content in this plug-in ("Content").  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL").  A copy of the EPL is available 
+at <A href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</A>.
+For purposes of the EPL, "Program" will mean the Content.</P>
+
+<P>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <A href="http://www.eclipse.org/">http://www.eclipse.org</A>.</P>
+
+		
+		<H3>Third Party Content</H3>
+		<P>The Content includes items that have been sourced from third parties as set out below. If you 
+		did not receive this Content directly from the Eclipse Foundation, the following is provided 
+		for informational purposes only, and you should look to the Redistributor's license for 
+		terms and conditions of use.</P>
+		
+		<h4>Kernel Third Party Content</h4>
+		<p>This is listed in the <a href="AboutKernel.html">Kernel's About file</a>.
+		
+		<h4>
+			<a href="about_files/apache-v20.txt">Apache License 2.0</a>
+		</h4>
+		This product contains software developed by the Apache Software Foundation (<a href="http://www.apache.org">http://www.apache.org</a>).
+		<ul>
+  			<li>
+				Apache Standard Taglibs 1.1.2.v20110517 - binary and source is available from the
+				<a href="http://tomcat.apache.org/taglibs/index.html">Apache Taglibs project</a>
+			</li>
+			<li>
+				Apache Tomcat 7.0.32 - binary and source is available from the
+				<a href="http://tomcat.apache.org/">Apache Tomcat project</a>
+			</li>
+			<li>
+				javax.mail 1.4.0 - binary and source available from the <a href="http://geronimo.apache.org/">Geronimo project</a>
+			</li>
+		</ul>
+		<h4>
+			<a href="about_files/cddl-10.txt">Common Development and Distribution License 1.0</a>
+		</h4>
+		<ul>
+			<li>
+				javax.ejb 3.1.1 - binary and source available from the <a href="http://glassfish.java.net/">Glassfish project</a> (Dual-licensed CDDL 1.0 or GPL 2. Virgo elects to use CDDL 1.0.)
+			</li>
+			<li>
+				javax.el 2.2.0 - binary and source available from the <a href="http://glassfish.java.net/">Glassfish project</a> (Dual-licensed CDDL 1.0 or GPL 2. Virgo elects to use CDDL 1.0.)
+			</li>
+			<li>
+				javax.jms 1.1.0 - binary and source available from the <a href="http://glassfish.java.net/">Glassfish project</a> (Dual-licensed CDDL 1.0 or GPL 2. Virgo elects to use CDDL 1.0.)
+			</li>
+			<li>
+				<!-- Note that the EBR states this JAR has an Apache license, but CQ 3940 says it has a CDDL license, so we assume the CQ is correct. -->
+				javax.portlet 2.0.0 - <a href="http://ebr.springsource.com/repository/app/bundle/version/download?name=com.springsource.javax.portlet&version=2.0.0.v20110525&type=binary">binary</a> and <a href="http://ebr.springsource.com/repository/app/bundle/version/download?name=com.springsource.javax.portlet&version=2.0.0.v20110525&type=source">source</a> is available from the SpringSource <a href="http://www.springsource.com/repository/app/">Enterprise Bundle Repository</a>
+			</li>
+			<li>
+				<!-- Refer to CQ 5019/4710 -->
+				javax.servlet.jsp 2.2.0 - <a href="http://ebr.springsource.com/repository/app/bundle/version/download?name=javax.servlet.jsp&version=2.2.0.v201103241009&type=binary">binary</a> and <a href="http://ebr.springsource.com/repository/app/bundle/version/download?name=javax.servlet.jsp&version=2.2.0.v201103241009&type=source">source</a> is available from the SpringSource <a href="http://www.springsource.com/repository/app/">Enterprise Bundle Repository</a>
+			</li>
+			<li>
+				javax.servlet.jsp.jstl 1.2.0 - <a href="http://ebr.springsource.com/repository/app/bundle/version/download?name=com.springsource.javax.servlet.jsp.jstl&version=1.2.0.v20110517&type=binary">binary</a> and <a href="http://ebr.springsource.com/repository/app/bundle/version/download?name=com.springsource.javax.servlet.jsp.jstl&version=1.2.0.v20110517&type=source">source</a> is available from the SpringSource <a href="http://www.springsource.com/repository/app/">Enterprise Bundle Repository</a> (Dual-licensed CDDL or Apache License 2.0. Virgo elects to use CDDL.)
+			</li>
+			<li>
+				javax.xml.rpc 1.1.0 - <a href="http://ebr.springsource.com/repository/app/bundle/version/download?name=com.springsource.javax.xml.rpc&version=1.1.0.v20110517&type=binary">binary</a> and <a href="http://ebr.springsource.com/repository/app/bundle/version/download?name=com.springsource.javax.xml.rpc&version=1.1.0.v20110517&type=source">source</a> is available from the SpringSource <a href="http://www.springsource.com/repository/app/">Enterprise Bundle Repository</a>
+			</li>
+		</ul>
+
+</BODY></HTML>
\ No newline at end of file
diff --git a/packaging/tomcat-server/src/main/dist/AboutKernel.html b/packaging/tomcat-server/src/main/dist/AboutKernel.html
new file mode 100644
index 0000000..6bc942a
--- /dev/null
+++ b/packaging/tomcat-server/src/main/dist/AboutKernel.html
@@ -0,0 +1,70 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<!-- saved from url=(0047)http://www.eclipse.org/legal/epl/longabout.html -->
+<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+
+<TITLE>About</TITLE>
+</HEAD><BODY lang="EN-US">
+<H2>About This Content</H2>
+ 
+<P>13 December 2012</P>	
+<H3>License</H3>
+
+<P>The Eclipse Foundation makes available all content in this plug-in ("Content").  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL").  A copy of the EPL is available 
+at <A href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</A>.
+For purposes of the EPL, "Program" will mean the Content.</P>
+
+<P>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <A href="http://www.eclipse.org/">http://www.eclipse.org</A>.</P>
+
+		
+		<H3>Third Party Content</H3>
+		<P>The Content includes items that have been sourced from third parties as set out below. If you 
+		did not receive this Content directly from the Eclipse Foundation, the following is provided 
+		for informational purposes only, and you should look to the Redistributor's license for 
+		terms and conditions of use.</P>
+
+		<h4>Nano Third Party Content</h4>
+		<p>This is listed in <a href="AboutNano.html">Nano's About file</a>.
+
+		
+		<h4>
+			<a href="about_files/apache-v20.txt">Apache License 2.0</a>
+		</h4>
+		This product contains software developed by the Apache Software Foundation (<a href="http://www.apache.org">http://www.apache.org</a>).
+		<ul>
+			<li>
+				Apache Commons Codec 1.3.0 - binary and source is available from the <a href="http://commons.apache.org/codec/">Apache Commons Codec project</a>
+			</li>
+			<li>
+				Apache HttpClient 3.1.0 - binary and source is available from the <a href="http://hc.apache.org/httpclient-3.x/">Apache HttpClient project</a>
+			</li>
+			<li>
+				Spring Framework 3.1.0.RELEASE - binary and source is available from the
+				<a href="http://www.springsource.com/download/community">Spring Framework project</a>
+			</li>
+		</ul>
+		<h4>
+			<a href="about_files/asm.txt">ASM License</a>
+		</h4>
+		<ul>
+			<li>
+				ASM 2.2.3 - binary and source is available from the <a href="http://asm.ow2.org/">ASM project</a>
+			</li>
+		</ul>
+		<h4>
+			<a href="http://en.wikipedia.org/wiki/Public_domain">Public Domain</a>
+		</h4>
+		<ul>
+			<li>
+				AOP Alliance 1.0.0 - binary and source is available from the
+				<a href="http://aopalliance.sourceforge.net/">AOP Alliance project</a>
+			</li>
+		</ul>
+
+</BODY></HTML>
\ No newline at end of file
diff --git a/packaging/tomcat-server/src/main/dist/AboutNano.html b/packaging/tomcat-server/src/main/dist/AboutNano.html
new file mode 100644
index 0000000..f1edaee
--- /dev/null
+++ b/packaging/tomcat-server/src/main/dist/AboutNano.html
@@ -0,0 +1,99 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<!-- saved from url=(0047)http://www.eclipse.org/legal/epl/longabout.html -->
+<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+
+<TITLE>About</TITLE>
+</HEAD><BODY lang="EN-US">
+<H2>About This Content</H2>
+ 
+<P>13 December 2012</P>	
+<H3>License</H3>
+
+<P>The Eclipse Foundation makes available all content in this plug-in ("Content").  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL").  A copy of the EPL is available 
+at <A href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</A>.
+For purposes of the EPL, "Program" will mean the Content.</P>
+
+<P>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <A href="http://www.eclipse.org/">http://www.eclipse.org</A>.</P>
+
+		
+		<H3>Third Party Content</H3>
+		<P>The Content includes items that have been sourced from third parties as set out below. If you 
+		did not receive this Content directly from the Eclipse Foundation, the following is provided 
+		for informational purposes only, and you should look to the Redistributor's license for 
+		terms and conditions of use.</P>
+		
+		<h4>
+			<a href="about_files/apache-v20.txt">Apache License 2.0</a>
+		</h4>
+		This product contains software developed by the Apache Software Foundation (<a href="http://www.apache.org">http://www.apache.org</a>).
+		<ul>
+			<li>
+				Apache Commons FileUpload 1.2.0 - binary and source are available from the <a href="http://commons.apache.org/fileupload/">Apache Commons FileUpload project</a>
+			</li>
+			<li>
+				Apache Commons IO 1.4.0 - binary and source are available from the <a href="http://commons.apache.org/io/">Apache Commons IO project</a>
+			</li>
+			<li>
+				Apache Felix Gogo 0.10.0 - binary and source is available from the <a href="http://felix.apache.org">Apache Felix project</a>
+			</li>
+			<li>
+				Apache MINA Core 2.0.2 - binary and source is available from the <a href="http://mina.apache.org/">Apache MINA project</a>
+			</li>
+			<li>
+				Apache MINA SSHD Core 0.5.0 - binary and source is available from the <a href="http://mina.apache.org/">Apache MINA project</a>
+			</li>
+			<li>
+				javax.transaction 1.1.1 - binary and source are available from the <a href="http://geronimo.apache.org/">Apache Geronimo project</a>
+			</li>
+			<li>
+				Jolokia OSGi 1.0.2 - binary and source are available from the <a href="http://www.jolokia.org/">Jolokia project</a>
+			</li>
+			<li>
+				OSGi Enterprise 4.2 - binary and source are available from the <a href="https://www.osgi.org/members/Release42/HomePage">OSGi Alliance</a>
+			</li>
+		</ul>
+		<h4>
+			<a href="about_files/LICENSE-AspectJ.html">AspectJ License</a>
+		</h4>
+		<ul>
+			<li>
+				AspectJ Weaver 1.6.12 - binary and source is available from the <a href="http://eclipse.org/aspectj">AspectJ project</a>
+			</li>
+		</ul>
+		<h4>
+			<a href="about_files/cddl-10.txt">Common Development and Distribution License 1.0</a>
+		</h4>
+		<ul>
+			<li>
+				javax.annotation 1.1.0 - binary and source is available from the
+				<a href="http://glassfish.java.net/">GlassFish Project</a> (Dual-licensed CDDL 1.0 or GPL 2. Virgo elects to use CDDL 1.0.)
+			</li>
+		</ul>
+
+		<h4>
+			<a href="epl-v10.html">Eclipse Public License 1.0</a>
+		</h4>
+		<ul>
+			<li>
+				Logback 1.0.7 - binary and source is available from the
+				<a href="http://logback.qos.ch/">Logback project</a> (Dual-licensed EPL or LGPL. Virgo elects to use EPL.)
+			</li>
+		</ul>
+		<h4>
+			<a href="about_files/slf4j.txt">SLF4J License</a>
+		</h4>
+		<ul>
+			<li>
+				Simple Logging Facade for Java (SLF4J) 1.7.2 - binary and source is available from the
+				<a href="http://www.slf4j.org/">SLF4J Project</a>
+			</li>
+		</ul>
+
+</BODY></HTML>
\ No newline at end of file
diff --git a/packaging/tomcat-server/src/main/dist/about_files/LICENSE-AspectJ.html b/packaging/tomcat-server/src/main/dist/about_files/LICENSE-AspectJ.html
new file mode 100644
index 0000000..8f7d0a4
--- /dev/null
+++ b/packaging/tomcat-server/src/main/dist/about_files/LICENSE-AspectJ.html
@@ -0,0 +1,91 @@
+<html>
+
+<head>
+<title>AspectJ License</title>
+
+
+</head>
+
+<BODY BGCOLOR="white">
+
+<h2 align="center"><b>AspectJ<sup><small>TM</small></sup>
+                      Compiler and Core Tools License</b></h2>
+
+<p>This is a binary-only release.&nbsp; Source code
+is available from
+<a href="http://eclipse.org/aspectj">http://eclipse.org/aspectj</a></p>
+
+<p>The Eclipse Foundation makes available all content in this distribution ("Content").  
+		Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
+		Eclipse Public License Version 1.0 ("EPL").  A copy of the EPL is available 
+		at <a href="../../org/documents/epl-v10.php">http://www.eclipse.org/legal/epl-v10.html</a>.
+		For purposes of the EPL, "Program" will mean the Content.</p>
+
+		<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+		being redistributed by another party ("Redistributor") and different terms and conditions may
+		apply to your use of any object code in the Content.  Check the Redistributor's license 
+		that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+		indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+		and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+		
+		<h3>Third Party Content</h3>
+		<p>The Content includes items that have been sourced from third parties as set out below. If you 
+		did not receive this Content directly from the Eclipse Foundation, the following is provided 
+		for informational purposes only, and you should look to the Redistributor?s license for 
+		terms and conditions of use.</p>
+		<em>
+
+		<h4>BCEL v5.1</h4>
+		<p>This product contains software developed by the
+         Apache Software Foundation (<a href="http://www.apache.org/">http://www.apache.org</a>).</p>
+ 
+		<p>AspectJ includes a modified version of the Apache Jakarta Byte Code Engineering Library (BCEL) v5.1.
+		BCEL is available at <a href="http://jakarta.apache.org/bcel/">http://jakarta.apache.org/bcel/</a>. Source
+		code for the modified version of BCEL is available at Eclipse.org in the AspectJ source tree. This code
+		is made available under the Apache Software License v1.1</p>
+		
+		<h4>ASM v2.2.1</h4> 
+		<p>AspectJ includes a binary version of ASM v2.2.1 (<a href="http://asm.objectweb.org/index.html">http://asm.objectweb.org/</a>)
+		The source code for ASM is available from the ObjectWeb download site at 
+		<a href="http://asm.objectweb.org/download/">http://asm.objectweb.org/download/</a>. 
+		<p>The ASM license is available at <a href="http://asm.objectweb.org/license.html">http://asm.objectweb.org/license.html</a>. 
+		The license is also reproduced here:
+		</p>
+
+<pre>Copyright (c) 2000-2005 INRIA, France Telecom
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holders nor the names of its
+   contributors may be used to endorse or promote products derived from
+   this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGE.
+</pre>
+
+</em>
+
+</body>
+
+</html>
diff --git a/packaging/tomcat-server/src/main/dist/about_files/apache-v20.txt b/packaging/tomcat-server/src/main/dist/about_files/apache-v20.txt
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/packaging/tomcat-server/src/main/dist/about_files/apache-v20.txt
@@ -0,0 +1,202 @@
+
+                                 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/packaging/tomcat-server/src/main/dist/about_files/asm.txt b/packaging/tomcat-server/src/main/dist/about_files/asm.txt
new file mode 100644
index 0000000..c5aba7b
--- /dev/null
+++ b/packaging/tomcat-server/src/main/dist/about_files/asm.txt
@@ -0,0 +1,29 @@
+Copyright (c) 2000-2011 INRIA, France Telecom
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holders nor the names of its
+   contributors may be used to endorse or promote products derived from
+   this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/packaging/tomcat-server/src/main/dist/about_files/cddl-10.txt b/packaging/tomcat-server/src/main/dist/about_files/cddl-10.txt
new file mode 100644
index 0000000..9709055
--- /dev/null
+++ b/packaging/tomcat-server/src/main/dist/about_files/cddl-10.txt
@@ -0,0 +1,380 @@
+COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0
+
+1. Definitions.
+
+1.1. "Contributor" means each individual or entity that
+creates or contributes to the creation of Modifications.
+
+1.2. "Contributor Version" means the combination of the
+Original Software, prior Modifications used by a
+Contributor (if any), and the Modifications made by that
+particular Contributor.
+
+1.3. "Covered Software" means (a) the Original Software, or
+(b) Modifications, or (c) the combination of files
+containing Original Software with files containing
+Modifications, in each case including portions thereof.
+
+1.4. "Executable" means the Covered Software in any form
+other than Source Code.
+
+1.5. "Initial Developer" means the individual or entity
+that first makes Original Software available under this
+License.
+
+1.6. "Larger Work" means a work which combines Covered
+Software or portions thereof with code not governed by the
+terms of this License.
+
+1.7. "License" means this document.
+
+1.8. "Licensable" means having the right to grant, to the
+maximum extent possible, whether at the time of the initial
+grant or subsequently acquired, any and all of the rights
+conveyed herein.
+
+1.9. "Modifications" means the Source Code and Executable
+form of any of the following:
+
+A. Any file that results from an addition to,
+deletion from or modification of the contents of a
+file containing Original Software or previous
+Modifications;
+
+B. Any new file that contains any part of the
+Original Software or previous Modification; or
+
+C. Any new file that is contributed or otherwise made
+available under the terms of this License.
+
+1.10. "Original Software" means the Source Code and
+Executable form of computer software code that is
+originally released under this License.
+
+1.11. "Patent Claims" means any patent claim(s), now owned
+or hereafter acquired, including without limitation,
+method, process, and apparatus claims, in any patent
+Licensable by grantor.
+
+1.12. "Source Code" means (a) the common form of computer
+software code in which modifications are made and (b)
+associated documentation included in or with such code.
+
+1.13. "You" (or "Your") means an individual or a legal
+entity exercising rights under, and complying with all of
+the terms of, this License. For legal entities, "You"
+includes any entity which controls, is controlled by, or is
+under common control with You. For purposes of this
+definition, "control" means (a) the power, direct or
+indirect, to cause the direction or management of such
+entity, whether by contract or otherwise, or (b) ownership
+of more than fifty percent (50%) of the outstanding shares
+or beneficial ownership of such entity.
+
+2. License Grants.
+
+2.1. The Initial Developer Grant.
+
+Conditioned upon Your compliance with Section 3.1 below and
+subject to third party intellectual property claims, the
+Initial Developer hereby grants You a world-wide,
+royalty-free, non-exclusive license:
+
+(a) under intellectual property rights (other than
+patent or trademark) Licensable by Initial Developer,
+to use, reproduce, modify, display, perform,
+sublicense and distribute the Original Software (or
+portions thereof), with or without Modifications,
+and/or as part of a Larger Work; and
+
+(b) under Patent Claims infringed by the making,
+using or selling of Original Software, to make, have
+made, use, practice, sell, and offer for sale, and/or
+otherwise dispose of the Original Software (or
+portions thereof).
+
+(c) The licenses granted in Sections 2.1(a) and (b)
+are effective on the date Initial Developer first
+distributes or otherwise makes the Original Software
+available to a third party under the terms of this
+License.
+
+(d) Notwithstanding Section 2.1(b) above, no patent
+license is granted: (1) for code that You delete from
+the Original Software, or (2) for infringements
+caused by: (i) the modification of the Original
+Software, or (ii) the combination of the Original
+Software with other software or devices.
+
+2.2. Contributor Grant.
+
+Conditioned upon Your compliance with Section 3.1 below and
+subject to third party intellectual property claims, each
+Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than
+patent or trademark) Licensable by Contributor to
+use, reproduce, modify, display, perform, sublicense
+and distribute the Modifications created by such
+Contributor (or portions thereof), either on an
+unmodified basis, with other Modifications, as
+Covered Software and/or as part of a Larger Work; and
+
+(b) under Patent Claims infringed by the making,
+using, or selling of Modifications made by that
+Contributor either alone and/or in combination with
+its Contributor Version (or portions of such
+combination), to make, use, sell, offer for sale,
+have made, and/or otherwise dispose of: (1)
+Modifications made by that Contributor (or portions
+thereof); and (2) the combination of Modifications
+made by that Contributor with its Contributor Version
+(or portions of such combination).
+
+(c) The licenses granted in Sections 2.2(a) and
+2.2(b) are effective on the date Contributor first
+distributes or otherwise makes the Modifications
+available to a third party.
+
+(d) Notwithstanding Section 2.2(b) above, no patent
+license is granted: (1) for any code that Contributor
+has deleted from the Contributor Version; (2) for
+infringements caused by: (i) third party
+modifications of Contributor Version, or (ii) the
+combination of Modifications made by that Contributor
+with other software (except as part of the
+Contributor Version) or other devices; or (3) under
+Patent Claims infringed by Covered Software in the
+absence of Modifications made by that Contributor.
+
+3. Distribution Obligations.
+
+3.1. Availability of Source Code.
+
+Any Covered Software that You distribute or otherwise make
+available in Executable form must also be made available in
+Source Code form and that Source Code form must be
+distributed only under the terms of this License. You must
+include a copy of this License with every copy of the
+Source Code form of the Covered Software You distribute or
+otherwise make available. You must inform recipients of any
+such Covered Software in Executable form as to how they can
+obtain such Covered Software in Source Code form in a
+reasonable manner on or through a medium customarily used
+for software exchange.
+
+3.2. Modifications.
+
+The Modifications that You create or to which You
+contribute are governed by the terms of this License. You
+represent that You believe Your Modifications are Your
+original creation(s) and/or You have sufficient rights to
+grant the rights conveyed by this License.
+
+3.3. Required Notices.
+
+You must include a notice in each of Your Modifications
+that identifies You as the Contributor of the Modification.
+You may not remove or alter any copyright, patent or
+trademark notices contained within the Covered Software, or
+any notices of licensing or any descriptive text giving
+attribution to any Contributor or the Initial Developer.
+
+3.4. Application of Additional Terms.
+
+You may not offer or impose any terms on any Covered
+Software in Source Code form that alters or restricts the
+applicable version of this License or the recipients'
+rights hereunder. You may choose to offer, and to charge a
+fee for, warranty, support, indemnity or liability
+obligations to one or more recipients of Covered Software.
+However, you may do so only on Your own behalf, and not on
+behalf of the Initial Developer or any Contributor. You
+must make it absolutely clear that any such warranty,
+support, indemnity or liability obligation is offered by
+You alone, and You hereby agree to indemnify the Initial
+Developer and every Contributor for any liability incurred
+by the Initial Developer or such Contributor as a result of
+warranty, support, indemnity or liability terms You offer.
+
+3.5. Distribution of Executable Versions.
+
+You may distribute the Executable form of the Covered
+Software under the terms of this License or under the terms
+of a license of Your choice, which may contain terms
+different from this License, provided that You are in
+compliance with the terms of this License and that the
+license for the Executable form does not attempt to limit
+or alter the recipient's rights in the Source Code form
+from the rights set forth in this License. If You
+distribute the Covered Software in Executable form under a
+different license, You must make it absolutely clear that
+any terms which differ from this License are offered by You
+alone, not by the Initial Developer or Contributor. You
+hereby agree to indemnify the Initial Developer and every
+Contributor for any liability incurred by the Initial
+Developer or such Contributor as a result of any such terms
+You offer.
+
+3.6. Larger Works.
+
+You may create a Larger Work by combining Covered Software
+with other code not governed by the terms of this License
+and distribute the Larger Work as a single product. In such
+a case, You must make sure the requirements of this License
+are fulfilled for the Covered Software.
+
+4. Versions of the License.
+
+4.1. New Versions.
+
+Sun Microsystems, Inc. is the initial license steward and
+may publish revised and/or new versions of this License
+from time to time. Each version will be given a
+distinguishing version number. Except as provided in
+Section 4.3, no one other than the license steward has the
+right to modify this License.
+
+4.2. Effect of New Versions.
+
+You may always continue to use, distribute or otherwise
+make the Covered Software available under the terms of the
+version of the License under which You originally received
+the Covered Software. If the Initial Developer includes a
+notice in the Original Software prohibiting it from being
+distributed or otherwise made available under any
+subsequent version of the License, You must distribute and
+make the Covered Software available under the terms of the
+version of the License under which You originally received
+the Covered Software. Otherwise, You may also choose to
+use, distribute or otherwise make the Covered Software
+available under the terms of any subsequent version of the
+License published by the license steward.
+
+4.3. Modified Versions.
+
+When You are an Initial Developer and You want to create a
+new license for Your Original Software, You may create and
+use a modified version of this License if You: (a) rename
+the license and remove any references to the name of the
+license steward (except to note that the license differs
+from this License); and (b) otherwise make it clear that
+the license contains terms which differ from this License.
+
+5. DISCLAIMER OF WARRANTY.
+
+COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS"
+BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
+INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED
+SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR
+PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND
+PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY
+COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE
+INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF
+ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF
+WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF
+ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS
+DISCLAIMER.
+
+6. TERMINATION.
+
+6.1. This License and the rights granted hereunder will
+terminate automatically if You fail to comply with terms
+herein and fail to cure such breach within 30 days of
+becoming aware of the breach. Provisions which, by their
+nature, must remain in effect beyond the termination of
+this License shall survive.
+
+6.2. If You assert a patent infringement claim (excluding
+declaratory judgment actions) against Initial Developer or
+a Contributor (the Initial Developer or Contributor against
+whom You assert such claim is referred to as "Participant")
+alleging that the Participant Software (meaning the
+Contributor Version where the Participant is a Contributor
+or the Original Software where the Participant is the
+Initial Developer) directly or indirectly infringes any
+patent, then any and all rights granted directly or
+indirectly to You by such Participant, the Initial
+Developer (if the Initial Developer is not the Participant)
+and all Contributors under Sections 2.1 and/or 2.2 of this
+License shall, upon 60 days notice from Participant
+terminate prospectively and automatically at the expiration
+of such 60 day notice period, unless if within such 60 day
+period You withdraw Your claim with respect to the
+Participant Software against such Participant either
+unilaterally or pursuant to a written agreement with
+Participant.
+
+6.3. In the event of termination under Sections 6.1 or 6.2
+above, all end user licenses that have been validly granted
+by You or any distributor hereunder prior to termination
+(excluding licenses granted to You by any distributor)
+shall survive termination.
+
+7. LIMITATION OF LIABILITY.
+
+UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
+(INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE
+INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF
+COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE
+LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR
+CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT
+LIMITATION, DAMAGES FOR LOST PROFITS, LOSS OF GOODWILL, WORK
+STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
+COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN
+INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
+LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL
+INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT
+APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO
+NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR
+CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT
+APPLY TO YOU.
+
+8. U.S. GOVERNMENT END USERS.
+
+The Covered Software is a "commercial item," as that term is
+defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial
+computer software" (as that term is defined at 48 C.F.R. ¤
+252.227-7014(a)(1)) and "commercial computer software
+documentation" as such terms are used in 48 C.F.R. 12.212 (Sept.
+1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1
+through 227.7202-4 (June 1995), all U.S. Government End Users
+acquire Covered Software with only those rights set forth herein.
+This U.S. Government Rights clause is in lieu of, and supersedes,
+any other FAR, DFAR, or other clause or provision that addresses
+Government rights in computer software under this License.
+
+9. MISCELLANEOUS.
+
+This License represents the complete agreement concerning subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the
+extent necessary to make it enforceable. This License shall be
+governed by the law of the jurisdiction specified in a notice
+contained within the Original Software (except to the extent
+applicable law, if any, provides otherwise), excluding such
+jurisdiction's conflict-of-law provisions. Any litigation
+relating to this License shall be subject to the jurisdiction of
+the courts located in the jurisdiction and venue specified in a
+notice contained within the Original Software, with the losing
+party responsible for costs, including, without limitation, court
+costs and reasonable attorneys' fees and expenses. The
+application of the United Nations Convention on Contracts for the
+International Sale of Goods is expressly excluded. Any law or
+regulation which provides that the language of a contract shall
+be construed against the drafter shall not apply to this License.
+You agree that You alone are responsible for compliance with the
+United States export administration regulations (and the export
+control laws and regulation of any other countries) when You use,
+distribute or otherwise make available any Covered Software.
+
+10. RESPONSIBILITY FOR CLAIMS.
+
+As between Initial Developer and the Contributors, each party is
+responsible for claims and damages arising, directly or
+indirectly, out of its utilization of rights under this License
+and You agree to work with Initial Developer and Contributors to
+distribute such responsibility on an equitable basis. Nothing
+herein is intended or shall be deemed to constitute any admission
+of liability.
diff --git a/packaging/tomcat-server/src/main/dist/about_files/cpl-10.txt b/packaging/tomcat-server/src/main/dist/about_files/cpl-10.txt
new file mode 100644
index 0000000..eb9ef5b
--- /dev/null
+++ b/packaging/tomcat-server/src/main/dist/about_files/cpl-10.txt
@@ -0,0 +1,92 @@
+Common Public License - v 1.0
+
+Updated 16 Apr 2009
+
+As of 25 Feb 2009, IBM has assigned the Agreement Steward role for the CPL to the Eclipse Foundation. Eclipse has designated the Eclipse Public License (EPL) as the follow-on version of the CPL.
+
+
+THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
+
+
+1. DEFINITIONS
+
+"Contribution" means:
+
+a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and
+b) in the case of each subsequent Contributor:
+i)	 changes to the Program, and
+ii)	 additions to the Program;
+where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.
+
+"Contributor" means any person or entity that distributes the Program.
+
+
+"Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.
+
+
+"Program" means the Contributions distributed in accordance with this Agreement.
+
+
+"Recipient" means anyone who receives the Program under this Agreement, including all Contributors.
+
+
+2. GRANT OF RIGHTS
+
+a)	Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.
+b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder.
+c)	Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program.
+d)	Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement.
+3. REQUIREMENTS
+
+A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:
+
+a)	it complies with the terms and conditions of this Agreement; and
+b)	its license agreement:
+i)	effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose;
+ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits;
+iii)	states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and
+iv)	states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange.
+When the Program is made available in source code form:
+
+a)	it must be made available under this Agreement; and
+b)	a copy of this Agreement must be included with each copy of the Program.
+
+Contributors may not remove or alter any copyright notices contained within the Program.
+
+
+Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution.
+
+
+4. COMMERCIAL DISTRIBUTION
+
+Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense.
+
+
+For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.
+
+
+5. NO WARRANTY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. 
+
+
+6. DISCLAIMER OF LIABILITY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+
+7. GENERAL
+
+If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
+
+
+If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed. In addition, if Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed.
+
+
+All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive. 
+
+
+Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. IBM is the initial Agreement Steward. IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved.
+
+
+This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation.
\ No newline at end of file
diff --git a/packaging/tomcat-server/src/main/dist/about_files/mpl-1.1.txt b/packaging/tomcat-server/src/main/dist/about_files/mpl-1.1.txt
new file mode 100644
index 0000000..06f9651
--- /dev/null
+++ b/packaging/tomcat-server/src/main/dist/about_files/mpl-1.1.txt
@@ -0,0 +1,469 @@
+                          MOZILLA PUBLIC LICENSE
+                                Version 1.1
+
+                              ---------------
+
+1. Definitions.
+
+     1.0.1. "Commercial Use" means distribution or otherwise making the
+     Covered Code available to a third party.
+
+     1.1. "Contributor" means each entity that creates or contributes to
+     the creation of Modifications.
+
+     1.2. "Contributor Version" means the combination of the Original
+     Code, prior Modifications used by a Contributor, and the Modifications
+     made by that particular Contributor.
+
+     1.3. "Covered Code" means the Original Code or Modifications or the
+     combination of the Original Code and Modifications, in each case
+     including portions thereof.
+
+     1.4. "Electronic Distribution Mechanism" means a mechanism generally
+     accepted in the software development community for the electronic
+     transfer of data.
+
+     1.5. "Executable" means Covered Code in any form other than Source
+     Code.
+
+     1.6. "Initial Developer" means the individual or entity identified
+     as the Initial Developer in the Source Code notice required by Exhibit
+     A.
+
+     1.7. "Larger Work" means a work which combines Covered Code or
+     portions thereof with code not governed by the terms of this License.
+
+     1.8. "License" means this document.
+
+     1.8.1. "Licensable" means having the right to grant, to the maximum
+     extent possible, whether at the time of the initial grant or
+     subsequently acquired, any and all of the rights conveyed herein.
+
+     1.9. "Modifications" means any addition to or deletion from the
+     substance or structure of either the Original Code or any previous
+     Modifications. When Covered Code is released as a series of files, a
+     Modification is:
+          A. Any addition to or deletion from the contents of a file
+          containing Original Code or previous Modifications.
+
+          B. Any new file that contains any part of the Original Code or
+          previous Modifications.
+
+     1.10. "Original Code" means Source Code of computer software code
+     which is described in the Source Code notice required by Exhibit A as
+     Original Code, and which, at the time of its release under this
+     License is not already Covered Code governed by this License.
+
+     1.10.1. "Patent Claims" means any patent claim(s), now owned or
+     hereafter acquired, including without limitation,  method, process,
+     and apparatus claims, in any patent Licensable by grantor.
+
+     1.11. "Source Code" means the preferred form of the Covered Code for
+     making modifications to it, including all modules it contains, plus
+     any associated interface definition files, scripts used to control
+     compilation and installation of an Executable, or source code
+     differential comparisons against either the Original Code or another
+     well known, available Covered Code of the Contributor's choice. The
+     Source Code can be in a compressed or archival form, provided the
+     appropriate decompression or de-archiving software is widely available
+     for no charge.
+
+     1.12. "You" (or "Your")  means an individual or a legal entity
+     exercising rights under, and complying with all of the terms of, this
+     License or a future version of this License issued under Section 6.1.
+     For legal entities, "You" includes any entity which controls, is
+     controlled by, or is under common control with You. For purposes of
+     this definition, "control" means (a) the power, direct or indirect,
+     to cause the direction or management of such entity, whether by
+     contract or otherwise, or (b) ownership of more than fifty percent
+     (50%) of the outstanding shares or beneficial ownership of such
+     entity.
+
+2. Source Code License.
+
+     2.1. The Initial Developer Grant.
+     The Initial Developer hereby grants You a world-wide, royalty-free,
+     non-exclusive license, subject to third party intellectual property
+     claims:
+          (a)  under intellectual property rights (other than patent or
+          trademark) Licensable by Initial Developer to use, reproduce,
+          modify, display, perform, sublicense and distribute the Original
+          Code (or portions thereof) with or without Modifications, and/or
+          as part of a Larger Work; and
+
+          (b) under Patents Claims infringed by the making, using or
+          selling of Original Code, to make, have made, use, practice,
+          sell, and offer for sale, and/or otherwise dispose of the
+          Original Code (or portions thereof).
+
+          (c) the licenses granted in this Section 2.1(a) and (b) are
+          effective on the date Initial Developer first distributes
+          Original Code under the terms of this License.
+
+          (d) Notwithstanding Section 2.1(b) above, no patent license is
+          granted: 1) for code that You delete from the Original Code; 2)
+          separate from the Original Code;  or 3) for infringements caused
+          by: i) the modification of the Original Code or ii) the
+          combination of the Original Code with other software or devices.
+
+     2.2. Contributor Grant.
+     Subject to third party intellectual property claims, each Contributor
+     hereby grants You a world-wide, royalty-free, non-exclusive license
+
+          (a)  under intellectual property rights (other than patent or
+          trademark) Licensable by Contributor, to use, reproduce, modify,
+          display, perform, sublicense and distribute the Modifications
+          created by such Contributor (or portions thereof) either on an
+          unmodified basis, with other Modifications, as Covered Code
+          and/or as part of a Larger Work; and
+
+          (b) under Patent Claims infringed by the making, using, or
+          selling of  Modifications made by that Contributor either alone
+          and/or in combination with its Contributor Version (or portions
+          of such combination), to make, use, sell, offer for sale, have
+          made, and/or otherwise dispose of: 1) Modifications made by that
+          Contributor (or portions thereof); and 2) the combination of
+          Modifications made by that Contributor with its Contributor
+          Version (or portions of such combination).
+
+          (c) the licenses granted in Sections 2.2(a) and 2.2(b) are
+          effective on the date Contributor first makes Commercial Use of
+          the Covered Code.
+
+          (d)    Notwithstanding Section 2.2(b) above, no patent license is
+          granted: 1) for any code that Contributor has deleted from the
+          Contributor Version; 2)  separate from the Contributor Version;
+          3)  for infringements caused by: i) third party modifications of
+          Contributor Version or ii)  the combination of Modifications made
+          by that Contributor with other software  (except as part of the
+          Contributor Version) or other devices; or 4) under Patent Claims
+          infringed by Covered Code in the absence of Modifications made by
+          that Contributor.
+
+3. Distribution Obligations.
+
+     3.1. Application of License.
+     The Modifications which You create or to which You contribute are
+     governed by the terms of this License, including without limitation
+     Section 2.2. The Source Code version of Covered Code may be
+     distributed only under the terms of this License or a future version
+     of this License released under Section 6.1, and You must include a
+     copy of this License with every copy of the Source Code You
+     distribute. You may not offer or impose any terms on any Source Code
+     version that alters or restricts the applicable version of this
+     License or the recipients' rights hereunder. However, You may include
+     an additional document offering the additional rights described in
+     Section 3.5.
+
+     3.2. Availability of Source Code.
+     Any Modification which You create or to which You contribute must be
+     made available in Source Code form under the terms of this License
+     either on the same media as an Executable version or via an accepted
+     Electronic Distribution Mechanism to anyone to whom you made an
+     Executable version available; and if made available via Electronic
+     Distribution Mechanism, must remain available for at least twelve (12)
+     months after the date it initially became available, or at least six
+     (6) months after a subsequent version of that particular Modification
+     has been made available to such recipients. You are responsible for
+     ensuring that the Source Code version remains available even if the
+     Electronic Distribution Mechanism is maintained by a third party.
+
+     3.3. Description of Modifications.
+     You must cause all Covered Code to which You contribute to contain a
+     file documenting the changes You made to create that Covered Code and
+     the date of any change. You must include a prominent statement that
+     the Modification is derived, directly or indirectly, from Original
+     Code provided by the Initial Developer and including the name of the
+     Initial Developer in (a) the Source Code, and (b) in any notice in an
+     Executable version or related documentation in which You describe the
+     origin or ownership of the Covered Code.
+
+     3.4. Intellectual Property Matters
+          (a) Third Party Claims.
+          If Contributor has knowledge that a license under a third party's
+          intellectual property rights is required to exercise the rights
+          granted by such Contributor under Sections 2.1 or 2.2,
+          Contributor must include a text file with the Source Code
+          distribution titled "LEGAL" which describes the claim and the
+          party making the claim in sufficient detail that a recipient will
+          know whom to contact. If Contributor obtains such knowledge after
+          the Modification is made available as described in Section 3.2,
+          Contributor shall promptly modify the LEGAL file in all copies
+          Contributor makes available thereafter and shall take other steps
+          (such as notifying appropriate mailing lists or newsgroups)
+          reasonably calculated to inform those who received the Covered
+          Code that new knowledge has been obtained.
+
+          (b) Contributor APIs.
+          If Contributor's Modifications include an application programming
+          interface and Contributor has knowledge of patent licenses which
+          are reasonably necessary to implement that API, Contributor must
+          also include this information in the LEGAL file.
+
+               (c)    Representations.
+          Contributor represents that, except as disclosed pursuant to
+          Section 3.4(a) above, Contributor believes that Contributor's
+          Modifications are Contributor's original creation(s) and/or
+          Contributor has sufficient rights to grant the rights conveyed by
+          this License.
+
+     3.5. Required Notices.
+     You must duplicate the notice in Exhibit A in each file of the Source
+     Code.  If it is not possible to put such notice in a particular Source
+     Code file due to its structure, then You must include such notice in a
+     location (such as a relevant directory) where a user would be likely
+     to look for such a notice.  If You created one or more Modification(s)
+     You may add your name as a Contributor to the notice described in
+     Exhibit A.  You must also duplicate this License in any documentation
+     for the Source Code where You describe recipients' rights or ownership
+     rights relating to Covered Code.  You may choose to offer, and to
+     charge a fee for, warranty, support, indemnity or liability
+     obligations to one or more recipients of Covered Code. However, You
+     may do so only on Your own behalf, and not on behalf of the Initial
+     Developer or any Contributor. You must make it absolutely clear than
+     any such warranty, support, indemnity or liability obligation is
+     offered by You alone, and You hereby agree to indemnify the Initial
+     Developer and every Contributor for any liability incurred by the
+     Initial Developer or such Contributor as a result of warranty,
+     support, indemnity or liability terms You offer.
+
+     3.6. Distribution of Executable Versions.
+     You may distribute Covered Code in Executable form only if the
+     requirements of Section 3.1-3.5 have been met for that Covered Code,
+     and if You include a notice stating that the Source Code version of
+     the Covered Code is available under the terms of this License,
+     including a description of how and where You have fulfilled the
+     obligations of Section 3.2. The notice must be conspicuously included
+     in any notice in an Executable version, related documentation or
+     collateral in which You describe recipients' rights relating to the
+     Covered Code. You may distribute the Executable version of Covered
+     Code or ownership rights under a license of Your choice, which may
+     contain terms different from this License, provided that You are in
+     compliance with the terms of this License and that the license for the
+     Executable version does not attempt to limit or alter the recipient's
+     rights in the Source Code version from the rights set forth in this
+     License. If You distribute the Executable version under a different
+     license You must make it absolutely clear that any terms which differ
+     from this License are offered by You alone, not by the Initial
+     Developer or any Contributor. You hereby agree to indemnify the
+     Initial Developer and every Contributor for any liability incurred by
+     the Initial Developer or such Contributor as a result of any such
+     terms You offer.
+
+     3.7. Larger Works.
+     You may create a Larger Work by combining Covered Code with other code
+     not governed by the terms of this License and distribute the Larger
+     Work as a single product. In such a case, You must make sure the
+     requirements of this License are fulfilled for the Covered Code.
+
+4. Inability to Comply Due to Statute or Regulation.
+
+     If it is impossible for You to comply with any of the terms of this
+     License with respect to some or all of the Covered Code due to
+     statute, judicial order, or regulation then You must: (a) comply with
+     the terms of this License to the maximum extent possible; and (b)
+     describe the limitations and the code they affect. Such description
+     must be included in the LEGAL file described in Section 3.4 and must
+     be included with all distributions of the Source Code. Except to the
+     extent prohibited by statute or regulation, such description must be
+     sufficiently detailed for a recipient of ordinary skill to be able to
+     understand it.
+
+5. Application of this License.
+
+     This License applies to code to which the Initial Developer has
+     attached the notice in Exhibit A and to related Covered Code.
+
+6. Versions of the License.
+
+     6.1. New Versions.
+     Netscape Communications Corporation ("Netscape") may publish revised
+     and/or new versions of the License from time to time. Each version
+     will be given a distinguishing version number.
+
+     6.2. Effect of New Versions.
+     Once Covered Code has been published under a particular version of the
+     License, You may always continue to use it under the terms of that
+     version. You may also choose to use such Covered Code under the terms
+     of any subsequent version of the License published by Netscape. No one
+     other than Netscape has the right to modify the terms applicable to
+     Covered Code created under this License.
+
+     6.3. Derivative Works.
+     If You create or use a modified version of this License (which you may
+     only do in order to apply it to code which is not already Covered Code
+     governed by this License), You must (a) rename Your license so that
+     the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape",
+     "MPL", "NPL" or any confusingly similar phrase do not appear in your
+     license (except to note that your license differs from this License)
+     and (b) otherwise make it clear that Your version of the license
+     contains terms which differ from the Mozilla Public License and
+     Netscape Public License. (Filling in the name of the Initial
+     Developer, Original Code or Contributor in the notice described in
+     Exhibit A shall not of themselves be deemed to be modifications of
+     this License.)
+
+7. DISCLAIMER OF WARRANTY.
+
+     COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS,
+     WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+     WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF
+     DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING.
+     THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE
+     IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT,
+     YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE
+     COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER
+     OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF
+     ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
+
+8. TERMINATION.
+
+     8.1.  This License and the rights granted hereunder will terminate
+     automatically if You fail to comply with terms herein and fail to cure
+     such breach within 30 days of becoming aware of the breach. All
+     sublicenses to the Covered Code which are properly granted shall
+     survive any termination of this License. Provisions which, by their
+     nature, must remain in effect beyond the termination of this License
+     shall survive.
+
+     8.2.  If You initiate litigation by asserting a patent infringement
+     claim (excluding declatory judgment actions) against Initial Developer
+     or a Contributor (the Initial Developer or Contributor against whom
+     You file such action is referred to as "Participant")  alleging that:
+
+     (a)  such Participant's Contributor Version directly or indirectly
+     infringes any patent, then any and all rights granted by such
+     Participant to You under Sections 2.1 and/or 2.2 of this License
+     shall, upon 60 days notice from Participant terminate prospectively,
+     unless if within 60 days after receipt of notice You either: (i)
+     agree in writing to pay Participant a mutually agreeable reasonable
+     royalty for Your past and future use of Modifications made by such
+     Participant, or (ii) withdraw Your litigation claim with respect to
+     the Contributor Version against such Participant.  If within 60 days
+     of notice, a reasonable royalty and payment arrangement are not
+     mutually agreed upon in writing by the parties or the litigation claim
+     is not withdrawn, the rights granted by Participant to You under
+     Sections 2.1 and/or 2.2 automatically terminate at the expiration of
+     the 60 day notice period specified above.
+
+     (b)  any software, hardware, or device, other than such Participant's
+     Contributor Version, directly or indirectly infringes any patent, then
+     any rights granted to You by such Participant under Sections 2.1(b)
+     and 2.2(b) are revoked effective as of the date You first made, used,
+     sold, distributed, or had made, Modifications made by that
+     Participant.
+
+     8.3.  If You assert a patent infringement claim against Participant
+     alleging that such Participant's Contributor Version directly or
+     indirectly infringes any patent where such claim is resolved (such as
+     by license or settlement) prior to the initiation of patent
+     infringement litigation, then the reasonable value of the licenses
+     granted by such Participant under Sections 2.1 or 2.2 shall be taken
+     into account in determining the amount or value of any payment or
+     license.
+
+     8.4.  In the event of termination under Sections 8.1 or 8.2 above,
+     all end user license agreements (excluding distributors and resellers)
+     which have been validly granted by You or any distributor hereunder
+     prior to termination shall survive termination.
+
+9. LIMITATION OF LIABILITY.
+
+     UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
+     (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL
+     DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE,
+     OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR
+     ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY
+     CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL,
+     WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
+     COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN
+     INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
+     LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY
+     RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW
+     PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE
+     EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO
+     THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
+
+10. U.S. GOVERNMENT END USERS.
+
+     The Covered Code is a "commercial item," as that term is defined in
+     48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer
+     software" and "commercial computer software documentation," as such
+     terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48
+     C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995),
+     all U.S. Government End Users acquire Covered Code with only those
+     rights set forth herein.
+
+11. MISCELLANEOUS.
+
+     This License represents the complete agreement concerning subject
+     matter hereof. If any provision of this License is held to be
+     unenforceable, such provision shall be reformed only to the extent
+     necessary to make it enforceable. This License shall be governed by
+     California law provisions (except to the extent applicable law, if
+     any, provides otherwise), excluding its conflict-of-law provisions.
+     With respect to disputes in which at least one party is a citizen of,
+     or an entity chartered or registered to do business in the United
+     States of America, any litigation relating to this License shall be
+     subject to the jurisdiction of the Federal Courts of the Northern
+     District of California, with venue lying in Santa Clara County,
+     California, with the losing party responsible for costs, including
+     without limitation, court costs and reasonable attorneys' fees and
+     expenses. The application of the United Nations Convention on
+     Contracts for the International Sale of Goods is expressly excluded.
+     Any law or regulation which provides that the language of a contract
+     shall be construed against the drafter shall not apply to this
+     License.
+
+12. RESPONSIBILITY FOR CLAIMS.
+
+     As between Initial Developer and the Contributors, each party is
+     responsible for claims and damages arising, directly or indirectly,
+     out of its utilization of rights under this License and You agree to
+     work with Initial Developer and Contributors to distribute such
+     responsibility on an equitable basis. Nothing herein is intended or
+     shall be deemed to constitute any admission of liability.
+
+13. MULTIPLE-LICENSED CODE.
+
+     Initial Developer may designate portions of the Covered Code as
+     "Multiple-Licensed".  "Multiple-Licensed" means that the Initial
+     Developer permits you to utilize portions of the Covered Code under
+     Your choice of the NPL or the alternative licenses, if any, specified
+     by the Initial Developer in the file described in Exhibit A.
+
+EXHIBIT A -Mozilla Public License.
+
+     ``The contents of this file are subject to the Mozilla Public License
+     Version 1.1 (the "License"); you may not use this file except in
+     compliance with the License. You may obtain a copy of the License at
+     http://www.mozilla.org/MPL/
+
+     Software distributed under the License is distributed on an "AS IS"
+     basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+     License for the specific language governing rights and limitations
+     under the License.
+
+     The Original Code is ______________________________________.
+
+     The Initial Developer of the Original Code is ________________________.
+     Portions created by ______________________ are Copyright (C) ______
+     _______________________. All Rights Reserved.
+
+     Contributor(s): ______________________________________.
+
+     Alternatively, the contents of this file may be used under the terms
+     of the _____ license (the  "[___] License"), in which case the
+     provisions of [______] License are applicable instead of those
+     above.  If you wish to allow use of your version of this file only
+     under the terms of the [____] License and not to allow others to use
+     your version of this file under the MPL, indicate your decision by
+     deleting  the provisions above and replace  them with the notice and
+     other provisions required by the [___] License.  If you do not delete
+     the provisions above, a recipient may use your version of this file
+     under either the MPL or the [___] License."
+
+     [NOTE: The text of this Exhibit A may differ slightly from the text of
+     the notices in the Source Code files of the Original Code. You should
+     use the text of this Exhibit A rather than the text found in the
+     Original Code Source Code for Your Modifications.]
diff --git a/packaging/tomcat-server/src/main/dist/about_files/new-bsd.txt b/packaging/tomcat-server/src/main/dist/about_files/new-bsd.txt
new file mode 100644
index 0000000..1d256c2
--- /dev/null
+++ b/packaging/tomcat-server/src/main/dist/about_files/new-bsd.txt
@@ -0,0 +1,19 @@
+BSD-style License
+Redistribution and use in source and binary forms, with or without modification, 
+are permitted provided that the following conditions are met:
+Redistributions of source code must retain the above copyright notice, 
+this list of conditions and the following disclaimer.
+Redistributions in binary form must reproduce the above copyright notice, 
+this list of conditions and the following disclaimer in the documentation 
+and/or other materials provided with the distribution.
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 
+PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, 
+OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 
+STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
+POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
diff --git a/packaging/tomcat-server/src/main/dist/about_files/slf4j.txt b/packaging/tomcat-server/src/main/dist/about_files/slf4j.txt
new file mode 100644
index 0000000..371607c
--- /dev/null
+++ b/packaging/tomcat-server/src/main/dist/about_files/slf4j.txt
@@ -0,0 +1,20 @@
+Copyright (c) 2004-2008 QOS.ch
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/packaging/tomcat-server/src/main/dist/bin/checkJava.bat b/packaging/tomcat-server/src/main/dist/bin/checkJava.bat
new file mode 100644
index 0000000..8df7848
--- /dev/null
+++ b/packaging/tomcat-server/src/main/dist/bin/checkJava.bat
@@ -0,0 +1,17 @@
+@echo off
+rem Script for checking we have the right version of Java.
+
+if "%JAVA_HOME%" == "" (
+  echo The JAVA_HOME environment variable is not defined.
+  exit /B 1
+)
+if "%CLASSPATH%" == "" (
+  echo The CLASSPATH environment variable is not defined.
+  exit /B 1
+)
+
+rem Run java version check with the discovered java jvm.
+"%JAVA_HOME%\bin\java" -classpath "%CLASSPATH%" org.eclipse.virgo.util.env.JavaVersionChecker
+
+rem If non-zero exit then either we cannot find the checker or the Java version is incorrect.
+if not "%ERRORLEVEL%"=="0" exit /B %ERRORLEVEL%
diff --git a/packaging/tomcat-server/src/main/dist/bin/dmk.bat b/packaging/tomcat-server/src/main/dist/bin/dmk.bat
new file mode 100644
index 0000000..d35aca1
--- /dev/null
+++ b/packaging/tomcat-server/src/main/dist/bin/dmk.bat
@@ -0,0 +1,286 @@
+@echo off
+rem Script for starting and stopping the kernel
+
+if "%OS%" == "Windows_NT" setlocal
+
+rem Derive full path for script (includes trailing backslash)
+  set SCRIPT_DIR=%~dp0
+
+if exist "%SCRIPT_DIR%setupVars.bat" (
+  call "%SCRIPT_DIR%setupVars.bat"
+  if not "%ERRORLEVEL%"=="0" (
+    if "%OS%" == "Windows_NT" endlocal
+    exit /B %ERRORLEVEL%
+  )
+) else (
+  echo Cannot set up environment. "setupVars.bat" file missing.
+  if "%OS%" == "Windows_NT" endlocal
+  exit /B 1
+)
+
+rem Select command we are to run
+
+  rem First parm is command
+    set COMMAND=%~1
+    rem Rest are parameters - shift done in subroutines
+   
+  rem Switch on COMMAND in {"start","stop"}
+
+    if "%COMMAND%" == "start" (
+      call :doStartCommand %*
+      if "%OS%" == "Windows_NT" endlocal
+      exit /B 0
+    )
+
+    if "%COMMAND%" == "stop"  (
+      call :doStopCommand  %*
+      if "%OS%" == "Windows_NT" endlocal
+      exit /B 0
+    )
+
+    echo Unknown command: %COMMAND%
+    if "%OS%" == "Windows_NT" endlocal
+    exit /B 1
+
+rem ------------------ Subroutines
+rem ------------------------------
+:doStartCommand
+
+  shift
+  rem The shift must be here :()
+
+  rem Check further file that needs to exist
+  for %%I in ("%KERNEL_HOME%\bin\jmxPermissions.vbs") do if not exist "%%~I" (
+    echo File "%%~I" does not exist but is required to continue.
+    exit /B 1
+  )
+
+  rem Set defaults
+    set CONFIG_DIR=%KERNEL_HOME%\configuration
+    set CLEAN_FLAG=
+    set NO_START_FLAG=
+    set DEBUG_FLAG=
+    set DEBUG_PORT=8000
+    set SUSPEND=n
+    if not defined JMX_PORT set JMX_PORT=9875
+    if not defined KEYSTORE_PASSWORD set KEYSTORE_PASSWORD=changeit
+    set ADDITIONAL_ARGS=
+
+  rem Loop through options
+
+  :startOptionLoop
+  if "%~1"=="" goto endStartOptionLoop
+  if "%~1"=="-debug"             goto debug
+  if "%~1"=="-clean"             goto clean
+  if "%~1"=="-configDir"         goto configDir
+  if "%~1"=="-jmxport"           goto jmxport
+  if "%~1"=="-keystore"          goto keystore
+  if "%~1"=="-keystorePassword"  goto keystorePassword
+  if "%~1"=="-noStart"           goto noStart
+  if "%~1"=="-suspend"           goto suspend
+  if "%~1"=="-shell"             goto shell
+
+  set ADDITIONAL_ARGS=%ADDITIONAL_ARGS% "%~1"
+
+  :continueStartOptionLoop
+    shift
+    goto startOptionLoop
+
+  :debug
+    set DEBUG_FLAG=1
+    set PORT_CANDIDATE=%~2
+    if not "%PORT_CANDIDATE:~0,1%"=="-" (
+      set DEBUG_PORT=%PORT_CANDIDATE%
+      shift
+    )
+    goto continueStartOptionLoop
+  :clean
+    set CLEAN_FLAG=1
+    goto continueStartOptionLoop
+  :configDir
+    set CONFIG_DIR=%~2
+    rem unless absolute, treat as relative to kernel home
+    if "%CONFIG_DIR:~1%"=="\" goto absoluteConfigDir
+    if "%CONFIG_DIR:~1,2%"==":\" goto absoluteConfigDir
+    set CONFIG_DIR=%KERNEL_HOME%\%CONFIG_DIR%
+  :absoluteConfigDir
+    shift
+    goto continueStartOptionLoop
+  :jmxport
+    set JMX_PORT=%~2
+    shift
+    goto continueStartOptionLoop
+  :keystore
+    set KEYSTORE_PATH=%~2
+    shift
+    goto continueStartOptionLoop
+  :keystorePassword
+    set KEYSTORE_PASSWORD=%~2
+    shift
+    goto continueStartOptionLoop
+  :noStart
+    set NO_START_FLAG=1
+    goto continueStartOptionLoop
+  :suspend
+    set SUSPEND=y
+    goto continueStartOptionLoop
+  :shell
+    set SHELL_FLAG=1
+    goto continueStartOptionLoop
+
+  :endStartOptionLoop
+
+  
+  rem Adjust permissions if necessary
+    cscript //NoLogo "%KERNEL_HOME%\bin\jmxPermissions.vbs" "%CONFIG_DIR%\"
+
+  rem Adjust options now all are known
+    if "%KEYSTORE_PATH%"=="" set KEYSTORE_PATH=%CONFIG_DIR%\keystore
+    if not "%DEBUG_FLAG%"=="" set DEBUG_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,address=%DEBUG_PORT%,server=y,suspend=%SUSPEND%
+
+  rem do Clean work:
+    if not "%CLEAN_FLAG%"=="" (
+      echo Cleaning the serviceability and working directories...
+      rmdir /Q /S "%KERNEL_HOME%\serviceability" 2>nul
+      rmdir /Q /S "%KERNEL_HOME%\work" 2>nul
+      
+      set LAUNCH_OPTS=%LAUNCH_OPTS% -clean
+    )
+
+  rem do Shell work:
+    if not "%SHELL_FLAG%"=="" ( 
+      echo "Warning: Kernel shell not supported; -shell option ignored."
+      rem set LAUNCH_OPTS=%LAUNCH_OPTS% -Forg.eclipse.virgo.kernel.shell.local=true
+    )
+
+  rem Set JMX options
+    set JMX_OPTS=%JMX_OPTS% -Dcom.sun.management.jmxremote.port=%JMX_PORT% 
+    set JMX_OPTS=%JMX_OPTS% -Dcom.sun.management.jmxremote.authenticate=true 
+    set JMX_OPTS=%JMX_OPTS% -Dcom.sun.management.jmxremote.login.config=virgo-kernel 
+    set JMX_OPTS=%JMX_OPTS% -Dcom.sun.management.jmxremote.access.file="%CONFIG_DIR%\org.eclipse.virgo.kernel.jmxremote.access.properties" 
+    set JMX_OPTS=%JMX_OPTS% -Djavax.net.ssl.keyStore="%KEYSTORE_PATH%" 
+    set JMX_OPTS=%JMX_OPTS% -Djavax.net.ssl.keyStorePassword=%KEYSTORE_PASSWORD% 
+    set JMX_OPTS=%JMX_OPTS% -Dcom.sun.management.jmxremote.ssl=true 
+    set JMX_OPTS=%JMX_OPTS% -Dcom.sun.management.jmxremote.ssl.need.client.auth=false
+
+    if not "%NO_START_FLAG%"=="" goto :eof
+    rem ensure that the tmp directory exists:
+      set TMP_DIR="%KERNEL_HOME%\work\tmp"
+      if not exist "%TMP_DIR%" mkdir "%TMP_DIR%"
+
+       set JAVA_OPTS=-Xmx1024m -XX:MaxPermSize=512m %JAVA_OPTS%
+    rem Run the server
+  
+      rem Marshall parameters
+      set KERNEL_JAVA_PARMS=%JAVA_OPTS% %DEBUG_OPTS% %JMX_OPTS%
+
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -XX:+HeapDumpOnOutOfMemoryError 
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -XX:ErrorFile="%KERNEL_HOME%\serviceability\error.log" 
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -XX:HeapDumpPath="%KERNEL_HOME%\serviceability\heap_dump.hprof"
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Djava.security.auth.login.config="%CONFIG_DIR%\org.eclipse.virgo.kernel.authentication.config" 
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dorg.eclipse.virgo.kernel.authentication.file="%CONFIG_DIR%\org.eclipse.virgo.kernel.users.properties" 
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Djava.io.tmpdir="%TMP_DIR%" 
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dorg.eclipse.virgo.kernel.home="%KERNEL_HOME%" 
+	  set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dosgi.java.profile="file:%CONFIG_DIR%\java-server.profile"
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dssh.server.keystore="%CONFIG_DIR%/hostkey.ser"
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dorg.eclipse.virgo.kernel.config="%CONFIG_DIR%"
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dosgi.sharedConfiguration.area="%CONFIG_DIR%"
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Declipse.ignoreApp="true" 
+	  set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dosgi.install.area="%KERNEL_HOME%"
+	  set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dosgi.configuration.area="%KERNEL_HOME%\work" 
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dosgi.frameworkClassPath="%FWCLASSPATH%"
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Djava.endorsed.dirs="%KERNEL_HOME%\lib\endorsed"
+      
+      rem If Windows 10 set system property os.name=win32, see https://bugs.eclipse.org/bugs/show_bug.cgi?id=486353	
+	  for /f "tokens=4 delims=] " %%i in ('ver') do set VIRGO_DETECTED_WIN_VERSION=%%i 
+      if "%VIRGO_DETECTED_WIN_VERSION:~0,1%"=="1" set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dos.name=win32
+        
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -classpath "%CLASSPATH%" 
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% org.eclipse.equinox.launcher.Main
+	  set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -noExit
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% %LAUNCH_OPTS%
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% %ADDITIONAL_ARGS%
+
+      rem Now run it
+        PUSHD %KERNEL_HOME%
+        "%JAVA_HOME%\bin\java" %KERNEL_JAVA_PARMS%
+        POPD
+
+goto :eof
+
+rem ------------------------------
+:doStopCommand
+  
+  shift
+  rem The shift must be here :()
+
+  rem Set defaults
+  set CONFIG_DIR=%KERNEL_HOME%\configuration
+  if not defined TRUSTSTORE_PATH set TRUSTSTORE_PATH=%CONFIG_DIR%\keystore
+  if not defined TRUSTSTORE_PASSWORD set TRUSTSTORE_PASSWORD=changeit
+  if not defined JMX_PORT set JMX_PORT=9875
+  set OTHER_ARGS=
+
+  rem Loop through options
+  :stopOptionLoop
+
+  if "%~1"=="" goto endStopOptionLoop  
+  if "%~1"=="-truststore" goto truststoreStop
+  if "%~1"=="-truststorePassword" goto truststorePasswordStop
+  if "%~1"=="-configDir" goto configDirStop 
+  if "%~1"=="-jmxport" goto jmxportStop
+  
+  set OTHER_ARGS=%OTHER_ARGS% "%~1"
+    
+  :continueStopOptionLoop
+  shift
+  goto stopOptionLoop
+
+  :truststoreStop
+  set TRUSTSTORE_PATH=%~2
+  shift
+  goto continueStopOptionLoop
+
+  :truststorePasswordStop
+  set TRUSTSTORE_PASSWORD=%~2
+  shift
+  goto continueStopOptionLoop
+
+  :configDirStop
+    set CONFIG_DIR=%~2
+    rem unless absolute, treat as relative to kernel home
+    if "%CONFIG_DIR:~1%"=="\" goto absoluteConfigDirStop
+    if "%CONFIG_DIR:~1,2%"==":\" goto absoluteConfigDirStop
+    set CONFIG_DIR=%KERNEL_HOME%\%CONFIG_DIR%
+  :absoluteConfigDirStop
+    shift
+    goto continueStopOptionLoop
+
+  :jmxportStop
+  set JMX_PORT=%~2
+  shift
+  goto continueStopOptionLoop
+
+  :endStopOptionLoop
+
+  rem Call shutdown client
+
+    rem Extend JMX options
+    set JMX_OPTS=%JMX_OPTS% -Djavax.net.ssl.trustStore="%TRUSTSTORE_PATH%"
+    set JMX_OPTS=%JMX_OPTS% -Djavax.net.ssl.trustStorePassword=%TRUSTSTORE_PASSWORD%
+    set OTHER_ARGS=%OTHER_ARGS% -jmxport %JMX_PORT%
+
+    rem Marshall parameters
+    set SHUTDOWN_PARMS= %JAVA_OPTS% %JMX_OPTS%
+    set SHUTDOWN_PARMS=%SHUTDOWN_PARMS% -classpath "%CLASSPATH%"
+    set SHUTDOWN_PARMS=%SHUTDOWN_PARMS% -Dorg.eclipse.virgo.kernel.home="%KERNEL_HOME%"
+    set SHUTDOWN_PARMS=%SHUTDOWN_PARMS% -Dorg.eclipse.virgo.kernel.authentication.file="%CONFIG_DIR%\org.eclipse.virgo.kernel.users.properties"
+    set SHUTDOWN_PARMS=%SHUTDOWN_PARMS% org.eclipse.virgo.nano.shutdown.ShutdownClient
+    set SHUTDOWN_PARMS=%SHUTDOWN_PARMS% %OTHER_ARGS%
+
+    rem Run Java program
+    PUSHD %KERNEL_HOME%
+    "%JAVA_HOME%\bin\java" %SHUTDOWN_PARMS%
+    POPD
+
+goto :eof
diff --git a/packaging/tomcat-server/src/main/dist/bin/jconsole.bat b/packaging/tomcat-server/src/main/dist/bin/jconsole.bat
new file mode 100644
index 0000000..4cbe553
--- /dev/null
+++ b/packaging/tomcat-server/src/main/dist/bin/jconsole.bat
@@ -0,0 +1,54 @@
+@echo off
+rem Script for starting jconsole
+
+if "%OS%" == "Windows_NT" setlocal
+
+rem Find root drive and path for current bat file directory (includes trailing backslash)
+  set SCRIPT_DIR=%~dp0
+
+if exist "%SCRIPT_DIR%setupVars.bat" (
+  call "%SCRIPT_DIR%setupVars.bat"
+  if not "%ERRORLEVEL%"=="0" (
+    if "%OS%" == "Windows_NT" endlocal
+    exit /B %ERRORLEVEL%
+  )
+) else (
+  echo Cannot set up environment. "setupVars.bat" file missing.
+  if "%OS%" == "Windows_NT" endlocal
+  exit /B 1
+)
+
+rem Set defaults
+  set TRUSTSTORE_PATH=%KERNEL_HOME%\configuration\keystore
+  set TRUSTSTORE_PASSWORD=changeit
+  set OTHER_ARGS=
+  
+:Loop
+  if "%~1"=="" goto EndLoop
+
+  if "%~1"=="-truststore" (
+    set TRUSTSTORE_PATH=%~2
+    shift
+    shift
+    goto Loop
+  ) 
+  if "%~1"=="-truststorePassword" (
+    set TRUSTSTORE_PASSWORD=%~2
+    shift
+    shift
+    goto Loop
+  )
+  rem Accumulate extra parameters.
+    set OTHER_ARGS=%OTHER_ARGS% "%~1"
+    shift
+  goto Loop
+:EndLoop
+
+set JMX_OPTS=%JMX_OPTS% -J-Dcom.sun.tools.jconsole.mbeans.keyPropertyList=category,type 
+set JMX_OPTS=%JMX_OPTS% -J-Djavax.net.ssl.trustStore="%TRUSTSTORE_PATH%" 
+set JMX_OPTS=%JMX_OPTS% -J-Djavax.net.ssl.trustStorePassword=%TRUSTSTORE_PASSWORD%
+
+"%JAVA_HOME%\bin\jconsole" %JMX_OPTS% %OTHER_ARGS%
+
+if "%OS%" == "Windows_NT" endlocal
+goto :eof
diff --git a/packaging/tomcat-server/src/main/dist/bin/jmxPermissions.vbs b/packaging/tomcat-server/src/main/dist/bin/jmxPermissions.vbs
new file mode 100644
index 0000000..0184607
--- /dev/null
+++ b/packaging/tomcat-server/src/main/dist/bin/jmxPermissions.vbs
@@ -0,0 +1,81 @@
+configFolder = Wscript.Arguments.Item(0)
+
+'WScript.Echo "Fixing permissions on " & configFolder
+
+Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2") 'Load up WMI with the right dll
+
+Dim files(0)
+files(0) = "org.eclipse.virgo.kernel.jmxremote.access.properties"
+
+For Each file In files
+	updateInheritance(configFolder & file)
+	updateOwnership(configFolder & file)
+	updatePermissions(configFolder & file)
+Next 
+
+Sub updateInheritance(file)
+	'WScript.Echo "Updating inheritance of " & file
+	
+	Const SE_DACL_PRESENT = 4
+	Const SE_DACL_PROTECTED = 4096
+	Const SE_SELF_RELATIVE = 32768
+
+	Set objFileSecSetting = objWMIService.Get("Win32_LogicalFileSecuritySetting.Path='" & file & "'")
+    objFileSecSetting.GetSecurityDescriptor objSecurityDescriptor
+
+	objSecurityDescriptor.ControlFlags = SE_DACL_PRESENT + SE_DACL_PROTECTED + SE_SELF_RELATIVE
+
+	Set objMethod = objFileSecSetting.Methods_("SetSecurityDescriptor")
+	Set objInParam = objMethod.inParameters.SpawnInstance_()
+	objInParam.Properties_.item("Descriptor") = objSecurityDescriptor
+	objFileSecSetting.ExecMethod_ "SetSecurityDescriptor", objInParam
+	
+	'WScript.Echo "Updated inheritance of " & file
+End Sub
+
+Sub updateOwnership(file)
+	'WScript.Echo "Updating ownership of " & file
+	Set objDataFile = objWMIService.Get("CIM_DataFile.Name='" & file & "'")
+
+	Set objMethod = objDataFile.Methods_("TakeOwnerShipEx")
+	Set objInParam = objMethod.inParameters.SpawnInstance_()
+
+	objDataFile.ExecMethod_ "TakeOwnerShipEx", objInParam
+
+	'WScript.Echo "Updated ownership of " & file
+End Sub
+
+Sub updatePermissions(file)	
+	'WScript.Echo "Updating permissions of " & file
+	
+	Set objFileSecSetting = objWMIService.Get("Win32_LogicalFileSecuritySetting.Path='" & file & "'")
+    objFileSecSetting.GetSecurityDescriptor objSecurityDescriptor
+
+	Set WshNetwork = WScript.CreateObject("WScript.Network")
+	
+	Dim foundAce
+	foundAce = "false"
+	
+	'Search for an ACE for the current user as there is no robust, portable way of creating such an ACE from scratch in VBScript.
+	Dim specificAce(0)
+	For Each ace in objSecurityDescriptor.DACL
+		If ace.Trustee.Name = WshNetwork.UserName Then
+			Set specificAce(0) = ace
+			foundAce = "true"
+		End If
+	Next
+	
+	If foundAce = "true" Then
+		objSecurityDescriptor.DACL = specificAce
+
+		Set objMethod = objFileSecSetting.Methods_("SetSecurityDescriptor")
+		Set objInParam = objMethod.inParameters.SpawnInstance_()
+		objInParam.Properties_.item("Descriptor") = objSecurityDescriptor
+		objFileSecSetting.ExecMethod_ "SetSecurityDescriptor", objInParam
+		
+		'WScript.Echo "Updated permissions of " & file
+	Else
+		WScript.Echo "WARNING: jmxPermissions.vbs did not update the permissions of " & file & ". Check the file has the correct permissions."
+	End If
+	
+End Sub
diff --git a/packaging/tomcat-server/src/main/dist/bin/setupClasspath.bat b/packaging/tomcat-server/src/main/dist/bin/setupClasspath.bat
new file mode 100644
index 0000000..30e157c
--- /dev/null
+++ b/packaging/tomcat-server/src/main/dist/bin/setupClasspath.bat
@@ -0,0 +1,31 @@
+@echo off
+rem Check JAVA_HOME and KERNEL_HOME variables
+if "%JAVA_HOME%" == "" (
+  echo The JAVA_HOME environment variable is not defined.
+  exit /B 1
+)
+if "%KERNEL_HOME%" == "" (
+  echo The KERNEL_HOME environment variable is not defined.
+  exit /B 1
+)
+
+rem Construct the CLASSPATH list from the Kernel lib directory.
+for %%G in ("%KERNEL_HOME%\lib\*.jar") do call :AppendToClasspath "%%G"
+for %%G in ("%KERNEL_HOME%\plugins\org.eclipse.osgi_*.jar") do call :AppendToClasspath "%%G"
+for %%G in ("%KERNEL_HOME%\plugins\org.eclipse.equinox.console.ssh_*.jar") do call :AppendToClasspath "%%G"
+
+rem Check if there are JAR files in the lib directory.
+if "%CLASSPATH%" == "" (
+  echo No JAR files found in %KERNEL_HOME%\lib
+  exit /B 1
+)
+
+rem Remove leading semi-colon if present
+if "%CLASSPATH:~0,1%"==";" set CLASSPATH=%CLASSPATH:~1%
+if "%FWCLASSPATH:~0,1%"=="," set FWCLASSPATH=%FWCLASSPATH:~1%
+exit /B 0
+
+:AppendToClasspath
+  set CLASSPATH=%CLASSPATH%;%~1
+  set FWCLASSPATH=%FWCLASSPATH%,file:///%~1
+  goto :eof
diff --git a/packaging/tomcat-server/src/main/dist/bin/setupVars.bat b/packaging/tomcat-server/src/main/dist/bin/setupVars.bat
new file mode 100644
index 0000000..a5d7772
--- /dev/null
+++ b/packaging/tomcat-server/src/main/dist/bin/setupVars.bat
@@ -0,0 +1,31 @@
+@echo off
+rem Set up env vars needed for dmk.bat and jconsole.bat (with user-pluggable mods if present)
+
+if "%SCRIPT_DIR%"=="" (
+  echo Called setupVars.bat out of context.
+  exit /B 1
+)
+
+rem Derive KERNEL_HOME full path from script's parent (no backslash)
+  for %%I in ("%SCRIPT_DIR%..") do set KERNEL_HOME=%%~fsI
+
+rem Check files exist (exit if not)
+  set ChkLst="%KERNEL_HOME%\bin\setupClasspath.bat","%KERNEL_HOME%\bin\checkJava.bat"
+
+  for %%I in (%ChkLst%) do if not exist "%%~I" (
+    echo File "%%~I" does not exist but is required.
+    exit /B 1
+  )
+
+rem set up the classpath (check result)
+  call "%KERNEL_HOME%\bin\setupClasspath.bat"
+  if not "%ERRORLEVEL%" == "0" exit /B %ERRORLEVEL%
+
+rem Run Java Version check (uses JAVA_HOME) (check result)
+  call "%KERNEL_HOME%\bin\checkJava.bat"
+  if not "%ERRORLEVEL%" == "0" exit /B %ERRORLEVEL%
+	
+rem Execute user setenv script if needed (ignore result)
+  if exist "%KERNEL_HOME%\bin\setenv.bat" call "%KERNEL_HOME%\bin\setenv.bat"
+
+goto :eof
diff --git a/packaging/tomcat-server/src/main/dist/bin/shutdown.bat b/packaging/tomcat-server/src/main/dist/bin/shutdown.bat
new file mode 100644
index 0000000..a2a1ff4
--- /dev/null
+++ b/packaging/tomcat-server/src/main/dist/bin/shutdown.bat
@@ -0,0 +1,8 @@
+@ECHO OFF
+IF "%OS%" == "Windows_NT" SETLOCAL
+
+SET SCRIPT_DIR=%~dp0%
+SET EXECUTABLE=dmk.bat
+
+call "%SCRIPT_DIR%%EXECUTABLE%" stop %*
+if not "%ERRORLEVEL%"=="0" exit /B %ERRORLEVEL%
diff --git a/packaging/tomcat-server/src/main/dist/bin/startup.bat b/packaging/tomcat-server/src/main/dist/bin/startup.bat
new file mode 100644
index 0000000..76e1618
--- /dev/null
+++ b/packaging/tomcat-server/src/main/dist/bin/startup.bat
@@ -0,0 +1,8 @@
+@ECHO OFF
+IF "%OS%" == "Windows_NT" SETLOCAL
+
+SET SCRIPT_DIR=%~dp0%
+SET EXECUTABLE=dmk.bat
+
+call "%SCRIPT_DIR%%EXECUTABLE%" start %*
+if not "%ERRORLEVEL%"=="0" exit /B %ERRORLEVEL%
diff --git a/packaging/tomcat-server/src/main/dist/configuration/etc/gosh_profile b/packaging/tomcat-server/src/main/dist/configuration/etc/gosh_profile
new file mode 100644
index 0000000..f0c9b5e
--- /dev/null
+++ b/packaging/tomcat-server/src/main/dist/configuration/etc/gosh_profile
@@ -0,0 +1,39 @@
+# default gosh_profile
+# only read if etc/gosh_profile doesn't exist relative to the System property
+# gosh.home or failing that the current directory.
+
+# catch all exceptions from this script to avoid it aborting startup
+try {
+
+  # ensure equinox commands are found first
+  SCOPE = equinox:*
+
+  # add methods on BundleContext object as commands
+  #addcommand context ${.context} (${.context} class)
+  # bug: above invokes (String, Object, String) instead of (String, Object, Class)
+  addcommand context ${.context}
+
+  # add methods on System object as commands
+  addcommand system (((${.context} bundles) 0) loadclass java.lang.System)
+
+  # alias to print full stack trace
+  e = { $exception printStackTrace }
+
+  ## disable console auto-formatting of each result
+  #  you will then need to explicitly use the 'format' command
+  #  to print the result of commands that don't write to stdout.
+  #.Gogo.format = false
+
+  ## disable printing the formatted result of a command into pipelines
+  #.Format.Pipe = false
+
+  # set prompt
+  prompt = 'osgi> '
+
+  # print welcome message
+  # cat ($0 resolve motd)
+} {
+    echo "$0: ERROR: $exception"
+}
+
+# end
diff --git a/packaging/tomcat-server/src/main/dist/configuration/java-server.profile b/packaging/tomcat-server/src/main/dist/configuration/java-server.profile
new file mode 100644
index 0000000..8d5c5a6
--- /dev/null
+++ b/packaging/tomcat-server/src/main/dist/configuration/java-server.profile
@@ -0,0 +1,227 @@
+org.osgi.framework.system.packages = \
+ javax.accessibility,\
+ javax.activation,\
+ javax.activation;version="1.1.1",\
+ javax.activity,\
+ javax.annotation,\
+ javax.annotation;version="1.0.0",\
+ javax.annotation;version="1.1.0",\
+ 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;version="2.0",\
+ javax.jws.soap,\
+ javax.jws.soap;version="2.0",\
+ 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.script;version="1.1",\
+ 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.nimbus,\
+ 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;version="1.0.1",\
+ javax.transaction;version="1.1.0",\
+ javax.transaction.xa,\
+ javax.transaction.xa;version="1.0.1",\
+ javax.transaction.xa;version="1.1.0",\
+ javax.xml,\
+ javax.xml;version="1.0.1",\
+ javax.xml.bind,\
+ javax.xml.bind;version="2.0",\
+ javax.xml.bind.annotation,\
+ javax.xml.bind.annotation;version="2.0",\
+ javax.xml.bind.annotation.adapters,\
+ javax.xml.bind.annotation.adapters;version="2.0",\
+ javax.xml.bind.attachment,\
+ javax.xml.bind.attachment;version="2.0",\
+ javax.xml.bind.helpers,\
+ javax.xml.bind.helpers;version="2.0",\
+ javax.xml.bind.util,\
+ javax.xml.bind.util;version="2.0",\
+ javax.xml.crypto,\
+ javax.xml.crypto;version="1.0",\
+ javax.xml.crypto.dom,\
+ javax.xml.crypto.dom;version="1.0",\
+ javax.xml.crypto.dsig,\
+ javax.xml.crypto.dsig;version="1.0",\
+ javax.xml.crypto.dsig.dom,\
+ javax.xml.crypto.dsig.dom;version="1.0",\
+ javax.xml.crypto.dsig.keyinfo,\
+ javax.xml.crypto.dsig.keyinfo;version="1.0",\
+ javax.xml.crypto.dsig.spec,\
+ javax.xml.crypto.dsig.spec;version="1.0",\
+ javax.xml.datatype,\
+ javax.xml.namespace,\
+ javax.xml.parsers,\
+ javax.xml.soap,\
+ javax.xml.soap;version="1.3.0",\
+ javax.xml.stream,\
+ javax.xml.stream;version="1.0.1",\
+ javax.xml.stream.events,\
+ javax.xml.stream.events;version="1.0.1",\
+ javax.xml.stream.util,\
+ javax.xml.stream.util;version="1.0.1",\
+ 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;version="2.1.1",\
+ javax.xml.ws.handler,\
+ javax.xml.ws.handler;version="2.1.1",\
+ javax.xml.ws.handler.soap,\
+ javax.xml.ws.handler.soap;version="2.1.1",\
+ javax.xml.ws.http,\
+ javax.xml.ws.http;version="2.1.1",\
+ javax.xml.ws.soap,\
+ javax.xml.ws.soap;version="2.1.1",\
+ javax.xml.ws.spi,\
+ javax.xml.ws.spi;version="2.1.1",\
+ javax.xml.ws.spi.http,\
+ javax.xml.ws.spi.http;version="2.1.1",\
+ javax.xml.ws.wsaddressing,\
+ javax.xml.ws.wsaddressing;version="2.1.1",\
+ javax.xml.xpath,\
+ org.eclipse.virgo.kernel.equinox.extensions,\
+ org.eclipse.virgo.kernel.equinox.extensions;version="3.7.0",\
+ org.eclipse.virgo.kernel.equinox.extensions.hooks,\
+ org.eclipse.virgo.kernel.equinox.extensions.hooks;version="3.7.0",\
+ 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.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
+org.osgi.framework.bootdelegation = \
+ org.eclipse.virgo.nano.authentication,\
+ javax.*,\
+ javax.xml.*,\
+ org.apache.xerces.jaxp.*,\
+ org.ietf.jgss,\
+ org.omg.*,\
+ org.w3c.*,\
+ org.xml.*,\
+ sun.*,\
+ com.sun.*
+org.osgi.framework.executionenvironment = \
+ OSGi/Minimum-1.0,\
+ OSGi/Minimum-1.1,\
+ OSGi/Minimum-1.2,\
+ JRE-1.1,\
+ J2SE-1.2,\
+ J2SE-1.3,\
+ J2SE-1.4,\
+ J2SE-1.5,\
+ JavaSE-1.6,\
+ JavaSE-1.7
+org.osgi.framework.system.capabilities = \
+ osgi.ee; osgi.ee="OSGi/Minimum"; version:List<Version>="1.0, 1.1, 1.2",\
+ osgi.ee; osgi.ee="JRE"; version:List<Version>="1.0, 1.1",\
+ osgi.ee; osgi.ee="JavaSE"; version:List<Version>="1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7"
+osgi.java.profile.name = Virgo-Java7
diff --git a/packaging/tomcat-server/src/main/dist/configuration/keystore b/packaging/tomcat-server/src/main/dist/configuration/keystore
new file mode 100644
index 0000000..41408e8
--- /dev/null
+++ b/packaging/tomcat-server/src/main/dist/configuration/keystore
Binary files differ
diff --git a/packaging/tomcat-server/src/main/dist/configuration/org.eclipse.virgo.kernel.authentication.config b/packaging/tomcat-server/src/main/dist/configuration/org.eclipse.virgo.kernel.authentication.config
new file mode 100644
index 0000000..44c5d21
--- /dev/null
+++ b/packaging/tomcat-server/src/main/dist/configuration/org.eclipse.virgo.kernel.authentication.config
@@ -0,0 +1,6 @@
+virgo-kernel {
+	org.eclipse.virgo.nano.authentication.KernelLoginModule REQUIRED;
+};
+equinox_console {
+	org.eclipse.virgo.nano.authentication.KernelLoginModule REQUIRED;
+};
diff --git a/packaging/tomcat-server/src/main/dist/configuration/org.eclipse.virgo.kernel.jmxremote.access.properties b/packaging/tomcat-server/src/main/dist/configuration/org.eclipse.virgo.kernel.jmxremote.access.properties
new file mode 100644
index 0000000..ba89979
--- /dev/null
+++ b/packaging/tomcat-server/src/main/dist/configuration/org.eclipse.virgo.kernel.jmxremote.access.properties
@@ -0,0 +1 @@
+admin=readwrite
diff --git a/packaging/tomcat-server/src/main/dist/configuration/org.eclipse.virgo.kernel.properties b/packaging/tomcat-server/src/main/dist/configuration/org.eclipse.virgo.kernel.properties
new file mode 100644
index 0000000..c72631f
--- /dev/null
+++ b/packaging/tomcat-server/src/main/dist/configuration/org.eclipse.virgo.kernel.properties
@@ -0,0 +1,9 @@
+########################
+# Deployer Configuration
+########################
+# Note: use 0 to disable deployment timeouts
+deployer.timeout=300
+deployer.pickupDirectory=pickup
+deployer.scanIntervalMillis=1000
+deployer.unpackBundles=true
+
diff --git a/packaging/tomcat-server/src/main/dist/configuration/org.eclipse.virgo.kernel.users.properties b/packaging/tomcat-server/src/main/dist/configuration/org.eclipse.virgo.kernel.users.properties
new file mode 100644
index 0000000..7ab19e1
--- /dev/null
+++ b/packaging/tomcat-server/src/main/dist/configuration/org.eclipse.virgo.kernel.users.properties
@@ -0,0 +1,9 @@
+##################
+# User definitions
+##################
+user.admin=admin
+
+##################
+# Role definitions
+##################
+role.admin=admin
diff --git a/packaging/tomcat-server/src/main/dist/configuration/org.eclipse.virgo.medic.properties b/packaging/tomcat-server/src/main/dist/configuration/org.eclipse.virgo.medic.properties
new file mode 100644
index 0000000..5c5f1cf
--- /dev/null
+++ b/packaging/tomcat-server/src/main/dist/configuration/org.eclipse.virgo.medic.properties
@@ -0,0 +1,7 @@
+dump.root.directory=serviceability/dump
+log.wrapSysOut=true
+log.wrapSysErr=true
+log.dump.level=DEBUG
+log.dump.bufferSize=10000
+log.dump.pattern=[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-28.28thread %-64.64logger{64} %X{medic.eventCode} %msg %ex%n
+log.jul.consoleHandler=false
diff --git a/packaging/tomcat-server/src/main/dist/configuration/org.eclipse.virgo.repository.properties b/packaging/tomcat-server/src/main/dist/configuration/org.eclipse.virgo.repository.properties
new file mode 100644
index 0000000..5e7de2b
--- /dev/null
+++ b/packaging/tomcat-server/src/main/dist/configuration/org.eclipse.virgo.repository.properties
@@ -0,0 +1,7 @@
+ext.type=external
+ext.searchPattern=repository/ext/{artifact}
+
+usr.type=watched
+usr.watchDirectory=repository/usr
+
+chain=ext,usr
diff --git a/packaging/tomcat-server/src/main/dist/configuration/osgi.console.properties b/packaging/tomcat-server/src/main/dist/configuration/osgi.console.properties
new file mode 100644
index 0000000..5400fc1
--- /dev/null
+++ b/packaging/tomcat-server/src/main/dist/configuration/osgi.console.properties
@@ -0,0 +1,6 @@
+telnet.enabled=false
+telnet.port=2401
+telnet.host=localhost
+ssh.enabled=false
+ssh.port=2402
+ssh.host=localhost
\ No newline at end of file
diff --git a/packaging/tomcat-server/src/main/dist/configuration/serviceability.xml b/packaging/tomcat-server/src/main/dist/configuration/serviceability.xml
new file mode 100644
index 0000000..cff7503
--- /dev/null
+++ b/packaging/tomcat-server/src/main/dist/configuration/serviceability.xml
@@ -0,0 +1,81 @@
+<configuration>
+
+	<jmxConfigurator />
+
+	<contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"/>
+
+	<appender name="SIFTED_LOG_FILE" class="ch.qos.logback.classic.sift.SiftingAppender">
+		<discriminator>
+			<Key>applicationName</Key>
+			<DefaultValue>virgo-server</DefaultValue>
+		</discriminator>
+		<sift>
+			<appender name="${applicationName}_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+				<file>serviceability/logs/${applicationName}/log.log</file>
+				<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+					<FileNamePattern>serviceability/logs/${applicationName}/log_%i.log</FileNamePattern>
+					<MinIndex>1</MinIndex>
+					<MaxIndex>4</MaxIndex>
+				</rollingPolicy>
+				<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+					<MaxFileSize>10MB</MaxFileSize>
+				</triggeringPolicy>
+				<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+					<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-5level %-28.28thread %-64.64logger{64} %X{medic.eventCode} %msg %ex%n</Pattern>
+				</encoder>
+			</appender>
+		</sift>
+	</appender>
+	
+	<appender name="LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<file>serviceability/logs/log.log</file>
+		<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+			<FileNamePattern>serviceability/logs/log_%i.log</FileNamePattern>
+			<MinIndex>1</MinIndex>
+			<MaxIndex>4</MaxIndex>
+		</rollingPolicy>
+		<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+			<MaxFileSize>10MB</MaxFileSize>
+		</triggeringPolicy>
+		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+			<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-5level %-28.28thread %-64.64logger{64} %X{medic.eventCode} %msg %ex%n</Pattern>
+		</encoder>
+	</appender>
+
+	<appender name="EVENT_LOG_STDOUT" class="org.eclipse.virgo.medic.log.logback.ReroutingAwareConsoleAppender">
+		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+			<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-28.28thread &lt;%X{medic.eventCode}&gt; %msg %ex%n</Pattern>
+		</encoder>
+	</appender>
+
+	<appender name="EVENT_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<file>serviceability/eventlogs/eventlog.log</file>
+		<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+			<FileNamePattern>serviceability/eventlogs/eventlog_%i.log</FileNamePattern>
+			<MinIndex>1</MinIndex>
+			<MaxIndex>4</MaxIndex>
+		</rollingPolicy>
+		<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+			<MaxFileSize>10MB</MaxFileSize>
+		</triggeringPolicy>
+		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+			<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-28.28thread &lt;%X{medic.eventCode}&gt; %msg %ex%n</Pattern>
+		</encoder>
+	</appender>
+
+	<logger level="INFO" additivity="false" name="org.eclipse.virgo.medic.eventlog.localized">
+		<appender-ref ref="EVENT_LOG_STDOUT" />
+		<appender-ref ref="EVENT_LOG_FILE" />
+	</logger>
+	
+	<logger level="INFO" additivity="false" name="org.eclipse.virgo.medic.eventlog.default">
+		<appender-ref ref="SIFTED_LOG_FILE" />
+		<appender-ref ref="LOG_FILE" />
+	</logger>
+
+	<root level="INFO">
+		<appender-ref ref="SIFTED_LOG_FILE" />
+		<appender-ref ref="LOG_FILE" />
+	</root>
+
+</configuration>
diff --git a/packaging/tomcat-server/src/main/dist/configuration/tomcat-server.xml b/packaging/tomcat-server/src/main/dist/configuration/tomcat-server.xml
new file mode 100644
index 0000000..03fdde6
--- /dev/null
+++ b/packaging/tomcat-server/src/main/dist/configuration/tomcat-server.xml
@@ -0,0 +1,76 @@
+<?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.
+-->
+<Server port="-1">
+  <!--APR library loader. Documentation at /docs/apr.html -->
+  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
+  <!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html -->
+  <!-- Prevent memory leaks due to use of particular java/javax APIs-->
+  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
+  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
+  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
+  <Listener className="org.eclipse.virgo.web.tomcat.support.ServerLifecycleLoggingListener"/>
+  <Listener className="org.apache.catalina.security.SecurityListener" />
+
+  <Service name="Catalina">
+    <Connector address="127.0.0.1" port="8080" 
+               protocol="org.apache.coyote.http11.Http11NioProtocol"
+               connectionTimeout="20000" enableLookups="false" redirectPort="8443" />
+
+    <Connector address="0.0.0.0" port="8443"
+               protocol="org.apache.coyote.http11.Http11NioProtocol"
+               sslImplementationName="org.apache.tomcat.util.net.jsse.JSSEImplementation"
+               SSLEnabled="true" scheme="https" secure="true" 
+               enableLookups="false" maxThreads="150">
+
+      <SSLHostConfig hostName="_default_"
+                     protocols="TLSv1.2" sslProtocol="TLSv1.2"
+                     honorCipherOrder="true"
+                     ciphers="EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA:EECDH:EDH+AESGCM:EDH:ECDH+AESGCM:ECDH+AES:ECDH:HIGH:MEDIUM:!RC4:!3DES:!CAMELLIA:!SEED:!aNULL:!MD5:!eNULL:!LOW:!EXP:!DSS:!PSK:!SRP"
+                     certificateVerification="none">
+        <Certificate type="RSA"
+                     certificateKeystoreFile="configuration/keystore"
+                     certificateKeystorePassword="changeit"
+                     certificateKeystoreType="JKS"/>
+      </SSLHostConfig>
+
+    </Connector>
+
+    <!-- 
+    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" enableLookups="false" />
+    -->
+
+    <Engine name="Catalina" defaultHost="localhost">
+      <Realm className="org.apache.catalina.realm.JAASRealm" appName="virgo-kernel"
+             userClassNames="org.eclipse.virgo.nano.authentication.User"
+             roleClassNames="org.eclipse.virgo.nano.authentication.Role"/>
+
+      <Host name="localhost" appBase="work"
+            unpackWARs="false" autoDeploy="false"
+            deployOnStartup="false" createDirs="false">
+
+        <Valve className="org.apache.catalina.valves.ErrorReportValve" showReport="false" showServerInfo="false"/>
+        
+        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="serviceability/logs/access"
+               prefix="localhost_access" suffix=".log" 
+               pattern="%t %h %u %H %m %U %s %D %b"/>
+
+        <Valve className="org.eclipse.virgo.web.tomcat.support.ApplicationNameTrackingValve"/>
+      </Host>
+    </Engine>
+  </Service>
+</Server>
diff --git a/packaging/tomcat-server/src/main/dist/epl-v10.html b/packaging/tomcat-server/src/main/dist/epl-v10.html
new file mode 100644
index 0000000..eecc800
--- /dev/null
+++ b/packaging/tomcat-server/src/main/dist/epl-v10.html
@@ -0,0 +1,258 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!-- saved from url=(0049)http://www.eclipse.org/org/documents/epl-v10.html -->
+<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+
+<TITLE>Eclipse Public License - Version 1.0</TITLE>
+<STYLE type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </STYLE>
+
+</HEAD><BODY lang="EN-US">
+
+<H2>Eclipse Public License - v 1.0</H2>
+
+<P>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</P>
+
+<P><B>1. DEFINITIONS</B></P>
+
+<P>"Contribution" means:</P>
+
+<P class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</P>
+<P class="list">b) in the case of each subsequent Contributor:</P>
+<P class="list">i) changes to the Program, and</P>
+<P class="list">ii) additions to the Program;</P>
+<P class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</P>
+
+<P>"Contributor" means any person or entity that distributes
+the Program.</P>
+
+<P>"Licensed Patents" mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</P>
+
+<P>"Program" means the Contributions distributed in accordance
+with this Agreement.</P>
+
+<P>"Recipient" means anyone who receives the Program under
+this Agreement, including all Contributors.</P>
+
+<P><B>2. GRANT OF RIGHTS</B></P>
+
+<P class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</P>
+
+<P class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</P>
+
+<P class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</P>
+
+<P class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</P>
+
+<P><B>3. REQUIREMENTS</B></P>
+
+<P>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</P>
+
+<P class="list">a) it complies with the terms and conditions of this
+Agreement; and</P>
+
+<P class="list">b) its license agreement:</P>
+
+<P class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</P>
+
+<P class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</P>
+
+<P class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</P>
+
+<P class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</P>
+
+<P>When the Program is made available in source code form:</P>
+
+<P class="list">a) it must be made available under this Agreement; and</P>
+
+<P class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</P>
+
+<P>Contributors may not remove or alter any copyright notices contained
+within the Program.</P>
+
+<P>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</P>
+
+<P><B>4. COMMERCIAL DISTRIBUTION</B></P>
+
+<P>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+("Commercial Contributor") hereby agrees to defend and
+indemnify every other Contributor ("Indemnified Contributor")
+against any losses, damages and costs (collectively "Losses")
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</P>
+
+<P>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</P>
+
+<P><B>5. NO WARRANTY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</P>
+
+<P><B>6. DISCLAIMER OF LIABILITY</B></P>
+
+<P>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</P>
+
+<P><B>7. GENERAL</B></P>
+
+<P>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</P>
+
+<P>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</P>
+
+<P>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</P>
+
+<P>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</P>
+
+<P>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</P>
+
+
+
+
+</BODY></HTML>
\ No newline at end of file
diff --git a/packaging/tomcat-server/src/main/dist/notice.html b/packaging/tomcat-server/src/main/dist/notice.html
new file mode 100644
index 0000000..0ee73f4
--- /dev/null
+++ b/packaging/tomcat-server/src/main/dist/notice.html
@@ -0,0 +1,104 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<!-- saved from url=(0044)http://www.eclipse.org/legal/epl/notice.html -->
+<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+
+<TITLE>Eclipse Foundation Software User Agreement</TITLE>
+</HEAD><BODY lang="EN-US">
+<H2>Eclipse Foundation Software User Agreement</H2>
+<P>April 14, 2010</P>
+
+<H3>Usage Of Content</H3>
+
+<P>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+   (COLLECTIVELY "CONTENT").  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</P>
+
+<H3>Applicable Licenses</H3>
+
+<P>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+   ("EPL").  A copy of the EPL is provided with this Content and is also available at <A href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</A>.
+   For purposes of the EPL, "Program" will mean the Content.</P>
+
+<P>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
+   repository ("Repository") in software modules ("Modules") and made available as downloadable archives ("Downloads").</P>
+
+<UL>
+       <LI>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins ("Plug-ins"), plug-in fragments ("Fragments"), and features ("Features").</LI>
+       <LI>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java™ ARchive) in a directory named "plugins".</LI>
+       <LI>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named "features".  Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of the Plug-ins
+      and/or Fragments associated with that Feature.</LI>
+       <LI>Features may also include other Features ("Included Features"). Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of Included Features.</LI>
+</UL>
+
+<P>The terms and conditions governing Plug-ins and Fragments should be contained in files named "about.html" ("Abouts"). The terms and conditions governing Features and
+Included Features should be contained in files named "license.html" ("Feature Licenses").  Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</P>
+
+<UL>
+       <LI>The top-level (root) directory</LI>
+       <LI>Plug-in and Fragment directories</LI>
+       <LI>Inside Plug-ins and Fragments packaged as JARs</LI>
+       <LI>Sub-directories of the directory named "src" of certain Plug-ins</LI>
+       <LI>Feature directories</LI>
+</UL>
+
+<P>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license ("Feature Update License") during the
+installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them.  Feature Update Licenses may be found in the "license" property of files named "feature.properties" found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</P>
+
+<P>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</P>
+
+<UL>
+       <LI>Common Public License Version 1.0 (available at <A href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</A>)</LI>
+       <LI>Apache Software License 1.1 (available at <A href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</A>)</LI>
+       <LI>Apache Software License 2.0 (available at <A href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</A>)</LI>
+       <LI>Metro Link Public License 1.00 (available at <A href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</A>)</LI>
+       <LI>Mozilla Public License Version 1.1 (available at <A href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</A>)</LI>
+</UL>
+
+<P>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</P>
+
+
+<H3>Use of Provisioning Technology</H3>
+
+<P>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
+   Update Manager ("Provisioning Technology") for the purpose of allowing users to install software, documentation, information and/or
+   other materials (collectively "Installable Software"). This capability is provided with the intent of allowing such users to
+   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <A href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</A>
+   ("Specification").</P>
+
+<P>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
+   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
+   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
+   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</P>
+
+<OL>
+       <LI>A series of actions may occur ("Provisioning Process") in which a user may execute the Provisioning Technology
+       on a machine ("Target Machine") with the intent of installing, extending or updating the functionality of an Eclipse-based
+       product.</LI>
+       <LI>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
+       accessed and copied to the Target Machine.</LI>
+       <LI>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
+       Software ("Installable Software Agreement") and such Installable Software Agreement shall be accessed from the Target
+       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
+       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
+       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</LI>
+</OL>
+
+<H3>Cryptography</H3>
+
+<P>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+   possession, or use, and re-export of encryption software, to see if this is permitted.</P>
+
+<P><SMALL>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</SMALL></P>
+
+
+</BODY></HTML>
\ No newline at end of file
diff --git a/packaging/tomcat-server/src/main/dist/repository/ext/org.eclipse.virgo.apps.repository.properties b/packaging/tomcat-server/src/main/dist/repository/ext/org.eclipse.virgo.apps.repository.properties
new file mode 100644
index 0000000..90c5c9e
--- /dev/null
+++ b/packaging/tomcat-server/src/main/dist/repository/ext/org.eclipse.virgo.apps.repository.properties
@@ -0,0 +1,2 @@
+hosted-repository.type=external
+hosted-repository.searchPattern=repository/hosted/*
diff --git a/packaging/tomcat-server/src/main/dist/repository/ext/org.eclipse.virgo.kernel.userregion.blueprint.plan b/packaging/tomcat-server/src/main/dist/repository/ext/org.eclipse.virgo.kernel.userregion.blueprint.plan
new file mode 100644
index 0000000..e7e9754
--- /dev/null
+++ b/packaging/tomcat-server/src/main/dist/repository/ext/org.eclipse.virgo.kernel.userregion.blueprint.plan
@@ -0,0 +1,15 @@
+<plan name="org.eclipse.virgo.kernel.userregion.blueprint" version="3.7.1" scoped="false" atomic="false"
+      xmlns="http://www.eclipse.org/virgo/schema/plan"
+      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+      xsi:schemaLocation="http://www.eclipse.org/virgo/schema/plan http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+    <artifact type="bundle" name="org.eclipse.gemini.blueprint.core" version="[2.1, 3)"/>
+    <artifact type="bundle" name="org.eclipse.gemini.blueprint.extender" version="[2.1, 3)"/>
+    <artifact type="bundle" name="org.eclipse.gemini.blueprint.io" version="[2.1, 3)"/>
+    <artifact type="bundle" name="org.eclipse.gemini.blueprint.extensions" version="[2.1, 3)"/>
+    <artifact type="bundle" name="org.eclipse.virgo.kernel.agent.dm" version="[3.7.1, 4.0)"/>
+    <artifact type="bundle" name="org.eclipse.virgo.kernel.deployer.dm" version="[3.7.1, 4.0)"/>
+    <artifact type="bundle" name="org.eclipse.equinox.ds" version="0.0.0"/>
+    <artifact type="bundle" name="org.eclipse.equinox.util" version="0.0.0"/>
+    <artifact type="configuration" name="osgi.console" version="0"/>
+</plan>
diff --git a/packaging/tomcat-server/src/main/dist/repository/ext/org.eclipse.virgo.management.plan b/packaging/tomcat-server/src/main/dist/repository/ext/org.eclipse.virgo.management.plan
new file mode 100644
index 0000000..b7ad494
--- /dev/null
+++ b/packaging/tomcat-server/src/main/dist/repository/ext/org.eclipse.virgo.management.plan
@@ -0,0 +1,10 @@
+<plan name="org.eclipse.virgo.management" version="3.7.1" scoped="false" atomic="false"
+			xmlns="http://www.eclipse.org/virgo/schema/plan"
+			xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+			xsi:schemaLocation="http://www.eclipse.org/virgo/schema/plan http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+		<artifact type="bundle" name="osgi.enterprise" version="[4.2, 5)"/>
+		<artifact type="bundle" name="org.eclipse.gemini.management" version="[1.0, 2)"/>
+		<artifact type="bundle" name="org.eclipse.virgo.management.fragment" version="[3.6, 4)"/>
+		
+</plan>
diff --git a/packaging/tomcat-server/src/main/dist/repository/ext/org.eclipse.virgo.web.properties b/packaging/tomcat-server/src/main/dist/repository/ext/org.eclipse.virgo.web.properties
new file mode 100644
index 0000000..286bc6f
--- /dev/null
+++ b/packaging/tomcat-server/src/main/dist/repository/ext/org.eclipse.virgo.web.properties
@@ -0,0 +1 @@
+WABHeaders=strict
diff --git a/packaging/tomcat-server/src/main/dist/repository/ext/org.eclipse.virgo.web.tomcat.plan b/packaging/tomcat-server/src/main/dist/repository/ext/org.eclipse.virgo.web.tomcat.plan
new file mode 100644
index 0000000..bffbd2f
--- /dev/null
+++ b/packaging/tomcat-server/src/main/dist/repository/ext/org.eclipse.virgo.web.tomcat.plan
@@ -0,0 +1,16 @@
+<plan name="org.eclipse.virgo.web.tomcat" version="3.7.1" scoped="false" atomic="false"
+                xmlns="http://www.eclipse.org/virgo/schema/plan"
+				xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+				xsi:schemaLocation="
+				        http://www.eclipse.org/virgo/schema/plan 
+				        http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+        <artifact type="configuration" name="org.eclipse.virgo.web"/>
+        <artifact type="bundle" name="org.eclipse.virgo.web.spring.integration" version="[3.0, 4)"/>
+        <artifact type="bundle" name="org.eclipse.gemini.web.core" version="[3.0, 4.0)"/>
+        <artifact type="bundle" name="org.eclipse.gemini.web.tomcat" version="[3.0, 4.0)"/>
+        <artifact type="bundle" name="org.eclipse.virgo.web.core" version="[3.0, 4.0)"/>
+        <artifact type="bundle" name="org.eclipse.virgo.web.dm" version="[3.0, 4.0)"/>
+        <artifact type="bundle" name="org.eclipse.virgo.web.tomcat.support" version="[3.0, 4.0)"/>
+        <artifact type="bundle" name="org.eclipse.virgo.web.servlet.adapter" version="[3.0, 4.0)"/>
+</plan>
diff --git a/packaging/tomcat-server/src/main/dist/repository/ext/osgi.console.properties b/packaging/tomcat-server/src/main/dist/repository/ext/osgi.console.properties
new file mode 100644
index 0000000..310943b
--- /dev/null
+++ b/packaging/tomcat-server/src/main/dist/repository/ext/osgi.console.properties
@@ -0,0 +1,6 @@
+telnet.enabled=false
+telnet.port=2501
+telnet.host=localhost
+ssh.enabled=false
+ssh.port=2502
+ssh.host=localhost
\ No newline at end of file
diff --git a/packaging/tomcat-server/src/main/filtered/bin/checkJava.sh b/packaging/tomcat-server/src/main/filtered/bin/checkJava.sh
new file mode 100755
index 0000000..a06ecd5
--- /dev/null
+++ b/packaging/tomcat-server/src/main/filtered/bin/checkJava.sh
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+#
+# make adjustment when running under cygwin
+#
+if $cygwin; then
+    CLASSPATH=$(cygpath -wp "$CLASSPATH")
+fi
+
+if [ -z "$JAVA_HOME" ]
+then
+  	JAVA_EXECUTABLE=java
+else
+  	JAVA_EXECUTABLE=$JAVA_HOME/bin/java
+fi
+
+# Run java version check with the discovered java jvm.
+$JAVA_EXECUTABLE \
+	-classpath "$CLASSPATH" \
+	org.eclipse.virgo.util.env.JavaVersionChecker
+
+# If non-zero exit then either we cannot find the check or the java version is incorrect.
+if [ $? != 0 ]
+then
+	exit 1
+fi
diff --git a/packaging/tomcat-server/src/main/filtered/bin/dmk.sh b/packaging/tomcat-server/src/main/filtered/bin/dmk.sh
new file mode 100755
index 0000000..aae69f2
--- /dev/null
+++ b/packaging/tomcat-server/src/main/filtered/bin/dmk.sh
@@ -0,0 +1,286 @@
+#!/bin/bash
+
+SCRIPT="$0"
+
+# SCRIPT may be an arbitrarily deep series of symlinks. Loop until we have the concrete path.
+while [ -h "$SCRIPT" ] ; do
+  ls=`ls -ld "$SCRIPT"`
+  # Drop everything prior to ->
+  link=`expr "$ls" : '.*-> \(.*\)$'`
+  if expr "$link" : '/.*' > /dev/null; then
+    SCRIPT="$link"
+  else
+    SCRIPT=`dirname "$SCRIPT"`/"$link"
+  fi
+done
+
+# determine kernel home
+KERNEL_HOME=`dirname "$SCRIPT"`/..
+
+# make KERNEL_HOME absolute
+KERNEL_HOME=`cd "$KERNEL_HOME"; pwd`
+
+# execute user setenv script if needed
+if [ -r "$KERNEL_HOME/bin/setenv.sh" ]
+then
+	. $KERNEL_HOME/bin/setenv.sh
+fi
+
+# setup classpath and java environment
+. "$KERNEL_HOME/bin/setupClasspath.sh"
+
+# Run java version check with the discovered java jvm.
+. "$KERNEL_HOME/bin/checkJava.sh"
+
+shopt -s extglob
+	
+# parse the command we executing
+COMMAND=$1
+shift;
+	
+if [ "$COMMAND" = "start" ]
+then
+	
+	# parse the standard arguments
+	CONFIG_DIR=$KERNEL_HOME/configuration
+	CLEAN_FLAG=
+	NO_START_FLAG=
+
+	SHELL_FLAG=
+	
+	DEBUG_FLAG=
+	DEBUG_PORT=8000
+	SUSPEND=n
+	if [ -z "$JMX_PORT" ]
+	then
+		JMX_PORT=9875
+	fi
+	
+	if [ -z "$KEYSTORE_PASSWORD" ]
+	then
+		KEYSTORE_PASSWORD=changeit
+	fi
+	
+	ADDITIONAL_ARGS=
+
+	while (($# > 0))
+		do
+		case $1 in
+		-debug)
+				DEBUG_FLAG=1
+				if [[ "$2" == +([0-9]) ]]
+				then
+					DEBUG_PORT=$2
+					shift;
+				fi
+				;;
+		-clean)
+				CLEAN_FLAG=1
+				;;
+		-configDir)
+				CONFIG_DIR=$2
+				shift;
+				;;
+		-jmxport)
+				JMX_PORT=$2
+				shift;
+				;;
+		-keystore)
+				KEYSTORE_PATH=$2
+				shift;
+				;;
+		-keystorePassword)
+				KEYSTORE_PASSWORD=$2
+				shift;
+				;;
+		-noStart)
+				NO_START_FLAG=1
+				;;
+				
+		-suspend)
+				SUSPEND=y
+				;;
+		-shell)
+				SHELL_FLAG=1
+				;;
+		*)
+				ADDITIONAL_ARGS="$ADDITIONAL_ARGS $1"
+				;;
+		esac
+		shift
+	done
+	
+	# start the kernel
+	if [[ "$CONFIG_DIR" != /* ]]
+	then
+	    CONFIG_DIR=$KERNEL_HOME/$CONFIG_DIR
+	fi
+
+	if [ -z "$KEYSTORE_PATH" ]
+	then
+	    KEYSTORE_PATH=$CONFIG_DIR/keystore
+	fi
+
+	if [ "$DEBUG_FLAG" ]
+	then
+		DEBUG_OPTS=" \
+			-Xdebug \
+			-Xrunjdwp:transport=dt_socket,address=$DEBUG_PORT,server=y,suspend=$SUSPEND"
+	fi
+
+	if [ "$CLEAN_FLAG" ]
+	then
+        echo "Cleaning the serviceability and working directories..."
+        rm -rf "$KERNEL_HOME/work"
+        rm -rf "$KERNEL_HOME/serviceability"
+
+        LAUNCH_OPTS="$LAUNCH_OPTS -clean" #equivalent to setting osgi.clean to "true"
+	fi
+	
+	if [ "$SHELL_FLAG" ]
+	then
+	    echo "Warning: Kernel shell not supported; -shell option ignored."
+		# LAUNCH_OPTS="$LAUNCH_OPTS -Forg.eclipse.virgo.kernel.shell.local=true"
+	fi
+
+    ACCESS_PROPERTIES=$CONFIG_DIR/org.eclipse.virgo.kernel.jmxremote.access.properties
+    AUTH_LOGIN=$CONFIG_DIR/org.eclipse.virgo.kernel.authentication.config
+    AUTH_FILE=$CONFIG_DIR/org.eclipse.virgo.kernel.users.properties
+    CONFIG_AREA=$KERNEL_HOME/work
+    JAVA_PROFILE=$KERNEL_HOME/configuration/java-server.profile
+
+    if $cygwin; then
+        ACCESS_PROPERTIES=$(cygpath -wp $ACCESS_PROPERTIES)
+        AUTH_LOGIN=$(cygpath -wp $AUTH_LOGIN)
+        AUTH_FILE=$(cygpath -wp $AUTH_FILE)
+        KERNEL_HOME=$(cygpath -wp $KERNEL_HOME)
+        CONFIG_DIR=$(cygpath -wp $CONFIG_DIR)
+        CONFIG_AREA=$(cygpath -wp $CONFIG_AREA)
+        JAVA_PROFILE=$(cygpath -wp $JAVA_PROFILE)
+    fi
+	
+	# Set the required permissions on the JMX configuration files
+	chmod 600 "$ACCESS_PROPERTIES"
+
+   	if [ -z "$JAVA_HOME" ]
+    then
+      	JAVA_EXECUTABLE=java
+    else
+     	JAVA_EXECUTABLE=$JAVA_HOME/bin/java
+    fi
+
+	# If we get here we have the correct Java version.
+	
+	if [ -z "$NO_START_FLAG" ]
+	then
+		TMP_DIR=$KERNEL_HOME/work/tmp
+		# Ensure that the tmp directory exists
+		mkdir -p "$TMP_DIR"
+
+        JAVA_OPTS="-Xmx1024m \
+                    -XX:MaxPermSize=512m $JAVA_OPTS"
+
+		cd "$KERNEL_HOME"; exec $JAVA_EXECUTABLE \
+			$JAVA_OPTS \
+			$DEBUG_OPTS \
+			$JMX_OPTS \
+			-XX:+HeapDumpOnOutOfMemoryError \
+			-XX:ErrorFile="$KERNEL_HOME/serviceability/error.log" \
+			-XX:HeapDumpPath="$KERNEL_HOME/serviceability/heap_dump.hprof" \
+			-Djava.security.auth.login.config="$AUTH_LOGIN" \
+			-Dorg.eclipse.virgo.kernel.authentication.file="$AUTH_FILE" \
+			-Djava.io.tmpdir="$TMP_DIR" \
+			-Dorg.eclipse.virgo.kernel.home="$KERNEL_HOME" \
+			-Dorg.eclipse.virgo.kernel.config="$CONFIG_DIR" \
+			-Dosgi.sharedConfiguration.area="$CONFIG_DIR" \
+			-Dosgi.java.profile="file:$JAVA_PROFILE" \
+            -Declipse.ignoreApp=true \
+            -Dosgi.install.area="$KERNEL_HOME" \
+            -Dosgi.configuration.area="$CONFIG_AREA" \
+            -Dssh.server.keystore="$CONFIG_DIR/hostkey.ser" \
+            -Dosgi.frameworkClassPath="$FWCLASSPATH" \
+            -Djava.endorsed.dirs="$KERNEL_HOME/lib/endorsed" \
+            -Dcom.sun.management.jmxremote.port=$JMX_PORT \
+		    -Dcom.sun.management.jmxremote.authenticate=true \
+	    	-Dcom.sun.management.jmxremote.login.config=virgo-kernel \
+    		-Dcom.sun.management.jmxremote.access.file="$ACCESS_PROPERTIES" \
+		    -Djavax.net.ssl.keyStore="$KEYSTORE_PATH" \
+		    -Djavax.net.ssl.keyStorePassword="$KEYSTORE_PASSWORD" \
+		    -Dcom.sun.management.jmxremote.ssl=true \
+		    -Dcom.sun.management.jmxremote.ssl.need.client.auth=false \
+            -classpath "$CLASSPATH" \
+			org.eclipse.equinox.launcher.Main \
+            -noExit \
+			$LAUNCH_OPTS \
+			$ADDITIONAL_ARGS
+	fi
+elif [ "$COMMAND" = "stop" ]
+then
+
+	CONFIG_DIR="$KERNEL_HOME/configuration"
+
+	#parse args for the script
+	if [ -z "$TRUSTSTORE_PATH" ]
+	then
+		TRUSTSTORE_PATH=$CONFIG_DIR/keystore
+	fi
+	
+	if [ -z "$TRUSTSTORE_PASSWORD" ]	
+	then
+		TRUSTSTORE_PASSWORD=changeit
+	fi
+
+	if [ -z "$JMX_PORT" ]
+	then
+		JMX_PORT=9875
+	fi
+
+	shopt -s extglob
+
+	while (($# > 0))
+		do
+		case $1 in
+		-truststore)
+				TRUSTSTORE_PATH=$2
+				shift;
+				;;
+		-truststorePassword)
+				TRUSTSTORE_PASSWORD=$2
+				shift;
+				;;
+		-configDir)
+				CONFIG_DIR=$2
+				shift;
+				;;
+		-jmxport)
+				JMX_PORT=$2
+				shift;
+				;;
+		*)
+			OTHER_ARGS+=" $1"
+			;;
+		esac
+		shift
+	done
+
+	OTHER_ARGS+=" -jmxport $JMX_PORT"
+
+    if $cygwin; then
+        KERNEL_HOME=$(cygpath -wp $KERNEL_HOME)
+        CONFIG_DIR=$(cygpath -wp $CONFIG_DIR)
+    fi
+
+	exec $JAVA_EXECUTABLE \
+	     $JAVA_OPTS \
+	     $JMX_OPTS \
+		-classpath "$CLASSPATH" \
+		-Djavax.net.ssl.trustStore="$TRUSTSTORE_PATH" \
+		-Djavax.net.ssl.trustStorePassword="$TRUSTSTORE_PASSWORD" \
+		-Dorg.eclipse.virgo.kernel.home="$KERNEL_HOME" \
+		-Dorg.eclipse.virgo.kernel.authentication.file="$CONFIG_DIR/org.eclipse.virgo.kernel.users.properties" \
+		org.eclipse.virgo.nano.shutdown.ShutdownClient $OTHER_ARGS
+	
+else
+	echo "Unknown command: ${COMMAND}"
+fi
+
diff --git a/packaging/tomcat-server/src/main/filtered/bin/jconsole.sh b/packaging/tomcat-server/src/main/filtered/bin/jconsole.sh
new file mode 100755
index 0000000..0dfbcbf
--- /dev/null
+++ b/packaging/tomcat-server/src/main/filtered/bin/jconsole.sh
@@ -0,0 +1,53 @@
+#!/bin/bash
+
+if [ -z "$JAVA_HOME" ]
+then
+    echo The JAVA_HOME environment variable is not defined
+    exit 1
+fi
+
+SCRIPT="$0"
+
+# SCRIPT may be an arbitrarily deep series of symlinks. Loop until we have the concrete path.
+while [ -h "$SCRIPT" ] ; do 
+  ls=`ls -ld "$SCRIPT"`
+  # Drop everything prior to ->
+  link=`expr "$ls" : '.*-> \(.*\)$'`
+  if expr "$link" : '/.*' > /dev/null; then
+    SCRIPT="$link"
+  else
+    SCRIPT=`dirname "$SCRIPT"`/"$link"
+  fi
+done
+ 
+KERNEL_HOME=`dirname "$SCRIPT"`/..
+KERNEL_HOME=`cd $KERNEL_HOME; pwd`
+
+#parse args for the script
+TRUSTSTORE_PATH=$KERNEL_HOME/configuration/keystore
+TRUSTSTORE_PASSWORD=changeit
+
+shopt -s extglob
+
+while (($# > 0))
+	do
+	case $1 in
+	-truststore)
+			TRUSTSTORE_PATH=$2
+			shift;
+			;;
+	-truststorePassword)
+			TRUSTSTORE_PASSWORD=$2
+			shift;
+			;;
+	esac
+	shift
+done
+
+JMX_OPTS=" \
+	$JMX_OPTS \
+	-J-Dcom.sun.tools.jconsole.mbeans.keyPropertyList=category,type \
+	-J-Djavax.net.ssl.trustStore=$TRUSTSTORE_PATH \
+	-J-Djavax.net.ssl.trustStorePassword=$TRUSTSTORE_PASSWORD"
+
+$JAVA_HOME/bin/jconsole $JMX_OPTS
diff --git a/packaging/tomcat-server/src/main/filtered/bin/setupClasspath.sh b/packaging/tomcat-server/src/main/filtered/bin/setupClasspath.sh
new file mode 100755
index 0000000..741e0e3
--- /dev/null
+++ b/packaging/tomcat-server/src/main/filtered/bin/setupClasspath.sh
@@ -0,0 +1,40 @@
+#!/bin/bash
+
+# make sure we have JAVA_HOME set
+if [ -z "$JAVA_HOME" ]
+then
+	echo The JAVA_HOME environment variable is not defined. Using PATH instead.
+fi
+
+CLASSPATH=
+FWCLASSPATH=
+
+#  Create the classpath for bootstrapping the Server from all the JARs in lib
+for file in "$KERNEL_HOME"/lib/*
+do
+	if [[ $file == *.jar ]]
+	then
+		CLASSPATH=$CLASSPATH:$KERNEL_HOME/lib/${file##*/}
+		FWCLASSPATH=$FWCLASSPATH,file:$KERNEL_HOME/lib/${file##*/}
+	fi
+done
+
+#  Append the osgi jar to the classpath
+for file in "$KERNEL_HOME"/plugins/org.eclipse.osgi_*.jar
+do
+	CLASSPATH=$CLASSPATH:$KERNEL_HOME/plugins/${file##*/}
+	FWCLASSPATH=$FWCLASSPATH,file:$KERNEL_HOME/plugins/${file##*/}
+done
+
+#  Append the console.supportability jar to the classpath to enable ssh
+for file in "$KERNEL_HOME"/plugins/org.eclipse.equinox.console.ssh_*.jar
+do
+	CLASSPATH=$CLASSPATH:$KERNEL_HOME/plugins/${file##*/}
+done
+
+# make sure we have CLASSPATH set
+if [ -z "$CLASSPATH" ]
+then
+	echo No JAR files found in $KERNEL_HOME/lib
+	exit 1
+fi
diff --git a/packaging/tomcat-server/src/main/filtered/bin/shutdown.sh b/packaging/tomcat-server/src/main/filtered/bin/shutdown.sh
new file mode 100755
index 0000000..1960446
--- /dev/null
+++ b/packaging/tomcat-server/src/main/filtered/bin/shutdown.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+
+SCRIPT="$0"
+
+# SCRIPT may be an arbitrarily deep series of symlinks. Loop until we have the concrete path.
+while [ -h "$SCRIPT" ] ; do
+  ls=`ls -ld "$SCRIPT"`
+  # Drop everything prior to ->
+  link=`expr "$ls" : '.*-> \(.*\)$'`
+  if expr "$link" : '/.*' > /dev/null; then
+    SCRIPT="$link"
+  else
+    SCRIPT=`dirname "$SCRIPT"`/"$link"
+  fi
+done
+
+SCRIPT_DIR=`dirname $SCRIPT`
+EXECUTABLE="dmk.sh"
+
+#
+# identify yourself when running under cygwin
+#
+cygwin=false
+case "$(uname)" in
+    CYGWIN*) cygwin=true ;;
+esac
+export cygwin
+
+exec "$SCRIPT_DIR"/"$EXECUTABLE" stop "$@"
diff --git a/packaging/tomcat-server/src/main/filtered/bin/startup.sh b/packaging/tomcat-server/src/main/filtered/bin/startup.sh
new file mode 100755
index 0000000..69e43b7
--- /dev/null
+++ b/packaging/tomcat-server/src/main/filtered/bin/startup.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+
+SCRIPT="$0"
+
+# SCRIPT may be an arbitrarily deep series of symlinks. Loop until we have the concrete path.
+while [ -h "$SCRIPT" ] ; do
+  ls=`ls -ld "$SCRIPT"`
+  # Drop everything prior to ->
+  link=`expr "$ls" : '.*-> \(.*\)$'`
+  if expr "$link" : '/.*' > /dev/null; then
+    SCRIPT="$link"
+  else
+    SCRIPT=`dirname "$SCRIPT"`/"$link"
+  fi
+done
+
+SCRIPT_DIR=`dirname $SCRIPT`
+EXECUTABLE="dmk.sh"
+
+#
+# identify yourself when running under cygwin
+#
+cygwin=false
+case "$(uname)" in
+    CYGWIN*) cygwin=true ;;
+esac
+export cygwin
+
+exec "$SCRIPT_DIR"/"$EXECUTABLE" start "$@"
diff --git a/packaging/tomcat-server/src/main/filtered/configuration/org.eclipse.virgo.kernel.userregion.properties b/packaging/tomcat-server/src/main/filtered/configuration/org.eclipse.virgo.kernel.userregion.properties
new file mode 100644
index 0000000..69321a2
--- /dev/null
+++ b/packaging/tomcat-server/src/main/filtered/configuration/org.eclipse.virgo.kernel.userregion.properties
@@ -0,0 +1,93 @@
+baseBundles = \
+ file:plugins/org.eclipse.equinox.cm_@EQUINOX.CONFIGADMIN.VERSION@.jar@start,\
+ file:plugins/org.eclipse.virgo.kernel.userregion_@VIRGO.VERSION@.jar@start,\
+ file:plugins/org.eclipse.virgo.shell.command_@VIRGO.VERSION@.jar@start,\
+ file:plugins/org.eclipse.osgi.services_@OSGI.SERVICES.VERSION@.jar@start,\
+ file:plugins/org.apache.mina.core_@MINA.CORE.VERSION@.jar@start,\
+ file:plugins/org.apache.felix.gogo.command_@FELIX.GOGO.COMMAND.VERSION@.jar@start,\
+ file:plugins/org.apache.felix.gogo.runtime_@FELIX.GOGO.RUNTIME.VERSION@.jar@start,\
+ file:plugins/org.apache.felix.gogo.shell_@FELIX.GOGO.SHELL.VERSION@.jar@start,\
+ file:plugins/org.eclipse.equinox.console_@EQUINOX.CONSOLE.VERSION@.jar@start,\
+ file:plugins/org.eclipse.equinox.console.ssh_@EQUINOX.CONSOLE.SSH.VERSION@.jar@start,\
+ file:plugins/org.apache.sshd.core_@SSHD.CORE.VERSION@.jar@start
+
+bundleImports = org.eclipse.osgi;bundle-version="0"
+
+packageImports =\
+ org.eclipse.virgo.kernel.artifact.*;version="0",\
+ org.eclipse.virgo.nano.core;version="0",\
+ org.eclipse.virgo.nano.deployer.api.*;version="0",\
+ org.eclipse.virgo.nano.deployer.api;version="0",\
+ org.eclipse.virgo.nano.deployer;version="0",\
+ org.eclipse.virgo.kernel.deployer.core.event;version="0",\
+ org.eclipse.virgo.kernel.install.*;version="0",\
+ org.eclipse.virgo.kernel.osgi.*;version="0",\
+ org.eclipse.virgo.kernel.model;version="0",\
+ org.eclipse.virgo.kernel.model.management;version="0",\
+ org.eclipse.virgo.kernel.module;version="0",\
+ org.eclipse.virgo.kernel.equinox.extensions.hooks;version="0",\
+ org.eclipse.virgo.nano.serviceability;version="0",\
+ org.eclipse.virgo.nano.serviceability.*;version="0",\
+ org.eclipse.virgo.kernel.services.work;version="0",\
+ org.eclipse.virgo.nano.shim.*;version="0",\
+ org.eclipse.virgo.medic.*;version="0",\
+ org.eclipse.virgo.repository;version="0",\
+ org.eclipse.virgo.repository.*;version="0",\
+ org.eclipse.virgo.util.*;version="0",\
+ org.apache.commons.logging;version="[1.0.0,2.0.0)",\
+ org.apache.commons.logging.impl;version="[1.0.0,2.0.0)",\
+ org.aspectj.*;version="[1.6.5.RELEASE,2.0.0)",\
+ org.osgi.service.event;version="0",\
+ org.osgi.service.log;version="0",\
+ org.osgi.service.http;version="0",\
+ org.eclipse.equinox.region;version="1",\
+ ch.qos.logback.*;version="[1.0.0,2.0.0)",\
+ org.slf4j;version="[1.6.4,2)",\
+ org.slf4j.helpers;version="[1.6.4,2)",\
+ org.slf4j.spi;version="[1.6.4,2)",\
+ org.springframework.util;version="[4.2.1,5)"
+
+serviceImports =\
+ org.eclipse.equinox.region.Region,\
+ org.eclipse.equinox.region.RegionDigraph,\
+ org.osgi.framework.hooks.resolver.ResolverHookFactory,\
+ org.eclipse.virgo.nano.deployer.api.core.ApplicationDeployer,\
+ org.eclipse.virgo.nano.deployer.api.core.DeployUriNormaliser,\
+ org.eclipse.virgo.kernel.install.artifact.ScopeServiceRepository,\
+ org.eclipse.virgo.kernel.services.work.WorkArea,\
+ org.eclipse.virgo.repository.ArtifactBridge,\
+ org.eclipse.virgo.repository.RepositoryFactory,\
+ org.eclipse.virgo.repository.HashGenerator,\
+ org.eclipse.virgo.medic.eventlog.EventLoggerFactory,\
+ org.eclipse.virgo.repository.Repository,\
+ org.eclipse.virgo.nano.core.Shutdown,\
+ org.osgi.service.event.EventAdmin,\
+ org.osgi.service.log.LogService,\
+ org.osgi.service.http.HttpService,\
+ org.eclipse.virgo.medic.eventlog.EventLogger,\
+ org.eclipse.virgo.medic.dump.DumpGenerator,\
+ org.eclipse.virgo.nano.shim.scope.ScopeFactory,\
+ org.eclipse.virgo.nano.shim.serviceability.TracingService,\
+ org.eclipse.virgo.kernel.model.RuntimeArtifactRepository,\
+ org.eclipse.virgo.kernel.model.management.RuntimeArtifactModelObjectNameCreator,\
+ org.eclipse.osgi.service.resolver.PlatformAdmin,\
+ org.osgi.service.packageadmin.PackageAdmin,\
+ org.eclipse.virgo.nano.core.ConfigurationExporter,\
+ javax.management.MBeanServer
+
+serviceExports =\
+ org.eclipse.virgo.kernel.install.artifact.InstallArtifactLifecycleListener,\
+ org.eclipse.virgo.kernel.install.artifact.ArtifactIdentityDeterminer,\
+ org.eclipse.virgo.kernel.install.pipeline.stage.transform.Transformer,\
+ org.eclipse.virgo.kernel.module.ModuleContextAccessor,\
+ org.eclipse.virgo.medic.dump.DumpContributor,\
+ org.eclipse.virgo.kernel.osgi.quasi.QuasiFrameworkFactory,\
+ org.eclipse.virgo.kernel.osgi.framework.OsgiFramework,\
+ org.eclipse.virgo.kernel.osgi.framework.ImportExpander,\
+ org.eclipse.virgo.kernel.osgi.framework.PackageAdminUtil,\
+ org.eclipse.equinox.region.Region,\
+ org.osgi.service.event.EventHandler,\
+ org.osgi.framework.BundleContext,\
+ org.eclipse.virgo.nano.deployer.api.config.ConfigurationDeployer
+
+initialArtifacts=repository:plan/org.eclipse.virgo.kernel.userregion.blueprint,repository:plan/org.eclipse.virgo.web.tomcat,repository:configuration/org.eclipse.virgo.apps.repository,repository:plan/org.eclipse.virgo.management
diff --git a/packaging/tomcat-server/src/main/filtered/lib/.version b/packaging/tomcat-server/src/main/filtered/lib/.version
new file mode 100644
index 0000000..57985f4
--- /dev/null
+++ b/packaging/tomcat-server/src/main/filtered/lib/.version
@@ -0,0 +1 @@
+virgo.server.version=@VIRGO.VERSION@
diff --git a/packaging/tomcat-server/src/main/filtered/repository/ext/org.springframework.spring-library.libd b/packaging/tomcat-server/src/main/filtered/repository/ext/org.springframework.spring-library.libd
new file mode 100644
index 0000000..b8d132b
--- /dev/null
+++ b/packaging/tomcat-server/src/main/filtered/repository/ext/org.springframework.spring-library.libd
@@ -0,0 +1,22 @@
+Library-SymbolicName: org.springframework.spring
+Library-Version: @SPRING.VERSION@
+Library-Name: Spring Framework
+Import-Bundle: 
+ org.springframework.aop;version="[@SPRING.VERSION@, @SPRING.VERSION@]",
+ org.springframework.aspects;version="[@SPRING.VERSION@, @SPRING.VERSION@]",
+ org.springframework.beans;version="[@SPRING.VERSION@, @SPRING.VERSION@]",
+ org.springframework.context;version="[@SPRING.VERSION@, @SPRING.VERSION@]",
+ org.springframework.context.support;version="[@SPRING.VERSION@, @SPRING.VERSION@]",
+ org.springframework.core;version="[@SPRING.VERSION@, @SPRING.VERSION@]",
+ org.springframework.expression;version="[@SPRING.VERSION@, @SPRING.VERSION@]",
+ org.springframework.jdbc;version="[@SPRING.VERSION@, @SPRING.VERSION@]",
+ org.springframework.jms;version="[@SPRING.VERSION@, @SPRING.VERSION@]",
+ org.springframework.orm;version="[@SPRING.VERSION@, @SPRING.VERSION@]",
+ org.springframework.oxm;version="[@SPRING.VERSION@, @SPRING.VERSION@]",
+ org.springframework.transaction;version="[@SPRING.VERSION@, @SPRING.VERSION@]",
+ org.springframework.web;version="[@SPRING.VERSION@, @SPRING.VERSION@]",
+ org.springframework.webmvc;version="[@SPRING.VERSION@, @SPRING.VERSION@]",
+ org.springframework.webmvc.portlet;version="[@SPRING.VERSION@, @SPRING.VERSION@]",
+ org.springframework.websocket;version="[@SPRING.VERSION@, @SPRING.VERSION@]",
+ oevm.org.aopalliance;version="[1.0.0, 1.0.0]",
+ javax.jms;version="[1,2)"
diff --git a/packaging/virgo/nano/bin/checkJava.bat b/packaging/virgo/nano/bin/checkJava.bat
new file mode 100644
index 0000000..8df7848
--- /dev/null
+++ b/packaging/virgo/nano/bin/checkJava.bat
@@ -0,0 +1,17 @@
+@echo off
+rem Script for checking we have the right version of Java.
+
+if "%JAVA_HOME%" == "" (
+  echo The JAVA_HOME environment variable is not defined.
+  exit /B 1
+)
+if "%CLASSPATH%" == "" (
+  echo The CLASSPATH environment variable is not defined.
+  exit /B 1
+)
+
+rem Run java version check with the discovered java jvm.
+"%JAVA_HOME%\bin\java" -classpath "%CLASSPATH%" org.eclipse.virgo.util.env.JavaVersionChecker
+
+rem If non-zero exit then either we cannot find the checker or the Java version is incorrect.
+if not "%ERRORLEVEL%"=="0" exit /B %ERRORLEVEL%
diff --git a/packaging/virgo/nano/bin/checkJava.sh b/packaging/virgo/nano/bin/checkJava.sh
new file mode 100755
index 0000000..a06ecd5
--- /dev/null
+++ b/packaging/virgo/nano/bin/checkJava.sh
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+#
+# make adjustment when running under cygwin
+#
+if $cygwin; then
+    CLASSPATH=$(cygpath -wp "$CLASSPATH")
+fi
+
+if [ -z "$JAVA_HOME" ]
+then
+  	JAVA_EXECUTABLE=java
+else
+  	JAVA_EXECUTABLE=$JAVA_HOME/bin/java
+fi
+
+# Run java version check with the discovered java jvm.
+$JAVA_EXECUTABLE \
+	-classpath "$CLASSPATH" \
+	org.eclipse.virgo.util.env.JavaVersionChecker
+
+# If non-zero exit then either we cannot find the check or the java version is incorrect.
+if [ $? != 0 ]
+then
+	exit 1
+fi
diff --git a/packaging/virgo/nano/bin/dmk.bat b/packaging/virgo/nano/bin/dmk.bat
new file mode 100644
index 0000000..d35aca1
--- /dev/null
+++ b/packaging/virgo/nano/bin/dmk.bat
@@ -0,0 +1,286 @@
+@echo off
+rem Script for starting and stopping the kernel
+
+if "%OS%" == "Windows_NT" setlocal
+
+rem Derive full path for script (includes trailing backslash)
+  set SCRIPT_DIR=%~dp0
+
+if exist "%SCRIPT_DIR%setupVars.bat" (
+  call "%SCRIPT_DIR%setupVars.bat"
+  if not "%ERRORLEVEL%"=="0" (
+    if "%OS%" == "Windows_NT" endlocal
+    exit /B %ERRORLEVEL%
+  )
+) else (
+  echo Cannot set up environment. "setupVars.bat" file missing.
+  if "%OS%" == "Windows_NT" endlocal
+  exit /B 1
+)
+
+rem Select command we are to run
+
+  rem First parm is command
+    set COMMAND=%~1
+    rem Rest are parameters - shift done in subroutines
+   
+  rem Switch on COMMAND in {"start","stop"}
+
+    if "%COMMAND%" == "start" (
+      call :doStartCommand %*
+      if "%OS%" == "Windows_NT" endlocal
+      exit /B 0
+    )
+
+    if "%COMMAND%" == "stop"  (
+      call :doStopCommand  %*
+      if "%OS%" == "Windows_NT" endlocal
+      exit /B 0
+    )
+
+    echo Unknown command: %COMMAND%
+    if "%OS%" == "Windows_NT" endlocal
+    exit /B 1
+
+rem ------------------ Subroutines
+rem ------------------------------
+:doStartCommand
+
+  shift
+  rem The shift must be here :()
+
+  rem Check further file that needs to exist
+  for %%I in ("%KERNEL_HOME%\bin\jmxPermissions.vbs") do if not exist "%%~I" (
+    echo File "%%~I" does not exist but is required to continue.
+    exit /B 1
+  )
+
+  rem Set defaults
+    set CONFIG_DIR=%KERNEL_HOME%\configuration
+    set CLEAN_FLAG=
+    set NO_START_FLAG=
+    set DEBUG_FLAG=
+    set DEBUG_PORT=8000
+    set SUSPEND=n
+    if not defined JMX_PORT set JMX_PORT=9875
+    if not defined KEYSTORE_PASSWORD set KEYSTORE_PASSWORD=changeit
+    set ADDITIONAL_ARGS=
+
+  rem Loop through options
+
+  :startOptionLoop
+  if "%~1"=="" goto endStartOptionLoop
+  if "%~1"=="-debug"             goto debug
+  if "%~1"=="-clean"             goto clean
+  if "%~1"=="-configDir"         goto configDir
+  if "%~1"=="-jmxport"           goto jmxport
+  if "%~1"=="-keystore"          goto keystore
+  if "%~1"=="-keystorePassword"  goto keystorePassword
+  if "%~1"=="-noStart"           goto noStart
+  if "%~1"=="-suspend"           goto suspend
+  if "%~1"=="-shell"             goto shell
+
+  set ADDITIONAL_ARGS=%ADDITIONAL_ARGS% "%~1"
+
+  :continueStartOptionLoop
+    shift
+    goto startOptionLoop
+
+  :debug
+    set DEBUG_FLAG=1
+    set PORT_CANDIDATE=%~2
+    if not "%PORT_CANDIDATE:~0,1%"=="-" (
+      set DEBUG_PORT=%PORT_CANDIDATE%
+      shift
+    )
+    goto continueStartOptionLoop
+  :clean
+    set CLEAN_FLAG=1
+    goto continueStartOptionLoop
+  :configDir
+    set CONFIG_DIR=%~2
+    rem unless absolute, treat as relative to kernel home
+    if "%CONFIG_DIR:~1%"=="\" goto absoluteConfigDir
+    if "%CONFIG_DIR:~1,2%"==":\" goto absoluteConfigDir
+    set CONFIG_DIR=%KERNEL_HOME%\%CONFIG_DIR%
+  :absoluteConfigDir
+    shift
+    goto continueStartOptionLoop
+  :jmxport
+    set JMX_PORT=%~2
+    shift
+    goto continueStartOptionLoop
+  :keystore
+    set KEYSTORE_PATH=%~2
+    shift
+    goto continueStartOptionLoop
+  :keystorePassword
+    set KEYSTORE_PASSWORD=%~2
+    shift
+    goto continueStartOptionLoop
+  :noStart
+    set NO_START_FLAG=1
+    goto continueStartOptionLoop
+  :suspend
+    set SUSPEND=y
+    goto continueStartOptionLoop
+  :shell
+    set SHELL_FLAG=1
+    goto continueStartOptionLoop
+
+  :endStartOptionLoop
+
+  
+  rem Adjust permissions if necessary
+    cscript //NoLogo "%KERNEL_HOME%\bin\jmxPermissions.vbs" "%CONFIG_DIR%\"
+
+  rem Adjust options now all are known
+    if "%KEYSTORE_PATH%"=="" set KEYSTORE_PATH=%CONFIG_DIR%\keystore
+    if not "%DEBUG_FLAG%"=="" set DEBUG_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,address=%DEBUG_PORT%,server=y,suspend=%SUSPEND%
+
+  rem do Clean work:
+    if not "%CLEAN_FLAG%"=="" (
+      echo Cleaning the serviceability and working directories...
+      rmdir /Q /S "%KERNEL_HOME%\serviceability" 2>nul
+      rmdir /Q /S "%KERNEL_HOME%\work" 2>nul
+      
+      set LAUNCH_OPTS=%LAUNCH_OPTS% -clean
+    )
+
+  rem do Shell work:
+    if not "%SHELL_FLAG%"=="" ( 
+      echo "Warning: Kernel shell not supported; -shell option ignored."
+      rem set LAUNCH_OPTS=%LAUNCH_OPTS% -Forg.eclipse.virgo.kernel.shell.local=true
+    )
+
+  rem Set JMX options
+    set JMX_OPTS=%JMX_OPTS% -Dcom.sun.management.jmxremote.port=%JMX_PORT% 
+    set JMX_OPTS=%JMX_OPTS% -Dcom.sun.management.jmxremote.authenticate=true 
+    set JMX_OPTS=%JMX_OPTS% -Dcom.sun.management.jmxremote.login.config=virgo-kernel 
+    set JMX_OPTS=%JMX_OPTS% -Dcom.sun.management.jmxremote.access.file="%CONFIG_DIR%\org.eclipse.virgo.kernel.jmxremote.access.properties" 
+    set JMX_OPTS=%JMX_OPTS% -Djavax.net.ssl.keyStore="%KEYSTORE_PATH%" 
+    set JMX_OPTS=%JMX_OPTS% -Djavax.net.ssl.keyStorePassword=%KEYSTORE_PASSWORD% 
+    set JMX_OPTS=%JMX_OPTS% -Dcom.sun.management.jmxremote.ssl=true 
+    set JMX_OPTS=%JMX_OPTS% -Dcom.sun.management.jmxremote.ssl.need.client.auth=false
+
+    if not "%NO_START_FLAG%"=="" goto :eof
+    rem ensure that the tmp directory exists:
+      set TMP_DIR="%KERNEL_HOME%\work\tmp"
+      if not exist "%TMP_DIR%" mkdir "%TMP_DIR%"
+
+       set JAVA_OPTS=-Xmx1024m -XX:MaxPermSize=512m %JAVA_OPTS%
+    rem Run the server
+  
+      rem Marshall parameters
+      set KERNEL_JAVA_PARMS=%JAVA_OPTS% %DEBUG_OPTS% %JMX_OPTS%
+
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -XX:+HeapDumpOnOutOfMemoryError 
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -XX:ErrorFile="%KERNEL_HOME%\serviceability\error.log" 
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -XX:HeapDumpPath="%KERNEL_HOME%\serviceability\heap_dump.hprof"
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Djava.security.auth.login.config="%CONFIG_DIR%\org.eclipse.virgo.kernel.authentication.config" 
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dorg.eclipse.virgo.kernel.authentication.file="%CONFIG_DIR%\org.eclipse.virgo.kernel.users.properties" 
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Djava.io.tmpdir="%TMP_DIR%" 
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dorg.eclipse.virgo.kernel.home="%KERNEL_HOME%" 
+	  set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dosgi.java.profile="file:%CONFIG_DIR%\java-server.profile"
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dssh.server.keystore="%CONFIG_DIR%/hostkey.ser"
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dorg.eclipse.virgo.kernel.config="%CONFIG_DIR%"
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dosgi.sharedConfiguration.area="%CONFIG_DIR%"
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Declipse.ignoreApp="true" 
+	  set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dosgi.install.area="%KERNEL_HOME%"
+	  set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dosgi.configuration.area="%KERNEL_HOME%\work" 
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dosgi.frameworkClassPath="%FWCLASSPATH%"
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Djava.endorsed.dirs="%KERNEL_HOME%\lib\endorsed"
+      
+      rem If Windows 10 set system property os.name=win32, see https://bugs.eclipse.org/bugs/show_bug.cgi?id=486353	
+	  for /f "tokens=4 delims=] " %%i in ('ver') do set VIRGO_DETECTED_WIN_VERSION=%%i 
+      if "%VIRGO_DETECTED_WIN_VERSION:~0,1%"=="1" set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dos.name=win32
+        
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -classpath "%CLASSPATH%" 
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% org.eclipse.equinox.launcher.Main
+	  set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -noExit
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% %LAUNCH_OPTS%
+      set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% %ADDITIONAL_ARGS%
+
+      rem Now run it
+        PUSHD %KERNEL_HOME%
+        "%JAVA_HOME%\bin\java" %KERNEL_JAVA_PARMS%
+        POPD
+
+goto :eof
+
+rem ------------------------------
+:doStopCommand
+  
+  shift
+  rem The shift must be here :()
+
+  rem Set defaults
+  set CONFIG_DIR=%KERNEL_HOME%\configuration
+  if not defined TRUSTSTORE_PATH set TRUSTSTORE_PATH=%CONFIG_DIR%\keystore
+  if not defined TRUSTSTORE_PASSWORD set TRUSTSTORE_PASSWORD=changeit
+  if not defined JMX_PORT set JMX_PORT=9875
+  set OTHER_ARGS=
+
+  rem Loop through options
+  :stopOptionLoop
+
+  if "%~1"=="" goto endStopOptionLoop  
+  if "%~1"=="-truststore" goto truststoreStop
+  if "%~1"=="-truststorePassword" goto truststorePasswordStop
+  if "%~1"=="-configDir" goto configDirStop 
+  if "%~1"=="-jmxport" goto jmxportStop
+  
+  set OTHER_ARGS=%OTHER_ARGS% "%~1"
+    
+  :continueStopOptionLoop
+  shift
+  goto stopOptionLoop
+
+  :truststoreStop
+  set TRUSTSTORE_PATH=%~2
+  shift
+  goto continueStopOptionLoop
+
+  :truststorePasswordStop
+  set TRUSTSTORE_PASSWORD=%~2
+  shift
+  goto continueStopOptionLoop
+
+  :configDirStop
+    set CONFIG_DIR=%~2
+    rem unless absolute, treat as relative to kernel home
+    if "%CONFIG_DIR:~1%"=="\" goto absoluteConfigDirStop
+    if "%CONFIG_DIR:~1,2%"==":\" goto absoluteConfigDirStop
+    set CONFIG_DIR=%KERNEL_HOME%\%CONFIG_DIR%
+  :absoluteConfigDirStop
+    shift
+    goto continueStopOptionLoop
+
+  :jmxportStop
+  set JMX_PORT=%~2
+  shift
+  goto continueStopOptionLoop
+
+  :endStopOptionLoop
+
+  rem Call shutdown client
+
+    rem Extend JMX options
+    set JMX_OPTS=%JMX_OPTS% -Djavax.net.ssl.trustStore="%TRUSTSTORE_PATH%"
+    set JMX_OPTS=%JMX_OPTS% -Djavax.net.ssl.trustStorePassword=%TRUSTSTORE_PASSWORD%
+    set OTHER_ARGS=%OTHER_ARGS% -jmxport %JMX_PORT%
+
+    rem Marshall parameters
+    set SHUTDOWN_PARMS= %JAVA_OPTS% %JMX_OPTS%
+    set SHUTDOWN_PARMS=%SHUTDOWN_PARMS% -classpath "%CLASSPATH%"
+    set SHUTDOWN_PARMS=%SHUTDOWN_PARMS% -Dorg.eclipse.virgo.kernel.home="%KERNEL_HOME%"
+    set SHUTDOWN_PARMS=%SHUTDOWN_PARMS% -Dorg.eclipse.virgo.kernel.authentication.file="%CONFIG_DIR%\org.eclipse.virgo.kernel.users.properties"
+    set SHUTDOWN_PARMS=%SHUTDOWN_PARMS% org.eclipse.virgo.nano.shutdown.ShutdownClient
+    set SHUTDOWN_PARMS=%SHUTDOWN_PARMS% %OTHER_ARGS%
+
+    rem Run Java program
+    PUSHD %KERNEL_HOME%
+    "%JAVA_HOME%\bin\java" %SHUTDOWN_PARMS%
+    POPD
+
+goto :eof
diff --git a/packaging/virgo/nano/bin/dmk.sh b/packaging/virgo/nano/bin/dmk.sh
new file mode 100755
index 0000000..aae69f2
--- /dev/null
+++ b/packaging/virgo/nano/bin/dmk.sh
@@ -0,0 +1,286 @@
+#!/bin/bash
+
+SCRIPT="$0"
+
+# SCRIPT may be an arbitrarily deep series of symlinks. Loop until we have the concrete path.
+while [ -h "$SCRIPT" ] ; do
+  ls=`ls -ld "$SCRIPT"`
+  # Drop everything prior to ->
+  link=`expr "$ls" : '.*-> \(.*\)$'`
+  if expr "$link" : '/.*' > /dev/null; then
+    SCRIPT="$link"
+  else
+    SCRIPT=`dirname "$SCRIPT"`/"$link"
+  fi
+done
+
+# determine kernel home
+KERNEL_HOME=`dirname "$SCRIPT"`/..
+
+# make KERNEL_HOME absolute
+KERNEL_HOME=`cd "$KERNEL_HOME"; pwd`
+
+# execute user setenv script if needed
+if [ -r "$KERNEL_HOME/bin/setenv.sh" ]
+then
+	. $KERNEL_HOME/bin/setenv.sh
+fi
+
+# setup classpath and java environment
+. "$KERNEL_HOME/bin/setupClasspath.sh"
+
+# Run java version check with the discovered java jvm.
+. "$KERNEL_HOME/bin/checkJava.sh"
+
+shopt -s extglob
+	
+# parse the command we executing
+COMMAND=$1
+shift;
+	
+if [ "$COMMAND" = "start" ]
+then
+	
+	# parse the standard arguments
+	CONFIG_DIR=$KERNEL_HOME/configuration
+	CLEAN_FLAG=
+	NO_START_FLAG=
+
+	SHELL_FLAG=
+	
+	DEBUG_FLAG=
+	DEBUG_PORT=8000
+	SUSPEND=n
+	if [ -z "$JMX_PORT" ]
+	then
+		JMX_PORT=9875
+	fi
+	
+	if [ -z "$KEYSTORE_PASSWORD" ]
+	then
+		KEYSTORE_PASSWORD=changeit
+	fi
+	
+	ADDITIONAL_ARGS=
+
+	while (($# > 0))
+		do
+		case $1 in
+		-debug)
+				DEBUG_FLAG=1
+				if [[ "$2" == +([0-9]) ]]
+				then
+					DEBUG_PORT=$2
+					shift;
+				fi
+				;;
+		-clean)
+				CLEAN_FLAG=1
+				;;
+		-configDir)
+				CONFIG_DIR=$2
+				shift;
+				;;
+		-jmxport)
+				JMX_PORT=$2
+				shift;
+				;;
+		-keystore)
+				KEYSTORE_PATH=$2
+				shift;
+				;;
+		-keystorePassword)
+				KEYSTORE_PASSWORD=$2
+				shift;
+				;;
+		-noStart)
+				NO_START_FLAG=1
+				;;
+				
+		-suspend)
+				SUSPEND=y
+				;;
+		-shell)
+				SHELL_FLAG=1
+				;;
+		*)
+				ADDITIONAL_ARGS="$ADDITIONAL_ARGS $1"
+				;;
+		esac
+		shift
+	done
+	
+	# start the kernel
+	if [[ "$CONFIG_DIR" != /* ]]
+	then
+	    CONFIG_DIR=$KERNEL_HOME/$CONFIG_DIR
+	fi
+
+	if [ -z "$KEYSTORE_PATH" ]
+	then
+	    KEYSTORE_PATH=$CONFIG_DIR/keystore
+	fi
+
+	if [ "$DEBUG_FLAG" ]
+	then
+		DEBUG_OPTS=" \
+			-Xdebug \
+			-Xrunjdwp:transport=dt_socket,address=$DEBUG_PORT,server=y,suspend=$SUSPEND"
+	fi
+
+	if [ "$CLEAN_FLAG" ]
+	then
+        echo "Cleaning the serviceability and working directories..."
+        rm -rf "$KERNEL_HOME/work"
+        rm -rf "$KERNEL_HOME/serviceability"
+
+        LAUNCH_OPTS="$LAUNCH_OPTS -clean" #equivalent to setting osgi.clean to "true"
+	fi
+	
+	if [ "$SHELL_FLAG" ]
+	then
+	    echo "Warning: Kernel shell not supported; -shell option ignored."
+		# LAUNCH_OPTS="$LAUNCH_OPTS -Forg.eclipse.virgo.kernel.shell.local=true"
+	fi
+
+    ACCESS_PROPERTIES=$CONFIG_DIR/org.eclipse.virgo.kernel.jmxremote.access.properties
+    AUTH_LOGIN=$CONFIG_DIR/org.eclipse.virgo.kernel.authentication.config
+    AUTH_FILE=$CONFIG_DIR/org.eclipse.virgo.kernel.users.properties
+    CONFIG_AREA=$KERNEL_HOME/work
+    JAVA_PROFILE=$KERNEL_HOME/configuration/java-server.profile
+
+    if $cygwin; then
+        ACCESS_PROPERTIES=$(cygpath -wp $ACCESS_PROPERTIES)
+        AUTH_LOGIN=$(cygpath -wp $AUTH_LOGIN)
+        AUTH_FILE=$(cygpath -wp $AUTH_FILE)
+        KERNEL_HOME=$(cygpath -wp $KERNEL_HOME)
+        CONFIG_DIR=$(cygpath -wp $CONFIG_DIR)
+        CONFIG_AREA=$(cygpath -wp $CONFIG_AREA)
+        JAVA_PROFILE=$(cygpath -wp $JAVA_PROFILE)
+    fi
+	
+	# Set the required permissions on the JMX configuration files
+	chmod 600 "$ACCESS_PROPERTIES"
+
+   	if [ -z "$JAVA_HOME" ]
+    then
+      	JAVA_EXECUTABLE=java
+    else
+     	JAVA_EXECUTABLE=$JAVA_HOME/bin/java
+    fi
+
+	# If we get here we have the correct Java version.
+	
+	if [ -z "$NO_START_FLAG" ]
+	then
+		TMP_DIR=$KERNEL_HOME/work/tmp
+		# Ensure that the tmp directory exists
+		mkdir -p "$TMP_DIR"
+
+        JAVA_OPTS="-Xmx1024m \
+                    -XX:MaxPermSize=512m $JAVA_OPTS"
+
+		cd "$KERNEL_HOME"; exec $JAVA_EXECUTABLE \
+			$JAVA_OPTS \
+			$DEBUG_OPTS \
+			$JMX_OPTS \
+			-XX:+HeapDumpOnOutOfMemoryError \
+			-XX:ErrorFile="$KERNEL_HOME/serviceability/error.log" \
+			-XX:HeapDumpPath="$KERNEL_HOME/serviceability/heap_dump.hprof" \
+			-Djava.security.auth.login.config="$AUTH_LOGIN" \
+			-Dorg.eclipse.virgo.kernel.authentication.file="$AUTH_FILE" \
+			-Djava.io.tmpdir="$TMP_DIR" \
+			-Dorg.eclipse.virgo.kernel.home="$KERNEL_HOME" \
+			-Dorg.eclipse.virgo.kernel.config="$CONFIG_DIR" \
+			-Dosgi.sharedConfiguration.area="$CONFIG_DIR" \
+			-Dosgi.java.profile="file:$JAVA_PROFILE" \
+            -Declipse.ignoreApp=true \
+            -Dosgi.install.area="$KERNEL_HOME" \
+            -Dosgi.configuration.area="$CONFIG_AREA" \
+            -Dssh.server.keystore="$CONFIG_DIR/hostkey.ser" \
+            -Dosgi.frameworkClassPath="$FWCLASSPATH" \
+            -Djava.endorsed.dirs="$KERNEL_HOME/lib/endorsed" \
+            -Dcom.sun.management.jmxremote.port=$JMX_PORT \
+		    -Dcom.sun.management.jmxremote.authenticate=true \
+	    	-Dcom.sun.management.jmxremote.login.config=virgo-kernel \
+    		-Dcom.sun.management.jmxremote.access.file="$ACCESS_PROPERTIES" \
+		    -Djavax.net.ssl.keyStore="$KEYSTORE_PATH" \
+		    -Djavax.net.ssl.keyStorePassword="$KEYSTORE_PASSWORD" \
+		    -Dcom.sun.management.jmxremote.ssl=true \
+		    -Dcom.sun.management.jmxremote.ssl.need.client.auth=false \
+            -classpath "$CLASSPATH" \
+			org.eclipse.equinox.launcher.Main \
+            -noExit \
+			$LAUNCH_OPTS \
+			$ADDITIONAL_ARGS
+	fi
+elif [ "$COMMAND" = "stop" ]
+then
+
+	CONFIG_DIR="$KERNEL_HOME/configuration"
+
+	#parse args for the script
+	if [ -z "$TRUSTSTORE_PATH" ]
+	then
+		TRUSTSTORE_PATH=$CONFIG_DIR/keystore
+	fi
+	
+	if [ -z "$TRUSTSTORE_PASSWORD" ]	
+	then
+		TRUSTSTORE_PASSWORD=changeit
+	fi
+
+	if [ -z "$JMX_PORT" ]
+	then
+		JMX_PORT=9875
+	fi
+
+	shopt -s extglob
+
+	while (($# > 0))
+		do
+		case $1 in
+		-truststore)
+				TRUSTSTORE_PATH=$2
+				shift;
+				;;
+		-truststorePassword)
+				TRUSTSTORE_PASSWORD=$2
+				shift;
+				;;
+		-configDir)
+				CONFIG_DIR=$2
+				shift;
+				;;
+		-jmxport)
+				JMX_PORT=$2
+				shift;
+				;;
+		*)
+			OTHER_ARGS+=" $1"
+			;;
+		esac
+		shift
+	done
+
+	OTHER_ARGS+=" -jmxport $JMX_PORT"
+
+    if $cygwin; then
+        KERNEL_HOME=$(cygpath -wp $KERNEL_HOME)
+        CONFIG_DIR=$(cygpath -wp $CONFIG_DIR)
+    fi
+
+	exec $JAVA_EXECUTABLE \
+	     $JAVA_OPTS \
+	     $JMX_OPTS \
+		-classpath "$CLASSPATH" \
+		-Djavax.net.ssl.trustStore="$TRUSTSTORE_PATH" \
+		-Djavax.net.ssl.trustStorePassword="$TRUSTSTORE_PASSWORD" \
+		-Dorg.eclipse.virgo.kernel.home="$KERNEL_HOME" \
+		-Dorg.eclipse.virgo.kernel.authentication.file="$CONFIG_DIR/org.eclipse.virgo.kernel.users.properties" \
+		org.eclipse.virgo.nano.shutdown.ShutdownClient $OTHER_ARGS
+	
+else
+	echo "Unknown command: ${COMMAND}"
+fi
+
diff --git a/packaging/virgo/nano/bin/jconsole.bat b/packaging/virgo/nano/bin/jconsole.bat
new file mode 100644
index 0000000..4cbe553
--- /dev/null
+++ b/packaging/virgo/nano/bin/jconsole.bat
@@ -0,0 +1,54 @@
+@echo off
+rem Script for starting jconsole
+
+if "%OS%" == "Windows_NT" setlocal
+
+rem Find root drive and path for current bat file directory (includes trailing backslash)
+  set SCRIPT_DIR=%~dp0
+
+if exist "%SCRIPT_DIR%setupVars.bat" (
+  call "%SCRIPT_DIR%setupVars.bat"
+  if not "%ERRORLEVEL%"=="0" (
+    if "%OS%" == "Windows_NT" endlocal
+    exit /B %ERRORLEVEL%
+  )
+) else (
+  echo Cannot set up environment. "setupVars.bat" file missing.
+  if "%OS%" == "Windows_NT" endlocal
+  exit /B 1
+)
+
+rem Set defaults
+  set TRUSTSTORE_PATH=%KERNEL_HOME%\configuration\keystore
+  set TRUSTSTORE_PASSWORD=changeit
+  set OTHER_ARGS=
+  
+:Loop
+  if "%~1"=="" goto EndLoop
+
+  if "%~1"=="-truststore" (
+    set TRUSTSTORE_PATH=%~2
+    shift
+    shift
+    goto Loop
+  ) 
+  if "%~1"=="-truststorePassword" (
+    set TRUSTSTORE_PASSWORD=%~2
+    shift
+    shift
+    goto Loop
+  )
+  rem Accumulate extra parameters.
+    set OTHER_ARGS=%OTHER_ARGS% "%~1"
+    shift
+  goto Loop
+:EndLoop
+
+set JMX_OPTS=%JMX_OPTS% -J-Dcom.sun.tools.jconsole.mbeans.keyPropertyList=category,type 
+set JMX_OPTS=%JMX_OPTS% -J-Djavax.net.ssl.trustStore="%TRUSTSTORE_PATH%" 
+set JMX_OPTS=%JMX_OPTS% -J-Djavax.net.ssl.trustStorePassword=%TRUSTSTORE_PASSWORD%
+
+"%JAVA_HOME%\bin\jconsole" %JMX_OPTS% %OTHER_ARGS%
+
+if "%OS%" == "Windows_NT" endlocal
+goto :eof
diff --git a/packaging/virgo/nano/bin/jconsole.sh b/packaging/virgo/nano/bin/jconsole.sh
new file mode 100755
index 0000000..0dfbcbf
--- /dev/null
+++ b/packaging/virgo/nano/bin/jconsole.sh
@@ -0,0 +1,53 @@
+#!/bin/bash
+
+if [ -z "$JAVA_HOME" ]
+then
+    echo The JAVA_HOME environment variable is not defined
+    exit 1
+fi
+
+SCRIPT="$0"
+
+# SCRIPT may be an arbitrarily deep series of symlinks. Loop until we have the concrete path.
+while [ -h "$SCRIPT" ] ; do 
+  ls=`ls -ld "$SCRIPT"`
+  # Drop everything prior to ->
+  link=`expr "$ls" : '.*-> \(.*\)$'`
+  if expr "$link" : '/.*' > /dev/null; then
+    SCRIPT="$link"
+  else
+    SCRIPT=`dirname "$SCRIPT"`/"$link"
+  fi
+done
+ 
+KERNEL_HOME=`dirname "$SCRIPT"`/..
+KERNEL_HOME=`cd $KERNEL_HOME; pwd`
+
+#parse args for the script
+TRUSTSTORE_PATH=$KERNEL_HOME/configuration/keystore
+TRUSTSTORE_PASSWORD=changeit
+
+shopt -s extglob
+
+while (($# > 0))
+	do
+	case $1 in
+	-truststore)
+			TRUSTSTORE_PATH=$2
+			shift;
+			;;
+	-truststorePassword)
+			TRUSTSTORE_PASSWORD=$2
+			shift;
+			;;
+	esac
+	shift
+done
+
+JMX_OPTS=" \
+	$JMX_OPTS \
+	-J-Dcom.sun.tools.jconsole.mbeans.keyPropertyList=category,type \
+	-J-Djavax.net.ssl.trustStore=$TRUSTSTORE_PATH \
+	-J-Djavax.net.ssl.trustStorePassword=$TRUSTSTORE_PASSWORD"
+
+$JAVA_HOME/bin/jconsole $JMX_OPTS
diff --git a/packaging/virgo/nano/bin/jmxPermissions.vbs b/packaging/virgo/nano/bin/jmxPermissions.vbs
new file mode 100644
index 0000000..0184607
--- /dev/null
+++ b/packaging/virgo/nano/bin/jmxPermissions.vbs
@@ -0,0 +1,81 @@
+configFolder = Wscript.Arguments.Item(0)
+
+'WScript.Echo "Fixing permissions on " & configFolder
+
+Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2") 'Load up WMI with the right dll
+
+Dim files(0)
+files(0) = "org.eclipse.virgo.kernel.jmxremote.access.properties"
+
+For Each file In files
+	updateInheritance(configFolder & file)
+	updateOwnership(configFolder & file)
+	updatePermissions(configFolder & file)
+Next 
+
+Sub updateInheritance(file)
+	'WScript.Echo "Updating inheritance of " & file
+	
+	Const SE_DACL_PRESENT = 4
+	Const SE_DACL_PROTECTED = 4096
+	Const SE_SELF_RELATIVE = 32768
+
+	Set objFileSecSetting = objWMIService.Get("Win32_LogicalFileSecuritySetting.Path='" & file & "'")
+    objFileSecSetting.GetSecurityDescriptor objSecurityDescriptor
+
+	objSecurityDescriptor.ControlFlags = SE_DACL_PRESENT + SE_DACL_PROTECTED + SE_SELF_RELATIVE
+
+	Set objMethod = objFileSecSetting.Methods_("SetSecurityDescriptor")
+	Set objInParam = objMethod.inParameters.SpawnInstance_()
+	objInParam.Properties_.item("Descriptor") = objSecurityDescriptor
+	objFileSecSetting.ExecMethod_ "SetSecurityDescriptor", objInParam
+	
+	'WScript.Echo "Updated inheritance of " & file
+End Sub
+
+Sub updateOwnership(file)
+	'WScript.Echo "Updating ownership of " & file
+	Set objDataFile = objWMIService.Get("CIM_DataFile.Name='" & file & "'")
+
+	Set objMethod = objDataFile.Methods_("TakeOwnerShipEx")
+	Set objInParam = objMethod.inParameters.SpawnInstance_()
+
+	objDataFile.ExecMethod_ "TakeOwnerShipEx", objInParam
+
+	'WScript.Echo "Updated ownership of " & file
+End Sub
+
+Sub updatePermissions(file)	
+	'WScript.Echo "Updating permissions of " & file
+	
+	Set objFileSecSetting = objWMIService.Get("Win32_LogicalFileSecuritySetting.Path='" & file & "'")
+    objFileSecSetting.GetSecurityDescriptor objSecurityDescriptor
+
+	Set WshNetwork = WScript.CreateObject("WScript.Network")
+	
+	Dim foundAce
+	foundAce = "false"
+	
+	'Search for an ACE for the current user as there is no robust, portable way of creating such an ACE from scratch in VBScript.
+	Dim specificAce(0)
+	For Each ace in objSecurityDescriptor.DACL
+		If ace.Trustee.Name = WshNetwork.UserName Then
+			Set specificAce(0) = ace
+			foundAce = "true"
+		End If
+	Next
+	
+	If foundAce = "true" Then
+		objSecurityDescriptor.DACL = specificAce
+
+		Set objMethod = objFileSecSetting.Methods_("SetSecurityDescriptor")
+		Set objInParam = objMethod.inParameters.SpawnInstance_()
+		objInParam.Properties_.item("Descriptor") = objSecurityDescriptor
+		objFileSecSetting.ExecMethod_ "SetSecurityDescriptor", objInParam
+		
+		'WScript.Echo "Updated permissions of " & file
+	Else
+		WScript.Echo "WARNING: jmxPermissions.vbs did not update the permissions of " & file & ". Check the file has the correct permissions."
+	End If
+	
+End Sub
diff --git a/packaging/virgo/nano/bin/setupClasspath.bat b/packaging/virgo/nano/bin/setupClasspath.bat
new file mode 100644
index 0000000..30e157c
--- /dev/null
+++ b/packaging/virgo/nano/bin/setupClasspath.bat
@@ -0,0 +1,31 @@
+@echo off
+rem Check JAVA_HOME and KERNEL_HOME variables
+if "%JAVA_HOME%" == "" (
+  echo The JAVA_HOME environment variable is not defined.
+  exit /B 1
+)
+if "%KERNEL_HOME%" == "" (
+  echo The KERNEL_HOME environment variable is not defined.
+  exit /B 1
+)
+
+rem Construct the CLASSPATH list from the Kernel lib directory.
+for %%G in ("%KERNEL_HOME%\lib\*.jar") do call :AppendToClasspath "%%G"
+for %%G in ("%KERNEL_HOME%\plugins\org.eclipse.osgi_*.jar") do call :AppendToClasspath "%%G"
+for %%G in ("%KERNEL_HOME%\plugins\org.eclipse.equinox.console.ssh_*.jar") do call :AppendToClasspath "%%G"
+
+rem Check if there are JAR files in the lib directory.
+if "%CLASSPATH%" == "" (
+  echo No JAR files found in %KERNEL_HOME%\lib
+  exit /B 1
+)
+
+rem Remove leading semi-colon if present
+if "%CLASSPATH:~0,1%"==";" set CLASSPATH=%CLASSPATH:~1%
+if "%FWCLASSPATH:~0,1%"=="," set FWCLASSPATH=%FWCLASSPATH:~1%
+exit /B 0
+
+:AppendToClasspath
+  set CLASSPATH=%CLASSPATH%;%~1
+  set FWCLASSPATH=%FWCLASSPATH%,file:///%~1
+  goto :eof
diff --git a/packaging/virgo/nano/bin/setupClasspath.sh b/packaging/virgo/nano/bin/setupClasspath.sh
new file mode 100755
index 0000000..741e0e3
--- /dev/null
+++ b/packaging/virgo/nano/bin/setupClasspath.sh
@@ -0,0 +1,40 @@
+#!/bin/bash
+
+# make sure we have JAVA_HOME set
+if [ -z "$JAVA_HOME" ]
+then
+	echo The JAVA_HOME environment variable is not defined. Using PATH instead.
+fi
+
+CLASSPATH=
+FWCLASSPATH=
+
+#  Create the classpath for bootstrapping the Server from all the JARs in lib
+for file in "$KERNEL_HOME"/lib/*
+do
+	if [[ $file == *.jar ]]
+	then
+		CLASSPATH=$CLASSPATH:$KERNEL_HOME/lib/${file##*/}
+		FWCLASSPATH=$FWCLASSPATH,file:$KERNEL_HOME/lib/${file##*/}
+	fi
+done
+
+#  Append the osgi jar to the classpath
+for file in "$KERNEL_HOME"/plugins/org.eclipse.osgi_*.jar
+do
+	CLASSPATH=$CLASSPATH:$KERNEL_HOME/plugins/${file##*/}
+	FWCLASSPATH=$FWCLASSPATH,file:$KERNEL_HOME/plugins/${file##*/}
+done
+
+#  Append the console.supportability jar to the classpath to enable ssh
+for file in "$KERNEL_HOME"/plugins/org.eclipse.equinox.console.ssh_*.jar
+do
+	CLASSPATH=$CLASSPATH:$KERNEL_HOME/plugins/${file##*/}
+done
+
+# make sure we have CLASSPATH set
+if [ -z "$CLASSPATH" ]
+then
+	echo No JAR files found in $KERNEL_HOME/lib
+	exit 1
+fi
diff --git a/packaging/virgo/nano/bin/setupVars.bat b/packaging/virgo/nano/bin/setupVars.bat
new file mode 100644
index 0000000..a5d7772
--- /dev/null
+++ b/packaging/virgo/nano/bin/setupVars.bat
@@ -0,0 +1,31 @@
+@echo off
+rem Set up env vars needed for dmk.bat and jconsole.bat (with user-pluggable mods if present)
+
+if "%SCRIPT_DIR%"=="" (
+  echo Called setupVars.bat out of context.
+  exit /B 1
+)
+
+rem Derive KERNEL_HOME full path from script's parent (no backslash)
+  for %%I in ("%SCRIPT_DIR%..") do set KERNEL_HOME=%%~fsI
+
+rem Check files exist (exit if not)
+  set ChkLst="%KERNEL_HOME%\bin\setupClasspath.bat","%KERNEL_HOME%\bin\checkJava.bat"
+
+  for %%I in (%ChkLst%) do if not exist "%%~I" (
+    echo File "%%~I" does not exist but is required.
+    exit /B 1
+  )
+
+rem set up the classpath (check result)
+  call "%KERNEL_HOME%\bin\setupClasspath.bat"
+  if not "%ERRORLEVEL%" == "0" exit /B %ERRORLEVEL%
+
+rem Run Java Version check (uses JAVA_HOME) (check result)
+  call "%KERNEL_HOME%\bin\checkJava.bat"
+  if not "%ERRORLEVEL%" == "0" exit /B %ERRORLEVEL%
+	
+rem Execute user setenv script if needed (ignore result)
+  if exist "%KERNEL_HOME%\bin\setenv.bat" call "%KERNEL_HOME%\bin\setenv.bat"
+
+goto :eof
diff --git a/packaging/virgo/nano/bin/shutdown.bat b/packaging/virgo/nano/bin/shutdown.bat
new file mode 100644
index 0000000..a2a1ff4
--- /dev/null
+++ b/packaging/virgo/nano/bin/shutdown.bat
@@ -0,0 +1,8 @@
+@ECHO OFF
+IF "%OS%" == "Windows_NT" SETLOCAL
+
+SET SCRIPT_DIR=%~dp0%
+SET EXECUTABLE=dmk.bat
+
+call "%SCRIPT_DIR%%EXECUTABLE%" stop %*
+if not "%ERRORLEVEL%"=="0" exit /B %ERRORLEVEL%
diff --git a/packaging/virgo/nano/bin/shutdown.sh b/packaging/virgo/nano/bin/shutdown.sh
new file mode 100755
index 0000000..1960446
--- /dev/null
+++ b/packaging/virgo/nano/bin/shutdown.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+
+SCRIPT="$0"
+
+# SCRIPT may be an arbitrarily deep series of symlinks. Loop until we have the concrete path.
+while [ -h "$SCRIPT" ] ; do
+  ls=`ls -ld "$SCRIPT"`
+  # Drop everything prior to ->
+  link=`expr "$ls" : '.*-> \(.*\)$'`
+  if expr "$link" : '/.*' > /dev/null; then
+    SCRIPT="$link"
+  else
+    SCRIPT=`dirname "$SCRIPT"`/"$link"
+  fi
+done
+
+SCRIPT_DIR=`dirname $SCRIPT`
+EXECUTABLE="dmk.sh"
+
+#
+# identify yourself when running under cygwin
+#
+cygwin=false
+case "$(uname)" in
+    CYGWIN*) cygwin=true ;;
+esac
+export cygwin
+
+exec "$SCRIPT_DIR"/"$EXECUTABLE" stop "$@"
diff --git a/packaging/virgo/nano/bin/startup.bat b/packaging/virgo/nano/bin/startup.bat
new file mode 100644
index 0000000..76e1618
--- /dev/null
+++ b/packaging/virgo/nano/bin/startup.bat
@@ -0,0 +1,8 @@
+@ECHO OFF
+IF "%OS%" == "Windows_NT" SETLOCAL
+
+SET SCRIPT_DIR=%~dp0%
+SET EXECUTABLE=dmk.bat
+
+call "%SCRIPT_DIR%%EXECUTABLE%" start %*
+if not "%ERRORLEVEL%"=="0" exit /B %ERRORLEVEL%
diff --git a/packaging/virgo/nano/bin/startup.sh b/packaging/virgo/nano/bin/startup.sh
new file mode 100755
index 0000000..69e43b7
--- /dev/null
+++ b/packaging/virgo/nano/bin/startup.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+
+SCRIPT="$0"
+
+# SCRIPT may be an arbitrarily deep series of symlinks. Loop until we have the concrete path.
+while [ -h "$SCRIPT" ] ; do
+  ls=`ls -ld "$SCRIPT"`
+  # Drop everything prior to ->
+  link=`expr "$ls" : '.*-> \(.*\)$'`
+  if expr "$link" : '/.*' > /dev/null; then
+    SCRIPT="$link"
+  else
+    SCRIPT=`dirname "$SCRIPT"`/"$link"
+  fi
+done
+
+SCRIPT_DIR=`dirname $SCRIPT`
+EXECUTABLE="dmk.sh"
+
+#
+# identify yourself when running under cygwin
+#
+cygwin=false
+case "$(uname)" in
+    CYGWIN*) cygwin=true ;;
+esac
+export cygwin
+
+exec "$SCRIPT_DIR"/"$EXECUTABLE" start "$@"
diff --git a/repository/.gitignore b/repository/.gitignore
new file mode 100644
index 0000000..3fbb103
--- /dev/null
+++ b/repository/.gitignore
@@ -0,0 +1,13 @@
+*/src/main/resources/META-INF/MANIFEST.MF
+*/src/test/resources/META-INF/TEST.MF
+target
+integration-repo
+ivy-cache
+.ant-targets-build.xml
+user-ivy.properties
+bin/
+build/
+.settings/
+.project
+.classpath
+
diff --git a/repository/CONTRIBUTING.md b/repository/CONTRIBUTING.md
new file mode 100644
index 0000000..e3a5790
--- /dev/null
+++ b/repository/CONTRIBUTING.md
@@ -0,0 +1,47 @@
+Contributing to Virgo
+=====================
+
+Thanks for your interest in this project.
+
+Project description:
+--------------------
+
+The Virgo Web Server from EclipseRT is a completely module-based Java application server that is designed to run enterprise Java applications and Spring-powered applications with a high degree of flexibility and reliability. It offers a simple yet comprehensive platform to develop, deploy, and service enterprise Java applications.
+The Virgo kernel supports the core concepts of Virgo and is not biased towards the web server, thus enabling other types of server to be created. The kernel can also be used stand-alone as a rich OSGi application platform. A server runtime can easily be constructed by deploying suitable bundles on top of the kernel.
+
+- https://projects.eclipse.org/projects/rt.virgo
+
+Developer resources:
+--------------------
+
+Information regarding source code management, builds, coding standards, and more.
+
+- https://projects.eclipse.org/projects/rt.virgo/developer
+
+Contributor License Agreement:
+------------------------------
+
+Before your contribution can be accepted by the project, you need to create and electronically sign the Eclipse Foundation Contributor License Agreement (CLA).
+
+- http://www.eclipse.org/legal/CLA.php
+
+Contact:
+--------
+
+Contact the project developers via the project's "dev" list.
+
+- https://dev.eclipse.org/mailman/listinfo/virgo-dev
+
+Search for bugs:
+----------------
+
+This project uses Bugzilla to track ongoing development and issues.
+
+- https://bugs.eclipse.org/bugs/buglist.cgi?product=Virgo
+
+Create a new bug:
+-----------------
+
+Be sure to search for existing bugs before you create another one. Remember that contributions are always welcome!
+
+- https://bugs.eclipse.org/bugs/enter_bug.cgi?product=Virgo
\ No newline at end of file
diff --git a/repository/build.gradle b/repository/build.gradle
new file mode 100644
index 0000000..2fe54c0
--- /dev/null
+++ b/repository/build.gradle
@@ -0,0 +1,30 @@
+project(':repository:org.eclipse.virgo.repository') {
+    dependencies {
+		testCompile group: 'org.easymock', name: 'easymock', version: easymockVersion
+
+		testCompile project(':medic:org.eclipse.virgo.medic.test')
+		testCompile project(':test:org.eclipse.virgo.test.stubs')
+        testCompile group: 'org.eclipse.virgo.mirrored', name: 'org.apache.commons.codec', version: commonsCodecVersion, ext: "jar"
+		testCompile group: 'org.eclipse.virgo.mirrored', name: 'org.apache.commons.logging', version: commonsLoggingVersion, ext: "jar"
+
+        testRuntime "org.aspectj:aspectjrt:${project.aspectjVersion}"
+
+        compile group: "org.slf4j", name: "slf4j-api", version: slf4jVersion
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi", version: equinoxVersion, configuration: "compile", ext: "jar"
+
+		compile group: 'org.eclipse.virgo.mirrored', name: 'oevm.org.apache.commons.httpclient', version: commonsHttpClientVersion, ext: "jar"
+
+		compile project(':util:org.eclipse.virgo.util.common')
+		compile project(':util:org.eclipse.virgo.util.io')
+		compile project(':util:org.eclipse.virgo.util.jmx')
+		compile project(':util:org.eclipse.virgo.util.math')
+		compile project(':util:org.eclipse.virgo.util.osgi')
+		compile project(':util:org.eclipse.virgo.util.osgi.manifest')
+		compile project(':medic:org.eclipse.virgo.medic')
+
+        if (System.properties['weaving.enabled'] == 'true') {
+            aspectpath project(':medic:org.eclipse.virgo.medic')
+            aspectpath project(':util:org.eclipse.virgo.util.jmx')
+        }
+	}
+}
diff --git a/repository/org.eclipse.virgo.repository/.settings/org.eclipse.jdt.ui.prefs b/repository/org.eclipse.virgo.repository/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..6dfa68c
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,3 @@
+#Thu Apr 16 12:42:04 BST 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates/>
diff --git a/repository/org.eclipse.virgo.repository/.settings/org.eclipse.virgo.ide.bundlor.core.prefs b/repository/org.eclipse.virgo.repository/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
new file mode 100644
index 0000000..4cfc0c3
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/.settings/org.eclipse.virgo.ide.bundlor.core.prefs
@@ -0,0 +1,5 @@
+#Wed Nov 04 15:16:17 GMT 2009
+org.eclipse.virgo.ide.bundlor.core.bundlor.generated.manifest.autoformatting=true
+org.eclipse.virgo.ide.bundlor.core.byte.code.scanning=true
+org.eclipse.virgo.ide.bundlor.core.template.properties.files=../build.properties;../build.versions
+eclipse.preferences.version=1
diff --git a/repository/org.eclipse.virgo.repository/.settings/org.eclipse.wst.common.project.facet.core.xml b/repository/org.eclipse.virgo.repository/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..92aa290
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+  <installed facet="org.eclipse.virgo.server.bundle" version="1.0"/>
+</faceted-project>
diff --git a/repository/org.eclipse.virgo.repository/.settings/org.springframework.ide.eclipse.core.prefs b/repository/org.eclipse.virgo.repository/.settings/org.springframework.ide.eclipse.core.prefs
new file mode 100644
index 0000000..f776b8b
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/.settings/org.springframework.ide.eclipse.core.prefs
@@ -0,0 +1,67 @@
+#Wed May 20 13:47:37 BST 2009
+eclipse.preferences.version=1
+org.springframework.ide.eclipse.core.builders.enable.aopreferencemodelbuilder=true
+org.springframework.ide.eclipse.core.builders.enable.beanmetadatabuilder=true
+org.springframework.ide.eclipse.core.builders.enable.osgibundleupdater=true
+org.springframework.ide.eclipse.core.enable.project.preferences=false
+org.springframework.ide.eclipse.core.validator.enable.com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.enable.com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.enable.com.springsource.sts.server.quickfix.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.enable.org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.enable.org.springframework.ide.eclipse.core.springvalidator=false
+org.springframework.ide.eclipse.core.validator.enable.org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.applicationSymbolicNameRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.applicationVersionRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleActivationPolicyRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleActivatorRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleManifestVersionRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleNameRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleSymbolicNameRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleVersionRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.exportPackageRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.importRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.parsingProblemsRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.requireBundleRule-com.springsource.server.ide.manifest.core.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.AvoidDriverManagerDataSource-com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.ImportElementsAtTopRulee-com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.ParentBeanSpecifiesAbstractClassRule-com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.RefElementRule-com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.TooManyBeansInFileRule-com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.UnnecessaryValueElementRule-com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.UseBeanInheritance-com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.legacyxmlusage.jndiobjectfactory-com.springsource.sts.bestpractices.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.importBundleVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.importLibraryVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.importPackageVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.requireBundleVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanAlias-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanClass-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanConstructorArgument-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanDefinition-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanDefinitionHolder-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanFactory-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanInitDestroyMethod-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanProperty-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanReference-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.methodOverride-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.parsingProblems-org.springframework.ide.eclipse.beans.core.beansvalidator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.requiredProperty-org.springframework.ide.eclipse.beans.core.beansvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.core.springClasspath-org.springframework.ide.eclipse.core.springvalidator=false
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.action-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.actionstate-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.attribute-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.attributemapper-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.beanaction-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.evaluationaction-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.evaluationresult-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.exceptionhandler-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.import-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.inputattribute-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.mapping-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.outputattribute-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.set-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.state-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.subflowstate-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.transition-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.variable-org.springframework.ide.eclipse.webflow.core.validator=true
+org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.webflowstate-org.springframework.ide.eclipse.webflow.core.validator=true
diff --git a/repository/org.eclipse.virgo.repository/.springBeans b/repository/org.eclipse.virgo.repository/.springBeans
new file mode 100644
index 0000000..d079ca1
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/.springBeans
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beansProjectDescription>
+	<version>1</version>
+	<pluginVersion><![CDATA[2.2.4.RELEASE]]></pluginVersion>
+	<configSuffixes>
+		<configSuffix><![CDATA[xml]]></configSuffix>
+	</configSuffixes>
+	<enableImports><![CDATA[false]]></enableImports>
+	<configs>
+	</configs>
+	<configSets>
+	</configSets>
+</beansProjectDescription>
diff --git a/repository/org.eclipse.virgo.repository/eclipse-virgo-server-index.xsd b/repository/org.eclipse.virgo.repository/eclipse-virgo-server-index.xsd
new file mode 100644
index 0000000..9b706ac
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/eclipse-virgo-server-index.xsd
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema
+		xmlns="http://www.w3.org/2001/XMLSchema"
+		xmlns:index="http://www.eclipse.org/virgo/schema/index"
+		targetNamespace="http://www.eclipse.org/virgo/schema/index"
+		elementFormDefault="qualified">
+
+<!-- Types -->
+    <complexType name="propertyType">
+    	<sequence minOccurs="0" maxOccurs="unbounded">
+    		<element name="value" type="string">
+				<annotation>
+					<documentation><![CDATA[An value of this property.]]></documentation>
+				</annotation>
+    		</element>
+    	</sequence>
+    	<attribute name="name" type="token" use="required">
+			<annotation>
+				<documentation><![CDATA[The name of this property.
+This is a unique identifier for this property within the context of an attribute.]]></documentation>
+			</annotation>
+    	</attribute>
+    </complexType>
+
+	<complexType name="attributeType">
+		<sequence minOccurs="0" maxOccurs="unbounded">
+			<element name="property" type="index:propertyType">
+				<annotation>
+					<documentation><![CDATA[An property of this attribute.]]></documentation>
+				</annotation>
+			</element>
+		</sequence>
+		<attribute name="name" type="token" use="required">
+			<annotation>
+				<documentation><![CDATA[The name of this attribute.
+This is a unique identifier for this attribute within the context of an artifact-descriptor.]]></documentation>
+			</annotation>
+		</attribute>
+		<attribute name="value" type="string" use="optional">
+			<annotation>
+				<documentation><![CDATA[The value of this attribute.]]></documentation>
+			</annotation>
+		</attribute>
+	</complexType>
+
+	<complexType name="artifactDescriptorType">
+		<sequence minOccurs="0" maxOccurs="unbounded">
+			<element name="attribute" type="index:attributeType">
+				<annotation>
+					<documentation><![CDATA[An attribute of this artifact.]]></documentation>
+				</annotation>
+			</element>
+		</sequence>
+		<attribute name="uri" type="anyURI" use="required">
+			<annotation>
+				<documentation><![CDATA[The URI of the artifact.
+This is a unique identifier for this artifact.]]></documentation>
+			</annotation>
+		</attribute>
+		<attribute name="type" type="token" use="required">
+			<annotation>
+				<documentation><![CDATA[The type of the artifact.
+This is one component of the secondary unique identifier for this artifact.]]></documentation>
+			</annotation>
+		</attribute>
+		<attribute name="name" type="token" use="required">
+			<annotation>
+				<documentation><![CDATA[The name of the artifact.
+This is one component of the secondary unique identifier for this artifact.]]></documentation>
+			</annotation>
+		</attribute>
+		<attribute name="version" use="required">
+			<annotation>
+				<documentation><![CDATA[The version of the artifact.
+This version must meet the OSGi version specification. This is one component of the secondary unique identifier for this artifact.]]></documentation>
+			</annotation>
+			<simpleType>
+				<restriction base="token">
+					<pattern value="\d(.\d(.\d(.([\w_-])+)?)?)?"></pattern>
+				</restriction>
+			</simpleType>
+		</attribute>
+	</complexType>
+
+	<complexType name="indexType">
+		<sequence minOccurs="0" maxOccurs="unbounded">
+			<element name="artifact-descriptor" type="index:artifactDescriptorType">
+				<annotation>
+					<documentation><![CDATA[An artifact-descriptor of this index.]]></documentation>
+				</annotation>
+			</element>
+		</sequence>
+	</complexType>
+
+<!-- Elements -->
+	<element name="index" type="index:indexType">
+		<annotation>
+			<documentation><![CDATA[An index is a representation of all of the artifact metadata contained in a Virgo Server repository.]]></documentation>
+		</annotation>
+	</element>
+
+</schema>
\ No newline at end of file
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/ArtifactBridge.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/ArtifactBridge.java
new file mode 100644
index 0000000..c32d0eb
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/ArtifactBridge.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository;
+
+import java.io.File;
+
+/**
+ * <p>
+ * Implementations of this interface should have knowledge of how to read a specific type of artifact and, from it,
+ * generate an {link ArtifactDescriptor}.
+ * </p>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations must be thread-safe.
+ * 
+ */
+public interface ArtifactBridge {
+
+    /**
+     * A well known key name for storing hash attributes of artifacts.
+     */
+    String HASH_KEY = "hash";
+
+    /**
+     * A well known key name for storing hash algorithm attributes of artifacts.
+     */
+    String ALGORITHM_KEY = "hash-algorithm";
+
+    /**
+     * Read the supplied <code>artifactFile</code> and builds an <code>ArtifactDescriptor</code> based upon it. It is
+     * recommended that the implementation expose public static fields for the possible <code>Attribute</code> headers
+     * it may create.
+     * <p />
+     * 
+     * An implementation should return <code>null</code> if the supplied artifact is of no interest to it. If the
+     * implementation identifies an artifact as being of interest to it but it is unable to build an
+     * <code>ArtifactDescriptor</code> from it, for example because the artifact is corrupt or ill-formed, an
+     * <code>ArtifactGenerationException</code> should be thrown.
+     * 
+     * @param artifactFile The artifact file from which the descriptor is to be extracted
+     * @return the new <code>ArtifactDescriptor</code>, or <code>null</code> if the <code>artifactFile</code> is not
+     *         understood
+     * @throws ArtifactGenerationException if the provided <code>artifactFile</code> is of interest but an
+     *         <code>ArtifactDescriptor</code> cannot be created from it.
+     */
+    ArtifactDescriptor generateArtifactDescriptor(File artifactFile) throws ArtifactGenerationException;
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/ArtifactDescriptor.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/ArtifactDescriptor.java
new file mode 100644
index 0000000..48be1d9
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/ArtifactDescriptor.java
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository;
+
+import java.io.File;
+import java.net.URI;
+import java.util.Set;
+
+import org.osgi.framework.Version;
+
+/**
+ * An <code>ArtifactDescriptor</code> describes an artifact. <code>ArtifactDescriptor</code>s are stored in a
+ * {@link Repository}. Generally, an <code>ArtifactDesciptor</code> is created by an {@link ArtifactBridge}, using a
+ * {@link org.eclipse.virgo.repository.builder.ArtifactDescriptorBuilder ArtifactDescriptorBuilder}. <code>ArtifactDescriptor</code>s can be retrieved from a repository, either by
+ * requesting them directly by type, name, and version range, or by using a {@link Query} to search the repository.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations must be thread-safe.
+ * 
+ */
+public interface ArtifactDescriptor {
+
+    /**
+     * The name attribute key
+     */
+    String NAME = "name";
+
+    /**
+     * The type attribute key
+     */
+    String TYPE = "type";
+
+    /**
+     * The uri attribute key
+     */
+    String URI = "uri";
+
+    /**
+     * The version attribute key
+     */
+    String VERSION = "version";
+
+    /**
+     * The filename attribute key
+     * 
+     * @see File#getName()
+     */
+    String FILENAME_ATTRIBUTE = "filename";
+
+    /**
+     * Each <code>ArtefactDescriptor</code>'s URI is unique within a <code>Repository</code>.
+     * 
+     * @return the unique <code>URI</code>
+     */
+    URI getUri();
+
+    /**
+     * The type of the artifact
+     * 
+     * @return The artifact's type
+     */
+    String getType();
+
+    /**
+     * The name of the artifact
+     * 
+     * @return The artifact's name
+     */
+    String getName();
+
+    /**
+     * The version of the artifact
+     * 
+     * @return The artifact's version
+     */
+    Version getVersion();
+
+    /**
+     * The suggested filename for the described artifact. May be <code>null</code> if no filename could be derived from
+     * the source <code>URI</code>.
+     * 
+     * @return The artifact's suggested filename
+     */
+    String getFilename();
+
+    /**
+     * Returns the <code>Attribute</code>s with the given name. If there are no attributes, an empty set is returned.
+     * 
+     * @param name The attribute name
+     * @return the matching <code>Attribute</code>s, never <code>null</code>
+     */
+    Set<Attribute> getAttribute(String name);
+
+    /**
+     * Get all the <code>Attribute</code>s. If there are no attributes, an empty set is returned.
+     * 
+     * @return the <code>Set</code> of <code>Attribute</code>s, never <code>null</code>
+     */
+    Set<Attribute> getAttributes();
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/ArtifactDescriptorPersister.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/ArtifactDescriptorPersister.java
new file mode 100644
index 0000000..1a07398
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/ArtifactDescriptorPersister.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository;
+
+import java.io.IOException;
+import java.util.Set;
+
+
+/**
+ * <p>
+ * Implementations of this interface are able to store and load Artifact meta data. The location where the data should
+ * be stored is to be specified in an implementation specific way.
+ * </p>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations should be Threadsafe
+ * 
+ */
+public interface ArtifactDescriptorPersister {
+
+    /**
+     * Persist the provided set of {@link RepositoryAwareArtifactDescriptor}s to a permanent medium.
+     * 
+     * @param descriptors
+     * 
+     * @throws IOException
+     */
+    void persistArtifactDescriptors(Set<RepositoryAwareArtifactDescriptor> descriptors) throws IOException;
+
+    /**
+     * Retrieve the artifacts already stored. If no {@link RepositoryAwareArtifactDescriptor}s are stored then the empty set should be returned.
+     * 
+     * @return set of ArtifactDescriptors of artifacts stored.
+     * @throws IndexFormatException
+     */
+    Set<RepositoryAwareArtifactDescriptor> loadArtifacts() throws IndexFormatException;
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/ArtifactGenerationException.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/ArtifactGenerationException.java
new file mode 100644
index 0000000..fc6aeee
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/ArtifactGenerationException.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository;
+
+/**
+ * <p>
+ * This is the exception that should be thrown by an {@link ArtifactBridge} when a failure occurs when attempting to
+ * generate an {@link ArtifactDescriptor} from an <code>artifactFile</code> that should be understood by the bridge.
+ * </p>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe
+ * 
+ */
+public class ArtifactGenerationException extends Exception {
+
+    private static final long serialVersionUID = 7018152910460019185L;
+
+    private final String artifactType; // Identification of artifact type
+    
+    /**
+     * Create a new <code>ArtifactGenerationException</code> with the supplied message and cause.
+     * 
+     * @param message A description of the failure
+     * @param cause The cause of the failure
+     */
+    public ArtifactGenerationException(String message, Throwable cause) {
+        this(message, null, cause);
+    }
+
+    /**
+     * Create a new <code>ArtifactGenerationException</code> with the supplied message and cause.
+     * 
+     * @param message A description of the failure
+     * @param artifactType Type name of artifact expected
+     * @param cause The cause of the failure
+     */
+    public ArtifactGenerationException(String message, String artifactType, Throwable cause) {
+        super(message, cause);
+        this.artifactType=artifactType;
+    }
+
+    /**
+     * Create a new <code>ArtifactGenerationException</code> with the supplied message and cause.
+     * 
+     * @param message A description of the failure
+     * @param artifactType Type name of artifact expected
+     */
+    public ArtifactGenerationException(String message, String artifactType) {
+        super(message);
+        this.artifactType=artifactType;
+    }
+
+    /**
+     * Create a new <code>ArtifactGenerationException</code> with the supplied message.
+     * 
+     * @param message A description of the failure
+     */
+    public ArtifactGenerationException(String message) {
+        this(message, null, null);
+    }
+
+    /**
+     * @return Type name of artifact.
+     */
+    public String getArtifactType() {
+        return this.artifactType;
+    }
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/Attribute.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/Attribute.java
new file mode 100644
index 0000000..195ddd5
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/Attribute.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository;
+
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * <code>Attribute</code>s are applied to an {@link ArtifactDescriptor} to provide additional information about the
+ * artifact which it describes.
+ * <p />
+ * Each <code>Attribute</code> consists of a key, a value and a collection of properties
+ * which is a map of keys to <code>Set</code>s of values.
+ * Each key and each value is a <code>String</code>. 
+ * <p/>Thus an <code>Attribute</code> can be modelled as Key x Value x (Key->setOf(Value)) <br/> 
+ * where Key and Value are <code>String</code>s
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations must be thread-safe.
+ * 
+ */
+public interface Attribute {
+
+    /**
+     * Returns the attribute's key
+     * 
+     * @return the key
+     */
+    String getKey();
+
+    /**
+     * Returns the attribute's value
+     * 
+     * @return the value
+     */
+    String getValue();
+
+    /**
+     * Return the attribute's properties. In the event of the attribute having no properties, an empty map is returned.
+     * 
+     * @return the properties
+     */
+    public abstract Map<String, Set<String>> getProperties();
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/DuplicateArtifactException.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/DuplicateArtifactException.java
new file mode 100644
index 0000000..61cac2a
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/DuplicateArtifactException.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository;
+
+/**
+ * <p>
+ * An exception that represents an attempt to add the same {@link ArtifactDescriptor} to a {@link Repository} more than once.
+ * </p>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ * 
+ */
+public class DuplicateArtifactException extends Exception {
+
+    private static final long serialVersionUID = 1058577979684094946L;
+
+    private ArtifactDescriptor original;
+
+    private ArtifactDescriptor duplicate;
+
+    /**
+     * Basic constructor taking in the two <code>ArtifactDescriptor</code>s responsible for the exception.
+     *
+     * @param original descriptor of original
+     * @param duplicate descriptor of duplicate
+     */
+    public DuplicateArtifactException(ArtifactDescriptor original, ArtifactDescriptor duplicate) {
+        super(String.format("Duplicate Artifact found '%s'", original.toString()));
+        this.duplicate = duplicate;
+        this.original = original;
+    }
+
+    /**
+     * Obtain the <code>ArtifactDescriptor</code> that could not be added as one already existed.
+     * 
+     * @return the duplicate descriptor
+     */
+    public ArtifactDescriptor getDuplicate() {
+        return this.duplicate;
+    }
+
+    /**
+     * Obtain the <code>ArtifactDescriptor</code> that was already in the repository.
+     * 
+     * @return the original descriptor
+     */
+    public ArtifactDescriptor getOriginal() {
+        return this.original;
+    }
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/HashGenerator.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/HashGenerator.java
new file mode 100644
index 0000000..52deda2
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/HashGenerator.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository;
+
+import java.io.File;
+
+import org.eclipse.virgo.repository.builder.ArtifactDescriptorBuilder;
+
+
+/**
+ * Create a hash from a file on the file system. The hash algorithm is implementation dependendent.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations must be threadsafe
+ * 
+ */
+public interface HashGenerator {
+
+    /**
+     * Generates a hash for a given file and adds both the {@link ArtifactBridge#HASH_KEY} and
+     * {@link ArtifactBridge#ALGORITHM_KEY} attributes to the {@link ArtifactDescriptor}
+     * 
+     * @param artifactDescriptorBuilder The descriptor builder to add attributes to
+     * @param artifactFile The file to generate the hash for
+     */
+    void generateHash(ArtifactDescriptorBuilder artifactDescriptorBuilder, File artifactFile);
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/IndexFormatException.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/IndexFormatException.java
new file mode 100644
index 0000000..70ebe8d
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/IndexFormatException.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository;
+
+import java.io.IOException;
+
+/**
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ * 
+ */
+public class IndexFormatException extends IOException {
+
+    private static final long serialVersionUID = 2824258135162103881L;
+
+    public IndexFormatException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    public IndexFormatException(String message) {
+        super(message);
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/Query.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/Query.java
new file mode 100644
index 0000000..26630d4
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/Query.java
@@ -0,0 +1,139 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository;
+
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.virgo.repository.internal.RepositoryUtils;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+
+/**
+ * A <code>Query</code> is created by a {@link Repository} and is used to obtain a <code>Set</code> of
+ * {@link ArtifactDescriptor ArtifactDescriptors} from the <code>Repository</code>.
+ * <p />
+ * 
+ * A <code>Query</code> encapsulates requirements that an <code>ArtifactDescriptor</code> must satisfy in order for it
+ * to match the <code>Query</code>. These requirements are in the form of name-value pairs with an optional
+ * <code>Map</code> of properties. For an <code>ArtifactDescriptor</code> to match a <code>Query</code>, for each
+ * name-value pair and optional map of properties, it must have a matching {@link Attribute}. An <code>Attribute</code>
+ * is deemed to match a requirement if it has a name and value that match the name and value of the requirement and, if
+ * the requirement includes a map of properties, this map must be equal to, or a subset of, the <code>Attribute</code>'s
+ * properties.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations must be thread-safe.
+ * 
+ */
+public interface Query {
+
+    /**
+     * Strategy for matching on <code>VersionRange</code>. Matching is done on grouped artifacts where artifact type and
+     * name are identical.
+     * 
+     * <p />
+     */
+    enum VersionRangeMatchingStrategy {
+        ALL {
+
+            @Override
+            public <T extends ArtifactDescriptor> Set<T> match(Set<T> unfiltered, VersionRange versionRange) {
+                return unfiltered;
+            }
+        },
+        HIGHEST {
+
+            @Override
+            public <T extends ArtifactDescriptor> Set<T> match(Set<T> unfiltered, VersionRange versionRange) {
+                Set<T> result = new HashSet<T>();
+
+                Set<Set<T>> grouped = RepositoryUtils.groupByTypeAndName(unfiltered);
+                for (Set<T> group : grouped) {
+                    result.add(RepositoryUtils.selectHighestVersionInRange(group, versionRange));
+                }
+
+                return result;
+            }
+        },
+        LOWEST {
+
+            @Override
+            public <T extends ArtifactDescriptor> Set<T> match(Set<T> unfiltered, VersionRange versionRange) {
+                Set<T> result = new HashSet<T>();
+
+                Set<Set<T>> grouped = RepositoryUtils.groupByTypeAndName(unfiltered);
+                for (Set<T> group : grouped) {
+                    result.add(RepositoryUtils.selectLowestVersionInRange(group, versionRange));
+                }
+
+                return result;
+            }
+        };
+
+        public abstract <T extends ArtifactDescriptor> Set<T> match(Set<T> unfiltered, VersionRange versionRange);
+    }
+
+    /**
+     * Apply a new filter to this <code>Query</code> such that, for an <code>ArtifactDescriptor</code> to match this
+     * <code>Query</code>, it must have an <code>Attribute</code> with the specified name and value.
+     * 
+     * @param name The name of the attribute
+     * @param value The value of the attribute
+     * @return the Query to allow method chaining
+     */
+    public Query addFilter(String name, String value);
+
+    /**
+     * Apply a new filter to this <code>Query</code> such that, for an {@link ArtifactDescriptor} to match this
+     * <code>Query</code>, it must have an <code>Attribute</code> with the specified name and value, and an equal set of
+     * properties.
+     * 
+     * @param name The name of the attribute
+     * @param value The value of the attribute
+     * @param properties The properties of the attribute
+     * @return the Query to allow method chaining
+     */
+    public Query addFilter(String name, String value, Map<String, Set<String>> properties);
+
+    /**
+     * Apply a new VersionRange filter to this <code>Query</code>. </p> This filter is applied after all other
+     * <code>Attribute</code> based filters and uses {@link VersionRangeMatchingStrategy#HIGHEST} matching strategy.
+     * 
+     * <p/>
+     * VersionRange filtering is applied to the artifact of the identical group, that is artifact of same type and name.
+     * 
+     * @param versionRange
+     * @return
+     */
+    public Query setVersionRangeFilter(VersionRange versionRange);
+
+    /**
+     * Apply a new VersionRange filter to the <code>Query</code> while using a specific
+     * {@link VersionRangeMatchingStrategy}
+     * 
+     * @param versionRange
+     * @param strategy
+     * @return
+     * @see #setVersionRangeFilter(VersionRange)
+     */
+    public Query setVersionRangeFilter(VersionRange versionRange, VersionRangeMatchingStrategy strategy);
+
+    /**
+     * Run the <code>Query</code>, returning a set of zero or more <code>ArtifactDescriptor</code>s.
+     * 
+     * @return the <code>Set</code> of <code>ArtifactDescriptor</code>s that match the query
+     */
+    public Set<RepositoryAwareArtifactDescriptor> run();
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/Repository.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/Repository.java
new file mode 100644
index 0000000..ef96ab8
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/Repository.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository;
+
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+
+/**
+ * A <code>Repository</code> contains {@link ArtifactDescriptor}s that can be queried by searching
+ * against the descriptors' name, type, version and associated meta-data. <code>ArtifactDescriptor</code>s can also
+ * be retrieved directly by identifying them by type, name, and version range.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations must be thread-safe.
+ * 
+ */
+public interface Repository {
+
+    /**
+     * The name of the <code>Repository</code>.
+     * 
+     * @return name of the repository
+     */
+    String getName();
+
+    /**
+     * Creates a new <code>Query</code> that will run against this <code>Repository</code> and will initially have the
+     * search filter specified by the key and value passed in.
+     * 
+     * @param key
+     * @param value
+     * @return a new <code>Query</code>
+     */
+    Query createQuery(String key, String value);
+
+    /**
+     * Creates a new <code>Query</code> that will run against this <code>Repository</code> and will initially have the
+     * search filter specified by the key, value and properties passed in.
+     * 
+     * @param key
+     * @param value
+     * @param properties
+     * @return a new <code>Query</code>
+     */
+    Query createQuery(String key, String value, Map<String, Set<String>> properties);
+    
+    /**
+     * Returns the <code>ArtifactDescriptor</code> identified by the supplied type, name, and version range. If the
+     * repository contains more than one <code>ArtifactDescriptor</code> with the supplied type and name, and version
+     * within the supplied version range, the <code>ArtifactDescriptor</code> with the highest version within the
+     * range is returned.
+     * 
+     * @param type The type of the artifact
+     * @param name The name of the artifact
+     * @param versionRange The version range within which the artifact's version must reside
+     * @return The <code>ArtifactDescriptor</code>, or <code>null</code> is no matching artifact exists in the repository.
+     */
+    RepositoryAwareArtifactDescriptor get(String type, String name, VersionRange versionRange);
+    
+    /**
+     * Stops the <code>Repository</code> allowing it to release any internal resources that it is using.
+     */
+    void stop();
+    
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/RepositoryAwareArtifactDescriptor.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/RepositoryAwareArtifactDescriptor.java
new file mode 100644
index 0000000..a613edb
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/RepositoryAwareArtifactDescriptor.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository;
+
+/**
+ * An extension to the {@link ArtifactDescriptor} interface that contains information about the repository this artifact
+ * was returned from.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations should be threadsafe
+ * 
+ */
+public interface RepositoryAwareArtifactDescriptor extends ArtifactDescriptor {
+
+    /**
+     * Get the descriptive name of the repository from which the artifact is loaded. This is null if the artifact is not
+     * loaded or no repository is known.
+     * 
+     * @return the name of the repository
+     */
+    String getRepositoryName();
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/RepositoryCreationException.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/RepositoryCreationException.java
new file mode 100644
index 0000000..e0696c0
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/RepositoryCreationException.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository;
+
+
+/**
+ * A <code>RepositoryCreationException</code> is thrown when a failure occurs during
+ * the creation of a {@link Repository}.
+ * 
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Thread-safe.
+ *
+ */
+public final class RepositoryCreationException extends Exception {
+    
+    private static final long serialVersionUID = 1119307229355907227L;
+    
+    /**
+     * Creates a new <code>RepositoryCreationException</code> with the supplied description and cause.
+     * 
+     * @param description The description of the failure
+     * @param cause The cause of the failure
+     */
+    public RepositoryCreationException(String description, Throwable cause) {
+        super(description, cause);
+    }
+    
+    /**
+     * Creates a new <code>RepositoryCreationException</code> with the supplied description.
+     * 
+     * @param description The description of the failure
+     */
+    public RepositoryCreationException(String description) {
+        super(description);
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/RepositoryFactory.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/RepositoryFactory.java
new file mode 100644
index 0000000..75e67a6
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/RepositoryFactory.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository;
+
+import java.util.List;
+
+import org.eclipse.virgo.repository.configuration.RepositoryConfiguration;
+
+
+/**
+ * A factory for creating {@link Repository Repositories}.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations <strong>must</strong> be thread-safe.
+ *
+ */
+public interface RepositoryFactory {
+    
+    /**
+     * Creates a new <code>Repository</code> from the provided list of <code>RepositoryConfigurations</code>.
+     * The created <code>Repository</code> will be backed by a chain of repositories, the ordering of which
+     * is determined by the ordering of the configuration entries in the supplied list.
+     * 
+     * @param repositoryConfigurations The list of configuration from which the chain will be created
+     * @return The chained <code>Repository</code>.
+     * @throws RepositoryCreationException 
+     */
+    Repository createRepository(List<RepositoryConfiguration> repositoryConfigurations) throws RepositoryCreationException;
+    
+    /**
+     * Creates a new <code>Repository</code> from the provided <code>RepositoryConfiguration</code>.
+     * 
+     * @param repositoryConfiguration The configuration from which the chain will be created
+     * @return The <code>Repository</code>.
+     * @throws RepositoryCreationException 
+     */
+    Repository createRepository(RepositoryConfiguration repositoryConfiguration) throws RepositoryCreationException;
+    
+    /**
+     * Creates a new <code>Repository</code> from the provided <code>RepositoryConfiguration</code> with a customised persister.
+     * 
+     * @param repositoryConfiguration The configuration from which the chain will be created
+     * @param artifactDescriptorPersister A persister to use for the artifact depository
+     * @return The <code>Repository</code>.
+     * @throws RepositoryCreationException 
+     */
+    Repository createRepository(RepositoryConfiguration repositoryConfiguration, ArtifactDescriptorPersister artifactDescriptorPersister) throws RepositoryCreationException;
+    
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/UriMapper.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/UriMapper.java
new file mode 100644
index 0000000..ae18004
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/UriMapper.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository;
+
+import java.net.URI;
+
+import org.osgi.framework.Version;
+
+/**
+ * A <code>UriMapper</code> can be provided when creating a {@link Repository} to allow a client to perform a
+ * <code>URI</code> to <code>URI</code> mapping when an artifact is being entered into the index of the
+ * <code>Repository</code>. Such mapping allows the URIs returned as part of an {@link ArtifactDescriptor} to be
+ * different to the URIs from which the artifacts were originally sourced.
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations <strong>must</strong> be thread-safe.
+ * 
+ */
+public interface UriMapper {
+
+    /**
+     * Maps the given <code>URI</code> to the returned <code>URI</code>. The given <code>URI</code> points to the
+     * artefact with the given type name and version.
+     * 
+     * @param uri The uri to be mapped
+     * @param type The type of the artefact identified by the given uri.
+     * @param name The name of the artefact identified by the given uri.
+     * @param version The version of the artefact identified by the given uri.
+     * 
+     * @return The mapped uri
+     */
+    URI map(URI uri, String type, String name, Version version);
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/WatchableRepository.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/WatchableRepository.java
new file mode 100644
index 0000000..35e0433
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/WatchableRepository.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository;
+
+import org.eclipse.virgo.repository.internal.LocationsRepository;
+
+
+/**
+ * A Repository which can also be asked to check its watched directory.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Implementations must be thread-safe.
+ *
+ */
+public interface WatchableRepository extends LocationsRepository {
+    
+    /**
+     * Synchronously check the directory being watched.
+     * @throws Exception 
+     */
+    void forceCheck() throws Exception;
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/XmlArtifactDescriptorPersister.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/XmlArtifactDescriptorPersister.java
new file mode 100644
index 0000000..34ed881
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/XmlArtifactDescriptorPersister.java
@@ -0,0 +1,103 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.virgo.repository.codec.RepositoryCodec;
+import org.eclipse.virgo.repository.internal.DelegatingRepositoryAwareArtifactDescriptor;
+import org.eclipse.virgo.repository.internal.IdentityUriMapper;
+import org.eclipse.virgo.util.io.IOUtils;
+import org.eclipse.virgo.util.io.PathReference;
+
+/**
+ * <p>
+ * An implementation of {@link ArtifactDescriptorPersister} that will convert a collection of 
+ * {@link ArtifactDescriptor}s to and from a (binary) file. The file is supplied on construction and is immutable.
+ * </p>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * This class is thread-safe.
+ * 
+ */
+public final class XmlArtifactDescriptorPersister implements ArtifactDescriptorPersister {
+
+    private final RepositoryCodec codec;
+
+    private final String repositoryName;
+
+    private final File persistenceFile;
+
+    /**
+     * @param codec De/Serialiser
+     * @param repositoryName local name of repository persisted
+     * @param persistenceFile where to persist the repository
+     */
+    public XmlArtifactDescriptorPersister(RepositoryCodec codec, String repositoryName, File persistenceFile) {
+        this.codec = codec;
+        this.repositoryName = repositoryName;
+        this.persistenceFile = persistenceFile;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void persistArtifactDescriptors(Set<RepositoryAwareArtifactDescriptor> artifacts) throws IOException {
+        OutputStream stream = null;
+        try {
+            if (!this.persistenceFile.exists()) {
+                createPersistenceFile();
+            }
+            stream = new FileOutputStream(this.persistenceFile);
+            this.codec.write(new HashSet<ArtifactDescriptor>(artifacts), stream);
+        } finally {
+            IOUtils.closeQuietly(stream);
+        }
+    }
+
+    private void createPersistenceFile() {
+        PathReference pr = new PathReference(this.persistenceFile);
+        pr.getParent().createDirectory();
+        pr.createFile();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Set<RepositoryAwareArtifactDescriptor> loadArtifacts() throws IndexFormatException {
+        if (!this.persistenceFile.exists()) {
+            return new HashSet<RepositoryAwareArtifactDescriptor>();
+        }
+        InputStream stream = null;
+        try {
+            stream = new FileInputStream(this.persistenceFile);
+            IdentityUriMapper mapper = new IdentityUriMapper();
+            HashSet<RepositoryAwareArtifactDescriptor> artifacts = new HashSet<RepositoryAwareArtifactDescriptor>();
+            for (ArtifactDescriptor descriptor : this.codec.read(stream)) {
+                artifacts.add(new DelegatingRepositoryAwareArtifactDescriptor(descriptor, this.repositoryName, mapper));
+            }
+            return artifacts;
+        } catch (FileNotFoundException e) {
+            throw new IllegalStateException(e);
+        } finally {
+            IOUtils.closeQuietly(stream);
+        }
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/builder/ArtifactDescriptorBuilder.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/builder/ArtifactDescriptorBuilder.java
new file mode 100644
index 0000000..98cee43
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/builder/ArtifactDescriptorBuilder.java
@@ -0,0 +1,136 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.builder;
+
+import java.io.File;
+import java.net.URI;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+import org.eclipse.virgo.repository.Attribute;
+import org.eclipse.virgo.repository.internal.StandardArtifactDescriptor;
+import org.osgi.framework.Version;
+
+
+/**
+ * A simple builder API for creating instances of {@link ArtifactDescriptor}.
+ * <p />
+ * Created <code>ArtifactDescriptor</code>s are created by calling {@link #build()}.
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Not threadsafe. Intended for single-threaded usage.
+ * 
+ */
+public final class ArtifactDescriptorBuilder {
+
+    private volatile URI uri;
+
+    private volatile String fileName;
+
+    private volatile String type;
+
+    private volatile String name;
+
+    private volatile Version version;
+
+    private final Set<Attribute> attributes = new HashSet<Attribute>();
+
+    /**
+     * Sets the URI for the {@link ArtifactDescriptor} being created
+     * 
+     * @param uri the URI for the {@link ArtifactDescriptor} being created
+     * @return <code>this</code> {@link ArtifactDescriptorBuilder}
+     */
+    public ArtifactDescriptorBuilder setUri(URI uri) {
+        this.uri = uri;
+        this.fileName = deriveFilename(uri);
+        return this;
+    }
+
+    /**
+     * Sets the type for the {@link ArtifactDescriptor} being created
+     * 
+     * @param type the type for the {@link ArtifactDescriptor} being created
+     * @return <code>this</code> {@link ArtifactDescriptorBuilder}
+     */
+    public ArtifactDescriptorBuilder setType(String type) {
+        this.type = type;
+        return this;
+    }
+
+    /**
+     * Sets the name for the {@link ArtifactDescriptor} being created
+     * 
+     * @param name the name for the {@link ArtifactDescriptor} being created
+     * @return <code>this</code> {@link ArtifactDescriptorBuilder}
+     */
+    public ArtifactDescriptorBuilder setName(String name) {
+        this.name = name;
+        return this;
+    }
+
+    /**
+     * Sets the version for the {@link ArtifactDescriptor} being created
+     * 
+     * @param version the version for the {@link ArtifactDescriptor} being created
+     * @return <code>this</code> {@link ArtifactDescriptorBuilder}
+     */
+    public ArtifactDescriptorBuilder setVersion(Version version) {
+        this.version = version;
+        return this;
+    }
+
+    /**
+     * Sets the version for the {@link ArtifactDescriptor} being created. This method converts the {@link String} to a
+     * proper {@link Version} internally. This conversion may fail if the input is not a properly formatted version
+     * string.
+     * 
+     * @param version the version for the {@link ArtifactDescriptor} being created
+     * @return <code>this</code> {@link ArtifactDescriptorBuilder}
+     */
+    public ArtifactDescriptorBuilder setVersion(String version) {
+        this.version = new Version(version);
+        return this;
+    }
+
+    /**
+     * Adds an attribute for the {@link ArtifactDescriptor} being created
+     * 
+     * @param attribute the attribute for the {@link ArtifactDescriptor} being created
+     * @return <code>this</code> {@link ArtifactDescriptorBuilder}
+     */
+    public ArtifactDescriptorBuilder addAttribute(Attribute attribute) {
+        this.attributes.add(attribute);
+        return this;
+    }
+
+    /**
+     * Build an {@link ArtifactDescriptor} from the values set on this builder. Creation of this
+     * {@link ArtifactDescriptor} is not guaranteed to complete successfully if some of the values have not been set or
+     * are set to illegal values.
+     * 
+     * @return a new {@link ArtifactDescriptor} created from the values set on this builder
+     */
+    public ArtifactDescriptor build() {
+        return new StandardArtifactDescriptor(this.uri, this.type, this.name, this.version, this.fileName, this.attributes);
+    }
+
+    private String deriveFilename(URI uri) {
+        if ("file".equals(uri.getScheme())) {
+            return new File(uri).getName();
+        } else {
+            return null;
+        }
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/builder/AttributeBuilder.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/builder/AttributeBuilder.java
new file mode 100644
index 0000000..d04a67a
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/builder/AttributeBuilder.java
@@ -0,0 +1,115 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.builder;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.virgo.repository.Attribute;
+import org.eclipse.virgo.repository.internal.StandardAttribute;
+
+
+/**
+ * A simple builder API for creating instances of {@link Attribute}.
+ * <p />
+ * Created <code>Attribute</code>s are created by calling {@link #build()}.
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Not threadsafe. Intended for single-threaded usage.
+ * 
+ */
+public class AttributeBuilder {
+
+    private volatile String name;
+
+    private volatile String value;
+
+    private final Map<String, Set<String>> properties = new HashMap<String, Set<String>>();
+
+    /**
+     * Sets the name for the {@link Attribute} being created
+     * 
+     * @param name the name for the {@link Attribute} being created
+     * @return <code>this</code> {@link AttributeBuilder}
+     */
+    public AttributeBuilder setName(String name) {
+        this.name = name;
+        return this;
+    }
+
+    /**
+     * Sets the value for the {@link Attribute} being created
+     * 
+     * @param value the value for the {@link Attribute} being created
+     * @return <code>this</code> {@link AttributeBuilder}
+     */
+    public AttributeBuilder setValue(String value) {
+        this.value = value;
+        return this;
+    }
+
+    /**
+     * Adds a property for the {@link Attribute} being created. Adding different values for a given key is additive and
+     * does not overwrite previously added values.
+     * 
+     * @param key the key for the property being added to the {@link Attribute} being created
+     * @param values The values for the property being added to the @{link Attribute} being created
+     * @return <code>this</code> {@link AttributeBuilder}
+     */
+    public AttributeBuilder putProperties(String key, String... values) {
+        if (!this.properties.containsKey(key)) {
+            this.properties.put(key, new HashSet<String>());
+        }
+
+        Set<String> propertiesSet = this.properties.get(key);
+        for (String value : values) {
+            propertiesSet.add(value);
+        }
+
+        return this;
+    }
+
+    /**
+     * Adds a property for the {@link Attribute} being created. Adding different values for a given key is additive and
+     * does not overwrite previously added values.
+     * 
+     * @param key the key for the property being added to the {@link Attribute} being created
+     * @param values The values for the property being added to the @{link Attribute} being created
+     * @return <code>this</code> {@link AttributeBuilder}
+     */
+    public AttributeBuilder putProperties(String key, List<String> values) {
+        if (!this.properties.containsKey(key)) {
+            this.properties.put(key, new HashSet<String>());
+        }
+
+        Set<String> propertiesSet = this.properties.get(key);
+        for (String value : values) {
+            propertiesSet.add(value);
+        }
+
+        return this;
+    }
+
+    /**
+     * Build an {@link Attribute} from the values set on this builder. Creation of this {@link Attribute} is not
+     * guaranteed to complete successfully if some of the values have not been set or are set to illegal values.
+     * 
+     * @return a new {@link Attribute} created from the values set on this builder
+     */
+    public Attribute build() {
+        return new StandardAttribute(this.name, this.value, properties);
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/codec/RepositoryCodec.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/codec/RepositoryCodec.java
new file mode 100644
index 0000000..6cab4cf
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/codec/RepositoryCodec.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.codec;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Set;
+
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+import org.eclipse.virgo.repository.IndexFormatException;
+
+
+/**
+ * An object that can serialize and deserialize a collection of artifacts
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+public interface RepositoryCodec {
+
+    /**
+     * Write out a form of a collection of artifacts
+     * 
+     * @param artifacts The artifacts to write
+     * @param outputStream The output stream to write the artifacts to
+     */
+    void write(Set<? extends ArtifactDescriptor> artifacts, OutputStream outputStream);
+
+    /**
+     * Read in a collection of artifacts
+     * 
+     * @param inputStream the input stream to read from
+     * @return the collection of artifacts that were decoded
+     * 
+     * @throws IndexFormatException if the artifacts cannot be read from the supplied input stream
+     */
+    Set<ArtifactDescriptor> read(InputStream inputStream) throws IndexFormatException;
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/codec/XMLRepositoryCodec.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/codec/XMLRepositoryCodec.java
new file mode 100644
index 0000000..5764fe6
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/codec/XMLRepositoryCodec.java
@@ -0,0 +1,251 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.codec;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URI;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.Map.Entry;
+
+import javax.xml.stream.FactoryConfigurationError;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLOutputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+import org.eclipse.virgo.repository.Attribute;
+import org.eclipse.virgo.repository.IndexFormatException;
+import org.eclipse.virgo.repository.internal.StandardArtifactDescriptor;
+import org.eclipse.virgo.repository.internal.StandardAttribute;
+import org.osgi.framework.Version;
+
+
+public final class XMLRepositoryCodec implements RepositoryCodec {
+
+    private static final String INDEX_NAMESPACE = "http://www.springsource.org/schema/repository";
+
+    private static final String TAG_REPOSITORY = "repository";
+
+    private static final String TAG_ARTIFACT = "artifact";
+
+    private static final String ATT_URI = "uri";
+
+    private static final String ATT_TYPE = "type";
+
+    private static final String ATT_NAME = "name";
+
+    private static final String ATT_VERSION = "version";
+
+    private static final String ATT_FILENAME = "filename";
+
+    private static final String TAG_ATTRIBUTE = "attribute";
+
+    private static final String ATT_VALUE = "value";
+
+    private static final String TAG_PROPERTY = "property";
+
+    private static final String TAG_VALUE = "value";
+
+    public void write(Set<? extends ArtifactDescriptor> artifactDescriptors, OutputStream outputStream) {
+        XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();
+        XMLStreamWriter writer = null;
+        try {
+            writer = outputFactory.createXMLStreamWriter(outputStream);
+
+            writer.writeStartDocument();
+            writeIndex(writer, artifactDescriptors);
+            writer.writeEndDocument();
+        } catch (FactoryConfigurationError e) {
+            throw new RuntimeException("Could not open XML Streaming factory", e);
+        } catch (XMLStreamException e) {
+            throw new RuntimeException("Could not write XML document", e);
+        } finally {
+            if (writer != null) {
+                try {
+                    writer.flush();
+                    writer.close();
+                } catch (XMLStreamException e) {
+                    // Nothing to do
+                }
+            }
+        }
+    }
+
+    private void writeIndex(XMLStreamWriter writer, Set<? extends ArtifactDescriptor> artifactDescriptors) throws XMLStreamException {
+        writer.writeStartElement(TAG_REPOSITORY);
+        writer.writeDefaultNamespace(INDEX_NAMESPACE);
+        for (ArtifactDescriptor artifactDescriptor : artifactDescriptors) {
+            writeArtifactDescriptor(writer, artifactDescriptor);
+        }
+        writer.writeEndElement();
+    }
+
+    private void writeArtifactDescriptor(XMLStreamWriter writer, ArtifactDescriptor artifactDescriptor) throws XMLStreamException {
+        writer.writeStartElement(TAG_ARTIFACT);
+        writer.writeAttribute(ATT_URI, artifactDescriptor.getUri().toString());
+        writer.writeAttribute(ATT_TYPE, artifactDescriptor.getType());
+        writer.writeAttribute(ATT_NAME, artifactDescriptor.getName());
+        writer.writeAttribute(ATT_VERSION, artifactDescriptor.getVersion().toString());
+
+        if (artifactDescriptor.getFilename() != null) {
+            writer.writeAttribute(ATT_FILENAME, artifactDescriptor.getFilename());
+        }
+
+        for (Attribute attribute : artifactDescriptor.getAttributes()) {
+            writeAttribute(writer, attribute);
+        }
+        writer.writeEndElement();
+    }
+
+    private void writeAttribute(XMLStreamWriter writer, Attribute attribute) throws XMLStreamException {
+        writer.writeStartElement(TAG_ATTRIBUTE);
+        writer.writeAttribute(ATT_NAME, attribute.getKey());
+        if (attribute.getValue() != null && !attribute.getValue().isEmpty()) {
+            writer.writeAttribute(ATT_VALUE, attribute.getValue());
+        }
+        for (Entry<String, Set<String>> property : attribute.getProperties().entrySet()) {
+            writeProperty(writer, property.getKey(), property.getValue());
+        }
+        writer.writeEndElement();
+    }
+
+    private void writeProperty(XMLStreamWriter writer, String name, Set<String> values) throws XMLStreamException {
+        writer.writeStartElement(TAG_PROPERTY);
+        writer.writeAttribute(ATT_NAME, name);
+        for (String value : values) {
+            writePropertyValue(writer, value);
+        }
+        writer.writeEndElement();
+    }
+
+    private void writePropertyValue(XMLStreamWriter writer, String value) throws XMLStreamException {
+        writer.writeStartElement(TAG_VALUE);
+        writer.writeCharacters(value);
+        writer.writeEndElement();
+    }
+
+    public Set<ArtifactDescriptor> read(InputStream inputStream) throws IndexFormatException {
+        XMLInputFactory inputFactory = XMLInputFactory.newInstance();
+        XMLStreamReader reader = null;
+
+        try {
+            reader = inputFactory.createXMLStreamReader(inputStream);
+
+            reader.nextTag();
+            return readIndex(reader);
+        } catch (XMLStreamException e) {
+            throw new IndexFormatException("Could read read XML document", e);
+        } finally {
+            if (reader != null) {
+                try {
+                    reader.close();
+                } catch (XMLStreamException e) {
+                    // Nothing to do
+                }
+            }
+        }
+    }
+
+    private Set<ArtifactDescriptor> readIndex(XMLStreamReader reader) throws XMLStreamException {
+        Set<ArtifactDescriptor> descriptors = new HashSet<ArtifactDescriptor>();
+
+        reader.nextTag();
+        while (reader.isStartElement() && TAG_ARTIFACT.equals(reader.getLocalName())) {
+            descriptors.add(readArtifactDescriptor(reader));
+            reader.nextTag();
+        }
+
+        return descriptors;
+    }
+
+    private ArtifactDescriptor readArtifactDescriptor(XMLStreamReader reader) throws XMLStreamException {
+        URI uri = URI.create(reader.getAttributeValue(null, ATT_URI));
+        String type = reader.getAttributeValue(null, ATT_TYPE);
+        String name = reader.getAttributeValue(null, ATT_NAME);
+        Version version = new Version(reader.getAttributeValue(null, ATT_VERSION));
+        String filename = reader.getAttributeValue(null, ATT_FILENAME);
+        Set<Attribute> attributes = new HashSet<Attribute>();
+
+        reader.nextTag();
+        while (reader.isStartElement() && TAG_ATTRIBUTE.equals(reader.getLocalName())) {
+            attributes.add(readAttribute(reader));
+            reader.nextTag();
+        }
+
+        return new StandardArtifactDescriptor(uri, type, name, version, filename, attributes);
+    }
+
+    private Attribute readAttribute(XMLStreamReader reader) throws XMLStreamException {
+        String name = reader.getAttributeValue(null, ATT_NAME);
+        String value = reader.getAttributeValue(null, ATT_VALUE);
+        if (value == null) {
+            value = "";
+        }
+        Map<String, Set<String>> properties = new HashMap<String, Set<String>>();
+
+        reader.nextTag();
+        while (reader.isStartElement() && TAG_PROPERTY.equals(reader.getLocalName())) {
+            Property p = readProperty(reader);
+            properties.put(p.getName(), p.getValues());
+            reader.nextTag();
+        }
+
+        return new StandardAttribute(name, value, properties);
+    }
+
+    private Property readProperty(XMLStreamReader reader) throws XMLStreamException {
+        String name = reader.getAttributeValue(null, ATT_NAME);
+        Set<String> values = new HashSet<String>();
+
+        reader.nextTag();
+        while (reader.isStartElement() && TAG_VALUE.equals(reader.getLocalName())) {
+            values.add(readPropertyValue(reader));
+            reader.nextTag();
+        }
+
+        return new Property(name, values);
+    }
+
+    private String readPropertyValue(XMLStreamReader reader) throws XMLStreamException {
+        reader.next();
+        String value = reader.getText();
+        reader.next();
+        return value;
+    }
+
+    private static class Property {
+
+        private final String name;
+
+        private final Set<String> values;
+
+        public Property(String name, Set<String> values) {
+            this.name = name;
+            this.values = values;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public Set<String> getValues() {
+            return values;
+        }
+    }
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/configuration/ExternalStorageRepositoryConfiguration.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/configuration/ExternalStorageRepositoryConfiguration.java
new file mode 100644
index 0000000..4a098e4
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/configuration/ExternalStorageRepositoryConfiguration.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.configuration;
+
+import java.io.File;
+import java.util.Set;
+
+import org.eclipse.virgo.repository.ArtifactBridge;
+import org.eclipse.virgo.repository.Repository;
+import org.eclipse.virgo.repository.UriMapper;
+import org.eclipse.virgo.repository.internal.IdentityUriMapper;
+
+
+/**
+ * Configuration for a {@link Repository} that is populated by scanning the local filesystem and finding nodes that
+ * match the supplied Ant-style path pattern.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread-safe.
+ * 
+ */
+public class ExternalStorageRepositoryConfiguration extends PersistentRepositoryConfiguration {
+
+    private final String searchPattern;
+
+    /**
+     * Creates configuration for a new <code>Repository</code> with external storage. The <code>Repository</code> will
+     * have the supplied <code>name</code> and will write its index to the supplied
+     * <code>indexLocation</code>. The <code>Repository</code> will find artifacts by scanning the filesystem looking
+     * for nodes that match the supplied Ant-style path pattern.
+     * 
+     * @param name The name of the repository
+     * @param indexLocation The location to which the repository should write its index
+     * @param artifactBridges The artifact bridges to be used to generate artifacts when items are added to the
+     *        repository
+     * @param searchPattern The Ant-style path pattern to use to identify artifacts
+     * @param mBeanDomain domain name of repository management beans to register (none registered if null)
+     */
+    public ExternalStorageRepositoryConfiguration(String name, File indexLocation, Set<ArtifactBridge> artifactBridges, String searchPattern,
+        String mBeanDomain) {
+        this(name, indexLocation, artifactBridges, searchPattern, new IdentityUriMapper(), mBeanDomain);
+    }
+
+    /**
+     * Creates configuration for a new <code>Repository</code> with external storage. The <code>Repository</code> will
+     * have the supplied <code>name</code> and will write its index to the supplied <code>indexLocation</code>. The
+     * <code>Repository</code> will find artifacts by scanning the filesystem looking for nodes that match the supplied
+     * Ant-style path pattern.
+     * 
+     * @param name The name of the repository
+     * @param indexLocation The location to which the repository should write its index
+     * @param artifactBridges The artifact bridges to be used to generate artifacts when items are added to the
+     *        repository
+     * @param searchPattern The Ant-style path pattern to use to identify artifacts
+     * @param uriMapper converter to externalise the URI exposed by this repository
+     * @param mBeanDomain domain name of repository management beans to register (none registered if null)
+     */
+    public ExternalStorageRepositoryConfiguration(String name, File indexLocation, Set<ArtifactBridge> artifactBridges, String searchPattern,
+        UriMapper uriMapper, String mBeanDomain) {
+        super(name, indexLocation, artifactBridges, uriMapper, mBeanDomain);
+        this.searchPattern = searchPattern;
+    }
+
+    /**
+     * Returns the Ant-style path pattern to be used to search for artifacts.
+     * 
+     * @return The Ant-style path pattern
+     */
+    public String getSearchPattern() {
+        return searchPattern;
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/configuration/LocalRepositoryConfiguration.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/configuration/LocalRepositoryConfiguration.java
new file mode 100644
index 0000000..d307003
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/configuration/LocalRepositoryConfiguration.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.configuration;
+
+import java.util.Set;
+
+import org.eclipse.virgo.repository.ArtifactBridge;
+import org.eclipse.virgo.repository.Repository;
+import org.eclipse.virgo.repository.UriMapper;
+import org.eclipse.virgo.repository.internal.IdentityUriMapper;
+
+
+/**
+ * Abstract super class for the configuration of a local {@link Repository}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread-safe.
+ * 
+ */
+public abstract class LocalRepositoryConfiguration extends RepositoryConfiguration {
+
+    private final Set<ArtifactBridge> artifactBridges;
+
+    private UriMapper uriMapper;
+
+    protected LocalRepositoryConfiguration(String name, Set<ArtifactBridge> artifactBridges, String mBeanDomain) {
+        this(name, artifactBridges, new IdentityUriMapper(), mBeanDomain);
+    }
+
+    protected LocalRepositoryConfiguration(String name, Set<ArtifactBridge> artefactBridges, UriMapper uriMapper, String mBeanDomain) {
+        super(name, mBeanDomain);
+
+        this.artifactBridges = artefactBridges;
+        this.uriMapper = uriMapper;
+    }
+
+    /**
+     * The <code>ArtifactBridge</code>s to be used to generate artifacts when items are added to the
+     * <code>Repository</code>.
+     * 
+     * @return the repository's artefact bridges.
+     */
+    public Set<ArtifactBridge> getArtefactBridges() {
+        return this.artifactBridges;
+    }
+
+    /**
+     * The <code>UriMapper</code> to be used to map <code>URIs</code> stored in the repository's index.
+     * 
+     * @return the repository configuration's uri mapper.
+     */
+    public UriMapper getUriMapper() {
+        return this.uriMapper;
+    }
+
+    /**
+     * Set the <code>UriMapper</code> to be used to map <code>URIs</code> stored in the repository's index.
+     * 
+     * @param uriMapper mapper to be taken by repository.
+     */
+    public void setUriMapper(UriMapper uriMapper) {
+        this.uriMapper = uriMapper;
+    }
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/configuration/ManagedStorageRepositoryConfiguration.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/configuration/ManagedStorageRepositoryConfiguration.java
new file mode 100644
index 0000000..3ad457f
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/configuration/ManagedStorageRepositoryConfiguration.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.configuration;
+
+import java.io.File;
+import java.util.Set;
+
+import org.eclipse.virgo.repository.ArtifactBridge;
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+import org.eclipse.virgo.repository.Repository;
+
+
+/**
+ * Configuration for a {@link Repository} that manages the storage of the {@link ArtifactDescriptor ArtifactDescriptors}
+ * that it contains.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread-safe.
+ * 
+ */
+public class ManagedStorageRepositoryConfiguration extends PersistentRepositoryConfiguration {
+
+    private final File storageDirectory;
+
+    /**
+     * Creates configuration for a new <code>Repository</code> with managed storage. The <code>Repository</code> will
+     * have the supplied <code>name</name> and will write its index to the supplied
+     * <code>indexLocation</code>. The <code>Repository</code> will manage the storage of its artifacts, storing them
+     * beneath the supplied <code>storageDirectory</code>. The structure of the storage beneath the supplied directory
+     * is unspecified.
+     * 
+     * @param name The name of the repository
+     * @param indexLocation The location to which the repository should write its index
+     * @param artifactBridges The artifact bridges to be used to generate artifacts when items are added to the
+     *        repository
+     * @param storageDirectory The directory beneath which the repository should store its artifacts.
+     * @param mBeanDomain the domain name of the management beans registered -- none registered if this is null
+     */
+    public ManagedStorageRepositoryConfiguration(String name, File indexLocation, Set<ArtifactBridge> artifactBridges, File storageDirectory,
+        String mBeanDomain) {
+        super(name, indexLocation, artifactBridges, mBeanDomain);
+        this.storageDirectory = storageDirectory;
+    }
+
+    public File getStorageLocation() {
+        return this.storageDirectory;
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/configuration/PersistentRepositoryConfiguration.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/configuration/PersistentRepositoryConfiguration.java
new file mode 100644
index 0000000..ba4124a
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/configuration/PersistentRepositoryConfiguration.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.configuration;
+
+import java.io.File;
+import java.util.Set;
+
+import org.eclipse.virgo.repository.ArtifactBridge;
+import org.eclipse.virgo.repository.UriMapper;
+import org.eclipse.virgo.repository.internal.PersistentRepository;
+
+
+/**
+ * Abstract superclass for the configuration of {@link PersistentRepository}
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+public abstract class PersistentRepositoryConfiguration extends LocalRepositoryConfiguration {
+
+    private final File indexLocation;
+
+    protected PersistentRepositoryConfiguration(String name, File indexLocation, Set<ArtifactBridge> artifactBridges, String mBeanDomain) {
+        super(name, artifactBridges, mBeanDomain);
+        this.indexLocation = indexLocation;
+    }
+
+    protected PersistentRepositoryConfiguration(String name, File indexLocation, Set<ArtifactBridge> artefactBridges, UriMapper uriMapper,
+        String mBeanDomain) {
+        super(name, artefactBridges, uriMapper, mBeanDomain);
+        this.indexLocation = indexLocation;
+    }
+
+    /**
+     * The location at which the repository should store its index
+     * 
+     * @return The index storage location
+     */
+    public File getIndexLocation() {
+        return this.indexLocation;
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/configuration/PropertiesRepositoryConfigurationReader.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/configuration/PropertiesRepositoryConfigurationReader.java
new file mode 100644
index 0000000..28bc292
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/configuration/PropertiesRepositoryConfigurationReader.java
@@ -0,0 +1,286 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.configuration;
+
+import java.io.File;
+import java.net.URI;
+import java.util.ArrayList;
+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.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.repository.ArtifactBridge;
+import org.eclipse.virgo.repository.internal.RepositoryLogEvents;
+import org.eclipse.virgo.util.common.StringUtils;
+import org.eclipse.virgo.util.math.OrderedPair;
+
+/**
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe
+ * 
+ */
+public final class PropertiesRepositoryConfigurationReader {
+
+    private static final String REPOSITORY_CHAIN_KEY = "chain";
+
+    private static final String TYPE_SUFFIX = ".type";
+
+    private static final String EXTERNAL_TYPE = "external";
+
+    private static final String SEARCH_PATTERN_SUFFIX = ".searchPattern";
+
+    private static final String WATCHED_TYPE = "watched";
+
+    private static final String WATCH_DIRECTORY_SUFFIX = ".watchDirectory";
+
+    private static final String WATCH_INTERVAL_SUFFIX = ".watchInterval";
+
+    private static final String REMOTE_TYPE = "remote";
+
+    private static final String URI_SUFFIX = ".uri";
+
+    private static final String INDEX_REFRESH_INTERVAL_SUFFIX = ".indexRefreshInterval";
+
+    private static final Pattern PROPERTY_PATTERN = Pattern.compile("(\\$\\{(([^\\}]+))\\})");
+
+    private static final Pattern CONFIG_PATTERN = Pattern.compile("(.*)\\.(.*)");
+
+    private static final int DEFAULT_INDEX_REFRESH_INTERVAL = 30;
+
+    private static final int DEFAULT_WATCH_INTERVAL = 5;
+
+    private final EventLogger eventLogger;
+
+    private final File indexDirectory;
+
+    private final Set<ArtifactBridge> artifactBridges;
+
+    private final String mBeanDomain;
+    
+    private final File rootDirectory;
+    
+    public PropertiesRepositoryConfigurationReader(File indexDirectory, Set<ArtifactBridge> artifactBridges, EventLogger eventLogger, String mBeanDomain) {
+    	this(indexDirectory, artifactBridges, eventLogger, mBeanDomain, new File("."));
+    }
+
+    public PropertiesRepositoryConfigurationReader(File indexDirectory, Set<ArtifactBridge> artifactBridges, EventLogger eventLogger,
+        String mBeanDomain, File rootDirectory) {
+        this.indexDirectory = indexDirectory;
+        this.artifactBridges = artifactBridges;
+        this.eventLogger = eventLogger;
+        this.mBeanDomain = mBeanDomain;
+        this.rootDirectory = rootDirectory;
+    }
+
+    /**
+     * @param configuration properties
+     * @return OrderedPair of a map of configurations and a list of repository names in the chain
+     * @throws RepositoryConfigurationException if configuration inconsistent or malformed
+     * @see OrderedPair
+     */
+    public OrderedPair<Map<String, RepositoryConfiguration>, List<String>> readConfiguration(Properties configuration)
+        throws RepositoryConfigurationException {
+        Map<String, RepositoryConfiguration> repositoryConfigurations = readRepositoriesConfiguration(configuration);
+
+        List<String> chainList = readChainConfiguration(configuration, repositoryConfigurations);
+
+        return new OrderedPair<Map<String, RepositoryConfiguration>, List<String>>(repositoryConfigurations, chainList);
+    }
+
+    private List<String> readChainConfiguration(Properties configuration, Map<String, RepositoryConfiguration> repositoryConfigurations) {
+        String chainProperty = configuration.getProperty(REPOSITORY_CHAIN_KEY);
+
+        List<String> chainList = new ArrayList<String>();
+
+        if (chainProperty == null) {
+            return chainList;
+        }
+
+        for (String repositoryName : StringUtils.commaDelimitedListToStringArray(chainProperty)) {
+            if (repositoryConfigurations.containsKey(repositoryName)) {
+                if (chainList.contains(repositoryName)) {
+                    eventLogger.log(RepositoryLogEvents.DUPLICATE_REPOSITORY_IN_CHAIN, repositoryName);
+                } else {
+                    chainList.add(repositoryName);
+                }
+            } else {
+                eventLogger.log(RepositoryLogEvents.CHAIN_REFERENCES_MISSING_REPOSITORY, repositoryName);
+            }
+        }
+        return chainList;
+    }
+
+    private Map<String, RepositoryConfiguration> readRepositoriesConfiguration(Properties configuration) {
+        Map<String, RepositoryConfiguration> configurations = new HashMap<String, RepositoryConfiguration>();
+        for (String repositoryName : getRepositoryNames(configuration)) {
+            RepositoryConfiguration repositoryConfiguration = readRepositoryConfiguration(repositoryName, configuration);
+            if (repositoryConfiguration != null) {
+                configurations.put(repositoryConfiguration.getName(), repositoryConfiguration);
+            }
+        }
+        return configurations;
+    }
+
+    private RepositoryConfiguration readRepositoryConfiguration(String repositoryName, Properties configuration) {
+        String type = configuration.getProperty(repositoryName + TYPE_SUFFIX);
+        if (type != null) {
+            if (EXTERNAL_TYPE.equals(type)) {
+                return readExternalRepositoryConfiguration(repositoryName, configuration);
+            } else if (REMOTE_TYPE.equals(type)) {
+                return readRemoteRepositoryConfiguration(repositoryName, configuration);
+            } else if (WATCHED_TYPE.equals(type)) {
+                return readWatchedRepositoryConfiguration(repositoryName, configuration);
+            } else {
+                eventLogger.log(RepositoryLogEvents.UNKNOWN_REPOSITORY_TYPE, type, repositoryName);
+            }
+        } else {
+            eventLogger.log(RepositoryLogEvents.NO_REPOSITORY_TYPE, repositoryName);
+        }
+        return null;
+    }
+
+    private ExternalStorageRepositoryConfiguration readExternalRepositoryConfiguration(String repositoryName, Properties configuration) {
+        String searchPattern = configuration.getProperty(repositoryName + SEARCH_PATTERN_SUFFIX);
+        if (searchPattern != null) {
+            searchPattern = convertPath(searchPattern);
+            searchPattern = makeAbsoluteIfNecessary(searchPattern);
+            return new ExternalStorageRepositoryConfiguration(repositoryName, new File(this.indexDirectory, repositoryName + ".index"),
+                this.artifactBridges, searchPattern, mBeanDomain);
+        } else {
+            eventLogger.log(RepositoryLogEvents.MISSING_SPECIFICATION, repositoryName, EXTERNAL_TYPE, SEARCH_PATTERN_SUFFIX);
+        }
+        return null;
+    }
+
+    private RemoteRepositoryConfiguration readRemoteRepositoryConfiguration(String repositoryName, Properties configuration) {
+        String uri = expandProperties(configuration.getProperty(repositoryName + URI_SUFFIX));
+        if (uri != null) {
+            String refreshIntervalProperty = repositoryName + INDEX_REFRESH_INTERVAL_SUFFIX;
+            int indexRefreshInterval = readIntProperty(refreshIntervalProperty, configuration, DEFAULT_INDEX_REFRESH_INTERVAL);
+            
+            File cacheDirectory = getCacheDirectory();
+
+            return new RemoteRepositoryConfiguration(repositoryName, new File(this.indexDirectory, repositoryName + ".index"), URI.create(uri),
+                indexRefreshInterval, mBeanDomain, cacheDirectory);
+        } else {
+            eventLogger.log(RepositoryLogEvents.MISSING_SPECIFICATION, repositoryName, REMOTE_TYPE, URI_SUFFIX);
+        }
+        return null;
+    }
+
+    private File getCacheDirectory() {
+        return new File(this.indexDirectory, "cache");
+    }
+
+    private WatchedStorageRepositoryConfiguration readWatchedRepositoryConfiguration(String repositoryName, Properties configuration) {
+        String watchDirPath = expandProperties(configuration.getProperty(repositoryName + WATCH_DIRECTORY_SUFFIX));
+        
+        if (watchDirPath != null) {
+            watchDirPath = makeAbsoluteIfNecessary(watchDirPath);
+            String watchIntervalProperty = repositoryName + WATCH_INTERVAL_SUFFIX;
+            int watchInterval = readIntProperty(watchIntervalProperty, configuration, DEFAULT_WATCH_INTERVAL);
+            return new WatchedStorageRepositoryConfiguration(repositoryName, new File(this.indexDirectory, repositoryName + ".index"), this.artifactBridges, watchDirPath, watchInterval, mBeanDomain);
+        } 
+        return null;
+    }
+
+    private int readIntProperty(String propertyKey, Properties configuration, int defaultValue) {
+        String propertyValue = expandProperties(configuration.getProperty(propertyKey));
+
+        if (propertyValue != null) {
+            try {
+                return Integer.parseInt(propertyValue);
+            } catch (NumberFormatException nfe) {
+                eventLogger.log(RepositoryLogEvents.MALFORMED_INT_PROPERTY, propertyValue, propertyKey, defaultValue);
+            }
+        }
+
+        return defaultValue;
+    }
+
+    private Set<String> getRepositoryNames(Properties configuration) {
+        Set<String> repositoryNames = new HashSet<String>();
+        for (Object propertyName : configuration.keySet()) {
+            if (!"service.pid".equals(propertyName) && !REPOSITORY_CHAIN_KEY.equals(propertyName)) {
+                Matcher matcher = CONFIG_PATTERN.matcher((String) propertyName);
+                if (matcher.find()) {
+                    String repositoryName = matcher.group(1);
+                    if (repositoryName != null)
+                        repositoryNames.add(repositoryName);
+                }
+            }
+        }
+        return repositoryNames;
+    }
+
+    public static String convertToAntStylePath(String searchPath) {
+        return searchPath.replaceAll("\\{[^\\}]+\\}", "*");
+    }
+
+    private String expandProperties(String value) {
+        if (value == null) {
+            return value;
+        }
+
+        Pattern regex = PROPERTY_PATTERN;
+        StringBuffer buffer = new StringBuffer(value.length());
+        Matcher matcher = regex.matcher(value);
+        int propertyGroup = matcher.groupCount();
+        String key, property = "";
+        while (matcher.find()) {
+            key = matcher.group(propertyGroup);
+            property = "";
+            if (key.contains("::")) {
+                String[] keyDefault = key.split("::");
+                property = System.getProperty(keyDefault[0]);
+                if (property == null) {
+                    property = keyDefault[1];
+                } else {
+                    property = property.replace('\\', '/');
+                }
+            } else {
+                String systemProperty = System.getProperty(matcher.group(propertyGroup));
+                if (systemProperty != null) {
+                    property = systemProperty.replace('\\', '/');
+                }
+            }
+            matcher.appendReplacement(buffer, property);
+        }
+        matcher.appendTail(buffer);
+        return buffer.toString();
+    }
+
+    private String convertPath(String path) {
+        return convertToAntStylePath(expandProperties(path));
+    }
+
+    private String makeAbsoluteIfNecessary(String path) {
+        String absolutePathPattern;
+        if (!path.startsWith("/") && !(path.indexOf(":") > 0)) {
+            absolutePathPattern = this.rootDirectory.getAbsolutePath() + File.separator + path;
+        } else {
+            absolutePathPattern = path;
+        }
+        if (File.separator.equals("/")) {
+            return absolutePathPattern.replace('\\', '/');
+        } else {
+            return absolutePathPattern.replace('/', '\\');
+        }
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/configuration/RemoteRepositoryConfiguration.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/configuration/RemoteRepositoryConfiguration.java
new file mode 100644
index 0000000..fc9deba
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/configuration/RemoteRepositoryConfiguration.java
@@ -0,0 +1,97 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.configuration;
+
+import java.io.File;
+import java.net.URI;
+
+import org.eclipse.virgo.repository.Repository;
+
+
+/**
+ * Configuration for a {@link Repository} that is a proxy for a remote repository.
+ * 
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread-safe.
+ * 
+ */
+public class RemoteRepositoryConfiguration extends RepositoryConfiguration {
+
+    private final File indexLocation;
+
+    private final URI repositoryUri;
+
+    private final int indexUpdateInterval;
+
+    private final File cacheDirectory;
+
+    /**
+     * Creates configuration for a new <code>Repository</code> that is a proxy for a remote repository, with the remote
+     * repository being accessible at the location identified by the supplied <code>repositoryUri</code>. The
+     * <code>Repository</code> will have the supplied <code>name</code> and may write a local copy of the remote
+     * repository's index to the supplied <code>indexLocation</code>.
+     * 
+     * @param name The name of the repository
+     * @param indexLocation The location to which the repository should write its local copy of the index
+     * @param repositoryUri The location of the remote repository
+     * @param indexUpdateInterval The period, in seconds, between updates to the local copy of the remote index
+     * @param mBeanDomain the domain name of the management beans registered for this repository; if null no MBeans are
+     *        registered
+     * @param cacheDirectory the directory for cacheing remote artifacts
+     */
+    public RemoteRepositoryConfiguration(String name, File indexLocation, URI repositoryUri, int indexUpdateInterval, String mBeanDomain,
+        File cacheDirectory) {
+        super(name, mBeanDomain);
+        this.indexLocation = indexLocation;
+        this.repositoryUri = repositoryUri;
+        this.indexUpdateInterval = indexUpdateInterval;
+        this.cacheDirectory = cacheDirectory;
+    }
+
+    /**
+     * Returns the location of the remote repository.
+     * 
+     * @return the remote repository's location.
+     */
+    public URI getRepositoryUri() {
+        return this.repositoryUri;
+    }
+
+    /**
+     * Returns the interval, in seconds, between updates to the local copy of the remote index.
+     * 
+     * @return the index update interval
+     */
+    public int getIndexUpdateInterval() {
+        return this.indexUpdateInterval;
+    }
+
+    /**
+     * Returns the location for this index to be written locally
+     * 
+     * @return the index location
+     */
+    public File getIndexLocation() {
+        return this.indexLocation;
+    }
+
+    /**
+     * Returns the directory to be used to store cached remote artifacts.
+     * 
+     * @return the cache directory
+     */
+    public File getCacheDirectory() {
+        return this.cacheDirectory;
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/configuration/RepositoryConfiguration.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/configuration/RepositoryConfiguration.java
new file mode 100644
index 0000000..ab02569
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/configuration/RepositoryConfiguration.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.configuration;
+
+import org.eclipse.virgo.repository.Repository;
+import org.eclipse.virgo.repository.RepositoryFactory;
+
+/**
+ * <code>RepositoryConfiguration</code> provides the information that is used by a {@link RepositoryFactory} to create a
+ * {@link Repository}.
+ * 
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread-safe, and concrete subclass <strong>must</strong> be thread-safe.
+ * 
+ * 
+ * @see Repository
+ * @see RepositoryFactory
+ */
+public abstract class RepositoryConfiguration {
+
+    private final String name;
+
+    private final String mBeanDomain;
+
+    protected RepositoryConfiguration(String name, String mBeanDomain) {
+        this.name = name;
+        this.mBeanDomain = mBeanDomain;
+        validate();
+    }
+
+    /**
+     * The name of the repository
+     * 
+     * @return the repository's name
+     */
+    public String getName() {
+        return this.name;
+    }
+
+    /**
+     * The domain for management beans to be registered under
+     * 
+     * @return the mBean domain name
+     */
+    public String getMBeanDomain() {
+        return this.mBeanDomain;
+    }
+
+    /**
+     * Check that name is valid
+     */
+    private final void validate() {
+        char[] chars = this.name.toCharArray();
+        for (char ch : chars) {
+            if ('A' <= ch && ch <= 'Z') {
+                continue;
+            }
+            if ('a' <= ch && ch <= 'z') {
+                continue;
+            }
+            if ('0' <= ch && ch <= '9') {
+                continue;
+            }
+            if (ch == '_' || ch == '-') {
+                continue;
+            }
+            throw new IllegalArgumentException("invalid repository name '" + this.name + "'");
+        }
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/configuration/RepositoryConfigurationException.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/configuration/RepositoryConfigurationException.java
new file mode 100644
index 0000000..0612c66
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/configuration/RepositoryConfigurationException.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.configuration;
+
+/**
+ * A <code>RepositoryConfigurationException</code> is thrown if a failure occurs
+ * when reading repository configuration.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread-safe.
+ *
+ */
+public final class RepositoryConfigurationException extends Exception {
+    
+    private static final long serialVersionUID = 5585588809690377183L;
+
+    public RepositoryConfigurationException(String message) {
+        super(message);
+    }
+    
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/configuration/WatchedStorageRepositoryConfiguration.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/configuration/WatchedStorageRepositoryConfiguration.java
new file mode 100644
index 0000000..e060aa6
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/configuration/WatchedStorageRepositoryConfiguration.java
@@ -0,0 +1,117 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.configuration;
+
+import java.io.File;
+import java.util.Set;
+
+import org.eclipse.virgo.repository.ArtifactBridge;
+import org.eclipse.virgo.repository.Repository;
+import org.eclipse.virgo.repository.UriMapper;
+import org.eclipse.virgo.repository.internal.IdentityUriMapper;
+
+
+/**
+ * Configuration for a {@link Repository} that is populated by watching a directory.
+ * 
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread-safe.
+ * 
+ */
+public class WatchedStorageRepositoryConfiguration extends PersistentRepositoryConfiguration {
+
+    private final File directoryToWatch;
+
+    /**
+     * Period, in seconds, to wait between checking the <code>directoryToWatch</code>
+     */
+    private final int watchInterval;
+
+    /**
+     * Creates configuration for a new <code>Repository</code> with watched storage. The <code>Repository</code> will
+     * have the supplied <code>name</name> and will write its index to the supplied
+     * <code>indexLocation</code>. The <code>Repository</code> will watch the supplied <code>directory</code> adding
+     * artifacts as files are added to the directory, and removing artifacts as files are removed from the directory.
+     * The directory will be checked at the supplied <code>watchInterval</code>, measured in seconds.
+     * 
+     * @param name The name of the repository
+     * @param indexLocation Location of persistence indexes if used
+     * @param artifactBridges The artifact bridges to be used to generate artifacts when items are added to the
+     *        repository
+     * @param directoryToWatch The path of a directory to be watched
+     * @param watchInterval The period, in seconds, between checks of the watched directory; must be > 0.
+     * @param mBeanDomain domain name of management beans registered -- none registered if null
+     */
+    public WatchedStorageRepositoryConfiguration(String name, File indexLocation, Set<ArtifactBridge> artifactBridges, String directoryToWatch, int watchInterval,
+        String mBeanDomain) {
+        this(name, indexLocation, artifactBridges, directoryToWatch, watchInterval, new IdentityUriMapper(), mBeanDomain);
+    }
+
+    /**
+     * Creates configuration for a new <code>Repository</code> with watched storage. The <code>Repository</code> will
+     * have the supplied <code>name</name> and will write its index to the supplied
+     * <code>indexLocation</code>. The <code>Repository</code> will watch the supplied <code>directory</code> adding
+     * artifacts as files are added to the directory, and removing artifacts as files are removed from the directory.
+     * The directory will be checked at the supplied <code>watchInterval</code>, measured in seconds.
+     * 
+     * @param name The name of the repository
+     * @param indexLocation location of persistent indexes if any
+     * @param artifactBridges The artifact bridges to be used to generate artifacts when items are added to the
+     *        repository
+     * @param directoryToWatch The path of a directory to be watched
+     * @param watchInterval The period, in seconds, between checks of the watched directory; must be > 0.
+     * @param uriMapper used to map URIs stored in the repository's index
+     * @param mBeanDomain domain name of management beans registered -- none registered if null
+     */
+    public WatchedStorageRepositoryConfiguration(String name, File indexLocation, Set<ArtifactBridge> artifactBridges, String directoryToWatch, int watchInterval,
+        UriMapper uriMapper, String mBeanDomain) {
+        super(name, indexLocation, artifactBridges, uriMapper, mBeanDomain);
+        this.directoryToWatch = validateWatchDirectory(directoryToWatch);
+        if (watchInterval <= 0) {
+            throw new IllegalArgumentException("watch interval (" + watchInterval + ") must be 1 or more seconds");
+        }
+        this.watchInterval = watchInterval;
+    }
+
+    private File validateWatchDirectory(String watchDirPath) {
+        if (watchDirPath==null) {
+            throw new IllegalArgumentException("watch directory path must not be null");
+        } else {
+            try {
+                File wdFile = new File(watchDirPath);
+                if (!wdFile.exists()) return wdFile;
+                if (wdFile.isDirectory()) return wdFile;
+            } catch (Exception e) { }
+        }
+        throw new IllegalArgumentException("watch directory path '" + watchDirPath + "' is not a valid directory path");
+    }
+
+    /**
+     * Returns the directory to be watched
+     * 
+     * @return the watched directory
+     */
+    public File getDirectoryToWatch() {
+        return this.directoryToWatch;
+    }
+
+    /**
+     * Returns the interval, in seconds, between checks of the watched directory
+     * 
+     * @return the watch interval
+     */
+    public int getWatchInterval() {
+        return this.watchInterval;
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/ArtifactDescriptorDepository.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/ArtifactDescriptorDepository.java
new file mode 100644
index 0000000..86b0ffd
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/ArtifactDescriptorDepository.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal;
+
+import java.io.IOException;
+import java.net.URI;
+import java.util.Set;
+
+import org.eclipse.virgo.repository.Attribute;
+import org.eclipse.virgo.repository.DuplicateArtifactException;
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+
+
+/**
+ * <p>
+ * The <code>ArtifactDescriptorDepository</code> is an internal interface for the actual store of Artifacts in the repository. It
+ * allows the Repository itself to be independent of storage, indexing and search algorithms.
+ * </p>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations must be Thread Safe
+ * 
+ */
+public interface ArtifactDescriptorDepository {
+
+    /**
+     * Obtain a simple count of the number of Artefacts in the Depository. The count should be checked in isolation to
+     * any updates to the Depository.
+     * 
+     * @return int count of Artefacts
+     */
+    int getArtifactDescriptorCount();
+
+    /**
+     * Add a new artefact to the Depository
+     * 
+     * @param artifactDesc
+     * @throws DuplicateArtifactException if an Artefact of the same name, type and version or URI already exists in the
+     *         Depository
+     */
+    void addArtifactDescriptor(RepositoryAwareArtifactDescriptor artifactDesc) throws DuplicateArtifactException;
+
+    /**
+     * Remove the Artefact identified by the given <code>URI</code>
+     * 
+     * @param uri
+     * @return the descriptor of the removed Artefact, or null if no artefact found by that URI.
+     */
+    RepositoryAwareArtifactDescriptor removeArtifactDescriptor(URI uri);
+
+    /**
+     * Remove the supplied <code>ArtifactDescriptor</code> from the depository.
+     * 
+     * @param artifactDescriptor The <code>ArtifactDescriptor</code> to remove from the depository
+     * @return <code>true</code> if the <code>ArtifactDescriptor</code> was found and remove, otherwise
+     *         <code>false</code>.
+     */
+    boolean removeArtifactDescriptor(RepositoryAwareArtifactDescriptor artifactDescriptor);
+
+    /**
+     * Return all stored Artefacts that match the provided set of filters.
+     * 
+     * @param filters the {@link Attribute Attributes} to filter on. Can be null.
+     * @return <code>Set</code> of matching Artefacts
+     */
+    Set<RepositoryAwareArtifactDescriptor> resolveArtifactDescriptors(Set<Attribute> filters);
+
+    /**
+     * Request that the Depository store its current state to the configured location.
+     * 
+     * @throws IOException
+     * 
+     */
+    void persist() throws IOException;
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/BaseRepository.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/BaseRepository.java
new file mode 100644
index 0000000..8e57f0f
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/BaseRepository.java
@@ -0,0 +1,113 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal;
+
+import java.lang.management.ManagementFactory;
+import java.util.Map;
+import java.util.Set;
+
+import javax.management.JMException;
+import javax.management.ObjectInstance;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+import org.eclipse.virgo.repository.Query;
+import org.eclipse.virgo.repository.Repository;
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+import org.eclipse.virgo.repository.configuration.RepositoryConfiguration;
+import org.eclipse.virgo.repository.internal.management.RepositoryObjectNameFactory;
+import org.eclipse.virgo.repository.management.RepositoryInfo;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+
+/**
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread-safe. Subclasses <strong>must</strong> be thread-safe.
+ * 
+ */
+public abstract class BaseRepository implements Repository {
+
+    // Domain name for management beans: if null, no beans are registered.
+    private final String mBeanDomain;
+    
+    private static final Logger LOGGER = LoggerFactory.getLogger(BaseRepository.class);
+
+    private final String name;
+
+    private final ArtifactDescriptorDepository artifactDepository;
+
+    private volatile ObjectInstance mBean;
+
+    protected BaseRepository(RepositoryConfiguration configuration, ArtifactDescriptorDepository artifactDepository) {
+        this.name = configuration.getName();
+        this.mBeanDomain = configuration.getMBeanDomain();
+        this.artifactDepository = artifactDepository;
+    }
+
+    protected void start() {
+        if (this.mBeanDomain!=null) {
+            try {
+                this.mBean = ManagementFactory.getPlatformMBeanServer().registerMBean(createMBean(),
+                    RepositoryObjectNameFactory.createObjectName(this.mBeanDomain, this.name));
+            } catch (JMException jme) {
+                LOGGER.warn(String.format("Management Bean for repository '%s' not registered.", this.name), jme);
+            }
+        }
+    }
+
+    protected abstract RepositoryInfo createMBean() throws JMException;
+    
+    public void stop() {
+        if (this.mBean != null) {
+            try {
+                ManagementFactory.getPlatformMBeanServer().unregisterMBean(this.mBean.getObjectName());
+            } catch (JMException jme) {
+                LOGGER.warn(String.format("Management Bean for repository '%s' cannot be unregistered.", this.name), jme);
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public final String getName() {
+        return this.name;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public final RepositoryAwareArtifactDescriptor get(String type, String name, VersionRange versionRange) {
+        Set<RepositoryAwareArtifactDescriptor> artifacts = createQuery(ArtifactDescriptor.TYPE, type).addFilter(ArtifactDescriptor.NAME, name).run();
+        return RepositoryUtils.selectHighestVersionInRange(artifacts, versionRange);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Query createQuery(String key, String value) {
+        return new StandardQuery(this.artifactDepository, key, value);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Query createQuery(String key, String value, Map<String, Set<String>> properties) {
+        return new StandardQuery(this.artifactDepository, key, value, properties);
+    }
+
+    public final ArtifactDescriptorDepository getDepository() {
+        return this.artifactDepository;
+    }
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/DelegatingRepositoryAwareArtifactDescriptor.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/DelegatingRepositoryAwareArtifactDescriptor.java
new file mode 100644
index 0000000..4061b9f
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/DelegatingRepositoryAwareArtifactDescriptor.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal;
+
+import java.util.Set;
+
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+import org.eclipse.virgo.repository.Attribute;
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+import org.eclipse.virgo.repository.UriMapper;
+import org.osgi.framework.Version;
+
+
+public final class DelegatingRepositoryAwareArtifactDescriptor implements RepositoryAwareArtifactDescriptor {
+
+    private final ArtifactDescriptor delegate;
+
+    private final String repositoryName;
+
+    private final UriMapper mapper;
+
+    public DelegatingRepositoryAwareArtifactDescriptor(ArtifactDescriptor delegate, String repositoryName, UriMapper mapper) {
+        this.delegate = delegate;
+        this.repositoryName = repositoryName;
+        this.mapper = mapper;
+    }
+
+    public String getRepositoryName() {
+        return this.repositoryName;
+    }
+
+    public Set<Attribute> getAttribute(String name) {
+        return this.delegate.getAttribute(name);
+    }
+
+    public Set<Attribute> getAttributes() {
+        return this.delegate.getAttributes();
+    }
+
+    public String getFilename() {
+        return this.delegate.getFilename();
+    }
+
+    public String getName() {
+        return this.delegate.getName();
+    }
+
+    public String getType() {
+        return this.delegate.getType();
+    }
+
+    public java.net.URI getUri() {
+        return this.mapper.map(this.delegate.getUri(), this.delegate.getType(), this.delegate.getName(), this.delegate.getVersion());
+    }
+
+    public Version getVersion() {
+        return this.delegate.getVersion();
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (obj == null) {
+            return false;
+        }
+        if (this.getClass().equals(obj.getClass())) {
+            return this.delegate.equals(((DelegatingRepositoryAwareArtifactDescriptor) obj).delegate);
+        } else if (this.delegate.getClass().isAssignableFrom(obj.getClass())) {
+            return this.delegate.equals(obj);
+        }
+        return false;
+    }
+
+    @Override
+    public int hashCode() {
+        return this.delegate.hashCode();
+    }
+
+    @Override
+    public String toString() {
+        return this.delegate.toString();
+    }
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/IdentityUriMapper.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/IdentityUriMapper.java
new file mode 100644
index 0000000..9b6c193
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/IdentityUriMapper.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal;
+
+import java.net.URI;
+
+import org.eclipse.virgo.repository.UriMapper;
+import org.osgi.framework.Version;
+
+
+public final class IdentityUriMapper implements UriMapper {
+
+    /** 
+     * {@inheritDoc}
+     */
+    public URI map(URI uri, String type, String name, Version version) {
+        return uri;
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/Index.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/Index.java
new file mode 100644
index 0000000..60f1115
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/Index.java
@@ -0,0 +1,97 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.virgo.repository.Attribute;
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+
+
+/**
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * <strong>Not</strong> thread-safe
+ * 
+ */
+final class Index {
+
+    private static final Set<Attribute> EMPTY_ATTRIBUTE_SET = Collections.emptySet();
+
+    private final Map<String, Map<String, Set<Attribute>>> attributeIndex = new HashMap<String, Map<String, Set<Attribute>>>();
+
+    private final Map<Attribute, RepositoryAwareArtifactDescriptor> artifactDescriptorIndex = new HashMap<Attribute, RepositoryAwareArtifactDescriptor>(); // Attribute
+
+    Index(Collection<RepositoryAwareArtifactDescriptor> artifactDescriptors) {
+        for (RepositoryAwareArtifactDescriptor artifactDescriptor : artifactDescriptors) {
+            this.addArtifactDescriptor(artifactDescriptor);
+        }
+    }
+
+    void addArtifactDescriptor(RepositoryAwareArtifactDescriptor artefact) {
+        for (Attribute attribute : artefact.getAttributes()) {
+            this.artifactDescriptorIndex.put(attribute, artefact);
+            Map<String, Set<Attribute>> valueIndex = this.attributeIndex.get(attribute.getKey());
+            if (valueIndex == null) {
+                valueIndex = new HashMap<String, Set<Attribute>>();
+                this.attributeIndex.put(attribute.getKey(), valueIndex);
+            }
+            Set<Attribute> attributes = valueIndex.get(attribute.getValue());
+            if (attributes == null) {
+                attributes = new HashSet<Attribute>();
+                valueIndex.put(attribute.getValue(), attributes);
+            }
+            attributes.add(attribute);
+
+        }
+    }
+
+    void removeArtifactDescriptor(RepositoryAwareArtifactDescriptor artifactDescriptor) {
+        for (Attribute attribute : artifactDescriptor.getAttributes()) {
+            if (this.artifactDescriptorIndex.containsKey(attribute)) {
+                this.artifactDescriptorIndex.remove(attribute);
+                Map<String, Set<Attribute>> valueIndex = this.attributeIndex.get(attribute.getKey());
+                if (valueIndex != null) {
+                    Set<Attribute> attributes = valueIndex.get(attribute.getValue());
+                    if (attributes != null) {
+                        attributes.remove(attribute);
+                        if (attributes.size() == 0) {
+                            valueIndex.remove(attribute.getValue());
+                        }
+                    }
+                    if (valueIndex.size() == 0) {
+                        this.artifactDescriptorIndex.remove(attribute);
+                    }
+                }
+            }
+        }
+    }
+
+    Set<Attribute> findMatchingAttributes(String key, String value) {
+        Set<Attribute> result = null;
+        Map<String, Set<Attribute>> map = this.attributeIndex.get(key);
+        if (map != null) {
+            result = map.get(value);
+        }
+        return (result != null ? result : EMPTY_ATTRIBUTE_SET);
+    }
+
+    RepositoryAwareArtifactDescriptor getArtifactDescriptor(Attribute attribute) {
+        return this.artifactDescriptorIndex.get(attribute);
+    }
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/LocalRepository.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/LocalRepository.java
new file mode 100644
index 0000000..187f096
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/LocalRepository.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal;
+
+import java.io.File;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.repository.ArtifactBridge;
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+import org.eclipse.virgo.repository.ArtifactDescriptorPersister;
+import org.eclipse.virgo.repository.ArtifactGenerationException;
+import org.eclipse.virgo.repository.IndexFormatException;
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+import org.eclipse.virgo.repository.UriMapper;
+import org.eclipse.virgo.repository.configuration.LocalRepositoryConfiguration;
+
+/**
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ * 
+ */
+public abstract class LocalRepository extends BaseRepository {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(LocalRepository.class);
+
+    private final Set<ArtifactBridge> artifactBridges;
+
+    private final UriMapper mapper;
+
+    private final EventLogger eventLogger;
+
+    protected LocalRepository(LocalRepositoryConfiguration configuration, ArtifactDescriptorPersister artifactDescriptorPersister,
+        EventLogger eventLogger) throws IndexFormatException {
+        super(configuration, new StandardArtifactDescriptorDepository(artifactDescriptorPersister));
+        this.eventLogger = eventLogger;
+        this.mapper = configuration.getUriMapper();
+        this.artifactBridges = new HashSet<ArtifactBridge>(configuration.getArtefactBridges());
+    }
+
+    protected RepositoryAwareArtifactDescriptor createArtifactDescriptor(File artifactFile) {
+        boolean seenFailure = false; // track rejections for this file in case they are rescinded
+        for (ArtifactBridge artifactBridge : this.artifactBridges) {
+            try {
+                ArtifactDescriptor artifactDescriptor = artifactBridge.generateArtifactDescriptor(artifactFile);
+                if (artifactDescriptor != null) {
+                    if (seenFailure) {
+                        // This artifact was rejected by a previous bridge; we log subsequent success
+                        LOGGER.debug("ArtifactBridge '{}' rescued artifact '{}'.", artifactBridge, artifactFile);
+                        eventLogger.log(RepositoryLogEvents.ARTIFACT_RECOVERED, artifactFile.getName(), this.getName());
+                    }
+                    return new DelegatingRepositoryAwareArtifactDescriptor(artifactDescriptor, getName(), this.mapper);
+                }
+            } catch (ArtifactGenerationException age) {
+                LOGGER.error(String.format("ArtifactBridge '%s' failed to generate descriptor for artifact '%s'.", artifactBridge, artifactFile), age);
+                eventLogger.log(RepositoryLogEvents.BRIDGE_PARSE_FAILURE, artifactFile.getName(), age.getArtifactType(), this.getName());
+                seenFailure = true;
+            } catch (Exception e) {
+                LOGGER.error(String.format("ArtifactBridge '%s' threw unexpected execption for artifact '%s'.", artifactBridge, artifactFile), e);
+                eventLogger.log(RepositoryLogEvents.BRIDGE_UNEXPECTED_EXCEPTION, artifactFile.getName(), this.getName());
+                seenFailure = true;
+            }
+        }
+        return null;
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/LocationsRepository.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/LocationsRepository.java
new file mode 100644
index 0000000..8f7e78b
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/LocationsRepository.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal;
+
+import java.util.Set;
+
+
+/**
+ * {@link org.eclipse.virgo.repository.Repository Repository}s that have file locations 
+ * through which artifacts are found must implement this interface.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ * Implementations must be thread-safe.
+ *
+ */
+public interface LocationsRepository {
+    /**
+     * Calculates the filepaths that a given filename could have and be found by 
+     * the repository in its storage area.
+     * <br/>
+     * There is no guarantee of validity of the filename or the paths returned. 
+     * 
+     * @param filename of artifact that might be placed in the locations
+     * @return all the valid filepaths of an artifact file of that name
+     */
+    Set<String> getArtifactLocations(String filename);
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/MutableRepository.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/MutableRepository.java
new file mode 100644
index 0000000..6537566
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/MutableRepository.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal;
+
+import java.net.URI;
+
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+import org.eclipse.virgo.repository.DuplicateArtifactException;
+import org.osgi.framework.Version;
+
+
+/**
+ * A <code>MutableRepository</code> is a repository which is programmatically mutable, i.e. it supports programmatic
+ * publish and retract.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Implementations must be thread-safe
+ * 
+ */
+public interface MutableRepository extends LocationsRepository {
+
+    ArtifactDescriptor publish(URI uri) throws DuplicateArtifactException;
+
+    boolean retract(String type, String name, Version version);
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/PersistentRepository.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/PersistentRepository.java
new file mode 100644
index 0000000..d2a3486
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/PersistentRepository.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal;
+
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.repository.ArtifactDescriptorPersister;
+import org.eclipse.virgo.repository.IndexFormatException;
+import org.eclipse.virgo.repository.XmlArtifactDescriptorPersister;
+import org.eclipse.virgo.repository.codec.XMLRepositoryCodec;
+import org.eclipse.virgo.repository.configuration.PersistentRepositoryConfiguration;
+
+/**
+ * An extension of {@link LocalRepository} that creates a ensure that artifact indexes are written out
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+public abstract class PersistentRepository extends LocalRepository {
+
+    protected PersistentRepository(PersistentRepositoryConfiguration configuration, EventLogger eventLogger) throws IndexFormatException {
+        super(configuration, new XmlArtifactDescriptorPersister(new XMLRepositoryCodec(), configuration.getName(), configuration.getIndexLocation()),
+            eventLogger);
+    }
+    protected PersistentRepository(PersistentRepositoryConfiguration configuration, ArtifactDescriptorPersister artifactDescriptorPersister, EventLogger eventLogger) throws IndexFormatException {
+        super(configuration, artifactDescriptorPersister, eventLogger);
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/RepositoryBundleActivator.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/RepositoryBundleActivator.java
new file mode 100644
index 0000000..cbffb12
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/RepositoryBundleActivator.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+import org.eclipse.virgo.medic.dump.DumpContributor;
+import org.eclipse.virgo.repository.HashGenerator;
+import org.eclipse.virgo.repository.RepositoryFactory;
+import org.eclipse.virgo.repository.codec.XMLRepositoryCodec;
+import org.eclipse.virgo.repository.internal.eventlog.DynamicDelegationEventLogger;
+import org.eclipse.virgo.util.osgi.ServiceRegistrationTracker;
+
+/**
+ * A {@link BundleActivator} for the repository. Publishes a {@link RepositoryFactory} implementation in the OSGi
+ * service registry.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ * 
+ */
+public class RepositoryBundleActivator implements BundleActivator {
+
+    private final ServiceRegistrationTracker tracker = new ServiceRegistrationTracker();
+
+    private volatile DynamicDelegationEventLogger eventLogger = null;
+
+    /**
+     * {@inheritDoc}
+     */
+    public void start(BundleContext bundleContext) throws Exception {
+        this.eventLogger = new DynamicDelegationEventLogger(bundleContext);
+        this.eventLogger.start();
+
+        RepositoryDumpContributor contributor = new RepositoryDumpContributor(new XMLRepositoryCodec());
+        this.tracker.track(bundleContext.registerService(DumpContributor.class.getName(), contributor, null));
+
+        RepositoryFactory repositoryFactory = new StandardRepositoryFactory(eventLogger, bundleContext, tracker, contributor);
+        this.tracker.track(bundleContext.registerService(RepositoryFactory.class.getName(), repositoryFactory, null));
+
+        HashGenerator hashGenerator = new ShaHashGenerator();
+        this.tracker.track(bundleContext.registerService(HashGenerator.class.getName(), hashGenerator, null));
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void stop(BundleContext bundleContext) throws Exception {
+        this.tracker.unregisterAll();
+
+        if (this.eventLogger != null) {
+            this.eventLogger.stop();
+        }
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/RepositoryDumpContributor.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/RepositoryDumpContributor.java
new file mode 100644
index 0000000..475ba99
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/RepositoryDumpContributor.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal;
+
+import java.io.OutputStream;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.eclipse.virgo.medic.dump.Dump;
+import org.eclipse.virgo.medic.dump.DumpContributionFailedException;
+import org.eclipse.virgo.medic.dump.DumpContributor;
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+import org.eclipse.virgo.repository.codec.RepositoryCodec;
+import org.eclipse.virgo.util.io.IOUtils;
+
+/**
+ * {@link DumpContributor} that adds a copy of the repository indexes to the dump folder.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.
+ * 
+ */
+final class RepositoryDumpContributor implements DumpContributor {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(RepositoryDumpContributor.class);
+
+    private static final String CONTRIBUTOR_NAME = "repository";
+
+    private final Map<String, ArtifactDescriptorDepository> depositories = new ConcurrentHashMap<String, ArtifactDescriptorDepository>();
+
+    private final RepositoryCodec codec;
+
+    public RepositoryDumpContributor(RepositoryCodec codec) {
+        this.codec = codec;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void contribute(Dump dump) throws DumpContributionFailedException {
+        for (Map.Entry<String, ArtifactDescriptorDepository> entry : this.depositories.entrySet()) {
+            dumpDepository(entry.getKey(), entry.getValue(), dump);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getName() {
+        return CONTRIBUTOR_NAME;
+    }
+
+    private void dumpDepository(String name, ArtifactDescriptorDepository depository, Dump dump) {
+        OutputStream stream = null;
+        try {
+            stream = dump.createFileOutputStream(CONTRIBUTOR_NAME + "-" + name + ".index");
+            Set<RepositoryAwareArtifactDescriptor> descriptors = depository.resolveArtifactDescriptors(null);
+            codec.write(descriptors, stream);
+        } catch (Exception e) {
+            LOGGER.warn("Unable to dump repository index for repository '" + name + "'", e);
+        } finally {
+            IOUtils.closeQuietly(stream);
+        }
+    }
+
+    void addDepository(String name, ArtifactDescriptorDepository depository) {
+        this.depositories.put(name, depository);
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/RepositoryLogEvents.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/RepositoryLogEvents.java
new file mode 100644
index 0000000..f8abaac
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/RepositoryLogEvents.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal;
+
+import org.eclipse.virgo.medic.eventlog.Level;
+import org.eclipse.virgo.medic.eventlog.LogEvent;
+
+/**
+ * <code>enum</code> of log events for Repository
+ * <p />
+ * <strong>Concurrent Semantics</strong><br />
+ * Utterly thread-safe
+ * 
+ */
+public enum RepositoryLogEvents implements LogEvent {
+    
+    UNKNOWN_REPOSITORY_TYPE(1, Level.WARNING), //
+    CHAIN_REFERENCES_MISSING_REPOSITORY(2, Level.WARNING), //
+    DUPLICATE_REPOSITORY_IN_CHAIN(3, Level.WARNING), //
+    NO_REPOSITORY_TYPE(4, Level.WARNING), //
+    MISSING_SPECIFICATION(5, Level.WARNING), //
+    MALFORMED_INT_PROPERTY(6, Level.WARNING), //
+
+    REPOSITORY_TEMPORARILY_UNAVAILABLE(50, Level.WARNING), //
+    REPOSITORY_AVAILABLE(51, Level.INFO), //
+    REPOSITORY_INDEX_UPDATED(52, Level.INFO), //
+
+    BRIDGE_PARSE_FAILURE(80, Level.ERROR), //
+    BRIDGE_UNEXPECTED_EXCEPTION(81, Level.ERROR), //
+    ARTIFACT_RECOVERED(82, Level.INFO), //
+
+    REPOSITORY_NOT_CREATED(100, Level.WARNING), //
+    REPOSITORY_NOT_AVAILABLE(101, Level.ERROR), //
+    REPOSITORY_INDEX_NOT_PERSISTED(102, Level.ERROR), //
+    
+    ARTIFACT_NOT_PUBLISHED(200, Level.WARNING);
+
+    private static final String SERVER_LOG_FORMAT = "%s%04d%1.1s";
+
+    private static final String PREFIX = "RP";
+
+    private final int code;
+
+    private final Level level;
+
+    private RepositoryLogEvents(int code, Level level) {
+        this.code = code;
+        this.level = level;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getEventCode() {
+        return String.format(RepositoryLogEvents.SERVER_LOG_FORMAT, RepositoryLogEvents.PREFIX, this.code, this.level);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Level getLevel() {
+        return this.level;
+    }
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/RepositoryUtils.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/RepositoryUtils.java
new file mode 100644
index 0000000..9c04a60
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/RepositoryUtils.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.osgi.framework.Version;
+
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+
+/**
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ * 
+ */
+public final class RepositoryUtils {
+
+    public static <T extends ArtifactDescriptor> T selectHighestVersion(Set<T> artifactDescriptors) {
+        return selectHighestVersionInRange(artifactDescriptors, null);
+    }
+
+    public static <T extends ArtifactDescriptor> T selectHighestVersionInRange(Set<T> artifactDescriptors, VersionRange versionRange) {
+        T highest = null;
+
+        for (T artifactDescriptor : artifactDescriptors) {
+            Version version = artifactDescriptor.getVersion();
+            if ((versionRange == null || versionRange.includes(version)) && (highest == null || (version.compareTo(highest.getVersion()) > 0))) {
+                highest = artifactDescriptor;
+            }
+        }
+
+        return highest;
+    }
+
+    public static <T extends ArtifactDescriptor> T selectLowestVersionInRange(Set<T> artifactDescriptors, VersionRange versionRange) {
+        T lowest = null;
+
+        for (T artifactDescriptor : artifactDescriptors) {
+            Version version = artifactDescriptor.getVersion();
+            if ((versionRange == null || versionRange.includes(version)) && (lowest == null || (version.compareTo(lowest.getVersion()) < 0))) {
+                lowest = artifactDescriptor;
+            }
+        }
+
+        return lowest;
+    }
+
+    public static <T extends ArtifactDescriptor> Set<Set<T>> groupByTypeAndName(Set<T> artifactDescriptors) {
+
+        if (artifactDescriptors == null || artifactDescriptors.isEmpty()) {
+            return Collections.emptySet();
+        }
+        
+        final String groupKeyFormat = "%s-%s";
+        Map<String, Set<T>> groups = new HashMap<String, Set<T>>();
+        for(T artifact : artifactDescriptors) {
+            String groupKey = String.format(groupKeyFormat, artifact.getType(), artifact.getName());
+            Set<T> group = groups.get(groupKey);
+            if (group == null) {
+                group = new HashSet<T>();
+                groups.put(groupKey, group);
+            }
+            group.add(artifact);
+        }
+        
+        return new HashSet<Set<T>>(groups.values());
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/ShaHashGenerator.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/ShaHashGenerator.java
new file mode 100644
index 0000000..4e59fb7
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/ShaHashGenerator.java
@@ -0,0 +1,79 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.math.BigInteger;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+import org.eclipse.virgo.repository.ArtifactBridge;
+import org.eclipse.virgo.repository.HashGenerator;
+import org.eclipse.virgo.repository.builder.ArtifactDescriptorBuilder;
+import org.eclipse.virgo.repository.builder.AttributeBuilder;
+
+
+public class ShaHashGenerator implements HashGenerator {
+
+    private static final String DIGEST_ALGORITHM = "sha";
+
+    private static final int BUFFER_SIZE = 8192;
+
+    public void generateHash(ArtifactDescriptorBuilder artifactDescriptorBuilder, File artifactFile) {
+        if (artifactFile.isDirectory()) {
+            return;
+        }
+
+        MessageDigest digest;
+        try {
+            digest = MessageDigest.getInstance(DIGEST_ALGORITHM);
+            artifactDescriptorBuilder.addAttribute(new AttributeBuilder().setName(ArtifactBridge.ALGORITHM_KEY).setValue(DIGEST_ALGORITHM).build());
+        } catch (NoSuchAlgorithmException e) {
+            throw new RuntimeException(String.format("Unable to get digest algorithm '%s'", DIGEST_ALGORITHM), e);
+        }
+
+        FileInputStream in = null;
+        try {
+            in = new FileInputStream(artifactFile);
+
+            int length;
+            byte[] buffer = new byte[BUFFER_SIZE];
+            while ((length = in.read(buffer)) != -1) {
+                digest.update(buffer, 0, length);
+            }
+        } catch (IOException e) {
+            throw new RuntimeException(String.format("Unable to read file '%s' for hashing", artifactFile.getAbsolutePath()), e);
+        } finally {
+            if (in != null) {
+                try {
+                    in.close();
+                } catch (IOException e) {
+                    // Nothing to do
+                }
+            }
+        }
+
+        BigInteger bi = new BigInteger(1, digest.digest());
+        String hash = bi.toString(16);
+        if (hash.length() % 2 != 0) {
+            hash = "0" + hash;
+        }
+
+        AttributeBuilder attributeBuilder = new AttributeBuilder();
+        attributeBuilder.setName(ArtifactBridge.HASH_KEY);
+        attributeBuilder.setValue(hash);
+        artifactDescriptorBuilder.addAttribute(attributeBuilder.build());
+    }
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/StandardArtifactDescriptor.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/StandardArtifactDescriptor.java
new file mode 100644
index 0000000..b960664
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/StandardArtifactDescriptor.java
@@ -0,0 +1,190 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal;
+
+import java.net.URI;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+import org.eclipse.virgo.repository.Attribute;
+import org.osgi.framework.Version;
+
+
+/**
+ * <p>
+ * The standard implementation of <code>ArtifactDescriptor</code>.
+ * </p>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is threadsafe
+ * 
+ */
+public final class StandardArtifactDescriptor implements ArtifactDescriptor {
+
+    private static final Set<Attribute> EMPTY_ATTRIBUTE_SET = Collections.emptySet();
+
+    private final Map<String, Set<Attribute>> attributesIndex = new HashMap<String, Set<Attribute>>();
+
+    private final Set<Attribute> attributes;
+
+    private final URI uri;
+
+    private final String type;
+
+    private final String name;
+
+    private final Version version;
+
+    private final int hash;
+
+    private final String filename;
+
+    /**
+     * Simple constructor to store the values passed in for later reference.
+     * 
+     * @param uri whence the artifact
+     * @param type artifact type
+     * @param name artifact name
+     * @param version artifact version
+     * @param filename suggested name for the file of the artifact
+     * @param attributes of the artifact
+     */
+    public StandardArtifactDescriptor(URI uri, String type, String name, Version version, String filename, Set<Attribute> attributes) {
+        if (uri == null || type == null || name == null || version == null || attributes == null) {
+            throw new IllegalArgumentException("Arguments can not be null");
+        }
+
+        Set<Attribute> tempAttributes;
+
+        for (Attribute attribute : attributes) {
+            tempAttributes = this.attributesIndex.get(attribute.getKey());
+            if (tempAttributes == null) {
+                tempAttributes = new HashSet<Attribute>();
+                this.attributesIndex.put(attribute.getKey(), tempAttributes);
+            }
+            tempAttributes.add(attribute);
+        }
+
+        this.attributes = attributes;
+
+        this.filename = addAttributeIfNotAlreadyPresent(FILENAME_ATTRIBUTE, filename);
+
+        addAttributeIfNotAlreadyPresent(URI, uri.toString());
+        this.uri = uri;
+
+        addAttributeIfNotAlreadyPresent(TYPE, type);
+        this.type = type;
+
+        addAttributeIfNotAlreadyPresent(NAME, name);
+        this.name = name;
+
+        addAttributeIfNotAlreadyPresent(VERSION, version.toString());
+        this.version = version;
+
+        this.hash = this.type.hashCode() + this.name.hashCode() + this.version.hashCode();
+    }
+
+    private String addAttributeIfNotAlreadyPresent(String name, String value) {
+
+        if (this.attributesIndex.containsKey(name)) {
+            return this.attributesIndex.get(name).iterator().next().getValue();
+        } else {
+            if (value != null) {
+                addAttribute(name, value);
+            }
+            return value;
+        }
+    }
+
+    public URI getUri() {
+        return uri;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public Version getVersion() {
+        return version;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Set<Attribute> getAttribute(String name) {
+        Set<Attribute> tempAttributes = this.attributesIndex.get(name);
+        if (tempAttributes == null) {
+            tempAttributes = EMPTY_ATTRIBUTE_SET;
+        }
+        return tempAttributes;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Set<Attribute> getAttributes() {
+        return Collections.unmodifiableSet(this.attributes);
+    }
+
+    private void addAttribute(String name, String value) {
+        Attribute requiredAttribute = new StandardAttribute(name, value);
+        this.attributes.add(requiredAttribute);
+        Set<Attribute> requiredAttributeSet = new HashSet<Attribute>();
+        requiredAttributeSet.add(requiredAttribute);
+        this.attributesIndex.put(name, requiredAttributeSet);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int hashCode() {
+        return this.hash;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean equals(Object obj) {
+        if (obj != null && this.getClass().equals(obj.getClass())) {
+            StandardArtifactDescriptor sad = (StandardArtifactDescriptor) obj;
+            return this.hash == sad.hash && this.type.equals(sad.type) && this.name.equals(sad.name) && this.version.equals(sad.version);
+        }
+        return false;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String toString() {
+        return String.format("%s with %d attributes", this.uri.getPath(), this.attributes.size());
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getFilename() {
+        return this.filename;
+    }
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/StandardArtifactDescriptorDepository.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/StandardArtifactDescriptorDepository.java
new file mode 100644
index 0000000..89b28ac
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/StandardArtifactDescriptorDepository.java
@@ -0,0 +1,224 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal;
+
+import java.io.IOException;
+import java.net.URI;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.Map.Entry;
+
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+import org.eclipse.virgo.repository.ArtifactDescriptorPersister;
+import org.eclipse.virgo.repository.Attribute;
+import org.eclipse.virgo.repository.DuplicateArtifactException;
+import org.eclipse.virgo.repository.IndexFormatException;
+import org.eclipse.virgo.repository.Query;
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * <p>
+ * <code>StandardArtifactDescriptorDepository</code> is the provided implementation of
+ * {@link ArtifactDescriptorDepository}. Contains the actual store of artifacts in the Repository and is also capable of
+ * executing searches as specified by a set of filters. In order to improve performance a custom index over the set of
+ * artifacts is used.
+ * </p>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * This implementation is thread-safe
+ * 
+ * @see org.eclipse.virgo.repository.internal.Index
+ */
+public class StandardArtifactDescriptorDepository implements ArtifactDescriptorDepository {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(StandardArtifactDescriptorDepository.class);
+
+    private final ArtifactDescriptorPersister artifactDescriptorPersister;
+
+    private final Set<RepositoryAwareArtifactDescriptor> artifactDescriptors;
+
+    private final Index index;
+
+    private final Object artifactsLock = new Object();
+
+    StandardArtifactDescriptorDepository(ArtifactDescriptorPersister artifactDescriptorPersister,
+        Set<RepositoryAwareArtifactDescriptor> artifactDescriptors) throws IndexFormatException {
+        if (artifactDescriptorPersister == null || artifactDescriptors == null) {
+            throw new IllegalArgumentException("Arguments must not be null");
+        }
+        this.artifactDescriptorPersister = artifactDescriptorPersister;
+        this.artifactDescriptors = this.artifactDescriptorPersister.loadArtifacts();
+        this.artifactDescriptors.addAll(artifactDescriptors);
+        this.index = new Index(this.artifactDescriptors);
+    }
+
+    StandardArtifactDescriptorDepository(Set<RepositoryAwareArtifactDescriptor> artifactDescriptors) {
+        if (artifactDescriptors == null) {
+            throw new IllegalArgumentException("Argument must not be null");
+        }
+        this.artifactDescriptorPersister = null;
+        this.artifactDescriptors = new HashSet<RepositoryAwareArtifactDescriptor>(16);
+        this.artifactDescriptors.addAll(artifactDescriptors);
+        this.index = new Index(this.artifactDescriptors);
+    }
+
+    /**
+     * Constructor requiring only a persistence strategy. The {@link ArtifactDescriptorPersister} will be queried during
+     * initialisation to see if any existing meta data about artifacts has been stored, if they have they will be loaded
+     * and used to pre-populate the store of {@link ArtifactDescriptor}s in this Depository.
+     * 
+     * @param artifactDescriptorPersister persistence strategy
+     * @throws IndexFormatException if initial load fails
+     */
+    public StandardArtifactDescriptorDepository(ArtifactDescriptorPersister artifactDescriptorPersister) throws IndexFormatException {
+        this(artifactDescriptorPersister, new HashSet<RepositoryAwareArtifactDescriptor>(0));
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public int getArtifactDescriptorCount() {
+        return this.artifactDescriptors.size();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void addArtifactDescriptor(RepositoryAwareArtifactDescriptor artifactDescriptor) throws IllegalArgumentException,
+        DuplicateArtifactException {
+        if (artifactDescriptor == null) {
+            throw new IllegalArgumentException("Argument can not be null");
+        }
+        synchronized (this.artifactsLock) {
+            if (this.artifactDescriptors.contains(artifactDescriptor)) {
+                RepositoryAwareArtifactDescriptor original = null;
+                for (RepositoryAwareArtifactDescriptor temp : this.artifactDescriptors) {
+                    if (temp.equals(artifactDescriptor)) {
+                        original = temp;
+                    }
+                }
+                throw new DuplicateArtifactException(original, artifactDescriptor);
+            }
+            this.artifactDescriptors.add(artifactDescriptor);
+            this.index.addArtifactDescriptor(artifactDescriptor);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public RepositoryAwareArtifactDescriptor removeArtifactDescriptor(URI uri) {
+        if (uri == null) {
+            throw new IllegalArgumentException("Argument can not be null");
+        }
+
+        Query uriQuery = new StandardQuery(this, "uri", uri.toString());
+        synchronized (this.artifactsLock) {
+            Set<RepositoryAwareArtifactDescriptor> artifacts = uriQuery.run();
+
+            if (artifacts.size() > 1) {
+                LOGGER.debug("More than one artifact with URI '{}' in depository {}.", uri, this);
+                throw new IllegalStateException("Internal failure: multiple artifacts with the same URI.");
+            }
+
+            RepositoryAwareArtifactDescriptor artifact = null;
+
+            if (!artifacts.isEmpty()) {
+                artifact = artifacts.iterator().next();
+                this.index.removeArtifactDescriptor(artifact);
+                this.artifactDescriptors.remove(artifact);
+            }
+
+            return artifact;
+        }
+    }
+
+    public boolean removeArtifactDescriptor(RepositoryAwareArtifactDescriptor artifactDescriptor) {
+        synchronized (this.artifactsLock) {
+            this.index.removeArtifactDescriptor(artifactDescriptor);
+            return this.artifactDescriptors.remove(artifactDescriptor);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void persist() throws IOException {
+        if (null != this.artifactDescriptorPersister) {
+            synchronized (this.artifactsLock) {
+                this.artifactDescriptorPersister.persistArtifactDescriptors(this.artifactDescriptors);
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Set<RepositoryAwareArtifactDescriptor> resolveArtifactDescriptors(Set<Attribute> filters) {
+        synchronized (this.artifactsLock) {
+            if (filters == null || filters.isEmpty()) {
+                return new HashSet<RepositoryAwareArtifactDescriptor>(this.artifactDescriptors);
+            }
+            Set<RepositoryAwareArtifactDescriptor> results = new HashSet<RepositoryAwareArtifactDescriptor>(this.artifactDescriptors);
+            for (Attribute filter : filters) {
+                results.retainAll(findMatchingArtifacts(filter));
+            }
+            return results;
+        }
+    }
+
+    /**
+     * Execute a single filter of a query.
+     * 
+     * @param filter
+     * @return
+     */
+    private Set<ArtifactDescriptor> findMatchingArtifacts(Attribute filter) {
+        Set<Attribute> attributes = this.index.findMatchingAttributes(filter.getKey(), filter.getValue());
+
+        Set<Attribute> propertyFilteredAttributes = new HashSet<Attribute>();
+
+        for (Attribute attribute : attributes) {
+            if (this.propertiesContains(filter.getProperties(), attribute.getProperties())) {
+                propertyFilteredAttributes.add(attribute);
+            }
+        }
+
+        Set<ArtifactDescriptor> matches = new HashSet<ArtifactDescriptor>();
+        for (Attribute attribute : propertyFilteredAttributes) {
+            matches.add(this.index.getArtifactDescriptor(attribute));
+        }
+        return matches;
+    }
+
+    /**
+     * Returns true if and only if the attributeProperties contains all of the filterProperties
+     * 
+     * @param filterProperties
+     * @param attributeProperties
+     * @return
+     */
+    private boolean propertiesContains(Map<String, Set<String>> filterProperties, Map<String, Set<String>> attributeProperties) {
+        for (Entry<String, Set<String>> filterProperty : filterProperties.entrySet()) {
+            if (!(attributeProperties.containsKey(filterProperty.getKey()) && attributeProperties.get(filterProperty.getKey()).containsAll(
+                filterProperty.getValue()))) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/StandardAttribute.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/StandardAttribute.java
new file mode 100644
index 0000000..7b8d616
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/StandardAttribute.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.virgo.repository.Attribute;
+
+
+/**
+ * <p>
+ * The provided implementation of <code>Attribute</code>. This is a simple data type
+ * holding the name and value of an Attribute along with any properties. Simple getters 
+ * and a nice toString are provided. This class is immutable.
+ * </p>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is Threadsafe
+ * 
+ */
+public final class StandardAttribute implements Attribute {
+
+    private final String name;
+
+    private final String value;
+
+    private final Map<String, Set<String>> properties;
+
+    public StandardAttribute(String name, String value, Map<String, Set<String>> properties) {
+        if (name == null || value == null || properties == null) {
+            throw new IllegalArgumentException("Arguments can not be null");
+        }
+        this.name = name;
+        this.value = value;
+        this.properties = Collections.unmodifiableMap(properties); //prevent any modification
+    }
+
+    public StandardAttribute(String name, String value) {
+        this(name, value, new HashMap<String, Set<String>>());
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getKey() {
+        return this.name;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getValue() {
+        return this.value;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Map<String, Set<String>> getProperties() {
+        return this.properties;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String toString() {
+        return String.format("'%s=%s' with '%d' properties", this.name, this.value, this.properties.size());
+    }
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/StandardQuery.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/StandardQuery.java
new file mode 100644
index 0000000..c171cc9
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/StandardQuery.java
@@ -0,0 +1,134 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal;
+
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.virgo.repository.Attribute;
+import org.eclipse.virgo.repository.Query;
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+
+/**
+ * <p>
+ * The provided implementation of <code>Query</code>. The query is held as a set of required Attributes. In order for an
+ * <code>Artefact</code> to match the query it must have all of the specified Attributes.
+ * </p>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is Threadsafe
+ * 
+ */
+final public class StandardQuery implements Query {
+
+    private final Set<Attribute> filters = new HashSet<Attribute>();
+
+    private final ArtifactDescriptorDepository artifactDepository;
+
+    private VersionRange versionRangeFilter;
+
+    private VersionRangeMatchingStrategy versionRangeMatchingStrategy = VersionRangeMatchingStrategy.ALL;
+
+    private final Object filterLock = new Object();
+
+    /**
+     * Constructor taking a {@link ArtifactDescriptorDepository} to query and an initial query term.
+     * 
+     * @param artifactDepository to query
+     * @param attributeName of attribute to initially filter on
+     * @param attributeValue of attribute to match
+     */
+    public StandardQuery(ArtifactDescriptorDepository artifactDepository, String attributeName, String attributeValue) {
+        this.artifactDepository = artifactDepository;
+        this.addFilter(attributeName, attributeValue);
+    }
+
+    /**
+     * Constructor taking a {@link ArtifactDescriptorDepository} to query and an initial query term.
+     * 
+     * @param artifactDepository to query
+     * @param attributeName of attribute to initially filter on
+     * @param attributeValue of attribute to match
+     * @param attributeParameters of attribute to match
+     */
+    public StandardQuery(ArtifactDescriptorDepository artifactDepository, String attributeName, String attributeValue,
+        Map<String, Set<String>> attributeParameters) {
+        this.artifactDepository = artifactDepository;
+        this.addFilter(attributeName, attributeValue, attributeParameters);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Query addFilter(String name, String value) {
+        synchronized (filterLock) {
+            this.filters.add(new StandardAttribute(name, value));
+        }
+        return this;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Query addFilter(String name, String value, Map<String, Set<String>> parameters) {
+        synchronized (filterLock) {
+            this.filters.add(new StandardAttribute(name, value, parameters));
+        }
+        return this;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Query setVersionRangeFilter(VersionRange versionRange) {
+        return setVersionRangeFilter(versionRange, VersionRangeMatchingStrategy.HIGHEST);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Query setVersionRangeFilter(VersionRange versionRange, VersionRangeMatchingStrategy strategy) {
+        synchronized (filterLock) {
+            this.versionRangeFilter = versionRange;
+            this.versionRangeMatchingStrategy = strategy;
+        }
+        return this;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Set<RepositoryAwareArtifactDescriptor> run() {
+        final VersionRange localVersionRange = this.versionRangeFilter;
+        final VersionRangeMatchingStrategy localVersionRangeMatchingStrategy = this.versionRangeMatchingStrategy;
+
+        Set<RepositoryAwareArtifactDescriptor> resolved = this.artifactDepository.resolveArtifactDescriptors(this.filters);
+        if (localVersionRangeMatchingStrategy != null) {
+            resolved = localVersionRangeMatchingStrategy.match(resolved, localVersionRange);
+        }
+        return resolved;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String toString() {
+        return this.filters.toString();
+    }
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/StandardRepositoryFactory.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/StandardRepositoryFactory.java
new file mode 100644
index 0000000..507f8b8
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/StandardRepositoryFactory.java
@@ -0,0 +1,171 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.osgi.framework.BundleContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.repository.ArtifactDescriptorPersister;
+import org.eclipse.virgo.repository.Repository;
+import org.eclipse.virgo.repository.RepositoryCreationException;
+import org.eclipse.virgo.repository.RepositoryFactory;
+import org.eclipse.virgo.repository.WatchableRepository;
+import org.eclipse.virgo.repository.configuration.ExternalStorageRepositoryConfiguration;
+import org.eclipse.virgo.repository.configuration.ManagedStorageRepositoryConfiguration;
+import org.eclipse.virgo.repository.configuration.RemoteRepositoryConfiguration;
+import org.eclipse.virgo.repository.configuration.RepositoryConfiguration;
+import org.eclipse.virgo.repository.configuration.WatchedStorageRepositoryConfiguration;
+import org.eclipse.virgo.repository.internal.cacheing.CacheingRemoteRepository;
+import org.eclipse.virgo.repository.internal.cacheing.cache.StandardRepositoryCacheFactory;
+import org.eclipse.virgo.repository.internal.chain.ChainedRepository;
+import org.eclipse.virgo.repository.internal.external.ExternalStorageRepository;
+import org.eclipse.virgo.repository.internal.persistence.NoOpArtifactDescriptorPersister;
+import org.eclipse.virgo.repository.internal.remote.RemoteRepository;
+import org.eclipse.virgo.repository.internal.watched.WatchedStorageRepository;
+import org.eclipse.virgo.util.common.Assert;
+import org.eclipse.virgo.util.osgi.ServiceRegistrationTracker;
+
+/**
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ * 
+ */
+final class StandardRepositoryFactory implements RepositoryFactory {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(StandardRepositoryFactory.class);    
+
+    private final EventLogger eventLogger;
+
+    private final RepositoryDumpContributor dumpContributor;
+
+    private final BundleContext bundleContext;
+
+    private final ServiceRegistrationTracker tracker;
+
+    StandardRepositoryFactory(EventLogger eventLogger, BundleContext bundleContext, ServiceRegistrationTracker tracker, RepositoryDumpContributor dumpContributor) {
+        this.eventLogger = eventLogger;
+        this.bundleContext = bundleContext;
+        this.tracker = tracker;
+        this.dumpContributor = dumpContributor;
+    }    
+
+    /**
+     * {@inheritDoc}
+     */
+    public Repository createRepository(List<RepositoryConfiguration> repositoryConfigurations) throws RepositoryCreationException {
+        Assert.notNull(repositoryConfigurations, "repositoryConfigurations cannot be null");
+        Assert.notEmpty(repositoryConfigurations, "repositoryConfigurations cannot be empty");
+
+        List<Repository> repositories = new ArrayList<Repository>();
+        for (RepositoryConfiguration repositoryConfiguration : repositoryConfigurations) {
+            try {
+                Repository repository = createRepository(repositoryConfiguration);
+                repositories.add(repository);
+            } catch (RepositoryCreationException e) {
+                // ignore -- event log already generated
+            }
+        }
+
+        StringBuilder nameBuilder = new StringBuilder();
+        for (int i = 0; i < repositories.size(); i++) {
+            if (i>0) { 
+                nameBuilder.append("-");
+            }
+            nameBuilder.append(repositories.get(i).getName());
+        }
+        final String chainName = nameBuilder.toString();
+        LOGGER.debug("Assembling chain named '{}' containing '{}' repository/ies.", chainName, repositories.size());
+        return new ChainedRepository(chainName, repositories);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Repository createRepository(RepositoryConfiguration repositoryConfiguration, ArtifactDescriptorPersister artifactDescriptorPersister) throws RepositoryCreationException {
+        Assert.notNull(repositoryConfiguration, "repositoryConfiguration cannot be null");
+
+        Class<? extends RepositoryConfiguration> configurationClass = repositoryConfiguration.getClass();
+
+        BaseRepository repository;
+        final String repositoryName = repositoryConfiguration.getName();
+
+        try {
+            if (configurationClass.equals(ExternalStorageRepositoryConfiguration.class)) {
+                repository = createExternalRepository(repositoryConfiguration, artifactDescriptorPersister);
+            } else if (configurationClass.equals(WatchedStorageRepositoryConfiguration.class)) {
+                repository = createWatchedRepository(repositoryConfiguration, artifactDescriptorPersister);
+            } else if (configurationClass.equals(RemoteRepositoryConfiguration.class)) {
+                repository = createRemoteRepository(repositoryConfiguration);
+            } else if (configurationClass.equals(ManagedStorageRepositoryConfiguration.class)) {
+                throw new RepositoryCreationException("Managed storage repositories are currently not supported");
+            } else {
+                throw new RepositoryCreationException(String.format("'%s' is an unrecognised type of RepositoryConfiguration", configurationClass));
+            }
+        } catch (RepositoryCreationException e) {
+            eventLogger.log(RepositoryLogEvents.REPOSITORY_NOT_CREATED, repositoryName);
+            throw e;
+        }
+
+        if (this.dumpContributor != null) {
+            this.dumpContributor.addDepository(repository.getName(), repository.getDepository());
+        }
+       
+        repository.start();
+        return repository;
+    }
+
+    private RemoteRepository createRemoteRepository(RepositoryConfiguration repositoryConfiguration) throws RepositoryCreationException {
+        try {
+            return new CacheingRemoteRepository((RemoteRepositoryConfiguration) repositoryConfiguration, eventLogger,
+                new StandardRepositoryCacheFactory());
+        } catch (Exception e) {
+            throw new RepositoryCreationException("Failed to create remote repository '" + repositoryConfiguration.getName() + "'.", e);
+        }
+    }
+
+    private final LocalRepository createWatchedRepository(RepositoryConfiguration repositoryConfiguration, ArtifactDescriptorPersister artifactDescriptorPersister) throws RepositoryCreationException {
+        try {
+            WatchedStorageRepository watchableRepository;
+            if (artifactDescriptorPersister==null) {
+                watchableRepository = new WatchedStorageRepository((WatchedStorageRepositoryConfiguration) repositoryConfiguration, new NoOpArtifactDescriptorPersister(), eventLogger);
+            } else {
+                watchableRepository = new WatchedStorageRepository((WatchedStorageRepositoryConfiguration) repositoryConfiguration, artifactDescriptorPersister, eventLogger);
+            }
+            this.tracker.track(this.bundleContext.registerService(WatchableRepository.class, watchableRepository, null));
+            return watchableRepository;
+        } catch (Exception e) {
+            throw new RepositoryCreationException("Failed to create watched repository '" + repositoryConfiguration.getName() + "'.", e);
+        }
+    }
+
+    private final LocalRepository createExternalRepository(RepositoryConfiguration repositoryConfiguration, ArtifactDescriptorPersister artifactDescriptorPersister) throws RepositoryCreationException {
+        try {
+            if (artifactDescriptorPersister==null) {
+                return new ExternalStorageRepository((ExternalStorageRepositoryConfiguration) repositoryConfiguration, eventLogger);
+            } else {
+                return new ExternalStorageRepository((ExternalStorageRepositoryConfiguration) repositoryConfiguration, artifactDescriptorPersister, eventLogger);
+            }
+        } catch (Exception e) {
+            throw new RepositoryCreationException("Failed to create external repository '" + repositoryConfiguration.getName() + "'.", e);
+        }
+    }
+
+    public Repository createRepository(RepositoryConfiguration repositoryConfiguration) throws RepositoryCreationException {
+        return createRepository(repositoryConfiguration, null);
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/cacheing/CacheingArtifactDescriptor.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/cacheing/CacheingArtifactDescriptor.java
new file mode 100644
index 0000000..771d878
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/cacheing/CacheingArtifactDescriptor.java
@@ -0,0 +1,111 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.cacheing;
+
+import java.net.URI;
+import java.util.Set;
+
+import org.eclipse.virgo.repository.Attribute;
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+import org.eclipse.virgo.repository.internal.cacheing.cache.RepositoryCache;
+import org.osgi.framework.Version;
+
+
+/**
+ * {@link CacheingArtifactDescriptor} maintains a local disk cache of remote artifacts keyed by type, name, and version
+ * and delivers URIs of cached artifacts instead of the corresponding remote URIs.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+public final class CacheingArtifactDescriptor implements RepositoryAwareArtifactDescriptor {
+    
+    private final RepositoryAwareArtifactDescriptor source;
+    
+    private final RepositoryCache cache;
+
+    CacheingArtifactDescriptor(RepositoryAwareArtifactDescriptor source, RepositoryCache cache) {
+        this.source = source;
+        this.cache = cache;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Set<Attribute> getAttribute(String name) {
+        return this.source.getAttribute(name);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Set<Attribute> getAttributes() {
+        return this.source.getAttributes();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getFilename() {
+        return this.source.getFilename();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getName() {
+        return this.source.getName();
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public String getRepositoryName() {
+        return this.source.getRepositoryName();
+    }
+    
+    /**
+     * {@inheritDoc}
+     */
+    public String getType() {
+        return this.source.getType();
+    }
+
+    /**
+     * Returns the {@link URI} of the cached artifact. If the artifact cannot be downloaded, throws a <code>RuntimeException</code>.
+     * 
+     * @return the cached <code>URI</code>
+     */
+    public URI getUri() {
+        return this.cache.getUri(this);
+    }
+    
+    /**
+     * Returns the remote (uncached) {@link URI} of the artifact.
+     * 
+     * @return the remote (uncached) <code>URI</code>
+     */
+    public URI getRemoteUri() {
+        return this.source.getUri();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Version getVersion() {
+        return this.source.getVersion();
+    }
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/cacheing/CacheingQuery.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/cacheing/CacheingQuery.java
new file mode 100644
index 0000000..01bb3bf
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/cacheing/CacheingQuery.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.cacheing;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.virgo.repository.Query;
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+import org.eclipse.virgo.repository.internal.cacheing.cache.RepositoryCache;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+
+/**
+ * {@link CacheingQuery} wraps a {@link Query} and provides cacheing in the run method.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread safe.
+ * 
+ */
+final class CacheingQuery implements Query {
+
+    private final Query delegate;
+
+    private final RepositoryCache cache;
+
+    public CacheingQuery(Query delegate, RepositoryCache cache) {
+        this.delegate = delegate;
+        this.cache = cache;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Query addFilter(String name, String value) {
+        this.delegate.addFilter(name, value);
+        return this;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Query addFilter(String name, String value, Map<String, Set<String>> properties) {
+        this.delegate.addFilter(name, value, properties);
+        return this;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Query setVersionRangeFilter(VersionRange versionRange) {
+        this.delegate.setVersionRangeFilter(versionRange);
+        return this;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Query setVersionRangeFilter(VersionRange versionRange, VersionRangeMatchingStrategy strategy) {
+        this.delegate.setVersionRangeFilter(versionRange, strategy);
+        return this;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Set<RepositoryAwareArtifactDescriptor> run() {
+        Set<RepositoryAwareArtifactDescriptor> descriptors = this.delegate.run();
+
+        Set<RepositoryAwareArtifactDescriptor> cacheingDescriptors = new HashSet<RepositoryAwareArtifactDescriptor>(descriptors.size());
+        for (RepositoryAwareArtifactDescriptor descriptor : descriptors) {
+            cacheingDescriptors.add(new CacheingArtifactDescriptor(descriptor, this.cache));
+        }
+
+        return Collections.unmodifiableSet(cacheingDescriptors);
+    }
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/cacheing/CacheingRemoteRepository.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/cacheing/CacheingRemoteRepository.java
new file mode 100644
index 0000000..a2dc011
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/cacheing/CacheingRemoteRepository.java
@@ -0,0 +1,104 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.cacheing;
+
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.repository.Query;
+import org.eclipse.virgo.repository.configuration.RemoteRepositoryConfiguration;
+import org.eclipse.virgo.repository.internal.cacheing.cache.RepositoryCache;
+import org.eclipse.virgo.repository.internal.cacheing.cache.RepositoryCacheFactory;
+import org.eclipse.virgo.repository.internal.remote.RemoteRepository;
+
+/**
+ * {@link CacheingRemoteRepository} extends {@link RemoteRepository} by cacheing retrieved artifacts in a local disk
+ * cache.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread safe.
+ * 
+ */
+public final class CacheingRemoteRepository extends RemoteRepository {
+
+    private final Object monitor = new Object();
+
+    private final RepositoryCacheFactory repositoryCacheFactory;
+
+    private RepositoryCache cache;
+
+    public CacheingRemoteRepository(RemoteRepositoryConfiguration configuration, EventLogger eventLogger,
+        RepositoryCacheFactory repositoryCacheFactory) {
+        super(configuration, eventLogger);
+        this.repositoryCacheFactory = repositoryCacheFactory;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected void start() {
+        super.start();
+        synchronized (this.monitor) {
+            this.cache = this.repositoryCacheFactory.createRepositoryCache(this);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void stop() {
+        synchronized (this.monitor) {
+            this.cache = null;
+        }
+        super.stop();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Query createQuery(String key, String value) {
+        Query uncachedQuery = super.createQuery(key, value);
+        return createQuery(uncachedQuery);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Query createQuery(String key, String value, Map<String, Set<String>> properties) {
+        Query uncachedQuery = super.createQuery(key, value, properties);
+        return createQuery(uncachedQuery);
+    }
+
+    private Query createQuery(Query uncachedQuery) {
+        RepositoryCache repositoryCache = getRepositoryCache();
+        return repositoryCache == null ? uncachedQuery : createCacheingQuery(repositoryCache, uncachedQuery);
+    }
+    
+    private RepositoryCache getRepositoryCache() {
+        synchronized (this.monitor) {
+            return this.cache;
+        }
+    }
+
+    // This method takes a RepositoryCache parameter rather than using the instance variable to avoid racing with stop().
+    private static Query createCacheingQuery(RepositoryCache activeCache, Query uncachedQuery) {
+        return new CacheingQuery(uncachedQuery, activeCache);
+    }
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/cacheing/cache/RepositoryCache.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/cacheing/cache/RepositoryCache.java
new file mode 100644
index 0000000..28589bf
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/cacheing/cache/RepositoryCache.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.cacheing.cache;
+
+import java.net.URI;
+
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+
+
+/**
+ * {@link RepositoryCache} is an internal interface to a repository cache implementation.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations of this interface must be thread safe.
+ * 
+ */
+public interface RepositoryCache {
+
+    /**
+     * Returns the URI of the possibly cached artifact for the given artifact descriptor. If the cached artifact is out
+     * of date, it is refreshed first. If the artifact is not cached for any reason, returns the URI from the
+     * repository.
+     * 
+     * @param artifactDescriptor the artifact required
+     * @return the URI of the possibly cached artifact
+     */
+    URI getUri(RepositoryAwareArtifactDescriptor artifactDescriptor);
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/cacheing/cache/RepositoryCacheFactory.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/cacheing/cache/RepositoryCacheFactory.java
new file mode 100644
index 0000000..3799333
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/cacheing/cache/RepositoryCacheFactory.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.cacheing.cache;
+
+import org.eclipse.virgo.repository.internal.remote.RemoteRepository;
+
+/**
+ * {@link RepositoryCacheFactory} provides a way of creating {@link RepositoryCache RepositoryCaches}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations of this interface must be thread safe.
+ * 
+ */
+public interface RepositoryCacheFactory {
+
+    /**
+     * Creates and returns a new {@link RepositoryCache} for the given {@link RemoteRepository}.
+     * 
+     * @param remoteRepository the <code>RemoteRepository</code>
+     * @return the created <code>RepositoryCache</code>
+     */
+    RepositoryCache createRepositoryCache(RemoteRepository remoteRepository);
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/cacheing/cache/StandardRepositoryCache.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/cacheing/cache/StandardRepositoryCache.java
new file mode 100644
index 0000000..f1e2cc9
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/cacheing/cache/StandardRepositoryCache.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.cacheing.cache;
+
+import java.io.File;
+import java.net.URI;
+
+import org.eclipse.virgo.repository.Repository;
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+import org.eclipse.virgo.repository.RepositoryCreationException;
+import org.eclipse.virgo.repository.internal.cacheing.cache.artifact.SingleArtifactCache;
+import org.eclipse.virgo.repository.internal.cacheing.cache.artifact.SingleArtifactCacheFactory;
+import org.eclipse.virgo.repository.internal.cacheing.cache.descriptorhash.ArtifactDescriptorHash;
+import org.eclipse.virgo.repository.internal.cacheing.cache.descriptorhash.ArtifactDescriptorHashFactory;
+import org.eclipse.virgo.util.common.Assert;
+
+/**
+ * {@link StandardRepositoryCache} is a {@link RepositoryCache} for a given {@link Repository} which provides disk
+ * cacheing.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread safe.
+ * 
+ */
+final class StandardRepositoryCache implements RepositoryCache {
+
+    private final String repositoryName;
+
+    private final File repositoryCacheDirectory;
+
+    private final SingleArtifactCacheFactory artifactCacheFactory;
+
+    private final ArtifactDescriptorHashFactory artifactDescriptorHashFactory;
+
+    StandardRepositoryCache(String repositoryName, File cacheDirectory, SingleArtifactCacheFactory artifactCacheFactory,
+        ArtifactDescriptorHashFactory artifactDescriptorHashFactory) {
+        Assert.notNull(repositoryName, "repository name must not be null");
+        this.repositoryName = repositoryName;
+
+        this.repositoryCacheDirectory = createRepositoryCacheDirectory(repositoryName, cacheDirectory);
+
+        this.artifactCacheFactory = artifactCacheFactory;
+
+        this.artifactDescriptorHashFactory = artifactDescriptorHashFactory;
+    }
+
+    private static File createRepositoryCacheDirectory(String repositoryName, File cacheDirectory) {
+        File dir = new File(cacheDirectory, repositoryName);
+        if (dir.exists()) {
+            if (dir.isFile()) {
+                throw new RuntimeException(new RepositoryCreationException("Repository cache directory " + dir.getPath()
+                    + " cannot be created as there is a file at that location"));
+            }
+        } else if (!dir.mkdirs()) {
+            throw new RuntimeException(new RepositoryCreationException("Error creating repository cache directory " + dir.getPath()));
+        }
+        return dir;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public URI getUri(RepositoryAwareArtifactDescriptor artifactDescriptor) {
+        checkRepositoryName(artifactDescriptor);
+
+        SingleArtifactCache artifactDescriptorCache = getArtifactCache(artifactDescriptor);
+        return artifactDescriptorCache.getCachedUri(createArtifactDescriptorHash(artifactDescriptor));
+    }
+
+    private void checkRepositoryName(RepositoryAwareArtifactDescriptor artifactDescriptor) {
+        Assert.isTrue(this.repositoryName.equals(artifactDescriptor.getRepositoryName()), "Wrong RepositoryCache for the given artifact descriptor");
+    }
+
+    private ArtifactDescriptorHash createArtifactDescriptorHash(RepositoryAwareArtifactDescriptor artifactDescriptor) {
+        return this.artifactDescriptorHashFactory.createArtifactDescriptorHash(artifactDescriptor);
+    }
+
+    private SingleArtifactCache getArtifactCache(RepositoryAwareArtifactDescriptor artifactDescriptor) {
+        return this.artifactCacheFactory.getArtifactCache(artifactDescriptor, this.repositoryCacheDirectory);
+    }
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/cacheing/cache/StandardRepositoryCacheFactory.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/cacheing/cache/StandardRepositoryCacheFactory.java
new file mode 100644
index 0000000..cc8e716
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/cacheing/cache/StandardRepositoryCacheFactory.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.cacheing.cache;
+
+import java.io.File;
+
+import org.eclipse.virgo.repository.internal.cacheing.cache.artifact.StandardSingleArtifactCacheFactory;
+import org.eclipse.virgo.repository.internal.cacheing.cache.descriptorhash.StandardArtifactDescriptorHashFactory;
+import org.eclipse.virgo.repository.internal.remote.RemoteRepository;
+
+
+/**
+ * {@link StandardRepositoryCacheFactory} is the default implementation of {@link RepositoryCacheFactory}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread safe.
+ * 
+ */
+public class StandardRepositoryCacheFactory implements RepositoryCacheFactory {
+
+    /**
+     * {@inheritDoc}
+     */
+    public RepositoryCache createRepositoryCache(RemoteRepository remoteRepository) {
+        File cacheDirectory = remoteRepository.getCacheDirectory();
+        return new StandardRepositoryCache(remoteRepository.getName(), cacheDirectory, new StandardSingleArtifactCacheFactory(),
+            new StandardArtifactDescriptorHashFactory());
+    }
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/cacheing/cache/artifact/Downloader.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/cacheing/cache/artifact/Downloader.java
new file mode 100644
index 0000000..3f39dbc
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/cacheing/cache/artifact/Downloader.java
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.cacheing.cache.artifact;
+
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URL;
+import java.net.URLConnection;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.eclipse.virgo.util.io.FileCopyUtils;
+import org.eclipse.virgo.util.io.PathReference;
+
+/**
+ * {@link Downloader} is a utility used to download artifacts into an artifact cache.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+final class Downloader {
+    
+    private static final Logger LOGGER = LoggerFactory.getLogger(Downloader.class);
+
+    private final URI repositoryArtifactURI;
+
+    private final PathReference artifactCacheFilePathReference;
+
+    Downloader(URI sourceUri, PathReference destination) {
+        this.repositoryArtifactURI = sourceUri;
+        this.artifactCacheFilePathReference = destination;
+    }
+
+    /**
+     * Downloads the artifact at the source URI to the destination PathReference. These parameters were supplied on the
+     * constructor. If the artifact download is unsuccessful, deletes the destination file if it exists.
+     */
+    void downloadArtifact() {
+        boolean downloadSuccessful = false;
+        try {
+            InputStream artifactInputStream = getArtifactInputStream();
+            OutputStream artifactCacheOutputStream = getArtifactCacheOutputStream();
+            if (artifactInputStream != null && artifactCacheOutputStream != null) {
+                try {
+                    FileCopyUtils.copy(artifactInputStream, artifactCacheOutputStream);
+                    downloadSuccessful = true;
+                } catch (IOException e) {
+                    LOGGER.error("Error downloading artifact", e);
+                    throw new RuntimeException("Error downloading artifact '" + this.repositoryArtifactURI +"'", e);
+                }
+            } else if (artifactInputStream != null) {
+            	try {
+					artifactInputStream.close();
+				} catch (IOException e) {
+					LOGGER.error("Error closing artifactInputStream", e);
+				}
+            } else if (artifactCacheOutputStream != null) {
+            	try {
+					artifactCacheOutputStream.close();
+				} catch (IOException e) {
+					LOGGER.error("Error closing artifactCacheOutputStream", e);
+				}
+            }
+        } finally {
+            if (!downloadSuccessful) {
+                LOGGER.warn("Artifact download failed. Cleaning up target file {}.", this.artifactCacheFilePathReference.toAbsoluteReference());
+                this.artifactCacheFilePathReference.delete();
+            }
+        }
+    }
+
+    private InputStream getArtifactInputStream() {
+        try {
+            URL url = this.repositoryArtifactURI.toURL();
+            URLConnection urlConnection = url.openConnection();
+            return urlConnection.getInputStream();
+        } catch (MalformedURLException e) {
+            LOGGER.error("Error accessing repository artifact", e);
+        } catch (IOException e) {
+            LOGGER.error("Error accessing repository artifact", e);
+        }
+        return null;
+    }
+
+    private OutputStream getArtifactCacheOutputStream() {
+        try {
+            this.artifactCacheFilePathReference.delete();
+            return new FileOutputStream(this.artifactCacheFilePathReference.toFile());
+        } catch (FileNotFoundException e) {
+            LOGGER.error("Error accessing repository artifact download destination file", e);
+        }
+        return null;
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/cacheing/cache/artifact/SingleArtifactCache.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/cacheing/cache/artifact/SingleArtifactCache.java
new file mode 100644
index 0000000..0e89aab
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/cacheing/cache/artifact/SingleArtifactCache.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.cacheing.cache.artifact;
+
+import java.net.URI;
+
+import org.eclipse.virgo.repository.internal.cacheing.cache.descriptorhash.ArtifactDescriptorHash;
+
+
+/**
+ * {@link SingleArtifactCache} provides a cache for a specific artifact from a specific repository.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations of this interface must be thread safe.
+ * 
+ */
+public interface SingleArtifactCache {
+
+    /**
+     * Gets the URI of the cached artifact or <code>null</code> if the artifact is not cached (or is out of date).
+     * 
+     * @param artifactDescriptorHash the hash from the repository index
+     * @return a URI or <code>null</code>
+     */
+    URI getCachedUri(ArtifactDescriptorHash artifactDescriptorHash);
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/cacheing/cache/artifact/SingleArtifactCacheFactory.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/cacheing/cache/artifact/SingleArtifactCacheFactory.java
new file mode 100644
index 0000000..4d7d8bc
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/cacheing/cache/artifact/SingleArtifactCacheFactory.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.cacheing.cache.artifact;
+
+import java.io.File;
+
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+
+
+/**
+ * {@link SingleArtifactCacheFactory} creates and reuses {@link SingleArtifactCache ArtifactCaches}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations of this interface must be thread safe.
+ * 
+ */
+public interface SingleArtifactCacheFactory {
+
+    /**
+     * Creates, if necessary, and gets the {@link SingleArtifactCache} for the given {@link ArtifactDescriptor} using the
+     * given repository cache directory to cache artifacts.
+     * @param artifactDescriptor identifying the artifact cache
+     * @param repositoryCacheDirectory where to cache artifacts
+     * @return an artifact cache
+     */
+    SingleArtifactCache getArtifactCache(RepositoryAwareArtifactDescriptor artifactDescriptor, File repositoryCacheDirectory);
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/cacheing/cache/artifact/StandardSingleArtifactCache.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/cacheing/cache/artifact/StandardSingleArtifactCache.java
new file mode 100644
index 0000000..5de2745
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/cacheing/cache/artifact/StandardSingleArtifactCache.java
@@ -0,0 +1,164 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.cacheing.cache.artifact;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.io.Reader;
+import java.io.Writer;
+import java.net.URI;
+import java.security.NoSuchAlgorithmException;
+
+import org.eclipse.virgo.repository.internal.cacheing.cache.descriptorhash.ArtifactDescriptorHash;
+import org.eclipse.virgo.repository.util.FileDigest;
+import org.eclipse.virgo.util.io.PathReference;
+import org.osgi.framework.Version;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * {@link StandardSingleArtifactCache} encapsulates the cacheing of a specific artifact and its hash.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread safe.
+ * 
+ */
+class StandardSingleArtifactCache implements SingleArtifactCache {
+
+    private static final String ALGORITHM_HASH_SEPARATOR = ":";
+
+    private static final String HASH_SUFFIX = ".hash";
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(StandardSingleArtifactCache.class);
+
+    private final Object monitor = new Object();
+
+    private final PathReference artifactCacheDirectory;
+
+    private final URI repositoryArtifactURI;
+
+    private final String fileName;
+
+    private final PathReference artifactCacheFilePathReference;
+
+    private final PathReference artifactHashFilePathReference;
+
+    StandardSingleArtifactCache(String type, String name, Version version, URI repositoryArtifactURI, String fileName, File repositoryCacheDirectory) {
+        this.artifactCacheDirectory = obtainArtifactCacheDirectory(type, name, version, repositoryCacheDirectory);
+        this.repositoryArtifactURI = repositoryArtifactURI;
+        this.fileName = fileName;
+        this.artifactCacheFilePathReference = this.artifactCacheDirectory.newChild(this.fileName).createFile();
+        this.artifactHashFilePathReference = this.artifactCacheDirectory.newChild(this.fileName + HASH_SUFFIX).createFile();
+    }
+
+    private static PathReference obtainArtifactCacheDirectory(String type, String name, Version version, File repositoryCacheDirectory) {
+        PathReference repositoryDirectory = new PathReference(repositoryCacheDirectory);
+        PathReference artifactCacheDirectory = repositoryDirectory.newChild(type).newChild(name).newChild(version.toString());
+        artifactCacheDirectory.createDirectory();
+        return artifactCacheDirectory;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public URI getCachedUri(ArtifactDescriptorHash artifactDescriptorHash) {
+        synchronized (this.monitor) {
+            String digestAlgorithm = artifactDescriptorHash.getDigestAlgorithm();
+            String cachedHash = getHash(digestAlgorithm);
+            if (cachedHash == null || !artifactDescriptorHash.matches(cachedHash)) {
+                refresh(artifactDescriptorHash.getDigestAlgorithm());
+                cachedHash = getHash(digestAlgorithm);
+                if (cachedHash != null && artifactDescriptorHash.isPresent() && !artifactDescriptorHash.matches(cachedHash)) {
+                    LOGGER.info("Newly cached artifact has a hash value different to that stored in the index");
+                }
+            }
+            return getURI();
+        }
+    }
+
+    private String getHash(String digestAlgorithm) {
+        try {
+            BufferedReader bufferedHashFileReader = new BufferedReader(getHashFileReader());
+            try {
+                String digestAlgorithmAndHash = bufferedHashFileReader.readLine();
+                return extractHashForAlgorithm(digestAlgorithm, digestAlgorithmAndHash);
+            } finally {
+                bufferedHashFileReader.close();
+            }
+        } catch (IOException e) {
+        }
+        return null;
+    }
+
+    private String extractHashForAlgorithm(String digestAlgorithm, String digestAlgorithmAndHash) {
+        String hash;
+        hash = null;
+        if (digestAlgorithmAndHash != null) {
+            String[] s = digestAlgorithmAndHash.split(ALGORITHM_HASH_SEPARATOR);
+            if (s.length == 2 && digestAlgorithm.equals(s[0])) {
+                hash = s[1];
+            }
+        }
+        return hash;
+    }
+
+    private void refresh(String digestAlgorithm) {
+        /*
+         * Note that the following method call is a foreign call to download the artifact inside a synchronized block on
+         * this class's monitor. This breaks the policy of avoiding foreign calls, but is very unlikely to result in
+         * deadlock because the download mechanism is a leaf of the kernel code and uses the JRE directly to perform
+         * downloading. This is a deliberate trade off against the complexity of queuing up requests in a cancellable
+         * way. The cancellable approach can be taken if and when downloading in the synchronized block becomes an issue
+         * and a way of surfacing cancellation to the user is planned.
+         */
+        new Downloader(this.repositoryArtifactURI, this.artifactCacheFilePathReference).downloadArtifact();
+        storeHash(digestAlgorithm);
+    }
+
+    private void storeHash(String digestAlgorithm) {
+        try {
+            String hash = FileDigest.getFileDigest(this.artifactCacheFilePathReference.toFile(), digestAlgorithm);
+            Writer hashFileWriter = getHashFileWriter();
+            try {
+                hashFileWriter.write(digestAlgorithm + ALGORITHM_HASH_SEPARATOR + hash);
+            } finally {
+                hashFileWriter.close();
+            }
+        } catch (IOException e) {
+            this.artifactHashFilePathReference.delete();
+        } catch (NoSuchAlgorithmException e) {
+            this.artifactHashFilePathReference.delete();
+        }
+    }
+
+    private Writer getHashFileWriter() throws IOException {
+        return new OutputStreamWriter(new FileOutputStream(this.artifactHashFilePathReference.toFile()), UTF_8);
+    }
+
+    private Reader getHashFileReader() throws IOException {
+        return new InputStreamReader(new FileInputStream(this.artifactHashFilePathReference.toFile()), UTF_8);
+    }
+
+    private URI getURI() {
+        return this.artifactCacheFilePathReference.exists() ? this.artifactCacheFilePathReference.toURI() : null;
+    }
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/cacheing/cache/artifact/StandardSingleArtifactCacheFactory.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/cacheing/cache/artifact/StandardSingleArtifactCacheFactory.java
new file mode 100644
index 0000000..598800f
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/cacheing/cache/artifact/StandardSingleArtifactCacheFactory.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.cacheing.cache.artifact;
+
+import java.io.File;
+import java.net.URI;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+import org.eclipse.virgo.repository.internal.cacheing.CacheingArtifactDescriptor;
+import org.osgi.framework.Version;
+
+
+/**
+ * {@link StandardSingleArtifactCacheFactory} is the default implementation of {@link SingleArtifactCacheFactory}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread safe.
+ * 
+ */
+public class StandardSingleArtifactCacheFactory implements SingleArtifactCacheFactory {
+
+    private static final String CACHE_NAME_SEPARATOR = ":";
+
+    /**
+     * Artifact caches are indexed by a combination of repository name and artifact URI. Operations on the files in an
+     * artifact cache are serialized via the artifact cache, so it is essential that multiple threads operating on the
+     * same files do so via the same artifact cache instance. This is implemented by ensuring that the map below
+     * increases monotonically. That is, artifact caches are never removed and re-added.
+     */
+    private final ConcurrentMap<String, SingleArtifactCache> artifactCaches = new ConcurrentHashMap<String, SingleArtifactCache>();
+
+    /**
+     * {@inheritDoc}
+     */
+    public SingleArtifactCache getArtifactCache(RepositoryAwareArtifactDescriptor artifactDescriptor, File repositoryCacheDirectory) {
+        URI remoteUri = getRemoteURI(artifactDescriptor);
+        return getArtifactCache(artifactDescriptor.getRepositoryName(), artifactDescriptor.getType(), artifactDescriptor.getName(),
+            artifactDescriptor.getVersion(), remoteUri, artifactDescriptor.getFilename(), repositoryCacheDirectory);
+    }
+
+    private URI getRemoteURI(RepositoryAwareArtifactDescriptor artifactDescriptor) {
+        URI remoteUri;
+        if (artifactDescriptor instanceof CacheingArtifactDescriptor) {
+            CacheingArtifactDescriptor cacheingArtifactDescriptor = (CacheingArtifactDescriptor) artifactDescriptor;
+            remoteUri = cacheingArtifactDescriptor.getRemoteUri();
+        } else {
+            remoteUri = artifactDescriptor.getUri();
+        }
+        return remoteUri;
+    }
+
+    private SingleArtifactCache getArtifactCache(String repositoryName, String type, String name, Version version, URI uri, String fileName,
+        File repositoryCacheDirectory) {
+        String cacheName = getCacheName(repositoryName, uri);
+        SingleArtifactCache cache = this.artifactCaches.get(cacheName);
+        if (cache == null) {
+            this.artifactCaches.putIfAbsent(cacheName, new StandardSingleArtifactCache(type, name, version, uri, fileName, repositoryCacheDirectory));
+            cache = this.artifactCaches.get(cacheName);
+        }
+        return cache;
+    }
+
+    private String getCacheName(String repositoryName, URI uri) {
+        return repositoryName + CACHE_NAME_SEPARATOR + uri.toString();
+    }
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/cacheing/cache/descriptorhash/ArtifactDescriptorHash.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/cacheing/cache/descriptorhash/ArtifactDescriptorHash.java
new file mode 100644
index 0000000..de8b54c
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/cacheing/cache/descriptorhash/ArtifactDescriptorHash.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.cacheing.cache.descriptorhash;
+
+/**
+ * {@link ArtifactDescriptorHash} is an interface for the hash which may be associated with an
+ * {@link org.eclipse.virgo.repository.ArtifactDescriptor ArtifactDescriptor}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations of this interface must be thread safe.
+ * 
+ */
+public interface ArtifactDescriptorHash {
+
+    /**
+     * Returns <code>true</code> if and only if the {@link org.eclipse.virgo.repository.ArtifactDescriptor ArtifactDescriptor} has an associated hash.
+     * 
+     * @return a boolean which is <code>true</code> if and only if there is an associated hash
+     */
+    boolean isPresent();
+
+    /**
+     * Returns <code>true</code> if and only if the {@link org.eclipse.virgo.repository.ArtifactDescriptor ArtifactDescriptor} has an associated hash equal to the given hash.
+     * 
+     * @param hashToMatch the hash to compare with the associated hash
+     * @return <code>true</code> if and only if the hashes match
+     */
+    boolean matches(String hashToMatch);
+    
+    /**
+     * Returns the digest algorithm name, such as "sha" or "MD5", used to create the hash associated with the {@link org.eclipse.virgo.repository.ArtifactDescriptor ArtifactDescriptor}.
+     * If the <code>ArtifactDescriptor</code> does not specify the algorithm, returns "sha".
+     * 
+     * @return the digest algorithm name
+     */
+    String getDigestAlgorithm();
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/cacheing/cache/descriptorhash/ArtifactDescriptorHashFactory.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/cacheing/cache/descriptorhash/ArtifactDescriptorHashFactory.java
new file mode 100644
index 0000000..8b1a4b3
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/cacheing/cache/descriptorhash/ArtifactDescriptorHashFactory.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.cacheing.cache.descriptorhash;
+
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+
+
+/**
+ * {@link ArtifactDescriptorHashFactory} creates {@link ArtifactDescriptorHash} instances.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Implementations of this interface must be thread safe.
+ *
+ */
+public interface ArtifactDescriptorHashFactory {
+    
+    ArtifactDescriptorHash createArtifactDescriptorHash(RepositoryAwareArtifactDescriptor artifactDescriptor);
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/cacheing/cache/descriptorhash/StandardArtifactDescriptorHash.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/cacheing/cache/descriptorhash/StandardArtifactDescriptorHash.java
new file mode 100644
index 0000000..696b10c
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/cacheing/cache/descriptorhash/StandardArtifactDescriptorHash.java
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.cacheing.cache.descriptorhash;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+import org.eclipse.virgo.repository.Attribute;
+import org.eclipse.virgo.repository.util.FileDigest;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * {@link StandardArtifactDescriptorHash} encapsulates the repository cache hash validation logic.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread safe.
+ * 
+ */
+class StandardArtifactDescriptorHash implements ArtifactDescriptorHash {
+
+    private static final String DEFAULT_DIGEST_ALGORITHM = FileDigest.SHA_DIGEST_ALGORITHM;
+
+    private static final String HASH_ATTRIBUTE_NAME = "hash";
+
+    private static final String HASH_ALGORITHM_ATTRIBUTE_NAME = "hash-algorithm";
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(StandardArtifactDescriptorHash.class);
+
+    private final boolean hasHash;
+
+    private final String hash;
+
+    private final String digestAlgorithm;
+
+    StandardArtifactDescriptorHash(ArtifactDescriptor artifactDescriptor) {
+        this.hash = getAttribute(artifactDescriptor, HASH_ATTRIBUTE_NAME, null);
+        this.hasHash = isReasonableHash(this.hash);
+
+        this.digestAlgorithm = getAttribute(artifactDescriptor, HASH_ALGORITHM_ATTRIBUTE_NAME, DEFAULT_DIGEST_ALGORITHM);
+    }
+
+    private String getAttribute(ArtifactDescriptor artifactDescriptor, String attributeName, String defaultAttributeValue) {
+        String attributeValue = defaultAttributeValue;
+        Set<Attribute> attributeSet = getAttributeSet(artifactDescriptor, attributeName);
+        if (!attributeSet.isEmpty()) {
+            if (attributeSet.size() > 1) {
+                LOGGER.warn("Attribute with name " + attributeName + " has multiple values - using first and ignoring others");
+            }
+            Attribute algorithmAttribute = attributeSet.iterator().next();
+
+            String key = algorithmAttribute.getKey();
+            if (attributeName.equals(key)) {
+                attributeValue = algorithmAttribute.getValue();
+            } else {
+                LOGGER.warn("Attribute found using name " + attributeName + " has unexpected key '" + key + "'");
+            }
+        }
+        return attributeValue;
+    }
+
+    private Set<Attribute> getAttributeSet(ArtifactDescriptor artifactDescriptor, String attributeName) {
+        Set<Attribute> hashAttributeSet = artifactDescriptor.getAttribute(attributeName);
+        if (hashAttributeSet == null) {
+            hashAttributeSet = new HashSet<Attribute>();
+        }
+        return hashAttributeSet;
+    }
+
+    private boolean isReasonableHash(String hashValue) {
+        boolean reasonable = hashValue != null && !hashValue.isEmpty();
+        if (!reasonable) {
+            LOGGER.warn("Hash value {} is unreasonable", hashValue);
+        }
+        return reasonable;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isPresent() {
+        return this.hasHash;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean matches(String hashToMatch) {
+        return isPresent() ? this.hash.equals(hashToMatch) : false;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getDigestAlgorithm() {
+        return this.digestAlgorithm;
+    }
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/cacheing/cache/descriptorhash/StandardArtifactDescriptorHashFactory.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/cacheing/cache/descriptorhash/StandardArtifactDescriptorHashFactory.java
new file mode 100644
index 0000000..1f1b0c6
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/cacheing/cache/descriptorhash/StandardArtifactDescriptorHashFactory.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.cacheing.cache.descriptorhash;
+
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+
+/**
+ * {@link StandardArtifactDescriptorHashFactory} is the default {@link ArtifactDescriptorHashFactory}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+public class StandardArtifactDescriptorHashFactory implements ArtifactDescriptorHashFactory {
+
+    /**
+     * {@inheritDoc}
+     */
+    public ArtifactDescriptorHash createArtifactDescriptorHash(RepositoryAwareArtifactDescriptor artifactDescriptor) {
+        return new StandardArtifactDescriptorHash(artifactDescriptor);
+    }
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/chain/ChainedQuery.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/chain/ChainedQuery.java
new file mode 100644
index 0000000..b43caa7
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/chain/ChainedQuery.java
@@ -0,0 +1,182 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.chain;
+
+import java.net.URI;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+
+import org.eclipse.virgo.repository.Attribute;
+import org.eclipse.virgo.repository.Query;
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+import org.osgi.framework.Version;
+
+/**
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe
+ * 
+ */
+class ChainedQuery implements Query {
+
+    private final List<Query> queries;
+
+    ChainedQuery(List<Query> queries) {
+        this.queries = queries;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Query addFilter(String name, String value) {
+        for (Query query : this.queries) {
+            query.addFilter(name, value);
+        }
+        return this;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Query addFilter(String name, String value, Map<String, Set<String>> properties) {
+        for (Query query : this.queries) {
+            query.addFilter(name, value, properties);
+        }
+        return this;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Query setVersionRangeFilter(VersionRange versionRange) {
+        for (Query query : this.queries) {
+            query.setVersionRangeFilter(versionRange);
+        }
+        return this;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Query setVersionRangeFilter(VersionRange versionRange, VersionRangeMatchingStrategy strategy) {
+        for (Query query : this.queries) {
+            query.setVersionRangeFilter(versionRange, strategy);
+        }
+        return this;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Set<RepositoryAwareArtifactDescriptor> run() {
+        Set<RepositoryAwareArtifactDescriptor> artefacts = new TreeSet<RepositoryAwareArtifactDescriptor>();
+
+        int index = 0;
+
+        for (Query query : this.queries) {
+            Set<RepositoryAwareArtifactDescriptor> queryResult = query.run();
+            for (RepositoryAwareArtifactDescriptor artefact : queryResult) {
+                artefacts.add(new ComparableArtifactDescriptor(index++, artefact));
+            }
+        }
+
+        return artefacts;
+    }
+
+    static final class ComparableArtifactDescriptor implements RepositoryAwareArtifactDescriptor, Comparable<ComparableArtifactDescriptor> {
+
+        private final int index;
+
+        private final RepositoryAwareArtifactDescriptor artifactDescriptor;
+
+        ComparableArtifactDescriptor(int index, RepositoryAwareArtifactDescriptor artefact) {
+            this.index = index;
+            this.artifactDescriptor = artefact;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public Set<Attribute> getAttribute(String name) {
+            return this.artifactDescriptor.getAttribute(name);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public Set<Attribute> getAttributes() {
+            return this.artifactDescriptor.getAttributes();
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public String getName() {
+            return this.artifactDescriptor.getName();
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public String getType() {
+            return this.artifactDescriptor.getType();
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public URI getUri() {
+            return this.artifactDescriptor.getUri();
+
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public Version getVersion() {
+            return this.artifactDescriptor.getVersion();
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public int compareTo(ComparableArtifactDescriptor o) {
+            return this.index - o.index;
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            return this.artifactDescriptor.equals(o);
+        }
+
+        @Override
+        public int hashCode() {
+            return this.artifactDescriptor.hashCode();
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public String getFilename() {
+            return this.artifactDescriptor.getFilename();
+        }
+
+        public String getRepositoryName() {
+            return this.artifactDescriptor.getRepositoryName();
+        }
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/chain/ChainedRepository.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/chain/ChainedRepository.java
new file mode 100644
index 0000000..2b75230
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/chain/ChainedRepository.java
@@ -0,0 +1,99 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.chain;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.eclipse.virgo.repository.Query;
+import org.eclipse.virgo.repository.Repository;
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+import org.eclipse.virgo.repository.internal.RepositoryUtils;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+
+/**
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * As thread-safe as the repositories in the chain
+ * 
+ */
+public final class ChainedRepository implements Repository {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(ChainedRepository.class);
+
+    private final List<Repository> repositories;
+
+    private final String name;
+
+    public ChainedRepository(String name, List<Repository> repositories) {
+        this.name = name;
+        this.repositories = repositories;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Query createQuery(String key, String value) {
+        List<Query> queries = new ArrayList<Query>();
+        for (Repository repository : this.repositories) {
+            queries.add(repository.createQuery(key, value));
+        }
+        return new ChainedQuery(queries);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Query createQuery(String key, String value, Map<String, Set<String>> properties) {
+        List<Query> queries = new ArrayList<Query>();
+        for (Repository repository : this.repositories) {
+            queries.add(repository.createQuery(key, value, properties));
+        }
+        return new ChainedQuery(queries);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getName() {
+        return this.name;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public RepositoryAwareArtifactDescriptor get(String type, String name, VersionRange versionRange) {
+        Set<RepositoryAwareArtifactDescriptor> artifacts = new HashSet<RepositoryAwareArtifactDescriptor>();
+
+        for (Repository repository : this.repositories) {
+            RepositoryAwareArtifactDescriptor artifact = repository.get(type, name, versionRange);
+            if (artifact != null) {
+                artifacts.add(artifact);
+            }
+        }
+        LOGGER.debug("Chain returned {} artifacts named '{}' in version range '{}'.", new Object[] { artifacts.size(), name, versionRange });
+        return RepositoryUtils.selectHighestVersion(artifacts);
+    }
+
+    public void stop() {
+        for (Repository repository : this.repositories) {
+            repository.stop();
+        }
+    }
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/eventlog/DynamicDelegationEventLogger.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/eventlog/DynamicDelegationEventLogger.java
new file mode 100644
index 0000000..c2012e1
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/eventlog/DynamicDelegationEventLogger.java
@@ -0,0 +1,122 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.eventlog;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.util.tracker.ServiceTracker;
+import org.osgi.util.tracker.ServiceTrackerCustomizer;
+
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.medic.eventlog.Level;
+import org.eclipse.virgo.medic.eventlog.LogEvent;
+
+/**
+ * An {@link EventLogger} implementation that delegates to all of the
+ * <code>EventLogger</code> implementations available in the service registry
+ * when <code>log(...)</code> is called.
+ * 
+ * <p />
+ * 
+ * <strong>Note</strong>: a <code>DynamicDelegationEventLogger</code> must be
+ * {@link #start() started} before it will find any <code>EventLoggers</code> in
+ * the service registry and prior to disposal, it should be {@link #stop()
+ * stopped}.
+ * 
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ * 
+ */
+public final class DynamicDelegationEventLogger implements EventLogger {
+
+	private final ServiceTracker<EventLogger, EventLogger> serviceTracker;
+
+	private final EventLoggerTracker eventLoggerTracker;
+
+	public DynamicDelegationEventLogger(BundleContext bundleContext) {
+		this.eventLoggerTracker = new EventLoggerTracker(bundleContext);
+		this.serviceTracker = new ServiceTracker<EventLogger, EventLogger>(
+				bundleContext, EventLogger.class.getName(),
+				this.eventLoggerTracker);
+	}
+
+	public void start() {
+		this.serviceTracker.open();
+	}
+
+	public void stop() {
+		this.serviceTracker.close();
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void log(LogEvent logEvent, Object... inserts) {
+		log(logEvent.getEventCode(), logEvent.getLevel(), null, inserts);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void log(String code, Level level, Object... inserts) {
+		log(code, level, null, inserts);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void log(LogEvent logEvent, Throwable throwable, Object... inserts) {
+		log(logEvent.getEventCode(), logEvent.getLevel(), throwable, inserts);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void log(String code, Level level, Throwable throwable,
+			Object... inserts) {
+		Object[] objects = this.serviceTracker.getServices();
+
+		if (objects != null) {
+			for (Object object : objects) {
+				((EventLogger) object).log(code, level, throwable, inserts);
+			}
+		}
+	}
+
+	private static final class EventLoggerTracker implements
+			ServiceTrackerCustomizer<EventLogger, EventLogger> {
+
+		private final BundleContext bundleContext;
+
+		private EventLoggerTracker(BundleContext bundleContext) {
+			this.bundleContext = bundleContext;
+		}
+
+		public EventLogger addingService(ServiceReference<EventLogger> reference) {
+			EventLogger service = (EventLogger) this.bundleContext
+					.getService(reference);
+			return service;
+		}
+
+		public void modifiedService(ServiceReference<EventLogger> reference,
+				EventLogger service) {
+		}
+
+		public void removedService(ServiceReference<EventLogger> reference,
+				EventLogger service) {
+			this.bundleContext.ungetService(reference);
+		}
+	}
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/external/AntPathMatcher.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/external/AntPathMatcher.java
new file mode 100644
index 0000000..aa818be
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/external/AntPathMatcher.java
@@ -0,0 +1,432 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 VMware Inc.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * and Apache License v2.0 which accompanies this distribution. 
+ * The Eclipse Public License is available at
+ *   http://www.eclipse.org/legal/epl-v10.html
+ * and the Apache License v2.0 is available at 
+ *   http://www.opensource.org/licenses/apache2.0.php.
+ * You may elect to redistribute this code under either of these licenses.  
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.external;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.StringTokenizer;
+
+/**
+ * PathMatcher implementation for Ant-style path patterns.
+ * Examples are provided below.
+ *
+ * <p>Part of this mapping code has been kindly borrowed from
+ * <a href="http://ant.apache.org">Apache Ant</a>.
+ *
+ * <p>The mapping matches URLs using the following rules:<br>
+ * <ul>
+ * <li>? matches one character</li>
+ * <li>* matches zero or more characters</li>
+ * <li>** matches zero or more 'directories' in a path</li>
+ * </ul>
+ *
+ * <p>Some examples:<br>
+ * <ul>
+ * <li><code>com/t?st.jsp</code> - matches <code>com/test.jsp</code> but also
+ * <code>com/tast.jsp</code> or <code>com/txst.jsp</code></li>
+ * <li><code>com/*.jsp</code> - matches all <code>.jsp</code> files in the
+ * <code>com</code> directory</li>
+ * <li><code>com/&#42;&#42;/test.jsp</code> - matches all <code>test.jsp</code>
+ * files underneath the <code>com</code> path</li>
+ * <li><code>org/springframework/&#42;&#42;/*.jsp</code> - matches all <code>.jsp</code>
+ * files underneath the <code>org/springframework</code> path</li>
+ * <li><code>org/&#42;&#42;/servlet/bla.jsp</code> - matches
+ * <code>org/springframework/servlet/bla.jsp</code> but also
+ * <code>org/springframework/testing/servlet/bla.jsp</code> and
+ * <code>org/servlet/bla.jsp</code></li>
+ * </ul>
+ *
+ */
+final class AntPathMatcher {
+
+	/** Default path separator: "/" */
+	public static final String DEFAULT_PATH_SEPARATOR = "/";
+
+	private String pathSeparator = DEFAULT_PATH_SEPARATOR;
+
+	/**
+	 * Set the path separator to use for pattern parsing.
+	 * Default is "/", as in Ant.
+	 * @param pathSeparator to use in pattern parsing
+	 */
+	public void setPathSeparator(String pathSeparator) {
+		this.pathSeparator = (pathSeparator != null ? pathSeparator : DEFAULT_PATH_SEPARATOR);
+	}
+
+	public boolean match(String pattern, String path) {
+		return doMatch(pattern, path, true);
+	}
+
+	public boolean matchStart(String pattern, String path) {
+		return doMatch(pattern, path, false);
+	}
+
+	/**
+	 * Actually match the given <code>path</code> against the given <code>pattern</code>.
+	 * @param pattern the pattern to match against
+	 * @param path the path String to test
+	 * @param fullMatch whether a full pattern match is required
+	 * (else a pattern match as far as the given base path goes is sufficient)
+	 * @return <code>true</code> if the supplied <code>path</code> matched,
+	 * <code>false</code> if it didn't
+	 */
+	protected boolean doMatch(String pattern, String path, boolean fullMatch) {
+		if (path.startsWith(this.pathSeparator) != pattern.startsWith(this.pathSeparator)) {
+			return false;
+		}
+
+		String[] pattDirs = tokenizeToStringArray(pattern, this.pathSeparator);
+		String[] pathDirs = tokenizeToStringArray(path, this.pathSeparator);
+
+		int pattIdxStart = 0;
+		int pattIdxEnd = pattDirs.length - 1;
+		int pathIdxStart = 0;
+		int pathIdxEnd = pathDirs.length - 1;
+
+		// Match all elements up to the first **
+		while (pattIdxStart <= pattIdxEnd && pathIdxStart <= pathIdxEnd) {
+			String patDir = pattDirs[pattIdxStart];
+			if ("**".equals(patDir)) {
+				break;
+			}
+			if (!matchStrings(patDir, pathDirs[pathIdxStart])) {
+				return false;
+			}
+			pattIdxStart++;
+			pathIdxStart++;
+		}
+
+		if (pathIdxStart > pathIdxEnd) {
+			// Path is exhausted, only match if rest of pattern is * or **'s
+			if (pattIdxStart > pattIdxEnd) {
+				return (pattern.endsWith(this.pathSeparator) ?
+						path.endsWith(this.pathSeparator) : !path.endsWith(this.pathSeparator));
+			}
+			if (!fullMatch) {
+				return true;
+			}
+			if (pattIdxStart == pattIdxEnd && pattDirs[pattIdxStart].equals("*") &&
+					path.endsWith(this.pathSeparator)) {
+				return true;
+			}
+			for (int i = pattIdxStart; i <= pattIdxEnd; i++) {
+				if (!pattDirs[i].equals("**")) {
+					return false;
+				}
+			}
+			return true;
+		}
+		else if (pattIdxStart > pattIdxEnd) {
+			// String not exhausted, but pattern is. Failure.
+			return false;
+		}
+		else if (!fullMatch && "**".equals(pattDirs[pattIdxStart])) {
+			// Path start definitely matches due to "**" part in pattern.
+			return true;
+		}
+
+		// up to last '**'
+		while (pattIdxStart <= pattIdxEnd && pathIdxStart <= pathIdxEnd) {
+			String patDir = pattDirs[pattIdxEnd];
+			if (patDir.equals("**")) {
+				break;
+			}
+			if (!matchStrings(patDir, pathDirs[pathIdxEnd])) {
+				return false;
+			}
+			pattIdxEnd--;
+			pathIdxEnd--;
+		}
+		if (pathIdxStart > pathIdxEnd) {
+			// String is exhausted
+			for (int i = pattIdxStart; i <= pattIdxEnd; i++) {
+				if (!pattDirs[i].equals("**")) {
+					return false;
+				}
+			}
+			return true;
+		}
+
+		while (pattIdxStart != pattIdxEnd && pathIdxStart <= pathIdxEnd) {
+			int patIdxTmp = -1;
+			for (int i = pattIdxStart + 1; i <= pattIdxEnd; i++) {
+				if (pattDirs[i].equals("**")) {
+					patIdxTmp = i;
+					break;
+				}
+			}
+			if (patIdxTmp == pattIdxStart + 1) {
+				// '**/**' situation, so skip one
+				pattIdxStart++;
+				continue;
+			}
+			// Find the pattern between padIdxStart & padIdxTmp in str between
+			// strIdxStart & strIdxEnd
+			int patLength = (patIdxTmp - pattIdxStart - 1);
+			int strLength = (pathIdxEnd - pathIdxStart + 1);
+			int foundIdx = -1;
+
+			strLoop:
+			    for (int i = 0; i <= strLength - patLength; i++) {
+				    for (int j = 0; j < patLength; j++) {
+					    String subPat = pattDirs[pattIdxStart + j + 1];
+					    String subStr = pathDirs[pathIdxStart + i + j];
+					    if (!matchStrings(subPat, subStr)) {
+						    continue strLoop;
+					    }
+				    }
+				    foundIdx = pathIdxStart + i;
+				    break;
+			    }
+
+			if (foundIdx == -1) {
+				return false;
+			}
+
+			pattIdxStart = patIdxTmp;
+			pathIdxStart = foundIdx + patLength;
+		}
+
+		for (int i = pattIdxStart; i <= pattIdxEnd; i++) {
+			if (!pattDirs[i].equals("**")) {
+				return false;
+			}
+		}
+
+		return true;
+	}
+
+	/**
+	 * Tests whether or not a string matches against a pattern.
+	 * The pattern may contain two special characters:<br>
+	 * '*' means zero or more characters<br>
+	 * '?' means one and only one character
+	 * @param pattern pattern to match against.
+	 * Must not be <code>null</code>.
+	 * @param str string which must be matched against the pattern.
+	 * Must not be <code>null</code>.
+	 * @return <code>true</code> if the string matches against the
+	 * pattern, or <code>false</code> otherwise.
+	 */
+	private boolean matchStrings(String pattern, String str) {
+		char[] patArr = pattern.toCharArray();
+		char[] strArr = str.toCharArray();
+		int patIdxStart = 0;
+		int patIdxEnd = patArr.length - 1;
+		int strIdxStart = 0;
+		int strIdxEnd = strArr.length - 1;
+		char ch;
+
+		boolean containsStar = false;
+		for (int i = 0; i < patArr.length; i++) {
+			if (patArr[i] == '*') {
+				containsStar = true;
+				break;
+			}
+		}
+
+		if (!containsStar) {
+			// No '*'s, so we make a shortcut
+			if (patIdxEnd != strIdxEnd) {
+				return false; // Pattern and string do not have the same size
+			}
+			for (int i = 0; i <= patIdxEnd; i++) {
+				ch = patArr[i];
+				if (ch != '?') {
+					if (ch != strArr[i]) {
+						return false;// Character mismatch
+					}
+				}
+			}
+			return true; // String matches against pattern
+		}
+
+
+		if (patIdxEnd == 0) {
+			return true; // Pattern contains only '*', which matches anything
+		}
+
+		// Process characters before first star
+		while ((ch = patArr[patIdxStart]) != '*' && strIdxStart <= strIdxEnd) {
+			if (ch != '?') {
+				if (ch != strArr[strIdxStart]) {
+					return false;// Character mismatch
+				}
+			}
+			patIdxStart++;
+			strIdxStart++;
+		}
+		if (strIdxStart > strIdxEnd) {
+			// All characters in the string are used. Check if only '*'s are
+			// left in the pattern. If so, we succeeded. Otherwise failure.
+			for (int i = patIdxStart; i <= patIdxEnd; i++) {
+				if (patArr[i] != '*') {
+					return false;
+				}
+			}
+			return true;
+		}
+
+		// Process characters after last star
+		while ((ch = patArr[patIdxEnd]) != '*' && strIdxStart <= strIdxEnd) {
+			if (ch != '?') {
+				if (ch != strArr[strIdxEnd]) {
+					return false;// Character mismatch
+				}
+			}
+			patIdxEnd--;
+			strIdxEnd--;
+		}
+		if (strIdxStart > strIdxEnd) {
+			// All characters in the string are used. Check if only '*'s are
+			// left in the pattern. If so, we succeeded. Otherwise failure.
+			for (int i = patIdxStart; i <= patIdxEnd; i++) {
+				if (patArr[i] != '*') {
+					return false;
+				}
+			}
+			return true;
+		}
+
+		// process pattern between stars. padIdxStart and patIdxEnd point
+		// always to a '*'.
+		while (patIdxStart != patIdxEnd && strIdxStart <= strIdxEnd) {
+			int patIdxTmp = -1;
+			for (int i = patIdxStart + 1; i <= patIdxEnd; i++) {
+				if (patArr[i] == '*') {
+					patIdxTmp = i;
+					break;
+				}
+			}
+			if (patIdxTmp == patIdxStart + 1) {
+				// Two stars next to each other, skip the first one.
+				patIdxStart++;
+				continue;
+			}
+			// Find the pattern between padIdxStart & padIdxTmp in str between
+			// strIdxStart & strIdxEnd
+			int patLength = (patIdxTmp - patIdxStart - 1);
+			int strLength = (strIdxEnd - strIdxStart + 1);
+			int foundIdx = -1;
+			strLoop:
+			for (int i = 0; i <= strLength - patLength; i++) {
+				for (int j = 0; j < patLength; j++) {
+					ch = patArr[patIdxStart + j + 1];
+					if (ch != '?') {
+						if (ch != strArr[strIdxStart + i + j]) {
+							continue strLoop;
+						}
+					}
+				}
+
+				foundIdx = strIdxStart + i;
+				break;
+			}
+
+			if (foundIdx == -1) {
+				return false;
+			}
+
+			patIdxStart = patIdxTmp;
+			strIdxStart = foundIdx + patLength;
+		}
+
+		// All characters in the string are used. Check if only '*'s are left
+		// in the pattern. If so, we succeeded. Otherwise failure.
+		for (int i = patIdxStart; i <= patIdxEnd; i++) {
+			if (patArr[i] != '*') {
+				return false;
+			}
+		}
+
+		return true;
+	}
+	
+	/**
+     * Tokenize the given String into a String array via a StringTokenizer.
+     * Trims tokens and omits empty tokens.
+     * <p>The given delimiters string is supposed to consist of any number of
+     * delimiter characters. Each of those characters can be used to separate
+     * tokens. A delimiter is always a single character; for multi-character
+     * delimiters, consider using <code>delimitedListToStringArray</code>
+     * @param str the String to tokenize
+     * @param delimiters the delimiter characters, assembled as String
+     * (each of those characters is individually considered as delimiter).
+     * @return an array of the tokens
+     * @see java.util.StringTokenizer
+     * @see java.lang.String#trim()
+     * @see #delimitedListToStringArray
+     */
+    private static String[] tokenizeToStringArray(String str, String delimiters) {
+        return tokenizeToStringArray(str, delimiters, true, true);
+    }
+
+    /**
+     * Tokenize the given String into a String array via a StringTokenizer.
+     * <p>The given delimiters string is supposed to consist of any number of
+     * delimiter characters. Each of those characters can be used to separate
+     * tokens. A delimiter is always a single character; for multi-character
+     * delimiters, consider using <code>delimitedListToStringArray</code>
+     * @param str the String to tokenize
+     * @param delimiters the delimiter characters, assembled as String
+     * (each of those characters is individually considered as delimiter)
+     * @param trimTokens trim the tokens via String's <code>trim</code>
+     * @param ignoreEmptyTokens omit empty tokens from the result array
+     * (only applies to tokens that are empty after trimming; StringTokenizer
+     * will not consider subsequent delimiters as token in the first place).
+     * @return an array of the tokens (<code>null</code> if the input String
+     * was <code>null</code>)
+     * @see java.util.StringTokenizer
+     * @see java.lang.String#trim()
+     * @see #delimitedListToStringArray
+     */
+    private static String[] tokenizeToStringArray(
+            String str, String delimiters, boolean trimTokens, boolean ignoreEmptyTokens) {
+
+        if (str == null) {
+            return null;
+        }
+        StringTokenizer st = new StringTokenizer(str, delimiters);
+        List<String> tokens = new ArrayList<String>();
+        while (st.hasMoreTokens()) {
+            String token = st.nextToken();
+            if (trimTokens) {
+                token = token.trim();
+            }
+            if (!ignoreEmptyTokens || token.length() > 0) {
+                tokens.add(token);
+            }
+        }
+        return toStringArray(tokens);
+    }
+    
+    /**
+     * Copy the given Collection into a String array.
+     * The Collection must contain String elements only.
+     * @param collection the Collection to copy
+     * @return the String array (<code>null</code> if the passed-in
+     * Collection was <code>null</code>)
+     */
+    private static String[] toStringArray(Collection<?> collection) {
+        if (collection == null) {
+            return null;
+        }
+        return collection.toArray(new String[collection.size()]);
+    }
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/external/AntPathMatchingFileSystemSearcher.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/external/AntPathMatchingFileSystemSearcher.java
new file mode 100644
index 0000000..0f90830
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/external/AntPathMatchingFileSystemSearcher.java
@@ -0,0 +1,124 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.external;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.eclipse.virgo.util.io.FileSystemUtils;
+
+/**
+ * A {@link FileSystemSearcher} implementation that searches based on an Ant-style search pattern. See
+ * {@link AntPathMatcher} for more details of the syntax.
+ * <p />
+ * Files that match according to {@link AntPathMatcher#match(String, String)} are considered to be terminal matches.
+ * Files that match according to {@link AntPathMatcher#matchStart(String, String)} are considered to be non-terminal
+ * matches.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * This class is <strong>thread-safe</strong>.
+ * 
+ */
+public final class AntPathMatchingFileSystemSearcher implements FileSystemSearcher {
+
+    private static final String REGEX_MATCHING_BACKSLASH = "\\\\";
+
+    private static final String BACKSLASH_SEPARATOR = "\\";
+
+    private final File rootDir;
+
+    private final String antPathPattern;
+
+    private final AntPathMatcher antPathMatcher;       
+
+    File getRootDir() {
+        return this.rootDir;
+    }
+    
+    boolean matchPath(String filePath) {
+        return this.antPathMatcher.match(this.antPathPattern, filePath);
+    }
+    
+    /**
+     * Creates a new instance that will locate files based on the supplied path pattern.
+     * The supplied path pattern <strong>must</strong> be absolute.
+     *
+     * @param antPathPattern The Ant path pattern to match against.
+     */
+    public AntPathMatchingFileSystemSearcher(String antPathPattern) {
+        if (!isAbsolute(antPathPattern)) {
+            throw new IllegalArgumentException(String.format("The search pattern '%s' is not absolute.", antPathPattern));
+        }      
+  
+        // NB: cannot cope with arbitrary separator character -- assumes syntax for regex argument of split()
+        String[] pathComponents = antPathPattern.split(File.separator.equals(BACKSLASH_SEPARATOR) ? REGEX_MATCHING_BACKSLASH : File.separator);
+        
+        StringBuilder rootPathBuilder = new StringBuilder();
+        StringBuilder antPatternBuilder = new StringBuilder();
+        boolean rootPathBuilt = false;
+
+        for (String component : pathComponents) {
+            if (!rootPathBuilt && !component.contains("*") && !component.contains("?")) {
+                rootPathBuilder.append(File.separator);
+                rootPathBuilder.append(component);
+            } else {
+                rootPathBuilt = true;
+                antPatternBuilder.append(File.separator);
+                antPatternBuilder.append(component);
+            }
+        }
+        try {
+            this.rootDir = new File(rootPathBuilder.toString()).getCanonicalFile();
+        } catch (IOException ioe) {
+            throw new RuntimeException("Unable to determine canonical root directory from '" + rootPathBuilder.toString() + "'", ioe);
+        }
+        this.antPathMatcher = new AntPathMatcher();
+        this.antPathMatcher.setPathSeparator(File.separator);
+        this.antPathPattern = this.rootDir.getPath() + antPatternBuilder.toString();       
+    }
+    
+    private static boolean isAbsolute(String searchPattern) {    
+        if (!searchPattern.startsWith("/") && !(searchPattern.indexOf(":") > 0)) {
+            return false;
+        } else {
+            return true;
+        }        
+    }
+
+    /**
+     * {@inheritDoc}
+     */    
+    public void search(SearchCallback callback) {
+        search(this.rootDir, callback);
+    }
+
+    private void search(File file, SearchCallback callback) {
+        String absolutePath = file.getAbsolutePath();
+        if (this.antPathMatcher.match(this.antPathPattern, absolutePath)) {
+            callback.found(file, true);
+        } else if (file.isDirectory() && this.antPathMatcher.matchStart(this.antPathPattern, absolutePath)) {
+            callback.found(file, false);
+        }
+        
+        if (file.isDirectory()) {
+            for (File fileInDir : FileSystemUtils.listFiles(file)) {
+                search(fileInDir, callback);
+            }
+        }        
+    }
+    
+    @Override
+    public String toString() {
+    	return this.antPathPattern;
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/external/ExternalArtifactStore.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/external/ExternalArtifactStore.java
new file mode 100644
index 0000000..bb2d17f
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/external/ExternalArtifactStore.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.external;
+
+import java.io.File;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.virgo.repository.internal.external.FileSystemSearcher.SearchCallback;
+
+
+
+/**
+ * An <code>ExternalArtifactStore</code> locates artifacts in externally-managed
+ * storage using a {@link FileSystemSearcher}.
+ * 
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Thread-safe.
+ *
+ */
+public class ExternalArtifactStore {
+    
+    private final Set<File> artifacts = new HashSet<File>();
+    
+    public ExternalArtifactStore(FileSystemSearcher fileSystemSearcher) {        
+    
+        fileSystemSearcher.search(new SearchCallback() {
+            public void found(File file, boolean terminal) {
+                if (terminal) {
+                    artifacts.add(file);
+                }
+            }            
+        });        
+    }
+    
+    public Set<File> getArtifacts() {
+        return this.artifacts;
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/external/ExternalStorageRepository.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/external/ExternalStorageRepository.java
new file mode 100644
index 0000000..42cce0b
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/external/ExternalStorageRepository.java
@@ -0,0 +1,156 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.external;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URI;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.management.JMException;
+
+import org.osgi.framework.Version;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.repository.ArtifactDescriptorPersister;
+import org.eclipse.virgo.repository.DuplicateArtifactException;
+import org.eclipse.virgo.repository.IndexFormatException;
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+import org.eclipse.virgo.repository.RepositoryCreationException;
+import org.eclipse.virgo.repository.XmlArtifactDescriptorPersister;
+import org.eclipse.virgo.repository.codec.XMLRepositoryCodec;
+import org.eclipse.virgo.repository.configuration.ExternalStorageRepositoryConfiguration;
+import org.eclipse.virgo.repository.internal.ArtifactDescriptorDepository;
+import org.eclipse.virgo.repository.internal.MutableRepository;
+import org.eclipse.virgo.repository.internal.PersistentRepository;
+import org.eclipse.virgo.repository.internal.RepositoryLogEvents;
+import org.eclipse.virgo.repository.internal.management.StandardExternalStorageRepositoryInfo;
+import org.eclipse.virgo.repository.management.RepositoryInfo;
+import org.eclipse.virgo.util.io.FileSystemUtils;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+
+/**
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe
+ * 
+ */
+public final class ExternalStorageRepository extends PersistentRepository implements MutableRepository {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(ExternalStorageRepository.class);
+
+    private final EventLogger eventLogger;
+
+    private final AntPathMatchingFileSystemSearcher antPathMatchingFileSystemSearcher;
+
+    public ExternalStorageRepository(ExternalStorageRepositoryConfiguration configuration, EventLogger eventLogger)
+        throws RepositoryCreationException, IndexFormatException {
+        this(configuration, new XmlArtifactDescriptorPersister(new XMLRepositoryCodec(), configuration.getName(), configuration.getIndexLocation()), eventLogger);
+    }
+    
+    public ExternalStorageRepository(ExternalStorageRepositoryConfiguration configuration, ArtifactDescriptorPersister artifactDescriptorPersister, EventLogger eventLogger)
+        throws RepositoryCreationException, IndexFormatException {
+        super(configuration, artifactDescriptorPersister, eventLogger);
+        
+        this.eventLogger = eventLogger;
+        this.antPathMatchingFileSystemSearcher = new AntPathMatchingFileSystemSearcher(configuration.getSearchPattern());
+
+        if (artifactDescriptorPersister.loadArtifacts().isEmpty()) {
+            initialiseDepository(configuration.getName(), eventLogger);
+        }
+    }
+
+    private void initialiseDepository(String repositoryName, EventLogger eventLogger) throws RepositoryCreationException {
+
+            ExternalArtifactStore artifactStore = new ExternalArtifactStore(this.antPathMatchingFileSystemSearcher);
+            Set<File> artifacts = artifactStore.getArtifacts();
+            ArtifactDescriptorDepository artifactDepository = getDepository();
+            for (File artifact : artifacts) {
+                try {
+                    RepositoryAwareArtifactDescriptor artifactDescriptor = createArtifactDescriptor(artifact);
+                    if (artifactDescriptor != null) {
+                        artifactDepository.addArtifactDescriptor(artifactDescriptor);
+                    }
+                } catch (DuplicateArtifactException dae) {
+                    LOGGER.warn("Duplicate artifact '{}' discovered in external repository '{}'.", artifact, repositoryName);
+                }
+            }
+            try {
+                artifactDepository.persist();
+            } catch (IOException ioe) {
+                LOGGER.error(String.format("Persisting repository '%s' failed.", repositoryName), ioe);
+                eventLogger.log(RepositoryLogEvents.REPOSITORY_INDEX_NOT_PERSISTED, ioe, getName());
+                throw new RepositoryCreationException("Failed to persist depository for repository '" + repositoryName + "'", ioe);
+            }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected RepositoryInfo createMBean() throws JMException {
+        return new StandardExternalStorageRepositoryInfo(getName(), getDepository(), this);
+    }
+
+    public RepositoryAwareArtifactDescriptor publish(URI uri) throws DuplicateArtifactException {
+        if (!"file".equals(uri.getScheme())) {
+            LOGGER.error("Uri '{}' not supported for artifact publication to external repository '{}'.", uri, this.getName());
+            eventLogger.log(RepositoryLogEvents.ARTIFACT_NOT_PUBLISHED, uri, getName());
+            throw new IllegalArgumentException("'" + uri.getScheme()
+                + "' is an unsupported scheme for artifact publication. Supported schemes are: 'file'.");
+        }
+        RepositoryAwareArtifactDescriptor artifactDescriptor = createArtifactDescriptor(new File(uri));
+        if (artifactDescriptor==null) {
+            LOGGER.error("Uri '{}' not a valid artifact for external repository '{}'.", uri, this.getName());
+            eventLogger.log(RepositoryLogEvents.ARTIFACT_NOT_PUBLISHED, uri, getName(), uri.getScheme());
+            throw new IllegalArgumentException("'" + uri + "' is not a valid artifact for publication to '" + this.getName() + "'.");
+        }
+        this.getDepository().addArtifactDescriptor(artifactDescriptor);
+        return artifactDescriptor;
+    }
+
+    public boolean retract(String type, String name, Version version) {
+        RepositoryAwareArtifactDescriptor artifactDescriptor = get(type, name, VersionRange.createExactRange(version));
+        if (artifactDescriptor != null) {
+            return getDepository().removeArtifactDescriptor(artifactDescriptor);
+        } else {
+            LOGGER.warn("Artifact (type='{}',name='{}',version='{}') not in repository '{}' and cannot be retracted.", new Object[] { type, name,
+                version, this.getName() });
+            return false;
+        }
+    }
+
+    public Set<String> getArtifactLocations(String filename) {
+        File rootDir = this.antPathMatchingFileSystemSearcher.getRootDir();
+        Set<String> locations = locationsInDirs(rootDir, filename);
+        return locations;
+    }
+
+    private Set<String> locationsInDirs(File dir, String filename) {
+        Set<String> locations = new HashSet<String>();
+        String pathHere =  new File(dir,filename).getAbsolutePath();
+        if (this.antPathMatchingFileSystemSearcher.matchPath(pathHere)) {
+            locations.add(pathHere);
+        }
+        if (dir.isDirectory()) {
+            for (File f : FileSystemUtils.listFiles(dir)) {
+                if (f.isDirectory()) {
+                    locations.addAll(locationsInDirs(f, filename));
+                }
+            }
+        }
+        return locations;
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/external/FileSystemSearcher.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/external/FileSystemSearcher.java
new file mode 100644
index 0000000..e7daf84
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/external/FileSystemSearcher.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.external;
+
+import java.io.File;
+
+/**
+ * A <code>FileSystemSearcher</code> is used to search the file system to find artefacts
+ * 
+ * <strong>Concurrent Semantics</strong><br /> 
+ * Implementations need not be thread-safe.
+ * 
+ */
+interface FileSystemSearcher {
+
+    /**
+     * Searches the search space, notifying the given callback of matching files or directories that are found.
+     * @param callback the <code>SearchCallback</code> to notify when a file or directory is found.
+     */
+    void search(SearchCallback callback);
+
+    /**
+     * Callback for searching against the search path. <p/>
+     * 
+     * <strong>Concurrent Semantics</strong><br />
+     * 
+     * Implementations need not be thread-safe.
+     * 
+     */
+    public interface SearchCallback {
+
+        /**
+         * Called when a file is found that matches the search pattern.
+         * 
+         * @param file the matching file.
+         * @param terminal flag indicating whether the file matches against the terminal element of the search pattern.
+         */
+        void found(File file, boolean terminal);
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/management/AbstractRepositoryInfo.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/management/AbstractRepositoryInfo.java
new file mode 100644
index 0000000..0469c06
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/management/AbstractRepositoryInfo.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.management;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+import org.eclipse.virgo.repository.Attribute;
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+import org.eclipse.virgo.repository.internal.ArtifactDescriptorDepository;
+import org.eclipse.virgo.repository.internal.StandardQuery;
+import org.eclipse.virgo.repository.management.ArtifactDescriptorSummary;
+import org.eclipse.virgo.repository.management.RepositoryInfo;
+
+
+/**
+ * Abstract base implementation of {@link RepositoryInfo}
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+abstract class AbstractRepositoryInfo implements RepositoryInfo {
+
+    private final String name;
+
+    private final ArtifactDescriptorDepository artifactDepository;
+
+    public AbstractRepositoryInfo(String name, ArtifactDescriptorDepository artifactDepository) {
+        this.name = name;
+        this.artifactDepository = artifactDepository;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Set<ArtifactDescriptorSummary> getAllArtifactDescriptorSummaries() {
+        Set<RepositoryAwareArtifactDescriptor> artefactDescriptors = this.artifactDepository.resolveArtifactDescriptors(Collections.<Attribute> emptySet());
+        Set<ArtifactDescriptorSummary> artifactDescriptorSummaries = new HashSet<ArtifactDescriptorSummary>(artefactDescriptors.size());
+
+        for (RepositoryAwareArtifactDescriptor artifactDescriptor : artefactDescriptors) {
+            String type = artifactDescriptor.getType();
+            String name = artifactDescriptor.getName();
+            String version = artifactDescriptor.getVersion().toString();
+            artifactDescriptorSummaries.add(new ArtifactDescriptorSummary(type, name, version));
+        }
+
+        return artifactDescriptorSummaries;
+    }
+
+    public RepositoryAwareArtifactDescriptor getArtifactDescriptor(String type, String name, String version) {
+        Set<RepositoryAwareArtifactDescriptor> artefacts = new StandardQuery(this.artifactDepository, ArtifactDescriptor.TYPE, type).addFilter(
+            ArtifactDescriptor.NAME, name).addFilter(ArtifactDescriptor.VERSION, version).run();
+        if (artefacts.size() == 1) {
+            return artefacts.iterator().next();
+        }
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getName() {
+        return this.name;
+    }
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/management/RepositoryObjectNameFactory.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/management/RepositoryObjectNameFactory.java
new file mode 100644
index 0000000..1b22ea9
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/management/RepositoryObjectNameFactory.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.management;
+
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+
+/**
+ * A factory for uniformly creating an object name for a repository.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+public class RepositoryObjectNameFactory {
+
+    private static final String OBJECT_NAME_PATTERN = "%s:type=Repository,name=%s";
+
+    /**
+     * Creates a uniform object name based on the name of the repository
+     * 
+     * @param mBeanDomain the domain name to use
+     * @param repositoryName The name of the repository
+     * @return The uniform object name
+     * @throws NullPointerException but this should never happen
+     * @throws MalformedObjectNameException if the generated object name would be badly formed
+     */
+    public static ObjectName createObjectName(String mBeanDomain, String repositoryName) throws MalformedObjectNameException, NullPointerException {
+        return new ObjectName(String.format(OBJECT_NAME_PATTERN, mBeanDomain, repositoryName));
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/management/StandardExternalStorageRepositoryInfo.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/management/StandardExternalStorageRepositoryInfo.java
new file mode 100644
index 0000000..bf7a280
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/management/StandardExternalStorageRepositoryInfo.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.management;
+
+import java.net.URI;
+import java.util.Set;
+
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+import org.eclipse.virgo.repository.DuplicateArtifactException;
+import org.eclipse.virgo.repository.internal.ArtifactDescriptorDepository;
+import org.eclipse.virgo.repository.internal.MutableRepository;
+import org.eclipse.virgo.repository.management.ArtifactDescriptorSummary;
+import org.eclipse.virgo.repository.management.ExternalStorageRepositoryInfo;
+import org.osgi.framework.Version;
+
+
+/**
+ * Standard implementation of {@link ExternalStorageRepositoryInfo}.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe
+ *
+ */
+public class StandardExternalStorageRepositoryInfo extends AbstractRepositoryInfo implements ExternalStorageRepositoryInfo {
+    
+    private static final String TYPE = "external";
+    
+    private final MutableRepository repository;
+    
+    public StandardExternalStorageRepositoryInfo(String name, ArtifactDescriptorDepository depository, MutableRepository repository) {
+        super(name, depository);
+        this.repository = repository;
+    }
+    
+    public String getType() {
+        return TYPE;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public ArtifactDescriptorSummary publish(String artifactUri) {
+        URI uri = URI.create(artifactUri);
+        
+        try {
+            ArtifactDescriptor published = this.repository.publish(uri);
+            ArtifactDescriptorSummary summary = null;
+            if (published != null) {
+                summary = new ArtifactDescriptorSummary(published.getType(), published.getName(), published.getVersion().toString());   
+            }
+            return summary;
+        } catch (DuplicateArtifactException dae) {
+            throw new IllegalArgumentException("The artifact '" + artifactUri + "' cannot be published: it is a duplicate of existing artifact '" + dae.getOriginal().getUri() + "'");
+        }
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public boolean retract(String type, String name, String version) {
+        return this.repository.retract(type, name, new Version(version));
+    }
+
+    public Set<String> getArtifactLocations(String filename) {
+        return this.repository.getArtifactLocations(filename);
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/management/StandardRemoteRepositoryInfo.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/management/StandardRemoteRepositoryInfo.java
new file mode 100644
index 0000000..1d0bbbb
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/management/StandardRemoteRepositoryInfo.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.management;
+
+import org.eclipse.virgo.repository.internal.ArtifactDescriptorDepository;
+import org.eclipse.virgo.repository.management.RemoteRepositoryInfo;
+
+/**
+ * Standard implementation of {@link RemoteRepositoryInfo}.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe
+ *
+ */
+public final class StandardRemoteRepositoryInfo extends AbstractRepositoryInfo implements RemoteRepositoryInfo {
+    
+    private static final String TYPE = "remote";
+
+    public StandardRemoteRepositoryInfo(String name, ArtifactDescriptorDepository artifactDepository) {
+        super(name, artifactDepository);
+    }
+
+    public String getType() {
+        return TYPE;
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/management/StandardWatchedStorageRepositoryInfo.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/management/StandardWatchedStorageRepositoryInfo.java
new file mode 100644
index 0000000..68452ff
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/management/StandardWatchedStorageRepositoryInfo.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.management;
+
+import java.util.Set;
+
+import org.eclipse.virgo.repository.WatchableRepository;
+import org.eclipse.virgo.repository.internal.ArtifactDescriptorDepository;
+import org.eclipse.virgo.repository.management.RepositoryInfo;
+import org.eclipse.virgo.repository.management.WatchedStorageRepositoryInfo;
+
+
+
+/**
+ * Implementation of {@link RepositoryInfo} for a watched storage repository.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe
+ *
+ */
+public class StandardWatchedStorageRepositoryInfo extends AbstractRepositoryInfo implements WatchedStorageRepositoryInfo {
+
+    private static final String TYPE = "watched";
+    private final WatchableRepository repository;
+
+    public StandardWatchedStorageRepositoryInfo(String name, ArtifactDescriptorDepository depository, WatchableRepository watchableRepository) {
+        super(name, depository);
+        this.repository = watchableRepository;
+    }
+    
+    public String getType() {
+        return TYPE;
+    }
+    
+    public void forceCheck() throws RuntimeException {
+        try {
+            this.repository.forceCheck();
+        } catch (Exception e) {
+            throw new RuntimeException("Exception returned from repository", e);
+        }
+    }
+
+    public Set<String> getArtifactLocations(String filename) {
+        return this.repository.getArtifactLocations(filename);
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/persistence/NoOpArtifactDescriptorPersister.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/persistence/NoOpArtifactDescriptorPersister.java
new file mode 100644
index 0000000..55d3049
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/persistence/NoOpArtifactDescriptorPersister.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.persistence;
+
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.virgo.repository.ArtifactDescriptorPersister;
+import org.eclipse.virgo.repository.IndexFormatException;
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+
+
+/**
+ * An implementation of {@link ArtifactDescriptorPersister} that does nothing. Allows the use of the standard repository
+ * hierarchy without any persistence.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+public final class NoOpArtifactDescriptorPersister implements ArtifactDescriptorPersister {
+
+    /**
+     * {@inheritDoc}
+     */
+    public Set<RepositoryAwareArtifactDescriptor> loadArtifacts() throws IndexFormatException {
+        return new HashSet<RepositoryAwareArtifactDescriptor>();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void persistArtifactDescriptors(Set<RepositoryAwareArtifactDescriptor> descriptors) throws IOException {
+    }
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/remote/ArtifactDescriptorStoreWatcher.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/remote/ArtifactDescriptorStoreWatcher.java
new file mode 100644
index 0000000..f9e65ea
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/remote/ArtifactDescriptorStoreWatcher.java
@@ -0,0 +1,161 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.remote;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.zip.GZIPInputStream;
+
+import org.apache.commons.httpclient.Header;
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.HttpStatus;
+import org.apache.commons.httpclient.methods.GetMethod;
+import org.eclipse.virgo.repository.configuration.RemoteRepositoryConfiguration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+final class ArtifactDescriptorStoreWatcher {
+
+    private final StoreUpdaterThread storeUpdaterThread;
+
+    ArtifactDescriptorStoreWatcher(MutableArtifactDescriptorDepository mutableDepository, RemoteRepositoryConfiguration configuration) {
+        this.storeUpdaterThread = new StoreUpdaterThread(mutableDepository, configuration);
+    }
+
+    void start() {
+        this.storeUpdaterThread.start();
+    }
+
+    void stop() {
+        this.storeUpdaterThread.stopUpdates();
+    }
+
+    static final class StoreUpdaterThread extends Thread {
+
+        private static final String RESPONSE_HEADER_ETAG = "Etag";
+        
+        private static final String REPONSE_HEADER_CONTENT_ENCODING = "Content-Encoding";
+        
+        private static final String CONTENT_ENCODING_GZIP = "gzip";
+
+        private static final String REQUEST_HEADER_IF_NONE_MATCH = "If-None-Match";
+
+        private static final Logger LOGGER = LoggerFactory.getLogger(StoreUpdaterThread.class);
+
+        private final HttpClient httpClient = new HttpClient();
+
+        private final long msUpdateInterval;
+
+        private final String repositoryUri;
+
+        private final MutableArtifactDescriptorDepository mutableDepository;
+
+        private final DescriptorStoreFactory descriptorStoreFactory;
+
+        private final String repositoryName;
+
+        private volatile boolean update = true;
+
+        private int countContiguousHttpClientFailures = 0;
+
+        private StoreUpdaterThread(MutableArtifactDescriptorDepository mutableDepository, RemoteRepositoryConfiguration configuration) {
+            super(configuration.getName());
+            this.msUpdateInterval = configuration.getIndexUpdateInterval() * 1000L;
+            this.repositoryUri = configuration.getRepositoryUri().toString();
+            this.mutableDepository = mutableDepository;
+            this.repositoryName = configuration.getName();
+            this.descriptorStoreFactory = new DescriptorStoreFactory(this.repositoryName, configuration.getIndexLocation().getParentFile());
+            setDaemon(true);
+        }
+
+        @Override
+        public void run() {
+
+            DescriptorStore descriptorStore = descriptorStoreFactory.recoverDescriptorStore();
+
+            while (this.update) {
+                GetMethod getIndex = new GetMethod(this.repositoryUri);
+
+                if (descriptorStore != null) {
+                    getIndex.addRequestHeader(REQUEST_HEADER_IF_NONE_MATCH, descriptorStore.getEtag());
+                }
+
+                int responseCode;
+                try {
+                    responseCode = this.httpClient.executeMethod(getIndex);
+                    if (this.countContiguousHttpClientFailures > 0) {
+                        LOGGER.info(String.format("Remote repository '%s' re-accessed after failure.", this.repositoryName));
+                        this.countContiguousHttpClientFailures = 0;
+                    }
+                    if (responseCode == HttpStatus.SC_OK || responseCode == HttpStatus.SC_NOT_MODIFIED) {
+                        if (responseCode == HttpStatus.SC_OK) {
+                            descriptorStore = readNewDescriptorStore(getIndex);
+                        }
+                        this.mutableDepository.setDescriptorStore(descriptorStore);
+                    } else {
+                        handleUnexpectedResponse(responseCode);
+                    }
+                } catch (IOException ioe) {
+                    if (0 == this.countContiguousHttpClientFailures) {
+                        LOGGER.warn(String.format("Remote repository '%s' inaccessible.", this.repositoryName), ioe);
+                    } else if (5 > this.countContiguousHttpClientFailures) {
+                        this.countContiguousHttpClientFailures = 0;
+                        LOGGER.warn(String.format("Remote repository '%s' inaccessible.", this.repositoryName));
+                    }
+                    ++this.countContiguousHttpClientFailures;
+                }
+
+                try {
+                    Thread.sleep(this.msUpdateInterval);
+                } catch (InterruptedException ie) {
+                    LOGGER.info("Interrupted. Stopping updates");
+                    this.update = false;
+                }
+            }
+        }
+
+        private void stopUpdates() {
+            this.update = false;
+            this.interrupt();
+        }
+
+        private void handleUnexpectedResponse(int responseCode) {
+            LOGGER.error(String.format("Unexpected HTTP response code: %s from remote repository '%s'.", String.valueOf(responseCode),
+                this.repositoryName));
+        }
+
+        private String getETag(GetMethod getIndex) {
+            Header responseHeader = getIndex.getResponseHeader(RESPONSE_HEADER_ETAG);
+            return responseHeader == null ? null : responseHeader.getValue();
+        }
+
+        private DescriptorStore readNewDescriptorStore(GetMethod getDescriptorStore) {
+            try {
+                String etag = getETag(getDescriptorStore);
+                
+                InputStream storeStream = getDescriptorStore.getResponseBodyAsStream();
+                
+                Header contentEncodingResponseHeader = getDescriptorStore.getResponseHeader(REPONSE_HEADER_CONTENT_ENCODING);
+                if (contentEncodingResponseHeader != null && CONTENT_ENCODING_GZIP.equals(contentEncodingResponseHeader.getValue())) {
+                    storeStream = new GZIPInputStream(storeStream);
+                }
+
+                return descriptorStoreFactory.createDescriptorStore(storeStream, etag);
+            } catch (IOException ioe) {
+                LOGGER.error(String.format("Copying index failed for remote repository '%s'.", this.repositoryName), ioe);
+                return null;
+            }
+        }
+
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/remote/DescriptorStore.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/remote/DescriptorStore.java
new file mode 100644
index 0000000..76b53b5
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/remote/DescriptorStore.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.remote;
+
+import java.io.File;
+
+final class DescriptorStore {
+	
+	private final String etag;
+	
+	private final File location;
+	
+	DescriptorStore(String etag, File location) {
+		if (location == null) {
+			throw new IllegalArgumentException("DescriptorStore location cannot be null");
+		}
+		this.etag = etag;
+		this.location = location;
+	}
+
+	String getEtag() {
+		return etag;
+	}
+
+	File getLocation() {
+		return location;
+	}
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		result = prime * result + ((etag == null) ? 0 : etag.hashCode());
+		result = prime * result + location.hashCode();
+		return result;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		
+		if (this == obj)
+			return true;
+		
+		if (obj == null)
+			return false;
+		
+		if (getClass() != obj.getClass())
+			return false;
+		
+		DescriptorStore other = (DescriptorStore) obj;
+		
+		// Descriptor stores with null etags are never equal
+		if (etag == null) {
+			return false;			
+		} else if (!etag.equals(other.etag))
+			return false;
+		
+		if (!location.equals(other.location))
+			return false;
+		
+		return true;
+	}
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/remote/DescriptorStoreFactory.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/remote/DescriptorStoreFactory.java
new file mode 100644
index 0000000..1fc5d06
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/remote/DescriptorStoreFactory.java
@@ -0,0 +1,129 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.remote;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.eclipse.virgo.util.io.FileCopyUtils;
+import org.eclipse.virgo.util.io.FileSystemUtils;
+
+/**
+ * {@link DescriptorStoreFactory} is a utility for creating and persisting a {@link DescriptorStore} instance from an
+ * input stream and for recovering such an instance.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+public class DescriptorStoreFactory {
+
+    private static final long EPOCH = 0L;
+
+    private static final String REPOSITORY_NAME_ETAG_SEPARATOR = "-";
+
+    private static final String DESCRIPTOR_STORE_FILE_SUFFIX = ".descriptors";
+
+    private final Object monitor = new Object();
+
+    private final String repositoryName;
+
+    private final File descriptorStoreDirectory;
+
+    public DescriptorStoreFactory(String repositoryName, File descriptorStoreDirectory) {
+        this.repositoryName = repositoryName;
+        this.descriptorStoreDirectory = descriptorStoreDirectory;
+    }
+
+    public DescriptorStore createDescriptorStore(InputStream storeStream, String etag) throws IOException, FileNotFoundException {
+        synchronized (this.monitor) {
+            File newStoreLocation = createStoreFile(etag);
+            FileCopyUtils.copy(storeStream, new FileOutputStream(newStoreLocation));
+            return new DescriptorStore(etag, newStoreLocation);            
+        }
+    }
+
+    private File createStoreFile(String etag) {
+        return new File(this.descriptorStoreDirectory, this.repositoryName + REPOSITORY_NAME_ETAG_SEPARATOR + etag + DESCRIPTOR_STORE_FILE_SUFFIX);
+    }
+
+    public DescriptorStore recoverDescriptorStore() {
+        synchronized (this.monitor) {
+            File descriptorStoreFile = recoverDescriptorStoreFile();
+            if (descriptorStoreFile != null) {
+                String eTag = parseETagFromDescriptorStoreFileName(descriptorStoreFile.getName());
+                if (eTag != null) {
+                    return new DescriptorStore(eTag, descriptorStoreFile);
+                }
+            }
+            return null;
+        }
+    }
+
+    private File recoverDescriptorStoreFile() {
+        return getMostRecentFile(getDescriptorStoreFiles());
+    }
+
+    private String parseETagFromDescriptorStoreFileName(String name) {
+        String eTag = null;
+        if (isValidDescriptorStoreFileName(name)) {
+            eTag = name.substring(descriptorStoreFileNamePrefix().length(), name.length() - DESCRIPTOR_STORE_FILE_SUFFIX.length());
+        }
+        return eTag;
+    }
+
+    private boolean isValidDescriptorStoreFileName(String name) {
+        return name.startsWith(descriptorStoreFileNamePrefix()) && name.endsWith(DESCRIPTOR_STORE_FILE_SUFFIX);
+    }
+
+    private String descriptorStoreFileNamePrefix() {
+        return this.repositoryName + REPOSITORY_NAME_ETAG_SEPARATOR;
+    }
+
+    private File[] getDescriptorStoreFiles() {
+        FilenameFilter filter = new FilenameFilter() {
+
+            public boolean accept(File dir, String name) {
+                return isValidDescriptorStoreFileName(name);
+            }
+
+        };
+        return FileSystemUtils.listFiles(this.descriptorStoreDirectory, filter);
+    }
+
+    /**
+     * Returns the most recent file from the given array of files. If there is more than one file with the same last
+     * modified time, returns the last one of those files in the array. This isn't crucial as the index will be
+     * refreshed when an old etag is recovered.
+     */
+    private static File getMostRecentFile(File[] files) {
+        File mostRecentFileile = null;
+        if (files != null) {
+            Long mostRecentLastModified = EPOCH;
+            for (File file : files) {
+                long lastModified = file.lastModified();
+                if (lastModified >= mostRecentLastModified) {
+                    mostRecentLastModified = lastModified;
+                    mostRecentFileile = file;
+                }
+            }
+        }
+        return mostRecentFileile;
+    }
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/remote/MutableArtifactDescriptorDepository.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/remote/MutableArtifactDescriptorDepository.java
new file mode 100644
index 0000000..2018382
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/remote/MutableArtifactDescriptorDepository.java
@@ -0,0 +1,178 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.remote;
+
+import java.io.IOException;
+import java.net.URI;
+import java.util.Collections;
+import java.util.Set;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.repository.ArtifactDescriptorPersister;
+import org.eclipse.virgo.repository.Attribute;
+import org.eclipse.virgo.repository.DuplicateArtifactException;
+import org.eclipse.virgo.repository.IndexFormatException;
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+import org.eclipse.virgo.repository.XmlArtifactDescriptorPersister;
+import org.eclipse.virgo.repository.codec.XMLRepositoryCodec;
+import org.eclipse.virgo.repository.internal.ArtifactDescriptorDepository;
+import org.eclipse.virgo.repository.internal.RepositoryLogEvents;
+import org.eclipse.virgo.repository.internal.StandardArtifactDescriptorDepository;
+
+/**
+ * An implementation of the {@link ArtifactDescriptorDepository} that allows safe mutation of the delegate instance of
+ * {@link ArtifactDescriptorDepository}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+final class MutableArtifactDescriptorDepository implements ArtifactDescriptorDepository {
+	
+	private static final Logger LOGGER = LoggerFactory.getLogger(MutableArtifactDescriptorDepository.class);
+	
+	private final String repositoryName;
+	
+	private final EventLogger eventLogger;
+    
+    private volatile ArtifactDescriptorDepository delegate;
+    
+    private volatile DescriptorStore descriptorStore = null;
+    
+    MutableArtifactDescriptorDepository(String repositoryName, EventLogger eventLogger) {
+    	this.repositoryName = repositoryName;
+    	this.eventLogger = eventLogger;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void addArtifactDescriptor(RepositoryAwareArtifactDescriptor artifactDesc) throws DuplicateArtifactException {
+    	throw new UnsupportedOperationException();         
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public int getArtifactDescriptorCount() {
+    	ArtifactDescriptorDepository localDelegate = this.delegate;
+    	
+    	if (localDelegate != null) {
+    		return localDelegate.getArtifactDescriptorCount();
+    	} else {
+    		return 0;
+    	}        
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void persist() throws IOException {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public RepositoryAwareArtifactDescriptor removeArtifactDescriptor(URI uri) {
+        throw new UnsupportedOperationException();
+    }
+    
+    /**
+     * {@inheritDoc}
+     */
+    public boolean removeArtifactDescriptor(RepositoryAwareArtifactDescriptor artifactDescriptor) {
+    	throw new UnsupportedOperationException();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Set<RepositoryAwareArtifactDescriptor> resolveArtifactDescriptors(Set<Attribute> filters) {
+    	ArtifactDescriptorDepository localDelegate = this.delegate;
+    	
+    	if (localDelegate != null) {
+        	return localDelegate.resolveArtifactDescriptors(filters);
+        } else {
+        	return Collections.<RepositoryAwareArtifactDescriptor>emptySet();            
+        }
+    }
+    
+    void setDescriptorStore(DescriptorStore descriptorStore) {
+    	if (descriptorStore == null) {
+    		descriptorStoreUnavailable();
+    	} else {
+    		descriptorStoreAvailable(descriptorStore);
+    	}
+    }
+    
+    private void descriptorStoreUnavailable() {
+    	DescriptorStore locaDescriptorStore = this.descriptorStore;
+    	
+    	if (locaDescriptorStore != null) {
+    		deleteDescriptorStore(locaDescriptorStore);
+    		this.eventLogger.log(RepositoryLogEvents.REPOSITORY_TEMPORARILY_UNAVAILABLE, this.repositoryName);
+    	}
+    	
+    	this.descriptorStore = null;
+    	this.delegate = null;
+    }
+    
+    private void descriptorStoreAvailable(DescriptorStore descriptorStore) {
+    	DescriptorStore localDescriptorStore = this.descriptorStore;
+    	
+    	if (!descriptorStore.equals(localDescriptorStore)) {
+    		newDescriptorStoreAvailable(descriptorStore, localDescriptorStore);
+    	}
+    }
+    
+    private void newDescriptorStoreAvailable(DescriptorStore newDescriptorStore, DescriptorStore oldDescriptorStore) {    	
+		ArtifactDescriptorDepository newDelegate = createNewDepository(newDescriptorStore);
+		
+		if (newDelegate == null) {
+			deleteDescriptorStore(newDescriptorStore);
+			deleteDescriptorStore(oldDescriptorStore);
+			descriptorStoreUnavailable();
+		} else {			
+			this.delegate = newDelegate;
+			this.descriptorStore = newDescriptorStore;
+			
+			if (oldDescriptorStore == null) {
+    			this.eventLogger.log(RepositoryLogEvents.REPOSITORY_AVAILABLE, this.repositoryName);
+        	} else {
+        		this.eventLogger.log(RepositoryLogEvents.REPOSITORY_INDEX_UPDATED, this.repositoryName);
+        		deleteDescriptorStore(oldDescriptorStore);
+        	}
+		}	
+    }
+
+	private ArtifactDescriptorDepository createNewDepository(DescriptorStore descriptorStore) {
+		ArtifactDescriptorPersister persister = new XmlArtifactDescriptorPersister(new XMLRepositoryCodec(), this.repositoryName, descriptorStore.getLocation());
+		try {
+			 return new StandardArtifactDescriptorDepository(persister);    			    		
+		} catch (IndexFormatException ife) {
+			LOGGER.error("The descriptor store for repository '{}' was corrupt", this.repositoryName);			
+		}
+		return null;
+	}
+		 
+    private void deleteDescriptorStore(DescriptorStore descriptorStore) {
+    	if (descriptorStore != null && !descriptorStore.getLocation().delete()) {
+    		LOGGER.warn("Failed to delete descriptor store for repository '{}' from '{}'", this.repositoryName, descriptorStore.getLocation().getAbsolutePath());
+    	}
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/remote/RemoteRepository.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/remote/RemoteRepository.java
new file mode 100644
index 0000000..191094b
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/remote/RemoteRepository.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.remote;
+
+import java.io.File;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.repository.configuration.RemoteRepositoryConfiguration;
+import org.eclipse.virgo.repository.internal.BaseRepository;
+import org.eclipse.virgo.repository.internal.RepositoryLogEvents;
+import org.eclipse.virgo.repository.internal.management.StandardRemoteRepositoryInfo;
+import org.eclipse.virgo.repository.management.RepositoryInfo;
+
+/**
+ * Implements a remotely hosted repository.
+ * <p/>
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe
+ * 
+ */
+public class RemoteRepository extends BaseRepository {
+
+    private static final String SCHEME_HTTP = "http";
+
+	private static final Logger LOGGER = LoggerFactory.getLogger(RemoteRepository.class);
+	
+	private final ArtifactDescriptorStoreWatcher watcher;
+	
+	private final File cacheDirectory;
+
+    public RemoteRepository(RemoteRepositoryConfiguration configuration, EventLogger eventLogger) {
+        this(configuration, new MutableArtifactDescriptorDepository(configuration.getName(), eventLogger), eventLogger);
+    }
+
+    private RemoteRepository(RemoteRepositoryConfiguration configuration, MutableArtifactDescriptorDepository depository, EventLogger eventLogger) {
+        super(configuration, depository);
+        this.cacheDirectory = configuration.getCacheDirectory();
+
+        if (!SCHEME_HTTP.equals(configuration.getRepositoryUri().getScheme())) {
+            LOGGER.error("Uri '{}' scheme not http for remote repository '{}'.", configuration.getRepositoryUri(), getName());
+            eventLogger.log(RepositoryLogEvents.REPOSITORY_NOT_CREATED, configuration.getName());
+            throw new IllegalArgumentException("Proxy only supports http");
+        }
+
+        watcher = new ArtifactDescriptorStoreWatcher(depository, configuration);        
+    }
+    
+    @Override
+	protected void start() {
+		super.start();
+		this.watcher.start();
+	}
+
+	@Override
+	public void stop() {		
+		super.stop();
+		this.watcher.stop();
+	}
+
+	/**
+     * {@inheritDoc}
+     */
+    @Override
+    protected RepositoryInfo createMBean() {
+        return new StandardRemoteRepositoryInfo(getName(), getDepository());
+    }
+    
+    /**
+     * Returns the directory for cacheing remote artifacts.
+     * 
+     * @return the cache directory
+     */
+    public File getCacheDirectory() {
+        return this.cacheDirectory;
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/watched/WatchedStorageRepository.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/watched/WatchedStorageRepository.java
new file mode 100644
index 0000000..c663f47
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/internal/watched/WatchedStorageRepository.java
@@ -0,0 +1,263 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.watched;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.TimeUnit;
+
+import javax.management.JMException;
+
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.repository.ArtifactDescriptorPersister;
+import org.eclipse.virgo.repository.DuplicateArtifactException;
+import org.eclipse.virgo.repository.IndexFormatException;
+import org.eclipse.virgo.repository.Repository;
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+import org.eclipse.virgo.repository.RepositoryCreationException;
+import org.eclipse.virgo.repository.WatchableRepository;
+import org.eclipse.virgo.repository.configuration.WatchedStorageRepositoryConfiguration;
+import org.eclipse.virgo.repository.internal.LocalRepository;
+import org.eclipse.virgo.repository.internal.RepositoryLogEvents;
+import org.eclipse.virgo.repository.internal.management.StandardWatchedStorageRepositoryInfo;
+import org.eclipse.virgo.repository.internal.persistence.NoOpArtifactDescriptorPersister;
+import org.eclipse.virgo.repository.management.RepositoryInfo;
+import org.eclipse.virgo.util.io.FileSystemChecker;
+import org.eclipse.virgo.util.io.FileSystemEvent;
+import org.eclipse.virgo.util.io.FileSystemListener;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * A {@link Repository} that watches a local directory and automatically publishes and retracts artifacts placed (or
+ * removed from) there.
+ * 
+ * <p>
+ * <strong>Concurrent Semantics</strong><br/>
+ * Thread-safe
+ * </p>
+ * 
+ */
+public final class WatchedStorageRepository extends LocalRepository implements WatchableRepository {
+    
+    private static final Logger LOGGER = LoggerFactory.getLogger(WatchedStorageRepository.class);
+    
+    private static final String EXCLUDE_PATTERN = "\\.DS_Store";
+    
+    private final DirectoryWatcher dirWatcher; // monitors the watched directory
+    
+    private final ScheduledExecutorService executorService; // controls the watching threads
+    
+    private final int watchInterval;
+    
+    private final File watchDirectory;
+    
+    private final EventLogger eventLogger;
+    
+    public WatchedStorageRepository(WatchedStorageRepositoryConfiguration configuration, EventLogger eventLogger) throws RepositoryCreationException,
+    IndexFormatException {
+        this(configuration, new NoOpArtifactDescriptorPersister(), eventLogger);
+    }
+    
+    public WatchedStorageRepository(WatchedStorageRepositoryConfiguration configuration, ArtifactDescriptorPersister artifactDescriptorPersister,
+                                    EventLogger eventLogger) throws RepositoryCreationException, IndexFormatException {
+        super(configuration, artifactDescriptorPersister, eventLogger);
+        
+        this.eventLogger = eventLogger;
+        
+        this.watchDirectory = configuration.getDirectoryToWatch();
+        this.dirWatcher = new DirectoryWatcher(this.watchDirectory);
+        this.watchInterval = configuration.getWatchInterval();
+        
+        // create thread pool for watching the directory, containing one daemon thread.
+        this.executorService = Executors.newScheduledThreadPool(1, new ThreadFactory() {
+            
+            @Override
+            public Thread newThread(Runnable r) {
+                Thread thread = new Thread(r);
+                thread.setDaemon(true);
+                return thread;
+            }
+        });
+    }
+    
+    /**
+     * Start the base repository and periodic checking.
+     */
+    @Override
+    public void start() {
+        super.start();
+        LOGGER.info("Starting to watch directory '{}'; period {}s.", this.watchDirectory, this.watchInterval);
+        
+        // do initial check
+        this.dirWatcher.fsChecker.check();
+        // start periodic checking
+        this.executorService.scheduleAtFixedRate(this.dirWatcher, this.watchInterval, this.watchInterval, TimeUnit.SECONDS);
+    }
+    
+    /**
+     * Stop watching the repository store and stop the base repository.
+     */
+    @Override
+    public void stop() {
+        LOGGER.info("Stopping watched directory '{}'.", this.watchDirectory);
+        this.executorService.shutdown();
+        super.stop();
+    }
+    
+    /**
+     * Private {@link Runnable}, an instance of which watches the directory for us
+     */
+    private final class DirectoryWatcher implements Runnable {
+        
+        private final FileSystemChecker fsChecker;
+        
+        private final FileSystemListener listener;
+        
+        private DirectoryWatcher(final File directory) throws RepositoryCreationException {
+            establishDirectory(directory);
+            
+            this.fsChecker = new FileSystemChecker(directory, EXCLUDE_PATTERN);
+            
+            this.listener = new FileSystemListener() {
+                
+                @Override
+                public void onChange(String path, FileSystemEvent event) {
+                    File file = new File(path);
+                    try {
+                        LOGGER.debug("Listener for '{}' heard event '{}' on file '{}'.", new Object[] { WatchedStorageRepository.this.watchDirectory,
+                            event, file });
+                        switch (event) {
+                            case CREATED:
+                            case INITIAL: {
+                                RepositoryAwareArtifactDescriptor artifactDescriptor = createArtifactDescriptor(file);
+                                if (artifactDescriptor != null) {
+                                    getDepository().addArtifactDescriptor(artifactDescriptor);
+                                }
+                                break;
+                            }
+                            case DELETED:
+                                getDepository().removeArtifactDescriptor(file.toURI());
+                                break;
+                            case MODIFIED: {
+                                getDepository().removeArtifactDescriptor(file.toURI());
+                                RepositoryAwareArtifactDescriptor artifactDescriptor = createArtifactDescriptor(file);
+                                if (artifactDescriptor != null) {
+                                    getDepository().addArtifactDescriptor(artifactDescriptor);
+                                }
+                                break;
+                            }
+                        }
+                        
+                        getDepository().persist();
+                    } catch (DuplicateArtifactException dae) {
+                        LOGGER.warn("Duplicate artifact in file '{}' detected in watched directory '{}'.", file,
+                                    WatchedStorageRepository.this.watchDirectory);
+                    } catch (IOException e) {
+                        LOGGER.error(String.format("Watched directory '%s' failed during persist. Stopping repository.",
+                                                   WatchedStorageRepository.this.watchDirectory), e);
+                        stop();
+                        WatchedStorageRepository.this.eventLogger.log(RepositoryLogEvents.REPOSITORY_NOT_AVAILABLE, e, getName());
+                    }
+                }
+                
+                @Override
+                public void onInitialEvent(List<String> paths) {
+                    // no-op
+                    // not available for watched repository
+                    // only applicable for the pickup directory on a server's startup
+                }
+            };
+            this.fsChecker.addListener(this.listener);
+        }
+        
+        @Override
+        public void run() {
+            try {
+                this.fsChecker.check();
+            } catch (Exception e) {
+                LOGGER.error("File system watcher for repository '{}' failed. Repository stopped.", getName());
+                stop();
+                WatchedStorageRepository.this.eventLogger.log(RepositoryLogEvents.REPOSITORY_NOT_AVAILABLE, e, getName());
+            }
+        }
+        
+        private final void establishDirectory(File dir) throws RepositoryCreationException {
+            if (dir.exists()) {
+                if (!dir.isDirectory()) {
+                    if (!dir.delete()) {
+                        LOGGER.error("Directory '{}' for watched repository '{}' is already a file and cannot be deleted. Repository unavailable.",
+                                     dir.getName(), getName());
+                        throw new RepositoryCreationException("Failed to delete index file for repository '" + getName() + "'");
+                    } else {
+                        LOGGER.debug("File '{}' deleted to create directory for watched repository '{}'.", dir, getName());
+                    }
+                }
+            }
+            if (!dir.exists()) {
+                if (!dir.mkdirs()) {
+                    LOGGER.error("Directory '{}' for watched repository '{}' cannot be created. Repository unavailable.", dir.getName(), getName());
+                    throw new RepositoryCreationException("Failed to delete index file for repository '" + getName() + "'");
+                }
+            }
+        }
+        
+        /**
+         * Run a check against the directory, accumulating new files completely.
+         * 
+         * @throws Exception anything that might escape from fs.check()
+         */
+        public void forceNewCheck() throws Exception {
+            try {
+                this.fsChecker.check();
+                // The second check() is to force indexing of new files based on DirectoryWatcher.onChange()
+                // implementation.
+                this.fsChecker.check();
+            } catch (Exception e) {
+                LOGGER.warn("Directory check for repository '{}' failed.", getName());
+                throw e;
+            }
+        }
+    }
+    
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected RepositoryInfo createMBean() throws JMException {
+        return new StandardWatchedStorageRepositoryInfo(getName(), this.getDepository(), this);
+    }
+    
+    /**
+     * Performs a directory check upon the watched directory; equivalent to waiting for the directory file system
+     * checker to run, but is synchronous.
+     * 
+     * @throws Exception from directory watcher
+     */
+    @Override
+    public void forceCheck() throws Exception {
+        this.dirWatcher.forceNewCheck();
+    }
+    
+    @Override
+    public Set<String> getArtifactLocations(String filename) {
+        Set<String> locations = new HashSet<String>(1);
+        locations.add(new File(this.watchDirectory, filename).getAbsolutePath());
+        return locations;
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/management/ArtifactDescriptorSummary.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/management/ArtifactDescriptorSummary.java
new file mode 100644
index 0000000..0325345
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/management/ArtifactDescriptorSummary.java
@@ -0,0 +1,115 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.management;
+
+import java.beans.ConstructorProperties;
+
+/**
+ * The type, name, and version of an ArtifactDescriptor
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+public class ArtifactDescriptorSummary {
+
+    private static final String TO_STRING_FORMAT = "type: %s, name: %s, version: %s";
+
+    private final String type;
+
+    private final String name;
+
+    private final String version;
+
+    private final int hash;
+
+    @ConstructorProperties( { "type", "name", "version" })
+    public ArtifactDescriptorSummary(String type, String name, String version) {
+        this.type = type;
+        this.name = name;
+        this.version = version;
+        this.hash = hash(type, name, version);
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String getVersion() {
+        return version;
+    }
+
+    @Override
+    public int hashCode() {
+        return this.hash;
+    }
+
+    private final static int hash(String type, String name, String version) {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((name == null) ? 0 : name.hashCode());
+        result = prime * result + ((type == null) ? 0 : type.hashCode());
+        result = prime * result + ((version == null) ? 0 : version.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        ArtifactDescriptorSummary other = (ArtifactDescriptorSummary) obj;
+        if (this.hash != other.hash) {
+            return false;
+        }
+        if (name == null) {
+            if (other.name != null) {
+                return false;
+            }
+        } else if (!name.equals(other.name)) {
+            return false;
+        }
+        if (type == null) {
+            if (other.type != null) {
+                return false;
+            }
+        } else if (!type.equals(other.type)) {
+            return false;
+        }
+        if (version == null) {
+            if (other.version != null) {
+                return false;
+            }
+        } else if (!version.equals(other.version)) {
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public String toString() {
+        return String.format(TO_STRING_FORMAT, this.type, this.name, this.version);
+    }
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/management/ExternalStorageRepositoryInfo.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/management/ExternalStorageRepositoryInfo.java
new file mode 100644
index 0000000..3ec1b26
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/management/ExternalStorageRepositoryInfo.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.management;
+
+import javax.management.MXBean;
+
+/**
+ * A specialization of {@link RepositoryInfo} for JMX management of external storage repositories.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Implementations must be thread-safe.
+ * 
+ */
+@MXBean
+@Repository(type = "external")
+public interface ExternalStorageRepositoryInfo extends LocalRepositoryInfo {
+
+    /**
+     * Publishes the artifact, identified by the given <code>uri</code>, to the repository.
+     * <p/>
+     * Note that publishing an artifact to an external storage repository makes no change to that storage. If the
+     * publication of the artifact is to be persistent, in addition to publishing it, it should also be copied to a
+     * location that is within the external storage area that is scanned by the repository at startup.
+     * 
+     * @param uri The uri, as a <code>String</code>, of the artifact to be published to the repository
+     * @return an {@link ArtifactDescriptorSummary} that describes the published artifact, or <code>null</code> if the
+     *         artifact was not published
+     */
+    ArtifactDescriptorSummary publish(String uri);
+
+    /**
+     * Retracts the artifact, identified by the given <code>type</code>, <code>name</code> and <code>version</code> from
+     * the repository.
+     * <p/>
+     * Note that retracting an artifact from an external storage repository makes no change to that storage. If the
+     * retraction of the artifact is to be persistent, in addition to retracting it, it should also be deleted from the
+     * external storage area that is scanned by the repository at startup.
+     * 
+     * @param type The type of the artifact to be retracted from the repository
+     * @param name The name of the artifact to be retracted from the repository
+     * @param version The version of the artifact to be retracted from the repository
+     * 
+     * @return <code>true</code> if the artifact was retracted, otherwise <code>false</code>.
+     */
+    boolean retract(String type, String name, String version);
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/management/LocalRepositoryInfo.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/management/LocalRepositoryInfo.java
new file mode 100644
index 0000000..ea09b62
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/management/LocalRepositoryInfo.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.management;
+
+import java.util.Set;
+
+import javax.management.MXBean;
+
+
+/**
+ * A specialisation of {@link RepositoryInfo} for {@link org.eclipse.virgo.repository.internal.LocalRepository LocalRepository} implementations.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ * Implementations must be thread-safe.
+ *
+ */
+@MXBean
+public interface LocalRepositoryInfo extends RepositoryInfo {
+    
+    /**
+     * Calculates the filepaths that a given filename could have and be found by 
+     * the repository in its storage area.
+     * <br/>
+     * No attempt is made to validate the filename or the paths returned; 
+     * if they pass the repository filters they are valid and not if not.
+     * 
+     * @param filename of artifact that might be placed in the locations
+     * @return all the valid filepaths of an artifact file of that name
+     */
+    Set<String> getArtifactLocations(String filename);
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/management/RemoteRepositoryInfo.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/management/RemoteRepositoryInfo.java
new file mode 100644
index 0000000..8dd2fb0
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/management/RemoteRepositoryInfo.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.management;
+
+import javax.management.MXBean;
+
+/**
+ * A specialization of {@link RepositoryInfo} for JMX management of remote repositories.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ * Implementations must be thread-safe.
+ *
+ */
+@MXBean
+@Repository(type="remote")
+public interface RemoteRepositoryInfo extends RepositoryInfo {        
+    
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/management/Repository.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/management/Repository.java
new file mode 100644
index 0000000..c889878
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/management/Repository.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.management;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import javax.management.DescriptorKey;
+
+@Documented
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Repository {
+    @DescriptorKey("type")
+    String type();
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/management/RepositoryInfo.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/management/RepositoryInfo.java
new file mode 100644
index 0000000..03d6ee6
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/management/RepositoryInfo.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.management;
+
+import java.util.Set;
+
+import javax.management.MXBean;
+
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+
+
+/**
+ * A management interface for a repository. Useful for exposing the contents of the repository via JMX.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations must be threadsafe
+ * 
+ */
+@MXBean
+public interface RepositoryInfo {
+    
+    /**
+     * Gets the type of the repository
+     * @return the type
+     * @deprecated The type field in the MBean's descriptor should be used instead
+     */
+    String getType();
+
+    /**
+     * Gets the name of the repository
+     * @return the name
+     */
+    String getName();
+
+    /**
+     * Gets a collection of the type, name, and version of all {@link ArtifactDescriptor}s in the repository
+     * @return set of summary descriptors
+     */
+    Set<ArtifactDescriptorSummary> getAllArtifactDescriptorSummaries();
+ 
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/management/WatchedStorageRepositoryInfo.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/management/WatchedStorageRepositoryInfo.java
new file mode 100644
index 0000000..50d9ec4
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/management/WatchedStorageRepositoryInfo.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.management;
+
+import javax.management.MXBean;
+
+/**
+ * A specialization of {@link RepositoryInfo} for JMX management of watched storage repositories.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ * Implementations must be thread-safe.
+ *
+ */
+@MXBean
+@Repository(type="watched")
+public interface WatchedStorageRepositoryInfo extends LocalRepositoryInfo {
+    
+    /**
+     * Force the check of the repository directory.
+     * @throws RuntimeException if file system checker fails.
+     */
+    void forceCheck() throws RuntimeException;
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/util/FileDigest.java b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/util/FileDigest.java
new file mode 100644
index 0000000..43af6d9
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/java/org/eclipse/virgo/repository/util/FileDigest.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.util;
+
+import static org.eclipse.virgo.util.common.Assert.isTrue;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.math.BigInteger;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+/**
+ * {@link FileDigest} is a utility for generating message digests of files.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread safe.
+ * 
+ */
+public class FileDigest {
+
+    public static final String SHA_DIGEST_ALGORITHM = "sha";
+    
+    public static final String MD5_DIGEST_ALGORITHM = "MD5";
+
+    private static final int BUFFER_SIZE = 8192;
+
+    public static String getFileShaDigest(File file) throws IOException {
+        try {
+            return getFileDigest(file, SHA_DIGEST_ALGORITHM);
+        } catch (NoSuchAlgorithmException e) {
+            isTrue(false, "Use of %s algorithm threw %s", SHA_DIGEST_ALGORITHM, e);
+            return null; // keep compiler happy
+        }
+    }
+
+    public static String getFileDigest(File file, String digestAlgorithm) throws NoSuchAlgorithmException, IOException {
+        MessageDigest digest = MessageDigest.getInstance(digestAlgorithm);
+
+        byte[] hash = computeHash(file, digest);
+        
+        return hashToString(hash);
+    }
+
+    private static String hashToString(byte[] rawHash) {
+        BigInteger bi = new BigInteger(1, rawHash);
+        String hash = bi.toString(16);
+        if (hash.length() % 2 != 0) {
+            hash = "0" + hash;
+        }
+        return hash;
+    }
+
+    private static byte[] computeHash(File file, MessageDigest digest) throws IOException {
+        FileInputStream inputStream = new FileInputStream(file);
+
+        try {
+            byte[] buffer = new byte[BUFFER_SIZE];
+            int length;
+            while ((length = inputStream.read(buffer)) != -1) {
+                digest.update(buffer, 0, length);
+            }
+        } finally {
+            inputStream.close();
+        }
+
+        return digest.digest();
+    }
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/main/resources/EventLogMessages.properties b/repository/org.eclipse.virgo.repository/src/main/resources/EventLogMessages.properties
new file mode 100644
index 0000000..bdf39e3
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/resources/EventLogMessages.properties
@@ -0,0 +1,20 @@
+RP0001W=The repository type '{}' is invalid. The configuration of repository '{}' has been ignored.
+RP0002W=Repository '{}' is referenced in the repository chain but is not configured. It has been ignored.
+RP0003W=The repository chain configuration contains more than one reference to repository '{}'. Only the first reference has been included in the chain.
+RP0004W=There is no type specification for a repository named '{}'. The repository configuration has been ignored.
+RP0005W=The repository '{}' of type '{}' has no valid '{}' specification. The repository configuration has been ignored.
+RP0006W=The value '{}' specified for property '{}' could not be parsed as an integer. The default value of '{}' has been used instead.
+
+RP0050W=The repository '{}' is temporarily unavailable.
+RP0051I=The repository '{}' is available.
+RP0052I=The index for repository '{}' has been updated.
+
+RP0080E=Artifact '{}' not recognized as type '{}' by repository '{}' and has been ignored.
+RP0081E=Artifact '{}' caused exception when read for repository '{}'.
+RP0082I=Artifact '{}' is now available in repository '{}'.
+
+RP0100W=The repository '{}' is not available.
+RP0101E=The repository '{}' has stopped and is no longer available.
+RP0102E=Failed to persist index for repository '{}'.
+
+RP0200W=The artifact at '{}' has not been published to repository '{}' as publication of '{}' URIs is not supported.
diff --git a/repository/org.eclipse.virgo.repository/src/main/resources/about.html b/repository/org.eclipse.virgo.repository/src/main/resources/about.html
new file mode 100644
index 0000000..c258ef5
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/main/resources/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>June 5, 2006</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/codec/XMLRepositoryCodecTests.java b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/codec/XMLRepositoryCodecTests.java
new file mode 100644
index 0000000..06c59e7
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/codec/XMLRepositoryCodecTests.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.codec;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.net.URI;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+import org.eclipse.virgo.repository.Attribute;
+import org.eclipse.virgo.repository.IndexFormatException;
+import org.eclipse.virgo.repository.codec.XMLRepositoryCodec;
+import org.eclipse.virgo.repository.internal.StandardArtifactDescriptor;
+import org.eclipse.virgo.repository.internal.StandardAttribute;
+import org.junit.Test;
+import org.osgi.framework.Version;
+
+
+public class XMLRepositoryCodecTests {
+
+    private final XMLRepositoryCodec serializer = new XMLRepositoryCodec();
+
+    @Test
+    public void codec() throws FileNotFoundException, IndexFormatException {
+        FileOutputStream out = new FileOutputStream("build/repository.xml");
+        serializer.write(createArtifacts(), out);
+        
+
+        Set<ArtifactDescriptor> artifacts = serializer.read(new FileInputStream("build/repository.xml"));
+        assertEquals(createArtifacts(), artifacts);
+    }
+
+    private Set<ArtifactDescriptor> createArtifacts() {
+        Set<Attribute> attributes = new HashSet<Attribute>();
+        attributes.add(new StandardAttribute("attribute1", ""));
+        Map<String, Set<String>> properties = new HashMap<String, Set<String>>();
+        Set<String> values = new HashSet<String>();
+        values.add("value1");
+        values.add("value2");
+        properties.put("property1", values);
+        properties.put("property2", values);
+        attributes.add(new StandardAttribute("attribute2", "value2", properties));
+        Set<ArtifactDescriptor> artifacts = new HashSet<ArtifactDescriptor>();
+        artifacts.add(new StandardArtifactDescriptor(URI.create("http://uri/1"), "bundle", "artifact1", new Version(1, 0, 0), null, attributes));
+        artifacts.add(new StandardArtifactDescriptor(URI.create("http://uri/2"), "bundle", "artifact2", new Version(2, 0, 0), "2", attributes));
+        return artifacts;
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/configuration/ExternalStorageRepositoryConfigurationTests.java b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/configuration/ExternalStorageRepositoryConfigurationTests.java
new file mode 100644
index 0000000..c1c79e2
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/configuration/ExternalStorageRepositoryConfigurationTests.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.configuration;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.File;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.virgo.repository.ArtifactBridge;
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+import org.eclipse.virgo.repository.ArtifactGenerationException;
+import org.eclipse.virgo.repository.configuration.ExternalStorageRepositoryConfiguration;
+import org.junit.Before;
+import org.junit.Test;
+
+
+public class ExternalStorageRepositoryConfigurationTests {
+
+    private ExternalStorageRepositoryConfiguration configuration;
+
+    private String name;
+
+    private File indexLocation;
+
+    private Set<ArtifactBridge> artefactBridges;
+
+    private String searchPattern;
+
+    @Before
+    public void createConfiguration() {
+        name = "repo-name";
+        indexLocation = new File("build/index");
+        artefactBridges = new HashSet<ArtifactBridge>();
+        artefactBridges.add(new ArtifactBridge() {
+
+            public ArtifactDescriptor generateArtifactDescriptor(File artifact) throws ArtifactGenerationException {
+                return null;
+            }
+        });
+        searchPattern = "search-pattern";
+
+        configuration = new ExternalStorageRepositoryConfiguration(name, indexLocation, artefactBridges, searchPattern, null);
+    }
+
+    @Test
+    public void name() {
+        assertEquals(name, configuration.getName());
+    }
+
+    @Test
+    public void indexLocation() {
+        assertEquals(indexLocation, configuration.getIndexLocation());
+    }
+
+    @Test
+    public void searchPattern() {
+        assertEquals(searchPattern, configuration.getSearchPattern());
+    }
+
+    @Test
+    public void artefactBridges() {
+        assertEquals(artefactBridges, configuration.getArtefactBridges());
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/configuration/ManagedStorageRepositoryConfigurationTests.java b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/configuration/ManagedStorageRepositoryConfigurationTests.java
new file mode 100644
index 0000000..ea1e4ef
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/configuration/ManagedStorageRepositoryConfigurationTests.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.configuration;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.File;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.virgo.repository.ArtifactBridge;
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+import org.eclipse.virgo.repository.ArtifactGenerationException;
+import org.eclipse.virgo.repository.configuration.ManagedStorageRepositoryConfiguration;
+import org.junit.Before;
+import org.junit.Test;
+
+
+public class ManagedStorageRepositoryConfigurationTests {
+
+    private ManagedStorageRepositoryConfiguration configuration;
+
+    private String name;
+
+    private File indexLocation;
+
+    private Set<ArtifactBridge> artefactBridges;
+
+    private File storageLocation;
+
+    @Before
+    public void createConfiguration() {
+        name = "repo-name";
+        indexLocation = new File("index");
+        artefactBridges = new HashSet<ArtifactBridge>();
+        artefactBridges.add(new ArtifactBridge() {
+
+            public ArtifactDescriptor generateArtifactDescriptor(File artifact) throws ArtifactGenerationException {
+                return null;
+            }
+        });
+        storageLocation = new File("storage");
+
+        configuration = new ManagedStorageRepositoryConfiguration(name, indexLocation, artefactBridges, storageLocation, null);
+    }
+
+    @Test
+    public void name() {
+        assertEquals(name, configuration.getName());
+    }
+
+    @Test
+    public void indexLocation() {
+        assertEquals(indexLocation, configuration.getIndexLocation());
+    }
+
+    @Test
+    public void storageLocation() {
+        assertEquals(storageLocation, configuration.getStorageLocation());
+    }
+
+    @Test
+    public void artefactBridges() {
+        assertEquals(artefactBridges, configuration.getArtefactBridges());
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/configuration/PropertiesRepositoryConfigurationReaderTests.java b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/configuration/PropertiesRepositoryConfigurationReaderTests.java
new file mode 100644
index 0000000..8f1f3aa
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/configuration/PropertiesRepositoryConfigurationReaderTests.java
@@ -0,0 +1,265 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.configuration;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URI;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import org.eclipse.virgo.medic.test.eventlog.MockEventLogger;
+import org.eclipse.virgo.repository.ArtifactBridge;
+import org.eclipse.virgo.repository.configuration.ExternalStorageRepositoryConfiguration;
+import org.eclipse.virgo.repository.configuration.PropertiesRepositoryConfigurationReader;
+import org.eclipse.virgo.repository.configuration.RemoteRepositoryConfiguration;
+import org.eclipse.virgo.repository.configuration.RepositoryConfiguration;
+import org.eclipse.virgo.repository.configuration.RepositoryConfigurationException;
+import org.eclipse.virgo.repository.configuration.WatchedStorageRepositoryConfiguration;
+import org.eclipse.virgo.util.math.OrderedPair;
+
+public class PropertiesRepositoryConfigurationReaderTests {
+    
+    private PropertiesRepositoryConfigurationReader configurationReader;
+    
+    private MockEventLogger eventLogger = new MockEventLogger();
+    
+    @Before
+    public void createConfigurationReader() {
+        eventLogger.reinitialise();
+        configurationReader = new PropertiesRepositoryConfigurationReader(new File("indices"), Collections.<ArtifactBridge>emptySet(), eventLogger, null);
+    }
+
+    @Test
+    public void allRepositoryTypes() throws RepositoryConfigurationException {                
+        Properties properties = new Properties();
+        
+        properties.setProperty("a.type", "external");
+        properties.setProperty("a.searchPattern", "/**/*.jar");
+        
+        properties.setProperty("b.type", "watched");
+        properties.setProperty("b.watchInterval", "5");
+        properties.setProperty("b.watchDirectory", "build/watched");
+        
+        properties.setProperty("c.type", "remote");
+        properties.setProperty("c.indexRefreshInterval", "5");
+        properties.setProperty("c.uri", "http://watched.com");
+        
+        properties.setProperty("chain", "a,b,c");
+        
+        Map<String,RepositoryConfiguration> configurationMap = configurationReader.readConfiguration(properties).getFirst();
+        
+        assertEquals(0, this.eventLogger.getLoggedEvents().size());
+
+        assertEquals(3, configurationMap.size());
+
+        assertTrue("Cannot find confguration 'a'", configurationMap.containsKey("a"));
+        assertEquals(ExternalStorageRepositoryConfiguration.class, configurationMap.get("a").getClass());
+        
+        assertTrue("Cannot find confguration 'b'", configurationMap.containsKey("b"));
+        assertEquals(WatchedStorageRepositoryConfiguration.class, configurationMap.get("b").getClass());
+        
+        assertTrue("Cannot find confguration 'c'", configurationMap.containsKey("c"));
+        assertEquals(RemoteRepositoryConfiguration.class, configurationMap.get("c").getClass());
+    }
+    
+    @Test
+    public void absoluteWatchDirectory() throws RepositoryConfigurationException, IOException {
+        configurationReader = new PropertiesRepositoryConfigurationReader(new File("indices"), Collections.<ArtifactBridge>emptySet(), eventLogger, null, new File("foo/bar").getAbsoluteFile());
+        
+        Properties properties = new Properties();
+        
+        properties.setProperty("b.type", "watched");
+        properties.setProperty("b.watchInterval", "5");
+        properties.setProperty("b.watchDirectory", "build/watched");
+        
+        Map<String, RepositoryConfiguration> configuration = configurationReader.readConfiguration(properties).getFirst();
+        RepositoryConfiguration repositoryConfiguration = configuration.get("b");
+        
+        assertNotNull(repositoryConfiguration);
+        assertTrue(repositoryConfiguration instanceof WatchedStorageRepositoryConfiguration);
+        
+        File directoryToWatch = ((WatchedStorageRepositoryConfiguration)repositoryConfiguration).getDirectoryToWatch();
+        assertEquals(new File("foo/bar/build/watched").getCanonicalFile(), directoryToWatch.getCanonicalFile());
+    }
+    
+    @Test
+    public void unknownRepositoryTypes() throws RepositoryConfigurationException {                
+        Properties properties = new Properties();
+        
+        properties.setProperty("a.type", "whatever");
+        properties.setProperty("a.searchPattern", "/**/*.jar");
+        
+        properties.setProperty("b.watchInterval", "5");
+        properties.setProperty("b.watchDirectory", "build/watched");
+        
+        Map<String,RepositoryConfiguration> configurationMap = configurationReader.readConfiguration(properties).getFirst();
+        
+        assertEquals(2, this.eventLogger.getLoggedEvents().size());
+        assertEquals(0, configurationMap.size());
+    }
+
+    @Test
+    public void chainReferencingNonExistentRepository() throws RepositoryConfigurationException {
+        Properties properties = new Properties();                        
+        
+        properties.setProperty("a.type", "external");
+        properties.setProperty("a.searchPattern", "/**/*.jar");
+        
+        properties.setProperty("chain", "a,b");
+        
+        OrderedPair<Map<String,RepositoryConfiguration>,List<String>> configurations = configurationReader.readConfiguration(properties);
+        Map<String,RepositoryConfiguration> configurationMap = configurations.getFirst();
+        List<String> chainList = configurations.getSecond();
+        
+        assertEquals(1, this.eventLogger.getLoggedEvents().size());
+        assertEquals(1, configurationMap.size());
+        assertEquals(1, chainList.size());
+    }
+
+    @Test
+    public void emptyChainProperty() throws RepositoryConfigurationException {
+        Properties properties = new Properties();                        
+        
+        properties.setProperty("a.type", "external");
+        properties.setProperty("a.searchPattern", "/**/*.jar");
+        
+        List<String> chainList = configurationReader.readConfiguration(properties).getSecond();
+        assertEquals(0, this.eventLogger.getLoggedEvents().size());
+        assertEquals(0, chainList.size());
+    }
+
+    @Test
+    public void duplicateRepositoriesInChain() throws RepositoryConfigurationException {
+        Properties properties = new Properties();                        
+        
+        properties.setProperty("a.type", "external");
+        properties.setProperty("a.searchPattern", "/**/*.jar");
+        
+        properties.setProperty("chain", "a,a");
+        
+        List<String> chainList = configurationReader.readConfiguration(properties).getSecond();
+        assertEquals(1, this.eventLogger.getLoggedEvents().size());
+        assertEquals(1, chainList.size());
+    }
+    
+    @Test
+    public void defaultingOfIndexRefreshIntervalAndWatchInterval() throws RepositoryConfigurationException {
+        Properties properties = new Properties();
+        properties.setProperty("watched-repo.type", "watched");
+        properties.setProperty("watched-repo.watchDirectory", "build/repository/watched");
+        properties.setProperty("remote-repo.type", "remote");
+        properties.setProperty("remote-repo.uri", "http://localhost:8080/org.eclipse.virgo.repository/foo");
+        properties.setProperty("chain", "watched-repo,remote-repo");
+
+        OrderedPair<Map<String,RepositoryConfiguration>,List<String>> configurations = configurationReader.readConfiguration(properties);
+        Map<String,RepositoryConfiguration> configurationMap = configurations.getFirst();
+        List<String> chainList = configurations.getSecond();
+
+        assertEquals(2, chainList.size());
+        assertEquals(2, configurationMap.size());
+        
+        RepositoryConfiguration configuration = configurationMap.get(chainList.get(0));
+        assertTrue(configuration instanceof WatchedStorageRepositoryConfiguration);
+        assertEquals(5, ((WatchedStorageRepositoryConfiguration)configuration).getWatchInterval());
+        
+        configuration = configurationMap.get(chainList.get(1));
+        assertTrue(configuration instanceof RemoteRepositoryConfiguration);
+        assertEquals(30, ((RemoteRepositoryConfiguration)configuration).getIndexUpdateInterval());
+        
+        assertEquals(0, eventLogger.getLoggedEvents().size());
+    }
+    
+    @Test
+    public void defaultingOfIndexRefreshIntervalAndWatchIntervalWhenMalformed() throws RepositoryConfigurationException {
+        Properties properties = new Properties();
+        properties.setProperty("watched-repo.type", "watched");
+        properties.setProperty("watched-repo.watchDirectory", "build/repository/watched");
+        properties.setProperty("watched-repo.watchInterval", "alpha");
+        properties.setProperty("remote-repo.type", "remote");
+        properties.setProperty("remote-repo.uri", "http://localhost:8080/org.eclipse.virgo.repository/foo");
+        properties.setProperty("remote-repo.indexRefreshInterval", "bravo");
+        properties.setProperty("chain", "watched-repo,remote-repo");
+        
+        OrderedPair<Map<String,RepositoryConfiguration>,List<String>> configurations = configurationReader.readConfiguration(properties);
+        Map<String,RepositoryConfiguration> configurationMap = configurations.getFirst();
+        List<String> chainList = configurations.getSecond();
+        
+        assertEquals(2, chainList.size());
+        assertEquals(2, configurationMap.size());
+
+        RepositoryConfiguration configuration = configurationMap.get(chainList.get(0));
+        assertTrue(configuration instanceof WatchedStorageRepositoryConfiguration);
+        assertEquals(5, ((WatchedStorageRepositoryConfiguration)configuration).getWatchInterval());
+        
+        configuration = configurationMap.get(chainList.get(1));
+        assertTrue(configuration instanceof RemoteRepositoryConfiguration);
+        assertEquals(30, ((RemoteRepositoryConfiguration)configuration).getIndexUpdateInterval());
+        
+        assertEquals(2, eventLogger.getLoggedEvents().size());
+    }
+    
+    @Test
+    public void variableExpansion() throws RepositoryConfigurationException, IOException {
+        try {
+            System.setProperty("org.eclipse.virgo.repository.internal.test.string", "a");
+            System.setProperty("org.eclipse.virgo.repository.internal.test.int", "1");
+            
+            Properties properties = new Properties();
+            
+            properties.setProperty("bundles-ext.type", "external");
+            properties.setProperty("bundles-ext.searchPattern", "repository/${org.eclipse.virgo.repository.internal.test.string}/ext/*.jar");
+
+            properties.setProperty("watched-repo.type", "watched");
+            properties.setProperty("watched-repo.watchDirectory", "build/repository/${org.eclipse.virgo.repository.internal.test.string}");
+            properties.setProperty("watched-repo.watchInterval", "${org.eclipse.virgo.repository.internal.test.int}");
+
+            properties.setProperty("remote-repo.type", "remote");
+            properties.setProperty("remote-repo.uri", "http://localhost:${org.eclipse.virgo.repository.internal.test.int}/org.eclipse.virgo.repository/${org.eclipse.virgo.repository.internal.test.string}");
+            properties.setProperty("remote-repo.indexRefreshInterval", "${org.eclipse.virgo.repository.internal.test.int}");
+
+            properties.setProperty("chain", "bundles-ext,watched-repo,remote-repo");
+            
+            OrderedPair<Map<String,RepositoryConfiguration>,List<String>> configurations = configurationReader.readConfiguration(properties);
+            Map<String,RepositoryConfiguration> configurationMap = configurations.getFirst();
+            List<String> chainList = configurations.getSecond();
+
+            assertEquals(3, chainList.size());
+            assertEquals(3, configurationMap.size());
+            
+            ExternalStorageRepositoryConfiguration externalConfiguration = (ExternalStorageRepositoryConfiguration)configurationMap.get(chainList.get(0));
+            assertEquals(new File(".").getAbsolutePath() + File.separator + "repository" + File.separator + "a" + File.separator + "ext" + File.separatorChar + "*.jar", externalConfiguration.getSearchPattern());
+            
+            WatchedStorageRepositoryConfiguration watchedConfiguration = (WatchedStorageRepositoryConfiguration)configurationMap.get(chainList.get(1));
+            assertEquals(new File("build/repository", "a").getCanonicalFile(), watchedConfiguration.getDirectoryToWatch().getCanonicalFile());
+            assertEquals(1, watchedConfiguration.getWatchInterval());
+            
+            RemoteRepositoryConfiguration remoteConfiguration = (RemoteRepositoryConfiguration)configurationMap.get(chainList.get(2));
+            assertEquals(1, remoteConfiguration.getIndexUpdateInterval());
+            assertEquals(URI.create("http://localhost:1/org.eclipse.virgo.repository/a"), remoteConfiguration.getRepositoryUri());
+            
+            assertEquals(0, eventLogger.getLoggedEvents().size());
+        } finally {
+            System.clearProperty("org.eclipse.virgo.repository.internal.test.string");
+            System.clearProperty("org.eclipse.virgo.repository.internal.test.int");
+        }
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/configuration/StubRepositoryConfiguration.java b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/configuration/StubRepositoryConfiguration.java
new file mode 100644
index 0000000..fd5f06d
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/configuration/StubRepositoryConfiguration.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.configuration;
+
+import java.io.File;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.virgo.repository.ArtifactBridge;
+import org.eclipse.virgo.repository.configuration.PersistentRepositoryConfiguration;
+
+
+public class StubRepositoryConfiguration extends PersistentRepositoryConfiguration {
+
+    public StubRepositoryConfiguration(ArtifactBridge artifactBridge, File indexLocation) {
+        super("stub-repository", indexLocation, createArtifactBridges(artifactBridge), null);
+    }
+
+    private static Set<ArtifactBridge> createArtifactBridges(ArtifactBridge artifactBridge) {
+        Set<ArtifactBridge> artifactBridges = new HashSet<ArtifactBridge>();
+        artifactBridges.add(artifactBridge);
+
+        return artifactBridges;
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/configuration/WatchedStorageRepositoryConfigurationTests.java b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/configuration/WatchedStorageRepositoryConfigurationTests.java
new file mode 100644
index 0000000..4bfba83
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/configuration/WatchedStorageRepositoryConfigurationTests.java
@@ -0,0 +1,107 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.configuration;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.File;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.virgo.repository.ArtifactBridge;
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+import org.eclipse.virgo.repository.ArtifactGenerationException;
+import org.eclipse.virgo.repository.configuration.WatchedStorageRepositoryConfiguration;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+
+public class WatchedStorageRepositoryConfigurationTests {
+
+    private WatchedStorageRepositoryConfiguration configuration;
+
+    private final static String name = "Watched-Repo-Name";
+
+    private Set<ArtifactBridge> artefactBridges;
+
+    private File watchedDirectory;
+
+    private static final int BAD_WATCH_INTERVAL_NEG = -1;
+
+    private static final int BAD_WATCH_INTERVAL_ZERO = 0;
+
+    private static final int watchInterval = 5;
+
+    @Before
+    public void createConfiguration() {
+        this.artefactBridges = new HashSet<ArtifactBridge>();
+        this.artefactBridges.add(new ArtifactBridge() {
+
+            public ArtifactDescriptor generateArtifactDescriptor(File artifact) throws ArtifactGenerationException {
+                return null;
+            }
+        });
+        this.watchedDirectory = new File("build/dir-to-watch");
+        this.watchedDirectory.delete();
+    }
+
+    @Test
+    public void name() {
+        this.configuration = new WatchedStorageRepositoryConfiguration(name, new File("build/watchedIndex"), this.artefactBridges, this.watchedDirectory.getAbsolutePath(), watchInterval, null);
+        assertEquals(name, this.configuration.getName());
+    }
+
+    @Test
+    public void watchedDirectory() {
+        this.watchedDirectory.mkdir();
+        this.configuration = new WatchedStorageRepositoryConfiguration(name, new File("build/watchedIndex"), this.artefactBridges, this.watchedDirectory.getAbsolutePath(), watchInterval, null);
+        assertEquals(this.watchedDirectory.getAbsoluteFile(), this.configuration.getDirectoryToWatch().getAbsoluteFile());
+    }
+
+    @Test
+    public void artefactBridges() {
+        this.configuration = new WatchedStorageRepositoryConfiguration(name, new File("build/watchedIndex"), this.artefactBridges, this.watchedDirectory.getAbsolutePath(), watchInterval, null);
+        assertEquals(this.artefactBridges, this.configuration.getArtefactBridges());
+    }
+
+    @Test
+    public void watchInterval() {
+        this.configuration = new WatchedStorageRepositoryConfiguration(name, new File("build/watchedIndex"), this.artefactBridges, this.watchedDirectory.getAbsolutePath(), watchInterval, null);
+        assertEquals(watchInterval, this.configuration.getWatchInterval());
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void badWatchIntervalZero() {
+        this.configuration = new WatchedStorageRepositoryConfiguration(name, new File("build/watchedIndex"), this.artefactBridges, this.watchedDirectory.getAbsolutePath(), BAD_WATCH_INTERVAL_ZERO,
+            null);
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void badWatchIntervalNeg() {
+        this.configuration = new WatchedStorageRepositoryConfiguration(name, new File("build/watchedIndex"), this.artefactBridges, this.watchedDirectory.getAbsolutePath(), BAD_WATCH_INTERVAL_NEG,
+            null);
+    }
+
+    @After
+    public void cleanUp() {
+        if (this.watchedDirectory.exists()) {
+
+            if (this.watchedDirectory.isDirectory()) {
+                for (File file : this.watchedDirectory.listFiles()) {
+                    file.delete();
+                }
+            }
+            this.watchedDirectory.delete();
+        }
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/ArtifactGenerationExceptionTests.java b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/ArtifactGenerationExceptionTests.java
new file mode 100644
index 0000000..8b57be7
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/ArtifactGenerationExceptionTests.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal;
+
+import static org.junit.Assert.assertEquals;
+
+import org.eclipse.virgo.repository.ArtifactGenerationException;
+import org.junit.Test;
+
+
+/**
+ * <p>
+ * An exception that represents a failure to parse an Artifact file in to 
+ * an actual Artifact representation. Should only be thrown if the file 
+ * looks like it should be readable but can't for some reason. 
+ * </p>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * 
+ * 
+ */
+public class ArtifactGenerationExceptionTests {
+
+    /**
+     * Test method for
+     * {@link org.eclipse.virgo.repository.ArtifactGenerationException#ArtifactGenerationException(java.lang.String)}.
+     */
+    @Test
+    public void testArtefactGenerationExceptionMessage() {
+        ArtifactGenerationException exception = new ArtifactGenerationException("Test Message","artifactType");
+        assertEquals("Test message is not reported", "Test Message", exception.getMessage());
+        assertEquals("artifactType is not reported", "artifactType", exception.getArtifactType());
+    }
+    
+    /**
+     * Test method for
+     * {@link org.eclipse.virgo.repository.ArtifactGenerationException#ArtifactGenerationException(java.lang.String, java.lang.String)}.
+     */
+    @Test
+    public void testArtefactGenerationExceptionMessageString() {
+        ArtifactGenerationException exception = new ArtifactGenerationException("Test Message", "test filename");
+        assertEquals("Test message is not reported", "Test Message", exception.getMessage());
+        assertEquals("Test filename is not reported", "test filename", exception.getArtifactType());
+    }
+    
+    /**
+     * Test method for
+     * {@link org.eclipse.virgo.repository.ArtifactGenerationException#ArtifactGenerationException(java.lang.String, java.lang.Throwable)}.
+     */
+    @Test
+    public void testArtefactGenerationExceptionMessageThrowable() {
+        Throwable thrown = new Throwable("Test Throwable");
+        ArtifactGenerationException exception = new ArtifactGenerationException("Test Message", thrown);
+        assertEquals("Test cause is not reported", thrown, exception.getCause());
+        assertEquals("Test message is not reported", "Test Message", exception.getMessage());
+    }
+    
+    /**
+     * Test method for
+     * {@link org.eclipse.virgo.repository.ArtifactGenerationException#ArtifactGenerationException(java.lang.String, java.lang.String, java.lang.Throwable)}.
+     */
+    @Test
+    public void testArtefactGenerationExceptionMessageStringThrowable() {
+        Throwable thrown = new Throwable("Test Throwable");
+        ArtifactGenerationException exception = new ArtifactGenerationException("Test Message", "test filename", thrown);
+        assertEquals("Test cause is not reported", thrown, exception.getCause());
+        assertEquals("Test filename is not reported", "test filename", exception.getArtifactType());
+        assertEquals("Test message is not reported", "Test Message", exception.getMessage());
+    }
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/ExternalStorageRepositoryTests.java b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/ExternalStorageRepositoryTests.java
new file mode 100644
index 0000000..1169561
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/ExternalStorageRepositoryTests.java
@@ -0,0 +1,246 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.eq;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.lang.management.ManagementFactory;
+import java.net.URI;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import javax.management.InstanceNotFoundException;
+import javax.management.MBeanInfo;
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+
+import org.junit.Test;
+import org.osgi.framework.Version;
+
+import org.eclipse.virgo.medic.test.eventlog.MockEventLogger;
+import org.eclipse.virgo.repository.ArtifactBridge;
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+import org.eclipse.virgo.repository.Attribute;
+import org.eclipse.virgo.repository.configuration.ExternalStorageRepositoryConfiguration;
+import org.eclipse.virgo.repository.internal.external.ExternalStorageRepository;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+
+public class ExternalStorageRepositoryTests {
+
+    private static final String MBEAN_DOMAIN_VIRGO_WEB_SERVER = "org.eclipse.virgo.server";
+
+    private static final String LOCATIONS_TEST_FILENAME = "a.jar";
+    private static final String LOCATIONS_TEST_ROOT = new File(new File(new File("src","test"),"resources"),"locations").getAbsolutePath();
+    private static final String LOCATIONS_SEARCH_PATTERN =  LOCATIONS_TEST_ROOT + File.separator + "*" + File.separator + "*.jar";
+
+    
+    private final MockEventLogger mockEventLogger = new MockEventLogger();
+    
+    @Test
+    public void mBeanPublication() throws Exception {
+        ExternalStorageRepositoryConfiguration configuration = new ExternalStorageRepositoryConfiguration("external-repo", new File("build","index"),
+            Collections.<ArtifactBridge> emptySet(), new File(".").getAbsolutePath(), MBEAN_DOMAIN_VIRGO_WEB_SERVER);
+        
+        mockEventLogger.reinitialise();
+        
+        ExternalStorageRepository repository = new ExternalStorageRepository(configuration, mockEventLogger);
+
+        assertFalse("Events logged at construction!", mockEventLogger.getCalled());
+        
+        ObjectName objectName = new ObjectName(MBEAN_DOMAIN_VIRGO_WEB_SERVER + ":type=Repository,name=external-repo");
+        MBeanServer platformMBeanServer = ManagementFactory.getPlatformMBeanServer();
+
+        try {
+            platformMBeanServer.getMBeanInfo(objectName);
+            fail("MBean should not be present until repository has been started");
+        } catch (InstanceNotFoundException infe) {
+        }
+
+        repository.start();
+
+        assertFalse("Events logged at start!", mockEventLogger.getCalled());
+
+        MBeanInfo mBeanInfo = platformMBeanServer.getMBeanInfo(objectName);
+        Object type = mBeanInfo.getDescriptor().getFieldValue("type");
+        assertNotNull(type);
+        assertEquals("external", type);
+
+        repository.stop();
+
+        try {
+            platformMBeanServer.getMBeanInfo(objectName);
+            fail("MBean should not be present once repository has been stopped");
+        } catch (InstanceNotFoundException infe) {
+        }
+    }
+    
+    @Test
+    public void mBeanNonPublication() throws Exception {
+        ExternalStorageRepositoryConfiguration configuration = new ExternalStorageRepositoryConfiguration("external-repo", new File("build","index"),
+            Collections.<ArtifactBridge> emptySet(), new File(".").getAbsolutePath(), null);
+        
+        mockEventLogger.reinitialise();
+        
+        ExternalStorageRepository repository = new ExternalStorageRepository(configuration, mockEventLogger);
+
+        assertFalse("Events logged at construction!", mockEventLogger.getCalled());
+        
+        ObjectName objectName = new ObjectName(MBEAN_DOMAIN_VIRGO_WEB_SERVER + ":type=Repository,name=external-repo");
+        MBeanServer platformMBeanServer = ManagementFactory.getPlatformMBeanServer();
+
+        try {
+            platformMBeanServer.getMBeanInfo(objectName);
+            fail("MBean should not be present before start");
+        } catch (InstanceNotFoundException infe) {
+        }
+
+        repository.start();
+
+        assertFalse("Events logged at start!", mockEventLogger.getCalled());
+        
+        try {
+            platformMBeanServer.getMBeanInfo(objectName);
+            fail("MBean should not be present after start");
+        } catch (InstanceNotFoundException infe) {
+        }
+
+        repository.stop();
+
+        try {
+            platformMBeanServer.getMBeanInfo(objectName);
+            fail("MBean should not be present once repository has been stopped");
+        } catch (InstanceNotFoundException infe) {
+        }
+    }
+
+    @Test
+    public void publishAndRetract() throws Exception {
+        
+        String searchPattern = (new File("build", "nosuchdir").getAbsolutePath() + File.separator + "*");
+        
+        ArtifactBridge artifactBridge = createMock(ArtifactBridge.class);
+        ExternalStorageRepositoryConfiguration configuration = new ExternalStorageRepositoryConfiguration("external-repo", new File("build","index"),
+            new HashSet<ArtifactBridge>(Arrays.asList(artifactBridge)), searchPattern, null);
+
+        mockEventLogger.reinitialise();
+        
+
+        assertFalse("Events logged at construction!", mockEventLogger.getCalled());
+
+        ArtifactDescriptor artifactDescriptor = createMock(ArtifactDescriptor.class);        
+        expect(artifactBridge.generateArtifactDescriptor(eq(new File("/artifact.jar")))).andReturn(artifactDescriptor).anyTimes();
+        Set<Attribute> attributes = new HashSet<Attribute>();
+        attributes.add(new StubAttribute("type", "bundle"));
+        attributes.add(new StubAttribute("name", "foo"));
+        attributes.add(new StubAttribute("version", "1.2.3"));
+
+        expect(artifactDescriptor.getAttributes()).andReturn(attributes).anyTimes();
+        expect(artifactDescriptor.getVersion()).andReturn(new Version(1, 2, 3)).anyTimes();
+
+        URI artifactUri = URI.create("file:/artifact.jar");
+        replay(artifactDescriptor, artifactBridge);
+
+        ExternalStorageRepository repository = new ExternalStorageRepository(configuration, mockEventLogger);
+
+        assertNull(repository.get("bundle", "foo", new VersionRange("[1.0.0,2.0.0)")));
+        assertEquals(repository.publish(artifactUri), artifactDescriptor);
+        assertEquals(repository.get("bundle", "foo", new VersionRange("[1.0.0,2.0.0)")), artifactDescriptor);
+
+        assertTrue(repository.retract("bundle", "foo", new Version(1, 2, 3)));
+
+        assertNull(repository.get("bundle", "foo", new VersionRange("[1.0.0,2.0.0)")));
+
+        verify(artifactDescriptor, artifactBridge);
+        
+        assertFalse("Events logged during test!", mockEventLogger.getCalled());
+    }
+
+    @Test(expected=IllegalArgumentException.class)
+    public void publishBadArtifact() throws Exception {
+        ExternalStorageRepositoryConfiguration configuration = new ExternalStorageRepositoryConfiguration("external-repo", new File("build","index"),
+            new HashSet<ArtifactBridge>(), new File(".").getAbsolutePath(), null);
+
+        mockEventLogger.reinitialise();
+        
+        ExternalStorageRepository repository = new ExternalStorageRepository(configuration, mockEventLogger);
+
+        assertFalse("Events logged at construction!", mockEventLogger.getCalled());
+
+        URI artifactUri = URI.create("file:/artifact.jar");
+        //Artifact appears bad because there is no Bridge to recognise it.
+        
+        ArtifactDescriptor artifactDescriptor = repository.publish(artifactUri);
+        
+        assertNull("Artifact should not be published, but descriptor was returned!", artifactDescriptor);
+        
+        assertFalse("Events logged during test!", mockEventLogger.getCalled());
+    }
+
+    @Test
+    public void testGetArtifactLocations() throws Exception {
+        ArtifactBridge artifactBridge = createMock(ArtifactBridge.class);
+        ExternalStorageRepositoryConfiguration configuration = new ExternalStorageRepositoryConfiguration("external-repo", new File("build","index"),
+            new HashSet<ArtifactBridge>(Arrays.asList(artifactBridge)), LOCATIONS_SEARCH_PATTERN, null);
+
+        mockEventLogger.reinitialise();
+        
+        ExternalStorageRepository repository = new ExternalStorageRepository(configuration, mockEventLogger);
+
+        assertFalse("Events logged at construction!", mockEventLogger.getCalled());
+
+        Set<String> locations = repository.getArtifactLocations(LOCATIONS_TEST_FILENAME);
+        Set<String> expectedLocations = new HashSet<String>(1);
+        expectedLocations.add(LOCATIONS_TEST_ROOT + File.separator + "dira" + File.separator + LOCATIONS_TEST_FILENAME);
+        expectedLocations.add(LOCATIONS_TEST_ROOT + File.separator + "dirb" + File.separator + LOCATIONS_TEST_FILENAME);
+
+        assertNotNull("null locations set returned.", locations);
+        assertEquals("set of locations not expected", expectedLocations, locations);
+    }
+    
+    private static class StubAttribute implements Attribute {
+
+        private final String key;
+
+        private final String value;
+
+        private StubAttribute(String key, String value) {
+            this.key = key;
+            this.value = value;
+        }
+
+        public String getKey() {
+            return key;
+        }
+
+        public Map<String, Set<String>> getProperties() {
+            return Collections.<String, Set<String>> emptyMap();
+        }
+
+        public String getValue() {
+            return value;
+        }
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/RepositoryBundleActivatorTests.java b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/RepositoryBundleActivatorTests.java
new file mode 100644
index 0000000..87b38a5
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/RepositoryBundleActivatorTests.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal;
+
+import org.junit.Test;
+import org.osgi.framework.BundleContext;
+
+import org.eclipse.virgo.medic.dump.DumpContributor;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.repository.RepositoryFactory;
+import org.eclipse.virgo.repository.internal.RepositoryBundleActivator;
+import org.eclipse.virgo.test.stubs.framework.OSGiAssert;
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+import org.eclipse.virgo.test.stubs.support.ObjectClassFilter;
+
+public class RepositoryBundleActivatorTests {
+    
+    @Test
+    public void servicePublicationAndRetraction() throws Exception {
+        
+        RepositoryBundleActivator activator = new RepositoryBundleActivator();
+        StubBundleContext context = new StubBundleContext();  
+        context.addFilter(new ObjectClassFilter(EventLogger.class));
+        
+        activator.start(context);
+        
+        OSGiAssert.assertServiceRegistrationCount(context, RepositoryFactory.class, 1);
+        OSGiAssert.assertServiceRegistrationCount(context, DumpContributor.class, 1);
+        
+        activator.stop(context);
+        
+        OSGiAssert.assertServiceRegistrationCount(context, RepositoryFactory.class, 0);
+        OSGiAssert.assertServiceRegistrationCount(context, DumpContributor.class, 0);
+    }
+    
+    @Test
+    public void stopWithoutRegistrationInStart() throws Exception {
+        BundleContext context = new StubBundleContext();
+        new RepositoryBundleActivator().stop(context);
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/RepositoryDumpContributorTests.java b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/RepositoryDumpContributorTests.java
new file mode 100644
index 0000000..9d2352b
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/RepositoryDumpContributorTests.java
@@ -0,0 +1,219 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Collections;
+import java.util.Map;
+import java.util.Set;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Version;
+
+import org.eclipse.virgo.medic.dump.Dump;
+import org.eclipse.virgo.medic.dump.DumpContributionFailedException;
+import org.eclipse.virgo.repository.Attribute;
+import org.eclipse.virgo.repository.DuplicateArtifactException;
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+import org.eclipse.virgo.repository.codec.XMLRepositoryCodec;
+import org.eclipse.virgo.repository.internal.ArtifactDescriptorDepository;
+import org.eclipse.virgo.repository.internal.RepositoryDumpContributor;
+import org.eclipse.virgo.util.io.PathReference;
+
+/**
+ */
+
+public class RepositoryDumpContributorTests {
+
+    private static final String DUMP_TARGET = "build/dump";
+
+    private PathReference target = new PathReference(DUMP_TARGET);
+
+    @Before
+    public void before() {
+        this.target.delete(true);
+    }
+
+    @Test
+    public void testDumpEmpty() throws Exception {
+        RepositoryDumpContributor contributor = new RepositoryDumpContributor(new XMLRepositoryCodec());
+        contributor.contribute(new StubDump());
+        assertFalse(target.exists());
+    }
+
+    @Test
+    public void testDumpWithTwoDepositories() throws Exception {
+        RepositoryDumpContributor contributor = new RepositoryDumpContributor(new XMLRepositoryCodec());
+
+        ArtifactDescriptorDepository one = new StubDepository();
+        ArtifactDescriptorDepository two = new StubDepository();
+
+        contributor.addDepository("one", one);
+        contributor.addDepository("two", two);
+
+        contributor.contribute(new StubDump());
+        assertTrue(target.exists());
+        assertTrue(this.target.newChild("repository-one.index").exists());
+        assertTrue(this.target.newChild("repository-two.index").exists());
+    }
+
+    private static final class StubDepository implements ArtifactDescriptorDepository {
+
+        /**
+         * {@inheritDoc}
+         */
+        public void addArtifactDescriptor(RepositoryAwareArtifactDescriptor artifactDesc) throws DuplicateArtifactException {
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public int getArtifactDescriptorCount() {
+            return 0;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public void persist() throws IOException {
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public RepositoryAwareArtifactDescriptor removeArtifactDescriptor(URI uri) {
+            return null;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public boolean removeArtifactDescriptor(RepositoryAwareArtifactDescriptor artifactDescriptor) {
+            return false;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public Set<RepositoryAwareArtifactDescriptor> resolveArtifactDescriptors(Set<Attribute> filters) {
+            RepositoryAwareArtifactDescriptor descriptor = new RepositoryAwareArtifactDescriptor() {
+
+                public Version getVersion() {
+                    return Version.emptyVersion;
+                }
+
+                public URI getUri() {
+                    try {
+                        return new URI("file:foo.jar");
+                    } catch (URISyntaxException e) {
+                        return null;
+                    }
+                }
+
+                public String getType() {
+                    return "bundle";
+                }
+
+                public String getRepositoryName() {
+                    return "foo";
+                }
+
+                public String getName() {
+                    return "my artifact";
+                }
+
+                public String getFilename() {
+                    return "foo.jar";
+                }
+
+                public Set<Attribute> getAttributes() {
+                    return Collections.<Attribute> emptySet();
+                }
+
+                public Set<Attribute> getAttribute(String name) {
+                    return getAttributes();
+                }
+            };
+            return Collections.<RepositoryAwareArtifactDescriptor> singleton(descriptor);
+        }
+
+    }
+
+    private static final class StubDump implements Dump {
+
+        /**
+         * {@inheritDoc}
+         */
+        public File createFile(String arg0) {
+            return null;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public FileOutputStream createFileOutputStream(String name) throws DumpContributionFailedException {
+            File file = new File(DUMP_TARGET, name);
+            file.getParentFile().mkdirs();
+            try {
+                return new FileOutputStream(file);
+            } catch (FileNotFoundException e) {
+                throw new DumpContributionFailedException(e.getMessage());
+            }
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public FileWriter createFileWriter(String arg0) throws DumpContributionFailedException {
+            return null;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public String getCause() {
+            return null;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public Map<String, Object> getContext() {
+            return null;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public Throwable[] getThrowables() {
+            return null;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public long getTimestamp() {
+            return 0;
+        }
+
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/RepositoryTestData.java b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/RepositoryTestData.java
new file mode 100644
index 0000000..76e6e9b
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/RepositoryTestData.java
@@ -0,0 +1,453 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal;
+
+import java.net.URI;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.virgo.repository.Attribute;
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+import org.eclipse.virgo.repository.builder.ArtifactDescriptorBuilder;
+import org.osgi.framework.Version;
+
+public final class RepositoryTestData {
+
+    private final static String TESTING_DIRECTORY = "file:/src/test/resources/";
+
+    public final static String TEST_ARTEFACT_TYPE = "test_type";
+
+    public final static String TEST_REPO_ONE = "foo_one";
+
+    public final static String TEST_REPO_TWO = "foo_two";
+
+    public static final String TEST_ARTEFACT_BRIDGE_NAME_A = "BundleA";
+
+    public static final String TEST_ARTEFACT_BRIDGE_NAME_B = "BundleB";
+
+    public static final String TEST_ARTEFACT_BRIDGE_NAME_C = "BundleC";
+
+    private static final Map<String, Set<String>> TEST_ATTRIBUTE_PARAMETERS_ZEROTWO = new HashMap<String, Set<String>>();
+
+    public static final String TEST_ATTRIBUTE_NAME_ONE = "Attribute Name One";
+
+    public static final String TEST_ATTRIBUTE_VALUE_ONE = "Attribute Value One";
+
+    public static final String TEST_ATTRIBUTE_NAME_TWO = "Attribute Name Two";
+
+    public static final String TEST_ATTRIBUTE_VALUE_TWO = "Attribute Value Two";
+
+    public static final Map<String, Set<String>> TEST_ATTRIBUTE_PARAMETERS_TWO = new HashMap<String, Set<String>>();
+
+    public static final String TEST_ATTRIBUTE_NAME_THREE = "Attribute Name Three";
+
+    public static final String TEST_ATTRIBUTE_VALUE_THREE = "Attribute Value Three";
+
+    public static final Map<String, Set<String>> TEST_ATTRIBUTE_PARAMETERS_THREE = new HashMap<String, Set<String>>();
+
+    private static final String TEST_ATTRIBUTE_PARAMETER_KEY_ONE = "Attribute Paramater Key One";
+
+    private static final String TEST_ATTRIBUTE_PARAMETER_KEY_TWO = "Attribute Paramater Key Two";
+
+    private static final String TEST_ATTRIBUTE_PARAMETER_KEY_THREE = "Attribute Paramater Key Three";
+
+    private static final String TEST_ATTRIBUTE_PARAMETER_KEY_FOUR = "Attribute Paramater Key Four";
+
+    private static final String TEST_ATTRIBUTE_PARAMETER_VALUE_ONE = "Attribute Paramater Value One";
+
+    private static final String TEST_ATTRIBUTE_PARAMETER_VALUE_TWO = "Attribute Paramater Value Two";
+
+    private static final String TEST_ATTRIBUTE_PARAMETER_VALUE_THREE = "Attribute Paramater Value Three";
+
+    private static final String TEST_ATTRIBUTE_PARAMETER_VALUE_FOUR = "Attribute Paramater Value Four";
+
+    static {
+        Set<String> prop_values;
+
+        prop_values = new HashSet<String>();
+        prop_values.add(TEST_ATTRIBUTE_PARAMETER_VALUE_TWO);
+        TEST_ATTRIBUTE_PARAMETERS_ZEROTWO.put(TEST_ATTRIBUTE_PARAMETER_KEY_TWO, prop_values);
+        prop_values = new HashSet<String>();
+        prop_values.add(TEST_ATTRIBUTE_PARAMETER_VALUE_THREE);
+        TEST_ATTRIBUTE_PARAMETERS_ZEROTWO.put(TEST_ATTRIBUTE_PARAMETER_KEY_THREE, prop_values);
+        prop_values = new HashSet<String>();
+        prop_values.add(TEST_ATTRIBUTE_PARAMETER_VALUE_FOUR);
+        TEST_ATTRIBUTE_PARAMETERS_ZEROTWO.put(TEST_ATTRIBUTE_PARAMETER_KEY_FOUR, prop_values);
+
+        prop_values = new HashSet<String>();
+        prop_values.add(TEST_ATTRIBUTE_PARAMETER_VALUE_TWO);
+        TEST_ATTRIBUTE_PARAMETERS_TWO.put(TEST_ATTRIBUTE_PARAMETER_KEY_TWO, prop_values);
+        prop_values = new HashSet<String>();
+        prop_values.add(TEST_ATTRIBUTE_PARAMETER_VALUE_THREE);
+        TEST_ATTRIBUTE_PARAMETERS_TWO.put(TEST_ATTRIBUTE_PARAMETER_KEY_THREE, prop_values);
+        prop_values = new HashSet<String>();
+        prop_values.add(TEST_ATTRIBUTE_PARAMETER_VALUE_FOUR);
+        TEST_ATTRIBUTE_PARAMETERS_TWO.put(TEST_ATTRIBUTE_PARAMETER_KEY_FOUR, prop_values);
+
+        prop_values = new HashSet<String>();
+        prop_values.add(TEST_ATTRIBUTE_PARAMETER_VALUE_ONE);
+        TEST_ATTRIBUTE_PARAMETERS_THREE.put(TEST_ATTRIBUTE_PARAMETER_KEY_ONE, prop_values);
+        prop_values = new HashSet<String>();
+        prop_values.add(TEST_ATTRIBUTE_PARAMETER_VALUE_TWO);
+        TEST_ATTRIBUTE_PARAMETERS_THREE.put(TEST_ATTRIBUTE_PARAMETER_KEY_TWO, prop_values);
+    }
+
+    private final static String TEST_NAME_ZERO_TNV = "org.eclipse.virgo.javax.servlet.foo";
+
+    private final static Version TEST_VERSION_ZERO_TNV = new Version("2.4.0.foo");
+
+    private final static String TEST_FILE_ZERO_TNV = "org.eclipse.virgo.javax.servlet-2.4.0.jar";
+
+    private final static URI TEST_URI_ZERO_TNV = URI.create(TESTING_DIRECTORY + TEST_FILE_ZERO_TNV);
+
+    private static final Set<Attribute> TEST_ATTRIBUTE_SET_ZERO_TNV = createAttributeSet(TEST_ARTEFACT_BRIDGE_NAME_C, TEST_NAME_ZERO_TNV,
+        TEST_VERSION_ZERO_TNV, TEST_URI_ZERO_TNV);
+
+    public final static RepositoryAwareArtifactDescriptor TEST_ARTEFACT_ZERO_TNV = createDescriptor(TEST_URI_ZERO_TNV, TEST_ARTEFACT_TYPE,
+        TEST_NAME_ZERO_TNV, TEST_VERSION_ZERO_TNV, TEST_ATTRIBUTE_SET_ZERO_TNV);
+
+    private final static String TEST_NAME_ZERO_URI = "org.eclipse.virgo.javax.servlet";
+
+    private final static Version TEST_VERSION_ZERO_URI = new Version("2.4.0");
+
+    private final static String TEST_FILE_ZERO_URI = "org.eclipse.virgo.javax.servlet-2.4.0.jar.foo";
+
+    private final static URI TEST_URI_ZERO_URI = URI.create(TESTING_DIRECTORY + TEST_FILE_ZERO_URI);
+
+    private static final Set<Attribute> TEST_ATTRIBUTE_SET_ZERO_URI = createAttributeSet(TEST_ARTEFACT_BRIDGE_NAME_C, TEST_NAME_ZERO_URI,
+        TEST_VERSION_ZERO_URI, TEST_URI_ZERO_URI);
+
+    public final static RepositoryAwareArtifactDescriptor TEST_ARTEFACT_ZERO_URI = createDescriptor(TEST_URI_ZERO_URI, TEST_ARTEFACT_TYPE,
+        TEST_NAME_ZERO_URI, TEST_VERSION_ZERO_URI, TEST_ATTRIBUTE_SET_ZERO_URI);
+
+    private final static String TEST_NAME_ZERO = "org.eclipse.virgo.javax.servlet";
+
+    private final static Version TEST_VERSION_ZERO = new Version("2.4.0");
+
+    private final static String TEST_FILE_ZERO = "org.eclipse.virgo.javax.servlet-2.4.0.jar";
+
+    public final static URI TEST_URI_ZERO = URI.create(TESTING_DIRECTORY + TEST_FILE_ZERO);
+
+    private static final Set<Attribute> TEST_ATTRIBUTE_SET_ZERO = createAttributeSet(TEST_ARTEFACT_BRIDGE_NAME_C, TEST_NAME_ZERO, TEST_VERSION_ZERO,
+        TEST_URI_ZERO);
+
+    public final static RepositoryAwareArtifactDescriptor TEST_ARTEFACT_ZERO = createDescriptor(TEST_URI_ZERO, TEST_ARTEFACT_TYPE, TEST_NAME_ZERO,
+        TEST_VERSION_ZERO, TEST_ATTRIBUTE_SET_ZERO);
+
+    public final static String TEST_NAME_ONE = "org.eclipse.virgo.javax.servlet";
+
+    public final static Version TEST_VERSION_ONE = new Version("2.4.0");
+
+    private final static String TEST_FILE_ONE = "org.eclipse.virgo.javax.servlet-2.4.0.jar";
+
+    public final static URI TEST_URI_ONE = URI.create(TESTING_DIRECTORY + TEST_FILE_ONE);
+
+    private static final Set<Attribute> TEST_ATTRIBUTE_SET_ONE = createAttributeSet(TEST_ARTEFACT_BRIDGE_NAME_C, TEST_NAME_ONE, TEST_VERSION_ONE,
+        TEST_URI_ONE);
+
+    public final static RepositoryAwareArtifactDescriptor TEST_ARTEFACT_ONE = createDescriptor(TEST_URI_ONE, TEST_ARTEFACT_TYPE, TEST_NAME_ONE,
+        TEST_VERSION_ONE, TEST_ATTRIBUTE_SET_ONE);
+
+    private final static String TEST_NAME_TWO = "org.eclipse.virgo.org.apache.commons.dbcp";
+
+    private final static Version TEST_VERSION_TWO = new Version("1.2.2.osgi");
+
+    private final static String TEST_FILE_TWO = "org.eclipse.virgo.org.apache.commons.dbcp-1.2.2.osgi.jar";
+
+    public final static URI TEST_URI_TWO = URI.create(TESTING_DIRECTORY + TEST_FILE_TWO);
+
+    private static final Set<Attribute> TEST_ATTRIBUTE_SET_TWO = createAttributeSet(TEST_ARTEFACT_BRIDGE_NAME_A, TEST_NAME_TWO, TEST_VERSION_TWO,
+        TEST_URI_TWO);
+
+    public final static RepositoryAwareArtifactDescriptor TEST_ARTEFACT_TWO = createDescriptor(TEST_URI_TWO, TEST_ARTEFACT_TYPE, TEST_NAME_TWO,
+        TEST_VERSION_TWO, TEST_ATTRIBUTE_SET_TWO);
+
+    private final static String TEST_NAME_THREE = "org.eclipse.virgo.org.apache.commons.logging";
+
+    private final static Version TEST_VERSION_THREE = new Version("1.1.1");
+
+    private final static String TEST_FILE_THREE = "org.eclipse.virgo.org.apache.commons.logging-1.1.1.jar";
+
+    public final static URI TEST_URI_THREE = URI.create(TESTING_DIRECTORY + TEST_FILE_THREE);
+
+    private static final Set<Attribute> TEST_ATTRIBUTE_SET_THREE = createAttributeSet(TEST_ARTEFACT_BRIDGE_NAME_A, TEST_NAME_THREE,
+        TEST_VERSION_THREE, TEST_URI_THREE);
+
+    public final static RepositoryAwareArtifactDescriptor TEST_ARTEFACT_THREE = createDescriptor(TEST_URI_THREE, TEST_ARTEFACT_TYPE, TEST_NAME_THREE,
+        TEST_VERSION_THREE, TEST_ATTRIBUTE_SET_THREE);
+
+    private final static String TEST_NAME_FOUR = "org.eclipse.virgo.org.apache.commons.pool";
+
+    private final static Version TEST_VERSION_FOUR = new Version("1.3.0");
+
+    private final static String TEST_FILE_FOUR = "org.eclipse.virgo.org.apache.commons.pool-1.3.0.jar";
+
+    public final static URI TEST_URI_FOUR = URI.create(TESTING_DIRECTORY + TEST_FILE_FOUR);
+
+    private static final Set<Attribute> TEST_ATTRIBUTE_SET_FOUR = createAttributeSet(TEST_ARTEFACT_BRIDGE_NAME_A, TEST_NAME_FOUR, TEST_VERSION_FOUR,
+        TEST_URI_FOUR);
+
+    public final static RepositoryAwareArtifactDescriptor TEST_ARTEFACT_FOUR = createDescriptor(TEST_URI_FOUR, TEST_ARTEFACT_TYPE, TEST_NAME_FOUR,
+        TEST_VERSION_FOUR, TEST_ATTRIBUTE_SET_FOUR);
+
+    private final static String TEST_NAME_FIVE = "org.eclipse.virgo.org.apache.log4j";
+
+    private final static Version TEST_VERSION_FIVE = new Version("1.2.15");
+
+    private final static String TEST_FILE_FIVE = "org.eclipse.virgo.org.apache.log4j-1.2.15.jar";
+
+    public final static URI TEST_URI_FIVE = URI.create(TESTING_DIRECTORY + TEST_FILE_FIVE);
+
+    private static final Set<Attribute> TEST_ATTRIBUTE_SET_FIVE = createAttributeSet(TEST_ARTEFACT_BRIDGE_NAME_A, TEST_NAME_FIVE, TEST_VERSION_FIVE,
+        TEST_URI_FIVE);
+
+    public final static RepositoryAwareArtifactDescriptor TEST_ARTEFACT_FIVE = createDescriptor(TEST_URI_FIVE, TEST_ARTEFACT_TYPE, TEST_NAME_FIVE,
+        TEST_VERSION_FIVE, TEST_ATTRIBUTE_SET_FIVE);
+
+    private final static String TEST_NAME_SIX = "org.eclipse.virgo.org.hsqldb";
+
+    private final static Version TEST_VERSION_SIX = new Version("1.8.0.9");
+
+    private final static String TEST_FILE_SIX = "org.eclipse.virgo.org.hsqldb-1.8.0.9.jar";
+
+    public final static URI TEST_URI_SIX = URI.create(TESTING_DIRECTORY + TEST_FILE_SIX);
+
+    private static final Set<Attribute> TEST_ATTRIBUTE_SET_SIX = createAttributeSet(TEST_ARTEFACT_BRIDGE_NAME_C, TEST_NAME_SIX, TEST_VERSION_SIX,
+        TEST_URI_SIX);
+
+    public final static RepositoryAwareArtifactDescriptor TEST_ARTEFACT_SIX = createDescriptor(TEST_URI_SIX, TEST_ARTEFACT_TYPE, TEST_NAME_SIX,
+        TEST_VERSION_SIX, TEST_ATTRIBUTE_SET_SIX);
+
+    private final static String TEST_NAME_SEVEN = "org.springframework.aop";
+
+    private final static Version TEST_VERSION_SEVEN = new Version("2.5.4.A");
+
+    private final static String TEST_FILE_SEVEN = "org.springframework.aop-2.5.4.A.jar";
+
+    public final static URI TEST_URI_SEVEN = URI.create(TESTING_DIRECTORY + TEST_FILE_SEVEN);
+
+    private static final Set<Attribute> TEST_ATTRIBUTE_SET_SEVEN = createAttributeSet(TEST_ARTEFACT_BRIDGE_NAME_B, TEST_NAME_SEVEN,
+        TEST_VERSION_SEVEN, TEST_URI_SEVEN);
+
+    public final static RepositoryAwareArtifactDescriptor TEST_ARTEFACT_SEVEN = createDescriptor(TEST_URI_SEVEN, TEST_ARTEFACT_TYPE, TEST_NAME_SEVEN,
+        TEST_VERSION_SEVEN, TEST_ATTRIBUTE_SET_SEVEN);
+
+    private final static String TEST_NAME_EIGHT = "org.springframework.beans";
+
+    private final static Version TEST_VERSION_EIGHT = new Version("2.5.4.A");
+
+    private final static String TEST_FILE_EIGHT = "org.springframework.beans-2.5.4.A.jar";
+
+    public final static URI TEST_URI_EIGHT = URI.create(TESTING_DIRECTORY + TEST_FILE_EIGHT);
+
+    private static final Set<Attribute> TEST_ATTRIBUTE_SET_EIGHT = createAttributeSet(TEST_ARTEFACT_BRIDGE_NAME_B, TEST_NAME_EIGHT,
+        TEST_VERSION_EIGHT, TEST_URI_EIGHT);
+
+    public final static RepositoryAwareArtifactDescriptor TEST_ARTEFACT_EIGHT = createDescriptor(TEST_URI_EIGHT, TEST_ARTEFACT_TYPE, TEST_NAME_EIGHT,
+        TEST_VERSION_EIGHT, TEST_ATTRIBUTE_SET_EIGHT);
+
+    private final static String TEST_NAME_NINE = "org.springframework.context";
+
+    private final static Version TEST_VERSION_NINE = new Version("2.5.4.A");
+
+    private final static String TEST_FILE_NINE = "org.springframework.context-2.5.4.A.jar";
+
+    public final static URI TEST_URI_NINE = URI.create(TESTING_DIRECTORY + TEST_FILE_NINE);
+
+    private static final Set<Attribute> TEST_ATTRIBUTE_SET_NINE = createAttributeSet(TEST_ARTEFACT_BRIDGE_NAME_B, TEST_NAME_NINE, TEST_VERSION_NINE,
+        TEST_URI_NINE);
+
+    public final static RepositoryAwareArtifactDescriptor TEST_ARTEFACT_NINE = createDescriptor(TEST_URI_NINE, TEST_ARTEFACT_TYPE, TEST_NAME_NINE,
+        TEST_VERSION_NINE, TEST_ATTRIBUTE_SET_NINE);
+
+    private final static String TEST_NAME_TEN = "org.springframework.core";
+
+    private final static Version TEST_VERSION_TEN = new Version("2.5.4.A");
+
+    private final static String TEST_FILE_TEN = "org.springframework.core-2.5.4.A.jar";
+
+    public final static URI TEST_URI_TEN = URI.create(TESTING_DIRECTORY + TEST_FILE_TEN);
+
+    private static final Set<Attribute> TEST_ATTRIBUTE_SET_TEN = createAttributeSet(TEST_ARTEFACT_BRIDGE_NAME_B, TEST_NAME_TEN, TEST_VERSION_TEN,
+        TEST_URI_TEN);
+
+    public final static RepositoryAwareArtifactDescriptor TEST_ARTEFACT_TEN = createDescriptor(TEST_URI_TEN, TEST_ARTEFACT_TYPE, TEST_NAME_TEN,
+        TEST_VERSION_TEN, TEST_ATTRIBUTE_SET_TEN);
+
+    private final static String TEST_NAME_ELEVEN = "org.springframework.jdbc";
+
+    private final static Version TEST_VERSION_ELEVEN = new Version("2.5.4.A");
+
+    private final static String TEST_FILE_ELEVEN = "org.springframework.jdbc-2.5.4.A.jar";
+
+    public final static URI TEST_URI_ELEVEN = URI.create(TESTING_DIRECTORY + TEST_FILE_ELEVEN);
+
+    private static final Set<Attribute> TEST_ATTRIBUTE_SET_ELEVEN = createAttributeSet(TEST_ARTEFACT_BRIDGE_NAME_B, TEST_NAME_ELEVEN,
+        TEST_VERSION_ELEVEN, TEST_URI_ELEVEN);
+
+    public final static RepositoryAwareArtifactDescriptor TEST_ARTEFACT_ELEVEN = createDescriptor(TEST_URI_ELEVEN, TEST_ARTEFACT_TYPE,
+        TEST_NAME_ELEVEN, TEST_VERSION_ELEVEN, TEST_ATTRIBUTE_SET_ELEVEN);
+
+    private final static String TEST_NAME_TWELVE = "org.springframework.orm";
+
+    private final static Version TEST_VERSION_TWELVE = new Version("2.5.4.A");
+
+    private final static String TEST_FILE_TWELVE = "org.springframework.orm-2.5.4.A.jar";
+
+    public final static URI TEST_URI_TWELVE = URI.create(TESTING_DIRECTORY + TEST_FILE_TWELVE);
+
+    private static final Set<Attribute> TEST_ATTRIBUTE_SET_TWELEVE = createAttributeSet(TEST_ARTEFACT_BRIDGE_NAME_B, TEST_NAME_TWELVE,
+        TEST_VERSION_TWELVE, TEST_URI_TWELVE);
+
+    public final static RepositoryAwareArtifactDescriptor TEST_ARTEFACT_TWELVE = createDescriptor(TEST_URI_TWELVE, TEST_ARTEFACT_TYPE,
+        TEST_NAME_TWELVE, TEST_VERSION_TWELVE, TEST_ATTRIBUTE_SET_TWELEVE);
+
+    private final static String TEST_NAME_THIRTEEN = "org.springframework.transaction";
+
+    private final static Version TEST_VERSION_THIRTEEN = new Version("2.5.4.A");
+
+    private final static String TEST_FILE_THIRTEEN = "org.springframework.transaction-2.5.4.A.jar";
+
+    public final static URI TEST_URI_THIRTEEN = URI.create(TESTING_DIRECTORY + TEST_FILE_THIRTEEN);
+
+    private static final Set<Attribute> TEST_ATTRIBUTE_SET_THIRTEEN = createAttributeSet(TEST_ARTEFACT_BRIDGE_NAME_C, TEST_NAME_THIRTEEN,
+        TEST_VERSION_THIRTEEN, TEST_URI_THIRTEEN, new StandardAttribute(TEST_ATTRIBUTE_NAME_ONE, TEST_ATTRIBUTE_VALUE_ONE));
+
+    public final static RepositoryAwareArtifactDescriptor TEST_ARTEFACT_THIRTEEN = createDescriptor(TEST_URI_THIRTEEN, TEST_ARTEFACT_TYPE,
+        TEST_NAME_THIRTEEN, TEST_VERSION_THIRTEEN, TEST_ATTRIBUTE_SET_THIRTEEN);
+
+    private final static String TEST_NAME_FOURTEEN = "org.springframework.web";
+
+    private final static Version TEST_VERSION_FOURTEEN = new Version("2.5.4.A");
+
+    private final static String TEST_FILE_FOURTEEN = "org.springframework.web-2.5.4.A.jar";
+
+    public final static URI TEST_URI_FOURTEEN = URI.create(TESTING_DIRECTORY + TEST_FILE_FOURTEEN);
+
+    private static final Set<Attribute> TEST_ATTRIBUTE_SET_FOURTEEN = createAttributeSet(TEST_ARTEFACT_BRIDGE_NAME_C, TEST_NAME_FOURTEEN,
+        TEST_VERSION_FOURTEEN, TEST_URI_FOURTEEN, new StandardAttribute(TEST_ATTRIBUTE_NAME_TWO, TEST_ATTRIBUTE_VALUE_TWO,
+            TEST_ATTRIBUTE_PARAMETERS_TWO));
+
+    public final static RepositoryAwareArtifactDescriptor TEST_ARTEFACT_FOURTEEN = createDescriptor(TEST_URI_FOURTEEN, TEST_ARTEFACT_TYPE,
+        TEST_NAME_FOURTEEN, TEST_VERSION_FOURTEEN, TEST_ATTRIBUTE_SET_FOURTEEN);
+
+    public final static String TEST_NAME_FIFTEEN = "org.springframework.web.servlet";
+
+    private final static Version TEST_VERSION_FIFTEEN = new Version("2.5.4.A");
+
+    private final static String TEST_FILE_FIFTEEN = "org.springframework.web.servlet-2.5.4.A.jar";
+
+    public final static URI TEST_URI_FIFTEEN = URI.create(TESTING_DIRECTORY + TEST_FILE_FIFTEEN);
+
+    private static final Set<Attribute> TEST_ATTRIBUTE_SET_FIFTEEN = createAttributeSet(TEST_ARTEFACT_BRIDGE_NAME_C, TEST_NAME_FIFTEEN,
+        TEST_VERSION_FIFTEEN, TEST_URI_FIFTEEN, new StandardAttribute(TEST_ATTRIBUTE_NAME_ONE, TEST_ATTRIBUTE_VALUE_ONE), new StandardAttribute(
+            TEST_ATTRIBUTE_NAME_TWO, TEST_ATTRIBUTE_VALUE_TWO, TEST_ATTRIBUTE_PARAMETERS_TWO), new StandardAttribute(TEST_ATTRIBUTE_NAME_THREE,
+            TEST_ATTRIBUTE_VALUE_THREE, TEST_ATTRIBUTE_PARAMETERS_THREE));
+
+    public final static RepositoryAwareArtifactDescriptor TEST_ARTEFACT_FIFTEEN = createDescriptor(TEST_URI_FIFTEEN, TEST_ARTEFACT_TYPE,
+        TEST_NAME_FIFTEEN, TEST_VERSION_FIFTEEN, TEST_ATTRIBUTE_SET_FIFTEEN);
+
+    private final static String TEST_NAME_SIXTEEN = "org.eclipse.virgo.org.aopalliance";
+
+    private final static Version TEST_VERSION_SIXTEEN = new Version("1.0.0");
+
+    private final static String TEST_FILE_SIXTEEN = "org.eclipse.virgo.org.aopalliance-1.0.0.jar";
+
+    public final static URI TEST_URI_SIXTEEN = URI.create(TESTING_DIRECTORY + TEST_FILE_SIXTEEN);
+
+    private static final Set<Attribute> TEST_ATTRIBUTE_SET_SIXTEEN = createAttributeSet(TEST_ARTEFACT_BRIDGE_NAME_A, TEST_NAME_SIXTEEN,
+        TEST_VERSION_SIXTEEN, TEST_URI_SIXTEEN, new StandardAttribute(TEST_ATTRIBUTE_NAME_ONE, TEST_ATTRIBUTE_VALUE_ONE), new StandardAttribute(
+            TEST_ATTRIBUTE_NAME_THREE, TEST_ATTRIBUTE_VALUE_THREE, TEST_ATTRIBUTE_PARAMETERS_THREE));
+
+    public final static RepositoryAwareArtifactDescriptor TEST_ARTEFACT_SIXTEEN = createDescriptor(TEST_URI_SIXTEEN, TEST_ARTEFACT_TYPE,
+        TEST_NAME_SIXTEEN, TEST_VERSION_SIXTEEN, TEST_ATTRIBUTE_SET_SIXTEEN);
+
+    public final static String ARTEFACT_ATTRIBUTE_TYPE = "type";
+
+    private final static String ARTEFACT_ATTRIBUTE_NAME = "name";
+
+    private final static String ARTEFACT_ATTRIBUTE_VERSION = "String";
+
+    private final static String ARTEFACT_ATTRIBUTE_URI = "uri";
+
+    public final static Attribute TEST_QUERY_FILTER_TYPE_A = new StandardAttribute(ARTEFACT_ATTRIBUTE_TYPE, TEST_ARTEFACT_BRIDGE_NAME_A);
+
+    public final static Attribute TEST_QUERY_FILTER_TYPE_B = new StandardAttribute(ARTEFACT_ATTRIBUTE_TYPE, TEST_ARTEFACT_BRIDGE_NAME_B);
+
+    public final static Attribute TEST_QUERY_FILTER_TYPE_C = new StandardAttribute(ARTEFACT_ATTRIBUTE_TYPE, TEST_ARTEFACT_BRIDGE_NAME_C);
+
+    // private final static Attribute TEST_QUERY_FILTER_NAME_ONE = new StandardAttribute(ARTEFACT_ATTRIBUTE_NAME,
+    // TEST_NAME_ONE);
+    // private final static Attribute TEST_QUERY_FILTER_NAME_TWO = new StandardAttribute(ARTEFACT_ATTRIBUTE_NAME,
+    // TEST_NAME_TWO);
+    public final static Attribute TEST_QUERY_FILTER_NAME_TWELVE = new StandardAttribute(ARTEFACT_ATTRIBUTE_NAME, TEST_NAME_TWELVE);
+
+    public final static Attribute TEST_QUERY_FILTER_NAME_THIRTEEN = new StandardAttribute(ARTEFACT_ATTRIBUTE_NAME, TEST_NAME_THIRTEEN);
+
+    // private final static Attribute TEST_QUERY_FILTER_NAME_FOURTEEN = new StandardAttribute(ARTEFACT_ATTRIBUTE_NAME,
+    // TEST_NAME_FOURTEEN);
+
+    public final static Attribute TEST_QUERY_FILTER_VERSION_254A = new StandardAttribute(ARTEFACT_ATTRIBUTE_VERSION, new String("2.5.4.A"));
+
+    // private final static Attribute TEST_QUERY_FILTER_VERSION_240 = new StandardAttribute(ARTEFACT_ATTRIBUTE_VERSION,
+    // new String("2.4.0"));
+    public final static Attribute TEST_QUERY_FILTER_VERSION_100 = new StandardAttribute(ARTEFACT_ATTRIBUTE_VERSION, new String("1.0.0"));
+
+    // private final static Attribute TEST_QUERY_FILTER_URI_TWO = new StandardAttribute(ARTEFACT_ATTRIBUTE_URI,
+    // TEST_URI_TWO.toString());
+    public final static Attribute TEST_QUERY_FILTER_URI_THREE = new StandardAttribute(ARTEFACT_ATTRIBUTE_URI, TEST_URI_THREE.toString());
+
+    // private final static Attribute TEST_QUERY_FILTER_URI_FOURTEEN = new StandardAttribute(ARTEFACT_ATTRIBUTE_URI,
+    // TEST_URI_FOURTEEN.toString());
+    // private final static Attribute TEST_QUERY_FILTER_URI_FIFTEEN = new StandardAttribute(ARTEFACT_ATTRIBUTE_URI,
+    // TEST_URI_FIFTEEN.toString());
+
+    public final static Attribute TEST_QUERY_FILTER_NOTHING = new StandardAttribute(ARTEFACT_ATTRIBUTE_NAME, "I don't exist");
+
+    public final static Attribute TEST_QUERY_FILTER_ATTRIBUTE_ONE = new StandardAttribute(TEST_ATTRIBUTE_NAME_ONE, TEST_ATTRIBUTE_VALUE_ONE);
+
+    public final static Attribute TEST_QUERY_FILTER_ATTRIBUTE_TWO = new StandardAttribute(TEST_ATTRIBUTE_NAME_TWO, TEST_ATTRIBUTE_VALUE_TWO,
+        TEST_ATTRIBUTE_PARAMETERS_TWO);
+
+    public final static Attribute TEST_QUERY_FILTER_ATTRIBUTE_THREE = new StandardAttribute(TEST_ATTRIBUTE_NAME_THREE, TEST_ATTRIBUTE_VALUE_THREE,
+        TEST_ATTRIBUTE_PARAMETERS_THREE);
+
+    private RepositoryTestData() {
+    }
+
+    static RepositoryAwareArtifactDescriptor createDescriptor(String type, String name, Version version, Set<Attribute> attributes) {
+        return createDescriptor(URI.create(TESTING_DIRECTORY + name + "." + type), type, name, version, attributes);
+    }
+
+    private static RepositoryAwareArtifactDescriptor createDescriptor(URI uri, String type, String name, Version version, Set<Attribute> attributes) {
+        ArtifactDescriptorBuilder builder = new ArtifactDescriptorBuilder().setUri(uri).setType(type).setName(name).setVersion(version);
+        for (Attribute attribute : attributes) {
+            builder.addAttribute(attribute);
+        }
+        return new DelegatingRepositoryAwareArtifactDescriptor(builder.build(), null, new IdentityUriMapper());
+    }
+
+    private static Set<Attribute> createAttributeSet(String type, String name, Version version, URI uri, StandardAttribute... extras) {
+        Set<Attribute> attributes = new HashSet<Attribute>();
+        attributes.add(new StandardAttribute(ARTEFACT_ATTRIBUTE_TYPE, type));
+        attributes.add(new StandardAttribute(ARTEFACT_ATTRIBUTE_NAME, name));
+        attributes.add(new StandardAttribute(ARTEFACT_ATTRIBUTE_VERSION, version.toString()));
+        attributes.add(new StandardAttribute(ARTEFACT_ATTRIBUTE_URI, uri.toString()));
+        for (StandardAttribute extra : extras) {
+            attributes.add(extra);
+        }
+        return attributes;
+    }
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/StandardArtifactDescriptorDepositoryTests.java b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/StandardArtifactDescriptorDepositoryTests.java
new file mode 100644
index 0000000..674985c
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/StandardArtifactDescriptorDepositoryTests.java
@@ -0,0 +1,378 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal;
+
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_EIGHT;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_ELEVEN;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_FIFTEEN;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_FIVE;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_FOUR;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_FOURTEEN;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_NINE;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_ONE;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_SEVEN;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_SIX;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_SIXTEEN;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_TEN;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_THIRTEEN;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_THREE;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_TWELVE;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_TWO;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_ZERO;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_ZERO_URI;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ATTRIBUTE_NAME_TWO;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ATTRIBUTE_PARAMETERS_THREE;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ATTRIBUTE_VALUE_TWO;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_QUERY_FILTER_ATTRIBUTE_ONE;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_QUERY_FILTER_ATTRIBUTE_THREE;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_QUERY_FILTER_ATTRIBUTE_TWO;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_QUERY_FILTER_NAME_THIRTEEN;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_QUERY_FILTER_NAME_TWELVE;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_QUERY_FILTER_NOTHING;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_QUERY_FILTER_TYPE_A;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_QUERY_FILTER_TYPE_B;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_QUERY_FILTER_TYPE_C;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_QUERY_FILTER_URI_THREE;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_QUERY_FILTER_VERSION_100;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_QUERY_FILTER_VERSION_254A;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_URI_EIGHT;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_URI_ELEVEN;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_URI_FIFTEEN;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_URI_FOURTEEN;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_URI_NINE;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_URI_ONE;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_URI_TEN;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_URI_THIRTEEN;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_URI_TWELVE;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.net.URI;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.virgo.repository.Attribute;
+import org.eclipse.virgo.repository.DuplicateArtifactException;
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+import org.eclipse.virgo.repository.internal.ArtifactDescriptorDepository;
+import org.eclipse.virgo.repository.internal.StandardArtifactDescriptorDepository;
+import org.eclipse.virgo.repository.internal.StandardAttribute;
+import org.eclipse.virgo.repository.internal.persistence.StubArtifactDescriptorPersister;
+import org.junit.Before;
+import org.junit.Test;
+
+
+/**
+ * <p>
+ * Unit tests for {@link org.eclipse.virgo.repository.internal.StandardArtifactDescriptorDepository}
+ * </p>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe test case
+ * 
+ */
+public class StandardArtifactDescriptorDepositoryTests {
+
+    private ArtifactDescriptorDepository artefactDepository;
+
+    private StubArtifactDescriptorPersister stubArtefactPersister;
+
+    private Set<Attribute> filters;
+
+    @Before
+    public void setUp() throws Exception {
+        this.filters = new HashSet<Attribute>();
+        this.stubArtefactPersister = new StubArtifactDescriptorPersister();
+        this.artefactDepository = new StandardArtifactDescriptorDepository(this.stubArtefactPersister);
+    }
+
+    @Test
+    public void testInstantiateArtefactDepositoryExist() throws IOException {
+        this.stubArtefactPersister.addArtefact(TEST_ARTEFACT_EIGHT);
+        this.stubArtefactPersister.addArtefact(TEST_ARTEFACT_SEVEN);
+        this.artefactDepository = new StandardArtifactDescriptorDepository(this.stubArtefactPersister);
+        assertEquals(2, this.artefactDepository.getArtifactDescriptorCount());
+    }
+
+    @Test
+    public void testInstantiateArtefactDepositoryNotExist() {
+        assertEquals(0, this.artefactDepository.getArtifactDescriptorCount());
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testAddArtefactNull() throws DuplicateArtifactException {
+        this.artefactDepository.addArtifactDescriptor(null);
+    }
+
+    @Test
+    public void testAddArtefactNotExist() throws DuplicateArtifactException {
+        this.artefactDepository.addArtifactDescriptor(TEST_ARTEFACT_ONE);
+        assertEquals(1, this.artefactDepository.getArtifactDescriptorCount());
+    }
+
+    @Test(expected = DuplicateArtifactException.class)
+    public void testAddArtefactExist() throws DuplicateArtifactException {
+        this.artefactDepository.addArtifactDescriptor(TEST_ARTEFACT_ONE);
+        this.artefactDepository.addArtifactDescriptor(TEST_ARTEFACT_ONE);
+    }
+
+    @Test(expected = DuplicateArtifactException.class)
+    public void testAddArtefactExistUrl() throws DuplicateArtifactException {
+        this.artefactDepository.addArtifactDescriptor(TEST_ARTEFACT_ZERO);
+        this.artefactDepository.addArtifactDescriptor(TEST_ARTEFACT_ZERO_URI);
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testRemoveArtefactNull() {
+        this.artefactDepository.removeArtifactDescriptor((URI) null);
+    }
+
+    @Test
+    public void testRemoveArtefactExist() throws DuplicateArtifactException {
+        this.artefactDepository.addArtifactDescriptor(TEST_ARTEFACT_ONE);
+        assertNotNull(this.artefactDepository.removeArtifactDescriptor(TEST_URI_ONE));
+        assertEquals(0, this.artefactDepository.getArtifactDescriptorCount());
+    }
+
+    @Test
+    public void testRemoveArtefactNotExist() {
+        assertNull(this.artefactDepository.removeArtifactDescriptor(TEST_URI_ONE));
+    }
+
+    @Test
+    public void testPersistArtefactDepository() throws DuplicateArtifactException, IOException {
+        this.artefactDepository.addArtifactDescriptor(TEST_ARTEFACT_ONE);
+        this.artefactDepository.addArtifactDescriptor(TEST_ARTEFACT_TWO);
+        this.artefactDepository.addArtifactDescriptor(TEST_ARTEFACT_THREE);
+        this.artefactDepository.persist();
+        assertTrue(this.stubArtefactPersister.getLastPersisted().contains(TEST_ARTEFACT_ONE));
+        assertTrue(this.stubArtefactPersister.getLastPersisted().contains(TEST_ARTEFACT_TWO));
+        assertTrue(this.stubArtefactPersister.getLastPersisted().contains(TEST_ARTEFACT_THREE));
+    }
+
+    @Test
+    public void testResolveArtefactNull() {
+        Set<RepositoryAwareArtifactDescriptor> artefacts = this.artefactDepository.resolveArtifactDescriptors(new HashSet<Attribute>());
+        assertEquals("Wrong number of Artefacts returned", 0, artefacts.size());
+        this.populateArtefactDepository();
+        artefacts = this.artefactDepository.resolveArtifactDescriptors(new HashSet<Attribute>());
+        assertEquals(16, artefacts.size());
+    }
+
+    @Test
+    public void testResolveArtefactsAll() {
+        Set<RepositoryAwareArtifactDescriptor> artefacts = this.artefactDepository.resolveArtifactDescriptors(new HashSet<Attribute>());
+        assertEquals("Wrong number of Artefacts returned", 0, artefacts.size());
+        this.populateArtefactDepository();
+        artefacts = this.artefactDepository.resolveArtifactDescriptors(new HashSet<Attribute>());
+        assertEquals(16, artefacts.size());
+    }
+
+    @Test
+    public void testResolveArtefactsType() {
+        this.populateArtefactDepository();
+        this.filters.add(TEST_QUERY_FILTER_TYPE_A);
+        Set<RepositoryAwareArtifactDescriptor> artefacts = this.artefactDepository.resolveArtifactDescriptors(this.filters);
+        assertEquals("Wrong number of Artefacts returned", 5, artefacts.size());
+    }
+
+    @Test
+    public void testResolveArtefactsName() {
+        this.populateArtefactDepository();
+        Set<RepositoryAwareArtifactDescriptor> artefacts = this.artefactDepository.resolveArtifactDescriptors(this.filters);
+        assertEquals("Wrong number of Artefacts returned", 16, artefacts.size());
+
+        this.filters.add(TEST_QUERY_FILTER_NAME_THIRTEEN);
+        artefacts = this.artefactDepository.resolveArtifactDescriptors(this.filters);
+        assertEquals("Wrong number of Artefacts returned", 1, artefacts.size());
+        assertTrue("Wrong Artefact returned", artefacts.contains(TEST_ARTEFACT_THIRTEEN));
+    }
+
+    @Test
+    public void testResolveArtefactsVersion() {
+        this.populateArtefactDepository();
+        Set<RepositoryAwareArtifactDescriptor> artefacts = this.artefactDepository.resolveArtifactDescriptors(this.filters);
+        assertEquals("Wrong number of Artefacts returned", 16, artefacts.size());
+
+        this.filters.add(TEST_QUERY_FILTER_VERSION_100);
+        artefacts = this.artefactDepository.resolveArtifactDescriptors(this.filters);
+        assertEquals("Wrong number of Artefacts returned", 1, artefacts.size());
+        assertTrue("Wrong number of Artefacts returned", artefacts.contains(TEST_ARTEFACT_SIXTEEN));
+    }
+
+    @Test
+    public void testResolveArtefactsVersionMatchMany() {
+        this.populateArtefactDepository();
+        Set<RepositoryAwareArtifactDescriptor> artefacts = this.artefactDepository.resolveArtifactDescriptors(this.filters);
+        assertEquals("Wrong number of Artefacts returned", 16, artefacts.size());
+
+        this.filters.add(TEST_QUERY_FILTER_VERSION_254A);
+        artefacts = this.artefactDepository.resolveArtifactDescriptors(this.filters);
+        assertEquals("Wrong number of Artefacts returned", 9, artefacts.size());
+    }
+
+    @Test
+    public void testResolveArtefactsURI() {
+        this.populateArtefactDepository();
+        Set<RepositoryAwareArtifactDescriptor> artefacts = this.artefactDepository.resolveArtifactDescriptors(this.filters);
+        assertEquals("Wrong number of Artefacts returned", 16, artefacts.size());
+
+        this.filters.add(TEST_QUERY_FILTER_URI_THREE);
+        artefacts = this.artefactDepository.resolveArtifactDescriptors(this.filters);
+        assertEquals("Wrong number of Artefacts returned", 1, artefacts.size());
+        assertTrue("Wrong number of Artefacts returned", artefacts.contains(TEST_ARTEFACT_THREE));
+    }
+
+    // TEST_ATTRIBUTE_THREE_AGAIN
+
+    @Test
+    public void testResolveArtefactsAttributeNoProperties() {
+        this.populateArtefactDepository();
+        Set<RepositoryAwareArtifactDescriptor> artefacts = this.artefactDepository.resolveArtifactDescriptors(this.filters);
+        assertEquals("Wrong number of Artefacts returned", 16, artefacts.size());
+
+        this.filters.add(TEST_QUERY_FILTER_ATTRIBUTE_ONE);
+        artefacts = this.artefactDepository.resolveArtifactDescriptors(this.filters);
+        assertEquals("Wrong number of Artefacts returned", 3, artefacts.size());
+    }
+
+    @Test
+    public void testResolveArtefactsAttributePropertiesManyResults() {
+        this.populateArtefactDepository();
+        Set<RepositoryAwareArtifactDescriptor> artefacts = this.artefactDepository.resolveArtifactDescriptors(this.filters);
+        assertEquals("Wrong number of Artefacts returned", 16, artefacts.size());
+
+        this.filters.add(TEST_QUERY_FILTER_ATTRIBUTE_TWO);
+        artefacts = this.artefactDepository.resolveArtifactDescriptors(this.filters);
+        assertEquals("Wrong number of Artefacts returned", 2, artefacts.size());
+
+        this.filters.add(TEST_QUERY_FILTER_TYPE_C);
+        artefacts = this.artefactDepository.resolveArtifactDescriptors(this.filters);
+        assertEquals("Wrong number of Artefacts returned", 2, artefacts.size());
+    }
+
+    @Test
+    public void testResolveArtefactsAttributePropertiesOneResult() {
+        this.populateArtefactDepository();
+        Set<RepositoryAwareArtifactDescriptor> artefacts = this.artefactDepository.resolveArtifactDescriptors(this.filters);
+        assertEquals("Wrong number of Artefacts returned", 16, artefacts.size());
+
+        this.filters.add(TEST_QUERY_FILTER_ATTRIBUTE_THREE);
+        artefacts = this.artefactDepository.resolveArtifactDescriptors(this.filters);
+        assertEquals("Wrong number of Artefacts returned", 2, artefacts.size());
+
+        this.filters.add(TEST_QUERY_FILTER_TYPE_C);
+        artefacts = this.artefactDepository.resolveArtifactDescriptors(this.filters);
+        assertEquals("Wrong number of Artefacts returned", 1, artefacts.size());
+    }
+
+    @Test
+    public void testResolveCombinationQuery() {
+        this.populateArtefactDepository();
+        Set<RepositoryAwareArtifactDescriptor> artefacts = this.artefactDepository.resolveArtifactDescriptors(this.filters);
+        assertEquals("Wrong number of Artefacts returned", 16, artefacts.size());
+
+        this.filters.add(TEST_QUERY_FILTER_VERSION_254A);
+        artefacts = this.artefactDepository.resolveArtifactDescriptors(this.filters);
+        assertEquals("Wrong number of Artefacts returned", 9, artefacts.size());
+
+        this.filters.add(TEST_QUERY_FILTER_TYPE_B);
+        artefacts = this.artefactDepository.resolveArtifactDescriptors(this.filters);
+        assertEquals("Wrong number of Artefacts returned", 6, artefacts.size());
+
+        this.filters.add(TEST_QUERY_FILTER_NAME_TWELVE);
+        artefacts = this.artefactDepository.resolveArtifactDescriptors(this.filters);
+        assertEquals("Wrong number of Artefacts returned", 1, artefacts.size());
+        assertTrue("Wrong Artefact returned", artefacts.contains(TEST_ARTEFACT_TWELVE));
+    }
+
+    @Test
+    public void testResolveRemovedArtefacts() {
+        this.populateArtefactDepository();
+        Set<RepositoryAwareArtifactDescriptor> artefacts = this.artefactDepository.resolveArtifactDescriptors(this.filters);
+        assertEquals("Wrong number of Artefacts returned", 16, artefacts.size());
+
+        this.filters.add(TEST_QUERY_FILTER_VERSION_254A);
+        artefacts = this.artefactDepository.resolveArtifactDescriptors(this.filters);
+        assertEquals("Wrong number of Artefacts returned", 9, artefacts.size());
+
+        this.artefactDepository.removeArtifactDescriptor(TEST_URI_NINE);
+        this.artefactDepository.removeArtifactDescriptor(TEST_URI_TEN);
+        artefacts = this.artefactDepository.resolveArtifactDescriptors(this.filters);
+        assertEquals("Wrong number of Artefacts returned", 7, artefacts.size());
+
+        this.artefactDepository.removeArtifactDescriptor(TEST_URI_THIRTEEN);
+        this.artefactDepository.removeArtifactDescriptor(TEST_URI_FOURTEEN);
+        this.artefactDepository.removeArtifactDescriptor(TEST_URI_FIFTEEN);
+        artefacts = this.artefactDepository.resolveArtifactDescriptors(this.filters);
+        assertEquals("Wrong number of Artefacts returned", 4, artefacts.size());
+
+        this.artefactDepository.removeArtifactDescriptor(TEST_URI_EIGHT);
+        this.artefactDepository.removeArtifactDescriptor(TEST_URI_ELEVEN);
+        this.artefactDepository.removeArtifactDescriptor(TEST_URI_TWELVE);
+        artefacts = this.artefactDepository.resolveArtifactDescriptors(this.filters);
+        assertEquals("Wrong number of Artefacts returned", 1, artefacts.size());
+        assertTrue("Wrong Artefact returned", artefacts.contains(TEST_ARTEFACT_SEVEN));
+    }
+
+    @Test
+    public void testResolveArtefactsNoResults() {
+        this.populateArtefactDepository();
+        Set<RepositoryAwareArtifactDescriptor> artefacts = this.artefactDepository.resolveArtifactDescriptors(this.filters);
+        assertEquals("Wrong number of Artefacts returned", 16, artefacts.size());
+
+        StandardAttribute filter = new StandardAttribute(TEST_ATTRIBUTE_NAME_TWO, TEST_ATTRIBUTE_VALUE_TWO, TEST_ATTRIBUTE_PARAMETERS_THREE);
+
+        this.filters.add(filter);
+        artefacts = this.artefactDepository.resolveArtifactDescriptors(this.filters);
+        assertEquals("Wrong number of Artefacts returned", 0, artefacts.size());
+    }
+
+    @Test
+    public void testResolveArtefactsNoResultsTwo() {
+        this.populateArtefactDepository();
+        Set<RepositoryAwareArtifactDescriptor> artefacts = this.artefactDepository.resolveArtifactDescriptors(this.filters);
+        assertEquals("Wrong number of Artefacts returned", 16, artefacts.size());
+
+        this.filters.add(TEST_QUERY_FILTER_NOTHING);
+        artefacts = this.artefactDepository.resolveArtifactDescriptors(this.filters);
+        assertEquals("Wrong number of Artefacts returned", 0, artefacts.size());
+    }
+
+    private void populateArtefactDepository() {
+        try {
+            this.artefactDepository.addArtifactDescriptor(TEST_ARTEFACT_ONE);
+            this.artefactDepository.addArtifactDescriptor(TEST_ARTEFACT_TWO);
+            this.artefactDepository.addArtifactDescriptor(TEST_ARTEFACT_THREE);
+            this.artefactDepository.addArtifactDescriptor(TEST_ARTEFACT_FOUR);
+            this.artefactDepository.addArtifactDescriptor(TEST_ARTEFACT_FIVE);
+            this.artefactDepository.addArtifactDescriptor(TEST_ARTEFACT_SIX);
+            this.artefactDepository.addArtifactDescriptor(TEST_ARTEFACT_SEVEN);
+            this.artefactDepository.addArtifactDescriptor(TEST_ARTEFACT_EIGHT);
+            this.artefactDepository.addArtifactDescriptor(TEST_ARTEFACT_NINE);
+            this.artefactDepository.addArtifactDescriptor(TEST_ARTEFACT_TEN);
+            this.artefactDepository.addArtifactDescriptor(TEST_ARTEFACT_ELEVEN);
+            this.artefactDepository.addArtifactDescriptor(TEST_ARTEFACT_TWELVE);
+            this.artefactDepository.addArtifactDescriptor(TEST_ARTEFACT_THIRTEEN);
+            this.artefactDepository.addArtifactDescriptor(TEST_ARTEFACT_FOURTEEN);
+            this.artefactDepository.addArtifactDescriptor(TEST_ARTEFACT_FIFTEEN);
+            this.artefactDepository.addArtifactDescriptor(TEST_ARTEFACT_SIXTEEN);
+        } catch (DuplicateArtifactException e) {
+            throw new RuntimeException("Test error while populating the depository");
+        }
+    }
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/StandardArtifactDescriptorTests.java b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/StandardArtifactDescriptorTests.java
new file mode 100644
index 0000000..9daec20
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/StandardArtifactDescriptorTests.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal;
+
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_FIFTEEN;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_ONE;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_THIRTEEN;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_NAME_FIFTEEN;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_NAME_ONE;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_URI_FIFTEEN;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_URI_ONE;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_URI_THIRTEEN;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Collections;
+
+import org.eclipse.virgo.repository.Attribute;
+import org.junit.Test;
+import org.osgi.framework.Version;
+
+
+/**
+ * <p>
+ * Unit tests for {@link org.eclipse.virgo.repository.internal.StandardArtifactDescriptor}
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe test case
+ * 
+ */
+public class StandardArtifactDescriptorTests {
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testStandardArtefactNullURI() {
+        new StandardArtifactDescriptor(null, "foo", "bar", new Version("0"), null, Collections.<Attribute> emptySet());
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testStandardArtefactNullType() {
+        new StandardArtifactDescriptor(TEST_URI_ONE, null, "bar", new Version("0"), null, Collections.<Attribute> emptySet());
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testStandardArtefactNullName() {
+        new StandardArtifactDescriptor(TEST_URI_ONE, "foo", null, new Version("0"), null, Collections.<Attribute> emptySet());
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testStandardArtefactNullVersion() {
+        new StandardArtifactDescriptor(TEST_URI_ONE, "foo", "bar", null, null, Collections.<Attribute> emptySet());
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testStandardArtefactNullAttributes() {
+        new StandardArtifactDescriptor(TEST_URI_ONE, "foo", "bar", new Version("0"), null, null);
+    }
+
+    @Test
+    public void testGetName() {
+        assertEquals("Incorrect name reported", TEST_NAME_ONE, TEST_NAME_ONE);
+        assertEquals("Incorrect name reported", TEST_NAME_FIFTEEN, TEST_NAME_FIFTEEN);
+    }
+
+    @Test
+    public void testGetURI() {
+        assertEquals("Supplied file not returned", TEST_URI_THIRTEEN, TEST_ARTEFACT_THIRTEEN.getUri());
+        assertEquals("Supplied file not returned", TEST_URI_FIFTEEN, TEST_ARTEFACT_FIFTEEN.getUri());
+    }
+
+    @Test
+    public void testToString() {
+        assertTrue(
+            "Wrong toString returned for constructor args. '" + TEST_URI_ONE.getPath() + "' was not in '" + TEST_ARTEFACT_ONE.toString() + "'",
+            TEST_ARTEFACT_ONE.toString().contains(TEST_URI_ONE.getPath()));
+        assertTrue("Wrong toString returned for constructor args", TEST_ARTEFACT_FIFTEEN.toString().contains(TEST_URI_FIFTEEN.getPath()));
+    }
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/StandardAttributeTests.java b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/StandardAttributeTests.java
new file mode 100644
index 0000000..fa14af5
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/StandardAttributeTests.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal;
+
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ATTRIBUTE_NAME_ONE;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ATTRIBUTE_VALUE_ONE;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.util.HashMap;
+import java.util.Set;
+
+import org.eclipse.virgo.repository.internal.StandardAttribute;
+import org.junit.Test;
+
+/**
+ * <p>
+ * Unit tests for {@link org.eclipse.virgo.repository.internal.StandardAttribute}
+ * </p>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe test case
+ * 
+ */
+public class StandardAttributeTests {
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testArtefactNullName() {
+        new StandardAttribute(null, "foo", new HashMap<String, Set<String>>());
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testAttributeNullValue() {
+        new StandardAttribute("foo", null, new HashMap<String, Set<String>>());
+    }
+
+    @Test
+    public void testGetName() {
+        assertEquals(TEST_ATTRIBUTE_NAME_ONE, TEST_ATTRIBUTE_NAME_ONE);
+    }
+
+    @Test
+    public void testGetValue() {
+        assertEquals(TEST_ATTRIBUTE_VALUE_ONE, TEST_ATTRIBUTE_VALUE_ONE);
+    }
+
+    @Test
+    public void testToString() {
+        assertTrue("Wrong toString returned for constructor args",
+            new StandardAttribute(TEST_ATTRIBUTE_NAME_ONE, TEST_ATTRIBUTE_VALUE_ONE).toString().contains(TEST_ATTRIBUTE_NAME_ONE));
+        assertTrue("Wrong toString returned for constructor args",
+            new StandardAttribute(TEST_ATTRIBUTE_NAME_ONE, TEST_ATTRIBUTE_VALUE_ONE).toString().contains(TEST_ATTRIBUTE_VALUE_ONE));
+    }
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/StandardQueryTests.java b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/StandardQueryTests.java
new file mode 100644
index 0000000..b89d350
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/StandardQueryTests.java
@@ -0,0 +1,161 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal;
+
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ATTRIBUTE_PARAMETERS_THREE;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.createDescriptor;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.virgo.repository.Attribute;
+import org.eclipse.virgo.repository.Query;
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Version;
+
+/**
+ * 
+ */
+public class StandardQueryTests {
+
+    private StandardQuery query;
+
+    private StandardQuery queryWithAttributeParameters;
+
+    private StubArtefactDepository artefactDepository;
+
+    @Before
+    public void setUp() {
+        artefactDepository = new StubArtefactDepository();
+        query = new StandardQuery(artefactDepository, "foo", "bar");
+        queryWithAttributeParameters = new StandardQuery(artefactDepository, "foo", "bar", TEST_ATTRIBUTE_PARAMETERS_THREE);
+    }
+
+    @Test
+    public void testNewQuery() {
+        query.run();
+        Set<Attribute> filters = artefactDepository.getFilters();
+        assertEquals("Wrong number of filters found", 1, filters.size());
+    }
+
+    @Test
+    public void testNewQueryWithProps() {
+        queryWithAttributeParameters.run();
+        Set<Attribute> filters = artefactDepository.getFilters();
+        assertEquals("Wrong number of filters found", 1, filters.size());
+        assertEquals("Wring properties found", TEST_ATTRIBUTE_PARAMETERS_THREE, filters.iterator().next().getProperties());
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testAddFilterNullName() {
+        query.addFilter(null, "bananas");
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testAddFilterNullValue() {
+        query.addFilter("monkey", null);
+    }
+
+    @Test
+    public void testAddFilter() {
+        query.addFilter("monkey", "bananas");
+        query.run();
+        Set<Attribute> filters = artefactDepository.getFilters();
+        assertEquals("Wrong number of filters found", 2, filters.size());
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testAddFilterWithParametersNullName() {
+        query.addFilter(null, "bananas", new HashMap<String, Set<String>>(0));
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testAddFilterWithParametersNullValue() {
+        query.addFilter("monkey", null, new HashMap<String, Set<String>>(0));
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testAddFilterWithParametersNullParameters() {
+        query.addFilter("monkey", "bananas", null);
+    }
+
+    @Test
+    public void testAddFilterWithParameters() {
+        query.addFilter("monkey", "bananas", new HashMap<String, Set<String>>(0));
+        query.run();
+        Set<Attribute> filters = artefactDepository.getFilters();
+        assertEquals("Wrong number of filters found", 2, filters.size());
+    }
+
+    @Test
+    public void testQueryNoArtefacts() {
+        artefactDepository.setNextReturnCount(StubArtefactDepository.NONE);
+        Set<RepositoryAwareArtifactDescriptor> artefacts = query.run();
+        assertEquals(0, artefacts.size());
+    }
+
+    @Test
+    public void testQueryOneArtefact() {
+        artefactDepository.setNextReturnCount(StubArtefactDepository.ONE);
+        Set<RepositoryAwareArtifactDescriptor> artefacts = query.run();
+        assertEquals(1, artefacts.size());
+    }
+
+    public void testQueryMultipleArtefacts() {
+        artefactDepository.setNextReturnCount(StubArtefactDepository.MANY);
+        assertTrue(query.run().size() > 1);
+    }
+
+    @Test
+    public void testToString() {
+        String toString = queryWithAttributeParameters.toString();
+        assertTrue("toString dosn't contain all the required information", toString.contains("foo=bar"));
+        assertTrue("toString dosn't contain all the required information", toString.contains("2"));
+    }
+
+    private final Set<Attribute> EMTPY_ATTRIBUTE_SET = Collections.<Attribute> emptySet();
+
+    @Test
+    public void testVersionRangeFilters() {
+        Set<RepositoryAwareArtifactDescriptor> unfiltered = new HashSet<RepositoryAwareArtifactDescriptor>();
+        final RepositoryAwareArtifactDescriptor c1low = createDescriptor("configuration", "c1", Version.parseVersion("1.0.0"), EMTPY_ATTRIBUTE_SET);
+        unfiltered.add(c1low);
+        final RepositoryAwareArtifactDescriptor c1high = createDescriptor("configuration", "c1", Version.parseVersion("2.0.0"), EMTPY_ATTRIBUTE_SET);
+        unfiltered.add(c1high);
+        final RepositoryAwareArtifactDescriptor c2 = createDescriptor("configuration", "c2", Version.parseVersion("2.0.0"), EMTPY_ATTRIBUTE_SET);
+        unfiltered.add(c2);
+
+        Set<RepositoryAwareArtifactDescriptor> filtered = Query.VersionRangeMatchingStrategy.ALL.match(unfiltered, VersionRange.NATURAL_NUMBER_RANGE);
+        assertNotNull(filtered);
+        assertEquals(filtered, unfiltered);
+
+        filtered = Query.VersionRangeMatchingStrategy.HIGHEST.match(unfiltered, new VersionRange("[1, 3)"));
+        assertNotNull(filtered);
+        assertEquals(2, filtered.size());
+        assertTrue(filtered.contains(c1high));
+        assertTrue(filtered.contains(c2));
+
+        filtered = Query.VersionRangeMatchingStrategy.LOWEST.match(unfiltered, new VersionRange("[1, 3)"));
+        assertNotNull(filtered);
+        assertEquals(2, filtered.size());
+        assertTrue(filtered.contains(c1low));
+        assertTrue(filtered.contains(c2));
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/StandardRepositoryFactoryTests.java b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/StandardRepositoryFactoryTests.java
new file mode 100644
index 0000000..bfdbf48
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/StandardRepositoryFactoryTests.java
@@ -0,0 +1,115 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.net.URI;
+import java.util.Arrays;
+import java.util.Collections;
+
+import org.junit.Test;
+
+import org.eclipse.virgo.medic.test.eventlog.MockEventLogger;
+import org.eclipse.virgo.repository.ArtifactBridge;
+import org.eclipse.virgo.repository.Repository;
+import org.eclipse.virgo.repository.RepositoryCreationException;
+import org.eclipse.virgo.repository.codec.XMLRepositoryCodec;
+import org.eclipse.virgo.repository.configuration.ExternalStorageRepositoryConfiguration;
+import org.eclipse.virgo.repository.configuration.ManagedStorageRepositoryConfiguration;
+import org.eclipse.virgo.repository.configuration.RemoteRepositoryConfiguration;
+import org.eclipse.virgo.repository.configuration.RepositoryConfiguration;
+import org.eclipse.virgo.repository.configuration.WatchedStorageRepositoryConfiguration;
+import org.eclipse.virgo.repository.internal.RepositoryDumpContributor;
+import org.eclipse.virgo.repository.internal.StandardRepositoryFactory;
+import org.eclipse.virgo.repository.internal.chain.ChainedRepository;
+import org.eclipse.virgo.repository.internal.external.ExternalStorageRepository;
+import org.eclipse.virgo.repository.internal.remote.RemoteRepository;
+import org.eclipse.virgo.repository.internal.watched.WatchedStorageRepository;
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+import org.eclipse.virgo.util.osgi.ServiceRegistrationTracker;
+
+public class StandardRepositoryFactoryTests {
+
+    MockEventLogger mockEventLogger = new MockEventLogger();
+
+    StandardRepositoryFactory factory = new StandardRepositoryFactory(mockEventLogger, new StubBundleContext(), new ServiceRegistrationTracker(), new RepositoryDumpContributor(new XMLRepositoryCodec()));
+
+    @Test
+    public void chainedRepository() throws RepositoryCreationException {
+        RepositoryConfiguration config = new ExternalStorageRepositoryConfiguration("test", new File("build/externalIndex"),
+            Collections.<ArtifactBridge> emptySet(), System.getProperty("user.dir") + "/target/external", null);
+        Repository repository = factory.createRepository(Arrays.asList(config, config));
+        assertTrue(repository instanceof ChainedRepository);
+        assertEquals("test-test", repository.getName());
+        assertFalse("log events were issued", mockEventLogger.getCalled());
+    }
+
+    @Test
+    public void chainedRepositoryWithBadRepositoryInChain() throws RepositoryCreationException {
+        RepositoryConfiguration config = new ExternalStorageRepositoryConfiguration("test", new File("build/externalIndex"),
+            Collections.<ArtifactBridge> emptySet(), System.getProperty("user.dir") + "/target/external", null);
+        RepositoryConfiguration badConfig = new ManagedStorageRepositoryConfiguration("test", new File("build/managedIndex"),
+            Collections.<ArtifactBridge> emptySet(), new File("build/managedStorage"), null);
+        Repository repository = factory.createRepository(Arrays.asList(config, badConfig, config));
+        assertTrue(repository instanceof ChainedRepository);
+        assertEquals("test-test", repository.getName());
+        assertTrue("log events not correctly issued", mockEventLogger.isLogged("RP0100W"));
+    }
+
+    @Test
+    public void externalStorageRepository() throws RepositoryCreationException {
+        Repository repository = factory.createRepository(new ExternalStorageRepositoryConfiguration("test", new File("build/externalIndex"),
+            Collections.<ArtifactBridge> emptySet(), System.getProperty("user.dir") + "/target/external", null));
+        assertTrue(repository instanceof ExternalStorageRepository);
+        assertFalse("log events were issued", mockEventLogger.getCalled());
+    }
+
+    @Test
+    public void watchedStorageRepository() throws RepositoryCreationException {
+        File watchDir = new File("build/watch");
+        watchDir.mkdirs();
+        Repository repository = factory.createRepository(new WatchedStorageRepositoryConfiguration("test", new File("build/watchedIndex"), Collections.<ArtifactBridge> emptySet(),
+            watchDir.getAbsolutePath(), 1000, null));
+        assertTrue(repository instanceof WatchedStorageRepository);
+        assertFalse("log events were issued", mockEventLogger.getCalled());
+    }
+
+    @Test
+    public void remoteRepository() throws RepositoryCreationException {
+        Repository repository = factory.createRepository(new RemoteRepositoryConfiguration("test", new File("build/remoteIndex"),
+            URI.create("http://localhost"), 1000, null, new File("build")));
+        assertTrue(repository instanceof RemoteRepository);
+        assertFalse("log events were issued", mockEventLogger.getCalled());
+    }
+
+    @Test(expected = RepositoryCreationException.class)
+    public void managedStorageRepository() throws RepositoryCreationException {
+        factory.createRepository(new ManagedStorageRepositoryConfiguration("test", new File("build/managedIndex"),
+            Collections.<ArtifactBridge> emptySet(), new File("build/managedStorage"), null));
+    }
+
+    @Test(expected = RepositoryCreationException.class)
+    public void unknownRepository() throws RepositoryCreationException {
+        factory.createRepository(new StubRepositoryConfiguration());
+    }
+
+    private static class StubRepositoryConfiguration extends RepositoryConfiguration {
+
+        StubRepositoryConfiguration() {
+            super("test", null);
+        }
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/StubArtefactDepository.java b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/StubArtefactDepository.java
new file mode 100644
index 0000000..2a3b76b
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/StubArtefactDepository.java
@@ -0,0 +1,123 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal;
+
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_ONE;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_TWO;
+
+import java.net.URI;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.virgo.repository.Attribute;
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+import org.eclipse.virgo.repository.internal.ArtifactDescriptorDepository;
+
+
+/**
+ * <p>
+ * Stub of ArtefactDepository with some util methods to query its use.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is Threadsafe
+ * 
+ */
+public class StubArtefactDepository implements ArtifactDescriptorDepository {
+
+    private String lastCall = "";
+
+    private Set<Attribute> filters = null;
+
+    private Set<RepositoryAwareArtifactDescriptor> artefacts = new HashSet<RepositoryAwareArtifactDescriptor>();
+
+    private RepositoryAwareArtifactDescriptor returnItem = null;
+
+    public static final String NONE = "none";
+
+    public static final String ONE = "one";
+
+    public static final String MANY = "many";
+
+    /**
+     * {@inheritDoc}
+     */
+    public void addArtifactDescriptor(RepositoryAwareArtifactDescriptor artefact) {
+        this.lastCall = "addArtefact" + artefact.toString();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public RepositoryAwareArtifactDescriptor removeArtifactDescriptor(URI uri) {
+        this.lastCall = "removeArtefact" + uri.toString();
+        return returnItem;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void persist() {
+        this.lastCall = "persistArtefactDepository";
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Set<RepositoryAwareArtifactDescriptor> resolveArtifactDescriptors(Set<Attribute> filters) {
+        this.filters = filters;
+        return artefacts;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public int getArtifactDescriptorCount() {
+        return 0;
+    }
+
+    public String getLastMethodCall() {
+        return this.lastCall;
+    }
+
+    public Set<Attribute> getFilters() {
+        return filters;
+    }
+
+    public void setNextReturnCount(String number) {
+        this.artefacts = new HashSet<RepositoryAwareArtifactDescriptor>();
+        if (number.equals(NONE)) {
+            // no-op
+        } else if (number.equals(ONE)) {
+            this.artefacts.add(TEST_ARTEFACT_ONE);
+        } else if (number.equals(MANY)) {
+            this.artefacts.add(TEST_ARTEFACT_ONE);
+            this.artefacts.add(TEST_ARTEFACT_TWO);
+        } else {
+            throw new RuntimeException("Test error, unknown number of items requested from the test");
+        }
+
+    }
+
+    public void setReturnItem(RepositoryAwareArtifactDescriptor artefact) {
+        this.returnItem = artefact;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean removeArtifactDescriptor(RepositoryAwareArtifactDescriptor artifactDescriptor) {
+        throw new UnsupportedOperationException();
+    }
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/StubArtifactBridge.java b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/StubArtifactBridge.java
new file mode 100644
index 0000000..7effcb5
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/StubArtifactBridge.java
@@ -0,0 +1,103 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal;
+
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_EIGHT;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_ELEVEN;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_FIFTEEN;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_FIVE;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_FOUR;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_FOURTEEN;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_NINE;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_ONE;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_SEVEN;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_SIX;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_SIXTEEN;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_TEN;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_THIRTEEN;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_THREE;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_TWELVE;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_TWO;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_URI_EIGHT;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_URI_ELEVEN;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_URI_FIFTEEN;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_URI_FIVE;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_URI_FOUR;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_URI_FOURTEEN;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_URI_NINE;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_URI_ONE;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_URI_SEVEN;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_URI_SIX;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_URI_SIXTEEN;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_URI_TEN;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_URI_THIRTEEN;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_URI_THREE;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_URI_TWELVE;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_URI_TWO;
+
+import java.io.File;
+import java.net.URI;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.virgo.repository.ArtifactBridge;
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+
+
+/**
+ * <p>
+ * A Stub impl of Artefact Bridge, is pre-configured to return values from the test data set.
+ * </p>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is Threadsafe
+ * 
+ */
+final public class StubArtifactBridge implements ArtifactBridge {
+
+    private final Map<String, RepositoryAwareArtifactDescriptor> testArtefacts = new HashMap<String, RepositoryAwareArtifactDescriptor>();
+
+    public StubArtifactBridge() {
+
+        testArtefacts.put(translate(TEST_URI_ONE), TEST_ARTEFACT_ONE);
+        testArtefacts.put(translate(TEST_URI_TWO), TEST_ARTEFACT_TWO);
+        testArtefacts.put(translate(TEST_URI_THREE), TEST_ARTEFACT_THREE);
+        testArtefacts.put(translate(TEST_URI_FOUR), TEST_ARTEFACT_FOUR);
+        testArtefacts.put(translate(TEST_URI_FIVE), TEST_ARTEFACT_FIVE);
+        testArtefacts.put(translate(TEST_URI_SIX), TEST_ARTEFACT_SIX);
+        testArtefacts.put(translate(TEST_URI_SEVEN), TEST_ARTEFACT_SEVEN);
+        testArtefacts.put(translate(TEST_URI_EIGHT), TEST_ARTEFACT_EIGHT);
+        testArtefacts.put(translate(TEST_URI_NINE), TEST_ARTEFACT_NINE);
+        testArtefacts.put(translate(TEST_URI_TEN), TEST_ARTEFACT_TEN);
+        testArtefacts.put(translate(TEST_URI_ELEVEN), TEST_ARTEFACT_ELEVEN);
+        testArtefacts.put(translate(TEST_URI_TWELVE), TEST_ARTEFACT_TWELVE);
+        testArtefacts.put(translate(TEST_URI_THIRTEEN), TEST_ARTEFACT_THIRTEEN);
+        testArtefacts.put(translate(TEST_URI_FOURTEEN), TEST_ARTEFACT_FOURTEEN);
+        testArtefacts.put(translate(TEST_URI_FIFTEEN), TEST_ARTEFACT_FIFTEEN);
+        testArtefacts.put(translate(TEST_URI_SIXTEEN), TEST_ARTEFACT_SIXTEEN);
+
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public ArtifactDescriptor generateArtifactDescriptor(File artifact) {
+        return this.testArtefacts.get(artifact.getName());
+    }
+
+    private String translate(URI uri) {
+        return new File(uri).getName();
+    }
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/StubQuery.java b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/StubQuery.java
new file mode 100644
index 0000000..cfb26bb
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/StubQuery.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.virgo.repository.Query;
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+
+
+/**
+ * Stub impl of Query with util methods to inspect its use.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is Threadsafe
+ * 
+ */
+public class StubQuery implements Query {
+
+    private final Map<String, String> attribFilters = new HashMap<String, String>();
+
+    public Query addFilter(String name, String value) {
+        this.attribFilters.put(name, value);
+        return this;
+    }
+
+    public Query addFilter(String name, String value, Map<String, Set<String>> properties) {
+        this.attribFilters.put(name, value);
+        return this;
+    }
+    
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public Query setVersionRangeFilter(VersionRange versionRange) {
+        throw new UnsupportedOperationException("setVersionRangeFilter not implemented in stub");
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public Query setVersionRangeFilter(VersionRange versionRange, VersionRangeMatchingStrategy strategy) {
+        throw new UnsupportedOperationException("setVersionRangeFilter not implemented in stub");
+    }
+
+    public Set<RepositoryAwareArtifactDescriptor> run() {
+        return Collections.<RepositoryAwareArtifactDescriptor> emptySet();
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/cacheing/CacheingArtifactDescriptorTests.java b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/cacheing/CacheingArtifactDescriptorTests.java
new file mode 100644
index 0000000..756362d
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/cacheing/CacheingArtifactDescriptorTests.java
@@ -0,0 +1,120 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.cacheing;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.isA;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+import org.eclipse.virgo.repository.internal.cacheing.CacheingArtifactDescriptor;
+import org.eclipse.virgo.repository.internal.cacheing.cache.RepositoryCache;
+import org.junit.Before;
+import org.junit.Test;
+
+
+/**
+ */
+public class CacheingArtifactDescriptorTests {
+
+    private CacheingArtifactDescriptor cacheingArtifactDescriptor;
+
+    private RepositoryAwareArtifactDescriptor mockRepositoryAwareArtifactDescriptor;
+
+    private RepositoryCache mockRepositoryCache;
+
+    @Before
+    public void setUp() {
+        this.mockRepositoryAwareArtifactDescriptor = createMock(RepositoryAwareArtifactDescriptor.class);
+        this.mockRepositoryCache = createMock(RepositoryCache.class);
+        this.cacheingArtifactDescriptor = new CacheingArtifactDescriptor(this.mockRepositoryAwareArtifactDescriptor, this.mockRepositoryCache);
+    }
+
+    @Test
+    public void testGetAttribute() {
+        expect(this.mockRepositoryAwareArtifactDescriptor.getAttribute(isA(String.class))).andReturn(null);
+        replay(this.mockRepositoryAwareArtifactDescriptor);
+        this.cacheingArtifactDescriptor.getAttribute("");
+        verify(this.mockRepositoryAwareArtifactDescriptor);
+        
+    }
+
+    @Test
+    public void testGetAttributes() {
+        expect(this.mockRepositoryAwareArtifactDescriptor.getAttributes()).andReturn(null);
+        replay(this.mockRepositoryAwareArtifactDescriptor);
+        this.cacheingArtifactDescriptor.getAttributes();
+        verify(this.mockRepositoryAwareArtifactDescriptor);
+    }
+
+    @Test
+    public void testGetFilename() {
+        expect(this.mockRepositoryAwareArtifactDescriptor.getFilename()).andReturn(null);
+        replay(this.mockRepositoryAwareArtifactDescriptor);
+        this.cacheingArtifactDescriptor.getFilename();
+        verify(this.mockRepositoryAwareArtifactDescriptor);
+    }
+
+    @Test
+    public void testGetName() {
+        expect(this.mockRepositoryAwareArtifactDescriptor.getName()).andReturn(null);
+        replay(this.mockRepositoryAwareArtifactDescriptor);
+        this.cacheingArtifactDescriptor.getName();
+        verify(this.mockRepositoryAwareArtifactDescriptor);
+    }
+
+    @Test
+    public void testGetRepositoryName() {
+        expect(this.mockRepositoryAwareArtifactDescriptor.getRepositoryName()).andReturn(null);
+        replay(this.mockRepositoryAwareArtifactDescriptor);
+        this.cacheingArtifactDescriptor.getRepositoryName();
+        verify(this.mockRepositoryAwareArtifactDescriptor);
+    }
+
+    @Test
+    public void testGetType() {
+        expect(this.mockRepositoryAwareArtifactDescriptor.getType()).andReturn(null);
+        replay(this.mockRepositoryAwareArtifactDescriptor);
+        this.cacheingArtifactDescriptor.getType();
+        verify(this.mockRepositoryAwareArtifactDescriptor);
+    }
+
+    @Test
+    public void testGetUri() {
+        expect(this.mockRepositoryCache.getUri(this.cacheingArtifactDescriptor)).andReturn(null);
+        replay(this.mockRepositoryCache);
+        this.cacheingArtifactDescriptor.getUri();
+        verify(this.mockRepositoryCache);
+    }
+    
+    @Test
+    public void testGetRemoteUri() {
+        expect(this.mockRepositoryAwareArtifactDescriptor.getUri()).andReturn(null);
+        replay(this.mockRepositoryAwareArtifactDescriptor);
+        this.cacheingArtifactDescriptor.getRemoteUri();
+        verify(this.mockRepositoryAwareArtifactDescriptor);
+    }
+
+    /**
+     * Test method for {@link org.eclipse.virgo.repository.internal.cacheing.CacheingArtifactDescriptor#getVersion()}.
+     */
+    @Test
+    public void testGetVersion() {
+        expect(this.mockRepositoryAwareArtifactDescriptor.getVersion()).andReturn(null);
+        replay(this.mockRepositoryAwareArtifactDescriptor);
+        this.cacheingArtifactDescriptor.getVersion();
+        verify(this.mockRepositoryAwareArtifactDescriptor);
+    }
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/cacheing/CacheingQueryTests.java b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/cacheing/CacheingQueryTests.java
new file mode 100644
index 0000000..e6d6217
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/cacheing/CacheingQueryTests.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.cacheing;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.isA;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.*;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.virgo.repository.Query;
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+import org.eclipse.virgo.repository.internal.cacheing.CacheingArtifactDescriptor;
+import org.eclipse.virgo.repository.internal.cacheing.CacheingQuery;
+import org.eclipse.virgo.repository.internal.cacheing.cache.RepositoryCache;
+import org.junit.Before;
+import org.junit.Test;
+
+
+/**
+ */
+public class CacheingQueryTests {
+
+    private URI testURI;
+
+
+    private CacheingQuery cacheingQuery;
+
+    private Query mockQuery;
+
+    private RepositoryCache mockRepositoryCache;
+
+    @Before
+    public void setUp() throws Exception {
+        try {
+            testURI = new URI("some://uri");
+        } catch (URISyntaxException e) {
+            e.printStackTrace();
+        }
+        this.mockQuery = createMock(Query.class);
+        this.mockRepositoryCache = createMock(RepositoryCache.class);
+        this.cacheingQuery = new CacheingQuery(this.mockQuery, this.mockRepositoryCache);
+    }
+
+    @Test
+    public void testAddFilterStringString() {
+        expect(this.mockQuery.addFilter("", "")).andReturn(null);
+        replay(this.mockQuery);
+        this.cacheingQuery.addFilter("", "");
+        verify(this.mockQuery);
+    }
+
+    @Test
+    public void testAddFilterStringStringMapOfStringSetOfString() {
+        expect(this.mockQuery.addFilter("", null)).andReturn(null);
+        replay(this.mockQuery);
+        this.cacheingQuery.addFilter("", null);
+        verify(this.mockQuery);
+    }
+
+    @Test
+    public void testRun() {
+
+        Set<RepositoryAwareArtifactDescriptor> set = new HashSet<RepositoryAwareArtifactDescriptor>();
+        RepositoryAwareArtifactDescriptor raad = createMock(RepositoryAwareArtifactDescriptor.class);
+        set.add(raad);
+        expect(this.mockQuery.run()).andReturn(set);
+        expect(this.mockRepositoryCache.getUri(isA(CacheingArtifactDescriptor.class))).andReturn(testURI);
+        replay(this.mockQuery, this.mockRepositoryCache, raad);
+
+        Set<RepositoryAwareArtifactDescriptor> raadSet = this.cacheingQuery.run();
+        assertEquals(1, raadSet.size());
+        
+        RepositoryAwareArtifactDescriptor craad = raadSet.iterator().next();
+        assertEquals(testURI, craad.getUri());
+
+        verify(this.mockQuery, this.mockRepositoryCache, raad);
+    }
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/cacheing/CacheingRemoteRepositoryTests.java b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/cacheing/CacheingRemoteRepositoryTests.java
new file mode 100644
index 0000000..a365762
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/cacheing/CacheingRemoteRepositoryTests.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.cacheing;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.isA;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.reset;
+import static org.easymock.EasyMock.verify;
+
+import org.junit.After;
+import org.junit.Before;
+
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.repository.configuration.RemoteRepositoryConfiguration;
+import org.eclipse.virgo.repository.internal.cacheing.CacheingRemoteRepository;
+import org.eclipse.virgo.repository.internal.cacheing.cache.RepositoryCache;
+import org.eclipse.virgo.repository.internal.cacheing.cache.RepositoryCacheFactory;
+import org.eclipse.virgo.repository.internal.remote.RemoteRepository;
+import org.eclipse.virgo.repository.internal.remote.RemoteRepositoryTests;
+
+
+/**
+ */
+public class CacheingRemoteRepositoryTests extends RemoteRepositoryTests {
+
+    private RepositoryCacheFactory mockRepositoryCacheFactory;
+
+    private CacheingRemoteRepository cacheingRemoteRepository;
+
+    private RepositoryCache mockRepositoryCache;
+
+    @Before
+    public void setUp() {
+        this.mockRepositoryCacheFactory = createMock(RepositoryCacheFactory.class);
+        this.mockRepositoryCache = createMock(RepositoryCache.class);
+        expect(this.mockRepositoryCacheFactory.createRepositoryCache(isA(CacheingRemoteRepository.class))).andReturn(this.mockRepositoryCache).anyTimes();
+        replay(this.mockRepositoryCacheFactory, this.mockRepositoryCache);
+    }
+
+    @After
+    public void tearDown() {
+        verify(this.mockRepositoryCacheFactory, this.mockRepositoryCache);
+        reset(this.mockRepositoryCacheFactory, this.mockRepositoryCache);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected RemoteRepository createRemoteRepository(RemoteRepositoryConfiguration configuration, EventLogger eventLogger) {
+        this.cacheingRemoteRepository = new CacheingRemoteRepository(configuration, eventLogger, this.mockRepositoryCacheFactory);
+        return this.cacheingRemoteRepository;
+    }
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/cacheing/cache/StandardRepositoryCacheIntegrationTests.java b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/cacheing/cache/StandardRepositoryCacheIntegrationTests.java
new file mode 100644
index 0000000..ab1e9b8
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/cacheing/cache/StandardRepositoryCacheIntegrationTests.java
@@ -0,0 +1,164 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.cacheing.cache;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URI;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Version;
+
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+import org.eclipse.virgo.repository.Attribute;
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+import org.eclipse.virgo.repository.internal.DelegatingRepositoryAwareArtifactDescriptor;
+import org.eclipse.virgo.repository.internal.IdentityUriMapper;
+import org.eclipse.virgo.repository.internal.StandardArtifactDescriptor;
+import org.eclipse.virgo.repository.internal.StandardAttribute;
+import org.eclipse.virgo.repository.internal.cacheing.cache.RepositoryCache;
+import org.eclipse.virgo.repository.internal.cacheing.cache.StandardRepositoryCache;
+import org.eclipse.virgo.repository.internal.cacheing.cache.artifact.StandardSingleArtifactCacheFactory;
+import org.eclipse.virgo.repository.internal.cacheing.cache.descriptorhash.StandardArtifactDescriptorHashFactory;
+import org.eclipse.virgo.repository.util.FileDigest;
+import org.eclipse.virgo.util.io.PathReference;
+
+/**
+ */
+public class StandardRepositoryCacheIntegrationTests {
+
+    private static final String HASH_ATTRIBUTE_NAME = "hash";
+
+    private static final String HASH_ALGORITHM_ATTRIBUTE_NAME = "hash-algorithm";
+
+    private static final String REPO_NAME = "repo";
+
+    private static final File REPOSITORY_CACHE_DIRECTORY = new File("build/repocache");
+
+    private static final File BUNDLE_DIRECTORY = new File("build/cacheing");
+
+    private static final File BUNDLE_FILE = new File("build/cacheing/b.jar");
+
+    private static final String ARTIFACT_TYPE = "bundle";
+
+    private static final String ARTIFACT_NAME = "b";
+
+    private static final Version ARTIFACT_VERSION = Version.parseVersion("3.2.1.ga");
+
+    private URI artifactURI;
+
+    private PathReference b1;
+
+    private PathReference b2;
+
+    private String b2Hash;
+
+    private RepositoryCache repositoryCache;
+
+    private RepositoryAwareArtifactDescriptor artifactDescriptor;
+
+    @Before
+    public void setUp() throws Exception {
+        this.repositoryCache = new StandardRepositoryCache(REPO_NAME, REPOSITORY_CACHE_DIRECTORY, new StandardSingleArtifactCacheFactory(),
+            new StandardArtifactDescriptorHashFactory());
+
+        PathReference bundleDir = new PathReference(new File("src/test/resources/cacheing"));
+        this.b1 = bundleDir.newChild("b.jar");
+        this.b2 = bundleDir.newChild("b2.jar");
+        this.b2Hash = getArtifactHash(this.b2.toURI());
+        BUNDLE_DIRECTORY.mkdir();
+        replaceBundleFile(this.b1);
+
+        this.artifactURI = BUNDLE_FILE.toURI();
+        setUpCacheDirectory();
+
+    }
+
+    private void setUpCacheDirectory() {
+        PathReference cacheDir = new PathReference(REPOSITORY_CACHE_DIRECTORY);
+        cacheDir.delete(true);
+        cacheDir.createDirectory();
+    }
+
+    private void replaceBundleFile(PathReference b) {
+        deleteBundleFile();
+        b.copy(new PathReference(BUNDLE_FILE));
+    }
+
+    private void deleteBundleFile() {
+        BUNDLE_FILE.delete();
+    }
+
+    @Test
+    public void testGetCachedUriRefreshHashInDescriptor() throws IOException {
+        Set<Attribute> attributes = new HashSet<Attribute>();
+        attributes.add(new StandardAttribute(HASH_ALGORITHM_ATTRIBUTE_NAME, FileDigest.SHA_DIGEST_ALGORITHM));
+        attributes.add(new StandardAttribute(HASH_ATTRIBUTE_NAME, this.b2Hash));
+        ArtifactDescriptor delegate = new StandardArtifactDescriptor(this.artifactURI, ARTIFACT_TYPE, ARTIFACT_NAME, ARTIFACT_VERSION,
+            BUNDLE_FILE.getName(), attributes);
+
+        this.artifactDescriptor = new DelegatingRepositoryAwareArtifactDescriptor(delegate, REPO_NAME, new IdentityUriMapper());
+
+        // Prime the cache with the original b.jar. Its hash does not match that of the artifact descriptor.
+        URI cachedUri1 = this.repositoryCache.getUri(this.artifactDescriptor);
+        checkUriInCache(cachedUri1);
+        String hash1 = getArtifactHash(cachedUri1);
+
+        // Get from the cache which causes the cache to be updated with the contents of b2.jar. Its hash matches that of
+        // the artifact descriptor.
+        replaceBundleFile(this.b2);
+        URI cachedUri2 = this.repositoryCache.getUri(this.artifactDescriptor);
+        checkUriInCache(cachedUri2);
+        String hash2 = getArtifactHash(cachedUri2);
+        assertEquals(cachedUri1, cachedUri2);
+        assertFalse(hash1.equals(hash2));
+
+        // Getting from the cache again will not update the cache.
+        deleteBundleFile();
+        URI cachedUri3 = this.repositoryCache.getUri(this.artifactDescriptor);
+        checkUriInCache(cachedUri3);
+        String hash3 = getArtifactHash(cachedUri3);
+        assertEquals(cachedUri1, cachedUri3);
+        assertEquals(hash2, hash3);
+    }
+
+    @Test
+    public void testGetCachedUriRefreshNoHashInDescriptor() {
+        Set<Attribute> attributes = new HashSet<Attribute>();
+        ArtifactDescriptor delegate = new StandardArtifactDescriptor(this.artifactURI, ARTIFACT_TYPE, ARTIFACT_NAME, ARTIFACT_VERSION,
+            BUNDLE_FILE.getName(), attributes);
+
+        this.artifactDescriptor = new DelegatingRepositoryAwareArtifactDescriptor(delegate, REPO_NAME, new IdentityUriMapper());
+
+        // Prime the cache with the original b.jar. Its hash does not match that of the artifact descriptor.
+        URI cachedUri1 = this.repositoryCache.getUri(this.artifactDescriptor);
+        checkUriInCache(cachedUri1);
+    }
+
+    private void checkUriInCache(URI cachedUri) {
+        URI cacheUri = REPOSITORY_CACHE_DIRECTORY.toURI();
+        assertTrue(cachedUri.toString().startsWith(cacheUri.toString()));
+    }
+
+    private String getArtifactHash(URI cachedUri) throws IOException {
+        File cachedArtifact = new File(cachedUri);
+        return FileDigest.getFileShaDigest(cachedArtifact);
+    }
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/cacheing/cache/StandardRepositoryCacheTests.java b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/cacheing/cache/StandardRepositoryCacheTests.java
new file mode 100644
index 0000000..8e1a02c
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/cacheing/cache/StandardRepositoryCacheTests.java
@@ -0,0 +1,152 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.cacheing.cache;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.isA;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.reset;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+
+import java.io.File;
+import java.net.URI;
+import java.net.URISyntaxException;
+
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+import org.eclipse.virgo.repository.internal.cacheing.cache.RepositoryCache;
+import org.eclipse.virgo.repository.internal.cacheing.cache.StandardRepositoryCache;
+import org.eclipse.virgo.repository.internal.cacheing.cache.artifact.SingleArtifactCache;
+import org.eclipse.virgo.repository.internal.cacheing.cache.artifact.SingleArtifactCacheFactory;
+import org.eclipse.virgo.repository.internal.cacheing.cache.descriptorhash.ArtifactDescriptorHash;
+import org.eclipse.virgo.repository.internal.cacheing.cache.descriptorhash.ArtifactDescriptorHashFactory;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Version;
+
+
+/**
+ */
+public class StandardRepositoryCacheTests {
+
+    private URI cachedURI;
+
+    private SingleArtifactCache mockArtifactCache;
+
+    private SingleArtifactCacheFactory mockArtifactCacheFactory;
+
+    private static final String REPO_NAME = "SomeRepo";
+
+    private static final String ARTIFACT_TYPE = "bundle";
+
+    private static final String ARTIFACT_NAME = "b";
+
+    private static final Version ARTIFACT_VERSION = Version.parseVersion("1.2");
+
+    private URI remoteURI;
+
+    private static final String ARTIFACT_FILE_NAME = "b";
+
+    private RepositoryAwareArtifactDescriptor mockRepositoryAwareArtifactDescriptor;
+
+    private ArtifactDescriptorHash mockArtifactDescriptorHash;
+
+    private ArtifactDescriptorHashFactory mockArtifactDescriptorHashFactory;
+
+    private RepositoryCache repositoryCache;
+
+    @Before
+    public void setUp() throws Exception {
+        setUpArtifactCache();
+        setUpArtifactDescriptor();
+        setUpArtifactDescriptorHash();
+        setUpRepositoryCache();
+    }
+
+    private void setUpArtifactCache() throws URISyntaxException {
+        this.mockArtifactCache = createMock(SingleArtifactCache.class);
+
+        this.cachedURI = new URI("file://cached");
+
+        this.mockArtifactCacheFactory = createMock(SingleArtifactCacheFactory.class);
+        expect(this.mockArtifactCacheFactory.getArtifactCache(isA(RepositoryAwareArtifactDescriptor.class), isA(File.class))).andReturn(
+            this.mockArtifactCache).anyTimes();
+    }
+
+    private void setUpArtifactDescriptor() throws URISyntaxException {
+        this.mockRepositoryAwareArtifactDescriptor = createMock(RepositoryAwareArtifactDescriptor.class);
+
+        expect(this.mockRepositoryAwareArtifactDescriptor.getRepositoryName()).andReturn(REPO_NAME).anyTimes();
+
+        expect(this.mockRepositoryAwareArtifactDescriptor.getType()).andReturn(ARTIFACT_TYPE).anyTimes();
+
+        expect(this.mockRepositoryAwareArtifactDescriptor.getName()).andReturn(ARTIFACT_NAME).anyTimes();
+
+        expect(this.mockRepositoryAwareArtifactDescriptor.getVersion()).andReturn(ARTIFACT_VERSION).anyTimes();
+
+        expect(this.mockRepositoryAwareArtifactDescriptor.getFilename()).andReturn(ARTIFACT_FILE_NAME).anyTimes();
+
+        this.remoteURI = new URI("http://remote");
+        expect(this.mockRepositoryAwareArtifactDescriptor.getUri()).andReturn(this.remoteURI).anyTimes();
+    }
+
+    private void setUpArtifactDescriptorHash() {
+        this.mockArtifactDescriptorHash = createMock(ArtifactDescriptorHash.class);
+
+        this.mockArtifactDescriptorHashFactory = createMock(ArtifactDescriptorHashFactory.class);
+        expect(this.mockArtifactDescriptorHashFactory.createArtifactDescriptorHash(this.mockRepositoryAwareArtifactDescriptor)).andReturn(
+            this.mockArtifactDescriptorHash);
+    }
+
+    private void setUpRepositoryCache() {
+        this.repositoryCache = new StandardRepositoryCache(REPO_NAME, new File("build"), this.mockArtifactCacheFactory,
+            this.mockArtifactDescriptorHashFactory);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        verifyMocks();
+        resetMocks();
+    }
+
+    @Test
+    public void testGetUriNoHashInDescriptor() {
+        expect(this.mockArtifactCache.getCachedUri(this.mockArtifactDescriptorHash)).andReturn(this.cachedURI);
+        replayMocks();
+        assertEquals(this.cachedURI, this.repositoryCache.getUri(this.mockRepositoryAwareArtifactDescriptor));
+    }
+
+    @Test
+    public void testGetUriHashInDescriptorArtifactCached() {
+        expect(this.mockArtifactCache.getCachedUri(this.mockArtifactDescriptorHash)).andReturn(this.cachedURI);
+        replayMocks();
+        assertEquals(this.cachedURI, this.repositoryCache.getUri(this.mockRepositoryAwareArtifactDescriptor));
+    }
+
+    private void replayMocks() {
+        replay(this.mockArtifactCache, this.mockArtifactCacheFactory, this.mockArtifactDescriptorHashFactory, this.mockArtifactDescriptorHash,
+            this.mockRepositoryAwareArtifactDescriptor);
+    }
+
+    private void verifyMocks() {
+        verify(this.mockArtifactCache, this.mockArtifactCacheFactory, this.mockArtifactDescriptorHashFactory, this.mockArtifactDescriptorHash,
+            this.mockRepositoryAwareArtifactDescriptor);
+    }
+
+    private void resetMocks() {
+        reset(this.mockArtifactCache, this.mockArtifactCacheFactory, this.mockArtifactDescriptorHashFactory, this.mockArtifactDescriptorHash,
+            this.mockRepositoryAwareArtifactDescriptor);
+    }
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/cacheing/cache/artifact/DownloaderTests.java b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/cacheing/cache/artifact/DownloaderTests.java
new file mode 100644
index 0000000..3bbce86
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/cacheing/cache/artifact/DownloaderTests.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.cacheing.cache.artifact;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import java.net.URI;
+import java.net.URISyntaxException;
+
+import org.eclipse.virgo.util.io.PathReference;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ */
+public class DownloaderTests {
+
+    private PathReference destinationDirectory;
+
+    @Before
+    public void setUp() throws Exception {
+        this.destinationDirectory = new PathReference("build/downloaderTests");
+        this.destinationDirectory.delete(true);
+        this.destinationDirectory.createDirectory();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+    }
+
+    @Test
+    public void testSuccessfulDownload() throws IOException {
+        File sourceFile = new File("src/test/resources/cacheing/b.jar");
+        PathReference destinationPathReference = this.destinationDirectory.newChild("b.jar");
+
+        ensureOldContentPresent(destinationPathReference);
+
+        Downloader downloader = new Downloader(sourceFile.toURI(), destinationPathReference);
+        downloader.downloadArtifact();
+
+        checkDownloadedContent(sourceFile, destinationPathReference);
+    }
+
+    private void ensureOldContentPresent(PathReference destinationPathReference) throws IOException {
+        destinationPathReference.createFile();
+        File destinationFile = destinationPathReference.toFile();
+        try (Writer fileWriter = new OutputStreamWriter(new FileOutputStream(destinationFile), UTF_8)) {
+            fileWriter.write("old content");
+        }
+    }
+
+    private void checkDownloadedContent(File sourceFile, PathReference destinationPathReference) throws IOException {
+        PathReference sourcePathReference = new PathReference(sourceFile);
+        String sourceContents = sourcePathReference.fileContents();
+        String destinationContents = destinationPathReference.fileContents();
+        Assert.assertEquals(sourceContents, destinationContents);
+    }
+
+    @Test
+    public void testNonExistenceSourceFile() throws IOException {
+        File badSourceFile = new File("src/test/resources/cacheing/nosuchfile");
+        PathReference destinationPathReference = this.destinationDirectory.newChild("b.jar");
+        
+        ensureOldContentPresent(destinationPathReference);
+        
+        Assert.assertTrue(destinationPathReference.exists());
+
+        Downloader downloader = new Downloader(badSourceFile.toURI(), destinationPathReference);
+        downloader.downloadArtifact();
+        
+        // Check the old destination file has been deleted.
+        Assert.assertFalse(destinationPathReference.exists());
+    }
+    
+    @Test
+    public void testBadSourceUri() throws URISyntaxException, IOException {
+        PathReference destinationPathReference = this.destinationDirectory.newChild("b.jar");
+        
+        ensureOldContentPresent(destinationPathReference);
+        
+        Assert.assertTrue(destinationPathReference.exists());
+
+        Downloader downloader = new Downloader(new URI("x:y"), destinationPathReference);
+        downloader.downloadArtifact();
+        
+        // Check the old destination file has been deleted.
+        Assert.assertFalse(destinationPathReference.exists());
+    }
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/cacheing/cache/artifact/StandardArtifactCacheTests.java b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/cacheing/cache/artifact/StandardArtifactCacheTests.java
new file mode 100644
index 0000000..6d2a339
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/cacheing/cache/artifact/StandardArtifactCacheTests.java
@@ -0,0 +1,181 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.cacheing.cache.artifact;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.eq;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.isA;
+import static org.easymock.EasyMock.not;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.reset;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URI;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Version;
+
+import org.eclipse.virgo.repository.internal.cacheing.cache.artifact.SingleArtifactCache;
+import org.eclipse.virgo.repository.internal.cacheing.cache.artifact.StandardSingleArtifactCache;
+import org.eclipse.virgo.repository.internal.cacheing.cache.descriptorhash.ArtifactDescriptorHash;
+import org.eclipse.virgo.repository.util.FileDigest;
+import org.eclipse.virgo.util.io.PathReference;
+
+/**
+ */
+public class StandardArtifactCacheTests {
+
+    private static final File REPOSITORY_CACHE_DIRECTORY = new File("build/cache");
+
+    private static final File BUNDLE_DIRECTORY = new File("build/cacheing");
+
+    private static final File BUNDLE_FILE = new File("build/cacheing/b.jar");
+
+    private static final String ARTIFACT_TYPE = "bundle";
+
+    private static final String ARTIFACT_NAME = "b";
+
+    private static final Version ARTIFACT_VERSION = Version.parseVersion("3.2.1.ga");
+
+    private URI artifactURI;
+
+    private SingleArtifactCache artifactCache;
+
+    private ArtifactDescriptorHash mockArtifactDescriptorHash;
+
+    private PathReference b1;
+
+    private PathReference b2;
+
+    private String b2Hash;
+
+    @Before
+    public void setUp() throws Exception {
+        PathReference bundleDir = new PathReference(new File("src/test/resources/cacheing"));
+        b1 = bundleDir.newChild("b.jar");
+        b2 = bundleDir.newChild("b2.jar");
+        b2Hash = getArtifactHash(b2.toURI());
+        BUNDLE_DIRECTORY.mkdir();
+        replaceBundleFile(b1);
+
+        this.artifactURI = BUNDLE_FILE.toURI();
+        setUpCacheDirectory();
+        this.artifactCache = new StandardSingleArtifactCache(ARTIFACT_TYPE, ARTIFACT_NAME, ARTIFACT_VERSION, this.artifactURI, BUNDLE_FILE.getName(),
+            REPOSITORY_CACHE_DIRECTORY);
+        this.mockArtifactDescriptorHash = createMock(ArtifactDescriptorHash.class);
+    }
+
+    private void replaceBundleFile(PathReference b) {
+        deleteBundleFileIfExistent();
+        b.copy(new PathReference(BUNDLE_FILE));
+    }
+
+    private void deleteBundleFileIfExistent() {
+        if (BUNDLE_FILE.exists()) {
+            boolean delete = BUNDLE_FILE.delete();
+            assertTrue("Bundle file was not deleted", delete);
+        }
+    }
+
+    private void setUpCacheDirectory() {
+        PathReference cacheDir = new PathReference(REPOSITORY_CACHE_DIRECTORY);
+        cacheDir.delete(true);
+        cacheDir.createDirectory();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        verify(this.mockArtifactDescriptorHash);
+        reset(this.mockArtifactDescriptorHash);
+    }
+
+    @Test
+    public void testGetCachedUriNoHashInDescriptor() {
+        expect(this.mockArtifactDescriptorHash.isPresent()).andReturn(false).anyTimes();
+        expect(this.mockArtifactDescriptorHash.matches(isA(String.class))).andReturn(false).anyTimes();
+        expect(this.mockArtifactDescriptorHash.getDigestAlgorithm()).andReturn(FileDigest.SHA_DIGEST_ALGORITHM).anyTimes();
+        replay(this.mockArtifactDescriptorHash);
+        URI cachedUri1 = this.artifactCache.getCachedUri(this.mockArtifactDescriptorHash);
+        checkUriInCache(cachedUri1);
+    }
+
+    @Test
+    public void testGetCachedUriRefreshNoHashInDescriptor() throws IOException {
+        expect(this.mockArtifactDescriptorHash.isPresent()).andReturn(false).anyTimes();
+        expect(this.mockArtifactDescriptorHash.matches(isA(String.class))).andReturn(false).anyTimes();
+        expect(this.mockArtifactDescriptorHash.getDigestAlgorithm()).andReturn(FileDigest.SHA_DIGEST_ALGORITHM).anyTimes();
+        replay(this.mockArtifactDescriptorHash);
+
+        // Prime the cache.
+        URI cachedUri1 = this.artifactCache.getCachedUri(this.mockArtifactDescriptorHash);
+        checkUriInCache(cachedUri1);
+        String hash1 = getArtifactHash(cachedUri1);
+
+        // Get from the cache which causes the cache to be updated.
+        replaceBundleFile(b2);
+        URI cachedUri2 = this.artifactCache.getCachedUri(this.mockArtifactDescriptorHash);
+        checkUriInCache(cachedUri2);
+        String hash2 = getArtifactHash(cachedUri2);
+        assertEquals(cachedUri1, cachedUri2);
+        assertFalse((hash1.equals(hash2)));
+    }
+
+    @Test
+    public void testGetCachedUriRefreshHashInDescriptor() throws IOException {
+        expect(this.mockArtifactDescriptorHash.isPresent()).andReturn(true).anyTimes();
+        expect(this.mockArtifactDescriptorHash.matches(not(eq(this.b2Hash)))).andReturn(false).anyTimes();
+        expect(this.mockArtifactDescriptorHash.matches(eq(this.b2Hash))).andReturn(true).anyTimes();
+        expect(this.mockArtifactDescriptorHash.getDigestAlgorithm()).andReturn(FileDigest.SHA_DIGEST_ALGORITHM).anyTimes();
+        replay(this.mockArtifactDescriptorHash);
+
+        // Prime the cache with the original b.jar. Its hash does not match that of the artifact descriptor.
+        URI cachedUri1 = this.artifactCache.getCachedUri(this.mockArtifactDescriptorHash);
+        checkUriInCache(cachedUri1);
+        String hash1 = getArtifactHash(cachedUri1);
+
+        // Get from the cache which causes the cache to be updated with the contents of b2.jar. Its hash matches that of
+        // the artifact descriptor.
+        replaceBundleFile(b2);
+        URI cachedUri2 = this.artifactCache.getCachedUri(this.mockArtifactDescriptorHash);
+        checkUriInCache(cachedUri2);
+        String hash2 = getArtifactHash(cachedUri2);
+        assertEquals(cachedUri1, cachedUri2);
+        assertFalse((hash1.equals(hash2)));
+
+        // Getting from the cache again will not update the cache.
+        deleteBundleFileIfExistent();
+        URI cachedUri3 = this.artifactCache.getCachedUri(this.mockArtifactDescriptorHash);
+        checkUriInCache(cachedUri3);
+        String hash3 = getArtifactHash(cachedUri3);
+        assertEquals(cachedUri1, cachedUri3);
+        assertEquals(hash2, hash3);
+    }
+
+    private void checkUriInCache(URI cachedUri) {
+        URI cacheUri = REPOSITORY_CACHE_DIRECTORY.toURI();
+        assertTrue(cachedUri.toString().startsWith(cacheUri.toString()));
+    }
+
+    private String getArtifactHash(URI cachedUri) throws IOException {
+        File cachedArtifact = new File(cachedUri);
+        return FileDigest.getFileShaDigest(cachedArtifact);
+    }
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/cacheing/cache/descriptorhash/StandardArtifactDescriptorHashTests.java b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/cacheing/cache/descriptorhash/StandardArtifactDescriptorHashTests.java
new file mode 100644
index 0000000..dd1eca8
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/cacheing/cache/descriptorhash/StandardArtifactDescriptorHashTests.java
@@ -0,0 +1,186 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.cacheing.cache.descriptorhash;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.eq;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.reset;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.virgo.repository.Attribute;
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+import org.eclipse.virgo.repository.internal.StandardAttribute;
+import org.eclipse.virgo.repository.internal.cacheing.cache.descriptorhash.StandardArtifactDescriptorHash;
+import org.eclipse.virgo.repository.util.FileDigest;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+
+/**
+ */
+public class StandardArtifactDescriptorHashTests {
+
+    private static final String HASH_1 = "hash 1";
+    
+    private static final String HASH_2 = "hash 2";
+
+    private static final String HASH_ATTRIBUTE_NAME = "hash";
+    
+    private static final String NON_HASH_ATTRIBUTE_NAME = "name";
+    
+    private static final String NON_HASH_ATTRIBUTE_VALUE = "value";
+    
+    private static final String HASH_ALGORITHM_ATTRIBUTE_NAME = "hash-algorithm";
+
+    private RepositoryAwareArtifactDescriptor mockRepositoryAwareArtifactDescriptor;
+
+    private StandardArtifactDescriptorHash artifactDescriptorHash;
+
+    private Set<Attribute> hashAttributeSet;
+    
+    private Set<Attribute> algorithmAttributeSet;
+
+    @Before
+    public void setUp() throws Exception {
+        setUpArtifactDescriptor();
+    }
+
+    private void setUpArtifactDescriptor() {
+        this.hashAttributeSet = new HashSet<Attribute>();
+        this.algorithmAttributeSet = new HashSet<Attribute>();
+        this.mockRepositoryAwareArtifactDescriptor = createMock(RepositoryAwareArtifactDescriptor.class);
+        expect(this.mockRepositoryAwareArtifactDescriptor.getAttribute(eq(HASH_ATTRIBUTE_NAME))).andReturn(this.hashAttributeSet).anyTimes();
+        expect(this.mockRepositoryAwareArtifactDescriptor.getAttribute(eq(HASH_ALGORITHM_ATTRIBUTE_NAME))).andReturn(this.algorithmAttributeSet).anyTimes();
+    }
+
+    private void setUpArtifactDescriptorHash() {
+        this.artifactDescriptorHash = new StandardArtifactDescriptorHash(this.mockRepositoryAwareArtifactDescriptor);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        verifyMocks();
+        resetMocks();
+    }
+
+    @Test
+    public void testIsPresentEmptyAttributeSet() {
+        replayMocks();
+        setUpArtifactDescriptorHash();
+
+        assertFalse(this.artifactDescriptorHash.isPresent());
+    }
+
+    @Test
+    public void testIsPresentNonHashAttribute() {
+        Attribute nonHashAttribute = new StandardAttribute(NON_HASH_ATTRIBUTE_NAME, NON_HASH_ATTRIBUTE_VALUE);
+        this.hashAttributeSet.add(nonHashAttribute);
+        replayMocks();
+        setUpArtifactDescriptorHash();
+
+        assertFalse(this.artifactDescriptorHash.isPresent());
+    }
+    
+    @Test
+    public void testIsPresentUnreasonableHashAttribute() {
+        Attribute hashAttribute = new StandardAttribute(HASH_ATTRIBUTE_NAME, "");
+        this.hashAttributeSet.add(hashAttribute);
+        replayMocks();
+        setUpArtifactDescriptorHash();
+
+        assertFalse(this.artifactDescriptorHash.isPresent());
+    }
+    
+    @Test
+    public void testIsPresentReasonableHashAttribute() {
+        Attribute hashAttribute = new StandardAttribute(HASH_ATTRIBUTE_NAME, HASH_1);
+        this.hashAttributeSet.add(hashAttribute);
+        replayMocks();
+        setUpArtifactDescriptorHash();
+
+        assertTrue(this.artifactDescriptorHash.isPresent());
+    }
+
+    @Test
+    public void testIsPresentMultipleHashAttributes() {
+        Attribute hashAttribute = new StandardAttribute(HASH_ATTRIBUTE_NAME, HASH_1);
+        this.hashAttributeSet.add(hashAttribute);
+        Attribute extraHashAttribute = new StandardAttribute(HASH_ATTRIBUTE_NAME, HASH_2);
+        this.hashAttributeSet.add(extraHashAttribute);
+        replayMocks();
+        setUpArtifactDescriptorHash();
+
+        assertTrue(this.artifactDescriptorHash.isPresent());
+    }
+    
+    @Test
+    public void testGetDigestAlgorithm() {
+        Attribute algorithmAttribute = new StandardAttribute(HASH_ALGORITHM_ATTRIBUTE_NAME, FileDigest.MD5_DIGEST_ALGORITHM);
+        this.algorithmAttributeSet.add(algorithmAttribute);
+        replayMocks();
+        setUpArtifactDescriptorHash();
+
+        assertEquals(FileDigest.MD5_DIGEST_ALGORITHM, this.artifactDescriptorHash.getDigestAlgorithm());
+    }
+
+    @Test
+    public void testMatchesNotPresent() {
+        replayMocks();
+        setUpArtifactDescriptorHash();
+
+        assertFalse(this.artifactDescriptorHash.matches(HASH_1));
+    }
+    
+    @Test
+    public void testMatchesPresentMatches() {
+        Attribute hashAttribute = new StandardAttribute(HASH_ATTRIBUTE_NAME, HASH_1);
+        this.hashAttributeSet.add(hashAttribute);
+        replayMocks();
+        setUpArtifactDescriptorHash();
+
+        assertTrue(this.artifactDescriptorHash.matches(HASH_1));
+    }
+    
+    @Test
+    public void testMatchesPresentNoMatch() {
+        Attribute hashAttribute = new StandardAttribute(HASH_ATTRIBUTE_NAME, HASH_1);
+        this.hashAttributeSet.add(hashAttribute);
+        replayMocks();
+        setUpArtifactDescriptorHash();
+
+        assertFalse(this.artifactDescriptorHash.matches(HASH_2));
+    }
+
+
+
+    private void replayMocks() {
+        replay(this.mockRepositoryAwareArtifactDescriptor);
+    }
+
+    private void verifyMocks() {
+        verify(this.mockRepositoryAwareArtifactDescriptor);
+    }
+
+    private void resetMocks() {
+        reset(this.mockRepositoryAwareArtifactDescriptor);
+    }
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/chain/ChainedQueryTests.java b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/chain/ChainedQueryTests.java
new file mode 100644
index 0000000..236cb9f
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/chain/ChainedQueryTests.java
@@ -0,0 +1,152 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.chain;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.virgo.repository.Query;
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+import org.eclipse.virgo.repository.internal.chain.ChainedQuery;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ChainedQueryTests {
+
+    private Query query1;
+
+    private Query query2;
+
+    private Query query3;
+
+    private ChainedQuery chainedQuery;
+
+    @Before
+    public void setup() {
+        query1 = createMock(Query.class);
+        query2 = createMock(Query.class);
+        query3 = createMock(Query.class);
+
+        chainedQuery = new ChainedQuery(Arrays.asList(query1, query2, query3));
+    }
+
+    @Test
+    public void filterAddition() {
+
+        String name = "name";
+        String value = "value";
+
+        expect(query1.addFilter(name, value)).andReturn(query1);
+        expect(query2.addFilter(name, value)).andReturn(query2);
+        expect(query3.addFilter(name, value)).andReturn(query3);
+
+        replay(query1, query2, query3);
+
+        chainedQuery.addFilter(name, value);
+
+        verify(query1, query2, query3);
+    }
+
+    @Test
+    public void filterWithPropertiesAddition() {
+
+        String name = "name";
+        String value = "value";
+        Map<String, Set<String>> properties = new HashMap<String, Set<String>>();
+
+        expect(query1.addFilter(name, value, properties)).andReturn(query1);
+        expect(query2.addFilter(name, value, properties)).andReturn(query2);
+        expect(query3.addFilter(name, value, properties)).andReturn(query3);
+
+        replay(query1, query2, query3);
+
+        chainedQuery.addFilter(name, value, properties);
+
+        verify(query1, query2, query3);
+    }
+
+    @Test
+    public void runWithNoResult() {
+        expect(query1.run()).andReturn(new HashSet<RepositoryAwareArtifactDescriptor>());
+        expect(query2.run()).andReturn(new HashSet<RepositoryAwareArtifactDescriptor>());
+        expect(query3.run()).andReturn(new HashSet<RepositoryAwareArtifactDescriptor>());
+
+        replay(query1, query2, query3);
+
+        assertEquals(0, chainedQuery.run().size());
+
+        verify(query1, query2, query3);
+    }
+
+    @Test
+    public void runWithResult() {
+        RepositoryAwareArtifactDescriptor artefact1 = createMock(RepositoryAwareArtifactDescriptor.class);
+        RepositoryAwareArtifactDescriptor artefact2 = createMock(RepositoryAwareArtifactDescriptor.class);
+        RepositoryAwareArtifactDescriptor artefact3 = createMock(RepositoryAwareArtifactDescriptor.class);
+
+        expect(query1.run()).andReturn(new HashSet<RepositoryAwareArtifactDescriptor>(Arrays.asList(artefact1)));
+        expect(query2.run()).andReturn(new HashSet<RepositoryAwareArtifactDescriptor>(Arrays.asList(artefact2)));
+        expect(query3.run()).andReturn(new HashSet<RepositoryAwareArtifactDescriptor>(Arrays.asList(artefact3)));
+
+        replay(query1, query2, query3);
+
+        Set<RepositoryAwareArtifactDescriptor> result = chainedQuery.run();
+        verify(query1, query2, query3);
+
+        assertEquals(3, result.size());
+        Iterator<RepositoryAwareArtifactDescriptor> artefacts = result.iterator();
+        assertEquals(artefacts.next(), artefact1);
+        assertEquals(artefacts.next(), artefact2);
+        assertEquals(artefacts.next(), artefact3);
+    }
+
+    @Test
+    public void setVersionRangeFilter() {
+        final VersionRange versionRange = VersionRange.naturalNumberRange();
+
+        expect(query1.setVersionRangeFilter(versionRange)).andReturn(query1);
+        expect(query2.setVersionRangeFilter(versionRange)).andReturn(query2);
+        expect(query3.setVersionRangeFilter(versionRange)).andReturn(query3);
+
+        replay(query1, query2, query3);
+
+        chainedQuery.setVersionRangeFilter(versionRange);
+
+        verify(query1, query2, query3);
+    }
+
+    @Test
+    public void setVersionRangeFilterWithStrategy() {
+        final VersionRange versionRange = VersionRange.naturalNumberRange();
+
+        expect(query1.setVersionRangeFilter(versionRange, Query.VersionRangeMatchingStrategy.HIGHEST)).andReturn(query1);
+        expect(query2.setVersionRangeFilter(versionRange, Query.VersionRangeMatchingStrategy.HIGHEST)).andReturn(query2);
+        expect(query3.setVersionRangeFilter(versionRange, Query.VersionRangeMatchingStrategy.HIGHEST)).andReturn(query3);
+
+        replay(query1, query2, query3);
+
+        chainedQuery.setVersionRangeFilter(versionRange, Query.VersionRangeMatchingStrategy.HIGHEST);
+
+        verify(query1, query2, query3);
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/chain/ChainedRepositoryTests.java b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/chain/ChainedRepositoryTests.java
new file mode 100644
index 0000000..f292650
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/chain/ChainedRepositoryTests.java
@@ -0,0 +1,138 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.chain;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Version;
+
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+import org.eclipse.virgo.repository.Query;
+import org.eclipse.virgo.repository.Repository;
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+import org.eclipse.virgo.repository.internal.chain.ChainedRepository;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+
+public class ChainedRepositoryTests {
+
+    private Repository repository1;
+
+    private Repository repository2;
+
+    private Repository repository3;
+
+    private Repository chain;
+
+    @Before
+    public void setup() {
+        this.repository1 = createMock(Repository.class);
+        this.repository2 = createMock(Repository.class);
+        this.repository3 = createMock(Repository.class);
+
+        /*
+         * expect(this.repository1.getName()).andReturn("one"); expect(this.repository2.getName()).andReturn("two");
+         * expect(this.repository3.getName()).andReturn("three");
+         */
+    }
+
+    @Test
+    public void repositoryName() {
+        replay(this.repository1, this.repository2, this.repository3);
+        this.chain = new ChainedRepository("chainName", Arrays.asList(this.repository1, this.repository2, this.repository3));
+        assertEquals("chainName", this.chain.getName());
+        verify(this.repository1, this.repository2, this.repository3);
+    }
+
+    @Test
+    public void createQuery() {
+
+        String key = "key";
+        String value = "value";
+
+        Query query1 = createMock(Query.class);
+        Query query2 = createMock(Query.class);
+        Query query3 = createMock(Query.class);
+
+        expect(this.repository1.createQuery(key, value)).andReturn(query1);
+        expect(this.repository2.createQuery(key, value)).andReturn(query2);
+        expect(this.repository3.createQuery(key, value)).andReturn(query3);
+
+        replay(this.repository1, this.repository2, this.repository3);
+
+        this.chain = new ChainedRepository("chainName", Arrays.asList(this.repository1, this.repository2, this.repository3));
+
+        this.chain.createQuery(key, value);
+
+        verify(this.repository1, this.repository2, this.repository3);
+    }
+
+    @Test
+    public void createQueryWithProperties() {
+
+        String key = "key";
+        String value = "value";
+        Map<String, Set<String>> properties = new HashMap<String, Set<String>>();
+
+        Query query1 = createMock(Query.class);
+        Query query2 = createMock(Query.class);
+        Query query3 = createMock(Query.class);
+
+        expect(this.repository1.createQuery(key, value, properties)).andReturn(query1);
+        expect(this.repository2.createQuery(key, value, properties)).andReturn(query2);
+        expect(this.repository3.createQuery(key, value, properties)).andReturn(query3);
+
+        replay(this.repository1, this.repository2, this.repository3);
+
+        this.chain = new ChainedRepository("chainName", Arrays.asList(this.repository1, this.repository2, this.repository3));
+
+        this.chain.createQuery(key, value, properties);
+
+        verify(this.repository1, this.repository2, this.repository3);
+    }
+
+    @Test
+    public void get() {
+        VersionRange versionRange = new VersionRange("[1.0.0,2.0.0)");
+
+        RepositoryAwareArtifactDescriptor artefact1 = createMock(RepositoryAwareArtifactDescriptor.class);
+        RepositoryAwareArtifactDescriptor artefact2 = createMock(RepositoryAwareArtifactDescriptor.class);
+
+        expect(this.repository1.get("name", "type", versionRange)).andReturn(artefact1);
+        expect(this.repository2.get("name", "type", versionRange)).andReturn(null);
+        expect(this.repository3.get("name", "type", versionRange)).andReturn(artefact2);
+
+        expect(artefact1.getVersion()).andReturn(new Version("1.8.4")).anyTimes();
+        expect(artefact2.getVersion()).andReturn(new Version("1.0.3")).anyTimes();
+
+        replay(this.repository1, this.repository2, this.repository3, artefact1, artefact2);
+
+        this.chain = new ChainedRepository("chainName", Arrays.asList(this.repository1, this.repository2, this.repository3));
+
+        ArtifactDescriptor artefact = this.chain.get("name", "type", versionRange);
+        assertNotNull(artefact);
+        assertEquals(artefact, artefact1);
+
+        verify(this.repository1, this.repository2, this.repository3, artefact1, artefact2);
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/chain/ComparableArtifactDescriptorTests.java b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/chain/ComparableArtifactDescriptorTests.java
new file mode 100644
index 0000000..be539dd
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/chain/ComparableArtifactDescriptorTests.java
@@ -0,0 +1,99 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.chain;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+
+import java.net.URI;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.virgo.repository.Attribute;
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+import org.eclipse.virgo.repository.internal.chain.ChainedQuery;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Version;
+
+
+public class ComparableArtifactDescriptorTests {
+
+    private RepositoryAwareArtifactDescriptor artefact;
+
+    private RepositoryAwareArtifactDescriptor comparableArtefact;
+
+    @Before
+    public void setup() {
+        this.artefact = createMock(RepositoryAwareArtifactDescriptor.class);
+        this.comparableArtefact = new ChainedQuery.ComparableArtifactDescriptor(0, artefact);
+    }
+
+    @Test
+    public void getAttributesByName() {
+        Set<Attribute> attributeSet = new HashSet<Attribute>();
+        String name = "name";
+        expect(this.artefact.getAttribute("name")).andReturn(attributeSet);
+        replay(this.artefact);
+        assertEquals(attributeSet, this.comparableArtefact.getAttribute(name));
+        verify(this.artefact);
+    }
+
+    @Test
+    public void getAttributes() {
+        Set<Attribute> attributeSet = new HashSet<Attribute>();
+        expect(this.artefact.getAttributes()).andReturn(attributeSet);
+        replay(this.artefact);
+        assertEquals(attributeSet, this.comparableArtefact.getAttributes());
+        verify(this.artefact);
+    }
+
+    @Test
+    public void getType() {
+        String type = "type";
+        expect(this.artefact.getType()).andReturn(type);
+        replay(this.artefact);
+        assertEquals(type, this.comparableArtefact.getType());
+        verify(this.artefact);
+    }
+
+    @Test
+    public void getName() {
+        String name = "name";
+        expect(this.artefact.getName()).andReturn(name);
+        replay(this.artefact);
+        assertEquals(name, this.comparableArtefact.getName());
+        verify(this.artefact);
+    }
+
+    @Test
+    public void getUri() {
+        URI uri = URI.create("artefact://foo");
+        expect(this.artefact.getUri()).andReturn(uri);
+        replay(this.artefact);
+        assertEquals(uri, this.comparableArtefact.getUri());
+        verify(this.artefact);
+    }
+
+    @Test
+    public void getVersion() {
+        Version version = new Version("1.2.3");
+        expect(this.artefact.getVersion()).andReturn(version);
+        replay(this.artefact);
+        assertEquals(version, this.comparableArtefact.getVersion());
+        verify(this.artefact);
+    }
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/eventlog/DynamicDelegationEventLoggerTests.java b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/eventlog/DynamicDelegationEventLoggerTests.java
new file mode 100644
index 0000000..cd8f581
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/eventlog/DynamicDelegationEventLoggerTests.java
@@ -0,0 +1,97 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.eventlog;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+import org.osgi.framework.ServiceRegistration;
+
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.medic.eventlog.Level;
+import org.eclipse.virgo.medic.eventlog.LogEvent;
+import org.eclipse.virgo.medic.test.eventlog.MockEventLogger;
+import org.eclipse.virgo.repository.internal.eventlog.DynamicDelegationEventLogger;
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+import org.eclipse.virgo.test.stubs.support.ObjectClassFilter;
+
+
+/** 
+ */
+public class DynamicDelegationEventLoggerTests {
+    
+	@Test
+    public void dynamicDelegation() throws Exception {
+        StubBundleContext bundleContext = new StubBundleContext();
+        bundleContext.addFilter(new ObjectClassFilter(EventLogger.class));
+        
+        DynamicDelegationEventLogger delegatingEventLogger = new DynamicDelegationEventLogger(bundleContext);
+        delegatingEventLogger.start();
+        
+        MockEventLogger eventLogger1 = new MockEventLogger();
+		ServiceRegistration<EventLogger> registration1 = bundleContext
+				.registerService(EventLogger.class, eventLogger1,
+						null);
+        
+        MockEventLogger eventLogger2 = new MockEventLogger();
+        ServiceRegistration<EventLogger> registration2 = bundleContext.registerService(EventLogger.class, eventLogger2, null);
+        
+        delegatingEventLogger.log("code1a", Level.INFO);
+        delegatingEventLogger.log("code1b", Level.INFO, new Exception());
+        delegatingEventLogger.log(new StubLogEvent("code1c", Level.INFO));
+        delegatingEventLogger.log(new StubLogEvent("code1d", Level.INFO), new Exception());
+        
+        assertTrue(eventLogger1.isLogged("code1a", "code1b", "code1c", "code1d"));
+        assertTrue(eventLogger2.isLogged("code1a", "code1b", "code1c", "code1d"));
+        
+        registration1.unregister();
+        
+        eventLogger1.reinitialise();
+        eventLogger2.reinitialise();
+        
+        delegatingEventLogger.log("code2", Level.INFO);
+        assertFalse(eventLogger1.isLogged("code2"));
+        assertTrue(eventLogger2.isLogged("code2"));
+        
+        registration2.unregister();
+        
+        eventLogger1.reinitialise();
+        eventLogger2.reinitialise();
+        
+        delegatingEventLogger.log("code3", Level.INFO);
+        assertFalse(eventLogger1.isLogged("code3"));
+        assertFalse(eventLogger2.isLogged("code3"));
+       
+        delegatingEventLogger.stop();
+    }
+    
+    private static final class StubLogEvent implements LogEvent {
+        
+        private final String eventCode;
+        
+        private final Level level;
+                        
+        private StubLogEvent(String eventCode, Level level) {
+            this.eventCode = eventCode;
+            this.level = level;
+        }
+
+        public String getEventCode() {
+            return eventCode;
+        }
+        
+        public Level getLevel() {
+            return level;
+        }
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/external/AntPathMatcherTests.java b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/external/AntPathMatcherTests.java
new file mode 100644
index 0000000..d4926bb
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/external/AntPathMatcherTests.java
@@ -0,0 +1,267 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.external;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.eclipse.virgo.repository.internal.external.AntPathMatcher;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ */
+public class AntPathMatcherTests {
+
+	private AntPathMatcher pathMatcher;
+
+	@Before
+	public void createMatcher() {
+		pathMatcher = new AntPathMatcher();
+	}
+
+	@Test
+	public void standard() {
+		// test exact matching
+		assertTrue(pathMatcher.match("test", "test"));
+		assertTrue(pathMatcher.match("/test", "/test"));
+		assertFalse(pathMatcher.match("/test.jpg", "test.jpg"));
+		assertFalse(pathMatcher.match("test", "/test"));
+		assertFalse(pathMatcher.match("/test", "test"));
+
+		// test matching with ?'s
+		assertTrue(pathMatcher.match("t?st", "test"));
+		assertTrue(pathMatcher.match("??st", "test"));
+		assertTrue(pathMatcher.match("tes?", "test"));
+		assertTrue(pathMatcher.match("te??", "test"));
+		assertTrue(pathMatcher.match("?es?", "test"));
+		assertFalse(pathMatcher.match("tes?", "tes"));
+		assertFalse(pathMatcher.match("tes?", "testt"));
+		assertFalse(pathMatcher.match("tes?", "tsst"));
+
+		// test matching with *'s
+		assertTrue(pathMatcher.match("*", "test"));
+		assertTrue(pathMatcher.match("test*", "test"));
+		assertTrue(pathMatcher.match("test*", "testTest"));
+		assertTrue(pathMatcher.match("test/*", "test/Test"));
+		assertTrue(pathMatcher.match("test/*", "test/t"));
+		assertTrue(pathMatcher.match("test/*", "test/"));
+		assertTrue(pathMatcher.match("*test*", "AnothertestTest"));
+		assertTrue(pathMatcher.match("*test", "Anothertest"));
+		assertTrue(pathMatcher.match("*.*", "test."));
+		assertTrue(pathMatcher.match("*.*", "test.test"));
+		assertTrue(pathMatcher.match("*.*", "test.test.test"));
+		assertTrue(pathMatcher.match("test*aaa", "testblaaaa"));
+		assertFalse(pathMatcher.match("test*", "tst"));
+		assertFalse(pathMatcher.match("test*", "tsttest"));
+		assertFalse(pathMatcher.match("test*", "test/"));
+		assertFalse(pathMatcher.match("test*", "test/t"));
+		assertFalse(pathMatcher.match("test/*", "test"));
+		assertFalse(pathMatcher.match("*test*", "tsttst"));
+		assertFalse(pathMatcher.match("*test", "tsttst"));
+		assertFalse(pathMatcher.match("*.*", "tsttst"));
+		assertFalse(pathMatcher.match("test*aaa", "test"));
+		assertFalse(pathMatcher.match("test*aaa", "testblaaab"));
+
+		// test matching with ?'s and /'s
+		assertTrue(pathMatcher.match("/?", "/a"));
+		assertTrue(pathMatcher.match("/?/a", "/a/a"));
+		assertTrue(pathMatcher.match("/a/?", "/a/b"));
+		assertTrue(pathMatcher.match("/??/a", "/aa/a"));
+		assertTrue(pathMatcher.match("/a/??", "/a/bb"));
+		assertTrue(pathMatcher.match("/?", "/a"));
+
+		// test matching with **'s
+		assertTrue(pathMatcher.match("/**", "/testing/testing"));
+		assertTrue(pathMatcher.match("/*/**", "/testing/testing"));
+		assertTrue(pathMatcher.match("/**/*", "/testing/testing"));
+		assertTrue(pathMatcher.match("/bla/**/bla", "/bla/testing/testing/bla"));
+		assertTrue(pathMatcher.match("/bla/**/bla", "/bla/testing/testing/bla/bla"));
+		assertTrue(pathMatcher.match("/**/test", "/bla/bla/test"));
+		assertTrue(pathMatcher.match("/bla/**/**/bla", "/bla/bla/bla/bla/bla/bla"));
+		assertTrue(pathMatcher.match("/bla*bla/test", "/blaXXXbla/test"));
+		assertTrue(pathMatcher.match("/*bla/test", "/XXXbla/test"));
+		assertFalse(pathMatcher.match("/bla*bla/test", "/blaXXXbl/test"));
+		assertFalse(pathMatcher.match("/*bla/test", "XXXblab/test"));
+		assertFalse(pathMatcher.match("/*bla/test", "XXXbl/test"));
+		
+		// test to check disparity from ant matching -- pattern and path must be both absolute or both relative
+		assertFalse(pathMatcher.match("**/*.jar", "/a/b/c/fred.jar"));
+		assertTrue(pathMatcher.match("**/*.jar", "a/b/c/fred.jar"));
+
+		assertFalse(pathMatcher.match("/????", "/bala/bla"));
+		assertFalse(pathMatcher.match("/**/*bla", "/bla/bla/bla/bbb"));
+
+		assertTrue(pathMatcher.match("/*bla*/**/bla/**", "/XXXblaXXXX/testing/testing/bla/testing/testing/"));
+		assertTrue(pathMatcher.match("/*bla*/**/bla/*", "/XXXblaXXXX/testing/testing/bla/testing"));
+		assertTrue(pathMatcher.match("/*bla*/**/bla/**", "/XXXblaXXXX/testing/testing/bla/testing/testing"));
+		assertTrue(pathMatcher.match("/*bla*/**/bla/**", "/XXXblaXXXX/testing/testing/bla/testing/testing.jpg"));
+
+		assertTrue(pathMatcher.match("*bla*/**/bla/**", "XXXblaXXXX/testing/testing/bla/testing/testing/"));
+		assertTrue(pathMatcher.match("*bla*/**/bla/*", "XXXblaXXXX/testing/testing/bla/testing"));
+		assertTrue(pathMatcher.match("*bla*/**/bla/**", "XXXblaXXXX/testing/testing/bla/testing/testing"));
+		assertFalse(pathMatcher.match("*bla*/**/bla/*", "XXXblaXXXX/testing/testing/bla/testing/testing"));
+
+		assertFalse(pathMatcher.match("/x/x/**/bla", "/x/x/x/"));
+
+		assertTrue(pathMatcher.match("", ""));
+	}
+
+	@Test
+	public void withMatchStart() {
+		// test exact matching
+		assertTrue(pathMatcher.matchStart("test", "test"));
+		assertTrue(pathMatcher.matchStart("/test", "/test"));
+		assertFalse(pathMatcher.matchStart("/test.jpg", "test.jpg"));
+		assertFalse(pathMatcher.matchStart("test", "/test"));
+		assertFalse(pathMatcher.matchStart("/test", "test"));
+
+		// test matching with ?'s
+		assertTrue(pathMatcher.matchStart("t?st", "test"));
+		assertTrue(pathMatcher.matchStart("??st", "test"));
+		assertTrue(pathMatcher.matchStart("tes?", "test"));
+		assertTrue(pathMatcher.matchStart("te??", "test"));
+		assertTrue(pathMatcher.matchStart("?es?", "test"));
+		assertFalse(pathMatcher.matchStart("tes?", "tes"));
+		assertFalse(pathMatcher.matchStart("tes?", "testt"));
+		assertFalse(pathMatcher.matchStart("tes?", "tsst"));
+
+		// test matchin with *'s
+		assertTrue(pathMatcher.matchStart("*", "test"));
+		assertTrue(pathMatcher.matchStart("test*", "test"));
+		assertTrue(pathMatcher.matchStart("test*", "testTest"));
+		assertTrue(pathMatcher.matchStart("test/*", "test/Test"));
+		assertTrue(pathMatcher.matchStart("test/*", "test/t"));
+		assertTrue(pathMatcher.matchStart("test/*", "test/"));
+		assertTrue(pathMatcher.matchStart("*test*", "AnothertestTest"));
+		assertTrue(pathMatcher.matchStart("*test", "Anothertest"));
+		assertTrue(pathMatcher.matchStart("*.*", "test."));
+		assertTrue(pathMatcher.matchStart("*.*", "test.test"));
+		assertTrue(pathMatcher.matchStart("*.*", "test.test.test"));
+		assertTrue(pathMatcher.matchStart("test*aaa", "testblaaaa"));
+		assertFalse(pathMatcher.matchStart("test*", "tst"));
+		assertFalse(pathMatcher.matchStart("test*", "test/"));
+		assertFalse(pathMatcher.matchStart("test*", "tsttest"));
+		assertFalse(pathMatcher.matchStart("test*", "test/"));
+		assertFalse(pathMatcher.matchStart("test*", "test/t"));
+		assertTrue(pathMatcher.matchStart("test/*", "test"));
+		assertTrue(pathMatcher.matchStart("test/t*.txt", "test"));
+		assertFalse(pathMatcher.matchStart("*test*", "tsttst"));
+		assertFalse(pathMatcher.matchStart("*test", "tsttst"));
+		assertFalse(pathMatcher.matchStart("*.*", "tsttst"));
+		assertFalse(pathMatcher.matchStart("test*aaa", "test"));
+		assertFalse(pathMatcher.matchStart("test*aaa", "testblaaab"));
+
+		// test matching with ?'s and /'s
+		assertTrue(pathMatcher.matchStart("/?", "/a"));
+		assertTrue(pathMatcher.matchStart("/?/a", "/a/a"));
+		assertTrue(pathMatcher.matchStart("/a/?", "/a/b"));
+		assertTrue(pathMatcher.matchStart("/??/a", "/aa/a"));
+		assertTrue(pathMatcher.matchStart("/a/??", "/a/bb"));
+		assertTrue(pathMatcher.matchStart("/?", "/a"));
+
+		// test matching with **'s
+		assertTrue(pathMatcher.matchStart("/**", "/testing/testing"));
+		assertTrue(pathMatcher.matchStart("/*/**", "/testing/testing"));
+		assertTrue(pathMatcher.matchStart("/**/*", "/testing/testing"));
+		assertTrue(pathMatcher.matchStart("test*/**", "test/"));
+		assertTrue(pathMatcher.matchStart("test*/**", "test/t"));
+		assertTrue(pathMatcher.matchStart("/bla/**/bla", "/bla/testing/testing/bla"));
+		assertTrue(pathMatcher.matchStart("/bla/**/bla", "/bla/testing/testing/bla/bla"));
+		assertTrue(pathMatcher.matchStart("/**/test", "/bla/bla/test"));
+		assertTrue(pathMatcher.matchStart("/bla/**/**/bla", "/bla/bla/bla/bla/bla/bla"));
+		assertTrue(pathMatcher.matchStart("/bla*bla/test", "/blaXXXbla/test"));
+		assertTrue(pathMatcher.matchStart("/*bla/test", "/XXXbla/test"));
+		assertFalse(pathMatcher.matchStart("/bla*bla/test", "/blaXXXbl/test"));
+		assertFalse(pathMatcher.matchStart("/*bla/test", "XXXblab/test"));
+		assertFalse(pathMatcher.matchStart("/*bla/test", "XXXbl/test"));
+
+		assertFalse(pathMatcher.matchStart("/????", "/bala/bla"));
+		assertTrue(pathMatcher.matchStart("/**/*bla", "/bla/bla/bla/bbb"));
+
+		assertTrue(pathMatcher.matchStart("/*bla*/**/bla/**", "/XXXblaXXXX/testing/testing/bla/testing/testing/"));
+		assertTrue(pathMatcher.matchStart("/*bla*/**/bla/*", "/XXXblaXXXX/testing/testing/bla/testing"));
+		assertTrue(pathMatcher.matchStart("/*bla*/**/bla/**", "/XXXblaXXXX/testing/testing/bla/testing/testing"));
+		assertTrue(pathMatcher.matchStart("/*bla*/**/bla/**", "/XXXblaXXXX/testing/testing/bla/testing/testing.jpg"));
+
+		assertTrue(pathMatcher.matchStart("*bla*/**/bla/**", "XXXblaXXXX/testing/testing/bla/testing/testing/"));
+		assertTrue(pathMatcher.matchStart("*bla*/**/bla/*", "XXXblaXXXX/testing/testing/bla/testing"));
+		assertTrue(pathMatcher.matchStart("*bla*/**/bla/**", "XXXblaXXXX/testing/testing/bla/testing/testing"));
+		assertTrue(pathMatcher.matchStart("*bla*/**/bla/*", "XXXblaXXXX/testing/testing/bla/testing/testing"));
+
+		assertTrue(pathMatcher.matchStart("/x/x/**/bla", "/x/x/x/"));
+
+		assertTrue(pathMatcher.matchStart("", ""));
+	}
+
+	@Test
+	public void uniqueDeliminator() {
+		pathMatcher.setPathSeparator(".");
+
+		// test exact matching
+		assertTrue(pathMatcher.match("test", "test"));
+		assertTrue(pathMatcher.match(".test", ".test"));
+		assertFalse(pathMatcher.match(".test/jpg", "test/jpg"));
+		assertFalse(pathMatcher.match("test", ".test"));
+		assertFalse(pathMatcher.match(".test", "test"));
+
+		// test matching with ?'s
+		assertTrue(pathMatcher.match("t?st", "test"));
+		assertTrue(pathMatcher.match("??st", "test"));
+		assertTrue(pathMatcher.match("tes?", "test"));
+		assertTrue(pathMatcher.match("te??", "test"));
+		assertTrue(pathMatcher.match("?es?", "test"));
+		assertFalse(pathMatcher.match("tes?", "tes"));
+		assertFalse(pathMatcher.match("tes?", "testt"));
+		assertFalse(pathMatcher.match("tes?", "tsst"));
+
+		// test matchin with *'s
+		assertTrue(pathMatcher.match("*", "test"));
+		assertTrue(pathMatcher.match("test*", "test"));
+		assertTrue(pathMatcher.match("test*", "testTest"));
+		assertTrue(pathMatcher.match("*test*", "AnothertestTest"));
+		assertTrue(pathMatcher.match("*test", "Anothertest"));
+		assertTrue(pathMatcher.match("*/*", "test/"));
+		assertTrue(pathMatcher.match("*/*", "test/test"));
+		assertTrue(pathMatcher.match("*/*", "test/test/test"));
+		assertTrue(pathMatcher.match("test*aaa", "testblaaaa"));
+		assertFalse(pathMatcher.match("test*", "tst"));
+		assertFalse(pathMatcher.match("test*", "tsttest"));
+		assertFalse(pathMatcher.match("*test*", "tsttst"));
+		assertFalse(pathMatcher.match("*test", "tsttst"));
+		assertFalse(pathMatcher.match("*/*", "tsttst"));
+		assertFalse(pathMatcher.match("test*aaa", "test"));
+		assertFalse(pathMatcher.match("test*aaa", "testblaaab"));
+
+		// test matching with ?'s and .'s
+		assertTrue(pathMatcher.match(".?", ".a"));
+		assertTrue(pathMatcher.match(".?.a", ".a.a"));
+		assertTrue(pathMatcher.match(".a.?", ".a.b"));
+		assertTrue(pathMatcher.match(".??.a", ".aa.a"));
+		assertTrue(pathMatcher.match(".a.??", ".a.bb"));
+		assertTrue(pathMatcher.match(".?", ".a"));
+
+		// test matching with **'s
+		assertTrue(pathMatcher.match(".**", ".testing.testing"));
+		assertTrue(pathMatcher.match(".*.**", ".testing.testing"));
+		assertTrue(pathMatcher.match(".**.*", ".testing.testing"));
+		assertTrue(pathMatcher.match(".bla.**.bla", ".bla.testing.testing.bla"));
+		assertTrue(pathMatcher.match(".bla.**.bla", ".bla.testing.testing.bla.bla"));
+		assertTrue(pathMatcher.match(".**.test", ".bla.bla.test"));
+		assertTrue(pathMatcher.match(".bla.**.**.bla", ".bla.bla.bla.bla.bla.bla"));
+		assertTrue(pathMatcher.match(".bla*bla.test", ".blaXXXbla.test"));
+		assertTrue(pathMatcher.match(".*bla.test", ".XXXbla.test"));
+		assertFalse(pathMatcher.match(".bla*bla.test", ".blaXXXbl.test"));
+		assertFalse(pathMatcher.match(".*bla.test", "XXXblab.test"));
+		assertFalse(pathMatcher.match(".*bla.test", "XXXbl.test"));
+	}
+}
diff --git a/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/external/AntPathMatchingFileSystemSearcherTests.java b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/external/AntPathMatchingFileSystemSearcherTests.java
new file mode 100644
index 0000000..5c12fa2
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/external/AntPathMatchingFileSystemSearcherTests.java
@@ -0,0 +1,176 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.external;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.virgo.repository.internal.external.AntPathMatchingFileSystemSearcher;
+import org.eclipse.virgo.repository.internal.external.FileSystemSearcher;
+import org.eclipse.virgo.repository.internal.external.FileSystemSearcher.SearchCallback;
+import org.junit.Test;
+
+
+/**
+ */
+public class AntPathMatchingFileSystemSearcherTests {
+
+    @Test
+    public void consistentlyDeepDirectoryStructure() throws Exception {
+        
+        String antPathPattern = new File("src/test/resources/file-system-searcher").getAbsolutePath() + File.separator + "*" + File.separator + "*" + File.separator + "*.txt";
+        
+        FileSystemSearcher searcher = new AntPathMatchingFileSystemSearcher(antPathPattern);
+        ResultTrackingSearchCallback callback = new ResultTrackingSearchCallback();
+        searcher.search(callback);
+        File root = new File("src/test/resources/file-system-searcher");
+        List<File> expectedTerminalMatches = Arrays.asList(new File[] { new File(root, "a/1/a1.txt").getCanonicalFile(),
+            new File(root, "b/1/b1.txt").getCanonicalFile(), new File(root, "c/1/c1.txt").getCanonicalFile() });
+        assertFound(expectedTerminalMatches, callback.getTerminalMatches());
+        List<File> expectedNonTerminalMatches = Arrays.asList(new File[] { root.getCanonicalFile(), new File(root, "a").getCanonicalFile(),
+            new File(root, "a/1").getCanonicalFile(), new File(root, "b").getCanonicalFile(), new File(root, "b/1").getCanonicalFile(),
+            new File(root, "c").getCanonicalFile(), new File(root, "c/1").getCanonicalFile() });
+        assertFound(expectedNonTerminalMatches, callback.getNonTerminalMatches());
+    }
+
+    @Test
+    public void arbitrarilyDeepDirectoryStructure() throws Exception {
+        FileSystemSearcher searcher = new AntPathMatchingFileSystemSearcher(new File("src/test/resources/file-system-searcher").getAbsolutePath() + File.separator + "**" + File.separator + "*");
+        ResultTrackingSearchCallback callback = new ResultTrackingSearchCallback();
+        searcher.search(callback);
+        File root = new File("src/test/resources/file-system-searcher");
+        List<File> expectedTerminalMatches = Arrays.asList(new File[] {
+            new File(root, "a").getCanonicalFile(),
+            new File(root, "a/1").getCanonicalFile(),
+            new File(root, "a/1/a1.txt").getCanonicalFile(),
+            new File(root, "a/1/z").getCanonicalFile(),
+            new File(root, "a/1/z/a1z.txt").getCanonicalFile(),
+            new File(root, "a/1/z/file.wont.be.found.in.suffix.search").getCanonicalFile(),
+            new File(root, "b").getCanonicalFile(),
+            new File(root, "b/1").getCanonicalFile(),
+            new File(root, "b/1/b1.txt").getCanonicalFile(),
+            new File(root, "b/1/file.wont.be.found.in.suffix.search").getCanonicalFile(),
+            new File(root, "c").getCanonicalFile(),
+            new File(root, "c/c.txt").getCanonicalFile(),
+            new File(root, "c/1").getCanonicalFile(),
+            new File(root, "c/1/c1.txt").getCanonicalFile()});                                     
+        assertFound(expectedTerminalMatches, callback.getTerminalMatches());
+        List<File> expectedNonTerminalMatches = Arrays.asList(new File[] {new File("src/test/resources/file-system-searcher").getCanonicalFile()});
+        assertFound(expectedNonTerminalMatches, callback.getNonTerminalMatches());
+    }
+    
+    @Test
+    public void trailingStarStarDirectoryStructure() throws Exception {
+        FileSystemSearcher searcher = new AntPathMatchingFileSystemSearcher(new File("src/test/resources/file-system-searcher").getAbsolutePath() + File.separator + "**");
+        ResultTrackingSearchCallback callback = new ResultTrackingSearchCallback();
+        searcher.search(callback);
+        File root = new File("src/test/resources/file-system-searcher");
+        List<File> expectedTerminalMatches = Arrays.asList(new File[] {
+            new File("src/test/resources/file-system-searcher").getCanonicalFile(),
+            new File(root, "a").getCanonicalFile(),
+            new File(root, "a/1").getCanonicalFile(),
+            new File(root, "a/1/a1.txt").getCanonicalFile(),
+            new File(root, "a/1/z").getCanonicalFile(),
+            new File(root, "a/1/z/a1z.txt").getCanonicalFile(),
+            new File(root, "a/1/z/file.wont.be.found.in.suffix.search").getCanonicalFile(),
+            new File(root, "b").getCanonicalFile(),
+            new File(root, "b/1").getCanonicalFile(),
+            new File(root, "b/1/b1.txt").getCanonicalFile(),
+            new File(root, "b/1/file.wont.be.found.in.suffix.search").getCanonicalFile(),
+            new File(root, "c").getCanonicalFile(),
+            new File(root, "c/c.txt").getCanonicalFile(),
+            new File(root, "c/1").getCanonicalFile(),
+            new File(root, "c/1/c1.txt").getCanonicalFile()});                                     
+        assertFound(expectedTerminalMatches, callback.getTerminalMatches());
+        List<File> expectedNonTerminalMatches = Arrays.asList(new File[] {});
+        assertFound(expectedNonTerminalMatches, callback.getNonTerminalMatches());
+    }
+    
+    @Test
+    public void arbitrarilyDeepDirectoryStructureWithSuffix() throws Exception {
+        FileSystemSearcher searcher = new AntPathMatchingFileSystemSearcher(new File("src/test/resources/file-system-searcher").getAbsolutePath() + File.separator + "**" + File.separator + "*.txt");
+        ResultTrackingSearchCallback callback = new ResultTrackingSearchCallback();
+        searcher.search(callback);
+        File root = new File("src/test/resources/file-system-searcher");
+        List<File> expectedTerminalMatches = Arrays.asList(new File[] {
+            new File(root, "a/1/a1.txt").getCanonicalFile(),
+            new File(root, "a/1/z/a1z.txt").getCanonicalFile(), 
+            new File(root, "b/1/b1.txt").getCanonicalFile(),
+            new File(root, "c/c.txt").getCanonicalFile(),
+            new File(root, "c/1/c1.txt").getCanonicalFile()});
+        assertFound(expectedTerminalMatches, callback.getTerminalMatches());
+        List<File> expectedNonTerminalMatches = Arrays.asList(new File[] {
+            root.getCanonicalFile(),
+            new File(root, "a").getCanonicalFile(),
+            new File(root, "a/1").getCanonicalFile(),
+            new File(root, "a/1/z").getCanonicalFile(),
+            new File(root, "b").getCanonicalFile(),
+            new File(root, "b/1").getCanonicalFile(),
+            new File(root, "c").getCanonicalFile(),
+            new File(root, "c/1").getCanonicalFile() });
+        assertFound(expectedNonTerminalMatches, callback.getNonTerminalMatches());
+    }
+    
+    @Test(expected=IllegalArgumentException.class)
+    public void nonAbsoluteSearchPath() {
+        new AntPathMatchingFileSystemSearcher(new File("relative").getPath() + "*/*.foo");
+    }
+
+    private void assertFound(List<File> expectedFiles, List<File> actualFiles) {
+        List<File> missingFiles = new ArrayList<File>();
+        missingFiles.addAll(expectedFiles);
+        for (File actual : actualFiles) {
+            missingFiles.remove(actual);
+        }
+        assertTrue(missingFiles + " were missing from the files that were found: " + actualFiles, missingFiles.isEmpty());
+
+        if (actualFiles.size() != expectedFiles.size()) {
+            for (File expected : expectedFiles) {
+                actualFiles.remove(expected);
+            }
+            fail("Unexpected files were found: " + actualFiles);
+        }
+    }
+
+    private static class ResultTrackingSearchCallback implements SearchCallback {
+
+        private final List<File> terminalMatches = new ArrayList<File>();
+
+        private final List<File> nonTerminalMatches = new ArrayList<File>();
+
+        /**
+         * {@inheritDoc}
+         */
+        public void found(File file, boolean terminal) {
+            if (!file.getPath().contains(".svn")) {
+                if (terminal) {
+                    terminalMatches.add(file);
+                } else {
+                    nonTerminalMatches.add(file);
+                }
+            }
+        }
+
+        private List<File> getTerminalMatches() {
+            return this.terminalMatches;
+        }
+
+        private List<File> getNonTerminalMatches() {
+            return this.nonTerminalMatches;
+        }
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/external/ExternalArtifactStoreTests.java b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/external/ExternalArtifactStoreTests.java
new file mode 100644
index 0000000..061c16b
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/external/ExternalArtifactStoreTests.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.external;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.util.Set;
+
+import org.eclipse.virgo.repository.internal.external.ExternalArtifactStore;
+import org.eclipse.virgo.repository.internal.external.FileSystemSearcher;
+import org.junit.Test;
+
+
+public class ExternalArtifactStoreTests {
+    
+    @Test
+    public void repositoryPopulation() {
+        
+        final File file1 = new File("one");
+        final File file2 = new File("two");
+        final File file3 = new File("three");
+        
+        ExternalArtifactStore store = new ExternalArtifactStore(new FileSystemSearcher() {
+            public void search(SearchCallback callback) {
+                callback.found(file1, true);
+                callback.found(file2, false);
+                callback.found(file3, true);        
+            }            
+        });
+        
+        Set<File> artifacts = store.getArtifacts();
+        
+        assertEquals(2, artifacts.size());
+        
+        assertTrue(artifacts.contains(file1));
+        assertTrue(artifacts.contains(file3));               
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/management/AbstractRepositoryInfoTests.java b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/management/AbstractRepositoryInfoTests.java
new file mode 100644
index 0000000..cf6ae56
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/management/AbstractRepositoryInfoTests.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.management;
+
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_TYPE;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_NAME_ONE;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_VERSION_ONE;
+import static org.junit.Assert.assertEquals;
+
+import java.util.Set;
+
+import org.eclipse.virgo.repository.internal.ArtifactDescriptorDepository;
+import org.eclipse.virgo.repository.internal.StubArtefactDepository;
+import org.eclipse.virgo.repository.management.ArtifactDescriptorSummary;
+import org.eclipse.virgo.repository.management.RepositoryInfo;
+import org.junit.Test;
+
+
+public abstract class AbstractRepositoryInfoTests {
+
+    protected StubArtefactDepository depository = new StubArtefactDepository();
+
+    protected abstract RepositoryInfo getRepositoryInfo(ArtifactDescriptorDepository depository);
+
+    @Test
+    public void testSummariesMany() {
+        depository.setNextReturnCount(StubArtefactDepository.MANY);
+
+        RepositoryInfo info = getRepositoryInfo(depository);
+        Set<ArtifactDescriptorSummary> summaries = info.getAllArtifactDescriptorSummaries();
+        assertEquals(2, summaries.size());
+    }
+
+    @Test
+    public void testSummariesOne() {
+        depository.setNextReturnCount(StubArtefactDepository.ONE);
+
+        RepositoryInfo info = getRepositoryInfo(depository);
+        Set<ArtifactDescriptorSummary> summaries = info.getAllArtifactDescriptorSummaries();
+        assertEquals(1, summaries.size());
+
+        ArtifactDescriptorSummary summary = summaries.iterator().next();
+        assertEquals(TEST_ARTEFACT_TYPE, summary.getType());
+        assertEquals(TEST_NAME_ONE, summary.getName());
+        assertEquals(TEST_VERSION_ONE.toString(), summary.getVersion());
+    }
+
+    @Test
+    public void testSummariesNone() {
+        depository.setNextReturnCount(StubArtefactDepository.NONE);
+
+        RepositoryInfo info = getRepositoryInfo(depository);
+        Set<ArtifactDescriptorSummary> summaries = info.getAllArtifactDescriptorSummaries();
+        assertEquals(0, summaries.size());
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/management/StandardExternalStorageRepositoryInfoTests.java b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/management/StandardExternalStorageRepositoryInfoTests.java
new file mode 100644
index 0000000..7a9b395
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/management/StandardExternalStorageRepositoryInfoTests.java
@@ -0,0 +1,141 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.management;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.net.URI;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+import org.eclipse.virgo.repository.DuplicateArtifactException;
+import org.eclipse.virgo.repository.internal.ArtifactDescriptorDepository;
+import org.eclipse.virgo.repository.internal.MutableRepository;
+import org.eclipse.virgo.repository.internal.management.StandardExternalStorageRepositoryInfo;
+import org.eclipse.virgo.repository.management.ArtifactDescriptorSummary;
+import org.junit.Test;
+import org.osgi.framework.Version;
+
+
+public class StandardExternalStorageRepositoryInfoTests extends AbstractRepositoryInfoTests {
+    
+    private static final String LOCATIONS_TEST_FILENAME = "a.jar";
+
+    private final MutableRepository repository = createMock(MutableRepository.class);
+    
+    
+    private final ArtifactDescriptorDepository depository = createMock(ArtifactDescriptorDepository.class);
+    
+    private final StandardExternalStorageRepositoryInfo repositoryInfo = getRepositoryInfo(this.repository, this.depository);
+    
+    @Test
+    public void publish() throws Exception {                     
+        
+        String artifactUri = "file:foo.jar";
+        ArtifactDescriptor artifactDescriptor = createMock(ArtifactDescriptor.class);
+        expect(this.repository.publish(URI.create(artifactUri))).andReturn(artifactDescriptor);        
+        
+        expect(artifactDescriptor.getType()).andReturn("bundle");
+        expect(artifactDescriptor.getName()).andReturn("foo");
+        expect(artifactDescriptor.getVersion()).andReturn(new Version(1,0,0));
+        
+        replay(this.repository, artifactDescriptor, this.depository);
+        
+        ArtifactDescriptorSummary published = repositoryInfo.publish(artifactUri);
+        
+        assertEquals("bundle", published.getType());
+        assertEquals("foo", published.getName());
+        assertEquals("1.0.0", published.getVersion());
+        
+        verify(this.repository, artifactDescriptor, this.depository);
+    }
+    
+    /**
+     * Notice that the expected exception is RuntimeException and not IllegalArgumentException -- this is because the
+     * util.jmx aspect 'cleans' the exceptions so as to prevent foreign types leaking across the jmx interface.
+     * @throws Exception RuntimeException, in fact
+     */
+    @Test(expected=RuntimeException.class)
+    public void publishDuplicate() throws Exception {                     
+        
+        String artifactUri = "file:foo.jar";
+        ArtifactDescriptor original = createMock(ArtifactDescriptor.class);
+        ArtifactDescriptor duplicate = createMock(ArtifactDescriptor.class);
+        expect(this.repository.publish(URI.create(artifactUri))).andThrow(new DuplicateArtifactException(original, duplicate));        
+        expect(original.getUri()).andReturn(URI.create("file:/original"));
+                
+        
+        replay(this.repository, original, duplicate, this.depository);
+               
+        try {
+            repositoryInfo.publish(artifactUri);
+        } finally {
+            verify(this.repository, original, duplicate, this.depository);
+        }
+    }
+    
+    @Test
+    public void retract() {
+        
+        expect(this.repository.retract("bundle", "foo", new Version(1,0,0))).andReturn(true);
+        
+        replay(this.repository, this.depository);
+        
+        assertTrue(repositoryInfo.retract("bundle", "foo", "1.0.0"));
+        
+        verify(this.repository, this.depository);
+    }
+    
+    @Test
+    public void retractMissingArtifact() {
+        
+        expect(this.repository.retract("bundle", "foo", new Version(1,0,0))).andReturn(false);
+        
+        replay(this.repository, this.depository);
+            
+        assertFalse(repositoryInfo.retract("bundle", "foo", "1.0.0"));
+        
+        verify(this.repository, this.depository);
+    }
+    
+    @Test
+    public void getArtifactLocations() throws Exception {
+        expect(this.repository.getArtifactLocations(LOCATIONS_TEST_FILENAME)).andReturn(new HashSet<String>());
+        replay(this.repository);
+        
+        Set<String> filepaths = repositoryInfo.getArtifactLocations(LOCATIONS_TEST_FILENAME);
+        assertNotNull(filepaths);
+
+        verify(this.repository);
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    protected StandardExternalStorageRepositoryInfo getRepositoryInfo(ArtifactDescriptorDepository depository) {
+        return getRepositoryInfo(this.repository, depository);        
+    }
+    
+    private static StandardExternalStorageRepositoryInfo getRepositoryInfo(MutableRepository repository, ArtifactDescriptorDepository depository) {
+        StandardExternalStorageRepositoryInfo repositoryInfo = new StandardExternalStorageRepositoryInfo("unittest", depository, repository);              
+        return repositoryInfo;
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/management/StandardRemoteRepositoryInfoTests.java b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/management/StandardRemoteRepositoryInfoTests.java
new file mode 100644
index 0000000..10823c0
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/management/StandardRemoteRepositoryInfoTests.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.management;
+
+import org.eclipse.virgo.repository.internal.ArtifactDescriptorDepository;
+import org.eclipse.virgo.repository.internal.management.AbstractRepositoryInfo;
+import org.eclipse.virgo.repository.internal.management.StandardRemoteRepositoryInfo;
+
+public class StandardRemoteRepositoryInfoTests extends AbstractRepositoryInfoTests {
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    protected AbstractRepositoryInfo getRepositoryInfo(ArtifactDescriptorDepository depository) {
+        return new StandardRemoteRepositoryInfo("unittest", depository);
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/management/StandardWatchedStorageRepositoryInfoTests.java b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/management/StandardWatchedStorageRepositoryInfoTests.java
new file mode 100644
index 0000000..4755e5f
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/management/StandardWatchedStorageRepositoryInfoTests.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.management;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertNotNull;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.virgo.repository.WatchableRepository;
+import org.eclipse.virgo.repository.internal.ArtifactDescriptorDepository;
+import org.eclipse.virgo.repository.internal.management.StandardWatchedStorageRepositoryInfo;
+import org.eclipse.virgo.repository.management.RepositoryInfo;
+import org.eclipse.virgo.repository.management.WatchedStorageRepositoryInfo;
+import org.junit.Test;
+
+
+public class StandardWatchedStorageRepositoryInfoTests extends AbstractRepositoryInfoTests {
+    
+    private static final String LOCATIONS_TEST_FILENAME = "a.jar";
+
+    private final ArtifactDescriptorDepository depository = createMock(ArtifactDescriptorDepository.class);
+    
+    private final WatchableRepository repository = createMock(WatchableRepository.class);
+    
+    private final WatchedStorageRepositoryInfo repositoryInfo = getMyRepositoryInfo(this.repository, this.depository);
+    
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    protected RepositoryInfo getRepositoryInfo(ArtifactDescriptorDepository depository) {
+        return getMyRepositoryInfo(this.repository, depository);
+    }
+
+    private final static WatchedStorageRepositoryInfo getMyRepositoryInfo(WatchableRepository repository, ArtifactDescriptorDepository depository) {        
+        StandardWatchedStorageRepositoryInfo repositoryInfo = new StandardWatchedStorageRepositoryInfo("unit-test", depository, repository);               
+        return repositoryInfo;
+    }
+
+    @Test
+    public void forceCheck() throws Exception {
+        repositoryInfo.forceCheck();
+    }
+    
+    @Test
+    public void getArtifactLocations() throws Exception {
+        expect(this.repository.getArtifactLocations(LOCATIONS_TEST_FILENAME)).andReturn(new HashSet<String>());
+        replay(this.repository);
+        
+        Set<String> filepaths = repositoryInfo.getArtifactLocations(LOCATIONS_TEST_FILENAME);
+        assertNotNull(filepaths);
+
+        verify(this.repository);
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/persistence/StubArtifactDescriptorPersister.java b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/persistence/StubArtifactDescriptorPersister.java
new file mode 100644
index 0000000..56c28f4
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/persistence/StubArtifactDescriptorPersister.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.persistence;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.virgo.repository.ArtifactDescriptorPersister;
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+
+
+/**
+ * <p>
+ * Stub impl of ArtefactPersister with util methods to inspect its use
+ * </p>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is Threadsafe
+ * 
+ */
+public class StubArtifactDescriptorPersister implements ArtifactDescriptorPersister {
+
+    private Set<RepositoryAwareArtifactDescriptor> artefactsRespond = new HashSet<RepositoryAwareArtifactDescriptor>();
+
+    private Set<RepositoryAwareArtifactDescriptor> artefactsRecieve = new HashSet<RepositoryAwareArtifactDescriptor>();
+
+    /**
+     * {@inheritDoc}
+     */
+    public Set<RepositoryAwareArtifactDescriptor> loadArtifacts() {
+        return this.artefactsRespond;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void persistArtifactDescriptors(Set<RepositoryAwareArtifactDescriptor> artefacts) {
+        this.artefactsRecieve = new HashSet<RepositoryAwareArtifactDescriptor>(artefacts);
+    }
+
+    // TEST SUPPORT METHODS
+
+    public Set<RepositoryAwareArtifactDescriptor> getLastPersisted() {
+        return this.artefactsRecieve;
+    }
+
+    public void addArtefact(RepositoryAwareArtifactDescriptor artefact) {
+        this.artefactsRespond.add(artefact);
+    }
+
+    public void reset() {
+        this.artefactsRecieve.clear();
+        this.artefactsRespond.clear();
+    }
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/persistence/XmlArtifactDescriptorPersisterTests.java b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/persistence/XmlArtifactDescriptorPersisterTests.java
new file mode 100644
index 0000000..ca95e7a
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/persistence/XmlArtifactDescriptorPersisterTests.java
@@ -0,0 +1,186 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.persistence;
+
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_EIGHT;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_ELEVEN;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_FIFTEEN;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_FIVE;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_FOUR;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_FOURTEEN;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_NINE;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_ONE;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_SEVEN;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_SIX;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_SIXTEEN;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_TEN;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_THIRTEEN;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_THREE;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_TWELVE;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_ARTEFACT_TWO;
+import static org.eclipse.virgo.repository.internal.RepositoryTestData.TEST_REPO_ONE;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Version;
+
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+import org.eclipse.virgo.repository.ArtifactDescriptorPersister;
+import org.eclipse.virgo.repository.Attribute;
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+import org.eclipse.virgo.repository.XmlArtifactDescriptorPersister;
+import org.eclipse.virgo.repository.codec.XMLRepositoryCodec;
+import org.eclipse.virgo.util.io.FileSystemUtils;
+
+/**
+ * <p>
+ * Unit tests for {@link XmlArtifactDescriptorPersister}
+ * </p>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe test case
+ * 
+ */
+public class XmlArtifactDescriptorPersisterTests {
+
+    private static Set<RepositoryAwareArtifactDescriptor> ARTEFACTS = new HashSet<RepositoryAwareArtifactDescriptor>();
+
+    private static final String DUMMY_REPOSITORY_NAME = "dummyRepositoryName";
+
+    private final File repositories = new File("build/repositories");
+
+    @Before
+    public void setUp() throws Exception {
+        FileSystemUtils.deleteRecursively(repositories);
+
+        ARTEFACTS.add(TEST_ARTEFACT_ONE);
+        ARTEFACTS.add(TEST_ARTEFACT_TWO);
+        ARTEFACTS.add(TEST_ARTEFACT_THREE);
+        ARTEFACTS.add(TEST_ARTEFACT_FOUR);
+        ARTEFACTS.add(TEST_ARTEFACT_FIVE);
+        ARTEFACTS.add(TEST_ARTEFACT_SIX);
+        ARTEFACTS.add(TEST_ARTEFACT_SEVEN);
+        ARTEFACTS.add(TEST_ARTEFACT_EIGHT);
+        ARTEFACTS.add(TEST_ARTEFACT_NINE);
+        ARTEFACTS.add(TEST_ARTEFACT_TEN);
+        ARTEFACTS.add(TEST_ARTEFACT_ELEVEN);
+        ARTEFACTS.add(TEST_ARTEFACT_TWELVE);
+        ARTEFACTS.add(TEST_ARTEFACT_THIRTEEN);
+        ARTEFACTS.add(TEST_ARTEFACT_FOURTEEN);
+        ARTEFACTS.add(TEST_ARTEFACT_FIFTEEN);
+        ARTEFACTS.add(TEST_ARTEFACT_SIXTEEN);
+    }
+
+    @After
+    public void cleanUp() {
+        FileSystemUtils.deleteRecursively(repositories);
+    }
+
+    @Test
+    public void testPersistRepository() throws IOException {
+        XmlArtifactDescriptorPersister persistenceHandler = new XmlArtifactDescriptorPersister(new XMLRepositoryCodec(), DUMMY_REPOSITORY_NAME,
+            new File(repositories, TEST_REPO_ONE));
+        persistenceHandler.persistArtifactDescriptors(ARTEFACTS);
+    }
+
+    @Test
+    public void testLoadRepository() throws IOException {
+        ArtifactDescriptorPersister persistenceHandler = new XmlArtifactDescriptorPersister(new XMLRepositoryCodec(), DUMMY_REPOSITORY_NAME,
+            new File(repositories, TEST_REPO_ONE));
+        persistenceHandler.persistArtifactDescriptors(ARTEFACTS);
+        Set<RepositoryAwareArtifactDescriptor> artefacts2 = persistenceHandler.loadArtifacts();
+        assertEquals(ARTEFACTS, artefacts2);
+    }
+
+    @Test
+    public void roundTripWithAttributeWithEmptyValue() throws IOException {
+        File outputFile = new File(repositories, "round-trip");
+        assertFalse(outputFile.exists());
+        ArtifactDescriptorPersister persister = new XmlArtifactDescriptorPersister(new XMLRepositoryCodec(), DUMMY_REPOSITORY_NAME, outputFile);
+
+        RepositoryAwareArtifactDescriptor descriptor = new RepositoryAwareArtifactDescriptor() {
+
+            public Set<Attribute> getAttribute(String name) {
+                return null;
+            }
+
+            public Set<Attribute> getAttributes() {
+                Set<Attribute> attributes = new HashSet<Attribute>();
+                attributes.add(new Attribute() {
+
+                    public String getKey() {
+                        return "the-key";
+                    }
+
+                    public Map<String, Set<String>> getProperties() {
+                        return new HashMap<String, Set<String>>();
+                    }
+
+                    public String getValue() {
+                        return "";
+                    }
+                });
+                return attributes;
+            }
+
+            public String getName() {
+                return "bar";
+            }
+
+            public String getType() {
+                return "foo";
+            }
+
+            public java.net.URI getUri() {
+                return java.net.URI.create("foo://bar");
+            }
+
+            public Version getVersion() {
+                return new Version(1, 0, 0);
+            }
+
+            public String getFilename() {
+                return null;
+            }
+
+            public String getRepositoryName() {
+                return null;
+            }
+        };
+
+        persister.persistArtifactDescriptors(new HashSet<RepositoryAwareArtifactDescriptor>(Arrays.asList(descriptor)));
+
+        Set<RepositoryAwareArtifactDescriptor> descriptors = persister.loadArtifacts();
+        assertEquals(1, descriptors.size());
+
+        ArtifactDescriptor outputDescriptor = descriptors.iterator().next();
+        assertEquals("foo", outputDescriptor.getType());
+        assertEquals("bar", outputDescriptor.getName());
+        assertEquals(new Version(1, 0, 0), outputDescriptor.getVersion());
+        assertEquals(java.net.URI.create("foo://bar"), outputDescriptor.getUri());
+
+        Set<Attribute> attributes = descriptors.iterator().next().getAttributes();
+        assertEquals(5, attributes.size());
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/remote/DescriptorStoreFactoryTests.java b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/remote/DescriptorStoreFactoryTests.java
new file mode 100644
index 0000000..5393239
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/remote/DescriptorStoreFactoryTests.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.remote;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import org.eclipse.virgo.repository.internal.remote.DescriptorStore;
+import org.eclipse.virgo.repository.internal.remote.DescriptorStoreFactory;
+import org.eclipse.virgo.util.io.PathReference;
+
+/**
+ */
+public class DescriptorStoreFactoryTests {
+
+    private static final String ETAG_1 = "etag1";
+
+    private static final byte[] STORE_CONTENTS_1 = new byte[] { 0 };
+
+    private static final String ETAG_2 = "etag2";
+
+    private static final byte[] STORE_CONTENTS_2 = new byte[] { 0, 1 };
+
+    private static final String REPOSITORY_NAME = "reponame";
+
+    private static final File DESCRIPTOR_STORE_DIRECTORY = new File("build/descriptorStore");
+
+    private DescriptorStoreFactory descriptorStoreFactory;
+
+    @Before
+    public void setUp() throws Exception {
+        new PathReference(DESCRIPTOR_STORE_DIRECTORY).delete(true);
+        DESCRIPTOR_STORE_DIRECTORY.mkdirs();
+        this.descriptorStoreFactory = new DescriptorStoreFactory(REPOSITORY_NAME, DESCRIPTOR_STORE_DIRECTORY);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+    }
+
+    @Test
+    public void testCreateDescriptorStore() throws FileNotFoundException, IOException {
+        DescriptorStore descriptorStore = this.descriptorStoreFactory.createDescriptorStore(new ByteArrayInputStream(STORE_CONTENTS_1), ETAG_1);
+        assertEquals(STORE_CONTENTS_1.length, descriptorStore.getLocation().length());
+        assertEquals(ETAG_1, descriptorStore.getEtag());
+    }
+
+    @Test
+    public void testRecoverDescriptorStore() throws FileNotFoundException, IOException {
+        this.descriptorStoreFactory.createDescriptorStore(new ByteArrayInputStream(STORE_CONTENTS_1), ETAG_1);
+        DescriptorStore descriptorStore = this.descriptorStoreFactory.recoverDescriptorStore();
+        assertEquals(STORE_CONTENTS_1.length, descriptorStore.getLocation().length());
+        assertEquals(ETAG_1, descriptorStore.getEtag());
+    }
+
+    @Test
+    public void testRecoverDescriptorStoreFromMultipleFiles() throws FileNotFoundException, IOException, InterruptedException {
+        this.descriptorStoreFactory.createDescriptorStore(new ByteArrayInputStream(STORE_CONTENTS_1), ETAG_1);
+        
+        // Ensure the persisted version of the next descriptor store has a distinct file last modified time to that of
+        // the first descriptor store. The granularity appears to be 1000 mS on at least some platforms.
+        Thread.sleep(1000);
+        
+        this.descriptorStoreFactory.createDescriptorStore(new ByteArrayInputStream(STORE_CONTENTS_2), ETAG_2);
+        DescriptorStore descriptorStore = this.descriptorStoreFactory.recoverDescriptorStore();
+        assertEquals(STORE_CONTENTS_2.length, descriptorStore.getLocation().length());
+        assertEquals(ETAG_2, descriptorStore.getEtag());
+    }
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/remote/RemoteRepositoryTests.java b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/remote/RemoteRepositoryTests.java
new file mode 100644
index 0000000..12aabae
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/remote/RemoteRepositoryTests.java
@@ -0,0 +1,505 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.remote;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.lang.management.ManagementFactory;
+import java.net.InetSocketAddress;
+import java.net.URI;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import javax.management.InstanceNotFoundException;
+import javax.management.MBeanInfo;
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+
+import org.apache.commons.httpclient.HttpStatus;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Version;
+import org.eclipse.virgo.medic.eventlog.EventLogger;
+import org.eclipse.virgo.medic.test.eventlog.MockEventLogger;
+import org.eclipse.virgo.repository.ArtifactBridge;
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+import org.eclipse.virgo.repository.ArtifactGenerationException;
+import org.eclipse.virgo.repository.DuplicateArtifactException;
+import org.eclipse.virgo.repository.IndexFormatException;
+import org.eclipse.virgo.repository.Repository;
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+import org.eclipse.virgo.repository.builder.ArtifactDescriptorBuilder;
+import org.eclipse.virgo.repository.configuration.RemoteRepositoryConfiguration;
+import org.eclipse.virgo.repository.configuration.StubRepositoryConfiguration;
+import org.eclipse.virgo.repository.internal.PersistentRepository;
+import org.eclipse.virgo.repository.internal.RepositoryLogEvents;
+import org.eclipse.virgo.repository.internal.remote.RemoteRepository;
+import org.eclipse.virgo.repository.management.RepositoryInfo;
+import org.eclipse.virgo.util.io.FileCopyUtils;
+import org.eclipse.virgo.util.io.NetUtils;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+
+import com.sun.net.httpserver.HttpExchange;
+import com.sun.net.httpserver.HttpHandler;
+import com.sun.net.httpserver.HttpServer;
+
+public class RemoteRepositoryTests {
+
+    private static final String MBEAN_DOMAIN_VIRGO_WEB_SERVER = "org.eclipse.virgo.server";
+
+    private final MockEventLogger mockEventLogger = new MockEventLogger();
+
+    private String indexEtag;
+
+    private final Object repositoryLock = new Object();
+
+    private int repositoryId = 0;
+
+    private HttpServer httpServer;
+    private int port;
+
+    private final File indexLocation = new File("build/index");
+
+    private final File proxyIndexLocation = new File("build/proxy.index");
+
+    private final File cacheDirectory = new File("build");
+
+    @Before
+    public void deleteIndex() {
+        this.indexLocation.delete();
+        this.proxyIndexLocation.delete();
+        this.port = NetUtils.getFreePort();
+    }
+
+    private void createRepository(ArtifactBridge artefactBridge, EventLogger eventLogger) throws Exception {
+        this.indexLocation.delete();
+        synchronized (this.repositoryLock) {
+            StubRepository repository = new StubRepository(artefactBridge, this.indexLocation, eventLogger);
+            repository.addArtifact(new File("artefact0"));
+            repository.addArtifact(new File("artefact1"));
+            repository.addArtifact(new File("artefact2"));
+            repository.persist();
+
+            this.indexEtag = Integer.toString(this.repositoryId++);
+        }
+    }
+
+    private void bootstrapHttpServer(HttpHandler handler) throws IOException {
+        this.httpServer = HttpServer.create(new InetSocketAddress("localhost", port), 30);
+        this.httpServer.start();
+
+        this.httpServer.createContext("/repository", handler);
+    }
+
+    private class StandardHttpHandler implements HttpHandler {
+
+        public void handle(HttpExchange exchange) throws IOException {
+            synchronized (RemoteRepositoryTests.this.repositoryLock) {
+                boolean notModified = false;
+
+                List<String> etags = exchange.getRequestHeaders().get("If-None-Match");
+
+                if (etags != null) {
+                    for (String etag : etags) {
+                        if (RemoteRepositoryTests.this.indexEtag.equals(etag)) {
+                            notModified = true;
+                            break;
+                        }
+                    }
+                }
+
+                exchange.getResponseHeaders().set("Etag", RemoteRepositoryTests.this.indexEtag);
+
+                if (notModified) {
+                    exchange.sendResponseHeaders(304, 0);
+                } else {
+                    sendIndex(exchange);
+                }
+                exchange.getResponseBody().close();
+            }
+        }
+    }
+
+    private void sendIndex(HttpExchange exchange) throws IOException {
+        exchange.getResponseHeaders().set("Content-Type", "application/org.eclipse.virgo.repository.Index");
+
+        ByteArrayOutputStream indexStream = new ByteArrayOutputStream();
+        FileInputStream input = new FileInputStream(RemoteRepositoryTests.this.indexLocation);
+        FileCopyUtils.copy(input, indexStream);
+        byte[] index = indexStream.toByteArray();
+        exchange.sendResponseHeaders(200, index.length);
+        exchange.getResponseBody().write(index);
+    }
+
+    @After
+    public void shutdownHttpServer() {
+        if (this.httpServer != null) {
+            this.httpServer.stop(0);
+        }
+        this.indexLocation.delete();
+    }
+
+    @Test(timeout = 5 * 60 * 1000)
+    public void queryAcrossUpdates() throws Exception {
+        ArtifactBridge bridge = new StubArtifactBridge();
+        createRepository(bridge, this.mockEventLogger);
+        bootstrapHttpServer(new StandardHttpHandler());
+
+        URI repositoryUri = URI.create("http://localhost:" + this .port + "/repository");
+        RemoteRepositoryConfiguration configuration = new RemoteRepositoryConfiguration("remote-repo", this.proxyIndexLocation, repositoryUri, 1,
+            null, this.cacheDirectory);
+        RemoteRepository repository = createRemoteRepository(configuration, this.mockEventLogger);
+        repository.start();
+
+        int size = 0;
+        Set<RepositoryAwareArtifactDescriptor> artifacts = null;
+        while (size != 3) {
+            artifacts = repository.createQuery("type", "dummy").run();
+            size = artifacts.size();
+        }
+
+        for (RepositoryAwareArtifactDescriptor artifact : artifacts) {
+            Version version = artifact.getVersion();
+
+            if (version.getMajor() > 2) {
+                fail("Unexpected version: " + version);
+            }
+        }
+
+        createRepository(bridge, this.mockEventLogger);
+        boolean success = true;
+
+        do {
+            artifacts = repository.createQuery("type", "dummy").run();
+            if (artifacts.size() != 3) {
+                success = false;
+            } else {
+                for (RepositoryAwareArtifactDescriptor artifact : artifacts) {
+                    Version version = artifact.getVersion();
+
+                    if (version.getMajor() < 3 || version.getMajor() > 5) {
+                        success = false;
+                        break;
+                    }
+
+                    success = true;
+                }
+            }
+        } while (!success);
+
+        repository.stop();
+
+    }
+
+    protected RemoteRepository createRemoteRepository(RemoteRepositoryConfiguration configuration, EventLogger eventLogger) {
+        return new RemoteRepository(configuration, eventLogger);
+    }
+
+    @Test
+    public void get() throws Exception {
+        ArtifactBridge bridge = new StubArtifactBridge();
+        createRepository(bridge, this.mockEventLogger);
+
+        bootstrapHttpServer(new StandardHttpHandler());
+
+        URI repositoryUri = URI.create("http://localhost:" + this .port + "/repository");
+        RemoteRepositoryConfiguration configuration = new RemoteRepositoryConfiguration("remote-repo", this.proxyIndexLocation, repositoryUri, 1,
+            null, this.cacheDirectory);
+        RemoteRepository repository = new RemoteRepository(configuration, new MockEventLogger());
+
+        repository.start();
+
+        pollUntilDescriptorAvailable(repository, "dummy", "dummy", new VersionRange("[2,2]"));
+        assertNull(repository.get("dummy", "dummy", new VersionRange("[3,4)")));
+
+        repository.stop();
+    }
+
+    @Test
+    public void repositoryAvailableMessageIsLoggedOnceRepositoryHasStarted() throws Exception {
+        ArtifactBridge bridge = new StubArtifactBridge();
+        createRepository(bridge, new MockEventLogger());
+        bootstrapHttpServer(new StandardHttpHandler());
+
+        URI repositoryUri = URI.create("http://localhost:" + this .port + "/repository");
+        RemoteRepositoryConfiguration configuration = new RemoteRepositoryConfiguration("remote-repo", this.proxyIndexLocation, repositoryUri, 1,
+            null, this.cacheDirectory);
+        RemoteRepository repository = createRemoteRepository(configuration, this.mockEventLogger);
+        repository.start();
+        
+        String eventCode = RepositoryLogEvents.REPOSITORY_AVAILABLE.getEventCode();
+        while (!this.mockEventLogger.containsLogged(eventCode)) {
+            Thread.sleep(50);
+        }
+    }
+
+    @Test
+    public void indexlessRepository() throws Exception {
+        URI repositoryUri = URI.create("http://localhost:" + this .port + "/does-not-exist");
+
+        RemoteRepositoryConfiguration configuration = new RemoteRepositoryConfiguration("remote-repo", this.proxyIndexLocation, repositoryUri, 1,
+            null, this.cacheDirectory);
+        RemoteRepository repository = new RemoteRepository(configuration, new MockEventLogger());
+
+        repository.start();
+
+        assertTrue(repository.createQuery("name", "foo").run().isEmpty());
+        assertNull(repository.get("foo", "the-foo", VersionRange.NATURAL_NUMBER_RANGE));
+
+        repository.stop();
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void badScheme() throws Exception {
+        URI repositoryUri = URI.create("hotp://localhost:" + this .port + "/repository");
+
+        RemoteRepositoryConfiguration configuration = new RemoteRepositoryConfiguration("remote-repo", this.proxyIndexLocation, repositoryUri, 1,
+            null, this.cacheDirectory);
+        RemoteRepository repository = new RemoteRepository(configuration, new MockEventLogger());
+        assertFalse("Managed to create a badly formed RemoteRepository!", repository != null);
+    }
+
+    @Test(timeout = 5 * 60 * 1000)
+    public void shorterThanExpectedIndex() throws Exception {
+        ArtifactBridge bridge = new StubArtifactBridge();
+        createRepository(bridge, this.mockEventLogger);
+        final AtomicBoolean sendProperIndex = new AtomicBoolean(false);
+
+        bootstrapHttpServer(new HttpHandler() {
+
+            public void handle(HttpExchange exchange) throws IOException {
+                if (sendProperIndex.get()) {
+                    sendIndex(exchange);
+                } else {
+                    long responseLength = 1234;
+                    exchange.sendResponseHeaders(HttpStatus.SC_OK, responseLength);
+                }
+                exchange.getResponseBody().close();
+            }
+        });
+
+        URI repositoryUri = URI.create("http://localhost:" + this .port + "/repository");
+        RemoteRepositoryConfiguration configuration = new RemoteRepositoryConfiguration("remote-repo", this.proxyIndexLocation, repositoryUri, 1,
+            null, this.cacheDirectory);
+        RemoteRepository repository = new RemoteRepository(configuration, new MockEventLogger());
+        repository.start();
+
+        assertNull(repository.get("dummy", "dummy", new VersionRange("[2,2]")));
+
+        createRepository(new StubArtifactBridge(), this.mockEventLogger);
+        sendProperIndex.set(true);
+
+        pollUntilDescriptorAvailable(repository, "dummy", "dummy", new VersionRange("[2,2]"));
+
+        repository.stop();
+    }
+
+    void pollUntilDescriptorAvailable(Repository repository, String type, String name, VersionRange version) {
+        while (repository.get(type, name, version) == null) {
+        }
+    }
+
+    @Test(timeout = 5 * 60 * 1000)
+    public void longerThanExpectedIndex() throws Exception {
+        ArtifactBridge bridge = new StubArtifactBridge();
+        createRepository(bridge, this.mockEventLogger);
+        final AtomicBoolean sendProperIndex = new AtomicBoolean(false);
+
+        bootstrapHttpServer(new HttpHandler() {
+
+            public void handle(HttpExchange exchange) throws IOException {
+                if (sendProperIndex.get()) {
+                    sendIndex(exchange);
+                } else {
+                    exchange.sendResponseHeaders(200, 4);
+                    exchange.getResponseBody().write(new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 });
+                }
+                exchange.getResponseBody().close();
+            }
+        });
+
+        URI repositoryUri = URI.create("http://localhost:" + this .port + "/repository");
+        RemoteRepositoryConfiguration configuration = new RemoteRepositoryConfiguration("remote-repo", this.proxyIndexLocation, repositoryUri, 1,
+            null, this.cacheDirectory);
+        RemoteRepository repository = new RemoteRepository(configuration, new MockEventLogger());
+        repository.start();
+
+        assertNull(repository.get("dummy", "dummy", new VersionRange("[2,2]")));
+
+        createRepository(new StubArtifactBridge(), this.mockEventLogger);
+        sendProperIndex.set(true);
+
+        while (repository.get("dummy", "dummy", new VersionRange("[2,2]")) == null) {
+        }
+
+        repository.stop();
+    }
+
+    @Test(timeout = 5 * 60 * 1000)
+    public void corruptedIndex() throws Exception {
+        ArtifactBridge bridge = new StubArtifactBridge();
+        createRepository(bridge, this.mockEventLogger);
+        final AtomicBoolean sendProperIndex = new AtomicBoolean(false);
+
+        bootstrapHttpServer(new HttpHandler() {
+
+            public void handle(HttpExchange exchange) throws IOException {
+                if (sendProperIndex.get()) {
+                    sendIndex(exchange);
+                } else {
+                    byte[] indexBytes = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
+                    exchange.sendResponseHeaders(200, indexBytes.length);
+                    exchange.getResponseBody().write(indexBytes);
+                }
+                exchange.getResponseBody().close();
+            }
+        });
+
+        URI repositoryUri = URI.create("http://localhost:" + this .port + "/repository");
+        RemoteRepositoryConfiguration configuration = new RemoteRepositoryConfiguration("remote-repo", this.proxyIndexLocation, repositoryUri, 1,
+            null, this.cacheDirectory);
+        RemoteRepository repository = new RemoteRepository(configuration, new MockEventLogger());
+        repository.start();
+
+        assertNull(repository.get("dummy", "dummy", new VersionRange("[2,2]")));
+
+        createRepository(new StubArtifactBridge(), this.mockEventLogger);
+        sendProperIndex.set(true);
+
+        while (repository.get("dummy", "dummy", new VersionRange("[2,2]")) == null) {
+        }
+
+        sendProperIndex.set(false);
+
+        Thread.sleep(3000);
+
+        repository.stop();
+    }
+
+    @Test
+    public void mBeanPublication() throws Exception {
+        URI repositoryUri = URI.create("http://localhost:" + this .port + "/repository");
+        RemoteRepositoryConfiguration configuration = new RemoteRepositoryConfiguration("remote-repo", this.proxyIndexLocation, repositoryUri, 1,
+            MBEAN_DOMAIN_VIRGO_WEB_SERVER, this.cacheDirectory);
+        RemoteRepository repository = new RemoteRepository(configuration, new MockEventLogger());
+        ObjectName objectName = new ObjectName(MBEAN_DOMAIN_VIRGO_WEB_SERVER + ":type=Repository,name=remote-repo");
+
+        MBeanServer platformMBeanServer = ManagementFactory.getPlatformMBeanServer();
+
+        try {
+            platformMBeanServer.getMBeanInfo(objectName);
+            fail("MBean should not be present until repository has been started");
+        } catch (InstanceNotFoundException infe) {
+        }
+
+        repository.start();
+
+        MBeanInfo mBeanInfo = platformMBeanServer.getMBeanInfo(objectName);
+        Object type = mBeanInfo.getDescriptor().getFieldValue("type");
+        assertNotNull(type);
+        assertEquals("remote", type);
+
+        repository.stop();
+
+        try {
+            platformMBeanServer.getMBeanInfo(objectName);
+            fail("MBean should not be present once repository has been stopped");
+        } catch (InstanceNotFoundException infe) {
+        }
+    }
+
+    @Test
+    public void mBeanNonPublication() throws Exception {
+        URI repositoryUri = URI.create("http://localhost:" + this .port + "/repository");
+        RemoteRepositoryConfiguration configuration = new RemoteRepositoryConfiguration("remote-repo", this.proxyIndexLocation, repositoryUri, 1,
+            null, this.cacheDirectory);
+        RemoteRepository repository = new RemoteRepository(configuration, new MockEventLogger());
+        ObjectName objectName = new ObjectName(MBEAN_DOMAIN_VIRGO_WEB_SERVER + ":type=Repository,name=remote-repo");
+        MBeanServer platformMBeanServer = ManagementFactory.getPlatformMBeanServer();
+
+        try {
+            platformMBeanServer.getMBeanInfo(objectName);
+            fail("MBean should not be present before start");
+        } catch (InstanceNotFoundException infe) {
+        }
+
+        repository.start();
+
+        try {
+            platformMBeanServer.getMBeanInfo(objectName);
+            fail("MBean should not be present after start");
+        } catch (InstanceNotFoundException infe) {
+        }
+
+        repository.stop();
+
+        try {
+            platformMBeanServer.getMBeanInfo(objectName);
+            fail("MBean should not be present once repository has been stopped");
+        } catch (InstanceNotFoundException infe) {
+        }
+    }
+
+    private static class StubArtifactBridge implements ArtifactBridge {
+
+        private int version = 0;
+
+        private final RuntimeException exception;
+
+        StubArtifactBridge() {
+            this.exception = null;
+        }
+
+        public ArtifactDescriptor generateArtifactDescriptor(File artifact) throws ArtifactGenerationException {
+            if (this.exception == null) {
+                return new ArtifactDescriptorBuilder().setUri(artifact.toURI()).setType("dummy").setName("dummy").setVersion(
+                    String.valueOf(this.version++)).build();
+            }
+            throw this.exception;
+        }
+    }
+
+    private static class StubRepository extends PersistentRepository {
+
+        StubRepository(ArtifactBridge artifactBridge, File indexLocation, EventLogger eventLogger) throws IndexFormatException {
+            super(new StubRepositoryConfiguration(artifactBridge, indexLocation), eventLogger);
+        }
+
+        public void persist() throws IOException {
+            getDepository().persist();
+        }
+
+        public void addArtifact(File artifact) throws DuplicateArtifactException {
+            RepositoryAwareArtifactDescriptor artifactDescriptor = createArtifactDescriptor(artifact);
+            if (artifactDescriptor != null) {
+                getDepository().addArtifactDescriptor(artifactDescriptor);
+            }
+        }
+
+        @Override
+        protected RepositoryInfo createMBean() {
+            return null;
+        }
+    }
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/watched/WatchedStorageRepositoryTests.java b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/watched/WatchedStorageRepositoryTests.java
new file mode 100644
index 0000000..95868f7
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/internal/watched/WatchedStorageRepositoryTests.java
@@ -0,0 +1,420 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.internal.watched;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.management.ManagementFactory;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.management.InstanceNotFoundException;
+import javax.management.MBeanInfo;
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Version;
+
+import org.eclipse.virgo.medic.test.eventlog.MockEventLogger;
+import org.eclipse.virgo.repository.ArtifactBridge;
+import org.eclipse.virgo.repository.ArtifactDescriptor;
+import org.eclipse.virgo.repository.ArtifactGenerationException;
+import org.eclipse.virgo.repository.IndexFormatException;
+import org.eclipse.virgo.repository.RepositoryAwareArtifactDescriptor;
+import org.eclipse.virgo.repository.RepositoryCreationException;
+import org.eclipse.virgo.repository.builder.ArtifactDescriptorBuilder;
+import org.eclipse.virgo.repository.builder.AttributeBuilder;
+import org.eclipse.virgo.repository.configuration.WatchedStorageRepositoryConfiguration;
+import org.eclipse.virgo.repository.internal.LocalRepository;
+import org.eclipse.virgo.repository.internal.watched.WatchedStorageRepository;
+import org.eclipse.virgo.util.io.FileCopyUtils;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+
+/**
+ * Test the {@link WatchedStorageRepository} extension of the {@link LocalRepository} class.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread-safe
+ * 
+ */
+public class WatchedStorageRepositoryTests {
+
+    private static final String LOCATIONS_TEST_FILENAME = "a.jar";
+
+    private static final String MBEAN_DOMAIN_VIRGO_WEB_SERVER = "org.eclipse.virgo.server";
+
+    private static MockEventLogger mockEventLogger = new MockEventLogger();
+
+    private static final String ARTIFACT_FILE_NAME = "org.eclipse.virgo.sample.configuration.properties.core.jar";
+
+    private static final String WATCHED_REPO_NAME = "Test-Watched-Repo";
+
+    private static final int WATCH_INTERVAL = 5; // seconds
+
+    private static final int MIN_WATCH_INTERVAL = 1; // seconds
+
+    private static final int LONG_WATCH_INTERVAL = 50; // seconds
+
+    private static final int BAD_WATCH_INTERVAL = 0; // seconds
+
+    private static final File testArtefactFile1 = new File("src/test/resources/artifacts/" + ARTIFACT_FILE_NAME);
+
+    private WatchedStorageRepositoryConfiguration wsrConfiguration;
+
+    private WatchedStorageRepository wsRepository;
+
+    private final File watchDir = new File("build/watchedDir");
+
+    private Set<ArtifactBridge> artefactBridgeDefinitions;
+
+    @Before
+    public void setUp() {
+        mockEventLogger.reinitialise();
+        this.watchDir.mkdirs();
+        this.artefactBridgeDefinitions = new HashSet<ArtifactBridge>(4);
+        this.artefactBridgeDefinitions.add(new StaticBridge());
+        assertTrue("Need jar artifact for tests.", testArtefactFile1.exists());
+    }
+
+    @Test
+    public void testConstructor() throws RepositoryCreationException, IndexFormatException {
+        this.wsrConfiguration = new WatchedStorageRepositoryConfiguration(WATCHED_REPO_NAME, new File("build/watchedIndex"), this.artefactBridgeDefinitions, this.watchDir.getAbsolutePath(),
+            WATCH_INTERVAL, null);
+
+        this.wsRepository = new WatchedStorageRepository(this.wsrConfiguration, new MockEventLogger());
+        assertFalse("Didn't create a repository!", null == this.wsRepository);
+    }
+
+    @Test
+    public void testConstructLongWaiter() throws RepositoryCreationException, IndexFormatException {
+        this.wsrConfiguration = new WatchedStorageRepositoryConfiguration(WATCHED_REPO_NAME, new File("build/watchedIndex"), this.artefactBridgeDefinitions, this.watchDir.getAbsolutePath(),
+            LONG_WATCH_INTERVAL, null);
+
+        this.wsRepository = new WatchedStorageRepository(this.wsrConfiguration, mockEventLogger);
+
+        assertFalse("Didn't create a repository!", null == this.wsRepository);
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testConstructorBadWaiter() throws RepositoryCreationException, IndexFormatException {
+        this.wsrConfiguration = new WatchedStorageRepositoryConfiguration(WATCHED_REPO_NAME, new File("build/watchedIndex"), this.artefactBridgeDefinitions, this.watchDir.getAbsolutePath(),
+            BAD_WATCH_INTERVAL, null);
+
+        this.wsRepository = new WatchedStorageRepository(this.wsrConfiguration, mockEventLogger);
+
+        assertTrue("Created a repository after exception!", null == this.wsRepository);
+    }
+
+    @Test
+    public void testGetArtifactLocations() throws Exception {
+        this.wsrConfiguration = new WatchedStorageRepositoryConfiguration(WATCHED_REPO_NAME, new File("build/watchedIndex"), this.artefactBridgeDefinitions, this.watchDir.getAbsolutePath(),
+            WATCH_INTERVAL, null);
+        this.wsRepository = new WatchedStorageRepository(this.wsrConfiguration, mockEventLogger);
+        assertFalse("Didn't create a repository!", null == this.wsRepository);
+
+        Set<String> locations = this.wsRepository.getArtifactLocations(LOCATIONS_TEST_FILENAME);
+        Set<String> expectedLocations = new HashSet<String>(1);
+        expectedLocations.add(new File(this.watchDir,LOCATIONS_TEST_FILENAME).getCanonicalPath());
+        assertNotNull("null locations set returned.", locations);
+        assertEquals("set of locations not expected", expectedLocations, locations);
+    }
+    
+    @Test
+    public void testGetOnEmptyRepository() throws RepositoryCreationException, IOException {
+        this.wsrConfiguration = new WatchedStorageRepositoryConfiguration(WATCHED_REPO_NAME, new File("build/watchedIndex"), this.artefactBridgeDefinitions, this.watchDir.getAbsolutePath(),
+            WATCH_INTERVAL, null);
+
+        this.wsRepository = new WatchedStorageRepository(this.wsrConfiguration, mockEventLogger);
+        
+        assertFalse("Didn't create a repository!", null == this.wsRepository);
+
+        this.wsRepository.start(); // must start it to see things
+
+        VersionRange maxRange = new VersionRange("0");
+        ArtifactDescriptor aD = this.wsRepository.get("static", testArtefactFile1.getName(), maxRange);
+        assertTrue("A descriptor returned, when it shouldn't!", null == aD);
+
+        this.wsRepository.stop(); // tidy up after one!
+    }
+
+    @Test
+    public void testGetInitialArtefact() throws RepositoryCreationException, IOException {
+        this.wsrConfiguration = new WatchedStorageRepositoryConfiguration(WATCHED_REPO_NAME, new File("build/watchedIndex"), this.artefactBridgeDefinitions, this.watchDir.getAbsolutePath(),
+            MIN_WATCH_INTERVAL, null);
+
+        putArtifactFile(testArtefactFile1);
+
+        this.wsRepository = new WatchedStorageRepository(this.wsrConfiguration, mockEventLogger);
+        assertFalse("Didn't create a repository!", null == this.wsRepository);
+
+        this.wsRepository.start(); // must start it to see things
+
+        testDelay(MIN_WATCH_INTERVAL);
+        VersionRange maxRange = new VersionRange("0");
+        ArtifactDescriptor aD = this.wsRepository.get("static", testArtefactFile1.getName(), maxRange);
+        assertTrue("Wrong or null descriptor returned!", (null == aD ? false : aD.getName().equals(testArtefactFile1.getName())));
+
+        this.wsRepository.stop(); // tidy up after one!
+    }
+
+    @Test
+    public void testGetInitialArtefactWithCheck() throws Exception {
+        this.wsrConfiguration = new WatchedStorageRepositoryConfiguration(WATCHED_REPO_NAME, new File("build/watchedIndex"), this.artefactBridgeDefinitions, this.watchDir.getAbsolutePath(),
+            MIN_WATCH_INTERVAL, null);
+
+        putArtifactFile(testArtefactFile1);
+
+        this.wsRepository = new WatchedStorageRepository(this.wsrConfiguration, mockEventLogger);
+        assertFalse("Didn't create a repository!", null == this.wsRepository);
+
+        this.wsRepository.start(); // must start it to see things
+
+        this.wsRepository.forceCheck();
+        
+        VersionRange maxRange = new VersionRange("0");
+        ArtifactDescriptor aD = this.wsRepository.get("static", testArtefactFile1.getName(), maxRange);
+        assertTrue("Wrong or null descriptor returned!", (null == aD ? false : aD.getName().equals(testArtefactFile1.getName())));
+
+        this.wsRepository.stop(); // tidy up after one!
+    }
+
+    /**
+     * Short delay (of seconds) in test
+     */
+    private void testDelay(long secs) {
+        try {
+            Thread.sleep(secs * 1000);
+        } catch (InterruptedException e) {
+            // continue
+        }
+    }
+
+    @Test
+    public void testGetAddAndDeleteArtefact() throws RepositoryCreationException, IOException {
+        this.wsrConfiguration = new WatchedStorageRepositoryConfiguration(WATCHED_REPO_NAME, new File("build/watchedIndex"), this.artefactBridgeDefinitions, this.watchDir.getAbsolutePath(),
+            MIN_WATCH_INTERVAL, null);
+
+        this.wsRepository = new WatchedStorageRepository(this.wsrConfiguration, new MockEventLogger());
+        assertFalse("Didn't create a repository!", null == this.wsRepository);
+
+        this.wsRepository.start(); // must start it to see things
+
+        putArtifactFile(testArtefactFile1);
+
+        testDelay(3 * MIN_WATCH_INTERVAL);
+
+        VersionRange maxRange = new VersionRange("0");
+        RepositoryAwareArtifactDescriptor aD = this.wsRepository.get("static", testArtefactFile1.getName(), maxRange);
+        assertNotNull("Null descriptor returned.", aD);
+        assertEquals(testArtefactFile1.getName(), aD.getName());
+        assertEquals("static", aD.getType());
+        assertEquals(new Version(0, 1, 0), aD.getVersion());
+
+        removeArtifactFile(testArtefactFile1);
+
+        testDelay(2 * MIN_WATCH_INTERVAL);
+
+        aD = this.wsRepository.get("static", testArtefactFile1.getName(), maxRange);
+        assertTrue("A descriptor returned, when it shouldn't!", null == aD);
+
+        this.wsRepository.stop(); // tidy up after one!
+    }
+    
+    @Test
+    public void testGetAddAndDeleteArtefactWithCheck() throws RepositoryCreationException, IOException, ArtifactGenerationException, Exception {
+        this.wsrConfiguration = new WatchedStorageRepositoryConfiguration(WATCHED_REPO_NAME, new File("build/watchedIndex"), this.artefactBridgeDefinitions, this.watchDir.getAbsolutePath(),
+            MIN_WATCH_INTERVAL, null);
+
+        this.wsRepository = new WatchedStorageRepository(this.wsrConfiguration, new MockEventLogger());
+        assertFalse("Didn't create a repository!", null == this.wsRepository);
+
+        this.wsRepository.start(); // watcher needs to be created
+        
+        putArtifactFile(testArtefactFile1);
+
+        this.wsRepository.forceCheck();
+
+        VersionRange maxRange = new VersionRange("0");
+        RepositoryAwareArtifactDescriptor aD = this.wsRepository.get("static", testArtefactFile1.getName(), maxRange);
+        assertNotNull("Null descriptor returned.", aD);
+        assertEquals(testArtefactFile1.getName(), aD.getName());
+        assertEquals("static", aD.getType());
+        assertEquals(new Version(0, 1, 0), aD.getVersion());
+
+        removeArtifactFile(testArtefactFile1);
+
+        this.wsRepository.forceCheck();
+
+        aD = this.wsRepository.get("static", testArtefactFile1.getName(), maxRange);
+        assertTrue("A descriptor returned, when it shouldn't!", null == aD);
+
+        this.wsRepository.stop(); // tidy up after one!
+    }
+
+    @Test
+    public void mBeanPublication() throws Exception {
+        this.wsrConfiguration = new WatchedStorageRepositoryConfiguration(WATCHED_REPO_NAME, new File("build/watchedIndex"), this.artefactBridgeDefinitions, this.watchDir.getAbsolutePath(),
+            WATCH_INTERVAL, MBEAN_DOMAIN_VIRGO_WEB_SERVER);
+
+        this.wsRepository = new WatchedStorageRepository(this.wsrConfiguration, mockEventLogger);
+        ObjectName objectName = new ObjectName(MBEAN_DOMAIN_VIRGO_WEB_SERVER + ":type=Repository,name=" + WATCHED_REPO_NAME);
+        MBeanServer platformMBeanServer = ManagementFactory.getPlatformMBeanServer();
+
+        try {
+            platformMBeanServer.getMBeanInfo(objectName);
+            fail("MBean should not be present until repository has been started");
+        } catch (InstanceNotFoundException infe) {
+        }
+
+        this.wsRepository.start();
+
+        MBeanInfo mBeanInfo = platformMBeanServer.getMBeanInfo(objectName);
+        Object type = mBeanInfo.getDescriptor().getFieldValue("type");
+        assertNotNull(type);
+        assertEquals("watched", type);
+
+        this.wsRepository.stop();
+
+        try {
+            platformMBeanServer.getMBeanInfo(objectName);
+            fail("MBean should not be present once repository has been stopped");
+        } catch (InstanceNotFoundException infe) {
+        }
+    }
+
+    @Test
+    public void mBeanNonPublication() throws Exception {
+        this.wsrConfiguration = new WatchedStorageRepositoryConfiguration(WATCHED_REPO_NAME, new File("build/watchedIndex"), this.artefactBridgeDefinitions, this.watchDir.getAbsolutePath(),
+            WATCH_INTERVAL, null);
+        this.wsRepository = new WatchedStorageRepository(this.wsrConfiguration, mockEventLogger);
+        ObjectName objectName = new ObjectName(MBEAN_DOMAIN_VIRGO_WEB_SERVER + ":type=Repository,name=" + WATCHED_REPO_NAME);
+        MBeanServer platformMBeanServer = ManagementFactory.getPlatformMBeanServer();
+
+        try {
+            platformMBeanServer.getMBeanInfo(objectName);
+            fail("MBean should not be present before start");
+        } catch (InstanceNotFoundException infe) {
+        }
+
+        this.wsRepository.start();
+
+        try {
+            platformMBeanServer.getMBeanInfo(objectName);
+            fail("MBean should not be present after start");
+        } catch (InstanceNotFoundException infe) {
+        }
+
+        this.wsRepository.stop();
+
+        try {
+            platformMBeanServer.getMBeanInfo(objectName);
+            fail("MBean should not be present once repository has been stopped");
+        } catch (InstanceNotFoundException infe) {
+        }
+    }
+
+    /**
+     * Put artefact file copy into watched directory
+     * 
+     * @throws IOException
+     */
+    private File putArtifactFile(File artifactFile) throws IOException {
+        File toFile = new File(this.watchDir, artifactFile.getName());
+        FileCopyUtils.copy(artifactFile, toFile);
+        assertTrue("Failed to copy file into watched directory", toFile.exists());
+        return toFile;
+    }
+
+    /**
+     * Remove artefact file copy from watched directory
+     * 
+     * @throws IOException
+     */
+    private void removeArtifactFile(File artifactFile) throws IOException {
+        File fileToRemove = new File(this.watchDir, artifactFile.getName());
+        fileToRemove.delete();
+        assertFalse("Failed to delete file from watched directory", fileToRemove.exists());
+    }
+
+    @After
+    public void stop() {
+        if (null != this.wsRepository) {
+            this.wsRepository.stop();
+        }
+        if (this.watchDir.isDirectory()) {
+            if (this.watchDir.exists()) {
+                for (File file : this.watchDir.listFiles()) {
+                    file.delete();
+                }
+                this.watchDir.delete();
+            }
+        }
+    }
+
+    /**
+     * <p>
+     * Implementation of <code>ArtefactBridge</code> that understands how to create a minimal Artefact from any given
+     * file. The Artefact name will be that of the file including any extension and the version will always be '0'. The
+     * number of bytes in the file, as reported by the operating system will be added as the sole Attribute with a name
+     * of size.
+     * </p>
+     * 
+     * <strong>Concurrent Semantics</strong><br />
+     * 
+     * This class is Threadsafe
+     * 
+     */
+    private static class StaticBridge implements ArtifactBridge {
+
+        public static final String STATIC_ARTIFACT_TYPE = "static";
+
+        public static final String ARTEFACT_ATTRIBUTE_SIZE = "size";
+
+        /**
+         * {@inheritDoc}
+         */
+        public ArtifactDescriptor generateArtifactDescriptor(File artifact) throws ArtifactGenerationException {
+            if (!artifact.exists()) {
+                throw new ArtifactGenerationException("Artifact must exist at the specified location: " + artifact.getAbsolutePath(),
+                    STATIC_ARTIFACT_TYPE);
+            }
+            ArtifactDescriptorBuilder builder = new ArtifactDescriptorBuilder();
+            builder.setUri(artifact.toURI());
+            builder.setType(STATIC_ARTIFACT_TYPE);
+            builder.setName(artifact.getName());
+            builder.setVersion("0.1.0");
+
+            //Exercise the Attribute builder class a bit
+            AttributeBuilder attrBuilder = new AttributeBuilder().setName(ARTEFACT_ATTRIBUTE_SIZE);
+            attrBuilder.setValue(String.valueOf(artifact.length()));
+            attrBuilder.putProperties("key1","value1");
+            ArrayList<String> valueList = new ArrayList<String>(1);
+            valueList.add("value2");
+            attrBuilder.putProperties("key2",valueList);
+
+            builder.addAttribute(attrBuilder.build());
+
+            return builder.build();
+        }
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/management/ArtifactDescriptorSummaryTests.java b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/management/ArtifactDescriptorSummaryTests.java
new file mode 100644
index 0000000..3a74653
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/management/ArtifactDescriptorSummaryTests.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.management;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.eclipse.virgo.repository.management.ArtifactDescriptorSummary;
+import org.junit.Test;
+
+
+/**
+ * Tests for {@link ArtifactDescriptorSummary}
+ * 
+ */
+public class ArtifactDescriptorSummaryTests {
+
+    private final ArtifactDescriptorSummary adsNull = new ArtifactDescriptorSummary(null,null,null);
+    private final ArtifactDescriptorSummary adsStd = new ArtifactDescriptorSummary("type","name","version");
+    private final ArtifactDescriptorSummary adsStd2 = new ArtifactDescriptorSummary("type","name","version");
+    private final ArtifactDescriptorSummary adsStd3 = new ArtifactDescriptorSummary("type","name1","version");
+    
+    @Test
+    public void nullCase() {
+        assertEquals(null, adsNull.getName());
+        assertEquals(null, adsNull.getType());
+        assertEquals(null, adsNull.getVersion());
+    }
+    @Test
+    public void nonNullCase() {
+        assertEquals("name", adsStd.getName());
+        assertEquals("type", adsStd.getType());
+        assertEquals("version", adsStd.getVersion());
+    }
+    
+    @Test
+    public void stringOf() {
+        assertEquals("type: type, name: name, version: version", adsStd.toString());
+        assertEquals("type: null, name: null, version: null", adsNull.toString());
+    }
+    
+    @Test
+    public void testHash() {
+        int h = adsNull.hashCode();
+        assertTrue(h==adsNull.hashCode());
+        assertFalse(h==adsStd.hashCode());
+        assertTrue(adsStd.hashCode()==adsStd2.hashCode());
+        assertFalse(adsStd.hashCode()==adsStd3.hashCode());
+    }  
+    
+    @Test
+    public void testEquals() {
+        assertTrue(adsStd.equals(adsStd2));
+        assertFalse(adsStd.equals(adsStd3));
+    }
+}
diff --git a/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/util/FileDigestTests.java b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/util/FileDigestTests.java
new file mode 100644
index 0000000..c65120b
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/java/org/eclipse/virgo/repository/util/FileDigestTests.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.repository.util;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.File;
+import java.io.IOException;
+import java.security.NoSuchAlgorithmException;
+
+import org.eclipse.virgo.repository.util.FileDigest;
+import org.junit.Test;
+
+/**
+ */
+public class FileDigestTests {
+    
+    private static final String SHA_HASH = "864adbb74bb984acf884f81a2a06f0b9e04d5231";
+    
+    private static final String MD5_HASH = "82a502028748fe243545e284bb0f5cc1";
+    
+    private static final File testFile = new File("src/test/resources/digest/test.jar");
+
+    @Test
+    public void testGetFileShaDigest() throws IOException {
+        String hash = FileDigest.getFileShaDigest(testFile);
+        assertEquals(SHA_HASH, hash);
+    }
+
+    @Test
+    public void testGetFileDigest() throws NoSuchAlgorithmException, IOException {
+        String hash = FileDigest.getFileDigest(testFile, FileDigest.MD5_DIGEST_ALGORITHM);
+        assertEquals(MD5_HASH, hash);
+    }
+    
+    @Test(expected=NoSuchAlgorithmException.class)
+    public void testInvalidAlgorithm() throws NoSuchAlgorithmException, IOException {
+        FileDigest.getFileDigest(testFile, "none");
+    }
+
+}
diff --git a/repository/org.eclipse.virgo.repository/src/test/resources/artifacts/org.eclipse.virgo.sample.configuration.properties.core.jar b/repository/org.eclipse.virgo.repository/src/test/resources/artifacts/org.eclipse.virgo.sample.configuration.properties.core.jar
new file mode 100644
index 0000000..4398e24
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/resources/artifacts/org.eclipse.virgo.sample.configuration.properties.core.jar
Binary files differ
diff --git a/repository/org.eclipse.virgo.repository/src/test/resources/cacheing/b.jar b/repository/org.eclipse.virgo.repository/src/test/resources/cacheing/b.jar
new file mode 100644
index 0000000..369c871
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/resources/cacheing/b.jar
Binary files differ
diff --git a/repository/org.eclipse.virgo.repository/src/test/resources/cacheing/b2.jar b/repository/org.eclipse.virgo.repository/src/test/resources/cacheing/b2.jar
new file mode 100644
index 0000000..8229400
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/resources/cacheing/b2.jar
Binary files differ
diff --git a/repository/org.eclipse.virgo.repository/src/test/resources/digest/test.jar b/repository/org.eclipse.virgo.repository/src/test/resources/digest/test.jar
new file mode 100644
index 0000000..369c871
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/resources/digest/test.jar
Binary files differ
diff --git a/repository/org.eclipse.virgo.repository/src/test/resources/file-system-searcher/a/1/a1.txt b/repository/org.eclipse.virgo.repository/src/test/resources/file-system-searcher/a/1/a1.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/resources/file-system-searcher/a/1/a1.txt
diff --git a/repository/org.eclipse.virgo.repository/src/test/resources/file-system-searcher/a/1/z/a1z.txt b/repository/org.eclipse.virgo.repository/src/test/resources/file-system-searcher/a/1/z/a1z.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/resources/file-system-searcher/a/1/z/a1z.txt
diff --git a/repository/org.eclipse.virgo.repository/src/test/resources/file-system-searcher/a/1/z/file.wont.be.found.in.suffix.search b/repository/org.eclipse.virgo.repository/src/test/resources/file-system-searcher/a/1/z/file.wont.be.found.in.suffix.search
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/resources/file-system-searcher/a/1/z/file.wont.be.found.in.suffix.search
diff --git a/repository/org.eclipse.virgo.repository/src/test/resources/file-system-searcher/b/1/b1.txt b/repository/org.eclipse.virgo.repository/src/test/resources/file-system-searcher/b/1/b1.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/resources/file-system-searcher/b/1/b1.txt
diff --git a/repository/org.eclipse.virgo.repository/src/test/resources/file-system-searcher/b/1/file.wont.be.found.in.suffix.search b/repository/org.eclipse.virgo.repository/src/test/resources/file-system-searcher/b/1/file.wont.be.found.in.suffix.search
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/resources/file-system-searcher/b/1/file.wont.be.found.in.suffix.search
diff --git a/repository/org.eclipse.virgo.repository/src/test/resources/file-system-searcher/c/1/c1.txt b/repository/org.eclipse.virgo.repository/src/test/resources/file-system-searcher/c/1/c1.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/resources/file-system-searcher/c/1/c1.txt
diff --git a/repository/org.eclipse.virgo.repository/src/test/resources/file-system-searcher/c/c.txt b/repository/org.eclipse.virgo.repository/src/test/resources/file-system-searcher/c/c.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/resources/file-system-searcher/c/c.txt
diff --git a/repository/org.eclipse.virgo.repository/src/test/resources/locations/dira/.gitignore b/repository/org.eclipse.virgo.repository/src/test/resources/locations/dira/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/resources/locations/dira/.gitignore
diff --git a/repository/org.eclipse.virgo.repository/src/test/resources/locations/dirb/.gitignore b/repository/org.eclipse.virgo.repository/src/test/resources/locations/dirb/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/src/test/resources/locations/dirb/.gitignore
diff --git a/repository/org.eclipse.virgo.repository/template.mf b/repository/org.eclipse.virgo.repository/template.mf
new file mode 100644
index 0000000..bc85d5d
--- /dev/null
+++ b/repository/org.eclipse.virgo.repository/template.mf
@@ -0,0 +1,18 @@
+Bundle-ManifestVersion: 2
+Bundle-Name: Artifact Repository
+Bundle-Activator: org.eclipse.virgo.repository.internal.RepositoryBundleActivator
+Bundle-SymbolicName: org.eclipse.virgo.repository
+Bundle-Version: ${version}
+Import-Template:
+ org.eclipse.virgo.util.*;version="${version:[=.=.=, +1)}",
+ javax.management.*;version="0",
+ javax.xml.stream.*;version="0",
+ org.apache.commons.httpclient.*;version="${commonsHttpClientVersion:[=.=.=, +1]}",
+ org.osgi.framework.*;version="0",
+ org.osgi.util.tracker.*;version="0",
+ org.eclipse.virgo.medic.*;version="${version:[=.=.=, +1]}",
+ org.slf4j.*;version="${slf4jVersion:[=.=.0, +1.0.0)}",
+ org.aspectj.*;version="${aspectjVersion:[=.=.=, +1)}"
+Excluded-Exports:
+ org.eclipse.virgo.repository.internal.*,
+ org.eclipse.virgo.repository.storage.*
diff --git a/run_local_smoketest.sh b/run_local_smoketest.sh
new file mode 100755
index 0000000..98b8654
--- /dev/null
+++ b/run_local_smoketest.sh
@@ -0,0 +1,2 @@
+./gradlew -Dci.build=true -Dskip.normalize.bundles=true -Dskip.local.signing=true -Dskip.compress.bundles=true --stacktrace clean jar build distZip fullDistZip rapDistZip installDist installFullDist installRapDist smokeTest -x test -x findBugsMain -x findBugsTest
+
diff --git a/settings.gradle b/settings.gradle
new file mode 100644
index 0000000..7f355ba
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1,139 @@
+
+include ':util:org.eclipse.virgo.util.common'
+include ':util:org.eclipse.virgo.util.env'
+include ':util:org.eclipse.virgo.util.io'
+include ':util:org.eclipse.virgo.util.jmx'
+include ':util:org.eclipse.virgo.util.math'
+include ':util:org.eclipse.virgo.util.osgi'
+include ':util:org.eclipse.virgo.util.osgi.manifest'
+include ':util:org.eclipse.virgo.util.parser.launcher'
+include ':util:org.eclipse.virgo.util.parser.manifest'
+
+include ':test:org.eclipse.virgo.test.stubs'
+include ':medic:org.eclipse.virgo.medic.test'
+
+include ':medic:org.eclipse.virgo.medic'
+include ':medic:org.eclipse.virgo.medic.core'
+include ':medic:org.eclipse.virgo.medic.logbackcorefragment'
+include ':medic:org.eclipse.virgo.medic.logbackclassicfragment'
+
+include ':repository:org.eclipse.virgo.repository'
+
+include ':nano:org.eclipse.virgo.nano.authentication'
+include ':nano:org.eclipse.virgo.nano.core'
+include ':nano:org.eclipse.virgo.nano.deployer'
+include ':nano:org.eclipse.virgo.nano.deployer.api'
+include ':nano:org.eclipse.virgo.nano.deployer.hot'
+include ':nano:org.eclipse.virgo.nano.management'
+include ':nano:org.eclipse.virgo.nano.management.controller'
+include ':nano:org.eclipse.virgo.nano.services.concurrent'
+include ':nano:org.eclipse.virgo.nano.services.ds'
+include ':nano:org.eclipse.virgo.nano.shutdown'
+
+include ':kernel:org.eclipse.virgo.kernel.agent.dm'
+include ':kernel:org.eclipse.virgo.kernel.artifact'
+include ':kernel:org.eclipse.virgo.kernel.deployer'
+include ':kernel:org.eclipse.virgo.kernel.osgi'
+include ':kernel:org.eclipse.virgo.kernel.stubs'
+include ':kernel:org.eclipse.virgo.kernel.deployer.dm'
+include ':kernel:org.eclipse.virgo.kernel.dmfragment'
+include ':kernel:org.eclipse.virgo.kernel.equinox.extensions'
+include ':kernel:org.eclipse.virgo.kernel.kerneldmfragment'
+include ':kernel:org.eclipse.virgo.kernel.model'
+include ':kernel:org.eclipse.virgo.kernel.osgi'
+include ':kernel:org.eclipse.virgo.kernel.services'
+include ':kernel:org.eclipse.virgo.kernel.userregion'
+include ':kernel:org.eclipse.virgo.kernel.userregionfactory'
+include ':kernel:org.eclipse.virgo.management.console'
+include ':kernel:org.eclipse.virgo.management.fragment'
+include ':kernel:org.eclipse.virgo.shell.command'
+
+include ':web:org.eclipse.virgo.web.core'
+include ':web:org.eclipse.virgo.web.dm'
+include ':web:org.eclipse.virgo.web.enterprise.openejb.jpa.integration'
+include ':web:org.eclipse.virgo.web.servlet.adapter'
+include ':web:org.eclipse.virgo.web.spring.integration'
+include ':web:org.eclipse.virgo.web.tomcat.support'
+include ':web:org.eclipse.virgo.web.enterprise.appdeployer'
+include ':web:org.eclipse.virgo.web.enterprise.applistener'
+include ':web:org.eclipse.virgo.web.enterprise.jsf.support'
+include ':web:org.eclipse.virgo.web.enterprise.openejb.fragment.bval'
+include ':web:org.eclipse.virgo.web.enterprise.openejb.fragment.jotm'
+include ':web:org.eclipse.virgo.web.enterprise.openejb.fragment.jpa'
+include ':web:org.eclipse.virgo.web.enterprise.openejb.initialiser'
+include ':web:org.eclipse.virgo.web.enterprise.services.accessor'
+include ':web:org.eclipse.virgo.web.enterprise.security'
+include ':web:org.eclipse.virgo.web.enterprise.security.valve'
+include ':web:org.eclipse.virgo.web.enterprise.security.openejb.classloading.hook'
+include ':web:org.eclipse.virgo.web.enterprise.catalina.fragment.webbeans'
+include ':web:org.eclipse.virgo.web.enterprise.openejb.fragment.webbeans'
+include ':web:org.eclipse.virgo.web.enterprise.openwebbeans.initialiser'
+include ':web:org.eclipse.virgo.web.enterprise.persistence.openejb.classloading.hook'
+include ':web:org.eclipse.virgo.web.enterprise.javax.persistence.extension'
+include ':web:org.eclipse.virgo.web.enterprise.javax.persistence.provider.initializer'
+include ':web:org.eclipse.virgo.web.enterprise.openejb.tomcat.factory'
+include ':web:org.eclipse.virgo.web.war.deployer'
+
+include ':apps:org.eclipse.virgo.apps.repository.core'
+include ':apps:org.eclipse.virgo.apps.repository.web'
+include ':apps:org.eclipse.virgo.apps.splash'
+
+include ':util:org.eclipse.virgo.util.integrationtest'
+//include ':medic:org.eclipse.virgo.medic.integrationtest'
+
+if (System.properties['include.docs'] == 'true') {
+	include ':documentation:programmer-guide'
+	include ':documentation:tooling-guide'
+	include ':documentation:user-guide'
+}
+
+include ':org.eclipse.virgo.site'
+// TODO - rename feature to region'_'
+include ':org.eclipse.virgo.site:org.eclipse.equinox.regions'
+include ':org.eclipse.virgo.site:org.eclipse.equinox.http.jetty'
+include ':org.eclipse.virgo.site:org.eclipse.rap'
+include ':org.eclipse.virgo.site:org.eclipse.virgo.core'
+include ':org.eclipse.virgo.site:org.eclipse.virgo.ds'
+include ':org.eclipse.virgo.site:org.eclipse.virgo.kernel'
+include ':org.eclipse.virgo.site:org.eclipse.virgo.kernel.springintegration'
+include ':org.eclipse.virgo.site:org.eclipse.virgo.management'
+include ':org.eclipse.virgo.site:org.eclipse.virgo.medic'
+include ':org.eclipse.virgo.site:org.eclipse.virgo.nano.deployer'
+include ':org.eclipse.virgo.site:org.eclipse.virgo.nano.mbeans'
+include ':org.eclipse.virgo.site:org.eclipse.virgo.nano.mbeans.controller'
+include ':org.eclipse.virgo.site:org.eclipse.virgo.services.concurrent'
+include ':org.eclipse.virgo.site:org.eclipse.virgo.services.ds'
+include ':org.eclipse.virgo.site:org.eclipse.virgo.shell'
+include ':org.eclipse.virgo.site:org.eclipse.virgo.simpleconfigurator'
+// TODO - rename feature to org.eclipse.gemini.blueprint
+include ':org.eclipse.virgo.site:org.eclipse.virgo.springdm'
+include ':org.eclipse.virgo.site:org.eclipse.virgo.webconsole.deps'
+include ':org.eclipse.virgo.site:org.eclipse.virgo.p2.provisioning'
+include ':org.eclipse.virgo.site:org.eclipse.gemini.web'
+include ':org.eclipse.virgo.site:org.eclipse.virgo.nano.war.deployer'
+include ':org.eclipse.virgo.site:org.eclipse.virgo.enterprise'
+
+include ':org.eclipse.virgo.site:org.eclipse.virgo.tools'
+
+include ':packaging:nano'
+include ':packaging:kernel'
+include ':packaging:jetty-server'
+include ':packaging:tomcat-server'
+
+// included as required from Virgo Snaps
+include ':test:org.eclipse.virgo.test.launcher'
+include ':test:org.eclipse.virgo.test.framework'
+
+if (System.properties['skip.smoke.tests'] != 'true') {
+	include ':test:org.eclipse.virgo.test.tools'
+	include ':packaging:nano:org.eclipse.virgo.nano.smoketest'
+	include ':packaging:kernel:org.eclipse.virgo.kernel.smoketest'
+	include ':packaging:jetty-server:org.eclipse.virgo.jetty.smoketest'
+	include ':packaging:tomcat-server:org.eclipse.virgo.tomcat.smoketest'
+
+	// TODO - check if this module is still needed - only in unused?! feature org.eclipse.virgo.nano.detailed
+	// include ':web:org.eclipse.virgo.web.war.deployer'
+
+	// include ':system-tests:org.eclipse.virgo.server.svt' // TODO revive system verification tests: https://bugs.eclipse.org/bugs/show_bug.cgi?id=386636#c6
+	// include ':performance-tests:org.eclipse.virgo.qa.performance'
+}
diff --git a/test/.gitignore b/test/.gitignore
new file mode 100644
index 0000000..3fbb103
--- /dev/null
+++ b/test/.gitignore
@@ -0,0 +1,13 @@
+*/src/main/resources/META-INF/MANIFEST.MF
+*/src/test/resources/META-INF/TEST.MF
+target
+integration-repo
+ivy-cache
+.ant-targets-build.xml
+user-ivy.properties
+bin/
+build/
+.settings/
+.project
+.classpath
+
diff --git a/test/CONTRIBUTING.md b/test/CONTRIBUTING.md
new file mode 100644
index 0000000..e3a5790
--- /dev/null
+++ b/test/CONTRIBUTING.md
@@ -0,0 +1,47 @@
+Contributing to Virgo
+=====================
+
+Thanks for your interest in this project.
+
+Project description:
+--------------------
+
+The Virgo Web Server from EclipseRT is a completely module-based Java application server that is designed to run enterprise Java applications and Spring-powered applications with a high degree of flexibility and reliability. It offers a simple yet comprehensive platform to develop, deploy, and service enterprise Java applications.
+The Virgo kernel supports the core concepts of Virgo and is not biased towards the web server, thus enabling other types of server to be created. The kernel can also be used stand-alone as a rich OSGi application platform. A server runtime can easily be constructed by deploying suitable bundles on top of the kernel.
+
+- https://projects.eclipse.org/projects/rt.virgo
+
+Developer resources:
+--------------------
+
+Information regarding source code management, builds, coding standards, and more.
+
+- https://projects.eclipse.org/projects/rt.virgo/developer
+
+Contributor License Agreement:
+------------------------------
+
+Before your contribution can be accepted by the project, you need to create and electronically sign the Eclipse Foundation Contributor License Agreement (CLA).
+
+- http://www.eclipse.org/legal/CLA.php
+
+Contact:
+--------
+
+Contact the project developers via the project's "dev" list.
+
+- https://dev.eclipse.org/mailman/listinfo/virgo-dev
+
+Search for bugs:
+----------------
+
+This project uses Bugzilla to track ongoing development and issues.
+
+- https://bugs.eclipse.org/bugs/buglist.cgi?product=Virgo
+
+Create a new bug:
+-----------------
+
+Be sure to search for existing bugs before you create another one. Remember that contributions are always welcome!
+
+- https://bugs.eclipse.org/bugs/enter_bug.cgi?product=Virgo
\ No newline at end of file
diff --git a/test/build.gradle b/test/build.gradle
new file mode 100644
index 0000000..dc96e11
--- /dev/null
+++ b/test/build.gradle
@@ -0,0 +1,34 @@
+project(':test:org.eclipse.virgo.test.stubs') {
+	dependencies {
+		compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi", version: equinoxVersion, configuration: "compile", ext: "jar"
+		compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi.services", version: osgiServicesVersion, configuration: "compile", ext: "jar"
+		compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.equinox.region", version: equinoxRegionVersion, configuration: "compile", ext: "jar"
+	}
+}
+
+project(':test:org.eclipse.virgo.test.tools') {
+	dependencies {
+		compile project(':util:org.eclipse.virgo.util.io')
+		compile group: "org.apache.httpcomponents", name: "httpcore", version: httpcomponentsCoreVersion
+		compile group: "org.apache.httpcomponents", name: "httpclient", version: httpcomponentsClientVersion
+	}
+}
+
+project(':test:org.eclipse.virgo.test.launcher') {
+	dependencies {
+		compile project(':util:org.eclipse.virgo.util.parser.launcher')
+		compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi", version: equinoxVersion, configuration: "compile", ext: "jar"
+		testCompile group: 'junit', name: 'junit', version: junitVersion, configuration: "compile", ext: "jar"
+	}
+}
+
+project(':test:org.eclipse.virgo.test.framework') {
+	dependencies {
+		compile project(':util:org.eclipse.virgo.util.common')
+        compile project(':test:org.eclipse.virgo.test.stubs')
+        compile project(':test:org.eclipse.virgo.test.launcher')
+		compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi", version: equinoxVersion, configuration: "compile", ext: "jar"
+		testCompile group: 'junit', name: 'junit', version: junitVersion, configuration: "compile", ext: "jar"
+	}
+}
+
diff --git a/test/org.eclipse.virgo.test.framework/src/main/java/org/eclipse/virgo/test/framework/BundleDependencies.java b/test/org.eclipse.virgo.test.framework/src/main/java/org/eclipse/virgo/test/framework/BundleDependencies.java
new file mode 100644
index 0000000..e3b899e
--- /dev/null
+++ b/test/org.eclipse.virgo.test.framework/src/main/java/org/eclipse/virgo/test/framework/BundleDependencies.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.framework;
+
+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;
+
+/**
+ * BundleDependencies defines class-level metadata which can be used to instruct test framework with extra bundles to
+ * append to framework (system bundle) during start up.
+ * <p />
+ * This set of bundles is considered to be <em>transitively complete</em>, that is all dependencies must be provided.
+ * 
+ */
+@Documented
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+@Inherited
+public @interface BundleDependencies {
+
+    
+    /**
+     * Bundle entries to load as part of the test framework.
+     * 
+     * @return
+     */
+    BundleEntry[] entries() default {};
+    
+    /**
+     * Whether or not {@link #entries() entries} from superclasses should be <em>inherited</em>.
+     * <p>Default value is <code>true</code>, which means that entries from subclass will be
+     * <em>appended</em> to the list of entries from superclass.
+     * 
+     * @return
+     */
+    boolean inheritDependencies() default true;
+}
diff --git a/test/org.eclipse.virgo.test.framework/src/main/java/org/eclipse/virgo/test/framework/BundleEntry.java b/test/org.eclipse.virgo.test.framework/src/main/java/org/eclipse/virgo/test/framework/BundleEntry.java
new file mode 100644
index 0000000..6f257e3
--- /dev/null
+++ b/test/org.eclipse.virgo.test.framework/src/main/java/org/eclipse/virgo/test/framework/BundleEntry.java
@@ -0,0 +1,46 @@
+/*
+ * This file is part of the Eclipse Virgo project.
+ *
+ * Copyright (c) 2010 Chariot Solutions
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    dsklyut - initial contribution
+ */
+
+package org.eclipse.virgo.test.framework;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 
+ * BundleEntry defines a URI of the bundle to install and autoStart flag that signals to framework that particular entry
+ * must be started as well as installed.
+ * <p />
+ * Note: This annotation is used by {@link BundleDependencies} and not designed to be used stand-alone
+ */
+@Target({})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface BundleEntry {
+
+    /**
+     * URI of the bundle to install.  Must be a valid {@link URI} format.
+     * @return
+     */
+    String value();
+
+    /**
+     * (* Optional *)
+     * Flag to auto start bundle after install into framework.
+     * By default it is true.
+     * 
+     * For fragment bundles - make sure to set it to false
+     * @return
+     */
+    boolean autoStart() default true;
+}
\ No newline at end of file
diff --git a/test/org.eclipse.virgo.test.framework/src/main/java/org/eclipse/virgo/test/framework/BundleLocationLocator.java b/test/org.eclipse.virgo.test.framework/src/main/java/org/eclipse/virgo/test/framework/BundleLocationLocator.java
new file mode 100644
index 0000000..3744000
--- /dev/null
+++ b/test/org.eclipse.virgo.test.framework/src/main/java/org/eclipse/virgo/test/framework/BundleLocationLocator.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.framework;
+
+import java.security.ProtectionDomain;
+
+final class BundleLocationLocator {
+
+	public static String determineBundleLocation(Class<?> clazz) {
+		ProtectionDomain pd = clazz.getProtectionDomain();
+		String location = pd.getCodeSource().getLocation().toString();
+        return location;
+	}
+}
diff --git a/test/org.eclipse.virgo.test.framework/src/main/java/org/eclipse/virgo/test/framework/ConfigLocation.java b/test/org.eclipse.virgo.test.framework/src/main/java/org/eclipse/virgo/test/framework/ConfigLocation.java
new file mode 100644
index 0000000..e4e50ef
--- /dev/null
+++ b/test/org.eclipse.virgo.test.framework/src/main/java/org/eclipse/virgo/test/framework/ConfigLocation.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.framework;
+
+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;
+
+
+/**
+ * <code>ConfigLocation</code> can be used to annotate a test class to specify the location from which
+ * the test framework should load its configuration. In the absence of the annotation the default
+ * location of <code>META-INF/test.config.properties</code> is used.
+ *
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+@Inherited
+public @interface ConfigLocation {
+    
+    String value();
+}
diff --git a/test/org.eclipse.virgo.test.framework/src/main/java/org/eclipse/virgo/test/framework/ConfigurationPropertiesLoader.java b/test/org.eclipse.virgo.test.framework/src/main/java/org/eclipse/virgo/test/framework/ConfigurationPropertiesLoader.java
new file mode 100644
index 0000000..356330c
--- /dev/null
+++ b/test/org.eclipse.virgo.test.framework/src/main/java/org/eclipse/virgo/test/framework/ConfigurationPropertiesLoader.java
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.framework;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Properties;
+
+import org.eclipse.virgo.util.common.PropertyPlaceholderResolver;
+
+public class ConfigurationPropertiesLoader {
+
+    private static final String DEFAULT_USER_CONFIG_LOCATION = "META-INF/test.config.properties";
+
+    private static final String DEFAULT_CONFIG_LOCATION = "org/eclipse/virgo/test/framework/base.configuration.properties";
+
+    private static final String PROP_PROPERTIES_INCLUDE = "org.eclipse.virgo.test.properties.include";
+
+    private static final String PROP_BASEDIR = "basedir";
+
+    public Properties loadConfigurationProperties(Class<?> testClass) throws IOException {
+        Properties config = new Properties();
+        loadProperties(config, getClass().getClassLoader(), DEFAULT_CONFIG_LOCATION, true);
+
+        String userConfigLocation = determineUserConfigLocation(testClass);
+
+        loadProperties(config, testClass.getClassLoader(), userConfigLocation, false);
+        loadConfiguredProperties(config);
+        addInBuiltProperties(config);
+
+        PropertyPlaceholderResolver resolver = new PropertyPlaceholderResolver();
+        return resolver.resolve(config);
+    }
+
+    private String determineUserConfigLocation(Class<?> testClass) {
+        ConfigLocation configLocation = testClass.getAnnotation(ConfigLocation.class);
+        if (configLocation != null) {
+            return configLocation.value();
+        } else {
+            return DEFAULT_USER_CONFIG_LOCATION;
+        }
+    }
+
+    private void loadConfiguredProperties(Properties config) throws IOException {
+        String includeProperties = config.getProperty(PROP_PROPERTIES_INCLUDE);
+        if (includeProperties != null && includeProperties.trim().length() > 0) {
+            String[] includes = includeProperties.split(",");
+            for (String include : includes) {
+                URL url = new URL(include.trim());
+                InputStream s = url.openStream();
+                try {
+                    config.load(s);
+                } finally {
+                    s.close();
+                }
+            }
+        }
+
+    }
+
+    private void addInBuiltProperties(Properties config) {
+        if (!config.containsKey(PROP_BASEDIR)) {
+            config.setProperty(PROP_BASEDIR, System.getProperty("user.dir"));
+        }
+    }
+
+    protected final void loadProperties(Properties properties, ClassLoader classLoader, String path, boolean required) throws IOException {
+        InputStream stream = classLoader.getResourceAsStream(path);
+
+        if (required && stream == null) {
+            throw new IllegalStateException("Unable to locate configuration file '" + path + "' from '" + classLoader + "'");
+        }
+        if (stream != null) {
+            try {
+                properties.load(stream);
+            } finally {
+                stream.close();
+            }
+        }
+    }
+}
diff --git a/test/org.eclipse.virgo.test.framework/src/main/java/org/eclipse/virgo/test/framework/OsgiTestRunner.java b/test/org.eclipse.virgo.test.framework/src/main/java/org/eclipse/virgo/test/framework/OsgiTestRunner.java
new file mode 100644
index 0000000..f63a26d
--- /dev/null
+++ b/test/org.eclipse.virgo.test.framework/src/main/java/org/eclipse/virgo/test/framework/OsgiTestRunner.java
@@ -0,0 +1,242 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.framework;
+
+import org.eclipse.osgi.framework.internal.core.FrameworkProperties;
+import org.eclipse.virgo.test.launcher.FrameworkBuilder;
+import org.eclipse.virgo.test.launcher.FrameworkBuilder.FrameworkCustomizer;
+import org.eclipse.virgo.test.framework.plugin.PluginManager;
+import org.eclipse.virgo.util.common.PropertyPlaceholderResolver;
+import org.junit.runner.notification.Failure;
+import org.junit.runner.notification.RunNotifier;
+import org.junit.runners.BlockJUnit4ClassRunner;
+import org.junit.runners.model.InitializationError;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.FrameworkEvent;
+import org.osgi.framework.FrameworkListener;
+import org.osgi.framework.launch.Framework;
+import org.osgi.framework.startlevel.FrameworkStartLevel;
+
+import javax.management.JMException;
+import javax.management.MBeanServer;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+import java.lang.management.ManagementFactory;
+import java.lang.reflect.Field;
+import java.net.URI;
+import java.util.*;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * JUnit TestRunner for running OSGi integration tests on the Equinox framework.
+ * <p/>
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ * TODO Document concurrent semantics of OsgiTestRunner
+ */
+public class OsgiTestRunner extends BlockJUnit4ClassRunner {
+    
+    private static final int DEFAULT_BUNDLE_START_LEVEL = 4;
+
+    private final ConfigurationPropertiesLoader loader = new ConfigurationPropertiesLoader();
+
+    private final PluginManager pluginManager;
+
+    private final MBeanServer server = ManagementFactory.getPlatformMBeanServer();
+    private final ObjectName searchObjectName;
+
+    public OsgiTestRunner(Class<?> klass) throws InitializationError, MalformedObjectNameException {
+        super(klass);
+        this.pluginManager = new PluginManager(klass);
+        this.searchObjectName = new ObjectName("org.eclipse.virgo.*:*");
+    }
+
+    private void stupidEquinoxHack() {
+        try {
+            Field field = FrameworkProperties.class.getDeclaredField("properties");
+            synchronized (FrameworkProperties.class) {
+                field.setAccessible(true);
+                field.set(null, null);
+            }
+        } catch (Exception e) {
+            throw new RuntimeException("Unable to hack Equinox", e);
+        }
+    }
+
+    @Override
+    public final void run(RunNotifier notifier) {
+
+        Framework framework = null;
+
+        try {
+            stupidEquinoxHack();
+
+            // Preserve and re-instate the context classloader since tests can sometimes leave it in a strange state.
+            ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+            try {
+                final Properties configurationProperties = createConfigurationProperties();
+                framework = launchOsgi(configurationProperties);
+                BundleContext targetBundleContext = getTargetBundleContext(framework.getBundleContext());
+                postProcessTargetBundleContext(targetBundleContext, configurationProperties);
+                Bundle testBundle = installAndStartTestBundle(targetBundleContext);
+                Class<?> osgiTestClass = createOsgiTestClass(testBundle);
+                // create the real runner, dispatch it against the class loaded from OSGi
+                BlockJUnit4ClassRunner realRunner = new BlockJUnit4ClassRunner(osgiTestClass);
+                realRunner.run(notifier);
+            } finally {
+                Thread.currentThread().setContextClassLoader(classLoader);
+            }
+        } catch (Throwable e) {
+            notifier.fireTestFailure(new Failure(getDescription(), e));
+        } finally {
+            if (framework != null) {
+                try {
+                    framework.stop();
+                    framework.waitForStop(30000);
+                } catch (Throwable e) {
+                    e.printStackTrace();
+                }
+            }
+            unregisterVirgoMBeans(notifier);
+            // TODO confirm that this can be removed as nested frameworks are no longer used
+            //BundleFileClosingBundleFileWrapperFactoryHook.getInstance().cleanup();
+        }
+    }
+
+    private void unregisterVirgoMBeans(RunNotifier notifier) {
+        Set<ObjectName> objectNames = this.server.queryNames(this.searchObjectName, null);
+
+        if (objectNames.size() == 0) {
+            return;
+        }
+
+        for (ObjectName objectName : objectNames) {
+            try {
+                this.server.unregisterMBean(objectName);
+            } catch (JMException jme) {
+                jme.printStackTrace();
+            }
+        }
+
+        notifier.fireTestFailure(new Failure(getDescription(),
+                                             new IllegalStateException("The mBeans " + objectNames +
+                                                                       " were not unregistered.")));
+    }
+
+    private Bundle installAndStartTestBundle(BundleContext targetBundleContext) throws BundleException {
+        Bundle testBundle = targetBundleContext.installBundle(getTestBundleLocation());
+        testBundle.start();
+        return testBundle;
+    }
+
+    /**
+     * Returns the {@link BundleContext} that should be used to install the test bundle
+     *
+     * @return the target <code>BundleContext</code>.
+     */
+    protected BundleContext getTargetBundleContext(BundleContext bundleContext) {
+        return bundleContext;
+    }
+
+    protected void postProcessTargetBundleContext(BundleContext bundleContext, Properties frameworkProperties) throws Exception {
+        // nothing for this implementation...
+    }
+
+    // load the test class from within OSGi
+    private Class<?> createOsgiTestClass(Bundle testBundle) throws ClassNotFoundException {
+        Class<?> osgiJavaTestClass = testBundle.loadClass(getTestClass().getName());
+        Class<?> osgiTestClass = osgiJavaTestClass;
+        return osgiTestClass;
+    }
+
+    // launch the OSGi framework. will also install the test bundle
+    private Framework launchOsgi(Properties frameworkProperties) throws Exception {
+        final Properties configurationProperties = new Properties(frameworkProperties);
+        FrameworkBuilder builder = new FrameworkBuilder(configurationProperties, new FrameworkCustomizer() {
+
+            public void beforeInstallBundles(Framework framework) {
+
+                /*
+                 * Use the same default start level as the user region bundles. Program the framework start level
+                 * instance defensively to allow for stubs which don't understand adapt.
+                 */
+                FrameworkStartLevel frameworkStartLevel = (FrameworkStartLevel) framework.getBundleContext().getBundle(0).adapt(
+                    FrameworkStartLevel.class);
+                if (frameworkStartLevel != null) {
+                    final CountDownLatch latch = new CountDownLatch(1);
+                    frameworkStartLevel.setStartLevel(DEFAULT_BUNDLE_START_LEVEL, new FrameworkListener() {
+
+                        @Override
+                        public void frameworkEvent(FrameworkEvent event) {
+                            if (FrameworkEvent.STARTLEVEL_CHANGED == event.getType()) {
+                                latch.countDown();
+                            }
+                            
+                        }});
+                    try {
+                        latch.await(30000, TimeUnit.MILLISECONDS);
+                    } catch (InterruptedException e) {
+                        throw new RuntimeException("Start level latch interrupted", e);
+                    }
+                    frameworkStartLevel.setInitialBundleStartLevel(DEFAULT_BUNDLE_START_LEVEL);
+                }
+
+                OsgiTestRunner.this.pluginManager.getPluginDelegate().beforeInstallBundles(framework, configurationProperties);
+            }
+
+            public void afterInstallBundles(Framework framework) {
+
+            }
+        });
+        addUserConfiguredBundles(builder, configurationProperties);
+        return builder.start();
+    }
+
+    private void addUserConfiguredBundles(FrameworkBuilder builder, Properties configurationProperties) throws Exception {
+        Class<BundleDependencies> annotationType = BundleDependencies.class;
+        Class<?> annotationDeclaringClazz = TestFrameworkUtils.findAnnotationDeclaringClass(annotationType, getTestClass().getJavaClass());
+
+        if (annotationDeclaringClazz == null) {
+            // could not find an 'annotation declaring class' for annotation + annotationType + and targetType +
+            // startFromClazz
+            return;
+        }
+
+        List<BundleEntry> bundleEntries = new ArrayList<BundleEntry>();
+
+        while (annotationDeclaringClazz != null) {
+            BundleDependencies dependencies = annotationDeclaringClazz.getAnnotation(annotationType);
+            BundleEntry[] entries = dependencies.entries();
+
+            bundleEntries.addAll(0, Arrays.<BundleEntry> asList(entries));
+            annotationDeclaringClazz = dependencies.inheritDependencies() ? TestFrameworkUtils.findAnnotationDeclaringClass(annotationType,
+                annotationDeclaringClazz.getSuperclass()) : null;
+        }
+        PropertyPlaceholderResolver resolver = new PropertyPlaceholderResolver();
+        for (BundleEntry entry : bundleEntries) {
+            final String formattedPath = resolver.resolve(entry.value(), configurationProperties);
+            builder.addBundle(new URI(formattedPath), entry.autoStart());
+        }
+
+    }
+
+    private String getTestBundleLocation() {
+        return BundleLocationLocator.determineBundleLocation(getTestClass().getJavaClass());
+    }
+
+    private Properties createConfigurationProperties() throws Exception {
+        return this.loader.loadConfigurationProperties(getTestClass().getJavaClass());
+    }
+}
diff --git a/test/org.eclipse.virgo.test.framework/src/main/java/org/eclipse/virgo/test/framework/TestFrameworkUtils.java b/test/org.eclipse.virgo.test.framework/src/main/java/org/eclipse/virgo/test/framework/TestFrameworkUtils.java
new file mode 100644
index 0000000..7d29353
--- /dev/null
+++ b/test/org.eclipse.virgo.test.framework/src/main/java/org/eclipse/virgo/test/framework/TestFrameworkUtils.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.framework;
+
+import java.lang.annotation.Annotation;
+
+import org.eclipse.virgo.util.common.Assert;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleReference;
+import org.osgi.framework.Constants;
+
+public final class TestFrameworkUtils {
+
+    private TestFrameworkUtils() {
+        // do not new me
+    }
+
+    public static BundleContext getBundleContextForTestClass(Class<?> testClass) {
+        ClassLoader classLoader = testClass.getClassLoader();
+        if (classLoader instanceof BundleReference) {
+            return ((BundleReference) classLoader).getBundle().getBundleContext();
+        } else {
+            throw new IllegalArgumentException("Class '" + testClass.getName() + "' does not appear to be a valid test class.");
+        }
+    }
+
+    /**
+     * Checks {@link Constants#FRAGMENT_HOST} header to determine if bundle is a fragment
+     * 
+     * @param bundle
+     * @return
+     */
+    public static boolean isFragment(Bundle bundle) {
+        Assert.notNull(bundle, "bundle is required");
+        return bundle.getHeaders().get(Constants.FRAGMENT_HOST) != null;
+    }
+
+    public static Class<?> findAnnotationDeclaringClass(Class<? extends Annotation> annotation, Class<?> clazzToStart) {
+        Assert.notNull(annotation, "Annotation is required");
+        // stop on object
+        if (clazzToStart == null || clazzToStart.equals(Object.class)) {
+            return null;
+        }
+
+        return clazzToStart.getAnnotation(annotation) != null ? clazzToStart : findAnnotationDeclaringClass(annotation, clazzToStart.getSuperclass());
+    }
+}
diff --git a/test/org.eclipse.virgo.test.framework/src/main/java/org/eclipse/virgo/test/framework/dmkernel/DmKernelTestRunner.java b/test/org.eclipse.virgo.test.framework/src/main/java/org/eclipse/virgo/test/framework/dmkernel/DmKernelTestRunner.java
new file mode 100644
index 0000000..1aae215
--- /dev/null
+++ b/test/org.eclipse.virgo.test.framework/src/main/java/org/eclipse/virgo/test/framework/dmkernel/DmKernelTestRunner.java
@@ -0,0 +1,176 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.framework.dmkernel;
+
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.Properties;
+
+import org.eclipse.virgo.test.framework.BundleEntry;
+import org.eclipse.virgo.test.framework.OsgiTestRunner;
+import org.eclipse.virgo.test.framework.TestFrameworkUtils;
+import org.eclipse.virgo.util.common.CollectionUtils;
+import org.eclipse.virgo.util.common.PropertyPlaceholderResolver;
+import org.junit.runners.model.InitializationError;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.startlevel.FrameworkStartLevel;
+
+import javax.management.MalformedObjectNameException;
+
+/**
+ * JUnit TestRunner for running OSGi integration tests on the dm Kernel.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * As thread-safe as OsgiTestRunner
+ * 
+ */
+public class DmKernelTestRunner extends OsgiTestRunner {
+
+    private static final int DEFAULT_BUNDLE_START_LEVEL = 4;
+
+    private static final long DEFAULT_USER_REGION_START_WAIT_TIME = 60000;
+
+    private final long userRegionStartWaitTime;
+
+    public DmKernelTestRunner(Class<?> klass) throws InitializationError, MalformedObjectNameException {
+        this(klass, DEFAULT_USER_REGION_START_WAIT_TIME);
+    }
+
+    protected DmKernelTestRunner(Class<?> klass, long userRegionStartWaitTime) throws InitializationError, MalformedObjectNameException {
+        super(klass);
+        this.userRegionStartWaitTime = userRegionStartWaitTime;
+    }
+
+    @Override
+    protected BundleContext getTargetBundleContext(BundleContext bundleContext) {
+        Collection<ServiceReference<BundleContext>> serviceReferences = getUserRegionBundleContextServiceReferences(bundleContext);
+
+        if (serviceReferences != null) {
+            if (serviceReferences.size() != 1) {
+                throw new IllegalStateException("There must be exactly one user region bundle context in the service registry. "
+                    + serviceReferences.size() + " were found.");
+            } else {
+                BundleContext targetBundleContext = (BundleContext) bundleContext.getService(serviceReferences.iterator().next());
+                if (targetBundleContext != null) {
+                    return targetBundleContext;
+                }
+            }
+        }
+        throw new IllegalStateException("User region's bundle context was not available from the service registry within "
+            + (this.userRegionStartWaitTime / 1000) + " seconds.");
+    }
+
+    /**
+     * Installs additional user region bundles based on {@link RegionBundleDependencies}
+     */
+    @Override
+    protected void postProcessTargetBundleContext(BundleContext bundleContext, Properties frameworkConfigurationProperties) throws Exception {
+
+        /*
+         * Use the same default start level for user region bundles as the user region factory. Program the framework
+         * start level instance defensively to allow for stubs which don't understand adapt.
+         */
+        FrameworkStartLevel frameworkStartLevel = (FrameworkStartLevel) bundleContext.getBundle(0).adapt(FrameworkStartLevel.class);
+        if (frameworkStartLevel != null) {
+            frameworkStartLevel.setInitialBundleStartLevel(DEFAULT_BUNDLE_START_LEVEL);
+        }
+
+        final Properties configurationProperties = new Properties(frameworkConfigurationProperties);
+
+        // This list is installed post installation of user region bundle that includes bundles listed in the
+        // user region configuration file as implemented in kernel RegionManager
+        Class<RegionBundleDependencies> annotationType = RegionBundleDependencies.class;
+        Class<?> annotationDeclaringClazz = TestFrameworkUtils.findAnnotationDeclaringClass(annotationType, getTestClass().getJavaClass());
+
+        if (annotationDeclaringClazz == null) {
+            // could not find an 'annotation declaring class' for annotation + annotationType + and targetType +
+            // startFromClazz
+            return;
+        }
+
+        final List<Bundle> bundlesToStart = new ArrayList<Bundle>();
+
+        List<BundleEntry> bundleEntries = new ArrayList<BundleEntry>();
+
+        while (annotationDeclaringClazz != null) {
+            RegionBundleDependencies dependencies = annotationDeclaringClazz.getAnnotation(annotationType);
+            BundleEntry[] entries = dependencies.entries();
+
+            bundleEntries.addAll(0, Arrays.<BundleEntry> asList(entries));
+            annotationDeclaringClazz = dependencies.inheritDependencies() ? TestFrameworkUtils.findAnnotationDeclaringClass(annotationType,
+                annotationDeclaringClazz.getSuperclass()) : null;
+        }
+        PropertyPlaceholderResolver resolver = new PropertyPlaceholderResolver();
+
+        if (!CollectionUtils.isEmpty(bundleEntries)) {
+
+            for (BundleEntry bundleEntry : bundleEntries) {
+
+                String path = bundleEntry.value();
+                boolean autoStart = bundleEntry.autoStart();
+
+                String formattedPath = resolver.resolve(path, configurationProperties);
+                Bundle bundle = bundleContext.installBundle(new URI(formattedPath).toString());
+
+                if (autoStart && !TestFrameworkUtils.isFragment(bundle)) {
+                    bundlesToStart.add(bundle);
+                }
+            }
+        }
+
+        for (Bundle bundle : bundlesToStart) {
+            try {
+                bundle.start();
+            } catch (BundleException e) {
+                throw new BundleException("Failed to start bundle " + bundle.getSymbolicName() + " " + bundle.getVersion(), e);
+            }
+        }
+    }
+
+    private Collection<ServiceReference<BundleContext>> getUserRegionBundleContextServiceReferences(BundleContext bundleContext) {
+
+        long startTime = System.currentTimeMillis();
+
+        Collection<ServiceReference<BundleContext>> serviceReferences = doGetUserRegionBundleContextServiceReferences(bundleContext);
+
+        while (serviceReferences.size() == 0) {
+            if (System.currentTimeMillis() < (this.userRegionStartWaitTime + startTime)) {
+                try {
+                    Thread.sleep(500);
+                    serviceReferences = doGetUserRegionBundleContextServiceReferences(bundleContext);
+                } catch (InterruptedException ie) {
+                    throw new RuntimeException(ie);
+                }
+            } else {
+                break;
+            }
+        }
+        return serviceReferences;
+    }
+
+    private Collection<ServiceReference<BundleContext>> doGetUserRegionBundleContextServiceReferences(BundleContext bundleContext) {
+        try {
+            return bundleContext.getServiceReferences(BundleContext.class, "(org.eclipse.virgo.kernel.regionContext=true)");
+        } catch (InvalidSyntaxException e) {
+            throw new RuntimeException("Unexpected InvalidSyntaxException when looking up the user region's BundleContext", e);
+        }
+    }
+}
diff --git a/test/org.eclipse.virgo.test.framework/src/main/java/org/eclipse/virgo/test/framework/dmkernel/RegionBundleDependencies.java b/test/org.eclipse.virgo.test.framework/src/main/java/org/eclipse/virgo/test/framework/dmkernel/RegionBundleDependencies.java
new file mode 100644
index 0000000..3654c25
--- /dev/null
+++ b/test/org.eclipse.virgo.test.framework/src/main/java/org/eclipse/virgo/test/framework/dmkernel/RegionBundleDependencies.java
@@ -0,0 +1,53 @@
+/*
+ * This file is part of the Eclipse Virgo project.
+ *
+ * Copyright (c) 2010 Chariot Solutions, LLC
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    dsklyut - initial contribution
+ */
+
+package org.eclipse.virgo.test.framework.dmkernel;
+
+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;
+
+import org.eclipse.virgo.test.framework.BundleEntry;
+
+
+/**
+ * UserRegionBundleDependencies defines class-level metadata which can be used to instruct test framework with extra bundles to
+ * append to <a href="http://wiki.eclipse.org/Virgo/Concepts#Regions"> UserRegion</a> during start up.
+ * <p />
+ * This set of bundles is considered to be "transitively complete", that is all dependencies must be provided.
+ */
+@Documented
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+@Inherited
+public @interface RegionBundleDependencies {
+    
+    /**
+     * Bundle entries to load as part of the test framework.
+     * 
+     * @return
+     */
+    BundleEntry[] entries() default {};
+    
+    /**
+     * Whether or not {@link #entries() entries} from superclasses should be <em>inherited</em>.
+     * <p>Default value is <code>true</code>, which means that entries from subclass will be
+     * <em>appended</em> to the list of entries from superclass.
+     * 
+     * @return
+     */
+    boolean inheritDependencies() default true;
+}
diff --git a/test/org.eclipse.virgo.test.framework/src/main/java/org/eclipse/virgo/test/framework/plugin/EmptyPlugin.java b/test/org.eclipse.virgo.test.framework/src/main/java/org/eclipse/virgo/test/framework/plugin/EmptyPlugin.java
new file mode 100644
index 0000000..7290915
--- /dev/null
+++ b/test/org.eclipse.virgo.test.framework/src/main/java/org/eclipse/virgo/test/framework/plugin/EmptyPlugin.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.framework.plugin;
+
+import java.util.Properties;
+
+import org.osgi.framework.launch.Framework;
+
+public abstract class EmptyPlugin implements Plugin{
+
+	public void beforeInstallBundles(Framework framework, Properties configurationProperties) {
+	}
+
+}
diff --git a/test/org.eclipse.virgo.test.framework/src/main/java/org/eclipse/virgo/test/framework/plugin/Plugin.java b/test/org.eclipse.virgo.test.framework/src/main/java/org/eclipse/virgo/test/framework/plugin/Plugin.java
new file mode 100644
index 0000000..87f02a9
--- /dev/null
+++ b/test/org.eclipse.virgo.test.framework/src/main/java/org/eclipse/virgo/test/framework/plugin/Plugin.java
@@ -0,0 +1,21 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.framework.plugin;
+
+import java.util.Properties;
+
+import org.osgi.framework.launch.Framework;
+
+public interface Plugin {
+
+	void beforeInstallBundles(Framework framework, Properties configurationProperties);
+}
diff --git a/test/org.eclipse.virgo.test.framework/src/main/java/org/eclipse/virgo/test/framework/plugin/PluginException.java b/test/org.eclipse.virgo.test.framework/src/main/java/org/eclipse/virgo/test/framework/plugin/PluginException.java
new file mode 100644
index 0000000..2b30453
--- /dev/null
+++ b/test/org.eclipse.virgo.test.framework/src/main/java/org/eclipse/virgo/test/framework/plugin/PluginException.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.framework.plugin;
+
+public class PluginException extends RuntimeException {
+
+	private static final long serialVersionUID = -2589928580612707135L;
+
+	public PluginException() {
+		super();
+	}
+
+	public PluginException(String message, Throwable cause) {
+		super(message, cause);
+	}
+
+	public PluginException(String message) {
+		super(message);
+	}
+
+	public PluginException(Throwable cause) {
+		super(cause);
+	}
+
+	
+}
diff --git a/test/org.eclipse.virgo.test.framework/src/main/java/org/eclipse/virgo/test/framework/plugin/PluginManager.java b/test/org.eclipse.virgo.test.framework/src/main/java/org/eclipse/virgo/test/framework/plugin/PluginManager.java
new file mode 100644
index 0000000..b5e2dd8
--- /dev/null
+++ b/test/org.eclipse.virgo.test.framework/src/main/java/org/eclipse/virgo/test/framework/plugin/PluginManager.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.framework.plugin;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+
+public class PluginManager {
+
+    private final Plugin[] plugins;
+
+    private final Plugin pluginDelegate;
+
+    public PluginManager(Class<?> testClass) {
+        this.plugins = createPlugins(testClass);
+        this.pluginDelegate = (Plugin) Proxy.newProxyInstance(getClass().getClassLoader(), new Class[] { Plugin.class },
+            new PluginDelegateInvocationHandler(this.plugins));
+    }
+
+    public Plugin[] getConfiguredPlugins() {
+        Plugin[] copy = new Plugin[this.plugins.length];
+        System.arraycopy(this.plugins, 0, copy, 0, copy.length);
+        return copy;
+    }
+
+    public Plugin getPluginDelegate() {
+        return this.pluginDelegate;
+    }
+
+    private Plugin[] createPlugins(Class<?> testClass) {
+        Plugins annotation = testClass.getAnnotation(Plugins.class);
+        if (annotation == null) {
+            return new Plugin[0];
+        } else {
+            return doCreatePlugins(annotation.value());
+        }
+
+    }
+
+    private Plugin[] doCreatePlugins(Class<? extends Plugin>[] pluginClasses) {
+        Plugin[] result = new Plugin[pluginClasses.length];
+        for (int x = 0; x < result.length; x++) {
+            Class<? extends Plugin> cls = pluginClasses[x];
+            try {
+                result[x] = cls.newInstance();
+            } catch (InstantiationException e) {
+                throw new PluginException("Unable to instantiate plugin '" + cls.getName() + "'", e);
+            } catch (IllegalAccessException e) {
+                throw new PluginException("Unable to create plugin '" + cls.getName() + "'. Constructor not accessible.", e);
+            }
+        }
+        return result;
+    }
+
+    private static class PluginDelegateInvocationHandler implements InvocationHandler {
+
+        private final Plugin[] plugins;
+
+        public PluginDelegateInvocationHandler(Plugin[] plugins) {
+            this.plugins = plugins;
+        }
+
+        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+            for (Plugin p : this.plugins) {
+                try {
+                    method.invoke(p, args);
+                } catch (InvocationTargetException e) {
+                    Throwable targetException = e.getTargetException();
+                    throw targetException;
+                }
+            }
+            return null;
+        }
+    }
+}
diff --git a/test/org.eclipse.virgo.test.framework/src/main/java/org/eclipse/virgo/test/framework/plugin/Plugins.java b/test/org.eclipse.virgo.test.framework/src/main/java/org/eclipse/virgo/test/framework/plugin/Plugins.java
new file mode 100644
index 0000000..52de87b
--- /dev/null
+++ b/test/org.eclipse.virgo.test.framework/src/main/java/org/eclipse/virgo/test/framework/plugin/Plugins.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.framework.plugin;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+public @interface Plugins {
+
+	Class<? extends Plugin>[] value();
+}
diff --git a/test/org.eclipse.virgo.test.framework/src/main/resources/org/eclipse/virgo/test/framework/base.configuration.properties b/test/org.eclipse.virgo.test.framework/src/main/resources/org/eclipse/virgo/test/framework/base.configuration.properties
new file mode 100644
index 0000000..ee7950b
--- /dev/null
+++ b/test/org.eclipse.virgo.test.framework/src/main/resources/org/eclipse/virgo/test/framework/base.configuration.properties
@@ -0,0 +1,35 @@
+# Configure JUnit to be in the system package list
+org.osgi.framework.system.packages.extra=junit.extensions;version="4.5.0", \
+ junit.framework;version="4.5.0", \
+ junit.runner;version="4.5.0", \
+ junit.textui;version="4.5.0", \
+ org.hamcrest;version="4.5.0", \
+ org.hamcrest.core;version="4.5.0", \
+ org.hamcrest.internal;version="4.5.0", \
+ org.junit;version="4.7.0", \
+ org.junit.experimental.results;version="4.7.0", \
+ org.junit.experimental.runners;version="4.7.0", \
+ org.junit.experimental.theories;version="4.7.0", \
+ org.junit.experimental.theories.internal;version="4.7.0", \
+ org.junit.experimental.theories.suppliers;version="4.7.0", \
+ org.junit.internal;version="4.7.0", \
+ org.junit.internal.builders;version="4.7.0", \
+ org.junit.internal.matchers;version="4.7.0", \
+ org.junit.internal.requests;version="4.7.0", \
+ org.junit.internal.runners;version="4.7.0", \
+ org.junit.internal.runners.model;version="4.7.0", \
+ org.junit.internal.runners.statements;version="4.7.0", \
+ org.junit.matchers;version="4.7.0", \
+ org.junit.runner;version="4.7.0", \
+ org.junit.runner.manipulation;version="4.7.0", \
+ org.junit.runner.notification;version="4.7.0", \
+ org.junit.runners;version="4.7.0", \
+ org.junit.runners.model;version="4.7.0", \
+ org.eclipse.virgo.test.framework, \
+ org.eclipse.virgo.test.framework.plugin, \
+ org.eclipse.virgo.test.framework.url
+
+ # Equinox-specific parameters
+ osgi.clean=true
+
+ 
\ No newline at end of file
diff --git a/test/org.eclipse.virgo.test.framework/src/test/java/org/eclipse/virgo/test/framework/BundleLocationLocatorTests.java b/test/org.eclipse.virgo.test.framework/src/test/java/org/eclipse/virgo/test/framework/BundleLocationLocatorTests.java
new file mode 100644
index 0000000..d59b99e
--- /dev/null
+++ b/test/org.eclipse.virgo.test.framework/src/test/java/org/eclipse/virgo/test/framework/BundleLocationLocatorTests.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.framework;
+
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.net.URI;
+
+import org.eclipse.virgo.test.framework.BundleLocationLocator;
+import org.junit.Test;
+import org.osgi.framework.launch.Framework;
+
+public class BundleLocationLocatorTests {
+
+	@Test
+	public void testFileLocation() throws Exception {
+		String location = BundleLocationLocator.determineBundleLocation(BundleLocationLocatorTests.class);
+		URI uri = new URI(location);
+		assertTrue(new File(uri).exists());
+	}
+	
+	@Test
+	public void testJarLocation() throws Exception {
+		String location = BundleLocationLocator.determineBundleLocation(Framework.class);
+		URI uri = new URI(location);
+		assertTrue(new File(uri).exists());
+	}
+}
diff --git a/test/org.eclipse.virgo.test.framework/src/test/java/org/eclipse/virgo/test/framework/ConfigurationPropertiesLoaderTests.java b/test/org.eclipse.virgo.test.framework/src/test/java/org/eclipse/virgo/test/framework/ConfigurationPropertiesLoaderTests.java
new file mode 100644
index 0000000..0384220
--- /dev/null
+++ b/test/org.eclipse.virgo.test.framework/src/test/java/org/eclipse/virgo/test/framework/ConfigurationPropertiesLoaderTests.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.framework;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.io.IOException;
+import java.util.Properties;
+
+import org.eclipse.virgo.test.framework.ConfigLocation;
+import org.eclipse.virgo.test.framework.ConfigurationPropertiesLoader;
+import org.junit.Test;
+
+public class ConfigurationPropertiesLoaderTests {
+
+    @Test
+    public void testLoadProperties() throws IOException {
+        ConfigurationPropertiesLoader loader = new ConfigurationPropertiesLoader();
+        Properties properties = loader.loadConfigurationProperties(getClass());
+        
+        assertNotNull(properties);
+        
+        assertEquals("true", properties.getProperty("user"));
+        assertEquals("true", properties.getProperty("extra"));
+    }
+    
+    @Test
+    public void testInBuiltProperties() throws IOException {
+        ConfigurationPropertiesLoader loader = new ConfigurationPropertiesLoader();
+        Properties properties = loader.loadConfigurationProperties(getClass());
+        
+        assertNotNull(properties);
+        
+        assertNotNull(properties.getProperty("basedir"));
+    }
+    
+    @Test
+    public void testResolve() throws IOException {
+        ConfigurationPropertiesLoader loader = new ConfigurationPropertiesLoader();
+        Properties properties = loader.loadConfigurationProperties(getClass());
+        
+        assertNotNull(properties);
+        
+        assertEquals("true", properties.getProperty("replace"));
+    }
+    
+    @Test
+    public void customConfigLocation() throws IOException {
+        ConfigurationPropertiesLoader loader = new ConfigurationPropertiesLoader();
+        Properties properties = loader.loadConfigurationProperties(CustomConfigLocation.class);
+        assertEquals("true", properties.getProperty("custom"));
+    }
+    
+    @ConfigLocation("META-INF/custom.config.properties")
+    private static final class CustomConfigLocation {
+        
+    }
+}
diff --git a/test/org.eclipse.virgo.test.framework/src/test/java/org/eclipse/virgo/test/framework/dmkernel/DmKernelTestRunnerTests.java b/test/org.eclipse.virgo.test.framework/src/test/java/org/eclipse/virgo/test/framework/dmkernel/DmKernelTestRunnerTests.java
new file mode 100644
index 0000000..e615f5f
--- /dev/null
+++ b/test/org.eclipse.virgo.test.framework/src/test/java/org/eclipse/virgo/test/framework/dmkernel/DmKernelTestRunnerTests.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.framework.dmkernel;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Dictionary;
+import java.util.Hashtable;
+
+import org.eclipse.virgo.test.framework.dmkernel.DmKernelTestRunner;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runners.model.InitializationError;
+import org.osgi.framework.BundleContext;
+
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+import org.eclipse.virgo.test.stubs.support.TrueFilter;
+
+import javax.management.MalformedObjectNameException;
+
+public class DmKernelTestRunnerTests {
+
+    private DmKernelTestRunner testRunner;
+
+    private final StubBundleContext kernelBundleContext = new StubBundleContext();
+
+    @Before
+    public void setup() throws InitializationError, MalformedObjectNameException {
+        this.testRunner = new DmKernelTestRunner(getClass(), 1000);
+        this.kernelBundleContext.addFilter("(org.eclipse.virgo.kernel.regionContext=true)", new TrueFilter());
+    }
+
+    @Test(expected = IllegalStateException.class)
+    public void failureWhenUserRegionBundleContextIsNotPresent() {
+        long start = System.currentTimeMillis();
+        try {
+            this.testRunner.getTargetBundleContext(this.kernelBundleContext);
+        } finally {
+            assertTrue(System.currentTimeMillis() - start >= 1000);
+        }
+    }
+
+    @Test
+    public void userRegionBundleContextRetrievedFromServiceRegistry() {
+        StubBundleContext userRegionBundleContext = new StubBundleContext();
+
+        Dictionary<String, Object> properties = new Hashtable<String, Object>();
+        properties.put("org.eclipse.virgo.kernel.regionContext", true);
+        this.kernelBundleContext.registerService(BundleContext.class.getName(), userRegionBundleContext, properties);
+
+        assertEquals(userRegionBundleContext, this.testRunner.getTargetBundleContext(this.kernelBundleContext));
+    }
+
+    @Test(expected = IllegalStateException.class)
+    public void failureWhenMultipleUserRegionBundleContextsAreAvailable() {
+        StubBundleContext userRegionBundleContext = new StubBundleContext();
+
+        Dictionary<String, Object> properties = new Hashtable<String, Object>();
+        properties.put("org.eclipse.virgo.kernel.regionContext", true);
+        this.kernelBundleContext.registerService(BundleContext.class.getName(), userRegionBundleContext, properties);
+        this.kernelBundleContext.registerService(BundleContext.class.getName(), userRegionBundleContext, properties);
+
+        assertEquals(userRegionBundleContext, this.testRunner.getTargetBundleContext(this.kernelBundleContext));
+    }
+}
diff --git a/test/org.eclipse.virgo.test.framework/src/test/java/org/eclipse/virgo/test/framework/dmkernel/RegionDependenciesDmKernelRunnerTests.java b/test/org.eclipse.virgo.test.framework/src/test/java/org/eclipse/virgo/test/framework/dmkernel/RegionDependenciesDmKernelRunnerTests.java
new file mode 100644
index 0000000..b08caf7
--- /dev/null
+++ b/test/org.eclipse.virgo.test.framework/src/test/java/org/eclipse/virgo/test/framework/dmkernel/RegionDependenciesDmKernelRunnerTests.java
@@ -0,0 +1,202 @@
+/*
+ * This file is part of the Eclipse Virgo project.
+ *
+ * Copyright (c) 2011 copyright_holder
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    dsklyut - initial contribution
+ */
+
+package org.eclipse.virgo.test.framework.dmkernel;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Properties;
+
+import org.eclipse.virgo.test.framework.BundleEntry;
+import org.eclipse.virgo.test.stubs.framework.StubBundle;
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+import org.eclipse.virgo.test.stubs.support.TrueFilter;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runners.model.InitializationError;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleEvent;
+import org.osgi.framework.BundleListener;
+import org.osgi.framework.Version;
+
+/**
+ * TODO Document RegionDependenciesDmKernelRunnerTests
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * TODO Document concurrent semantics of RegionDependenciesDmKernelRunnerTests
+ */
+public class RegionDependenciesDmKernelRunnerTests {
+
+    @RegionBundleDependencies(entries = { @BundleEntry(value = "file:./src/test/resources/test-bundle2", autoStart = false) })
+    public static class WithRegionDependenciesTest {
+
+        @Test
+        public void stubTest1() {
+        }
+    }
+
+    @RegionBundleDependencies(entries = { @BundleEntry(value = "file:./src/test/resources/test-bundle1", autoStart = false) }, inheritDependencies = true)
+    public static class WithRegionDependenciesAndInheritance extends WithRegionDependenciesTest {
+
+        @Test
+        public void stubTest3() {
+
+        }
+    }
+
+    @RegionBundleDependencies(entries = { @BundleEntry("file:./src/test/resources/test-bundle1") }, inheritDependencies = false)
+    public static class WithRegionDependenciesAndNoInheritance extends WithRegionDependenciesAndInheritance {
+
+        @Test
+        public void stubTest3() {
+
+        }
+    }
+
+    private DmKernelTestRunner testRunner;
+
+    private final StubBundleContext kernelBundleContext = new StubBundleContext();
+
+    @Before
+    public void setup() throws InitializationError {
+        // this.testRunner = new DmKernelTestRunner(getClass(), 1000);
+        this.kernelBundleContext.addFilter("(org.eclipse.virgo.kernel.regionContext=true)", new TrueFilter());
+
+        // set-up user region bundle context
+        StubBundleContext userRegionBundleContext = new StubBundleContext();
+        
+        StubBundle stubSystemBundle = new StubBundle(0L, "system-bundle", Version.emptyVersion, "system.bundle.location");
+        userRegionBundleContext.addInstalledBundle(stubSystemBundle);
+
+        Dictionary<String, Object> properties = new Hashtable<String, Object>();
+        properties.put("org.eclipse.virgo.kernel.regionContext", true);
+        this.kernelBundleContext.registerService(BundleContext.class.getName(), userRegionBundleContext, properties);
+
+    }
+
+    @Test
+    public void testRegionBundleDependenciesUsage() {
+        try {
+            this.testRunner = new DmKernelTestRunner(WithRegionDependenciesTest.class, 1000);
+        } catch (Exception ex) {
+            ex.printStackTrace();
+            fail(ex.getMessage());
+        }
+        BundleContext userRegionBundleContext = testRunner.getTargetBundleContext(kernelBundleContext);
+        assertNotNull(userRegionBundleContext);
+        TestBundleListener listener = new TestBundleListener();
+        userRegionBundleContext.addBundleListener(listener);
+
+        try {
+            this.testRunner.postProcessTargetBundleContext(userRegionBundleContext, new Properties());
+        } catch (Exception e) {
+            e.printStackTrace();
+            fail(e.getMessage());
+        }
+
+        assertTrue(listener.getCalled());
+        assertEquals(1, listener.getEvents().length);
+        Bundle dep = listener.getEvents()[0].getBundle();
+        assertEquals("file:./src/test/resources/test-bundle2", dep.getLocation());
+        // autoStart == false
+        assertEquals(Bundle.INSTALLED, dep.getState());
+    }
+
+    @Test
+    public void testWithRegionDependenciesAndInheritance() {
+        try {
+            this.testRunner = new DmKernelTestRunner(WithRegionDependenciesAndInheritance.class, 1000);
+        } catch (Exception ex) {
+            ex.printStackTrace();
+            fail(ex.getMessage());
+        }
+        BundleContext userRegionBundleContext = testRunner.getTargetBundleContext(kernelBundleContext);
+        assertNotNull(userRegionBundleContext);
+        TestBundleListener listener = new TestBundleListener();
+        userRegionBundleContext.addBundleListener(listener);
+
+        try {
+            this.testRunner.postProcessTargetBundleContext(userRegionBundleContext, new Properties());
+        } catch (Exception e) {
+            fail(e.getMessage());
+        }
+
+        // should have 2 bundles. Both of them autoStart == false
+        // provided
+        assertTrue(listener.getCalled());
+        assertEquals(2, listener.getEvents().length);
+
+        for (BundleEvent e : listener.getEvents()) {
+            assertEquals(Bundle.INSTALLED, e.getBundle().getState());
+        }
+    }
+
+    @Test
+    public void testWithRegionDependenciesAndNoInheritance() {
+        try {
+            this.testRunner = new DmKernelTestRunner(WithRegionDependenciesAndNoInheritance.class, 1000);
+        } catch (Exception ex) {
+            ex.printStackTrace();
+            fail(ex.getMessage());
+        }
+        BundleContext userRegionBundleContext = testRunner.getTargetBundleContext(kernelBundleContext);
+        assertNotNull(userRegionBundleContext);
+        TestBundleListener listener = new TestBundleListener();
+        userRegionBundleContext.addBundleListener(listener);
+
+        try {
+            this.testRunner.postProcessTargetBundleContext(userRegionBundleContext, new Properties());
+        } catch (Exception e) {
+            fail(e.getMessage());
+        }
+
+        // should have 1 bundle. and it should be started
+        assertTrue(listener.getCalled());
+        assertEquals(1, listener.getEvents().length);
+        Bundle installedBundle = listener.getEvents()[0].getBundle();
+
+        assertEquals(Bundle.ACTIVE, installedBundle.getState());
+        assertEquals("file:./src/test/resources/test-bundle1", installedBundle.getLocation());
+
+    }
+
+    private static class TestBundleListener implements BundleListener {
+
+        private boolean called = false;
+
+        private List<BundleEvent> events = new ArrayList<BundleEvent>();
+
+        public void bundleChanged(BundleEvent event) {
+            this.called = true;
+            this.events.add(event);
+        }
+
+        public boolean getCalled() {
+            return called;
+        }
+
+        public BundleEvent[] getEvents() {
+            return events.toArray(new BundleEvent[events.size()]);
+        }
+
+    }
+}
diff --git a/test/org.eclipse.virgo.test.framework/src/test/java/org/eclipse/virgo/test/framework/plugin/PluginManagerTests.java b/test/org.eclipse.virgo.test.framework/src/test/java/org/eclipse/virgo/test/framework/plugin/PluginManagerTests.java
new file mode 100644
index 0000000..8b1a876
--- /dev/null
+++ b/test/org.eclipse.virgo.test.framework/src/test/java/org/eclipse/virgo/test/framework/plugin/PluginManagerTests.java
@@ -0,0 +1,107 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.framework.plugin;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Properties;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.eclipse.virgo.test.framework.plugin.EmptyPlugin;
+import org.eclipse.virgo.test.framework.plugin.Plugin;
+import org.eclipse.virgo.test.framework.plugin.PluginException;
+import org.eclipse.virgo.test.framework.plugin.PluginManager;
+import org.eclipse.virgo.test.framework.plugin.Plugins;
+import org.junit.Test;
+import org.osgi.framework.launch.Framework;
+
+public class PluginManagerTests {
+
+	@Test
+	public void testConstructPluginManager() {
+
+		PluginManager manager = new PluginManager(BasicConfiguration.class);
+		Plugin[] configuredPlugins = manager.getConfiguredPlugins();
+		assertNotNull(configuredPlugins);
+		assertEquals(2, configuredPlugins.length);
+		assertTrue(configuredPlugins[0] instanceof DummyPlugin);
+		assertTrue(configuredPlugins[1] instanceof SecondDummyPlugin);
+	}
+	
+	@Test
+	public void testConstructPluginManagerWithNoPlugins() {
+		PluginManager manager = new PluginManager(EmptyConfiguration.class);
+		Plugin[] configuredPlugins = manager.getConfiguredPlugins();
+		assertNotNull(configuredPlugins);
+		assertEquals(0, configuredPlugins.length);
+	}
+
+	@Test(expected=PluginException.class)
+	public void testConstructWithError() {
+		new PluginManager(ErrorConfiguration.class);
+	}
+	
+	@Test
+	public void testDelegate() {
+
+		PluginManager manager = new PluginManager(CounterConfiguration.class);
+		Plugin delegate = manager.getPluginDelegate();
+		assertEquals(0, CountingPlugin.counter.get());
+		delegate.beforeInstallBundles(null, null);
+		assertEquals(1, CountingPlugin.counter.get());
+	}
+	
+	public static class EmptyConfiguration {
+		
+	}
+	
+	@Plugins( { DummyPlugin.class, SecondDummyPlugin.class })
+	public static class BasicConfiguration {
+
+	}
+	
+	@Plugins(InvalidPlugin.class)
+	public static class ErrorConfiguration {
+		
+	}
+
+	@Plugins(CountingPlugin.class)
+    public static class CounterConfiguration {
+        
+    }
+	
+	public static class DummyPlugin extends EmptyPlugin {
+
+	}
+
+	public static class SecondDummyPlugin extends EmptyPlugin {
+
+	}
+	
+	public static class CountingPlugin implements Plugin {
+
+	    static final AtomicInteger counter = new AtomicInteger();
+	    
+        public void beforeInstallBundles(Framework framework, Properties configurationProperties) {
+            counter.incrementAndGet();
+        }
+	    
+	}
+	
+	public static class InvalidPlugin extends EmptyPlugin {
+		private InvalidPlugin() {
+			
+		}
+	}
+}
diff --git a/test/org.eclipse.virgo.test.framework/src/test/resources/META-INF/custom.config.properties b/test/org.eclipse.virgo.test.framework/src/test/resources/META-INF/custom.config.properties
new file mode 100644
index 0000000..920f577
--- /dev/null
+++ b/test/org.eclipse.virgo.test.framework/src/test/resources/META-INF/custom.config.properties
@@ -0,0 +1 @@
+custom=true
\ No newline at end of file
diff --git a/test/org.eclipse.virgo.test.framework/src/test/resources/META-INF/test.config.properties b/test/org.eclipse.virgo.test.framework/src/test/resources/META-INF/test.config.properties
new file mode 100644
index 0000000..17614d2
--- /dev/null
+++ b/test/org.eclipse.virgo.test.framework/src/test/resources/META-INF/test.config.properties
@@ -0,0 +1,3 @@
+user=true
+
+org.eclipse.virgo.test.properties.include=file:src/test/resources/extra.properties
diff --git a/test/org.eclipse.virgo.test.framework/src/test/resources/extra.properties b/test/org.eclipse.virgo.test.framework/src/test/resources/extra.properties
new file mode 100644
index 0000000..a5515dd
--- /dev/null
+++ b/test/org.eclipse.virgo.test.framework/src/test/resources/extra.properties
@@ -0,0 +1,2 @@
+extra=true
+replace=${user}
diff --git a/test/org.eclipse.virgo.test.launcher/.springBeans b/test/org.eclipse.virgo.test.launcher/.springBeans
new file mode 100644
index 0000000..8058887
--- /dev/null
+++ b/test/org.eclipse.virgo.test.launcher/.springBeans
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beansProjectDescription>
+	<version>1</version>
+	<pluginVersion><![CDATA[2.2.6.200908051215-RELEASE]]></pluginVersion>
+	<configSuffixes>
+		<configSuffix><![CDATA[xml]]></configSuffix>
+	</configSuffixes>
+	<enableImports><![CDATA[false]]></enableImports>
+	<configs>
+	</configs>
+	<configSets>
+	</configSets>
+</beansProjectDescription>
diff --git a/test/org.eclipse.virgo.test.launcher/src/main/java/org/eclipse/virgo/test/launcher/FrameworkBuilder.java b/test/org.eclipse.virgo.test.launcher/src/main/java/org/eclipse/virgo/test/launcher/FrameworkBuilder.java
new file mode 100644
index 0000000..808794b
--- /dev/null
+++ b/test/org.eclipse.virgo.test.launcher/src/main/java/org/eclipse/virgo/test/launcher/FrameworkBuilder.java
@@ -0,0 +1,234 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.launcher;
+
+import java.io.File;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+
+import org.eclipse.virgo.util.parser.launcher.ArgumentParser;
+import org.eclipse.virgo.util.parser.launcher.BundleEntry;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.launch.Framework;
+import org.osgi.framework.launch.FrameworkFactory;
+
+
+/**
+ * Simple builder API for creating instances of {@link Framework}.
+ * <p/>
+ * Created <code>Frameworks</code> are running when returned from {@link #start()}.
+ * <p/>
+ * Bundles can be installed automatically when starting using {@link #addBundle} and framework properties can be added
+ * using {@link #addFrameworkProperty(String, String)}.
+ * <p/>
+ * Bundles and framework properties <strong>must</strong> must be added before calling <code>start</code>. Any changes
+ * to the configuration of the builder is <strong>not</strong> applied to already running <code>Frameworks</code> .
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Not threadsafe. Intended for single-threaded usage.
+ */
+public class FrameworkBuilder {
+
+    private static final String PROP_LAUNCHER_BUNDLES = "launcher.bundles";
+
+    private final ArgumentParser parser = new ArgumentParser();
+
+    private final List<BundleEntry> bundleEntries = new ArrayList<BundleEntry>();
+
+    private final FrameworkCustomizer customizer;
+
+    private final Properties configuration;
+
+    /**
+     * Creates a new <code>FrameworkBuilder</code>.
+     * 
+     * @param frameworkProperties the initial set of framework properties.
+     */
+    public FrameworkBuilder(Properties frameworkProperties) {
+        this(frameworkProperties, new NoOpFrameworkCustomizer());
+    }
+    
+    /**
+     * Creates a new <code>FrameworkBuilder</code>.
+     * 
+     * @param frameworkProperties the initial set of framework properties.
+     * @param customizer the {@link FrameworkCustomizer} to use for customization
+     */
+    public FrameworkBuilder(Properties frameworkProperties, FrameworkCustomizer customizer) {
+        this.customizer = customizer;
+        this.configuration = (frameworkProperties == null ? new Properties() : frameworkProperties);
+        parseLauncherBundlesProperty(this.configuration);
+    }
+
+    /**
+     * Adds a bundle to the launch configuration. The bundle is not automatically started.
+     * 
+     * @param uri the <code>URI</code> of the bundle.
+     * @return the <code>FrameworkBuilder</code>.
+     */
+    public final FrameworkBuilder addBundle(URI uri) {
+        return addBundle(uri, false);
+    }
+
+    /**
+     * Adds a bundle to the launch configuration. The bundle is not automatically started.
+     * 
+     * @param file a <code>File</code> pointing to the bundle.
+     * @return the <code>FrameworkBuilder</code>
+     */
+    public final FrameworkBuilder addBundle(File file) {
+        return addBundle(file.toURI(), false);
+    }
+
+    /**
+     * Adds a bundle to the launch configuration.
+     * 
+     * @param uri the <code>URI</code> of the bundle.
+     * @param autoStart flag signifying whether or not the bundle should be started automatically
+     * @return the <code>FrameworkBuilder</code>.
+     */
+    public final FrameworkBuilder addBundle(URI uri, boolean autoStart) {
+        BundleEntry entry = new BundleEntry(uri, autoStart);
+        this.bundleEntries.add(entry);
+        return this;
+    }
+
+    /**
+     * Adds a bundle to the launch configuration.
+     * 
+     * @param file a <code>File</code> pointing to the bundle.
+     * @param autoStart flag signifying whether or not the bundle should be started automatically
+     * @return the <code>FrameworkBuilder</code>
+     */
+    public final FrameworkBuilder addBundle(File file, boolean autoStart) {
+        return addBundle(file.toURI(), autoStart);
+    }
+
+    /**
+     * Adds a bundle to the launch configuration. The declaration string is of the form:
+     * <code>&lt;path&gt;[@start]</code> where path is either a URI or a file path.
+     * 
+     * @param declaration the bundle declaration string
+     * @return the <code>FrameworkBuilder</code>
+     */
+    public final FrameworkBuilder addBundle(String declaration) {
+        BundleEntry entry = this.parser.parseBundleEntry(declaration);
+        return addBundle(entry.getURI(), entry.isAutoStart());
+    }
+
+    public final FrameworkBuilder addFrameworkProperty(String key, String value) {
+        this.configuration.put(key, value);
+        return this;
+    }
+
+    /**
+     * Starts the {@link Framework}. Installs the configured set of <code>Bundles</code>. Starts <code>Bundles</code>
+     * that have the <code>start</code> flag set.
+     * 
+     * @return the running <code>Framework</code>
+     * @throws BundleException if any bundles fail to install or start.
+     */
+    public final Framework start() throws BundleException {
+        FrameworkFactory frameworkFactory = FrameworkFactoryLocator.createFrameworkFactory();
+
+        Properties resolvedConfiguration = new PropertyPlaceholderResolver().resolve(this.configuration);
+        Map<String, String> resolvedConfigurationMap = convertPropertiesToMap(resolvedConfiguration);
+        Framework fwk = frameworkFactory.newFramework(resolvedConfigurationMap);
+
+        fwk.start();
+        this.customizer.beforeInstallBundles(fwk);
+        installAndStartBundles(fwk.getBundleContext());
+        this.customizer.afterInstallBundles(fwk);
+
+        return fwk;
+    }
+
+	private Map<String, String> convertPropertiesToMap(
+			Properties props) {
+		Map<String, String> map = new HashMap<String,String>();
+        Set<String> stringPropertyNames = props.stringPropertyNames();
+        for (String propName : stringPropertyNames) {
+			map.put(propName, props.getProperty(propName));
+		}
+		return map;
+	}
+
+    private void installAndStartBundles(BundleContext bundleContext) throws BundleException {
+        List<Bundle> bundlesToStart = new ArrayList<Bundle>();
+        for (BundleEntry entry : this.bundleEntries) {
+            Bundle bundle = bundleContext.installBundle(entry.getURI().toString());
+
+            if (entry.isAutoStart()) {
+                bundlesToStart.add(bundle);
+            }
+        }
+
+        for (Bundle bundle : bundlesToStart) {
+            try {
+                bundle.start();
+            } catch (BundleException be) {
+                throw new BundleException("Bundle " + bundle.getSymbolicName() + " " + bundle.getVersion() + " failed to start.", be);
+            }
+        }
+    }
+
+    private void parseLauncherBundlesProperty(Properties configuration) {
+        String launcherBundlesProp = configuration.getProperty(PROP_LAUNCHER_BUNDLES);
+        if (launcherBundlesProp != null) {
+            BundleEntry[] entries = this.parser.parseBundleEntries(launcherBundlesProp);
+            Collections.addAll(this.bundleEntries, entries);
+
+        }
+    }
+
+    /**
+     * Simple callback interface that allows calling code to customize the created {@link Framework} instance.
+     * 
+     * @see FrameworkBuilder
+     */
+    public static interface FrameworkCustomizer {
+
+        /**
+         * Called before the {@link FrameworkBuilder} installs any bundles into the {@link Framework}.
+         * 
+         * @param framework the newly created framework.
+         */
+        void beforeInstallBundles(Framework framework);
+
+        /**
+         * Called after the {@link FrameworkBuilder} has installed the bundle into the {@link Framework}.
+         * 
+         * @param framework the created framework.
+         */
+        void afterInstallBundles(Framework framework);
+    }
+
+    private static class NoOpFrameworkCustomizer implements FrameworkCustomizer {
+
+        public void afterInstallBundles(Framework framework) {
+        }
+
+        public void beforeInstallBundles(Framework framework) {
+        }
+
+    }
+}
diff --git a/test/org.eclipse.virgo.test.launcher/src/main/java/org/eclipse/virgo/test/launcher/FrameworkFactoryLocator.java b/test/org.eclipse.virgo.test.launcher/src/main/java/org/eclipse/virgo/test/launcher/FrameworkFactoryLocator.java
new file mode 100644
index 0000000..cf48ef2
--- /dev/null
+++ b/test/org.eclipse.virgo.test.launcher/src/main/java/org/eclipse/virgo/test/launcher/FrameworkFactoryLocator.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.launcher;
+
+import java.util.Set;
+
+import org.osgi.framework.launch.FrameworkFactory;
+
+/**
+ * Utility class for locating the {@link FrameworkFactory} for the current running VM.
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.
+ */
+final class FrameworkFactoryLocator {
+
+    /**
+     * Creates an instance of {@link FrameworkFactory}. The <code>FrameworkFactory</code> is loaded using the
+     * {@link ServiceLoader} as per the standard conventions.
+     * 
+     * @return the <code>FrameworkFactory</code> instance.
+     * @see FrameworkFactory
+     * @see ServiceLoader
+     * @throws IllegalStateException if no <code>FrameworkFactory</code> is found, or if more than one is present.
+     */
+    public static FrameworkFactory createFrameworkFactory() {
+        ServiceLoader<FrameworkFactory> factoryLoader = ServiceLoader.load(FrameworkFactory.class);
+        return uniqueServiceFromLoader(factoryLoader);
+    }
+
+    private static <T> T uniqueServiceFromLoader(ServiceLoader<T> factoryLoader) {
+        Set<T> services = factoryLoader.get(FrameworkFactory.class.getClassLoader());
+
+        if (services.isEmpty()) {
+            throw new IllegalStateException("No FrameworkFactory services found.");
+        } else if (services.size() > 1) {
+            throw new IllegalStateException("Unable to locate unique FrameworkFactory. Found " + services.size()
+                + " factories. Do you have multiple OSGi implementations on your classpath?");
+        } else {
+            return services.iterator().next();
+        }
+
+    }
+}
diff --git a/test/org.eclipse.virgo.test.launcher/src/main/java/org/eclipse/virgo/test/launcher/Launcher.java b/test/org.eclipse.virgo.test.launcher/src/main/java/org/eclipse/virgo/test/launcher/Launcher.java
new file mode 100644
index 0000000..3ea61cc
--- /dev/null
+++ b/test/org.eclipse.virgo.test.launcher/src/main/java/org/eclipse/virgo/test/launcher/Launcher.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.launcher;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.virgo.util.parser.launcher.ArgumentParser;
+import org.eclipse.virgo.util.parser.launcher.BundleEntry;
+import org.eclipse.virgo.util.parser.launcher.LaunchCommand;
+import org.osgi.framework.BundleException;
+
+
+public class Launcher {
+
+	private static final char UNRECOGNIZED_ARGUMENT_SEPARATOR = ',';
+	
+	private static final String FRAMEWORK_PROPERTY_UNRECOGNIZED_ARGUMENTS = "org.eclipse.virgo.osgi.launcher.unrecognizedArguments";
+	
+	private static final String SYSTEM_PROPERTY_TMPDIR = "java.io.tmpdir";
+
+	public static void main(String[] args) throws IOException {
+	    ensureTmpDirExists();
+	    
+		ArgumentParser parser = new ArgumentParser();
+		LaunchCommand command = parser.parse(args);
+		
+		FrameworkBuilder builder = new FrameworkBuilder(command.getConfigProperties());
+		
+		BundleEntry[] bundleDeclarations = command.getBundleEntries();
+		for (BundleEntry bundleDeclaration : bundleDeclarations) {
+			builder.addBundle(bundleDeclaration.getURI());
+		}
+		
+		Map<String, String> declaredProperties = command.getDeclaredProperties();
+		for (Map.Entry<String, String> entry : declaredProperties.entrySet()) {
+			builder.addFrameworkProperty(entry.getKey(), entry.getValue());
+		}
+		
+		builder.addFrameworkProperty(FRAMEWORK_PROPERTY_UNRECOGNIZED_ARGUMENTS, createUnrecognizedArgumentsProperty(command));
+
+        try {
+            builder.start();
+        } catch (BundleException e) {
+            e.printStackTrace();
+            System.exit(1);
+        }
+    }
+	
+	static void ensureTmpDirExists() throws IOException {
+	    String tmpDirProperty = System.getProperty(SYSTEM_PROPERTY_TMPDIR);
+	    if (tmpDirProperty != null) {
+	        File tmpDir = new File(tmpDirProperty);
+	        if (!tmpDir.isDirectory() && !tmpDir.mkdirs()) {
+	            throw new IOException("Failed to create tmp directory '" + tmpDir.getAbsolutePath() + "'");
+	        }
+	    }
+	}
+	
+	private static String createUnrecognizedArgumentsProperty(LaunchCommand launchCommand) {
+		List<String> unrecognizedArguments = launchCommand.getUnrecognizedArguments();
+		
+		StringBuilder propertyBuilder = new StringBuilder();
+		
+		for (int i = 0; i < unrecognizedArguments.size(); i++) {
+			propertyBuilder.append(unrecognizedArguments.get(i));
+			if ((i + 1) < unrecognizedArguments.size()) {
+				propertyBuilder.append(UNRECOGNIZED_ARGUMENT_SEPARATOR);
+			}
+		}
+		
+		return propertyBuilder.toString();
+	}
+}
diff --git a/test/org.eclipse.virgo.test.launcher/src/main/java/org/eclipse/virgo/test/launcher/PropertyPlaceholderResolver.java b/test/org.eclipse.virgo.test.launcher/src/main/java/org/eclipse/virgo/test/launcher/PropertyPlaceholderResolver.java
new file mode 100644
index 0000000..6aff419
--- /dev/null
+++ b/test/org.eclipse.virgo.test.launcher/src/main/java/org/eclipse/virgo/test/launcher/PropertyPlaceholderResolver.java
@@ -0,0 +1,188 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.launcher;
+
+import java.util.Enumeration;
+import java.util.Properties;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.Stack;
+import java.util.UUID;
+
+/**
+ * Utility class for resolving placeholders inside a {@link Properties} instance. These placeholders can refer to other
+ * properties in the <code>Properties</code> instance. The place holders may also have a modifier in them
+ * 
+ * <pre>
+ * ${com.springsource:modifier}
+ * </pre>
+ * 
+ * where everything after the colon is considered the modifier. This class does not interpret these modifiers but
+ * rather delegates to a {@link PlaceholderValueTransformer} for processing.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.
+ */
+public final class PropertyPlaceholderResolver {
+    
+    private static final Pattern PATTERN = Pattern.compile("\\$\\{([^:\\}]*):?([^\\}]*)?\\}");
+
+    private static final PlaceholderValueTransformer IDENTITY_TRANSFORMER = new PlaceholderValueTransformer() {
+
+        public String transform(String propertyName, String propertyValue, String modifier) {
+            return propertyValue;
+        }
+
+    };
+
+    /**
+     * Resolves all placeholders in the supplied {@link Properties} instance.
+     * 
+     * @param input the properties to resolve.
+     * @return the resolved properties.
+     */
+    public Properties resolve(Properties input) {
+        return resolve(input, IDENTITY_TRANSFORMER);
+    }
+
+    /**
+     * Resolves all placeholders in the supplied {@link Properties} instance and transform any based on their modifiers.
+     * 
+     * @param input the properties to resolve.
+     * @param transformer a transformer for handling property modifiers
+     * @return the resolved properties.
+     */
+    public Properties resolve(Properties input, PlaceholderValueTransformer transformer) {
+        Properties result = new Properties();
+        Enumeration<?> propertyNames = input.propertyNames();
+
+        while (propertyNames.hasMoreElements()) {
+            String propertyName = (String) propertyNames.nextElement();
+            result.setProperty(propertyName, resolveProperty(propertyName, input, transformer));
+            
+        }
+
+        return result;
+    }
+
+    /**
+     * Resolves all placeholders in the supplied string with values from a {@link Properties} instance.
+     * 
+     * @param input the string to resolve
+     * @param props the properties to use for resolution
+     * @return the resolved string
+     */
+    public String resolve(String input, Properties props) {
+        return resolve(input, props, IDENTITY_TRANSFORMER);
+    }
+
+    /**
+     * Resolves all placeholders in the supplied string with values from a {@link Properties} instance and transform any
+     * based on their modifiers.
+     * 
+     * @param input the string to resolve
+     * @param props the properties to use for resolution
+     * @param transformer a transformer for handling property modifiers
+     * @return the resolved string
+     */
+    public String resolve(String input, Properties props, PlaceholderValueTransformer transformer) {
+        String key = UUID.randomUUID().toString();
+        props.put(key, input);
+        String value = resolveProperty(key, props, transformer);
+        props.remove(key);
+        return value;
+    }
+
+    private String resolveProperty(String name, Properties props, PlaceholderValueTransformer transformer) {
+        Stack<String> visitState = new Stack<String>();
+        return resolve(name, props, transformer, visitState);
+    }
+
+    private String resolve(String name, Properties props, PlaceholderValueTransformer transformer, Stack<String> visitState) {
+        visitState.push(name);
+
+        String initialValue = props.getProperty(name);
+        if(initialValue == null) {
+            throw new RuntimeException("No value found for placeholder '" + name + "'");
+        }
+
+        Matcher matcher = PATTERN.matcher(initialValue);
+
+        StringBuffer sb = new StringBuffer();
+        while (matcher.find()) {
+            String propName = matcher.group(1);
+            if (visitState.contains(propName)) {
+                throw new IllegalArgumentException(formatPropertyCycleMessage(visitState));
+            }
+
+            String value = resolve(propName, props, transformer, visitState);
+            if (matcher.group(2).length() > 0) {
+                value = transformer.transform(propName, value, matcher.group(2));
+            }
+            matcher.appendReplacement(sb, escapeBackslashes(value));
+        }
+        matcher.appendTail(sb);
+
+        visitState.pop();
+        return sb.toString();
+    }
+
+    private static String escapeBackslashes(String string) {
+        StringBuffer sb = new StringBuffer(string.length());
+        int bsIndex = string.indexOf("\\");
+        int pos = 0;
+        while (bsIndex != -1) {
+            sb.append(string.substring(pos,bsIndex+1));
+            sb.append("\\"); // another backslash
+            pos = bsIndex+1;
+            bsIndex = string.indexOf("\\",pos);
+        }
+        sb.append(string.substring(pos, string.length()));
+        return new String(sb);
+    }
+    
+    private String formatPropertyCycleMessage(Stack<String> visitState) {
+        StringBuilder sb = new StringBuilder();
+        sb.append("Circular reference in property definitions: ");
+        for (String name : visitState) {
+            sb.append(name).append(" -> ");
+        }
+
+        sb.append(visitState.iterator().next());
+        return sb.toString();
+    }
+
+    /**
+     * An interface for property placeholder modifiers. Implementations of this interface are called when a property
+     * placeholder modifier is detected on a class.
+     * <p />
+     * 
+     * <strong>Concurrent Semantics</strong><br />
+     * 
+     * Implementations must be threadsafe.
+     * 
+     */
+    public static interface PlaceholderValueTransformer {
+
+        /**
+         * Transforms a property from its initial value to some other value
+         * 
+         * @param propertyName the name of the property being transformed
+         * @param propertyValue the original value of the property
+         * @param modifier the modifer string attached to the placeholder
+         * @return A string that has been modified by this transformer and to be used in place of the original value
+         */
+        String transform(String propertyName, String propertyValue, String modifier);
+    }
+}
diff --git a/test/org.eclipse.virgo.test.launcher/src/main/java/org/eclipse/virgo/test/launcher/ServiceLoader.java b/test/org.eclipse.virgo.test.launcher/src/main/java/org/eclipse/virgo/test/launcher/ServiceLoader.java
new file mode 100644
index 0000000..5a65927
--- /dev/null
+++ b/test/org.eclipse.virgo.test.launcher/src/main/java/org/eclipse/virgo/test/launcher/ServiceLoader.java
@@ -0,0 +1,162 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.launcher;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.osgi.framework.launch.FrameworkFactory;
+
+/**
+ * Simple service loader that follows the same location convention as the Java 6 <a
+ * href="http://java.sun.com/javase/6/docs/api/java/util/ServiceLoader.html">ServiceLoader</a>. This implementation is
+ * designed to run on on Java 5.
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ * @param <T> service type
+ */
+public final class ServiceLoader<T> {
+
+    private static final String CONFIG_FILE_PREFIX = "META-INF/services/";
+
+    private final Class<T> serviceClass;
+
+    private ServiceLoader(Class<T> serviceClass) {
+        this.serviceClass = serviceClass;
+    }
+
+    public static <T> ServiceLoader<T> load(Class<T> serviceClass) {
+        return new ServiceLoader<T>(serviceClass);
+    }
+
+    /**
+     * Gets all known implementations of the service interface. Eqivalent to calling {@link #get(ClassLoader)} with
+     * {@link ClassLoader#getSystemClassLoader()}.
+     * @return set of implementation types
+     * 
+     * @see #get(ClassLoader)
+     */
+    public Set<T> get() {
+        return get(ClassLoader.getSystemClassLoader());
+    }
+
+    /**
+     * Gets all known implementations configured and visible in the supplied {@link ClassLoader}.
+     * @param classLoader from which to look
+     * @return set of implementation types
+     */
+    public Set<T> get(ClassLoader classLoader) {
+        Set<T> results = new HashSet<T>();
+        try {
+            Enumeration<URL> serviceFiles = findServiceFiles(classLoader);
+            Set<Class<?>> implTypes = new HashSet<Class<?>>();
+            while (serviceFiles.hasMoreElements()) {
+                URL url = (URL) serviceFiles.nextElement();
+                String implName = readImplementationClassName(url);
+                Class<?> cl = loadImplType(classLoader, implName);
+                if (implTypes.add(cl)) {
+                    results.add(createInstance(cl));
+                }
+            }
+        } catch (IOException e) {
+            throw new ServiceLoaderError("Unable to read config locations", e);
+        }
+        return results;
+    }
+
+    @SuppressWarnings("unchecked")
+    private T createInstance(Class<?> cl) {
+        try {
+            return (T) cl.newInstance();
+        } catch (Exception e) {
+            throw new ServiceLoaderError("Unable to instantiate service provider class '" + cl.getName() + "'", e);
+        }
+    }
+
+    private Class<?> loadImplType(ClassLoader classLoader, String implName) {
+        try {
+            return classLoader.loadClass(implName);
+        } catch (ClassNotFoundException e) {
+            throw new ServiceLoaderError("Unable to load service class '" + implName + "' from '" + classLoader + "'", e);
+        }
+    }
+
+    private Enumeration<URL> findServiceFiles(ClassLoader classLoader) throws IOException {
+        String concreteConfigName = CONFIG_FILE_PREFIX + this.serviceClass.getName();
+        return classLoader.getResources(concreteConfigName);
+    }
+
+    private String readImplementationClassName(URL input) throws IOException {
+        BufferedReader reader = new BufferedReader(new InputStreamReader(input.openStream()));
+        String name = null;
+        String line = null;
+        try {
+            while ((line = reader.readLine()) != null) {
+                String trimmed = line.trim();
+                if (trimmed.length() > 0) {
+                    String nonComment = readNonCommentContent(trimmed);
+                    if (nonComment.length() > 0) {
+                        name = nonComment;
+                    }
+                }
+            }
+        } finally {
+            reader.close();
+        }
+        return name;
+    }
+
+    private String readNonCommentContent(String trimmed) {
+        int index = trimmed.indexOf("#");
+        if (index > -1) {
+            return trimmed.substring(0, index);
+        } else {
+            return trimmed;
+        }
+    }
+
+    public static void main(String[] args) {
+        ServiceLoader<FrameworkFactory> factory = ServiceLoader.load(FrameworkFactory.class);
+        Set<FrameworkFactory> set = factory.get(FrameworkFactory.class.getClassLoader());
+        System.out.println(set);
+    }
+
+    public static final class ServiceLoaderError extends Error {
+
+        private static final long serialVersionUID = 6134843287168204658L;
+
+        public ServiceLoaderError() {
+            super();
+        }
+
+        public ServiceLoaderError(String message, Throwable cause) {
+            super(message, cause);
+        }
+
+        public ServiceLoaderError(String message) {
+            super(message);
+        }
+
+        public ServiceLoaderError(Throwable cause) {
+            super(cause);
+        }
+
+    }
+
+}
diff --git a/test/org.eclipse.virgo.test.launcher/src/main/resources/.gitignore b/test/org.eclipse.virgo.test.launcher/src/main/resources/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/test/org.eclipse.virgo.test.launcher/src/main/resources/.gitignore
diff --git a/test/org.eclipse.virgo.test.launcher/src/main/resources/about.html b/test/org.eclipse.virgo.test.launcher/src/main/resources/about.html
new file mode 100644
index 0000000..c258ef5
--- /dev/null
+++ b/test/org.eclipse.virgo.test.launcher/src/main/resources/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>June 5, 2006</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/test/org.eclipse.virgo.test.launcher/src/test/java/org/eclipse/virgo/test/launcher/FrameworkBuilderTests.java b/test/org.eclipse.virgo.test.launcher/src/test/java/org/eclipse/virgo/test/launcher/FrameworkBuilderTests.java
new file mode 100644
index 0000000..1d9c9a1
--- /dev/null
+++ b/test/org.eclipse.virgo.test.launcher/src/test/java/org/eclipse/virgo/test/launcher/FrameworkBuilderTests.java
@@ -0,0 +1,229 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.launcher;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.io.File;
+import java.util.Properties;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.eclipse.virgo.test.launcher.FrameworkBuilder;
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.launch.Framework;
+
+/**
+ */
+public class FrameworkBuilderTests {
+
+    @Test
+    public void testSimpleStart() throws BundleException {
+        Properties frameworkProperties = basicFrameworkProperties();
+        FrameworkBuilder builder = new FrameworkBuilder(frameworkProperties);
+        Framework framework = builder.start();
+
+        try {
+            assertNotNull(framework);
+            assertEquals(0, framework.getBundleId());
+        } finally {
+            framework.stop();
+        }
+    }
+
+    @Test
+    public void testStartWithProperties() throws BundleException {
+        String name = "Rob Harrop";
+        String age = "26";
+        String ageOverride = "27";
+
+        Properties frameworkProperties = basicFrameworkProperties();
+
+        frameworkProperties.setProperty("name", name);
+        frameworkProperties.setProperty("age", age);
+
+        FrameworkBuilder builder = new FrameworkBuilder(frameworkProperties);
+        builder.addFrameworkProperty("age", ageOverride);
+
+        Framework framework = builder.start();
+
+        try {
+            assertNotNull(framework);
+
+            BundleContext bundleContext = framework.getBundleContext();
+
+            assertNotNull(bundleContext);
+
+            assertEquals(name, bundleContext.getProperty("name"));
+            assertEquals(ageOverride, bundleContext.getProperty("age"));
+        } finally {
+            framework.stop();
+        }
+    }
+
+    @Test
+    public void testStartWithBundle() throws BundleException {
+        Properties frameworkProperties = basicFrameworkProperties();
+
+        FrameworkBuilder builder = new FrameworkBuilder(frameworkProperties);
+        builder.addFrameworkProperty("osgi.clean", "true");
+        builder.addBundle(new File("src/test/resources/test-bundle"));
+
+        Framework framework = builder.start();
+
+        try {
+            assertNotNull(framework);
+
+            BundleContext bundleContext = framework.getBundleContext();
+
+            assertNotNull(bundleContext);
+
+            Bundle[] bundles = bundleContext.getBundles();
+
+            assertEquals(2, bundles.length);
+
+            Bundle testBundle = bundles[1];
+            assertEquals("test.bundle", testBundle.getSymbolicName());
+            assertEquals(Bundle.INSTALLED, testBundle.getState());
+
+        } finally {
+            framework.stop();
+        }
+    }
+
+    @Test
+    public void testStartWithBundleAutostart() throws BundleException {
+        Properties frameworkProperties = basicFrameworkProperties();
+
+        FrameworkBuilder builder = new FrameworkBuilder(frameworkProperties);
+        builder.addFrameworkProperty("osgi.clean", "true");
+        builder.addBundle(new File("src/test/resources/test-bundle"), true);
+
+        Framework framework = builder.start();
+
+        try {
+            assertNotNull(framework);
+
+            BundleContext bundleContext = framework.getBundleContext();
+
+            assertNotNull(bundleContext);
+
+            Bundle[] bundles = bundleContext.getBundles();
+
+            assertEquals(2, bundles.length);
+
+            Bundle testBundle = bundles[1];
+            assertEquals("test.bundle", testBundle.getSymbolicName());
+            assertEquals(Bundle.ACTIVE, testBundle.getState());
+
+        } finally {
+            framework.stop();
+        }
+    }
+
+    @Test
+    public void testStartWithLauncherBundles() throws BundleException {
+        Properties frameworkProperties = basicFrameworkProperties();
+
+        frameworkProperties.put("launcher.bundles", "src/test/resources/test-bundle@start");
+        FrameworkBuilder builder = new FrameworkBuilder(frameworkProperties);
+        builder.addFrameworkProperty("osgi.clean", "true");
+
+        Framework framework = builder.start();
+
+        try {
+            assertNotNull(framework);
+
+            BundleContext bundleContext = framework.getBundleContext();
+
+            assertNotNull(bundleContext);
+
+            Bundle[] bundles = bundleContext.getBundles();
+
+            assertEquals(2, bundles.length);
+
+            Bundle testBundle = bundles[1];
+            assertEquals("test.bundle", testBundle.getSymbolicName());
+            assertEquals(Bundle.ACTIVE, testBundle.getState());
+
+        } finally {
+            framework.stop();
+        }
+    }
+
+    @Test
+    public void testStartWithBundleDeclaration() throws BundleException {
+        Properties frameworkProperties = basicFrameworkProperties();
+
+        FrameworkBuilder builder = new FrameworkBuilder(frameworkProperties);
+        builder.addBundle("src/test/resources/test-bundle@start");
+        builder.addFrameworkProperty("osgi.clean", "true");
+
+        Framework framework = builder.start();
+
+        try {
+            assertNotNull(framework);
+
+            BundleContext bundleContext = framework.getBundleContext();
+
+            assertNotNull(bundleContext);
+
+            Bundle[] bundles = bundleContext.getBundles();
+
+            assertEquals(2, bundles.length);
+
+            Bundle testBundle = bundles[1];
+            assertEquals("test.bundle", testBundle.getSymbolicName());
+            assertEquals(Bundle.ACTIVE, testBundle.getState());
+
+        } finally {
+            framework.stop();
+        }
+    }
+
+    @Test
+    public void testCustomizer() throws BundleException {
+        Properties frameworkProperties = basicFrameworkProperties();
+
+        final AtomicInteger calls = new AtomicInteger();
+
+        FrameworkBuilder builder = new FrameworkBuilder(frameworkProperties, new FrameworkBuilder.FrameworkCustomizer() {
+
+            public void beforeInstallBundles(Framework framework) {
+                assertEquals(1, framework.getBundleContext().getBundles().length);
+                calls.incrementAndGet();
+            }
+
+            public void afterInstallBundles(Framework framework) {
+                assertEquals(2, framework.getBundleContext().getBundles().length);
+                calls.incrementAndGet();
+            }
+        });
+        builder.addBundle("src/test/resources/test-bundle@start");
+        builder.addFrameworkProperty("osgi.clean", "true");
+
+        Framework framework = builder.start();
+        assertEquals(2, calls.get());
+
+        framework.stop();
+
+    }
+    
+    private static Properties basicFrameworkProperties() {
+        Properties fp = new Properties();
+        fp.put("osgi.configuration.area", "build");
+        return fp;
+    }
+}
diff --git a/test/org.eclipse.virgo.test.launcher/src/test/java/org/eclipse/virgo/test/launcher/FrameworkFactoryLocatorTests.java b/test/org.eclipse.virgo.test.launcher/src/test/java/org/eclipse/virgo/test/launcher/FrameworkFactoryLocatorTests.java
new file mode 100644
index 0000000..9db0852
--- /dev/null
+++ b/test/org.eclipse.virgo.test.launcher/src/test/java/org/eclipse/virgo/test/launcher/FrameworkFactoryLocatorTests.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.launcher;
+
+import static org.junit.Assert.assertNotNull;
+
+import org.eclipse.virgo.test.launcher.FrameworkFactoryLocator;
+import org.junit.Test;
+import org.osgi.framework.launch.FrameworkFactory;
+
+
+public class FrameworkFactoryLocatorTests {
+
+    @Test
+    public void testLocateFrameworkFactory() {
+        FrameworkFactory frameworkFactory = FrameworkFactoryLocator.createFrameworkFactory();
+        assertNotNull(frameworkFactory);
+    }
+}
diff --git a/test/org.eclipse.virgo.test.launcher/src/test/java/org/eclipse/virgo/test/launcher/LauncherTests.java b/test/org.eclipse.virgo.test.launcher/src/test/java/org/eclipse/virgo/test/launcher/LauncherTests.java
new file mode 100644
index 0000000..5a8d13b
--- /dev/null
+++ b/test/org.eclipse.virgo.test.launcher/src/test/java/org/eclipse/virgo/test/launcher/LauncherTests.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.launcher;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeTrue;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.eclipse.virgo.test.launcher.Launcher;
+import org.junit.Before;
+import org.junit.After;
+import org.junit.Test;
+
+
+/**
+ */
+public class LauncherTests {
+    
+    private static final String SYSTEM_PROPERTY_TMPDIR = "java.io.tmpdir";
+    private static final String TMPDIR = "tmp";
+    
+    private static final File TMP_DIR = new File(TMPDIR);
+    
+    @Before
+    public void setSystemProperty() {
+        System.setProperty(SYSTEM_PROPERTY_TMPDIR, TMPDIR);
+    }
+
+    @After
+    public void deleteTmpDir() {
+        if (TMP_DIR.exists()) {
+            assumeTrue(TMP_DIR.delete());
+        }
+    }
+    
+    @Test
+    public void creationOfTmpDir() throws IOException {
+        assumeTrue(!TMP_DIR.exists());
+        // assertFalse(TMP_DIR.exists());
+        Launcher.ensureTmpDirExists();
+        assertTrue(TMP_DIR.exists());
+    }
+    
+    @Test
+    public void noFailureIfTmpDirAlreadyExists() throws IOException {
+        TMP_DIR.mkdirs();
+        assumeTrue(TMP_DIR.exists());
+        // assertTrue(TMP_DIR.exists());
+        Launcher.ensureTmpDirExists();
+        assertTrue(TMP_DIR.exists());
+    }
+    
+    @Test(expected=IOException.class)
+    public void failureIfTmpDirCannotBeCreated() throws IOException {
+        assumeTrue(TMP_DIR.createNewFile());
+        // assertTrue(TMP_DIR.createNewFile());
+        Launcher.ensureTmpDirExists();       
+    }
+}
diff --git a/test/org.eclipse.virgo.test.launcher/src/test/java/org/eclipse/virgo/test/launcher/PropertyPlaceholderResolverTests.java b/test/org.eclipse.virgo.test.launcher/src/test/java/org/eclipse/virgo/test/launcher/PropertyPlaceholderResolverTests.java
new file mode 100644
index 0000000..3cc66a1
--- /dev/null
+++ b/test/org.eclipse.virgo.test.launcher/src/test/java/org/eclipse/virgo/test/launcher/PropertyPlaceholderResolverTests.java
@@ -0,0 +1,100 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.launcher;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Properties;
+
+import org.eclipse.virgo.test.launcher.PropertyPlaceholderResolver;
+import org.junit.Test;
+
+
+public class PropertyPlaceholderResolverTests {
+
+    private final PropertyPlaceholderResolver resolver = new PropertyPlaceholderResolver();
+    
+    @Test
+    public void testSimpleResolve() {
+        Properties p = new Properties();
+        p.setProperty("foo", "bar");
+        p.setProperty("other", "Hello ${foo}");
+        
+        p = resolver.resolve(p);
+        
+        assertEquals("Hello bar", p.getProperty("other"));
+    }
+    
+    @Test
+    public void testDoubleResolve() {
+        Properties p = new Properties();
+        p.setProperty("foo", "bar");
+        p.setProperty("bar", "baz");
+        p.setProperty("other", "Hello ${foo} and ${bar}");
+        
+        p = resolver.resolve(p);
+        
+        assertEquals("Hello bar and baz", p.getProperty("other"));
+    }
+    
+    @Test
+    public void testChainResolve() {
+        Properties p = new Properties();
+        p.setProperty("config.dir", "${server.home}/config");
+        p.setProperty("server.home", "/opt/dms");
+        p.setProperty("repo.config", "${config.dir}/repo.config");
+        
+        p = resolver.resolve(p);
+        
+        assertEquals("/opt/dms/config", p.getProperty("config.dir"));
+        assertEquals("/opt/dms/config/repo.config", p.getProperty("repo.config"));
+    }
+    
+    @Test(expected=IllegalArgumentException.class)
+    public void testCircularResolve() {
+        Properties p = new Properties();
+        p.setProperty("foo", "${bar}");
+        p.setProperty("bar", "${foo}");
+        
+        p = resolver.resolve(p);
+    }
+    
+    @Test(expected=IllegalArgumentException.class)
+    public void testTightCircularResolve() {
+        Properties p = new Properties();
+        p.setProperty("foo", "${foo}");
+        
+        p = resolver.resolve(p);
+    }
+    
+    @Test
+    public void testBackslashInValuesResolve() {
+        Properties p = new Properties();
+        p.setProperty("foo", "a\\b\\d\\");
+        p.setProperty("bar", "[${foo}]");
+        p.setProperty("vartochange", "here is ${foo} and ${bar} aha!");
+
+        p = resolver.resolve(p);
+
+        assertEquals("Backslashes not substituted properly", "here is a\\b\\d\\ and [a\\b\\d\\] aha!", p.getProperty("vartochange"));
+    }
+    
+    @Test(expected=IllegalArgumentException.class)
+    public void testLongerCircularResolve() {
+        Properties p = new Properties();
+        p.setProperty("foo", "${bar}");
+        p.setProperty("bar", "${baz}");
+        p.setProperty("baz", "${foo}");
+        
+        p = resolver.resolve(p);
+    }
+}
diff --git a/test/org.eclipse.virgo.test.launcher/src/test/resources/config.properties b/test/org.eclipse.virgo.test.launcher/src/test/resources/config.properties
new file mode 100644
index 0000000..c9f0304
--- /dev/null
+++ b/test/org.eclipse.virgo.test.launcher/src/test/resources/config.properties
@@ -0,0 +1 @@
+foo=bar
\ No newline at end of file
diff --git a/test/org.eclipse.virgo.test.launcher/src/test/resources/test-bundle/META-INF/MANIFEST.MF b/test/org.eclipse.virgo.test.launcher/src/test/resources/test-bundle/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..49b0fa5
--- /dev/null
+++ b/test/org.eclipse.virgo.test.launcher/src/test/resources/test-bundle/META-INF/MANIFEST.MF
@@ -0,0 +1,4 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: test.bundle
+Bundle-Vendor: SpringSource Inc.
diff --git a/test/org.eclipse.virgo.test.launcher/template.mf b/test/org.eclipse.virgo.test.launcher/template.mf
new file mode 100644
index 0000000..e2cc013
--- /dev/null
+++ b/test/org.eclipse.virgo.test.launcher/template.mf
@@ -0,0 +1,7 @@
+Bundle-ManifestVersion: 2
+Bundle-Name: Equinox Specific OSGi Extensions
+Bundle-SymbolicName: org.eclipse.virgo.test.launcher
+Bundle-Version: ${version}
+Main-Class: org.eclipse.virgo.test.launcher.Launcher
+Import-Template: 
+ org.osgi.framework.*;version="0"
diff --git a/test/org.eclipse.virgo.test.stubs/.springBeans b/test/org.eclipse.virgo.test.stubs/.springBeans
new file mode 100644
index 0000000..5152991
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/.springBeans
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beansProjectDescription>
+	<version>1</version>
+	<pluginVersion><![CDATA[2.2.5.M1]]></pluginVersion>
+	<configSuffixes>
+		<configSuffix><![CDATA[xml]]></configSuffix>
+	</configSuffixes>
+	<enableImports><![CDATA[false]]></enableImports>
+	<configs>
+	</configs>
+	<configSets>
+	</configSets>
+</beansProjectDescription>
diff --git a/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/framework/FindEntriesDelegate.java b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/framework/FindEntriesDelegate.java
new file mode 100644
index 0000000..3e36053
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/framework/FindEntriesDelegate.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.stubs.framework;
+
+import java.net.URL;
+import java.util.Enumeration;
+
+import org.osgi.framework.Bundle;
+
+/**
+ * An interface to allow delegation of calls to {@link Bundle#findEntries(String, String, boolean)} to be serviced in a
+ * test environment.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations must be threadsafe
+ * 
+ */
+public interface FindEntriesDelegate {
+
+    /**
+     * @param path The root to search from
+     * @param filePattern The pattern to search for
+     * @param recurse Whether to recurse
+     * @return An enumeration of the files found
+     * @see Bundle#findEntries(String, String, boolean)
+     */
+    Enumeration<URL> findEntries(String path, String filePattern, boolean recurse);
+}
diff --git a/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/framework/OSGiAssert.java b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/framework/OSGiAssert.java
new file mode 100644
index 0000000..f71152a
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/framework/OSGiAssert.java
@@ -0,0 +1,118 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.stubs.framework;
+
+import static org.junit.Assert.assertEquals;
+
+import org.osgi.framework.BundleListener;
+import org.osgi.framework.Constants;
+import org.osgi.framework.FrameworkListener;
+import org.osgi.framework.ServiceListener;
+import org.osgi.framework.ServiceRegistration;
+
+/**
+ * A set of assertion methods for testing the state of the Stub OSGi Framework classes. This class makes its assertions
+ * using JUnit4 assertion classes.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+public final class OSGiAssert {
+
+    /**
+     * Asserts that this {@link StubBundleContext} in is a clean state. A clean consists of the following
+     * 
+     * <ul>
+     * <li>0 {@link BundleListener}s</li>
+     * <li>0 {@link FrameworkListener}s</li>
+     * <li>0 {@link ServiceListener}s</li>
+     * <li>0 {@link ServiceRegistration}s</li>
+     * </ul>
+     * 
+     * @param bundleContext The context to assert against
+     * @see #assertBundleListenerCount(StubBundleContext, int)
+     * @see #assertFrameworkListenerCount(StubBundleContext, int)
+     * @see #assertServiceListenerCount(StubBundleContext, int)
+     * @see #assertServiceRegistrationCount(StubBundleContext, int)
+     */
+    public static void assertCleanState(StubBundleContext bundleContext) {
+        assertBundleListenerCount(bundleContext, 0);
+        assertFrameworkListenerCount(bundleContext, 0);
+        assertServiceListenerCount(bundleContext, 0);
+        assertServiceRegistrationCount(bundleContext, 0);
+    }
+
+    /**
+     * Asserts that a number of {@link BundleListener}s are currently registered
+     * 
+     * @param bundleContext The context to assert against
+     * @param count The number of listeners to assert
+     */
+    public static void assertBundleListenerCount(StubBundleContext bundleContext, int count) {
+        assertEquals("Invalid number of BundleListeners", count, bundleContext.getBundleListeners().size());
+    }
+
+    /**
+     * Asserts that a number of {@link FrameworkListener}s are currently registered
+     * 
+     * @param bundleContext The context to assert against
+     * @param count The number of listeners to assert
+     */
+    public static void assertFrameworkListenerCount(StubBundleContext bundleContext, int count) {
+        assertEquals("Invalid number of FrameworkListeners", count, bundleContext.getFrameworkListeners().size());
+    }
+
+    /**
+     * Asserts that a number of {@link ServiceListener}s are currently registered
+     * 
+     * @param bundleContext The context to assert against
+     * @param count The number of listeners to assert
+     */
+    public static void assertServiceListenerCount(StubBundleContext bundleContext, int count) {
+        assertEquals("Invalid number of ServiceListeners", count, bundleContext.getServiceListeners().size());
+    }
+
+    /**
+     * Asserts that a number of {@link ServiceRegistration}s of are currently registered
+     * 
+     * @param bundleContext The context to assert against
+     * @param count The number of registered services to assert
+     */
+    public static void assertServiceRegistrationCount(StubBundleContext bundleContext, int count) {
+        assertEquals("Invalid number of ServiceRegistrations", count, bundleContext.getServiceRegistrations().size());
+    }
+
+    /**
+     * Asserts that a number of {@link ServiceRegistration}s of are currently registered
+     * 
+     * @param bundleContext The context to assert against
+     * @param type The {@link Constants#OBJECTCLASS} of the services to assert
+     * @param count The number of registered services to assert
+     */
+    public static void assertServiceRegistrationCount(StubBundleContext bundleContext, Class<?> type, int count) {
+        String typeName = type.getName();
+        int found = 0;
+        for (ServiceRegistration<?> serviceRegistration : bundleContext.getServiceRegistrations()) {
+            String[] objectClasses = (String[]) serviceRegistration.getReference().getProperty(Constants.OBJECTCLASS);
+            for (String objectClass : objectClasses) {
+                if (typeName.equals(objectClass)) {
+                    found++;
+                    break;
+                }
+            }
+        }
+        assertEquals(String.format("Invalid number of ServiceRegistrations of type %s", typeName), count, found);
+    }
+}
diff --git a/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/framework/StubBundle.java b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/framework/StubBundle.java
new file mode 100644
index 0000000..e677321
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/framework/StubBundle.java
@@ -0,0 +1,741 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.stubs.framework;
+
+import static org.eclipse.virgo.test.stubs.internal.Assert.assertNotNull;
+import static org.eclipse.virgo.test.stubs.internal.Duplicator.shallowCopy;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.security.cert.X509Certificate;
+import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.Version;
+
+/**
+ * A stub testing implementation of {@link Bundle} as defined in section 6.1.4 of the OSGi Service Platform Core
+ * Specification.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+public final class StubBundle implements Bundle {
+
+    private static final Long DEFAULT_BUNDLE_ID = Long.valueOf(1);
+
+    private static final String DEFAULT_SYMBOLIC_NAME = "org.eclipse.virgo.test.stubs.testbundle";
+
+    private static final Version DEFAULT_VERSION = Version.emptyVersion;
+
+    private static final String DEFAULT_LOCATION = "/";
+
+    private final Long bundleId;
+
+    private final String symbolicName;
+
+    private final Version version;
+
+    private final String location;
+
+    private volatile int state;
+
+    private final Object stateMonitor = new Object();
+
+    private volatile long lastModified;
+
+    private final Object lastModifiedMonitor = new Object();
+
+    private volatile StubBundleContext bundleContext;
+
+    private final Object bundleContextMonitor = new Object();
+
+    private volatile Dictionary<String, String> headers = new Hashtable<String, String>();
+
+    private final Object headersMonitor = new Object();
+
+    private volatile Dictionary<String, String> localizedHeaders = new Hashtable<String, String>();
+
+    private final Object localizedHeadersMonitor = new Object();
+
+    private final Map<String, Class<?>> loadClasses = new HashMap<String, Class<?>>();
+
+    private final Object loadClassesMonitor = new Object();
+
+    private final Map<String, URL> entries = new HashMap<String, URL>();
+
+    private final Object entriesMonitor = new Object();
+
+    private final Map<String, Enumeration<String>> entryPaths = new HashMap<String, Enumeration<String>>();
+
+    private final Object entryPathsMonitor = new Object();
+
+    private final Map<Object, Boolean> permissions = new HashMap<Object, Boolean>();
+
+    private final Object permissionsMonitor = new Object();
+
+    private final Map<String, URL> resource = new HashMap<String, URL>();
+
+    private final Object resourceMonitor = new Object();
+
+    private final Map<String, Enumeration<URL>> resources = new HashMap<String, Enumeration<URL>>();
+
+    private final Object resourcesMonitor = new Object();
+
+    private volatile FindEntriesDelegate findEntriesDelegate;
+
+    private final Object findEntriesMonitor = new Object();
+
+    private final List<StubServiceReference<Object>> registeredServices = new ArrayList<StubServiceReference<Object>>();
+
+    private final Object registeredServicesMonitor = new Object();
+
+    private final List<StubServiceReference<Object>> servicesInUse = new ArrayList<StubServiceReference<Object>>();
+
+    private final Object servicesInUseMonitor = new Object();
+
+    private volatile UpdateDelegate updateDelegate;
+
+    private final Object updateDelegateMonitor = new Object();
+
+    /**
+     * Creates a new {@link StubServiceRegistration} and sets its initial state. This constructor sets
+     * <code>bundleId</code> to <code>1</code>, <code>symbolicName</code> to
+     * <code>org.eclipse.virgo.test.stubs.testbundle</code>, <code>version</code> to <code>0.0.0</code>, and
+     * <code>location</code> to <code>/</code>.
+     */
+    public StubBundle() {
+        this(DEFAULT_SYMBOLIC_NAME, DEFAULT_VERSION);
+    }
+
+    /**
+     * Creates a new {@link StubServiceRegistration} and sets its initial state. This constructor sets
+     * <code>bundleId</code> to <code>1</code> and <code>location</code> to <code>/</code>.
+     * 
+     * @param symbolicName The symbolic name of this bundle
+     * @param version The version of this bundle
+     */
+    public StubBundle(String symbolicName, Version version) {
+        this(DEFAULT_BUNDLE_ID, symbolicName, version, DEFAULT_LOCATION);
+    }
+
+    /**
+     * Creates a new {@link StubBundle} and sets its initial state
+     * 
+     * @param bundleId The id of this bundle
+     * @param symbolicName The symbolic name of this bundle
+     * @param version The version of this bundle
+     * @param location The location of this bundle
+     */
+    public StubBundle(Long bundleId, String symbolicName, Version version, String location) {
+        assertNotNull(bundleId, "bundleId");
+        assertNotNull(symbolicName, "symbolicName");
+        assertNotNull(version, "version");
+        assertNotNull(location, "location");
+
+        this.bundleId = bundleId;
+        this.symbolicName = symbolicName;
+        this.version = version;
+        this.location = location;
+        this.bundleContext = new StubBundleContext(this);
+        this.state = STARTING;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Enumeration<URL> findEntries(String path, String filePattern, boolean recurse) {
+        synchronized (this.findEntriesMonitor) {
+            if (this.findEntriesDelegate != null) {
+                return this.findEntriesDelegate.findEntries(path, filePattern, recurse);
+            }
+            return null;
+        }
+    }
+
+    /**
+     * Sets the {@link FindEntriesDelegate} to use for all subsequent calls to
+     * {@link #findEntries(String, String, boolean)}.
+     * 
+     * @param delegate the delegate to use
+     * 
+     * @return <code>this</code> instance of the {@link StubBundle}
+     */
+    public StubBundle setFindEntriesDelegate(FindEntriesDelegate delegate) {
+        synchronized (this.findEntriesMonitor) {
+            this.findEntriesDelegate = delegate;
+            return this;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public BundleContext getBundleContext() {
+        synchronized (this.bundleContextMonitor) {
+            return this.bundleContext;
+        }
+    }
+
+    /**
+     * Sets the {@link BundleContext} to return for all subsequent calls to {@link #getBundleContext()}.
+     * 
+     * @param bundleContext The @{link BundleContext} to return
+     * 
+     * @return <code>this</code> instance of the {@link StubBundle}
+     */
+    public StubBundle setBundleContext(StubBundleContext bundleContext) {
+        assertNotNull(bundleContext, "bundleContext");
+        synchronized (bundleContextMonitor) {
+            this.bundleContext = bundleContext;
+            return this;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public long getBundleId() {
+        return this.bundleId;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public URL getEntry(String path) {
+        synchronized (this.entriesMonitor) {
+            return this.entries.get(path);
+        }
+    }
+
+    /**
+     * Adds a mapping from a path to a {@link URL} for all subsequent calls to {@link #getEntry(String)}.
+     * 
+     * @param path The path to map from
+     * @param url The {@link URL} to map to
+     * @return <code>this</code> instance of the {@link StubBundle}
+     */
+    public StubBundle addEntry(String path, URL url) {
+        synchronized (this.entriesMonitor) {
+            this.entries.put(path, url);
+            return this;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Enumeration<String> getEntryPaths(String path) {
+        synchronized (this.entryPathsMonitor) {
+            return this.entryPaths.get(path);
+        }
+    }
+
+    /**
+     * Adds a mapping from a path to a {@link Enumeration} for all subsequent calls to {@link #getEntryPaths(String)}.
+     * 
+     * @param path The path to map from
+     * @param paths The {@link Enumeration} to map to
+     * @return <code>this</code> instance of the {@link StubBundle}
+     */
+    public StubBundle addEntryPaths(String path, Enumeration<String> paths) {
+        synchronized (this.entryPathsMonitor) {
+            this.entryPaths.put(path, paths);
+            return this;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Dictionary<String, String> getHeaders() {
+        synchronized (this.headersMonitor) {
+            return shallowCopy(this.headers);
+        }
+    }
+
+    /**
+     * Adds a header mapping for all subsequent calls to {@link #getHeaders()}.
+     * 
+     * @param key The key to map from
+     * @param value The value to map to
+     * 
+     * @return <code>this</code> instance of the {@link StubBundle}
+     */
+    public StubBundle addHeader(String key, String value) {
+        synchronized (this.headersMonitor) {
+            this.headers.put(key, value);
+            return this;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Dictionary<String, String> getHeaders(String locale) {
+        synchronized (this.localizedHeadersMonitor) {
+            return shallowCopy(this.localizedHeaders);
+        }
+    }
+
+    /**
+     * Sets the localized headers to return for all subsequent calls to {@link #getHeaders(String)}.
+     * 
+     * @param dictionary The headers to return
+     * 
+     * @return <code>this</code> instance of the {@link StubBundle}
+     */
+    public StubBundle setLocalizedHeaders(Dictionary<String, String> dictionary) {
+        synchronized (this.localizedHeadersMonitor) {
+            this.localizedHeaders = dictionary;
+            return this;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public long getLastModified() {
+        synchronized (this.lastModifiedMonitor) {
+            return this.lastModified;
+        }
+    }
+
+    /**
+     * Sets the last modified date to return for all subsequent calls to {@link #getLastModified()}. A call to any other
+     * modifying method will update this.
+     * 
+     * @param lastModified The new last modified date
+     * @return <code>this</code> instance of the {@link StubBundle}
+     */
+    public StubBundle setLastModified(long lastModified) {
+        synchronized (this.lastModifiedMonitor) {
+            this.lastModified = lastModified;
+            return this;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getLocation() {
+        return this.location;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public ServiceReference<?>[] getRegisteredServices() {
+        synchronized (this.registeredServicesMonitor) {
+            if (this.registeredServices.isEmpty()) {
+                return null;
+            }
+            return this.registeredServices.toArray(new ServiceReference[this.registeredServices.size()]);
+        }
+    }
+
+    /**
+     * Adds a {@link ServiceReference} for all subsequent calls to {@link #getRegisteredServices()}.
+     * 
+     * @param serviceReference The {@link ServiceReference}
+     * @return <code>this</code> instance of the {@link StubBundle}
+     */
+    public StubBundle addRegisteredService(StubServiceReference<Object> serviceReference) {
+        synchronized (this.registeredServicesMonitor) {
+            serviceReference.setBundle(this);
+            this.registeredServices.add(serviceReference);
+            return this;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public URL getResource(String name) {
+        synchronized (this.resourceMonitor) {
+            return this.resource.get(name);
+        }
+    }
+
+    /**
+     * Adds a mapping from a name to a {@link URL} for all subsequent calls to {@link #getResource(String)}.
+     * 
+     * @param name The name to map from
+     * @param url The {@link URL} to map to
+     * @return <code>this</code> instance of the {@link StubBundle}
+     */
+    public StubBundle addResource(String name, URL url) {
+        synchronized (this.resourceMonitor) {
+            this.resource.put(name, url);
+            return this;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Enumeration<URL> getResources(String name) throws IOException {
+        synchronized (this.resourcesMonitor) {
+            return this.resources.get(name);
+        }
+    }
+
+    /**
+     * Adds a mapping from a name to a {@link Enumeration} for all subsequent calls to {@link #getResources(String)}.
+     * 
+     * @param name The name to map from
+     * @param resources The {@link Enumeration} to map to
+     * @return <code>this</code> instance of the {@link StubBundle}
+     */
+    public StubBundle addResources(String name, Enumeration<URL> resources) {
+        synchronized (this.resourcesMonitor) {
+            this.resources.put(name, resources);
+            return this;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public ServiceReference<?>[] getServicesInUse() {
+        synchronized (this.servicesInUseMonitor) {
+            if (this.servicesInUse.isEmpty()) {
+                return null;
+            }
+            return this.servicesInUse.toArray(new ServiceReference[this.servicesInUse.size()]);
+        }
+    }
+
+    /**
+     * Adds a {@link ServiceReference} for all subsequent calls to {@link #getServicesInUse()}.
+     * 
+     * @param serviceReference The {@link ServiceReference}
+     * @return <code>this</code> instance of the {@link StubBundle}
+     */
+    public StubBundle addServiceInUse(StubServiceReference<Object> serviceReference) {
+        synchronized (this.servicesInUseMonitor) {
+            serviceReference.addUsingBundles(this);
+            this.servicesInUse.add(serviceReference);
+            return this;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public int getState() {
+        synchronized (this.stateMonitor) {
+            return this.state;
+        }
+    }
+
+    /**
+     * Sets the state to return for all subsequent calls to {@link #getState()}. A call to any state modifying method
+     * will change this value.
+     * 
+     * @param state The state to return
+     * 
+     * @return <code>this</code> instance of the {@link StubBundle}
+     */
+    public StubBundle setState(int state) {
+        synchronized (this.stateMonitor) {
+            this.state = state;
+            return this;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getSymbolicName() {
+        return this.symbolicName;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Version getVersion() {
+        return this.version;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean hasPermission(Object permission) {
+        synchronized (this.permissionsMonitor) {
+            if (this.permissions.containsKey(permission)) {
+                return this.permissions.get(permission);
+            }
+            return true;
+        }
+    }
+
+    /**
+     * Adds a mapping from a permission to a {@link Boolean} of whether that permission is valid for all subsequent
+     * calls to {@link #hasPermission(Object)}.
+     * 
+     * @param permission the permission to add
+     * @param hasPermission whether this permission is valid
+     * @return <code>this</code> instance of the {@link StubBundle}
+     */
+    public StubBundle addPermission(Object permission, boolean hasPermission) {
+        synchronized (this.permissionsMonitor) {
+            this.permissions.put(permission, hasPermission);
+            return this;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Class<?> loadClass(String name) throws ClassNotFoundException {
+        synchronized (this.loadClassesMonitor) {
+            if (this.loadClasses.containsKey(name)) {
+                return this.loadClasses.get(name);
+            }
+            throw new ClassNotFoundException("'" + name + "' cannot be loaded");
+        }
+    }
+
+    /**
+     * Adds a mapping from a class name to a {@link Class} for all subsequent calls to {@link #loadClass(String)}.
+     * 
+     * @param name The name of the class to map from
+     * @param clazz The class to map to
+     * @return <code>this</code> instance of the {@link StubBundle}
+     */
+    public StubBundle addLoadClass(String name, Class<?> clazz) {
+        synchronized (this.loadClassesMonitor) {
+            this.loadClasses.put(name, clazz);
+            return this;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void start() throws BundleException {
+        start(0);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void start(int options) throws BundleException {
+        synchronized (this.stateMonitor) {
+            if (this.getState() == ACTIVE) {
+                return;
+            }
+            setState(RESOLVED);
+            setState(STARTING);
+            setState(ACTIVE);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void stop() throws BundleException {
+        stop(0);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void stop(int options) throws BundleException {
+        synchronized (this.stateMonitor) {
+            if (this.getState() != ACTIVE) {
+                return;
+            }
+
+            setState(STOPPING);
+            synchronized (this.registeredServicesMonitor) {
+                for (StubServiceReference<Object> serviceReference : this.registeredServices) {
+                    serviceReference.setBundle(null);
+                }
+                this.registeredServices.clear();
+            }
+
+            synchronized (this.servicesInUseMonitor) {
+                for (StubServiceReference<Object> serviceReference : this.servicesInUse) {
+                    serviceReference.removeUsingBundles(this);
+                }
+                this.servicesInUse.clear();
+            }
+
+            setState(RESOLVED);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void uninstall() throws BundleException {
+        synchronized (this.stateMonitor) {
+            int initialState = getState();
+            stopBundleIfNeeded(initialState);
+            setState(UNINSTALLED);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void update() throws BundleException {
+        synchronized (this.updateDelegateMonitor) {
+            synchronized (this.stateMonitor) {
+                int initialState = getState();
+                stopBundleIfNeeded(initialState);
+
+                if (this.updateDelegate != null) {
+                    this.updateDelegate.update(this);
+                }
+
+                setState(INSTALLED);
+                startBundleIfNeeded(initialState);
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void update(InputStream in) throws BundleException {
+        update();
+    }
+
+    /**
+     * Sets the {@link UpdateDelegate} to use for all subsequent calls to {@link #update()} or
+     * {@link #update(InputStream)}.
+     * 
+     * @param delegate the delegate to use
+     * 
+     * @return <code>this</code> instance of the {@link StubBundle}
+     */
+    public StubBundle setUpdateDelegate(UpdateDelegate delegate) {
+        synchronized (this.updateDelegateMonitor) {
+            this.updateDelegate = delegate;
+            return this;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + bundleId.hashCode();
+        return result;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        StubBundle other = (StubBundle) obj;
+        if (!bundleId.equals(other.bundleId)) {
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String toString() {
+        return String.format("id: %d, symbolic name: %s, version: %s, state: %d", this.bundleId, this.symbolicName, this.version, this.state);
+    }
+
+    private void startBundleIfNeeded(int initialState) throws BundleException {
+        if (initialState == ACTIVE) {
+            this.start();
+        }
+    }
+
+    private void stopBundleIfNeeded(int initialState) throws BundleException {
+        if (initialState == Bundle.ACTIVE || initialState == Bundle.STARTING || initialState == Bundle.STOPPING) {
+            this.stop();
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public int compareTo(Bundle o) {
+        int bundleIdCompare = Long.valueOf(o.getBundleId()).compareTo(this.bundleId);
+        if (bundleIdCompare != 0) {
+            return bundleIdCompare;
+        }
+        int symbolicNameCompare = o.getSymbolicName().compareTo(this.symbolicName);
+        if (symbolicNameCompare != 0) {
+            return symbolicNameCompare;
+        }
+        int bundleVersionCompare = o.getVersion().compareTo(this.version);
+        if (bundleVersionCompare != 0) {
+            return bundleVersionCompare;
+        }
+        int bundleLocationCompare = o.getLocation().compareTo(this.location);
+        if (bundleLocationCompare != 0) {
+            return bundleLocationCompare;
+        }
+        return 0;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Map<X509Certificate, List<X509Certificate>> getSignerCertificates(int signersType) {
+        return new HashMap<X509Certificate, List<X509Certificate>>();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public <A> A adapt(Class<A> type) {
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public File getDataFile(String filename) {
+        return null;
+    }
+
+}
diff --git a/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/framework/StubBundleContext.java b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/framework/StubBundleContext.java
new file mode 100644
index 0000000..237e0c9
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/framework/StubBundleContext.java
@@ -0,0 +1,563 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.stubs.framework;
+
+import static org.eclipse.virgo.test.stubs.internal.Assert.assertNotNull;
+import static org.eclipse.virgo.test.stubs.internal.Duplicator.shallowCopy;
+
+import java.io.File;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Dictionary;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.BundleListener;
+import org.osgi.framework.Constants;
+import org.osgi.framework.Filter;
+import org.osgi.framework.FrameworkListener;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceListener;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.framework.Version;
+
+import org.eclipse.virgo.test.stubs.support.TrueFilter;
+
+/**
+ * A stub testing implementation of {@link BundleContext} as defined in section 6.1.6 of the OSGi Service Platform Core
+ * Specification.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+public final class StubBundleContext implements BundleContext {
+
+    private final StubBundle bundle;
+
+    private final Object bundleMonitor = new Object();
+
+    private final List<BundleListener> bundleListeners = new ArrayList<BundleListener>();
+
+    private final Object bundleListenersMonitor = new Object();
+
+    private final List<FrameworkListener> frameworkListeners = new ArrayList<FrameworkListener>();
+
+    private final Object frameworkListenersMonitor = new Object();
+
+    private final List<ServiceListener> serviceListeners = new ArrayList<ServiceListener>();
+
+    private final Object serviceListenersMonitor = new Object();
+
+    private volatile long installedBundleId = Long.valueOf(2);
+
+    private final Map<Long, StubBundle> installedBundles = new HashMap<Long, StubBundle>();
+
+    private final Object installedBundlesMonitor = new Object();
+
+    private final List<StubServiceRegistration<Object>> serviceRegistrations = new ArrayList<StubServiceRegistration<Object>>();
+
+    private final Map<StubServiceReference<Object>, Object> services = new HashMap<StubServiceReference<Object>, Object>();
+
+    private final Object servicesMonitor = new Object();
+
+    private final Map<String, File> dataFiles = new HashMap<String, File>();
+
+    private final Object dataFilesMonitor = new Object();
+
+    private final Map<String, String> properties = new HashMap<String, String>();
+
+    private final Object propertiesMonitor = new Object();
+
+    private final Map<String, Filter> filters = new HashMap<String, Filter>();
+
+    private final Object filtersMonitor = new Object();
+
+    /**
+     * Creates a new {@link StubBundleContext} and sets its initial state
+     */
+    public StubBundleContext() {
+        this(new StubBundle());
+    }
+
+    /**
+     * Creates a new {@link StubBundleContext} and sets its initial state
+     * 
+     * @param bundle The context bundle
+     */
+    public StubBundleContext(StubBundle bundle) {
+        assertNotNull(bundle, "bundle");
+        this.bundle = bundle;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void addBundleListener(BundleListener listener) {
+        synchronized (this.bundleListenersMonitor) {
+            this.bundleListeners.add(listener);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void addFrameworkListener(FrameworkListener listener) {
+        synchronized (this.frameworkListenersMonitor) {
+            this.frameworkListeners.add(listener);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void addServiceListener(ServiceListener listener) {
+        try {
+            addServiceListener(listener, null);
+        } catch (InvalidSyntaxException e) {
+            // In theory this exception can never be thrown
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void addServiceListener(ServiceListener listener, String filter) throws InvalidSyntaxException {
+        synchronized (this.serviceListenersMonitor) {
+            this.serviceListeners.add(listener);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Filter createFilter(String filter) throws InvalidSyntaxException {
+        synchronized (this.filtersMonitor) {
+            if (filter == null) {
+                throw new NullPointerException();
+            }
+            if (!this.filters.containsKey(filter)) {
+                throw new InvalidSyntaxException(String.format(
+                    "You must first add a filter mapping for '%s' with the addFilter(String, Filter) method", filter), filter);
+            }
+            return this.filters.get(filter);
+        }
+    }
+
+    /**
+     * Adds a mapping from a filter string to a {@link Filter} for all subsequent calls to {@link #createFilter(String)}
+     * 
+     * @param filterString The filterString to map from
+     * @param filter The {@link Filter} to map to
+     * @return <code>this</code> instance of the {@link StubBundleContext}
+     */
+    public StubBundleContext addFilter(String filterString, Filter filter) {
+        synchronized (this.filtersMonitor) {
+            this.filters.put(filterString, filter);
+            return this;
+        }
+    }
+
+    /**
+     * Adds filters for all subsequent calls to {@link #createFilter(String)}
+     * 
+     * @param filters The {@link Filter}s to add
+     * @return <code>this</code> instance of the {@link StubBundleContext}
+     */
+    public StubBundleContext addFilter(Filter... filters) {
+        for (Filter filter : filters) {
+            addFilter(filter.toString(), filter);
+        }
+        return this;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public ServiceReference<?>[] getAllServiceReferences(String clazz, String filter) throws InvalidSyntaxException {
+        return getServiceReferences(clazz, filter);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Bundle getBundle() {
+        synchronized (this.bundleMonitor) {
+            return this.bundle;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Bundle getBundle(long id) {
+        synchronized (this.installedBundlesMonitor) {
+            return this.installedBundles.get(id);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Bundle[] getBundles() {
+        synchronized (this.installedBundlesMonitor) {
+            return this.installedBundles.values().toArray(new Bundle[this.installedBundles.values().size()]);
+        }
+    }
+
+    /**
+     * Adds a collection of {@link Bundle}s to this {@link BundleContext} to be returned for all subsequent calls to
+     * {@link #getBundle(long)} or {@link #getBundles()}.
+     * 
+     * @param bundles The bundles to add
+     * @return <code>this</code> instance of the {@link StubBundleContext}
+     */
+    public StubBundleContext addInstalledBundle(StubBundle... bundles) {
+        synchronized (this.installedBundlesMonitor) {
+            for (StubBundle bundle : bundles) {
+                this.installedBundles.put(bundle.getBundleId(), bundle);
+            }
+            return this;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public File getDataFile(String filename) {
+        synchronized (this.dataFilesMonitor) {
+            return this.dataFiles.get(filename);
+        }
+    }
+
+    /**
+     * Adds a mapping from a filename to a {@link File} for all subsequent calls to {@link #getDataFile(String)}.
+     * 
+     * @param filename The filename to map from
+     * @param file The {@link File} to map to
+     * @return <code>this</code> instance of the {@link StubBundleContext}
+     */
+    public StubBundleContext addDataFile(String filename, File file) {
+        synchronized (this.dataFilesMonitor) {
+            this.dataFiles.put(filename, file);
+            return this;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getProperty(String key) {
+        synchronized (this.propertiesMonitor) {
+            return this.properties.get(key);
+        }
+    }
+
+    /**
+     * Adds a mapping from a key to a value for all subsequent calls to {@link #getProperty(String)}.
+     * 
+     * @param key The key to map from
+     * @param value The value to map to
+     * @return <code>this</code> instance of the {@link StubBundleContext}
+     */
+    public StubBundleContext addProperty(String key, String value) {
+        synchronized (this.propertiesMonitor) {
+            this.properties.put(key, value);
+            return this;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @SuppressWarnings("unchecked")
+    public <S> S getService(ServiceReference<S> reference) {
+        synchronized (this.servicesMonitor) {
+            if (serviceUnregistered(reference)) {
+                return null;
+            }
+
+            return (S) this.services.get(reference);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public ServiceReference<?> getServiceReference(String clazz) {
+        ServiceReference<?>[] serviceReferences = null;
+        try {
+            serviceReferences = getServiceReferences(clazz, null);
+        } catch (InvalidSyntaxException e) {
+            // In theory this exception can never be thrown
+        }
+
+        if (serviceReferences == null) {
+            return null;
+        } else if (serviceReferences.length == 1) {
+            return serviceReferences[0];
+        } else {
+            Arrays.sort(serviceReferences);
+            return serviceReferences[serviceReferences.length - 1];
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public ServiceReference<?>[] getServiceReferences(String clazz, String filter) throws InvalidSyntaxException {
+        synchronized (this.servicesMonitor) {
+            List<ServiceReference<?>> candidateReferences = new ArrayList<ServiceReference<?>>();
+
+            Filter f = getFilter(filter);
+            for (ServiceReference<?> serviceReference : this.services.keySet()) {
+                String[] objectClasses = (String[]) serviceReference.getProperty(Constants.OBJECTCLASS);
+                if (f.match(serviceReference) && matchesClass(clazz, objectClasses)) {
+                    candidateReferences.add(serviceReference);
+                }
+            }
+
+            if (candidateReferences.isEmpty()) {
+                return null;
+            } else {
+                return candidateReferences.toArray(new ServiceReference[candidateReferences.size()]);
+            }
+        }
+    }
+
+    private Filter getFilter(String filter) throws InvalidSyntaxException {
+        if (filter == null) {
+            return new TrueFilter();
+        } else {
+            return createFilter(filter);
+        }
+    }
+
+    private boolean matchesClass(String clazz, String[] objectClasses) {
+        if (clazz == null) {
+            return true;
+        }
+
+        for (String objectClass : objectClasses) {
+            if (clazz.equals(objectClass)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Bundle installBundle(String location) throws BundleException {
+        StubBundle bundle = new StubBundle(this.installedBundleId++, location, Version.emptyVersion, location);
+        bundle.setState(Bundle.INSTALLED);
+        return bundle;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Bundle installBundle(String location, InputStream input) throws BundleException {
+        return installBundle(location);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public ServiceRegistration<?> registerService(String[] clazzes, Object service, Dictionary<String, ?> properties) {
+        StubServiceRegistration<Object> serviceRegistration = createServiceRegistration(clazzes, properties);
+        StubServiceReference<Object> serviceReference = createServiceReference(clazzes, service, serviceRegistration);
+
+        synchronized (this.servicesMonitor) {
+            this.serviceRegistrations.add(serviceRegistration);
+            this.services.put(serviceReference, service);
+        }
+
+        return serviceRegistration;
+    }
+
+    private StubServiceRegistration<Object> createServiceRegistration(String[] clazzes, Dictionary<String, ?> properties) {
+        StubServiceRegistration<Object> serviceRegistration = new StubServiceRegistration<Object>(this, clazzes);
+        serviceRegistration.setProperties(properties);
+        return serviceRegistration;
+    }
+
+    private <S> StubServiceReference<S> createServiceReference(String[] clazzes, Object service, StubServiceRegistration<S> serviceRegistration) {
+        StubServiceReference<S> serviceReference = new StubServiceReference<S>(serviceRegistration);
+        serviceRegistration.setServiceReference(serviceReference);
+        return serviceReference;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public ServiceRegistration<?> registerService(String clazz, Object service, Dictionary<String, ?> properties) {
+        return registerService(new String[] { clazz }, service, properties);
+    }
+
+    /**
+     * Gets the collection of {@link ServiceRegistration}s for this {@link BundleContext}
+     * 
+     * @return The collection of {@link ServiceRegistration}s
+     */
+    public List<StubServiceRegistration<Object>> getServiceRegistrations() {
+        synchronized (this.servicesMonitor) {
+            return shallowCopy(this.serviceRegistrations);
+        }
+    }
+
+    /**
+     * Removes a collection of {@link ServiceRegistration}s from this {@link StubBundleContext} to be returned for all
+     * subsequent calls to {@link #getServiceReference(String)} and {@link #getServiceReferences(String, String)}.
+     * 
+     * @param serviceRegistrations The service registrations to remove
+     * @return <code>this</code> instance of the {@link StubBundleContext}
+     */
+    public StubBundleContext removeRegisteredService(ServiceRegistration<?>... serviceRegistrations) {
+        synchronized (this.servicesMonitor) {
+            this.serviceRegistrations.removeAll(Arrays.asList(serviceRegistrations));
+            for (ServiceRegistration<?> registration: serviceRegistrations) {
+                this.services.remove(registration.getReference());
+            }
+            return this;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void removeBundleListener(BundleListener listener) {
+        synchronized (this.bundleListenersMonitor) {
+            this.bundleListeners.remove(listener);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void removeFrameworkListener(FrameworkListener listener) {
+        synchronized (this.frameworkListenersMonitor) {
+            this.frameworkListeners.remove(listener);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void removeServiceListener(ServiceListener listener) {
+        synchronized (this.serviceListenersMonitor) {
+            this.serviceListeners.remove(listener);
+        }
+    }
+
+    /**
+     * Gets the collection of {@link FrameworkListener}s for this {@link BundleContext}
+     * 
+     * @return The collection of {@link BundleListener}s
+     */
+    public List<FrameworkListener> getFrameworkListeners() {
+        synchronized (this.frameworkListenersMonitor) {
+            return shallowCopy(this.frameworkListeners);
+        }
+    }
+
+    /**
+     * Gets the collection of {@link BundleListener}s for this {@link BundleContext}
+     * 
+     * @return The collection of {@link BundleListener}s
+     */
+    public List<BundleListener> getBundleListeners() {
+        synchronized (this.bundleListenersMonitor) {
+            return shallowCopy(this.bundleListeners);
+        }
+    }
+
+    /**
+     * Gets the collection of {@link ServiceListener}s for this {@link BundleContext}
+     * 
+     * @return The collection of {@link ServiceListener}s
+     */
+    public List<ServiceListener> getServiceListeners() {
+        synchronized (this.serviceListenersMonitor) {
+            return shallowCopy(this.serviceListeners);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean ungetService(ServiceReference<?> reference) {
+        return !serviceUnregistered(reference);
+    }
+
+    /**
+     * @return Returns the context bundle for this {@link BundleContext}
+     */
+    public StubBundle getContextBundle() {
+        synchronized (this.bundleMonitor) {
+            return this.bundle;
+        }
+    }
+
+    private boolean serviceUnregistered(ServiceReference<?> reference) {
+        return ((StubServiceReference<?>) reference).getServiceRegistration().getUnregistered();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @SuppressWarnings("unchecked")
+    public <S> ServiceRegistration<S> registerService(Class<S> clazz, S service, Dictionary<String, ?> properties) {
+        return (ServiceRegistration<S>) registerService(clazz.getName(), service, properties);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @SuppressWarnings("unchecked")
+    public <S> ServiceReference<S> getServiceReference(Class<S> clazz) {
+        return (ServiceReference<S>) getServiceReference(clazz.getName());
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @SuppressWarnings("unchecked")
+    public <S> Collection<ServiceReference<S>> getServiceReferences(Class<S> clazz, String filter) throws InvalidSyntaxException {
+        Collection<ServiceReference<S>> references = new ArrayList<ServiceReference<S>>();
+        ServiceReference<S>[] matchingReferences = (ServiceReference<S>[]) getServiceReferences(clazz.getName(), filter);
+        if (matchingReferences != null) {
+            for (ServiceReference<S> reference : matchingReferences) {
+                references.add(reference);
+            }
+        }
+        return references;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Bundle getBundle(String location) {
+        return null;
+    }
+}
diff --git a/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/framework/StubFilter.java b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/framework/StubFilter.java
new file mode 100644
index 0000000..b8f619f
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/framework/StubFilter.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.stubs.framework;
+
+import org.osgi.framework.Filter;
+
+/**
+ * An extension to the {@link Filter} interface that requires an implementation to tell you what it's filter string
+ * would be.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations must be threadsafe
+ * 
+ */
+public interface StubFilter extends Filter {
+
+    /**
+     * @return The filter string for this filter
+     */
+    String getFilterString();
+}
diff --git a/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/framework/StubServiceReference.java b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/framework/StubServiceReference.java
new file mode 100644
index 0000000..6fc1887
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/framework/StubServiceReference.java
@@ -0,0 +1,294 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.stubs.framework;
+
+import static org.eclipse.virgo.test.stubs.internal.Assert.assertNotNull;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
+
+/**
+ * A stub testing implementation of {@link ServiceReference} as defined in section 6.1.23 of the OSGi Service Platform Core
+ * Specification.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ * @param <S> type of ServiceReference
+ * 
+ */
+public final class StubServiceReference<S> implements ServiceReference<S> {
+
+    private static final Long DEFAULT_SERVICE_ID = Long.valueOf(1);
+
+    private static final Integer DEFAULT_SERVICE_RANKING = Integer.valueOf(0);
+
+    private final Long serviceId;
+
+    private final Integer serviceRanking;
+
+    private final StubServiceRegistration<S> serviceRegistration;
+
+    private volatile StubBundle bundle;
+
+    private final Object bundleMonitor = new Object();
+
+    private final List<StubBundle> usingBundles = new ArrayList<StubBundle>();
+
+    private final Object usingBundlesMonitor = new Object();
+
+    private final Map<Bundle, List<String>> assignableTo = new HashMap<Bundle, List<String>>();
+
+    private final Object assignableToMonitor = new Object();
+
+    /**
+     * Creates a new {@link StubServiceRegistration} and sets its initial state. This constructor sets
+     * <code>service.id</code> to <code>1</code> and <code>service.ranking</code> to <code>0</code>.
+     * 
+     * @param serviceRegistration The service registration behind this {@link ServiceReference}
+     */
+    public StubServiceReference(StubServiceRegistration<S> serviceRegistration) {
+        this(DEFAULT_SERVICE_ID, DEFAULT_SERVICE_RANKING, serviceRegistration);
+    }
+
+    /**
+     * Creates a new {@link StubServiceRegistration} and sets its initial state
+     * 
+     * @param serviceId The service id to use
+     * @param serviceRanking The service ranking to use
+     * @param serviceRegistration The service registration behind this {@link ServiceReference}
+     */
+    public StubServiceReference(Long serviceId, Integer serviceRanking, StubServiceRegistration<S> serviceRegistration) {
+        assertNotNull(serviceId, "serviceId");
+        assertNotNull(serviceRanking, "serviceRanking");
+        assertNotNull(serviceRegistration, "serviceRegistration");
+
+        this.serviceId = serviceId;
+        this.serviceRanking = serviceRanking;
+        this.serviceRegistration = serviceRegistration;
+        this.serviceRegistration.setServiceReference(this);
+        this.bundle = serviceRegistration.getBundleContext().getContextBundle();
+    }
+
+    /**
+     * Gets this {@link ServiceReference}'s <code>service.id</code>
+     * 
+     * @return This {@link ServiceReference}'s <code>service.id</code>
+     */
+    public Long getServiceId() {
+        return this.serviceId;
+    }
+
+    /**
+     * Gets this {@link ServiceReference}'s <code>service.ranking</code>
+     * 
+     * @return This {@link ServiceReference}'s <code>service.ranking</code>
+     */
+    public Integer getServiceRanking() {
+        return this.serviceRanking;
+    }
+
+    /**
+     * Gets this {@link ServiceReference}'s {@link ServiceRegistration}
+     * 
+     * @return This {@link ServiceReference}'s {@link ServiceRegistration}
+     */
+    public StubServiceRegistration<S> getServiceRegistration() {
+        return this.serviceRegistration;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public int compareTo(Object reference) {
+        if (reference == null) {
+            throw new IllegalArgumentException("input cannot be null");
+        }
+
+        if (!(reference instanceof StubServiceReference<?>)) {
+            throw new IllegalArgumentException("input must be StubServiceReference");
+        }
+
+        StubServiceReference<?> other = (StubServiceReference<?>) reference;
+        int idComparison = serviceId.compareTo(other.serviceId);
+        int rankingComparison = serviceRanking.compareTo(other.serviceRanking);
+
+        if (serviceId.equals(other.serviceId)) {
+            return 0;
+        } else if (rankingComparison != 0) {
+            return rankingComparison;
+        } else {
+            return idComparison;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Bundle getBundle() {
+        synchronized (this.bundleMonitor) {
+            return this.bundle;
+        }
+    }
+
+    /**
+     * Sets the {@link Bundle} to return for all subsequent calls to {@link #getBundle()}.
+     * 
+     * @param bundle The bundle to return
+     * 
+     * @return <code>this</code> instance of the {@link StubServiceReference}
+     */
+    public StubServiceReference<S> setBundle(StubBundle bundle) {
+        synchronized (this.bundleMonitor) {
+            this.bundle = bundle;
+            return this;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Object getProperty(String key) {
+        return this.serviceRegistration.getProperties().get(key);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String[] getPropertyKeys() {
+        List<String> properties = new ArrayList<String>();
+        Enumeration<String> keys = this.serviceRegistration.getProperties().keys();
+        while (keys.hasMoreElements()) {
+            properties.add((String) keys.nextElement());
+        }
+
+        return properties.toArray(new String[properties.size()]);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Bundle[] getUsingBundles() {
+        synchronized (this.usingBundlesMonitor) {
+            if (this.usingBundles.isEmpty()) {
+                return null;
+            }
+            return this.usingBundles.toArray(new Bundle[this.usingBundles.size()]);
+        }
+    }
+
+    /**
+     * Adds a collection of {@link Bundle}s to this {@link ServiceReference} to be returned for all subsequent calls to
+     * {@link #getUsingBundles()}.
+     * 
+     * @param bundles The bundles to add
+     * @return <code>this</code> instance of the {@link StubServiceReference}
+     */
+    public StubServiceReference<S> addUsingBundles(StubBundle... bundles) {
+        synchronized (this.usingBundlesMonitor) {
+            this.usingBundles.addAll(Arrays.asList(bundles));
+            return this;
+        }
+    }
+
+    /**
+     * Removes a collection of {@link Bundle}s from this {@link ServiceReference} to be returned for all subsequent
+     * calls to {@link #getUsingBundles()}.
+     * 
+     * @param bundles The bundles to remove
+     * @return <code>this</code> instance of the {@link StubServiceReference}
+     */
+    public StubServiceReference<S> removeUsingBundles(StubBundle... bundles) {
+        synchronized (this.usingBundlesMonitor) {
+            this.usingBundles.removeAll(Arrays.asList(bundles));
+            return this;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isAssignableTo(Bundle bundle, String className) {
+        synchronized (this.assignableToMonitor) {
+            if (!this.assignableTo.containsKey(bundle)) {
+                return false;
+            }
+            return this.assignableTo.get(bundle).contains(className);
+        }
+    }
+
+    /**
+     * Adds a mapping from a {@link Bundle} to a collection of class names that the bundle is assignable to for all
+     * subsequent calls to {@link #isAssignableTo(Bundle, String)}.
+     * 
+     * @param bundle The bundle that the class names will be assignable to
+     * @param classNames The class names that this bundle is assignable from
+     * @return <code>this</code> instance of the {@link StubServiceReference}
+     */
+    public StubServiceReference<S> putAssignableTo(Bundle bundle, String... classNames) {
+        synchronized (this.assignableToMonitor) {
+            this.assignableTo.put(bundle, Arrays.asList(classNames));
+            return this;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + serviceRegistration.hashCode();
+        return result;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        StubServiceReference<?> other = (StubServiceReference<?>) obj;
+
+        if (!serviceRegistration.equals(other.serviceRegistration)) {
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String toString() {
+        return String.format("id: %d, ranking: %d", this.serviceId, this.serviceRanking);
+    }
+}
diff --git a/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/framework/StubServiceRegistration.java b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/framework/StubServiceRegistration.java
new file mode 100644
index 0000000..7aa1af9
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/framework/StubServiceRegistration.java
@@ -0,0 +1,177 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.stubs.framework;
+
+import static org.eclipse.virgo.test.stubs.internal.Assert.assertNotNull;
+import static org.eclipse.virgo.test.stubs.internal.Duplicator.shallowCopy;
+
+import java.util.Arrays;
+import java.util.Dictionary;
+import java.util.Hashtable;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
+
+/**
+ * A stub testing implementation of {@link ServiceRegistration} as defined in section 6.1.24 of the OSGi Service Platform Core
+ * Specification.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ * @param <S> ServiceRegistration type
+ * 
+ */
+public final class StubServiceRegistration<S> implements ServiceRegistration<S> {
+
+    private volatile Dictionary<String, Object> properties = new Hashtable<String, Object>();
+
+    private final Object propertiesMonitor = new Object();
+
+    private volatile boolean unregistered = false;
+
+    private final Object unregisteredMonitor = new Object();
+
+    private final StubBundleContext bundleContext;
+
+    private final String[] objectClasses;
+
+    private volatile StubServiceReference<S> serviceReference;
+
+    private final Object serviceReferenceMonitor = new Object();
+
+    /**
+     * Creates a new {@link StubServiceRegistration} and sets its initial state
+     * 
+     * @param bundleContext The bundle context that created this {@link ServiceRegistration}
+     * @param objectClasses The classes that this service is registered under
+     */
+    public StubServiceRegistration(StubBundleContext bundleContext, String... objectClasses) {
+        assertNotNull(bundleContext, "bundleContext");
+
+        this.bundleContext = bundleContext;
+        this.objectClasses = objectClasses;
+        this.serviceReference = new StubServiceReference<S>(this);
+        populateDefaultProperties(this.properties);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public ServiceReference<S> getReference() {
+        synchronized (this.serviceReferenceMonitor) {
+            return this.serviceReference;
+        }
+    }
+
+    /**
+     * Sets the service reference to return for all subsequent calls to {@link #getReference()}.
+     * 
+     * @param serviceReference The service reference to return
+     * 
+     * @return <code>this</code> instance of the {@link StubServiceRegistration}
+     */
+    public StubServiceRegistration<S> setServiceReference(StubServiceReference<S> serviceReference) {
+        assertNotNull(serviceReference, "serviceReference");
+        synchronized (this.serviceReferenceMonitor) {
+            this.serviceReference = serviceReference;
+
+            synchronized (this.propertiesMonitor) {
+                populateDefaultProperties(this.properties);
+            }
+
+            return this;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @SuppressWarnings("unchecked")
+    public void setProperties(Dictionary<String, ?> properties) {
+        if (properties == null) {
+            return;
+        }
+
+        synchronized (this.propertiesMonitor) {
+            this.properties = (Dictionary<String, Object>) properties;
+            populateDefaultProperties(this.properties);
+        }
+    }
+
+    /**
+     * Gets the properties that were last set with a call to {@link #setProperties(Dictionary)}.
+     * 
+     * @return The properties last passed in with a call to {@link #setProperties(Dictionary)} or <code>null</code> if
+     *         {@link #setProperties(Dictionary)} has not been called
+     */
+    public Dictionary<String, Object> getProperties() {
+        synchronized (this.propertiesMonitor) {
+            return shallowCopy(this.properties);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void unregister() {
+        synchronized (this.unregisteredMonitor) {
+            this.bundleContext.removeRegisteredService(this);
+            this.unregistered = true;
+
+            synchronized (this.serviceReferenceMonitor) {
+                this.serviceReference.setBundle(null);
+            }
+        }
+    }
+
+    /**
+     * Gets whether this {@link ServiceRegistration} has been unregistered with a call to {@link #unregister()}.
+     * 
+     * @return Whether or not this {@link StubServiceRegistration} has been unregistered
+     */
+    public boolean getUnregistered() {
+        synchronized (this.unregisteredMonitor) {
+            return this.unregistered;
+        }
+    }
+
+    /**
+     * Gets the {@link BundleContext} that created this registration
+     * 
+     * @return The {@link BundleContext} that created this registration
+     */
+    public StubBundleContext getBundleContext() {
+        return this.bundleContext;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String toString() {
+        return String.format("object classes: %s, unregistered: %b, properties: %s", Arrays.toString(this.objectClasses), this.unregistered,
+            this.properties);
+    }
+
+    private void populateDefaultProperties(Dictionary<String, Object> properties) {
+        synchronized (this.serviceReferenceMonitor) {
+            properties.put(Constants.SERVICE_ID, this.serviceReference.getServiceId());
+            properties.put(Constants.SERVICE_RANKING, this.serviceReference.getServiceRanking());
+            properties.put(Constants.OBJECTCLASS, this.objectClasses);
+        }
+    }
+}
diff --git a/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/framework/UpdateDelegate.java b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/framework/UpdateDelegate.java
new file mode 100644
index 0000000..998a45b
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/framework/UpdateDelegate.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.stubs.framework;
+
+import java.io.InputStream;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleException;
+
+/**
+ * An interface to allow delegation of calls to {@link Bundle#update()} and {@link Bundle#update(InputStream)} to be
+ * serviced in a test environment.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations must be threadsafe
+ * 
+ */
+public interface UpdateDelegate {
+
+    /**
+     * @param bundle The {@link StubBundle} is being called upon
+     * @throws BundleException
+     * @see Bundle#update()
+     */
+    void update(StubBundle bundle) throws BundleException;
+
+}
diff --git a/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/framework/aspects/AspectPrecedence.aj b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/framework/aspects/AspectPrecedence.aj
new file mode 100644
index 0000000..9068d74
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/framework/aspects/AspectPrecedence.aj
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.stubs.framework.aspects;
+
+/**
+ * An aspect that defines the precendence of the aspects in this project
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+public final aspect AspectPrecedence {
+
+    declare precedence: org.eclipse.virgo.test.stubs.framework.aspects.Valid*,  *, org.eclipse.virgo.test.stubs.framework.aspects.*Events;
+
+}
diff --git a/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/framework/aspects/BundleEvents.aj b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/framework/aspects/BundleEvents.aj
new file mode 100644
index 0000000..9ab6428
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/framework/aspects/BundleEvents.aj
@@ -0,0 +1,145 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.stubs.framework.aspects;
+
+import java.util.List;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleEvent;
+import org.osgi.framework.BundleListener;
+
+import org.eclipse.virgo.test.stubs.framework.StubBundle;
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+
+/**
+ * Sends {@link BundleEvent}s to {@link BundleListener}s.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+public final aspect BundleEvents {
+
+    /**
+     * Sends a {@link BundleEvent#INSTALLED} event to all of the {@link BundleListener}s registered with a
+     * {@link Bundle}
+     * 
+     * @param context The {@link BundleContext} to get the {@link BundleListener}s from
+     * @param bundle The {@link Bundle} to send the event against
+     */
+    after(StubBundleContext context, Bundle bundle) : 
+            this(context) &&
+            withincode(* org.eclipse.virgo.test.stubs.framework.StubBundleContext.installBundle(..)) &&
+            target(bundle) &&
+            call(* org.eclipse.virgo.test.stubs.framework.StubBundle.setState(int)) &&
+            if(thisJoinPoint.getArgs()[0].equals(Bundle.INSTALLED)) {
+        sendEvent(context.getBundleListeners(), new BundleEvent(BundleEvent.INSTALLED, bundle));
+    }
+
+    /**
+     * Sends a {@link BundleEvent#STARTING} event to all of the {@link BundleListener}s registered with a {@link Bundle}
+     * 
+     * @param bundle The {@link Bundle} to send the event against
+     */
+    after(StubBundle bundle) : 
+            this(bundle) &&
+            withincode(* org.eclipse.virgo.test.stubs.framework.StubBundle.start(int)) &&
+            call(* org.eclipse.virgo.test.stubs.framework.StubBundle.setState(int)) &&
+            if(thisJoinPoint.getArgs()[0].equals(Bundle.STARTING)) {
+        StubBundleContext bundleContext = (StubBundleContext) bundle.getBundleContext();
+        sendEvent(bundleContext.getBundleListeners(), new BundleEvent(BundleEvent.STARTING, bundle));
+    }
+
+    private void sendEvent(List<BundleListener> listeners, BundleEvent event) {
+        for (BundleListener listener : listeners) {
+            try {
+                listener.bundleChanged(event);
+            } catch (Exception e) {
+                // Swallow exceptions to allow all listeners to be called
+            }
+        }
+    }
+
+    /**
+     * Sends a {@link BundleEvent#STARTED} event to all of the {@link BundleListener}s registered with a {@link Bundle}
+     * 
+     * @param bundle The {@link Bundle} to send the event against
+     */
+    after(StubBundle bundle) : 
+            this(bundle) &&
+            withincode(* org.eclipse.virgo.test.stubs.framework.StubBundle.start(int)) &&
+            call(* org.eclipse.virgo.test.stubs.framework.StubBundle.setState(int)) &&
+            if(thisJoinPoint.getArgs()[0].equals(Bundle.ACTIVE)) {
+        StubBundleContext bundleContext = (StubBundleContext) bundle.getBundleContext();
+        sendEvent(bundleContext.getBundleListeners(), new BundleEvent(BundleEvent.STARTED, bundle));
+    }
+
+    /**
+     * Sends a {@link BundleEvent#STOPPING} event to all of the {@link BundleListener}s registered with a {@link Bundle}
+     * 
+     * @param bundle The {@link Bundle} to send the event against
+     */
+    after(StubBundle bundle) : 
+            this(bundle) &&
+            withincode(* org.eclipse.virgo.test.stubs.framework.StubBundle.stop(int)) &&
+            call(* org.eclipse.virgo.test.stubs.framework.StubBundle.setState(int)) &&
+            if(thisJoinPoint.getArgs()[0].equals(Bundle.STOPPING)) {
+        StubBundleContext bundleContext = (StubBundleContext) bundle.getBundleContext();
+        sendEvent(bundleContext.getBundleListeners(), new BundleEvent(BundleEvent.STOPPING, bundle));
+    }
+
+    /**
+     * Sends a {@link BundleEvent#STOPPED} event to all of the {@link BundleListener}s registered with a {@link Bundle}
+     * 
+     * @param bundle The {@link Bundle} to send the event against
+     */
+    after(StubBundle bundle) : 
+            this(bundle) &&
+            withincode(* org.eclipse.virgo.test.stubs.framework.StubBundle.stop(int)) &&
+            call(* org.eclipse.virgo.test.stubs.framework.StubBundle.setState(int)) &&
+            if(thisJoinPoint.getArgs()[0].equals(Bundle.RESOLVED)) {
+        StubBundleContext bundleContext = (StubBundleContext) bundle.getBundleContext();
+        sendEvent(bundleContext.getBundleListeners(), new BundleEvent(BundleEvent.STOPPED, bundle));
+    }
+
+    /**
+     * Sends a {@link BundleEvent#UPDATED} event to all of the {@link BundleListener}s registered with a {@link Bundle}
+     * 
+     * @param bundle The {@link Bundle} to send the event against
+     */
+    after(StubBundle bundle) : 
+            this(bundle) &&
+            withincode(* org.eclipse.virgo.test.stubs.framework.StubBundle.update(..)) &&
+            call(* org.eclipse.virgo.test.stubs.framework.StubBundle.setState(int)) &&
+            if(thisJoinPoint.getArgs()[0].equals(Bundle.INSTALLED)) {
+        StubBundleContext bundleContext = (StubBundleContext) bundle.getBundleContext();
+        sendEvent(bundleContext.getBundleListeners(), new BundleEvent(BundleEvent.UPDATED, bundle));
+    }
+
+    /**
+     * Sends a {@link BundleEvent#UNINSTALLED} event to all of the {@link BundleListener}s registered with a
+     * {@link Bundle}
+     * 
+     * @param bundle The {@link Bundle} to send the event against
+     */
+    after(StubBundle bundle) : 
+            this(bundle) &&
+            withincode(* org.eclipse.virgo.test.stubs.framework.StubBundle.uninstall()) &&
+            call(* org.eclipse.virgo.test.stubs.framework.StubBundle.setState(int)) &&
+            if(thisJoinPoint.getArgs()[0].equals(Bundle.UNINSTALLED)) {
+        StubBundleContext bundleContext = (StubBundleContext) bundle.getBundleContext();
+        sendEvent(bundleContext.getBundleListeners(), new BundleEvent(BundleEvent.UNINSTALLED, bundle));
+    }
+}
diff --git a/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/framework/aspects/BundleModifier.aj b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/framework/aspects/BundleModifier.aj
new file mode 100644
index 0000000..ee5922d
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/framework/aspects/BundleModifier.aj
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.stubs.framework.aspects;
+
+import java.util.Date;
+
+import org.eclipse.virgo.test.stubs.framework.StubBundle;
+
+/**
+ * Updates the <code>lastModified</code> time on a bundle when it's modified.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+public final aspect BundleModifier {
+
+    private pointcut modifyingMethod(StubBundle bundle) : this(bundle) && (
+        execution(* org.eclipse.virgo.test.stubs.framework.StubBundle.uninstall()) || 
+        execution(* org.eclipse.virgo.test.stubs.framework.StubBundle.reset()) ||
+        execution(* org.eclipse.virgo.test.stubs.framework.StubBundle.update(..))
+        );
+
+    /**
+     * Updates the modification timestamp on a {@link Bundle} when a modification is made to it
+     * 
+     * @param bundle the {@link Bundle} to modify
+     */
+    after(StubBundle bundle) : modifyingMethod(bundle) {
+        bundle.setLastModified(new Date().getTime());
+    }
+
+}
diff --git a/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/framework/aspects/BundleValid.aj b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/framework/aspects/BundleValid.aj
new file mode 100644
index 0000000..f769a68
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/framework/aspects/BundleValid.aj
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.stubs.framework.aspects;
+
+import org.osgi.framework.Bundle;
+
+import org.eclipse.virgo.test.stubs.framework.StubBundle;
+
+/**
+ * Ensures that a bundle has not been uninstalled before method execution
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+public final aspect BundleValid {
+
+    private pointcut ensureNotUninstalledMethod(StubBundle bundle) : this(bundle) && (
+        execution(* org.eclipse.virgo.test.stubs.framework.StubBundle.getEntry(String)) || 
+        execution(* org.eclipse.virgo.test.stubs.framework.StubBundle.getEntryPaths(String)) ||
+        execution(* org.eclipse.virgo.test.stubs.framework.StubBundle.getRegisteredServices()) ||
+        execution(* org.eclipse.virgo.test.stubs.framework.StubBundle.getResource(String)) ||
+        execution(* org.eclipse.virgo.test.stubs.framework.StubBundle.getResources(String)) ||
+        execution(* org.eclipse.virgo.test.stubs.framework.StubBundle.getServicesInUse()) ||
+        execution(* org.eclipse.virgo.test.stubs.framework.StubBundle.hasPermission(Object)) ||
+        execution(* org.eclipse.virgo.test.stubs.framework.StubBundle.loadClass(String)) ||
+        execution(* org.eclipse.virgo.test.stubs.framework.StubBundle.start(int)) ||
+        execution(* org.eclipse.virgo.test.stubs.framework.StubBundle.stop(int)) ||
+        execution(* org.eclipse.virgo.test.stubs.framework.StubBundle.uninstall()) ||
+        execution(* org.eclipse.virgo.test.stubs.framework.StubBundle.update(..))
+    );
+
+    /**
+     * Ensures that a {@link Bundle} has not been uninstalled before executing a message
+     * 
+     * @param bundle The {@link Bundle} to check
+     * @throws IllegalStateException if the {@link Bundle} has been uninstalled
+     */
+    before(StubBundle bundle) : ensureNotUninstalledMethod(bundle) {
+        if (bundle.getState() == Bundle.UNINSTALLED) {
+            throw new IllegalStateException("This bundle has been uninstalled");
+        }
+    }
+}
diff --git a/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/framework/aspects/ServiceEvents.aj b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/framework/aspects/ServiceEvents.aj
new file mode 100644
index 0000000..9fc141a
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/framework/aspects/ServiceEvents.aj
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.stubs.framework.aspects;
+
+import java.util.List;
+
+import org.osgi.framework.ServiceEvent;
+import org.osgi.framework.ServiceListener;
+import org.osgi.framework.ServiceRegistration;
+
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+import org.eclipse.virgo.test.stubs.framework.StubServiceRegistration;
+
+/**
+ * Sends {@link ServiceEvent}s to {@link ServiceListener}s.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+public final aspect ServiceEvents {
+
+    /**
+     * Sends a {@link ServiceEvent#MODIFIED} event to all of the {@link ServiceListener}s registered with a
+     * {@link ServiceRegistration}
+     * 
+     * @param registration The {@link ServiceRegistration} to send the event against
+     */
+    after(StubServiceRegistration registration) : 
+            this(registration) &&
+            execution(* org.eclipse.virgo.test.stubs.framework.StubServiceRegistration.setProperties(*)) {
+        sendEvent(registration.getBundleContext().getServiceListeners(), new ServiceEvent(ServiceEvent.MODIFIED, registration.getReference()));
+    }
+
+    /**
+     * Sends a {@link ServiceEvent#REGISTERED} event to all of the {@link ServiceListener}s registered with a
+     * {@link ServiceRegistration}
+     * 
+     * @param registration The {@link ServiceRegistration} to send the event against
+     */
+    after(StubBundleContext context) returning (ServiceRegistration<?> registration) :
+            this(context) &&
+            execution(* org.eclipse.virgo.test.stubs.framework.StubBundleContext.registerService(java.lang.String[], java.lang.Object, java.util.Dictionary)) {
+        sendEvent(context.getServiceListeners(), new ServiceEvent(ServiceEvent.REGISTERED, registration.getReference()));
+    }
+
+    /**
+     * Sends a {@link ServiceEvent#UNREGISTERING} event to all of the {@link ServiceListener}s registered with a
+     * {@link ServiceRegistration}
+     * 
+     * @param registration The {@link ServiceRegistration} to send the event against
+     */
+    before(StubServiceRegistration registration) :
+            this(registration) &&
+            execution(* org.eclipse.virgo.test.stubs.framework.StubServiceRegistration.unregister()) {
+        sendEvent(registration.getBundleContext().getServiceListeners(), new ServiceEvent(ServiceEvent.UNREGISTERING, registration.getReference()));
+    }
+
+    private void sendEvent(List<ServiceListener> listeners, ServiceEvent event) {
+        for (ServiceListener listener : listeners) {
+            try {
+                listener.serviceChanged(event);
+            } catch (Exception e) {
+                // Swallow exceptions to allow all listeners to be called
+            }
+        }
+    }
+
+}
diff --git a/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/framework/aspects/ValidBundleContext.aj b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/framework/aspects/ValidBundleContext.aj
new file mode 100644
index 0000000..fd73754
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/framework/aspects/ValidBundleContext.aj
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.stubs.framework.aspects;
+
+import org.osgi.framework.Bundle;
+
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+
+/**
+ * Ensures that a bundle context is in {@link Bundle#STARTING}, {@link Bundle#ACTIVE}, or {@link Bundle#STOPPING} before
+ * method execution
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+public aspect ValidBundleContext {
+
+    /**
+     * Ensures that a {@link BundleContext} is in a valid state (i.e. {@link Bundle.STARTING}, {@link Bundle.ACTIVE}, or
+     * {@link Bundle.STOPPING}) before allowing method invocation
+     * 
+     * @param bundleContext The {@link Bundle} to check
+     * @throws IllegalStateException if the {@link BundleContext} is not in valid state
+     */
+    before(StubBundleContext bundleContext) : 
+            this(bundleContext) &&
+            within(org.eclipse.virgo.test.stubs.framework.StubBundleContext) &&
+            execution(* org.osgi.framework.BundleContext.*(..)) {
+        int state = bundleContext.getContextBundle().getState();
+        if (state != Bundle.STARTING && state != Bundle.ACTIVE && state != Bundle.STOPPING) {
+            throw new IllegalStateException("This context is no longer valid");
+        }
+    }
+}
diff --git a/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/framework/aspects/ValidServiceRegistration.aj b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/framework/aspects/ValidServiceRegistration.aj
new file mode 100644
index 0000000..c0f809e
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/framework/aspects/ValidServiceRegistration.aj
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.stubs.framework.aspects;
+
+import org.eclipse.virgo.test.stubs.framework.StubServiceRegistration;
+
+/**
+ * Ensures that a bundle has not been unregistered before method execution
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+public final aspect ValidServiceRegistration {
+
+    private pointcut ensureNotUninstalledMethod(StubServiceRegistration registration) : this(registration) && (
+        execution(* org.eclipse.virgo.test.stubs.framework.StubServiceRegistration.getReference()) || 
+        execution(* org.eclipse.virgo.test.stubs.framework.StubServiceRegistration.unregister())
+    );
+
+    /**
+     * Ensures that a {@link ServiceRegistration} is not uninstalled before executing the method
+     * 
+     * @param registration The {@link ServiceRegistration} to check
+     * @throws IllegalStateException if the {@link ServiceRegistration} has been unregistered
+     */
+    before(StubServiceRegistration registration) : ensureNotUninstalledMethod(registration) {
+        if (registration.getUnregistered()) {
+            throw new IllegalStateException("This ServiceRegistration has been unregistered.");
+        }
+    }
+}
diff --git a/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/internal/Assert.java b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/internal/Assert.java
new file mode 100644
index 0000000..a34e1a5
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/internal/Assert.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.stubs.internal;
+
+/**
+ * A set of internal assertions for the OSGi test stubs
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+public final class Assert {
+
+    /**
+     * Asserts that value is not <code>null</code>. If value is <code>null</null> throws an exception.
+     * 
+     * @param value The value to test
+     * @param argumentName The name of the argument to be placed in the exception message
+     * @throws IllegalArgumentException when the <code>value</code> is null
+     */
+    public static void assertNotNull(Object value, String argumentName) {
+        if (value == null) {
+            throw new IllegalArgumentException(String.format("%s cannot be null", argumentName));
+        }
+    }
+}
diff --git a/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/internal/Duplicator.java b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/internal/Duplicator.java
new file mode 100644
index 0000000..d095680
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/internal/Duplicator.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.stubs.internal;
+
+import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.List;
+
+/**
+ * Utility methods for stub implementations
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+public class Duplicator {
+
+    /**
+     * Shallow copy the contents of a {@link Dictionary} into a new instance
+     * 
+     * @param <K> The type of keys in the {@link Dictionary}
+     * @param <V> The type of values in the {@link Dictionary}
+     * 
+     * @param in The {@link Dictionary} to copy
+     * @return A new, shallow copied, instance of {@link Dictionary}
+     */
+    public static <K, V> Dictionary<K, V> shallowCopy(Dictionary<K, V> in) {
+        Hashtable<K, V> out = new Hashtable<K, V>(in.size());
+
+        Enumeration<K> keys = in.keys();
+        while (keys.hasMoreElements()) {
+            K key = keys.nextElement();
+            V value = in.get(key);
+            out.put(key, value);
+        }
+
+        return out;
+    }
+
+    /**
+     * Shallow copy the contents of a {@link List} into a new instance
+     * 
+     * @param <T> The type of the values in the {@link List}
+     * @param in The {@link List} to copy
+     * @return A new, shallow copied, instance of the {@link List}
+     */
+    public static <T> List<T> shallowCopy(List<T> in) {
+        return new ArrayList<T>(in);
+    }
+}
diff --git a/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/region/StubRegion.java b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/region/StubRegion.java
new file mode 100644
index 0000000..6f34502
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/region/StubRegion.java
@@ -0,0 +1,162 @@
+/**
+ * This file is part of the Eclipse Virgo project.
+ *
+ * Copyright (c) 2011 copyright_holder
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    cgfrost - initial contribution
+ */
+package org.eclipse.virgo.test.stubs.region;
+
+import java.io.InputStream;
+import java.util.Set;
+
+import org.eclipse.equinox.region.Region;
+import org.eclipse.equinox.region.RegionDigraph;
+import org.eclipse.equinox.region.RegionDigraphVisitor;
+import org.eclipse.equinox.region.RegionFilter;
+import org.eclipse.equinox.region.RegionDigraph.FilteredRegion;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.Version;
+
+/**
+ * StubRegion
+ */
+public class StubRegion implements Region {
+
+    private final String name;
+    
+	private final RegionDigraph regionDigraph;
+
+    public StubRegion(String name, RegionDigraph regionDigraph) {
+        this.name = name;
+		this.regionDigraph = regionDigraph;
+    }
+    
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public String getName() {
+        return this.name;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public void addBundle(Bundle bundle) throws BundleException {
+
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public void addBundle(long bundleId) {
+
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public Bundle installBundle(String location, InputStream input) throws BundleException {
+        return null;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public Bundle installBundle(String location) throws BundleException {
+        return null;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public Set<Long> getBundleIds() {
+        return null;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean contains(Bundle bundle) {
+        return false;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean contains(long bundleId) {
+        return false;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public Bundle getBundle(String symbolicName, Version version) {
+        return null;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public void connectRegion(Region headRegion, RegionFilter filter) throws BundleException {
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public RegionDigraph getRegionDigraph() {
+        return this.regionDigraph;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public void removeBundle(Bundle bundle) {
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public void removeBundle(long bundleId) {
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public Set<FilteredRegion> getEdges() {
+        return null;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public void visitSubgraph(RegionDigraphVisitor visitor) {
+    }
+
+	@Override
+	public Bundle installBundleAtLocation(String arg0, InputStream arg1) throws BundleException {
+		return null;
+	}
+
+}
diff --git a/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/region/StubRegionDigraph.java b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/region/StubRegionDigraph.java
new file mode 100644
index 0000000..2e77f60
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/region/StubRegionDigraph.java
@@ -0,0 +1,147 @@
+/**
+ * This file is part of the Eclipse Virgo project.
+ *
+ * Copyright (c) 2011 copyright_holder
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    cgfrost - initial contribution
+ */
+package org.eclipse.virgo.test.stubs.region;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.equinox.region.Region;
+import org.eclipse.equinox.region.RegionDigraph;
+import org.eclipse.equinox.region.RegionDigraphPersistence;
+import org.eclipse.equinox.region.RegionDigraphVisitor;
+import org.eclipse.equinox.region.RegionFilter;
+import org.eclipse.equinox.region.RegionFilterBuilder;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.hooks.bundle.EventHook;
+import org.osgi.framework.hooks.bundle.FindHook;
+import org.osgi.framework.hooks.resolver.ResolverHookFactory;
+
+public class StubRegionDigraph implements RegionDigraph {
+
+	private final Map<String, Region> regions = new HashMap<String, Region>();
+	
+	private Region defaultRegion;
+	
+	@Override
+	public Iterator<Region> iterator() {
+		return this.regions.values().iterator();
+	}
+
+	@Override
+	public Region createRegion(String regionName) throws BundleException {
+		StubRegion stubRegion = new StubRegion(regionName, this);
+		this.regions.put(regionName, stubRegion);
+		return stubRegion;
+	}
+
+	@Override
+	public RegionFilterBuilder createRegionFilterBuilder() {
+		return null;
+	}
+
+	@Override
+	public void removeRegion(Region region) {
+		this.regions.remove(region.getName());
+	}
+
+	@Override
+	public Set<Region> getRegions() {
+		return Collections.unmodifiableSet(new HashSet<Region>(this.regions.values()));
+	}
+
+	@Override
+	public Region getRegion(String regionName) {
+		return this.regions.get(regionName);
+	}
+
+	@Override
+	public Region getRegion(Bundle bundle) {
+		return null;
+	}
+
+	@Override
+	public Region getRegion(long bundleId) {
+		return null;
+	}
+
+	@Override
+	public void connect(Region tailRegion, RegionFilter filter, Region headRegion) throws BundleException {
+
+	}
+
+	@Override
+	public Set<FilteredRegion> getEdges(Region tailRegion) {
+		return null;
+	}
+
+	@Override
+	public void visitSubgraph(Region startingRegion, RegionDigraphVisitor visitor) {
+
+	}
+
+	@Override
+	public RegionDigraphPersistence getRegionDigraphPersistence() {
+		return null;
+	}
+
+	@Override
+	public RegionDigraph copy() throws BundleException {
+		return null;
+	}
+
+	@Override
+	public void replace(RegionDigraph digraph) throws BundleException {
+
+	}
+
+	@Override
+	public ResolverHookFactory getResolverHookFactory() {
+		return null;
+	}
+
+	@Override
+	public EventHook getBundleEventHook() {
+		return null;
+	}
+
+	@Override
+	public FindHook getBundleFindHook() {
+		return null;
+	}
+
+	@Override
+	public org.osgi.framework.hooks.service.EventHook getServiceEventHook() {
+		return null;
+	}
+
+	@Override
+	public org.osgi.framework.hooks.service.FindHook getServiceFindHook() {
+		return null;
+	}
+
+	@Override
+	public void setDefaultRegion(Region defaultRegion) {
+		this.defaultRegion = defaultRegion;
+	}
+
+	@Override
+	public Region getDefaultRegion() {
+		return this.defaultRegion;
+	}
+
+}
diff --git a/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/service/cm/StubConfiguration.java b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/service/cm/StubConfiguration.java
new file mode 100644
index 0000000..18c00fb
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/service/cm/StubConfiguration.java
@@ -0,0 +1,224 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.stubs.service.cm;
+
+import static org.eclipse.virgo.test.stubs.internal.Assert.assertNotNull;
+import static org.eclipse.virgo.test.stubs.internal.Duplicator.shallowCopy;
+
+import java.io.IOException;
+import java.util.Dictionary;
+import java.util.Hashtable;
+
+import org.osgi.framework.Constants;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+
+/**
+ * A stub testing implementation of {@link Configuration} as defined in section 104.15.2 of the OSGi Service Platform Service
+ * Compendium.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+public final class StubConfiguration implements Configuration {
+
+    private final StubConfigurationAdmin configurationAdmin;
+
+    private final String pid;
+
+    private final String factoryPid;
+
+    private volatile boolean deleted = false;
+
+    private volatile Dictionary<String, Object> properties;
+
+    private final Object propertiesMonitor = new Object();
+
+    private volatile String bundleLocation;
+
+    private final Object bundleLocationMonitor = new Object();
+
+    /**
+     * Creates a new {@link StubConfiguration} and sets its initial state. This constructor sets <code>factoryPid</code>
+     * to <code>null</code>.
+     * 
+     * @param pid The pid of this configuration
+     */
+    public StubConfiguration(String pid) {
+        this(pid, null);
+    }
+
+    /**
+     * Creates a new {@link StubConfiguration} and sets its initial state
+     * 
+     * @param pid The pid of this configuration
+     * @param factoryPid The factory pid of this configuration
+     */
+    public StubConfiguration(String pid, String factoryPid) {
+        this.pid = pid;
+        this.factoryPid = factoryPid;
+        this.configurationAdmin = new StubConfigurationAdmin(pid == null ? factoryPid : pid, this);
+    }
+
+    StubConfiguration(StubConfigurationAdmin configurationAdmin, String pid, String factoryPid, String bundleLocation) {
+        this.configurationAdmin = configurationAdmin;
+        this.pid = pid;
+        this.factoryPid = pid;
+        this.bundleLocation = bundleLocation;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void delete() throws IOException {
+        this.configurationAdmin.deleteConfiguration(this.pid == null ? this.factoryPid : this.pid);
+        this.deleted = true;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getBundleLocation() {
+        synchronized (this.bundleLocationMonitor) {
+            return this.bundleLocation;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getFactoryPid() {
+        return this.factoryPid;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getPid() {
+        return this.pid;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Dictionary<String, Object> getProperties() {
+        synchronized (this.propertiesMonitor) {
+            return this.properties == null ? null : shallowCopy(this.properties);
+        }
+    }
+
+    /**
+     * Adds a mapping from a key to a value for all subsequent calls to {@link #getProperties()}.
+     * 
+     * @param key The key to map from
+     * @param value The value to map to
+     * @return <code>this</code> instance of the {@link StubConfiguration}
+     */
+    public StubConfiguration addProperty(String key, Object value) {
+        synchronized (this.propertiesMonitor) {
+            if (this.properties == null) {
+                this.properties = new Hashtable<String, Object>();
+                updateSystemProperties(this.properties);
+            }
+
+            this.properties.put(key, value);
+            return this;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void setBundleLocation(String bundleLocation) {
+        synchronized (this.bundleLocationMonitor) {
+            this.bundleLocation = bundleLocation;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void update() throws IOException {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    @SuppressWarnings("unchecked")
+    public void update(Dictionary<String, ?> properties) throws IOException {
+        assertNotNull(properties, "properties");
+        synchronized (this.propertiesMonitor) {
+            Dictionary<String, Object> copy = (Dictionary<String, Object>) shallowCopy(properties);
+            updateSystemProperties(copy);
+            this.properties = copy;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        StubConfiguration other = (StubConfiguration) obj;
+        if (!this.pid.equals(other.pid)) {
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int hashCode() {
+        return this.pid.hashCode();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String toString() {
+        return String.format("pid: %s, factoryPid: %s, deleted: %b", this.pid, this.factoryPid, this.deleted);
+    }
+
+    /**
+     * Gets whether this {@link Configuration} has been deleted
+     * 
+     * @return Whether this {@link Configuration} has been deleted
+     */
+    public boolean getDeleted() {
+        return this.deleted;
+    }
+
+    private void updateSystemProperties(Dictionary<String, Object> properties) {
+        properties.put(Constants.SERVICE_PID, this.pid);
+        if (this.factoryPid == null) {
+            properties.remove(ConfigurationAdmin.SERVICE_FACTORYPID);
+        } else {
+            properties.put(ConfigurationAdmin.SERVICE_FACTORYPID, this.factoryPid);
+        }
+    }
+}
diff --git a/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/service/cm/StubConfigurationAdmin.java b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/service/cm/StubConfigurationAdmin.java
new file mode 100644
index 0000000..385509d
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/service/cm/StubConfigurationAdmin.java
@@ -0,0 +1,142 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.stubs.service.cm;
+
+import static org.eclipse.virgo.test.stubs.internal.Assert.assertNotNull;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.osgi.framework.Filter;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+
+import org.eclipse.virgo.test.stubs.support.PropertiesFilter;
+import org.eclipse.virgo.test.stubs.support.TrueFilter;
+
+/**
+ * A stub testing implementation of {@link ConfigurationAdmin} as defined in section 104.15.3 of the OSGi Service Platform
+ * Service Compendium.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+public final class StubConfigurationAdmin implements ConfigurationAdmin {
+
+    private final Map<String, Configuration> configurations = new HashMap<String, Configuration>();
+
+    private final Object configurationsMonitor = new Object();
+
+    /**
+     * Creates a new {@link StubConfigurationAdmin} and sets its initial state
+     */
+    public StubConfigurationAdmin() {
+    }
+
+    StubConfigurationAdmin(String pid, Configuration configuration) {
+        this.configurations.put(pid, configuration);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Configuration createFactoryConfiguration(String factoryPid) throws IOException {
+        return createFactoryConfiguration(factoryPid, null);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Configuration createFactoryConfiguration(String factoryPid, String location) throws IOException {
+        assertNotNull(factoryPid, "factoryPid");
+        synchronized (this.configurationsMonitor) {
+            this.configurations.put(factoryPid, new StubConfiguration(this, null, factoryPid, location));
+            return this.configurations.get(factoryPid);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Configuration getConfiguration(String pid) throws IOException {
+        return getConfiguration(pid, null);
+    }
+
+    /**
+     * Create a new configuration in this {@link ConfigurationAdmin}. This method is useful for chaining together the
+     * creation and property population of stub {@link Configuration}s
+     * 
+     * @param pid The pid of the {@link Configuration} being created
+     * @return the {@link StubConfiguration} that was created
+     * @throws IOException required by the {@link ConfigurationAdmin} specification
+     */
+    public StubConfiguration createConfiguration(String pid) throws IOException {
+        return (StubConfiguration) getConfiguration(pid);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Configuration getConfiguration(String pid, String location) throws IOException {
+        assertNotNull(pid, "pid");
+        synchronized (this.configurationsMonitor) {
+            if (!this.configurations.containsKey(pid)) {
+                this.configurations.put(pid, new StubConfiguration(this, pid, null, location));
+            }
+            return this.configurations.get(pid);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Configuration[] listConfigurations(String filter) throws IOException, InvalidSyntaxException {
+        synchronized (this.configurationsMonitor) {
+            Set<Configuration> matches = new HashSet<Configuration>();
+
+            Filter f = filter == null ? new TrueFilter() : new PropertiesFilter(filter);
+            for (Configuration configuration : this.configurations.values()) {
+                if (isCurrent(configuration) && f.match(configuration.getProperties())) {
+                    matches.add(configuration);
+                }
+            }
+
+            return matches.size() == 0 ? null : matches.toArray(new Configuration[matches.size()]);
+        }
+    }
+
+    private boolean isCurrent(Configuration configuration) {
+        return configuration.getProperties() != null;
+    }
+
+    void deleteConfiguration(String pid) {
+        synchronized (this.configurationsMonitor) {
+            this.configurations.remove(pid);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String toString() {
+        return String.format("configurations: %s", this.configurations);
+    }
+
+}
diff --git a/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/service/cm/aspects/DeletedConfiguration.aj b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/service/cm/aspects/DeletedConfiguration.aj
new file mode 100644
index 0000000..b1629f9
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/service/cm/aspects/DeletedConfiguration.aj
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.stubs.service.cm.aspects;
+
+import org.osgi.service.cm.Configuration;
+
+import org.eclipse.virgo.test.stubs.service.cm.StubConfiguration;
+
+/**
+ * Ensures that a configuration has not been deleted before method execution
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+
+public final aspect DeletedConfiguration {
+
+    /**
+     * Ensures that a {@link Configuration} has not been deleted before allowing method invocation
+     * 
+     * @param configuration The {@link Configuration} to check
+     * @throws IllegalStateException if the {@link Configuration} has been deleted
+     */
+    before(StubConfiguration configuration) : 
+                this(configuration) &&
+                within(org.eclipse.virgo.test.stubs.service.cm.StubConfiguration) &&
+                execution(* org.osgi.service.cm.Configuration.*(..)) &&
+                !execution(* org.eclipse.virgo.test.stubs.service.cm.StubConfiguration.equals(Object)) &&
+                !execution(int org.eclipse.virgo.test.stubs.service.cm.StubConfiguration.hashCode()) &&
+                !execution(java.lang.String org.eclipse.virgo.test.stubs.service.cm.StubConfiguration.toString()) {
+        if (configuration.getDeleted()) {
+            throw new IllegalStateException("This configuration has been deleted");
+        }
+    }
+
+}
diff --git a/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/service/component/StubComponentContext.java b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/service/component/StubComponentContext.java
new file mode 100644
index 0000000..ebb4ecc
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/service/component/StubComponentContext.java
@@ -0,0 +1,119 @@
+/*******************************************************************************

+ * Copyright (c) 2008, 2010 SAP AG

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ *

+ * Contributors:

+ *   SAP AG - initial contribution

+ *******************************************************************************/

+

+package org.eclipse.virgo.test.stubs.service.component;

+

+import java.util.Dictionary;

+import java.util.Hashtable;

+

+import org.osgi.framework.Bundle;

+import org.osgi.framework.BundleContext;

+import org.osgi.framework.ServiceReference;

+import org.osgi.service.component.ComponentContext;

+import org.osgi.service.component.ComponentInstance;

+

+/**

+ * 

+ * A stub testing implementation of {@link ComponentContext} as defined in section 112.5.9 of the OSGi Service Platform Compendium

+ * Specification.

+ * <p />

+ *

+ * <strong>Concurrent Semantics</strong><br />

+ * Thread safe.

+ */

+public class StubComponentContext implements ComponentContext {

+

+    public final String DEFAULT_PROP_KEY = "key";

+

+    public final String DEFAULT_PROP_VALUE = "value";

+

+    private final Dictionary<String, String> props = new Hashtable<String, String>();

+

+    private final BundleContext bundleContext;

+

+    public StubComponentContext(BundleContext bundleContext) {

+        this.bundleContext = bundleContext;

+        populateDefaultProperties();

+    }

+    

+    /**

+     * {@inheritDoc}

+     */

+    public Dictionary<String, String> getProperties() {

+        return this.props;

+    }

+

+    private void populateDefaultProperties() {

+        this.props.put(this.DEFAULT_PROP_KEY, this.DEFAULT_PROP_VALUE);

+    }

+

+    /**

+     * {@inheritDoc}

+     */

+    public Object locateService(String name) {

+        throw new UnsupportedOperationException("Not implemented yet.");

+    }

+

+    /**

+     * {@inheritDoc}

+     */

+    public Object locateService(String name, ServiceReference reference) {

+        throw new UnsupportedOperationException("Not implemented yet.");

+    }

+

+    /**

+     * {@inheritDoc}

+     */

+    public Object[] locateServices(String name) {

+        throw new UnsupportedOperationException("Not implemented yet.");

+    }

+

+    /**

+     * {@inheritDoc}

+     */

+    public BundleContext getBundleContext() {

+        return this.bundleContext;

+    }

+

+    /**

+     * {@inheritDoc}

+     */

+    public Bundle getUsingBundle() {

+        throw new UnsupportedOperationException("Not implemented yet.");

+    }

+

+    /**

+     * {@inheritDoc}

+     */

+    public ComponentInstance getComponentInstance() {

+        throw new UnsupportedOperationException("Not implemented yet.");

+    }

+

+    /**

+     * {@inheritDoc}

+     */

+    public void enableComponent(String name) {

+    }

+

+    /**

+     * {@inheritDoc}

+     */

+    public void disableComponent(String name) {

+    }

+

+    /**

+     * {@inheritDoc}

+     */

+    public ServiceReference getServiceReference() {

+        throw new UnsupportedOperationException("Not implemented yet.");

+    }

+

+}

diff --git a/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/service/event/StubEventAdmin.java b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/service/event/StubEventAdmin.java
new file mode 100644
index 0000000..117c220
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/service/event/StubEventAdmin.java
@@ -0,0 +1,193 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.stubs.service.event;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+
+import org.eclipse.virgo.test.stubs.service.event.internal.EventUtils;
+
+/**
+ * A stub implementation of {@link EventAdmin}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ * 
+ */
+public class StubEventAdmin implements EventAdmin {
+
+    private final List<Event> postedEvents = new ArrayList<Event>();
+
+    private final List<Event> sentEvents = new ArrayList<Event>();
+
+    private final Object monitor = new Object();
+
+    /**
+     * {@inheritDoc}
+     */
+    public void postEvent(Event event) {
+        synchronized (this.monitor) {
+            this.postedEvents.add(event);
+            this.monitor.notifyAll();
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void sendEvent(Event event) {
+        synchronized (this.monitor) {
+            this.sentEvents.add(event);
+            this.monitor.notifyAll();
+        }
+    }
+
+    /**
+     * Waits for up to the supplied millisecond timeout period for the {@link EventAdmin#sendEvent(Event) sending} of an
+     * {@link Event} that {@link Event#equals equals} the supplied <code>event</code>. Successfully waiting for an
+     * <code>Event</code> removes it from the list of events such that a subsequent invocation would block until another
+     * matching event was sent.
+     * 
+     * @param event The <code>Event</code> to await.
+     * @param msTimeout The timeout period
+     * @return <code>true</code> if the <code>Event</code> has been sent, otherwise <code>false</code>.
+     */
+    public boolean awaitSendingOfEvent(Event event, long msTimeout) {
+        return awaitEvent(event, this.sentEvents, msTimeout);
+    }
+
+    /**
+     * Waits for up to the supplied millisecond timeout period for the {@link EventAdmin#postEvent(Event) posting} of an
+     * {@link Event} that {@link Event#equals equals} the supplied <code>event</code>. Successfully waiting for an
+     * <code>Event</code> removes it from the list of events such that a subsequent invocation would block until another
+     * matching event was posted.
+     * 
+     * @param event The <code>Event</code> to await.
+     * @param msTimeout The timeout period
+     * @return <code>true</code> if the <code>Event</code> has been posted, otherwise <code>false</code>.
+     */
+    public boolean awaitPostingOfEvent(Event event, long msTimeout) {
+        return awaitEvent(event, this.postedEvents, msTimeout);
+    }
+    
+    /**
+     * Waits for up to the supplied millisecond timeout period for the {@link EventAdmin#sendEvent(Event) sending} of an
+     * {@link Event} that has the supplied <code>topic</code>. Successfully waiting for an <code>Event</code> removes it
+     * from the list of events such that a subsequent invocation would block until another matching event was sent.
+     * 
+     * @param topic The <code>topic</code> to await.
+     * @param msTimeout The timeout period
+     * @return the matching <code>Event</code>, or <code>null</code> if no <code>Event</code> is received.
+     */
+    public Event awaitSendingOfEvent(String topic, long msTimeout) {
+        return awaitEventOnTopic(topic, this.sentEvents, msTimeout);
+    }
+    
+    /**
+     * Waits for up to the supplied millisecond timeout period for the {@link EventAdmin#postEvent(Event) posting} of an
+     * {@link Event} that has the supplied <code>topic</code>. Successfully waiting for an <code>Event</code> removes it
+     * from the list of events such that a subsequent invocation would block until another matching event was sent.
+     * 
+     * @param topic The <code>topic</code> to await.
+     * @param msTimeout The timeout period
+     * @return the matching <code>Event</code>, or <code>null</code> if no <code>Event</code> is received.
+     */
+    public Event awaitPostingOfEvent(String topic, long msTimeout) {
+        return awaitEventOnTopic(topic, this.postedEvents, msTimeout);
+    }
+
+    private boolean awaitEvent(Event event, List<Event> eventList, long timeout) {
+        long endTime = System.currentTimeMillis() + timeout;
+
+        synchronized (this.monitor) {
+            try {
+                while (!removeEvent(event, eventList)) {
+                    long waitTime = endTime - System.currentTimeMillis();
+
+                    if (waitTime > 0) {
+                        this.monitor.wait(waitTime);
+                    } else {
+                        return false;
+                    }
+                }
+                return true;
+            } catch (InterruptedException e) {
+                Thread.interrupted();
+            }
+
+            return false;
+        }
+    }
+    
+    private Event awaitEventOnTopic(String topic, List<Event> eventList, long timeout) {
+        long endTime = System.currentTimeMillis() + timeout;
+
+        synchronized (this.monitor) {
+            try {
+                Event event = null;
+                while (event == null) {
+                    long waitTime = endTime - System.currentTimeMillis();
+
+                    if (waitTime > 0) {
+                        this.monitor.wait(waitTime);
+                        event = removeEventOnTopic(topic, eventList);
+                    } else {
+                        break;
+                    }
+                }
+                return event;
+            } catch (InterruptedException e) {
+                Thread.interrupted();
+            }
+
+            return null;
+        }
+    }
+
+    private boolean removeEvent(Event event, List<Event> eventList) {
+        
+        Iterator<Event> candidates = eventList.iterator();
+        
+        while (candidates.hasNext()) {
+            Event candidate = candidates.next();
+            
+            if (EventUtils.eventsAreEqual(candidate, event)) {
+                candidates.remove();
+                return true;
+            }
+        }
+        
+        return false;
+    }
+    
+    private Event removeEventOnTopic(String topic, List<Event> eventList) {
+        
+        Iterator<Event> candidates = eventList.iterator();
+        
+        while (candidates.hasNext()) {
+            Event candidate = candidates.next();
+            
+            if (topic.equals(candidate.getTopic())) {
+                candidates.remove();
+                return candidate;
+            }            
+        }
+        
+        return null;
+    }
+}
diff --git a/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/service/event/internal/EventUtils.java b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/service/event/internal/EventUtils.java
new file mode 100644
index 0000000..0a0c715
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/service/event/internal/EventUtils.java
@@ -0,0 +1,98 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.stubs.service.event.internal;
+
+import java.util.Arrays;
+
+import org.osgi.service.event.Event;
+
+
+/**
+ * Utility methods for working with {@link Event Events}.
+ * 
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Thread-safe.
+ *
+ */
+public final class EventUtils {
+    
+    /**
+     * Returns <code>true</code> if the supplied Events are equal, <code>false</code>
+     * if they are not. For two Events to be equals, their topics must be 
+     * {@link String#equals(Object)} equal, and their properties must be equal.
+     * 
+     * <p/>
+     * 
+     * Note: when considering property equality, one-dimensional arrays are considered
+     * to be equal if their contents are equal. Multi-dimensional arrays are not
+     * currently considered and will always be reported as unequal.
+     * 
+     * @param event one <code>Event</code> to be tested for equality
+     * @param candidate the other <code>Event</code> to be tested for equality
+     * 
+     * @return <code>true</code> if the events are equal, otherwise <code>false</code>.
+     */
+    public static boolean eventsAreEqual(Event event, Event candidate) {
+        if (candidate.getTopic().equals(event.getTopic())) {
+            String[] propertyNames = event.getPropertyNames();
+            String[] candidatePropertyNames = candidate.getPropertyNames();
+            
+            if (Arrays.equals(propertyNames, candidatePropertyNames)) {
+                for (String propertyName : propertyNames) {
+                    Object value = event.getProperty(propertyName);
+                    Object candidateValue = candidate.getProperty(propertyName);
+                    
+                    if (value.getClass().isArray()) {
+                        if (!arraysAreEqual(value, candidateValue)) {
+                            return false;
+                        }        
+                    } else if (!value.equals(candidateValue)) {
+                        return false;
+                    }
+                }
+                return true;
+            }
+        }
+        
+        return false;
+    }
+    
+    static boolean arraysAreEqual(Object value, Object candidateValue) {
+        boolean arraysAreEqual = false;
+        
+        Class<?> componentType = value.getClass().getComponentType();
+        if (!componentType.isPrimitive()) {
+            arraysAreEqual = Arrays.equals((Object[]) value, (Object[]) candidateValue);                                    
+        } else if (componentType.equals(boolean.class)) {
+            arraysAreEqual = Arrays.equals((boolean[]) value, (boolean[]) candidateValue);
+        } else if (componentType.equals(byte.class)) {
+            arraysAreEqual = Arrays.equals((byte[]) value, (byte[]) candidateValue);
+        } else if (componentType.equals(char.class)) {
+            arraysAreEqual = Arrays.equals((char[]) value, (char[]) candidateValue);
+        } else if (componentType.equals(double.class)) {
+            arraysAreEqual = Arrays.equals((double[]) value, (double[]) candidateValue);
+        } else if (componentType.equals(float.class)) {
+            arraysAreEqual = Arrays.equals((float[]) value, (float[]) candidateValue);
+        } else if (componentType.equals(int.class)) {
+            arraysAreEqual = Arrays.equals((int[]) value, (int[]) candidateValue);
+        } else if (componentType.equals(long.class)) {
+            arraysAreEqual = Arrays.equals((long[]) value, (long[]) candidateValue);
+        } else {
+            arraysAreEqual = Arrays.equals((short[]) value, (short[]) candidateValue);
+        }
+        
+        return arraysAreEqual;
+    }
+}
diff --git a/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/support/AbstractFilter.java b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/support/AbstractFilter.java
new file mode 100644
index 0000000..2bb4738
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/support/AbstractFilter.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.stubs.support;
+
+import org.osgi.framework.Filter;
+
+/**
+ * Abstract implementation of {@link Filter} that provides the required implementations of {@link Filter#hashCode}
+ * and {@link Filter#toString}
+ * 
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ * 
+ */
+public abstract class AbstractFilter implements Filter {
+    
+    /**
+     * @return The filter string for this filter
+     */
+    protected abstract String getFilterString();
+
+    /**
+     * {@inheritDoc}
+     */
+    public String toString() {
+        return getFilterString();
+    }
+    
+    /**
+     * {@inheritDoc}
+     */
+    public int hashCode() {
+        return toString().hashCode();
+    }
+}
diff --git a/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/support/FalseFilter.java b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/support/FalseFilter.java
new file mode 100644
index 0000000..fd293de
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/support/FalseFilter.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.stubs.support;
+
+import java.util.Dictionary;
+import java.util.Map;
+
+import org.osgi.framework.Filter;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * An implementation of {@link Filter} that never matches.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+public class FalseFilter extends AbstractFilter {
+
+    private final String filterString;
+
+    /**
+     * Creates a new instance with an empty filter string
+     */
+    public FalseFilter() {
+        this("");
+    }
+
+    /**
+     * @param filterString the filter string for this instance
+     */
+    public FalseFilter(String filterString) {
+        this.filterString = filterString;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getFilterString() {
+        return this.filterString;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+   public boolean match(ServiceReference<?> reference) {
+        return false;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean match(Dictionary<String, ?> dictionary) {
+        return false;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean matchCase(Dictionary<String, ?> dictionary) {
+        return false;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean matches(Map<String, ?> map) {
+        return false;
+    }
+
+}
diff --git a/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/support/ObjectClassFilter.java b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/support/ObjectClassFilter.java
new file mode 100644
index 0000000..4588603
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/support/ObjectClassFilter.java
@@ -0,0 +1,97 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.stubs.support;
+
+import static org.eclipse.virgo.test.stubs.internal.Assert.assertNotNull;
+
+import java.util.Dictionary;
+import java.util.Map;
+
+import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * A filter implementation that allows you to match on a given class type.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+public final class ObjectClassFilter extends AbstractFilter {
+
+    private static final String FILTER_STRING_FORMAT = "(objectClass=%s)";
+
+    private final String className;
+
+    /**
+     * @param clazz The {@link Class} for the filter to match on
+     */
+    public ObjectClassFilter(Class<?> clazz) {
+        assertNotNull(clazz, "clazz");
+        this.className = clazz.getName();
+    }
+
+    /**
+     * @param className The name of the {@link Class} for the filter to match on
+     */
+    public ObjectClassFilter(String className) {
+        assertNotNull(className, "className");
+        this.className = className;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean match(ServiceReference<?> reference) {
+        return contains((String[]) reference.getProperty(Constants.OBJECTCLASS), this.className);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean match(Dictionary<String, ?> dictionary) {
+        return contains((String[]) dictionary.get(Constants.OBJECTCLASS), this.className);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean matchCase(Dictionary<String, ?> dictionary) {
+        return match(dictionary);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getFilterString() {
+        return String.format(FILTER_STRING_FORMAT, this.className);
+    }
+    
+    /**
+     * {@inheritDoc}
+     */
+    public boolean matches(Map<String, ?> map) {
+        return contains((String [])map.get(Constants.OBJECTCLASS), this.className);
+    }
+
+    private boolean contains(String[] strings, String toMatch) {
+        for (String string : strings) {
+            if (toMatch.equals(string)) {
+                return true;
+            }
+        }
+        return false;
+    }
+    
+}
diff --git a/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/support/PropertiesFilter.java b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/support/PropertiesFilter.java
new file mode 100644
index 0000000..a3097e5
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/support/PropertiesFilter.java
@@ -0,0 +1,143 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.stubs.support;
+
+import static org.eclipse.virgo.test.stubs.internal.Assert.assertNotNull;
+
+import java.util.Dictionary;
+import java.util.Map;
+import java.util.TreeMap;
+import java.util.Map.Entry;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * A filter implementation that allows you to match on a given set of properties.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+public class PropertiesFilter extends AbstractFilter {
+
+    private static final String FILTER_STRING_FORMAT = "(%s=%s)";
+
+    private static final Pattern PROPERTIES_PATTERN = Pattern.compile("\\(([^=&\\(\\)]*)=([^=&\\(\\)]*)\\)");
+
+    private final Map<String, Object> properties;
+
+    /**
+     * Creates a new {@link PropertiesFilter} that matches on a collection of properties. You may need to pass in a
+     * {@link TreeMap} in order to preserve the property ordering so that it matches the filter string generated by your
+     * code.
+     * 
+     * @param properties The properties to match on
+     */
+    public PropertiesFilter(Map<String, Object> properties) {
+        assertNotNull(properties, "properties");
+        this.properties = properties;
+    }
+
+    /**
+     * Creates a new {@link PropertiesFilter} that matches on a set of properties defined in a filter string.
+     * 
+     * @param filterString The filter string to parse and match on
+     * @throws InvalidSyntaxException if the filterString is not of valid filter syntax
+     */
+    public PropertiesFilter(String filterString) throws InvalidSyntaxException {
+        assertNotNull(filterString, filterString);
+        this.properties = parseFilterString(filterString);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean match(ServiceReference<?> reference) {
+        for (Entry<String, Object> entry : this.properties.entrySet()) {
+            Object value = reference.getProperty(entry.getKey());
+            if (value == null || !value.equals(entry.getValue())) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean match(Dictionary<String, ?> dictionary) {
+        for (Entry<String, Object> entry : this.properties.entrySet()) {
+            Object value = dictionary.get(entry.getKey());
+            if (value == null || !value.equals(entry.getValue())) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean matchCase(Dictionary<String, ?> dictionary) {
+        return match(dictionary);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getFilterString() {
+        if (this.properties.size() == 0) {
+            return "";
+        }
+
+        StringBuilder sb = new StringBuilder();
+        for (Entry<String, Object> entry : this.properties.entrySet()) {
+            sb.append(String.format(FILTER_STRING_FORMAT, entry.getKey(), entry.getValue()));
+        }
+
+        if (this.properties.size() > 1) {
+            sb.insert(0, "(&");
+            sb.append(")");
+        }
+
+        return sb.toString();
+    }
+
+    private Map<String, Object> parseFilterString(String filterString) throws InvalidSyntaxException {
+        Map<String, Object> properties = new TreeMap<String, Object>();
+
+        Matcher matcher = PROPERTIES_PATTERN.matcher(filterString);
+        while (matcher.find()) {
+            properties.put(matcher.group(1), matcher.group(2));
+        }
+
+        return properties;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean matches(Map<String, ?> map) {
+        for (Entry<String, Object> entry : this.properties.entrySet()) {
+            Object value = map.get(entry.getKey());
+            if (value == null || !value.equals(entry.getValue())) {
+                return false;
+            }
+        }
+        return true;
+    }
+}
diff --git a/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/support/TrueFilter.java b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/support/TrueFilter.java
new file mode 100644
index 0000000..6c00d2a
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/src/main/java/org/eclipse/virgo/test/stubs/support/TrueFilter.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.stubs.support;
+
+import java.util.Dictionary;
+import java.util.Map;
+
+import org.osgi.framework.Filter;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * An implementation of {@link Filter} that always matches.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe
+ * 
+ */
+public final class TrueFilter extends AbstractFilter {
+
+    private final String filterString;
+
+    /**
+     * Creates a new instance with an empty filter string
+     */
+    public TrueFilter() {
+        this("");
+    }
+
+    /**
+     * @param filterString the filter string for this instance
+     */
+    public TrueFilter(String filterString) {
+        this.filterString = filterString;
+    }
+
+   /**
+     * {@inheritDoc}
+     */
+    public String getFilterString() {
+        return this.filterString;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean match(ServiceReference<?> reference) {
+        return true;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean match(Dictionary<String, ?> dictionary) {
+        return true;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean matchCase(Dictionary<String, ?> dictionary) {
+        return true;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean matches(Map<String, ?> map) {
+        return true;
+    }
+}
diff --git a/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/AdditionalAsserts.java b/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/AdditionalAsserts.java
new file mode 100644
index 0000000..76db35e
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/AdditionalAsserts.java
@@ -0,0 +1,21 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.stubs;
+
+import static org.junit.Assert.assertTrue;
+
+public final class AdditionalAsserts {
+
+    public static void assertContains(String substring, String string) {
+        assertTrue(String.format("String '%s' did not contain substring '%s'", string, substring), string.contains(substring));
+    }
+}
diff --git a/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/framework/OSGiAssertTests.java b/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/framework/OSGiAssertTests.java
new file mode 100644
index 0000000..e4587e2
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/framework/OSGiAssertTests.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.stubs.framework;
+
+import static org.eclipse.virgo.test.stubs.framework.OSGiAssert.assertBundleListenerCount;
+import static org.eclipse.virgo.test.stubs.framework.OSGiAssert.assertCleanState;
+import static org.eclipse.virgo.test.stubs.framework.OSGiAssert.assertFrameworkListenerCount;
+import static org.eclipse.virgo.test.stubs.framework.OSGiAssert.assertServiceListenerCount;
+import static org.eclipse.virgo.test.stubs.framework.OSGiAssert.assertServiceRegistrationCount;
+
+import org.junit.Test;
+import org.osgi.framework.BundleEvent;
+import org.osgi.framework.BundleListener;
+import org.osgi.framework.FrameworkEvent;
+import org.osgi.framework.FrameworkListener;
+import org.osgi.framework.ServiceEvent;
+import org.osgi.framework.ServiceListener;
+
+import org.eclipse.virgo.test.stubs.framework.StubBundle;
+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
+
+public class OSGiAssertTests {
+
+    private final StubBundleContext bundleContext = new StubBundleContext(new StubBundle());
+
+    @Test
+    public void testAssertCleanState() {
+        assertCleanState(this.bundleContext);
+    }
+
+    @Test
+    public void testAssertBundleListenerCount() {
+        this.bundleContext.addBundleListener(new BundleListener() {
+
+            public void bundleChanged(BundleEvent event) {
+
+            }
+        });
+        assertBundleListenerCount(this.bundleContext, 1);
+    }
+
+    @Test
+    public void testAssertFrameworkListenerCount() {
+        this.bundleContext.addFrameworkListener(new FrameworkListener() {
+
+            public void frameworkEvent(FrameworkEvent event) {
+            }
+        });
+        assertFrameworkListenerCount(this.bundleContext, 1);
+    }
+
+    @Test
+    public void testAssertServiceListenerCount() {
+        this.bundleContext.addServiceListener(new ServiceListener() {
+
+            public void serviceChanged(ServiceEvent event) {
+            }
+        });
+        assertServiceListenerCount(this.bundleContext, 1);
+    }
+
+    @Test
+    public void testAssertServiceRegistrationCount() {
+        this.bundleContext.registerService(Object.class.getName(), new Object(), null);
+        this.bundleContext.registerService(Exception.class.getName(), new Object(), null);
+        assertServiceRegistrationCount(this.bundleContext, 2);
+    }
+
+    @Test
+    public void testAssertServiceRegistrationCountType() {
+        this.bundleContext.registerService(Object.class.getName(), new Object(), null);
+        this.bundleContext.registerService(Exception.class.getName(), new Object(), null);
+        assertServiceRegistrationCount(this.bundleContext, Object.class, 1);
+    }
+
+}
diff --git a/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/framework/StubBundleContextTests.java b/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/framework/StubBundleContextTests.java
new file mode 100644
index 0000000..c00bef5
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/framework/StubBundleContextTests.java
@@ -0,0 +1,421 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.stubs.framework;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleEvent;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.BundleListener;
+import org.osgi.framework.FrameworkEvent;
+import org.osgi.framework.FrameworkListener;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceEvent;
+import org.osgi.framework.ServiceListener;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.framework.Version;
+
+import org.eclipse.virgo.test.stubs.support.AbstractFilter;
+
+public class StubBundleContextTests {
+
+    private StubBundleContext bundleContext = new StubBundleContext();
+
+    @Test
+    public void initialState() {
+        assertNotNull(this.bundleContext.getBundle());
+        assertEquals(0, this.bundleContext.getBundleListeners().size());
+        assertEquals(0, this.bundleContext.getFrameworkListeners().size());
+        assertEquals(0, this.bundleContext.getServiceListeners().size());
+        assertEquals(0, this.bundleContext.getBundles().length);
+        assertNull(this.bundleContext.getDataFile("testFilename"));
+        assertEquals(0, this.bundleContext.getServiceRegistrations().size());
+        assertNull(this.bundleContext.getProperty("testKey"));
+    }
+
+    @Test
+    public void bundleListeners() {
+        TestBundleListener listener = new TestBundleListener();
+        assertEquals(0, this.bundleContext.getBundleListeners().size());
+        this.bundleContext.addBundleListener(listener);
+        assertEquals(1, this.bundleContext.getBundleListeners().size());
+        this.bundleContext.removeBundleListener(listener);
+        assertEquals(0, this.bundleContext.getBundleListeners().size());
+    }
+
+    @Test
+    public void frameworkListeners() {
+        TestFrameworkListener listener = new TestFrameworkListener();
+        assertEquals(0, this.bundleContext.getFrameworkListeners().size());
+        this.bundleContext.addFrameworkListener(listener);
+        assertEquals(1, this.bundleContext.getFrameworkListeners().size());
+        this.bundleContext.removeFrameworkListener(listener);
+        assertEquals(0, this.bundleContext.getFrameworkListeners().size());
+    }
+
+    @Test
+    public void serviceListeners() {
+        TestServiceListener listener = new TestServiceListener();
+        assertEquals(0, this.bundleContext.getServiceListeners().size());
+        this.bundleContext.addServiceListener(listener);
+        assertEquals(1, this.bundleContext.getServiceListeners().size());
+        this.bundleContext.removeServiceListener(listener);
+        assertEquals(0, this.bundleContext.getServiceListeners().size());
+    }
+
+    @Test
+    public void getBundle() {
+        assertNotNull(this.bundleContext.getBundle());
+    }
+
+    @Test
+    public void getBundleByLocation() {
+        assertNull(this.bundleContext.getBundle("testLocation"));
+    }
+
+    @Test
+    public void getBundleById() {
+        StubBundle bundle = new StubBundle(25L, "testSymbolicName", new Version(1, 0, 0), "testLocation");
+        this.bundleContext.addInstalledBundle(bundle);
+        assertSame(bundle, this.bundleContext.getBundle(25L));
+    }
+
+    @Test
+    public void getBundles() {
+        this.bundleContext.addInstalledBundle(new StubBundle());
+        assertEquals(1, this.bundleContext.getBundles().length);
+    }
+
+    @Test
+    public void getDataFile() {
+        assertNull(this.bundleContext.getDataFile("testFile"));
+        File file = new File("/");
+        this.bundleContext.addDataFile("testFile2", file);
+        assertSame(file, this.bundleContext.getDataFile("testFile2"));
+    }
+
+    @Test
+    public void installBundle() throws BundleException {
+        TestBundleListener listener = new TestBundleListener();
+        this.bundleContext.addBundleListener(listener);
+        Bundle bundle = this.bundleContext.installBundle("/");
+        assertNotNull(bundle);
+        assertEquals(2, bundle.getBundleId());
+        assertEquals("/", bundle.getSymbolicName());
+        assertEquals("/", bundle.getLocation());
+        assertEquals(Bundle.INSTALLED, bundle.getState());
+        assertTrue(listener.getCalled());
+        assertEquals(1, listener.getEvents().length);
+        assertEquals(BundleEvent.INSTALLED, listener.getEvents()[0].getType());
+    }
+
+    @Test
+    public void installBundleInputStream() throws BundleException {
+        TestBundleListener listener = new TestBundleListener();
+        this.bundleContext.addBundleListener(listener);
+        Bundle bundle = this.bundleContext.installBundle("/", new TestInputStream());
+        assertNotNull(bundle);
+        assertEquals(2, bundle.getBundleId());
+        assertEquals("/", bundle.getSymbolicName());
+        assertEquals("/", bundle.getLocation());
+        assertEquals(Bundle.INSTALLED, bundle.getState());
+        assertTrue(listener.getCalled());
+        assertEquals(1, listener.getEvents().length);
+        assertEquals(BundleEvent.INSTALLED, listener.getEvents()[0].getType());
+    }
+
+    @Test
+    public void registerService() {
+        Dictionary<String, String> properties = new Hashtable<>();
+        properties.put("testKey", "testValue");
+        Object service = new Object();
+        ServiceRegistration<?> serviceRegistration = this.bundleContext.registerService(Object.class.getName(), service, properties);
+        assertNotNull(serviceRegistration);
+        assertNotNull(serviceRegistration.getReference());
+        assertEquals("testValue", serviceRegistration.getReference().getProperty("testKey"));
+        assertSame(service, this.bundleContext.getService(serviceRegistration.getReference()));
+    }
+
+    @Test
+    public void registerServiceTyped() {
+        Dictionary<String, String> properties = new Hashtable<>();
+        properties.put("testKey", "testValue");
+        Object service = new Object();
+        ServiceRegistration<Object> serviceRegistration = this.bundleContext.registerService(Object.class, service, properties);
+        assertNotNull(serviceRegistration);
+        assertNotNull(serviceRegistration.getReference());
+        assertEquals("testValue", serviceRegistration.getReference().getProperty("testKey"));
+        assertSame(service, this.bundleContext.getService(serviceRegistration.getReference()));
+    }
+
+
+    @Test
+    public void getService() {
+        Object service = new Object();
+        ServiceRegistration<Object> serviceRegistration = this.bundleContext.registerService(Object.class, service, null);
+        assertSame(service, this.bundleContext.getService(serviceRegistration.getReference()));
+    }
+
+    @Test
+    public void getServiceUnregistered() {
+        Object service = new Object();
+        ServiceRegistration<Object> serviceRegistration = this.bundleContext.registerService(Object.class, service, null);
+        ServiceReference<Object> reference = serviceRegistration.getReference();
+        serviceRegistration.unregister();
+        assertNull(this.bundleContext.getService(reference));
+        assertNull(this.bundleContext.getServiceReference(Object.class.getName()));
+    }
+
+    @Test
+    public void registerServiceArray() {
+        Dictionary<String, String> properties = new Hashtable<String, String>();
+        properties.put("testKey", "testValue");
+        ServiceRegistration<?> serviceRegistration = this.bundleContext.registerService(
+            new String[] { Object.class.getName(), Exception.class.getName() }, new Object(), properties);
+        assertNotNull(serviceRegistration);
+        assertNotNull(serviceRegistration.getReference());
+        assertEquals("testValue", serviceRegistration.getReference().getProperty("testKey"));
+    }
+
+    @Test
+    public void removeRegisteredService() {
+        ServiceRegistration<Object> serviceRegistration = this.bundleContext.registerService(Object.class, new Object(), null);
+        assertEquals(1, this.bundleContext.getServiceRegistrations().size());
+        this.bundleContext.removeRegisteredService(serviceRegistration);
+        assertEquals(0, this.bundleContext.getServiceRegistrations().size());
+    }
+
+    @Test
+    public void getProperty() {
+        assertNull(this.bundleContext.getProperty("testKey"));
+        this.bundleContext.addProperty("testKey", "testValue");
+        assertEquals("testValue", this.bundleContext.getProperty("testKey"));
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void createFilterNull() throws InvalidSyntaxException {
+        this.bundleContext.createFilter(null);
+    }
+
+    @Test(expected = InvalidSyntaxException.class)
+    public void createFilterMissing() throws InvalidSyntaxException {
+        this.bundleContext.createFilter("testFilter");
+    }
+
+    @Test
+    public void createFilter() throws InvalidSyntaxException {
+        this.bundleContext.addFilter("testFilter", new TestFilter());
+        assertNotNull(this.bundleContext.createFilter("testFilter"));
+    }
+
+    @Test
+    public void ungetService() {
+        StubServiceRegistration<Object> serviceRegistration = new StubServiceRegistration<Object>(this.bundleContext);
+        StubServiceReference<Object> serviceReference = new StubServiceReference<Object>(serviceRegistration);
+        assertTrue(this.bundleContext.ungetService(serviceReference));
+        serviceRegistration.unregister();
+        assertFalse(this.bundleContext.ungetService(serviceReference));
+    }
+
+    @Test
+    public void getAllServiceReferences() throws InvalidSyntaxException {
+        assertNull(this.bundleContext.getAllServiceReferences(null, null));
+    }
+
+    @Test
+    public void getServiceReferencesNullReturn() throws InvalidSyntaxException {
+        assertNull(this.bundleContext.getServiceReferences((String)null, null));
+    }
+
+    @Test
+    public void getServiceReferencesNullClassNullFilter() throws InvalidSyntaxException {
+        this.bundleContext.registerService(Object.class.getName(), new Object(), null);
+        assertEquals(1, this.bundleContext.getServiceReferences((String)null, null).length);
+    }
+
+    @Test
+    public void getServiceReferencesNullFilter() throws InvalidSyntaxException {
+        this.bundleContext.registerService(Object.class.getName(), new Object(), null);
+        assertEquals(1, this.bundleContext.getServiceReferences(Object.class.getName(), null).length);
+    }
+
+    @Test
+    public void getServiceReferencesWrongClass() throws InvalidSyntaxException {
+        this.bundleContext.registerService(Object.class.getName(), new Object(), null);
+        assertNull(this.bundleContext.getServiceReferences(Exception.class.getName(), null));
+    }
+
+    @Test
+    public void getServiceReferences() throws InvalidSyntaxException {
+        this.bundleContext.addFilter(new TestFilter());
+        this.bundleContext.registerService(Object.class.getName(), new Object(), null);
+        assertEquals(1, this.bundleContext.getServiceReferences(Object.class.getName(), "testFilter").length);
+    }
+
+    @Test
+    public void getServiceReferencesTyped() throws InvalidSyntaxException {
+        this.bundleContext.addFilter(new TestFilter());
+        this.bundleContext.registerService(Object.class, new Object(), null);
+        assertEquals(1, this.bundleContext.getServiceReferences(Object.class, "testFilter").size());
+    }
+
+    @Test
+    public void getServiceReferenceNoValues() throws InvalidSyntaxException {
+        assertNull(this.bundleContext.getServiceReference((String)null));
+    }
+
+    @Test
+    public void getServiceReferenceOneValue() throws InvalidSyntaxException {
+        this.bundleContext.registerService(Object.class.getName(), new Object(), null);
+        assertNotNull(this.bundleContext.getServiceReference((String)null));
+    }
+
+    @Test
+    public void getServiceReferenceOneValueTyped() throws InvalidSyntaxException {
+        this.bundleContext.registerService(Object.class.getName(), new Object(), null);
+        assertNotNull(this.bundleContext.getServiceReference(Object.class));
+    }
+
+    @Test
+    public void getServiceReferenceNoMatching() throws InvalidSyntaxException {
+        this.bundleContext.addFilter(new FalseTestFilter());
+        this.bundleContext.registerService(Object.class, new Object(), null);
+        assertEquals(0, this.bundleContext.getServiceReferences(Object.class, "falseTestFilter").size());
+    }
+
+    @Test
+    public void getServiceReferenceTwoValues() throws InvalidSyntaxException {
+        this.bundleContext.registerService(Object.class.getName(), new Object(), null);
+        this.bundleContext.registerService(Object.class.getName(), new Object(), null);
+        assertNotNull(this.bundleContext.getServiceReference((String)null));
+    }
+
+    private static class TestBundleListener implements BundleListener {
+
+        private boolean called = false;
+
+        private List<BundleEvent> events = new ArrayList<BundleEvent>();
+
+        public void bundleChanged(BundleEvent event) {
+            this.called = true;
+            this.events.add(event);
+        }
+
+        public boolean getCalled() {
+            return called;
+        }
+
+        public BundleEvent[] getEvents() {
+            return events.toArray(new BundleEvent[events.size()]);
+        }
+
+    }
+
+    private static class TestFrameworkListener implements FrameworkListener {
+
+        public void frameworkEvent(FrameworkEvent event) {
+            throw new UnsupportedOperationException();
+        }
+
+    }
+
+    private static class TestServiceListener implements ServiceListener {
+
+        public void serviceChanged(ServiceEvent event) {
+            throw new UnsupportedOperationException();
+        }
+
+    }
+
+    private static class TestInputStream extends InputStream {
+
+        @Override
+        public int read() throws IOException {
+            throw new UnsupportedOperationException();
+        }
+
+    }
+
+    private static class TestFilter extends AbstractFilter {
+
+        /**
+         * {@inheritDoc}
+         */
+        public boolean match(ServiceReference<?> reference) {
+            return true;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public boolean match(Dictionary<String, ?> dictionary) {
+            throw new UnsupportedOperationException();
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public boolean matchCase(Dictionary<String, ?> dictionary) {
+            throw new UnsupportedOperationException();
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public String getFilterString() {
+            return "testFilter";
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public boolean matches(Map<String, ?> map) {
+            throw new UnsupportedOperationException();
+        }
+
+    }
+
+    private static class FalseTestFilter extends TestFilter {
+
+        /**
+         * {@inheritDoc}
+         */
+        public boolean match(ServiceReference<?> reference) {
+            return false;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public String getFilterString() {
+            return "falseTestFilter";
+        }
+
+    }
+}
diff --git a/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/framework/StubBundleTests.java b/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/framework/StubBundleTests.java
new file mode 100644
index 0000000..6655fc4
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/framework/StubBundleTests.java
@@ -0,0 +1,544 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.virgo.test.stubs.framework;
+
+import static org.eclipse.virgo.test.stubs.AdditionalAsserts.assertContains;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.*;
+
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleEvent;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.BundleListener;
+import org.osgi.framework.Version;
+import org.osgi.framework.startlevel.BundleStartLevel;
+
+public class StubBundleTests {
+
+    private static final Long DEFAULT_BUNDLE_ID = Long.valueOf(1);
+
+    private static final String DEFAULT_SYMBOLIC_NAME = "org.eclipse.virgo.test.stubs.testbundle";
+
+    private static final Version DEFAULT_VERSION = Version.emptyVersion;
+
+    private static final String DEFAULT_LOCATION = "/";
+
+    private StubBundle bundle = new StubBundle();
+
+    @Test
+    public void initialState() throws IOException {
+        assertEquals(Bundle.STARTING, this.bundle.getState());
+        assertNotNull(this.bundle.getBundleContext());
+        assertEquals(0, this.bundle.getHeaders().size());
+        assertEquals(0, this.bundle.getHeaders("testLocale").size());
+        assertNull(this.bundle.getEntry("testPath"));
+        assertNull(this.bundle.getEntryPaths("testPath"));
+        assertTrue(this.bundle.hasPermission("testPermission"));
+        assertNull(this.bundle.getResource("testName"));
+        assertNull(this.bundle.getResources("testName"));
+        assertNull(this.bundle.findEntries("testPath", "testFilePattern", true));
+        assertNull(this.bundle.getRegisteredServices());
+        assertNull(this.bundle.getServicesInUse());
+
+        try {
+            this.bundle.loadClass("testClass");
+            fail();
+        } catch (ClassNotFoundException e) {
+
+        }
+    }
+
+    @Test
+    public void defaultIdNameVersionLocation() {
+        assertEquals(DEFAULT_BUNDLE_ID.longValue(), this.bundle.getBundleId());
+        assertEquals(DEFAULT_SYMBOLIC_NAME, this.bundle.getSymbolicName());
+        assertEquals(DEFAULT_VERSION, this.bundle.getVersion());
+        assertEquals(DEFAULT_LOCATION, this.bundle.getLocation());
+    }
+
+    @Test
+    public void nameVersion() {
+        StubBundle b1 = new StubBundle("testSymbolicName", new Version(1, 0, 0));
+        assertEquals(DEFAULT_BUNDLE_ID.longValue(), this.bundle.getBundleId());
+        assertEquals("testSymbolicName", b1.getSymbolicName());
+        assertEquals(new Version(1, 0, 0), b1.getVersion());
+        assertEquals(DEFAULT_LOCATION, this.bundle.getLocation());
+    }
+
+    @Test
+    public void idNameVersionLocation() {
+        StubBundle b1 = new StubBundle(2L, "testSymbolicName", new Version(1, 0, 0), "testLocation");
+        assertEquals(2L, b1.getBundleId());
+        assertEquals("testSymbolicName", b1.getSymbolicName());
+        assertEquals(new Version(1, 0, 0), b1.getVersion());
+        assertEquals("testLocation", b1.getLocation());
+    }
+
+    @Test
+    public void getCustomHeader() {
+        this.bundle.addHeader("testKey", "testValue");
+        assertEquals("testValue", this.bundle.getHeaders().get("testKey"));
+    }
+
+    @Test
+    public void getCustomLocalizedHeaders() {
+        Dictionary<String, String> testHeaders = new Hashtable<>();
+        this.bundle.setLocalizedHeaders(testHeaders);
+        assertEquals(testHeaders, this.bundle.getHeaders("testLocale"));
+    }
+
+    @Test
+    public void getLastModified() throws BundleException {
+        Long lastModified = this.bundle.getLastModified();
+        this.bundle.update();
+        assertTrue(lastModified < this.bundle.getLastModified());
+    }
+
+    @Test(expected = ClassNotFoundException.class)
+    public void loadClassNonExistent() throws ClassNotFoundException {
+        this.bundle.loadClass("testClass");
+    }
+
+    @Test(expected = IllegalStateException.class)
+    public void loadClassUninstalled() throws BundleException, ClassNotFoundException {
+        this.bundle.addLoadClass("testClass", this.getClass());
+        this.bundle.uninstall();
+        this.bundle.loadClass("testClass");
+    }
+
+    @Test
+    public void loadClass() throws ClassNotFoundException {
+        this.bundle.addLoadClass("testClass", this.getClass());
+        assertNotNull(this.bundle.loadClass("testClass"));
+    }
+
+    @Test(expected = IllegalStateException.class)
+    public void getEntryUninstalled() throws BundleException, MalformedURLException {
+        this.bundle.addEntry("testPath", new URL("http://localhost"));
+        this.bundle.uninstall();
+        this.bundle.getEntry("testPath");
+    }
+
+    @Test
+    public void getEntry() throws MalformedURLException {
+        assertNull(this.bundle.getEntry("testPath"));
+        this.bundle.addEntry("testPath", new URL("http://localhost"));
+        assertNotNull(this.bundle.getEntry("testPath"));
+    }
+
+    @Test(expected = IllegalStateException.class)
+    public void getEntryPathsUninstalled() throws BundleException, MalformedURLException {
+        this.bundle.addEntryPaths("testPath", new TestEnumeration<String>());
+        this.bundle.uninstall();
+        this.bundle.getEntryPaths("testPath");
+    }
+
+    @Test
+    public void getEntryPaths() throws MalformedURLException {
+        assertNull(this.bundle.getEntryPaths("testPath"));
+        this.bundle.addEntryPaths("testPath", new TestEnumeration<String>());
+        assertNotNull(this.bundle.getEntryPaths("testPath"));
+    }
+
+    @Test(expected = IllegalStateException.class)
+    public void hasPermissionUninstalled() throws BundleException, MalformedURLException {
+        this.bundle.addPermission("testPermission", false);
+        this.bundle.uninstall();
+        this.bundle.hasPermission("testPermission");
+    }
+
+    @Test
+    public void hasPermission() throws MalformedURLException {
+        assertTrue(this.bundle.hasPermission("testPermission"));
+        this.bundle.addPermission("testPermission", false);
+        assertFalse(this.bundle.hasPermission("testPermission"));
+    }
+
+    @Test(expected = IllegalStateException.class)
+    public void getResourceUninstalled() throws BundleException, MalformedURLException {
+        this.bundle.addResource("testName", new URL("http://localhost"));
+        this.bundle.uninstall();
+        this.bundle.getEntry("testName");
+    }
+
+    @Test
+    public void getResource() throws MalformedURLException {
+        assertNull(this.bundle.getResource("testName"));
+        this.bundle.addEntry("testName", new URL("http://localhost"));
+        assertNotNull(this.bundle.getEntry("testName"));
+    }
+
+    @Test(expected = IllegalStateException.class)
+    public void getResourcesUninstalled() throws BundleException, IOException {
+        this.bundle.addResources("testName", new TestEnumeration<URL>());
+        this.bundle.uninstall();
+        this.bundle.getResources("testName");
+    }
+
+    @Test
+    public void getResources() throws IOException {
+        assertNull(this.bundle.getResources("testName"));
+        this.bundle.addResources("testName", new TestEnumeration<URL>());
+        assertNotNull(this.bundle.getResources("testName"));
+    }
+
+    @Test
+    public void findEntriesNoDelegate() {
+        assertNull(this.bundle.findEntries("testPath", "testFilePattern", true));
+    }
+
+    @Test
+    public void findEntries() {
+        this.bundle.setFindEntriesDelegate(new TestFindEntriesDelegate());
+        assertNotNull(this.bundle.findEntries("testPath", "testFilePattern", true));
+    }
+
+    @Test()
+    public void getRegisteredServicesEmpty() {
+        assertNull(this.bundle.getRegisteredServices());
+    }
+
+    @Test(expected = IllegalStateException.class)
+    public void getRegisteredServicesUninstalled() throws BundleException {
+        this.bundle.addRegisteredService(new StubServiceReference<Object>(new StubServiceRegistration<Object>(new StubBundleContext(this.bundle))));
+        this.bundle.uninstall();
+        this.bundle.getRegisteredServices();
+    }
+
+    @Test
+    public void getRegisteredServices() {
+        this.bundle.addRegisteredService(new StubServiceReference<Object>(new StubServiceRegistration<Object>(new StubBundleContext(this.bundle))));
+        assertNotNull(this.bundle.getRegisteredServices());
+    }
+
+    @Test()
+    public void getServicesInUseEmpty() {
+        assertNull(this.bundle.getServicesInUse());
+    }
+
+    @Test(expected = IllegalStateException.class)
+    public void getServicesInUseUninstalled() throws BundleException {
+        this.bundle.addServiceInUse(new StubServiceReference<Object>(new StubServiceRegistration<Object>(new StubBundleContext(this.bundle))));
+        this.bundle.uninstall();
+        this.bundle.getServicesInUse();
+    }
+
+    @Test
+    public void getServicesInUse() {
+        this.bundle.addServiceInUse(new StubServiceReference<Object>(new StubServiceRegistration<Object>(new StubBundleContext(this.bundle))));
+        assertNotNull(this.bundle.getServicesInUse());
+    }
+
+    @Test(expected = IllegalStateException.class)
+    public void updateUninstall() throws BundleException {
+        this.bundle.uninstall();
+        this.bundle.update();
+    }
+
+    @Test
+    public void updateNoDelegate() throws BundleException {
+        this.bundle.setState(Bundle.STARTING);
+        this.bundle.update();
+        assertEquals(Bundle.INSTALLED, this.bundle.getState());
+    }
+
+    @Test
+    public void updateInputStreamNoDelegate() throws BundleException {
+        this.bundle.setState(Bundle.STARTING);
+        this.bundle.update(new TestInputStream());
+        assertEquals(Bundle.INSTALLED, this.bundle.getState());
+    }
+
+    @Test
+    public void updateActive() throws BundleException {
+        this.bundle.setState(Bundle.ACTIVE);
+        this.bundle.update();
+        assertEquals(Bundle.ACTIVE, this.bundle.getState());
+    }
+
+    @Test
+    public void updateStarting() throws BundleException {
+        this.bundle.setState(Bundle.STARTING);
+        this.bundle.update();
+        assertEquals(Bundle.INSTALLED, this.bundle.getState());
+    }
+
+    @Test
+    public void updateStopping() throws BundleException {
+        this.bundle.setState(Bundle.STOPPING);
+        this.bundle.update();
+        assertEquals(Bundle.INSTALLED, this.bundle.getState());
+
+    }
+
+    @Test
+    public void updateInstalled() throws BundleException {
+        this.bundle.setState(Bundle.INSTALLED);
+        this.bundle.update();
+        assertEquals(Bundle.INSTALLED, this.bundle.getState());
+    }
+
+    @Test
+    public void updateResolved() throws BundleException {
+        this.bundle.setState(Bundle.RESOLVED);
+        this.bundle.update();
+        assertEquals(Bundle.INSTALLED, this.bundle.getState());
+    }
+
+    @Test
+    public void update() throws BundleException {
+        TestBundleListener listener = new TestBundleListener();
+        this.bundle.getBundleContext().addBundleListener(listener);
+        TestUpdateDelegate delegate = new TestUpdateDelegate();
+        this.bundle.setUpdateDelegate(delegate);
+        this.bundle.update();
+        assertTrue(listener.getCalled());
+        assertEquals(BundleEvent.UPDATED, listener.getEvents().get(0).getType());
+        assertTrue(delegate.updateCalled);
+    }
+
+    @Test(expected = IllegalStateException.class)
+    public void uninstallUninstall() throws BundleException {
+        this.bundle.uninstall();
+        assertEquals(Bundle.UNINSTALLED, this.bundle.getState());
+        this.bundle.uninstall();
+    }
+
+    @Test
+    public void uninstallActive() throws BundleException {
+        this.bundle.setState(Bundle.ACTIVE);
+        this.bundle.uninstall();
+        assertEquals(Bundle.UNINSTALLED, this.bundle.getState());
+    }
+
+    @Test
+    public void uninstallStarting() throws BundleException {
+        this.bundle.setState(Bundle.STARTING);
+        this.bundle.uninstall();
+        assertEquals(Bundle.UNINSTALLED, this.bundle.getState());
+    }
+
+    @Test
+    public void uninstallStopping() throws BundleException {
+        this.bundle.setState(Bundle.STOPPING);
+        this.bundle.uninstall();
+        assertEquals(Bundle.UNINSTALLED, this.bundle.getState());
+    }
+
+    @Test
+    public void uninstallInstalled() throws BundleException {
+        this.bundle.setState(Bundle.INSTALLED);
+        this.bundle.uninstall();
+        assertEquals(Bundle.UNINSTALLED, this.bundle.getState());
+    }
+
+    @Test
+    public void uninstallResolved() throws BundleException {
+        this.bundle.setState(Bundle.RESOLVED);
+        this.bundle.uninstall();
+        assertEquals(Bundle.UNINSTALLED, this.bundle.getState());
+    }
+
+    @Test
+    public void uninstall() throws BundleException {
+        TestBundleListener listener = new TestBundleListener();
+        this.bundle.getBundleContext().addBundleListener(listener);
+        this.bundle.uninstall();
+        assertTrue(listener.getCalled());
+        assertEquals(BundleEvent.UNINSTALLED, listener.getEvents().get(0).getType());
+    }
+
+    @Test
+    public void stopNotActive() throws BundleException {
+        TestBundleListener listener = new TestBundleListener();
+        this.bundle.getBundleContext().addBundleListener(listener);
+        this.bundle.stop();
+        assertEquals(Bundle.STARTING, this.bundle.getState());
+        assertFalse(listener.getCalled());
+    }
+
+    @Test
+    public void stop() throws BundleException {
+        TestBundleListener listener = new TestBundleListener();
+        this.bundle.getBundleContext().addBundleListener(listener);
+        StubServiceReference<Object> reference = new StubServiceReference<Object>(new StubServiceRegistration<Object>(new StubBundleContext(this.bundle)));
+        reference.setBundle(this.bundle);
+        this.bundle.addRegisteredService(reference);
+        reference.addUsingBundles(this.bundle);
+        this.bundle.addServiceInUse(reference);
+        this.bundle.setState(Bundle.ACTIVE);
+
+        this.bundle.stop();
+
+        assertEquals(Bundle.RESOLVED, this.bundle.getState());
+        assertNull(reference.getBundle());
+        assertNull(this.bundle.getRegisteredServices());
+        assertNull(reference.getUsingBundles());
+        assertNull(this.bundle.getServicesInUse());
+        assertTrue(listener.getCalled());
+        assertEquals(BundleEvent.STOPPING, listener.getEvents().get(0).getType());
+        assertEquals(BundleEvent.STOPPED, listener.getEvents().get(1).getType());
+    }
+
+    @Test
+    public void startActive() throws BundleException {
+        TestBundleListener listener = new TestBundleListener();
+        this.bundle.getBundleContext().addBundleListener(listener);
+        this.bundle.setState(Bundle.ACTIVE);
+        this.bundle.start();
+        assertEquals(Bundle.ACTIVE, this.bundle.getState());
+        assertFalse(listener.getCalled());
+    }
+
+    @Test
+    public void start() throws BundleException {
+        TestBundleListener listener = new TestBundleListener();
+        this.bundle.getBundleContext().addBundleListener(listener);
+
+        this.bundle.start();
+
+        assertEquals(Bundle.ACTIVE, this.bundle.getState());
+        assertTrue(listener.getCalled());
+        assertEquals(BundleEvent.STARTING, listener.getEvents().get(0).getType());
+        assertEquals(BundleEvent.STARTED, listener.getEvents().get(1).getType());
+    }
+
+    @Test
+    public void customBundleContext() {
+        StubBundleContext bundleContext = new StubBundleContext(this.bundle);
+        this.bundle.setBundleContext(bundleContext);
+        assertSame(bundleContext, this.bundle.getBundleContext());
+    }
+
+    @Test
+    public void testHashCode() {
+        StubBundle b2 = new StubBundle();
+        assertFalse(31 == b2.hashCode());
+    }
+
+    @Test
+    public void testEquals() {
+        assertTrue(this.bundle.equals(this.bundle));
+        assertFalse(this.bundle.equals(null));
+        assertFalse(this.bundle.equals(new Object()));
+
+        assertFalse(this.bundle.equals(new StubBundle(2L, DEFAULT_SYMBOLIC_NAME, DEFAULT_VERSION, DEFAULT_LOCATION)));
+        assertTrue(this.bundle.equals(new StubBundle()));
+    }
+
+    @Test
+    public void testToString() {
+        String toString = bundle.toString();
+        assertContains("id", toString);
+        assertContains("symbolic name", toString);
+        assertContains("version", toString);
+        assertContains("state", toString);
+    }
+
+    @Test
+    public void compareTo() {
+        assertEquals(0, this.bundle.compareTo(this.bundle));
+        assertEquals(0, this.bundle.compareTo(new StubBundle(DEFAULT_BUNDLE_ID, DEFAULT_SYMBOLIC_NAME, DEFAULT_VERSION, DEFAULT_LOCATION)));
+        assertTrue(0 != this.bundle.compareTo(new StubBundle(2L, DEFAULT_SYMBOLIC_NAME, DEFAULT_VERSION, DEFAULT_LOCATION)));
+        assertTrue(0 != this.bundle.compareTo(new StubBundle(DEFAULT_BUNDLE_ID, "testName", DEFAULT_VERSION, DEFAULT_LOCATION)));
+        assertTrue(0 != this.bundle.compareTo(new StubBundle(DEFAULT_BUNDLE_ID, DEFAULT_SYMBOLIC_NAME, new Version(1, 0, 0), DEFAULT_LOCATION)));
+        assertTrue(0 != this.bundle.compareTo(new StubBundle(DEFAULT_BUNDLE_ID, DEFAULT_SYMBOLIC_NAME, DEFAULT_VERSION, "testLocation")));
+        assertEquals(0, this.bundle.compareTo(new StubBundle()));
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void compareToNull() {
+        this.bundle.compareTo(null);
+    }
+
+    @Test
+    public void testGetSignerCertificates() {
+        assertEquals(0, this.bundle.getSignerCertificates(0).size());
+        assertEquals(0, this.bundle.getSignerCertificates(7).size());
+    }
+
+    @Test
+    public void adapt() {
+        assertNull(this.bundle.adapt(null));
+        assertNull(this.bundle.adapt(BundleStartLevel.class));
+    }
+
+    @Test
+    public void getDataFile() {
+        assertNull(this.bundle.getDataFile(null));
+        assertNull(this.bundle.getDataFile("testFile"));
+    }
+
+    private static final class TestInputStream extends InputStream {
+
+        @Override
+        public int read() throws IOException {
+            throw new UnsupportedOperationException();
+        }
+    }
+
+    private static final class TestFindEntriesDelegate implements FindEntriesDelegate {
+
+        public Enumeration<URL> findEntries(String path, String filePattern, boolean recurse) {
+            return new TestEnumeration<URL>();
+        }
+    }
+
+    private static class TestUpdateDelegate implements UpdateDelegate {
+
+        private volatile boolean updateCalled = false;
+
+        public void update(StubBundle bundle) throws BundleException {
+            this.updateCalled = true;
+        }
+    }
+
+    private static class TestEnumeration<S> implements Enumeration<S> {
+
+        public boolean hasMoreElements() {
+            throw new UnsupportedOperationException();
+        }
+
+        public S nextElement() {
+            throw new UnsupportedOperationException();
+        }
+    }
+
+    private static class TestBundleListener implements BundleListener {
+
+        private List<BundleEvent> events = new ArrayList<BundleEvent>();
+
+        public void bundleChanged(BundleEvent event) {
+            this.events.add(event);
+        }
+
+        public List<BundleEvent> getEvents() {
+            return this.events;
+        }
+
+        public boolean getCalled() {
+            return this.events.size() != 0;
+        }
+    }
+
+}
diff --git a/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/framework/StubServiceReferenceTests.java b/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/framework/StubServiceReferenceTests.java
new file mode 100644
index 0000000..44302be
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/framework/StubServiceReferenceTests.java
@@ -0,0 +1,151 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.stubs.framework;
+
+import static org.eclipse.virgo.test.stubs.AdditionalAsserts.assertContains;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Arrays;
+
+import org.junit.Test;
+import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceReference;
+
+public class StubServiceReferenceTests {
+
+    private StubServiceReference<Object> ref = new StubServiceReference<Object>(new StubServiceRegistration<Object>(new StubBundleContext(new StubBundle())));
+
+    @Test
+    public void initialState() {
+        assertNotNull(this.ref.getProperty(Constants.SERVICE_ID));
+        assertNotNull(this.ref.getProperty(Constants.SERVICE_RANKING));
+        assertNotNull(this.ref.getProperty(Constants.OBJECTCLASS));
+        assertEquals(3, this.ref.getPropertyKeys().length);
+        assertNull(this.ref.getUsingBundles());
+        assertFalse(this.ref.isAssignableTo(new StubBundle(), "testClassName"));
+    }
+
+    @Test
+    public void compareSameId() {
+        StubServiceReference<Object> r1 = new StubServiceReference<Object>(0L, 0, new StubServiceRegistration<Object>(new StubBundleContext(new StubBundle())));
+        StubServiceReference<Object> r2 = new StubServiceReference<Object>(0L, 0, new StubServiceRegistration<Object>(new StubBundleContext(new StubBundle())));
+        assertTrue(0 == r1.compareTo(r2));
+        ServiceReference<?>[] array = new ServiceReference<?>[] { r2, r1 };
+        Arrays.sort(array);
+        assertSame(r2, array[0]);
+        assertSame(r1, array[1]);
+    }
+
+    @Test
+    public void compareDifferentRanking() {
+        StubServiceReference<Object> r1 = new StubServiceReference<Object>(0L, 0, new StubServiceRegistration<Object>(new StubBundleContext(new StubBundle())));
+        StubServiceReference<Object> r2 = new StubServiceReference<Object>(1L, 1, new StubServiceRegistration<Object>(new StubBundleContext(new StubBundle())));
+        assertTrue(0 > r1.compareTo(r2));
+        assertTrue(0 < r2.compareTo(r1));
+
+        ServiceReference<?>[] array = new ServiceReference[] { r2, r1 };
+        Arrays.sort(array);
+        assertSame(r1, array[0]);
+        assertSame(r2, array[1]);
+    }
+
+    @Test
+    public void compareDifferentId() {
+        StubServiceReference<Object> r1 = new StubServiceReference<Object>(0L, 0, new StubServiceRegistration<Object>(new StubBundleContext(new StubBundle())));
+        StubServiceReference<Object> r2 = new StubServiceReference<Object>(1L, 0, new StubServiceRegistration<Object>(new StubBundleContext(new StubBundle())));
+        assertTrue(0 > r1.compareTo(r2));
+        assertTrue(0 < r2.compareTo(r1));
+        ServiceReference<?>[] array = new ServiceReference[] { r2, r1 };
+        Arrays.sort(array);
+        assertSame(r1, array[0]);
+        assertSame(r2, array[1]);
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void compareNull() {
+        this.ref.compareTo(null);
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void compareNonServiceReference() {
+        this.ref.compareTo(new Object());
+    }
+
+    @Test
+    public void defaultProperties() {
+        assertNotNull(this.ref.getProperty(Constants.SERVICE_ID));
+        assertNotNull(this.ref.getProperty(Constants.SERVICE_RANKING));
+        assertNotNull(this.ref.getProperty(Constants.OBJECTCLASS));
+        assertEquals(3, this.ref.getPropertyKeys().length);
+    }
+
+    @Test
+    public void usingBundlesZero() {
+        assertNull(this.ref.getUsingBundles());
+    }
+
+    @Test
+    public void usingBundlesNonZero() {
+        this.ref.addUsingBundles(new StubBundle());
+        assertEquals(1, this.ref.getUsingBundles().length);
+    }
+
+    @Test
+    public void isAssignableToFalse() {
+        assertFalse(this.ref.isAssignableTo(new StubBundle(), "testClass"));
+    }
+
+    @Test
+    public void isAssignableToTrue() {
+        StubBundle bundle = new StubBundle();
+        this.ref.putAssignableTo(bundle, "testClass");
+        assertTrue(this.ref.isAssignableTo(bundle, "testClass"));
+    }
+
+    @Test
+    public void removeUsingBundles() {
+        assertNull(this.ref.getUsingBundles());
+        StubBundle b = new StubBundle();
+        this.ref.addUsingBundles(b);
+        assertEquals(1, this.ref.getUsingBundles().length);
+        this.ref.removeUsingBundles(b);
+        assertNull(this.ref.getUsingBundles());
+    }
+
+    @Test
+    public void testHashCode() {
+        StubServiceReference<Object> ref2 = new StubServiceReference<Object>(new StubServiceRegistration<Object>(new StubBundleContext(new StubBundle())));
+        assertFalse(31 == ref2.hashCode());
+    }
+
+    @Test
+    public void testEquals() {
+        assertTrue(this.ref.equals(this.ref));
+        assertFalse(this.ref.equals(null));
+        assertFalse(this.ref.equals(new Object()));
+
+        assertFalse(this.ref.equals(new StubServiceReference<Object>(new StubServiceRegistration<Object>(new StubBundleContext(new StubBundle())))));
+        assertTrue(this.ref.equals(new StubServiceReference<Object>(this.ref.getServiceRegistration())));
+    }
+
+    @Test
+    public void testToString() {
+        String toString = ref.toString();
+        assertContains("id", toString);
+        assertContains("ranking", toString);
+    }
+}
diff --git a/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/framework/StubServiceRegistrationTests.java b/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/framework/StubServiceRegistrationTests.java
new file mode 100644
index 0000000..56dd90d
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/framework/StubServiceRegistrationTests.java
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.stubs.framework;
+
+import static org.eclipse.virgo.test.stubs.AdditionalAsserts.assertContains;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+
+import java.util.Dictionary;
+import java.util.Hashtable;
+
+import org.junit.Test;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.ServiceEvent;
+import org.osgi.framework.ServiceListener;
+import org.osgi.framework.ServiceReference;
+
+public class StubServiceRegistrationTests {
+
+    private StubServiceRegistration<Object> reg = new StubServiceRegistration<Object>(new StubBundleContext(new StubBundle()));
+
+    @Test
+    public void initialState() {
+        assertNotNull(this.reg.getReference().getBundle());
+        assertEquals(3, this.reg.getProperties().size());
+        assertNotNull(this.reg.getReference());
+    }
+
+    @Test
+    public void getCustomReference() {
+        StubServiceReference<Object> ref = new StubServiceReference<Object>(1L, 1, reg);
+        this.reg.setServiceReference(ref);
+        assertSame(ref, this.reg.getReference());
+    }
+
+    @Test(expected = IllegalStateException.class)
+    public void getReferenceUnregistered() {
+        this.reg.unregister();
+        this.reg.getReference();
+    }
+
+    @Test
+    public void getCustomProperties() {
+        TestServiceListener listener = new TestServiceListener();
+        this.reg.getBundleContext().addServiceListener(listener);
+        Dictionary<String, String> testDictionary = new Hashtable<String, String>();
+        testDictionary.put("testKey", "testValue");
+        this.reg.setProperties(testDictionary);
+        assertNotNull(listener.getEvent());
+        assertEquals(ServiceEvent.MODIFIED, listener.getEvent().getType());
+        assertEquals(4, this.reg.getProperties().size());
+        assertEquals("testValue", this.reg.getProperties().get("testKey"));
+    }
+
+    @Test
+    public void setPropertiesNull() {
+        Dictionary<String, Object> initial = this.reg.getProperties();
+        this.reg.setProperties(null);
+        assertEquals(initial, this.reg.getProperties());
+    }
+
+    @Test
+    public void unregister() throws BundleException {
+        this.reg.getBundleContext().getContextBundle().start();
+        TestServiceListener listener = new TestServiceListener();
+        this.reg.getBundleContext().addServiceListener(listener);
+        ServiceReference<?> ref = this.reg.getReference();
+        this.reg.unregister();
+        assertNotNull(listener.getEvent());
+        assertEquals(ServiceEvent.UNREGISTERING, listener.getEvent().getType());
+        assertNull(ref.getBundle());
+    }
+
+    @Test(expected = IllegalStateException.class)
+    public void unregisterUnregistered() {
+        this.reg.unregister();
+        this.reg.unregister();
+    }
+
+    @Test
+    public void testToString() {
+        String toString = reg.toString();
+        assertContains("object classes", toString);
+        assertContains("unregistered", toString);
+        assertContains("properties", toString);
+    }
+
+    private static class TestServiceListener implements ServiceListener {
+
+        private ServiceEvent event = null;
+
+        public void serviceChanged(ServiceEvent event) {
+            this.event = event;
+        }
+
+        public ServiceEvent getEvent() {
+            return this.event;
+        }
+    }
+
+}
diff --git a/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/internal/AssertTests.java b/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/internal/AssertTests.java
new file mode 100644
index 0000000..fc2f00b
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/internal/AssertTests.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.stubs.internal;
+
+import org.junit.Test;
+
+import org.eclipse.virgo.test.stubs.internal.Assert;
+
+public class AssertTests {
+
+    @Test(expected = IllegalArgumentException.class)
+    public void assertNull() {
+        Assert.assertNotNull(null, "testArgument");
+    }
+
+    @Test
+    public void assertNotNull() {
+        Assert.assertNotNull(new Object(), "testArgument");
+    }
+}
diff --git a/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/region/StubRegionDigraphTests.java b/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/region/StubRegionDigraphTests.java
new file mode 100644
index 0000000..27e9817
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/region/StubRegionDigraphTests.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2012 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.virgo.test.stubs.region;
+
+import org.eclipse.equinox.region.Region;
+import org.junit.Test;
+import org.osgi.framework.BundleException;
+
+import static org.junit.Assert.assertEquals;
+
+
+public class StubRegionDigraphTests {
+
+	private StubRegionDigraph stubRegionDigraph;
+	
+	@Test
+	public void testRegionDigraaph() throws BundleException{
+		this.stubRegionDigraph = new StubRegionDigraph();
+		Region createRegion = this.stubRegionDigraph.createRegion("testRegion");
+		assertEquals(createRegion.getName(), "testRegion");
+		assertEquals(this.stubRegionDigraph, createRegion.getRegionDigraph());
+	}
+	
+	@Test
+	public void testGetRemoveRegion() throws BundleException {
+		this.stubRegionDigraph = new StubRegionDigraph();
+		this.stubRegionDigraph.createRegion("testRegion");
+		assertEquals(1, this.stubRegionDigraph.getRegions().size());
+		this.stubRegionDigraph.removeRegion(this.stubRegionDigraph.getRegion("testRegion"));
+		assertEquals(0, this.stubRegionDigraph.getRegions().size());
+	}
+	
+}
diff --git a/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/region/StubRegionTests.java b/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/region/StubRegionTests.java
new file mode 100644
index 0000000..36af522
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/region/StubRegionTests.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2012 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+package org.eclipse.virgo.test.stubs.region;
+
+import static org.junit.Assert.assertEquals;
+
+import org.eclipse.equinox.region.Region;
+import org.junit.Test;
+
+public class StubRegionTests {
+
+	private StubRegionDigraph stubRegionDigraph = new StubRegionDigraph();
+	
+	@Test
+	public void testRegion(){
+		Region region = new StubRegion("testRegion", this.stubRegionDigraph);
+		assertEquals("testRegion", region.getName());
+	}
+}
diff --git a/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/service/cm/StubConfigurationAdminTests.java b/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/service/cm/StubConfigurationAdminTests.java
new file mode 100644
index 0000000..b7d920d
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/service/cm/StubConfigurationAdminTests.java
@@ -0,0 +1,124 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.stubs.service.cm;
+
+import static org.eclipse.virgo.test.stubs.AdditionalAsserts.assertContains;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+import java.io.IOException;
+import java.util.Hashtable;
+
+import org.junit.Test;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.service.cm.Configuration;
+
+public class StubConfigurationAdminTests {
+
+    private final StubConfigurationAdmin configAdmin = new StubConfigurationAdmin();
+
+    @Test(expected = IllegalArgumentException.class)
+    public void createFactoryConfigNullInput() throws IOException {
+        configAdmin.createFactoryConfiguration(null);
+    }
+
+    @Test
+    public void createFactoryConfig() throws IOException {
+        Configuration config = configAdmin.createFactoryConfiguration("test");
+        assertNull(config.getBundleLocation());
+        assertNull(config.getProperties());
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void createFactoryConfigWithLocationNullInput() throws IOException {
+        configAdmin.createFactoryConfiguration(null, null);
+    }
+
+    @Test
+    public void createFactoryConfigWithLocation() throws IOException {
+        Configuration config = configAdmin.createFactoryConfiguration("test", null);
+        assertNull(config.getBundleLocation());
+        assertNull(config.getProperties());
+
+        Configuration config1 = configAdmin.createFactoryConfiguration("test", "test");
+        assertEquals("test", config1.getBundleLocation());
+        assertNull(config1.getProperties());
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void getConfigNullInput() throws IOException {
+        configAdmin.getConfiguration(null);
+    }
+
+    @Test
+    public void getConfig() throws IOException {
+        Configuration config = configAdmin.getConfiguration("test");
+        assertNull(config.getBundleLocation());
+        assertNull(config.getProperties());
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void getConfigWithLocationNullInput() throws IOException {
+        configAdmin.getConfiguration(null, null);
+    }
+
+    @Test
+    public void getConfigWithLocationExists() throws IOException {
+        Configuration config = configAdmin.getConfiguration("test", null);
+        config.update(new Hashtable<String, Object>());
+
+        Configuration config1 = configAdmin.getConfiguration("test", null);
+        assertNotNull(config1.getProperties());
+    }
+
+    @Test
+    public void getConfigWithLocationDoesNotExist() throws IOException {
+        Configuration config = configAdmin.getConfiguration("test", null);
+        assertNull(config.getBundleLocation());
+        assertNull(config.getProperties());
+
+        Configuration config1 = configAdmin.getConfiguration("test1", "test");
+        assertEquals("test", config1.getBundleLocation());
+        assertNull(config1.getProperties());
+    }
+
+    @Test
+    public void listConfigurationsNullFilter() throws IOException, InvalidSyntaxException {
+        configAdmin.createConfiguration("test1").addProperty("key1", "value1");
+        configAdmin.createConfiguration("test2");
+        assertEquals(1, configAdmin.listConfigurations(null).length);
+    }
+
+    @Test
+    public void listConfigurationsNoMatches() throws IOException, InvalidSyntaxException {
+        assertNull(configAdmin.listConfigurations(null));
+    }
+
+    @Test
+    public void listConfigurations() throws IOException, InvalidSyntaxException {
+        configAdmin.createConfiguration("test1").addProperty("key", "value");
+        configAdmin.createConfiguration("test2");
+        assertEquals(1, configAdmin.listConfigurations("(key=value)").length);
+    }
+
+    @Test
+    public void testToString() {
+        StubConfigurationAdmin configAdmin1 = new StubConfigurationAdmin("test", new StubConfiguration("test"));
+        String toString = configAdmin1.toString();
+        assertContains("configurations", toString);
+        assertContains("pid", toString);
+        assertContains("factoryPid", toString);
+        assertContains("deleted", toString);
+
+    }
+}
diff --git a/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/service/cm/StubConfigurationTests.java b/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/service/cm/StubConfigurationTests.java
new file mode 100644
index 0000000..0dcd2d1
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/service/cm/StubConfigurationTests.java
@@ -0,0 +1,218 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.stubs.service.cm;
+
+import static org.eclipse.virgo.test.stubs.AdditionalAsserts.assertContains;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.util.Dictionary;
+import java.util.Hashtable;
+
+import org.junit.Test;
+import org.osgi.framework.Constants;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+
+public class StubConfigurationTests {
+
+    private final StubConfiguration config = new StubConfiguration("test");
+
+    @Test
+    public void delete() throws IOException {
+        config.delete();
+        assertTrue(config.getDeleted());
+        StubConfiguration config1 = new StubConfiguration(null, "test");
+        config1.delete();
+        assertTrue(config1.getDeleted());
+    }
+
+    @Test(expected = IllegalStateException.class)
+    public void deleteAfterDelete() throws IOException {
+        config.delete();
+        config.delete();
+    }
+
+    @Test
+    public void bundleLocation() {
+        assertNull(this.config.getBundleLocation());
+        this.config.setBundleLocation("test");
+        assertEquals("test", this.config.getBundleLocation());
+        this.config.setBundleLocation(null);
+        assertNull(this.config.getBundleLocation());
+    }
+
+    @Test(expected = IllegalStateException.class)
+    public void getBundleLocationAfterDelete() throws IOException {
+        this.config.delete();
+        this.config.getBundleLocation();
+    }
+
+    @Test(expected = IllegalStateException.class)
+    public void setBundleLocationAfterDelete() throws IOException {
+        this.config.delete();
+        this.config.setBundleLocation("test");
+    }
+
+    @Test
+    public void factoryPidNull() {
+        assertNull(this.config.getFactoryPid());
+    }
+
+    @Test
+    public void factoryPid() {
+        Configuration config1 = new StubConfiguration(null, "test");
+        assertEquals("test", config1.getFactoryPid());
+    }
+
+    @Test(expected = IllegalStateException.class)
+    public void getFactoryPidAfterDelete() throws IOException {
+        this.config.delete();
+        this.config.getFactoryPid();
+    }
+
+    @Test
+    public void pid() {
+        assertEquals("test", this.config.getPid());
+    }
+
+    @Test
+    public void pidNull() {
+        Configuration config1 = new StubConfiguration(null, "test");
+        assertNull(config1.getPid());
+    }
+
+    @Test(expected = IllegalStateException.class)
+    public void getPidAfterDelete() throws IOException {
+        this.config.delete();
+        this.config.getPid();
+    }
+
+    @Test
+    public void addProperty() throws IOException {
+        this.config.update(new Hashtable<String, String>());
+        this.config.addProperty("test1", "test2");
+        assertEquals(2, this.config.getProperties().size());
+        assertEquals("test2", this.config.getProperties().get("test1"));
+    }
+
+    @Test
+    public void addPropertyNull() {
+        this.config.addProperty("test1", "test2");
+        assertEquals(2, this.config.getProperties().size());
+        assertEquals("test2", this.config.getProperties().get("test1"));
+    }
+
+    @Test
+    public void getProperties() throws IOException {
+        this.config.update(new Hashtable<String, String>());
+
+        Dictionary<String, Object> properties1 = this.config.getProperties();
+        Dictionary<String, Object> properties2 = this.config.getProperties();
+        assertNotSame(properties1, properties2);
+        properties2.put("test3", "test4");
+        assertFalse(properties2.equals(this.config.getProperties()));
+        assertNull(this.config.getProperties().get(ConfigurationAdmin.SERVICE_BUNDLELOCATION));
+    }
+
+    @Test
+    public void getPropertiesNull() {
+        assertNull(this.config.getProperties());
+    }
+
+    @Test(expected = IllegalStateException.class)
+    public void getPropertiesAfterDeleted() throws IOException {
+        this.config.delete();
+        this.config.getProperties();
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void updateNull() throws IOException {
+        this.config.update(null);
+    }
+
+    @Test
+    public void updateAddProperties() throws IOException {
+        assertNull(this.config.getProperties());
+        this.config.update(new Hashtable<String, Object>());
+        assertEquals(1, this.config.getProperties().size());
+        assertEquals("test", this.config.getProperties().get(Constants.SERVICE_PID));
+
+        Configuration config1 = new StubConfiguration("test1", "test2");
+        config1.update(new Hashtable<String, Object>());
+        assertEquals(2, config1.getProperties().size());
+        assertEquals("test1", config1.getProperties().get(Constants.SERVICE_PID));
+        assertEquals("test2", config1.getProperties().get(ConfigurationAdmin.SERVICE_FACTORYPID));
+    }
+
+    @Test
+    public void updateOverwriteProperties() throws IOException {
+        assertNull(this.config.getProperties());
+
+        Hashtable<String, String> properties = new Hashtable<>();
+        properties.put(Constants.SERVICE_PID, "test2");
+        properties.put(ConfigurationAdmin.SERVICE_FACTORYPID, "test3");
+
+        this.config.update(properties);
+        assertEquals(1, this.config.getProperties().size());
+        assertEquals("test", this.config.getProperties().get(Constants.SERVICE_PID));
+
+        Configuration config1 = new StubConfiguration("test1", "test2");
+        config1.update(properties);
+        assertEquals(2, config1.getProperties().size());
+        assertEquals("test1", config1.getProperties().get(Constants.SERVICE_PID));
+        assertEquals("test2", config1.getProperties().get(ConfigurationAdmin.SERVICE_FACTORYPID));
+    }
+
+    @Test(expected = IllegalStateException.class)
+    public void updatePropertiesAfterDelete() throws IOException {
+        this.config.delete();
+        this.config.update(new Hashtable<String, Object>());
+    }
+
+    @Test
+    public void update() throws IOException {
+        this.config.update();
+    }
+
+    @Test(expected = IllegalStateException.class)
+    public void updateAfterDelete() throws IOException {
+        this.config.delete();
+        this.config.update();
+    }
+
+    @Test
+    public void testEquals() {
+        assertTrue(this.config.equals(this.config));
+        assertFalse(this.config.equals(null));
+        assertFalse(this.config.equals(new Object()));
+        assertTrue(this.config.equals(new StubConfiguration("test")));
+        assertFalse(this.config.equals(new StubConfiguration("test2")));
+    }
+
+    @Test
+    public void testHashCode() {
+        assertEquals("test".hashCode(), this.config.hashCode());
+    }
+
+    @Test
+    public void testToString() {
+        String toString = config.toString();
+        assertContains("pid", toString);
+        assertContains("factoryPid", toString);
+        assertContains("deleted", toString);
+    }
+}
diff --git a/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/service/component/StubComponentContextTests.java b/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/service/component/StubComponentContextTests.java
new file mode 100755
index 0000000..12394c0
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/service/component/StubComponentContextTests.java
@@ -0,0 +1,106 @@
+/*******************************************************************************

+ * Copyright (c) 2008, 2010 SAP AG

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ *

+ * Contributors:

+ *   SAP AG - initial contribution

+ *******************************************************************************/

+

+package org.eclipse.virgo.test.stubs.service.component;

+

+import static org.junit.Assert.assertEquals;

+import static org.junit.Assert.assertNotNull;

+import static org.junit.Assert.assertTrue;

+

+import org.junit.Test;

+import org.osgi.framework.Bundle;

+import org.osgi.framework.ServiceReference;

+

+import org.eclipse.virgo.test.stubs.framework.StubBundleContext;

+

+public class StubComponentContextTests {

+

+    private StubBundleContext bundleContext = new StubBundleContext();

+

+    private StubComponentContext componentContext = new StubComponentContext(this.bundleContext);

+

+    @Test

+    public void getProperties() {

+        assertNotNull(this.componentContext.getProperties());

+        assertTrue(0 != this.componentContext.getProperties().size());

+    }

+

+    @Test(expected = UnsupportedOperationException.class)

+    public void locateServiceWithName() {

+        this.componentContext.locateService("testName");

+    }

+

+    @Test(expected = UnsupportedOperationException.class)

+    public void locateServiceWithNameAndServiceReference() {

+        this.componentContext.locateService("testName", new ServiceReference<Object>() {

+

+            public int compareTo(Object reference) {

+                throw new UnsupportedOperationException();

+            }

+

+            public Bundle getBundle() {

+                throw new UnsupportedOperationException();

+            }

+

+            public Object getProperty(String key) {

+                return null;

+            }

+

+            public String[] getPropertyKeys() {

+                throw new UnsupportedOperationException();

+            }

+

+            public Bundle[] getUsingBundles() {

+                throw new UnsupportedOperationException();

+            }

+

+            public boolean isAssignableTo(Bundle bundle, String className) {

+                throw new UnsupportedOperationException();

+            }

+        });

+    }

+

+    @Test(expected = UnsupportedOperationException.class)

+    public void locateServices() {

+        this.componentContext.locateServices("testName");

+    }

+

+    @Test

+    public void getBundleContext() {

+        assertEquals(this.bundleContext, this.componentContext.getBundleContext());

+    }

+

+    @Test(expected = UnsupportedOperationException.class)

+    public void getUsingBundle() {

+        this.componentContext.getUsingBundle();

+    }

+

+    @Test(expected = UnsupportedOperationException.class)

+    public void getComponentInstance() {

+        this.componentContext.getComponentInstance();

+    }

+

+    @Test

+    public void enableComponent() {

+        this.componentContext.enableComponent("testName");

+    }

+

+    @Test

+    public void disableComponent() {

+        this.componentContext.disableComponent("testName");

+    }

+

+    @Test(expected = UnsupportedOperationException.class)

+    public void getServiceReference() {

+        this.componentContext.getServiceReference();

+    }

+

+}

diff --git a/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/service/event/StubEventAdminTests.java b/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/service/event/StubEventAdminTests.java
new file mode 100644
index 0000000..9b084fd
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/service/event/StubEventAdminTests.java
@@ -0,0 +1,326 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.stubs.service.event;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.lang.Thread.State;
+import java.lang.management.ManagementFactory;
+import java.lang.management.ThreadInfo;
+import java.lang.management.ThreadMXBean;
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.Map;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import org.junit.Test;
+import org.osgi.service.event.Event;
+
+
+public class StubEventAdminTests {
+
+    private final StubEventAdmin eventAdmin = new StubEventAdmin();
+    
+    private final Dictionary<String, ?> properties = createProperties();
+    
+    private final Dictionary<String, ?> expectedProperties = createProperties();
+    
+    private Dictionary<String, ?> createProperties() {
+        Dictionary<String, Object> properties = new Hashtable<String, Object>();
+        
+        properties.put("booleanArray", new boolean[] {false, true});
+        properties.put("byteArray", new byte[] {1, 2});
+        properties.put("charArray", new char[] {'a', 'b'});
+        properties.put("doubleArray", new double[] {1.0d});
+        properties.put("floatArray", new float[] {2.45f});
+        properties.put("intArray", new int[] {1, 2, 3});
+        properties.put("longArray", new long[] {1L, 2L});
+        properties.put("shortArray", new short[] {5, 9, 18});
+        
+        return properties;
+    }
+
+    @Test
+    public void postEvent() {
+        Event posted = new Event("topic", this.properties);
+        Event expected = new Event("topic", this.expectedProperties);
+
+        this.eventAdmin.postEvent(posted);
+        assertTrue(this.eventAdmin.awaitPostingOfEvent(expected, 1000));
+    }
+
+    @Test
+    public void sendEvent() {
+        Event sent = new Event("topic", this.properties);
+        Event expected = new Event("topic", this.expectedProperties);
+
+        this.eventAdmin.sendEvent(sent);
+        assertTrue(this.eventAdmin.awaitSendingOfEvent(expected, 1000));
+    }
+
+    @Test
+    public void awaitSendingTimeout() {
+        Event expected = new Event("topic", this.expectedProperties);
+        
+        this.eventAdmin.sendEvent(new Event("differentTopic", (Map<String,?>)null));
+        this.eventAdmin.postEvent(expected);
+        
+        long start = System.currentTimeMillis();
+        assertFalse(this.eventAdmin.awaitSendingOfEvent(expected, 500));
+        long delta = System.currentTimeMillis() - start;
+        assertTrue("Delta of " + delta + " was less than expected", delta >= 500);
+    }
+
+    @Test
+    public void awaitPostingTimeout() {
+        Event expected = new Event("topic", this.expectedProperties);
+        
+        this.eventAdmin.postEvent(new Event("differentTopic", (Map<String,?>)null));
+        this.eventAdmin.sendEvent(expected);
+        
+        long start = System.currentTimeMillis();
+        assertFalse(this.eventAdmin.awaitPostingOfEvent(expected, 500));
+        long delta = System.currentTimeMillis() - start;
+        assertTrue("Delta of " + delta + " was less than expected", delta >= 500);
+    }
+
+    @Test
+    public void postingOfEventWhileWaiting() throws InterruptedException {
+        Event posted = new Event("topic", this.properties);
+        final Event expected = new Event("topic", this.expectedProperties);
+
+        final CountDownLatch latch = new CountDownLatch(1);
+
+        Thread awaitingThread = new Thread(new Runnable() {
+
+            public void run() {
+                if (eventAdmin.awaitPostingOfEvent(expected, 10000)) {
+                    latch.countDown();
+                }
+            }
+        });
+
+        awaitingThread.start();
+
+        this.eventAdmin.postEvent(posted);
+
+        assertTrue(latch.await(30, TimeUnit.SECONDS));
+    }
+
+    @Test
+    public void sendingOfEventWhileWaiting() throws InterruptedException {
+        Event posted = new Event("topic", this.properties);
+        final Event expected = new Event("topic", this.expectedProperties);
+
+        final CountDownLatch latch = new CountDownLatch(1);
+
+        Thread awaitingThread = new Thread(new Runnable() {
+
+            public void run() {
+                if (eventAdmin.awaitSendingOfEvent(expected, 10000)) {
+                    latch.countDown();
+                }
+            }
+        });
+
+        awaitingThread.start();
+
+        this.eventAdmin.sendEvent(posted);
+
+        assertTrue(latch.await(30, TimeUnit.SECONDS));
+    }
+
+    @Test
+    public void removalOfPostedEventWhenSuccessfullyAwaited() {
+        Event posted = new Event("topic", this.properties);
+        Event expected = new Event("topic", this.expectedProperties);
+
+        this.eventAdmin.postEvent(posted);
+        assertTrue(this.eventAdmin.awaitPostingOfEvent(expected, 1000));
+        assertFalse(this.eventAdmin.awaitPostingOfEvent(expected, 1));
+    }
+
+    @Test
+    public void removalOfSentEventWhenSuccessfullyAwaited() {
+        Event sent = new Event("topic", this.properties);
+        Event expected = new Event("topic", this.expectedProperties);
+
+        this.eventAdmin.sendEvent(sent);
+        assertTrue(this.eventAdmin.awaitSendingOfEvent(expected, 1000));
+        assertFalse(this.eventAdmin.awaitSendingOfEvent(expected, 1));
+    }
+
+    @Test(timeout = 30000)
+    public void awaitingThreadsCanBeInterrupted() throws InterruptedException {
+        final Event expected = new Event("topic", this.expectedProperties);
+
+        final CountDownLatch latch = new CountDownLatch(1);
+
+        Thread awaitingThread = new Thread(new Runnable() {
+
+            public void run() {
+                eventAdmin.awaitSendingOfEvent(expected, Long.MAX_VALUE);
+                latch.countDown();
+            }
+        });
+
+        awaitingThread.start();
+
+        ThreadMXBean threadBean = ManagementFactory.getThreadMXBean();
+
+        ThreadInfo threadInfo = null;
+
+        while ((threadInfo = threadBean.getThreadInfo(awaitingThread.getId())) == null || threadInfo.getThreadState() != State.TIMED_WAITING) {
+            Thread.sleep(10);
+        }
+
+        awaitingThread.interrupt();
+
+        latch.await();
+    }
+    
+    @Test
+    public void postEventMatchingOnTopic() {
+        Event posted = new Event("topic", this.properties);
+
+        this.eventAdmin.postEvent(posted);
+        assertNotNull(this.eventAdmin.awaitPostingOfEvent("topic", 1000));
+    }
+
+    @Test
+    public void sendEventMatchingOnTopic() {
+        Event sent = new Event("topic", this.properties);
+
+        this.eventAdmin.sendEvent(sent);
+        assertNotNull(this.eventAdmin.awaitSendingOfEvent("topic", 1000));
+    }
+
+    @Test
+    public void awaitSendingTimeoutMatchingOnTopic() {
+        Event expected = new Event("topic", this.expectedProperties);
+        
+        this.eventAdmin.sendEvent(new Event("differentTopic", (Map<String,?>)null));
+        this.eventAdmin.postEvent(expected);
+        
+        long start = System.currentTimeMillis();
+        assertNull(this.eventAdmin.awaitSendingOfEvent("topic", 500));
+        long delta = System.currentTimeMillis() - start;
+        assertTrue("Delta of " + delta + " was less than expected", delta >= 500);
+    }
+
+    @Test
+    public void awaitPostingTimeoutMatchingOnTopic() {
+        Event expected = new Event("topic", this.expectedProperties);
+        
+        this.eventAdmin.postEvent(new Event("differentTopic", (Map<String,?>)null));
+        this.eventAdmin.sendEvent(expected);
+        
+        long start = System.currentTimeMillis();
+        assertNull(this.eventAdmin.awaitPostingOfEvent("topic", 500));
+        long delta = System.currentTimeMillis() - start;
+        assertTrue("Delta of " + delta + " was less than expected", delta >= 500);
+    }
+
+    @Test
+    public void postingOfEventWhileWaitingMatchingOnTopic() throws InterruptedException {
+        Event posted = new Event("topic", this.properties);
+
+        final CountDownLatch latch = new CountDownLatch(1);
+
+        Thread awaitingThread = new Thread(new Runnable() {
+
+            public void run() {
+                if (eventAdmin.awaitPostingOfEvent("topic", 10000) != null) {
+                    latch.countDown();
+                }
+            }
+        });
+
+        awaitingThread.start();
+
+        this.eventAdmin.postEvent(posted);
+
+        assertTrue(latch.await(30, TimeUnit.SECONDS));
+    }
+
+    @Test
+    public void sendingOfEventWhileWaitingMatchingOnTopic() throws InterruptedException {
+        Event posted = new Event("topic", this.properties);
+
+        final CountDownLatch latch = new CountDownLatch(1);
+
+        Thread awaitingThread = new Thread(new Runnable() {
+
+            public void run() {
+                if (eventAdmin.awaitSendingOfEvent("topic", 10000) != null) {
+                    latch.countDown();
+                }
+            }
+        });
+
+        awaitingThread.start();
+
+        this.eventAdmin.sendEvent(posted);
+
+        assertTrue(latch.await(30, TimeUnit.SECONDS));
+    }
+
+    @Test
+    public void removalOfPostedEventWhenSuccessfullyAwaitedMatchingOnTopic() {
+        Event posted = new Event("topic", this.properties);
+
+        this.eventAdmin.postEvent(posted);
+        assertNotNull(this.eventAdmin.awaitPostingOfEvent("topic", 1000));
+        assertNull(this.eventAdmin.awaitPostingOfEvent("topic", 1));
+    }
+
+    @Test
+    public void removalOfSentEventWhenSuccessfullyAwaitedMatchingOnTopic() {
+        Event sent = new Event("topic", this.properties);
+
+        this.eventAdmin.sendEvent(sent);
+        assertNotNull(this.eventAdmin.awaitSendingOfEvent("topic", 1000));
+        assertNull(this.eventAdmin.awaitSendingOfEvent("topic", 1));
+    }
+
+    @Test(timeout = 30000)
+    public void awaitingThreadsCanBeInterruptedWhenMatchingOnTopic() throws InterruptedException {        
+
+        final CountDownLatch latch = new CountDownLatch(1);
+
+        Thread awaitingThread = new Thread(new Runnable() {
+
+            public void run() {
+                eventAdmin.awaitSendingOfEvent("topic", Long.MAX_VALUE);
+                latch.countDown();
+            }
+        });
+
+        awaitingThread.start();
+
+        ThreadMXBean threadBean = ManagementFactory.getThreadMXBean();
+
+        ThreadInfo threadInfo = null;
+
+        while ((threadInfo = threadBean.getThreadInfo(awaitingThread.getId())) == null || threadInfo.getThreadState() != State.TIMED_WAITING) {
+            Thread.sleep(10);
+        }
+
+        awaitingThread.interrupt();
+
+        latch.await();
+    }
+}
diff --git a/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/service/event/internal/EventUtilsTests.java b/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/service/event/internal/EventUtilsTests.java
new file mode 100644
index 0000000..6842a88
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/service/event/internal/EventUtilsTests.java
@@ -0,0 +1,169 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.stubs.service.event.internal;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.Map;
+
+import org.junit.Test;
+import org.osgi.service.event.Event;
+
+/**
+ */
+public class EventUtilsTests {
+    
+    @Test
+    public void equalObjectArrays() {
+        assertTrue(EventUtils.arraysAreEqual(new Object[] {new Integer(5), Boolean.FALSE, "apple"}, new Object[] {new Integer(5), Boolean.FALSE, "apple"}));
+    }
+    
+    @Test
+    public void unequalObjectArrays() {
+        assertFalse(EventUtils.arraysAreEqual(new Object[] {new Integer(5), Boolean.FALSE, "apple"}, new Object[] {new Integer(578), Boolean.FALSE, "orange"}));
+    }
+    
+    @Test
+    public void equalBooleanArrays() {
+        assertTrue(EventUtils.arraysAreEqual(new boolean[] {false, true}, new boolean[] {false, true}));
+    }
+    
+    @Test
+    public void unequalBooleanArrays() {
+        assertFalse(EventUtils.arraysAreEqual(new boolean[] {false, true}, new boolean[] {true, true}));
+    }
+
+    @Test
+    public void equalByteArrays() {
+        assertTrue(EventUtils.arraysAreEqual(new byte[] {1, 2, 3}, new byte[] {1, 2, 3}));
+    }
+    
+    @Test
+    public void unequalByteArrays() {
+        assertFalse(EventUtils.arraysAreEqual(new byte[] {1, 2, 3}, new byte[] {1, 3}));
+    }
+    
+    @Test
+    public void equalCharArrays() {
+        assertTrue(EventUtils.arraysAreEqual(new char[] {'a', '1'}, new char[] {'a', '1'}));
+    }
+    
+    @Test
+    public void unequalCharArrays() {
+        assertFalse(EventUtils.arraysAreEqual(new char[] {'a', '1'}, new char[] {'a'}));
+    }
+    
+    @Test
+    public void equalDoubleArrays() {
+        assertTrue(EventUtils.arraysAreEqual(new double[] {1.0d, 3.45673d}, new double[] {1.0d, 3.45673d}));
+    }
+    
+    @Test
+    public void unequalDoubleArrays() {
+        assertFalse(EventUtils.arraysAreEqual(new double[] {1.0d, 3.45673d}, new double[] {1.0d, 30.45673d}));
+    }
+    
+    @Test
+    public void equalFloatArrays() {
+        assertTrue(EventUtils.arraysAreEqual(new float[] {1.0f, 3.45673f}, new float[] {1.0f, 3.45673f}));
+    }
+    
+    @Test
+    public void unequalFloatArrays() {
+        assertFalse(EventUtils.arraysAreEqual(new float[] {1.0f, 3.45673f}, new float[] {1.0f, 0.45673f}));
+    }
+    
+    @Test
+    public void equalIntArrays() {
+        assertTrue(EventUtils.arraysAreEqual(new int[] {-5, 0, 93}, new int[] {-5, 0, 93}));
+    }
+    
+    @Test
+    public void unequalIntArrays() {
+        assertFalse(EventUtils.arraysAreEqual(new int[] {-5, 0, 93}, new int[] {-5, 0, 9356}));
+    }
+    
+    @Test
+    public void equalLongArrays() {
+        assertTrue(EventUtils.arraysAreEqual(new long[] {-5, 0, 93}, new long[] {-5, 0, 93}));
+    }
+    
+    @Test
+    public void unequalLongArrays() {
+        assertFalse(EventUtils.arraysAreEqual(new long[] {-5, 0, 93}, new long[] {-5, 0, 9356}));
+    }
+    
+    @Test
+    public void equalShortArrays() {
+        assertTrue(EventUtils.arraysAreEqual(new short[] {-5, 0, 93}, new short[] {-5, 0, 93}));
+    }
+    
+    @Test
+    public void unequalShortArrays() {
+        assertFalse(EventUtils.arraysAreEqual(new short[] {-5, 0, 93}, new short[] {-5, 0, 9356}));
+    }
+    
+    @Test
+    public void eventsWithDifferentTopicsAreNotEqual() {
+        assertFalse(EventUtils.eventsAreEqual(new Event("foo", (Map<String, ?>)null), new Event("bar", (Map<String, ?>)null)));
+    }
+    
+    @Test
+    public void eventsWithMatchingTopicsAndNoPropertiesAreEqual() {
+        assertTrue(EventUtils.eventsAreEqual(new Event("foo", (Map<String, ?>)null), new Event("foo", (Map<String, ?>)null)));
+    }
+    
+    @Test
+    public void eventsWithMatchingTopicsAndMatchingPropertiesAreEqual() {
+        assertTrue(EventUtils.eventsAreEqual(new Event("foo", createProperties()), new Event("foo", createProperties())));
+    }
+    
+    @Test
+    public void eventsWithMatchingTopicsAndDifferentNumberOfPropertiesAreNotEqual() {
+        Dictionary<String, ?> properties = createProperties();
+        properties.remove("byteArray");
+        
+        assertFalse(EventUtils.eventsAreEqual(new Event("foo", createProperties()), new Event("foo", properties)));
+    }
+    
+    @Test
+    public void eventsWithMatchingTopicsAndDifferentPropertiesAreNotEqual() {
+        Dictionary<String, Object> properties = createProperties();
+        properties.put("byteArray", new byte[] {6});
+        
+        assertFalse(EventUtils.eventsAreEqual(new Event("foo", createProperties()), new Event("foo", properties)));
+        
+        properties = createProperties();
+        properties.put("object", "bravo");
+        
+        assertFalse(EventUtils.eventsAreEqual(new Event("foo", createProperties()), new Event("foo", properties)));
+    }
+    
+    private Dictionary<String, Object> createProperties() {
+        Dictionary<String, Object> properties = new Hashtable<String, Object>();
+        
+        properties.put("object", "alpha");
+        properties.put("booleanArray", new boolean[] {false, true});
+        properties.put("byteArray", new byte[] {1, 2});
+        properties.put("charArray", new char[] {'a', 'b'});
+        properties.put("doubleArray", new double[] {1.0d});
+        properties.put("floatArray", new float[] {2.45f});
+        properties.put("intArray", new int[] {1, 2, 3});
+        properties.put("longArray", new long[] {1L, 2L});
+        properties.put("shortArray", new short[] {5, 9, 18});
+        
+        return properties;
+    }
+}
diff --git a/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/support/FalseFilterTests.java b/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/support/FalseFilterTests.java
new file mode 100644
index 0000000..4cde55e
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/support/FalseFilterTests.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.stubs.support;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+import java.util.Dictionary;
+import java.util.Map;
+
+import org.junit.Test;
+import org.osgi.framework.ServiceReference;
+
+import org.eclipse.virgo.test.stubs.support.FalseFilter;
+
+public class FalseFilterTests {
+
+    private final FalseFilter filter = new FalseFilter();
+
+    @Test
+    public void match() {
+        assertFalse(filter.match((Dictionary<String, ?>) null));
+        assertFalse(filter.match((ServiceReference<?>) null));
+        assertFalse(filter.matchCase(null));
+        assertFalse(filter.matches((Map<String, ?>) null));
+    }
+
+    @Test
+    public void testToString() {
+        assertEquals("", new FalseFilter().getFilterString());
+        assertEquals("testFilterString", new FalseFilter("testFilterString").toString());
+    }
+    
+    @Test
+    public void hashCodeEqualsToStringsHashCode() {
+        FalseFilter falseFilter = new FalseFilter("testFilterString");
+        assertEquals(falseFilter.hashCode(), falseFilter.toString().hashCode());
+    }
+}
diff --git a/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/support/ObjectClassFilterTests.java b/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/support/ObjectClassFilterTests.java
new file mode 100644
index 0000000..a18c9db
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/support/ObjectClassFilterTests.java
@@ -0,0 +1,143 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.stubs.support;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Dictionary;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.Map;
+
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceReference;
+
+public class ObjectClassFilterTests {
+
+    private final ObjectClassFilter classFilter = new ObjectClassFilter(Object.class);
+
+    private final ObjectClassFilter classNameFilter = new ObjectClassFilter(Object.class.getName());
+
+    @Test
+    public void matchServiceReference() {
+        ServiceReference<Object> objectServiceReference = new ServiceReference<Object>() {
+
+            public int compareTo(Object reference) {
+                throw new UnsupportedOperationException();
+            }
+
+            public Bundle getBundle() {
+                throw new UnsupportedOperationException();
+            }
+
+            public Object getProperty(String key) {
+                return new String[] { Object.class.getName() };
+            }
+
+            public String[] getPropertyKeys() {
+                throw new UnsupportedOperationException();
+            }
+
+            public Bundle[] getUsingBundles() {
+                throw new UnsupportedOperationException();
+            }
+
+            public boolean isAssignableTo(Bundle bundle, String className) {
+                throw new UnsupportedOperationException();
+            }
+        };
+
+        assertTrue(this.classFilter.match(objectServiceReference));
+        assertTrue(this.classNameFilter.match(objectServiceReference));
+
+        ServiceReference<Object> exceptionServiceReference = new ServiceReference<Object>() {
+
+            public int compareTo(Object reference) {
+                throw new UnsupportedOperationException();
+            }
+
+            public Bundle getBundle() {
+                throw new UnsupportedOperationException();
+            }
+
+            public Object getProperty(String key) {
+                return new String[] { Exception.class.getName() };
+            }
+
+            public String[] getPropertyKeys() {
+                throw new UnsupportedOperationException();
+            }
+
+            public Bundle[] getUsingBundles() {
+                throw new UnsupportedOperationException();
+            }
+
+            public boolean isAssignableTo(Bundle bundle, String className) {
+                throw new UnsupportedOperationException();
+            }
+        };
+
+        assertFalse(this.classFilter.match(exceptionServiceReference));
+        assertFalse(this.classNameFilter.match(exceptionServiceReference));
+    }
+
+    @Test
+    public void matches() {
+        Map<String, String[]> classNameMap = new HashMap<String, String[]>();
+        classNameMap.put(Constants.OBJECTCLASS, new String[] { Object.class.getName(), Object.class.getName() });
+
+        assertTrue(this.classFilter.matches(classNameMap));
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void matchesWithEmptyMap() {
+        this.classFilter.matches(new HashMap<String, Object>());
+    }
+
+    @Test
+    public void matchDictionaryTrue() {
+        Dictionary<String, Object> d1 = new Hashtable<>();
+        d1.put(Constants.OBJECTCLASS, new String[] { Object.class.getName() });
+        assertTrue(this.classFilter.match(d1));
+        assertTrue(this.classFilter.matchCase(d1));
+
+        assertTrue(this.classNameFilter.match(d1));
+        assertTrue(this.classNameFilter.matchCase(d1));
+    }
+
+    @Test
+    public void matchDictionaryFalse() {
+        Dictionary<String, Object> d1 = new Hashtable<>();
+        d1.put(Constants.OBJECTCLASS, new String[] { Exception.class.getName() });
+        assertFalse(this.classFilter.match(d1));
+        assertFalse(this.classFilter.matchCase(d1));
+
+        assertFalse(this.classNameFilter.match(d1));
+        assertFalse(this.classNameFilter.matchCase(d1));
+    }
+
+    @Test
+    public void testToString() {
+        assertEquals("(objectClass=java.lang.Object)", this.classFilter.toString());
+        assertEquals("(objectClass=java.lang.Object)", this.classNameFilter.toString());
+    }
+
+    @Test
+    public void hashCodeEqualsToStringsHashCode() {
+        assertEquals(this.classFilter.hashCode(), this.classFilter.toString().hashCode());
+        assertEquals(this.classFilter.hashCode(), this.classNameFilter.toString().hashCode());
+    }
+}
diff --git a/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/support/PropertiesFilterTests.java b/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/support/PropertiesFilterTests.java
new file mode 100644
index 0000000..3f8f471
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/support/PropertiesFilterTests.java
@@ -0,0 +1,234 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.stubs.support;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Dictionary;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.Map;
+import java.util.TreeMap;
+
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+
+public class PropertiesFilterTests {
+
+    @Test
+    public void matchServiceReference() {
+        Map<String, Object> properties = new HashMap<String, Object>();
+        properties.put("testKey", "testValue");
+        PropertiesFilter filter = new PropertiesFilter(properties);
+        assertFalse(filter.match(new ServiceReference<Object>() {
+
+            public int compareTo(Object reference) {
+                throw new UnsupportedOperationException();
+            }
+
+            public Bundle getBundle() {
+                throw new UnsupportedOperationException();
+            }
+
+            public Object getProperty(String key) {
+                return null;
+            }
+
+            public String[] getPropertyKeys() {
+                throw new UnsupportedOperationException();
+            }
+
+            public Bundle[] getUsingBundles() {
+                throw new UnsupportedOperationException();
+            }
+
+            public boolean isAssignableTo(Bundle bundle, String className) {
+                throw new UnsupportedOperationException();
+            }
+        }));
+
+        assertFalse(filter.match(new ServiceReference<Object>() {
+
+            public int compareTo(Object reference) {
+                throw new UnsupportedOperationException();
+            }
+
+            public Bundle getBundle() {
+                throw new UnsupportedOperationException();
+            }
+
+            public Object getProperty(String key) {
+                return "badValue";
+            }
+
+            public String[] getPropertyKeys() {
+                throw new UnsupportedOperationException();
+            }
+
+            public Bundle[] getUsingBundles() {
+                throw new UnsupportedOperationException();
+            }
+
+            public boolean isAssignableTo(Bundle bundle, String className) {
+                throw new UnsupportedOperationException();
+            }
+        }));
+
+        assertTrue(filter.match(new ServiceReference<Object>() {
+
+            public int compareTo(Object reference) {
+                throw new UnsupportedOperationException();
+            }
+
+            public Bundle getBundle() {
+                throw new UnsupportedOperationException();
+            }
+
+            public Object getProperty(String key) {
+                return "testValue";
+            }
+
+            public String[] getPropertyKeys() {
+                throw new UnsupportedOperationException();
+            }
+
+            public Bundle[] getUsingBundles() {
+                throw new UnsupportedOperationException();
+            }
+
+            public boolean isAssignableTo(Bundle bundle, String className) {
+                throw new UnsupportedOperationException();
+            }
+        }));
+    }
+
+    @Test
+    public void matchesSameProperties() {
+        Map<String, Object> properties = new HashMap<String, Object>();
+        properties.put("testKey", "testValue");
+        PropertiesFilter filter = new PropertiesFilter(properties);
+
+        assertTrue(filter.matches(properties));
+
+        properties.put("newTestKey", "newTestValue");
+        assertTrue(filter.matches(properties));
+
+        properties.remove("testKey"); //removes from filter
+        assertTrue(filter.matches(properties));
+    }
+
+    @Test
+    public void matchesNewProperties() {
+        Map<String, Object> properties = new HashMap<String, Object>();
+        properties.put("testKey", "testValue");
+        PropertiesFilter filter = new PropertiesFilter(properties);
+
+        Map<String, Object> newProperties = new HashMap<String, Object>();
+        newProperties.put("testKey", "testValue");
+
+        assertTrue(filter.matches(newProperties));
+
+        newProperties.put("newTestKey", "newTestValue");
+        assertTrue(filter.matches(newProperties));
+
+        newProperties.remove("testKey");
+        assertFalse(filter.matches(newProperties));
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void matchesNull() {
+        Map<String, Object> properties = new HashMap<String, Object>();
+        properties.put("testKey", "testValue");
+        PropertiesFilter filter = new PropertiesFilter(properties);
+        filter.matches(null);
+    }
+
+    @Test
+    public void matchDictionary() {
+        Map<String, Object> properties = new HashMap<String, Object>();
+        properties.put("testKey", "testValue");
+        PropertiesFilter filter = new PropertiesFilter(properties);
+
+        Dictionary<String, Object> d1 = new Hashtable<>();
+        assertFalse(filter.match(d1));
+        assertFalse(filter.matchCase(d1));
+
+        Dictionary<String, Object> d2 = new Hashtable<>();
+        d2.put("testKey", "badValue");
+        assertFalse(filter.match(d2));
+        assertFalse(filter.matchCase(d2));
+
+        Dictionary<String, Object> d3 = new Hashtable<>();
+        d3.put("testKey", "testValue");
+        assertTrue(filter.match(d3));
+        assertTrue(filter.matchCase(d3));
+    }
+
+    @Test
+    public void getFilterStringEmpty() {
+        Map<String, Object> properties = new HashMap<String, Object>();
+        PropertiesFilter filter = new PropertiesFilter(properties);
+        assertEquals("", filter.getFilterString());
+    }
+
+    @Test
+    public void getFilterStringOne() {
+        Map<String, Object> properties = new HashMap<String, Object>();
+        properties.put("key", "value");
+        PropertiesFilter filter = new PropertiesFilter(properties);
+        assertEquals("(key=value)", filter.toString());
+    }
+
+    @Test
+    public void getFilterStringMoreThanOne() {
+        Map<String, Object> properties = new TreeMap<String, Object>();
+        properties.put("key1", "value1");
+        properties.put("key2", "value2");
+        PropertiesFilter filter = new PropertiesFilter(properties);
+        assertEquals("(&(key1=value1)(key2=value2))", filter.toString());
+    }
+    
+    @Test
+    public void hashCodeEqualsToStringsHashCode() {
+        Map<String, Object> properties = new TreeMap<String, Object>();
+        properties.put("key1", "value1");
+        properties.put("key2", "value2");
+        PropertiesFilter filter = new PropertiesFilter(properties);
+        
+        assertEquals(filter.hashCode(), filter.toString().hashCode());
+    }
+
+    @Test
+    public void fromFilterStringEmpty() throws InvalidSyntaxException {
+        String filterString = "";
+        PropertiesFilter filter = new PropertiesFilter(filterString);
+        assertEquals(filterString, filter.getFilterString());
+    }
+
+    @Test
+    public void fromFilterStringOne() throws InvalidSyntaxException {
+        String filterString = "(key=value)";
+        PropertiesFilter filter = new PropertiesFilter(filterString);
+        assertEquals(filterString, filter.getFilterString());
+    }
+
+    @Test
+    public void fromFilterStringMoreThanOne() throws InvalidSyntaxException {
+        String filterString = "(&(key1=value1)(key2=value2))";
+        PropertiesFilter filter = new PropertiesFilter(filterString);
+        assertEquals(filterString, filter.getFilterString());
+    }
+}
diff --git a/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/support/TrueFilterTests.java b/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/support/TrueFilterTests.java
new file mode 100644
index 0000000..96c8304
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/src/test/java/org/eclipse/virgo/test/stubs/support/TrueFilterTests.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.stubs.support;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Dictionary;
+import java.util.Map;
+
+import org.junit.Test;
+import org.osgi.framework.ServiceReference;
+
+public class TrueFilterTests {
+
+    private final TrueFilter filter = new TrueFilter();
+
+    @Test
+    public void match() {
+        assertTrue(filter.match((Dictionary<String, ?>) null));
+        assertTrue(filter.match((ServiceReference<?>) null));
+        assertTrue(filter.matchCase(null));
+        assertTrue(filter.matches((Map<String, ?>) null));
+    }
+
+    @Test
+    public void testToString() {
+        assertEquals("", new TrueFilter().toString());
+        assertEquals("testFilterString", new TrueFilter("testFilterString").toString());
+    }
+
+    @Test
+    public void hashCodeEqualsToStringsHashCode() {
+        assertEquals(this.filter.hashCode(), this.filter.toString().hashCode());
+    }
+
+}
diff --git a/test/org.eclipse.virgo.test.stubs/src/test/resources/.gitignore b/test/org.eclipse.virgo.test.stubs/src/test/resources/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/src/test/resources/.gitignore
diff --git a/test/org.eclipse.virgo.test.stubs/template.mf b/test/org.eclipse.virgo.test.stubs/template.mf
new file mode 100644
index 0000000..0e5eeb3
--- /dev/null
+++ b/test/org.eclipse.virgo.test.stubs/template.mf
@@ -0,0 +1,22 @@
+Manifest-Version: 1.0
+Bundle-Name: OSGi Framework Test Stub Implementations
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: org.eclipse.virgo.test.stubs
+Bundle-Version: ${version}
+Import-Template: 
+ org.junit.*;version="[4.4.0, 5.0.0)",
+ org.osgi.framework.*;version="0",
+ org.osgi.service.cm;version="[1.3.0, 1.4.0)",
+ org.osgi.service.event;version="[1.3.0, 1.4.0)",
+ org.osgi.service.component;version="[1.1.0, 1.2.0)"
+Import-Package: 
+ org.aspectj.lang;version="[1.6.3.RELEASE, 2.0.0)",
+ org.aspectj.lang.annotation;version="[1.6.3.RELEASE, 2.0.0)",
+ org.aspectj.lang.reflect;version="[1.6.3.RELEASE, 2.0.0)",
+ org.aspectj.internal.lang.annotation;version="[1.6.3.RELEASE, 2.0.0)",
+ org.aspectj.runtime.internal;version="[1.6.3.RELEASE, 2.0.0)",
+ org.aspectj.runtime.reflect;version="[1.6.3.RELEASE, 2.0.0)"
+Excluded-Exports: 
+ org.eclipse.virgo.test.stubs.framework.aspects,
+ org.eclipse.virgo.test.stubs.internal,
+ org.eclipse.virgo.test.stubs.service.cm.aspects
diff --git a/test/org.eclipse.virgo.test.test/build.xml b/test/org.eclipse.virgo.test.test/build.xml
new file mode 100644
index 0000000..2ea71dd
--- /dev/null
+++ b/test/org.eclipse.virgo.test.test/build.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="org.eclipse.virgo.test.test">
+
+	<property file="${basedir}/../build.properties"/>
+	<property file="${basedir}/../build.versions"/>
+	<import file="${basedir}/../virgo-build/standard/default.xml"/>
+</project>
diff --git a/test/org.eclipse.virgo.test.test/ivy.xml b/test/org.eclipse.virgo.test.test/ivy.xml
new file mode 100644
index 0000000..87bae5b
--- /dev/null
+++ b/test/org.eclipse.virgo.test.test/ivy.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="http://ivyrep.jayasoft.org/ivy-doc.xsl"?>
+<ivy-module
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:noNamespaceSchemaLocation="http://incubator.apache.org/ivy/schemas/ivy.xsd"
+		version="1.3">
+
+	<info organisation="${project.organisation}" module="${ant.project.name}"/>
+
+	<configurations>
+		<include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>
+	</configurations>
+
+	<publications>
+		<artifact name="${ant.project.name}"/>
+		<artifact name="${ant.project.name}-sources" type="src" ext="jar"/>
+	</publications>
+
+	<dependencies>
+        <dependency org="org.junit" name="com.springsource.org.junit" rev="${org.junit}" />
+		<dependency org="org.eclipse.virgo.mirrored" name="org.eclipse.osgi" rev="${org.eclipse.osgi}" conf="compile->compile"/>
+		<dependency org="org.eclipse.virgo.test" name="org.eclipse.virgo.test.framework" rev="latest.integration"/>
+	</dependencies>
+
+</ivy-module>
diff --git a/test/org.eclipse.virgo.test.test/src/main/java/.gitignore b/test/org.eclipse.virgo.test.test/src/main/java/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/test/org.eclipse.virgo.test.test/src/main/java/.gitignore
diff --git a/test/org.eclipse.virgo.test.test/src/main/resources/.gitignore b/test/org.eclipse.virgo.test.test/src/main/resources/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/test/org.eclipse.virgo.test.test/src/main/resources/.gitignore
diff --git a/test/org.eclipse.virgo.test.test/src/test/java/org/eclipse/virgo/test/test/BasicOsgiEnvironmentTests.java b/test/org.eclipse.virgo.test.test/src/test/java/org/eclipse/virgo/test/test/BasicOsgiEnvironmentTests.java
new file mode 100644
index 0000000..489e6a7
--- /dev/null
+++ b/test/org.eclipse.virgo.test.test/src/test/java/org/eclipse/virgo/test/test/BasicOsgiEnvironmentTests.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import org.eclipse.virgo.test.framework.OsgiTestRunner;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleReference;
+
+
+@RunWith(OsgiTestRunner.class)
+public class BasicOsgiEnvironmentTests {
+
+	@Test
+	public void testRunningInOsgi() {
+		assertTrue((getClass().getClassLoader() instanceof BundleReference));
+	}
+	
+	@Test
+	public void testCanGetBundleContext() {
+		BundleReference br = (BundleReference)getClass().getClassLoader();
+		Bundle bundle = br.getBundle();
+		
+		assertNotNull(bundle);
+		assertNotNull(bundle.getBundleContext());
+	}
+	
+	@Test
+	public void testCustomConfigurationFileApplied() {
+		BundleReference br = (BundleReference)getClass().getClassLoader();
+		Bundle bundle = br.getBundle();
+		
+		String property = bundle.getBundleContext().getProperty("test.property");
+		assertEquals("foo", property);
+	}
+}
diff --git a/test/org.eclipse.virgo.test.test/src/test/java/org/eclipse/virgo/test/test/BundleDependenciesTests.java b/test/org.eclipse.virgo.test.test/src/test/java/org/eclipse/virgo/test/test/BundleDependenciesTests.java
new file mode 100644
index 0000000..c7e404d
--- /dev/null
+++ b/test/org.eclipse.virgo.test.test/src/test/java/org/eclipse/virgo/test/test/BundleDependenciesTests.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.test;
+
+import static org.junit.Assert.assertTrue;
+
+import org.eclipse.virgo.test.framework.BundleDependencies;
+import org.eclipse.virgo.test.framework.BundleEntry;
+import org.eclipse.virgo.test.framework.OsgiTestRunner;
+import org.eclipse.virgo.test.framework.TestFrameworkUtils;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+
+
+@BundleDependencies(entries = {@BundleEntry("file:./src/test/resources/test-bundle")})
+@RunWith(OsgiTestRunner.class)
+public class BundleDependenciesTests {
+
+	@Test
+	public void testBundleInstalled() {
+		BundleContext bundleContext = TestFrameworkUtils.getBundleContextForTestClass(getClass());
+		Bundle[] bundles = bundleContext.getBundles();
+		boolean found = false;
+		for (Bundle bundle : bundles) {
+			if("test.bundle".equals(bundle.getSymbolicName()))  {
+			    found = true;
+			    break;
+			}
+		}
+		assertTrue(found);
+	}
+}
diff --git a/test/org.eclipse.virgo.test.test/src/test/java/org/eclipse/virgo/test/test/TestFrameworkUtilsTests.java b/test/org.eclipse.virgo.test.test/src/test/java/org/eclipse/virgo/test/test/TestFrameworkUtilsTests.java
new file mode 100644
index 0000000..838ba82
--- /dev/null
+++ b/test/org.eclipse.virgo.test.test/src/test/java/org/eclipse/virgo/test/test/TestFrameworkUtilsTests.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.test;
+
+import static org.junit.Assert.assertNotNull;
+
+import org.eclipse.virgo.test.framework.OsgiTestRunner;
+import org.eclipse.virgo.test.framework.TestFrameworkUtils;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.osgi.framework.BundleContext;
+
+
+@RunWith(OsgiTestRunner.class)
+public class TestFrameworkUtilsTests {
+
+	@Test
+	public void testGetBundleContextForTestClass() {
+		BundleContext bundleContext = TestFrameworkUtils.getBundleContextForTestClass(getClass());
+		assertNotNull(bundleContext);
+	}
+	
+	@Test(expected=IllegalArgumentException.class)
+	public void testGetBundleContextForNonTestClass() {
+		TestFrameworkUtils.getBundleContextForTestClass(String.class);
+	}
+}
diff --git a/test/org.eclipse.virgo.test.test/src/test/resources/META-INF/MANIFEST.MF b/test/org.eclipse.virgo.test.test/src/test/resources/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..2be327d
--- /dev/null
+++ b/test/org.eclipse.virgo.test.test/src/test/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,8 @@
+Manifest-Version: 1
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: org.eclipse.virgo.test.test
+Bundle-Version: 3.0.0
+Import-Package: org.junit,
+ org.osgi.framework,
+ org.eclipse.virgo.test.framework
+
diff --git a/test/org.eclipse.virgo.test.test/src/test/resources/META-INF/test.config.properties b/test/org.eclipse.virgo.test.test/src/test/resources/META-INF/test.config.properties
new file mode 100644
index 0000000..ccf6352
--- /dev/null
+++ b/test/org.eclipse.virgo.test.test/src/test/resources/META-INF/test.config.properties
@@ -0,0 +1,14 @@
+test.property=foo
+user.home=dummy
+#Ivy config properties
+org.eclipse.virgo.test.ivy.settings=file:src/test/resources/ivysettings.xml
+
+#Extra properties files
+org.eclipse.virgo.test.properties.include=file:../build.versions, file:../build.properties
+
+osgi.java.profile=file:src/test/resources/java-server.profile
+osgi.java.profile.bootdelegation=override
+osgi.parentClassloader=fwk
+osgi.context.bootdelegation=false
+osgi.compatibility.bootdelegation=false
+osgi.configuration.area=target
\ No newline at end of file
diff --git a/test/org.eclipse.virgo.test.test/src/test/resources/java-server.profile b/test/org.eclipse.virgo.test.test/src/test/resources/java-server.profile
new file mode 100644
index 0000000..74afd8c
--- /dev/null
+++ b/test/org.eclipse.virgo.test.test/src/test/resources/java-server.profile
@@ -0,0 +1,208 @@
+org.osgi.framework.system.packages = \
+ javax.accessibility,\
+ javax.activation,\
+ javax.activation;version="1.1.0",\
+ javax.activity,\
+ javax.annotation,\
+ javax.annotation;version="1.0.0",\
+ 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;version="2.0",\
+ javax.jws.soap,\
+ javax.jws.soap;version="2.0",\
+ 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.script;version="1.1",\
+ 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;version="1.0.1",\
+ javax.transaction;version="1.1.0",\
+ javax.transaction.xa,\
+ javax.transaction.xa;version="1.0.1",\
+ javax.transaction.xa;version="1.1.0",\
+ javax.xml,\
+ javax.xml;version="1.0.1",\
+ javax.xml.bind,\
+ javax.xml.bind;version="2.0",\
+ javax.xml.bind.annotation,\
+ javax.xml.bind.annotation;version="2.0",\
+ javax.xml.bind.annotation.adapters,\
+ javax.xml.bind.annotation.adapters;version="2.0",\
+ javax.xml.bind.attachment,\
+ javax.xml.bind.attachment;version="2.0",\
+ javax.xml.bind.helpers,\
+ javax.xml.bind.helpers;version="2.0",\
+ javax.xml.bind.util,\
+ javax.xml.bind.util;version="2.0",\
+ javax.xml.crypto,\
+ javax.xml.crypto;version="1.0",\
+ javax.xml.crypto.dom,\
+ javax.xml.crypto.dom;version="1.0",\
+ javax.xml.crypto.dsig,\
+ javax.xml.crypto.dsig;version="1.0",\
+ javax.xml.crypto.dsig.dom,\
+ javax.xml.crypto.dsig.dom;version="1.0",\
+ javax.xml.crypto.dsig.keyinfo,\
+ javax.xml.crypto.dsig.keyinfo;version="1.0",\
+ javax.xml.crypto.dsig.spec,\
+ javax.xml.crypto.dsig.spec;version="1.0",\
+ javax.xml.datatype,\
+ javax.xml.namespace,\
+ javax.xml.parsers,\
+ javax.xml.soap,\
+ javax.xml.soap;version="1.3.0",\
+ javax.xml.stream,\
+ javax.xml.stream;version="1.0.1",\
+ javax.xml.stream.events,\
+ javax.xml.stream.events;version="1.0.1",\
+ javax.xml.stream.util,\
+ javax.xml.stream.util;version="1.0.1",\
+ 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;version="2.1.1",\
+ javax.xml.ws.handler,\
+ javax.xml.ws.handler;version="2.1.1",\
+ javax.xml.ws.handler.soap,\
+ javax.xml.ws.handler.soap;version="2.1.1",\
+ javax.xml.ws.http,\
+ javax.xml.ws.http;version="2.1.1",\
+ javax.xml.ws.soap,\
+ javax.xml.ws.soap;version="2.1.1",\
+ javax.xml.ws.spi,\
+ javax.xml.ws.spi;version="2.1.1",\
+ 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.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
+org.osgi.framework.bootdelegation = \
+ com_cenqua_clover,\
+ com.cenqua.*,\
+ com.yourkit.*,\
+ org.eclipse.virgo.osgi.extensions.*,\
+ com.sun.*,\
+ javax.xml.*,\
+ org.apache.xerces.jaxp.*,\
+ org.w3c.*,\
+ org.xml.*,\
+ sun.*
+org.osgi.framework.executionenvironment = \
+ OSGi/Minimum-1.0,\
+ OSGi/Minimum-1.1,\
+ J2SE-1.3,\
+ J2SE-1.4,\
+ J2SE-1.5,\
+ JavaSE-1.6
+osgi.java.profile.name = SpringSource-dm-Server-Java6
diff --git a/test/org.eclipse.virgo.test.test/src/test/resources/test-bundle/META-INF/MANIFEST.MF b/test/org.eclipse.virgo.test.test/src/test/resources/test-bundle/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..45b2d40
--- /dev/null
+++ b/test/org.eclipse.virgo.test.test/src/test/resources/test-bundle/META-INF/MANIFEST.MF
@@ -0,0 +1,5 @@
+Manifest-Version: 1
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: test.bundle
+Bundle-Version: 1.0
+
diff --git a/test/org.eclipse.virgo.test.tools/src/main/java/org/eclipse/virgo/test/tools/AbstractServerCommandThread.java b/test/org.eclipse.virgo.test.tools/src/main/java/org/eclipse/virgo/test/tools/AbstractServerCommandThread.java
new file mode 100644
index 0000000..67a6084
--- /dev/null
+++ b/test/org.eclipse.virgo.test.tools/src/main/java/org/eclipse/virgo/test/tools/AbstractServerCommandThread.java
@@ -0,0 +1,46 @@
+
+package org.eclipse.virgo.test.tools;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.lang.management.ManagementFactory;
+import java.lang.management.OperatingSystemMXBean;
+import java.util.Map;
+
+public abstract class AbstractServerCommandThread implements Runnable {
+
+    protected OperatingSystemMXBean os = ManagementFactory.getOperatingSystemMXBean();
+
+    protected Process process = null;
+
+    protected ProcessBuilder pb = null;
+
+    protected String binDir;
+
+    public AbstractServerCommandThread(String binDir) {
+        this.binDir = binDir;
+    }
+
+    protected void redirectProcessOutput() throws IOException {
+        InputStream is = process.getInputStream();
+        try (BufferedReader br = new BufferedReader(new InputStreamReader(is, UTF_8))) {
+            String line;
+            while ((line = br.readLine()) != null) {
+                System.out.println(line);
+            }
+        }
+    }
+
+    protected void createAndStartProcess(String fileName) throws IOException {
+        pb = new ProcessBuilder(new String[] { fileName });
+        pb.redirectErrorStream(true);
+        Map<String, String> env = pb.environment();
+        env.put("JAVA_HOME", System.getProperty("java.home"));
+        process = pb.start();
+    }
+
+}
diff --git a/test/org.eclipse.virgo.test.tools/src/main/java/org/eclipse/virgo/test/tools/AbstractSmokeTests.java b/test/org.eclipse.virgo.test.tools/src/main/java/org/eclipse/virgo/test/tools/AbstractSmokeTests.java
new file mode 100644
index 0000000..ca4fdcb
--- /dev/null
+++ b/test/org.eclipse.virgo.test.tools/src/main/java/org/eclipse/virgo/test/tools/AbstractSmokeTests.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.tools;
+
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.eclipse.virgo.test.tools.JmxUtils.isDefaultJmxPortAvailable;
+import static org.eclipse.virgo.test.tools.JmxUtils.waitForVirgoServerShutdownFully;
+import static org.eclipse.virgo.test.tools.JmxUtils.waitForVirgoServerStartFully;
+import static org.eclipse.virgo.test.tools.VirgoServerShutdownThread.shutdown;
+import static org.eclipse.virgo.test.tools.VirgoServerStartupThread.startup;
+import static org.eclipse.virgo.util.io.FileCopyUtils.copy;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.util.concurrent.TimeUnit;
+
+import org.junit.After;
+import org.junit.Before;
+
+public abstract class AbstractSmokeTests {
+
+    private String srcDir = "src/smokeTest/resources";
+
+    private File bundlesDir = null;
+
+    protected abstract String getVirgoFlavor();
+
+    @Before
+    public void startServer() throws Exception {
+        if (!isDefaultJmxPortAvailable()) {
+            System.out.println("Port not available. Waiting for a few seconds.");
+            TimeUnit.SECONDS.sleep(10);
+            if (!isDefaultJmxPortAvailable()) {
+                System.out.println("Port still not available. Trying to shutdown running Virgo.");
+                shutdown(ServerUtils.getBinDir(getVirgoFlavor()));
+                if (!isDefaultJmxPortAvailable()) {
+                    System.out.println("Port still not available. Giving up.");
+                }
+            }
+        }
+        assertTrue("Default JMX port in use. Is another Virgo server still up and running?!", isDefaultJmxPortAvailable());
+        startup(ServerUtils.getBinDir(getVirgoFlavor()));
+        assertTrue("Server '" + getVirgoFlavor() + "' not started properly.", waitForVirgoServerStartFully());
+    }
+
+    @After
+    public void shutdownServer() throws Exception {
+        shutdown(ServerUtils.getBinDir(getVirgoFlavor()));
+        assertTrue("Server '" + getVirgoFlavor() + "' not shut down properly.", waitForVirgoServerShutdownFully());
+    }
+
+    private File setupBundleResourcesDir() {
+        if (bundlesDir == null) {
+            File testExpanded = new File("./" + srcDir);
+            bundlesDir = new File(testExpanded, "bundles");
+        }
+        return bundlesDir;
+    }
+
+    public void deployTestBundles(String flavor, String bundleName) throws Exception {
+        setupBundleResourcesDir();
+        copy(new File(bundlesDir, bundleName), new File(ServerUtils.getPickupDir(flavor), bundleName));
+        // allow the Server to finish the deployment
+        SECONDS.sleep(10);
+    }
+
+    public void undeployTestBundles(String flavor, String bundleName) throws Exception {
+        setupBundleResourcesDir();
+        File file = new File(ServerUtils.getPickupDir(flavor), bundleName);
+        if (file.exists()) {
+            file.delete();
+            // allow the Server to finish the undeployment
+            SECONDS.sleep(5);
+        }
+    }
+
+}
diff --git a/test/org.eclipse.virgo.test.tools/src/main/java/org/eclipse/virgo/test/tools/JmxUtils.java b/test/org.eclipse.virgo.test.tools/src/main/java/org/eclipse/virgo/test/tools/JmxUtils.java
new file mode 100644
index 0000000..25d18e2
--- /dev/null
+++ b/test/org.eclipse.virgo.test.tools/src/main/java/org/eclipse/virgo/test/tools/JmxUtils.java
@@ -0,0 +1,314 @@
+
+package org.eclipse.virgo.test.tools;
+
+import static java.time.Instant.now;
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.time.Duration;
+import java.time.Instant;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.management.AttributeNotFoundException;
+import javax.management.InstanceNotFoundException;
+import javax.management.MBeanException;
+import javax.management.MBeanServerConnection;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+import javax.management.ReflectionException;
+import javax.management.openmbean.CompositeDataSupport;
+import javax.management.remote.JMXConnector;
+import javax.management.remote.JMXConnectorFactory;
+import javax.management.remote.JMXServiceURL;
+
+import org.eclipse.virgo.util.io.NetUtils;
+
+// TODO - rework static usage of virgoHome
+public class JmxUtils {
+
+    public static File virgoHome;
+
+    private static final Duration HALF_SECOND = Duration.ofMillis(500);
+
+    private static final Duration THIRTY_SECONDS = Duration.ofSeconds(30);
+
+    private static final Duration TWO_MINUTES = Duration.ofMinutes(2);
+
+    private static final String ARTIFACT_BUNDLE = "bundle";
+
+    private static MBeanServerConnection connection = null;
+
+    private final static int JMX_DEFAULT_PORT = 9875;
+
+    private static final String JMXURL = "service:jmx:rmi:///jndi/rmi://localhost:" + JMX_DEFAULT_PORT + "/jmxrmi";
+
+    private static final String KEYSTORE = "/configuration/keystore";
+
+    private static final String KEYPASSWORD = "changeit";
+
+    private static final String DEPLOYER_MBEAN_NAME = "org.eclipse.virgo.kernel:category=Control,type=Deployer";
+
+    private static final String[] DEPLOYMENT_IDENTITY_FIELDS = new String[] { "type", "symbolicName", "version" };
+
+    private final static String STATUS_STARTED = "STARTED";
+
+    private final static String STATUS_STARTING = "STARTING";
+
+    public static boolean isDefaultJmxPortAvailable() {
+        return NetUtils.isPortAvailable(JMX_DEFAULT_PORT);
+    }
+
+    public static boolean isKernelStarted() {
+        return JmxUtils.STATUS_STARTED.equals(getKernelStatus());
+    }
+
+    public static boolean waitForVirgoServerStartFully() throws Exception {
+        Instant start = Instant.now();
+        while (start.plus(THIRTY_SECONDS).isAfter(Instant.now())) {
+            try {
+                String currentKernelStatus = getKernelStatus();
+                System.out.println("Current kernel status: '" + currentKernelStatus + "'");
+                switch (currentKernelStatus) {
+                    case STATUS_STARTED:
+                        // wait for startup to complete
+                        SECONDS.sleep(20);
+                        return true;
+                    case STATUS_STARTING:
+                    default:
+                        break;
+                }
+            } catch (IllegalStateException e) {
+                // ignore JMX related exception and try again?
+            }
+            SECONDS.sleep(1);
+        }
+        // startup failed
+        return false;
+    }
+
+    public static boolean waitForVirgoServerShutdownFully() throws Exception {
+        Instant start = now();
+        while (start.plus(THIRTY_SECONDS).isAfter(now())) {
+            if (isDefaultJmxPortAvailable()) {
+                // allow some more time to finish shutdown
+                SECONDS.sleep(10);
+                return true;
+            }
+            try {
+                String currentKernelStatus = getKernelStatus();
+                System.out.println("Current kernel status: '" + currentKernelStatus + "'");
+                if (!getKernelStatus().equals(STATUS_STARTED)) {
+                }
+            } catch (IllegalStateException e) {
+                // ignore JMX related exception and try again?
+            }
+            SECONDS.sleep(1);
+        }
+        // shutdown failed
+        return false;
+    }
+
+    public static void waitForMBean(String mBeanName) throws Exception {
+        waitForMBean(mBeanName, HALF_SECOND, TWO_MINUTES);
+    }
+
+    public static void waitForMBean(String mBeanName, Duration sleepDuration, Duration duration) throws Exception {
+        Instant start = Instant.now();
+        boolean mbeanStatus = false;
+        while (start.plus(duration).isAfter(Instant.now())) {
+            try {
+                ObjectName objectName = new ObjectName(mBeanName);
+                System.out.println("Looking for JMX object '" + objectName + "'");
+                mbeanStatus = getMBeanServerConnection().isRegistered(objectName);
+                if (mbeanStatus) {
+                    return;
+                }
+            } catch (IOException e) {
+                // swallow and retry - No JMX server available (yet)
+            }
+            Thread.sleep(sleepDuration.toMillis());
+        }
+        fail(String.format("After %d s and %d ns, artifact %s mbean Status was", duration.getSeconds(), duration.getNano(), mBeanName) + mbeanStatus);
+    }
+
+    public static void waitForArtifactInUserRegion(String type, String name, String version, long interval, long duration) throws Exception {
+        long startTime = System.currentTimeMillis();
+        boolean mbeanStatus = false;
+        while (System.currentTimeMillis() - startTime < duration) {
+            try {
+                ObjectName objectName = getObjectName(type, name, version);
+                System.out.println("Looking for JMX object '" + objectName + "'");
+                mbeanStatus = getMBeanServerConnection().isRegistered(objectName);
+                if (mbeanStatus) {
+                    return;
+                }
+            } catch (IOException e) {
+                // swallow and retry
+            }
+            Thread.sleep(interval);
+        }
+        fail(String.format("After %d ms, artifact %s mbean Status was", duration, name) + mbeanStatus);
+    }
+
+    public static void waitForArtifactInKernelRegion(String type, String name, String version, long interval, long duration) throws Exception {
+        long startTime = System.currentTimeMillis();
+        boolean mbeanStatus = false;
+        while (System.currentTimeMillis() - startTime < duration) {
+            try {
+                ObjectName objectName = getObjectNameInKernelRegion(type, name, version);
+                System.out.println("Looking for JMX object '" + objectName + "'");
+                mbeanStatus = getMBeanServerConnection().isRegistered(objectName);
+                if (mbeanStatus) {
+                    return;
+                }
+            } catch (IOException e) {
+                // swallow and retry
+            }
+            Thread.sleep(interval);
+        }
+        fail(String.format("After %d ms, artifact %s mbean Status was", duration, name) + mbeanStatus);
+    }
+
+    public static MBeanServerConnection getMBeanServerConnection() throws IOException {
+        String severDir = null;
+
+        String[] creds = { "admin", "admin" };
+        Map<String, String[]> env = new HashMap<String, String[]>();
+
+        try {
+            severDir = virgoHome.getCanonicalPath();
+        } catch (IOException e) {
+            throw new IllegalStateException("Failed to get canonical path of server directory '" + virgoHome + "'.");
+        }
+
+        env.put(JMXConnector.CREDENTIALS, creds);
+        System.setProperty("javax.net.ssl.trustStore", severDir + KEYSTORE);
+        System.setProperty("javax.net.ssl.trustStorePassword", KEYPASSWORD);
+        JMXServiceURL url;
+        try {
+            url = new JMXServiceURL(JMXURL);
+            connection = JMXConnectorFactory.connect(url, env).getMBeanServerConnection();
+        } catch (MalformedURLException e) {
+            throw new IllegalStateException("Failed to create JMX connection to '" + JMXURL + "'.", e);
+        }
+        return connection;
+    }
+
+    public static ObjectName getObjectName(String type, String name, String version) throws MalformedObjectNameException {
+        return new ObjectName(String.format(
+            "org.eclipse.virgo.kernel:type=ArtifactModel,artifact-type=%s,name=%s,version=%s,region=org.eclipse.virgo.region.user", type, name,
+            version));
+    }
+
+    public static ObjectName getObjectNameInKernelRegion(String type, String name, String version) throws MalformedObjectNameException {
+        return new ObjectName(String.format(
+            "org.eclipse.virgo.kernel:type=ArtifactModel,artifact-type=%s,name=%s,version=%s,region=org.eclipse.equinox.region.kernel", type, name,
+            version));
+    }
+
+    public static void deploy(File uploadedFile) throws Exception {
+        deploy(java.util.Collections.singletonList(uploadedFile));
+    }
+
+    public static void deploy(List<File> uploadedFiles) throws Exception {
+        waitForMBean(DEPLOYER_MBEAN_NAME, HALF_SECOND, TWO_MINUTES);
+        ObjectName objectName = new ObjectName(DEPLOYER_MBEAN_NAME);
+        for (File file : uploadedFiles) {
+            URI uri = file.toURI();
+            System.out.println("Deploying file '" + uri + "' on '" + objectName + "'");
+            Object invoke = getMBeanServerConnection().invoke(objectName, "deploy", new Object[] { uri.toString() },
+                new String[] { String.class.getName() });
+            getDeploymentIdentity(invoke);
+        }
+    }
+
+    // Taken from org.eclipse.virgo.management.console.UploadServlet.getDeploymentIdentity()
+    private static String getDeploymentIdentity(Object deploymentIdentity) {
+        StringBuilder builder = new StringBuilder();
+        if (deploymentIdentity instanceof CompositeDataSupport) {
+            CompositeDataSupport deploymentIdentityInstance = (CompositeDataSupport) deploymentIdentity;
+            Object[] all = deploymentIdentityInstance.getAll(DEPLOYMENT_IDENTITY_FIELDS);
+            builder.append(all[0]);
+            builder.append(" - ").append(all[1]);
+            builder.append(": ").append(all[2]);
+        }
+        return builder.toString();
+    }
+
+    public static void waitForArtifactState(String type, String name, String version, String state, long interval, long duration) throws Exception {
+        long startTime = System.currentTimeMillis();
+        String artifactstate = null;
+        while (System.currentTimeMillis() - startTime < duration) {
+            artifactstate = getMBeanServerConnection().getAttribute(getObjectName(type, name, version), "State").toString();
+            if (artifactstate.equals(state)) {
+                return;
+            }
+            Thread.sleep(interval);
+        }
+        fail(String.format("After %d ms, artifact %s state was", duration, name) + artifactstate);
+    }
+
+    public static void assertArtifactExists(String type, String name, String version) throws Exception {
+        assertTrue(String.format("Artifact %s:%s:%s does not exist", type, name, version),
+            getMBeanServerConnection().isRegistered(JmxUtils.getObjectName(type, name, version)));
+    }
+
+    public static void assertBundleArtifactExists(String name, String version) throws Exception {
+        assertTrue(String.format("Artifact %s:%s:%s does not exist", ARTIFACT_BUNDLE, name, version),
+            getMBeanServerConnection().isRegistered(JmxUtils.getObjectName(ARTIFACT_BUNDLE, name, version)));
+    }
+
+    public static void assertBundleArtifactExistsInKernelRegion(String name, String version) throws Exception {
+        assertTrue(String.format("Artifact %s:%s:%s does not exist", ARTIFACT_BUNDLE, name, version),
+            getMBeanServerConnection().isRegistered(JmxUtils.getObjectNameInKernelRegion(ARTIFACT_BUNDLE, name, version)));
+    }
+
+    public static void assertBundleArtifactState(String name, String version, String state) throws Exception {
+        assertArtifactState(ARTIFACT_BUNDLE, name, version, state);
+    }
+
+    public static void assertBundleArtifactStateInKernelRegion(String name, String version, String state) throws Exception {
+        assertArtifactStateInKernelRegion(ARTIFACT_BUNDLE, name, version, state);
+    }
+
+    public static void assertArtifactState(String type, String name, String version, String state) throws Exception {
+        assertEquals(String.format("admin console plan artifact %s:%s:%s is not in state %s", type, name, version, state), state,
+            getMBeanServerConnection().getAttribute(JmxUtils.getObjectName(type, name, version), "State"));
+    }
+
+    public static void assertArtifactStateInKernelRegion(String type, String name, String version, String state) throws Exception {
+        assertEquals(String.format("admin console plan artifact %s:%s:%s is not in state %s", type, name, version, state), state,
+            getMBeanServerConnection().getAttribute(JmxUtils.getObjectNameInKernelRegion(type, name, version), "State"));
+    }
+
+    public static void uninstall(String type, String name, String version) throws Exception {
+        getMBeanServerConnection().invoke(getObjectName(type, name, version), "uninstall", new Object[] {}, new String[] {});
+    }
+
+    public static String getKernelStatus() {
+        try {
+            return (String) getMBeanServerConnection().getAttribute(new ObjectName("org.eclipse.virgo.kernel:type=KernelStatus"), "Status");
+        } catch (AttributeNotFoundException e) {
+            throw new IllegalStateException("Failed to get server status.", e);
+        } catch (InstanceNotFoundException e) {
+            throw new IllegalStateException("Failed to get server status.", e);
+        } catch (MalformedObjectNameException e) {
+            throw new IllegalStateException("Failed to get server status.", e);
+        } catch (MBeanException e) {
+            throw new IllegalStateException("Failed to get server status.", e);
+        } catch (ReflectionException e) {
+            throw new IllegalStateException("Failed to get server status.", e);
+        } catch (IOException e) {
+            throw new IllegalStateException("Failed to get server status.", e);
+        }
+    }
+
+}
diff --git a/test/org.eclipse.virgo.test.tools/src/main/java/org/eclipse/virgo/test/tools/ServerUtils.java b/test/org.eclipse.virgo.test.tools/src/main/java/org/eclipse/virgo/test/tools/ServerUtils.java
new file mode 100644
index 0000000..f141573
--- /dev/null
+++ b/test/org.eclipse.virgo.test.tools/src/main/java/org/eclipse/virgo/test/tools/ServerUtils.java
@@ -0,0 +1,32 @@
+
+package org.eclipse.virgo.test.tools;
+
+import java.io.File;
+import java.io.IOException;
+
+public class ServerUtils {
+
+    public static File getHome(String flavor) {
+        return new File("../build/install/virgo-" + flavor + "/").getAbsoluteFile();
+    }
+
+    public static String getBinDir(String flavor) {
+        return getVirgoServerSubdirectory(getHome(flavor), "bin");
+    }
+
+    public static String getPickupDir(String flavor) {
+        return getVirgoServerSubdirectory(getHome(flavor), "pickup");
+    }
+    
+    private static String getVirgoServerSubdirectory(File virgoHome, String subdirectoryName) {
+        if (virgoHome.isDirectory()) {
+            try {
+                return new File(virgoHome, subdirectoryName).getCanonicalPath();
+            } catch (IOException e) {
+                throw new IllegalStateException("No subdirectory '" + subdirectoryName + "' found withing '" + virgoHome + "'", e);
+            }
+        }
+        throw new IllegalStateException("No subdirectory '" + subdirectoryName + "' found within '" + virgoHome + "'");
+    }
+
+}
diff --git a/test/org.eclipse.virgo.test.tools/src/main/java/org/eclipse/virgo/test/tools/UrlWaitLatch.java b/test/org.eclipse.virgo.test.tools/src/main/java/org/eclipse/virgo/test/tools/UrlWaitLatch.java
new file mode 100644
index 0000000..64ce153
--- /dev/null
+++ b/test/org.eclipse.virgo.test.tools/src/main/java/org/eclipse/virgo/test/tools/UrlWaitLatch.java
@@ -0,0 +1,121 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.test.tools;
+
+import static java.time.Instant.now;
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static org.apache.http.HttpStatus.SC_OK;
+import static org.apache.http.HttpStatus.SC_UNAUTHORIZED;
+import static org.junit.Assert.fail;
+
+import java.time.Duration;
+import java.time.Instant;
+import java.util.Timer;
+import java.util.TimerTask;
+
+import org.apache.http.auth.AuthScope;
+import org.apache.http.auth.UsernamePasswordCredentials;
+import org.apache.http.client.CredentialsProvider;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.conn.HttpHostConnectException;
+import org.apache.http.impl.client.BasicCredentialsProvider;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClientBuilder;
+
+public class UrlWaitLatch {
+
+    public static final long HALF_SECOND = 500;
+
+    public static final long ONE_MINUTE = 60 * 1000;
+
+    public static int waitFor(String url) {
+        return waitFor(url, HALF_SECOND, ONE_MINUTE);
+    }
+
+    public static int waitFor(String url, String username, String password) {
+        return waitFor(url, username, password, HALF_SECOND, ONE_MINUTE);
+    }
+
+    public static int waitFor(String url, long interval, long duration) {
+        return waitFor(url, null, null, interval, duration);
+    }
+
+    public static int waitFor(String url, String username, String password, long interval, long duration) {
+
+        HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
+        if (username != null) {
+            CredentialsProvider provider = new BasicCredentialsProvider();
+            UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(username, password);
+            provider.setCredentials(AuthScope.ANY, credentials);
+            httpClientBuilder.setDefaultCredentialsProvider(provider);
+        }
+
+        final HttpGet get = new HttpGet(url);
+        TimerTask task = new TimerTask() {
+
+            @Override
+            public void run() {
+                if (get != null) {
+                    System.err.println("Operation timed out. Aborting request.");
+                    get.abort();
+                }
+            }
+        };
+        new Timer(true).schedule(task, Duration.ofSeconds(60).toMillis());
+
+        try (CloseableHttpClient client = httpClientBuilder.build()) {
+            int statusCode = -1;
+            Instant start = now();
+            while (start.plus(Duration.ofSeconds(30)).isAfter(now())) {
+                try {
+                    statusCode = client.execute(get).getStatusLine().getStatusCode();
+                } catch (HttpHostConnectException e) {
+                    System.out.println("Connection refused. The servlet container seems not be ready yet.");
+                }
+                System.out.println("Current status Code: " + statusCode);
+                if (statusCode == SC_OK || statusCode == SC_UNAUTHORIZED) {
+                    task.cancel();
+                    return statusCode;
+                }
+                System.out.println("Sleeping for " + interval + " millis.");
+                MILLISECONDS.sleep(interval);
+            }
+
+            fail(String.format("After %d ms, status code was %d", duration, statusCode));
+        } catch (Exception e) {
+            e.printStackTrace();
+            fail("Failed to connect to '" + url + "'.");
+        } finally {
+            get.releaseConnection();
+        }
+        throw new RuntimeException("Failed to connect to '" + url + "'.");
+    }
+
+    public static void main(String[] args) throws Exception {
+        checkHttpPage("Checking splash screen...", "http://localhost:8080/");
+        checkHttpPage("Checking admin screen...", "http://localhost:8080/admin");
+        checkHttpPage("Checking admin login with (admin/admin)...", "http://localhost:8080/admin/content/overview", "admin", "admin");
+        checkHttpPage("Checking admin login with (foo/bar)...", "http://localhost:8080/admin/content/overview", "foo", "bar");
+    }
+
+    private static void checkHttpPage(String message, String url) {
+        System.out.print(message);
+        int returnCode = UrlWaitLatch.waitFor(url);
+        System.out.println(returnCode);
+    }
+
+    private static void checkHttpPage(String message, String url, String username, String password) {
+        System.out.print(message);
+        int returnCode = UrlWaitLatch.waitFor(url, username, password);
+        System.out.println(returnCode);
+    }
+}
diff --git a/test/org.eclipse.virgo.test.tools/src/main/java/org/eclipse/virgo/test/tools/VirgoServerShutdownThread.java b/test/org.eclipse.virgo.test.tools/src/main/java/org/eclipse/virgo/test/tools/VirgoServerShutdownThread.java
new file mode 100644
index 0000000..1563800
--- /dev/null
+++ b/test/org.eclipse.virgo.test.tools/src/main/java/org/eclipse/virgo/test/tools/VirgoServerShutdownThread.java
@@ -0,0 +1,41 @@
+
+package org.eclipse.virgo.test.tools;
+
+import java.io.File;
+import java.io.IOException;
+
+public class VirgoServerShutdownThread extends AbstractServerCommandThread {
+
+    private File shutdown = null;
+
+    private String shutdownFileName = null;
+
+    private File shutdownURI = null;
+
+    public static void shutdown(String binDir) {
+        new Thread(new VirgoServerShutdownThread(binDir)).start();
+    }
+
+    private VirgoServerShutdownThread(String binDir) {
+        super(binDir);
+    }
+
+    @Override
+    public void run() {
+        try {
+            if (os.getName().contains("Windows")) {
+                shutdown = new File(binDir, "shutdown.bat");
+                shutdownURI = new File(shutdown.toURI());
+                shutdownFileName = shutdownURI.getCanonicalPath();
+            } else {
+                shutdown = new File(binDir, "shutdown.sh");
+                shutdownURI = new File(shutdown.toURI());
+                shutdownFileName = shutdownURI.getCanonicalPath();
+            }
+            createAndStartProcess(shutdownFileName);
+            redirectProcessOutput();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+}
diff --git a/test/org.eclipse.virgo.test.tools/src/main/java/org/eclipse/virgo/test/tools/VirgoServerStartupThread.java b/test/org.eclipse.virgo.test.tools/src/main/java/org/eclipse/virgo/test/tools/VirgoServerStartupThread.java
new file mode 100644
index 0000000..7972a4e
--- /dev/null
+++ b/test/org.eclipse.virgo.test.tools/src/main/java/org/eclipse/virgo/test/tools/VirgoServerStartupThread.java
@@ -0,0 +1,41 @@
+
+package org.eclipse.virgo.test.tools;
+
+import java.io.File;
+import java.io.IOException;
+
+public class VirgoServerStartupThread extends AbstractServerCommandThread {
+
+    private File startup = null;
+
+    private String startupFileName = null;
+
+    private File startupURI = null;
+
+    public static void startup(String binDir) {
+        new Thread(new VirgoServerStartupThread(binDir)).start();
+    }
+
+    private VirgoServerStartupThread(String binDir) {
+        super(binDir);
+    }
+
+    @Override
+    public void run() {
+        try {
+            if (os.getName().contains("Windows")) {
+                startup = new File(binDir, "startup.bat");
+                startupURI = new File(startup.toURI());
+                startupFileName = startupURI.getCanonicalPath();
+            } else {
+                startup = new File(binDir, "startup.sh");
+                startupURI = new File(startup.toURI());
+                startupFileName = startupURI.getCanonicalPath();
+            }
+            createAndStartProcess(startupFileName);
+            redirectProcessOutput();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+}
diff --git a/util/.gitignore b/util/.gitignore
new file mode 100644
index 0000000..3fbb103
--- /dev/null
+++ b/util/.gitignore
@@ -0,0 +1,13 @@
+*/src/main/resources/META-INF/MANIFEST.MF
+*/src/test/resources/META-INF/TEST.MF
+target
+integration-repo
+ivy-cache
+.ant-targets-build.xml
+user-ivy.properties
+bin/
+build/
+.settings/
+.project
+.classpath
+
diff --git a/util/CONTRIBUTING.md b/util/CONTRIBUTING.md
new file mode 100644
index 0000000..e3a5790
--- /dev/null
+++ b/util/CONTRIBUTING.md
@@ -0,0 +1,47 @@
+Contributing to Virgo
+=====================
+
+Thanks for your interest in this project.
+
+Project description:
+--------------------
+
+The Virgo Web Server from EclipseRT is a completely module-based Java application server that is designed to run enterprise Java applications and Spring-powered applications with a high degree of flexibility and reliability. It offers a simple yet comprehensive platform to develop, deploy, and service enterprise Java applications.
+The Virgo kernel supports the core concepts of Virgo and is not biased towards the web server, thus enabling other types of server to be created. The kernel can also be used stand-alone as a rich OSGi application platform. A server runtime can easily be constructed by deploying suitable bundles on top of the kernel.
+
+- https://projects.eclipse.org/projects/rt.virgo
+
+Developer resources:
+--------------------
+
+Information regarding source code management, builds, coding standards, and more.
+
+- https://projects.eclipse.org/projects/rt.virgo/developer
+
+Contributor License Agreement:
+------------------------------
+
+Before your contribution can be accepted by the project, you need to create and electronically sign the Eclipse Foundation Contributor License Agreement (CLA).
+
+- http://www.eclipse.org/legal/CLA.php
+
+Contact:
+--------
+
+Contact the project developers via the project's "dev" list.
+
+- https://dev.eclipse.org/mailman/listinfo/virgo-dev
+
+Search for bugs:
+----------------
+
+This project uses Bugzilla to track ongoing development and issues.
+
+- https://bugs.eclipse.org/bugs/buglist.cgi?product=Virgo
+
+Create a new bug:
+-----------------
+
+Be sure to search for existing bugs before you create another one. Remember that contributions are always welcome!
+
+- https://bugs.eclipse.org/bugs/enter_bug.cgi?product=Virgo
\ No newline at end of file
diff --git a/util/build.gradle b/util/build.gradle
new file mode 100644
index 0000000..7694fe1
--- /dev/null
+++ b/util/build.gradle
@@ -0,0 +1,42 @@
+project(':util:org.eclipse.virgo.util.common') {
+    dependencies {
+        testCompile group: 'org.easymock', name: 'easymock', version: easymockVersion
+    }
+}
+
+project(':util:org.eclipse.virgo.util.io') {
+    dependencies {
+        compile group: "org.slf4j", name: "slf4j-api", version: slf4jVersion
+
+        compile project(':util:org.eclipse.virgo.util.common')
+        compile project(':util:org.eclipse.virgo.util.math')
+    }
+}
+
+project(':util:org.eclipse.virgo.util.jmx') {
+    dependencies {
+        compile group: "org.slf4j", name: "slf4j-api", version: slf4jVersion
+    }
+}
+
+project(':util:org.eclipse.virgo.util.osgi') {
+    dependencies {
+        testCompile group: 'org.easymock', name: 'easymock', version: easymockVersion
+
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi", version: equinoxVersion, configuration: "compile", ext: "jar"
+
+        compile project(':util:org.eclipse.virgo.util.common')
+        compile project(':util:org.eclipse.virgo.util.parser.manifest')
+    }
+}
+
+project(':util:org.eclipse.virgo.util.osgi.manifest') {
+    dependencies {
+
+        compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi", version: equinoxVersion, configuration: "compile", ext: "jar"
+
+        compile project(':util:org.eclipse.virgo.util.common')
+        compile project(':util:org.eclipse.virgo.util.io')
+        compile project(':util:org.eclipse.virgo.util.parser.manifest')
+    }
+}
diff --git a/util/org.eclipse.virgo.util.common/.springBeans b/util/org.eclipse.virgo.util.common/.springBeans
new file mode 100644
index 0000000..d079ca1
--- /dev/null
+++ b/util/org.eclipse.virgo.util.common/.springBeans
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beansProjectDescription>
+	<version>1</version>
+	<pluginVersion><![CDATA[2.2.4.RELEASE]]></pluginVersion>
+	<configSuffixes>
+		<configSuffix><![CDATA[xml]]></configSuffix>
+	</configSuffixes>
+	<enableImports><![CDATA[false]]></enableImports>
+	<configs>
+	</configs>
+	<configSets>
+	</configSets>
+</beansProjectDescription>
diff --git a/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/Assert.java b/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/Assert.java
new file mode 100644
index 0000000..9851963
--- /dev/null
+++ b/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/Assert.java
@@ -0,0 +1,233 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.common;
+
+import java.util.Collection;
+import java.util.Map;
+
+/**
+ * A set of useful assertions based on those provided by the Spring Framework's Assert class.
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ * @see org.junit.Assert
+ */
+public final class Assert {
+
+    /**
+     * Assert a boolean expression, throwing a <code>IllegalArgumentException</code> if the test result is
+     * <code>false</code>.
+     * 
+     * <pre class="code">
+     * Assert.isTrue(i &gt; 0, &quot;The value must be greater than zero&quot;);
+     * </pre>
+     * 
+     * @param expression a boolean expression
+     * @param message the exception message to use if the assertion fails
+     * @param inserts any inserts to include if the message is a format string.
+     * @throws IllegalArgumentException if expression is <code>false</code>
+     */
+    public static void isTrue(boolean expression, String message, Object... inserts) {
+    	if (!expression) {
+    		throw new IllegalArgumentException(String.format(message, inserts));
+    	}
+    }
+    
+    /**
+     * Assert a boolean expression, throwing a <code>IllegalArgumentException</code> if the test result is
+     * <code>true</code>.
+     * 
+     * <pre class="code">
+     * Assert.isFalse(state.isBroken(), &quot;The state is broken&quot;);
+     * </pre>
+     * 
+     * @param expression a boolean expression
+     * @param message the exception message to use if the assertion fails
+     * @param inserts any inserts to include if the message is a format string.
+     * @throws IllegalArgumentException if expression is <code>false</code>
+     */
+    public static void isFalse(boolean expression, String message, Object... inserts) {
+        if (expression) {
+        	throw new IllegalArgumentException(String.format(message, inserts));
+        }
+    }
+
+    /**
+     * Assert that an object is <code>null</code>.
+     * 
+     * <pre class="code">
+     * Assert.isNull(value, &quot;The value must be null&quot;);
+     * </pre>
+     * 
+     * @param object the object to check
+     * @param message the exception message to use if the assertion fails
+     * @param inserts any inserts to include if the message is a format string.
+     * @throws IllegalArgumentException if the object is not <code>null</code>
+     */
+    public static void isNull(Object object, String message, Object... inserts) {
+    	if (object != null) {
+    		throw new IllegalArgumentException(String.format(message, inserts));
+    	}
+    }
+
+    /**
+     * Assert that an object is not <code>null</code>.
+     * 
+     * <pre class="code">
+     * Assert.notNull(clazz, &quot;The class must not be null&quot;);
+     * </pre>
+     * 
+     * @param object the object to check
+     * @param message the exception message to use if the assertion fails
+     * @param inserts any inserts to include if the message is a format string.
+     * @throws IllegalArgumentException if the object is <code>null</code>
+     */
+    public static void notNull(Object object, String message, Object... inserts) {
+        if (object == null) {
+        	throw new IllegalArgumentException(String.format(message, inserts));
+        }
+    }
+
+    /**
+     * Assert that the given String is not empty; that is, it must not be <code>null</code> and not the empty String.
+     * 
+     * <pre class="code">
+     * Assert.hasLength(name, &quot;Name must not be empty&quot;);
+     * </pre>
+     * 
+     * @param text the String to check
+     * @param message the exception message to use if the assertion fails
+     * @param inserts any inserts to include if the message is a format string.
+     * @see StringUtils#hasLength
+     */
+    public static void hasLength(String text, String message, Object... inserts) {
+        if (text == null || text.length() == 0) {
+        	throw new IllegalArgumentException(String.format(message, inserts));
+        }
+    }
+
+    /**
+     * Assert that an array has elements; that is, it must not be <code>null</code> and must have at least one
+     * element.
+     * 
+     * <pre class="code">
+     * Assert.notEmpty(array, &quot;The array must have elements&quot;);
+     * </pre>
+     * 
+     * @param array the array to check
+     * @param message the exception message to use if the assertion fails
+     * @param inserts any inserts to include if the message is a format string.
+     * @throws IllegalArgumentException if the object array is <code>null</code> or has no elements
+     */
+    public static void notEmpty(Object[] array, String message, Object... inserts) {
+        if (array == null || array.length == 0) {
+            throw new IllegalArgumentException(String.format(message, inserts));
+        }
+    }
+
+    /**
+     * Assert that a collection has elements; that is, it must not be <code>null</code> and must have at least one
+     * element.
+     * 
+     * <pre class="code">
+     * Assert.notEmpty(collection, &quot;Collection must have elements&quot;);
+     * </pre>
+     * @param <T> the type of the elements of the collection
+     * 
+     * @param collection the collection to check
+     * @param message the exception message to use if the assertion fails
+     * @param inserts any inserts to include if the message is a format string.
+     * @throws IllegalArgumentException if the collection is <code>null</code> or has no elements
+     */
+    public static <T> void notEmpty(Collection<T> collection, String message, Object... inserts) {
+    	if (collection == null || collection.isEmpty()) {
+            throw new IllegalArgumentException(String.format(message, inserts));
+        }
+    }
+
+    /**
+     * Assert that a Map has entries; that is, it must not be <code>null</code> and must have at least one entry.
+     * 
+     * <pre class="code">
+     * Assert.notEmpty(map, &quot;Map must have entries&quot;);
+     * </pre>
+     * @param <K> type of Key (domain)
+     * @param <V> type of Value (range)
+     * 
+     * @param map the map to check
+     * @param message the exception message to use if the assertion fails
+     * @param inserts any inserts to include if the message is a format string.
+     * @throws IllegalArgumentException if the map is <code>null</code> or has no entries
+     */
+    public static <K, V> void notEmpty(Map<K, V> map, String message, Object... inserts) {
+        if (map == null || map.isEmpty()) {
+            throw new IllegalArgumentException(String.format(message, inserts));
+        }
+    }
+
+    /**
+     * Assert that the provided object is a non-null instance of the provided class.
+     * 
+     * <pre class="code">
+     * Assert.instanceOf(Foo.class, foo);
+     * </pre>
+     * @param <T> the type to check this for
+     * 
+     * @param type the type to check against
+     * @param obj the object to check
+     * @param message a message which will be prepended to the message produced by the function itself, and which may be
+     *        used to provide context. It should normally end in a ": " or ". " so that the function generate message
+     *        looks ok when appended to it.
+     * @param inserts any inserts to include if the message is a format string.
+     * @throws IllegalArgumentException if the object is not an instance of clazz
+     * @see Class#isInstance
+     */
+    public static <T> void isInstanceOf(Class<T> type, Object obj, String message, Object... inserts) {
+    	notNull(type, "The type to check against must not be null");
+    	if (!type.isInstance(obj)) {
+            throw new IllegalArgumentException(String.format(message, inserts) + "Object of class [" + (obj != null ? obj.getClass().getName() : "null")
+                + "] must be an instance of " + type);
+        }
+    }
+
+    /**
+     * Assert that <code>superType.isAssignableFrom(subType)</code> is <code>true</code>.
+     * 
+     * <pre class="code">
+     * Assert.isAssignable(Number.class, myClass);
+     * </pre>
+     * @param <T> the supertype
+     * @param <U> the subtype
+     * 
+     * @param superType the super type to check against
+     * @param subType the sub type to check
+     * @param message a message which will be prepended to the message produced by the function itself, and which may be
+     *        used to provide context. It should normally end in a ": " or ". " so that the function generate message
+     *        looks ok when appended to it.
+     * @param inserts any inserts to include if the message is a format string.
+     * @throws IllegalArgumentException if the classes are not assignable
+     */
+    public static <T, U> void isAssignable(Class<T> superType, Class<U> subType, String message, Object... inserts) {
+    	notNull(superType, "Type to check against must not be null");
+    	if (subType == null || !superType.isAssignableFrom(subType)) {
+    		throw new IllegalArgumentException(String.format(message, inserts) + subType + " is not assignable to " + superType);
+        }
+    }
+
+    /*
+     * Prevent instantiation - Java does not allow final abstract classes.
+     */
+    private Assert() {
+    }
+}
diff --git a/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/CaseInsensitiveMap.java b/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/CaseInsensitiveMap.java
new file mode 100644
index 0000000..a61dcd5
--- /dev/null
+++ b/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/CaseInsensitiveMap.java
@@ -0,0 +1,438 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.common;
+
+import java.util.AbstractMap;
+import java.util.AbstractSet;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * {@link CaseInsensitiveMap} is a {@link Map} from <code>String</code> keys to values which is case-insensitive and
+ * case-preserving with respect to the keys in the map.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is not necessarily thread safe.
+ * 
+ * @param <V> range type parameter
+ */
+public class CaseInsensitiveMap<V> extends AbstractMap<String, V> {
+
+    private final Map<CaseInsensitiveKey, V> map = new ConcurrentHashMap<CaseInsensitiveKey, V>();
+
+    private static final class KeySet extends AbstractSet<String> {
+
+        private static final class KeySetIterator implements Iterator<String> {
+
+            private Iterator<CaseInsensitiveKey> iterator;
+
+            public KeySetIterator(Iterator<CaseInsensitiveKey> iterator) {
+                this.iterator = iterator;
+            }
+
+            /**
+             * {@inheritDoc}
+             */
+            public boolean hasNext() {
+                return this.iterator.hasNext();
+            }
+
+            /**
+             * {@inheritDoc}
+             */
+            public String next() {
+                return this.iterator.next().toString();
+            }
+
+            /**
+             * {@inheritDoc}
+             */
+            public void remove() {
+                this.iterator.remove();
+            }
+        }
+
+        private final Set<CaseInsensitiveKey> keySet;
+
+        public KeySet(Set<CaseInsensitiveKey> keySet) {
+            this.keySet = keySet;
+        }
+
+        /**
+         * Not supported for sets returned by <code>Map.keySet</code>.
+         */
+        @Override
+        public boolean add(String o) {
+            throw new UnsupportedOperationException("Map.keySet must return a Set which does not support add");
+        }
+
+        /**
+         * Not supported for sets returned by <code>Map.keySet</code>.
+         */
+        @Override
+        public boolean addAll(Collection<? extends String> c) {
+            throw new UnsupportedOperationException("Map.keySet must return a Set which does not support addAll");
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public void clear() {
+            this.keySet.clear();
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public boolean contains(Object o) {
+            return o instanceof String ? this.keySet.contains(CaseInsensitiveKey.objectToKey(o)) : false;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public Iterator<String> iterator() {
+            return new KeySetIterator(this.keySet.iterator());
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public boolean remove(Object o) {
+            // The following can throw ClassCastException which conforms to the method specification.
+            return this.keySet.remove(CaseInsensitiveKey.objectToKey(o));
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public int size() {
+            return this.keySet.size();
+        }
+
+    }
+
+    private static final class EntrySet<V> extends AbstractSet<Entry<String, V>> {
+
+        private static final class MapEntry<V> implements Entry<String, V> {
+
+            private final Entry<CaseInsensitiveMap.CaseInsensitiveKey, V> entry;
+
+            public MapEntry(Entry<CaseInsensitiveMap.CaseInsensitiveKey, V> entry) {
+                this.entry = entry;
+            }
+
+            /**
+             * {@inheritDoc}
+             */
+            public String getKey() {
+                return this.entry.getKey().toString();
+            }
+
+            /**
+             * {@inheritDoc}
+             */
+            public V getValue() {
+                return this.entry.getValue();
+            }
+
+            /**
+             * {@inheritDoc}
+             */
+            public V setValue(V value) {
+                return this.entry.setValue(value);
+            }
+
+            /**
+             * Get the underlying {@link Map.Entry}.
+             * 
+             * @return the underlying <code>Entry</code>
+             */
+            public Entry<CaseInsensitiveMap.CaseInsensitiveKey, V> getEntry() {
+                return this.entry;
+            }
+        }
+
+        private static final class EntrySetIterator<V> implements Iterator<Entry<String, V>> {
+
+            private final Iterator<Entry<CaseInsensitiveKey, V>> iterator;
+
+            public EntrySetIterator(Iterator<Entry<CaseInsensitiveKey, V>> iterator) {
+                this.iterator = iterator;
+            }
+
+            /**
+             * {@inheritDoc}
+             */
+            public boolean hasNext() {
+                return this.iterator.hasNext();
+            }
+
+            /**
+             * {@inheritDoc}
+             */
+            public Entry<String, V> next() {
+                return new MapEntry<V>(this.iterator.next());
+            }
+
+            /**
+             * {@inheritDoc}
+             */
+            public void remove() {
+                this.iterator.remove();
+            }
+        }
+
+        private final Set<Entry<CaseInsensitiveKey, V>> entrySet;
+        
+        private final  CaseInsensitiveMap<V> map;
+
+        public EntrySet(Set<Entry<CaseInsensitiveKey, V>> entrySet, CaseInsensitiveMap<V> map) {
+            this.entrySet = entrySet;
+            this.map = map;
+        }
+
+        /**
+         * Not supported for sets returned by <code>Map.entrySet</code>.
+         */
+        @Override
+        public boolean add(Entry<String, V> o) {
+            throw new UnsupportedOperationException("Map.entrySet must return a Set which does not support add");
+        }
+
+        /**
+         * Not supported for sets returned by <code>Map.entrySet</code>.
+         */
+        @Override
+        public boolean addAll(Collection<? extends Entry<String, V>> c) {
+            throw new UnsupportedOperationException("Map.entrySet must return a Set which does not support addAll");
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public void clear() {
+            this.entrySet.clear();
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @SuppressWarnings("unchecked")
+        @Override
+        public boolean contains(Object o) {
+            if (o instanceof Entry) {
+                Entry<String, V> e = (Entry<String, V>) o;
+                V value = this.map.get(e.getKey());
+                return value.equals(e.getValue());
+            }
+            return false;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public Iterator<Entry<String, V>> iterator() {
+            return new EntrySetIterator<V>(this.entrySet.iterator());
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @SuppressWarnings("unchecked")
+        @Override
+        public boolean remove(Object o) {
+            try {
+                return this.entrySet.remove(((MapEntry<V>) o).getEntry());
+            } catch (ClassCastException e) {
+            }
+            return false;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public int size() {
+            return this.entrySet.size();
+        }
+
+    }
+
+    static final class CaseInsensitiveKey {
+
+        private final String key;
+
+        private CaseInsensitiveKey(String key) {
+            this.key = key;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public int hashCode() {
+            final int prime = 31;
+            int result = 1;
+            result = prime * result + key.toLowerCase().hashCode();
+            return result;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public boolean equals(Object obj) {
+            if (this == obj) {
+                return true;
+            }
+            if (obj == null) {
+                return false;
+            }
+            if (getClass() != obj.getClass()) {
+                return false;
+            }
+            CaseInsensitiveKey other = (CaseInsensitiveKey) obj;
+            if (key == null) {
+                if (other.key != null) {
+                    return false;
+                }
+            } else if (!key.equalsIgnoreCase(other.key)) {
+                return false;
+            }
+            return true;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public String toString() {
+            return key;
+        }
+
+        /**
+         * Convert the given key <code>Object</code> to a {@link CaseInsensitiveKey}.
+         * <p/>
+         * Pre-condition: <code>key</code> instanceof <code>String</code>
+         * 
+         * @param key the key to be converted
+         * @return the <code>CaseInsensitiveKey</code> corresponding to the given key
+         */
+        public static CaseInsensitiveKey objectToKey(Object key) {
+            return new CaseInsensitiveKey((String) key);
+        }
+
+    }
+
+    public CaseInsensitiveMap() {
+    }
+
+    public CaseInsensitiveMap(CaseInsensitiveMap<? extends V> map) {
+        this.map.putAll(map.map);
+    }
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void clear() {
+        this.map.clear();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean containsKey(Object key) {
+        return key instanceof String ? this.map.containsKey(CaseInsensitiveKey.objectToKey(key)) : false;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean containsValue(Object value) {
+        return this.map.containsValue(value);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Set<Entry<String, V>> entrySet() {
+        return new EntrySet<V>(this.map.entrySet(), this);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public V get(Object key) {
+        return key instanceof String ? this.map.get(CaseInsensitiveKey.objectToKey(key)) : null;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Set<String> keySet() {
+        return new KeySet(this.map.keySet());
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public V put(String key, V value) {
+        if (key == null) {
+            throw new NullPointerException("CaseInsensitiveMap does not permit null keys");
+        }
+        return this.map.put(CaseInsensitiveKey.objectToKey(key), value);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public V remove(Object key) {
+        return key instanceof String ? this.map.remove(CaseInsensitiveKey.objectToKey(key)) : null;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int size() {
+        return this.map.size();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Collection<V> values() {
+        return this.map.values();
+    }
+
+}
diff --git a/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/CollectionUtils.java b/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/CollectionUtils.java
new file mode 100644
index 0000000..b9083a4
--- /dev/null
+++ b/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/CollectionUtils.java
@@ -0,0 +1,266 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.common;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+/**
+ * Miscellaneous collection utility methods.
+ *
+ */
+public abstract class CollectionUtils {
+
+	/**
+	 * Return <code>true</code> if the supplied Collection is <code>null</code>
+	 * or empty. Otherwise, return <code>false</code>.
+	 * @param collection the Collection to check
+	 * @return whether the given Collection is empty
+	 */
+	public static boolean isEmpty(Collection<?> collection) {
+		return (collection == null || collection.isEmpty());
+	}
+
+	/**
+	 * Return <code>true</code> if the supplied Map is <code>null</code>
+	 * or empty. Otherwise, return <code>false</code>.
+	 * @param map the Map to check
+	 * @return whether the given Map is empty
+	 */
+	public static boolean isEmpty(Map<?,?> map) {
+		return (map == null || map.isEmpty());
+	}
+
+	/**
+	 * Convert the supplied array into a List. 
+	 * <p>A <code>null</code> source value will be converted to an
+	 * empty List.
+	 * @param <T> the type of elements of the list
+	 * @param source the array
+	 * @return the converted List result
+	 * @see ObjectUtils#toObjectArray(Object)
+	 */
+	public static <T> List<T> arrayToList(T[] source) {
+		return Arrays.asList(source);
+	}
+
+	/**
+	 * Merge the given array into the given Collection.
+	 * @param <T> type of elements of array
+	 * @param array the array to merge (may be <code>null</code>)
+	 * @param collection the target Collection to merge the array into
+	 */
+	public static <T> void mergeArrayIntoCollection(T[] array, Collection<T> collection) {
+		if (collection == null) {
+			throw new IllegalArgumentException("Collection must not be null");
+		}
+		for (int i = 0; i < array.length; i++) {
+			collection.add(array[i]);
+		}
+	}
+
+	/**
+	 * Merge the given Properties instance into the given Map,
+	 * copying all properties (key-value pairs) over.
+	 * <p>Uses <code>Properties.propertyNames()</code> to even catch
+	 * default properties linked into the original Properties instance.
+	 * @param props the Properties instance to merge (may be <code>null</code>)
+	 * @param map the target Map to merge the properties into
+	 */
+	public static void mergePropertiesIntoMap(Properties props, Map<? super String, ? super String> map) {
+		if (map == null) {
+			throw new IllegalArgumentException("Map must not be null");
+		}
+		if (props != null) {
+			for (Enumeration<?> en = props.propertyNames(); en.hasMoreElements();) {
+				String key = (String) en.nextElement();
+				map.put(key, props.getProperty(key));
+			}
+		}
+	}
+
+
+	/**
+	 * Check whether the given Iterator contains the given element.
+	 * @param iterator the Iterator to check
+	 * @param element the element to look for
+	 * @return <code>true</code> if found, <code>false</code> else
+	 */
+	public static boolean contains(Iterator<?> iterator, Object element) {
+		if (iterator != null) {
+			while (iterator.hasNext()) {
+				Object candidate = iterator.next();
+				if (ObjectUtils.nullSafeEquals(candidate, element)) {
+					return true;
+				}
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * Check whether the given Enumeration contains the given element.
+	 * @param enumeration the Enumeration to check
+	 * @param element the element to look for
+	 * @return <code>true</code> if found, <code>false</code> else
+	 */
+	public static boolean contains(Enumeration<?> enumeration, Object element) {
+		if (enumeration != null) {
+			while (enumeration.hasMoreElements()) {
+				Object candidate = enumeration.nextElement();
+				if (ObjectUtils.nullSafeEquals(candidate, element)) {
+					return true;
+				}
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * Check whether the given Collection contains the given element instance.
+	 * <p>Enforces the given instance to be present, rather than returning
+	 * <code>true</code> for an equal element as well.
+	 * @param collection the Collection to check
+	 * @param element the element to look for
+	 * @return <code>true</code> if found, <code>false</code> else
+	 */
+	public static boolean containsInstance(Collection<?> collection, Object element) {
+		if (collection != null) {
+			for (Iterator<?> it = collection.iterator(); it.hasNext();) {
+				Object candidate = it.next();
+				if (candidate == element) {
+					return true;
+				}
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * Return <code>true</code> if any element in '<code>candidates</code>' is
+	 * contained in '<code>source</code>'; otherwise returns <code>false</code>.
+	 * @param source the source Collection
+	 * @param candidates the candidates to search for
+	 * @return whether any of the candidates has been found
+	 */
+	public static boolean containsAny(Collection<?> source, Collection<?> candidates) {
+		if (isEmpty(source) || isEmpty(candidates)) {
+			return false;
+		}
+		for (Iterator<?> it = candidates.iterator(); it.hasNext();) {
+			if (source.contains(it.next())) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * Return the first element in '<code>candidates</code>' that is contained in
+	 * '<code>source</code>'. If no element in '<code>candidates</code>' is present in
+	 * '<code>source</code>' returns <code>null</code>. Iteration order is
+	 * {@link Collection} implementation specific.
+	 * @param source the source Collection
+	 * @param candidates the candidates to search for
+	 * @return the first present object, or <code>null</code> if not found
+	 */
+	public static Object findFirstMatch(Collection<?> source, Collection<?> candidates) {
+		if (isEmpty(source) || isEmpty(candidates)) {
+			return null;
+		}
+		for (Iterator<?> it = candidates.iterator(); it.hasNext();) {
+			Object candidate = it.next();
+			if (source.contains(candidate)) {
+				return candidate;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Find a single value of the given type in the given Collection.
+	 * @param collection the Collection to search
+	 * @param type the type to look for
+	 * @return a value of the given type found if there is a clear match,
+	 * or <code>null</code> if none or more than one such value found
+	 */
+	public static Object findValueOfType(Collection<?> collection, Class<?> type) {
+		if (isEmpty(collection)) {
+			return null;
+		}
+		Object value = null;
+		for (Iterator<?> it = collection.iterator(); it.hasNext();) {
+			Object obj = it.next();
+			if (type == null || type.isInstance(obj)) {
+				if (value != null) {
+					// More than one value found... no clear single value.
+					return null;
+				}
+				value = obj;
+			}
+		}
+		return value;
+	}
+
+	/**
+	 * Find a single value of one of the given types in the given Collection:
+	 * searching the Collection for a value of the first type, then
+	 * searching for a value of the second type, etc.
+	 * @param collection the collection to search
+	 * @param types the types to look for, in prioritized order
+	 * @return a value of one of the given types found if there is a clear match,
+	 * or <code>null</code> if none or more than one such value found
+	 */
+	public static Object findValueOfType(Collection<?> collection, Class<?>[] types) {
+		if (isEmpty(collection) || ObjectUtils.isEmpty(types)) {
+			return null;
+		}
+		for (int i = 0; i < types.length; i++) {
+			Object value = findValueOfType(collection, types[i]);
+			if (value != null) {
+				return value;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Determine whether the given Collection only contains a single unique object.
+	 * @param collection the Collection to check
+	 * @return <code>true</code> if the collection contains a single reference or
+	 * multiple references to the same instance, <code>false</code> else
+	 */
+	public static boolean hasUniqueObject(Collection<?> collection) {
+		if (isEmpty(collection)) {
+			return false;
+		}
+		boolean hasCandidate = false;
+		Object candidate = null;
+		for (Iterator<?> it = collection.iterator(); it.hasNext();) {
+			Object elem = it.next();
+			if (!hasCandidate) {
+				hasCandidate = true;
+				candidate = elem;
+			}
+			else if (candidate != elem) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+}
diff --git a/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/DirectedAcyclicGraph.java b/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/DirectedAcyclicGraph.java
new file mode 100644
index 0000000..7bec6d7
--- /dev/null
+++ b/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/DirectedAcyclicGraph.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution (Tree.java)
+ *   EclipseSource - reworked from generic tree to DAG (Bug 358697)
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.common;
+
+import java.util.List;
+
+/**
+ * {@link DirectedAcyclicGraph} is a set of {@link GraphNode}s with a parent child relationship. The nodes are connected
+ * to each other in a way that it is impossible to start at a node n and follow a child relationship that loops back to
+ * n. The DAG may have multiple root nodes (nodes with no parents) and nodes may share children.
+ * <p />
+ * Once created a root node can become a non-root node by adding the node as a child to another node. This can be done
+ * by calling the method addChild on a node. All nodes of a DAG are reachable from its root nodes.
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations of this interface may or may not be thread safe.
+ * 
+ * @param <V> type of values in the {@link GraphNode}s.
+ */
+public interface DirectedAcyclicGraph<V> {
+
+    /**
+     * Create a new {@link GraphNode} and add it to this {@link DirectedAcyclicGraph}'s root nodes. The value is not
+     * copied.
+     * 
+     * @param value of the node to create
+     * @return a node with the given value
+     */
+    GraphNode<V> createRootNode(V value);
+
+    /**
+     * Removes the occurrence of the given {@link GraphNode} from this {@link DirectedAcyclicGraph}'s root nodes.
+     * Returns <code>true</code> if the node was found and removed, otherwise <code>false</code>.
+     * 
+     * <strong>Note</strong>: Removal is only allowed if the root node has no children.
+     * 
+     * @param node the node to remove
+     * @throws IllegalArgumentException if the given node is not a root node (the node has one or more parents)
+     * @throws IllegalArgumentException if the given node has children
+     * @throws IllegalArgumentException if the given node does not belong to the same {@link DirectedAcyclicGraph}.
+     * @return <code>true</code> if the node was removed successfully, otherwise <code>false</code>.
+     * @see java.util.List#remove
+     */
+    boolean deleteRootNode(GraphNode<V> node);
+
+    /**
+     * Returns a list of this {@link DirectedAcyclicGraph}'s root nodes (not copies of the nodes). If the graph has no
+     * root nodes (and is therefore empty), returns an empty list. Never returns <code>null</code>.
+     * 
+     * @return this graph's root nodes
+     */
+    List<GraphNode<V>> getRootNodes();
+
+}
diff --git a/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/GraphNode.java b/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/GraphNode.java
new file mode 100644
index 0000000..eefb865
--- /dev/null
+++ b/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/GraphNode.java
@@ -0,0 +1,171 @@
+/*******************************************************************************
+ * Copyright (c) 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution (Tree.java)
+ *   EclipseSource - reworked from generic tree to DAG (Bug 358697)
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.common;
+
+import java.util.List;
+
+/**
+ * {@link GraphNode} is a node in a {@link DirectedAcyclicGraph}. Each node has a value.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations of this interface may or may not be thread safe.
+ * 
+ * @param <V> type of values in the graph nodes.
+ */
+public interface GraphNode<V> {
+
+    /**
+     * {@link DirectedAcyclicGraphVisitor} is used to visit a node and, at the option of the visitor, its subgraphs
+     * recursively. <strong>Note</strong>: Shared nodes are only visited once.
+     * <p />
+     * 
+     * <strong>Concurrent Semantics</strong><br />
+     * 
+     * Implementations of this interface should be thread safe when used with a thread safe
+     * <code>DirectedAcyclicGraph</code> implementation.
+     * 
+     * @param <V> type of values in graph nodes
+     */
+    interface DirectedAcyclicGraphVisitor<V> {
+
+        /**
+         * Visits the given {@link GraphNode}. The return value determines whether or not any subgraphs of the given
+         * node are visited.
+         * 
+         * @param node the <code>GraphNode</code> to be visited
+         * @return <code>true</code> if and only if the subgraphs of the given node should be visited.
+         */
+        boolean visit(GraphNode<V> node);
+
+    }
+
+    /**
+     * An <code>ExceptionThrowingDirectedAcyclicGraphVisitor</code> is used to visit a node and, at the option of the
+     * visitor, its subgraphs recursively if the {@link #visit(GraphNode)} implementation needs to be able to throw a
+     * checked {@link Exception}. <strong>Note</strong>: Shared nodes are only visited once.
+     * <p />
+     * 
+     * <strong>Concurrent Semantics</strong><br />
+     * 
+     * Implementations of this interface should be thread safe when used with a thread safe
+     * <code>DirectedAcyclicGraph</code> implementation.
+     * 
+     * @param <V> type of values in graph nodes
+     * @param <E> type of exceptions possibly thrown
+     */
+    interface ExceptionThrowingDirectedAcyclicGraphVisitor<V, E extends Exception> {
+
+        /**
+         * Visits the given {@link GraphNode}. The return value determines whether or not any subgraphs of the given
+         * node are visited.
+         * 
+         * @param node the <code>GraphNode</code> to be visited
+         * @throws E if an error occurs when visiting the given node
+         * @return <code>true</code> if and only if the subgraphs of the given node should be visited.
+         */
+        boolean visit(GraphNode<V> node) throws E;
+
+    }
+
+    /**
+     * Returns the node's value. If there is no value associated with this node, returns <code>null</code>.
+     * 
+     * @return the value, which may be <code>null</code>
+     */
+    V getValue();
+
+    /**
+     * Returns a list of this node's children (not copies of the children). If the node has no children, returns an
+     * empty list. Never returns <code>null</code> .
+     * 
+     * @return this node's children
+     */
+    List<GraphNode<V>> getChildren();
+
+    /**
+     * Adds the given node as child to this node. The child node is <strong>not</strong> copied.
+     * 
+     * @param child the node to add
+     * @throws IllegalArgumentException if the given node does not belong to the same {@link DirectedAcyclicGraph}.
+     * @throws IllegalArgumentException if the given node is already a child of this node.
+     */
+    void addChild(GraphNode<V> child);
+
+    /**
+     * Removes the occurrence of the given node from this node's children. Returns <code>true</code> if the child was
+     * found and removed, otherwise <code>false</code>.
+     * 
+     * @param child the node to remove
+     * @throws IllegalArgumentException if the given node does not belong to the same {@link DirectedAcyclicGraph}.
+     * @return <code>true</code> if the node was removed successfully, otherwise <code>false</code>.
+     * @see java.util.List#remove
+     */
+    boolean removeChild(GraphNode<V> child);
+
+    /**
+     * Returns a list of this node's parents (not copies of the parents). If this node does not have any parents,
+     * returns an empty list. Never returns <code>null</code>.
+     * 
+     * @return this node's parents
+     */
+    List<GraphNode<V>> getParents();
+
+    /**
+     * Traverse this {@link GraphNode} in preorder (see below) and call the visit method of the given
+     * {@link DirectedAcyclicGraphVisitor} at each node. The visitor determines whether the subgraphs of each visited
+     * node should also be visited. <strong>Note</strong>: Shared nodes are only visited once.
+     * <p/>
+     * Preorder traversal visits the node and then visits, in preorder, each subgraph of the node.
+     * 
+     * @param visitor a {@link DirectedAcyclicGraphVisitor}
+     */
+    void visit(DirectedAcyclicGraphVisitor<V> visitor);
+
+    /**
+     * Traverse this {@link GraphNode} in preorder (see below) and call the visit method of the given
+     * {@link ExceptionThrowingDirectedAcyclicGraphVisitor} at each node. The visitor determines whether the subgraph of
+     * each visited node should also be visited. <strong>Note</strong>: Shared nodes are only visited once.
+     * <p/>
+     * Preorder traversal visits the node and then visits, in preorder, each subgraph of the node.
+     * 
+     * @param <E> type of exception possibly thrown
+     * @param visitor a {@link ExceptionThrowingDirectedAcyclicGraphVisitor}
+     * @throws E if an error occurs when visiting the node
+     */
+    <E extends Exception> void visit(ExceptionThrowingDirectedAcyclicGraphVisitor<V, E> visitor) throws E;
+
+    /**
+     * Returns the number of nodes in the subgraph of this node. The subgraph includes the node itself as the only root
+     * node.
+     * 
+     * <p />
+     * <strong>Note</strong>: Nodes may be shared and shared nodes are counted only once.
+     * 
+     * <p />
+     * If there are more than <tt>Integer.MAX_VALUE</tt> nodes, the return value is undefined and the user should seek
+     * professional help.
+     * 
+     * @return the number of nodes in the subgraph
+     */
+    int size();
+
+    /**
+     * Check if this node is a root node (a node without parents).
+     * 
+     * @return <code>true</code> if the node has no parents. Otherwise <code>false</code>.
+     */
+    boolean isRootNode();
+
+}
diff --git a/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/IterableEnumeration.java b/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/IterableEnumeration.java
new file mode 100644
index 0000000..17219fc
--- /dev/null
+++ b/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/IterableEnumeration.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.common;
+
+import java.util.Enumeration;
+import java.util.Iterator;
+
+/**
+ * An <code>IterableEnumeration</code> wraps an {@link Enumeration} in an
+ * implementation of {@link Iterable} thereby allowing the <code>Enumeration</code>
+ * to be used in a for-each loop.
+ * <p/>
+ * 
+ * <pre>
+ * Enumeration<Foo> enumeration = ...
+ * IterableEnumeration<Foo> foos = new IterableEnumeration<Foo>(enumeration);
+ * 
+ * for (Foo foo : foos) {
+ *     // Do something with foo
+ * }
+ * </pre>
+ * 
+ * <p/>
+ * <strong>Note:</strong> as <code>Enumerations</code> do not support entry removal
+ * the {@link Iterator} returned by {@link #iterator()} does not support the optional
+ * {@link Iterator#remove() remove} method: invocation of the method will result in an
+ * {@link UnsupportedOperationException} being thrown.
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * This class is <strong>not</strong> thread-safe.
+ * @param <T> the element type of the enumeration
+ * 
+ */
+public class IterableEnumeration<T> implements Iterable<T> {
+    
+    private final Iterator<T> iterator;
+    
+    /**
+     * Creates a new <code>IterableEnumeration</code> backed by the supplied <code>Enumeration</code>
+     * @param enumeration The <code>Enumeration</code> to be made iterable.
+     */
+    public IterableEnumeration(Enumeration<T> enumeration) {
+        this.iterator = new EnumerationIterator<T>(enumeration);
+    }
+
+    /**
+     * Returns the <code>Enumeration</code>-backed <code>Iterator</code>.
+     * <p/>
+     * <strong>Note:</strong> as <code>Enumerations</code> do not support entry removal
+     * the returned {@link Iterator} does not support the optional
+     * {@link Iterator#remove() remove} method: invocation of the method will result in an
+     * {@link UnsupportedOperationException} being thrown.
+     */
+    public Iterator<T> iterator() {
+        return iterator;
+    }
+    
+    private class EnumerationIterator<E> implements Iterator<E> {
+        
+        private final Enumeration<E> enumeration;
+        
+        private EnumerationIterator(Enumeration<E> enumeration) {
+            this.enumeration = enumeration;
+        }
+
+        public boolean hasNext() {
+            return this.enumeration.hasMoreElements();
+        }
+
+        public E next() {
+            return this.enumeration.nextElement();
+        }
+
+        public void remove() {
+            throw new UnsupportedOperationException();
+            
+        }       
+    }
+}
diff --git a/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/IteratorToEnumerationAdapter.java b/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/IteratorToEnumerationAdapter.java
new file mode 100644
index 0000000..c9424af
--- /dev/null
+++ b/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/IteratorToEnumerationAdapter.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2012 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.common;
+
+import java.util.Enumeration;
+import java.util.Iterator;
+
+/**
+ * {@link IteratorToEnumerationAdapter} adapts an {@link Iterator} to conform to the {@link Enumeration} interface.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread safe.
+ */
+public class IteratorToEnumerationAdapter<T> implements Enumeration<T> {
+
+    private final Iterator<T> iterator;
+
+    public IteratorToEnumerationAdapter(Iterator<T> iterator) {
+        this.iterator = iterator;
+    }
+
+    @Override
+    public boolean hasMoreElements() {
+        return iterator.hasNext();
+    }
+
+    @Override
+    public T nextElement() {
+        return iterator.next();
+    }
+
+}
diff --git a/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/MapToDictionaryAdapter.java b/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/MapToDictionaryAdapter.java
new file mode 100644
index 0000000..85216f6
--- /dev/null
+++ b/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/MapToDictionaryAdapter.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2012 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.common;
+
+import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.Map;
+
+/**
+ * {@link MapToDictionaryAdapter} adapts a {@link Map} instance to conform to the {@link Dictionary} interface.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread safe.
+ */
+public class MapToDictionaryAdapter<K, V> extends Dictionary<K, V> {
+    
+    private final Map<K, V> map;
+
+    public MapToDictionaryAdapter(Map<K, V> map) {
+        this.map = map;
+    }
+
+    @Override
+    public int size() {
+        return map.size();
+    }
+
+    @Override
+    public boolean isEmpty() {
+        return map.isEmpty();
+    }
+
+    @Override
+    public Enumeration<K> keys() {
+        return new IteratorToEnumerationAdapter<K>(map.keySet().iterator());
+    }
+
+    @Override
+    public Enumeration<V> elements() {
+        return new IteratorToEnumerationAdapter<V>(map.values().iterator());
+    }
+
+    @Override
+    public V get(Object key) {
+        return this.map.get(key);
+    }
+
+    @Override
+    public V put(K key, V value) {
+        return this.map.put(key, value);
+    }
+
+    @Override
+    public V remove(Object key) {
+        return this.map.remove(key);
+    }
+
+}
diff --git a/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/ObjectUtils.java b/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/ObjectUtils.java
new file mode 100644
index 0000000..63927e8
--- /dev/null
+++ b/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/ObjectUtils.java
@@ -0,0 +1,847 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.common;
+
+import java.lang.reflect.Array;
+import java.util.Arrays;
+
+/**
+ * Miscellaneous object utility methods. 
+ *
+ */
+public abstract class ObjectUtils {
+
+	private static final int INITIAL_HASH = 7;
+	private static final int MULTIPLIER = 31;
+
+	private static final String EMPTY_STRING = "";
+	private static final String NULL_STRING = "null";
+	private static final String ARRAY_START = "{";
+	private static final String ARRAY_END = "}";
+	private static final String EMPTY_ARRAY = ARRAY_START + ARRAY_END;
+	private static final String ARRAY_ELEMENT_SEPARATOR = ", ";
+
+
+	/**
+	 * Return whether the given throwable is a checked exception:
+	 * that is, neither a RuntimeException nor an Error.
+	 * @param ex the throwable to check
+	 * @return whether the throwable is a checked exception
+	 * @see java.lang.Exception
+	 * @see java.lang.RuntimeException
+	 * @see java.lang.Error
+	 */
+	public static boolean isCheckedException(Throwable ex) {
+		return !(ex instanceof RuntimeException || ex instanceof Error);
+	}
+
+	/**
+	 * Check whether the given exception is compatible with the exceptions
+	 * declared in a throws clause.
+	 * @param ex the exception to checked
+	 * @param declaredExceptions the exceptions declared in the throws clause
+	 * @return whether the given exception is compatible
+	 */
+	public static boolean isCompatibleWithThrowsClause(Throwable ex, Class<? extends Throwable>[] declaredExceptions) {
+		if (!isCheckedException(ex)) {
+			return true;
+		}
+		if (declaredExceptions != null) {
+			for (int i = 0; i < declaredExceptions.length; i++) {
+				if (declaredExceptions[i].isAssignableFrom(ex.getClass())) {
+					return true;
+				}
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * Return whether the given array is empty: that is, <code>null</code>
+	 * or of zero length.
+	 * @param array the array to check
+	 * @return whether the given array is empty
+	 */
+	public static boolean isEmpty(Object[] array) {
+		return (array == null || array.length == 0);
+	}
+
+	/**
+	 * Check whether the given array contains the given element.
+	 * @param array the array to check (may be <code>null</code>,
+	 * in which case the return value will always be <code>false</code>)
+	 * @param element the element to check for
+	 * @return whether the element has been found in the given array
+	 */
+	public static boolean containsElement(Object[] array, Object element) {
+		if (array == null) {
+			return false;
+		}
+		for (int i = 0; i < array.length; i++) {
+			if (nullSafeEquals(array[i], element)) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * Append the given Object to the given array, returning a new array
+	 * consisting of the input array contents plus the given Object.
+	 * @param array the array to append to (can be <code>null</code>)
+	 * @param obj the Object to append
+	 * @return the new array (of the same component type; never <code>null</code>)
+	 */
+	public static Object[] addObjectToArray(Object[] array, Object obj) {
+		Class<?> compType = Object.class;
+		if (array != null) {
+			compType = array.getClass().getComponentType();
+		}
+		else if (obj != null) {
+			compType = obj.getClass();
+		}
+		int newArrLength = (array != null ? array.length + 1 : 1);
+		Object[] newArr = (Object[]) Array.newInstance(compType, newArrLength);
+		if (array != null) {
+			System.arraycopy(array, 0, newArr, 0, array.length);
+		}
+		newArr[newArr.length - 1] = obj;
+		return newArr;
+	}
+
+	/**
+	 * Convert the given array (which may be a primitive array) to an
+	 * object array (if necessary of primitive wrapper objects).
+	 * <p>A <code>null</code> source value will be converted to an
+	 * empty Object array.
+	 * @param source the (potentially primitive) array
+	 * @return the corresponding object array (never <code>null</code>)
+	 * @throws IllegalArgumentException if the parameter is not an array
+	 */
+	public static Object[] toObjectArray(Object source) {
+		if (source instanceof Object[]) {
+			return (Object[]) source;
+		}
+		if (source == null) {
+			return new Object[0];
+		}
+		if (!source.getClass().isArray()) {
+			throw new IllegalArgumentException("Source is not an array: " + source);
+		}
+		int length = Array.getLength(source);
+		if (length == 0) {
+			return new Object[0];
+		}
+		Class<?> wrapperType = Array.get(source, 0).getClass();
+		Object[] newArray = (Object[]) Array.newInstance(wrapperType, length);
+		for (int i = 0; i < length; i++) {
+			newArray[i] = Array.get(source, i);
+		}
+		return newArray;
+	}
+
+
+	//---------------------------------------------------------------------
+	// Convenience methods for content-based equality/hash-code handling
+	//---------------------------------------------------------------------
+
+	/**
+	 * Determine if the given objects are equal, returning <code>true</code>
+	 * if both are <code>null</code> or <code>false</code> if only one is
+	 * <code>null</code>.
+	 * <p>Compares arrays with <code>Arrays.equals</code>, performing an equality
+	 * check based on the array elements rather than the array reference.
+	 * @param o1 first Object to compare
+	 * @param o2 second Object to compare
+	 * @return whether the given objects are equal
+	 * @see java.util.Arrays#equals
+	 */
+	public static boolean nullSafeEquals(Object o1, Object o2) {
+		if (o1 == o2) {
+			return true;
+		}
+		if (o1 == null || o2 == null) {
+			return false;
+		}
+		if (o1.equals(o2)) {
+			return true;
+		}
+		if (o1.getClass().isArray() && o2.getClass().isArray()) {
+			if (o1 instanceof Object[] && o2 instanceof Object[]) {
+				return Arrays.equals((Object[]) o1, (Object[]) o2);
+			}
+			if (o1 instanceof boolean[] && o2 instanceof boolean[]) {
+				return Arrays.equals((boolean[]) o1, (boolean[]) o2);
+			}
+			if (o1 instanceof byte[] && o2 instanceof byte[]) {
+				return Arrays.equals((byte[]) o1, (byte[]) o2);
+			}
+			if (o1 instanceof char[] && o2 instanceof char[]) {
+				return Arrays.equals((char[]) o1, (char[]) o2);
+			}
+			if (o1 instanceof double[] && o2 instanceof double[]) {
+				return Arrays.equals((double[]) o1, (double[]) o2);
+			}
+			if (o1 instanceof float[] && o2 instanceof float[]) {
+				return Arrays.equals((float[]) o1, (float[]) o2);
+			}
+			if (o1 instanceof int[] && o2 instanceof int[]) {
+				return Arrays.equals((int[]) o1, (int[]) o2);
+			}
+			if (o1 instanceof long[] && o2 instanceof long[]) {
+				return Arrays.equals((long[]) o1, (long[]) o2);
+			}
+			if (o1 instanceof short[] && o2 instanceof short[]) {
+				return Arrays.equals((short[]) o1, (short[]) o2);
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * Return as hash code for the given object; typically the value of
+	 * <code>{@link Object#hashCode()}</code>. If the object is an array,
+	 * this method will delegate to any of the <code>nullSafeHashCode</code>
+	 * methods for arrays in this class. If the object is <code>null</code>,
+	 * this method returns 0.
+	 * @param obj object
+	 * @return hash code
+	 * @see #nullSafeHashCode(Object[])
+	 * @see #nullSafeHashCode(boolean[])
+	 * @see #nullSafeHashCode(byte[])
+	 * @see #nullSafeHashCode(char[])
+	 * @see #nullSafeHashCode(double[])
+	 * @see #nullSafeHashCode(float[])
+	 * @see #nullSafeHashCode(int[])
+	 * @see #nullSafeHashCode(long[])
+	 * @see #nullSafeHashCode(short[])
+	 */
+	public static int nullSafeHashCode(Object obj) {
+		if (obj == null) {
+			return 0;
+		}
+		if (obj.getClass().isArray()) {
+			if (obj instanceof Object[]) {
+				return nullSafeHashCode((Object[]) obj);
+			}
+			if (obj instanceof boolean[]) {
+				return nullSafeHashCode((boolean[]) obj);
+			}
+			if (obj instanceof byte[]) {
+				return nullSafeHashCode((byte[]) obj);
+			}
+			if (obj instanceof char[]) {
+				return nullSafeHashCode((char[]) obj);
+			}
+			if (obj instanceof double[]) {
+				return nullSafeHashCode((double[]) obj);
+			}
+			if (obj instanceof float[]) {
+				return nullSafeHashCode((float[]) obj);
+			}
+			if (obj instanceof int[]) {
+				return nullSafeHashCode((int[]) obj);
+			}
+			if (obj instanceof long[]) {
+				return nullSafeHashCode((long[]) obj);
+			}
+			if (obj instanceof short[]) {
+				return nullSafeHashCode((short[]) obj);
+			}
+		}
+		return obj.hashCode();
+	}
+
+	/**
+	 * Return a hash code based on the contents of the specified array.
+	 * If <code>array</code> is <code>null</code>, this method returns 0.
+	 * @param array of objects
+	 * @return hash code
+	 */
+	public static int nullSafeHashCode(Object[] array) {
+		if (array == null) {
+			return 0;
+		}
+		int hash = INITIAL_HASH;
+		int arraySize = array.length;
+		for (int i = 0; i < arraySize; i++) {
+			hash = MULTIPLIER * hash + nullSafeHashCode(array[i]);
+		}
+		return hash;
+	}
+
+	/**
+	 * Return a hash code based on the contents of the specified array.
+	 * If <code>array</code> is <code>null</code>, this method returns 0.
+	 * @param array of booleans
+	 * @return hash code
+	 */
+	public static int nullSafeHashCode(boolean[] array) {
+		if (array == null) {
+			return 0;
+		}
+		int hash = INITIAL_HASH;
+		int arraySize = array.length;
+		for (int i = 0; i < arraySize; i++) {
+			hash = MULTIPLIER * hash + hashCode(array[i]);
+		}
+		return hash;
+	}
+
+	/**
+	 * Return a hash code based on the contents of the specified array.
+	 * If <code>array</code> is <code>null</code>, this method returns 0.
+	 * @param array of bytes
+	 * @return hash code
+	 */
+	public static int nullSafeHashCode(byte[] array) {
+		if (array == null) {
+			return 0;
+		}
+		int hash = INITIAL_HASH;
+		int arraySize = array.length;
+		for (int i = 0; i < arraySize; i++) {
+			hash = MULTIPLIER * hash + array[i];
+		}
+		return hash;
+	}
+
+	/**
+	 * Return a hash code based on the contents of the specified array.
+	 * If <code>array</code> is <code>null</code>, this method returns 0.
+	 * @param array of chars
+	 * @return hash code
+	 */
+	public static int nullSafeHashCode(char[] array) {
+		if (array == null) {
+			return 0;
+		}
+		int hash = INITIAL_HASH;
+		int arraySize = array.length;
+		for (int i = 0; i < arraySize; i++) {
+			hash = MULTIPLIER * hash + array[i];
+		}
+		return hash;
+	}
+
+	/**
+	 * Return a hash code based on the contents of the specified array.
+	 * If <code>array</code> is <code>null</code>, this method returns 0.
+	 * @param array of doubles
+	 * @return hash code
+	 */
+	public static int nullSafeHashCode(double[] array) {
+		if (array == null) {
+			return 0;
+		}
+		int hash = INITIAL_HASH;
+		int arraySize = array.length;
+		for (int i = 0; i < arraySize; i++) {
+			hash = MULTIPLIER * hash + hashCode(array[i]);
+		}
+		return hash;
+	}
+
+	/**
+	 * Return a hash code based on the contents of the specified array.
+	 * If <code>array</code> is <code>null</code>, this method returns 0.
+	 * @param array of floats
+	 * @return hash code
+	 */
+	public static int nullSafeHashCode(float[] array) {
+		if (array == null) {
+			return 0;
+		}
+		int hash = INITIAL_HASH;
+		int arraySize = array.length;
+		for (int i = 0; i < arraySize; i++) {
+			hash = MULTIPLIER * hash + hashCode(array[i]);
+		}
+		return hash;
+	}
+
+	/**
+	 * Return a hash code based on the contents of the specified array.
+	 * If <code>array</code> is <code>null</code>, this method returns 0.
+	 * @param array of ints
+	 * @return hash code
+	 */
+	public static int nullSafeHashCode(int[] array) {
+		if (array == null) {
+			return 0;
+		}
+		int hash = INITIAL_HASH;
+		int arraySize = array.length;
+		for (int i = 0; i < arraySize; i++) {
+			hash = MULTIPLIER * hash + array[i];
+		}
+		return hash;
+	}
+
+	/**
+	 * Return a hash code based on the contents of the specified array.
+	 * If <code>array</code> is <code>null</code>, this method returns 0.
+	 * @param array of longs
+	 * @return hash codes
+	 */
+	public static int nullSafeHashCode(long[] array) {
+		if (array == null) {
+			return 0;
+		}
+		int hash = INITIAL_HASH;
+		int arraySize = array.length;
+		for (int i = 0; i < arraySize; i++) {
+			hash = MULTIPLIER * hash + hashCode(array[i]);
+		}
+		return hash;
+	}
+
+	/**
+	 * Return a hash code based on the contents of the specified array.
+	 * If <code>array</code> is <code>null</code>, this method returns 0.
+	 * @param array of shorts
+	 * @return hash code
+	 */
+	public static int nullSafeHashCode(short[] array) {
+		if (array == null) {
+			return 0;
+		}
+		int hash = INITIAL_HASH;
+		int arraySize = array.length;
+		for (int i = 0; i < arraySize; i++) {
+			hash = MULTIPLIER * hash + array[i];
+		}
+		return hash;
+	}
+
+	/**
+	 * Return the same value as <code>{@link Boolean#hashCode()}</code>.
+	 * @param bool boolean
+	 * @return hash code
+	 * @see Boolean#hashCode()
+	 */
+	public static int hashCode(boolean bool) {
+		return bool ? 1231 : 1237;
+	}
+
+	/**
+	 * Return the same value as <code>{@link Double#hashCode()}</code>.
+	 * @param dbl double
+	 * @return hash code
+	 * @see Double#hashCode()
+	 */
+	public static int hashCode(double dbl) {
+		long bits = Double.doubleToLongBits(dbl);
+		return hashCode(bits);
+	}
+
+	/**
+	 * Return the same value as <code>{@link Float#hashCode()}</code>.
+	 * @param flt float
+	 * @see Float#hashCode()
+     * @return hash code
+	 */
+	public static int hashCode(float flt) {
+		return Float.floatToIntBits(flt);
+	}
+
+	/**
+	 * Return the same value as <code>{@link Long#hashCode()}</code>.
+	 * @param lng long
+	 * @see Long#hashCode()
+     * @return hash code
+	 */
+	public static int hashCode(long lng) {
+		return (int) (lng ^ (lng >>> 32));
+	}
+
+
+	//---------------------------------------------------------------------
+	// Convenience methods for toString output
+	//---------------------------------------------------------------------
+
+	/**
+	 * Return a String representation of an object's overall identity.
+	 * @param obj the object (may be <code>null</code>)
+	 * @return the object's identity as String representation,
+	 * or an empty String if the object was <code>null</code>
+	 */
+	public static String identityToString(Object obj) {
+		if (obj == null) {
+			return EMPTY_STRING;
+		}
+		return obj.getClass().getName() + "@" + getIdentityHexString(obj);
+	}
+
+	/**
+	 * Return a hex String form of an object's identity hash code.
+	 * @param obj the object
+	 * @return the object's identity code in hex notation
+	 */
+	public static String getIdentityHexString(Object obj) {
+		return Integer.toHexString(System.identityHashCode(obj));
+	}
+
+	/**
+	 * Return a content-based String representation if <code>obj</code> is
+	 * not <code>null</code>; otherwise returns an empty String.
+	 * <p>Differs from {@link #nullSafeToString(Object)} in that it returns
+	 * an empty String rather than "null" for a <code>null</code> value.
+	 * @param obj the object to build a display String for
+	 * @return a display String representation of <code>obj</code>
+	 * @see #nullSafeToString(Object)
+	 */
+	public static String getDisplayString(Object obj) {
+		if (obj == null) {
+			return EMPTY_STRING;
+		}
+		return nullSafeToString(obj);
+	}
+
+	/**
+	 * Determine the class name for the given object.
+	 * <p>Returns <code>"null"</code> if <code>obj</code> is <code>null</code>.
+	 * @param obj the object to introspect (may be <code>null</code>)
+	 * @return the corresponding class name
+	 */
+	public static String nullSafeClassName(Object obj) {
+		return (obj != null ? obj.getClass().getName() : NULL_STRING);
+	}
+
+	/**
+	 * Return a String representation of the specified Object.
+	 * <p>Builds a String representation of the contents in case of an array.
+	 * Returns <code>"null"</code> if <code>obj</code> is <code>null</code>.
+	 * @param obj the object to build a String representation for
+	 * @return a String representation of <code>obj</code>
+	 */
+	public static String nullSafeToString(Object obj) {
+		if (obj == null) {
+			return NULL_STRING;
+		}
+		if (obj instanceof String) {
+			return (String) obj;
+		}
+		if (obj instanceof Object[]) {
+			return nullSafeToString((Object[]) obj);
+		}
+		if (obj instanceof boolean[]) {
+			return nullSafeToString((boolean[]) obj);
+		}
+		if (obj instanceof byte[]) {
+			return nullSafeToString((byte[]) obj);
+		}
+		if (obj instanceof char[]) {
+			return nullSafeToString((char[]) obj);
+		}
+		if (obj instanceof double[]) {
+			return nullSafeToString((double[]) obj);
+		}
+		if (obj instanceof float[]) {
+			return nullSafeToString((float[]) obj);
+		}
+		if (obj instanceof int[]) {
+			return nullSafeToString((int[]) obj);
+		}
+		if (obj instanceof long[]) {
+			return nullSafeToString((long[]) obj);
+		}
+		if (obj instanceof short[]) {
+			return nullSafeToString((short[]) obj);
+		}
+		String str = obj.toString();
+		return (str != null ? str : EMPTY_STRING);
+	}
+
+	/**
+	 * Return a String representation of the contents of the specified array.
+	 * <p>The String representation consists of a list of the array's elements,
+	 * enclosed in curly braces (<code>"{}"</code>). Adjacent elements are separated
+	 * by the characters <code>", "</code> (a comma followed by a space). Returns
+	 * <code>"null"</code> if <code>array</code> is <code>null</code>.
+	 * @param array the array to build a String representation for
+	 * @return a String representation of <code>array</code>
+	 */
+	public static String nullSafeToString(Object[] array) {
+		if (array == null) {
+			return NULL_STRING;
+		}
+		int length = array.length;
+		if (length == 0) {
+			return EMPTY_ARRAY;
+		}
+		StringBuffer buffer = new StringBuffer();
+		for (int i = 0; i < length; i++) {
+			if (i == 0) {
+				buffer.append(ARRAY_START);
+			}
+			else {
+				buffer.append(ARRAY_ELEMENT_SEPARATOR);
+			}
+			buffer.append(String.valueOf(array[i]));
+		}
+		buffer.append(ARRAY_END);
+		return buffer.toString();
+	}
+
+	/**
+	 * Return a String representation of the contents of the specified array.
+	 * <p>The String representation consists of a list of the array's elements,
+	 * enclosed in curly braces (<code>"{}"</code>). Adjacent elements are separated
+	 * by the characters <code>", "</code> (a comma followed by a space). Returns
+	 * <code>"null"</code> if <code>array</code> is <code>null</code>.
+	 * @param array the array to build a String representation for
+	 * @return a String representation of <code>array</code>
+	 */
+	public static String nullSafeToString(boolean[] array) {
+		if (array == null) {
+			return NULL_STRING;
+		}
+		int length = array.length;
+		if (length == 0) {
+			return EMPTY_ARRAY;
+		}
+		StringBuffer buffer = new StringBuffer();
+		for (int i = 0; i < length; i++) {
+			if (i == 0) {
+				buffer.append(ARRAY_START);
+			}
+			else {
+				buffer.append(ARRAY_ELEMENT_SEPARATOR);
+			}
+
+			buffer.append(array[i]);
+		}
+		buffer.append(ARRAY_END);
+		return buffer.toString();
+	}
+
+	/**
+	 * Return a String representation of the contents of the specified array.
+	 * <p>The String representation consists of a list of the array's elements,
+	 * enclosed in curly braces (<code>"{}"</code>). Adjacent elements are separated
+	 * by the characters <code>", "</code> (a comma followed by a space). Returns
+	 * <code>"null"</code> if <code>array</code> is <code>null</code>.
+	 * @param array the array to build a String representation for
+	 * @return a String representation of <code>array</code>
+	 */
+	public static String nullSafeToString(byte[] array) {
+		if (array == null) {
+			return NULL_STRING;
+		}
+		int length = array.length;
+		if (length == 0) {
+			return EMPTY_ARRAY;
+		}
+		StringBuffer buffer = new StringBuffer();
+		for (int i = 0; i < length; i++) {
+			if (i == 0) {
+				buffer.append(ARRAY_START);
+			}
+			else {
+				buffer.append(ARRAY_ELEMENT_SEPARATOR);
+			}
+			buffer.append(array[i]);
+		}
+		buffer.append(ARRAY_END);
+		return buffer.toString();
+	}
+
+	/**
+	 * Return a String representation of the contents of the specified array.
+	 * <p>The String representation consists of a list of the array's elements,
+	 * enclosed in curly braces (<code>"{}"</code>). Adjacent elements are separated
+	 * by the characters <code>", "</code> (a comma followed by a space). Returns
+	 * <code>"null"</code> if <code>array</code> is <code>null</code>.
+	 * @param array the array to build a String representation for
+	 * @return a String representation of <code>array</code>
+	 */
+	public static String nullSafeToString(char[] array) {
+		if (array == null) {
+			return NULL_STRING;
+		}
+		int length = array.length;
+		if (length == 0) {
+			return EMPTY_ARRAY;
+		}
+		StringBuffer buffer = new StringBuffer();
+		for (int i = 0; i < length; i++) {
+			if (i == 0) {
+				buffer.append(ARRAY_START);
+			}
+			else {
+				buffer.append(ARRAY_ELEMENT_SEPARATOR);
+			}
+			buffer.append("'").append(array[i]).append("'");
+		}
+		buffer.append(ARRAY_END);
+		return buffer.toString();
+	}
+
+	/**
+	 * Return a String representation of the contents of the specified array.
+	 * <p>The String representation consists of a list of the array's elements,
+	 * enclosed in curly braces (<code>"{}"</code>). Adjacent elements are separated
+	 * by the characters <code>", "</code> (a comma followed by a space). Returns
+	 * <code>"null"</code> if <code>array</code> is <code>null</code>.
+	 * @param array the array to build a String representation for
+	 * @return a String representation of <code>array</code>
+	 */
+	public static String nullSafeToString(double[] array) {
+		if (array == null) {
+			return NULL_STRING;
+		}
+		int length = array.length;
+		if (length == 0) {
+			return EMPTY_ARRAY;
+		}
+		StringBuffer buffer = new StringBuffer();
+		for (int i = 0; i < length; i++) {
+			if (i == 0) {
+				buffer.append(ARRAY_START);
+			}
+			else {
+				buffer.append(ARRAY_ELEMENT_SEPARATOR);
+			}
+
+			buffer.append(array[i]);
+		}
+		buffer.append(ARRAY_END);
+		return buffer.toString();
+	}
+
+	/**
+	 * Return a String representation of the contents of the specified array.
+	 * <p>The String representation consists of a list of the array's elements,
+	 * enclosed in curly braces (<code>"{}"</code>). Adjacent elements are separated
+	 * by the characters <code>", "</code> (a comma followed by a space). Returns
+	 * <code>"null"</code> if <code>array</code> is <code>null</code>.
+	 * @param array the array to build a String representation for
+	 * @return a String representation of <code>array</code>
+	 */
+	public static String nullSafeToString(float[] array) {
+		if (array == null) {
+			return NULL_STRING;
+		}
+		int length = array.length;
+		if (length == 0) {
+			return EMPTY_ARRAY;
+		}
+		StringBuffer buffer = new StringBuffer();
+		for (int i = 0; i < length; i++) {
+			if (i == 0) {
+				buffer.append(ARRAY_START);
+			}
+			else {
+				buffer.append(ARRAY_ELEMENT_SEPARATOR);
+			}
+
+			buffer.append(array[i]);
+		}
+		buffer.append(ARRAY_END);
+		return buffer.toString();
+	}
+
+	/**
+	 * Return a String representation of the contents of the specified array.
+	 * <p>The String representation consists of a list of the array's elements,
+	 * enclosed in curly braces (<code>"{}"</code>). Adjacent elements are separated
+	 * by the characters <code>", "</code> (a comma followed by a space). Returns
+	 * <code>"null"</code> if <code>array</code> is <code>null</code>.
+	 * @param array the array to build a String representation for
+	 * @return a String representation of <code>array</code>
+	 */
+	public static String nullSafeToString(int[] array) {
+		if (array == null) {
+			return NULL_STRING;
+		}
+		int length = array.length;
+		if (length == 0) {
+			return EMPTY_ARRAY;
+		}
+		StringBuffer buffer = new StringBuffer();
+		for (int i = 0; i < length; i++) {
+			if (i == 0) {
+				buffer.append(ARRAY_START);
+			}
+			else {
+				buffer.append(ARRAY_ELEMENT_SEPARATOR);
+			}
+			buffer.append(array[i]);
+		}
+		buffer.append(ARRAY_END);
+		return buffer.toString();
+	}
+
+	/**
+	 * Return a String representation of the contents of the specified array.
+	 * <p>The String representation consists of a list of the array's elements,
+	 * enclosed in curly braces (<code>"{}"</code>). Adjacent elements are separated
+	 * by the characters <code>", "</code> (a comma followed by a space). Returns
+	 * <code>"null"</code> if <code>array</code> is <code>null</code>.
+	 * @param array the array to build a String representation for
+	 * @return a String representation of <code>array</code>
+	 */
+	public static String nullSafeToString(long[] array) {
+		if (array == null) {
+			return NULL_STRING;
+		}
+		int length = array.length;
+		if (length == 0) {
+			return EMPTY_ARRAY;
+		}
+		StringBuffer buffer = new StringBuffer();
+		for (int i = 0; i < length; i++) {
+			if (i == 0) {
+				buffer.append(ARRAY_START);
+			}
+			else {
+				buffer.append(ARRAY_ELEMENT_SEPARATOR);
+			}
+			buffer.append(array[i]);
+		}
+		buffer.append(ARRAY_END);
+		return buffer.toString();
+	}
+
+	/**
+	 * Return a String representation of the contents of the specified array.
+	 * <p>The String representation consists of a list of the array's elements,
+	 * enclosed in curly braces (<code>"{}"</code>). Adjacent elements are separated
+	 * by the characters <code>", "</code> (a comma followed by a space). Returns
+	 * <code>"null"</code> if <code>array</code> is <code>null</code>.
+	 * @param array the array to build a String representation for
+	 * @return a String representation of <code>array</code>
+	 */
+	public static String nullSafeToString(short[] array) {
+		if (array == null) {
+			return NULL_STRING;
+		}
+		int length = array.length;
+		if (length == 0) {
+			return EMPTY_ARRAY;
+		}
+		StringBuffer buffer = new StringBuffer();
+		for (int i = 0; i < length; i++) {
+			if (i == 0) {
+				buffer.append(ARRAY_START);
+			}
+			else {
+				buffer.append(ARRAY_ELEMENT_SEPARATOR);
+			}
+			buffer.append(array[i]);
+		}
+		buffer.append(ARRAY_END);
+		return buffer.toString();
+	}
+
+}
diff --git a/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/PropertyPlaceholderResolver.java b/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/PropertyPlaceholderResolver.java
new file mode 100644
index 0000000..aa83d4a
--- /dev/null
+++ b/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/PropertyPlaceholderResolver.java
@@ -0,0 +1,188 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.common;
+
+import java.util.Enumeration;
+import java.util.Properties;
+import java.util.Stack;
+import java.util.UUID;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Utility class for resolving placeholders inside a {@link Properties} instance. These placeholders can refer to other
+ * properties in the <code>Properties</code> instance. The place holders may also have a modifier in them
+ * 
+ * <pre>
+ * ${com.springsource:modifier}
+ * </pre>
+ * 
+ * where everything after the colon is considered the modifier. This class does not interpret these modifiers but
+ * rather delegates to a {@link PlaceholderValueTransformer} for processing.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.
+ */
+public final class PropertyPlaceholderResolver {
+    
+    private static final Pattern PATTERN = Pattern.compile("\\$\\{([^:\\}]*):?([^\\}]*)?\\}");
+
+    private static final PlaceholderValueTransformer IDENTITY_TRANSFORMER = new PlaceholderValueTransformer() {
+
+        public String transform(String propertyName, String propertyValue, String modifier) {
+            return propertyValue;
+        }
+
+    };
+
+    /**
+     * Resolves all placeholders in the supplied {@link Properties} instance.
+     * 
+     * @param input the properties to resolve.
+     * @return the resolved properties.
+     */
+    public Properties resolve(Properties input) {
+        return resolve(input, IDENTITY_TRANSFORMER);
+    }
+
+    /**
+     * Resolves all placeholders in the supplied {@link Properties} instance and transform any based on their modifiers.
+     * 
+     * @param input the properties to resolve.
+     * @param transformer a transformer for handling property modifiers
+     * @return the resolved properties.
+     */
+    public Properties resolve(Properties input, PlaceholderValueTransformer transformer) {
+        Properties result = new Properties();
+        Enumeration<?> propertyNames = input.propertyNames();
+
+        while (propertyNames.hasMoreElements()) {
+			String propertyName = (String) propertyNames.nextElement();
+			result.setProperty(propertyName, resolveProperty(propertyName, input, transformer));
+			
+		}
+
+        return result;
+    }
+
+    /**
+     * Resolves all placeholders in the supplied string with values from a {@link Properties} instance.
+     * 
+     * @param input the string to resolve
+     * @param props the properties to use for resolution
+     * @return the resolved string
+     */
+    public String resolve(String input, Properties props) {
+        return resolve(input, props, IDENTITY_TRANSFORMER);
+    }
+
+    /**
+     * Resolves all placeholders in the supplied string with values from a {@link Properties} instance and transform any
+     * based on their modifiers.
+     * 
+     * @param input the string to resolve
+     * @param props the properties to use for resolution
+     * @param transformer a transformer for handling property modifiers
+     * @return the resolved string
+     */
+    public String resolve(String input, Properties props, PlaceholderValueTransformer transformer) {
+        String key = UUID.randomUUID().toString();
+        props.put(key, input);
+        String value = resolveProperty(key, props, transformer);
+        props.remove(key);
+        return value;
+    }
+
+    private String resolveProperty(String name, Properties props, PlaceholderValueTransformer transformer) {
+        Stack<String> visitState = new Stack<String>();
+        return resolve(name, props, transformer, visitState);
+    }
+
+    private String resolve(String name, Properties props, PlaceholderValueTransformer transformer, Stack<String> visitState) {
+        visitState.push(name);
+
+        String initialValue = props.getProperty(name);
+        if(initialValue == null) {
+            throw new RuntimeException("No value found for placeholder '" + name + "'");
+        }
+
+        Matcher matcher = PATTERN.matcher(initialValue);
+
+        StringBuffer sb = new StringBuffer();
+        while (matcher.find()) {
+            String propName = matcher.group(1);
+            if (visitState.contains(propName)) {
+                throw new IllegalArgumentException(formatPropertyCycleMessage(visitState));
+            }
+
+            String value = resolve(propName, props, transformer, visitState);
+            if (matcher.group(2).length() > 0) {
+                value = transformer.transform(propName, value, matcher.group(2));
+            }
+            matcher.appendReplacement(sb, escapeBackslashes(value));
+        }
+        matcher.appendTail(sb);
+
+        visitState.pop();
+        return sb.toString();
+    }
+
+    private static String escapeBackslashes(String string) {
+        StringBuffer sb = new StringBuffer(string.length());
+        int bsIndex = string.indexOf("\\");
+        int pos = 0;
+        while (bsIndex != -1) {
+            sb.append(string.substring(pos,bsIndex+1));
+            sb.append("\\"); // another backslash
+            pos = bsIndex+1;
+            bsIndex = string.indexOf("\\",pos);
+        }
+        sb.append(string.substring(pos, string.length()));
+        return new String(sb);
+    }
+    
+    private String formatPropertyCycleMessage(Stack<String> visitState) {
+        StringBuilder sb = new StringBuilder();
+        sb.append("Circular reference in property definitions: ");
+        for (String name : visitState) {
+            sb.append(name).append(" -> ");
+        }
+
+        sb.append(visitState.iterator().next());
+        return sb.toString();
+    }
+
+    /**
+     * An interface for property placeholder modifiers. Implementations of this interface are called when a property
+     * placeholder modifier is detected on a class.
+     * <p />
+     * 
+     * <strong>Concurrent Semantics</strong><br />
+     * 
+     * Implementations must be threadsafe.
+     * 
+     */
+    public static interface PlaceholderValueTransformer {
+
+        /**
+         * Transforms a property from its initial value to some other value
+         * 
+         * @param propertyName the name of the property being transformed
+         * @param propertyValue the original value of the property
+         * @param modifier the modifer string attached to the placeholder
+         * @return A string that has been modified by this transformer and to be used in place of the original value
+         */
+        String transform(String propertyName, String propertyValue, String modifier);
+    }
+}
diff --git a/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/SetProvider.java b/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/SetProvider.java
new file mode 100644
index 0000000..29ae170
--- /dev/null
+++ b/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/SetProvider.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.common;
+
+import java.util.Set;
+
+/**
+ * <p>
+ * An interface for use when a provider of some object is required but 
+ * the types of implementation come from elsewhere, e.g. OSGi and those 
+ * types can't be on the using systems classpath.
+ * </p>
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * Implementations <strong>must</strong> be thread safe.
+ *
+ * @param <T> type of elements of set
+ */
+public interface SetProvider<T> {
+
+    /**
+     * Implementations of this must provide thread safe sets for iteration. 
+     * e.g. This can be achieved by either returning a new set or one that 
+     * implements thread safety with internal locking.
+     * 
+     * 
+     * @return the <code>Set</code> of service objects
+     */
+    public abstract Set<T> getSet();
+
+}
diff --git a/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/StringUtils.java b/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/StringUtils.java
new file mode 100644
index 0000000..fe92783
--- /dev/null
+++ b/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/StringUtils.java
@@ -0,0 +1,1200 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.common;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Locale;
+import java.util.Properties;
+import java.util.Set;
+import java.util.StringTokenizer;
+import java.util.TreeSet;
+
+/**
+ * Miscellaneous {@link String} utility methods.
+ *
+ */
+public abstract class StringUtils {
+
+	private static final String PREFIX_SEPARATOR = ":";
+
+    private static final String FOLDER_SEPARATOR = "/";
+
+	private static final String WINDOWS_FOLDER_SEPARATOR = "\\";
+
+	private static final String TOP_PATH = "..";
+
+	private static final String CURRENT_PATH = ".";
+
+	private static final char EXTENSION_SEPARATOR = '.';
+	
+	private static final String DOT_SEPARATOR = ".";
+
+    private static final String DOT_SEPARATOR_SPLIT_REGEX = "\\.";
+
+	//---------------------------------------------------------------------
+	// General convenience methods for working with Strings
+	//---------------------------------------------------------------------
+
+	/**
+	 * Check that the given CharSequence is neither <code>null</code> nor of length 0.
+	 * Note: Will return <code>true</code> for a CharSequence that purely consists of whitespace.
+	 * <p><pre>
+	 * StringUtils.hasLength(null) = false
+	 * StringUtils.hasLength("") = false
+	 * StringUtils.hasLength(" ") = true
+	 * StringUtils.hasLength("Hello") = true
+	 * </pre>
+	 * @param str the CharSequence to check (may be <code>null</code>)
+	 * @return <code>true</code> if the CharSequence is not null and has length
+	 * @see #hasText(String)
+	 */
+	public static boolean hasLength(CharSequence str) {
+		return (str != null && str.length() > 0);
+	}
+
+	/**
+	 * Check that the given String is neither <code>null</code> nor of length 0.
+	 * Note: Will return <code>true</code> for a String that purely consists of whitespace.
+	 * @param str the String to check (may be <code>null</code>)
+	 * @return <code>true</code> if the String is not null and has length
+	 * @see #hasLength(CharSequence)
+	 */
+	public static boolean hasLength(String str) {
+		return hasLength((CharSequence) str);
+	}
+
+	/**
+	 * Check whether the given CharSequence has actual text.
+	 * More specifically, returns <code>true</code> if the string not <code>null</code>,
+	 * its length is greater than 0, and it contains at least one non-whitespace character.
+	 * <p><pre>
+	 * StringUtils.hasText(null) = false
+	 * StringUtils.hasText("") = false
+	 * StringUtils.hasText(" ") = false
+	 * StringUtils.hasText("12345") = true
+	 * StringUtils.hasText(" 12345 ") = true
+	 * </pre>
+	 * @param str the CharSequence to check (may be <code>null</code>)
+	 * @return <code>true</code> if the CharSequence is not <code>null</code>,
+	 * its length is greater than 0, and it does not contain whitespace only
+	 * @see java.lang.Character#isWhitespace
+	 */
+	public static boolean hasText(CharSequence str) {
+		if (!hasLength(str)) {
+			return false;
+		}
+		int strLen = str.length();
+		for (int i = 0; i < strLen; i++) {
+			if (!Character.isWhitespace(str.charAt(i))) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * Check whether the given String has actual text.
+	 * More specifically, returns <code>true</code> if the string not <code>null</code>,
+	 * its length is greater than 0, and it contains at least one non-whitespace character.
+	 * @param str the String to check (may be <code>null</code>)
+	 * @return <code>true</code> if the String is not <code>null</code>, its length is
+	 * greater than 0, and it does not contain whitespace only
+	 * @see #hasText(CharSequence)
+	 */
+	public static boolean hasText(String str) {
+		return hasText((CharSequence) str);
+	}
+
+	/**
+	 * Check whether the given CharSequence contains any whitespace characters.
+	 * @param str the CharSequence to check (may be <code>null</code>)
+	 * @return <code>true</code> if the CharSequence is not empty and
+	 * contains at least 1 whitespace character
+	 * @see java.lang.Character#isWhitespace
+	 */
+	public static boolean containsWhitespace(CharSequence str) {
+		if (!hasLength(str)) {
+			return false;
+		}
+		int strLen = str.length();
+		for (int i = 0; i < strLen; i++) {
+			if (Character.isWhitespace(str.charAt(i))) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * Check whether the given String contains any whitespace characters.
+	 * @param str the String to check (may be <code>null</code>)
+	 * @return <code>true</code> if the String is not empty and
+	 * contains at least 1 whitespace character
+	 * @see #containsWhitespace(CharSequence)
+	 */
+	public static boolean containsWhitespace(String str) {
+		return containsWhitespace((CharSequence) str);
+	}
+
+	/**
+	 * Trim leading and trailing whitespace from the given String.
+	 * @param str the String to check
+	 * @return the trimmed String
+	 * @see java.lang.Character#isWhitespace
+	 */
+	public static String trimWhitespace(String str) {
+		if (!hasLength(str)) {
+			return str;
+		}
+		StringBuffer buf = new StringBuffer(str);
+		while (buf.length() > 0 && Character.isWhitespace(buf.charAt(0))) {
+			buf.deleteCharAt(0);
+		}
+		while (buf.length() > 0 && Character.isWhitespace(buf.charAt(buf.length() - 1))) {
+			buf.deleteCharAt(buf.length() - 1);
+		}
+		return buf.toString();
+	}
+
+	/**
+	 * Trim <i>all</i> whitespace from the given String:
+	 * leading, trailing, and inbetween characters.
+	 * @param str the String to check
+	 * @return the trimmed String
+	 * @see java.lang.Character#isWhitespace
+	 */
+	public static String trimAllWhitespace(String str) {
+		if (!hasLength(str)) {
+			return str;
+		}
+		StringBuffer buf = new StringBuffer(str);
+		int index = 0;
+		while (buf.length() > index) {
+			if (Character.isWhitespace(buf.charAt(index))) {
+				buf.deleteCharAt(index);
+			}
+			else {
+				index++;
+			}
+		}
+		return buf.toString();
+	}
+
+	/**
+	 * Trim leading whitespace from the given String.
+	 * @param str the String to check
+	 * @return the trimmed String
+	 * @see java.lang.Character#isWhitespace
+	 */
+	public static String trimLeadingWhitespace(String str) {
+		if (!hasLength(str)) {
+			return str;
+		}
+		StringBuffer buf = new StringBuffer(str);
+		while (buf.length() > 0 && Character.isWhitespace(buf.charAt(0))) {
+			buf.deleteCharAt(0);
+		}
+		return buf.toString();
+	}
+
+	/**
+	 * Trim trailing whitespace from the given String.
+	 * @param str the String to check
+	 * @return the trimmed String
+	 * @see java.lang.Character#isWhitespace
+	 */
+	public static String trimTrailingWhitespace(String str) {
+		if (!hasLength(str)) {
+			return str;
+		}
+		StringBuffer buf = new StringBuffer(str);
+		while (buf.length() > 0 && Character.isWhitespace(buf.charAt(buf.length() - 1))) {
+			buf.deleteCharAt(buf.length() - 1);
+		}
+		return buf.toString();
+	}
+
+	/**
+	 * Trim all occurences of the supplied leading character from the given String.
+	 * @param str the String to check
+	 * @param leadingCharacter the leading character to be trimmed
+	 * @return the trimmed String
+	 */
+	public static String trimLeadingCharacter(String str, char leadingCharacter) {
+		if (!hasLength(str)) {
+			return str;
+		}
+		StringBuffer buf = new StringBuffer(str);
+		while (buf.length() > 0 && buf.charAt(0) == leadingCharacter) {
+			buf.deleteCharAt(0);
+		}
+		return buf.toString();
+	}
+
+	/**
+	 * Trim all occurences of the supplied trailing character from the given String.
+	 * @param str the String to check
+	 * @param trailingCharacter the trailing character to be trimmed
+	 * @return the trimmed String
+	 */
+	public static String trimTrailingCharacter(String str, char trailingCharacter) {
+		if (!hasLength(str)) {
+			return str;
+		}
+		StringBuffer buf = new StringBuffer(str);
+		while (buf.length() > 0 && buf.charAt(buf.length() - 1) == trailingCharacter) {
+			buf.deleteCharAt(buf.length() - 1);
+		}
+		return buf.toString();
+	}
+
+
+	/**
+	 * Test if the given String starts with the specified prefix,
+	 * ignoring upper/lower case.
+	 * @param str the String to check
+	 * @param prefix the prefix to look for
+	 * @return true if starts with prefix, without regard to case
+	 * @see java.lang.String#startsWith
+	 */
+	public static boolean startsWithIgnoreCase(String str, String prefix) {
+		if (str == null || prefix == null) {
+			return false;
+		}
+		if (str.startsWith(prefix)) {
+			return true;
+		}
+		if (str.length() < prefix.length()) {
+			return false;
+		}
+		String lcStr = str.substring(0, prefix.length()).toLowerCase();
+		String lcPrefix = prefix.toLowerCase();
+		return lcStr.equals(lcPrefix);
+	}
+
+	/**
+	 * Test if the given String ends with the specified suffix,
+	 * ignoring upper/lower case.
+	 * @param str the String to check
+	 * @param suffix the suffix to look for
+     * @return true if ends with suffix, without regard to case
+	 * @see java.lang.String#endsWith
+	 */
+	public static boolean endsWithIgnoreCase(String str, String suffix) {
+		if (str == null || suffix == null) {
+			return false;
+		}
+		if (str.endsWith(suffix)) {
+			return true;
+		}
+		if (str.length() < suffix.length()) {
+			return false;
+		}
+
+		String lcStr = str.substring(str.length() - suffix.length()).toLowerCase();
+		String lcSuffix = suffix.toLowerCase();
+		return lcStr.equals(lcSuffix);
+	}
+
+	/**
+	 * Test whether the given string matches the given substring
+	 * at the given index.
+	 * @param str the original string (or StringBuffer)
+	 * @param index the index in the original string to start matching against
+	 * @param substring the substring to match at the given index
+	 * @return true if a match
+	 */
+	public static boolean substringMatch(CharSequence str, int index, CharSequence substring) {
+	    if (index < 0 && substring.length() > 0) {
+	        return false;
+	    }
+		for (int j = 0; j < substring.length(); j++) {
+			int i = index + j;
+			if (i >= str.length() || str.charAt(i) != substring.charAt(j)) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+	/**
+	 * Count the occurrences of the substring in string s.
+	 * @param str string to search in. Return 0 if this is null.
+	 * @param sub string to search for. Return 0 if this is null.
+	 * @return count
+	 */
+	public static int countOccurrencesOf(String str, String sub) {
+		if (str == null || sub == null || str.length() == 0 || sub.length() == 0) {
+			return 0;
+		}
+		int count = 0, pos = 0, idx = 0;
+		while ((idx = str.indexOf(sub, pos)) != -1) {
+			++count;
+			pos = idx + sub.length();
+		}
+		return count;
+	}
+
+	/**
+	 * Replace all occurences of a substring within a string with
+	 * another string.
+	 * @param inString String to examine
+	 * @param oldPattern String to replace
+	 * @param newPattern String to insert
+	 * @return a String with the replacements
+	 */
+	public static String replace(String inString, String oldPattern, String newPattern) {
+		if (inString == null) {
+			return null;
+		}
+		if (oldPattern == null || newPattern == null) {
+			return inString;
+		}
+
+		StringBuffer sbuf = new StringBuffer();
+		// output StringBuffer we'll build up
+		int pos = 0; // our position in the old string
+		int index = inString.indexOf(oldPattern);
+		// the index of an occurrence we've found, or -1
+		int patLen = oldPattern.length();
+		while (index >= 0) {
+			sbuf.append(inString.substring(pos, index));
+			sbuf.append(newPattern);
+			pos = index + patLen;
+			index = inString.indexOf(oldPattern, pos);
+		}
+		sbuf.append(inString.substring(pos));
+
+		// remember to append any characters to the right of a match
+		return sbuf.toString();
+	}
+
+	/**
+	 * Delete all occurrences of the given substring.
+	 * @param inString the original String
+	 * @param pattern the pattern to delete all occurrences of
+	 * @return the resulting String
+	 */
+	public static String delete(String inString, String pattern) {
+		return replace(inString, pattern, "");
+	}
+
+	/**
+	 * Delete any character in a given String.
+	 * @param inString the original String
+	 * @param charsToDelete a set of characters to delete.
+	 * E.g. "az\n" will delete 'a's, 'z's and new lines.
+	 * @return the resulting String
+	 */
+	public static String deleteAny(String inString, String charsToDelete) {
+		if (!hasLength(inString) || !hasLength(charsToDelete)) {
+			return inString;
+		}
+		StringBuffer out = new StringBuffer();
+		for (int i = 0; i < inString.length(); i++) {
+			char c = inString.charAt(i);
+			if (charsToDelete.indexOf(c) == -1) {
+				out.append(c);
+			}
+		}
+		return out.toString();
+	}
+
+
+	//---------------------------------------------------------------------
+	// Convenience methods for working with formatted Strings
+	//---------------------------------------------------------------------
+
+	/**
+	 * Quote the given String with single quotes.
+	 * @param str the input String (e.g. "myString")
+	 * @return the quoted String (e.g. "'myString'"),
+	 * or <code>null<code> if the input was <code>null</code>
+	 */
+	public static String quote(String str) {
+		return (str != null ? "'" + str + "'" : null);
+	}
+
+	/**
+	 * Turn the given Object into a String with single quotes
+	 * if it is a String; keeping the Object as-is else.
+	 * @param obj the input Object (e.g. "myString")
+	 * @return the quoted String (e.g. "'myString'"),
+	 * or the input object as-is if not a String
+	 */
+	public static Object quoteIfString(Object obj) {
+		return (obj instanceof String ? quote((String) obj) : obj);
+	}
+
+	/**
+	 * Unqualify a string qualified by a '.' dot character. For example,
+	 * "this.name.is.qualified", returns "qualified".
+	 * @param qualifiedName the qualified name
+	 * @return unqualified name
+	 */
+	public static String unqualify(String qualifiedName) {
+		return unqualify(qualifiedName, '.');
+	}
+
+	/**
+	 * Unqualify a string qualified by a separator character. For example,
+	 * "this:name:is:qualified" returns "qualified" if using a ':' separator.
+	 * @param qualifiedName the qualified name
+	 * @param separator the separator
+	 * @return unqualified name
+	 */
+	public static String unqualify(String qualifiedName, char separator) {
+		return qualifiedName.substring(qualifiedName.lastIndexOf(separator) + 1);
+	}
+
+	/**
+	 * Capitalize a <code>String</code>, changing the first letter to
+	 * upper case as per {@link Character#toUpperCase(char)}.
+	 * No other letters are changed.
+	 * @param str the String to capitalize, may be <code>null</code>
+	 * @return the capitalized String, <code>null</code> if null
+	 */
+	public static String capitalize(String str) {
+		return changeFirstCharacterCase(str, true);
+	}
+
+	/**
+	 * Uncapitalize a <code>String</code>, changing the first letter to
+	 * lower case as per {@link Character#toLowerCase(char)}.
+	 * No other letters are changed.
+	 * @param str the String to uncapitalize, may be <code>null</code>
+	 * @return the uncapitalized String, <code>null</code> if null
+	 */
+	public static String uncapitalize(String str) {
+		return changeFirstCharacterCase(str, false);
+	}
+
+	private static String changeFirstCharacterCase(String str, boolean capitalize) {
+		if (str == null || str.length() == 0) {
+			return str;
+		}
+		StringBuffer buf = new StringBuffer(str.length());
+		if (capitalize) {
+			buf.append(Character.toUpperCase(str.charAt(0)));
+		}
+		else {
+			buf.append(Character.toLowerCase(str.charAt(0)));
+		}
+		buf.append(str.substring(1));
+		return buf.toString();
+	}
+
+	/**
+	 * Extract the filename from the given path,
+	 * e.g. "mypath/myfile.txt" -> "myfile.txt".
+	 * @param path the file path (may be <code>null</code>)
+	 * @return the extracted filename, or <code>null</code> if none
+	 */
+	public static String getFilename(String path) {
+		if (path == null) {
+			return null;
+		}
+		int separatorIndex = path.lastIndexOf(FOLDER_SEPARATOR);
+		return (separatorIndex != -1 ? path.substring(separatorIndex + 1) : path);
+	}
+
+	/**
+	 * Extract the filename extension from the given path,
+	 * e.g. "mypath/myfile.txt" -> "txt".
+	 * @param path the file path (may be <code>null</code>)
+	 * @return the extracted filename extension, or <code>null</code> if none
+	 */
+	public static String getFilenameExtension(String path) {
+		if (path == null) {
+			return null;
+		}
+		int sepIndex = path.lastIndexOf(EXTENSION_SEPARATOR);
+		return (sepIndex != -1 ? path.substring(sepIndex + 1) : null);
+	}
+
+	/**
+	 * Strip the filename extension from the given path,
+	 * e.g. "mypath/myfile.txt" -> "mypath/myfile".
+	 * @param path the file path (may be <code>null</code>)
+	 * @return the path with stripped filename extension,
+	 * or <code>null</code> if none
+	 */
+	public static String stripFilenameExtension(String path) {
+		if (path == null) {
+			return null;
+		}
+		int sepIndex = path.lastIndexOf(EXTENSION_SEPARATOR);
+		return (sepIndex != -1 ? path.substring(0, sepIndex) : path);
+	}
+
+	/**
+	 * Apply the given relative path to the given path,
+	 * assuming standard Java folder separation (i.e. "/" separators);
+	 * @param path the path to start from (usually a full file path)
+	 * @param relativePath the relative path to apply
+	 * (relative to the full file path above)
+	 * @return the full file path that results from applying the relative path
+	 */
+	public static String applyRelativePath(String path, String relativePath) {
+		int separatorIndex = path.lastIndexOf(FOLDER_SEPARATOR);
+		if (separatorIndex != -1) {
+			String newPath = path.substring(0, separatorIndex);
+			if (!relativePath.startsWith(FOLDER_SEPARATOR)) {
+				newPath += FOLDER_SEPARATOR;
+			}
+			return newPath + relativePath;
+		}
+		else {
+			return relativePath;
+		}
+	}
+
+	/**
+	 * Normalize the path by suppressing sequences like "path/.." and
+	 * inner simple dots.
+	 * <p>The result is convenient for path comparison. For other uses,
+	 * notice that Windows separators ("\") are replaced by simple slashes.
+	 * @param path the original path
+	 * @return the normalized path
+	 */
+	public static String cleanPath(String path) {
+		if (path == null) {
+			return null;
+		}
+		String pathToUse = replace(path, WINDOWS_FOLDER_SEPARATOR, FOLDER_SEPARATOR);
+
+		// Strip prefix from path to analyze, to not treat it as part of the
+		// first path element. This is necessary to correctly parse paths like
+		// "file:core/../core/io/Resource.class", where the ".." should just
+		// strip the first "core" directory while keeping the "file:" prefix.
+		int prefixIndex = pathToUse.indexOf(PREFIX_SEPARATOR);
+		String prefix = "";
+		if (prefixIndex != -1) {
+			prefix = pathToUse.substring(0, prefixIndex + 1);
+			pathToUse = pathToUse.substring(prefixIndex + 1);
+		}
+		if (pathToUse.startsWith(FOLDER_SEPARATOR)) {
+			prefix = prefix + FOLDER_SEPARATOR;
+			pathToUse = pathToUse.substring(1);
+		}
+
+		String[] pathArray = delimitedListToStringArray(pathToUse, FOLDER_SEPARATOR);
+		List<String> pathElements = new LinkedList<String>();
+		int tops = 0;
+
+		for (int i = pathArray.length - 1; i >= 0; i--) {
+			String element = pathArray[i];
+			if (CURRENT_PATH.equals(element)) {
+				// Points to current directory - drop it.
+			}
+			else if (TOP_PATH.equals(element)) {
+				// Registering top path found.
+				tops++;
+			}
+			else {
+				if (tops > 0) {
+					// Merging path element with element corresponding to top path.
+					tops--;
+				}
+				else {
+					// Normal path element found.
+					pathElements.add(0, element);
+				}
+			}
+		}
+
+		// Remaining top paths need to be retained.
+		for (int i = 0; i < tops; i++) {
+			pathElements.add(0, TOP_PATH);
+		}
+
+		return prefix + collectionToDelimitedString(pathElements, FOLDER_SEPARATOR);
+	}
+
+	/**
+	 * Compare two paths after normalization of them.
+	 * @param path1 first path for comparison
+	 * @param path2 second path for comparison
+	 * @return whether the two paths are equivalent after normalization
+	 */
+	public static boolean pathEquals(String path1, String path2) {
+		return cleanPath(path1).equals(cleanPath(path2));
+	}
+
+	/**
+	 * Parse the given <code>localeString</code> into a {@link Locale}.
+	 * <p>This is the inverse operation of {@link Locale#toString Locale's toString}.
+	 * @param localeString the locale string, following <code>Locale's</code>
+	 * <code>toString()</code> format ("en", "en_UK", etc);
+	 * also accepts spaces as separators, as an alternative to underscores
+	 * @return a corresponding <code>Locale</code> instance
+	 */
+	public static Locale parseLocaleString(String localeString) {
+		String[] parts = tokenizeToStringArray(localeString, "_ ", false, false);
+		String language = (parts.length > 0 ? parts[0] : "");
+		String country = (parts.length > 1 ? parts[1] : "");
+		String variant = "";
+		if (parts.length >= 2) {
+			// There is definitely a variant, and it is everything after the country
+			// code sans the separator between the country code and the variant.
+			int endIndexOfCountryCode = localeString.indexOf(country) + country.length();
+			// Strip off any leading '_' and whitespace, what's left is the variant.
+			variant = trimLeadingWhitespace(localeString.substring(endIndexOfCountryCode));
+			if (variant.startsWith("_")) {
+				variant = trimLeadingCharacter(variant, '_');
+			}
+		}
+		return (language.length() > 0 ? new Locale(language, country, variant) : null);
+	}
+
+	/**
+	 * Determine the RFC 3066 compliant language tag,
+	 * as used for the HTTP "Accept-Language" header.
+	 * @param locale the Locale to transform to a language tag
+	 * @return the RFC 3066 compliant language tag as String
+	 */
+	public static String toLanguageTag(Locale locale) {
+		return locale.getLanguage() + (hasText(locale.getCountry()) ? "-" + locale.getCountry() : "");
+	}
+
+
+	//---------------------------------------------------------------------
+	// Convenience methods for working with String arrays
+	//---------------------------------------------------------------------
+
+	/**
+	 * Append the given String to the given String array, returning a new array
+	 * consisting of the input array contents plus the given String.
+	 * @param array the array to append to (can be <code>null</code>)
+	 * @param str the String to append
+	 * @return the new array (never <code>null</code>)
+	 */
+	public static String[] addStringToArray(String[] array, String str) {
+		if (ObjectUtils.isEmpty(array)) {
+			return new String[] {str};
+		}
+		String[] newArr = new String[array.length + 1];
+		System.arraycopy(array, 0, newArr, 0, array.length);
+		newArr[array.length] = str;
+		return newArr;
+	}
+
+	/**
+	 * Concatenate the given String arrays into one,
+	 * with overlapping array elements included twice.
+	 * <p>The order of elements in the original arrays is preserved.
+	 * @param array1 the first array (can be <code>null</code>)
+	 * @param array2 the second array (can be <code>null</code>)
+	 * @return the new array (<code>null</code> if both given arrays were <code>null</code>)
+	 */
+	public static String[] concatenateStringArrays(String[] array1, String[] array2) {
+		if (ObjectUtils.isEmpty(array1)) {
+			return array2;
+		}
+		if (ObjectUtils.isEmpty(array2)) {
+			return array1;
+		}
+		String[] newArr = new String[array1.length + array2.length];
+		System.arraycopy(array1, 0, newArr, 0, array1.length);
+		System.arraycopy(array2, 0, newArr, array1.length, array2.length);
+		return newArr;
+	}
+
+	/**
+	 * Merge the given String arrays into one, with overlapping
+	 * array elements only included once.
+	 * <p>The order of elements in the original arrays is preserved
+	 * (with the exception of overlapping elements, which are only
+	 * included on their first occurence).
+	 * @param array1 the first array (can be <code>null</code>)
+	 * @param array2 the second array (can be <code>null</code>)
+	 * @return the new array (<code>null</code> if both given arrays were <code>null</code>)
+	 */
+	public static String[] mergeStringArrays(String[] array1, String[] array2) {
+		if (ObjectUtils.isEmpty(array1)) {
+			return array2;
+		}
+		if (ObjectUtils.isEmpty(array2)) {
+			return array1;
+		}
+		List<String> result = new ArrayList<String>();
+		result.addAll(Arrays.asList(array1));
+		for (int i = 0; i < array2.length; i++) {
+			String str = array2[i];
+			if (!result.contains(str)) {
+				result.add(str);
+			}
+		}
+		return toStringArray(result);
+	}
+
+	/**
+	 * Turn given source String array into sorted array.
+	 * @param array the source array
+	 * @return the sorted array (never <code>null</code>)
+	 */
+	public static String[] sortStringArray(String[] array) {
+		if (ObjectUtils.isEmpty(array)) {
+			return new String[0];
+		}
+		Arrays.sort(array);
+		return array;
+	}
+
+	/**
+	 * Copy the given Collection into a String array.
+	 * @param collection the Collection to copy
+	 * @return the String array (<code>null</code> if the passed-in
+	 * Collection was <code>null</code>)
+	 */
+	public static String[] toStringArray(Collection<String> collection) {
+		if (collection == null) {
+			return null;
+		}
+		return (String[]) collection.toArray(new String[collection.size()]);
+	}
+
+	/**
+	 * Copy the given Enumeration into a String array.
+	 * @param enumeration the Enumeration to copy
+	 * @return the String array (<code>null</code> if the passed-in
+	 * Enumeration was <code>null</code>)
+	 */
+	public static String[] toStringArray(Enumeration<String> enumeration) {
+		if (enumeration == null) {
+			return null;
+		}
+		List<String> list = Collections.list(enumeration);
+		return (String[]) list.toArray(new String[list.size()]);
+	}
+
+	/**
+	 * Trim the elements of the given String array,
+	 * calling <code>String.trim()</code> on each of them.
+	 * @param array the original String array
+	 * @return the resulting array (of the same size) with trimmed elements
+	 */
+	public static String[] trimArrayElements(String[] array) {
+		if (ObjectUtils.isEmpty(array)) {
+			return new String[0];
+		}
+		String[] result = new String[array.length];
+		for (int i = 0; i < array.length; i++) {
+			String element = array[i];
+			result[i] = (element != null ? element.trim() : null);
+		}
+		return result;
+	}
+
+	/**
+	 * Remove duplicate Strings from the given array.
+	 * Also sorts the array, as it uses a TreeSet.
+	 * @param array the String array
+	 * @return an array without duplicates, in natural sort order
+	 */
+	public static String[] removeDuplicateStrings(String[] array) {
+		if (ObjectUtils.isEmpty(array)) {
+			return array;
+		}
+		Set<String> set = new TreeSet<String>();
+		for (int i = 0; i < array.length; i++) {
+			set.add(array[i]);
+		}
+		return toStringArray(set);
+	}
+
+	/**
+	 * Split a String at the first occurrence of the delimiter.
+	 * Does not include the delimiter in the result.
+	 * @param toSplit the string to split
+	 * @param delimiter to split the string up with
+	 * @return a two element array with index 0 being before the delimiter, and
+	 * index 1 being after the delimiter (neither element includes the delimiter);
+	 * or <code>null</code> if the delimiter wasn't found in the given input String
+	 */
+	public static String[] split(String toSplit, String delimiter) {
+		if (!hasLength(toSplit) || !hasLength(delimiter)) {
+			return null;
+		}
+		int offset = toSplit.indexOf(delimiter);
+		if (offset < 0) {
+			return null;
+		}
+		String beforeDelimiter = toSplit.substring(0, offset);
+		String afterDelimiter = toSplit.substring(offset + delimiter.length());
+		return new String[] {beforeDelimiter, afterDelimiter};
+	}
+
+	/**
+	 * Take an array Strings and split each element based on the given delimiter.
+	 * A <code>Properties</code> instance is then generated, with the left of the
+	 * delimiter providing the key, and the right of the delimiter providing the value.
+	 * <p>Will trim both the key and value before adding them to the
+	 * <code>Properties</code> instance.
+	 * @param array the array to process
+	 * @param delimiter to split each element using (typically the equals symbol)
+	 * @return a <code>Properties</code> instance representing the array contents,
+	 * or <code>null</code> if the array to process was null or empty
+	 */
+	public static Properties splitArrayElementsIntoProperties(String[] array, String delimiter) {
+		return splitArrayElementsIntoProperties(array, delimiter, null);
+	}
+
+	/**
+	 * Take an array Strings and split each element based on the given delimiter.
+	 * A <code>Properties</code> instance is then generated, with the left of the
+	 * delimiter providing the key, and the right of the delimiter providing the value.
+	 * <p>Will trim both the key and value before adding them to the
+	 * <code>Properties</code> instance.
+	 * @param array the array to process
+	 * @param delimiter to split each element using (typically the equals symbol)
+	 * @param charsToDelete one or more characters to remove from each element
+	 * prior to attempting the split operation (typically the quotation mark
+	 * symbol), or <code>null</code> if no removal should occur
+	 * @return a <code>Properties</code> instance representing the array contents,
+	 * or <code>null</code> if the array to process was <code>null</code> or empty
+	 */
+	public static Properties splitArrayElementsIntoProperties(
+			String[] array, String delimiter, String charsToDelete) {
+
+		if (ObjectUtils.isEmpty(array)) {
+			return null;
+		}
+		Properties result = new Properties();
+		for (int i = 0; i < array.length; i++) {
+			String element = array[i];
+			if (charsToDelete != null) {
+				element = deleteAny(array[i], charsToDelete);
+			}
+			String[] splittedElement = split(element, delimiter);
+			if (splittedElement == null) {
+				continue;
+			}
+			result.setProperty(splittedElement[0].trim(), splittedElement[1].trim());
+		}
+		return result;
+	}
+
+	/**
+	 * Tokenize the given String into a String array via a StringTokenizer.
+	 * Trims tokens and omits empty tokens.
+	 * <p>The given delimiters string is supposed to consist of any number of
+	 * delimiter characters. Each of those characters can be used to separate
+	 * tokens. A delimiter is always a single character; for multi-character
+	 * delimiters, consider using <code>delimitedListToStringArray</code>
+	 * @param str the String to tokenize
+	 * @param delimiters the delimiter characters, assembled as String
+	 * (each of those characters is individually considered as delimiter).
+	 * @return an array of the tokens
+	 * @see java.util.StringTokenizer
+	 * @see java.lang.String#trim()
+	 * @see #delimitedListToStringArray
+	 */
+	public static String[] tokenizeToStringArray(String str, String delimiters) {
+		return tokenizeToStringArray(str, delimiters, true, true);
+	}
+
+	/**
+	 * Tokenize the given String into a String array via a StringTokenizer.
+	 * <p>The given delimiters string is supposed to consist of any number of
+	 * delimiter characters. Each of those characters can be used to separate
+	 * tokens. A delimiter is always a single character; for multi-character
+	 * delimiters, consider using <code>delimitedListToStringArray</code>
+	 * @param str the String to tokenize
+	 * @param delimiters the delimiter characters, assembled as String
+	 * (each of those characters is individually considered as delimiter)
+	 * @param trimTokens trim the tokens via String's <code>trim</code>
+	 * @param ignoreEmptyTokens omit empty tokens from the result array
+	 * (only applies to tokens that are empty after trimming; StringTokenizer
+	 * will not consider subsequent delimiters as token in the first place).
+	 * @return an array of the tokens (<code>null</code> if the input String
+	 * was <code>null</code>)
+	 * @see java.util.StringTokenizer
+	 * @see java.lang.String#trim()
+	 * @see #delimitedListToStringArray
+	 */
+	public static String[] tokenizeToStringArray(
+			String str, String delimiters, boolean trimTokens, boolean ignoreEmptyTokens) {
+
+		if (str == null) {
+			return null;
+		}
+		StringTokenizer st = new StringTokenizer(str, delimiters);
+		List<String> tokens = new ArrayList<String>();
+		while (st.hasMoreTokens()) {
+			String token = st.nextToken();
+			if (trimTokens) {
+				token = token.trim();
+			}
+			if (!ignoreEmptyTokens || token.length() > 0) {
+				tokens.add(token);
+			}
+		}
+		return toStringArray(tokens);
+	}
+
+	/**
+	 * Take a String which is a delimited list and convert it to a String array.
+	 * <p>A single delimiter can consists of more than one character: It will still
+	 * be considered as single delimiter string, rather than as bunch of potential
+	 * delimiter characters - in contrast to <code>tokenizeToStringArray</code>.
+	 * @param str the input String
+	 * @param delimiter the delimiter between elements (this is a single delimiter,
+	 * rather than a bunch individual delimiter characters)
+	 * @return an array of the tokens in the list
+	 * @see #tokenizeToStringArray
+	 */
+	public static String[] delimitedListToStringArray(String str, String delimiter) {
+		return delimitedListToStringArray(str, delimiter, null);
+	}
+
+	/**
+	 * Take a String which is a delimited list and convert it to a String array.
+	 * <p>A single delimiter can consists of more than one character: It will still
+	 * be considered as single delimiter string, rather than as bunch of potential
+	 * delimiter characters - in contrast to <code>tokenizeToStringArray</code>.
+	 * @param str the input String
+	 * @param delimiter the delimiter between elements (this is a single delimiter,
+	 * rather than a bunch individual delimiter characters)
+	 * @param charsToDelete a set of characters to delete. Useful for deleting unwanted
+	 * line breaks: e.g. "\r\n\f" will delete all new lines and line feeds in a String.
+	 * @return an array of the tokens in the list
+	 * @see #tokenizeToStringArray
+	 */
+	public static String[] delimitedListToStringArray(String str, String delimiter, String charsToDelete) {
+		if (str == null) {
+			return new String[0];
+		}
+		if (delimiter == null) {
+			return new String[] {str};
+		}
+		List<String> result = new ArrayList<String>();
+		if ("".equals(delimiter)) {
+			for (int i = 0; i < str.length(); i++) {
+				result.add(deleteAny(str.substring(i, i + 1), charsToDelete));
+			}
+		}
+		else {
+			int pos = 0;
+			int delPos = 0;
+			while ((delPos = str.indexOf(delimiter, pos)) != -1) {
+				result.add(deleteAny(str.substring(pos, delPos), charsToDelete));
+				pos = delPos + delimiter.length();
+			}
+			if (str.length() > 0 && pos <= str.length()) {
+				// Add rest of String, but not in case of empty input.
+				result.add(deleteAny(str.substring(pos), charsToDelete));
+			}
+		}
+		return toStringArray(result);
+	}
+
+	/**
+	 * Convert a CSV list into an array of Strings.
+	 * @param str the input String
+	 * @return an array of Strings, or the empty array in case of empty input
+	 */
+	public static String[] commaDelimitedListToStringArray(String str) {
+		return delimitedListToStringArray(str, ",");
+	}
+
+	/**
+	 * Convenience method to convert a CSV string list to a set.
+	 * Note that this will suppress duplicates.
+	 * @param str the input String
+	 * @return a Set of String entries in the list
+	 */
+	public static Set<String> commaDelimitedListToSet(String str) {
+		Set<String> set = new TreeSet<String>();
+		String[] tokens = commaDelimitedListToStringArray(str);
+		for (int i = 0; i < tokens.length; i++) {
+			set.add(tokens[i]);
+		}
+		return set;
+	}
+
+	/**
+	 * Convenience method to return a Collection as a delimited (e.g. CSV)
+	 * String. E.g. useful for <code>toString()</code> implementations.
+	 * @param coll the Collection to display
+	 * @param delim the delimiter to use (probably a ",")
+	 * @param prefix the String to start each element with
+	 * @param suffix the String to end each element with
+	 * @return the delimited String
+	 */
+	public static String collectionToDelimitedString(Collection<?> coll, String delim, String prefix, String suffix) {
+		if (CollectionUtils.isEmpty(coll)) {
+			return "";
+		}
+		StringBuffer sb = new StringBuffer();
+		Iterator<?> it = coll.iterator();
+		while (it.hasNext()) {
+			sb.append(prefix).append(it.next()).append(suffix);
+			if (it.hasNext()) {
+				sb.append(delim);
+			}
+		}
+		return sb.toString();
+	}
+
+	/**
+	 * Convenience method to return a Collection as a delimited (e.g. CSV)
+	 * String. E.g. useful for <code>toString()</code> implementations.
+	 * @param coll the Collection to display
+	 * @param delim the delimiter to use (probably a ",")
+	 * @return the delimited String
+	 */
+	public static String collectionToDelimitedString(Collection<?> coll, String delim) {
+		return collectionToDelimitedString(coll, delim, "", "");
+	}
+
+	/**
+	 * Convenience method to return a Collection as a CSV String.
+	 * E.g. useful for <code>toString()</code> implementations.
+	 * @param coll the Collection to display
+	 * @return the delimited String
+	 */
+	public static String collectionToCommaDelimitedString(Collection<?> coll) {
+		return collectionToDelimitedString(coll, ",");
+	}
+
+	/**
+	 * Convenience method to return a String array as a delimited (e.g. CSV)
+	 * String. E.g. useful for <code>toString()</code> implementations.
+	 * @param arr the array to display
+	 * @param delim the delimiter to use (probably a ",")
+	 * @return the delimited String
+	 */
+	public static String arrayToDelimitedString(Object[] arr, String delim) {
+		if (ObjectUtils.isEmpty(arr)) {
+			return "";
+		}
+		StringBuffer sb = new StringBuffer();
+		for (int i = 0; i < arr.length; i++) {
+			if (i > 0) {
+				sb.append(delim);
+			}
+			sb.append(arr[i]);
+		}
+		return sb.toString();
+	}
+
+	/**
+	 * Convenience method to return a String array as a CSV String.
+	 * E.g. useful for <code>toString()</code> implementations.
+	 * @param arr the array to display
+	 * @return the delimited String
+	 */
+	public static String arrayToCommaDelimitedString(Object[] arr) {
+		return arrayToDelimitedString(arr, ",");
+	}
+	
+    /**
+     * Divides <code>input</code> into one or more chunks, each of the
+     * supplied <code>chunkLength</code>, other than the last chunk
+     * which will be up to <code>chunkLength</code> characters long.
+     * <p/>
+     * The <code>chunkLength</code> must be greater than zero.
+     * 
+     * @param input The <code>String</code> to chunk
+     * @param chunkLength The length of the chunks
+     * @throws IllegalArgumentException If the supplied <code>chunkLength</code>
+     * is not greater than zero
+     * @return The chunks
+     */
+	public static String[] chunkString(String input, int chunkLength) {
+        if (chunkLength < 1) {
+            throw new IllegalArgumentException("Chunk length must be greater than zero");
+        }
+        
+        if (input.length() <= chunkLength) {
+            return new String[] {input};
+        }
+        
+        List<String> chunks = new ArrayList<String>();                
+        
+        for (int i = 0; i < input.length(); i += chunkLength) {            
+            int end = Math.min(i + chunkLength, input.length());            
+            chunks.add(input.substring(i, end));
+        }
+              
+        return chunks.toArray(new String[chunks.size()]);
+    }
+		
+    /**
+     * Abbreviates the given dot-separated string to reduce its length (if necessary) to within the supplied target
+     * length.
+     * 
+     * <p />
+     * 
+     * The abbreviation is performed by, starting with the left-most segment, replacing each segment in turn with its first
+     * character until the length is equal to or less than the target. If this approach fails to sufficiently reduce the
+     * string's length, the right-most segment is returned in its entirety, even if its length exceeds the target
+     * length.
+     * 
+     * <p />
+     * 
+     * For example with the input alpha.bravo.charlie.Delta the following results are produced:
+     * <table>
+     * <tr><td>Target length</td><td>Result</td></tr>
+     * <tr><td>32</td><td>alpha.bravo.charlie.Delta</td></tr>
+     * <tr><td>21</td><td>a.bravo.charlie.Delta</td></tr>
+     * <tr><td>17</td><td>a.b.charlie.Delta</td></tr>
+     * <tr><td>12</td><td>a.b.c.Delta</td></tr>
+     * <tr><td>10</td><td>Delta</td></tr>
+     * </table>
+     *  
+     * @param string The String to abbreviate
+     * @param targetLength The target length for the abbreviated String
+     * @return The abbreviated String.
+     */
+    public static String abbreviateDotSeparatedString(String string, int targetLength) {
+        if (string.length() <= targetLength) {
+            return string;
+        }
+
+        String[] components = string.split(DOT_SEPARATOR_SPLIT_REGEX);
+
+        int actualLength = string.length();
+        StringBuilder builder = new StringBuilder();
+        int index = 0;
+
+        while (actualLength > targetLength && index < components.length - 1) {
+            String component = components[index++];
+            builder.append(component.charAt(0));
+            builder.append(DOT_SEPARATOR);
+
+            actualLength -= (component.length() - 1);
+        }
+
+        if (actualLength > targetLength) {
+            return components[components.length - 1];
+        } else {
+            for (int i = index; i < components.length; i++) {
+                builder.append(components[i]);
+                if (i < components.length - 1) {
+                    builder.append(DOT_SEPARATOR);
+                }
+            }
+        }
+
+        return builder.toString();
+    }
+
+}
diff --git a/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/SynchronizedCollection.java b/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/SynchronizedCollection.java
new file mode 100644
index 0000000..d1f8646
--- /dev/null
+++ b/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/SynchronizedCollection.java
@@ -0,0 +1,228 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.common;
+
+import java.util.Collection;
+import java.util.Iterator;
+
+/**
+ * {@link SynchronizedCollection} wraps a given {@link Collection} and protects access to the collection and any
+ * iterators created from the collection by synchronizing on a given monitor.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe, but ConcurrentModificationException may still be thrown.
+ * 
+ * @param <T> type of element in collection
+ */
+public class SynchronizedCollection<T> extends SynchronizedObject implements Collection<T> {
+
+    private final Collection<T> collection;
+
+    private final Object monitor;
+
+    private static final Object tieMonitor = new Object();
+
+    /**
+     * Creates a {@link SynchronizedCollection} wrapping the given collection and synchronizing on the given monitor,
+     * neither of which may be <code>null</code>.
+     * 
+     * @param collection the collection to be wrapped, which must not be <code>null</code>
+     * @param monitor the monitor which will be used to synchronize access to the collection
+     */
+    @SuppressWarnings("unchecked")
+    public SynchronizedCollection(Collection<? extends T> collection, Object monitor) {
+        super(collection, monitor); // throws an exception if either argument is null
+        this.collection = (Collection<T>) collection;
+        this.monitor = monitor;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        synchronized (this.monitor) {
+            result = prime * result + collection.hashCode();
+        }
+        return result;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @SuppressWarnings("unchecked")
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        SynchronizedCollection<T> other = (SynchronizedCollection<T>) obj;
+        int thisHash = System.identityHashCode(this);
+        int otherHash = System.identityHashCode(other);
+        if (thisHash < otherHash) {
+            synchronized (this.monitor) {
+                synchronized (other.monitor) {
+                    if (!collection.equals(other.collection)) {
+                        return false;
+                    }
+                }
+            }
+        } else if (thisHash > otherHash) {
+            synchronized (other.monitor) {
+                synchronized (this.monitor) {
+                    if (!collection.equals(other.collection)) {
+                        return false;
+                    }
+                }
+            }
+        } else {
+            synchronized (tieMonitor) {
+                synchronized (this.monitor) {
+                    synchronized (other.monitor) {
+                        if (!collection.equals(other.collection)) {
+                            return false;
+                        }
+                    }
+                }
+            }
+        }
+        return true;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean add(T e) {
+        synchronized (this.monitor) {
+            return this.collection.add(e);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean addAll(Collection<? extends T> c) {
+        synchronized (this.monitor) {
+            return this.collection.addAll(c);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void clear() {
+        synchronized (this.monitor) {
+            this.collection.clear();
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean contains(Object o) {
+        synchronized (this.monitor) {
+            return this.collection.contains(o);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean containsAll(Collection<?> c) {
+        synchronized (this.monitor) {
+            return this.collection.containsAll(c);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isEmpty() {
+        synchronized (this.monitor) {
+            return this.collection.isEmpty();
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Iterator<T> iterator() {
+        synchronized (this.monitor) {
+            return new SynchronizedIterator<T>(this.collection.iterator(), this.monitor);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean remove(Object o) {
+        synchronized (this.monitor) {
+            return this.collection.remove(o);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean removeAll(Collection<?> c) {
+        synchronized (this.monitor) {
+            return this.collection.removeAll(c);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean retainAll(Collection<?> c) {
+        synchronized (this.monitor) {
+            return this.collection.retainAll(c);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public int size() {
+        synchronized (this.monitor) {
+            return this.collection.size();
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Object[] toArray() {
+        synchronized (this.monitor) {
+            return this.collection.toArray();
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public <U> U[] toArray(U[] a) {
+        synchronized (this.monitor) {
+            return this.collection.toArray(a);
+        }
+    }
+
+}
diff --git a/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/SynchronizedIterator.java b/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/SynchronizedIterator.java
new file mode 100644
index 0000000..422b84b
--- /dev/null
+++ b/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/SynchronizedIterator.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.common;
+
+import java.util.Iterator;
+
+/**
+ * {@link SynchronizedIterator} wraps a given {@link Iterator} and protects access to the iterator by synchronizing on
+ * the monitor of the containing {@link SynchronizedCollection}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe, but ConcurrentModificationException may still be thrown.
+ * 
+ * @param <T> the type of element the iterator returns
+ */
+public class SynchronizedIterator<T> extends SynchronizedObject implements Iterator<T> {
+
+    private final Object monitor;
+
+    private final Iterator<T> iterator;
+
+    public SynchronizedIterator(Iterator<T> iterator, Object monitor) {
+        super(iterator, monitor);
+        this.monitor = monitor;
+        this.iterator = iterator;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean hasNext() {
+        synchronized (this.monitor) {
+            return this.iterator.hasNext();
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public T next() {
+        synchronized (this.monitor) {
+            return this.iterator.next();
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void remove() {
+        synchronized (this.monitor) {
+            this.iterator.remove();
+        }
+    }
+
+}
diff --git a/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/SynchronizedList.java b/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/SynchronizedList.java
new file mode 100644
index 0000000..cf806c3
--- /dev/null
+++ b/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/SynchronizedList.java
@@ -0,0 +1,149 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.common;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.ListIterator;
+
+/**
+ * {@link SynchronizedList} wraps a given {@link List} and protects access to the collection and any
+ * iterators created from the collection by synchronizing on a given monitor.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe, but ConcurrentModificationException may still be thrown.
+ * 
+ * @param <T> the type of the list elements
+ */
+public class SynchronizedList<T> extends SynchronizedCollection<T> implements List<T> {
+    
+    final Object monitor;
+    
+    private final List<T> list;
+
+    @SuppressWarnings("unchecked")
+    public SynchronizedList(List<? extends T> list, Object monitor) {
+        super(list, monitor);
+        this.monitor = monitor;
+        this.list = (List<T>) list;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void add(int index, T element) {
+        synchronized (this.monitor) {
+            this.list.add(index, element);
+        }
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public boolean addAll(int index, Collection<? extends T> c) {
+        synchronized (this.monitor) {
+            return this.list.addAll(index, c);
+        }
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public T get(int index) {
+        synchronized (this.monitor) {
+            return this.list.get(index);
+        }
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public int indexOf(Object o) {
+        synchronized (this.monitor) {
+            return this.list.indexOf(o);
+        }
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public int lastIndexOf(Object o) {
+        synchronized (this.monitor) {
+            return this.list.lastIndexOf(o);
+        }
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public ListIterator<T> listIterator() {
+        synchronized (this.monitor) {
+            return new SynchronizedListIterator<T>(this.list.listIterator(), this.monitor);
+        }
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public ListIterator<T> listIterator(int index) {
+        synchronized (this.monitor) {
+            return new SynchronizedListIterator<T>(this.list.listIterator(index), this.monitor);
+        }
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public T remove(int index) {
+        synchronized (this.monitor) {
+            return this.list.remove(index);
+        }
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public T set(int index, T element) {
+        synchronized (this.monitor) {
+            return this.list.set(index, element);
+        }
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public List<T> subList(int fromIndex, int toIndex) {
+        synchronized (this.monitor) {
+            return new SynchronizedList<T>(this.list.subList(fromIndex, toIndex), this.monitor);
+        }
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public int hashCode() {
+        return super.hashCode();
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean equals(Object obj) {
+        return super.equals(obj);
+    }
+
+    
+}
diff --git a/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/SynchronizedListIterator.java b/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/SynchronizedListIterator.java
new file mode 100644
index 0000000..e78a6d5
--- /dev/null
+++ b/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/SynchronizedListIterator.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.common;
+
+import java.util.ListIterator;
+
+/**
+ * {@link SynchronizedListIterator} wraps a given {@link ListIterator} and protects access to the iterator by
+ * synchronizing on the monitor of the containing {@link SynchronizedList}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe, but ConcurrentModificationException may still be thrown.
+ * 
+ * @param <T> the type of the list elements
+ */
+public class SynchronizedListIterator<T> extends SynchronizedIterator<T> implements ListIterator<T> {
+
+    private final Object monitor;
+
+    private final ListIterator<T> listIterator;
+
+    public SynchronizedListIterator(ListIterator<T> listIterator, Object monitor) {
+        super(listIterator, monitor);
+        this.monitor = monitor;
+        this.listIterator = listIterator;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void add(T e) {
+        synchronized (this.monitor) {
+            this.listIterator.add(e);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean hasPrevious() {
+        synchronized (this.monitor) {
+            return this.listIterator.hasPrevious();
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public int nextIndex() {
+        synchronized (this.monitor) {
+            return this.listIterator.nextIndex();
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public T previous() {
+        synchronized (this.monitor) {
+            return this.listIterator.previous();
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public int previousIndex() {
+        synchronized (this.monitor) {
+            return this.listIterator.previousIndex();
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void set(T e) {
+        synchronized (this.monitor) {
+            this.listIterator.set(e);
+        }
+    }
+
+}
diff --git a/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/SynchronizedObject.java b/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/SynchronizedObject.java
new file mode 100644
index 0000000..dd22626
--- /dev/null
+++ b/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/SynchronizedObject.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.common;
+
+/**
+ * {@link SynchronizedObject} wraps a given {@link Object} and protects access to the object by synchronizing on a given
+ * monitor.
+ * <p />
+ * Note that <code>hashCode</code> and <code>equals</code> are not delegated as this object is distinct from the wrapped object.
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ */
+public class SynchronizedObject extends Object {
+
+    private final Object monitor;
+
+    private final Object object;
+
+    public SynchronizedObject(Object object, Object monitor) {
+        if (object == null) {
+            throw new IllegalArgumentException("null object");
+        }
+        if (monitor == null) {
+            throw new IllegalArgumentException("null monitor");
+        }
+        this.object = object;
+        this.monitor = monitor;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String toString() {
+        synchronized (this.monitor) {
+            return this.object.toString();
+        }
+    }
+
+}
diff --git a/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/ThreadSafeArrayListTree.java b/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/ThreadSafeArrayListTree.java
new file mode 100644
index 0000000..9815e99
--- /dev/null
+++ b/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/ThreadSafeArrayListTree.java
@@ -0,0 +1,307 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.common;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * {@link ThreadSafeArrayListTree} is a value with an ordered collection of subtrees of the same type as the main tree.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ * @param <V> type of values in tree
+ */
+
+public final class ThreadSafeArrayListTree<V> implements Tree<V> {
+
+    private volatile V value;
+
+    private final Object monitor;
+
+    private static final Object tieMonitor = new Object();
+
+    private final List<ThreadSafeArrayListTree<V>> children = new ArrayList<ThreadSafeArrayListTree<V>>();
+
+    private Tree<V> parent;
+
+    /**
+     * Construct a tree with the given value, which may be <code>null</code>.
+     * 
+     * @param value the value of the tree, which may be <code>null</code>
+     */
+    public ThreadSafeArrayListTree(V value) {
+        this(value, new Object());
+    }
+
+    protected ThreadSafeArrayListTree(V value, Object monitor) {
+        this.value = value;
+        this.monitor = monitor;
+    }
+
+    /**
+     * Construct a tree by deeply copying the given tree, using the given parent, and inheriting the given monitor.
+     * 
+     * @param tree the tree to copy
+     * @param parent the parent of the new tree or <code>null</code>
+     * @param monitor the monitor to inherit
+     */
+    protected ThreadSafeArrayListTree(Tree<V> tree, Tree<V> parent, Object monitor) {
+        this.value = tree.getValue();
+        this.monitor = monitor;
+        this.parent = parent;
+        for (Tree<V> child : tree.getChildren()) {
+            this.children.add(new ThreadSafeArrayListTree<V>(child, this, this.monitor));
+        }
+    }
+
+    /**
+     * Returns the tree's value. If there is no value associated with this tree, returns <code>null</code>.
+     * 
+     * @return the value, which may be <code>null</code>
+     */
+    public final V getValue() {
+        return this.value;
+    }
+
+    /**
+     * Returns a list of this tree's children (not copies of the children). If the tree has no children, returns an
+     * empty list. Never returns <code>null</code> .
+     * <p/>
+     * The returned list is synchronized to preserve thread safety, but may still result in
+     * ConcurrentModificationException being thrown.
+     * 
+     * @return this tree's children
+     */
+    public List<Tree<V>> getChildren() {
+        synchronized (this.monitor) {
+            return new SynchronizedList<Tree<V>>(this.children, this.monitor);
+        }
+    }
+
+    /**
+     * Adds a new child tree to this node's children. The child tree is copied, although its values are not. The copy
+     * shares this tree's monitor.
+     * 
+     * @param child the child tree to add
+     * @return the copy of the child tree
+     */
+    public Tree<V> addChild(Tree<V> child) {
+        synchronized (this.monitor) {
+            ThreadSafeArrayListTree<V> childCopy = new ThreadSafeArrayListTree<V>(child, this, this.monitor);
+            this.children.add(childCopy);
+            return childCopy;
+        }
+    }
+
+    /**
+     * Removes the first occurrence of the given child tree from this node's children. Returns <code>true</code> if the
+     * child was found and removed, otherwise <code>false</code>.
+     * 
+     * @param child the child tree to remove
+     * @return <code>true</code> if the child tree was removed successfully, otherwise <code>false</code>.
+     * @see java.util.List#remove
+     */
+    public boolean removeChild(Tree<V> child) {
+        synchronized (this.monitor) {
+            boolean removed = this.children.remove(child);
+            if (removed) {
+                setParent(child, null);
+            }
+            return removed;
+        }
+    }
+
+    /*
+     * All the children in this.children share this.monitor.
+     */
+    private void setParent(Tree<V> child, Tree<V> parent) {
+        synchronized (this.monitor) {
+            if (child instanceof ThreadSafeArrayListTree<?>) {
+                ThreadSafeArrayListTree<V> concreteChild = (ThreadSafeArrayListTree<V>) child;
+                concreteChild.parent = parent;
+            }
+        }
+    }
+
+    /**
+     * Traverse this {@link ThreadSafeArrayListTree} in preorder (see below) and call the visit method of the given
+     * {@link Tree.TreeVisitor} at each node. The visitor determines whether the children of each visited tree should
+     * also be visited.
+     * <p/>
+     * Preorder traversal visits the tree and then visits, in preorder, each child of the tree.
+     * 
+     * @param visitor a {@link Tree.TreeVisitor}
+     */
+    public void visit(TreeVisitor<V> visitor) {
+        if (visitor.visit(this)) {
+            for (int i = 0; i < numChildren(); i++) {
+                ThreadSafeArrayListTree<V> nextChild = getChild(i);
+                if (nextChild != null) {
+                    nextChild.visit(visitor);
+                } else {
+                    break;
+                }
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public <E extends Exception> void visit(ExceptionThrowingTreeVisitor<V, E> visitor) throws E {
+        if (visitor.visit(this)) {
+            for (int i = 0; i < numChildren(); i++) {
+                ThreadSafeArrayListTree<V> nextChild = getChild(i);
+                if (nextChild != null) {
+                    nextChild.visit(visitor);
+                } else {
+                    break;
+                }
+            }
+        }
+    }
+
+    private ThreadSafeArrayListTree<V> getChild(int i) {
+        synchronized (this.monitor) {
+            try {
+                return this.children.get(i);
+            } catch (IndexOutOfBoundsException e) {
+                return null;
+            }
+        }
+    }
+
+    private int numChildren() {
+        synchronized (this.monitor) {
+            return this.children.size();
+        }
+    }
+
+    /**
+     * Returns the number of nodes in the tree. This is one plus the sum of the number of nodes in each of the children.
+     * <p/>
+     * If there are more than <tt>Integer.MAX_VALUE</tt> node, the return value is undefined and the user should seek
+     * professional help.
+     * 
+     * @return the number of non-<code>null</code> nodes in the tree
+     */
+    public int size() {
+        int size = 1;
+        synchronized (this.monitor) {
+            for (ThreadSafeArrayListTree<V> child : this.children) {
+                size += child.size();
+            }
+        }
+        return size;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int hashCode() {
+        synchronized (this.monitor) {
+            final int prime = 31;
+            int result = 1;
+            result = prime * result + children.hashCode();
+            result = prime * result + ((value == null) ? 0 : value.hashCode());
+            return result;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @SuppressWarnings("unchecked")
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        ThreadSafeArrayListTree<V> other = (ThreadSafeArrayListTree<V>) obj;
+        int thisHash = System.identityHashCode(this);
+        int otherHash = System.identityHashCode(other);
+        if (thisHash < otherHash) {
+            synchronized (this.monitor) {
+                synchronized (other.monitor) {
+                    if (!children.equals(other.children)) {
+                        return false;
+                    }
+                }
+            }
+        } else if (thisHash > otherHash) {
+            synchronized (other.monitor) {
+                synchronized (this.monitor) {
+                    if (!children.equals(other.children)) {
+                        return false;
+                    }
+                }
+            }
+        } else {
+            synchronized (tieMonitor) {
+                synchronized (this.monitor) {
+                    synchronized (other.monitor) {
+                        if (!children.equals(other.children)) {
+                            return false;
+                        }
+                    }
+                }
+            }
+        }
+        if (value == null) {
+            if (other.value != null) {
+                return false;
+            }
+        } else if (!value.equals(other.value)) {
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String toString() {
+        StringBuffer result = new StringBuffer();
+        result.append(this.value != null ? this.value : "null").append("<");
+        synchronized (this.monitor) {
+            boolean first = true;
+            for (ThreadSafeArrayListTree<V> child : this.children) {
+                if (!first) {
+                    result.append(", ");
+                }
+                result.append(child.toString());
+                first = false;
+            }
+        }
+        result.append(">");
+        return result.toString();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Tree<V> getParent() {
+        return this.parent;
+    }
+}
diff --git a/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/ThreadSafeDirectedAcyclicGraph.java b/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/ThreadSafeDirectedAcyclicGraph.java
new file mode 100644
index 0000000..03aa4da
--- /dev/null
+++ b/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/ThreadSafeDirectedAcyclicGraph.java
@@ -0,0 +1,172 @@
+/*******************************************************************************
+ * Copyright (c) 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution (ThreadSafeArrayListTree.java)
+ *   EclipseSource - reworked from generic tree to DAG (Bug 358697)
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.common;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * {@link DirectedAcyclicGraph} is a set of {@link GraphNode}s with a parent child relationship. The nodes are connected
+ * to each other in a way that it is impossible to start at a node n and follow a child relationship that loops back to
+ * n. The DAG may have multiple root nodes (nodes with no parents) and nodes may share children.
+ * <p />
+ * Once created a root node can become a non-root node by adding the node as a child to another node. This can be done
+ * by calling the method addChild on a node. All nodes of a DAG are reachable from its root nodes.
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ * @param <V> type of values in the graph
+ */
+public class ThreadSafeDirectedAcyclicGraph<V> implements DirectedAcyclicGraph<V> {
+
+    private final Object monitor = new Object();
+
+    private static final Object tieMonitor = new Object();
+
+    private final List<ThreadSafeGraphNode<V>> nodes = new ArrayList<ThreadSafeGraphNode<V>>();
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public ThreadSafeGraphNode<V> createRootNode(V value) {
+        synchronized (this.monitor) {
+            ThreadSafeGraphNode<V> node = new ThreadSafeGraphNode<V>(value, this.monitor);
+            this.nodes.add(node);
+            return node;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean deleteRootNode(GraphNode<V> node) {
+        assertTypeAndMembership(node);
+        synchronized (this.monitor) {
+            Assert.isTrue(node.getChildren().isEmpty(), "Cannot delete node '%s'. Node has children. Please remove the children first.", node);
+            Assert.isTrue(node.getParents().isEmpty(),
+                "Cannot delete node '%s'. Node is still in use. Please remove it from the other node(s) first.", node);
+            boolean removed = this.nodes.remove(node);
+            return removed;
+        }
+    }
+
+    private ThreadSafeGraphNode<V> assertTypeAndMembership(GraphNode<V> child) {
+        Assert.isInstanceOf(ThreadSafeGraphNode.class, child, "A child must be of type %s.", this.getClass().getName());
+        ThreadSafeGraphNode<V> concreteChild = (ThreadSafeGraphNode<V>) child;
+        Assert.isTrue(concreteChild.belongsToSameGraph(this.monitor), "The node '%s' does not belong to the graph '%s'", concreteChild, this);
+        return concreteChild;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public List<GraphNode<V>> getRootNodes() {
+        List<GraphNode<V>> rootNodes = new ArrayList<GraphNode<V>>();
+        synchronized (this.monitor) {
+            for (GraphNode<V> node : this.nodes) {
+                if (node.isRootNode()) {
+                    rootNodes.add(node);
+                }
+            }
+            return rootNodes;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String toString() {
+        StringBuffer result = new StringBuffer();
+        result.append("<");
+        synchronized (this.monitor) {
+            boolean first = true;
+            for (GraphNode<V> child : getRootNodes()) {
+                if (!first) {
+                    result.append(", ");
+                }
+                result.append(child.toString());
+                first = false;
+            }
+        }
+        result.append(">");
+        return result.toString();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int hashCode() {
+        synchronized (this.monitor) {
+            final int prime = 31;
+            int result = 1;
+            result = prime * result + this.nodes.hashCode();
+            return result;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @SuppressWarnings("unchecked")
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        ThreadSafeDirectedAcyclicGraph<V> other = (ThreadSafeDirectedAcyclicGraph<V>) obj;
+        int thisHash = System.identityHashCode(this);
+        int otherHash = System.identityHashCode(other);
+        if (thisHash < otherHash) {
+            synchronized (this.monitor) {
+                synchronized (other.monitor) {
+                    if (!this.nodes.equals(other.nodes)) {
+                        return false;
+                    }
+                }
+            }
+        } else if (thisHash > otherHash) {
+            synchronized (other.monitor) {
+                synchronized (this.monitor) {
+                    if (!this.nodes.equals(other.nodes)) {
+                        return false;
+                    }
+                }
+            }
+        } else {
+            synchronized (tieMonitor) {
+                synchronized (this.monitor) {
+                    synchronized (other.monitor) {
+                        if (!this.nodes.equals(other.nodes)) {
+                            return false;
+                        }
+                    }
+                }
+            }
+        }
+        return true;
+    }
+
+}
diff --git a/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/ThreadSafeGraphNode.java b/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/ThreadSafeGraphNode.java
new file mode 100644
index 0000000..ac35556
--- /dev/null
+++ b/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/ThreadSafeGraphNode.java
@@ -0,0 +1,393 @@
+/*******************************************************************************
+ * Copyright (c) 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution (ThreadSafeArrayListTree.java)
+ *   EclipseSource - reworked from generic tree to DAG (Bug 358697)
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.common;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * {@link GraphNode} is a node in a {@link DirectedAcyclicGraph}. Each node has a value.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * This class is thread safe.
+ * 
+ * @param <V> type of values in the graph
+ */
+class ThreadSafeGraphNode<V> implements GraphNode<V> {
+
+    private final V value;
+
+    private final Object monitor;
+
+    private static final Object tieMonitor = new Object();
+
+    private final List<ThreadSafeGraphNode<V>> children = new ArrayList<ThreadSafeGraphNode<V>>();
+
+    private final List<ThreadSafeGraphNode<V>> parents = new ArrayList<ThreadSafeGraphNode<V>>();
+
+    /**
+     * Construct a {@link ThreadSafeGraphNode} with the given value, which may be <code>null</code>.
+     * 
+     * @param value the value of the node, which may be <code>null</code>
+     * @param monitor the shared monitor of the graph
+     */
+    ThreadSafeGraphNode(V value, Object monitor) {
+        this.value = value;
+        this.monitor = monitor;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public V getValue() {
+        return this.value;
+    }
+
+    /**
+     * Returns a list of this node's children (not copies of the children). If the node has no children, returns an
+     * empty list. Never returns <code>null</code> .
+     * <p/>
+     * The returned list is synchronized to preserve thread safety, but may still result in
+     * ConcurrentModificationException being thrown.
+     * 
+     * @return this node's children
+     */
+    @Override
+    public List<GraphNode<V>> getChildren() {
+        synchronized (this.monitor) {
+            return new SynchronizedList<GraphNode<V>>(this.children, this.monitor);
+        }
+    }
+
+    /**
+     * Adds the given node as child to this node. The child node is <strong>not</strong> copied.
+     * 
+     * @param child the node to add
+     * @throws IllegalArgumentException if the given node does not belong to the same {@link DirectedAcyclicGraph}.
+     * @throws IllegalArgumentException if the given node is already a child of this node.
+     * @throws IllegalArgumentException if the given node is not a {@link ThreadSafeGraphNode}.
+     */
+    @Override
+    public void addChild(GraphNode<V> child) {
+        ThreadSafeGraphNode<V> concreteChild = assertTypeAndMembership(child);
+        synchronized (this.monitor) {
+            Assert.isFalse(this.children.contains(child), "The node '%s' is already a child of '%s'", child, this);
+            doCycleCheck(concreteChild);
+            this.children.add(concreteChild);
+            concreteChild.parents.add(this);
+        }
+    }
+
+    private ThreadSafeGraphNode<V> assertTypeAndMembership(GraphNode<V> child) {
+        Assert.isInstanceOf(ThreadSafeGraphNode.class, child, "A child must be of type %s.", this.getClass().getName());
+        ThreadSafeGraphNode<V> concreteChild = (ThreadSafeGraphNode<V>) child;
+        Assert.isTrue(belongsToSameGraph(concreteChild), "The node '%s' does not belong to the same graph as '%s'", concreteChild, this);
+        return concreteChild;
+    }
+
+    private boolean belongsToSameGraph(ThreadSafeGraphNode<V> other) {
+        return this.monitor == other.monitor;
+    }
+
+    protected boolean belongsToSameGraph(Object monitor) {
+        return this.monitor == monitor;
+    }
+
+    // check for cycles when adding a new child to a parent (is this node a descendant of the new child?).
+    private void doCycleCheck(GraphNode<V> child) {
+        synchronized (this.monitor) {
+            DescendentChecker<V> descendentChecker = new DescendentChecker<V>(this);
+            child.visit(descendentChecker);
+            Assert.isFalse(descendentChecker.isDescendent(), "Can't add '%s'. This node is a descendent of the new child.", child);
+        }
+    }
+
+    /**
+     * Removes the occurrence of the given node from this node's children. Returns <code>true</code> if the child was
+     * found and removed, otherwise <code>false</code>.
+     * 
+     * @param child the node to remove
+     * @throws IllegalArgumentException if the given node does not belong to the same {@link DirectedAcyclicGraph}.
+     * @throws IllegalArgumentException if the given node is not a {@link ThreadSafeGraphNode}.
+     * @return <code>true</code> if the node was removed successfully, otherwise <code>false</code>.
+     * @see java.util.List#remove
+     */
+    @Override
+    public boolean removeChild(GraphNode<V> child) {
+        ThreadSafeGraphNode<V> concreteChild = assertTypeAndMembership(child);
+        synchronized (this.monitor) {
+            boolean removed = this.children.remove(concreteChild);
+            if (removed) {
+                removeParent(child, this);
+            }
+            return removed;
+        }
+    }
+
+    /*
+     * All the children in this.children share this.monitor.
+     */
+    private void removeParent(GraphNode<V> child, GraphNode<V> parent) {
+        synchronized (this.monitor) {
+            if (child instanceof ThreadSafeGraphNode<?>) {
+                ThreadSafeGraphNode<V> concreteChild = (ThreadSafeGraphNode<V>) child;
+                concreteChild.parents.remove(parent);
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void visit(DirectedAcyclicGraphVisitor<V> visitor) {
+        visitInternal(visitor, new HashMap<ThreadSafeGraphNode<V>, Boolean>());
+    }
+
+    private void visitInternal(DirectedAcyclicGraphVisitor<V> visitor, Map<ThreadSafeGraphNode<V>, Boolean> visitedFlags) {
+        if (visitedFlags.containsKey(this)) {
+            return;
+        }
+        visitedFlags.put(this, Boolean.TRUE);
+        if (visitor.visit(this)) {
+            for (int i = 0; i < numChildren(); i++) {
+                ThreadSafeGraphNode<V> nextChild = getChild(i);
+                if (nextChild != null) {
+                    nextChild.visitInternal(visitor, visitedFlags);
+                } else {
+                    break;
+                }
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public <E extends Exception> void visit(ExceptionThrowingDirectedAcyclicGraphVisitor<V, E> visitor) throws E {
+        visitInternal(visitor, new HashMap<ThreadSafeGraphNode<V>, Boolean>());
+    }
+
+    private <E extends Exception> void visitInternal(ExceptionThrowingDirectedAcyclicGraphVisitor<V, E> visitor,
+        Map<ThreadSafeGraphNode<V>, Boolean> visitedFlags) throws E {
+        if (visitedFlags.containsKey(this)) {
+            return;
+        }
+        visitedFlags.put(this, Boolean.TRUE);
+        if (visitor.visit(this)) {
+            for (int i = 0; i < numChildren(); i++) {
+                ThreadSafeGraphNode<V> nextChild = getChild(i);
+                if (nextChild != null) {
+                    nextChild.visitInternal(visitor, visitedFlags);
+                } else {
+                    break;
+                }
+            }
+        }
+    }
+
+    private ThreadSafeGraphNode<V> getChild(int i) {
+        synchronized (this.monitor) {
+            try {
+                return this.children.get(i);
+            } catch (IndexOutOfBoundsException e) {
+                return null;
+            }
+        }
+    }
+
+    private int numChildren() {
+        synchronized (this.monitor) {
+            return this.children.size();
+        }
+    }
+
+    private static class DescendentChecker<V> implements DirectedAcyclicGraphVisitor<V> {
+
+        private final ThreadSafeGraphNode<V> prospect;
+
+        private boolean descendent = false;
+
+        public DescendentChecker(ThreadSafeGraphNode<V> prospect) {
+            this.prospect = prospect;
+        }
+
+        @Override
+        public boolean visit(GraphNode<V> node) {
+            if (this.descendent) {
+                return false;
+            }
+            if (this.prospect == node) {
+                this.descendent = true;
+                return false;
+            }
+            return true;
+        }
+
+        public boolean isDescendent() {
+            return this.descendent;
+        }
+
+    }
+
+    private static class SizeVisitor<V> implements DirectedAcyclicGraphVisitor<V> {
+
+        private int size;
+
+        @Override
+        public boolean visit(GraphNode<V> dag) {
+            this.size += 1;
+            return true;
+        }
+
+        public int getSize() {
+            return this.size;
+        }
+    };
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int size() {
+        SizeVisitor<V> sizeVisitor = new SizeVisitor<V>();
+        visit(sizeVisitor);
+        return sizeVisitor.getSize();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int hashCode() {
+        synchronized (this.monitor) {
+            final int prime = 31;
+            int result = 1;
+            result = prime * result + this.children.hashCode();
+            result = prime * result + (this.value == null ? 0 : this.value.hashCode());
+            return result;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    // TODO TSGN.equals regards nodes as equal which have different sets of parents.
+    // TODO TSGN.equals regards distinct nodes with no children (no parents once the todo above is fixed) and the same
+    // value as equal. These nodes were created separately, possibly even from distinct DAGs as currently coded.
+    @SuppressWarnings("unchecked")
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        ThreadSafeGraphNode<V> other = (ThreadSafeGraphNode<V>) obj;
+        int thisHash = System.identityHashCode(this);
+        int otherHash = System.identityHashCode(other);
+        if (thisHash < otherHash) {
+            synchronized (this.monitor) {
+                synchronized (other.monitor) {
+                    if (!this.children.equals(other.children)) {
+                        return false;
+                    }
+                }
+            }
+        } else if (thisHash > otherHash) {
+            synchronized (other.monitor) {
+                synchronized (this.monitor) {
+                    if (!this.children.equals(other.children)) {
+                        return false;
+                    }
+                }
+            }
+        } else {
+            synchronized (tieMonitor) {
+                synchronized (this.monitor) {
+                    synchronized (other.monitor) {
+                        if (!this.children.equals(other.children)) {
+                            return false;
+                        }
+                    }
+                }
+            }
+        }
+        if (this.value == null) {
+            if (other.value != null) {
+                return false;
+            }
+        } else if (!this.value.equals(other.value)) {
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String toString() {
+        StringBuffer result = new StringBuffer();
+        result.append(this.value != null ? this.value : "null").append("<");
+        synchronized (this.monitor) {
+            boolean first = true;
+            for (ThreadSafeGraphNode<V> child : this.children) {
+                if (!first) {
+                    result.append(", ");
+                }
+                result.append(child.toString());
+                first = false;
+            }
+        }
+        result.append(">");
+        return result.toString();
+    }
+
+    /**
+     * Returns a list of this graph's parents (not copies of the parents). If the graph has no parents, returns an empty
+     * list. Never returns <code>null</code> .
+     * <p/>
+     * The returned list is synchronized to preserve thread safety, but may still result in
+     * ConcurrentModificationException being thrown.
+     * 
+     * @return this graph's parents
+     */
+    // TODO TSGN.getParents share its monitor with return values of getParents and getChildren. It feels as if the user
+    // might get some surprising deadlocks.
+    @Override
+    public List<GraphNode<V>> getParents() {
+        synchronized (this.monitor) {
+            return new SynchronizedList<GraphNode<V>>(this.parents, this.monitor);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean isRootNode() {
+        return this.parents.isEmpty();
+    }
+
+}
diff --git a/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/Tree.java b/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/Tree.java
new file mode 100644
index 0000000..7ccd857
--- /dev/null
+++ b/util/org.eclipse.virgo.util.common/src/main/java/org/eclipse/virgo/util/common/Tree.java
@@ -0,0 +1,152 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.common;
+
+import java.util.List;
+
+/**
+ * {@link Tree} is a value with an ordered collection of subtrees of the same type as the main tree.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations of this interface may or may not be thread safe.
+ * 
+ * @param <V> type of values in tree nodes
+ */
+
+public interface Tree<V> {
+
+    /**
+     * {@link Tree.TreeVisitor} is an interface used to visit a tree and, at the option of the visitor, its children and so
+     * on recursively.
+     * <p />
+     * 
+     * <strong>Concurrent Semantics</strong><br />
+     * 
+     * Implementations of this interface should be thread safe when used with a thread safe <code>Tree</code>
+     * implementation.
+     * @param <V> type of values in tree nodes
+     */
+    public interface TreeVisitor<V> {
+
+        /**
+         * Visits the given {@link Tree}. The return value determines whether or not any children of the given tree are
+         * visited.
+         * 
+         * @param tree a <code>Tree</code>
+         * @return <code>true</code> if and only if the children of the given tree should be visited.
+         */
+        boolean visit(Tree<V> tree);
+
+    }
+
+    /**
+     * An <code>ExceptionThrowingTreeVisitor</code> is used to visit a tree when the {@link #visit(Tree)} implementation
+     * needs to be able to throw a checked {@link Exception}.
+     * <p />
+     * 
+     * <strong>Concurrent Semantics</strong><br />
+     * 
+     * Implementations of this interface should be thread safe when used with a thread safe <code>Tree</code>
+     * implementation.
+     * @param <V> type of values in tree nodes
+     * @param <E> type of exceptions possibly thrown
+     */
+    public interface ExceptionThrowingTreeVisitor<V, E extends Exception> {
+
+        /**
+         * Visits the given {@link Tree}. The return value determines whether or not any children of the given tree are
+         * visited.
+         * 
+         * @param tree a <code>Tree</code>
+         * @throws E if an error occurs when visiting the tree
+         * @return <code>true</code> if and only if the children of the given tree should be visited.
+         */
+        boolean visit(Tree<V> tree) throws E;
+
+    }
+
+    /**
+     * Returns the tree's value. If there is no value associated with this tree, returns <code>null</code>.
+     * 
+     * @return the value, which may be <code>null</code>
+     */
+    V getValue();
+
+    /**
+     * Returns a list of this tree's children (not copies of the children). If the tree has no children, returns an
+     * empty list. Never returns <code>null</code> .
+     * 
+     * @return this tree's children
+     */
+    List<Tree<V>> getChildren();
+
+    /**
+     * Adds a new child tree to this node's children. The child tree is copied, although its values are not.
+     * 
+     * @param child the child tree to add
+     * @return the copy of the child tree
+     */
+    Tree<V> addChild(Tree<V> child);
+
+    /**
+     * Removes the first occurrence of the given child tree from this node's children. Returns <code>true</code> if the
+     * child was found and removed, otherwise <code>false</code>.
+     * 
+     * @param child the child tree to remove
+     * @return <code>true</code> if the child tree was removed successfully, otherwise <code>false</code>.
+     * @see java.util.List#remove
+     */
+    boolean removeChild(Tree<V> child);
+    
+    /**
+     * Returns this tree's parent. If this tree does not have a parent, returns <code>null</code>.
+     * 
+     * @return this tree's parent
+     */
+    Tree<V> getParent();
+
+    /**
+     * Traverse this {@link Tree} in preorder (see below) and call the visit method of the given {@link TreeVisitor} at
+     * each node. The visitor determines whether the children of each visited tree should also be visited.
+     * <p/>
+     * Preorder traversal visits the tree and then visits, in preorder, each child of the tree.
+     * 
+     * @param visitor a {@link TreeVisitor}
+     */
+    void visit(TreeVisitor<V> visitor);
+
+    /**
+     * Traverse this {@link Tree} in preorder (see below) and call the visit method of the given
+     * {@link ExceptionThrowingTreeVisitor} at each node. The visitor determines whether the children of each visited
+     * tree should also be visited.
+     * <p/>
+     * Preorder traversal visits the tree and then visits, in preorder, each child of the tree.
+     * @param <E> type of exception possibly thrown
+     * 
+     * @param visitor the tree's visitor
+     * @throws E if an error occurs when visiting the tree
+     */
+    <E extends Exception> void visit(ExceptionThrowingTreeVisitor<V, E> visitor) throws E;
+
+    /**
+     * Returns the number of nodes in the tree. This is one plus the sum of the number of nodes in each of the children.
+     * <p/>
+     * If there are more than <tt>Integer.MAX_VALUE</tt> node, the return value is undefined and the user should seek
+     * professional help.
+     * 
+     * @return the number of non-<code>null</code> nodes in the tree
+     */
+    int size();
+
+}
diff --git a/util/org.eclipse.virgo.util.common/src/main/resources/about.html b/util/org.eclipse.virgo.util.common/src/main/resources/about.html
new file mode 100644
index 0000000..c258ef5
--- /dev/null
+++ b/util/org.eclipse.virgo.util.common/src/main/resources/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>June 5, 2006</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/AssertTests.java b/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/AssertTests.java
new file mode 100644
index 0000000..9424680
--- /dev/null
+++ b/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/AssertTests.java
@@ -0,0 +1,173 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.common;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.virgo.util.common.Assert;
+import org.junit.Test;
+
+/**
+ */
+public class AssertTests {
+
+    @Test
+    public void testHasLength() {
+        try {
+            Assert.hasLength(null, "blah");
+            org.junit.Assert.assertTrue(false);
+        } catch (IllegalArgumentException e) {
+        }
+        try {
+            Assert.hasLength("", "blah");
+            org.junit.Assert.assertTrue(false);
+        } catch (IllegalArgumentException e) {
+        }
+        Assert.hasLength("x", "blah");
+    }
+
+    @Test
+    public void testIsAssignable() {
+        try {
+            Assert.isAssignable(String.class, Object.class, "blah");
+            org.junit.Assert.assertTrue(false);
+        } catch (IllegalArgumentException e) {
+        }
+        try {
+            Assert.isAssignable(null, Object.class, "blah");
+            org.junit.Assert.assertTrue(false);
+        } catch (IllegalArgumentException e) {
+        }
+        try {
+            Assert.isAssignable(Object.class, null, "blah");
+            org.junit.Assert.assertTrue(false);
+        } catch (IllegalArgumentException e) {
+        }
+        Assert.isAssignable(Object.class, Object.class, "blah");
+        Assert.isAssignable(Object.class, String.class, "blah");
+    }
+
+    @Test
+    public void testIsInstanceOf() {
+        try {
+            Assert.isInstanceOf(Integer.class, "", "blah");
+            org.junit.Assert.assertTrue(false);
+        } catch (IllegalArgumentException e) {
+        }
+        try {
+            Assert.isInstanceOf(null, "", "blah");
+            org.junit.Assert.assertTrue(false);
+        } catch (IllegalArgumentException e) {
+        }
+        try {
+            Assert.isInstanceOf(Integer.class, null, "blah");
+            org.junit.Assert.assertTrue(false);
+        } catch (IllegalArgumentException e) {
+        }
+        Assert.isInstanceOf(String.class, "", "blah");
+    }
+
+    @Test
+    public void testIsNull() {
+        try {
+            Assert.isNull("", "blah");
+            org.junit.Assert.assertTrue(false);
+        } catch (IllegalArgumentException e) {
+        }
+        Assert.isNull(null, "blah");
+    }
+
+    @Test
+    public void testIsTrue() {
+        try {
+            Assert.isTrue(false, "blah");
+            org.junit.Assert.assertTrue(false);
+        } catch (IllegalArgumentException e) {
+        }
+        Assert.isTrue(true, "blah");
+    }
+    
+    @Test
+    public void testIsFalse() {
+    	try {
+    		Assert.isFalse(true, "blah");
+    		org.junit.Assert.assertTrue(false);
+    	} catch (IllegalArgumentException e) {
+    	}
+    	Assert.isFalse(false, "blah");
+    }
+    
+    @Test
+    public void testNotEmptyCollection() {
+        try {
+            Assert.notEmpty(new HashSet<String>(), "blah");
+            org.junit.Assert.assertTrue(false);
+        } catch (IllegalArgumentException e) {
+        }
+        try {
+            Assert.notEmpty((Collection<String>)null, "blah");
+            org.junit.Assert.assertTrue(false);
+        } catch (IllegalArgumentException e) {
+        }
+        Set<String> a = new HashSet<String>();
+        a.add("x");
+        Assert.notEmpty(a, "blah");
+    }
+    
+    @Test
+    public void testNotEmptyMap() {
+        try {
+            Assert.notEmpty(new HashMap<String, String>(), "blah");
+            org.junit.Assert.assertTrue(false);
+        } catch (IllegalArgumentException e) {
+        }
+        try {
+            Assert.notEmpty((Map<String, String>)null, "blah");
+            org.junit.Assert.assertTrue(false);
+        } catch (IllegalArgumentException e) {
+        }
+        Map<String, String> a = new HashMap<String, String>();
+        a.put("k", "v");
+        Assert.notEmpty(a, "blah");
+    }
+    
+    @Test
+    public void testNotEmptyArray() {
+        try {
+            Object[] a = {};
+            Assert.notEmpty(a, "blah");
+            org.junit.Assert.assertTrue(false);
+        } catch (IllegalArgumentException e) {
+        }
+        try {
+            Assert.notEmpty((Object[])null, "blah");
+            org.junit.Assert.assertTrue(false);
+        } catch (IllegalArgumentException e) {
+        }
+        Object[] a = {"x"};
+        Assert.notEmpty(a, "blah");
+    }
+    
+    @Test
+    public void testNotNull() {
+        try {
+            Assert.notNull(null, "blah");
+            org.junit.Assert.assertTrue(false);
+        } catch (IllegalArgumentException e) {
+        }
+        Assert.notNull("x", "blah");
+    }
+}
diff --git a/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/CaseInsensitiveMapTests.java b/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/CaseInsensitiveMapTests.java
new file mode 100644
index 0000000..0d8535c
--- /dev/null
+++ b/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/CaseInsensitiveMapTests.java
@@ -0,0 +1,236 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.common;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.Map.Entry;
+
+import org.eclipse.virgo.util.common.CaseInsensitiveMap;
+import org.junit.Test;
+
+/**
+ */
+public class CaseInsensitiveMapTests {
+    
+    @Test
+    public void testClear() {
+        CaseInsensitiveMap<Integer> m = new CaseInsensitiveMap<Integer>();
+        m.put("oNe", 1);
+        assertFalse(m.equals(new CaseInsensitiveMap<Integer>()));
+        m.clear();
+        assertEquals(new CaseInsensitiveMap<Integer>(), m);
+        assertTrue(m.isEmpty());
+    }
+    
+    @Test
+    public void testGet() {
+        CaseInsensitiveMap<Integer> m = new CaseInsensitiveMap<Integer>();
+        m.put("oNe", 1);
+        assertEquals(new Integer(1), m.get("oNe"));
+        assertEquals(null, m.get("two"));
+        assertEquals(null, m.get(null));
+    }
+
+    @Test
+    public void testContainsKey() {
+        CaseInsensitiveMap<Integer> m = new CaseInsensitiveMap<Integer>();
+        m.put("oNe", 1);
+        assertTrue(m.containsKey("oNe"));
+        assertTrue(m.containsKey("one"));
+        assertTrue(m.containsKey("ONe"));
+        assertTrue(m.containsKey("ONE"));
+        assertFalse(m.containsKey(m));
+        assertFalse(m.containsKey(null));
+    }
+
+    @Test
+    public void testContainsValue() {
+        CaseInsensitiveMap<Integer> m = new CaseInsensitiveMap<Integer>();
+        m.put("oNe", 1);
+        assertTrue(m.containsValue(1));
+    }
+
+    @Test
+    public void testEntrySet() {
+        CaseInsensitiveMap<Integer> m = new CaseInsensitiveMap<Integer>();
+        m.put("oNe", 1);
+        m.put("Two", 2);
+        Set<Entry<String, Integer>> e = m.entrySet();
+        assertTrue(e.contains(new Entry<String, Integer>() {
+
+            public String getKey() {
+                return "one";
+            }
+
+            public Integer getValue() {
+                return 1;
+            }
+
+            public Integer setValue(Integer value) {
+                return null;
+            }
+        }));
+        assertFalse(e.contains(new Entry<String, Integer>() {
+
+            public String getKey() {
+                return "one";
+            }
+
+            public Integer getValue() {
+                return null;
+            }
+
+            public Integer setValue(Integer value) {
+                return null;
+            }
+        }));
+        assertEquals(2, e.size());
+        for (Entry<String, Integer> entry : e) {
+            if ("Two".equals(entry.getKey())) {
+                assertEquals(new Integer(2), entry.getValue());
+                entry.setValue(3);
+            }
+        }
+        assertEquals(new Integer(3), m.get("tWO"));
+        assertTrue(m.containsKey("one"));
+        for (Entry<String, Integer> entry : e) {
+            if ("oNe".equals(entry.getKey())) {
+                assertTrue(e.remove(entry));
+            }
+        }
+        assertFalse(m.containsKey("one"));
+        assertFalse(e.contains(e));
+        m.put("thrEE", 3);
+        m.put("foUr", 4);
+        assertEquals(3, m.size());
+        Iterator<Entry<String, Integer>> iterator = e.iterator();
+        assertTrue(iterator.hasNext());
+        iterator.next();
+        iterator.remove();
+        assertEquals(2, m.size());
+        e.clear();
+        assertFalse(e.contains(e));
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void testNullKey() {
+        CaseInsensitiveMap<Integer> m = new CaseInsensitiveMap<Integer>();
+        m.put(null, 0);
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void testNullValue() {
+        CaseInsensitiveMap<Integer> m = new CaseInsensitiveMap<Integer>();
+        m.put("nuLL", null);
+    }
+
+    @Test(expected = UnsupportedOperationException.class)
+    public void testEntrySetAdd() {
+        CaseInsensitiveMap<Integer> m = new CaseInsensitiveMap<Integer>();
+        m.entrySet().add(null);
+    }
+
+    @Test(expected = UnsupportedOperationException.class)
+    public void testEntrySetAddAll() {
+        CaseInsensitiveMap<Integer> m = new CaseInsensitiveMap<Integer>();
+        m.entrySet().addAll(null);
+    }
+
+    @Test
+    public void testKeySet() {
+        CaseInsensitiveMap<Integer> m = new CaseInsensitiveMap<Integer>();
+        m.put("oNe", 1);
+        m.put("Two", 2);
+        Set<String> k = m.keySet();
+        assertTrue(k.contains("oNe"));
+        assertTrue(k.contains("one"));
+        assertFalse(k.contains(k));
+        assertFalse(m.containsKey(m));
+        assertEquals(2, k.size());
+        Iterator<String> i = k.iterator();
+        while (i.hasNext()) {
+            if ("oNe".equals(i.next())) {
+                i.remove();
+            }
+        }
+        assertTrue(m.containsKey("two"));
+        k.remove("TWO");
+        assertFalse(m.containsKey("two"));
+        m.put("three", 3);
+        k.clear();
+        assertTrue(m.isEmpty());
+    }
+
+    @Test(expected = UnsupportedOperationException.class)
+    public void testKeySetAdd() {
+        CaseInsensitiveMap<Integer> m = new CaseInsensitiveMap<Integer>();
+        m.keySet().add(null);
+    }
+
+    @Test(expected = UnsupportedOperationException.class)
+    public void testKeySetAddAll() {
+        CaseInsensitiveMap<Integer> m = new CaseInsensitiveMap<Integer>();
+        m.keySet().addAll(null);
+    }
+
+    @Test
+    public void testRemove() {
+        CaseInsensitiveMap<Integer> m = new CaseInsensitiveMap<Integer>();
+        m.put("oNe", 1);
+        m.put("Two", 2);
+        assertEquals(2, m.size());
+        m.remove("one");
+        assertFalse(m.containsKey("oNe"));
+        assertEquals(1, m.size());
+        m.remove(null);
+    }
+
+    @Test
+    public void testValues() {
+        CaseInsensitiveMap<Integer> m = new CaseInsensitiveMap<Integer>();
+        m.put("oNe", 1);
+        m.put("Two", 2);
+        Collection<Integer> v = m.values();
+        assertTrue(v.contains(1));
+        assertTrue(v.contains(2));
+        assertEquals(2, v.size());
+    }
+
+    @Test
+    public void testCaseInsensitiveKey() {
+        CaseInsensitiveMap.CaseInsensitiveKey k = CaseInsensitiveMap.CaseInsensitiveKey.objectToKey("onE");
+        assertTrue(k.equals(CaseInsensitiveMap.CaseInsensitiveKey.objectToKey("ONE")));
+        assertFalse(k.equals(CaseInsensitiveMap.CaseInsensitiveKey.objectToKey(null)));
+        assertFalse(k.equals(CaseInsensitiveMap.CaseInsensitiveKey.objectToKey("TWO")));
+        assertFalse(k.equals(null));
+        assertFalse(k.equals(this));
+        assertFalse((CaseInsensitiveMap.CaseInsensitiveKey.objectToKey(null)).equals(k));
+        assertFalse((CaseInsensitiveMap.CaseInsensitiveKey.objectToKey(null)).equals(null));
+        assertTrue((CaseInsensitiveMap.CaseInsensitiveKey.objectToKey(null)).equals(CaseInsensitiveMap.CaseInsensitiveKey.objectToKey(null)));
+    }
+    
+    @Test
+    public void testConstructorFromMap() {
+        CaseInsensitiveMap<String> m = new CaseInsensitiveMap<String>();
+        m.put("a", "a");
+        CaseInsensitiveMap<String> n = new CaseInsensitiveMap<String>(m);
+        assertEquals(m, n);
+    }
+    
+}
+
diff --git a/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/CollectionUtilsTests.java b/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/CollectionUtilsTests.java
new file mode 100644
index 0000000..1b5eae9
--- /dev/null
+++ b/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/CollectionUtilsTests.java
@@ -0,0 +1,210 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.common;
+
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+
+import org.eclipse.virgo.util.common.CollectionUtils;
+
+import junit.framework.TestCase;
+
+/**
+ */
+public class CollectionUtilsTests extends TestCase {
+
+	public void testIsEmpty() {
+		assertTrue(CollectionUtils.isEmpty((Set<?>) null));
+		assertTrue(CollectionUtils.isEmpty((Map<?,?>) null));
+		assertTrue(CollectionUtils.isEmpty(new HashMap<Object,Object>()));
+		assertTrue(CollectionUtils.isEmpty(new HashSet<Object>()));
+
+		List<Object> list = new LinkedList<Object>();
+		list.add(new Object());
+		assertFalse(CollectionUtils.isEmpty(list));
+
+		Map<String, String> map = new HashMap<String, String>();
+		map.put("foo", "bar");
+		assertFalse(CollectionUtils.isEmpty(map));
+	}
+
+	public void testMergeArrayIntoCollection() {
+		String[] arr = new String[] {"value1", "value2"};
+		List<String> list = new LinkedList<String>();
+		list.add("value3");
+
+		CollectionUtils.mergeArrayIntoCollection(arr, list);
+		assertEquals("value3", list.get(0));
+		assertEquals("value1", list.get(1));
+		assertEquals("value2", list.get(2));
+	}
+
+	public void testMergePropertiesIntoMap() {
+		Properties defaults = new Properties();
+		defaults.setProperty("prop1", "value1");
+		Properties props = new Properties(defaults);
+		props.setProperty("prop2", "value2");
+
+		Map<String, String> map = new HashMap<String, String>();
+		map.put("prop3", "value3");
+
+		CollectionUtils.mergePropertiesIntoMap(props, map);
+		assertEquals("value1", map.get("prop1"));
+		assertEquals("value2", map.get("prop2"));
+		assertEquals("value3", map.get("prop3"));
+	}
+
+	public void testContains() {
+		assertFalse(CollectionUtils.contains((Iterator<?>) null, "myElement"));
+		assertFalse(CollectionUtils.contains((Enumeration<?>) null, "myElement"));
+		assertFalse(CollectionUtils.contains(new LinkedList<String>().iterator(), "myElement"));
+		assertFalse(CollectionUtils.contains(new Hashtable<Object, Integer>().keys(), "myElement"));
+
+		List<String> list = new LinkedList<String>();
+		list.add("myElement");
+		assertTrue(CollectionUtils.contains(list.iterator(), "myElement"));
+
+		Hashtable<String, String> ht = new Hashtable<String, String>();
+		ht.put("myElement", "myValue");
+		assertTrue(CollectionUtils.contains(ht.keys(), "myElement"));
+	}
+
+	public void testContainsAny() throws Exception {
+		List<String> source = new ArrayList<String>();
+		source.add("abc");
+		source.add("def");
+		source.add("ghi");
+
+		List<String> candidates = new ArrayList<String>();
+		candidates.add("xyz");
+		candidates.add("def");
+		candidates.add("abc");
+
+		assertTrue(CollectionUtils.containsAny(source, candidates));
+		candidates.remove("def");
+		assertTrue(CollectionUtils.containsAny(source, candidates));
+		candidates.remove("abc");
+		assertFalse(CollectionUtils.containsAny(source, candidates));
+	}
+
+	public void testContainsInstanceWithNullCollection() throws Exception {
+		assertFalse("Must return false if supplied Collection argument is null",
+				CollectionUtils.containsInstance(null, this));
+	}
+
+	public void testContainsInstanceWithInstancesThatAreEqualButDistinct() throws Exception {
+		List<Instance> list = new ArrayList<Instance>();
+		list.add(new Instance("fiona"));
+		assertFalse("Must return false if instance is not in the supplied Collection argument",
+				CollectionUtils.containsInstance(list, new Instance("fiona")));
+	}
+
+	public void testContainsInstanceWithSameInstance() throws Exception {
+		List<Instance> list = new ArrayList<Instance>();
+		list.add(new Instance("apple"));
+		Instance instance = new Instance("fiona");
+		list.add(instance);
+		assertTrue("Must return true if instance is in the supplied Collection argument",
+				CollectionUtils.containsInstance(list, instance));
+	}
+
+	public void testContainsInstanceWithNullInstance() throws Exception {
+		List<Instance> list = new ArrayList<Instance>();
+		list.add(new Instance("apple"));
+		list.add(new Instance("fiona"));
+		assertFalse("Must return false if null instance is supplied",
+				CollectionUtils.containsInstance(list, null));
+	}
+
+	public void testFindFirstMatch() throws Exception {
+		List<String> source = new ArrayList<String>();
+		source.add("abc");
+		source.add("def");
+		source.add("ghi");
+
+		List<String> candidates = new ArrayList<String>();
+		candidates.add("xyz");
+		candidates.add("def");
+		candidates.add("abc");
+
+		assertEquals("def", CollectionUtils.findFirstMatch(source, candidates));
+	}
+
+	public void testHasUniqueObject() {
+		List<String> list = new LinkedList<String>();
+		list.add("myElement");
+		list.add("myOtherElement");
+		assertFalse(CollectionUtils.hasUniqueObject(list));
+
+		list = new LinkedList<String>();
+		list.add("myElement");
+		assertTrue(CollectionUtils.hasUniqueObject(list));
+
+		list = new LinkedList<String>();
+		list.add("myElement");
+		list.add(null);
+		assertFalse(CollectionUtils.hasUniqueObject(list));
+
+		list = new LinkedList<String>();
+		list.add(null);
+		list.add("myElement");
+		assertFalse(CollectionUtils.hasUniqueObject(list));
+
+		list = new LinkedList<String>();
+		list.add(null);
+		list.add(null);
+		assertTrue(CollectionUtils.hasUniqueObject(list));
+
+		list = new LinkedList<String>();
+		list.add(null);
+		assertTrue(CollectionUtils.hasUniqueObject(list));
+
+		list = new LinkedList<String>();
+		assertFalse(CollectionUtils.hasUniqueObject(list));
+	}
+
+
+	private static final class Instance {
+
+		private final String name;
+
+		public Instance(String name) {
+			this.name = name;
+		}
+
+		public boolean equals(Object rhs) {
+			if (this == rhs) {
+				return true;
+			}
+			if (rhs == null || this.getClass() != rhs.getClass()) {
+				return false;
+			}
+			Instance instance = (Instance) rhs;
+			return this.name.equals(instance.name);
+		}
+
+		public int hashCode() {
+			return this.name.hashCode();
+		}
+	}
+
+}
+
diff --git a/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/IterableEnumerationTests.java b/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/IterableEnumerationTests.java
new file mode 100644
index 0000000..308320b
--- /dev/null
+++ b/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/IterableEnumerationTests.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.common;
+
+import java.util.Iterator;
+import java.util.Vector;
+
+import org.eclipse.virgo.util.common.IterableEnumeration;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class IterableEnumerationTests {
+	
+	@Test
+	public void iteration() {
+		Object o1 = new Object();
+		Object o2 = new Object();
+		
+		Vector<Object> vector = new Vector<Object>();
+		vector.add(o1);
+		vector.add(o2);
+		
+		Iterable<Object> iterableObjects = new IterableEnumeration<Object>(vector.elements());
+		Iterator<Object> objects = iterableObjects.iterator();
+		
+		Assert.assertTrue(objects.hasNext());
+		Assert.assertEquals(o1, objects.next());
+		Assert.assertTrue(objects.hasNext());
+		Assert.assertEquals(o2, objects.next());
+		Assert.assertFalse(objects.hasNext());	
+	}
+	
+	@Test(expected=UnsupportedOperationException.class)
+	public void removal() {
+		Vector<Object> vector = new Vector<Object>();
+		new IterableEnumeration<Object>(vector.elements()).iterator().remove();
+	}
+}
diff --git a/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/IteratorToEnumerationAdapterTests.java b/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/IteratorToEnumerationAdapterTests.java
new file mode 100644
index 0000000..f8209d8
--- /dev/null
+++ b/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/IteratorToEnumerationAdapterTests.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2012 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.common;
+
+import static org.easymock.EasyMock.createMock;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Iterator;
+
+import org.easymock.EasyMock;
+import org.junit.Before;
+import org.junit.Test;
+
+public class IteratorToEnumerationAdapterTests {
+
+    private static final String TEST_STRING = "TEST";
+    private Iterator<String> mockIterator;
+    private IteratorToEnumerationAdapter<String> adapter;
+
+    @SuppressWarnings("unchecked")
+    @Before
+    public void setUp() throws Exception {
+        this.mockIterator = createMock(Iterator.class);
+        this.adapter = new IteratorToEnumerationAdapter<String>(this.mockIterator);
+    }
+
+    @Test
+    public void testHasMoreElements() {
+        EasyMock.expect(this.mockIterator.hasNext()).andReturn(true).once();
+        EasyMock.replay(this.mockIterator);
+        assertTrue(this.adapter.hasMoreElements());
+        EasyMock.verify(this.mockIterator);
+    }
+
+    @Test
+    public void testNextElement() {
+        EasyMock.expect(this.mockIterator.next()).andReturn(TEST_STRING).once();
+        EasyMock.replay(this.mockIterator);
+        assertEquals(TEST_STRING, this.adapter.nextElement());
+        EasyMock.verify(this.mockIterator);
+    }
+
+}
diff --git a/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/MapToDictionaryAdapterTests.java b/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/MapToDictionaryAdapterTests.java
new file mode 100644
index 0000000..2f11c9a
--- /dev/null
+++ b/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/MapToDictionaryAdapterTests.java
@@ -0,0 +1,120 @@
+/*******************************************************************************
+ * Copyright (c) 2012 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.common;
+
+import static org.easymock.EasyMock.createMock;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Enumeration;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.easymock.EasyMock;
+import org.junit.Before;
+import org.junit.Test;
+
+
+public class MapToDictionaryAdapterTests {
+
+    private static final String TEST_KEY = "k";
+
+    private static final String TEST_VALUE = "v";
+    
+    private static final int TEST_SIZE = 2;
+
+    private Map<String, String> mockMap;
+    
+    private MapToDictionaryAdapter<String, String> adapter;
+
+    @SuppressWarnings("unchecked")
+    @Before
+    public void setUp() throws Exception {
+        this.mockMap = createMock(Map.class);
+        this.adapter = new MapToDictionaryAdapter<String, String>(this.mockMap);
+    }
+
+    @Test
+    public void testSize() {
+        EasyMock.expect(this.mockMap.size()).andReturn(TEST_SIZE).once();
+        EasyMock.replay(this.mockMap);
+        assertEquals(TEST_SIZE, this.adapter.size());
+        EasyMock.verify(this.mockMap);
+    }
+
+    @Test
+    public void testIsEmpty() {
+        EasyMock.expect(this.mockMap.isEmpty()).andReturn(false).once();
+        EasyMock.replay(this.mockMap);
+        assertFalse(this.adapter.isEmpty());
+        EasyMock.verify(this.mockMap);
+    }
+
+    @Test
+    public void testKeys() {
+        Set<String> testKeys = new HashSet<String>();
+        testKeys.add(TEST_KEY);
+        
+        EasyMock.expect(this.mockMap.keySet()).andReturn(testKeys).once();
+        EasyMock.replay(this.mockMap);
+        Enumeration<String> keys = this.adapter.keys();
+        
+        assertTrue(keys.hasMoreElements());
+        assertEquals(TEST_KEY, keys.nextElement());
+        assertFalse(keys.hasMoreElements());
+        
+        EasyMock.verify(this.mockMap);
+    }
+
+    @Test
+    public void testElements() {
+        Set<String> testValues = new HashSet<String>();
+        testValues.add(TEST_VALUE);
+        
+        EasyMock.expect(this.mockMap.values()).andReturn(testValues).once();
+        EasyMock.replay(this.mockMap);
+        Enumeration<String> values = this.adapter.elements();
+        
+        assertTrue(values.hasMoreElements());
+        assertEquals(TEST_VALUE, values.nextElement());
+        assertFalse(values.hasMoreElements());
+        
+        EasyMock.verify(this.mockMap);
+    }
+
+    @Test
+    public void testGetObject() {
+        EasyMock.expect(this.mockMap.get(EasyMock.eq(TEST_KEY))).andReturn(TEST_VALUE).once();
+        EasyMock.replay(this.mockMap);
+        assertEquals(TEST_VALUE, this.adapter.get(TEST_KEY));
+        EasyMock.verify(this.mockMap);
+    }
+
+    @Test
+    public void testPutKV() {
+        EasyMock.expect(this.mockMap.put(EasyMock.eq(TEST_KEY), EasyMock.eq(TEST_VALUE))).andReturn(TEST_VALUE).once();
+        EasyMock.replay(this.mockMap);
+        assertEquals(TEST_VALUE, this.adapter.put(TEST_KEY, TEST_VALUE));
+        EasyMock.verify(this.mockMap);
+    }
+
+    @Test
+    public void testRemoveObject() {
+        EasyMock.expect(this.mockMap.remove(EasyMock.eq(TEST_KEY))).andReturn(TEST_VALUE).once();
+        EasyMock.replay(this.mockMap);
+        assertEquals(TEST_VALUE, this.adapter.remove(TEST_KEY));
+        EasyMock.verify(this.mockMap);
+    }
+
+}
diff --git a/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/ObjectUtilsTests.java b/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/ObjectUtilsTests.java
new file mode 100644
index 0000000..323bd15
--- /dev/null
+++ b/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/ObjectUtilsTests.java
@@ -0,0 +1,542 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.common;
+
+import java.io.IOException;
+import java.util.Arrays;
+
+import javax.transaction.xa.XAException;
+
+import org.eclipse.virgo.util.common.ObjectUtils;
+
+import junit.framework.TestCase;
+
+/**
+ */
+public final class ObjectUtilsTests extends TestCase {
+
+	public void testIsCheckedException() {
+		assertTrue(ObjectUtils.isCheckedException(new Exception()));
+		assertTrue(ObjectUtils.isCheckedException(new XAException()));
+
+		assertFalse(ObjectUtils.isCheckedException(new RuntimeException()));
+		assertFalse(ObjectUtils.isCheckedException(new IllegalStateException("")));
+
+		// Any Throwable other than RuntimeException and Error
+		// has to be considered checked according to the JLS.
+		assertTrue(ObjectUtils.isCheckedException(new Throwable()));
+	}
+
+	@SuppressWarnings("unchecked")
+	public void testIsCompatibleWithThrowsClause() {
+		Class<? extends Throwable>[] empty = new Class[0];
+		Class<? extends Throwable>[] exception = new Class[] {Exception.class};
+		Class<? extends Throwable>[] xaAndIO = new Class[] {XAException.class, IOException.class};
+		Class<? extends Throwable>[] throwable = new Class[] {Throwable.class};
+
+		assertTrue(ObjectUtils.isCompatibleWithThrowsClause(new RuntimeException(), null));
+		assertTrue(ObjectUtils.isCompatibleWithThrowsClause(new RuntimeException(), empty));
+		assertTrue(ObjectUtils.isCompatibleWithThrowsClause(new RuntimeException(), exception));
+		assertTrue(ObjectUtils.isCompatibleWithThrowsClause(new RuntimeException(), xaAndIO));
+		assertTrue(ObjectUtils.isCompatibleWithThrowsClause(new RuntimeException(), throwable));
+
+		assertFalse(ObjectUtils.isCompatibleWithThrowsClause(new Exception(), null));
+		assertFalse(ObjectUtils.isCompatibleWithThrowsClause(new Exception(), empty));
+		assertTrue(ObjectUtils.isCompatibleWithThrowsClause(new Exception(), exception));
+		assertFalse(ObjectUtils.isCompatibleWithThrowsClause(new Exception(), xaAndIO));
+		assertTrue(ObjectUtils.isCompatibleWithThrowsClause(new Exception(), throwable));
+
+		assertFalse(ObjectUtils.isCompatibleWithThrowsClause(new XAException(), null));
+		assertFalse(ObjectUtils.isCompatibleWithThrowsClause(new XAException(), empty));
+		assertTrue(ObjectUtils.isCompatibleWithThrowsClause(new XAException(), exception));
+		assertTrue(ObjectUtils.isCompatibleWithThrowsClause(new XAException(), xaAndIO));
+		assertTrue(ObjectUtils.isCompatibleWithThrowsClause(new XAException(), throwable));
+
+		assertFalse(ObjectUtils.isCompatibleWithThrowsClause(new Throwable(), null));
+		assertFalse(ObjectUtils.isCompatibleWithThrowsClause(new Throwable(), empty));
+		assertFalse(ObjectUtils.isCompatibleWithThrowsClause(new Throwable(), exception));
+		assertFalse(ObjectUtils.isCompatibleWithThrowsClause(new Throwable(), xaAndIO));
+		assertTrue(ObjectUtils.isCompatibleWithThrowsClause(new Throwable(), throwable));
+	}
+
+	public void testToObjectArray() {
+		int[] a = new int[] {1, 2, 3, 4, 5};
+		Integer[] wrapper = (Integer[]) ObjectUtils.toObjectArray(a);
+		assertTrue(wrapper.length == 5);
+		for (int i = 0; i < wrapper.length; i++) {
+			assertEquals(a[i], wrapper[i].intValue());
+		}
+	}
+
+	public void testToObjectArrayWithNull() {
+		Object[] objects = ObjectUtils.toObjectArray(null);
+		assertNotNull(objects);
+		assertEquals(0, objects.length);
+	}
+
+	public void testToObjectArrayWithEmptyPrimitiveArray() {
+		Object[] objects = ObjectUtils.toObjectArray(new byte[] {});
+		assertNotNull(objects);
+		assertEquals(0, objects.length);
+	}
+
+	public void testToObjectArrayWithNonArrayType() {
+		try {
+			ObjectUtils.toObjectArray("Not an []");
+			fail("Must have thrown an IllegalArgumentException by this point.");
+		}
+		catch (IllegalArgumentException expected) {
+		}
+	}
+
+	public void testToObjectArrayWithNonPrimitiveArray() {
+		String[] source = new String[] {"Bingo"};
+		assertTrue(Arrays.equals(source, ObjectUtils.toObjectArray(source)));
+	}
+
+	public void testAddObjectToArraySunnyDay() {
+		String[] array = new String[] {"foo", "bar"};
+		String newElement = "baz";
+		Object[] newArray = ObjectUtils.addObjectToArray(array, newElement);
+		assertEquals(3, newArray.length);
+		assertEquals(newElement, newArray[2]);
+	}
+
+	public void testAddObjectToArrayWhenEmpty() {
+		String[] array = new String[0];
+		String newElement = "foo";
+		Object[] newArray = ObjectUtils.addObjectToArray(array, newElement);
+		assertEquals(1, newArray.length);
+		assertEquals(newElement, newArray[0]);
+	}
+
+	public void testAddObjectToSingleNonNullElementArray() {
+		String existingElement = "foo";
+		String[] array = new String[] {existingElement};
+		String newElement = "bar";
+		Object[] newArray = ObjectUtils.addObjectToArray(array, newElement);
+		assertEquals(2, newArray.length);
+		assertEquals(existingElement, newArray[0]);
+		assertEquals(newElement, newArray[1]);
+	}
+
+	public void testAddObjectToSingleNullElementArray() {
+		String[] array = new String[] {null};
+		String newElement = "bar";
+		Object[] newArray = ObjectUtils.addObjectToArray(array, newElement);
+		assertEquals(2, newArray.length);
+		assertEquals(null, newArray[0]);
+		assertEquals(newElement, newArray[1]);
+	}
+
+	public void testAddObjectToNullArray() throws Exception {
+		String newElement = "foo";
+		Object[] newArray = ObjectUtils.addObjectToArray(null, newElement);
+		assertEquals(1, newArray.length);
+		assertEquals(newElement, newArray[0]);
+	}
+
+	public void testAddNullObjectToNullArray() throws Exception {
+		Object[] newArray = ObjectUtils.addObjectToArray(null, null);
+		assertEquals(1, newArray.length);
+		assertEquals(null, newArray[0]);
+	}
+
+	public void testNullSafeEqualsWithArrays() throws Exception {
+		assertTrue(ObjectUtils.nullSafeEquals(new String[] {"a", "b", "c"}, new String[] {"a", "b", "c"}));
+		assertTrue(ObjectUtils.nullSafeEquals(new int[] {1, 2, 3}, new int[] {1, 2, 3}));
+	}
+
+	public void testHashCodeWithBooleanFalse() {
+		int expected = Boolean.FALSE.hashCode();
+		assertEquals(expected, ObjectUtils.hashCode(false));
+	}
+
+	public void testHashCodeWithBooleanTrue() {
+		int expected = Boolean.TRUE.hashCode();
+		assertEquals(expected, ObjectUtils.hashCode(true));
+	}
+
+	public void testHashCodeWithDouble() {
+		double dbl = 9830.43;
+		int expected = (new Double(dbl)).hashCode();
+		assertEquals(expected, ObjectUtils.hashCode(dbl));
+	}
+
+	public void testHashCodeWithFloat() {
+		float flt = 34.8f;
+		int expected = (new Float(flt)).hashCode();
+		assertEquals(expected, ObjectUtils.hashCode(flt));
+	}
+
+	public void testHashCodeWithLong() {
+		long lng = 883l;
+		int expected = (new Long(lng)).hashCode();
+		assertEquals(expected, ObjectUtils.hashCode(lng));
+	}
+
+	public void testIdentityToString() {
+		Object obj = new Object();
+		String expected = obj.getClass().getName() + "@" + ObjectUtils.getIdentityHexString(obj);
+		String actual = ObjectUtils.identityToString(obj);
+		assertEquals(expected.toString(), actual);
+	}
+
+	public void testIdentityToStringWithNullObject() {
+		assertEquals("", ObjectUtils.identityToString(null));
+	}
+
+	public void testNullSafeHashCodeWithBooleanArray() {
+		int expected = 31 * 7 + Boolean.TRUE.hashCode();
+		expected = 31 * expected + Boolean.FALSE.hashCode();
+
+		boolean[] array = {true, false};
+		int actual = ObjectUtils.nullSafeHashCode(array);
+
+		assertEquals(expected, actual);
+	}
+
+	public void testNullSafeHashCodeWithBooleanArrayEqualToNull() {
+		assertEquals(0, ObjectUtils.nullSafeHashCode((boolean[]) null));
+	}
+
+	public void testNullSafeHashCodeWithByteArray() {
+		int expected = 31 * 7 + 8;
+		expected = 31 * expected + 10;
+
+		byte[] array = {8, 10};
+		int actual = ObjectUtils.nullSafeHashCode(array);
+
+		assertEquals(expected, actual);
+	}
+
+	public void testNullSafeHashCodeWithByteArrayEqualToNull() {
+		assertEquals(0, ObjectUtils.nullSafeHashCode((byte[]) null));
+	}
+
+	public void testNullSafeHashCodeWithCharArray() {
+		int expected = 31 * 7 + 'a';
+		expected = 31 * expected + 'E';
+
+		char[] array = {'a', 'E'};
+		int actual = ObjectUtils.nullSafeHashCode(array);
+
+		assertEquals(expected, actual);
+	}
+
+	public void testNullSafeHashCodeWithCharArrayEqualToNull() {
+		assertEquals(0, ObjectUtils.nullSafeHashCode((char[]) null));
+	}
+
+	public void testNullSafeHashCodeWithDoubleArray() {
+		long bits = Double.doubleToLongBits(8449.65);
+		int expected = 31 * 7 + (int) (bits ^ (bits >>> 32));
+		bits = Double.doubleToLongBits(9944.923);
+		expected = 31 * expected + (int) (bits ^ (bits >>> 32));
+
+		double[] array = {8449.65, 9944.923};
+		int actual = ObjectUtils.nullSafeHashCode(array);
+
+		assertEquals(expected, actual);
+	}
+
+	public void testNullSafeHashCodeWithDoubleArrayEqualToNull() {
+		assertEquals(0, ObjectUtils.nullSafeHashCode((double[]) null));
+	}
+
+	public void testNullSafeHashCodeWithFloatArray() {
+		int expected = 31 * 7 + Float.floatToIntBits(9.6f);
+		expected = 31 * expected + Float.floatToIntBits(7.4f);
+
+		float[] array = {9.6f, 7.4f};
+		int actual = ObjectUtils.nullSafeHashCode(array);
+
+		assertEquals(expected, actual);
+	}
+
+	public void testNullSafeHashCodeWithFloatArrayEqualToNull() {
+		assertEquals(0, ObjectUtils.nullSafeHashCode((float[]) null));
+	}
+
+	public void testNullSafeHashCodeWithIntArray() {
+		int expected = 31 * 7 + 884;
+		expected = 31 * expected + 340;
+
+		int[] array = {884, 340};
+		int actual = ObjectUtils.nullSafeHashCode(array);
+
+		assertEquals(expected, actual);
+	}
+
+	public void testNullSafeHashCodeWithIntArrayEqualToNull() {
+		assertEquals(0, ObjectUtils.nullSafeHashCode((int[]) null));
+	}
+
+	public void testNullSafeHashCodeWithLongArray() {
+		long lng = 7993l;
+		int expected = 31 * 7 + (int) (lng ^ (lng >>> 32));
+		lng = 84320l;
+		expected = 31 * expected + (int) (lng ^ (lng >>> 32));
+
+		long[] array = {7993l, 84320l};
+		int actual = ObjectUtils.nullSafeHashCode(array);
+
+		assertEquals(expected, actual);
+	}
+
+	public void testNullSafeHashCodeWithLongArrayEqualToNull() {
+		assertEquals(0, ObjectUtils.nullSafeHashCode((long[]) null));
+	}
+
+	public void testNullSafeHashCodeWithObject() {
+		String str = "Luke";
+		assertEquals(str.hashCode(), ObjectUtils.nullSafeHashCode(str));
+	}
+
+	public void testNullSafeHashCodeWithObjectArray() {
+		int expected = 31 * 7 + "Leia".hashCode();
+		expected = 31 * expected + "Han".hashCode();
+
+		Object[] array = {"Leia", "Han"};
+		int actual = ObjectUtils.nullSafeHashCode(array);
+
+		assertEquals(expected, actual);
+	}
+
+	public void testNullSafeHashCodeWithObjectArrayEqualToNull() {
+		assertEquals(0, ObjectUtils.nullSafeHashCode((Object[]) null));
+	}
+
+	public void testNullSafeHashCodeWithObjectBeingBooleanArray() {
+		Object array = new boolean[] {true, false};
+		int expected = ObjectUtils.nullSafeHashCode((boolean[]) array);
+		assertEqualHashCodes(expected, array);
+	}
+
+	public void testNullSafeHashCodeWithObjectBeingByteArray() {
+		Object array = new byte[] {6, 39};
+		int expected = ObjectUtils.nullSafeHashCode((byte[]) array);
+		assertEqualHashCodes(expected, array);
+	}
+
+	public void testNullSafeHashCodeWithObjectBeingCharArray() {
+		Object array = new char[] {'l', 'M'};
+		int expected = ObjectUtils.nullSafeHashCode((char[]) array);
+		assertEqualHashCodes(expected, array);
+	}
+
+	public void testNullSafeHashCodeWithObjectBeingDoubleArray() {
+		Object array = new double[] {68930.993, 9022.009};
+		int expected = ObjectUtils.nullSafeHashCode((double[]) array);
+		assertEqualHashCodes(expected, array);
+	}
+
+	public void testNullSafeHashCodeWithObjectBeingFloatArray() {
+		Object array = new float[] {9.9f, 9.54f};
+		int expected = ObjectUtils.nullSafeHashCode((float[]) array);
+		assertEqualHashCodes(expected, array);
+	}
+
+	public void testNullSafeHashCodeWithObjectBeingIntArray() {
+		Object array = new int[] {89, 32};
+		int expected = ObjectUtils.nullSafeHashCode((int[]) array);
+		assertEqualHashCodes(expected, array);
+	}
+
+	public void testNullSafeHashCodeWithObjectBeingLongArray() {
+		Object array = new long[] {4389, 320};
+		int expected = ObjectUtils.nullSafeHashCode((long[]) array);
+		assertEqualHashCodes(expected, array);
+	}
+
+	public void testNullSafeHashCodeWithObjectBeingObjectArray() {
+		Object array = new Object[] {"Luke", "Anakin"};
+		int expected = ObjectUtils.nullSafeHashCode((Object[]) array);
+		assertEqualHashCodes(expected, array);
+	}
+
+	public void testNullSafeHashCodeWithObjectBeingShortArray() {
+		Object array = new short[] {5, 3};
+		int expected = ObjectUtils.nullSafeHashCode((short[]) array);
+		assertEqualHashCodes(expected, array);
+	}
+
+	public void testNullSafeHashCodeWithObjectEqualToNull() {
+		assertEquals(0, ObjectUtils.nullSafeHashCode((Object) null));
+	}
+
+	public void testNullSafeHashCodeWithShortArray() {
+		int expected = 31 * 7 + 70;
+		expected = 31 * expected + 8;
+
+		short[] array = {70, 8};
+		int actual = ObjectUtils.nullSafeHashCode(array);
+
+		assertEquals(expected, actual);
+	}
+
+	public void testNullSafeHashCodeWithShortArrayEqualToNull() {
+		assertEquals(0, ObjectUtils.nullSafeHashCode((short[]) null));
+	}
+
+	public void testNullSafeToStringWithBooleanArray() {
+		boolean[] array = {true, false};
+		assertEquals("{true, false}", ObjectUtils.nullSafeToString(array));
+	}
+
+	public void testNullSafeToStringWithBooleanArrayBeingEmpty() {
+		boolean[] array = {};
+		assertEquals("{}", ObjectUtils.nullSafeToString(array));
+	}
+
+	public void testNullSafeToStringWithBooleanArrayEqualToNull() {
+		assertEquals("null", ObjectUtils.nullSafeToString((boolean[]) null));
+	}
+
+	public void testNullSafeToStringWithByteArray() {
+		byte[] array = {5, 8};
+		assertEquals("{5, 8}", ObjectUtils.nullSafeToString(array));
+	}
+
+	public void testNullSafeToStringWithByteArrayBeingEmpty() {
+		byte[] array = {};
+		assertEquals("{}", ObjectUtils.nullSafeToString(array));
+	}
+
+	public void testNullSafeToStringWithByteArrayEqualToNull() {
+		assertEquals("null", ObjectUtils.nullSafeToString((byte[]) null));
+	}
+
+	public void testNullSafeToStringWithCharArray() {
+		char[] array = {'A', 'B'};
+		assertEquals("{'A', 'B'}", ObjectUtils.nullSafeToString(array));
+	}
+
+	public void testNullSafeToStringWithCharArrayBeingEmpty() {
+		char[] array = {};
+		assertEquals("{}", ObjectUtils.nullSafeToString(array));
+	}
+
+	public void testNullSafeToStringWithCharArrayEqualToNull() {
+		assertEquals("null", ObjectUtils.nullSafeToString((char[]) null));
+	}
+
+	public void testNullSafeToStringWithDoubleArray() {
+		double[] array = {8594.93, 8594023.95};
+		assertEquals("{8594.93, 8594023.95}", ObjectUtils.nullSafeToString(array));
+	}
+
+	public void testNullSafeToStringWithDoubleArrayBeingEmpty() {
+		double[] array = {};
+		assertEquals("{}", ObjectUtils.nullSafeToString(array));
+	}
+
+	public void testNullSafeToStringWithDoubleArrayEqualToNull() {
+		assertEquals("null", ObjectUtils.nullSafeToString((double[]) null));
+	}
+
+	public void testNullSafeToStringWithFloatArray() {
+		float[] array = {8.6f, 43.8f};
+		assertEquals("{8.6, 43.8}", ObjectUtils.nullSafeToString(array));
+	}
+
+	public void testNullSafeToStringWithFloatArrayBeingEmpty() {
+		float[] array = {};
+		assertEquals("{}", ObjectUtils.nullSafeToString(array));
+	}
+
+	public void testNullSafeToStringWithFloatArrayEqualToNull() {
+		assertEquals("null", ObjectUtils.nullSafeToString((float[]) null));
+	}
+
+	public void testNullSafeToStringWithIntArray() {
+		int[] array = {9, 64};
+		assertEquals("{9, 64}", ObjectUtils.nullSafeToString(array));
+	}
+
+	public void testNullSafeToStringWithIntArrayBeingEmpty() {
+		int[] array = {};
+		assertEquals("{}", ObjectUtils.nullSafeToString(array));
+	}
+
+	public void testNullSafeToStringWithIntArrayEqualToNull() {
+		assertEquals("null", ObjectUtils.nullSafeToString((int[]) null));
+	}
+
+	public void testNullSafeToStringWithLongArray() {
+		long[] array = {434l, 23423l};
+		assertEquals("{434, 23423}", ObjectUtils.nullSafeToString(array));
+	}
+
+	public void testNullSafeToStringWithLongArrayBeingEmpty() {
+		long[] array = {};
+		assertEquals("{}", ObjectUtils.nullSafeToString(array));
+	}
+
+	public void testNullSafeToStringWithLongArrayEqualToNull() {
+		assertEquals("null", ObjectUtils.nullSafeToString((long[]) null));
+	}
+
+	public void testNullSafeToStringWithPlainOldString() {
+		assertEquals("I shoh love tha taste of mangoes", ObjectUtils.nullSafeToString("I shoh love tha taste of mangoes"));
+	}
+
+	public void testNullSafeToStringWithObjectArray() {
+		Object[] array = {"Han", new Long(43)};
+		assertEquals("{Han, 43}", ObjectUtils.nullSafeToString(array));
+	}
+
+	public void testNullSafeToStringWithObjectArrayBeingEmpty() {
+		Object[] array = {};
+		assertEquals("{}", ObjectUtils.nullSafeToString(array));
+	}
+
+	public void testNullSafeToStringWithObjectArrayEqualToNull() {
+		assertEquals("null", ObjectUtils.nullSafeToString((Object[]) null));
+	}
+
+	public void testNullSafeToStringWithShortArray() {
+		short[] array = {7, 9};
+		assertEquals("{7, 9}", ObjectUtils.nullSafeToString(array));
+	}
+
+	public void testNullSafeToStringWithShortArrayBeingEmpty() {
+		short[] array = {};
+		assertEquals("{}", ObjectUtils.nullSafeToString(array));
+	}
+
+	public void testNullSafeToStringWithShortArrayEqualToNull() {
+		assertEquals("null", ObjectUtils.nullSafeToString((short[]) null));
+	}
+
+	public void testNullSafeToStringWithStringArray() {
+		String[] array = {"Luke", "Anakin"};
+		assertEquals("{Luke, Anakin}", ObjectUtils.nullSafeToString(array));
+	}
+
+	public void testNullSafeToStringWithStringArrayBeingEmpty() {
+		String[] array = {};
+		assertEquals("{}", ObjectUtils.nullSafeToString(array));
+	}
+
+	public void testNullSafeToStringWithStringArrayEqualToNull() {
+		assertEquals("null", ObjectUtils.nullSafeToString((String[]) null));
+	}
+
+	private void assertEqualHashCodes(int expected, Object array) {
+		int actual = ObjectUtils.nullSafeHashCode(array);
+		assertEquals(expected, actual);
+		assertTrue(array.hashCode() != actual);
+	}
+
+}
+
diff --git a/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/PropertyPlaceholderResolverTests.java b/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/PropertyPlaceholderResolverTests.java
new file mode 100644
index 0000000..a47dd5b
--- /dev/null
+++ b/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/PropertyPlaceholderResolverTests.java
@@ -0,0 +1,138 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.common;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Properties;
+
+import org.eclipse.virgo.util.common.PropertyPlaceholderResolver;
+import org.eclipse.virgo.util.common.PropertyPlaceholderResolver.PlaceholderValueTransformer;
+import org.junit.Test;
+
+
+public class PropertyPlaceholderResolverTests {
+
+    private final PropertyPlaceholderResolver resolver = new PropertyPlaceholderResolver();
+
+    @Test
+    public void testSimpleResolve() {
+        Properties p = new Properties();
+        p.setProperty("foo", "bar");
+        p.setProperty("other", "Hello ${foo}");
+
+        p = resolver.resolve(p);
+
+        assertEquals("Hello bar", p.getProperty("other"));
+    }
+
+    @Test
+    public void testDoubleResolve() {
+        Properties p = new Properties();
+        p.setProperty("foo", "bar");
+        p.setProperty("bar", "baz");
+        p.setProperty("other", "Hello ${foo} and ${bar}");
+
+        p = resolver.resolve(p);
+
+        assertEquals("Hello bar and baz", p.getProperty("other"));
+    }
+    
+    @Test
+    public void testIdenticalDoubleResolve() {
+        Properties p = new Properties();
+        p.setProperty("foo", "bar");
+        p.setProperty("bar", "baz");
+        p.setProperty("other", "Hello ${foo} and ${foo}");
+
+        p = resolver.resolve(p);
+
+        assertEquals("Hello bar and bar", p.getProperty("other"));
+    }
+
+    @Test
+    public void testChainResolve() {
+        Properties p = new Properties();
+        p.setProperty("config.dir", "${server.home}/config");
+        p.setProperty("server.home", "/opt/dms");
+        p.setProperty("repo.config", "${config.dir}/repo.config");
+
+        p = resolver.resolve(p);
+
+        assertEquals("/opt/dms/config", p.getProperty("config.dir"));
+        assertEquals("/opt/dms/config/repo.config", p.getProperty("repo.config"));
+    }
+    
+    @Test
+    public void testBackslashInValuesResolve() {
+        Properties p = new Properties();
+        p.setProperty("foo", "a\\b\\d\\");
+        p.setProperty("bar", "[${foo}]");
+        p.setProperty("vartochange", "here is ${foo} and ${bar} aha!");
+
+        p = resolver.resolve(p);
+
+        assertEquals("Backslashes not substituted properly", "here is a\\b\\d\\ and [a\\b\\d\\] aha!", p.getProperty("vartochange"));
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testCircularResolve() {
+        Properties p = new Properties();
+        p.setProperty("foo", "${bar}");
+        p.setProperty("bar", "${foo}");
+
+        resolver.resolve(p);
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testTightCircularResolve() {
+        Properties p = new Properties();
+        p.setProperty("foo", "${foo}");
+
+        resolver.resolve(p);
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testLongerCircularResolve() {
+        Properties p = new Properties();
+        p.setProperty("foo", "${bar}");
+        p.setProperty("bar", "${baz}");
+        p.setProperty("baz", "${foo}");
+
+        resolver.resolve(p);
+    }
+
+    @Test
+    public void testStringReplacement() {
+        Properties p = new Properties();
+        p.setProperty("bundle.name", "fooBundle");
+
+        assertEquals("Bundle-Name: fooBundle", resolver.resolve("Bundle-Name: ${bundle.name}", p));
+    }
+
+    @Test
+    public void testValueTransformation() {
+        Properties p = new Properties();
+        p.setProperty("bundle.name", "fooBundle");
+
+        assertEquals("Bundle-Name: yyy", resolver.resolve("Bundle-Name: ${bundle.name:xxx}", p, new PlaceholderValueTransformer() {
+
+            public String transform(String propertyName, String propertyValue, String modifier) {
+                assertEquals("bundle.name", propertyName);
+                assertEquals("fooBundle", propertyValue);
+                assertEquals("xxx", modifier);
+                return "yyy";
+            }
+        }));
+    }
+
+}
diff --git a/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/StringUtilsTests.java b/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/StringUtilsTests.java
new file mode 100644
index 0000000..8aaf541
--- /dev/null
+++ b/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/StringUtilsTests.java
@@ -0,0 +1,732 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.common;
+
+import java.util.Arrays;
+import java.util.Locale;
+import java.util.Properties;
+
+import junit.framework.TestCase;
+
+import org.eclipse.virgo.util.common.StringUtils;
+import org.junit.Test;
+
+/**
+ */
+public class StringUtilsTests extends TestCase {
+
+	public void testHasTextBlank() throws Exception {
+		String blank = "          ";
+		assertEquals(false, StringUtils.hasText(blank));
+	}
+
+	public void testHasTextNullEmpty() throws Exception {
+		assertEquals(false, StringUtils.hasText(null));
+		assertEquals(false, StringUtils.hasText(""));
+	}
+
+	public void testHasTextValid() throws Exception {
+		assertEquals(true, StringUtils.hasText("t"));
+	}
+
+	public void testStartsWithIgnoreCase() throws Exception {
+        assertFalse(StringUtils.startsWithIgnoreCase(null,""));
+        assertFalse(StringUtils.startsWithIgnoreCase("",null));
+        assertTrue(StringUtils.startsWithIgnoreCase("",""));
+        
+        assertTrue(StringUtils.startsWithIgnoreCase("abcde","abc"));
+        assertTrue(StringUtils.startsWithIgnoreCase("aBcde","abc"));
+        assertTrue(StringUtils.startsWithIgnoreCase("abcde","aBc"));
+        assertTrue(StringUtils.startsWithIgnoreCase("abc","abc"));
+        assertTrue(StringUtils.startsWithIgnoreCase("aBc","abc"));
+        assertTrue(StringUtils.startsWithIgnoreCase("Abc","aBc"));
+        assertFalse(StringUtils.startsWithIgnoreCase("Abced","aBcd"));
+        assertFalse(StringUtils.startsWithIgnoreCase("AbceD","aBcd"));
+        assertFalse(StringUtils.startsWithIgnoreCase("abcde","abcdef"));
+        
+        assertTrue(StringUtils.startsWithIgnoreCase("a%cde","a%c"));
+        assertTrue(StringUtils.startsWithIgnoreCase("a%Cde","a%c"));
+        assertTrue(StringUtils.startsWithIgnoreCase("a%cde","a%C"));
+        assertTrue(StringUtils.startsWithIgnoreCase("a%c","a%c"));
+        assertTrue(StringUtils.startsWithIgnoreCase("aB%","ab%"));
+        assertTrue(StringUtils.startsWithIgnoreCase("Ab%","aB%"));
+        assertFalse(StringUtils.startsWithIgnoreCase("Ab%ed","aB%d"));
+        assertFalse(StringUtils.startsWithIgnoreCase("Ab%eD","aB%d"));
+        assertFalse(StringUtils.startsWithIgnoreCase("ab%de","ab%def"));
+    }
+	
+	public void testSubstringMatch() throws Exception {
+        assertTrue(StringUtils.substringMatch("", 0, ""));
+        assertTrue(StringUtils.substringMatch("abcde", 0, ""));
+        assertTrue(StringUtils.substringMatch("abcde", -1, ""));
+        assertTrue(StringUtils.substringMatch("abcde", 3, ""));
+        assertTrue(StringUtils.substringMatch("abcde", 20, ""));
+        assertTrue(StringUtils.substringMatch("abcde", 0, "abc"));
+        assertTrue(StringUtils.substringMatch("abcde", 1, "bcd"));
+        assertTrue(StringUtils.substringMatch("abcde", 2, "cde"));
+        assertTrue(StringUtils.substringMatch("abcde", 3, "de"));
+
+        assertFalse(StringUtils.substringMatch("abcde", 0, "x"));
+        assertFalse(StringUtils.substringMatch("abcde", -1, "x"));
+        assertFalse(StringUtils.substringMatch("abcde", 3, "x"));
+        assertFalse(StringUtils.substringMatch("abcde", 20, "x"));
+        assertFalse(StringUtils.substringMatch("abcde", 0, "abx"));
+        assertFalse(StringUtils.substringMatch("abcde", 1, "xcd"));
+        assertFalse(StringUtils.substringMatch("abcde", 2, "cxe"));
+        assertFalse(StringUtils.substringMatch("abcde", 3, "dex"));
+	}
+	
+	public void testContainsWhitespace() throws Exception {
+        assertFalse(StringUtils.containsWhitespace(null));
+        assertFalse(StringUtils.containsWhitespace(""));
+        assertFalse(StringUtils.containsWhitespace("a"));
+        assertFalse(StringUtils.containsWhitespace("abc"));
+        assertTrue(StringUtils.containsWhitespace(" "));
+        assertTrue(StringUtils.containsWhitespace(" a"));
+        assertTrue(StringUtils.containsWhitespace("abc "));
+        assertTrue(StringUtils.containsWhitespace("a b"));
+        assertTrue(StringUtils.containsWhitespace("a  b"));
+    }
+
+	public void testTrimWhitespace() throws Exception {
+		assertEquals(null, StringUtils.trimWhitespace(null));
+		assertEquals("", StringUtils.trimWhitespace(""));
+		assertEquals("", StringUtils.trimWhitespace(" "));
+		assertEquals("", StringUtils.trimWhitespace("\t"));
+		assertEquals("a", StringUtils.trimWhitespace(" a"));
+		assertEquals("a", StringUtils.trimWhitespace("a "));
+		assertEquals("a", StringUtils.trimWhitespace(" a "));
+		assertEquals("a b", StringUtils.trimWhitespace(" a b "));
+		assertEquals("a b  c", StringUtils.trimWhitespace(" a b  c "));
+	}
+
+	public void testTrimAllWhitespace() throws Exception {
+		assertEquals("", StringUtils.trimAllWhitespace(""));
+		assertEquals("", StringUtils.trimAllWhitespace(" "));
+		assertEquals("", StringUtils.trimAllWhitespace("\t"));
+		assertEquals("a", StringUtils.trimAllWhitespace(" a"));
+		assertEquals("a", StringUtils.trimAllWhitespace("a "));
+		assertEquals("a", StringUtils.trimAllWhitespace(" a "));
+		assertEquals("ab", StringUtils.trimAllWhitespace(" a b "));
+		assertEquals("abc", StringUtils.trimAllWhitespace(" a b  c "));
+	}
+
+	public void testTrimLeadingWhitespace() throws Exception {
+		assertEquals(null, StringUtils.trimLeadingWhitespace(null));
+		assertEquals("", StringUtils.trimLeadingWhitespace(""));
+		assertEquals("", StringUtils.trimLeadingWhitespace(" "));
+		assertEquals("", StringUtils.trimLeadingWhitespace("\t"));
+		assertEquals("a", StringUtils.trimLeadingWhitespace(" a"));
+		assertEquals("a ", StringUtils.trimLeadingWhitespace("a "));
+		assertEquals("a ", StringUtils.trimLeadingWhitespace(" a "));
+		assertEquals("a b ", StringUtils.trimLeadingWhitespace(" a b "));
+		assertEquals("a b  c ", StringUtils.trimLeadingWhitespace(" a b  c "));
+	}
+
+	public void testTrimTrailingWhitespace() throws Exception {
+		assertEquals(null, StringUtils.trimTrailingWhitespace(null));
+		assertEquals("", StringUtils.trimTrailingWhitespace(""));
+		assertEquals("", StringUtils.trimTrailingWhitespace(" "));
+		assertEquals("", StringUtils.trimTrailingWhitespace("\t"));
+		assertEquals("a", StringUtils.trimTrailingWhitespace("a "));
+		assertEquals(" a", StringUtils.trimTrailingWhitespace(" a"));
+		assertEquals(" a", StringUtils.trimTrailingWhitespace(" a "));
+		assertEquals(" a b", StringUtils.trimTrailingWhitespace(" a b "));
+		assertEquals(" a b  c", StringUtils.trimTrailingWhitespace(" a b  c "));
+	}
+
+	public void testTrimLeadingCharacter() throws Exception {
+		assertEquals(null, StringUtils.trimLeadingCharacter(null, ' '));
+		assertEquals("", StringUtils.trimLeadingCharacter("", ' '));
+		assertEquals("", StringUtils.trimLeadingCharacter(" ", ' '));
+		assertEquals("\t", StringUtils.trimLeadingCharacter("\t", ' '));
+		assertEquals("a", StringUtils.trimLeadingCharacter(" a", ' '));
+		assertEquals("a ", StringUtils.trimLeadingCharacter("a ", ' '));
+		assertEquals("a ", StringUtils.trimLeadingCharacter(" a ", ' '));
+		assertEquals("a b ", StringUtils.trimLeadingCharacter(" a b ", ' '));
+		assertEquals("a b  c ", StringUtils.trimLeadingCharacter(" a b  c ", ' '));
+	}
+
+	public void testTrimTrailingCharacter() throws Exception {
+		assertEquals(null, StringUtils.trimTrailingCharacter(null, ' '));
+		assertEquals("", StringUtils.trimTrailingCharacter("", ' '));
+		assertEquals("", StringUtils.trimTrailingCharacter(" ", ' '));
+		assertEquals("\t", StringUtils.trimTrailingCharacter("\t", ' '));
+		assertEquals("a", StringUtils.trimTrailingCharacter("a ", ' '));
+		assertEquals(" a", StringUtils.trimTrailingCharacter(" a", ' '));
+		assertEquals(" a", StringUtils.trimTrailingCharacter(" a ", ' '));
+		assertEquals(" a b", StringUtils.trimTrailingCharacter(" a b ", ' '));
+		assertEquals(" a b  c", StringUtils.trimTrailingCharacter(" a b  c ", ' '));
+	}
+
+	public void testCountOccurrencesOf() {
+		assertTrue("nullx2 = 0",				  StringUtils.countOccurrencesOf(null, null) == 0);
+		assertTrue("null string = 0",		      StringUtils.countOccurrencesOf("s", null) == 0);
+		assertTrue("null substring = 0",		  StringUtils.countOccurrencesOf(null, "s") == 0);
+		String s = "erowoiueoiur";
+		assertTrue("not found = 0",				  StringUtils.countOccurrencesOf(s, "WERWER") == 0);
+		assertTrue("not found char = 0",		  StringUtils.countOccurrencesOf(s, "x") == 0);
+		assertTrue("not found ws = 0",            StringUtils.countOccurrencesOf(s, " ") == 0);
+		assertTrue("not found empty string = 0",  StringUtils.countOccurrencesOf(s, "") == 0);
+		assertTrue("found char=2",                StringUtils.countOccurrencesOf(s, "e") == 2);
+		assertTrue("found substring=2",           StringUtils.countOccurrencesOf(s, "oi") == 2);
+		assertTrue("found substring=2",	          StringUtils.countOccurrencesOf(s, "oiu") == 2);
+		assertTrue("found substring=3",	          StringUtils.countOccurrencesOf(s, "oiur") == 1);
+		assertTrue("test last",                   StringUtils.countOccurrencesOf(s, "r") == 2);
+	}
+
+	public void testReplace() throws Exception {
+		String inString = "a6AazAaa77abaa";
+		String oldPattern = "aa";
+		String newPattern = "foo";
+
+		// Simple replace
+		String s = StringUtils.replace(inString, oldPattern, newPattern);
+		assertTrue("Replace 1 worked", s.equals("a6AazAfoo77abfoo"));
+
+		// Non match: no change
+		s = StringUtils.replace(inString, "qwoeiruqopwieurpoqwieur", newPattern);
+		assertTrue("Replace non matched is equal", s.equals(inString));
+
+		// Null new pattern: should ignore
+		s = StringUtils.replace(inString, oldPattern, null);
+		assertTrue("Replace non matched is equal", s.equals(inString));
+
+        // Null inString: should return null
+        s = StringUtils.replace(null, oldPattern, newPattern);
+        assertNull("Replace in null is not null", s);
+	}
+
+	public void testDelete() throws Exception {
+		String inString = "The quick brown fox jumped over the lazy dog";
+
+		String noThe = StringUtils.delete(inString, "the");
+		assertTrue("Result has no the [" + noThe + "]",
+				noThe.equals("The quick brown fox jumped over  lazy dog"));
+
+		String nohe = StringUtils.delete(inString, "he");
+		assertTrue("Result has no he [" + nohe + "]",
+				nohe.equals("T quick brown fox jumped over t lazy dog"));
+
+		String nosp = StringUtils.delete(inString, " ");
+		assertTrue("Result has no spaces",
+				nosp.equals("Thequickbrownfoxjumpedoverthelazydog"));
+
+		String killEnd = StringUtils.delete(inString, "dog");
+		assertTrue("Result has no dog",
+				killEnd.equals("The quick brown fox jumped over the lazy "));
+
+		String mismatch = StringUtils.delete(inString, "dxxcxcxog");
+		assertTrue("Result is unchanged", mismatch.equals(inString));
+	}
+
+	public void testDeleteAny() throws Exception {
+		String inString = "Able was I ere I saw Elba";
+
+		String res = StringUtils.deleteAny(inString, "I");
+		assertTrue("Result has no Is [" + res + "]",
+				res.equals("Able was  ere  saw Elba"));
+
+		res = StringUtils.deleteAny(inString, "AeEba!");
+		assertTrue("Result has no Is [" + res + "]",
+				res.equals("l ws I r I sw l"));
+
+		String mismatch = StringUtils.deleteAny(inString, "#@$#$^");
+		assertTrue("Result is unchanged", mismatch.equals(inString));
+
+		String whitespace =
+				"This is\n\n\n    \t   a messagy string with whitespace\n";
+		assertTrue("Has CR", whitespace.indexOf("\n") != -1);
+		assertTrue("Has tab", whitespace.indexOf("\t") != -1);
+		assertTrue("Has  sp", whitespace.indexOf(" ") != -1);
+		String cleaned = StringUtils.deleteAny(whitespace, "\n\t ");
+		assertTrue("Has no CR", cleaned.indexOf("\n") == -1);
+		assertTrue("Has no tab", cleaned.indexOf("\t") == -1);
+		assertTrue("Has no sp", cleaned.indexOf(" ") == -1);
+		assertTrue("Still has chars", cleaned.length() > 10);
+	}
+
+
+	public void testQuote() {
+		assertEquals("'myString'", StringUtils.quote("myString"));
+		assertEquals("''", StringUtils.quote(""));
+		assertNull(StringUtils.quote(null));
+	}
+
+	public void testQuoteIfString() {
+		assertEquals("'myString'", StringUtils.quoteIfString("myString"));
+		assertEquals("''", StringUtils.quoteIfString(""));
+		assertEquals(new Integer(5), StringUtils.quoteIfString(new Integer(5)));
+		assertNull(StringUtils.quoteIfString(null));
+	}
+
+	public void testUnqualify() {
+		String qualified = "i.am.not.unqualified";
+		assertEquals("unqualified", StringUtils.unqualify(qualified));
+	}
+
+	public void testCapitalize() {
+		String capitalized = "i am not capitalized";
+        assertEquals("I am not capitalized", StringUtils.capitalize(capitalized));
+        assertNull("null not returned when null capitalised", StringUtils.capitalize(null));
+	}
+
+    public void testAddStringToNullArray() {
+        String[] result = StringUtils.addStringToArray(null, "abc");
+        assertTrue("add String to empty array doesn't return singleton", result.length==1);
+        assertTrue("",result[0].equals("abc"));
+    }
+    
+    public void testAddNullStringToNullArray() {
+        String[] result = StringUtils.addStringToArray(null, null);
+        assertNotNull(result);
+        assertTrue("add null to empty array doesn't return singleton", result.length==1);
+        assertTrue("Array element not null",result[0]==null);
+    }
+    
+	public void testUncapitalize() {
+		String capitalized = "I am capitalized";
+		assertEquals("i am capitalized", StringUtils.uncapitalize(capitalized));
+	}
+
+	public void testGetFilename() {
+		assertEquals(null, StringUtils.getFilename(null));
+		assertEquals("", StringUtils.getFilename(""));
+		assertEquals("myfile", StringUtils.getFilename("myfile"));
+		assertEquals("myfile", StringUtils.getFilename("mypath/myfile"));
+		assertEquals("myfile.", StringUtils.getFilename("myfile."));
+		assertEquals("myfile.", StringUtils.getFilename("mypath/myfile."));
+		assertEquals("myfile.txt", StringUtils.getFilename("myfile.txt"));
+		assertEquals("myfile.txt", StringUtils.getFilename("mypath/myfile.txt"));
+	}
+
+	public void testGetFilenameExtension() {
+		assertEquals(null, StringUtils.getFilenameExtension(null));
+		assertEquals(null, StringUtils.getFilenameExtension(""));
+		assertEquals(null, StringUtils.getFilenameExtension("myfile"));
+		assertEquals(null, StringUtils.getFilenameExtension("myPath/myfile"));
+		assertEquals("", StringUtils.getFilenameExtension("myfile."));
+		assertEquals("", StringUtils.getFilenameExtension("myPath/myfile."));
+		assertEquals("txt", StringUtils.getFilenameExtension("myfile.txt"));
+		assertEquals("txt", StringUtils.getFilenameExtension("mypath/myfile.txt"));
+	}
+
+	public void testStripFilenameExtension() {
+		assertEquals(null, StringUtils.stripFilenameExtension(null));
+		assertEquals("", StringUtils.stripFilenameExtension(""));
+		assertEquals("myfile", StringUtils.stripFilenameExtension("myfile"));
+		assertEquals("mypath/myfile", StringUtils.stripFilenameExtension("mypath/myfile"));
+		assertEquals("myfile", StringUtils.stripFilenameExtension("myfile."));
+		assertEquals("mypath/myfile", StringUtils.stripFilenameExtension("mypath/myfile."));
+		assertEquals("myfile", StringUtils.stripFilenameExtension("myfile.txt"));
+		assertEquals("mypath/myfile", StringUtils.stripFilenameExtension("mypath/myfile.txt"));
+	}
+
+	public void testCleanPath() {
+		assertEquals("mypath/myfile", StringUtils.cleanPath("mypath/myfile"));
+		assertEquals("mypath/myfile", StringUtils.cleanPath("mypath\\myfile"));
+		assertEquals("mypath/myfile", StringUtils.cleanPath("mypath/../mypath/myfile"));
+		assertEquals("mypath/myfile", StringUtils.cleanPath("mypath/myfile/../../mypath/myfile"));
+		assertEquals("../mypath/myfile", StringUtils.cleanPath("../mypath/myfile"));
+		assertEquals("../mypath/myfile", StringUtils.cleanPath("../mypath/../mypath/myfile"));
+		assertEquals("../mypath/myfile", StringUtils.cleanPath("mypath/../../mypath/myfile"));
+		assertEquals("/../mypath/myfile", StringUtils.cleanPath("/../mypath/myfile"));
+	}
+
+	public void testPathEquals() {
+		assertTrue("Must be true for the same strings",
+				StringUtils.pathEquals("/dummy1/dummy2/dummy3",
+						"/dummy1/dummy2/dummy3"));
+		assertTrue("Must be true for the same win strings",
+				StringUtils.pathEquals("C:\\dummy1\\dummy2\\dummy3",
+						"C:\\dummy1\\dummy2\\dummy3"));
+		assertTrue("Must be true for one top path on 1",
+				StringUtils.pathEquals("/dummy1/bin/../dummy2/dummy3",
+						"/dummy1/dummy2/dummy3"));
+		assertTrue("Must be true for one win top path on 2",
+				StringUtils.pathEquals("C:\\dummy1\\dummy2\\dummy3",
+						"C:\\dummy1\\bin\\..\\dummy2\\dummy3"));
+		assertTrue("Must be true for two top paths on 1",
+				StringUtils.pathEquals("/dummy1/bin/../dummy2/bin/../dummy3",
+						"/dummy1/dummy2/dummy3"));
+		assertTrue("Must be true for two win top paths on 2",
+				StringUtils.pathEquals("C:\\dummy1\\dummy2\\dummy3",
+						"C:\\dummy1\\bin\\..\\dummy2\\bin\\..\\dummy3"));
+		assertTrue("Must be true for double top paths on 1",
+				StringUtils.pathEquals("/dummy1/bin/tmp/../../dummy2/dummy3",
+						"/dummy1/dummy2/dummy3"));
+		assertTrue("Must be true for double top paths on 2 with similarity",
+				StringUtils.pathEquals("/dummy1/dummy2/dummy3",
+						"/dummy1/dum/dum/../../dummy2/dummy3"));
+		assertTrue("Must be true for current paths",
+				StringUtils.pathEquals("./dummy1/dummy2/dummy3",
+						"dummy1/dum/./dum/../../dummy2/dummy3"));
+		assertFalse("Must be false for relative/absolute paths",
+				StringUtils.pathEquals("./dummy1/dummy2/dummy3",
+						"/dummy1/dum/./dum/../../dummy2/dummy3"));
+		assertFalse("Must be false for different strings",
+				StringUtils.pathEquals("/dummy1/dummy2/dummy3",
+						"/dummy1/dummy4/dummy3"));
+		assertFalse("Must be false for one false path on 1",
+				StringUtils.pathEquals("/dummy1/bin/tmp/../dummy2/dummy3",
+						"/dummy1/dummy2/dummy3"));
+		assertFalse("Must be false for one false win top path on 2",
+				StringUtils.pathEquals("C:\\dummy1\\dummy2\\dummy3",
+						"C:\\dummy1\\bin\\tmp\\..\\dummy2\\dummy3"));
+		assertFalse("Must be false for top path on 1 + difference",
+				StringUtils.pathEquals("/dummy1/bin/../dummy2/dummy3",
+						"/dummy1/dummy2/dummy4"));
+	}
+
+	public void testConcatenateStringArrays() {
+		String[] input1 = new String[] {"myString2"};
+		String[] input2 = new String[] {"myString1", "myString2"};
+		String[] result = StringUtils.concatenateStringArrays(input1, input2);
+		assertEquals(3, result.length);
+		assertEquals("myString2", result[0]);
+		assertEquals("myString1", result[1]);
+		assertEquals("myString2", result[2]);
+
+		assertTrue(Arrays.equals(input1, StringUtils.concatenateStringArrays(input1, null)));
+		assertTrue(Arrays.equals(input2, StringUtils.concatenateStringArrays(null, input2)));
+		assertNull(StringUtils.concatenateStringArrays(null, null));
+	}
+
+	public void testMergeStringArrays() {
+		String[] input1 = new String[] {"myString2"};
+		String[] input2 = new String[] {"myString1", "myString2"};
+		String[] result = StringUtils.mergeStringArrays(input1, input2);
+		assertEquals(2, result.length);
+		assertEquals("myString2", result[0]);
+		assertEquals("myString1", result[1]);
+
+		assertTrue(Arrays.equals(input1, StringUtils.mergeStringArrays(input1, null)));
+		assertTrue(Arrays.equals(input2, StringUtils.mergeStringArrays(null, input2)));
+		assertNull(StringUtils.mergeStringArrays(null, null));
+	}
+
+	public void testSortStringArray() {
+		String[] input = new String[] {"myString2"};
+		input = StringUtils.addStringToArray(input, "myString1");
+		assertEquals("myString2", input[0]);
+		assertEquals("myString1", input[1]);
+
+		String[] actual = StringUtils.sortStringArray(input);
+		assertEquals("myString1", actual[0]);
+		assertEquals("myString2", actual[1]);
+	}
+
+	public void testRemoveDuplicateStrings() {
+		String[] input = new String[] {"myString2", "myString1", "myString2"};
+		input = StringUtils.removeDuplicateStrings(input);
+		assertEquals("myString1", input[0]);
+		assertEquals("myString2", input[1]);
+	}
+
+	public void testSplitArrayElementsIntoProperties() {
+		String[] input = new String[] {"key1=value1 ", "key2 =\"value2\""};
+		Properties result = StringUtils.splitArrayElementsIntoProperties(input, "=");
+		assertEquals("value1", result.getProperty("key1"));
+		assertEquals("\"value2\"", result.getProperty("key2"));
+	}
+
+	public void testSplitArrayElementsIntoPropertiesAndDeletedChars() {
+		String[] input = new String[] {"key1=value1 ", "key2 =\"value2\""};
+		Properties result = StringUtils.splitArrayElementsIntoProperties(input, "=", "\"");
+		assertEquals("value1", result.getProperty("key1"));
+		assertEquals("value2", result.getProperty("key2"));
+	}
+
+	public void testTokenizeToStringArray() {
+		String[] sa = StringUtils.tokenizeToStringArray("a,b , ,c", ",");
+		assertEquals(3, sa.length);
+		assertTrue("components are correct",
+				sa[0].equals("a") && sa[1].equals("b") && sa[2].equals("c"));
+	}
+
+	public void testTokenizeToStringArrayWithNotIgnoreEmptyTokens() {
+		String[] sa = StringUtils.tokenizeToStringArray("a,b , ,c", ",", true, false);
+		assertEquals(4, sa.length);
+		assertTrue("components are correct",
+				sa[0].equals("a") && sa[1].equals("b") && sa[2].equals("") && sa[3].equals("c"));
+	}
+
+	public void testTokenizeToStringArrayWithNotTrimTokens() {
+		String[] sa = StringUtils.tokenizeToStringArray("a,b ,c", ",", false, true);
+		assertEquals(3, sa.length);
+		assertTrue("components are correct",
+				sa[0].equals("a") && sa[1].equals("b ") && sa[2].equals("c"));
+	}
+
+	public void testCommaDelimitedListToStringArrayWithNullProducesEmptyArray() {
+		String[] sa = StringUtils.commaDelimitedListToStringArray(null);
+		assertTrue("String array isn't null with null input", sa != null);
+		assertTrue("String array length == 0 with null input", sa.length == 0);
+	}
+
+	public void testCommaDelimitedListToStringArrayWithEmptyStringProducesEmptyArray() {
+		String[] sa = StringUtils.commaDelimitedListToStringArray("");
+		assertTrue("String array isn't null with null input", sa != null);
+		assertTrue("String array length == 0 with null input", sa.length == 0);
+	}
+
+	private void testStringArrayReverseTransformationMatches(String[] sa) {
+		String[] reverse =
+				StringUtils.commaDelimitedListToStringArray(StringUtils.arrayToCommaDelimitedString(sa));
+		assertEquals("Reverse transformation is equal",
+				Arrays.asList(sa),
+				Arrays.asList(reverse));
+	}
+
+	public void testDelimitedListToStringArrayWithComma() {
+		String[] sa = StringUtils.delimitedListToStringArray("a,b", ",");
+		assertEquals(2, sa.length);
+		assertEquals("a", sa[0]);
+		assertEquals("b", sa[1]);
+	}
+
+	public void testDelimitedListToStringArrayWithSemicolon() {
+		String[] sa = StringUtils.delimitedListToStringArray("a;b", ";");
+		assertEquals(2, sa.length);
+		assertEquals("a", sa[0]);
+		assertEquals("b", sa[1]);
+	}
+
+	public void testDelimitedListToStringArrayWithEmptyString() {
+		String[] sa = StringUtils.delimitedListToStringArray("a,b", "");
+		assertEquals(3, sa.length);
+		assertEquals("a", sa[0]);
+		assertEquals(",", sa[1]);
+		assertEquals("b", sa[2]);
+	}
+
+	public void testDelimitedListToStringArrayWithNullDelimiter() {
+		String[] sa = StringUtils.delimitedListToStringArray("a,b", null);
+		assertEquals(1, sa.length);
+		assertEquals("a,b", sa[0]);
+	}
+
+	public void testCommaDelimitedListToStringArrayMatchWords() {
+		// Could read these from files
+		String[] sa = new String[] {"foo", "bar", "big"};
+		doTestCommaDelimitedListToStringArrayLegalMatch(sa);
+		testStringArrayReverseTransformationMatches(sa);
+
+		sa = new String[] {"a", "b", "c"};
+		doTestCommaDelimitedListToStringArrayLegalMatch(sa);
+		testStringArrayReverseTransformationMatches(sa);
+
+		// Test same words
+		sa = new String[] {"AA", "AA", "AA", "AA", "AA"};
+		doTestCommaDelimitedListToStringArrayLegalMatch(sa);
+		testStringArrayReverseTransformationMatches(sa);
+	}
+
+	public void testCommaDelimitedListToStringArraySingleString() {
+		// Could read these from files
+		String s = "woeirqupoiewuropqiewuorpqiwueopriquwopeiurqopwieur";
+		String[] sa = StringUtils.commaDelimitedListToStringArray(s);
+		assertTrue("Found one String with no delimiters", sa.length == 1);
+		assertTrue("Single array entry matches input String with no delimiters",
+				sa[0].equals(s));
+	}
+
+	public void testCommaDelimitedListToStringArrayWithOtherPunctuation() {
+		// Could read these from files
+		String[] sa = new String[] {"xcvwert4456346&*.", "///", ".!", ".", ";"};
+		doTestCommaDelimitedListToStringArrayLegalMatch(sa);
+	}
+
+	/**
+	 * We expect to see the empty Strings in the output.
+	 */
+	public void testCommaDelimitedListToStringArrayEmptyStrings() {
+		// Could read these from files
+		String[] sa = StringUtils.commaDelimitedListToStringArray("a,,b");
+		assertEquals("a,,b produces array length 3", 3, sa.length);
+		assertTrue("components are correct",
+				sa[0].equals("a") && sa[1].equals("") && sa[2].equals("b"));
+
+		sa = new String[] {"", "", "a", ""};
+		doTestCommaDelimitedListToStringArrayLegalMatch(sa);
+	}
+
+	private void doTestCommaDelimitedListToStringArrayLegalMatch(String[] components) {
+		StringBuffer sbuf = new StringBuffer();
+		for (int i = 0; i < components.length; i++) {
+			if (i != 0) {
+				sbuf.append(",");
+			}
+			sbuf.append(components[i]);
+		}
+		String[] sa = StringUtils.commaDelimitedListToStringArray(sbuf.toString());
+		assertTrue("String array isn't null with legal match", sa != null);
+		assertEquals("String array length is correct with legal match", components.length, sa.length);
+		assertTrue("Output equals input", Arrays.equals(sa, components));
+	}
+
+	public void testEndsWithIgnoreCase() {
+		String suffix = "fOo";
+		assertTrue(StringUtils.endsWithIgnoreCase("foo", suffix));
+		assertTrue(StringUtils.endsWithIgnoreCase("Foo", suffix));
+		assertTrue(StringUtils.endsWithIgnoreCase("barfoo", suffix));
+		assertTrue(StringUtils.endsWithIgnoreCase("barbarfoo", suffix));
+		assertTrue(StringUtils.endsWithIgnoreCase("barFoo", suffix));
+		assertTrue(StringUtils.endsWithIgnoreCase("barBarFoo", suffix));
+		assertTrue(StringUtils.endsWithIgnoreCase("barfoO", suffix));
+		assertTrue(StringUtils.endsWithIgnoreCase("barFOO", suffix));
+		assertTrue(StringUtils.endsWithIgnoreCase("barfOo", suffix));
+		assertFalse(StringUtils.endsWithIgnoreCase(null, suffix));
+		assertFalse(StringUtils.endsWithIgnoreCase("barfOo", null));
+		assertFalse(StringUtils.endsWithIgnoreCase("b", suffix));
+	}
+
+	public void testParseLocaleStringSunnyDay() throws Exception {
+		Locale expectedLocale = Locale.UK;
+		Locale locale = StringUtils.parseLocaleString(expectedLocale.toString());
+		assertNotNull("When given a bona-fide Locale string, must not return null.", locale);
+		assertEquals(expectedLocale, locale);
+	}
+
+	public void testParseLocaleStringWithMalformedLocaleString() throws Exception {
+		Locale locale = StringUtils.parseLocaleString("_banjo_on_my_knee");
+		assertNotNull("When given a malformed Locale string, must not return null.", locale);
+	}
+
+	public void testParseLocaleStringWithEmptyLocaleStringYieldsNullLocale() throws Exception {
+		Locale locale = StringUtils.parseLocaleString("");
+		assertNull("When given an empty Locale string, must return null.", locale);
+	}
+
+	/**
+	 * <a href="http://opensource.atlassian.com/projects/spring/browse/SPR-3671">See SPR-3671</a>.
+	 * @throws Exception for test
+	 */
+	public void testParseLocaleWithMultiValuedVariant() throws Exception {
+		final String variant = "proper_northern";
+		final String localeString = "en_GB_" + variant;
+		Locale locale = StringUtils.parseLocaleString(localeString);
+		assertEquals("Multi-valued variant portion of the Locale not extracted correctly.", variant, locale.getVariant());
+	}
+
+	/**
+	 * <a href="http://opensource.atlassian.com/projects/spring/browse/SPR-3671">See SPR-3671</a>.
+	 * @throws Exception possibly in test
+	 */
+	public void testParseLocaleWithMultiValuedVariantUsingSpacesAsSeparators() throws Exception {
+		final String variant = "proper northern";
+		final String localeString = "en GB " + variant;
+		Locale locale = StringUtils.parseLocaleString(localeString);
+		assertEquals("Multi-valued variant portion of the Locale not extracted correctly.", variant, locale.getVariant());
+	}
+
+	/**
+	 * <a href="http://opensource.atlassian.com/projects/spring/browse/SPR-3671">See SPR-3671</a>.
+	 * @throws Exception possibly in test
+	 */
+	public void testParseLocaleWithMultiValuedVariantUsingMixtureOfUnderscoresAndSpacesAsSeparators() throws Exception {
+		final String variant = "proper northern";
+		final String localeString = "en_GB_" + variant;
+		Locale locale = StringUtils.parseLocaleString(localeString);
+		assertEquals("Multi-valued variant portion of the Locale not extracted correctly.", variant, locale.getVariant());
+	}
+
+	/**
+	 * <a href="http://opensource.atlassian.com/projects/spring/browse/SPR-3671">See SPR-3671</a>.
+	 * @throws Exception possibly in test
+	 */
+	public void testParseLocaleWithMultiValuedVariantUsingSpacesAsSeparatorsWithLotsOfLeadingWhitespace() throws Exception {
+		final String variant = "proper northern";
+		final String localeString = "en GB            " + variant; // lots of whitespace
+		Locale locale = StringUtils.parseLocaleString(localeString);
+		assertEquals("Multi-valued variant portion of the Locale not extracted correctly.", variant, locale.getVariant());
+	}
+
+	/**
+	 * <a href="http://opensource.atlassian.com/projects/spring/browse/SPR-3671">See SPR-3671</a>.
+	 * @throws Exception possibly in test
+	 */
+	public void testParseLocaleWithMultiValuedVariantUsingUnderscoresAsSeparatorsWithLotsOfLeadingWhitespace() throws Exception {
+		final String variant = "proper_northern";
+		final String localeString = "en_GB_____" + variant; // lots of underscores
+		Locale locale = StringUtils.parseLocaleString(localeString);
+		assertEquals("Multi-valued variant portion of the Locale not extracted correctly.", variant, locale.getVariant());
+	}
+	
+    public void testChunkZeroLengthString() {
+        String input = "";
+        String[] chunks = StringUtils.chunkString(input, 20);
+        assertEquals(1, chunks.length);
+        assertEquals(input, chunks[0]);
+    }
+    
+    @Test
+    public void testExactSingleChunk() {
+        String input = "0123456789";
+        String[] chunks = StringUtils.chunkString(input, 10);
+        assertEquals(1, chunks.length);
+        assertEquals(input, chunks[0]);
+    }
+    
+    public void testSingleChunk() {
+        String input = "0123456789";
+        String[] chunks = StringUtils.chunkString(input, 20);
+        assertEquals(1, chunks.length);
+        assertEquals(input, chunks[0]);
+    }
+    
+    public void testExactMultipleChunks() {
+        String input = "0123456789abcdefghij0123456789";
+        String[] chunks = StringUtils.chunkString(input, 10);
+        assertEquals(3, chunks.length);
+        assertEquals("0123456789", chunks[0]);
+        assertEquals("abcdefghij", chunks[1]);
+        assertEquals("0123456789", chunks[2]);
+    }
+        
+    public void testMultipleChunks() {
+        String input = "0123456789abcdefghij0123456789";
+        String[] chunks = StringUtils.chunkString(input, 20);
+        assertEquals(2, chunks.length);
+        assertEquals("0123456789abcdefghij", chunks[0]);
+        assertEquals("0123456789", chunks[1]);        
+    }
+        
+    public void testIllegalChunkSize() {
+        try {
+            StringUtils.chunkString("abcdefg", 0);
+            fail();
+        } catch (IllegalArgumentException iae) {
+            
+        }
+        
+        try {
+            StringUtils.chunkString("abcdefg", -12345);
+            fail();
+        } catch (IllegalArgumentException iae) {
+            
+        }
+    }
+    
+    @Test
+    public void abbreviate() {
+        assertEquals("alpha.bravo.charlie.Delta", StringUtils.abbreviateDotSeparatedString("alpha.bravo.charlie.Delta", 32));
+        assertEquals("a.bravo.charlie.Delta", StringUtils.abbreviateDotSeparatedString("alpha.bravo.charlie.Delta", 21));
+        assertEquals("a.b.charlie.Delta", StringUtils.abbreviateDotSeparatedString("alpha.bravo.charlie.Delta", 20));
+        assertEquals("a.b.charlie.Delta", StringUtils.abbreviateDotSeparatedString("alpha.bravo.charlie.Delta", 17));
+        assertEquals("a.b.c.Delta", StringUtils.abbreviateDotSeparatedString("alpha.bravo.charlie.Delta", 16));
+        assertEquals("a.b.c.Delta", StringUtils.abbreviateDotSeparatedString("alpha.bravo.charlie.Delta", 11));
+        assertEquals("Delta", StringUtils.abbreviateDotSeparatedString("alpha.bravo.charlie.Delta", 10));
+        assertEquals("Delta", StringUtils.abbreviateDotSeparatedString("alpha.bravo.charlie.Delta", 1));
+    }
+}
+
diff --git a/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/SynchronizedCollectionTests.java b/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/SynchronizedCollectionTests.java
new file mode 100644
index 0000000..ab37fc1
--- /dev/null
+++ b/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/SynchronizedCollectionTests.java
@@ -0,0 +1,169 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.common;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+
+import org.eclipse.virgo.util.common.SynchronizedCollection;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ */
+public class SynchronizedCollectionTests {
+    
+    private static final String S1 = "1";
+    private static final String S2 = "2";
+
+    private final Collection<String> c = new HashSet<String>();
+    
+    private final Object monitor = new Object();
+    
+    private SynchronizedCollection<String> sc;
+    
+    @Before
+    public void setUp() {
+        this.c.add(S1);
+        this.sc = new SynchronizedCollection<String>(this.c, this.monitor);
+    }
+    
+    @Test
+    public void testToString() {
+        assertEquals("[1]", this.sc.toString());
+    }
+
+    @Test
+    public void testAdd() {
+        assertTrue(this.sc.add(S2));
+        assertFalse(this.sc.add(S2));
+    }
+    
+    @Test
+    public void testAddAll() {
+        Collection<String> a = new HashSet<String>();
+        a.add(S2);
+        assertTrue(this.sc.addAll(a));
+        assertFalse(this.sc.addAll(a));
+    }
+    
+    @Test
+    public void testClear() {
+        assertFalse(this.sc.isEmpty());
+        this.sc.clear();
+        assertTrue(this.sc.isEmpty());
+    }
+    
+    @Test
+    public void testContains() {
+        assertTrue(this.sc.contains(S1));
+        assertFalse(this.sc.contains(S2));
+    }
+    
+    @Test
+    public void testContainsAll() {
+        Collection<String> a = new HashSet<String>();
+        a.add(S1);
+        assertTrue(this.sc.containsAll(a));
+        a.add(S2);
+        assertFalse(this.sc.containsAll(a));
+    }
+    
+    @Test
+    public void testIsEmpty() {
+        assertFalse(this.sc.isEmpty());
+    }
+    
+    @Test
+    public void testIterator() {
+        Iterator<String> i = this.sc.iterator();
+        assertEquals(S1, i.next());
+    }
+    
+    @Test
+    public void testRemove() {
+        assertTrue(this.sc.contains(S1));
+        assertTrue(this.sc.remove(S1));
+        assertFalse(this.sc.contains(S1));
+        assertFalse(this.sc.remove(S1));
+    }
+    
+    @Test
+    public void testRemoveAll() {
+        Collection<String> a = new HashSet<String>();
+        a.add(S1);
+        a.add(S2);
+        assertTrue(this.sc.removeAll(a));
+        assertTrue(this.sc.isEmpty());
+        assertFalse(this.sc.removeAll(a));
+    }
+    
+    @Test
+    public void testRetainAll() {
+        Collection<String> a = new HashSet<String>();
+        a.add(S1);
+        assertFalse(this.sc.retainAll(a));
+        assertFalse(this.sc.isEmpty());
+        a.remove(S1);
+        assertTrue(this.sc.retainAll(a));
+        assertTrue(this.sc.isEmpty());
+    }
+    
+    @Test
+    public void testSize() {
+        assertEquals(1, this.sc.size());
+    }
+    
+    @Test
+    public void testToObjectArray() {
+        assertEquals(S1, this.sc.toArray()[0]);
+    }
+    
+    @Test
+    public void testToTypesArray() {
+        assertEquals(S1, this.sc.toArray(new String[0])[0]);
+    }
+    
+    @Test
+    public void testHashCodeEquals() {
+        
+        assertFalse(this.sc.equals(null));
+        
+        assertFalse(this.sc.equals(new Object()));
+        
+        this.sc.add(S2);
+        
+        Collection<String> s = new HashSet<String>();
+        s.add(S2);
+        s.add(S1);
+        
+        assertEquals(this.c, s);
+        
+        SynchronizedCollection<String> sc2 = new SynchronizedCollection<String>(s, this.monitor);
+        
+        assertEquals(this.sc.hashCode(), sc2.hashCode());
+        assertTrue(this.sc.equals(this.sc));
+        assertTrue(this.sc.equals(sc2));
+        assertTrue(sc2.equals(this.sc));
+        
+        Collection<String> e = new HashSet<String>();
+        SynchronizedCollection<String> empty = new SynchronizedCollection<String> (e, this.monitor);
+        assertFalse(this.sc.equals(empty));
+        assertFalse(empty.equals(this.sc));
+    }
+    
+}
diff --git a/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/SynchronizedIteratorTests.java b/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/SynchronizedIteratorTests.java
new file mode 100644
index 0000000..95883d8
--- /dev/null
+++ b/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/SynchronizedIteratorTests.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.common;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+
+import org.eclipse.virgo.util.common.SynchronizedIterator;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ */
+public class SynchronizedIteratorTests {
+
+    private static final String S1 = "1";
+    private static final String S2 = "2";
+    
+    private final Collection<String> l = new ArrayList<String>();
+    private Iterator<String> i;
+    
+    private final Object monitor = new Object();
+    
+    private SynchronizedIterator<String> si;
+    
+    @Before
+    public void setUp() {
+        this.l.add(S1);
+        this.l.add(S2);
+        this.i = l.iterator();
+        si = new SynchronizedIterator<String>(this.i, this.monitor);
+    }
+
+    @Test
+    public void testBasicIteration() {
+        assertTrue(si.hasNext());
+        assertEquals(S1, si.next());
+        assertTrue(si.hasNext());
+        assertEquals(S2, si.next());
+        assertFalse(si.hasNext());
+    }
+    
+    @Test
+    public void testRemove() {
+        assertTrue(si.hasNext());
+        assertEquals(S1, si.next());
+        si.remove();
+        assertEquals(S2, si.next());
+        assertFalse(si.hasNext());
+        assertEquals(1, l.size());
+    }
+    
+}
diff --git a/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/SynchronizedListIteratorTests.java b/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/SynchronizedListIteratorTests.java
new file mode 100644
index 0000000..943cc9d
--- /dev/null
+++ b/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/SynchronizedListIteratorTests.java
@@ -0,0 +1,115 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.common;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.ListIterator;
+
+import org.eclipse.virgo.util.common.SynchronizedListIterator;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ */
+public class SynchronizedListIteratorTests {
+
+    private static final String S0 = "0";
+
+    private static final String S1 = "1";
+
+    private static final String S2 = "2";
+
+    private static final String S3 = "3";
+
+    private final List<String> l = new ArrayList<String>();
+
+    private ListIterator<String> li;
+
+    private final Object monitor = new Object();
+
+    private SynchronizedListIterator<String> sli;
+
+    @Before
+    public void setUp() {
+        this.l.add(S1);
+        this.l.add(S2);
+        this.l.add(S3);
+        this.li = this.l.listIterator();
+        this.sli = new SynchronizedListIterator<String>(this.li, this.monitor);
+    }
+
+    @Test
+    public void testBasicIteration() {
+        assertTrue(this.sli.hasNext());
+        assertEquals(S1, this.sli.next());
+        assertTrue(this.sli.hasNext());
+        assertEquals(S2, this.sli.next());
+        assertTrue(this.sli.hasNext());
+        assertEquals(S3, this.sli.next());
+        assertFalse(this.sli.hasNext());
+    }
+
+    @Test
+    public void testRemove() {
+        assertTrue(this.sli.hasNext());
+        assertEquals(S1, this.sli.next());
+        this.sli.remove();
+        assertEquals(S2, this.sli.next());
+        assertEquals(2, this.l.size());
+    }
+
+
+    @Test
+    public void testPrevious() {
+        assertFalse(this.sli.hasPrevious());
+        this.sli.next();
+        assertTrue(this.sli.hasPrevious());
+        assertEquals(0, this.sli.previousIndex());
+        assertEquals(S1, this.sli.previous());
+        assertEquals(S1, this.sli.next());
+    }
+
+    @Test
+    public void testNextIndex() {
+        assertEquals(0, this.sli.nextIndex());
+        this.sli.next();
+        assertEquals(1, this.sli.nextIndex());
+    }
+
+    @Test
+    public void testAdd() {
+        this.sli.add(S0);
+        assertTrue(this.sli.hasPrevious());
+        assertEquals(S0, this.sli.previous());
+        assertEquals(S0, this.sli.next());
+        assertEquals(S1, this.sli.next());
+        this.sli.add(S0);
+        assertEquals(S0, this.sli.previous());
+        assertEquals(S0, this.sli.next());
+        assertEquals(S2, this.sli.next());
+    }
+    
+    @Test
+    public void testSet() {
+        this.sli.next();
+        this.sli.set(S0);
+        assertEquals(S0, this.sli.previous());
+        assertEquals(S0, this.sli.next());
+        assertEquals(S2, this.sli.next());
+    }
+
+}
diff --git a/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/SynchronizedListTests.java b/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/SynchronizedListTests.java
new file mode 100644
index 0000000..c204710
--- /dev/null
+++ b/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/SynchronizedListTests.java
@@ -0,0 +1,224 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.common;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+
+import org.eclipse.virgo.util.common.SynchronizedList;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ */
+public class SynchronizedListTests {
+    
+    private static final String S1 = "1";
+    private static final String S2 = "2";
+    private static final String S3 = "2";
+
+    private final List<String> l = new ArrayList<String>();
+    
+    private final Object monitor = new Object();
+    
+    private SynchronizedList<String> sl;
+    
+    @Before
+    public void setUp() {
+        this.l.add(S1);
+        this.sl = new SynchronizedList<String>(this.l, this.monitor);
+    }
+    
+    @Test
+    public void testAddAtIndex() {
+        assertEquals(S1, this.sl.get(0));
+        this.sl.add(0,S2);
+        assertEquals(S2, this.sl.get(0));
+        assertEquals(S1, this.sl.get(1));
+    }
+    
+    @Test
+    public void testAddAllAtIndex() {
+        Collection<String> a = new ArrayList<String>();
+        a.add(S2);
+        a.add(S3);
+        assertTrue(this.sl.addAll(0,a));
+        assertEquals(S2, this.sl.get(0));
+        assertEquals(S3, this.sl.get(1));
+        assertEquals(S1, this.sl.get(2));
+    }
+    
+    @Test
+    public void testGet() {
+        assertEquals(S1, this.sl.get(0));
+    }
+
+    @Test
+    public void testIndexOf() {
+        assertEquals(0, this.sl.indexOf(S1));
+    }
+    
+    @Test
+    public void testLastIndexOf() {
+        this.sl.add(S2);
+        this.sl.add(S1);
+        assertEquals(2, this.sl.lastIndexOf(S1));
+    }
+    
+    @Test
+    public void testListIterator() {
+        ListIterator<String> li = this.sl.listIterator();
+        assertEquals(S1, li.next());
+    }
+    
+    @Test
+    public void testListIteratorFromIndex() {
+        this.sl.add(S2);
+        ListIterator<String> li = this.sl.listIterator(1);
+        assertEquals(S2, li.next());
+    }
+    
+    @Test
+    public void testSetAtIndex() {
+        assertEquals(S1, this.sl.set(0,S2));
+        assertEquals(S2, this.sl.get(0));
+    }
+    
+    @Test
+    public void testSublist() {
+        this.sl.add(S2);
+        this.sl.add(S3);
+        List<String> subList = this.sl.subList(1, 2);
+        assertEquals(1, subList.size());
+        assertEquals(S2, subList.get(0));
+    }
+    
+    @Test
+    public void testRemoveFromIndex() {
+        assertEquals(S1, this.sl.remove(0));
+    }
+    
+    @Test
+    public void testAdd() {
+        assertTrue(this.sl.add(S2));
+    }
+    
+    @Test
+    public void testAddAll() {
+        Collection<String> a = new HashSet<String>();
+        a.add(S2);
+        assertTrue(this.sl.addAll(a));
+    }
+    
+    @Test
+    public void testClear() {
+        assertFalse(this.sl.isEmpty());
+        this.sl.clear();
+        assertTrue(this.sl.isEmpty());
+    }
+    
+    @Test
+    public void testContains() {
+        assertTrue(this.sl.contains(S1));
+        assertFalse(this.sl.contains(S2));
+    }
+    
+    @Test
+    public void testContainsAll() {
+        Collection<String> a = new HashSet<String>();
+        a.add(S1);
+        assertTrue(this.sl.containsAll(a));
+        a.add(S2);
+        assertFalse(this.sl.containsAll(a));
+    }
+    
+    @Test
+    public void testIsEmpty() {
+        assertFalse(this.sl.isEmpty());
+    }
+    
+    @Test
+    public void testIterator() {
+        Iterator<String> i = this.sl.iterator();
+        assertEquals(S1, i.next());
+    }
+    
+    @Test
+    public void testRemove() {
+        assertTrue(this.sl.contains(S1));
+        assertTrue(this.sl.remove(S1));
+        assertFalse(this.sl.contains(S1));
+        assertFalse(this.sl.remove(S1));
+    }
+    
+    @Test
+    public void testRemoveAll() {
+        Collection<String> a = new HashSet<String>();
+        a.add(S1);
+        a.add(S2);
+        assertTrue(this.sl.removeAll(a));
+        assertTrue(this.sl.isEmpty());
+        assertFalse(this.sl.removeAll(a));
+    }
+    
+    @Test
+    public void testRetainAll() {
+        Collection<String> a = new HashSet<String>();
+        a.add(S1);
+        assertFalse(this.sl.retainAll(a));
+        assertFalse(this.sl.isEmpty());
+        a.remove(S1);
+        assertTrue(this.sl.retainAll(a));
+        assertTrue(this.sl.isEmpty());
+    }
+    
+    @Test
+    public void testSize() {
+        assertEquals(1, this.sl.size());
+    }
+    
+    @Test
+    public void testToObjectArray() {
+        assertEquals(S1, this.sl.toArray()[0]);
+    }
+    
+    @Test
+    public void testToTypesArray() {
+        assertEquals(S1, this.sl.toArray(new String[0])[0]);
+    }
+    
+    @Test
+    public void testHashCodeEquals() {
+        this.sl.add(S2);
+        
+        List<String> a = new ArrayList<String>();
+        a.add(S1);
+        a.add(S2);
+        
+        assertEquals(this.l, a);
+        
+        SynchronizedList<String> sl2 = new SynchronizedList<String>(a, this.monitor);
+        
+        assertEquals(this.sl.hashCode(), sl2.hashCode());
+        assertTrue(this.sl.equals(this.sl));
+        assertTrue(this.sl.equals(sl2));
+    }
+    
+}
diff --git a/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/SynchronizedObjectTests.java b/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/SynchronizedObjectTests.java
new file mode 100644
index 0000000..bfa3a2d
--- /dev/null
+++ b/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/SynchronizedObjectTests.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.common;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+import org.eclipse.virgo.util.common.SynchronizedObject;
+import org.junit.Test;
+
+/**
+ */
+public class SynchronizedObjectTests {
+
+    private static final String STRING = "a";
+    
+    private final Object monitor = new Object();
+
+    @Test
+    public void testToString() {
+        assertEquals(STRING, (new SynchronizedObject(STRING, this.monitor)).toString());
+    }
+    
+    @Test
+    public void testEquals() {
+        assertFalse(STRING.equals(new SynchronizedObject(STRING, this.monitor)));
+    }
+    
+}
diff --git a/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/ThreadSafeAcyclicDirectedGraphTests.java b/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/ThreadSafeAcyclicDirectedGraphTests.java
new file mode 100644
index 0000000..f181dd2
--- /dev/null
+++ b/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/ThreadSafeAcyclicDirectedGraphTests.java
@@ -0,0 +1,347 @@
+/*******************************************************************************
+ * Copyright (c) 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution (ThreadSafeArrayListTreeTests.java)
+ *   EclipseSource - reworked from generic tree to DAG (Bug 358697)
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.common;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.util.concurrent.CyclicBarrier;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class ThreadSafeAcyclicDirectedGraphTests {
+
+    private DirectedAcyclicGraph<String> graph;
+
+    private static DirectedAcyclicGraph<String> getDAG() {
+        return getDAG("We");
+    }
+
+    private static DirectedAcyclicGraph<String> getDAG(String rootValue) {
+        DirectedAcyclicGraph<String> graph = new ThreadSafeDirectedAcyclicGraph<String>();
+
+        // shared nodes
+        GraphNode<String> lo = graph.createRootNode("Lo");
+        GraphNode<String> fi = graph.createRootNode("Fi");
+
+        // We.add(Pa)
+        GraphNode<String> we = graph.createRootNode("We");
+        GraphNode<String> pa = graph.createRootNode("Pa");
+        we.addChild(pa);
+        // Pa.add(Cr)
+        GraphNode<String> cr = graph.createRootNode("Cr");
+        pa.addChild(cr);
+        // Cr.add(B1,Lo,Fi)
+        cr.addChild(graph.createRootNode("B1"));
+        cr.addChild(lo);
+        cr.addChild(fi);
+
+        // Pa.add(Cu)
+        GraphNode<String> cu = graph.createRootNode("Cu");
+        pa.addChild(cu);
+        cu.addChild(graph.createRootNode("B2"));
+        cu.addChild(lo);
+        cu.addChild(fi);
+
+        // Pa.add(B3)
+        pa.addChild(graph.createRootNode("B3"));
+        // Pa.add(Lo)
+        pa.addChild(lo);
+
+        return graph;
+    }
+
+    @Before
+    public void setUp() {
+        this.graph = getDAG();
+    }
+
+    @Test
+    public void testEmptyGraph() throws Exception {
+        DirectedAcyclicGraph<String> emptyGraph = new ThreadSafeDirectedAcyclicGraph<String>();
+
+        assertNotNull(emptyGraph);
+        assertNotNull(emptyGraph.getRootNodes());
+        assertEquals("<>", emptyGraph.toString());
+        assertTrue(emptyGraph.getRootNodes().isEmpty());
+    }
+
+    @Test
+    public void testGraphWithSingleRootNode() throws Exception {
+        DirectedAcyclicGraph<String> smallGraph = new ThreadSafeDirectedAcyclicGraph<String>();
+
+        GraphNode<String> rootNode = smallGraph.createRootNode("root");
+
+        assertEquals("<root<>>", smallGraph.toString());
+        assertEquals(1, smallGraph.getRootNodes().size());
+
+        smallGraph.deleteRootNode(rootNode);
+
+        assertEquals(0, smallGraph.getRootNodes().size());
+    }
+
+    @Test
+    public void testGraphWithSingleNullRootNode() throws Exception {
+        DirectedAcyclicGraph<String> smallGraph = new ThreadSafeDirectedAcyclicGraph<String>();
+
+        GraphNode<String> rootNode = smallGraph.createRootNode(null);
+
+        assertEquals("<null<>>", smallGraph.toString());
+        assertEquals(1, smallGraph.getRootNodes().size());
+
+        smallGraph.deleteRootNode(rootNode);
+
+        assertEquals(0, smallGraph.getRootNodes().size());
+    }
+
+    @Test
+    public void testGraphWithOnlyChildren() throws Exception {
+        DirectedAcyclicGraph<String> onlyChildGraph = new ThreadSafeDirectedAcyclicGraph<String>();
+
+        GraphNode<String> rootNode = onlyChildGraph.createRootNode("root");
+        assertEquals("<root<>>", onlyChildGraph.toString());
+        assertEquals(1, onlyChildGraph.getRootNodes().size());
+
+        GraphNode<String> child = onlyChildGraph.createRootNode("child");
+        rootNode.addChild(child);
+        assertEquals("<root<child<>>>", onlyChildGraph.toString());
+
+        GraphNode<String> grandchild = onlyChildGraph.createRootNode("grandchild");
+        child.addChild(grandchild);
+        assertEquals("<root<child<grandchild<>>>>", onlyChildGraph.toString());
+        assertEquals(1, onlyChildGraph.getRootNodes().size());
+
+        assertTrue(child.removeChild(grandchild));
+        onlyChildGraph.deleteRootNode(grandchild);
+        assertTrue(rootNode.removeChild(child));
+        onlyChildGraph.deleteRootNode(child);
+        onlyChildGraph.deleteRootNode(rootNode);
+        assertEquals(0, onlyChildGraph.getRootNodes().size());
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testDirectCycle() throws Exception {
+        DirectedAcyclicGraph<Integer> smallGraph = new ThreadSafeDirectedAcyclicGraph<Integer>();
+        GraphNode<Integer> root = smallGraph.createRootNode(Integer.valueOf(42));
+
+        root.addChild(root);
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testParentNodeIsNotADescendantOfTheNewChild() throws Exception {
+        DirectedAcyclicGraph<String> dag = new ThreadSafeDirectedAcyclicGraph<String>();
+        GraphNode<String> rootNode = dag.createRootNode("root");
+        GraphNode<String> child = dag.createRootNode("child");
+
+        rootNode.addChild(child);
+        child.addChild(rootNode);
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testParentIsNotADescendantOfTheNewChildDistanceTwo() throws Exception {
+        DirectedAcyclicGraph<String> dag = new ThreadSafeDirectedAcyclicGraph<String>();
+        GraphNode<String> rootNode = dag.createRootNode("root");
+
+        GraphNode<String> child = dag.createRootNode("child");
+        rootNode.addChild(child);
+        GraphNode<String> child2 = dag.createRootNode("child2");
+        rootNode.addChild(child2);
+        GraphNode<String> grandchild = dag.createRootNode("grandchild");
+        child.addChild(grandchild);
+
+        grandchild.addChild(rootNode);
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testDeleteRootNodeFromOtherGraph() {
+        DirectedAcyclicGraph<String> smallGraph = new ThreadSafeDirectedAcyclicGraph<String>();
+        GraphNode<String> r1 = smallGraph.createRootNode("R1");
+
+        this.graph.deleteRootNode(r1);
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testDeleteRootNodeOfWrongType() {
+        this.graph.deleteRootNode(new ThreadSafeGraphNodeTests.NoopGraphNode());
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testDeleteRootNodeWithChildren() {
+        DirectedAcyclicGraph<String> smallGraph = new ThreadSafeDirectedAcyclicGraph<String>();
+        GraphNode<String> r1 = smallGraph.createRootNode("R1");
+        GraphNode<String> c1 = smallGraph.createRootNode("C1");
+        r1.addChild(c1);
+
+        this.graph.deleteRootNode(r1);
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testDeleteNonRootNode() {
+        DirectedAcyclicGraph<String> smallGraph = new ThreadSafeDirectedAcyclicGraph<String>();
+        GraphNode<String> r1 = smallGraph.createRootNode("R1");
+        GraphNode<String> c1 = smallGraph.createRootNode("C1");
+        r1.addChild(c1);
+
+        this.graph.deleteRootNode(c1);
+    }
+
+    @Test
+    public void testAddSharedChildWithMultipleThreads() throws Exception {
+
+        final DirectedAcyclicGraph<String> sharedChildGraph = new ThreadSafeDirectedAcyclicGraph<String>();
+        final int THREAD_COUNT = 150;
+        final CyclicBarrier barrier = new CyclicBarrier(THREAD_COUNT + 1);
+        final GraphNode<String> sharedChild = sharedChildGraph.createRootNode("shared child");
+        assertEquals(0, sharedChild.getParents().size());
+        assertEquals(1, sharedChildGraph.getRootNodes().size());
+
+        class AddChildThread extends Thread {
+
+            private final int counter;
+
+            public AddChildThread(int counter) {
+                this.counter = counter;
+            }
+
+            @Override
+            public void run() {
+                try {
+                    barrier.await(); // 1
+                    GraphNode<String> root = sharedChildGraph.createRootNode("root" + this.counter);
+                    root.addChild(sharedChild);
+                    barrier.await(); // 2
+                    barrier.await();
+                    assertTrue(root.removeChild(sharedChild));
+                    barrier.await(); // 3
+                    barrier.await();
+                    sharedChildGraph.deleteRootNode(root);
+                    barrier.await();
+                } catch (Exception e) {
+                    fail();
+                }
+            }
+        }
+
+        for (int i = 0; i < THREAD_COUNT; i++) {
+            new AddChildThread(i).start();
+        }
+        barrier.await(); // 1 - wait for all threads to be ready
+        barrier.await(); // 2 - wait for all threads to create and add the nodes
+        assertEquals(THREAD_COUNT, sharedChild.getParents().size());
+        assertEquals(THREAD_COUNT, sharedChildGraph.getRootNodes().size());
+        barrier.await(); //
+        barrier.await(); // 3 - wait for all threads to be finish
+        assertEquals(0, sharedChild.getParents().size());
+        assertEquals(THREAD_COUNT + 1, sharedChildGraph.getRootNodes().size());
+        barrier.await(); // wait for all threads to be finish
+        assertEquals(0, sharedChild.getParents().size());
+    }
+
+    @Test
+    public void testGraphWithSharedNodes() throws Exception {
+        DirectedAcyclicGraph<String> smallGraph = new ThreadSafeDirectedAcyclicGraph<String>();
+
+        GraphNode<String> r1 = smallGraph.createRootNode("R1");
+        GraphNode<String> c1 = smallGraph.createRootNode("C1");
+        GraphNode<String> c2 = smallGraph.createRootNode("C2");
+        smallGraph.createRootNode("C3");
+        assertEquals(4, smallGraph.getRootNodes().size());
+        assertEquals("<R1<>, C1<>, C2<>, C3<>>", smallGraph.toString());
+
+        r1.addChild(c1);
+        assertEquals(3, smallGraph.getRootNodes().size());
+        r1.addChild(c2);
+        assertEquals(2, smallGraph.getRootNodes().size());
+        assertEquals("<R1<C1<>, C2<>>, C3<>>", smallGraph.toString());
+
+        GraphNode<String> r2 = smallGraph.createRootNode("R2");
+        assertEquals(3, smallGraph.getRootNodes().size());
+        assertEquals("<R1<C1<>, C2<>>, C3<>, R2<>>", smallGraph.toString());
+
+        r2.addChild(c1);
+        assertEquals(3, smallGraph.getRootNodes().size());
+        assertEquals("<R1<C1<>, C2<>>, C3<>, R2<C1<>>>", smallGraph.toString());
+    }
+
+    @Test
+    public void testDisassembleGraphWithSharedNodes() throws Exception {
+        DirectedAcyclicGraph<String> smallGraph = new ThreadSafeDirectedAcyclicGraph<String>();
+        GraphNode<String> r1 = smallGraph.createRootNode("R1");
+        GraphNode<String> c1 = smallGraph.createRootNode("C1");
+        GraphNode<String> c2 = smallGraph.createRootNode("C2");
+        GraphNode<String> c3 = smallGraph.createRootNode("C3");
+        r1.addChild(c1);
+        r1.addChild(c2);
+        GraphNode<String> r2 = smallGraph.createRootNode("R2");
+        r2.addChild(c1);
+        assertEquals("<R1<C1<>, C2<>>, C3<>, R2<C1<>>>", smallGraph.toString());
+        assertEquals(3, smallGraph.getRootNodes().size());
+
+        // remove shared node
+        assertTrue(r2.removeChild(c1));
+        assertEquals("<R1<C1<>, C2<>>, C3<>, R2<>>", smallGraph.toString());
+        assertEquals(3, smallGraph.getRootNodes().size());
+        assertTrue(r1.removeChild(c2));
+        assertEquals(4, smallGraph.getRootNodes().size());
+        assertTrue(r1.removeChild(c1));
+        assertEquals(5, smallGraph.getRootNodes().size());
+        assertEquals("<R1<>, C1<>, C2<>, C3<>, R2<>>", smallGraph.toString());
+        assertTrue(smallGraph.deleteRootNode(r2));
+        assertEquals(4, smallGraph.getRootNodes().size());
+        assertEquals("<R1<>, C1<>, C2<>, C3<>>", smallGraph.toString());
+        assertTrue(smallGraph.deleteRootNode(r1));
+        assertEquals(3, smallGraph.getRootNodes().size());
+        assertEquals("<C1<>, C2<>, C3<>>", smallGraph.toString());
+        smallGraph.deleteRootNode(smallGraph.getRootNodes().get(0));
+        assertEquals(2, smallGraph.getRootNodes().size());
+        assertEquals("<C2<>, C3<>>", smallGraph.toString());
+        assertTrue(smallGraph.deleteRootNode(c2));
+        assertEquals(1, smallGraph.getRootNodes().size());
+        assertTrue(smallGraph.deleteRootNode(c3));
+        assertTrue(smallGraph.getRootNodes().isEmpty());
+    }
+
+    @Test
+    public void testRemovalOfAnAlreadyRemovedRootNode() throws Exception {
+        DirectedAcyclicGraph<String> smallGraph = new ThreadSafeDirectedAcyclicGraph<String>();
+        GraphNode<String> r1 = smallGraph.createRootNode("R1");
+
+        assertTrue(smallGraph.deleteRootNode(r1));
+
+        assertFalse(smallGraph.deleteRootNode(r1));
+    }
+
+    @Test
+    public void testHashCodeEquals() {
+        assertFalse(this.graph.equals(null));
+
+        assertFalse(this.graph.equals(new Object()));
+
+        DirectedAcyclicGraph<String> graph2 = getDAG();
+        assertEquals(this.graph.hashCode(), graph2.hashCode());
+        assertEquals(this.graph, this.graph);
+        assertEquals(graph2, this.graph);
+        assertEquals(this.graph, graph2);
+
+        DirectedAcyclicGraph<String> g1 = new ThreadSafeDirectedAcyclicGraph<String>();
+        assertFalse(this.graph.equals(g1));
+        assertFalse(g1.equals(this.graph));
+
+        assertTrue(new ThreadSafeDirectedAcyclicGraph<String>().equals(new ThreadSafeDirectedAcyclicGraph<String>()));
+    }
+
+}
diff --git a/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/ThreadSafeArrayListTreeTests.java b/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/ThreadSafeArrayListTreeTests.java
new file mode 100644
index 0000000..adbae86
--- /dev/null
+++ b/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/ThreadSafeArrayListTreeTests.java
@@ -0,0 +1,279 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.common;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.virgo.util.common.ThreadSafeArrayListTree;
+import org.eclipse.virgo.util.common.Tree;
+import org.eclipse.virgo.util.common.Tree.ExceptionThrowingTreeVisitor;
+import org.eclipse.virgo.util.common.Tree.TreeVisitor;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ */
+public class ThreadSafeArrayListTreeTests {
+
+    private static void add(List<String> l, String... s) {
+        for (String string : s) {
+            l.add(string);
+        }
+    }
+
+    private static final ArrayList<String> EXPECTED_VISITS = new ArrayList<String>();
+
+    static {
+        add(EXPECTED_VISITS, "a", "b", "c", "d", "e", "f", "g");
+    }
+
+    private Tree<String> top;
+
+    private static Tree<String> getTree() {
+        return getTree("a");
+    }
+
+    private static Tree<String> getTree(String rootValue) {
+        Tree<String> top = new ThreadSafeArrayListTree<String>(rootValue);
+
+        Tree<String> left = new ThreadSafeArrayListTree<String>("b");
+        left.addChild(new ThreadSafeArrayListTree<String>("c"));
+        left.addChild(new ThreadSafeArrayListTree<String>("d"));
+
+        Tree<String> right = new ThreadSafeArrayListTree<String>("e");
+        right.addChild(new ThreadSafeArrayListTree<String>("f"));
+        right.addChild(new ThreadSafeArrayListTree<String>("g"));
+
+        top.addChild(left);
+        top.addChild(right);
+
+        return top;
+    }
+
+    @Before
+    public void setUp() {
+        this.top = getTree();
+    }
+
+    @Test
+    public void testToString() {
+        assertEquals("a<b<c<>, d<>>, e<f<>, g<>>>", this.top.toString());
+
+        assertEquals("null<>", new ThreadSafeArrayListTree<String>(null).toString());
+    }
+
+    @Test
+    public void testHashCodeEquals() {
+        assertFalse(this.top.equals(null));
+
+        assertFalse(this.top.equals(new Object()));
+
+        Tree<String> top2 = getTree();
+        assertEquals(this.top.hashCode(), top2.hashCode());
+        assertEquals(this.top, this.top);
+        assertEquals(top2, this.top);
+        assertEquals(this.top, top2);
+
+        Tree<String> t1 = new ThreadSafeArrayListTree<String>("a");
+        {
+            Tree<String> a = t1;
+            assertFalse(this.top.equals(a));
+            assertFalse(a.equals(this.top));
+        }
+
+        {
+            Tree<String> a = new ThreadSafeArrayListTree<String>(null);
+            assertFalse(this.top.equals(a));
+            assertFalse(a.equals(this.top));
+        }
+
+        assertTrue(new ThreadSafeArrayListTree<String>(null).equals(new ThreadSafeArrayListTree<String>(null)));
+
+        Tree<String> t2 = new ThreadSafeArrayListTree<String>("b");
+        assertFalse(t1.equals(t2));
+        assertFalse(t2.equals(t1));
+    }
+
+    @Test
+    public void testSize() {
+        assertEquals(7, this.top.size());
+    }
+
+    @Test
+    public void testChildren() {
+        List<Tree<String>> children = this.top.getChildren();
+        assertEquals(2, children.size());
+        Tree<String> newChild = getTree("newChild");
+        Tree<String> childCopy = this.top.addChild(newChild);
+        assertEquals(3, children.size());
+        assertEquals(newChild, children.get(2));
+        assertEquals(newChild, childCopy);
+    }
+
+    @Test
+    public void testCopyOnAddChild() {
+        this.top.addChild(this.top);
+        assertEquals(14, this.top.size());
+
+        // Ensure parents are correctly set up in the copy.
+        checkParents(this.top);
+    }
+
+    private void checkParents(Tree<String> tree) {
+        List<Tree<String>> children = tree.getChildren();
+        for (Tree<String> child : children) {
+            assertEquals(tree, child.getParent());
+            checkParents(child);
+        }
+    }
+
+    @Test
+    public void testChildrenListModification() {
+        List<Tree<String>> children = this.top.getChildren();
+        assertEquals(2, children.size());
+        Tree<String> newChild = getTree("newChild");
+        children.add(newChild);
+        assertEquals(3, children.size());
+        assertEquals(newChild, children.get(2));
+    }
+
+    @Test
+    public void testGetValue() {
+        assertEquals("a", this.top.getValue());
+    }
+
+    @Test
+    public void testRemoveChild() {
+        List<Tree<String>> children = this.top.getChildren();
+        assertTrue(this.top.removeChild(children.get(0)));
+        assertEquals(4, this.top.size());
+    }
+
+    @Test
+    public void testParent() {
+        List<Tree<String>> children = this.top.getChildren();
+        Tree<String> child = children.get(0);
+        assertEquals(this.top, child.getParent());
+        this.top.removeChild(child);
+        assertNull(child.getParent());
+    }
+
+    @Test
+    public void testNormalVisit() {
+        TestTreeVisitor visitor = new TestTreeVisitor();
+        this.top.visit(visitor);
+        assertTrue(EXPECTED_VISITS.equals(visitor.getVisited()));
+    }
+
+    @Test
+    public void testSkippedVisit() {
+        TestTreeVisitor visitor = new TestTreeVisitor();
+        Tree<String> t = new ThreadSafeArrayListTree<String>("-");
+        t.visit(visitor);
+        List<String> visited = visitor.getVisited();
+        assertEquals(1, visited.size());
+        assertEquals("-", visited.get(0));
+    }
+
+    @Test
+    public void testPartiallySkippedVisit() {
+        TestTreeVisitor visitor = new TestTreeVisitor();
+        Tree<String> t = new ThreadSafeArrayListTree<String>("-");
+        t.addChild(this.top);
+        this.top.addChild(t);
+        assertEquals(15, this.top.size());
+        this.top.visit(visitor);
+        assertEquals(8, visitor.getVisited().size());
+    }
+
+    @Test
+    public void testNormalExceptionVisit() throws Exception {
+        TestTreeExceptionVisitor visitor = new TestTreeExceptionVisitor();
+        this.top.visit(visitor);
+        assertTrue(EXPECTED_VISITS.equals(visitor.getVisited()));
+    }
+
+    @Test
+    public void testSkippedExceptionVisit() throws Exception {
+        TestTreeExceptionVisitor visitor = new TestTreeExceptionVisitor();
+        Tree<String> t = new ThreadSafeArrayListTree<String>("-");
+        t.visit(visitor);
+        List<String> visited = visitor.getVisited();
+        assertEquals(1, visited.size());
+        assertEquals("-", visited.get(0));
+    }
+
+    @Test
+    public void testPartiallySkippedDueToStopExceptionVisit() throws Exception {
+        TestTreeExceptionVisitor visitor = new TestTreeExceptionVisitor();
+        Tree<String> t = new ThreadSafeArrayListTree<String>("-");
+        t.addChild(this.top);
+        this.top.addChild(t);
+        assertEquals(15, this.top.size());
+        this.top.visit(visitor);
+        assertEquals(8, visitor.getVisited().size());
+    }
+
+    @Test(expected = Exception.class)
+    public void testPartiallySkippedDueToExceptionExceptionVisit() throws Exception {
+        TestTreeExceptionVisitor visitor = new TestTreeExceptionVisitor();
+        Tree<String> t = new ThreadSafeArrayListTree<String>("*");
+        t.addChild(this.top);
+        this.top.addChild(t);
+        assertEquals(15, this.top.size());
+        try {
+            this.top.visit(visitor);
+        } finally {
+            assertEquals(8, visitor.getVisited().size());
+        }
+    }
+
+    private static class TestTreeVisitor implements TreeVisitor<String> {
+
+        private List<String> visited = new ArrayList<String>();
+
+        public boolean visit(Tree<String> tree) {
+            String value = tree.getValue();
+            visited.add(value);
+            return !value.startsWith("-");
+        }
+
+        public List<String> getVisited() {
+            return this.visited;
+        }
+    }
+
+    private static class TestTreeExceptionVisitor implements ExceptionThrowingTreeVisitor<String, Exception> {
+
+        private List<String> visited = new ArrayList<String>();
+
+        public boolean visit(Tree<String> tree) throws Exception {
+            String value = tree.getValue();
+            visited.add(value);
+            if (value.startsWith("*")) {
+                throw new Exception();
+            }
+            return !value.startsWith("-");
+        }
+
+        public List<String> getVisited() {
+            return this.visited;
+        }
+    }
+
+}
diff --git a/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/ThreadSafeGraphNodeTests.java b/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/ThreadSafeGraphNodeTests.java
new file mode 100644
index 0000000..bb32a04
--- /dev/null
+++ b/util/org.eclipse.virgo.util.common/src/test/java/org/eclipse/virgo/util/common/ThreadSafeGraphNodeTests.java
@@ -0,0 +1,601 @@
+/*******************************************************************************
+ * Copyright (c) 2011 VMware Inc. and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution (ThreadSafeArrayListTreeTests.java)
+ *   EclipseSource - reworked from generic tree to DAG (Bug 358697)
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.common;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.CyclicBarrier;
+
+import org.eclipse.virgo.util.common.GraphNode.DirectedAcyclicGraphVisitor;
+import org.eclipse.virgo.util.common.GraphNode.ExceptionThrowingDirectedAcyclicGraphVisitor;
+import org.junit.Test;
+
+public class ThreadSafeGraphNodeTests {
+
+    private static void add(List<String> l, String... s) {
+        for (String string : s) {
+            l.add(string);
+        }
+    }
+
+    private static final List<String> EXPECTED_VISITS = new ArrayList<String>();
+
+    static {
+        add(EXPECTED_VISITS, "We", "Pa", "Cr", "B1", "Lo", "Fi", "Cu", "B2", "B3");
+    }
+
+    private GraphNode<String> buildTestGraphAndReturnRootNode() {
+        return buildTestGraphAndReturnRootNode(new ThreadSafeDirectedAcyclicGraph<String>());
+    }
+
+    private GraphNode<String> buildTestGraphAndReturnRootNode(DirectedAcyclicGraph<String> graph) {
+        return buildTestGraphAndReturnRootNode(graph, "We");
+    }
+
+    private GraphNode<String> buildTestGraphAndReturnRootNode(DirectedAcyclicGraph<String> graph, String rootValue) {
+        GraphNode<String> top = graph.createRootNode(rootValue);
+
+        // shared nodes
+        GraphNode<String> lo = graph.createRootNode("Lo");
+        GraphNode<String> fi = graph.createRootNode("Fi");
+
+        // We.add(Pa)
+        top.addChild(graph.createRootNode("Pa"));
+        GraphNode<String> pa = top.getChildren().get(0);
+        // Pa.add(Cr)
+        pa.addChild(graph.createRootNode("Cr"));
+        GraphNode<String> cr = pa.getChildren().get(0);
+        cr.addChild(graph.createRootNode("B1"));
+        cr.addChild(lo);
+        cr.addChild(fi);
+
+        // Pa.add(Cu)
+        pa.addChild(graph.createRootNode("Cu"));
+        GraphNode<String> cu = pa.getChildren().get(1);
+        cu.addChild(graph.createRootNode("B2"));
+        cu.addChild(lo);
+        cu.addChild(fi);
+
+        // Pa.add(B3)
+        pa.addChild(graph.createRootNode("B3"));
+        // Pa.add(Lo)
+        pa.addChild(lo);
+
+        return top;
+    }
+
+    private GraphNode<String> addFluffyToGraph(DirectedAcyclicGraph<String> graph) {
+        GraphNode<String> body = graph.createRootNode("Fluffy's body");
+        for (int i = 0; i < 3; i++) {
+            GraphNode<String> head = graph.createRootNode("head " + i);
+            head.addChild(body);
+        }
+        return body;
+    }
+
+    @Test
+    public void testEmptyNode() throws Exception {
+        DirectedAcyclicGraph<String> graph = new ThreadSafeDirectedAcyclicGraph<String>();
+
+        GraphNode<String> nullGraph = graph.createRootNode(null);
+
+        assertNull(nullGraph.getValue());
+        assertEquals("null<>", nullGraph.toString());
+    }
+
+    @Test
+    public void testDepthTwo() throws Exception {
+        DirectedAcyclicGraph<String> graph = new ThreadSafeDirectedAcyclicGraph<String>();
+        GraphNode<String> root = graph.createRootNode("root");
+
+        root.addChild(graph.createRootNode("C1"));
+        root.addChild(graph.createRootNode("C2"));
+
+        assertEquals("root<C1<>, C2<>>", root.toString());
+    }
+
+    @Test
+    public void testDepthThree() throws Exception {
+        DirectedAcyclicGraph<String> graph = new ThreadSafeDirectedAcyclicGraph<String>();
+        GraphNode<String> we = graph.createRootNode("We");
+        GraphNode<String> pa = graph.createRootNode("Pa");
+        GraphNode<String> cr = graph.createRootNode("Cr");
+
+        we.addChild(pa);
+        pa.addChild(cr);
+
+        assertEquals("We<Pa<Cr<>>>", we.toString());
+    }
+
+    @Test
+    public void testToString() {
+        DirectedAcyclicGraph<String> graph = new ThreadSafeDirectedAcyclicGraph<String>();
+
+        assertEquals("null<>", graph.createRootNode(null).toString());
+
+        GraphNode<String> top = buildTestGraphAndReturnRootNode(graph);
+
+        assertEquals("We<Pa<Cr<B1<>, Lo<>, Fi<>>, Cu<B2<>, Lo<>, Fi<>>, B3<>, Lo<>>>", top.toString());
+    }
+
+    @Test
+    public void testHashCodeEquals() {
+        DirectedAcyclicGraph<String> graphA = new ThreadSafeDirectedAcyclicGraph<String>();
+        GraphNode<String> topA = graphA.createRootNode("root");
+
+        assertFalse(topA.equals(null));
+        assertFalse(topA.equals(new Object()));
+
+        DirectedAcyclicGraph<String> graphB = new ThreadSafeDirectedAcyclicGraph<String>();
+        GraphNode<String> topB = graphB.createRootNode("root");
+
+        assertEquals(topA.hashCode(), topB.hashCode());
+        assertEquals(topB.hashCode(), topA.hashCode());
+
+        assertEquals(topA, topB);
+        assertEquals(topB, topA);
+
+        GraphNode<String> t1 = graphA.createRootNode("a");
+        {
+            GraphNode<String> a = t1;
+            assertFalse(topA.equals(a));
+            assertFalse(a.equals(topA));
+        }
+
+        {
+            GraphNode<String> a = graphA.createRootNode(null);
+            assertFalse(topA.equals(a));
+            assertFalse(a.equals(topA));
+        }
+
+        assertTrue(graphA.createRootNode(null).equals(graphA.createRootNode(null)));
+        assertFalse(graphA.createRootNode(null).equals(graphA.createRootNode("a")));
+        assertFalse(graphA.createRootNode("a").equals(graphA.createRootNode(null)));
+
+        GraphNode<String> t2 = graphA.createRootNode("b");
+        assertFalse(t1.equals(t2));
+        assertFalse(t2.equals(t1));
+    }
+
+    @Test
+    public void testSize() {
+        GraphNode<String> top = buildTestGraphAndReturnRootNode();
+
+        // (+1) Web shop application
+        // (+1) Payment application
+        // (+1) Credit card application
+        // (+3) B1, Logging Bundle, Financial Utils (Lo and Fi first time)
+        // (+1) Currency conversion application
+        // (+1) B2, Logging Bundle, Financial Utils (B2 only)
+        // (+1) B3
+        // (+0) Logging Bundle
+        assertEquals(9, top.size());
+    }
+
+    @Test
+    public void testSizeWithNullNodes() throws Exception {
+        DirectedAcyclicGraph<String> graph = new ThreadSafeDirectedAcyclicGraph<String>();
+
+        GraphNode<String> graphWithNullNodes = graph.createRootNode("with null values");
+        assertEquals(1, graphWithNullNodes.size());
+
+        graphWithNullNodes.addChild(graph.createRootNode("first"));
+        assertEquals(2, graphWithNullNodes.size());
+
+        graphWithNullNodes.addChild(graph.createRootNode(null));
+        assertEquals(3, graphWithNullNodes.size());
+
+        graphWithNullNodes.addChild(graph.createRootNode("third"));
+        assertEquals(4, graphWithNullNodes.size());
+    }
+
+    @Test
+    public void testSizeWithMultipleRoots() throws Exception {
+        DirectedAcyclicGraph<String> graph = new ThreadSafeDirectedAcyclicGraph<String>();
+        GraphNode<String> fluffy = addFluffyToGraph(graph);
+
+        assertEquals(1, fluffy.size());
+
+        List<GraphNode<String>> parents = fluffy.getParents();
+        for (GraphNode<String> parent : parents) {
+            assertEquals(2, parent.size());
+        }
+    }
+
+    @Test
+    public void testChildren() {
+        DirectedAcyclicGraph<String> graph = new ThreadSafeDirectedAcyclicGraph<String>();
+        GraphNode<String> top = buildTestGraphAndReturnRootNode(graph);
+
+        List<GraphNode<String>> children = top.getChildren();
+        assertEquals(1, children.size());
+        GraphNode<String> newChild = graph.createRootNode("newChild");
+
+        top.addChild(newChild);
+        assertEquals(2, children.size());
+        assertEquals(newChild, children.get(1));
+    }
+
+    @Test
+    public void testDAGWithNoChilds() throws Exception {
+        DirectedAcyclicGraph<String> graph = new ThreadSafeDirectedAcyclicGraph<String>();
+
+        GraphNode<String> solo = graph.createRootNode("solo");
+
+        assertNotNull(solo.getChildren());
+        assertTrue(solo.getChildren().isEmpty());
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testInstanceOfChild() throws Exception {
+        DirectedAcyclicGraph<String> graph = new ThreadSafeDirectedAcyclicGraph<String>();
+        GraphNode<String> child = new NoopGraphNode();
+
+        graph.createRootNode("foo").addChild(child);
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testDuplicateInsertionOfAChild() throws Exception {
+        DirectedAcyclicGraph<String> graph = new ThreadSafeDirectedAcyclicGraph<String>();
+        buildTestGraphAndReturnRootNode(graph);
+
+        GraphNode<String> node = graph.getRootNodes().get(0);
+        GraphNode<String> child = graph.createRootNode("child");
+
+        node.addChild(child);
+        node.addChild(child);
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testAddChildFromOtherDAG() throws Exception {
+        DirectedAcyclicGraph<String> graph = new ThreadSafeDirectedAcyclicGraph<String>();
+        GraphNode<String> top = buildTestGraphAndReturnRootNode(graph);
+
+        DirectedAcyclicGraph<String> secondGraph = new ThreadSafeDirectedAcyclicGraph<String>();
+        GraphNode<String> alienNode = secondGraph.createRootNode("alien");
+
+        top.addChild(alienNode);
+    }
+
+    @Test
+    public void testAddSharedChild() {
+        DirectedAcyclicGraph<String> graph = new ThreadSafeDirectedAcyclicGraph<String>();
+        GraphNode<String> cr = graph.createRootNode("cr");
+        GraphNode<String> cu = graph.createRootNode("cu");
+        GraphNode<String> lo = graph.createRootNode("lo");
+
+        cr.addChild(lo);
+        cu.addChild(lo);
+
+        assertEquals(2, lo.getParents().size());
+        assertTrue(lo.getParents().contains(cr));
+        assertTrue(lo.getParents().contains(cu));
+
+        // Ensure parents are correctly set up in both root nodes.
+        checkParents(Collections.singletonList(cr));
+        checkParents(Collections.singletonList(cu));
+    }
+
+    @Test
+    public void testAddSharedChildWithMultipleThreads() throws Exception {
+
+        final int THREAD_COUNT = 150;
+        final CyclicBarrier barrier = new CyclicBarrier(THREAD_COUNT + 1);
+        final DirectedAcyclicGraph<String> graph = new ThreadSafeDirectedAcyclicGraph<String>();
+        final GraphNode<String> sharedChild = graph.createRootNode("shared child");
+
+        class AddChildThread extends Thread {
+
+            private final int counter;
+
+            public AddChildThread(int counter) {
+                this.counter = counter;
+            }
+
+            @Override
+            public void run() {
+                try {
+                    barrier.await();
+                    GraphNode<String> root = graph.createRootNode("root" + this.counter);
+                    root.addChild(sharedChild);
+                    barrier.await();
+                } catch (Exception e) {
+                    fail();
+                }
+            }
+        }
+
+        for (int i = 0; i < THREAD_COUNT; i++) {
+            new AddChildThread(i).start();
+        }
+        barrier.await(); // wait for all threads to be ready
+        barrier.await(); // wait for all threads to be finish
+
+        assertEquals(THREAD_COUNT, sharedChild.getParents().size());
+    }
+
+    private void checkParents(List<GraphNode<String>> parents) {
+        for (GraphNode<String> parent : parents) {
+            List<GraphNode<String>> children = parent.getChildren();
+            for (GraphNode<String> child : children) {
+                assertTrue(child.getParents().contains(parent));
+                checkParents(Collections.singletonList(child));
+            }
+        }
+    }
+
+    @Test
+    public void testChildrenListModification() {
+        DirectedAcyclicGraph<String> graph = new ThreadSafeDirectedAcyclicGraph<String>();
+        GraphNode<String> top = buildTestGraphAndReturnRootNode(graph);
+
+        List<GraphNode<String>> children = top.getChildren();
+        assertEquals(1, children.size());
+
+        GraphNode<String> newChild = buildTestGraphAndReturnRootNode(graph, "newChild");
+        children.add(newChild);
+        assertEquals(2, children.size());
+        assertEquals(newChild, children.get(1));
+    }
+
+    @Test
+    public void testGetValue() {
+        DirectedAcyclicGraph<String> graph = new ThreadSafeDirectedAcyclicGraph<String>();
+        GraphNode<String> top = buildTestGraphAndReturnRootNode(graph);
+
+        assertEquals("We", top.getValue());
+    }
+
+    @Test
+    public void testRemoveChild() {
+        DirectedAcyclicGraph<String> graph = new ThreadSafeDirectedAcyclicGraph<String>();
+        GraphNode<String> top = buildTestGraphAndReturnRootNode(graph);
+
+        List<GraphNode<String>> children = top.getChildren();
+        assertTrue(top.removeChild(children.get(0)));
+
+        assertEquals(1, top.size());
+        assertFalse(top.removeChild(buildTestGraphAndReturnRootNode(graph, "unknownChild")));
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testRemoveWrongInstanceOfChild() throws Exception {
+        DirectedAcyclicGraph<String> graph = new ThreadSafeDirectedAcyclicGraph<String>();
+        GraphNode<String> child = new NoopGraphNode();
+
+        graph.createRootNode("foo").removeChild(child);
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testRemoveChildFromOtherDAG() throws Exception {
+        DirectedAcyclicGraph<String> graph = new ThreadSafeDirectedAcyclicGraph<String>();
+        GraphNode<String> top = buildTestGraphAndReturnRootNode(graph);
+
+        DirectedAcyclicGraph<String> secondGraph = new ThreadSafeDirectedAcyclicGraph<String>();
+        GraphNode<String> alienNode = secondGraph.createRootNode("alien");
+
+        top.removeChild(alienNode);
+    }
+
+    @Test
+    public void testParent() {
+        DirectedAcyclicGraph<String> graph = new ThreadSafeDirectedAcyclicGraph<String>();
+        GraphNode<String> top = buildTestGraphAndReturnRootNode(graph);
+
+        List<GraphNode<String>> children = top.getChildren();
+        assertNotNull(top.getParents());
+        assertTrue(top.getParents().isEmpty());
+
+        GraphNode<String> child = children.get(0);
+        assertEquals(Collections.singletonList(top), child.getParents());
+        assertSame(top, child.getParents().get(0));
+
+        top.removeChild(child);
+        assertNotNull(child.getParents());
+        assertTrue(child.getParents().isEmpty());
+    }
+
+    @Test
+    public void testNormalVisit() {
+        DirectedAcyclicGraph<String> graph = new ThreadSafeDirectedAcyclicGraph<String>();
+        GraphNode<String> top = buildTestGraphAndReturnRootNode(graph);
+
+        TestDirectedAcyclicGraphVisitor visitor = new TestDirectedAcyclicGraphVisitor();
+        top.visit(visitor);
+        assertTrue(EXPECTED_VISITS.equals(visitor.getVisited()));
+    }
+
+    @Test
+    public void testSkippedVisit() {
+        DirectedAcyclicGraph<String> graph = new ThreadSafeDirectedAcyclicGraph<String>();
+
+        TestDirectedAcyclicGraphVisitor visitor = new TestDirectedAcyclicGraphVisitor();
+        GraphNode<String> t = graph.createRootNode("-");
+        t.visit(visitor);
+        List<String> visited = visitor.getVisited();
+
+        assertEquals(1, visited.size());
+        assertEquals("-", visited.get(0));
+    }
+
+    @Test
+    public void testPartiallySkippedVisit() {
+        DirectedAcyclicGraph<String> graph = new ThreadSafeDirectedAcyclicGraph<String>();
+        GraphNode<String> top = buildTestGraphAndReturnRootNode(graph);
+
+        TestDirectedAcyclicGraphVisitor visitor = new TestDirectedAcyclicGraphVisitor();
+        top.addChild(graph.createRootNode("-"));
+        GraphNode<String> t = top.getChildren().get(1);
+        t.addChild(graph.createRootNode("foo"));
+        t.addChild(graph.createRootNode("bar"));
+        assertEquals(12, top.size());
+
+        top.visit(visitor);
+
+        assertEquals(10, visitor.getVisited().size());
+    }
+
+    @Test
+    public void testNormalExceptionVisit() throws Exception {
+        DirectedAcyclicGraph<String> graph = new ThreadSafeDirectedAcyclicGraph<String>();
+        GraphNode<String> top = buildTestGraphAndReturnRootNode(graph);
+
+        TestExceptionThrowingDirectedAcyclicGraphVisitor visitor = new TestExceptionThrowingDirectedAcyclicGraphVisitor();
+        top.visit(visitor);
+
+        assertEquals(EXPECTED_VISITS, visitor.getVisited());
+    }
+
+    @Test
+    public void testSkippedExceptionVisit() throws Exception {
+        DirectedAcyclicGraph<String> graph = new ThreadSafeDirectedAcyclicGraph<String>();
+
+        TestExceptionThrowingDirectedAcyclicGraphVisitor visitor = new TestExceptionThrowingDirectedAcyclicGraphVisitor();
+        GraphNode<String> t = graph.createRootNode("-");
+        t.visit(visitor);
+
+        List<String> visited = visitor.getVisited();
+        assertEquals(1, visited.size());
+        assertEquals("-", visited.get(0));
+    }
+
+    @Test
+    public void testPartiallySkippedDueToStopExceptionVisit() throws Exception {
+        DirectedAcyclicGraph<String> graph = new ThreadSafeDirectedAcyclicGraph<String>();
+        GraphNode<String> top = buildTestGraphAndReturnRootNode(graph);
+
+        TestExceptionThrowingDirectedAcyclicGraphVisitor visitor = new TestExceptionThrowingDirectedAcyclicGraphVisitor();
+        top.addChild(graph.createRootNode("-"));
+        GraphNode<String> t = top.getChildren().get(1);
+        t.addChild(graph.createRootNode("foo"));
+        t.addChild(graph.createRootNode("bar"));
+        assertEquals(12, top.size());
+
+        top.visit(visitor);
+
+        assertEquals(10, visitor.getVisited().size());
+    }
+
+    @Test(expected = Exception.class)
+    public void testPartiallySkippedDueToExceptionExceptionVisit() throws Exception {
+        DirectedAcyclicGraph<String> graph = new ThreadSafeDirectedAcyclicGraph<String>();
+        GraphNode<String> top = buildTestGraphAndReturnRootNode(graph);
+
+        TestExceptionThrowingDirectedAcyclicGraphVisitor visitor = new TestExceptionThrowingDirectedAcyclicGraphVisitor();
+        top.addChild(graph.createRootNode("*"));
+        GraphNode<String> t = top.getChildren().get(1);
+        t.addChild(graph.createRootNode("foo"));
+        t.addChild(graph.createRootNode("bar"));
+
+        assertEquals(12, top.size());
+        try {
+            top.visit(visitor);
+        } finally {
+            assertEquals(10, visitor.getVisited().size());
+        }
+    }
+
+    private static class TestDirectedAcyclicGraphVisitor implements DirectedAcyclicGraphVisitor<String> {
+
+        private final List<String> visited = new ArrayList<String>();
+
+        @Override
+        public boolean visit(GraphNode<String> dag) {
+            String value = dag.getValue();
+            this.visited.add(value);
+            return !value.startsWith("-");
+        }
+
+        public List<String> getVisited() {
+            return this.visited;
+        }
+    }
+
+    private static class TestExceptionThrowingDirectedAcyclicGraphVisitor implements ExceptionThrowingDirectedAcyclicGraphVisitor<String, Exception> {
+
+        private final List<String> visited = new ArrayList<String>();
+
+        @Override
+        public boolean visit(GraphNode<String> dag) throws Exception {
+            String value = dag.getValue();
+            this.visited.add(value);
+            if (value.startsWith("*")) {
+                throw new Exception();
+            }
+            return !value.startsWith("-");
+        }
+
+        public List<String> getVisited() {
+            return this.visited;
+        }
+    }
+
+    protected static class NoopGraphNode implements GraphNode<String> {
+
+        @Override
+        public void visit(DirectedAcyclicGraphVisitor<String> visitor) {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public <E extends Exception> void visit(ExceptionThrowingDirectedAcyclicGraphVisitor<String, E> visitor) throws E {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public void addChild(GraphNode<String> child) {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public int size() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public boolean removeChild(GraphNode<String> child) {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public List<GraphNode<String>> getChildren() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public List<GraphNode<String>> getParents() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public String getValue() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public boolean isRootNode() {
+            throw new UnsupportedOperationException();
+        }
+
+    }
+
+}
diff --git a/util/org.eclipse.virgo.util.common/template.mf b/util/org.eclipse.virgo.util.common/template.mf
new file mode 100644
index 0000000..69e66da
--- /dev/null
+++ b/util/org.eclipse.virgo.util.common/template.mf
@@ -0,0 +1,4 @@
+Bundle-ManifestVersion: 2
+Bundle-Name: Common Utility Code
+Bundle-SymbolicName: org.eclipse.virgo.util.common
+Bundle-Version: ${version}
diff --git a/util/org.eclipse.virgo.util.env/.springBeans b/util/org.eclipse.virgo.util.env/.springBeans
new file mode 100644
index 0000000..d079ca1
--- /dev/null
+++ b/util/org.eclipse.virgo.util.env/.springBeans
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beansProjectDescription>
+	<version>1</version>
+	<pluginVersion><![CDATA[2.2.4.RELEASE]]></pluginVersion>
+	<configSuffixes>
+		<configSuffix><![CDATA[xml]]></configSuffix>
+	</configSuffixes>
+	<enableImports><![CDATA[false]]></enableImports>
+	<configs>
+	</configs>
+	<configSets>
+	</configSets>
+</beansProjectDescription>
diff --git a/util/org.eclipse.virgo.util.env/src/main/java/org/eclipse/virgo/util/env/JavaVersionChecker.java b/util/org.eclipse.virgo.util.env/src/main/java/org/eclipse/virgo/util/env/JavaVersionChecker.java
new file mode 100644
index 0000000..15d9ecc
--- /dev/null
+++ b/util/org.eclipse.virgo.util.env/src/main/java/org/eclipse/virgo/util/env/JavaVersionChecker.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.env;
+
+/**
+ * JavaVersionChecker is specifically designed to check for the version of Java being used for Virgo.
+ * It is run as part of the startup protocol before the server is launched.
+ * <p />
+ * If the Java version is correct this call is silent, and returns zero <code>System.exit(0)</code>.<br/>
+ * If the version is not set or incorrect, a single line is output (in English) and this process returns -1 <code>System.exit(-1)</code>
+ * <p/>
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ * Main thread run synchronously.
+ *
+ * @see "http://www.oracle.com/technetwork/java/javase/versioning-naming-139433.html"
+ */
+public class JavaVersionChecker {
+
+    /**
+     * No parameters are expected; this version check is specific for Virgo.
+     * @param args non expected
+     */
+    public static void main(String[] args) {
+        String javaVersion = System.getProperty("java.version");
+        if (javaVersion==null) {
+            System.out.println("JavaVersionChecker: no java.version property found.");
+            System.exit(-1);
+        } 
+
+        if (!javaVersion.startsWith("1.6.") && !javaVersion.startsWith("1.7.") && !javaVersion.startsWith("1.8.")) {
+            System.out.println("JavaVersionChecker: Java version must be at 1.6+ (detected version "+javaVersion+").");
+            System.exit(-1);
+        }
+        System.exit(0);
+    }
+}
diff --git a/util/org.eclipse.virgo.util.env/src/main/java/org/eclipse/virgo/util/env/JvmVendor.java b/util/org.eclipse.virgo.util.env/src/main/java/org/eclipse/virgo/util/env/JvmVendor.java
new file mode 100644
index 0000000..2c61de7
--- /dev/null
+++ b/util/org.eclipse.virgo.util.env/src/main/java/org/eclipse/virgo/util/env/JvmVendor.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.env;
+
+/**
+ * Identifies the vendor of a JVM implementation. The vendor of the currently running JVM can be accessed from
+ * {@link #current()}. When no vendor can be determined, the vendor is identified as {@link #UNKNOWN}. <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.
+ * 
+ */
+public enum JvmVendor {
+    /**
+     * Sun Microsystems.
+     */
+    SUN("Sun"),
+
+    /**
+     * Apple.
+     */
+    APPLE("Apple"),
+
+    /**
+     * IBM.
+     */
+    IBM("IBM"),
+
+    /**
+     * BEA Systems.
+     */
+    BEA("BEA"),
+
+    /**
+     * Unknown.
+     */
+    UNKNOWN("unknown");
+
+    private static final JvmVendor current;
+
+    private final String identifer;
+
+    static {
+        String vmVendor = System.getProperty("java.vm.vendor");
+        JvmVendor foundVendor = null;
+        for (JvmVendor vendor : values()) {
+            if (vmVendor.contains(vendor.identifer)) {
+                foundVendor = vendor;
+                break;
+            }
+        }
+        current = foundVendor == null ? UNKNOWN : foundVendor;
+    }
+
+    private JvmVendor(String identifer) {
+        this.identifer = identifer;
+    }
+
+    /**
+     * Gets the identifier for the vendor of the currently running JVM.
+     * 
+     * @return the identifier for the JVM vendor.
+     */
+    public static JvmVendor current() {
+        return current;
+    }
+
+    /**
+     * Indicates whether this <code>JvmVendor</code> is one of the supplied list of vendors.
+     * 
+     * @param jvmVendors the vendors to check against.
+     * @return <code>true</code> if this <code>JvmVendor</code> is in the supplied list, otherwise
+     *         <code>false</code>.
+     */
+    public boolean isOneOf(JvmVendor... jvmVendors) {
+        for (JvmVendor jvmVendor : jvmVendors) {
+            if (this.equals(jvmVendor)) {
+                return true;
+            }
+        }
+        return false;
+    }
+}
diff --git a/util/org.eclipse.virgo.util.env/src/main/resources/about.html b/util/org.eclipse.virgo.util.env/src/main/resources/about.html
new file mode 100644
index 0000000..c258ef5
--- /dev/null
+++ b/util/org.eclipse.virgo.util.env/src/main/resources/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>June 5, 2006</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/util/org.eclipse.virgo.util.env/src/test/java/org/eclipse/virgo/util/env/JvmVendorTests.java b/util/org.eclipse.virgo.util.env/src/test/java/org/eclipse/virgo/util/env/JvmVendorTests.java
new file mode 100644
index 0000000..84c408c
--- /dev/null
+++ b/util/org.eclipse.virgo.util.env/src/test/java/org/eclipse/virgo/util/env/JvmVendorTests.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.env;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.eclipse.virgo.util.env.JvmVendor;
+import org.junit.Test;
+
+/**
+ */
+public class JvmVendorTests {
+
+    @Test public void current() {
+        String vendor = System.getProperty("java.vm.vendor");
+        if (vendor.contains("Apple")) {
+            assertEquals(JvmVendor.APPLE, JvmVendor.current());
+        } else if (vendor.contains("Sun")) {
+            assertEquals(JvmVendor.SUN, JvmVendor.current());
+        }
+    }
+
+    @Test public void isOneOf() {
+        assertTrue(JvmVendor.APPLE.isOneOf(JvmVendor.SUN, JvmVendor.APPLE));
+        assertFalse(JvmVendor.APPLE.isOneOf(JvmVendor.SUN, JvmVendor.IBM));
+    }
+}
diff --git a/util/org.eclipse.virgo.util.env/template.mf b/util/org.eclipse.virgo.util.env/template.mf
new file mode 100644
index 0000000..4a9ffe3
--- /dev/null
+++ b/util/org.eclipse.virgo.util.env/template.mf
@@ -0,0 +1,4 @@
+Bundle-ManifestVersion: 2
+Bundle-Name: Environment Utility Code
+Bundle-SymbolicName: org.eclipse.virgo.util.env
+Bundle-Version: ${version}
diff --git a/util/org.eclipse.virgo.util.integrationtest/build.gradle b/util/org.eclipse.virgo.util.integrationtest/build.gradle
new file mode 100644
index 0000000..1b1864d
--- /dev/null
+++ b/util/org.eclipse.virgo.util.integrationtest/build.gradle
@@ -0,0 +1,10 @@
+dependencies {
+    testRuntime project(':util:org.eclipse.virgo.util.common')
+    testRuntime project(':util:org.eclipse.virgo.util.env')
+    testRuntime project(':util:org.eclipse.virgo.util.io')
+    testRuntime project(':util:org.eclipse.virgo.util.jmx')
+    testRuntime project(':util:org.eclipse.virgo.util.math')
+    testRuntime project(':util:org.eclipse.virgo.util.osgi')
+    testRuntime project(':util:org.eclipse.virgo.util.osgi.manifest')
+    testRuntime project(':util:org.eclipse.virgo.util.parser.manifest')
+}
diff --git a/util/org.eclipse.virgo.util.integrationtest/src/test/java/org/eclipse/virgo/util/test/UtilBundlesResolutionPaxExamTests.java b/util/org.eclipse.virgo.util.integrationtest/src/test/java/org/eclipse/virgo/util/test/UtilBundlesResolutionPaxExamTests.java
new file mode 100644
index 0000000..cd5945f
--- /dev/null
+++ b/util/org.eclipse.virgo.util.integrationtest/src/test/java/org/eclipse/virgo/util/test/UtilBundlesResolutionPaxExamTests.java
@@ -0,0 +1,128 @@
+/*
+ * This file is part of the Eclipse Virgo project.
+ *
+ * Copyright (c) 2014 EclipseSource
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    EclipseSource - initial contribution
+ */
+
+package org.eclipse.virgo.util.test;
+
+import static org.junit.Assert.assertEquals;
+import static org.ops4j.pax.exam.CoreOptions.bundle;
+import static org.ops4j.pax.exam.CoreOptions.junitBundles;
+import static org.ops4j.pax.exam.CoreOptions.options;
+
+import java.io.File;
+import java.io.FilenameFilter;
+import java.util.Dictionary;
+import java.util.Enumeration;
+
+import javax.inject.Inject;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.ops4j.pax.exam.Configuration;
+import org.ops4j.pax.exam.Option;
+import org.ops4j.pax.exam.junit.PaxExam;
+import org.ops4j.pax.exam.options.CompositeOption;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+
+@RunWith(PaxExam.class)
+public class UtilBundlesResolutionPaxExamTests {
+
+    private static final String BASE_PACKAGE = "org.eclipse.virgo";
+
+    @Inject
+    private BundleContext bundleContext;
+
+    private static String[] OSGI_BUNDLES = new String[] { //
+        "org.eclipse.virgo.util.common", //
+        "org.eclipse.virgo.util.env", //
+        "org.eclipse.virgo.util.io", //
+        "org.eclipse.virgo.util.jmx", //
+        "org.eclipse.virgo.util.math", //
+        "org.eclipse.virgo.util.osgi", //
+        "org.eclipse.virgo.util.osgi.manifest", //
+        "org.eclipse.virgo.util.parser.manifest", //
+    };
+
+    @Configuration
+    public static Option[] configuration() throws Exception {
+        final String absolutePath = new File(".").getAbsolutePath();
+        CompositeOption utilBundles = new CompositeOption() {
+
+            @Override
+            public Option[] getOptions() {
+                Option[] result = new Option[OSGI_BUNDLES.length];
+                for (int i = 0; i < OSGI_BUNDLES.length; i++) {
+                    String url = buildBundleUrl(absolutePath, i);
+                    System.out.println("Adding bundle '" + url + "'.");
+                    result[i] = bundle(url);
+                }
+                return result;
+            }
+
+            private String buildBundleUrl(final String absolutePath, int i) {
+                String url = absolutePath + "/../" + OSGI_BUNDLES[i] + "/build/libs/";
+                File libsDirectory = new File(url);
+                FilenameFilter filter = new FilenameFilter() {
+
+                    @Override
+                    public boolean accept(File dir, String name) {
+                        return name.endsWith(".jar") && !name.contains("-sources");
+                    }
+                };
+                String[] list = libsDirectory.list(filter);
+                if (list == null || list.length != 1) {
+                    Assert.fail("Required build artefact in '" + libsDirectory + "'missing.");
+                }
+                String result = "file://" + libsDirectory + File.separator + list[0];
+                return result;
+            }
+        };
+        return options( //
+            bundle("mvn:org.slf4j/slf4j-api/1.7.22"), // CQ 12462
+            bundle("mvn:org.slf4j/slf4j-nop/1.7.22").noStart(), // CQ 12540
+            bundle("wrap:mvn:org.aspectj/aspectjrt/1.8.10$Export-Package=org.aspectj.*;version=1.8.10"), //
+            utilBundles, //
+            junitBundles() //
+        );
+    }
+
+    @Test
+    public void shouldActivateAllOsgiBundles() throws Exception {
+        int found = 0;
+        Bundle[] bundles = this.bundleContext.getBundles();
+        for (Bundle bundle : bundles) {
+            String symbolicName = bundle.getSymbolicName();
+            System.out.println("Testing bundle state for '" + symbolicName + "'..." + bundle.getState());
+            if (symbolicName.contains(BASE_PACKAGE) && bundle.getState() != Bundle.ACTIVE) {
+                System.out.println("Non *ACTIVE* bundle found: '" + bundle + "'");
+                Dictionary<String, String> headers = bundle.getHeaders();
+                Enumeration<String> elements = headers.keys();
+                while (elements.hasMoreElements()) {
+                    String key = elements.nextElement();
+                    System.out.println(key + ": " + headers.get(key));
+                }
+                if (bundle.getHeaders().get("Fragment-Host") == null) {
+                    System.out.println("Starting *inactive* bundle to make problem visible...");
+                    // do not try to start fragment bundles
+                    bundle.start();
+                }
+            }
+            if (symbolicName.contains(BASE_PACKAGE)) {
+                found++;
+                assertEquals(symbolicName + " is not ACTIVE", Bundle.ACTIVE, bundle.getState());
+            }
+        }
+        assertEquals("Unexpected number of ACTIVE bundles found", OSGI_BUNDLES.length, found);
+    }
+}
diff --git a/util/org.eclipse.virgo.util.io/.springBeans b/util/org.eclipse.virgo.util.io/.springBeans
new file mode 100644
index 0000000..d079ca1
--- /dev/null
+++ b/util/org.eclipse.virgo.util.io/.springBeans
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beansProjectDescription>
+	<version>1</version>
+	<pluginVersion><![CDATA[2.2.4.RELEASE]]></pluginVersion>
+	<configSuffixes>
+		<configSuffix><![CDATA[xml]]></configSuffix>
+	</configSuffixes>
+	<enableImports><![CDATA[false]]></enableImports>
+	<configs>
+	</configs>
+	<configSets>
+	</configSets>
+</beansProjectDescription>
diff --git a/util/org.eclipse.virgo.util.io/findbugs-exclude.xml b/util/org.eclipse.virgo.util.io/findbugs-exclude.xml
new file mode 100644
index 0000000..c3edd3e
--- /dev/null
+++ b/util/org.eclipse.virgo.util.io/findbugs-exclude.xml
@@ -0,0 +1,11 @@
+<FindBugsFilter>
+     <!-- Exclusions -->
+     <Match>
+       	<Bug pattern="AM_CREATES_EMPTY_ZIP_FILE_ENTRY"/>
+	    <Class name="org.eclipse.virgo.util.io.ZipUtils" />
+     </Match>
+     <Match>
+        <Bug pattern="AM_CREATES_EMPTY_JAR_FILE_ENTRY"/>
+	    <Class name="org.eclipse.virgo.util.io.JarTransformer" />
+	 </Match>	
+</FindBugsFilter>
diff --git a/util/org.eclipse.virgo.util.io/src/main/java/org/eclipse/virgo/util/io/FatalIOException.java b/util/org.eclipse.virgo.util.io/src/main/java/org/eclipse/virgo/util/io/FatalIOException.java
new file mode 100644
index 0000000..903a8a9
--- /dev/null
+++ b/util/org.eclipse.virgo.util.io/src/main/java/org/eclipse/virgo/util/io/FatalIOException.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.io;
+
+/**
+ * Fatal IO exception.<p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br/>
+ * 
+ * Threadsafe.
+ */
+public class FatalIOException extends RuntimeException {
+
+	private static final long serialVersionUID = -8422082772007429417L;
+
+	/**
+	 * Creates a new <code>FatalIOException</code> with the supplied reason
+	 * message and cause.
+	 * 
+	 * @param message
+	 *            The reason message
+	 * @param cause
+	 *            The cause
+	 */
+	public FatalIOException(String message, Throwable cause) {
+		super(message, cause);
+	}
+
+	/**
+	 * Creates a new <code>FatalIOException</code> with the supplied reason
+	 * message.
+	 * 
+	 * @param message
+	 *            The reason message
+	 */
+	public FatalIOException(String message) {
+		super(message);
+	}
+}
diff --git a/util/org.eclipse.virgo.util.io/src/main/java/org/eclipse/virgo/util/io/FileCopyUtils.java b/util/org.eclipse.virgo.util.io/src/main/java/org/eclipse/virgo/util/io/FileCopyUtils.java
new file mode 100644
index 0000000..cebf615
--- /dev/null
+++ b/util/org.eclipse.virgo.util.io/src/main/java/org/eclipse/virgo/util/io/FileCopyUtils.java
@@ -0,0 +1,240 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.io;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.Reader;
+import java.io.StringWriter;
+import java.io.Writer;
+
+import org.eclipse.virgo.util.common.Assert;
+
+
+/**
+ * Simple utility methods for file and stream copying.
+ * All copy methods use a block size of 4096 bytes,
+ * and close all affected streams when done.
+ *
+ * <p>Mainly for use within the framework,
+ * but also useful for application code.
+ *
+ */
+public abstract class FileCopyUtils {
+
+	public static final int BUFFER_SIZE = 4096;
+
+
+	//---------------------------------------------------------------------
+	// Copy methods for java.io.File
+	//---------------------------------------------------------------------
+
+	/**
+	 * Copy the contents of the given input File to the given output File.
+	 * @param in the file to copy from
+	 * @param out the file to copy to
+	 * @return the number of bytes copied
+	 * @throws IOException in case of I/O errors
+	 */
+	public static int copy(File in, File out) throws IOException {
+		Assert.notNull(in, "No input File specified");
+		Assert.notNull(out, "No output File specified");
+		return copy(new BufferedInputStream(new FileInputStream(in)),
+		    new BufferedOutputStream(new FileOutputStream(out)));
+	}
+
+	/**
+	 * Copy the contents of the given byte array to the given output File.
+	 * @param in the byte array to copy from
+	 * @param out the file to copy to
+	 * @throws IOException in case of I/O errors
+	 */
+	public static void copy(byte[] in, File out) throws IOException {
+		Assert.notNull(in, "No input byte array specified");
+		Assert.notNull(out, "No output File specified");
+		ByteArrayInputStream inStream = new ByteArrayInputStream(in);
+		OutputStream outStream = new BufferedOutputStream(new FileOutputStream(out));
+		copy(inStream, outStream);
+	}
+
+	/**
+	 * Copy the contents of the given input File into a new byte array.
+	 * @param in the file to copy from
+	 * @return the new byte array that has been copied to
+	 * @throws IOException in case of I/O errors
+	 */
+	public static byte[] copyToByteArray(File in) throws IOException {
+		Assert.notNull(in, "No input File specified");
+		return copyToByteArray(new BufferedInputStream(new FileInputStream(in)));
+	}
+
+
+	//---------------------------------------------------------------------
+	// Copy methods for java.io.InputStream / java.io.OutputStream
+	//---------------------------------------------------------------------
+
+	/**
+	 * Copy the contents of the given InputStream to the given OutputStream.
+	 * Closes both streams when done.
+	 * @param in the stream to copy from
+	 * @param out the stream to copy to
+	 * @return the number of bytes copied
+	 * @throws IOException in case of I/O errors
+	 */
+	public static int copy(InputStream in, OutputStream out) throws IOException {
+		Assert.notNull(in, "No InputStream specified");
+		Assert.notNull(out, "No OutputStream specified");
+		try {
+			int byteCount = 0;
+			byte[] buffer = new byte[BUFFER_SIZE];
+			int bytesRead = -1;
+			while ((bytesRead = in.read(buffer)) != -1) {
+				out.write(buffer, 0, bytesRead);
+				byteCount += bytesRead;
+			}
+			out.flush();
+			return byteCount;
+		}
+		finally {
+			try {
+				in.close();
+			}
+			catch (IOException ex) {
+			}
+			try {
+				out.close();
+			}
+			catch (IOException ex) {
+			}
+		}
+	}
+
+	/**
+	 * Copy the contents of the given byte array to the given OutputStream.
+	 * Closes the stream when done.
+	 * @param in the byte array to copy from
+	 * @param out the OutputStream to copy to
+	 * @throws IOException in case of I/O errors
+	 */
+	public static void copy(byte[] in, OutputStream out) throws IOException {
+		Assert.notNull(in, "No input byte array specified");
+		Assert.notNull(out, "No OutputStream specified");
+		try {
+			out.write(in);
+		}
+		finally {
+			try {
+				out.close();
+			}
+			catch (IOException ex) {
+			}
+		}
+	}
+
+	/**
+	 * Copy the contents of the given InputStream into a new byte array.
+	 * Closes the stream when done.
+	 * @param in the stream to copy from
+	 * @return the new byte array that has been copied to
+	 * @throws IOException in case of I/O errors
+	 */
+	public static byte[] copyToByteArray(InputStream in) throws IOException {
+		ByteArrayOutputStream out = new ByteArrayOutputStream(BUFFER_SIZE);
+		copy(in, out);
+		return out.toByteArray();
+	}
+
+
+	//---------------------------------------------------------------------
+	// Copy methods for java.io.Reader / java.io.Writer
+	//---------------------------------------------------------------------
+
+	/**
+	 * Copy the contents of the given Reader to the given Writer.
+	 * Closes both when done.
+	 * @param in the Reader to copy from
+	 * @param out the Writer to copy to
+	 * @return the number of characters copied
+	 * @throws IOException in case of I/O errors
+	 */
+	public static int copy(Reader in, Writer out) throws IOException {
+		Assert.notNull(in, "No Reader specified");
+		Assert.notNull(out, "No Writer specified");
+		try {
+			int byteCount = 0;
+			char[] buffer = new char[BUFFER_SIZE];
+			int bytesRead = -1;
+			while ((bytesRead = in.read(buffer)) != -1) {
+				out.write(buffer, 0, bytesRead);
+				byteCount += bytesRead;
+			}
+			out.flush();
+			return byteCount;
+		}
+		finally {
+			try {
+				in.close();
+			}
+			catch (IOException ex) {
+			}
+			try {
+				out.close();
+			}
+			catch (IOException ex) {
+			}
+		}
+	}
+
+	/**
+	 * Copy the contents of the given String to the given output Writer.
+	 * Closes the write when done.
+	 * @param in the String to copy from
+	 * @param out the Writer to copy to
+	 * @throws IOException in case of I/O errors
+	 */
+	public static void copy(String in, Writer out) throws IOException {
+		Assert.notNull(in, "No input String specified");
+		Assert.notNull(out, "No Writer specified");
+		try {
+			out.write(in);
+		}
+		finally {
+			try {
+				out.close();
+			}
+			catch (IOException ex) {
+			}
+		}
+	}
+
+	/**
+	 * Copy the contents of the given Reader into a String.
+	 * Closes the reader when done.
+	 * @param in the reader to copy from
+	 * @return the String that has been copied to
+	 * @throws IOException in case of I/O errors
+	 */
+	public static String copyToString(Reader in) throws IOException {
+		StringWriter out = new StringWriter();
+		copy(in, out);
+		return out.toString();
+	}
+
+}
diff --git a/util/org.eclipse.virgo.util.io/src/main/java/org/eclipse/virgo/util/io/FileSystemChecker.java b/util/org.eclipse.virgo.util.io/src/main/java/org/eclipse/virgo/util/io/FileSystemChecker.java
new file mode 100644
index 0000000..2b7353a
--- /dev/null
+++ b/util/org.eclipse.virgo.util.io/src/main/java/org/eclipse/virgo/util/io/FileSystemChecker.java
@@ -0,0 +1,504 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.io;
+
+import java.io.File;
+import java.io.FilenameFilter;
+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.Set;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.regex.Pattern;
+
+import org.eclipse.virgo.util.common.Assert;
+import org.eclipse.virgo.util.math.Sets;
+import org.slf4j.Logger;
+
+/**
+ * Checks a directory on the file system for modifications. Maintains a known state of the files to determine if the
+ * changes are new files, modified files or deleted files.
+ * <p/>
+ * 
+ * Modification notifications ({@link FileSystemEvent}s) are published to a set of configured {@link FileSystemListener
+ * FileSystemListeners}. New listeners can be safely added at runtime.
+ * <p/>
+ * 
+ * By default, all files in the directory are monitored. Files can be excluded from monitoring using a regex pattern.
+ * <p/>
+ * <strong>Concurrent Semantics</strong><br/>
+ * Thread-safe.
+ * 
+ */
+public final class FileSystemChecker {
+
+    private final File checkDir;
+
+    private final Logger logger;
+
+    private final Object checkLock = new Object();
+
+    /**
+     * Enables bulk handling of all initially observed file system objects (so that they are handled altogether at once
+     * and not one by one)
+     */
+    private static final String INITIAL_EVENT_HANDLING_MODE = "org.eclipse.virgo.fschecker.initialEventMode";
+
+    private static final String BULK_MODE_VALUE = "bulk";
+
+    private final AtomicBoolean isInitialEventsHandlingInitiatedOnce = new AtomicBoolean(false);
+
+    /**
+     * The files we know about -- with their last modified date (as a Long) are in <code>fileState</code>.<br/>
+     * Files that are changing or are new are monitored in <code>monitorRecords</code>.
+     * <p/>
+     * <strong>Invariant:</strong> all monitored files are in <code>fileState</code>.<br/>
+     * As soon as a file is notified (to listeners) it is no longer monitored. Thus files in <code>fileState</code> and
+     * not monitored can be assumed to have been notified about already.
+     */
+    private final Map<String, Long> fileState = new HashMap<String, Long>(32);
+
+    private final Map<String, MonitorRecord> monitorRecords = new HashMap<String, MonitorRecord>(16);
+
+    private final List<FileSystemListener> listeners = new CopyOnWriteArrayList<FileSystemListener>();
+
+    private final FilenameFilter includeFilter;
+
+    private static boolean WINDOWS = System.getProperty("os.name").startsWith("Windows");
+
+    /**
+     * Creates a new <code>FileSystemChecker</code>. Identifies changes on all files in <code>checkDir</code>.
+     * 
+     * @param checkDir the directory to check.
+     */
+    public FileSystemChecker(File checkDir) {
+        this(checkDir, null, null);
+    }
+
+    /**
+     * Creates a new <code>FileSystemChecker</code>. Identifies changes on all files in <code>checkDir</code>, except
+     * those that match <code>excludePattern</code>. No diagnostics logging.
+     * 
+     * @param checkDir the directory to check.
+     * @param excludePattern regular expression for files to exclude.
+     */
+    public FileSystemChecker(File checkDir, String excludePattern) {
+        this(checkDir, excludePattern, null);
+    }
+
+    /**
+     * Creates a new <code>FileSystemChecker</code>. Identifies changes on all files in <code>checkDir</code>.
+     * Diagnostics to logger.
+     * 
+     * @param checkDir the directory to check.
+     * @param logger where to log diagnostics -- can be null
+     */
+    public FileSystemChecker(File checkDir, Logger logger) {
+        this(checkDir, null, logger);
+    }
+
+    /**
+     * Creates a new <code>FileSystemChecker</code>. Identifies changes to on all files, except those that match
+     * <code>excludePattern</code>.
+     * 
+     * @param checkDir the directory to check -- {@link File} must exist and be a directory
+     * @param excludePattern regular expression for files to exclude.
+     * @param logger where to log diagnostics -- can be null
+     */
+    public FileSystemChecker(File checkDir, String excludePattern, Logger logger) {
+        Assert.isTrue(checkDir.isDirectory(), "Check directory '%s' must exist and must be a directory.", checkDir.getAbsolutePath());
+        this.checkDir = checkDir;
+        this.logger = logger;
+
+        final Pattern compiledExcludePattern = excludePattern == null ? null : Pattern.compile(excludePattern);
+
+        this.includeFilter = new FilenameFilter() {
+
+            @Override
+            public boolean accept(File dir, String name) {
+                return compiledExcludePattern == null || !compiledExcludePattern.matcher(name).matches();
+            }
+        };
+
+        populateInitialState(); // no notifications made yet
+    }
+
+    /**
+     * Add a new {@link FileSystemListener} to this <code>FileSystemChecker</code>.
+     * 
+     * @param listener the listener to add.
+     */
+    public void addListener(FileSystemListener listener) {
+        this.listeners.add(listener);
+    }
+
+    /**
+     * Returns a list of all the files that are recorded as INITIAL events.
+     * 
+     * @param files - the array of files that is checked
+     */
+    private List<File> getInitialFiles(File[] files) {
+        List<File> resultFiles = new ArrayList<File>();
+        for (File file : files) {
+            String keyFilePath = this.key(file);
+            if (this.monitorRecords.containsKey(keyFilePath)) {
+                MonitorRecord monitorRecord = this.monitorRecords.get(keyFilePath);
+                if (FileSystemEvent.INITIAL.equals(monitorRecord.getEvent())) {
+                    resultFiles.add(file);
+                }
+            }
+        }
+        return resultFiles;
+    }
+
+    /**
+     * Bulk handling of initial files (not one by one).
+     * 
+     * @param initialFiles
+     */
+    private void handleInitialFiles(List<File> initialFiles) {
+    	Map<File, Long> initialLastModified = new HashMap<File, Long>();
+    	for (File file : initialFiles) {
+    		initialLastModified.put(file, Long.valueOf(file.lastModified()));
+    	}
+        notifyListenersOnInitialEvent(initialFiles);
+        for (File file : initialFiles) {
+            this.monitorRecords.remove(this.key(file));
+            setKnownFileState(file, initialLastModified.get(file));
+        }
+    }
+
+    /**
+     * Returns the absolute file paths of the given files
+     * 
+     * @param files
+     * @return
+     */
+    private List<String> getPaths(List<File> files) {
+        List<String> filePaths = new ArrayList<String>();
+        for (File file : files) {
+            filePaths.add(this.key(file));
+        }
+        return filePaths;
+    }
+
+    /**
+     * Notify once all registered listeners for the INITIAL event
+     * 
+     * @param initialFiles
+     */
+    private void notifyListenersOnInitialEvent(List<File> initialFiles) {	
+        List<String> initialFilesPaths = getPaths(initialFiles);
+        for (FileSystemListener listener : this.listeners) {
+            try {
+                listener.onInitialEvent(initialFilesPaths);
+            } catch (Throwable e) {
+                if (this.logger != null) {
+                    this.logger.warn("Listener threw exception for event " + FileSystemEvent.INITIAL, e);
+                }
+            }
+        }
+    }
+
+    /**
+     * Removes a given list of files from a given array.
+     * 
+     * @param inputArray
+     * @param filesToRemove
+     * @return
+     */
+    private File[] removeFilesFromArray(File[] inputArray, List<File> filesToRemove) {
+        List<File> reducedFiles = new ArrayList<File>(Arrays.asList(inputArray));
+        reducedFiles.removeAll(filesToRemove);
+        return reducedFiles.toArray(new File[reducedFiles.size()]);
+    }
+
+    private void addToCurrentFileKeys(Set<String> currentFileKeys, List<File> files) {
+        for (File file : files) {
+            currentFileKeys.add(this.key(file));
+        }
+    }
+
+    /**
+     * Instructs this <code>FileSystemChecker</code> to check the configured directory and notifies any registered
+     * listeners of changes to the directory files.
+     */
+    public void check() {
+        synchronized (this.checkLock) {
+            try {
+                File[] currentFiles;
+                try {
+                    currentFiles = listCurrentDirFiles();
+                } catch (Exception e) {
+                    if (this.logger != null) {
+                        this.logger.warn("FileSystemChecker caught exception from listFiles()", e);
+                    }
+                    throw e;
+                }
+
+                debugState("before check:", currentFiles);
+
+                Set<String> currentFileKeys = new HashSet<String>(currentFiles.length);
+
+                if (isInitialEventsBulkHandlingEnabled()) {
+                    // optimize handling of initial events - do it only once
+                    if (this.isInitialEventsHandlingInitiatedOnce.compareAndSet(false, true)) {
+                        List<File> initialFiles = getInitialFiles(currentFiles);
+                        if (!initialFiles.isEmpty()) {
+                            handleInitialFiles(initialFiles);
+                            addToCurrentFileKeys(currentFileKeys, initialFiles);
+                            // skip further processing of initialFiles in the current check
+                            currentFiles = removeFilesFromArray(currentFiles, initialFiles);
+                        }
+                    }
+                }
+
+                for (File file : currentFiles) {
+                    // remember seen files to allow comparison for delete
+                    String keyFile = this.key(file);
+                    currentFileKeys.add(keyFile);
+                    if (!isKnown(file)) {
+                        // not seen it before -- start monitoring it -- a potential newly created file
+                        this.monitorRecords.put(keyFile, new MonitorRecord(file.length(), FileSystemEvent.CREATED));
+                        setKnownFileState(file);
+                    } else if (this.monitorRecords.containsKey(keyFile)) {
+                        // we are monitoring this file
+                        MonitorRecord monitorRecord = this.monitorRecords.get(keyFile);
+                        long size = file.length();
+                        // save file timestamp before notifying listeners, because otherwise it is possible during 
+                        // the notification the file to be updated and the newer timestamp to be saved - bug 396422
+                        long lastModified = file.lastModified();
+                        if (size > monitorRecord.getSize()) {
+                            // still being written? continue to track it
+                            monitorRecord.setSize(size);
+                        } else if (isUnlocked(file)) {
+                            // not changing anymore so if we can rename it we can announce it:
+                            notifyListeners(this.key(file), monitorRecord.getEvent());
+                            // do not monitor it anymore
+                            this.monitorRecords.remove(keyFile);
+                        }
+                        setKnownFileState(file, lastModified);
+                    } else if (file.lastModified() > knownLastModified(file)) {
+                        // we know about this file, we are not monitoring it, but it has changed
+                        // start monitoring it until it stabilises
+                        this.monitorRecords.put(keyFile, new MonitorRecord(file.length(), FileSystemEvent.MODIFIED));
+                        setKnownFileState(file);
+                    }
+                }
+
+                Set<String> deletedFiles = Sets.difference(this.fileState.keySet(), currentFileKeys);
+                for (String deletedFile : deletedFiles) {
+                    if (this.monitorRecords.containsKey(deletedFile)) {
+                        // we were monitoring it when it disappeared
+                        MonitorRecord monitorRecord = this.monitorRecords.get(deletedFile);
+                        if (monitorRecord.getEvent().equals(FileSystemEvent.MODIFIED)) {
+                            notifyListeners(deletedFile, FileSystemEvent.DELETED);
+                        }
+                    } else {
+                        notifyListeners(deletedFile, FileSystemEvent.DELETED);
+                    }
+                    this.fileState.remove(deletedFile);
+                    this.monitorRecords.remove(deletedFile);
+                }
+            } catch (Exception ignored) {
+                // FatalIOException can arise from listCurrentDirFiles() which means that we cannot determine the list.
+                // In this case we have already retried the list, and we can ignore this check().
+                // The check() then becomes a no-op which is better than assuming the directory is empty.
+            } finally {
+
+                debugState("after check:", null);
+
+            }
+        }
+    }
+
+    public boolean isUnlocked(File file) {
+        // Heuristic check for the file not being locked on Windows. On *ix, assume the file is unlocked since we can't
+        // tell.
+        return !WINDOWS || file.renameTo(file);
+    }
+
+    private void debugState(final String heading, File[] files) {
+        if (this.logger != null && this.logger.isDebugEnabled()) {
+            StringBuilder sb = new StringBuilder().append(this.checkDir).append(" - ").append(heading);
+            if (files != null) {
+                sb.append("\n\tFileList():  [");
+                boolean first = true;
+                for (File f : files) {
+                    if (!first) {
+                        sb.append(", ");
+                    }
+                    sb.append(f.getName());
+                    first = false;
+                }
+                sb.append("]");
+            }
+            if (this.fileState != null) {
+                sb.append("\n\tKnown files: [");
+                boolean first = true;
+                for (String s : this.fileState.keySet()) {
+                    if (!first) {
+                        sb.append(", ");
+                    }
+                    sb.append(s);
+                    first = false;
+                }
+                sb.append("]");
+            }
+            if (this.monitorRecords != null) {
+                sb.append("\n\tMonitored:   [");
+                boolean first = true;
+                for (String s : this.monitorRecords.keySet()) {
+                    if (!first) {
+                        sb.append(", ");
+                    }
+                    sb.append(s);
+                    first = false;
+                }
+                sb.append("]");
+            }
+            this.logger.debug(sb.toString());
+        }
+    }
+
+    private void notifyListeners(String file, FileSystemEvent event) {
+        for (FileSystemListener listener : this.listeners) {
+            try {
+                listener.onChange(file, event);
+            } catch (Throwable e) {
+                if (this.logger != null) {
+                    this.logger.warn("Listener threw exception for event " + event, e);
+                }
+            }
+        }
+    }
+
+    /**
+     * Initialises known files (<code>fileState</code>) from the check directory and starts monitoring them.
+     * 
+     * @throws Exception
+     */
+    private void populateInitialState() throws RuntimeException {
+        File[] initialList;
+        try {
+            initialList = listCurrentDirFiles();
+        } catch (RuntimeException e) {
+            if (this.logger != null) {
+                this.logger.warn("FileSystemChecker caught exception from listFiles()", e);
+            }
+            throw e;
+        }
+        for (File file : initialList) {
+            String keyFile = key(file);
+            this.monitorRecords.put(keyFile, new MonitorRecord(file.length(), FileSystemEvent.INITIAL));
+            setKnownFileState(file);
+        }
+        debugState("initial state:", initialList);
+    }
+
+    /**
+     * Lists the {@link File Files} currently in the check directory.
+     * 
+     * @return the <code>Files</code> that are in the check directory.
+     */
+    private File[] listCurrentDirFiles() {
+        return FileSystemUtils.listFiles(this.checkDir, this.includeFilter, this.logger);
+    }
+
+    /**
+     * Sets the state of the supplied {@link File} into our known files map (<code>fileState</code>).
+     * 
+     * @param the <code>File</code> to record state for.
+     */
+    private void setKnownFileState(File file) {
+        String key = key(file);
+        long lastModified = file.lastModified();
+        this.fileState.put(key, lastModified);
+    }
+    
+    /**
+     * Sets the state of the supplied {@link File} into our known files map (<code>fileState</code>) to the supplied state.
+     * 
+     * @param the <code>File</code> to record state for.
+     * @param the new state
+     */
+    private void setKnownFileState(File file, long lastModified) {
+    	String key = key(file);
+        this.fileState.put(key, lastModified);
+    }
+
+    /**
+     * Gets the recorded last modified timestamp for the supplied {@link File}.
+     * 
+     * @param file the <code>File</code> to check for.
+     * @return the last modified timestamp, or <code>null</code> if no timestamp is recorded.
+     */
+    private Long knownLastModified(File file) {
+        return this.fileState.get(key(file));
+    }
+
+    /**
+     * Is file known to us? (In <code>fileState</code>.)
+     * 
+     * @param file the <code>File</code> to check for.
+     * @return <code>true</code> if in the map (domain), <code>false</code> otherwise.
+     */
+    private boolean isKnown(File file) {
+        return this.fileState.containsKey(key(file));
+    }
+
+    /**
+     * Gets the record key for the supplied {@link File}.
+     * 
+     * @param file the <code>File</code> to get the key for.
+     * @return the record key.
+     */
+    private String key(File file) {
+        String key = file.getAbsolutePath();
+        if (file.isDirectory()) {
+            key += File.separator;
+        }
+        return key;
+    }
+
+    private static class MonitorRecord {
+
+        private final FileSystemEvent event;
+
+        private long size;
+
+        public MonitorRecord(long size, FileSystemEvent event) {
+            this.size = size;
+            this.event = event;
+        }
+
+        public long getSize() {
+            return this.size;
+        }
+
+        public void setSize(long size) {
+            this.size = size;
+        }
+
+        public FileSystemEvent getEvent() {
+            return this.event;
+        }
+    }
+
+    private boolean isInitialEventsBulkHandlingEnabled() {
+        return BULK_MODE_VALUE.equalsIgnoreCase(System.getProperty(INITIAL_EVENT_HANDLING_MODE));
+    }
+}
diff --git a/util/org.eclipse.virgo.util.io/src/main/java/org/eclipse/virgo/util/io/FileSystemEvent.java b/util/org.eclipse.virgo.util.io/src/main/java/org/eclipse/virgo/util/io/FileSystemEvent.java
new file mode 100644
index 0000000..edc8efa
--- /dev/null
+++ b/util/org.eclipse.virgo.util.io/src/main/java/org/eclipse/virgo/util/io/FileSystemEvent.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.io;
+
+/**
+ * Describes a monitorable event on a file system object.<p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.
+ * 
+ */
+public enum FileSystemEvent {
+
+    /**
+     * Signals the initial observation of a file system object.
+     */
+    INITIAL,
+
+    /**
+     * Signals that a new file system object was created.
+     */
+    CREATED,
+
+    /**
+     * Signals that a file system object was deleted.
+     */
+    DELETED,
+
+    /**
+     * Signals that a file system object was modified.
+     */
+    MODIFIED
+}
diff --git a/util/org.eclipse.virgo.util.io/src/main/java/org/eclipse/virgo/util/io/FileSystemListener.java b/util/org.eclipse.virgo.util.io/src/main/java/org/eclipse/virgo/util/io/FileSystemListener.java
new file mode 100644
index 0000000..289096c
--- /dev/null
+++ b/util/org.eclipse.virgo.util.io/src/main/java/org/eclipse/virgo/util/io/FileSystemListener.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.io;
+
+import java.util.List;
+
+/**
+ * Listener that is notified of file system modifications.
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br/>
+ * 
+ * Implementations <code>must</code> be threadsafe.
+ * 
+ */
+public interface FileSystemListener {
+
+    /**
+     * Signals an event at the supplied file path.
+     * 
+     * @param path the path for which the event occurred.
+     * @param event the event that occurred.
+     */
+    void onChange(String path, FileSystemEvent event);
+
+    /**
+     * Signals once for all initially observed file system objects. The method is convenient when all initial file
+     * system events need to be handled all together, not one by one.
+     * 
+     * @param paths all the file paths for which INITIAL event occurred
+     */
+    void onInitialEvent(List<String> paths);
+
+}
diff --git a/util/org.eclipse.virgo.util.io/src/main/java/org/eclipse/virgo/util/io/FileSystemUtils.java b/util/org.eclipse.virgo.util.io/src/main/java/org/eclipse/virgo/util/io/FileSystemUtils.java
new file mode 100644
index 0000000..64031b6
--- /dev/null
+++ b/util/org.eclipse.virgo.util.io/src/main/java/org/eclipse/virgo/util/io/FileSystemUtils.java
@@ -0,0 +1,378 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.io;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.net.URI;
+
+import org.eclipse.virgo.util.common.Assert;
+import org.slf4j.Logger;
+
+
+/**
+ * Utility methods for dealing with the file system.<p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ */
+public final class FileSystemUtils {
+
+    private static final String URI_FILE_SCHEME = "file";
+
+    private FileSystemUtils() {
+        /* designed to prevent user instantiation of this class */
+    }
+
+    /**
+     * Alias for {@link #convertToCanonicalPath(String, boolean) convertToCanonicalPath(path, false) }.
+     * @param path the path to convert; may be <code>null</code>
+     * @return the canonical path or <code>null</code> if the supplied path was <code>null</code>
+     * @throws FatalIOException if a lower-level {@link IOException} is thrown.
+     * 
+     * @see #convertToCanonicalPath(String, boolean)
+     */
+    public static String convertToCanonicalPath(String path) throws FatalIOException {
+        return convertToCanonicalPath(path, false);
+    }
+
+    /**
+     * Converts the supplied <code>path</code> to a {@link File#getCanonicalPath() canonical path}, wrapping any
+     * {@link IOException IOExceptions} in a {@link FatalIOException}.
+     * 
+     * @param path the path to convert; may be <code>null</code>
+     * @param verifyPathIsDirectory <code>true</code> if the path should only refer to a directory
+     * @return the canonical path or <code>null</code> if the supplied path was <code>null</code>
+     * @throws FatalIOException if <code>verifyPathIsDirectory</code> is <code>true</code> and the supplied path is not a directory, or a lower-level {@link IOException} is thrown.
+     */
+    public static String convertToCanonicalPath(String path, boolean verifyPathIsDirectory) throws FatalIOException {
+        if (path == null) {
+            return null;
+        }
+        try {
+            File dir = new File(path);
+            if (verifyPathIsDirectory && !dir.isDirectory()) {
+                throw new FatalIOException("The supplied path [" + path + "] is not a directory.");
+            }
+            return dir.getCanonicalPath();
+        } catch (IOException e) {
+            throw new FatalIOException("Could not determine the canonical path for [" + path + "]", e);
+        }
+    }
+
+    /**
+     * Converts the supplied {@link URI} to a {@link File#getCanonicalPath() canonical path}, wrapping any
+     * {@link IOException IOExceptions} in a {@link FatalIOException}.
+     * 
+     * @param uri the path to convert; may be <code>null</code>
+     * @return the canonical path or <code>null</code> if the supplied <code>URI</code> was <code>null</code>
+     * @throws FatalIOException if a lower-level {@link IOException} is thrown.
+     */
+    public static String convertToCanonicalPath(URI uri) throws FatalIOException {
+        if (uri == null) {
+            return null;
+        }
+        Assert.isTrue(uri.getScheme().equals(URI_FILE_SCHEME), "Cannot determine path of URI '%s' with non-file scheme", uri);
+        try {
+            return new File(uri).getCanonicalPath();
+        } catch (IOException ioe) {
+            throw new FatalIOException("Could not determine the canonical path for URI [" + uri + "]", ioe);
+        }
+    }
+
+    /**
+     * Verifies that the directory with the supplied <code>path</code> exists, and if it does not exist, an attempt
+     * will be made to create it as well as any necessary parent directories. As a convenience, the supplied path will
+     * be {@link #convertToCanonicalPath(String) converted} to a canonical path and returned.
+     * 
+     * @param path the directory path; must not be <code>null</code>
+     * @return the canonical path to the directory
+     */
+    public static String createDirectoryIfNecessary(String path) {
+        Assert.notNull(path, "'path' must not be null.");
+        File dir = new File(path);
+        if (!dir.exists()) {
+            boolean success = dir.mkdirs();
+            if(!success) {
+            	throw new FatalIOException("Unable to create needed directory " + path);
+            }
+        }
+        return convertToCanonicalPath(path);
+    }
+
+    /**
+     * Delete the supplied {@link File} and, for directories, recursively delete any nested directories or files.
+     * 
+     * @param root the root <code>File</code> to delete.
+     * @return <code>true</code> if the <code>File</code> was deleted or didn't exist in the first place, otherwise <code>false</code>.
+     * @see #deleteRecursively(String)
+     */
+    public static boolean deleteRecursively(File root) {
+        return doRecursiveDelete(root);
+    }
+
+    /**
+     * Delete the file referenced by the supplied path and, if the path refers to a directory, recursively delete any
+     * nested directories or files.
+     * 
+     * @param path the path to the file or directory to delete.
+     * @return <code>true</code> if the <code>File</code> or directory was deleted or didn't exist in the first place, otherwise <code>false</code>.
+     * @see #deleteRecursively(File)
+     */
+    public static boolean deleteRecursively(String path) {
+        return deleteRecursively(new File(path));
+    }
+
+    /**
+     * Generate array of {@link String}s of the names of the files in the directory <code>dir</code> 
+     * (just like {@link File#list()}).
+     * This function, however, <i>never</i> returns the <strong><code>null</code></strong> pointer, but instead throws
+     * an exception if it cannot determine the files, or if <code>dir</code> isn't a directory.
+     *  
+     * @param dir directory file for which the filenames should be generated.
+     * @return array of {@link String}s; may be the empty array.
+     * @throws FatalIOException when {@link File#list()} returns <strong><code>null</code></strong> even after a retry.
+     */
+    public static String[] list(File dir) throws FatalIOException {
+        return list(dir, (Logger) null); 
+    }
+     
+    /**
+     * Generate array of {@link String}s of the names of the files in the directory <code>dir</code> (just like
+     * {@link File#list()}). This function, however, <i>never</i> returns the <strong><code>null</code></strong>
+     * pointer, but instead throws an exception if it cannot determine the files, or if <code>dir</code> isn't a
+     * directory.
+     * 
+     * @param dir directory file for which the filenames should be generated.
+     * @param logger where to log warnings or errors, if not null
+     * @return array of {@link String}s; may be the empty array.
+     * @throws FatalIOException when {@link File#list()} returns <strong><code>null</code></strong> even after a retry.
+     */
+    public static String[] list(File dir, Logger logger) throws FatalIOException {
+        String[] filenames = dir.list();
+        if (filenames==null) {
+            if (logger!=null) logger.warn("'" + dir + "'.list() returned null first time.");
+            preRetryFileOp(dir, logger);
+            filenames = dir.list();
+        }
+        if (filenames==null) {
+            if (logger!=null) logger.error("'" + dir + "'.list() returned null on retry.");
+            throw new FatalIOException("list() failed for file " + dir);
+        }
+        return filenames;
+    }
+
+    /**
+     * Generate array of {@link String}s of the names of the files in the directory <code>dir</code>, filtered by <code>filenameFilter</code> 
+     * (just like {@link File#list(FilenameFilter)}).
+     * This function, however, <i>never</i> returns the <strong><code>null</code></strong> pointer, but instead throws
+     * an exception if it cannot determine the files, or if <code>dir</code> isn't a directory.
+     *  
+     * @param dir directory file for which the filenames should be generated.
+     * @param filenameFilter filter on the files' filenames
+     * @return array of {@link String}s; may be the empty array.
+     * @throws FatalIOException when {@link File#list(FilenameFilter)} returns <strong><code>null</code></strong> even after a retry.
+     */
+    public static String[] list(File dir, FilenameFilter filenameFilter) throws FatalIOException {
+        return list(dir, filenameFilter, null);
+    }
+    
+    /**
+     * Generate array of {@link String}s of the names of the files in the directory <code>dir</code>, filtered by <code>filenameFilter</code> 
+     * (just like {@link File#list(FilenameFilter)}).
+     * This function, however, <i>never</i> returns the <strong><code>null</code></strong> pointer, but instead throws
+     * an exception if it cannot determine the files, or if <code>dir</code> isn't a directory.
+     *  
+     * @param dir directory file for which the filenames should be generated.
+     * @param filenameFilter filter on the files' filenames
+     * @param logger where to log warnings or errors, if not null
+     * @return array of {@link String}s; may be the empty array.
+     * @throws FatalIOException when {@link File#list(FilenameFilter)} returns <strong><code>null</code></strong> even after a retry.
+     */
+    public static String[] list(File dir, FilenameFilter filenameFilter, Logger logger) throws FatalIOException {
+        String[] filenames = dir.list(filenameFilter);
+        if (filenames==null) {
+            if (logger!=null) logger.warn("'" + dir + "'.list(<FilenameFilter>) returned null first time.");
+            preRetryFileOp(dir, logger);
+            filenames = dir.list(filenameFilter);
+        }
+        if (filenames==null) {
+            if (logger!=null) logger.error("'" + dir + "'.list(<FilenameFilter>) returned null on retry.");
+            throw new FatalIOException("list(FilenameFilter) failed for file " + dir);
+        }
+        return filenames;
+    }
+    
+    /**
+     * Generate array of {@link File}s, one for each file in the directory <code>dir</code> (just like {@link File#listFiles()}).
+     * This function, however, <i>never</i> returns the <strong><code>null</code></strong> pointer, but instead throws
+     * an exception if it cannot determine the files, or if <code>dir</code> isn't a directory.
+     *  
+     * @param dir directory file for which the files should be generated.
+     * @param logger where to log warnings or errors, if not null
+     * @return array of {@link File}s; may be the empty array.
+     * @throws FatalIOException when {@link File#listFiles()} returns <strong><code>null</code></strong> even after a retry.
+     */
+    public static File[] listFiles(File dir, Logger logger) throws FatalIOException {
+        File[] files = dir.listFiles();
+        if (files==null) {
+            if (logger!=null) logger.warn("'" + dir + "'.listFiles() returned null first time.");
+            preRetryFileOp(dir, logger);
+            files = dir.listFiles();
+        }
+        if (files==null) {
+            if (logger!=null) logger.error("'" + dir + "'.listFiles() returned null on retry.");
+            throw new FatalIOException("listFiles() failed for file " + dir);
+        }
+        return files;
+    }
+    
+    /**
+     * Generate array of {@link File}s, one for each file in the directory <code>dir</code>, filtered by <code>fileFilter</code> 
+     * (just like {@link File#listFiles(FileFilter)}).
+     * This function, however, <i>never</i> returns the <strong><code>null</code></strong> pointer, but instead throws
+     * an exception if it cannot determine the files, or if <code>dir</code> isn't a directory.
+     *  
+     * @param dir directory file for which the files should be generated.
+     * @param fileFilter filter on the files
+     * @return array of {@link File}s; may be the empty array.
+     * @throws FatalIOException when {@link File#listFiles(FileFilter)} returns <strong><code>null</code></strong> even after a retry.
+     */
+    public static File[] listFiles(File dir, FileFilter fileFilter) throws FatalIOException { 
+        return listFiles(dir, fileFilter, null);
+    }
+
+    /**
+     * Generate array of {@link File}s, one for each file in the directory <code>dir</code>, unfiltered 
+     * (just like {@link File#listFiles()}).
+     * This function, however, <i>never</i> returns the <strong><code>null</code></strong> pointer, but instead throws
+     * an exception if it cannot determine the files, or if <code>dir</code> isn't a directory.
+     *  
+     * @param dir directory file for which the files should be generated.
+     * @return array of {@link File}s; may be the empty array.
+     * @throws FatalIOException when {@link File#listFiles(FileFilter)} returns <strong><code>null</code></strong> even after a retry.
+     */
+    public static File[] listFiles(File dir) throws FatalIOException { 
+        return listFiles(dir, (Logger) null);
+    }
+
+    /**
+     * Generate array of {@link File}s, one for each file in the directory <code>dir</code>, filtered by
+     * <code>fileFilter</code> (just like {@link File#listFiles(FileFilter)}). This function, however, <i>never</i>
+     * returns the <strong><code>null</code></strong> pointer, but instead throws an exception if it cannot determine
+     * the files, or if <code>dir</code> isn't a directory.
+     * 
+     * @param dir directory file for which the files should be generated.
+     * @param fileFilter filter on the files
+     * @param logger where to log warnings or errors, if not null
+     * @return array of {@link File}s; may be the empty array.
+     * @throws FatalIOException when {@link File#listFiles(FileFilter)} returns <strong><code>null</code></strong> even
+     *         after a retry.
+     */
+    public static File[] listFiles(File dir, FileFilter fileFilter, Logger logger) throws FatalIOException {
+        File[] files = dir.listFiles(fileFilter);
+        if (files==null) {
+            if (logger!=null) logger.warn("'" + dir + "'.listFiles(<FileFilter>) returned null first time.");
+            preRetryFileOp(dir, logger);
+            files = dir.listFiles(fileFilter);
+        }
+        if (files==null) {
+            if (logger!=null) logger.error("'" + dir + "'.listFiles(<FileFilter>) returned null on retry.");
+            throw new FatalIOException("listFiles(FileFilter) failed for file " + dir);
+        }
+        return files;
+    }
+ 
+    /**
+     * Generate array of {@link File}s, one for each file in the directory <code>dir</code>, filtered by <code>filenameFilter</code> 
+     * (just like {@link File#listFiles(FilenameFilter)}).
+     * This function, however, <i>never</i> returns the <strong><code>null</code></strong> pointer, but instead throws
+     * an exception if it cannot determine the files, or if <code>dir</code> isn't a directory.
+     *  
+     * @param dir directory file for which the files should be generated.
+     * @param filenameFilter filter on the files' filenames
+     * @return array of {@link File}s; may be the empty array.
+     * @throws FatalIOException when {@link File#listFiles(FilenameFilter)} returns <strong><code>null</code></strong> even after a retry.
+     */
+    public static File[] listFiles(File dir, FilenameFilter filenameFilter) throws FatalIOException {
+        return listFiles(dir, filenameFilter, null);
+    }
+
+    /**
+     * Generate array of {@link File}s, one for each file in the directory <code>dir</code>, filtered by <code>filenameFilter</code> 
+     * (just like {@link File#listFiles(FilenameFilter)}).
+     * This function, however, <i>never</i> returns the <strong><code>null</code></strong> pointer, but instead throws
+     * an exception if it cannot determine the files, or if <code>dir</code> isn't a directory.
+     *  
+     * @param dir directory file for which the files should be generated.
+     * @param filenameFilter filter on the files' filenames
+     * @param logger where to log warnings or errors, if not null
+     * @return array of {@link File}s; may be the empty array.
+     * @throws FatalIOException when {@link File#listFiles(FilenameFilter)} returns <strong><code>null</code></strong> even after a retry.
+     */
+    public static File[] listFiles(File dir, FilenameFilter filenameFilter, Logger logger) throws FatalIOException {
+        File[] files = dir.listFiles(filenameFilter);
+        if (files==null) {
+            if (logger!=null) logger.warn("'" + dir + "'.listFiles(<FilenameFilter>) returned null first time.");
+            preRetryFileOp(dir, logger);
+            files = dir.listFiles(filenameFilter);
+        }
+        if (files==null) {
+            if (logger!=null) logger.error("'" + dir + "'.listFiles(<FilenameFilter>) returned null on retry.");
+            throw new FatalIOException("listFiles(FilenameFilter) failed for file " + dir);
+        }
+        return files;
+    }
+
+    /**
+     * This method is designed to allow the underlying file system time to 're-group' before trying the operation again.
+     * <br/>It invokes an operation that will potentially involve some I/O so that transient problems with file access
+     * (proto-typically directory lists) have a chance to pass before we retry them.
+     * 
+     * <p/>Callers typically perform:
+     * <pre>
+     * result = <strong>file.someOp()</strong>;
+     * if (possible transient error) 
+     * { <strong>preRetryFileOp(file)</strong>;
+     *   result = <strong>file.someOp()</strong>;
+     * }
+     * if (still possible transient error) 
+     *   throw RunTimeException(...);
+     * </pre>
+     * @param file associated with which transient error may have occurred
+     */
+    private final static void preRetryFileOp(File file, Logger logger) {
+        try {
+            file.getCanonicalPath(); // potentially involves I/O
+        } catch (IOException ioe) {
+            if (logger!=null) logger.warn("PreRetry logic '" + file + "'.getCanonicalPath() threw IOException.", ioe);
+        }
+    }
+
+    private static boolean doRecursiveDelete(File root) {
+        if (root.exists()) {
+            if (root.isDirectory()) {
+                File[] children = root.listFiles();
+				if(children != null) {
+					for (File file : children) {
+	                    doRecursiveDelete(file);
+	                }
+				}
+            }
+            return root.delete();
+        }
+        return true;
+    }
+}
diff --git a/util/org.eclipse.virgo.util.io/src/main/java/org/eclipse/virgo/util/io/IOUtils.java b/util/org.eclipse.virgo.util.io/src/main/java/org/eclipse/virgo/util/io/IOUtils.java
new file mode 100644
index 0000000..4278ebe
--- /dev/null
+++ b/util/org.eclipse.virgo.util.io/src/main/java/org/eclipse/virgo/util/io/IOUtils.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.io;
+
+import java.io.Closeable;
+import java.io.IOException;
+
+/**
+ * Simple utility methods for working with Java IO classes.
+ */
+public final class IOUtils {
+
+    /**
+     * Quietly closes the supplied {@link Closeable} instance.
+     * @param c to close
+     */
+    public static void closeQuietly(Closeable c) {
+        if (c != null) {
+            try {
+                c.close();
+            } catch (IOException e) {
+            }
+        }
+    }
+}
diff --git a/util/org.eclipse.virgo.util.io/src/main/java/org/eclipse/virgo/util/io/JarTransformer.java b/util/org.eclipse.virgo.util.io/src/main/java/org/eclipse/virgo/util/io/JarTransformer.java
new file mode 100644
index 0000000..3c03f4c
--- /dev/null
+++ b/util/org.eclipse.virgo.util.io/src/main/java/org/eclipse/virgo/util/io/JarTransformer.java
@@ -0,0 +1,152 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.io;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.nio.charset.StandardCharsets;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+import java.util.jar.JarOutputStream;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+
+/**
+ * Utility class for transforming the entries in a JAR file.
+ * <p/>
+ * Entries cannot be added, only changed or removed. Actual transformation of entries is performed by an implementation
+ * of the {@link JarTransformerCallback} interface.
+ */
+public final class JarTransformer {
+
+    private static final String MANIFEST_VERSION_HEADER = "Manifest-Version: 1.0";
+
+    private final JarTransformerCallback callback;
+
+    /**
+     * Creates a new <code>JarTransformer</code> that uses the supplied {@link JarTransformerCallback} for
+     * transformation.
+     * 
+     * @param callback the <code>JarTransformerCallback</code> to use for entry transformation.
+     */
+    public JarTransformer(JarTransformerCallback callback) {
+        if (callback == null) {
+            throw new IllegalArgumentException("Callback must not be null");
+        }
+        this.callback = callback;
+    }
+
+    /**
+     * Transforms the JAR content in <code>is</code> and writes the results to <code>os</code>.
+     * 
+     * @param is the JAR to transform.
+     * @param stream the {@link OutputStream} to write the transformed JAR to.
+     * @throws IOException if the JAR cannot be transformed.
+     */
+    public void transform(InputStream is, OutputStream stream) throws IOException {
+        transform(is, stream, false);
+    }
+
+    /**
+     * Transforms the JAR content in <code>is</code> and writes the results to <code>os</code>.
+     * 
+     * @param is the JAR to transform.
+     * @param stream the {@link OutputStream} to write the transformed JAR to.
+     * @param ensureManifestIsPresent if <code>true</code> ensures that the transformed JAR contains a manifest.
+     * @throws IOException if the JAR cannot be transformed.
+     */
+    public void transform(InputStream is, OutputStream stream, boolean ensureManifestIsPresent) throws IOException {
+        ZipInputStream zipInputStream = new ZipInputStream(is);
+        JarOutputStream jos = new JarOutputStream(stream);
+        ZipEntry entry;
+        boolean manifestPresent = false;
+        while ((entry = zipInputStream.getNextEntry()) != null) {
+            String entryName = entry.getName();
+            if (JarFile.MANIFEST_NAME.equals(entryName)) {
+                manifestPresent = true;
+            }
+
+            if (!entry.isDirectory()) {
+                transformEntry(zipInputStream, entry, jos);
+            } else {
+                jos.putNextEntry(new JarEntry(entryName));
+                jos.closeEntry();
+            }
+        }
+        if (ensureManifestIsPresent && !manifestPresent) {
+            JarEntry manifestEntry = new JarEntry(JarFile.MANIFEST_NAME);
+            InputStream defaultManifestStream = getDefaultManifestStream();
+            transformEntry(defaultManifestStream, manifestEntry, jos);
+            defaultManifestStream.close();
+        }
+        jos.finish();
+    }
+
+    private InputStream getDefaultManifestStream() {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        try (PrintWriter writer = new PrintWriter(new OutputStreamWriter(baos, StandardCharsets.UTF_8))) {
+            writer.println(MANIFEST_VERSION_HEADER);
+            writer.println();
+        }
+        return new ByteArrayInputStream(baos.toByteArray());
+    }
+
+    private void transformEntry(InputStream inputStream, ZipEntry entry, JarOutputStream jos) throws IOException {
+        if (!this.callback.transformEntry(entry.getName(), inputStream, jos)) {
+            jos.putNextEntry(new JarEntry(entry.getName()));
+            copy(inputStream, jos);
+            jos.closeEntry();
+        }
+    }
+
+    private void copy(InputStream inputStream, OutputStream outputStream) throws IOException {
+        byte[] buffer = new byte[1024];
+        int read;
+        while ((read = inputStream.read(buffer)) > 0) {
+            outputStream.write(buffer, 0, read);
+        }
+    }
+
+    /**
+     * Callback interface used to transform entries in a JAR file.
+     * 
+     * @see JarTransformer
+     */
+    public static interface JarTransformerCallback {
+
+        /**
+         * Transform the entry with the supplied name.
+         * <p/>
+         * Entry content can be read from the supplied {@link InputStream} and transformed contents can be written to
+         * the supplied {@link OutputStream}.
+         * <p/>
+         * Implementations <strong>must</strong> return <code>true</code> if the entry was transformed or deleted.
+         * Otherwise, <code>false</code> must be returned. No content should be written when not performing a
+         * transformation.
+         * <p/>
+         * Implementations transforming an entry must add the entry to the output stream and close the added entry.
+         * Implementations deleting an entry must not add the entry to the output stream.
+         * 
+         * @param entryName the name of the entry being transformed
+         * @param is the entry content
+         * @param os the output destination
+         * @return <code>true</code> if the entry was transformed, otherwise <code>false</code>
+         * @throws IOException if transformation fails
+         */
+        boolean transformEntry(String entryName, InputStream is, JarOutputStream os) throws IOException;
+    }
+}
diff --git a/util/org.eclipse.virgo.util.io/src/main/java/org/eclipse/virgo/util/io/JarTransformingURLConnection.java b/util/org.eclipse.virgo.util.io/src/main/java/org/eclipse/virgo/util/io/JarTransformingURLConnection.java
new file mode 100644
index 0000000..99a367a
--- /dev/null
+++ b/util/org.eclipse.virgo.util.io/src/main/java/org/eclipse/virgo/util/io/JarTransformingURLConnection.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.io;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.net.URLConnection;
+
+/**
+ * Implementation of {@link URLConnection} that transforms JAR files as they are read.
+ * <p/>
+ * A {@link URL} is used to source the real connection for the JAR data, and a {@link JarTransformer} is used to
+ * customize the exact transformations being performed.
+ * 
+ * @see JarTransformer
+ */
+public final class JarTransformingURLConnection extends URLConnection {
+
+    private final JarTransformer transformer;
+    
+    private final boolean ensureManifestIsPresent;
+
+    /**
+     * Creates a new <code>JarTransformingURLConnection</code> that will provide content from the JAR identified by
+     * <code>url</code> transformed by <code>transformer</code>.
+     * 
+     * @param url the {@link URL} of the JAR file.
+     * @param transformer the <code>JarTransformer</code> to apply as content is being read.
+     */
+    public JarTransformingURLConnection(URL url, JarTransformer transformer) {
+    	this(url, transformer, false);
+    }
+    
+    /**
+     * Creates a new <code>JarTransformingURLConnection</code> that will provide content from the JAR identified by
+     * <code>url</code> transformed by <code>transformer</code> and that will optionally ensure that a manifest is
+     * provided, creating one if necessary.
+     * 
+     * @param url the {@link URL} of the JAR file.
+     * @param transformer the <code>JarTransformer</code> to apply as content is being read.
+     * @param ensureManifestIsPresent <code>true</code> if the presence of a MANIFEST.MF should be ensured.
+     */
+    public JarTransformingURLConnection(URL url, JarTransformer transformer, boolean ensureManifestIsPresent) {
+        super(url);
+        this.transformer = transformer;
+        this.ensureManifestIsPresent = ensureManifestIsPresent;
+    }
+
+    @Override
+    public InputStream getInputStream() throws IOException {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        InputStream rawInputStream = url.openStream();
+        try {
+            this.transformer.transform(rawInputStream, baos, this.ensureManifestIsPresent);
+            return new ByteArrayInputStream(baos.toByteArray());
+        } finally {
+            baos.close();
+            try {
+                rawInputStream.close();
+            } catch (IOException ex) {
+            }
+        }
+    }
+
+    @Override
+    public void connect() throws IOException {
+    }
+
+}
diff --git a/util/org.eclipse.virgo.util.io/src/main/java/org/eclipse/virgo/util/io/JarUtils.java b/util/org.eclipse.virgo.util.io/src/main/java/org/eclipse/virgo/util/io/JarUtils.java
new file mode 100644
index 0000000..754df98
--- /dev/null
+++ b/util/org.eclipse.virgo.util.io/src/main/java/org/eclipse/virgo/util/io/JarUtils.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.io;
+
+import java.io.IOException;
+
+/**
+ * Utility code for working with JAR files.<p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br/>
+ * 
+ * Threadsafe
+ */
+public final class JarUtils {
+
+    /**
+     * Unpacks the JAR file at {@link PathReference jarFile} to the directory <code>dest</code>.<p/>
+     * 
+     * If the supplied <code>dest</code> {@link PathReference} does not exist, it is created as a directory and the
+     * JAR file is unpacked <strong>directly</strong> into the newly created directory.<p/>
+     * 
+     * If the supplied <code>dest</code> <code>PathReference</code> already exists and is a directory then the JAR
+     * file is unpacked as a subdirectory of the supplied directory this directory. The name of the generated
+     * subdirectory is that of the JAR file without the file extension - so <code>foo.jar</code> is unpacked into a
+     * directory <code>foo</code>.
+     * 
+     * @param jarFile the JAR file to unpack
+     * @param dest the destination directory
+     * @throws IOException if an error occurs during unpack.
+     */
+    public static void unpackTo(PathReference jarFile, PathReference dest) throws IOException {
+        ZipUtils.unzipTo(jarFile, dest);
+    }
+    
+    /**
+     * Unpacks the JAR file at {@link PathReference jarFile} to the directory <code>dest</code>.<p/>
+     * 
+     * If the supplied <code>dest</code> {@link PathReference} does not exist, it is created as a directory and the
+     * JAR file is unpacked <strong>directly</strong> into the newly created directory.<p/>
+     * 
+     * If the supplied <code>dest</code> <code>PathReference</code> already exists and is a directory then its content
+     * is deleted and the JAR file is unpacked in the cleaned directory. 
+     * 
+     * @param jarFile the JAR file to unpack
+     * @param dest the destination directory
+     * @throws IOException if an error occurs during unpack.
+     */
+    public static void unpackToDestructive(PathReference jarFile, PathReference dest) throws IOException {
+        ZipUtils.unzipToDestructive(jarFile, dest);
+    }
+}
diff --git a/util/org.eclipse.virgo.util.io/src/main/java/org/eclipse/virgo/util/io/NetUtils.java b/util/org.eclipse.virgo.util.io/src/main/java/org/eclipse/virgo/util/io/NetUtils.java
new file mode 100644
index 0000000..7ee08b5
--- /dev/null
+++ b/util/org.eclipse.virgo.util.io/src/main/java/org/eclipse/virgo/util/io/NetUtils.java
@@ -0,0 +1,127 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.io;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.net.ServerSocket;
+import java.util.Random;
+
+/**
+ * Utility methods for working with network IO code.
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.
+ * 
+ */
+public final class NetUtils {
+
+    private static final int MIN_SAFE_PORT = 1024;
+
+    private static final int MAX_PORT = 65535;
+
+    private static final Random random = new Random();
+
+    /**
+     * Checks whether the supplied port is available on any local address.
+     * 
+     * @param port the port to check for.
+     * @return <code>true</code> if the port is available, otherwise <code>false</code>.
+     */
+    public static boolean isPortAvailable(int port) {
+        ServerSocket socket;
+        try {
+            socket = new ServerSocket();
+        } catch (IOException e) {
+            throw new IllegalStateException("Unable to create ServerSocket.", e);
+        }
+
+        try {
+            InetSocketAddress sa = new InetSocketAddress(port);
+            socket.bind(sa);
+            return true;
+        } catch (IOException ex) {
+            return false;
+        } finally {
+            try {
+                socket.close();
+            } catch (IOException ex) {
+            }
+        }
+    }
+
+    /**
+     * Checks whether the supplied port is available on the specified address.
+     * 
+     * @param hostname the address to check for.
+     * @param port the port to check for.
+     * @return <code>true</code> if the port is available, otherwise <code>false</code>.
+     */
+    public static boolean isPortAvailable(String hostname, int port) {
+        ServerSocket socket;
+        try {
+            socket = new ServerSocket();
+        } catch (IOException e) {
+            throw new IllegalStateException("Unable to create ServerSocket.", e);
+        }
+
+        try {
+            InetSocketAddress sa = new InetSocketAddress(hostname, port);
+            socket.bind(sa);
+            return true;
+        } catch (IOException ex) {
+            return false;
+        } finally {
+            try {
+                socket.close();
+            } catch (IOException ex) {
+            }
+        }
+    }
+
+    /**
+     * Gets a random free port in the non-privileged range of 1025-65535. After this port has been returned once, it
+     * cannot be returned again.
+     * 
+     * @return A free port number
+     */
+    public static int getFreePort() {
+        return getFreePort(MIN_SAFE_PORT, MAX_PORT);
+    }
+
+    /**
+     * Gets a random free port in between the minimum and maximum specified port numbers.
+     * 
+     * @param minPort The minimum port number
+     * @param maxPort The maximum port number
+     * @return After this number has been returned once, it cannot be returned again.
+     */
+    public static int getFreePort(int minPort, int maxPort) {
+        int portRange = maxPort - minPort;
+        int candidatePort;
+        int searchCounter = 0;
+        do {
+            if (++searchCounter > portRange) {
+                throw new IllegalStateException(String.format("There were no ports available in the range %d to %d", minPort, maxPort));
+            }
+            candidatePort = getRandomPort(minPort, portRange);
+        } while (!isPortAvailable(candidatePort));
+
+        return candidatePort;
+    }
+
+    private static int getRandomPort(int minPort, int portRange) {
+        return minPort + random.nextInt(portRange);
+    }
+}
diff --git a/util/org.eclipse.virgo.util.io/src/main/java/org/eclipse/virgo/util/io/PathReference.java b/util/org.eclipse.virgo.util.io/src/main/java/org/eclipse/virgo/util/io/PathReference.java
new file mode 100644
index 0000000..b151fea
--- /dev/null
+++ b/util/org.eclipse.virgo.util.io/src/main/java/org/eclipse/virgo/util/io/PathReference.java
@@ -0,0 +1,534 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.io;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.net.URI;
+
+/**
+ * Represents a reference, by path, to a location on the file system. This location may be a file or a directory, or it
+ * may point to a non-existent location.
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br/>
+ * 
+ * Threadsafe.
+ */
+public final class PathReference {
+
+    /**
+     * The {@link File} handle that backs this reference.
+     */
+    private final File file;
+
+    /**
+     * Creates a new <code>PathReference</code> for the supplied path.
+     * 
+     * @param path the path to reference.
+     */
+    public PathReference(String path) {
+        this(new File(path));
+    }
+
+    /**
+     * Creates a new <code>PathReference</code> for the supplied {@link URI} which must point to a file location.
+     * 
+     * @param uri the file URI to reference
+     */
+    public PathReference(URI uri) {
+        this.file = new File(uri);
+    }
+
+    /**
+     * Creates a new <code>PathReference</code> for the supplied {@link File}.
+     * 
+     * @param file the file to reference.
+     */
+    public PathReference(File file) {
+        this.file = file;
+    }
+
+    /**
+     * Converts this <code>PathReference</code> to a {@link File}.
+     * 
+     * @return the <code>File</code>.
+     */
+    public File toFile() {
+        return this.file;
+    }
+
+    /**
+     * Queries whether or not this <code>PathReference</code> points to a vaild file or directory.
+     * 
+     * @return <code>true</code> if the location is valid, otherwise <code>false</code>.
+     */
+    public boolean exists() {
+        return this.file.exists();
+    }
+
+    /**
+     * Queries whether or not this <code>PathReference</code> points to a file.
+     * 
+     * @return <code>true</code> if this location points to a file, otherwise <code>false</code>.
+     */
+    public boolean isFile() {
+        return this.file.isFile();
+    }
+
+    /**
+     * Queries whether or not this <code>PathReference</code> points to a directory.
+     * 
+     * @return <code>true</code> if this location points to a directory, otherwise <code>false</code>.
+     */
+    public boolean isDirectory() {
+        return this.file.isDirectory();
+    }
+
+    /**
+     * Gets the name of the file or directory referenced by this <code>PathReference</code>.
+     * 
+     * @return the file or directory name.
+     * @see File#getName()
+     */
+    public String getName() {
+        return this.file.getName();
+    }
+
+    /**
+     * Gets the parent directory of this <code>PathReference</code>.
+     * 
+     * @return the parent directory.
+     * @see File#getParentFile()
+     */
+    public PathReference getParent() {
+        File parentFile = this.file.getParentFile();
+        return parentFile == null ? null : new PathReference(parentFile);
+    }
+
+    /**
+     * Queries whether or not the path of this <code>PathReference</code> is absolute.
+     * 
+     * @return <code>true</code> if the path is absolute, otherwise <code>false</code>.
+     */
+    public boolean isAbsolute() {
+        return this.file.isAbsolute();
+    }
+
+    /**
+     * Gets the absolute path of this <code>PathReference</code>.
+     * 
+     * @return the absolute path.
+     */
+    public String getAbsolutePath() {
+        return this.file.getAbsolutePath();
+    }
+
+    /**
+     * Converts this <code>PathReference</code> into a {@link URI}.
+     * 
+     * @return the URI of this <code>PathReference</code>.
+     * @see File#toURI()
+     */
+    public URI toURI() {
+        return this.file.toURI();
+    }
+
+    /**
+     * Gets the canonical path of this <code>PathReference</code>.
+     * 
+     * @return the canonical path.
+     */
+    public String getCanonicalPath() {
+        try {
+            return this.file.getCanonicalPath();
+        } catch (IOException e) {
+            throw new FatalIOException("Unable to canonicalize path for file '" + this + "'.", e);
+        }
+    }
+
+    /**
+     * Creates a <code>PathReference</code> that points to the absolute location of this <code>PathReference</code>.
+     * 
+     * @return the new <code>PathReference</code>.
+     */
+    public PathReference toAbsoluteReference() {
+        return new PathReference(getAbsolutePath());
+    }
+
+    /**
+     * Creates a <code>PathReference</code> that points to the canonical location of this <code>PathReference</code>.
+     * 
+     * @return the new <code>PathReference</code>.
+     */
+    public PathReference toCanonicalReference() {
+        return new PathReference(getCanonicalPath());
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String toString() {
+        return this.file.toString();
+    }
+
+    /**
+     * Delete the file/directory referenced by this <code>PathReference</code>. Has the same effect as calling
+     * {@link #delete(boolean) delete(false)}.
+     * 
+     * @return <code>true</code> if the file is deleted, otherwise <code>false</code>.
+     */
+    public boolean delete() {
+        return delete(false);
+    }
+
+    /**
+     * Delete the file/directory referenced by this <code>PathReference</code>. Nested contents can optionally be
+     * deleted by passing <code>recursive = true</code>. Non-recursive deletes will fail (return <code>false</code> for
+     * non-empty directories).
+     * 
+     * @param recursive should the delete process nested contents recursively.
+     * @return <code>true</code> if the file is deleted, otherwise <code>false</code>.
+     */
+    public boolean delete(boolean recursive) {
+        boolean deleted = recursive ? FileSystemUtils.deleteRecursively(this.file) : this.file.delete();
+        return deleted;
+    }
+
+    /**
+     * Same as calling {@link #copy(PathReference, boolean) copy(to, false)}.
+     * 
+     * @param dest the destination to copy to.
+     * @return the final destination <code>PathReference</code>.
+     */
+    public PathReference copy(PathReference dest) {
+        return copy(dest, false);
+    }
+
+    /**
+     * Same as calling {@link #copy(PathReference, boolean, PathFilter) copy(to, recursive, null)};
+     * 
+     * @param dest the destination to copy to.
+     * @param recursive whether the copy should be recursive or not.
+     * @return the final destination <code>PathReference</code>.
+     */
+    public PathReference copy(PathReference dest, boolean recursive) {
+        return copy(dest, recursive, null);
+    }
+
+    /**
+     * Copies the contents of the file/directory to location referenced supplied <code>PathReference</code>. The exact
+     * semantics of the copy depend on the state of both the source and destination locations.
+     * <p/>
+     * 
+     * When copying a file, if the destination location already exists and is a file then a {@link FatalIOException} is
+     * thrown. If the destination location exists and is a directory, the file is copied into this directory with the
+     * same {@link #getName name} as the source location. If the destination location does not exist, then the file is
+     * copied to this location directly.
+     * <p/>
+     * 
+     * When copying a directory, if the destination location exists then the directory is copied into the already
+     * existing directory with the same name as the source location. If the destination location does not exist, then
+     * the directory is copied directly to the destination location and thus gets the name defined by the destination
+     * location.
+     * <p/>
+     * 
+     * A {@link PathFilter} can be used to specify exactly which files will be included in the copy. Passing
+     * <code>null</code> for the filter includes all files.
+     * <p/>
+     * 
+     * Non-recursive copies on non-empty directories will fail with {@link FatalIOException}.
+     * 
+     * @param dest the destination to copy to.
+     * @param recursive whether the copy should be recursive or not.
+     * @param filter a <code>PathFilter</code> controlling which files are included in the copy.
+     * @return the final destination <code>PathReference</code>.
+     */
+    public PathReference copy(PathReference dest, boolean recursive, PathFilter filter) {
+        if (!exists()) {
+            throw new FatalIOException("Cannot copy path '" + this + "' to '" + dest + "'. Source path does not exist.");
+        }
+        if (isFile()) {
+            if (dest.exists()) {
+                if (dest.isFile()) {
+                    throw new FatalIOException("Cannot copy path '" + this + "' to '" + dest + "'. Destination path already exists.");
+                } else {
+                    dest = dest.newChild(this.file.getName());
+                    if (dest.exists()) {
+                        throw new FatalIOException("Cannot copy path '" + this + "' to '" + dest + "'. Destination path already exists.");
+                    } else {
+                        dest.createFile();
+                    }
+                }
+            }
+            copyFile(this.file, dest.file);
+        } else { // this.file.isDirectory() assumed true
+            int length = FileSystemUtils.list(this.file).length;
+            if (length > 0 && !recursive) {
+                throw new FatalIOException("Cannot perform non-recursive copy on non-empty directory '" + this + "'");
+            }
+            if (dest.exists()) {
+                dest = dest.newChild(this.file.getName()).createDirectory();
+            } else {
+                // copy to this dir
+                dest.createDirectory();
+            }
+            recursiveCopy(this.file, dest.file, filter);
+        }
+        return dest;
+    }
+
+    /**
+     * Move the file (or directory) associated with this path reference to the destination path reference.
+     * <p/>
+     * If the destination already exists, or if the file associated with this path reference <i>doesn't</i> exist, then
+     * a {@link FatalIOException} (unchecked) is thrown. <br/>
+     * This is otherwise functionally equivalent to the sequence
+     * <code>copy(dest,<strong>true</strong>); delete(<strong>true</strong>);</code> returning the destination
+     * reference, except that a <i>fast move</i> is attempted first.
+     * <p/>
+     * If the <i>fast move</i> fails (for example because of file system limitations) the slow version is attempted,
+     * <i>viz</i>:
+     * <code>copy(dest,<strong>true</strong>); delete(<strong>true</strong>); <strong>return</strong> dest;</code>
+     * 
+     * @param dest path to move the current file to
+     * @return the destination path reference
+     */
+    public PathReference moveTo(PathReference dest) {
+        if (!exists()) {
+            throw new FatalIOException("Cannot move path '" + this + "' to '" + dest + "'. Source file does not exist.");
+        }
+        if (dest.exists()) {
+            throw new FatalIOException("Cannot move path '" + this + "' to '" + dest + "'. Destination path already exists.");
+        }
+        if (!this.file.renameTo(dest.file)) {
+            copy(dest, true); // can throw FatalIOException
+            delete(true); // can throw FatalIOException
+        }
+        return dest;
+    }
+
+    /**
+     * Move the file (or directory) associated with this path reference to the destination path reference.
+     * <p/>
+     * If the destination already exists, or if the file associated with this path reference <i>doesn't</i> exist, then
+     * a {@link FatalIOException} (unchecked) is thrown. <br/>
+     * A <i>fast move</i> is attempted.
+     * <p/>
+     * If the <i>fast move</i> fails a {@link FataIOException} is thrown.
+     * <p/>
+     * This is a utility function for testing purposes, and is deliberately package private.
+     * 
+     * @param dest path to move the current file to
+     * @return the destination path reference
+     */
+    PathReference fastMoveTo(PathReference dest) {
+        if (!exists()) {
+            throw new FatalIOException("Cannot move path '" + this + "' to '" + dest + "'. Source file does not exist.");
+        }
+        if (dest.exists()) {
+            throw new FatalIOException("Cannot move path '" + this + "' to '" + dest + "'. Destination path already exists.");
+        }
+        if (!this.file.renameTo(dest.file)) {
+            throw new FatalIOException("Fast move from '" + this + "' to '" + dest + "' failed.");
+        }
+        return dest;
+    }
+
+    /**
+     * Creates a new <code>PathReference</code> by concatenating the path of this <code>PathReference</code> with the
+     * supplied <code>name</code>. Note that this method does <strong>not</strong> create a physical file or directory
+     * at the child location.
+     * 
+     * @param name the name of the new child entry.
+     * @return the child <code>PathReference</code>.
+     */
+    public PathReference newChild(String name) {
+        return PathReference.concat(this.file.getPath(), name);
+    }
+
+    /**
+     * Creates a new file at the location of this <code>PathReference</code>.
+     * 
+     * @return this <code>PathReference</code> for chaining purposes.
+     */
+    public PathReference createFile() {
+        if (this.exists()) {
+            return this;
+        }
+        File parent = this.file.getParentFile();
+        if (!parent.exists()) {
+            boolean success = parent.mkdirs();
+            if (!success) {
+                throw new FatalIOException("Unable to create needed directory " + parent);
+            }
+        }
+        try {
+            this.file.createNewFile();
+            return this;
+        } catch (IOException e) {
+            throw new FatalIOException("Unable to create file '" + this + "'.", e);
+        }
+    }
+
+    /**
+     * Creates a directory at the location of this <code>PathReference</code>.
+     * 
+     * @return this <code>PathReference</code> for chaining purposes.
+     */
+    public PathReference createDirectory() {
+        if (!this.file.exists()) {
+            if (!this.file.mkdirs()) {
+                throw new FatalIOException("Unable to create directory " + this.file);
+            }
+        }
+        return this;
+    }
+
+    /**
+     * Creates a new <code>PathReference</code> by concatenating the supplied <code>parts</code>, treating each part as
+     * a separate path element.
+     * 
+     * @param parts the path elements.
+     * @return the <code>PathReference</code> for the concatenated path.
+     */
+    public static PathReference concat(String... parts) {
+        StringBuilder sb = new StringBuilder(256);
+        for (int x = 0; x < parts.length; x++) {
+            String part = parts[x];
+            sb.append(part);
+            if (x < parts.length && !part.endsWith(File.separator)) {
+                sb.append(File.separatorChar);
+            }
+        }
+        return new PathReference(sb.toString());
+    }
+
+    /**
+     * Recursively copy the contents of <code>src</code> to <code>dest</code>.
+     * 
+     * @param src the source directory.
+     * @param dest the destination file.
+     */
+    private static void recursiveCopy(File src, File dest, PathFilter filter) {
+        for (File file : FileSystemUtils.listFiles(src)) {
+            PathReference newFile = PathReference.concat(dest.getAbsolutePath(), file.getName());
+            if (filter != null && !filter.matches(new PathReference(file))) {
+                continue;
+            }
+            if (file.isFile()) {
+                newFile.createFile();
+                copyFile(file, newFile.toFile());
+            } else {
+                newFile.createDirectory();
+                recursiveCopy(file, newFile.toFile(), filter);
+            }
+        }
+    }
+
+    /**
+     * Copies <code>src</code> to <code>dest</code>.
+     * 
+     * @param src the source <code>File</code>.
+     * @param dest the destination <code>File</code>.
+     */
+    private static void copyFile(File src, File dest) {
+        try {
+            FileCopyUtils.copy(src, dest);
+        } catch (IOException e) {
+            throw new FatalIOException("Cannot copy " + (src.isFile() ? "file" : "directory") + " '" + src + "' to '" + dest + "'.", e);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int hashCode() {
+        return this.file.hashCode();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean equals(Object that) {
+        if (this == that) {
+            return true;
+        }
+        if (!(that instanceof PathReference)) {
+            return false;
+        }
+        PathReference thatRef = (PathReference) that;
+        return this.file.equals(thatRef.file);
+    }
+
+    /**
+     * Gets the contents of the {@link File} pointed to by this <code>PathReference</code>.
+     * 
+     * @return the file contents as a <code>String</code>.
+     * @throws IOException if the file cannot be found or read.
+     */
+    public String fileContents() throws IOException {
+        if (!this.file.isFile()) {
+            throw new FileNotFoundException("PathReference refers to a directory which has no file contents");
+        }
+        StringBuffer contents = new StringBuffer(100);
+        try (Reader fileReader = new BufferedReader(new InputStreamReader(new FileInputStream(this.file), UTF_8))) {
+            char[] chars = new char[100];
+            int charsRead = 0;
+            while ((charsRead = fileReader.read(chars)) != -1) {
+                contents.append(chars, 0, charsRead);
+            }
+        }
+        return contents.toString();
+    }
+
+    /**
+     * Set the last modified time of the {@link File} pointed to by this <code>PathReference</code> to the current time.
+     * 
+     * Note: the behaviour is not the same as UNIX(TM) touch as the latter also sets the file access time.
+     * 
+     * @return true iff this operation succeeded, false otherwise
+     */
+    public boolean touch() {
+        return this.file.setLastModified(System.currentTimeMillis());
+    }
+
+    /**
+     * Allows filtering during {@link PathReference} operations.
+     * <p/>
+     * 
+     * <strong>Concurrent Semantics</strong><br />
+     * 
+     * Implementations needn't be threadsafe if they are not shared by multiple threads.
+     * 
+     */
+    public static interface PathFilter {
+
+        /**
+         * Match against the supplied {@link PathReference} to query whether it is included in the outer operation.
+         * 
+         * @param path the path to match against.
+         * @return <code>true</code> if the <code>PathReference</code> should be included, otherwise <code>false</code>.
+         */
+        boolean matches(PathReference path);
+    }
+}
diff --git a/util/org.eclipse.virgo.util.io/src/main/java/org/eclipse/virgo/util/io/ZipUtils.java b/util/org.eclipse.virgo.util.io/src/main/java/org/eclipse/virgo/util/io/ZipUtils.java
new file mode 100644
index 0000000..6f95239
--- /dev/null
+++ b/util/org.eclipse.virgo.util.io/src/main/java/org/eclipse/virgo/util/io/ZipUtils.java
@@ -0,0 +1,269 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.io;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Enumeration;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+import java.util.zip.ZipOutputStream;
+
+import org.eclipse.virgo.util.common.Assert;
+import org.eclipse.virgo.util.common.IterableEnumeration;
+import org.eclipse.virgo.util.common.StringUtils;
+
+
+
+/**
+ * Utility code for working with Zip files.<p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br/>
+ * 
+ * Thread-safe.
+ * 
+ */
+public class ZipUtils {
+    
+    private static final String ZIP_FILENAME_SUFFIX = ".zip";
+    private static final int BUFFER_SIZE = 2048;
+    
+    /**
+     * Unzips the Zip file at {@link PathReference jarFile} to the directory <code>dest</code>.<p/>
+     * 
+     * If the supplied <code>dest</code> {@link PathReference} does not exist, it is created as a directory and the
+     * Zip is unzipped <strong>directly</strong> into the newly created directory.<p/>
+     * 
+     * If the supplied <code>dest</code> <code>PathReference</code> already exists and is a directory then the Zip
+     * is unzipped as a subdirectory of the supplied directory. The name of the generated subdirectory is that of the
+     * Zip file without the file extension, e.g. <code>foo.zip</code> is unpacked into a directory <code>foo</code>.
+     * 
+     * @param zipFile the Zip file to unzip
+     * @param dest the destination directory
+     * @return a <code>PathReference</code> to the directory containing the Zip file's contents.
+     * @throws IOException if an error occurs during unzip.
+     */
+    
+    public static PathReference unzipTo(PathReference zipFile, PathReference dest) throws IOException {
+        return unzipToFolder(zipFile, dest, false);
+    }
+    
+    /**
+     * Unzips the Zip file at {@link PathReference jarFile} to the directory <code>dest</code>.<p/>
+     * 
+     * If the supplied <code>dest</code> {@link PathReference} does not exist, it is created as a directory and the
+     * Zip is unzipped <strong>directly</strong> into the newly created directory.<p/>
+     * 
+     * If the supplied <code>dest</code> <code>PathReference</code> already exists and is a directory then its content
+     * is deleted and the JAR file is unpacked in the cleaned directory.
+     * 
+     * @param zipFile the Zip file to unzip
+     * @param dest the destination directory
+     * @return a <code>PathReference</code> to the directory containing the Zip file's contents.
+     * @throws IOException if an error occurs during unzip.
+     */
+    
+    public static PathReference unzipToDestructive(PathReference zipFile, PathReference dest) throws IOException {
+        return unzipToFolder(zipFile, dest, true);
+    }
+    
+    /**
+     * Zips the file or directory at {@link PathReference toZip} and writes the resulting Zip file to the
+     * supplied destination.
+     * <p/> 
+     * If the supplied destination does not exist the resulting Zip file will be written to that destination. If the supplied
+     * destination exists, and it is a directory, the Zip file will be written to that directory with the name as the path
+     * to be zipped, suffixed with ".zip". If the supplied destination exists, and it is not a directory, and exception
+     * is thrown.
+     * <p/>
+     * The entries in the resulting zip file are named relative to the path <code>toZip</code>.
+     * <p/>
+     * @param toZip The file or directory from which the Zip file is to be created.
+     * @param dest The path to which the created Zip file is to be written.
+     * @throws IOException if an error occurs during the zip process.
+     * @return a <code>PathReference</code> to the created Zip file.
+     */
+    public static PathReference zipTo(PathReference toZip, PathReference dest) throws IOException {
+        Assert.isTrue(toZip.exists(), "Supplied file or directory '%s' must exist", toZip);
+        
+        PathReference finalDest = determineFinalZipDestination(toZip, dest);    
+        
+        ZipOutputStream zos = null;
+        
+        try {
+            zos = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(finalDest.toFile())));       
+            doZip(zos, toZip.toFile(), toZip.toFile(), null);
+        } finally {
+            if (zos != null) {
+                zos.close();
+            }
+        }
+        
+        return finalDest;
+    }
+    
+    /**
+     * Zips the file or directory at {@link PathReference toZip} and writes the resulting Zip file to the
+     * supplied directory, <code>dest</code>.
+     * <p/> 
+     * If the supplied destination does not exist the resulting Zip file will be written to that destination. If the supplied
+     * destination exists, and it is a directory, the Zip file will be written to that directory with the name as the path
+     * to be zipped, suffixed with ".zip". If the supplied destination exists, and it is not a directory, and exception
+     * is thrown.
+     * <p/>
+     * Entries in the resulting zip file are named relative to the path <code>toZip</code>. Each entry's name
+     * is prefixed with the supplied <code>entryPrefix</code>.
+     * <p/>
+     * @param toZip The file or directory from which the Zip file is to be created.
+     * @param dest The path to which the created Zip file is to be written.
+     * @param entryPrefix for all entry names, null means no prefix
+     * @return final Zip destination {@link PathReference}
+     * @throws IOException if an error occurs during the zip process.
+     */
+    public static PathReference zipTo(PathReference toZip, PathReference dest, String entryPrefix) throws IOException {
+        Assert.isTrue(toZip.exists(), "Supplied file or directory '%s' must exist", toZip);
+        
+        PathReference finalDest = determineFinalZipDestination(toZip, dest);    
+        
+        ZipOutputStream zos = null;
+        
+        try {
+            zos = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(finalDest.toFile())));       
+            doZip(zos, toZip.toFile(), toZip.toFile(), entryPrefix);
+        } finally {
+            if (zos != null) {
+                zos.close();
+            }
+        }
+        
+        return finalDest;
+    }
+    
+    @SuppressWarnings("unchecked")
+    private static PathReference unzipToFolder(PathReference zipFile, PathReference dest, boolean isDestructive) throws IOException {
+        Assert.isTrue(zipFile.exists(), "Supplied file '%s' must exist", zipFile);
+        PathReference finalDest = determineFinalUnzipDestination(zipFile, dest, isDestructive);
+        ZipFile zip = null;
+        try {
+            zip = new ZipFile(zipFile.toFile());
+            for (ZipEntry entry : new IterableEnumeration<ZipEntry>((Enumeration<ZipEntry>)zip.entries())) {
+                PathReference entryPath = finalDest.newChild(entry.getName());
+                if (entry.isDirectory()) {
+                    entryPath.createDirectory();
+                } else {
+                    PathReference filePath = entryPath.createFile();
+                    InputStream inputStream = zip.getInputStream(entry);
+                    FileCopyUtils.copy(inputStream, new FileOutputStream(filePath.toFile()));
+                }
+            }
+        } finally {
+            if (zip != null) {
+                zip.close();
+            }
+        }
+        return finalDest;
+    }
+    
+    private static void doZip(ZipOutputStream zos, File file, File root, String entryPrefix) throws IOException {
+        
+        byte[] data = new byte[BUFFER_SIZE];
+        
+        String entryName = determineNameOfEntry(file, root, entryPrefix);
+        
+        if (file.isDirectory()) {
+            
+            if (!file.equals(root)) {           
+                ZipEntry entry = new ZipEntry(entryName);
+                zos.putNextEntry(entry);
+                zos.closeEntry();
+            }
+            
+            for (File dirFile : FileSystemUtils.listFiles(file)) {
+                doZip(zos, dirFile, root, entryPrefix);
+            }
+        } else {
+            InputStream is = null;
+            try {
+                ZipEntry entry = new ZipEntry(entryName);
+                zos.putNextEntry(entry);
+    
+                is = new BufferedInputStream(new FileInputStream(file));
+                int count;
+                while ((count = is.read(data)) > 0) {
+                    zos.write(data, 0, count);
+                }
+                zos.closeEntry();
+            } finally {
+                if (is != null) {
+                    is.close();
+                }
+            }
+        }
+    }
+
+    private static String determineNameOfEntry(File file, File root, String entryPrefix) {
+        String fileName = file.getAbsolutePath().substring(root.getAbsolutePath().length());
+        String entryName;
+        if (entryPrefix == null) {
+            entryName = fileName;
+        } else {
+            entryName = entryPrefix + fileName;
+        }
+        
+        if (file.isDirectory() && ! entryName.endsWith("/")) {
+            entryName = entryName + "/";
+        }
+        
+        return entryName;
+    }
+    
+    private static PathReference determineFinalUnzipDestination(PathReference zipFile, PathReference dest, boolean isDestructive) {
+        PathReference finalDest = dest;
+        if (!dest.exists()) {
+            dest.createDirectory();
+        } else {
+            if (dest.isDirectory()) {
+            	if (isDestructive == true) {
+            		boolean isDeleted = dest.delete(true);
+            		if (!isDeleted) {
+            			throw new FatalIOException("Content of destination path '" + dest + "' cannot be removed");
+            		}
+            		dest.createDirectory();
+            	} else {
+            		String destDir = StringUtils.stripFilenameExtension(StringUtils.getFilename(zipFile.getName()));
+            		finalDest = dest.newChild(destDir).createDirectory();
+            	}
+            } else {
+                throw new FatalIOException("Destination path '" + dest + "' already exists and is not a directory");
+            }
+        }
+        return finalDest;
+    }
+    
+    private static PathReference determineFinalZipDestination(PathReference toZip, PathReference dest) {
+        if (dest.exists()) {
+            if (!dest.isDirectory()) {
+                throw new FatalIOException("Destination path '" + dest + "' already exists and is not a directory");
+            } else {
+                return dest.newChild(toZip.getName() + ZIP_FILENAME_SUFFIX);
+            }
+        } else {
+            return dest;
+        }
+    }
+  
+}
diff --git a/util/org.eclipse.virgo.util.io/src/main/resources/.gitignore b/util/org.eclipse.virgo.util.io/src/main/resources/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/util/org.eclipse.virgo.util.io/src/main/resources/.gitignore
diff --git a/util/org.eclipse.virgo.util.io/src/main/resources/about.html b/util/org.eclipse.virgo.util.io/src/main/resources/about.html
new file mode 100644
index 0000000..c258ef5
--- /dev/null
+++ b/util/org.eclipse.virgo.util.io/src/main/resources/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>June 5, 2006</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/util/org.eclipse.virgo.util.io/src/test/java/org/eclipse/virgo/util/io/FatalIOExceptionTests.java b/util/org.eclipse.virgo.util.io/src/test/java/org/eclipse/virgo/util/io/FatalIOExceptionTests.java
new file mode 100644
index 0000000..c6c3221
--- /dev/null
+++ b/util/org.eclipse.virgo.util.io/src/test/java/org/eclipse/virgo/util/io/FatalIOExceptionTests.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * This file is part of the Virgo Web Server.
+ *
+ * Copyright (c) 2010 Eclipse Foundation.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    SpringSource, a division of VMware - initial API and implementation and/or initial documentation
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.io;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+/**
+ * Test {@link FatalIOException} basic minimum needs.
+ * 
+ * @author Steve Powell
+ */
+public class FatalIOExceptionTests {
+
+    @Test
+    public void testFataIOExceptionType() {
+        FatalIOException fioe = new FatalIOException("test");
+        assertTrue("FatalIOException is not a RuntimeException - it must be unchecked.", RuntimeException.class.isAssignableFrom(fioe.getClass()));
+    }
+
+    @Test
+    public void testFataIOExceptionState() {
+        Exception cause = new Exception("cause");
+        FatalIOException fioe = new FatalIOException("test", cause);
+        assertEquals("Cause not preserved.", cause, fioe.getCause());
+        assertEquals("Message not preserved.", "test", fioe.getMessage());
+    }
+
+}
diff --git a/util/org.eclipse.virgo.util.io/src/test/java/org/eclipse/virgo/util/io/FileCopyUtilsTests.java b/util/org.eclipse.virgo.util.io/src/test/java/org/eclipse/virgo/util/io/FileCopyUtilsTests.java
new file mode 100644
index 0000000..9caef88
--- /dev/null
+++ b/util/org.eclipse.virgo.util.io/src/test/java/org/eclipse/virgo/util/io/FileCopyUtilsTests.java
@@ -0,0 +1,111 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.io;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.util.Arrays;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Unit tests for the FileCopyUtils class.
+ *
+ */
+public class FileCopyUtilsTests {
+
+    private final static File testDir = new File(new File("build"), "testFileCopyUtils");
+
+    @Before
+    @After
+    public void resetTestDir() {
+        FileSystemUtils.deleteRecursively(testDir);
+        testDir.mkdirs();
+    }
+
+    @Test
+    public void testCopyByteArrayToAndFromFile() throws Exception {
+        byte[] content = "content".getBytes(UTF_8);
+        File out = new File(testDir, "testByteArrayOut");
+        FileCopyUtils.copy(content, out);
+
+        assertTrue("File not the same length (" + content.length + ") as content (" + out.length() + ")", content.length == out.length());
+
+        byte[] inBytes = FileCopyUtils.copyToByteArray(out);
+
+        assertArrayEquals("Copy out and copy in not the same!", content, inBytes);
+    }
+
+    @Test
+    public void testCopyFromInputStream() throws IOException {
+        byte[] content = "content".getBytes(UTF_8);
+        ByteArrayInputStream in = new ByteArrayInputStream(content);
+        ByteArrayOutputStream out = new ByteArrayOutputStream(content.length);
+        int count = FileCopyUtils.copy(in, out);
+        assertEquals(content.length, count);
+        assertTrue(Arrays.equals(content, out.toByteArray()));
+    }
+
+    @Test
+    public void testCopyFromByteArray() throws IOException {
+        byte[] content = "content".getBytes(UTF_8);
+        ByteArrayOutputStream out = new ByteArrayOutputStream(content.length);
+        FileCopyUtils.copy(content, out);
+        assertTrue(Arrays.equals(content, out.toByteArray()));
+    }
+
+    @Test
+    public void testCopyToByteArray() throws IOException {
+        byte[] content = "content".getBytes(UTF_8);
+        ByteArrayInputStream in = new ByteArrayInputStream(content);
+        byte[] result = FileCopyUtils.copyToByteArray(in);
+        assertTrue(Arrays.equals(content, result));
+    }
+
+    @Test
+    public void testCopyFromReader() throws IOException {
+        String content = "content";
+        StringReader in = new StringReader(content);
+        StringWriter out = new StringWriter();
+        int count = FileCopyUtils.copy(in, out);
+        assertEquals(content.length(), count);
+        assertEquals(content, out.toString());
+    }
+
+    @Test
+    public void testCopyFromString() throws IOException {
+        String content = "content";
+        StringWriter out = new StringWriter();
+        FileCopyUtils.copy(content, out);
+        assertEquals(content, out.toString());
+    }
+
+    @Test
+    public void testCopyToString() throws IOException {
+        String content = "content";
+        StringReader in = new StringReader(content);
+        String result = FileCopyUtils.copyToString(in);
+        assertEquals(content, result);
+    }
+
+}
diff --git a/util/org.eclipse.virgo.util.io/src/test/java/org/eclipse/virgo/util/io/FileSystemCheckerTests.java b/util/org.eclipse.virgo.util.io/src/test/java/org/eclipse/virgo/util/io/FileSystemCheckerTests.java
new file mode 100644
index 0000000..89924a5
--- /dev/null
+++ b/util/org.eclipse.virgo.util.io/src/test/java/org/eclipse/virgo/util/io/FileSystemCheckerTests.java
@@ -0,0 +1,512 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.io;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.eclipse.virgo.util.io.StubLogger.StubLogEntry;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ */
+public class FileSystemCheckerTests {
+
+    private final File checkDir = new File("build", "work");
+
+    @Before
+    public void createDir() {
+        if (this.checkDir.exists()) {
+            deleteRecursively(this.checkDir);
+        }
+        this.checkDir.mkdir();
+    }
+
+    @After
+    public void deleteDir() {
+        deleteRecursively(this.checkDir);
+    }
+
+    private void deleteRecursively(File path) {
+        FileSystemUtils.deleteRecursively(path);
+    }
+
+    @Test
+    public void newFile() throws Exception {
+        final String fileName = "new.txt";
+        FileSystemChecker checker = new FileSystemChecker(this.checkDir);
+        final AtomicBoolean eventReceived = new AtomicBoolean(false);
+        checker.addListener(new FileSystemListener() {
+
+            @Override
+            public void onChange(String file, FileSystemEvent event) {
+                if (file.endsWith(fileName) && FileSystemEvent.CREATED.equals(event)) {
+                    eventReceived.set(true);
+                }
+            }
+
+            @Override
+            public void onInitialEvent(List<String> paths) {
+            }
+
+        });
+        File newFile = new File(this.checkDir, fileName);
+        newFile.createNewFile();
+        // First call finds the new file
+        checker.check();
+        assertFalse("Unexpected CREATED event.", eventReceived.get());
+        // Second call sees that file size hasn't changed and notifies the listener
+        checker.check();
+        assertTrue("Expected CREATED event.", eventReceived.get());
+        // Third call sees no changes
+        eventReceived.set(false); // reset flag
+        checker.check();
+        assertFalse("Unexpected CREATED event.", eventReceived.get());
+    }
+
+    @Test
+    public void newFileWithFilter() throws Exception {
+        final String fileName = "new.jar";
+        FileSystemChecker checker = new FileSystemChecker(this.checkDir, ".*\\.txt");
+        final AtomicBoolean eventReceived = new AtomicBoolean(false);
+        checker.addListener(new FileSystemListener() {
+
+            @Override
+            public void onChange(String file, FileSystemEvent event) {
+                if (file.endsWith(fileName) && FileSystemEvent.CREATED.equals(event)) {
+                    eventReceived.set(true);
+                }
+            }
+
+            @Override
+            public void onInitialEvent(List<String> paths) {
+            }
+
+        });
+        File newFile = new File(this.checkDir, fileName);
+        newFile.createNewFile();
+        // First call finds the new file
+        checker.check();
+        assertFalse("Unexpected CREATED event.", eventReceived.get());
+        // Second call sees that file size hasn't changed and notifies the listener
+        checker.check();
+        assertTrue("Expected CREATED event.", eventReceived.get());
+        // Third call sees no changes
+        eventReceived.set(false); // reset flag
+        checker.check();
+        assertFalse("Unexpected CREATED event.", eventReceived.get());
+    }
+
+    @Test
+    public void newFileWithFilterNoMatch() throws Exception {
+        final String fileName = "new.txt";
+        FileSystemChecker checker = new FileSystemChecker(this.checkDir, ".*\\.txt");
+        final AtomicBoolean eventReceived = new AtomicBoolean(false);
+        checker.addListener(new FileSystemListener() {
+
+            @Override
+            public void onChange(String file, FileSystemEvent event) {
+                if (file.endsWith(fileName) && FileSystemEvent.CREATED.equals(event)) {
+                    eventReceived.set(true);
+                }
+            }
+
+            @Override
+            public void onInitialEvent(List<String> paths) {
+            }
+        });
+        File newFile = new File(this.checkDir, fileName);
+        newFile.createNewFile();
+        // First call finds the new file
+        checker.check();
+        assertFalse("Unexpected CREATED event.", eventReceived.get());
+        // Second call sees that file size hasn't changed
+        checker.check();
+        assertFalse("Unexpected CREATED event.", eventReceived.get());
+        // Third call sees no changes
+        eventReceived.set(false); // reset flag
+        checker.check();
+        assertFalse("Unexpected CREATED event.", eventReceived.get());
+    }
+
+    @Test
+    public void updateFile() throws Exception {
+        final String fileName = "update.txt";
+        FileSystemChecker checker = new FileSystemChecker(this.checkDir);
+        final AtomicBoolean eventReceived = new AtomicBoolean(false);
+        checker.addListener(new FileSystemListener() {
+
+            @Override
+            public void onChange(String file, FileSystemEvent event) {
+                if (file.endsWith(fileName) && FileSystemEvent.MODIFIED.equals(event)) {
+                    eventReceived.set(true);
+                }
+            }
+
+            @Override
+            public void onInitialEvent(List<String> paths) {
+            }
+        });
+        File updateFile = new File(this.checkDir, fileName);
+        updateFile.createNewFile();
+        // First call triggers monitoring of the file
+        checker.check();
+        // Second call triggers CREATED notification
+        checker.check();
+        updateFile.setLastModified(System.currentTimeMillis() + 1000);
+        // Third call sees that last modified has changed and starts monitoring the file
+        checker.check();
+        // Fourth call sees that last modified is unchanged and triggers MODIFIED event
+        checker.check();
+        assertTrue("Expected MODIFIED event.", eventReceived.get());
+        // Fifth call is quiet
+        eventReceived.set(false); // reset flag
+        checker.check();
+        assertFalse("Unexpected MODIFIED event.", eventReceived.get());
+    }
+
+    /**
+     * Instrumented {@link FileSystemListener} to listen for all {@link FileSystemEvent}s for a specific file
+     * <p />
+     * 
+     * <strong>Concurrent Semantics</strong><br />
+     * thread safe
+     * 
+     */
+    private final class TestFileSystemListener implements FileSystemListener {
+
+        private final String fileName;
+
+        private final AtomicInteger eA;
+
+        private final AtomicInteger eI;
+
+        private final AtomicInteger eC;
+
+        private final AtomicInteger eD;
+
+        private final AtomicInteger eM;
+
+        public TestFileSystemListener(String fileName, int all, int ini, int cre, int del, int mod) {
+            this.fileName = fileName;
+            this.eA = new AtomicInteger(all);
+            this.eI = new AtomicInteger(ini);
+            this.eC = new AtomicInteger(cre);
+            this.eD = new AtomicInteger(del);
+            this.eM = new AtomicInteger(mod);
+        }
+
+        @Override
+        public void onChange(String file, FileSystemEvent event) {
+            if (file.endsWith(this.fileName)) {
+                this.eA.incrementAndGet(); // count all notifications for this file
+                switch (event) {
+                    case INITIAL:
+                        this.eI.incrementAndGet();
+                        break;
+                    case CREATED:
+                        this.eC.incrementAndGet();
+                        break;
+                    case DELETED:
+                        this.eD.incrementAndGet();
+                        break;
+                    case MODIFIED:
+                        this.eM.incrementAndGet();
+                        break;
+                }
+            }
+        }
+
+        @Override
+        public void onInitialEvent(List<String> paths) {
+        }
+
+        public boolean checkEvents(int all, int ini, int cre, int del, int mod) {
+            return all == this.eA.get() && ini == this.eI.get() && cre == this.eC.get() && del == this.eD.get() && mod == this.eM.get();
+        }
+    }
+
+    @Test
+    public void complexUpdateFile() throws Exception {
+        FileSystemChecker checker = new FileSystemChecker(this.checkDir);
+
+        final String updFileName = "fileToUpdate.txt";
+        final String delFileName = "fileToDelete.txt";
+
+        File delFile = new File(this.checkDir, delFileName);
+        delFile.createNewFile();
+
+        TestFileSystemListener tlUpd = new TestFileSystemListener(updFileName, 0, 0, 0, 0, 0);
+        TestFileSystemListener tlDel = new TestFileSystemListener(delFileName, 0, 0, 0, 0, 0);
+
+        checker.addListener(tlUpd);
+        checker.addListener(tlDel);
+
+        File updateFile = new File(this.checkDir, updFileName);
+        updateFile.createNewFile();
+
+        // First call triggers monitoring of the file
+        checker.check();
+        assertTrue("Unexpected notifications on first check for update file", tlUpd.checkEvents(0, 0, 0, 0, 0));
+        assertTrue("Unexpected notifications on first check for delete file", tlDel.checkEvents(0, 0, 0, 0, 0));
+
+        delFile.delete();
+
+        // Second call triggers CREATED notification
+        checker.check();
+        assertTrue("Unexpected notifications on second check for update file", tlUpd.checkEvents(1, 0, 1, 0, 0));
+        assertTrue("Unexpected notifications on second check for delete file", tlDel.checkEvents(0, 0, 0, 0, 0));
+
+        // Third call sees that last modified has changed and starts monitoring the file
+        updateFile.setLastModified(System.currentTimeMillis() + 1000);
+        checker.check();
+        assertTrue("Unexpected notifications on third check for update file", tlUpd.checkEvents(1, 0, 1, 0, 0));
+
+        // Fourth call sees that last modified is unchanged and triggers MODIFIED event
+        checker.check();
+        assertTrue("Unexpected notifications on fourth check for update file", tlUpd.checkEvents(2, 0, 1, 0, 1));
+
+        // Fifth call is quiet
+        checker.check();
+        assertTrue("Unexpected notifications on fifth check for update file", tlUpd.checkEvents(2, 0, 1, 0, 1));
+    }
+
+    @Test
+    public void deleteFile() throws Exception {
+        final String fileName = "delete.txt";
+        FileSystemChecker checker = new FileSystemChecker(this.checkDir);
+
+        TestFileSystemListener delListener = new TestFileSystemListener(fileName, 0, 0, 0, 0, 0);
+        checker.addListener(delListener);
+
+        File deleteFile = new File(this.checkDir, fileName);
+        deleteFile.createNewFile();
+
+        checker.check();
+        checker.check();
+        assertTrue("Expected CREATED event.", delListener.checkEvents(1, 0, 1, 0, 0));
+
+        deleteFile.delete();
+        checker.check();
+        assertTrue("Expected DELETED event.", delListener.checkEvents(2, 0, 1, 1, 0));
+    }
+
+    @Test
+    public void initialState() throws Exception {
+        new File(this.checkDir, "a.txt").createNewFile();
+        new File(this.checkDir, "b.txt").createNewFile();
+        FileSystemChecker checker = new FileSystemChecker(this.checkDir);
+        final AtomicInteger initialEvents = new AtomicInteger(0);
+        checker.addListener(new FileSystemListener() {
+
+            @Override
+            public void onChange(String file, FileSystemEvent event) {
+                if (FileSystemEvent.INITIAL.equals(event)) {
+                    initialEvents.incrementAndGet();
+                }
+            }
+
+            @Override
+            public void onInitialEvent(List<String> paths) {
+            }
+        });
+        checker.check();
+        assertEquals("Expected 2 INITIAL events", 2, initialEvents.get());
+
+        checker.check();
+        assertEquals("Too many INITIAL events", 2, initialEvents.get());
+    }
+
+    @Test
+    public void initialStateDebug() throws Exception {
+        StubLogger stubLogger = new StubLogger();
+        new File(this.checkDir, "a.txt").createNewFile();
+        new File(this.checkDir, "b.txt").createNewFile();
+        FileSystemChecker checker = new FileSystemChecker(this.checkDir, stubLogger);
+        final AtomicInteger initialEvents = new AtomicInteger(0);
+        checker.addListener(new FileSystemListener() {
+
+            @Override
+            public void onChange(String file, FileSystemEvent event) {
+                if (FileSystemEvent.INITIAL.equals(event)) {
+                    initialEvents.incrementAndGet();
+                }
+            }
+
+            @Override
+            public void onInitialEvent(List<String> paths) {
+            }
+        });
+        checker.check();
+        assertEquals("Expected 2 INITIAL events", 2, initialEvents.get());
+
+        checker.check();
+        assertEquals("Too many INITIAL events", 2, initialEvents.get());
+
+        List<StubLogEntry> entries = stubLogger.getEntries();
+        assertTrue("There should be five states debugged.", 5 == entries.size());
+
+        String initialStateHeader = "work - initial state:";
+        String beforeStateHeader = "work - before check:";
+        String afterStateHeader = "work - after check:";
+
+        assertTrue("Initial state not output in correct place.", entries.get(0).getString().contains(initialStateHeader));
+        assertTrue("Initial state not reporting a.txt and b.txt files.", entries.get(0).getString().contains("FileList():  [a.txt, b.txt]")
+            || entries.get(0).getString().contains("FileList():  [b.txt, a.txt]"));
+        assertTrue("Before state not output in correct place.", entries.get(1).getString().contains(beforeStateHeader));
+        assertTrue("Before state not reporting a.txt and b.txt files.", entries.get(1).getString().contains("FileList():  [a.txt, b.txt]")
+            || entries.get(1).getString().contains("FileList():  [b.txt, a.txt]"));
+        assertTrue("After state not output in correct place.", entries.get(2).getString().contains(afterStateHeader));
+        assertTrue("Before state not output in correct place.", entries.get(3).getString().contains(beforeStateHeader));
+        assertTrue("Before state not reporting a.txt and b.txt files.", entries.get(3).getString().contains("FileList():  [a.txt, b.txt]")
+            || entries.get(3).getString().contains("FileList():  [b.txt, a.txt]"));
+        assertTrue("After state not output in correct place.", entries.get(4).getString().contains(afterStateHeader));
+
+        // for (StubLogEntry sle : entries) {
+        // System.out.println(sle);
+        // }
+    }
+
+    @Test
+    public void onInitialEventTest() throws Exception {
+        try {
+            // enables onInitialFSChanges notifications
+            System.setProperty("org.eclipse.virgo.fschecker.initialEventMode", "bulk");
+            File f1 = new File(this.checkDir, "a.txt");
+            File f2 = new File(this.checkDir, "b.txt");
+            f1.createNewFile();
+            f2.createNewFile();
+            final AtomicInteger onChangeEventsCounter = new AtomicInteger(0);
+            final AtomicInteger onInitialEventsCounter = new AtomicInteger(0);
+            final AtomicBoolean eventFilesCheckFlag = new AtomicBoolean(true);
+            FileSystemChecker checker = new FileSystemChecker(this.checkDir);
+            checker.addListener(new FileSystemListener() {
+
+                @Override
+                public void onChange(String file, FileSystemEvent event) {
+                    onChangeEventsCounter.incrementAndGet();
+                }
+
+                @Override
+                public void onInitialEvent(List<String> paths) {
+                    onInitialEventsCounter.incrementAndGet();
+                    if (paths.size() == 2) {
+                        for (String s : paths) {
+                            if (!(s.endsWith("a.txt") || s.endsWith("b.txt"))) {
+                                eventFilesCheckFlag.set(false);
+                            }
+                        }
+                    } else {
+                        eventFilesCheckFlag.set(false);
+                    }
+                }
+
+            });
+            checker.check();
+            assertEquals("Expected only 1 onInitialEvent event for the 2 files:", 1, onInitialEventsCounter.get());
+            assertTrue("Expected onInitialFSChanges event for 2 files - a.txt and b.txt:", eventFilesCheckFlag.get());
+            assertEquals("Expected no onChange events:", 0, onChangeEventsCounter.get());
+            onInitialEventsCounter.set(0);
+            onChangeEventsCounter.set(0);
+            Thread.sleep(1000); // give the test chance to recognise the changed files
+            f1.setLastModified(System.currentTimeMillis());
+            f2.setLastModified(System.currentTimeMillis());
+            checker.check();// here only marked for monitoring
+            checker.check();// onChange events
+            assertEquals("Expected no new onInitialEvent events:", 0, onInitialEventsCounter.get());
+            assertEquals("Expected 2 onChange event for the 2 updated files:", 2, onChangeEventsCounter.get());
+            onInitialEventsCounter.set(0);
+            onChangeEventsCounter.set(0);
+
+            new File(this.checkDir, "c.txt").createNewFile();
+            checker.check();// here only marked for monitoring
+            checker.check();// onChange events
+            assertEquals("Expected no new onInitialEvent events:", 0, onInitialEventsCounter.get());
+            assertEquals("Expected 1 onChange event for the new file:", 1, onChangeEventsCounter.get());
+            onInitialEventsCounter.set(0);
+            onChangeEventsCounter.set(0);
+
+            createDir(); // clear dir
+            checker.check();
+            assertEquals("Expected no new onInitialEvent events:", 0, onInitialEventsCounter.get());
+            assertEquals("Expected 3 onChange events for the 3 deleted files:", 3, onChangeEventsCounter.get());
+
+        } finally {
+            System.setProperty("org.eclipse.virgo.fschecker.initialEventMode", "singular");
+        }
+    }
+    
+    private static class RecursiveTestFileSystemListener implements FileSystemListener {
+    	private int callCounter = 0;
+    	private String filename;
+    	
+    	public RecursiveTestFileSystemListener(String filename) {
+			this.filename = filename;
+		}
+
+		@Override
+		public void onChange(String path, FileSystemEvent event) {
+			if (path.endsWith(filename)) {
+				if (FileSystemEvent.INITIAL == event || FileSystemEvent.CREATED == event) {				
+					try {
+						File file = new File(path);
+						file.setLastModified(System.currentTimeMillis() + 1000);
+					} catch (Exception e) {
+						e.printStackTrace();
+					}
+				}
+				callCounter++;
+			}
+		}
+
+		@Override
+		public void onInitialEvent(List<String> paths) {	
+		}
+    	
+    	public int getCallCounter() {
+    		return callCounter;
+    	}
+    }
+    
+    @Test
+    public void updateFileDuringHandling() throws Exception {
+    	FileSystemChecker checker = new FileSystemChecker(this.checkDir);
+        final String updFileName = "fileToUpdate.txt";
+        
+        RecursiveTestFileSystemListener listener = new RecursiveTestFileSystemListener(updFileName);
+        
+        checker.addListener(listener);
+
+        File updateFile = new File(this.checkDir, updFileName);
+        updateFile.createNewFile();
+        
+        checker.check();
+        assertEquals("Expected 0 call to the listener", 0, listener.getCallCounter());
+        
+        checker.check();
+        assertEquals("Expected 1 call to the listener", 1, listener.getCallCounter());
+        
+        checker.check();
+        assertEquals("Expected 1 call to the listener", 1, listener.getCallCounter());
+        
+        checker.check();
+        assertEquals("Expected 2 calls to the listener", 2, listener.getCallCounter());
+    }
+}
diff --git a/util/org.eclipse.virgo.util.io/src/test/java/org/eclipse/virgo/util/io/FileSystemUtilsTests.java b/util/org.eclipse.virgo.util.io/src/test/java/org/eclipse/virgo/util/io/FileSystemUtilsTests.java
new file mode 100644
index 0000000..41f8837
--- /dev/null
+++ b/util/org.eclipse.virgo.util.io/src/test/java/org/eclipse/virgo/util/io/FileSystemUtilsTests.java
@@ -0,0 +1,198 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.io;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.io.FilenameFilter;
+import java.io.IOException;
+
+import org.eclipse.virgo.util.io.FileSystemUtils;
+import org.junit.Test;
+
+
+/**
+ */
+public class FileSystemUtilsTests {
+
+    @Test
+    public void testDeleteRecursively() throws IOException {
+        File f = new File("build/work");
+        f.mkdir();
+        assertTrue(f.exists());
+        
+        File e = new File(f.getAbsolutePath() + File.separator + "file.txt");
+        e.createNewFile();
+        assertTrue(e.exists());
+        
+        File m = new File(f.getAbsolutePath() + File.separator + "dir");
+        m.mkdir();
+        assertTrue(m.exists());
+        
+        assertTrue(FileSystemUtils.deleteRecursively(f));
+        assertFalse(f.exists());
+        
+        assertTrue(FileSystemUtils.deleteRecursively("build/work"));
+        assertFalse(f.exists());
+    }
+    
+    @Test
+    public void testCreateDirectoryIfNecessary() {
+    	String path = FileSystemUtils.createDirectoryIfNecessary("build/work/test");
+
+    	File f = new File(path);
+
+    	assertTrue(f.exists());
+        String path2 = FileSystemUtils.createDirectoryIfNecessary("build/work/test");
+        assertEquals("Shouldn't have a different path if recreated unnecessarily", path, path2);
+        
+        assertTrue("File doesn't exist when created 'twice'.", f.exists());
+        
+        FileSystemUtils.deleteRecursively(f);
+    }
+    
+    @Test
+    public void testListFilesEmpty() {
+        String path = FileSystemUtils.createDirectoryIfNecessary("build/work/testList");
+        File f = new File(path);
+        assertTrue(f.exists());
+        
+        String[] filenames = FileSystemUtils.list(f);
+        assertTrue("list(f) returned null!", filenames!=null);
+        assertTrue("Array of names of empty directory not zero length.", filenames.length==0);
+
+        File[] files = FileSystemUtils.listFiles(f);
+        assertTrue("listFiles(f) returned null!", files!=null);
+        assertTrue("Array of files of empty directory not zero length.", files.length==0);
+    }
+
+    @Test
+    public void testListFilesNonEmpty() throws IOException {
+        String path = FileSystemUtils.createDirectoryIfNecessary("build/work/testList2");
+        File f = new File(path);
+        assertTrue(f.exists());
+        
+        new File(f.getAbsolutePath() + File.separator + "file1.txt").createNewFile();
+        new File(f.getAbsolutePath() + File.separator + "file2.txt").createNewFile();
+        
+        String[] filenames = FileSystemUtils.list(f);
+        assertTrue("list(f) returned null!", filenames!=null);
+        assertTrue("Array of names of directory not length 2.", filenames.length==2);
+
+        assertStringsInArray(filenames, "file1.txt", "file2.txt");
+        
+        String[] filteredFilenames = FileSystemUtils.list(f, new FilenameFilter(){
+            public boolean accept(File dir, String name) {
+                return (name.equals("file1.txt"));
+            }});
+        assertTrue("list(f) returned null!", filteredFilenames!=null);
+        assertTrue("Array of names of directory not length 1.", filteredFilenames.length==1);
+
+        assertStringsInArray(filteredFilenames, "file1.txt");
+        
+        File[] files = FileSystemUtils.listFiles(f);
+        assertTrue("listFiles(f) returned null!", files!=null);
+        assertTrue("Array of files of directory not length 2.", files.length==2);
+
+        assertFilesInArray(files, "file1.txt", "file2.txt");
+        
+        File[] filteredFiles = FileSystemUtils.listFiles(f, new FilenameFilter(){
+            public boolean accept(File dir, String name) {
+                return (name.equals("file1.txt"));
+            }});
+        assertTrue("listFiles(f) returned null!", filteredFiles!=null);
+        assertTrue("Array of files of directory not length 1.", filteredFiles.length==1);
+
+        assertFilesInArray(filteredFiles, "file1.txt");
+    }
+
+    private static void assertStringsInArray(String[] filenames, String ... strings) {
+        assertTrue("Strings " + String.valueOf(strings) + " not all found in array " + String.valueOf(filenames) + ".", allStringsInArray(filenames, strings));
+    }
+
+    private static boolean allStringsInArray(String[] stringArray, String[] strings) {
+        for (String s : strings) {
+            boolean found = false;
+            for (String as : stringArray) {
+                if (as.equals(s)) {
+                    found = true;
+                    break;
+                }
+            }
+            if (!found) return false;
+        }
+        return true;
+    }
+
+    private static void assertFilesInArray(File[] files, String ... strings) {
+        assertTrue("Strings " + String.valueOf(strings) + " not all found in array " + String.valueOf(files) + ".", allFilesInArray(files, strings));
+    }
+
+    private static boolean allFilesInArray(File[] fileArray, String[] strings) {
+        for (String s : strings) {
+            boolean found = false;
+            for (File as : fileArray) {
+                if (as.getName().equals(s)) {
+                    found = true;
+                    break;
+                }
+            }
+            if (!found) return false;
+        }
+        return true;
+    }
+
+    @Test
+    public void testListFilesFiltered() throws IOException {
+        String path = FileSystemUtils.createDirectoryIfNecessary("build/work/testList3");
+        File f = new File(path);
+        assertTrue(f.exists());
+        
+        new File(f.getAbsolutePath() + File.separator + "file1.txt").createNewFile();
+        new File(f.getAbsolutePath() + File.separator + "file2.txt").createNewFile();
+        
+        File[] filteredFiles = FileSystemUtils.listFiles(f, new FileFilter(){
+            public boolean accept(File pathname) {
+                return (pathname.getName().equals("file2.txt"));
+            }});
+        assertTrue("listFiles(f) returned null!", filteredFiles!=null);
+        assertTrue("Array of files of directory not length 1.", filteredFiles.length==1);
+
+        assertFilesInArray(filteredFiles, "file2.txt");
+    }
+
+    @Test
+    public void testListFilesNonExists() {
+        String path = "build/work/testListNoDir";
+        File f = new File(path);
+        assertFalse(f.exists());
+        
+        try {
+            FileSystemUtils.list(f);
+            assertTrue("list(f) did not throw an exception!", false);
+        } catch (FatalIOException ioe) {
+            //ok
+        }
+
+        try {
+            FileSystemUtils.listFiles(f);
+            assertTrue("listFiles(f) did not throw an exception!", false);
+        } catch (FatalIOException ioe) {
+            //ok
+        }
+    }
+
+}
diff --git a/util/org.eclipse.virgo.util.io/src/test/java/org/eclipse/virgo/util/io/IOUtilsTests.java b/util/org.eclipse.virgo.util.io/src/test/java/org/eclipse/virgo/util/io/IOUtilsTests.java
new file mode 100644
index 0000000..ad585fa
--- /dev/null
+++ b/util/org.eclipse.virgo.util.io/src/test/java/org/eclipse/virgo/util/io/IOUtilsTests.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * This file is part of the Virgo Web Server.
+ *
+ * Copyright (c) 2010 Eclipse Foundation.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    SpringSource, a division of VMware - initial API and implementation and/or initial documentation
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.io;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.nio.channels.FileChannel;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Test {@link IOUtils}.
+ * 
+ * @author Steve Powell
+ */
+public class IOUtilsTests {
+
+    private static final File testDir = new File("build/testio");
+
+    @Before
+    @After
+    public void setClearDir() {
+        FileSystemUtils.deleteRecursively(testDir);
+        testDir.mkdirs();
+    }
+
+    @Test
+    public void testCloseQuietly() throws IOException {
+        File file = new File(testDir, "closeQuietly.txt");
+        assertTrue("Cannot not create test file", file.createNewFile());
+
+        try (FileInputStream fis = new FileInputStream(file)) {
+            FileChannel fc = fis.getChannel();
+            assertEquals(-1, fis.read());
+            IOUtils.closeQuietly(fis);
+            assertFalse("Channel should have been closed", fc.isOpen());
+        }
+    }
+}
diff --git a/util/org.eclipse.virgo.util.io/src/test/java/org/eclipse/virgo/util/io/JarTransformerTests.java b/util/org.eclipse.virgo.util.io/src/test/java/org/eclipse/virgo/util/io/JarTransformerTests.java
new file mode 100644
index 0000000..12f7151
--- /dev/null
+++ b/util/org.eclipse.virgo.util.io/src/test/java/org/eclipse/virgo/util/io/JarTransformerTests.java
@@ -0,0 +1,208 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.io;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.BufferedReader;
+import java.io.ByteArrayOutputStream;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+import java.util.jar.JarOutputStream;
+import java.util.zip.ZipEntry;
+
+import org.eclipse.virgo.util.io.JarTransformer.JarTransformerCallback;
+import org.junit.Test;
+
+public class JarTransformerTests {
+
+    @Test
+    public void testNoOpTransform() throws Exception {
+        String inPath = "src/test/resources/simple-manifest-only.jar";
+        String outPath = "build/testNoOpTransform.jar";
+
+        JarTransformer jt = new JarTransformer(new NoOpJarTransformerCallback());
+        FileInputStream inStream = null;
+        FileOutputStream outStream = null;
+        try {
+            inStream = new FileInputStream(inPath);
+            outStream = new FileOutputStream(outPath);
+            jt.transform(inStream, outStream);
+
+            JarFile jarFile = new JarFile(inPath);
+            JarFile transformed = new JarFile(outPath);
+
+            assertJarsSame(jarFile, transformed, true);
+        } finally {
+            IOUtils.closeQuietly(inStream);
+            IOUtils.closeQuietly(outStream);
+        }
+    }
+
+    @Test
+    public void testSimpleManifestTweak() throws Exception {
+        String inPath = "src/test/resources/simple-manifest-only.jar";
+        String outPath = "build/testSimpleManifestTweak.jar";
+
+        JarTransformer jt = new JarTransformer(new JarTransformer.JarTransformerCallback() {
+
+            public boolean transformEntry(String entryName, InputStream is, JarOutputStream jos) throws IOException {
+                if ("META-INF/MANIFEST.MF".equals(entryName)) {
+                    jos.putNextEntry(new ZipEntry(entryName));
+                    BufferedReader reader = new BufferedReader(new InputStreamReader(is, UTF_8));
+                    Writer writer = new OutputStreamWriter(jos);
+                    String line;
+                    while ((line = reader.readLine()) != null) {
+                        if (line.trim().length() > 0) {
+                            writer.write(line);
+                            writer.write("\n");
+                        }
+                    }
+                    writer.write("My-Header: test.value\n");
+                    writer.flush();
+                    jos.closeEntry();
+                    return true;
+                } else {
+                    return false;
+                }
+            }
+
+        });
+        FileInputStream inStream = null;
+        FileOutputStream outStream = null;
+        try {
+            inStream = new FileInputStream(inPath);
+            outStream = new FileOutputStream(outPath);
+            jt.transform(inStream, outStream);
+
+            JarFile jarFile = new JarFile(inPath);
+            JarFile transformed = new JarFile(outPath);
+
+            assertJarsSame(jarFile, transformed, true);
+            String value = transformed.getManifest().getMainAttributes().getValue("My-Header");
+            assertEquals("test.value", value);
+        } finally {
+            IOUtils.closeQuietly(inStream);
+            IOUtils.closeQuietly(outStream);
+        }
+    }
+
+    @Test
+    public void ensurePresenceOfManifest() throws Exception {
+        String inPath = "src/test/resources/jars/no-manifest.jar";
+        String outPath = "build/ensurePresenceOfManifest.jar";
+
+        final List<String> transformedEntries = new ArrayList<String>();
+
+        JarTransformer jt = new JarTransformer(new JarTransformerCallback() {
+
+            public boolean transformEntry(String entryName, InputStream is, JarOutputStream os) throws IOException {
+                transformedEntries.add(entryName);
+                return false;
+            }
+        });
+
+        FileInputStream inStream = null;
+        FileOutputStream outStream = null;
+        FileInputStream inStream2 = null;
+        FileOutputStream outStream2 = null;
+        try {
+            inStream = new FileInputStream(inPath);
+            outStream = new FileOutputStream(outPath);
+            jt.transform(inStream, outStream, false);
+
+            JarFile transformed = new JarFile(outPath);
+            assertNull(transformed.getManifest());
+            assertEquals(1, transformedEntries.size());
+            assertFalse(transformedEntries.contains(JarFile.MANIFEST_NAME));
+            transformed.close();
+
+            transformedEntries.clear();
+
+            inStream2 = new FileInputStream(inPath);
+            outStream2 = new FileOutputStream(outPath);
+            jt.transform(inStream2, outStream2, true);
+
+            transformed = new JarFile(outPath);
+            assertNotNull(transformed.getManifest());
+            assertEquals(2, transformedEntries.size());
+            assertTrue(transformedEntries.contains(JarFile.MANIFEST_NAME));
+            transformed.close();
+        } finally {
+            IOUtils.closeQuietly(inStream);
+            IOUtils.closeQuietly(outStream);
+            IOUtils.closeQuietly(inStream2);
+            IOUtils.closeQuietly(outStream2);
+        }
+    }
+
+    private void assertJarsSame(JarFile a, JarFile b, boolean checkContent) throws IOException {
+        List<JarEntry> aEntries = getEntries(a);
+        List<JarEntry> bEntries = getEntries(b);
+
+        assertEquals(aEntries.size(), bEntries.size());
+        for (int x = 0; x < aEntries.size(); x++) {
+            JarEntry ea = aEntries.get(x);
+            JarEntry eb = bEntries.get(x);
+            assertEquals(ea.getName(), eb.getName());
+
+            if (checkContent) {
+                try (InputStream ia = a.getInputStream(ea); InputStream ib = a.getInputStream(eb);) {
+                    assertTrue(Arrays.equals(readAll(ia), readAll(ib)));
+                }
+            }
+        }
+    }
+
+    private byte[] readAll(InputStream is) throws IOException {
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        byte[] buffer = new byte[1024 * 16];
+        int read;
+        while ((read = is.read(buffer)) > 0) {
+            bos.write(buffer, 0, read);
+        }
+        return bos.toByteArray();
+    }
+
+    private List<JarEntry> getEntries(JarFile f) {
+        List<JarEntry> out = new ArrayList<JarEntry>();
+        Enumeration<JarEntry> entries = f.entries();
+        while (entries.hasMoreElements()) {
+            out.add(entries.nextElement());
+        }
+        return out;
+    }
+
+    private static class NoOpJarTransformerCallback implements JarTransformerCallback {
+
+        public boolean transformEntry(String entryName, InputStream is, JarOutputStream jos) {
+            return false;
+        }
+
+    }
+}
diff --git a/util/org.eclipse.virgo.util.io/src/test/java/org/eclipse/virgo/util/io/JarTransformingURLConnectionTests.java b/util/org.eclipse.virgo.util.io/src/test/java/org/eclipse/virgo/util/io/JarTransformingURLConnectionTests.java
new file mode 100644
index 0000000..3ab5cd6
--- /dev/null
+++ b/util/org.eclipse.virgo.util.io/src/test/java/org/eclipse/virgo/util/io/JarTransformingURLConnectionTests.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.io;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.jar.JarOutputStream;
+
+import org.eclipse.virgo.util.io.JarTransformer;
+import org.eclipse.virgo.util.io.JarTransformingURLConnection;
+import org.eclipse.virgo.util.io.JarTransformer.JarTransformerCallback;
+import org.junit.Test;
+
+public class JarTransformingURLConnectionTests {
+
+    @Test
+    public void testOpenConnection() throws Exception {
+        URL url = new URL("file:src/test/resources/simple-manifest-only.jar");
+        MockTransformer transformer = new MockTransformer();
+
+        JarTransformingURLConnection connection = new JarTransformingURLConnection(url, new JarTransformer(transformer));
+        InputStream inputStream = connection.getInputStream();
+        assertNotNull(inputStream);
+
+        assertTrue(transformer.entryNames.contains("META-INF/MANIFEST.MF"));
+        assertTrue(transformer.entryNames.contains("META-INF/INDEX.LIST"));
+    }
+
+    private static class MockTransformer implements JarTransformerCallback {
+
+        List<String> entryNames = new ArrayList<String>();
+
+        public boolean transformEntry(String entryName, InputStream is, JarOutputStream jos) throws IOException {
+            entryNames.add(entryName);
+            return false;
+        }
+
+    }
+}
diff --git a/util/org.eclipse.virgo.util.io/src/test/java/org/eclipse/virgo/util/io/JarUtilsTests.java b/util/org.eclipse.virgo.util.io/src/test/java/org/eclipse/virgo/util/io/JarUtilsTests.java
new file mode 100644
index 0000000..5ce07a5
--- /dev/null
+++ b/util/org.eclipse.virgo.util.io/src/test/java/org/eclipse/virgo/util/io/JarUtilsTests.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.io;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.BufferedReader;
+import java.io.FileInputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class JarUtilsTests {
+
+    private final PathReference expected = new PathReference("build/dummy");
+
+    @Before
+    public void before() {
+        expected.delete(true);
+    }
+
+    @Test
+    public void testUnpackIntoDir() throws Exception {
+        PathReference jar = new PathReference("src/test/resources/jars/dummy.jar");
+        PathReference target = new PathReference("./build");
+        JarUtils.unpackTo(jar, target);
+        assertTrue(this.expected.exists());
+        PathReference file = expected.newChild("com/foo/bar/dummyDoc.txt");
+        assertTrue(file.exists());
+        try (Reader fileReader = new InputStreamReader(new FileInputStream(file.toFile()), UTF_8)) {
+            try (BufferedReader reader = new BufferedReader(fileReader)) {
+                String line = reader.readLine();
+                assertEquals("Hello There!", line);
+            }
+        }
+    }
+}
diff --git a/util/org.eclipse.virgo.util.io/src/test/java/org/eclipse/virgo/util/io/NetUtilsTests.java b/util/org.eclipse.virgo.util.io/src/test/java/org/eclipse/virgo/util/io/NetUtilsTests.java
new file mode 100644
index 0000000..fd48571
--- /dev/null
+++ b/util/org.eclipse.virgo.util.io/src/test/java/org/eclipse/virgo/util/io/NetUtilsTests.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.io;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.net.ServerSocket;
+
+import org.eclipse.virgo.util.io.NetUtils;
+import org.junit.Test;
+
+public class NetUtilsTests {
+
+    @Test
+    public void testUnassignedPort() {
+        assertNotNull(NetUtils.getFreePort());
+    }
+
+    @Test
+    public void testBoundPort() {
+        int port = 65535;
+        while (!NetUtils.isPortAvailable(port)) {
+            port--;
+        }
+
+        ServerSocket socket = null;
+        try {
+            socket = new ServerSocket(port);
+            assertFalse(NetUtils.isPortAvailable(port));
+        } catch (IOException e) {
+        } finally {
+            if (socket != null) {
+                try {
+                    socket.close();
+                } catch (IOException e) {
+                }
+            }
+        }
+    }
+
+    @Test(expected = IllegalStateException.class)
+    public void testNoPortsAvailable() {
+        int port = 65535;
+        while (!NetUtils.isPortAvailable(port)) {
+            port--;
+        }
+
+        ServerSocket socket = null;
+        try {
+            socket = new ServerSocket(port);
+            NetUtils.getFreePort(port, port);
+        } catch (IOException e) {
+        } finally {
+            if (socket != null) {
+                try {
+                    socket.close();
+                } catch (IOException e) {
+                }
+            }
+        }
+    }
+
+    @Test
+    public void available() {
+        int port = 65535;
+        while (!NetUtils.isPortAvailable(port)) {
+            port--;
+        }
+
+        assertTrue(NetUtils.isPortAvailable(port));
+    }
+}
diff --git a/util/org.eclipse.virgo.util.io/src/test/java/org/eclipse/virgo/util/io/PathReferenceTests.java b/util/org.eclipse.virgo.util.io/src/test/java/org/eclipse/virgo/util/io/PathReferenceTests.java
new file mode 100644
index 0000000..46ff5a5
--- /dev/null
+++ b/util/org.eclipse.virgo.util.io/src/test/java/org/eclipse/virgo/util/io/PathReferenceTests.java
@@ -0,0 +1,449 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.io;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+
+import org.eclipse.virgo.util.io.FatalIOException;
+import org.eclipse.virgo.util.io.FileSystemUtils;
+import org.eclipse.virgo.util.io.PathReference;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ */
+public class PathReferenceTests {
+
+    private static final String WORK_AREA_PATH = "build/work";
+    
+    private static final String WORK_AREA2_PATH = "build/work2";
+
+    private static final String TEST_FILE = "src/test/resources/test.txt";
+
+    private static final String TEST_FILE2 = "test2.txt";
+
+    @Before 
+    public void workAreaSetUp() throws Exception{
+        resetWorkArea(new File(WORK_AREA_PATH));
+        
+        File f2 = new File(WORK_AREA2_PATH);
+        resetWorkArea(f2);
+        File testFile = new File(f2, TEST_FILE2);
+        testFile.createNewFile();
+    }
+
+    private void resetWorkArea(File f) {
+        if (f.exists()) {
+            FileSystemUtils.deleteRecursively(f);
+        }
+        f.mkdir();
+    }
+
+    @After 
+    public void workAreaClean() {
+        FileSystemUtils.deleteRecursively(new File(WORK_AREA_PATH));
+        FileSystemUtils.deleteRecursively(new File(WORK_AREA2_PATH));
+    }
+
+    @Test 
+    public void createFromPath() {
+        PathReference path = new PathReference("src/test/resources");
+        assertNotNull(path.toFile());
+    }
+
+    @Test 
+    public void createFromFile() {
+        PathReference path = new PathReference(new File("src/test/resources"));
+        assertNotNull(path.toFile());
+    }
+
+    @Test 
+    public void exists() {
+        assertTrue(new PathReference("src/test/resources").exists());
+        assertFalse(new PathReference("src/test/resources/non-existent").exists());
+    }
+
+    @Test 
+    public void isFileOrDirectory() {
+        assertTrue(new PathReference("src/test/resources").isDirectory());
+        assertTrue(new PathReference("src/test/resources/test.txt").isFile());
+    }
+
+    @Test 
+    public void concat() {
+        PathReference pr = PathReference.concat("src", "test", "resources", "test.txt");
+        assertTrue(pr.exists());
+        assertTrue(pr.isFile());
+    }
+
+    @Test 
+    public void create() {
+        PathReference pr = PathReference.concat(WORK_AREA_PATH, "dummy.txt");
+        assertFalse(pr.exists());
+        pr.createFile();
+        assertTrue(pr.exists());
+        assertTrue(pr.isFile());
+    }
+
+    @Test 
+    public void createDirectory() {
+        PathReference pr = PathReference.concat(WORK_AREA_PATH, "dummy");
+        assertFalse(pr.exists());
+        pr.createDirectory();
+        assertTrue(pr.exists());
+        assertTrue(pr.isDirectory());
+    }
+
+    @Test 
+    public void createTree() {
+        PathReference pr = PathReference.concat(WORK_AREA_PATH, "dummy");
+        assertFalse(pr.exists());
+        PathReference file = pr.createDirectory().newChild("inner").createDirectory().newChild("foo.txt").createFile();
+        assertTrue(file.exists());
+    }
+
+    @Test 
+    public void createTreeNested() {
+        PathReference pr = PathReference.concat(WORK_AREA_PATH, "dummy");
+        assertFalse(pr.exists());
+        PathReference ref = pr.newChild("inner").newChild("more").createDirectory();
+        assertTrue(ref.exists());
+    }
+
+    @Test 
+    public void createTreeNestedWithFile() {
+        PathReference pr = PathReference.concat(WORK_AREA_PATH, "dummy");
+        assertFalse(pr.exists());
+        PathReference ref = pr.newChild("inner").newChild("more.txt").createFile();
+        assertTrue(ref.exists());
+    }
+
+    @Test 
+    public void deleteNonRecursiveDir() {
+        PathReference pr = PathReference.concat(WORK_AREA_PATH, "dummy_dir");
+        PathReference nested = pr.createDirectory().newChild("foo").createDirectory().newChild("bar").createFile();
+        assertTrue(pr.exists());
+        assertTrue(nested.exists());
+        pr.delete(false);
+        assertTrue(pr.exists());
+        assertTrue(nested.exists());
+    }
+
+    @Test 
+    public void deleteNonRecursiveFile() {
+        PathReference pr = PathReference.concat(WORK_AREA_PATH, "dummy.txt");
+        pr.createFile();
+        assertTrue(pr.exists());
+        pr.delete(false);
+        assertFalse(pr.exists());
+    }
+
+    @Test 
+    public void deleteNonRecursiveEmptyDir() {
+        PathReference pr = PathReference.concat(WORK_AREA_PATH, "dummy");
+        pr.createDirectory();
+        assertTrue(pr.exists());
+        pr.delete(false);
+        assertFalse(pr.exists());
+    }
+
+    @Test 
+    public void deleteRecursive() {
+        PathReference pr = PathReference.concat(WORK_AREA_PATH, "dummy_dir");
+        PathReference nested = pr.createDirectory().newChild("foo").createDirectory().newChild("bar").createFile();
+        assertTrue(pr.exists());
+        assertTrue(nested.exists());
+        pr.delete(true);
+        assertFalse(pr.exists());
+        assertFalse(nested.exists());
+    }
+
+    @Test 
+    public void copyFileToFile() {
+        PathReference pr = new PathReference(TEST_FILE);
+        assertTrue(pr.exists());
+
+        PathReference dest = PathReference.concat(WORK_AREA_PATH, "out.txt");
+        assertFalse(dest.exists());
+
+        PathReference copy = pr.copy(dest, false);
+        assertTrue(dest.exists());
+        assertEquals(dest, copy);
+    }
+    
+    @Test 
+    public void moveFileToFile() {
+        PathReference pr = PathReference.concat(WORK_AREA2_PATH, TEST_FILE2);
+        assertTrue(pr.exists());
+        
+        PathReference dest = PathReference.concat(WORK_AREA2_PATH, "out.txt");
+        assertFalse(dest.exists());
+
+        PathReference moved = pr.moveTo(dest);
+        assertEquals("Resulting reference not destination.", dest, moved);
+        assertTrue("File " + dest + " doesn't exist -- file not moved.", dest.exists());
+        assertFalse("File " + pr + " still exists -- not moved.", pr.exists());
+    }
+
+    @Test 
+    public void moveDirToDir() {
+        PathReference src = new PathReference(TEST_FILE).getParent();
+        assertTrue(src.exists());
+        
+        PathReference srcCopy = PathReference.concat(WORK_AREA2_PATH, "moveFromSrc");
+        src.copy(srcCopy, true);
+        assertTrue(srcCopy.exists());
+
+        PathReference dest = PathReference.concat(WORK_AREA2_PATH, "moveToDest");
+        assertFalse(dest.exists());
+
+        srcCopy.moveTo(dest);
+
+        assertTrue(dest + " does not exist", dest.exists());
+        assertTrue("child in destination does not exist", dest.newChild("child").exists());
+        assertTrue("child/grand-child in destination does not exist", dest.newChild("child").newChild("grand-child").exists());
+        assertTrue("child/grand-child/foo.txt in destination does not exist", dest.newChild("child").newChild("grand-child").newChild("foo.txt").exists());
+        
+        assertFalse(srcCopy + " still exists", srcCopy.exists());
+        assertFalse("child in source still exists", srcCopy.newChild("child").exists());
+        assertFalse("child/grand-child in source still exists", srcCopy.newChild("child").newChild("grand-child").exists());
+        assertFalse("child/grand-child/foo.txt in source still exists", srcCopy.newChild("child").newChild("grand-child").newChild("foo.txt").exists());
+    }
+    
+    @Test 
+    public void moveToFails() {
+        PathReference pr = PathReference.concat(WORK_AREA2_PATH, TEST_FILE2);
+        assertTrue(pr.exists());
+        
+        PathReference dest = PathReference.concat(WORK_AREA2_PATH, "out.txt");
+        assertFalse(dest.exists());
+
+        pr.copy(dest);
+        assertTrue("File " + dest + " doesn't exist -- file not copied.", dest.exists());
+        
+        PathReference moved = null;
+        try {
+            moved = pr.moveTo(dest);
+        } catch (FatalIOException fioe) {
+            fioe.printStackTrace();
+        }
+        assertNull("Expecting moved to be null", moved);
+        assertTrue("File " + pr + " should still exist.", pr.exists());
+        assertTrue("File " + dest + " doesn't exist!", dest.exists());
+    }
+    
+    @Test
+    public void moveDirToDirFast() {
+        PathReference src = new PathReference(TEST_FILE).getParent();
+        assertTrue(src.exists());
+        
+        PathReference srcCopy = PathReference.concat(WORK_AREA2_PATH, "moveFromSrc");
+        src.copy(srcCopy, true);
+        assertTrue(srcCopy.exists());
+
+        PathReference dest = PathReference.concat(WORK_AREA2_PATH, "moveToDest");
+        assertFalse(dest.exists());
+
+        boolean movedFast = false;
+        try {
+            srcCopy.fastMoveTo(dest);
+            movedFast = true;
+        } catch (FatalIOException fioe) {
+            fioe.printStackTrace();
+            movedFast = false;
+        }
+
+        assertTrue("Fast move failed!", movedFast);
+        
+        assertTrue(dest + " does not exist", dest.exists());
+        assertTrue("child in destination does not exist", dest.newChild("child").exists());
+        assertTrue("child/grand-child in destination does not exist", dest.newChild("child").newChild("grand-child").exists());
+        assertTrue("child/grand-child/foo.txt in destination does not exist", dest.newChild("child").newChild("grand-child").newChild("foo.txt").exists());
+        
+        assertFalse(srcCopy + " still exists", srcCopy.exists());
+        assertFalse("child in source still exists", srcCopy.newChild("child").exists());
+        assertFalse("child/grand-child in source still exists", srcCopy.newChild("child").newChild("grand-child").exists());
+        assertFalse("child/grand-child/foo.txt in source still exists", srcCopy.newChild("child").newChild("grand-child").newChild("foo.txt").exists());
+    }
+
+    @Test(expected = FatalIOException.class) 
+    public void copyFileToExistingFile() {
+        PathReference pr = new PathReference(TEST_FILE);
+        assertTrue(pr.exists());
+
+        PathReference dest = PathReference.concat(WORK_AREA_PATH, "out.txt");
+        dest.createFile();
+        assertTrue(dest.exists());
+
+        pr.copy(dest, false);
+    }
+
+    @Test 
+    public void copyFileToDirectory() {
+        PathReference pr = new PathReference(TEST_FILE);
+        assertTrue(pr.exists());
+
+        PathReference dest = new PathReference(WORK_AREA_PATH);
+        assertTrue(dest.exists());
+
+        PathReference finalDest = dest.newChild(pr.getName());
+        assertFalse(finalDest.exists());
+
+        PathReference copy = pr.copy(dest, false);
+        assertTrue(finalDest.exists());
+        assertEquals(finalDest, copy);
+    }
+
+    @Test(expected = FatalIOException.class) 
+    public void copyFileToDirectoryWhenExists() {
+        PathReference pr = new PathReference(TEST_FILE);
+        assertTrue(pr.exists());
+
+        PathReference dest = new PathReference(WORK_AREA_PATH);
+        assertTrue(dest.exists());
+
+        PathReference finalDest = dest.newChild(pr.getName());
+        finalDest.createFile();
+        assertTrue(finalDest.exists());
+
+        pr.copy(dest, false);
+    }
+
+    @Test(expected = FatalIOException.class) 
+    public void copyDirNonEmptyNonRecursive() {
+        PathReference pr = new PathReference(TEST_FILE).getParent();
+        assertTrue(pr.exists());
+
+        PathReference dest = new PathReference(WORK_AREA_PATH);
+        assertTrue(dest.exists());
+
+        pr.copy(dest, false);
+    }
+
+    @Test 
+    public void copyDirEmptyNonRecursive() {
+        PathReference pr = new PathReference(WORK_AREA_PATH).newChild("src").createDirectory();
+        assertTrue(pr.exists());
+
+        PathReference dest = PathReference.concat(WORK_AREA_PATH, "dest");
+        assertFalse(dest.exists());
+
+        pr.copy(dest, false);
+
+        assertTrue(dest.exists());
+    }
+
+    @Test 
+    public void copyDirNonEmptyRecursiveIntoExistingDir() {
+        PathReference src = new PathReference(TEST_FILE).getParent();
+        assertTrue(src.exists());
+
+        PathReference dest = new PathReference(WORK_AREA_PATH);
+        PathReference finalDest = dest.newChild(src.getName());
+        assertFalse(finalDest.exists());
+
+        src.copy(dest, true);
+
+        assertTrue(finalDest.exists());
+        assertTrue(finalDest.newChild("child").exists());
+        assertTrue(finalDest.newChild("child").newChild("grand-child").exists());
+        assertTrue(finalDest.newChild("child").newChild("grand-child").newChild("foo.txt").exists());
+    }
+
+    @Test 
+    public void copyDirNonEmptyRecursiveIntoNewDir() {
+        PathReference src = new PathReference(TEST_FILE).getParent();
+        assertTrue(src.exists());
+
+        PathReference dest = PathReference.concat(WORK_AREA_PATH, "dest");
+        assertFalse(dest.exists());
+
+        src.copy(dest, true);
+
+        assertTrue(dest.exists());
+        assertTrue(dest.newChild("child").exists());
+        assertTrue(dest.newChild("child").newChild("grand-child").exists());
+        assertTrue(dest.newChild("child").newChild("grand-child").newChild("foo.txt").exists());
+    }
+
+    @Test 
+    public void copyDirNonEmptyRecursiveIntoNewDirWithFilter() {
+        PathReference src = new PathReference(TEST_FILE).getParent();
+        assertTrue(src.exists());
+
+        PathReference dest = PathReference.concat(WORK_AREA_PATH, "dest");
+        assertFalse(dest.exists());
+
+        src.copy(dest, true, new PathReference.PathFilter() {
+
+            public boolean matches(PathReference path) {
+                return !"foo.txt".equals(path.getName());
+            }
+
+        });
+
+        assertTrue(dest.exists());
+        assertTrue(dest.newChild("child").exists());
+        assertTrue(dest.newChild("child").newChild("grand-child").exists());
+        assertFalse(dest.newChild("child").newChild("grand-child").newChild("foo.txt").exists());
+    }
+    
+    @Test(expected = FileNotFoundException.class)
+    public void testFileContentsFileDoesNotExist() throws IOException {
+    	PathReference src = new PathReference(TEST_FILE + "2");
+    	src.fileContents();
+    }
+    
+    @Test
+    public void testFileContents() throws IOException {
+    	PathReference src = new PathReference(TEST_FILE);
+    	assertEquals("hello", src.fileContents());
+    }
+    
+    @Test
+    public void testTouch() throws Exception {
+        File file = new File(new File(WORK_AREA2_PATH), TEST_FILE2);
+        PathReference src = new PathReference(file);
+        long lm = file.lastModified();
+        Thread.sleep(1000L); //allow present time to change a bit
+        assertTrue(src.touch());
+        long newlm = file.lastModified();
+        assertTrue("LastModified ("+newlm+") not any greater now ("+lm+").", lm < newlm);
+    }
+    
+    @Test
+    public void testHashCode() {
+        PathReference src = new PathReference(TEST_FILE);
+        assertTrue("Hash code is zero!", 0 != src.hashCode());
+    }
+
+    @Test
+    public void testGetAbsolutePath() throws Exception {
+        PathReference src = new PathReference(TEST_FILE);
+        assertEquals("Absolute path not the same as File()", new File(TEST_FILE).getAbsolutePath(), src.toAbsoluteReference().getAbsolutePath());
+    }   
+    @Test
+    public void testGetCanonicalPath() throws Exception {
+        PathReference src = new PathReference(TEST_FILE);
+        assertEquals("Absolute path not the same as File()", new File(TEST_FILE).getCanonicalPath(), src.toCanonicalReference().getCanonicalPath());
+    }
+    
+}
diff --git a/util/org.eclipse.virgo.util.io/src/test/java/org/eclipse/virgo/util/io/StubLogger.java b/util/org.eclipse.virgo.util.io/src/test/java/org/eclipse/virgo/util/io/StubLogger.java
new file mode 100644
index 0000000..a3b53ae
--- /dev/null
+++ b/util/org.eclipse.virgo.util.io/src/test/java/org/eclipse/virgo/util/io/StubLogger.java
@@ -0,0 +1,492 @@
+/*******************************************************************************
+ * This file is part of the Virgo Web Server.
+ *
+ * Copyright (c) 2010 Eclipse Foundation.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    SpringSource, a division of VMware - initial API and implementation and/or initial documentation
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.io;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.slf4j.Logger;
+import org.slf4j.Marker;
+
+/**
+ * A version of {@link Logger} suitable for testing.
+ * <p/>
+ * Debug only; markers ignored; no copies made; getEntries() implemented.
+ * 
+ * @author Steve Powell
+ */
+public class StubLogger implements Logger {
+
+    public static class StubLogEntry {
+
+        private final String string;
+
+        private final List<Object> arg1;
+
+        private final Throwable throwable;
+
+        StubLogEntry(String string, Object[] arg1, Throwable throwable) {
+            this.string = string;
+            List<Object> list = new ArrayList<Object>();
+            if (arg1 != null)
+                for (Object o : arg1) {
+                    list.add(o);
+                }
+            this.arg1 = list;
+            this.throwable = throwable;
+        }
+
+        public List<Object> getArg1() {
+            return this.arg1;
+        }
+
+        public Throwable getThrowable() {
+            return this.throwable;
+        }
+
+        public String getString() {
+            return this.string;
+        }
+
+        public String toString() {
+            StringBuilder sb = new StringBuilder(this.string).append(" [");
+            for (int i = 0; i < this.arg1.size(); ++i) {
+                if (i > 0)
+                    sb.append(", ");
+                sb.append(this.arg1.get(i));
+            }
+            sb.append("] ").append(throwable);
+            return sb.toString();
+        }
+    }
+
+    private final Object monitor = new Object();
+
+    private List<StubLogEntry> entries;
+
+    private void addDebug(String string, Object[] args, Throwable t) {
+        synchronized (monitor) {
+            this.entries.add(new StubLogEntry(string, args, t));
+        }
+    }
+
+    public StubLogger() {
+        this.entries = new ArrayList<StubLogEntry>();
+    }
+
+    public List<StubLogEntry> getEntries() {
+        synchronized (this.monitor) {
+            List<StubLogEntry> list = new ArrayList<StubLogEntry>(this.entries);
+            return list;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void debug(String arg0) {
+        addDebug(arg0, null, null);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void debug(String arg0, Object arg1) {
+        Object[] args = new Object[1];
+        args[0] = arg1;
+        addDebug(arg0, args, null);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void debug(String arg0, Object... arg1) {
+        addDebug(arg0, arg1, null);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void debug(String arg0, Throwable arg1) {
+        addDebug(arg0, null, arg1);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void debug(Marker arg0, String arg1) {
+        addDebug(arg1, null, null);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void debug(String arg0, Object arg1, Object arg2) {
+        Object[] args = new Object[2];
+        args[0] = arg1;
+        args[1] = arg2;
+        addDebug(arg0, args, null);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void debug(Marker arg0, String arg1, Object arg2) {
+        Object[] args = new Object[1];
+        args[0] = arg2;
+        addDebug(arg1, args, null);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void debug(Marker arg0, String arg1, Object... arg2) {
+        addDebug(arg1, arg2, null);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void debug(Marker arg0, String arg1, Throwable arg2) {
+        addDebug(arg1, null, arg2);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void debug(Marker arg0, String arg1, Object arg2, Object arg3) {
+        Object[] args = new Object[2];
+        args[0] = arg2;
+        args[1] = arg3;
+        addDebug(arg1, args, null);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void error(String arg0) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void error(String arg0, Object arg1) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void error(String arg0, Object... arg1) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void error(String arg0, Throwable arg1) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void error(Marker arg0, String arg1) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void error(String arg0, Object arg1, Object arg2) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void error(Marker arg0, String arg1, Object arg2) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void error(Marker arg0, String arg1, Object... arg2) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void error(Marker arg0, String arg1, Throwable arg2) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void error(Marker arg0, String arg1, Object arg2, Object arg3) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getName() {
+        return "StubLogger";
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void info(String arg0) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void info(String arg0, Object arg1) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void info(String arg0, Object... arg1) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void info(String arg0, Throwable arg1) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void info(Marker arg0, String arg1) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void info(String arg0, Object arg1, Object arg2) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void info(Marker arg0, String arg1, Object arg2) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void info(Marker arg0, String arg1, Object... arg2) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void info(Marker arg0, String arg1, Throwable arg2) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void info(Marker arg0, String arg1, Object arg2, Object arg3) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isDebugEnabled() {
+        return true;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isDebugEnabled(Marker arg0) {
+        return true;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isErrorEnabled() {
+        return false;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isErrorEnabled(Marker arg0) {
+        return false;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isInfoEnabled() {
+        return false;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isInfoEnabled(Marker arg0) {
+        return false;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isTraceEnabled() {
+        return false;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isTraceEnabled(Marker arg0) {
+        return false;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isWarnEnabled() {
+        return false;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isWarnEnabled(Marker arg0) {
+        return false;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void trace(String arg0) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void trace(String arg0, Object arg1) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void trace(String arg0, Object... arg1) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void trace(String arg0, Throwable arg1) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void trace(Marker arg0, String arg1) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void trace(String arg0, Object arg1, Object arg2) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void trace(Marker arg0, String arg1, Object arg2) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void trace(Marker arg0, String arg1, Object... arg2) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void trace(Marker arg0, String arg1, Throwable arg2) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void trace(Marker arg0, String arg1, Object arg2, Object arg3) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void warn(String arg0) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void warn(String arg0, Object arg1) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void warn(String arg0, Object... arg1) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void warn(String arg0, Throwable arg1) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void warn(Marker arg0, String arg1) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void warn(String arg0, Object arg1, Object arg2) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void warn(Marker arg0, String arg1, Object arg2) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void warn(Marker arg0, String arg1, Object... arg2) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void warn(Marker arg0, String arg1, Throwable arg2) {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void warn(Marker arg0, String arg1, Object arg2, Object arg3) {
+    }
+
+}
diff --git a/util/org.eclipse.virgo.util.io/src/test/java/org/eclipse/virgo/util/io/ZipUtilsTests.java b/util/org.eclipse.virgo.util.io/src/test/java/org/eclipse/virgo/util/io/ZipUtilsTests.java
new file mode 100755
index 0000000..7a49e15
--- /dev/null
+++ b/util/org.eclipse.virgo.util.io/src/test/java/org/eclipse/virgo/util/io/ZipUtilsTests.java
@@ -0,0 +1,228 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.io;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import java.io.BufferedReader;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ZipUtilsTests {
+
+    private static final int LONG_FILE_PATH_DEPTH = 10;
+
+    private static final String A_LONG_FILE_PATH_DIRECTORY = "ALongFilePathDirectoryNameWhichGoesOnForeverAndEverNot";
+
+    private final PathReference expectedZip = new PathReference("build/to-zip.zip");
+
+    private final PathReference expectedDefaultUnzipped = new PathReference("build/to-zip");
+
+    private final PathReference expectedSpecifiedUnzipped = new PathReference("build/zipped-to-here");
+
+    private final PathReference expectedDefaultUnzippedFoo = new PathReference("build/to-zip/a/foo");
+
+    private final PathReference expectedDefaultUnzippedBar = new PathReference("build/to-zip/a/b/bar");
+
+    private final PathReference expectedDefaultPrefixedUnzippedFoo = new PathReference("build/to-zip/prefix/a/foo");
+
+    private final PathReference expectedDefaultPrefixedUnzippedBar = new PathReference("build/to-zip/prefix/a/b/bar");
+
+    private final PathReference expectedSpecifiedUnzippedFoo = new PathReference("build/zipped-to-here/a/foo");
+
+    private final PathReference expectedSpecifiedUnzippedBar = new PathReference("build/zipped-to-here/a/b/bar");
+
+    @Before
+    public void before() {
+        expectedZip.delete();
+        expectedDefaultUnzipped.delete(true);
+        expectedSpecifiedUnzipped.delete(true);
+    }
+
+    @Test
+    public void zipToDirectory() throws IOException {
+        PathReference toZip = new PathReference("src/test/resources/to-zip");
+        PathReference destination = new PathReference("build");
+
+        ZipUtils.zipTo(toZip, destination);
+
+        Assert.assertTrue(expectedZip.exists());
+
+        ZipUtils.unzipTo(expectedZip, destination);
+
+        assertExistsAndContains(expectedDefaultUnzippedFoo, "Foo");
+        assertExistsAndContains(expectedDefaultUnzippedBar, "Bar");
+    }
+
+    @Test
+    public void zipWithPrefix() throws IOException {
+        PathReference toZip = new PathReference("src/test/resources/to-zip");
+        PathReference destination = new PathReference("build");
+
+        ZipUtils.zipTo(toZip, destination, "prefix");
+
+        Assert.assertTrue(expectedZip.exists());
+
+        ZipUtils.unzipTo(expectedZip, destination);
+
+        assertExistsAndContains(expectedDefaultPrefixedUnzippedFoo, "Foo");
+        assertExistsAndContains(expectedDefaultPrefixedUnzippedBar, "Bar");
+    }
+
+    @Test
+    public void zipToFile() throws IOException {
+        PathReference toZip = new PathReference("src/test/resources/to-zip");
+        PathReference destination = new PathReference("build/zipped-to-here.zip");
+        destination.delete();
+
+        ZipUtils.zipTo(toZip, destination);
+
+        Assert.assertTrue(destination.exists());
+
+        ZipUtils.unzipTo(destination, new PathReference("build"));
+
+        assertExistsAndContains(expectedSpecifiedUnzippedFoo, "Foo");
+        assertExistsAndContains(expectedSpecifiedUnzippedBar, "Bar");
+    }
+
+    @Test
+    public void unzipToLongFilePath() throws Exception {
+        PathReference toZip = new PathReference("src/test/resources/to-zip");
+        PathReference destination = new PathReference("build/zipped-to-here.zip");
+        destination.delete();
+
+        ZipUtils.zipTo(toZip, destination);
+
+        Assert.assertTrue(destination.exists());
+
+        PathReference longFileNameDir = new PathReference("build/longFilePathDir");
+        longFileNameDir.delete(true);
+
+        PathReference longFileNameTarget = longPathReference(longFileNameDir, LONG_FILE_PATH_DEPTH);
+        longFileNameTarget.createDirectory();
+
+        Assert.assertTrue("Deep target directory isn't created!", longFileNameTarget.exists());
+
+        PathReference unzipFooPlace = longFileNameTarget.newChild("zipped-to-here").newChild("a").newChild("foo");
+        PathReference unzipBarPlace = longFileNameTarget.newChild("zipped-to-here").newChild("a").newChild("b").newChild("bar");
+
+        ZipUtils.unzipTo(destination, longFileNameTarget);
+
+        assertExistsAndContains(unzipFooPlace, "Foo");
+        assertExistsAndContains(unzipBarPlace, "Bar");
+
+    }
+
+    @Test
+    public void zipAndUnzipLongFilePath() throws Exception {
+        PathReference filesToZip = new PathReference("src/test/resources/to-zip");
+
+        PathReference deepDirsToZip = new PathReference("build/deepDirsToZip");
+        deepDirsToZip.delete(true);
+
+        // Create deep dirs to zip
+        PathReference deepPath = longPathReference(deepDirsToZip, LONG_FILE_PATH_DEPTH);
+        filesToZip.copy(deepPath.newChild("zipped-to-here"), true);
+
+        PathReference destination = new PathReference("build/zipAndUnzipLongFilePath.zip");
+        destination.delete();
+
+        ZipUtils.zipTo(deepDirsToZip, destination);
+
+        Assert.assertTrue(destination.exists());
+
+        PathReference targetDir = new PathReference("build/zipAndUnzipLongFilePath");
+        targetDir.delete(true);
+
+        ZipUtils.unzipTo(destination, new PathReference("build"));
+
+        PathReference longFileNameTarget = longPathReference(targetDir, LONG_FILE_PATH_DEPTH);
+        PathReference unzipFooPlace = longFileNameTarget.newChild("zipped-to-here").newChild("a").newChild("foo");
+        PathReference unzipBarPlace = longFileNameTarget.newChild("zipped-to-here").newChild("a").newChild("b").newChild("bar");
+
+        assertExistsAndContains(unzipFooPlace, "Foo");
+        assertExistsAndContains(unzipBarPlace, "Bar");
+    }
+
+    @Test
+    public void unzipToDestructive() throws Exception {
+        PathReference archiveToUnzip = new PathReference("src/test/resources/jars/test.jar");
+        PathReference unzipDestination = new PathReference("build/unzipDestructive");
+        PathReference archivedFile = new PathReference("build/unzipDestructive/test.txt");
+        PathReference archivedFileInMetaInf = new PathReference("build/unzipDestructive/META-INF/test.txt");
+
+        unzipDestination.delete(true);
+        ZipUtils.unzipTo(archiveToUnzip, unzipDestination);
+
+        Assert.assertTrue(archivedFile.exists());
+        Assert.assertTrue(archivedFileInMetaInf.exists());
+
+        archiveToUnzip = new PathReference("src/test/resources/jars/test_updated.jar");
+        PathReference updatedArchivedFile = new PathReference("build/unzipDestructive/test_updated.txt");
+        PathReference updatedArchivedFileInMetaInf = new PathReference("build/unzipDestructive/META-INF/test_updated.txt");
+
+        ZipUtils.unzipToDestructive(archiveToUnzip, unzipDestination);
+
+        Assert.assertTrue(updatedArchivedFile.exists());
+        Assert.assertTrue(updatedArchivedFileInMetaInf.exists());
+        Assert.assertFalse(archivedFile.exists());
+        Assert.assertFalse(archivedFileInMetaInf.exists());
+    }
+
+    @Test
+    public void unzipToDestructiveLongFilePaths() throws Exception {
+        PathReference archiveToUnzip = new PathReference("src/test/resources/jars/test.jar");
+        PathReference unzipDestination = new PathReference("build/unzipDestructiveLongFilePaths");
+        PathReference longFileNameDestination = longPathReference(unzipDestination, LONG_FILE_PATH_DEPTH);
+
+        unzipDestination.delete(true);
+        ZipUtils.unzipTo(archiveToUnzip, longFileNameDestination);
+
+        PathReference archivedFile = longFileNameDestination.newChild("test.txt");
+        PathReference archivedFileInMetaInf = longFileNameDestination.newChild("META-INF").newChild("test.txt");
+
+        Assert.assertTrue(archivedFile.exists());
+        Assert.assertTrue(archivedFileInMetaInf.exists());
+
+        archiveToUnzip = new PathReference("src/test/resources/jars/test_updated.jar");
+        PathReference updatedArchivedFile = longFileNameDestination.newChild("test_updated.txt");
+        PathReference updatedArchivedFileInMetaInf = longFileNameDestination.newChild("META-INF").newChild("test_updated.txt");
+
+        ZipUtils.unzipToDestructive(archiveToUnzip, longFileNameDestination);
+
+        Assert.assertTrue(updatedArchivedFile.exists());
+        Assert.assertTrue(updatedArchivedFileInMetaInf.exists());
+        Assert.assertFalse(archivedFile.exists());
+        Assert.assertFalse(archivedFileInMetaInf.exists());
+    }
+
+    private static PathReference longPathReference(PathReference longRef, int depth) {
+        for (int i = 0; i < depth; ++i) {
+            longRef = longRef.newChild(A_LONG_FILE_PATH_DIRECTORY);
+        }
+        return longRef;
+    }
+
+    private static void assertExistsAndContains(PathReference file, String contents) throws IOException {
+        Assert.assertTrue(file.exists());
+
+        try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file.toFile()), UTF_8))) {
+            Assert.assertEquals(contents, reader.readLine());
+            Assert.assertEquals(null, reader.readLine());
+        }
+    }
+}
diff --git a/util/org.eclipse.virgo.util.io/src/test/resources/child/bar.txt b/util/org.eclipse.virgo.util.io/src/test/resources/child/bar.txt
new file mode 100644
index 0000000..ba0e162
--- /dev/null
+++ b/util/org.eclipse.virgo.util.io/src/test/resources/child/bar.txt
@@ -0,0 +1 @@
+bar
\ No newline at end of file
diff --git a/util/org.eclipse.virgo.util.io/src/test/resources/child/grand-child/foo.txt b/util/org.eclipse.virgo.util.io/src/test/resources/child/grand-child/foo.txt
new file mode 100644
index 0000000..1910281
--- /dev/null
+++ b/util/org.eclipse.virgo.util.io/src/test/resources/child/grand-child/foo.txt
@@ -0,0 +1 @@
+foo
\ No newline at end of file
diff --git a/util/org.eclipse.virgo.util.io/src/test/resources/jars/dummy.jar b/util/org.eclipse.virgo.util.io/src/test/resources/jars/dummy.jar
new file mode 100644
index 0000000..7ab5fb3
--- /dev/null
+++ b/util/org.eclipse.virgo.util.io/src/test/resources/jars/dummy.jar
Binary files differ
diff --git a/util/org.eclipse.virgo.util.io/src/test/resources/jars/no-manifest.jar b/util/org.eclipse.virgo.util.io/src/test/resources/jars/no-manifest.jar
new file mode 100644
index 0000000..0d2ffdc
--- /dev/null
+++ b/util/org.eclipse.virgo.util.io/src/test/resources/jars/no-manifest.jar
Binary files differ
diff --git a/util/org.eclipse.virgo.util.io/src/test/resources/jars/test.jar b/util/org.eclipse.virgo.util.io/src/test/resources/jars/test.jar
new file mode 100755
index 0000000..0ec95c3
--- /dev/null
+++ b/util/org.eclipse.virgo.util.io/src/test/resources/jars/test.jar
Binary files differ
diff --git a/util/org.eclipse.virgo.util.io/src/test/resources/jars/test_updated.jar b/util/org.eclipse.virgo.util.io/src/test/resources/jars/test_updated.jar
new file mode 100755
index 0000000..d33c348
--- /dev/null
+++ b/util/org.eclipse.virgo.util.io/src/test/resources/jars/test_updated.jar
Binary files differ
diff --git a/util/org.eclipse.virgo.util.io/src/test/resources/simple-manifest-only.jar b/util/org.eclipse.virgo.util.io/src/test/resources/simple-manifest-only.jar
new file mode 100644
index 0000000..5cbe940
--- /dev/null
+++ b/util/org.eclipse.virgo.util.io/src/test/resources/simple-manifest-only.jar
Binary files differ
diff --git a/util/org.eclipse.virgo.util.io/src/test/resources/test.txt b/util/org.eclipse.virgo.util.io/src/test/resources/test.txt
new file mode 100644
index 0000000..b6fc4c6
--- /dev/null
+++ b/util/org.eclipse.virgo.util.io/src/test/resources/test.txt
@@ -0,0 +1 @@
+hello
\ No newline at end of file
diff --git a/util/org.eclipse.virgo.util.io/src/test/resources/to-zip/a/b/bar b/util/org.eclipse.virgo.util.io/src/test/resources/to-zip/a/b/bar
new file mode 100644
index 0000000..d9d3a9a
--- /dev/null
+++ b/util/org.eclipse.virgo.util.io/src/test/resources/to-zip/a/b/bar
@@ -0,0 +1 @@
+Bar
\ No newline at end of file
diff --git a/util/org.eclipse.virgo.util.io/src/test/resources/to-zip/a/foo b/util/org.eclipse.virgo.util.io/src/test/resources/to-zip/a/foo
new file mode 100644
index 0000000..9f26b63
--- /dev/null
+++ b/util/org.eclipse.virgo.util.io/src/test/resources/to-zip/a/foo
@@ -0,0 +1 @@
+Foo
\ No newline at end of file
diff --git a/util/org.eclipse.virgo.util.io/template.mf b/util/org.eclipse.virgo.util.io/template.mf
new file mode 100644
index 0000000..804a3dd
--- /dev/null
+++ b/util/org.eclipse.virgo.util.io/template.mf
@@ -0,0 +1,7 @@
+Bundle-ManifestVersion: 2
+Bundle-Name: IO Utility Code
+Bundle-SymbolicName: org.eclipse.virgo.util.io
+Bundle-Version: ${version}
+Import-Template: 
+ org.eclipse.virgo.util.*;version="${version:[=.=.=, =.=.+1)}",
+ org.slf4j.*;version="${slf4jVersion:[=.=.0, +1.0.0)}"
diff --git a/util/org.eclipse.virgo.util.jmx/src/main/java/org/eclipse/virgo/util/jmx/ExceptionCleaner.aj b/util/org.eclipse.virgo.util.jmx/src/main/java/org/eclipse/virgo/util/jmx/ExceptionCleaner.aj
new file mode 100644
index 0000000..f83fa01
--- /dev/null
+++ b/util/org.eclipse.virgo.util.jmx/src/main/java/org/eclipse/virgo/util/jmx/ExceptionCleaner.aj
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.jmx;
+
+import org.slf4j.LoggerFactory;
+import javax.management.MXBean;
+
+/**
+ * An aspect that catches all {@link Exception}s thrown through @{@link MXBean} annotated interfaces and filters them to
+ * make sure they can be safely thrown to a JMX client. Safe means that there will be no types thrown that cannot be
+ * loaded by the JMX client.
+ * <p/>
+ * This is accomplished by throwing a <em>cleaned</em> exception instead, after logging the original exception at error
+ * level with the logger for the throwing class.
+ * <p/>
+ * A <em>cleaned</em> exception, <code>cleaned(t)</code>, is a new {@link RuntimeException} with message that of
+ * <code>t</code> (prefixed with the class name of <code>t</code>), with cause <code>cleaned(t.getCause())</code>, and
+ * with stack trace set to <code>t.getStackTrace()</code>. <br/>
+ * <em>Notice that this definition is recursive; <code>cleaned(<b>null</b>)</code> is defined to be
+ * <code><b>null</b></code>.</em>
+ * <p/>
+ * The {@link StackTraceElement StackTrace} from the original exception is attached to the new {@link RuntimeException}
+ * for information purposes.
+ * <p/>
+ * (Moved from <code>com.springsource.kernel.model.management.internal</code> package and enhanced to catch
+ * all @{@link MXBean} annotated interfaces.)
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread-safe
+ */
+public aspect ExceptionCleaner {
+
+    /**
+     * All implementations of @{@link MXBean} annotated interface methods:
+     */
+    pointcut exposedViaJmx(Object o) : this(o) && execution(* (@MXBean *).*(..));
+
+    /**
+     * Catch {@link Exception}s and clean them and the nested causes (if any). {@link Throwable}s are trapped, so we can
+     * advise methods that do not declare a throws, but {@link Exception}s are filtered out.
+     */
+    after(Object o) throwing(Exception e) : exposedViaJmx(o) {
+        LoggerFactory.getLogger(o.getClass()).error("Exception filtered from JMX invocation", e);
+        throw cleanException(e);
+    }
+
+    private RuntimeException cleanException(Throwable throwable) {
+        Throwable cause = throwable.getCause();
+        RuntimeException cleanCause = null;
+        if (cause != null) {
+            cleanCause = cleanException(cause);
+        }
+
+        RuntimeException rte = new RuntimeException(throwable.getClass().getName() + ": " + throwable.getMessage(), cleanCause);
+        rte.setStackTrace(throwable.getStackTrace());
+
+        return rte;
+    }
+}
diff --git a/util/org.eclipse.virgo.util.jmx/src/main/java/org/eclipse/virgo/util/jmx/internal/EmptyClass.java b/util/org.eclipse.virgo.util.jmx/src/main/java/org/eclipse/virgo/util/jmx/internal/EmptyClass.java
new file mode 100644
index 0000000..1bb0a6d
--- /dev/null
+++ b/util/org.eclipse.virgo.util.jmx/src/main/java/org/eclipse/virgo/util/jmx/internal/EmptyClass.java
@@ -0,0 +1,5 @@
+package org.eclipse.virgo.util.jmx.internal;
+
+public class EmptyClass {
+
+}
diff --git a/util/org.eclipse.virgo.util.jmx/src/main/resources/.gitignore b/util/org.eclipse.virgo.util.jmx/src/main/resources/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/util/org.eclipse.virgo.util.jmx/src/main/resources/.gitignore
diff --git a/util/org.eclipse.virgo.util.jmx/src/main/resources/about.html b/util/org.eclipse.virgo.util.jmx/src/main/resources/about.html
new file mode 100644
index 0000000..c258ef5
--- /dev/null
+++ b/util/org.eclipse.virgo.util.jmx/src/main/resources/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>June 5, 2006</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/util/org.eclipse.virgo.util.jmx/src/test/java/org/eclipse/virgo/util/jmx/ExceptionCleanerMXBean.java b/util/org.eclipse.virgo.util.jmx/src/test/java/org/eclipse/virgo/util/jmx/ExceptionCleanerMXBean.java
new file mode 100644
index 0000000..5454d74
--- /dev/null
+++ b/util/org.eclipse.virgo.util.jmx/src/test/java/org/eclipse/virgo/util/jmx/ExceptionCleanerMXBean.java
@@ -0,0 +1,30 @@
+package org.eclipse.virgo.util.jmx;
+
+//FIXME Bug 463462 - Move back to test source folder when we know how to weave test classes
+public class ExceptionCleanerMXBean implements JmxExceptionCleanerExtensionTestInterface {
+
+    private StackTraceElement[] steArray = null;
+
+    public void unCaughtMethod() throws Exception {
+        RuntimeException rte = new RuntimeException("unCaughtMethod", new Exception("test exception"));
+        this.steArray = rte.getStackTrace();
+        throw rte;
+    }
+
+    public void caughtMethod() throws Exception {
+        RuntimeException rte = new RuntimeException("caughtMethod", new Exception("test exception"));
+        this.steArray = rte.getStackTrace();
+        throw rte;
+    }
+    
+    public StackTraceElement[] getStackTrace() {
+        return this.steArray;
+    }
+
+    public void anotherCaughtMethod() {
+        RuntimeException rte = new RuntimeException("anotherCaughtMethod", new Exception("test exception"));
+        this.steArray = rte.getStackTrace();
+        throw rte;            
+    }
+
+}
diff --git a/util/org.eclipse.virgo.util.jmx/src/test/java/org/eclipse/virgo/util/jmx/ExceptionCleanerTests.java b/util/org.eclipse.virgo.util.jmx/src/test/java/org/eclipse/virgo/util/jmx/ExceptionCleanerTests.java
new file mode 100644
index 0000000..f44e8f7
--- /dev/null
+++ b/util/org.eclipse.virgo.util.jmx/src/test/java/org/eclipse/virgo/util/jmx/ExceptionCleanerTests.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.jmx;
+
+
+/**
+ * Test the Jmx {@link ExceptionCleaner} aspect which prevents undeclared exceptions leaking from {@link javax.management.MXBean @MXBean} method calls.
+ * 
+ */
+public class ExceptionCleanerTests {
+
+//    @Test
+//    public void testCaughtMethod() throws Exception {
+//        ExceptionCleanerMXBean testBean = new ExceptionCleanerMXBean();
+//        
+//        try {
+//            testBean.caughtMethod();
+//            assertTrue("Exception not thrown!", false);
+//        } catch (Exception e) {
+//            assertEquals("Does not throw a RuntimeException", RuntimeException.class, e.getClass());
+//            assertNotNull("Cause is null", e.getCause());
+//            assertEquals("Cause is not a RuntimeException", RuntimeException.class, e.getCause().getClass());
+//            assertEquals("java.lang.Exception: test exception", e.getCause().getMessage());
+//            assertEquals("Message not correctly generated.", "java.lang.RuntimeException: caughtMethod", e.getMessage());
+//            assertArrayEquals("Stack trace not passed through.", e.getStackTrace(), testBean.getStackTrace());
+//        }
+//    }
+//
+//    @Test
+//    public void testAnotherCaughtMethod() throws Exception {
+//        ExceptionCleanerMXBean testBean = new ExceptionCleanerMXBean();
+//        
+//        try {
+//            testBean.anotherCaughtMethod();
+//            assertTrue("Exception not thrown!", false);
+//        } catch (Exception e) {
+//            assertSame("Does not throw a RuntimeException", RuntimeException.class, e.getClass());
+//            assertNotNull("Cause is null", e.getCause());
+//            assertEquals("Cause is not a RuntimeException", RuntimeException.class, e.getCause().getClass());
+//            assertEquals("java.lang.Exception: test exception", e.getCause().getMessage());
+//            assertEquals("Message not correctly generated.", "java.lang.RuntimeException: anotherCaughtMethod", e.getMessage());
+//            assertArrayEquals("Stack trace not passed through.", e.getStackTrace(), testBean.getStackTrace());
+//        }
+//    }
+//
+//    @Test
+//    public void testUncaughtMethod() throws Exception {
+//        ExceptionCleanerMXBean testBean = new ExceptionCleanerMXBean();
+//        
+//        try {
+//            testBean.unCaughtMethod();
+//            assertTrue("Exception not thrown!", false);
+//        } catch (Exception e) {
+//            assertSame("Does not throw a RuntimeException", e.getClass(), RuntimeException.class);
+//            assertNotNull("Cause is null.", e.getCause());
+//            assertSame("Cause not correct type.", e.getCause().getClass(), Exception.class);
+//            assertEquals("Message not correct.", "unCaughtMethod", e.getMessage());
+//            assertArrayEquals("Stack trace not passed through.", e.getStackTrace(), testBean.getStackTrace());
+//        }
+//    }
+
+}
diff --git a/util/org.eclipse.virgo.util.jmx/src/test/java/org/eclipse/virgo/util/jmx/JmxExceptionCleanerExtensionTestInterface.java b/util/org.eclipse.virgo.util.jmx/src/test/java/org/eclipse/virgo/util/jmx/JmxExceptionCleanerExtensionTestInterface.java
new file mode 100644
index 0000000..20249ec
--- /dev/null
+++ b/util/org.eclipse.virgo.util.jmx/src/test/java/org/eclipse/virgo/util/jmx/JmxExceptionCleanerExtensionTestInterface.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.jmx;
+
+import javax.management.MXBean;
+
+import org.eclipse.virgo.util.jmx.ExceptionCleaner;
+
+/**
+ * This is an interface that extends a @{@link MXBean} annotated interface for testing the {@link ExceptionCleaner} aspect.
+ * <p />
+ *
+ */
+//FIXME Bug 463462 - Move back to test source folder when we know how to weave test classes
+public interface JmxExceptionCleanerExtensionTestInterface extends JmxExceptionCleanerTestInterface {
+
+    public void unCaughtMethod() throws Exception;
+}
diff --git a/util/org.eclipse.virgo.util.jmx/src/test/java/org/eclipse/virgo/util/jmx/JmxExceptionCleanerTestInterface.java b/util/org.eclipse.virgo.util.jmx/src/test/java/org/eclipse/virgo/util/jmx/JmxExceptionCleanerTestInterface.java
new file mode 100644
index 0000000..3135ec2
--- /dev/null
+++ b/util/org.eclipse.virgo.util.jmx/src/test/java/org/eclipse/virgo/util/jmx/JmxExceptionCleanerTestInterface.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.jmx;
+
+import javax.management.MXBean;
+
+import org.eclipse.virgo.util.jmx.ExceptionCleaner;
+
+/**
+ * This is an annotated @{@link MXBean} interface for testing the {@link ExceptionCleaner} aspect.
+ * <p />
+ *
+ */
+@MXBean
+//FIXME Bug 463462 - Move back to test source folder when we know how to weave test classes
+public interface JmxExceptionCleanerTestInterface {
+    
+    public void caughtMethod() throws Exception;
+    
+    public void anotherCaughtMethod();
+
+}
diff --git a/util/org.eclipse.virgo.util.jmx/template.mf b/util/org.eclipse.virgo.util.jmx/template.mf
new file mode 100644
index 0000000..77592e1
--- /dev/null
+++ b/util/org.eclipse.virgo.util.jmx/template.mf
@@ -0,0 +1,10 @@
+Bundle-ManifestVersion: 2
+Bundle-Name: Jmx utility code
+Bundle-SymbolicName: org.eclipse.virgo.util.jmx
+Bundle-Version: ${version}
+Import-Template:
+ javax.annotation.*;version="0",
+ org.aspectj.*;version="${aspectjVersion:[=.=.=, +1)}",
+ org.slf4j.*;version="${slf4jVersion:[=.=.0, +1.0.0)}"
+Excluded-Exports:
+ org.eclipse.virgo.util.jmx.internal.*
diff --git a/util/org.eclipse.virgo.util.math/.springBeans b/util/org.eclipse.virgo.util.math/.springBeans
new file mode 100644
index 0000000..d079ca1
--- /dev/null
+++ b/util/org.eclipse.virgo.util.math/.springBeans
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beansProjectDescription>
+	<version>1</version>
+	<pluginVersion><![CDATA[2.2.4.RELEASE]]></pluginVersion>
+	<configSuffixes>
+		<configSuffix><![CDATA[xml]]></configSuffix>
+	</configSuffixes>
+	<enableImports><![CDATA[false]]></enableImports>
+	<configs>
+	</configs>
+	<configSets>
+	</configSets>
+</beansProjectDescription>
diff --git a/util/org.eclipse.virgo.util.math/src/main/java/org/eclipse/virgo/util/math/ConcurrentHashSet.java b/util/org.eclipse.virgo.util.math/src/main/java/org/eclipse/virgo/util/math/ConcurrentHashSet.java
new file mode 100644
index 0000000..e0fec25
--- /dev/null
+++ b/util/org.eclipse.virgo.util.math/src/main/java/org/eclipse/virgo/util/math/ConcurrentHashSet.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.math;
+
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+public final class ConcurrentHashSet<Elem> implements ConcurrentSet<Elem> {
+
+    private final ConcurrentMap<Elem, Boolean> elems = new ConcurrentHashMap<Elem, Boolean>();
+
+    public boolean add(Elem e) {
+        return null == this.elems.putIfAbsent(e, Boolean.TRUE);
+    }
+
+    public boolean addAll(Collection<? extends Elem> c) {
+        boolean updated = false;
+        for (Elem e : c) {
+            updated = updated | add(e);
+        }
+        return updated;
+    }
+
+    public void clear() {
+        this.elems.clear();
+    }
+
+    public boolean contains(Object o) {
+        return this.elems.containsKey(o);
+    }
+
+    public boolean containsAll(Collection<?> c) {
+        for (Object o : c) {
+            if (!contains(o)) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    public boolean isEmpty() {
+        return this.elems.isEmpty();
+    }
+
+    public Iterator<Elem> iterator() {
+        return this.elems.keySet().iterator();
+    }
+
+    public boolean remove(Object o) {
+        return null != this.elems.remove(o);
+    }
+
+    public boolean removeAll(Collection<?> c) {
+        boolean updated = false;
+        for (Object o : c) {
+            updated = updated | remove(o);
+        }
+        return updated;
+    }
+
+    public boolean retainAll(Collection<?> c) {
+        boolean updated = false;
+        for (Elem e : this.elems.keySet()) {
+            if (!c.contains(e)) {
+                updated = true;
+                this.elems.remove(e);
+            }
+        }
+        return updated;
+    }
+
+    public int size() {
+        return this.elems.size();
+    }
+
+    public Object[] toArray() {
+        return this.elems.keySet().toArray();
+    }
+
+    public <T> T[] toArray(T[] a) {
+        return this.elems.keySet().toArray(a);
+    }
+
+}
diff --git a/util/org.eclipse.virgo.util.math/src/main/java/org/eclipse/virgo/util/math/ConcurrentMapRelation.java b/util/org.eclipse.virgo.util.math/src/main/java/org/eclipse/virgo/util/math/ConcurrentMapRelation.java
new file mode 100644
index 0000000..2035830
--- /dev/null
+++ b/util/org.eclipse.virgo.util.math/src/main/java/org/eclipse/virgo/util/math/ConcurrentMapRelation.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.math;
+
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+public final class ConcurrentMapRelation<X, Y> implements ConcurrentRelation<X, Y> {
+
+    /*
+     * Model a relation of type X <-> Y as a map to a power set X +> P Y. For correct concurrent behaviour the domain of
+     * the map is monotonically increasing, i.e. we never remove an item even if the corresponding power set becomes
+     * empty. For this reason, this type of relation should not be used for long lived relations with highly variable
+     * domains.
+     */
+    private final ConcurrentMap<X, ConcurrentSet<Y>> rel = new ConcurrentHashMap<X, ConcurrentSet<Y>>();
+
+    public boolean add(X x, Y y) {
+        ensure(x);
+        return this.rel.get(x).add(y);
+    }
+
+    public boolean contains(X x, Y y) {
+        ensure(x);
+        return this.rel.get(x).contains(y);
+    }
+
+    public Set<X> dom() {
+        return this.rel.keySet();
+    }
+
+    /**
+     * The result is potentially blurred in the presence of concurrency.
+     */
+    public Set<Y> ran() {
+        Set<Y> range = new ConcurrentHashSet<Y>();
+        for (ConcurrentSet<Y> rangeSet : this.rel.values()) {
+            range.addAll(rangeSet);
+        }
+        return range;
+    }
+
+    public boolean remove(X x, Y y) {
+        ensure(x);
+        return this.rel.get(x).remove(y);
+    }
+
+    private void ensure(X x) {
+        if (!this.rel.containsKey(x)) {
+            this.rel.putIfAbsent(x, new ConcurrentHashSet<Y>());
+        }
+    }
+
+    public Set<Y> relationalImage(Set<X> xset) {
+        Set<Y> rImg = new ConcurrentHashSet<Y>();
+        for (X x : xset) {
+            if (this.rel.containsKey(x)) {
+                rImg.addAll(this.rel.get(x));
+            }
+        }
+        return rImg;
+    }
+
+    public void domSubtract(Set<X> xset) {
+        for (X x : xset) {
+            this.rel.remove(x);
+        }
+    }
+
+}
diff --git a/util/org.eclipse.virgo.util.math/src/main/java/org/eclipse/virgo/util/math/ConcurrentRelation.java b/util/org.eclipse.virgo.util.math/src/main/java/org/eclipse/virgo/util/math/ConcurrentRelation.java
new file mode 100644
index 0000000..748dd87
--- /dev/null
+++ b/util/org.eclipse.virgo.util.math/src/main/java/org/eclipse/virgo/util/math/ConcurrentRelation.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.math;
+
+import java.util.Set;
+
+/**
+ * Provide a mathematical relation which is notionally a set of ordered pairs. It represents a relationship between the
+ * members of two sets: the domain and the range.
+ * 
+ * 
+ * @param <X> the type of elements in the domain of the relation
+ * @param <Y> the type of elements in the range of the relation
+ */
+public interface ConcurrentRelation<X, Y> {
+
+    /**
+     * Add the given pair (x, y) to the relation. It is not an error if the pair is already present.
+     * 
+     * @param x
+     * @param y
+     * @return true if and only if the relation was updated
+     */
+    boolean add(X x, Y y);
+
+    /**
+     * Remove the given pair (x, y) from the relation. It is not an error if the pair is not present.
+     * 
+     * @param x
+     * @param y
+     * @return true if and only if the relation was updated
+     */
+    boolean remove(X x, Y y);
+
+    /**
+     * Return true if and only if the given pair (x, y) is present in the relation.
+     * 
+     * @param x
+     * @param y
+     * @return true if the pair is present in the relation
+     */
+    boolean contains(X x, Y y);
+
+    /**
+     * Return the domain of the relation.
+     * 
+     * @return a set comprising the domain
+     */
+    Set<X> dom();
+
+    /**
+     * Return the range of the relation.
+     * 
+     * @return a set comprising the range
+     */
+    Set<Y> ran();
+
+    /**
+     * Return the relational image of a set of X's.
+     * 
+     * @param xset a set of X's
+     * @return the set of Y's which relate to X's in xset
+     */
+    Set<Y> relationalImage(Set<X> xset);
+
+    /**
+     * Remove all the pairs (x, y) where x is in the given set of X's.
+     * 
+     * @param xset a set of X's
+     */
+    void domSubtract(Set<X> xset);
+}
diff --git a/util/org.eclipse.virgo.util.math/src/main/java/org/eclipse/virgo/util/math/ConcurrentSet.java b/util/org.eclipse.virgo.util.math/src/main/java/org/eclipse/virgo/util/math/ConcurrentSet.java
new file mode 100644
index 0000000..2ad0aaa
--- /dev/null
+++ b/util/org.eclipse.virgo.util.math/src/main/java/org/eclipse/virgo/util/math/ConcurrentSet.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.math;
+
+import java.util.Set;
+
+/**
+ * 
+ * Implementations of this interface are thread safe.
+ * 
+ * @param <Elem> type of elements
+ */
+public interface ConcurrentSet<Elem> extends Set<Elem> {
+
+}
diff --git a/util/org.eclipse.virgo.util.math/src/main/java/org/eclipse/virgo/util/math/OrderedPair.java b/util/org.eclipse.virgo.util.math/src/main/java/org/eclipse/virgo/util/math/OrderedPair.java
new file mode 100644
index 0000000..f643e4c
--- /dev/null
+++ b/util/org.eclipse.virgo.util.math/src/main/java/org/eclipse/virgo/util/math/OrderedPair.java
@@ -0,0 +1,113 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.math;
+
+/**
+ * Defines an ordered pair of elements of types <code>F</code> and <code>S</code> respectively.
+ * <p/>
+ * The elements may be null, in which case they are without type.
+ * <br/>For example:
+ * <pre>
+ *        ( new OrderedPair<Long,Long  >(42,null) )
+ * .equals( new OrderedPair<Long,String>(42,null) )</pre>
+ * returns <code>true</code>.
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br/>
+ * Implementation is immutable.<br/> 
+ * <strong>Note:</strong> the elements are <code>final</code> but that doesn't stop
+ * them being modified after the pair is constructed. The <code>hashCode()</code> of the <code>OrderedPair</code> may then change.
+ * 
+ * @param <F> type of first element
+ * @param <S> type of second element
+ * 
+ */
+public final class OrderedPair<F, S> {
+
+	private final F first;
+
+	private final S second;
+
+	/**
+	 * Creates a new <code>OrderedPair</code>.
+	 * 
+	 * @param first
+	 *            the first member of the <code>OrderedPair</code>.
+	 * @param second
+	 *            the second member of the <code>OrderedPair</code>.
+	 */
+	public OrderedPair(F first, S second) {
+		this.first = first;
+		this.second = second;
+	}
+
+	/**
+	 * Gets the first member of the <code>OrderedPair</code>.
+	 * 
+	 * @return the first member of the <code>OrderedPair</code>.
+	 */
+	public F getFirst() {
+		return this.first;
+	}
+
+	/**
+	 * Gets the second member of the <code>OrderedPair</code>.
+	 * 
+	 * @return the second member of the <code>OrderedPair</code>.
+	 */
+	public S getSecond() {
+		return this.second;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = this.first == null ? 0 : this.first.hashCode();
+		result = prime * result
+				+ (this.second == null ? 0 : this.second.hashCode());
+		return result;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj) {
+			return true;
+		}
+		if (obj == null) {
+			return false;
+		}
+		if (getClass() != obj.getClass()) {
+			return false;
+		}
+		
+		@SuppressWarnings("unchecked")
+        final OrderedPair<F, S> other = (OrderedPair<F, S>) obj;
+		
+		return (this.first==null  ? other.first==null  : this.first.equals(other.first))
+		    && (this.second==null ? other.second==null : this.second.equals(other.second));
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public String toString() {
+		return "(" + String.valueOf(this.first) + ", " + String.valueOf(this.second) + ")";
+	}
+
+}
diff --git a/util/org.eclipse.virgo.util.math/src/main/java/org/eclipse/virgo/util/math/Range.java b/util/org.eclipse.virgo.util.math/src/main/java/org/eclipse/virgo/util/math/Range.java
new file mode 100644
index 0000000..b83c6ea
--- /dev/null
+++ b/util/org.eclipse.virgo.util.math/src/main/java/org/eclipse/virgo/util/math/Range.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.math;
+
+/**
+ * This class is thread safe.
+ * 
+ * @param <T> type of Comparable element
+ */
+
+public final class Range<T extends Comparable<? super T>> {
+
+	public static final String FLOOR_INCLUSIVE_DELIMITER = "[";
+
+	public static final String CEILING_INCLUSIVE_DELIMITER = "]";
+
+	public static final String FLOOR_EXCLUSIVE_DELIMITER = "(";
+
+	public static final String CEILING_EXCLUSIVE_DELIMITER = ")";
+
+	public static final String SEPARATOR = ",";
+
+	private final T floor, ceiling;
+
+	private final boolean floorInc, ceilingInc;
+
+	public Range(T floor, boolean floorInc, T ceiling, boolean ceilingInc) {
+		this.floor = floor;
+		this.floorInc = floorInc;
+		this.ceiling = ceiling;
+		this.ceilingInc = ceilingInc;
+	}
+
+	public boolean contains(T t) {
+		int minCheck = this.floorInc ? 0 : 1;
+		int maxCheck = this.ceilingInc ? 0 : -1;
+		return t.compareTo(this.floor) >= minCheck
+				&& t.compareTo(this.ceiling) <= maxCheck;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public String toString() {
+		StringBuffer result = new StringBuffer();
+		result.append(this.floorInc ? FLOOR_INCLUSIVE_DELIMITER
+				: FLOOR_EXCLUSIVE_DELIMITER);
+		result.append(this.floor.toString());
+		result.append(SEPARATOR);
+		result.append(this.ceiling.toString());
+		result.append(this.ceilingInc ? CEILING_INCLUSIVE_DELIMITER
+				: CEILING_EXCLUSIVE_DELIMITER);
+		return result.toString();
+	}
+}
diff --git a/util/org.eclipse.virgo.util.math/src/main/java/org/eclipse/virgo/util/math/Sets.java b/util/org.eclipse.virgo.util.math/src/main/java/org/eclipse/virgo/util/math/Sets.java
new file mode 100644
index 0000000..5372e85
--- /dev/null
+++ b/util/org.eclipse.virgo.util.math/src/main/java/org/eclipse/virgo/util/math/Sets.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.math;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Defines common operations on {@link Set Sets}.<p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.
+ * 
+ */
+public class Sets {
+
+    /**
+     * Calculates the difference between <code>a</code> and <code>b</code>.
+     * 
+     * @param <T> the type of the <code>Set</code>.
+     * @param a the lhs of the difference.
+     * @param b the rhs of the difference.
+     * @return the difference between <code>a</code> and <code>b</code>.
+     */
+	public static <T> Set<T> difference(Set<T> a, Set<T> b) {
+        Set<T> result = new HashSet<T>(a);
+        result.removeAll(b);
+        return result;
+    }
+
+    /**
+     * Calculates the intersection between <code>a</code> and <code>b</code>.
+     * 
+     * @param <T> the type of the <code>Set</code>.
+     * @param a the lhs of the intersection.
+     * @param b the rhs of the intersection.
+     * @return the intersection between <code>a</code> and <code>b</code>.
+     */
+    public static <T> Set<T> intersection(Set<T> a, Set<T> b) {
+        Set<T> iter = a.size() < b.size() ? a : b;
+        Set<T> other = iter == a ? b : a;
+
+        Set<T> result = new HashSet<T>();
+        for (T t : iter) {
+            if (other.contains(t)) {
+                result.add(t);
+            }
+        }
+        return result;
+    }
+
+    /**
+     * Creates a <code>Set</code> containing the supplied items.
+     * 
+     * @param <T> the type of the <code>Set</code> entries.
+     * @param items the <code>Set</code> contents.
+     * @return the resultant <code>Set</code>.
+     */
+    public static <T> Set<T> asSet(T... items) {
+        Set<T> set = new HashSet<T>(items.length);
+        Collections.addAll(set, items);
+        return set;
+    }
+}
diff --git a/util/org.eclipse.virgo.util.math/src/main/resources/about.html b/util/org.eclipse.virgo.util.math/src/main/resources/about.html
new file mode 100644
index 0000000..c258ef5
--- /dev/null
+++ b/util/org.eclipse.virgo.util.math/src/main/resources/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>June 5, 2006</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/util/org.eclipse.virgo.util.math/src/test/java/org/eclipse/virgo/util/math/ConcurrentHashMapConcurrentHashSetRelationTests.java b/util/org.eclipse.virgo.util.math/src/test/java/org/eclipse/virgo/util/math/ConcurrentHashMapConcurrentHashSetRelationTests.java
new file mode 100644
index 0000000..2497259
--- /dev/null
+++ b/util/org.eclipse.virgo.util.math/src/test/java/org/eclipse/virgo/util/math/ConcurrentHashMapConcurrentHashSetRelationTests.java
@@ -0,0 +1,125 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.math;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import junit.framework.Assert;
+
+import org.eclipse.virgo.util.math.ConcurrentMapRelation;
+import org.eclipse.virgo.util.math.ConcurrentRelation;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ConcurrentHashMapConcurrentHashSetRelationTests {
+
+    private static final String[] forename = { "G", "S", "D", "P", "S", "P" };
+
+    private static final String[] surname = { "N", "N", "N", "N", "B", "B" };
+
+    private ConcurrentRelation<String, String> name;
+
+    @Before public void setUp() throws Exception {
+        this.name = new ConcurrentMapRelation<String, String>();
+    }
+
+    @After public void tearDown() throws Exception {
+    }
+
+    @Test public void testBasicOperations() {
+        for (int i = 0; i < forename.length; i++) {
+            Assert.assertFalse(this.name.contains(forename[i], surname[i]));
+        }
+        for (int i = 0; i < forename.length; i++) {
+            Assert.assertTrue(this.name.add(forename[i], surname[i]));
+        }
+        for (int i = 0; i < forename.length; i++) {
+            Assert.assertFalse(this.name.add(forename[i], surname[i]));
+        }
+        for (int i = 0; i < forename.length; i++) {
+            Assert.assertTrue(this.name.contains(forename[i], surname[i]));
+        }
+        Assert.assertTrue(this.name.remove(forename[0], surname[0]));
+        Assert.assertFalse(this.name.contains(forename[0], surname[0]));
+        Assert.assertFalse(this.name.remove(forename[0], surname[0]));
+    }
+
+    @Test public void testDomain() {
+        for (int i = 0; i < forename.length; i++) {
+            Assert.assertTrue(this.name.add(forename[i], surname[i]));
+        }
+        Set<String> domain = this.name.dom();
+        // Check forname is a subset of domain
+        for (int i = 0; i < forename.length; i++) {
+            Assert.assertTrue(domain.contains(forename[i]));
+        }
+        // Check domain is a subset of forname
+        for (String d : domain) {
+            boolean found = false;
+            for (int i = 0; i < forename.length; i++) {
+                if (d.equals(forename[i])) {
+                    found = true;
+                }
+            }
+            Assert.assertTrue(found);
+        }
+    }
+
+    @Test public void testRange() {
+        for (int i = 0; i < forename.length; i++) {
+            Assert.assertTrue(this.name.add(forename[i], surname[i]));
+        }
+        Set<String> range = this.name.ran();
+        // Check surname is a subset of range
+        for (int i = 0; i < surname.length; i++) {
+            Assert.assertTrue(range.contains(surname[i]));
+        }
+        // Check range is a subset of surname
+        for (String r : range) {
+            boolean found = false;
+            for (int i = 0; i < surname.length; i++) {
+                if (r.equals(surname[i])) {
+                    found = true;
+                }
+            }
+            Assert.assertTrue(found);
+        }
+    }
+
+    @Test public void testRelationalImage() {
+        for (int i = 0; i < forename.length; i++) {
+            Assert.assertTrue(this.name.add(forename[i], surname[i]));
+        }
+        Set<String> xset = new HashSet<String>();
+        xset.add("S");
+        xset.add("Q");
+        Set<String> expectedRelationalImage = new HashSet<String>();
+        expectedRelationalImage.add("N");
+        expectedRelationalImage.add("B");
+        Assert.assertEquals(expectedRelationalImage, this.name.relationalImage(xset));
+    }
+
+    @Test public void testDomSubtract() {
+        for (int i = 0; i < forename.length; i++) {
+            Assert.assertTrue(this.name.add(forename[i], surname[i]));
+        }
+        Set<String> xset = new HashSet<String>();
+        xset.add("S");
+        xset.add("P");
+        this.name.domSubtract(xset);
+        Set<String> expectedRange = new HashSet<String>();
+        expectedRange.add("N");
+        Assert.assertEquals(expectedRange, this.name.ran());
+    }
+}
diff --git a/util/org.eclipse.virgo.util.math/src/test/java/org/eclipse/virgo/util/math/ConcurrentHashSetTests.java b/util/org.eclipse.virgo.util.math/src/test/java/org/eclipse/virgo/util/math/ConcurrentHashSetTests.java
new file mode 100644
index 0000000..7da9095
--- /dev/null
+++ b/util/org.eclipse.virgo.util.math/src/test/java/org/eclipse/virgo/util/math/ConcurrentHashSetTests.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.math;
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+import junit.framework.Assert;
+
+import org.eclipse.virgo.util.math.ConcurrentHashSet;
+import org.eclipse.virgo.util.math.ConcurrentSet;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ConcurrentHashSetTests {
+
+    private final static String[] names = { "Chris", "Damilola", "Glyn", "Rob", "Sam" };
+
+    private final static String extra = "Adrian";
+
+    private final Set<String> strings = new HashSet<String>();
+
+    final ConcurrentSet<String> s = new ConcurrentHashSet<String>();
+
+    @Before public void setUp() throws Exception {
+        for (final String s : names) {
+            this.strings.add(s);
+        }
+        this.s.clear();
+    }
+
+    @After public void tearDown() throws Exception {
+    }
+
+    @Test public void cornerCases() {
+        Assert.assertTrue(this.s.isEmpty());
+        Assert.assertFalse(this.s.contains(names[0]));
+        Assert.assertFalse(this.s.remove(names[0]));
+        Assert.assertFalse(this.s.removeAll(this.strings));
+        Assert.assertFalse(this.s.retainAll(this.strings));
+    }
+
+    @Test public void mainline() {
+        Assert.assertTrue(this.s.add(names[0]));
+        Assert.assertFalse(this.s.containsAll(this.strings));
+        Assert.assertTrue(this.s.addAll(this.strings));
+        Assert.assertEquals(this.s.size(), this.strings.size());
+        Iterator<String> i = this.s.iterator();
+        while (i.hasNext()) {
+            Assert.assertTrue(this.strings.contains(i.next()));
+        }
+        Assert.assertTrue(this.s.remove(names[0]));
+        Assert.assertTrue(this.s.removeAll(this.strings));
+    }
+
+    @Test public void extras() {
+        Assert.assertTrue(this.s.addAll(this.strings));
+        Assert.assertTrue(this.s.add(extra));
+        Assert.assertTrue(this.s.retainAll(this.strings));
+        Assert.assertTrue(this.s.containsAll(this.strings));
+        Assert.assertFalse(this.s.contains(extra));
+        Assert.assertEquals(this.s.toArray().length, this.strings.size());
+        String[] str = new String[this.strings.size()];
+        String[] str2 = this.s.toArray(str);
+        Assert.assertEquals(str2.length, this.strings.size());
+        for (String t : str2) {
+            Assert.assertTrue(this.s.contains(t));
+        }
+    }
+}
diff --git a/util/org.eclipse.virgo.util.math/src/test/java/org/eclipse/virgo/util/math/OrderedPairTests.java b/util/org.eclipse.virgo.util.math/src/test/java/org/eclipse/virgo/util/math/OrderedPairTests.java
new file mode 100644
index 0000000..9ec5d50
--- /dev/null
+++ b/util/org.eclipse.virgo.util.math/src/test/java/org/eclipse/virgo/util/math/OrderedPairTests.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.math;
+
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertSame;
+import static junit.framework.Assert.assertTrue;
+import static junit.framework.Assert.assertEquals;
+
+import org.eclipse.virgo.util.math.OrderedPair;
+import org.junit.Test;
+
+public class OrderedPairTests {
+
+    @Test
+    public void getters() {
+        String orange = "orange";
+        String blue = "blue";
+        OrderedPair<String, String> o = new OrderedPair<String, String>(orange, blue);
+
+        assertSame(orange, o.getFirst());
+        assertSame(blue, o.getSecond());
+        assertEquals("toString value unexpected", "(orange, blue)", o.toString());
+    }
+
+    @Test
+    public void equalsAndHashCode() {
+        OrderedPair<Integer, Integer> alpha = new OrderedPair<Integer, Integer>(1, 2);
+        OrderedPair<String, String> bravo = new OrderedPair<String, String>("first", "second");
+        OrderedPair<String, String> charlie = new OrderedPair<String, String>("orange", "blue");
+        OrderedPair<String, String> delta = new OrderedPair<String, String>("orange", "blue");
+
+        assertNotEqualsAndHashCodeNotEqual(alpha, bravo);
+        assertEqualsAndHashCodeEqual(alpha, alpha);
+        assertNotEqualsAndHashCodeNotEqual(bravo, charlie);
+        assertEqualsAndHashCodeEqual(charlie, delta);
+
+        assertFalse(alpha.equals(null));
+        assertFalse(alpha.equals(new Integer(1)));
+    }
+
+    @Test
+    public void nullElements() {
+        OrderedPair<Integer, Integer> abel = new OrderedPair<Integer, Integer>(null, null);
+        OrderedPair<Integer, Integer> baker = new OrderedPair<Integer, Integer>(null, null);
+        OrderedPair<Integer, Integer> charlie = new OrderedPair<Integer, Integer>(1, null);
+        OrderedPair<Integer, Integer> dog = new OrderedPair<Integer, Integer>(1, null);
+        OrderedPair<Integer, Integer> easy = new OrderedPair<Integer, Integer>(null, 2);
+        OrderedPair<Integer, Integer> fox = new OrderedPair<Integer, Integer>(null, 2);
+        OrderedPair<Integer, String> gorilla = new OrderedPair<Integer, String>(null, null);
+        
+        assertSame(null, abel.getFirst());
+        assertSame(null, abel.getSecond());
+        assertEquals("toString value unexpected", "(null, null)", abel.toString());
+        
+        assertEqualsAndHashCodeEqual(abel, baker);
+        assertEqualsAndHashCodeEqual(charlie, dog);
+        assertEqualsAndHashCodeEqual(easy, fox);
+
+        assertNotEqualsAndHashCodeNotEqual(abel, charlie);
+        assertNotEqualsAndHashCodeNotEqual(charlie, easy);
+        assertNotEqualsAndHashCodeNotEqual(abel, fox);
+
+        assertEqualsAndHashCodeEqual(abel, gorilla);
+    }
+
+    private void assertEqualsAndHashCodeEqual(OrderedPair<?, ?> o, OrderedPair<?, ?> p) {
+        assertTrue(o.equals(p));
+        assertTrue(o.hashCode() == p.hashCode());
+        assertEquals(o.toString(), p.toString());
+    }
+
+    private void assertNotEqualsAndHashCodeNotEqual(OrderedPair<?, ?> o, OrderedPair<?, ?> p) {
+        assertFalse(o.equals(p));
+        assertFalse(o.hashCode() == p.hashCode());
+        assertFalse(o.toString().equals(p.toString()));
+    }
+}
diff --git a/util/org.eclipse.virgo.util.math/src/test/java/org/eclipse/virgo/util/math/RangeTests.java b/util/org.eclipse.virgo.util.math/src/test/java/org/eclipse/virgo/util/math/RangeTests.java
new file mode 100644
index 0000000..0e463e8
--- /dev/null
+++ b/util/org.eclipse.virgo.util.math/src/test/java/org/eclipse/virgo/util/math/RangeTests.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.math;
+
+import org.eclipse.virgo.util.math.Range;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class RangeTests {
+
+    @Test
+    public void testIntRangeIncInc() {
+        Range<Integer> r = new Range<Integer>(0, true, 2, true);
+        Assert.assertTrue(r.contains(0));
+        Assert.assertTrue(r.contains(1));
+        Assert.assertTrue(r.contains(2));
+        Assert.assertFalse(r.contains(3));
+    }
+
+    @Test
+    public void testIntRangeIncExc() {
+        Range<Integer> r = new Range<Integer>(0, true, 2, false);
+        Assert.assertTrue(r.contains(0));
+        Assert.assertTrue(r.contains(1));
+        Assert.assertFalse(r.contains(2));
+        Assert.assertFalse(r.contains(3));
+    }
+
+    @Test
+    public void testIntRangeExcInc() {
+        Range<Integer> r = new Range<Integer>(0, false, 2, true);
+        Assert.assertFalse(r.contains(0));
+        Assert.assertTrue(r.contains(1));
+        Assert.assertTrue(r.contains(2));
+        Assert.assertFalse(r.contains(3));
+    }
+
+    @Test
+    public void testIntRangeExcExc() {
+        Range<Integer> r = new Range<Integer>(0, false, 2, false);
+        Assert.assertFalse(r.contains(0));
+        Assert.assertTrue(r.contains(1));
+        Assert.assertFalse(r.contains(2));
+        Assert.assertFalse(r.contains(3));
+    }
+
+    @Test
+    public void testIntRangeEmpty() {
+        Range<Integer> r = new Range<Integer>(1, true, 0, true);
+        Assert.assertFalse(r.contains(0));
+        Assert.assertFalse(r.contains(1));
+    }
+
+    @Test
+    public void testRangeToString() {
+        Range<Integer> closed0_closed2 = new Range<Integer>(0, true, 2, true);
+        Assert.assertEquals("Unexpected toString result", "[0,2]", closed0_closed2.toString());
+        
+        Range<Integer> open0_closed2 = new Range<Integer>(0, false, 2, true);
+        Assert.assertEquals("Unexpected toString result", "(0,2]", open0_closed2.toString());
+        
+        Range<Integer> closed0_open2 = new Range<Integer>(0, true, 2, false);
+        Assert.assertEquals("Unexpected toString result", "[0,2)", closed0_open2.toString());
+        
+        Range<Integer> open0_open2 = new Range<Integer>(0, false, 2, false);
+        Assert.assertEquals("Unexpected toString result", "(0,2)", open0_open2.toString());
+        
+        Range<Integer> empty = new Range<Integer>(1, true, 0, true);
+        Assert.assertEquals("Unexpected toString result", "[1,0]", empty.toString());
+    }
+}
diff --git a/util/org.eclipse.virgo.util.math/src/test/java/org/eclipse/virgo/util/math/SetsTests.java b/util/org.eclipse.virgo.util.math/src/test/java/org/eclipse/virgo/util/math/SetsTests.java
new file mode 100644
index 0000000..fa6f2ac
--- /dev/null
+++ b/util/org.eclipse.virgo.util.math/src/test/java/org/eclipse/virgo/util/math/SetsTests.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.math;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Set;
+
+import org.eclipse.virgo.util.math.Sets;
+import org.junit.Test;
+
+/**
+ */
+public class SetsTests {
+
+    @Test public void difference() {
+        Set<String> a = Sets.asSet("a", "b", "c");
+        Set<String> b = Sets.asSet("a", "c");
+        Set<String> r = Sets.difference(a, b);
+        assertEquals(1, r.size());
+        assertTrue(r.contains("b"));
+    }
+
+    @Test public void intersection() {
+        Set<String> a = Sets.asSet("a", "b", "c", "d");
+        Set<String> b = Sets.asSet("a", "c", "e");
+        Set<String> r = Sets.intersection(a, b);
+        Set<String> s = Sets.intersection(b, a);
+        assertEquals(r,s);
+        assertEquals(2, r.size());
+        assertTrue(r.contains("a")); 
+        assertTrue(r.contains("c"));
+    }
+}
diff --git a/util/org.eclipse.virgo.util.math/template.mf b/util/org.eclipse.virgo.util.math/template.mf
new file mode 100644
index 0000000..0c864f4
--- /dev/null
+++ b/util/org.eclipse.virgo.util.math/template.mf
@@ -0,0 +1,4 @@
+Bundle-ManifestVersion: 2
+Bundle-Name: Mathematical Utility Code
+Bundle-SymbolicName: org.eclipse.virgo.util.math
+Bundle-Version: ${version}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/.springBeans b/util/org.eclipse.virgo.util.osgi.manifest/.springBeans
new file mode 100755
index 0000000..d079ca1
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/.springBeans
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beansProjectDescription>
+	<version>1</version>
+	<pluginVersion><![CDATA[2.2.4.RELEASE]]></pluginVersion>
+	<configSuffixes>
+		<configSuffix><![CDATA[xml]]></configSuffix>
+	</configSuffixes>
+	<enableImports><![CDATA[false]]></enableImports>
+	<configs>
+	</configs>
+	<configSets>
+	</configSets>
+</beansProjectDescription>
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/BundleActivationPolicy.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/BundleActivationPolicy.java
new file mode 100755
index 0000000..e44de4e
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/BundleActivationPolicy.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest;
+
+import java.util.List;
+
+/**
+ * Represents a bundle's <code>Bundle-ActivationPolicy</code> header.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ * May not be thread-safe.
+ */
+public interface BundleActivationPolicy extends Parameterised {
+
+    /**
+     * An enumeration of the legal values for a bundle's activation policy, 
+     * specified using the <code>Bundle-ActivationPolicy</code> header.
+     * <p />
+     */    
+    enum Policy {
+        /**
+         * The bundle will be activated eagerly.
+         */
+        EAGER,
+        /**
+         * The bundle will be activated lazily.
+         */
+        LAZY;
+    }
+
+    /**
+     * Returns the value of the <code>Bundle-ActivationPolicy</code> header. If no header
+     * is specified returns the default value of {@link Policy#EAGER}.
+     * @return the value of the <code>Bundle-ActivationPolicy</code> header.
+     */
+    Policy getActivationPolicy();
+    
+    /**
+     * Sets the value of the <code>Bundle-ActivationPolicy</code> header.
+     * 
+     * @param policy the bundle's activation policy.
+     */
+    void setActivationPolicy(Policy policy);
+    
+    /**
+     * Returns a list of the class names specified in the header's <code>exclude</code> directive. Returns an empty list
+     * if the header has no <code>exclude</code> directive.
+     * 
+     * @return the list of exclusions
+     */
+    List<String> getExclude();
+    
+    /**
+     * Returns a list of the class names specified in the header's <code>include</code> directive. Returns an empty list
+     * if the header has no <code>include</code> directive.
+     * 
+     * @return the list of inclusions
+     */
+    List<String> getInclude();
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/BundleManifest.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/BundleManifest.java
new file mode 100755
index 0000000..d830414
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/BundleManifest.java
@@ -0,0 +1,256 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest;
+
+import java.io.IOException;
+import java.io.Writer;
+import java.net.URL;
+import java.util.Dictionary;
+import java.util.List;
+
+import org.osgi.framework.Version;
+
+/**
+ * Represents an OSGi bundle's manifest.
+ * 
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations of this interface need not be thread safe.
+ * 
+ */
+public interface BundleManifest {
+
+    /**
+     * The <code>Import-Bundle</code> bundle manifest header.
+     */
+    public static final String IMPORT_BUNDLE = "Import-Bundle";
+
+    /**
+     * The <code>Import-Library</code> bundle manifest header.
+     */
+    public static final String IMPORT_LIBRARY = "Import-Library";
+
+    /**
+     * The <code>Module-Scope</code> bundle manifest header.
+     */
+    public static final String MODULE_SCOPE = "Module-Scope";
+
+    /**
+     * The <code>Module-Type</code> bundle manifest header.
+     */
+    public static final String MODULE_TYPE = "Module-Type";
+
+    /**
+     * Returns the <code>Bundle-ActivationPolicy</code> header, never <code>null</code>.
+     * 
+     * @return the <code>Bundle-ActivationPolicy</code> header.
+     */
+    BundleActivationPolicy getBundleActivationPolicy();
+
+    /**
+     * Returns a <code>List</code> containing an item for each entry in the comma-separated
+     * <code>Bundle-Classpath</code> header. Returns an empty list if the manifest does not contain a
+     * <code>Bundle-Classpath</code> header.
+     * 
+     * @return a <code>List</code> of the entries in the <code>Bundle-Classpath</code> header.
+     */
+    List<String> getBundleClasspath();
+
+    /**
+     * Returns the value of the <code>Bundle-Description</code> header, or <code>null</code> if no description is
+     * specified.
+     * 
+     * @return the value of the <code>Bundle-Description</code> header.
+     */
+    String getBundleDescription();
+
+    /**
+     * Sets the value of the <code>Bundle-Description</code> header.
+     * 
+     * @param bundleDescription The bundle's description
+     */
+    void setBundleDescription(String bundleDescription);
+
+    /**
+     * Returns the <code>Bundle-ManifestVersion</code> header, or <code>1</code> if no manifest version is specified.
+     * 
+     * @return the value of the <code>Bundle-ManifestVersion</code> header.
+     */
+    int getBundleManifestVersion();
+
+    /**
+     * Sets the value of the <code>Bundle-ManifestVersion</code> header.
+     * 
+     * @param bundleManifestVersion The bundle's bundle manifest version
+     * 
+     */
+    void setBundleManifestVersion(int bundleManifestVersion);
+
+    /**
+     * Returns the <code>Bundle-Name</code> header, or <code>null</code> if no name is specified.
+     * 
+     * @return the value of the <code>Bundle-Name</code> header.
+     */
+    String getBundleName();
+
+    /**
+     * Sets the value of the <code>Bundle-Name</code> header.
+     * 
+     * @param bundleName The bundle's name
+     */
+    void setBundleName(String bundleName);
+
+    /**
+     * Returns the <code>Bundle-SymbolicName</code> header, never <code>null</code>.
+     * 
+     * @return the <code>Bundle-SymbolicName</code> header.
+     */
+    BundleSymbolicName getBundleSymbolicName();
+
+    /**
+     * Returns the value of the <code>Bundle-UpdateLocation</code> header, or <code>null</code> if no update location is
+     * specified.
+     * 
+     * @return the value of the <code>Bundle-UpdateLocation</code> header.
+     */
+    URL getBundleUpdateLocation();
+
+    /**
+     * Sets the value of the <code>Bundle-UpdateLocation</code> header.
+     * 
+     * @param bundleUpdateLocation The bundle's update location
+     */
+    void setBundleUpdateLocation(URL bundleUpdateLocation);
+
+    /**
+     * Returns the <code>DynamicImport-Package</code> header, never <code>null</code>.
+     * 
+     * @return the <code>DynamicImport-Package</code> header.
+     */
+    DynamicImportPackage getDynamicImportPackage();
+
+    /**
+     * Returns the <code>Export-Package</code> header, never <code>null</code>.
+     * 
+     * @return the <code>Export-Package</code> header.
+     */
+    ExportPackage getExportPackage();
+
+    /**
+     * Returns the <code>Fragment-Host</code> header, never <code>null</code>.
+     * 
+     * @return the <code>Fragment-Host</code> header.
+     */
+    FragmentHost getFragmentHost();
+
+    /**
+     * Returns the <code>Import-Bundle</code> header, never <code>null</code>.
+     * 
+     * @return the <code>Import-Bundle</code> header.
+     */
+    ImportBundle getImportBundle();
+
+    /**
+     * Returns the <code>Import-Library</code> header, never <code>null</code>.
+     * 
+     * @return the <code>Import-Library</code> header.
+     */
+    ImportLibrary getImportLibrary();
+
+    /**
+     * Returns the <code>Import-Package</code> header, never <code>null</code>.
+     * 
+     * @return the <code>Import-Package</code> header.
+     */
+    ImportPackage getImportPackage();
+
+    /**
+     * Returns the value of the <code>Module-Scope</code> header, or <code>null</code> if no module scope is specified.
+     * 
+     * @return the value of the <code>Module-Scope</code> header.
+     */
+    String getModuleScope();
+
+    /**
+     * Sets the value of the <code>Module-Scope</code> header.
+     * 
+     * @param moduleScope The bundle's module scope
+     */
+    void setModuleScope(String moduleScope);
+
+    /**
+     * Returns the value of the <code>Module-Type</code> header, or <code>null</code> if no module type is specified.
+     * 
+     * @return the value of the <code>Module-Type</code> header.
+     */
+    String getModuleType();
+
+    /**
+     * Sets the value of the <code>Module-Type</code> header.
+     * 
+     * @param moduleType The bundle's module type
+     */
+    void setModuleType(String moduleType);
+
+    /**
+     * Returns the <code>Require-Bundle</code> header, never <code>null</code>.
+     * 
+     * @return the <code>Require-Bundle</code> header.
+     */
+    RequireBundle getRequireBundle();
+
+    /**
+     * Returns the value of the <code>Bundle-Version</code> header, or <code>null</code> if no version is specified.
+     * 
+     * @return the bundle's version
+     */
+    Version getBundleVersion();
+
+    /**
+     * Set the value of the <code>Bundle-Version</code> header.
+     * 
+     * @param bundleVersion bundle's version
+     */
+    void setBundleVersion(Version bundleVersion);
+
+    /**
+     * Returns the value of the header identified by the supplied name.
+     * 
+     * @param name the name of the header
+     * @return the value of the header
+     */
+    String getHeader(String name);
+
+    /**
+     * Sets the header with the supplied name to have the supplied value.
+     * 
+     * @param name The name of the header
+     * @param value The value of the header
+     */
+    void setHeader(String name, String value);
+
+    /**
+     * Returns a snapshot of this manifest as a {@link Dictionary}
+     * 
+     * @return This manifest in <code>Dictionary</code> form.
+     */
+    Dictionary<String, String> toDictionary();
+    
+    /**
+     * Writes the contents of this manifest to the supplied writer
+     * @param writer the writer to which the manifest is written
+     * @throws IOException if a problem occurs when writing out the manifest
+     */
+    void write(Writer writer) throws IOException;
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/BundleManifestFactory.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/BundleManifestFactory.java
new file mode 100755
index 0000000..4e47045
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/BundleManifestFactory.java
@@ -0,0 +1,104 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.util.Dictionary;
+
+import org.eclipse.virgo.util.osgi.manifest.internal.StandardBundleManifest;
+import org.eclipse.virgo.util.osgi.manifest.parse.DummyParserLogger;
+import org.eclipse.virgo.util.osgi.manifest.parse.ParserLogger;
+import org.eclipse.virgo.util.parser.manifest.ManifestContents;
+
+
+/**
+ * This interface provides factory methods for creating empty bundle manifests and empty instances of the more complex
+ * bundle headers.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations of this interface must be thread safe.
+ * 
+ */
+public class BundleManifestFactory {
+
+    /**
+     * Creates a new, empty {@link BundleManifest}.
+     * 
+     * @return the new <code>BundleManifest</code>.
+     */
+    public static BundleManifest createBundleManifest() {
+        return createBundleManifest(new DummyParserLogger());
+    }
+
+    /**
+     * Creates a new, empty {@link BundleManifest}.
+     * 
+     * @param parserLogger The parser logger to use when creating new headers in the manifest
+     * @return the new <code>BundleManifest</code>.
+     */
+    public static BundleManifest createBundleManifest(ParserLogger parserLogger) {
+        return new StandardBundleManifest(parserLogger);
+    }
+
+    /**
+     * Creates a new {@link BundleManifest} derived from the supplied {@link Dictionary} of bundle manifest headers.
+     * 
+     * @param headers The <code>Dictionary</code> of headers
+     * @return The <code>BundleManifest</code> derived from the <code>Dictionary</code>.
+     */
+    public static BundleManifest createBundleManifest(Dictionary<String, String> headers) {
+        return createBundleManifest(headers, new DummyParserLogger());
+    }
+
+    /**
+     * Creates a new {@link BundleManifest} derived from the supplied {@link Dictionary} of bundle manifest headers. The
+     * supplied {@link ParserLogger} will be used to report problems encountered during parsing.
+     * 
+     * @param headers The <code>Dictionary</code> of headers
+     * @param parserLogger The <code>ParserLogger</code> to be used to report parsing problems.
+     * @return The <code>BundleManifest</code> derived from the <code>Dictionary</code>.
+     */
+    public static BundleManifest createBundleManifest(Dictionary<String, String> headers, ParserLogger parserLogger) {
+        return new StandardBundleManifest(parserLogger, headers);
+    }
+    
+    public static BundleManifest createBundleManifest(ManifestContents manifestContents, ParserLogger parserLogger) {
+        return new StandardBundleManifest(parserLogger, manifestContents);
+    }
+
+    /**
+     * Creates a new {@link BundleManifest}, reading its contents from the supplied {@link Reader} The supplied
+     * {@link ParserLogger} will be used to report problems encountered during parsing.
+     * 
+     * @param reader The <code>Reader</code> of headers
+     * @param parserLogger The <code>ParserLogger</code> to be used to report parsing problems.
+     * @return The <code>BundleManifest</code> populated by reading the <code>Reader</code>.
+     * @throws IOException if an error occurs reading the supplied <code>Reader</code>.
+     */
+    public static BundleManifest createBundleManifest(Reader reader, ParserLogger parserLogger) throws IOException {
+        return new StandardBundleManifest(parserLogger, reader);
+    }
+
+    /**
+     * Creates a new {@link BundleManifest}, reading its contents from the supplied {@link Reader}.
+     * 
+     * @param reader The <code>Reader</code> of headers
+     * @return The <code>BundleManifest</code> populated by reading the <code>Reader</code>.
+     * @throws IOException if an error occurs reading the supplied <code>Reader</code>.
+     */
+    public static BundleManifest createBundleManifest(Reader reader) throws IOException {
+        return createBundleManifest(reader, new DummyParserLogger());
+    }
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/BundleSymbolicName.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/BundleSymbolicName.java
new file mode 100755
index 0000000..8c40045
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/BundleSymbolicName.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest;
+
+
+/**
+ * Represents a bundle's <code>Bundle-SymbolicName</code> header.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * May not be thread safe.
+ */
+public interface BundleSymbolicName extends Parameterised {
+
+    /**
+     * An enumeration of the legal values for a bundle symbolic name's <code>fragment-attachment</code> directive.
+     * <p />
+     */
+    public enum FragmentAttachment {
+        /**
+         * Fragments can attach at any time while the host is resolved or during the process of resolving.
+         */
+        ALWAYS,
+        /**
+         * Fragments may not attach to the bundle.
+         */
+        NEVER,
+        /**
+         * Fragments must only be attached while the bundle is resolving.
+         */
+        RESOLVE_TIME;
+    }
+
+    /**
+     * Returns the header's symbolic name, or <code>null</code> if no symbolic name is specified.
+     * 
+     * @return the symbolic name
+     */
+    String getSymbolicName();
+
+    /**
+     * Sets the header's symbolic name
+     * 
+     * @param symbolicName the symbolic name
+     */
+    void setSymbolicName(String symbolicName);
+
+    /**
+     * Returns the value of the <code>singleton</code> directive. Returns the default value of <code>false</code> if no
+     * <code>singleton</code> directive is specified.
+     * 
+     * @return the singleton directive
+     */
+    boolean isSingleton();
+
+    /**
+     * Sets the value of the <code>singleton</code> directive.
+     * @param singleton the singleton directive's value
+     */
+    void setSingleton(boolean singleton);
+
+    /**
+     * Returns value of the <code>fragment-attachment</code> directive. Returns the default value of <code>ALWAYS</code>
+     * if no <code>fragment-attachment</code> directive is specified.
+     * 
+     * @return the <code>fragment-attachment</code> directive
+     */
+    FragmentAttachment getFragmentAttachment();
+
+    /**
+     * Sets the value of the <code>fragment-attachment</code> directive.
+     * 
+     * @param fragmentAttachment the fragment-attachment directive's value
+     */
+    void setFragmentAttachment(FragmentAttachment fragmentAttachment);
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/DynamicImportPackage.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/DynamicImportPackage.java
new file mode 100755
index 0000000..97d10ff
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/DynamicImportPackage.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest;
+
+import java.util.List;
+
+/**
+ * Represents the <code>DynamicImport-Package</code> header in a {@link BundleManifest}.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * Implementations may not be thread-safe.
+ */
+public interface DynamicImportPackage extends Parseable {
+
+    /**
+     * Returns a list of dynamically imported packages, one for each entry in the <code>DynamicImport-Package</code>
+     * header. If no such header exists, an empty list is returned.
+     * 
+     * @return the list of dynamically imported packages.
+     */
+    List<DynamicallyImportedPackage> getDynamicallyImportedPackages();
+
+    /**
+     * Adds a dynamically imported package, with the supplied, possibly wild-carded, name, to this
+     * <code>DynamicImport-Package</code> header.
+     * 
+     * @param packageName The, possibly wild-carded, name of the package
+     * @return the newly-created <code>DynamicallyImportedPackage</code>.
+     */
+    DynamicallyImportedPackage addDynamicallyImportedPackage(String packageName);
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/DynamicallyImportedPackage.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/DynamicallyImportedPackage.java
new file mode 100755
index 0000000..ffec9a0
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/DynamicallyImportedPackage.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest;
+
+
+
+/**
+ * Represents a single entry in a bundle's <code>DynamicImport-Package</code> header.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * May not be thread safe.
+ */
+public interface DynamicallyImportedPackage extends Parameterised {
+    
+    /**
+     * Returns the (possibly wildcarded) name of the package in this entry.
+     * 
+     * @return the package name
+     */
+    String getPackageName();
+    
+    /**
+     * Sets the name of the package in this entry.
+     * @param packageName the package's name.
+     */
+    void setPackageName(String packageName);
+    
+    /**
+     * Returns the value of the import's <code>bundle-version</code> attribute. If no such attribute is specified
+     * the default version range of [0, infinity) is returned.
+     * 
+     * @return The value of the <code>bundle-version</code> attribute.
+     */
+    VersionRange getBundleVersion();
+    
+    /**
+     * Sets the value of the import's <code>bundle-version</code> attribute.
+     * @param versionRange the value of the <code>bundle-version</code> attribute.
+     */
+    void setBundleVersion(VersionRange versionRange);
+    
+    /**
+     * Returns the value of the import's <code>bundle-symbolic-name</code> attribute. If no such attribute is
+     * specified <code>null</code> is returned.
+     * 
+     * @return The value of the import's <code>bundle-symbolic-name</code> attribute.
+     */
+    String getBundleSymbolicName();
+     
+    /**
+     * Sets the value of the import's <code>bundle-symbolic-name</code> attribute.
+     * 
+     * @param bundleSymbolicName the value of the <code>bundle-symbolic-name</code> attribute.
+     */
+    void setBundleSymbolicName(String bundleSymbolicName);
+    
+    /**
+     * Returns the version range of the import. If no <code>version</code> attribute is specified
+     * the default range of [0, infinity) is returned.
+     * 
+     * @return the import's version range
+     */
+    VersionRange getVersion();
+    
+    /**
+     * Sets the version range of the import.
+     * 
+     * @param versionRange the import's version range.
+     */
+    void setVersion(VersionRange versionRange);
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/ExportPackage.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/ExportPackage.java
new file mode 100755
index 0000000..a2c3378
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/ExportPackage.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest;
+
+import java.util.List;
+
+/**
+ * Represents the <code>Export-Package</code> header in a {@link BundleManifest}.
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * May not be thread-safe.
+ */
+public interface ExportPackage extends Parseable {
+
+    /**
+     * Returns a <code>List</code> of the packages that are exported. Returns an empty <code>List</code> if no packages
+     * are exported.
+     * 
+     * @return the exported packages.
+     */
+    List<ExportedPackage> getExportedPackages();
+
+    /**
+     * Adds an export of the package with the supplied name to this <code>Export-Package</code> header.
+     * 
+     * @param packageName The name of the exported package.
+     * @return the newly-created <code>ExportedPackage</code>.
+     */
+    ExportedPackage addExportedPackage(String packageName);
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/ExportedPackage.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/ExportedPackage.java
new file mode 100755
index 0000000..e9e34c3
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/ExportedPackage.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest;
+
+import java.util.List;
+
+import org.osgi.framework.Version;
+
+/**
+ * Represents a single entry in a bundle's <code>Export-Package</code> header.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * May not be thread-safe.
+ */
+public interface ExportedPackage extends Parameterised {
+
+    /**
+     * Returns the name of the exported package, never <code>null</code>.
+     * 
+     * @return the package name
+     */
+    String getPackageName();
+    
+    /**
+     * Sets the name of the exported package.
+     * 
+     * @param packageName the package name
+     * @throws IllegalArgumentException if the given package name is <code>null</code>
+     */
+    void setPackageName(String packageName) throws IllegalArgumentException;
+
+    /**
+     * Returns the version of the exported package.
+     * 
+     * @return the version of the exported package. Returns the default version (0) if the export has no version.
+     */
+    Version getVersion();
+
+    /**
+     * Sets the version of the exported package
+     * 
+     * @param version The exported package's version
+     */
+    void setVersion(Version version);
+
+    /**
+     * Returns a <code>List</code> of the package names specified in the export's <code>uses</code> directive. Returns
+     * an empty list if the export has no uses directive.
+     * 
+     * @return the names of the used packages.
+     */
+    List<String> getUses();
+   
+    /**
+     * Returns a list of the attribute names specified in the export's <code>mandatory</code> directive.
+     * 
+     * @return the names of the mandatory attributes. Returns an empty list if the export has no mandatory directive.
+     */
+    List<String> getMandatory();       
+
+    /**
+     * Returns a list of the class names specified in the export's <code>include</code> directive. Returns an empty list
+     * if the export has no <code>include</code> directive.
+     * 
+     * @return the list of inclusions
+     */
+    List<String> getInclude();
+
+    /**
+     * Returns a list of the class names specified in the export's <code>exclude</code> directive. Returns an empty list
+     * if the export has no <code>exclude</code> directive.
+     * 
+     * @return the list of exclusions
+     */
+    List<String> getExclude();     
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/FragmentHost.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/FragmentHost.java
new file mode 100755
index 0000000..30339f3
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/FragmentHost.java
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest;
+
+
+public interface FragmentHost extends Parameterised {
+
+    /**
+     * Enumeration of the valid values for the header's <code>extension</code> directive
+     * that applies when a fragment attaches to the system bundle.
+     */    
+    public enum Extension {
+        /**
+         * The fragment is a framework extension bundle.
+         */
+        FRAMEWORK, 
+        /**
+         * The fragment is a boot classpath extension bundle.
+         */
+        BOOTCLASSPATH
+    }
+
+    /**
+     * Returns the bundle symbolic name specified in the header, or <code>null</code> if no <code>Fragment-Host</code> is specified.
+     * 
+     * @return the bundle symbolic name
+     */
+    String getBundleSymbolicName();
+
+    /**
+     * Set the bundle symbolic name in the header
+     * 
+     * @param hostName the bundle symbolic name of the fragment's host
+     */
+    void setBundleSymbolicName(String hostName);    
+
+    /**
+     * Returns the value of the header's <code>extension</code> directive, or <code>null</code> if no such directive is specified.
+     * 
+     * @return the extension directive
+     */
+    Extension getExtension();
+
+    /**
+     * Set the value of the header's <code>extension</code> directive.
+     * @param extension the value for the extension directive
+     */
+    void setExtension(Extension extension);
+    
+    /**
+     * Returns the value of the header's <code>bundle-version</code> attribute. If no such attribute is specified, returns the
+     * default version range of [0, infinity).
+     * 
+     * @return the value of the <code>bundle-version</code> attribute.
+     */
+    VersionRange getBundleVersion();
+    
+    /**
+     * Sets the value of the header's <code>bundle-version</code> directive.
+     * 
+     * @param versionRange the value for the <code>bundle-version</code> directive.
+     */
+    void setBundleVersion(VersionRange versionRange);
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/ImportBundle.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/ImportBundle.java
new file mode 100755
index 0000000..a1fd8a0
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/ImportBundle.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest;
+
+import java.util.List;
+
+/**
+ * Represents the <code>Import-Bundle</code> header in a {@link BundleManifest}.
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * May not be thread-safe.
+ */
+public interface ImportBundle extends Parseable {
+
+    /**
+     * Returns a <code>List</code> of the bundles that are imported. Returns an empty <code>List</code> if no bundles
+     * are imported.
+     * 
+     * @return the imported bundles.
+     */
+    List<ImportedBundle> getImportedBundles();
+
+    /**
+     * Adds an import of the bundle with the supplied symbolic name to this <code>Import-Bundle</code> header.
+     * 
+     * @param bundleSymbolicName The name of the imported bundle
+     * @return the newly-created <code>ImportBundle</code>.
+     */
+    ImportedBundle addImportedBundle(String bundleSymbolicName);
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/ImportLibrary.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/ImportLibrary.java
new file mode 100755
index 0000000..dd96193
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/ImportLibrary.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest;
+
+import java.util.List;
+
+/**
+ * Represents the <code>Import-Library</code> header in a {@link BundleManifest}.
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * May not be thread-safe.
+ */
+public interface ImportLibrary extends Parseable {
+    
+    /**
+     * Returns a <code>List</code> of the libraries that are imported. Returns an empty <code>List</code> if no libraries
+     * are imported.
+     * 
+     * @return the imported libraries.
+     */
+    List<ImportedLibrary> getImportedLibraries();
+
+    /**
+     * Adds an import of the library with the supplied symbolic name to this <code>Import-Library</code> header.
+     * 
+     * @param librarySymbolicName The name of the imported library.
+     * @return the newly-created <code>ImportedLibrary</code>.
+     */
+    ImportedLibrary addImportedLibrary(String librarySymbolicName);
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/ImportPackage.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/ImportPackage.java
new file mode 100755
index 0000000..b1d508b
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/ImportPackage.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest;
+
+import java.util.List;
+
+/**
+ * Represents the <code>Import-Package</code> header in a {@link BundleManifest}.
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * May not be thread-safe.
+ * 
+ */
+public interface ImportPackage extends Parseable {
+
+    /**
+     * Returns a <code>List</code> of the packages that are imported. Returns an empty <code>List</code> if no packages
+     * are imported.
+     * 
+     * @return the imported packages.
+     */
+    List<ImportedPackage> getImportedPackages();
+
+    /**
+     * Adds an import of the package with the supplied name to this <code>Import-Package</code> header.
+     * 
+     * @param packageName The name of the imported package.
+     * @return the newly-created <code>ImportedPackage</code>.
+     */
+    ImportedPackage addImportedPackage(String packageName);
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/Imported.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/Imported.java
new file mode 100755
index 0000000..207334f
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/Imported.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest;
+
+
+/**
+ * A common interface for the entries in the three import headers: <code>Import-Package</code>, <code>Import-Bundle</code>, and
+ * <code>Import-Library</code>.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * May not be thread-safe.
+ * 
+ * @see ImportedPackage
+ * @see ImportedBundle
+ * @see ImportedLibrary
+ */
+public interface Imported extends Parameterised {
+    
+    /**
+     * Returns the version range of the import. If no <code>version</code> attribute is specified
+     * the default range of [0, infinity) is returned.
+     * 
+     * @return the import's version range
+     */
+    VersionRange getVersion();
+    
+    /**
+     * Sets the version range of the import.
+     * 
+     * @param versionRange the import's version range.
+     */
+    void setVersion(VersionRange versionRange);
+
+    /**
+     * Returns the value of the import's <code>resolution</code> directive. If no such directive is specified the
+     * default value of {@link Resolution#MANDATORY} is returned.
+     * 
+     * @return the value of the import's resolution directive.
+     */
+    Resolution getResolution();
+    
+    /**
+     * Sets the value of the import's <code>resolution</code> directive.
+     * 
+     * @param resolution The import's resolution directive
+     */
+    void setResolution(Resolution resolution);
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/ImportedBundle.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/ImportedBundle.java
new file mode 100755
index 0000000..70d9304
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/ImportedBundle.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest;
+
+/**
+ * Represents a single entry in a bundle's <code>Import-Bundle</code> header.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ * May not be thread-safe.
+ * 
+ */
+public interface ImportedBundle extends Imported {
+
+    /**
+     * Returns the symbolic name of the bundle that is imported, never <code>null</code>.
+     * 
+     * @return the imported bundle's symbolic name.
+     */
+    String getBundleSymbolicName();
+    
+    /**
+     * Sets the symbolic name of the bundle that is imported
+     * @param bundleSymbolicName the imported bundle's symbolic name
+     * @throws IllegalArgumentException if the supplied bundleSymbolicName is <code>null</code>
+     */
+    void setBundleSymbolicName(String bundleSymbolicName) throws IllegalArgumentException;
+
+    /**
+     * Returns the value of the import's <code>sharing</code> directive. If no such directive is specified the
+     * default value of {@link Sharing#AUTOMATIC} is returned.
+     * 
+     * @return the value of the import's sharing directive.
+     */
+    Sharing getSharing();
+    
+    /**
+     * Sets the value of the import's <code>sharing</code> directive.
+     * 
+     * @param sharing the value of the import's sharing directive
+     */
+    void setSharing(Sharing sharing);
+
+    /**
+     * Returns <code>true</code> if the import's <code>import-scope</code> directive is present and has 
+     * a value of <code>application</code>, otherwise <code>false</code> is returned.
+     * 
+     * @return <code>true</code> if and only if the import-scope directive has a value of application
+     */
+    boolean isApplicationImportScope();
+    
+    /**
+     * Sets the <code>import-scope</code> directive
+     * 
+     * @param applicationImportScope Whether or not the import's scope is application
+     */
+    void setApplicationImportScope(boolean applicationImportScope);
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/ImportedLibrary.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/ImportedLibrary.java
new file mode 100755
index 0000000..d82b972
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/ImportedLibrary.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest;
+
+/**
+ * Represents a single entry in a bundle's <code>Import-Library</code> header.
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ * May not be thread-safe.
+ * 
+ */
+public interface ImportedLibrary extends Imported {
+
+    /**
+     * Returns the symbolic name of the library that is imported, never <code>null</code>.
+     * 
+     * @return the imported library's symbolic name.
+     */
+    String getLibrarySymbolicName();
+    
+    /**
+     * Sets the symbolic name of the library that is imported.
+     * 
+     * @param librarySymbolicName The imported library's symbolic name
+     * @throws IllegalArgumentException if librarySymbolicName is <code>null</code>
+     */
+    void setLibrarySymbolicName(String librarySymbolicName) throws IllegalArgumentException;
+    
+    /**
+     * Returns the value of the import's <code>sharing</code> directive. If no such directive is specified the
+     * default value of {@link Sharing#AUTOMATIC} is returned.
+     * 
+     * @return the value of the import's sharing directive.
+     */
+    Sharing getSharing();
+    
+    /**
+     * Sets the value of the import's <code>sharing</code> directive.
+     * 
+     * @param sharing the value of the import's sharing directive
+     */
+    void setSharing(Sharing sharing);
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/ImportedPackage.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/ImportedPackage.java
new file mode 100755
index 0000000..218da31
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/ImportedPackage.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest;
+
+
+/**
+ * Represents a single entry in a bundle's <code>Import-Package</code> header.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * May not be thread-safe.
+ * 
+ */
+public interface ImportedPackage extends Imported {
+
+    /**
+     * Returns the name of the package that is imported, never <code>null</code>. 
+     * 
+     * @return the name of the imported package
+     */
+    String getPackageName();
+    
+    /**
+     * Sets the name of the imported package.
+     * 
+     * @param packageName the imported package's name
+     */
+    void setPackageName(String packageName);
+    
+    /**
+     * Returns the value of the import's <code>bundle-version</code> attribute. If no such attribute is specified
+     * the default version range of [0, infinity) is returned.
+     * 
+     * @return The value of the <code>bundle-version</code> attribute.
+     */
+    VersionRange getBundleVersion();
+    
+    /**
+     * Sets the value of the import's <code>bundle-version</code> attribute.
+     * @param versionRange the value of the <code>bundle-version</code> attribute.
+     */
+    void setBundleVersion(VersionRange versionRange);
+    
+    /**
+     * Returns the value of the import's <code>bundle-symbolic-name</code> attribute. If no such attribute is
+     * specified <code>null</code> is returned.
+     * 
+     * @return The value of the import's <code>bundle-symbolic-name</code> attribute.
+     */
+    String getBundleSymbolicName();
+     
+    /**
+     * Sets the value of the import's <code>bundle-symbolic-name</code> attribute.
+     * 
+     * @param bundleSymbolicName the value of the <code>bundle-symbolic-name</code> attribute.
+     */
+    void setBundleSymbolicName(String bundleSymbolicName);
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/Parameterised.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/Parameterised.java
new file mode 100755
index 0000000..09e2840
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/Parameterised.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest;
+
+import java.util.Map;
+
+/**
+ * Represents a header or header entry that can be parameterised, i.e. it has attributes and directives.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * May not be thread-safe.
+ */
+public interface Parameterised extends Parseable {
+
+    /**
+     * Returns a <code>Map</code> of the header or header entry's attributes
+     * 
+     * @return the attributes
+     */
+    Map<String, String> getAttributes();
+
+    /**
+     * Returns a <code>Map</code> of the header or header entry's directives
+     * 
+     * @return the directives
+     */
+    Map<String, String> getDirectives();
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/Parseable.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/Parseable.java
new file mode 100755
index 0000000..eb1f599
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/Parseable.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest;
+
+/**
+ * Represents a header or header entry that can be converted into a parseable string and that can have its values
+ * (re)set by parsing a string.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * May not be thread-safe.
+ * 
+ */
+public interface Parseable {
+
+    /**
+     * Converts the header or header entry into a parseable <code>String</code>.
+     * 
+     * @return The header in the form of a parseable String
+     */
+    String toParseString();
+
+    /**
+     * Resets that header's values by parsing the supplied <code>String</code>.
+     * 
+     * @param string The String to be parsed
+     */
+    void resetFromParseString(String string);
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/RequireBundle.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/RequireBundle.java
new file mode 100755
index 0000000..c011d8a
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/RequireBundle.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest;
+
+import java.util.List;
+
+/**
+ * Represents the <code>Require-Bundle</code> header in a {@link BundleManifest}.
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * May not be thread-safe.
+ * 
+ */
+public interface RequireBundle extends Parseable {
+
+    /**
+     * Returns a <code>List</code> of the bundles that are required. Returns an empty <code>List</code> if no bundles
+     * are required.
+     * 
+     * @return the required bundles
+     */
+    List<RequiredBundle> getRequiredBundles();
+
+    /**
+     * Adds a required bundle with the supplied bundle symbolic name to this <code>Require-Bundle</code> header.
+     * <p/>
+     * If there is already a required bundle with the given symbolic name, a duplicate is added and the resultant
+     * manifest will not conform to the OSGi specification. This behaviour may change: see issue DMS-548.
+     * 
+     * @param requiredBundle the symbolic name of the required bundle
+     * @return the newly-created <code>RequiredBundle</code>.
+     */
+    RequiredBundle addRequiredBundle(String requiredBundle);
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/RequiredBundle.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/RequiredBundle.java
new file mode 100755
index 0000000..45b995a
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/RequiredBundle.java
@@ -0,0 +1,100 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest;
+
+
+/**
+ * Representation of a single entry in a <code>Require-Bundle</code> header.
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * May not be thread-safe.
+ * 
+ */
+public interface RequiredBundle extends Parameterised {
+
+    /**
+     * Enumeration of the valid values for the header's <code>visibility</code> directive.
+     */
+    public enum Visibility {
+        /**
+         * Packages from the required bundle are not re-exported.
+         */
+        PRIVATE,
+
+        /**
+         * Packages from the required bundle are re-exported, providing transitive access to the packages.
+         */
+        REEXPORT
+    }
+
+    /**
+     * Returns the symbolic name of the bundle that is required, never <code>null</code>.
+     * 
+     * @return the required bundle's symbolic name.
+     */
+    String getBundleSymbolicName();
+
+    /**
+     * Sets the symbolic name of the bundle that is required.
+     * 
+     * @param bundleSymbolicName the required bundle's symbolic name
+     * @throws IllegalArgumentException if the given bundle symbolic name is <code>null</code>
+     */
+    void setBundleSymbolicName(String bundleSymbolicName);
+
+    /**
+     * Returns the value of the entry's <code>resolution</code> directive. If no such directive is specified, the
+     * default value of {@link Resolution#MANDATORY} is returned.
+     * 
+     * @return the value of the resolution directive
+     */
+    Resolution getResolution();
+
+    /**
+     * Sets the value of the <code>resolution</code> directive. If <code>null</code> is given, sets the value to
+     * {@link Resolution#MANDATORY}.
+     * 
+     * @param resolution The resolution directive
+     */
+    void setResolution(Resolution resolution);
+
+    /**
+     * Returns the value of the entry's <code>visibility</code> directive. If no such directive is specified, the
+     * default value of {@link Visibility#PRIVATE} is returned.
+     * 
+     * @return the value of the visibility directive
+     */
+    Visibility getVisibility();
+
+    /**
+     * Sets the value of the <code>visibility</code> directive. If <code>null</code> is given, sets the value to
+     * {@link Visibility#PRIVATE}.
+     * 
+     * @param visibility The value of the visibility directive.
+     */
+    void setVisibility(Visibility visibility);
+    
+    /**
+     * Returns the value of the header's <code>bundle-version</code> attribute. If no such attribute is specified, returns the
+     * default version range of [0, infinity).
+     * 
+     * @return the value of the <code>bundle-version</code> attribute.
+     */
+    VersionRange getBundleVersion();
+    
+    /**
+     * Sets the value of the header's <code>bundle-version</code> directive.
+     * 
+     * @param versionRange the value for the <code>bundle-version</code> directive.
+     */
+    void setBundleVersion(VersionRange versionRange);
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/Resolution.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/Resolution.java
new file mode 100755
index 0000000..f5c2a63
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/Resolution.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest;
+
+/**
+ * An enumeration of the legal values for the <code>resolution</code> directive
+ * of an <code>Import-Package</code>, <code>Import-Bundle</code>, or <code>Import-Library</code>
+ * header entry.
+ * <p />
+ */
+public enum Resolution {
+    /**
+     * The import is mandatory.
+     */
+    MANDATORY,
+    /**
+     * The import is optional.
+     */
+    OPTIONAL
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/Sharing.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/Sharing.java
new file mode 100755
index 0000000..90f665a
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/Sharing.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest;
+
+/**
+ * An enumeration of the legal values for the entry's <code>sharing</code> directive.
+ */
+public enum Sharing {
+    AUTOMATIC, SHARE, CLONE
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/VersionRange.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/VersionRange.java
new file mode 100755
index 0000000..7d0b75c
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/VersionRange.java
@@ -0,0 +1,299 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest;
+
+import org.osgi.framework.Version;
+
+/**
+ * Parses the <code>String</code> specification a range of {@link Version Versions} as defined in 3.2.5 of the OSGi
+ * Service Server Core Specification.
+ * <p/>
+ * 
+ * The <code>VersionRange</code> can be queried to see if it includes a particular {@link Version} using
+ * {@link #includes(Version)}.
+ * <p/>
+ * 
+ * Distinct representations of an empty range are regarded as equal.
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br/>
+ * 
+ * Implementation is immutable.
+ * 
+ */
+public final class VersionRange {
+
+    private static final Version ZERO_VERSION = Version.emptyVersion;
+
+    private static final char INCLUSIVE_LOWER = '[';
+
+    private static final char INCLUSIVE_UPPER = ']';
+
+    private static final char EXCLUSIVE_LOWER = '(';
+
+    private static final char EXCLUSIVE_UPPER = ')';
+
+    public static final VersionRange NATURAL_NUMBER_RANGE = new VersionRange(null);
+
+    private final Version floor;
+
+    // The range is unbounded if and only if ceiling == null.
+    private final Version ceiling;
+
+    private final boolean floorInclusive;
+
+    private final boolean ceilingInclusive;
+
+    /**
+     * Creates a <code>VersionRange</code> for the provided specification.
+     * 
+     * @param versionRange the <code>VersionRange</code> specification.
+     */
+    public VersionRange(String versionRange) {
+        if (versionRange == null || versionRange.length() == 0) {
+            this.floor = ZERO_VERSION;
+            this.ceiling = null;
+            this.floorInclusive = true;
+            this.ceilingInclusive = false;
+            return;
+        }
+
+        char first = versionRange.charAt(0);
+        if (first == INCLUSIVE_LOWER || first == EXCLUSIVE_LOWER) {
+            char last = versionRange.charAt(versionRange.length() - 1);
+            if (last == INCLUSIVE_UPPER || last == EXCLUSIVE_UPPER) {
+                int comma = versionRange.indexOf(',');
+                if (comma < 0) {
+                    throw new IllegalArgumentException("Version range '" + versionRange + "' is invalid.");
+                }
+                this.floor = Version.parseVersion(versionRange.substring(1, comma).trim());
+                this.floorInclusive = first == INCLUSIVE_LOWER;
+                this.ceiling = Version.parseVersion(versionRange.substring(comma + 1, versionRange.length() - 1).trim());
+                this.ceilingInclusive = last == INCLUSIVE_UPPER;
+            } else {
+                throw new IllegalArgumentException("Version range '" + versionRange + "' is invalid.");
+            }
+        } else {
+            this.floor = Version.parseVersion(versionRange);
+            this.floorInclusive = true;
+            this.ceiling = null;
+            this.ceilingInclusive = false;
+        }
+    }
+
+    private VersionRange(boolean floorInclusive, Version floor, Version ceiling, boolean ceilingInclusive) {
+        this.floorInclusive = floorInclusive;
+        this.floor = floor;
+        this.ceiling = ceiling;
+        this.ceilingInclusive = ceilingInclusive;
+    }
+
+    /**
+     * Creates a <code>VersionRange</code> encompassing all the natural numbers: <code>[0.0.0, infinity)</code>.
+     * 
+     * @return a <code>VersionRange</code> encompassing all the natural numbers.
+     */
+    public static VersionRange naturalNumberRange() {
+        return NATURAL_NUMBER_RANGE;
+    }
+
+    /**
+     * Creates a <code>VersionRange</code> that encompasses the supplied version, and only the supplied version:
+     * <code>[version, version]</code>.
+     * 
+     * @param version The version for which an exact range is required.
+     * @return The exact range.
+     */
+    public static VersionRange createExactRange(Version version) {
+        return new VersionRange(true, version, version, true);
+    }
+
+    /**
+     * Gets the floor of this <code>VersionRange</code>.
+     * 
+     * @return floor of this <code>VersionRange</code>.
+     */
+    public Version getFloor() {
+        return this.floor;
+    }
+
+    /**
+     * Gets the ceiling of this <code>VersionRange</code>. The returned <code>Version</code> is <code>null</code> if and
+     * only if this <code>VersionRange</code> is unbounded.
+     * 
+     * @return ceiling of this <code>VersionRange</code> or <code>null</code> if the range is unbounded.
+     */
+    public Version getCeiling() {
+        return this.ceiling;
+    }
+
+    /**
+     * Indicates whether or not the floor of this <code>VersionRange</code> is inclusive.
+     * 
+     * @return <code>true</code> if the floor is inclusive; otherwise <code>false</code>.
+     */
+    public boolean isFloorInclusive() {
+        return this.floorInclusive;
+    }
+
+    /**
+     * Indicates whether or not the ceiling of this <code>VersionRange</code> is inclusive.
+     * 
+     * @return <code>true</code> if the ceiling is inclusive; otherwise <code>false</code>.
+     */
+    public boolean isCeilingInclusive() {
+        return this.ceilingInclusive;
+    }
+
+    /**
+     * Queries whether this <code>VersionRange</code> includes the supplied {@link Version}.
+     * 
+     * @param version the <code>Version</code> to check against.
+     * @return <code>true</code> if the <code>Version</code> is included in this <code>VersionRange</code>; otherwise
+     *         <code>false</code>.
+     */
+    public boolean includes(Version version) {
+        int minCheck = this.floorInclusive ? 0 : 1;
+        int maxCheck = this.ceilingInclusive ? 0 : -1;
+        if (this.floor == null) {
+            throw new RuntimeException("ff");
+        }
+        return version.compareTo(this.floor) >= minCheck && (ceiling == null || version.compareTo(this.ceiling) <= maxCheck);
+    }
+
+    /**
+     * Queries whether this <code>VersionRange</code> is an exact range containing a single version.
+     * 
+     * @return <code>true</code> if and only if this code>VersionRange</code> is exact
+     */
+    public boolean isExact() {
+        return isCeilingInclusive() && isFloorInclusive() && getFloor().equals(getCeiling());
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean equals(Object object) {
+        if (!(object instanceof VersionRange)) {
+            return false;
+        }
+        VersionRange that = (VersionRange) object;
+        return (this.isEmpty() && that.isEmpty())
+            || (this.floorInclusive == that.floorInclusive && this.ceilingInclusive == that.ceilingInclusive && this.floor.equals(that.floor) && ((this.ceiling == null && that.ceiling == null) || (this.ceiling != null && this.ceiling.equals(that.ceiling))));
+    }
+
+    public boolean isEmpty() {
+        if (this.ceiling == null) {
+            return false;
+        }
+        int limitComparison = this.ceiling.compareTo(this.floor);
+        if (limitComparison == 0) {
+            return !(this.floorInclusive && this.ceilingInclusive);
+        } else if (limitComparison < 0) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int hashCode() {
+        int result = 17;
+        if (!isEmpty()) {
+            result = 37 * result + this.floor.hashCode();
+            result = 37 * result + (this.ceiling == null ? 0 : this.ceiling.hashCode());
+        }
+        return result;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String toString() {
+        return new StringBuilder().append(this.floorInclusive ? INCLUSIVE_LOWER : EXCLUSIVE_LOWER).append(this.floor).append(", ").append(
+            this.ceiling == null ? "oo" : this.ceiling).append(this.ceilingInclusive ? INCLUSIVE_UPPER : EXCLUSIVE_UPPER).toString();
+    }
+
+    /**
+     * Creates a <code>String</code> representation of this <code>VersionRange</code> that can be re-parsed.
+     * 
+     * @return string representation of version range
+     */
+    public String toParseString() {
+        if (this.ceiling == null && this.floorInclusive) {
+            return this.floor.toString();
+        } else {
+            return new StringBuilder().append(this.floorInclusive ? INCLUSIVE_LOWER : EXCLUSIVE_LOWER).append(this.floor).append(", ").append(
+                this.ceiling).append(this.ceilingInclusive ? INCLUSIVE_UPPER : EXCLUSIVE_UPPER).toString();
+        }
+    }
+
+    /**
+     * Returns a <code>VersionRange</code> that is the intersection of the two supplied <code>VersionRanges</code>.
+     * 
+     * @param rangeOne The first <code>VersionRange</code> for the intersection
+     * @param rangeTwo The second <code>VersionRange</code> for the intersection
+     * @return The intersection of the two <code>VersionRanges</code>
+     */
+    public static VersionRange intersection(VersionRange rangeOne, VersionRange rangeTwo) {
+
+        Version floor;
+        boolean floorInclusive;
+
+        Version ceiling;
+        boolean ceilingInclusive;
+
+        int floorComparison = rangeOne.floor.compareTo(rangeTwo.floor);
+        if (floorComparison < 0) {
+            floor = rangeTwo.floor;
+            floorInclusive = rangeTwo.floorInclusive;
+        } else if (floorComparison > 0) {
+            floor = rangeOne.floor;
+            floorInclusive = rangeOne.floorInclusive;
+        } else {
+            floor = rangeOne.floor;
+            floorInclusive = rangeOne.floorInclusive && rangeTwo.floorInclusive;
+        }
+
+        if (rangeOne.ceiling == null) {
+            if (rangeTwo.ceiling == null) {
+                ceiling = null;
+                ceilingInclusive = false;
+            } else {
+                ceiling = rangeTwo.ceiling;
+                ceilingInclusive = rangeTwo.ceilingInclusive;
+            }
+        } else if (rangeTwo.ceiling == null) {
+            ceiling = rangeOne.ceiling;
+            ceilingInclusive = rangeOne.ceilingInclusive;
+        } else {
+            int ceilingComparison = rangeOne.ceiling.compareTo(rangeTwo.ceiling);
+            if (ceilingComparison > 0) {
+                ceiling = rangeTwo.ceiling;
+                ceilingInclusive = rangeTwo.ceilingInclusive;
+            } else if (ceilingComparison < 0) {
+                ceiling = rangeOne.ceiling;
+                ceilingInclusive = rangeOne.ceilingInclusive;
+            } else {
+                ceiling = rangeOne.ceiling;
+                ceilingInclusive = rangeOne.ceilingInclusive && rangeTwo.ceilingInclusive;
+            }
+        }
+
+        return new VersionRange(floorInclusive, floor, ceiling, ceilingInclusive);
+    }
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/BaseCompoundHeaderEntry.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/BaseCompoundHeaderEntry.java
new file mode 100755
index 0000000..f3a30ab
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/BaseCompoundHeaderEntry.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.internal;
+
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderParser;
+
+abstract class BaseCompoundHeaderEntry extends BaseParameterised {
+    
+    BaseCompoundHeaderEntry(HeaderParser parser, String name) {
+        super(parser);        
+        this.name = name;         
+    }
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/BaseImported.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/BaseImported.java
new file mode 100755
index 0000000..d4987ab
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/BaseImported.java
@@ -0,0 +1,79 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.internal;
+
+import org.eclipse.virgo.util.osgi.manifest.Imported;
+import org.eclipse.virgo.util.osgi.manifest.Resolution;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderParser;
+import org.osgi.framework.Constants;
+
+
+/**
+ * <strong>Concurrent Semantics</strong><br />
+ * Not thread-safe.
+ */
+abstract class BaseImported extends BaseCompoundHeaderEntry implements Imported {
+
+    BaseImported(HeaderParser parser, String name) {
+        super(parser, name);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Resolution getResolution() {
+        String value = getDirectives().get(Constants.RESOLUTION_DIRECTIVE);
+        if (Constants.RESOLUTION_OPTIONAL.equals(value)) {
+            return Resolution.OPTIONAL;
+        } else {
+            return Resolution.MANDATORY;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public VersionRange getVersion() {
+        String value = getAttributes().get(Constants.VERSION_ATTRIBUTE);
+        return new VersionRange(value);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void setResolution(Resolution resolution) {
+        if (resolution == null) {
+            getDirectives().remove(Constants.RESOLUTION_DIRECTIVE);
+            return;
+        }
+
+        switch (resolution) {
+            case OPTIONAL:
+                getDirectives().put(Constants.RESOLUTION_DIRECTIVE, Constants.RESOLUTION_OPTIONAL);
+                break;
+            default:
+                getDirectives().remove(Constants.RESOLUTION_DIRECTIVE);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void setVersion(VersionRange versionRange) {
+        if (versionRange != null) {
+            getAttributes().put(Constants.VERSION_ATTRIBUTE, versionRange.toParseString());
+        } else {
+            getAttributes().remove(Constants.VERSION_ATTRIBUTE);
+        }
+    }
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/BaseParameterised.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/BaseParameterised.java
new file mode 100755
index 0000000..879369c
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/BaseParameterised.java
@@ -0,0 +1,139 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.internal;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.virgo.util.osgi.manifest.Parameterised;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderDeclaration;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderParser;
+
+
+abstract class BaseParameterised implements Parameterised {
+
+    protected String name;
+
+    private final HeaderParser parser;
+    
+    private Map<String, String> attributes = new HashMap<String, String>();
+    
+    private Map<String, String> directives = new HashMap<String, String>();
+    
+    private static final String EMPTY_STRING = "";
+
+    BaseParameterised(HeaderParser parser) {
+        this.parser = parser;        
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void resetFromParseString(String string) {
+        HeaderDeclaration header = parse(this.parser, string);
+        
+        this.name = header.getNames().get(0);
+        
+        this.attributes = header.getAttributes();
+        this.directives = header.getDirectives();
+    }
+
+    abstract HeaderDeclaration parse(HeaderParser parser, String parseString);
+
+    /**
+     * {@inheritDoc}
+     */
+    public String toParseString() {
+        if (this.name == null) {
+            return null;
+        }
+
+        StringBuilder sb = new StringBuilder();
+        sb.append(this.name);
+
+        writeMap(this.attributes, sb, "=");
+        writeMap(this.directives, sb, ":=");
+
+        return sb.toString();
+    }
+    
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String toString() {
+        String parseString = toParseString();
+        if (parseString == null) {
+            return EMPTY_STRING;
+        } else {
+            return parseString;
+        }
+    }
+
+    private static void writeMap(Map<String, String> map, StringBuilder sb, String delimiter) {
+        for (Map.Entry<String, String> entry : map.entrySet()) {
+            sb.append(";").append(entry.getKey()).append(delimiter).append("\"").append(entry.getValue()).append("\"");
+        }
+    }
+    
+    public Map<String, String> getDirectives() {
+        return this.directives;
+    }
+    
+    public Map<String, String> getAttributes() {
+        return this.attributes;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + attributes.hashCode();
+        result = prime * result + directives.hashCode();
+        result = prime * result + ((name == null) ? 0 : name.hashCode());
+        return result;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        BaseParameterised other = (BaseParameterised) obj;
+        if (!attributes.equals(other.attributes)) {
+            return false;
+        }
+        if (!directives.equals(other.directives)) {
+            return false;
+        }
+        if (name == null) {
+            if (other.name != null) {
+                return false;
+            }
+        } else if (!name.equals(other.name)) {
+            return false;
+        }
+        return true;
+    }        
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/CompoundParseable.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/CompoundParseable.java
new file mode 100755
index 0000000..df00419
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/CompoundParseable.java
@@ -0,0 +1,103 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.internal;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.virgo.util.osgi.manifest.Parameterised;
+import org.eclipse.virgo.util.osgi.manifest.Parseable;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderDeclaration;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderParser;
+
+
+/**
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread-safe.
+ */
+abstract class CompoundParseable<T extends Parameterised> implements Parseable {
+
+    protected final HeaderParser parser;
+
+    protected List<T> components;
+    
+    private static final String EMPTY_STRING = "";
+
+    CompoundParseable(HeaderParser parser) {
+        this.parser = parser;
+        this.components = new ArrayList<T>();
+    }
+
+    abstract List<HeaderDeclaration> parse(String parseString);
+
+    abstract T newEntry(String name);
+
+    /**
+     * {@inheritDoc}
+     */
+    public void resetFromParseString(String parseString) {
+
+        this.components.clear();
+
+        if (parseString != null) {
+            List<HeaderDeclaration> headers = parse(parseString);
+
+            for (HeaderDeclaration header : headers) {
+                for (String name : header.getNames()) {
+                    T component = newEntry(name);
+                    component.getAttributes().putAll(header.getAttributes());
+                    component.getDirectives().putAll(header.getDirectives());
+                    this.components.add(component);
+                }
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String toParseString() {
+        if (this.components.isEmpty()) {
+            return null;
+        }
+        StringBuilder builder = new StringBuilder();
+
+        Iterator<T> components = this.components.iterator();
+        while (components.hasNext()) {
+            builder.append(components.next().toParseString());
+            if (components.hasNext()) {
+                builder.append(",");
+            }
+        }
+        return builder.toString();
+    }
+    
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String toString() {
+        String parseString = toParseString();
+        if (parseString == null) {
+            return EMPTY_STRING;
+        } else {
+            return parseString;
+        }
+    }
+
+    protected T add(String name) {
+        T newComponent = newEntry(name);
+        this.components.add(newComponent);
+        return newComponent;
+    }
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/HeaderUtils.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/HeaderUtils.java
new file mode 100755
index 0000000..4b66d4b
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/HeaderUtils.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.internal;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread-safe
+ */
+final class HeaderUtils {
+        
+    static List<String> toList(String key, Map<String, String> map) {
+        String string = map.get(key);
+        
+        List<String> list = new MapUpdatingList(map, key);
+        
+        if (string != null) {
+            String[] components = string.split(",");
+            for (String component : components) {
+                list.add(component.trim());
+            }
+        }
+        
+        return list;                    
+    }
+    
+    static String toString(List<String> strings) {
+        if (strings.isEmpty()) {
+            return null;
+        }
+        
+        StringBuilder builder = new StringBuilder();
+        
+        Iterator<String> iterator = strings.iterator();
+        
+        while (iterator.hasNext()) {
+            builder.append(iterator.next());
+            if (iterator.hasNext()) {
+                builder.append(",");
+            }
+        }
+        return builder.toString();
+    }
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/MapUpdatingList.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/MapUpdatingList.java
new file mode 100755
index 0000000..d53eece
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/MapUpdatingList.java
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.internal;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+class MapUpdatingList extends ArrayList<String> implements List<String> {
+
+    private static final long serialVersionUID = 4379585330343695190L;
+
+    private final String key;
+
+    private final Map<String, String> map;
+
+    MapUpdatingList(Map<String, String> map, String key) {
+        this.map = map;
+        this.key = key;
+    }
+
+    public boolean add(String string) {
+        boolean added = super.add(string);
+        updateMap();
+        return added;
+    }
+
+    public void add(int index, String string) {
+        super.add(index, string);
+        updateMap();
+    }
+
+    public boolean addAll(Collection<? extends String> strings) {
+        boolean added = super.addAll(strings);
+        updateMap();
+        return added;
+    }
+
+    public boolean addAll(int index, Collection<? extends String> strings) {
+        boolean added = super.addAll(index, strings);
+        updateMap();
+        return added;
+    }
+
+    public void clear() {
+        super.clear();
+        updateMap();
+    }
+
+    public String remove(int index) {
+        String removed = super.remove(index);
+        updateMap();        
+        return removed;
+    }
+
+    public boolean remove(Object o) {
+        boolean removed = super.remove(o);
+        if (removed) {
+            updateMap();
+        }
+        return removed;
+    }
+
+    private void updateMap() {
+        String value = HeaderUtils.toString(this);
+
+        if (value != null) {
+            this.map.put(this.key, HeaderUtils.toString(this));
+        } else {
+            this.map.remove(this.key);
+        }
+    }
+
+    public boolean removeAll(Collection<?> c) {
+        boolean altered = super.removeAll(c);
+        if (altered) {
+            updateMap();
+        }
+        return altered;
+    }
+
+    public boolean retainAll(Collection<?> c) {
+        boolean altered = super.retainAll(c);
+        if (altered) {
+            updateMap();
+        }
+        return altered;
+    }
+
+    public String set(int index, String string) {
+        String replaced = super.set(index, string);
+        updateMap();
+        return replaced;
+    }
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardBundleActivationPolicy.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardBundleActivationPolicy.java
new file mode 100755
index 0000000..9e01af1
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardBundleActivationPolicy.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.internal;
+
+import java.util.List;
+
+import org.eclipse.virgo.util.osgi.manifest.BundleActivationPolicy;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderDeclaration;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderParser;
+import org.osgi.framework.Constants;
+
+
+class StandardBundleActivationPolicy extends BaseParameterised implements BundleActivationPolicy {
+
+    StandardBundleActivationPolicy(HeaderParser parser) {
+        super(parser);
+    }
+
+    @Override
+    HeaderDeclaration parse(HeaderParser parser, String parseString) {
+        return parser.parseBundleActivationPolicy(parseString);
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public Policy getActivationPolicy() {        
+        if (Constants.ACTIVATION_LAZY.equals(this.name)) {
+            return Policy.LAZY;
+        } else {
+            return Policy.EAGER;
+        }        
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void setActivationPolicy(Policy policy) {
+        if (Policy.LAZY.equals(policy)) {
+            this.name = Constants.ACTIVATION_LAZY;
+        } else {
+            this.name = null;
+        }
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public List<String> getExclude() {
+        return HeaderUtils.toList(Constants.EXCLUDE_DIRECTIVE, getDirectives());
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public List<String> getInclude() {
+        return HeaderUtils.toList(Constants.INCLUDE_DIRECTIVE, getDirectives());
+    }
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardBundleManifest.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardBundleManifest.java
new file mode 100755
index 0000000..1edee69
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardBundleManifest.java
@@ -0,0 +1,464 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.internal;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.Reader;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+import java.util.jar.Attributes;
+import java.util.jar.Manifest;
+
+import org.eclipse.virgo.util.common.CaseInsensitiveMap;
+import org.eclipse.virgo.util.common.MapToDictionaryAdapter;
+import org.eclipse.virgo.util.osgi.manifest.BundleActivationPolicy;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+import org.eclipse.virgo.util.osgi.manifest.BundleSymbolicName;
+import org.eclipse.virgo.util.osgi.manifest.DynamicImportPackage;
+import org.eclipse.virgo.util.osgi.manifest.ExportPackage;
+import org.eclipse.virgo.util.osgi.manifest.FragmentHost;
+import org.eclipse.virgo.util.osgi.manifest.ImportBundle;
+import org.eclipse.virgo.util.osgi.manifest.ImportLibrary;
+import org.eclipse.virgo.util.osgi.manifest.ImportPackage;
+import org.eclipse.virgo.util.osgi.manifest.Parseable;
+import org.eclipse.virgo.util.osgi.manifest.RequireBundle;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderParser;
+import org.eclipse.virgo.util.osgi.manifest.parse.ParserLogger;
+import org.eclipse.virgo.util.osgi.manifest.parse.standard.StandardHeaderParser;
+import org.eclipse.virgo.util.parser.manifest.ManifestContents;
+import org.eclipse.virgo.util.parser.manifest.ManifestParser;
+import org.eclipse.virgo.util.parser.manifest.ManifestProblem;
+import org.eclipse.virgo.util.parser.manifest.ManifestProblemKind;
+import org.eclipse.virgo.util.parser.manifest.RecoveringManifestParser;
+import org.osgi.framework.Constants;
+import org.osgi.framework.Version;
+
+
+/**
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Not thread-safe.
+ */
+public class StandardBundleManifest implements BundleManifest {
+
+    private static final String MANIFEST_VERSION = "Manifest-Version";
+    
+    static final String MANIFEST_VERSION_VALUE = "1.0";
+
+    private final CaseInsensitiveMap<String> contents = new CaseInsensitiveMap<String>();
+
+    private final CaseInsensitiveMap<Parseable> headers;
+
+    public StandardBundleManifest(ParserLogger logger) {
+        this(logger, (Map<String, String>) new Hashtable<String, String>());
+    }
+
+    public StandardBundleManifest(ParserLogger logger, Map<String, String> contents) {
+        this.contents.putAll(contents);
+        if (!this.contents.containsKey(MANIFEST_VERSION)) {
+            this.contents.put(MANIFEST_VERSION, MANIFEST_VERSION_VALUE);
+        }
+        this.headers = initializeHeaders(this.contents, new StandardHeaderParser(logger));
+    }
+
+    public StandardBundleManifest(ParserLogger logger, Dictionary<String, String> contents) {
+        this(logger, dictionaryToMap(contents));
+    }
+
+    private static Map<String, String> dictionaryToMap(Dictionary<String, String> contents) {
+        Map<String, String> map = new HashMap<String, String>(contents.size());
+        Enumeration<String> keys = contents.keys();
+        while (keys.hasMoreElements()) {
+            String key = keys.nextElement();
+            map.put(key, contents.get(key));
+        }
+        return map;
+    }
+
+    public StandardBundleManifest(ParserLogger logger, Reader reader) throws IOException {
+        this(logger, parseContents(reader));
+    }
+    
+    public StandardBundleManifest(ParserLogger logger, ManifestContents manifestContents) {
+        this(logger, manifestContents.getMainAttributes());
+    }
+   
+    private static ManifestContents parseContents(Reader reader) throws IOException {
+        ManifestParser parser = new RecoveringManifestParser();
+        parser.setTerminateAfterMainSection(true);
+        ManifestContents contents = parser.parse(reader);
+        if (parser.foundProblems()) {
+            List<ManifestProblem> problems = parser.getProblems();
+            for (ManifestProblem problem : problems) {
+                if (!problem.getKind().equals(ManifestProblemKind.ILLEGAL_NAME_CHAR) && !problem.getKind().equals(ManifestProblemKind.VALUE_TOO_LONG)) {
+                    throw new IOException(problems.toString());
+                }
+            }            
+        }
+        return contents;
+    }
+
+    private static CaseInsensitiveMap<Parseable> initializeHeaders(Map<String, String> contents, HeaderParser parser) {
+        CaseInsensitiveMap<Parseable> headers = createHeadersMap(parser);
+        for (Map.Entry<String, Parseable> entry : headers.entrySet()) {
+            String value = contents.get(entry.getKey());
+            if (value != null) {
+                entry.getValue().resetFromParseString(value);
+            }
+        }
+        return headers;
+    }
+
+    private static CaseInsensitiveMap<Parseable> createHeadersMap(HeaderParser parser) {
+        CaseInsensitiveMap<Parseable> headers = new CaseInsensitiveMap<Parseable>();
+        headers.put(Constants.BUNDLE_ACTIVATIONPOLICY, new StandardBundleActivationPolicy(parser));
+        headers.put(Constants.BUNDLE_SYMBOLICNAME, new StandardBundleSymbolicName(parser));
+        headers.put(Constants.DYNAMICIMPORT_PACKAGE, new StandardDynamicImportPackage(parser));
+        headers.put(Constants.EXPORT_PACKAGE, new StandardExportPackage(parser));
+        headers.put(Constants.FRAGMENT_HOST, new StandardFragmentHost(parser));
+        headers.put(IMPORT_BUNDLE, new StandardImportBundle(parser));
+        headers.put(IMPORT_LIBRARY, new StandardImportLibrary(parser));
+        headers.put(Constants.IMPORT_PACKAGE, new StandardImportPackage(parser));
+        headers.put(Constants.REQUIRE_BUNDLE, new StandardRequireBundle(parser));
+        return headers;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public BundleActivationPolicy getBundleActivationPolicy() {
+        return (BundleActivationPolicy) this.headers.get(Constants.BUNDLE_ACTIVATIONPOLICY);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public List<String> getBundleClasspath() {
+        return HeaderUtils.toList(Constants.BUNDLE_CLASSPATH, this.contents);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getBundleDescription() {
+        return this.contents.get(Constants.BUNDLE_DESCRIPTION);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public int getBundleManifestVersion() {
+        int bundleManifestVersion = 1;
+        String value = this.contents.get(Constants.BUNDLE_MANIFESTVERSION);
+        if (value != null) {
+            bundleManifestVersion = Integer.parseInt(value);
+        }
+        return bundleManifestVersion;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getBundleName() {
+        return this.contents.get(Constants.BUNDLE_NAME);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public BundleSymbolicName getBundleSymbolicName() {
+        return (BundleSymbolicName) this.headers.get(Constants.BUNDLE_SYMBOLICNAME);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public URL getBundleUpdateLocation() {
+        URL updateLocation = null;
+        String value = this.contents.get(Constants.BUNDLE_UPDATELOCATION);
+        if (value != null) {
+            try {
+                updateLocation = new URL(value);
+            } catch (MalformedURLException murle) {
+                // Should never happen
+            }
+        }
+        return updateLocation;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public DynamicImportPackage getDynamicImportPackage() {
+        return (DynamicImportPackage) this.headers.get(Constants.DYNAMICIMPORT_PACKAGE);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public ExportPackage getExportPackage() {
+        return (ExportPackage) this.headers.get(Constants.EXPORT_PACKAGE);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public FragmentHost getFragmentHost() {
+        return (FragmentHost) this.headers.get(Constants.FRAGMENT_HOST);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public ImportBundle getImportBundle() {
+        return (ImportBundle) this.headers.get(BundleManifest.IMPORT_BUNDLE);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public ImportLibrary getImportLibrary() {
+        return (ImportLibrary) this.headers.get(BundleManifest.IMPORT_LIBRARY);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public ImportPackage getImportPackage() {
+        return (ImportPackage) this.headers.get(Constants.IMPORT_PACKAGE);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getModuleScope() {
+        return this.contents.get(MODULE_SCOPE);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getModuleType() {
+        return this.contents.get(MODULE_TYPE);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public RequireBundle getRequireBundle() {
+        return (RequireBundle) this.headers.get(Constants.REQUIRE_BUNDLE);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void setBundleDescription(String bundleDescription) {
+        if (bundleDescription == null) {
+            this.contents.remove(Constants.BUNDLE_DESCRIPTION);
+        } else {
+            this.contents.put(Constants.BUNDLE_DESCRIPTION, bundleDescription);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void setBundleManifestVersion(int bundleManifestVersion) {
+        this.contents.put(Constants.BUNDLE_MANIFESTVERSION, Integer.toString(bundleManifestVersion));
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void setBundleName(String bundleName) {
+        if (bundleName == null) {
+            this.contents.remove(Constants.BUNDLE_NAME);
+        } else {
+            this.contents.put(Constants.BUNDLE_NAME, bundleName);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void setBundleUpdateLocation(URL bundleUpdateLocation) {
+        if (bundleUpdateLocation == null) {
+            this.contents.remove(Constants.BUNDLE_UPDATELOCATION);
+        } else {
+            this.contents.put(Constants.BUNDLE_UPDATELOCATION, bundleUpdateLocation.toExternalForm());
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void setModuleScope(String moduleScope) {
+        if (moduleScope == null) {
+            this.contents.remove(MODULE_SCOPE);
+        } else {
+            this.contents.put(MODULE_SCOPE, moduleScope);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void setModuleType(String moduleType) {
+        if (moduleType == null) {
+            this.contents.remove(MODULE_TYPE);
+        } else {
+            this.contents.put(MODULE_TYPE, moduleType);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Dictionary<String, String> toDictionary() {
+        synchroniseContentsWithHeaders();
+
+        return new MapToDictionaryAdapter(new CaseInsensitiveMap<String>(this.contents));
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Version getBundleVersion() {
+        String value = this.contents.get(Constants.BUNDLE_VERSION);
+        if (value != null) {
+            return new Version(value);
+        } else {
+            return Version.emptyVersion;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void setBundleVersion(Version bundleVersion) {
+        if (bundleVersion != null) {
+            this.contents.put(Constants.BUNDLE_VERSION, bundleVersion.toString());
+        } else {
+            this.contents.remove(Constants.BUNDLE_VERSION);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getHeader(String name) {
+        synchroniseContentsWithHeaders();
+        return this.contents.get(name);
+    }
+
+    private void synchroniseContentsWithHeaders() {
+        for (Map.Entry<String, String> content : this.contents.entrySet()) {
+            Parseable header = this.headers.get(content.getKey());
+            if (header != null) {
+                String headerValue = header.toParseString();
+                if (headerValue != null) {
+                    this.contents.put(content.getKey(), headerValue);
+                } else {
+                    this.contents.remove(content.getKey());
+                }
+            }
+        }
+        for (Map.Entry<String, Parseable> header : this.headers.entrySet()) {
+            if (this.contents.get(header.getKey()) == null) {
+                String headerValue = header.getValue().toParseString();
+                if (headerValue != null) {
+                    this.contents.put(header.getKey(), headerValue);
+                }
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void setHeader(String name, String value) {
+        if (value == null) {
+            this.contents.remove(name);
+        } else {
+            this.contents.put(name, value);
+        }
+
+        Parseable header = this.headers.get(name);
+        if (header != null) {
+            header.resetFromParseString(value);
+        }
+    }
+
+    public void write(Writer writer) throws IOException {
+        Manifest manifest = new Manifest();
+        Attributes attributes = manifest.getMainAttributes();
+
+        Dictionary<String, String> dictionary = toDictionary();
+
+        Enumeration<String> keys = dictionary.keys();
+
+        while (keys.hasMoreElements()) {
+            String key = keys.nextElement();
+            attributes.putValue(key, dictionary.get(key));
+        }
+
+        OutputStream writerOutputStream = new WriterOutputStream(writer);
+
+        try {
+            manifest.write(writerOutputStream);
+        } finally {
+            writerOutputStream.close();
+        }
+    }
+
+    public static class WriterOutputStream extends OutputStream {
+
+        private final Writer writer;
+
+        public WriterOutputStream(Writer writer) {
+            this.writer = writer;
+        }
+
+        @Override
+        public void write(int b) throws IOException {
+            this.writer.write(b);
+        }
+
+        @Override
+        public void close() throws IOException {
+            this.writer.close();
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String toString() {
+        StringWriter outputManifest = new StringWriter();
+        try {
+            write(outputManifest);
+        } catch (Exception e) {
+            // No Exceptions here
+        }
+        return outputManifest.toString();
+    }
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardBundleSymbolicName.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardBundleSymbolicName.java
new file mode 100755
index 0000000..0626f47
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardBundleSymbolicName.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.internal;
+
+import org.eclipse.virgo.util.osgi.manifest.BundleSymbolicName;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderDeclaration;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderParser;
+import org.osgi.framework.Constants;
+
+
+
+/**
+ * <strong>Concurrent Semantics</strong><br />
+ * Not thread-safe.
+ */
+class StandardBundleSymbolicName  extends BaseParameterised implements BundleSymbolicName {
+
+    StandardBundleSymbolicName(HeaderParser parser) {
+        super(parser);
+    }
+
+    @Override
+    HeaderDeclaration parse(HeaderParser parser, String parseString) {
+        return parser.parseBundleSymbolicName(parseString);
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public FragmentAttachment getFragmentAttachment() {        
+        String value = this.getDirectives().get(Constants.FRAGMENT_ATTACHMENT_DIRECTIVE);
+        if (Constants.FRAGMENT_ATTACHMENT_NEVER.equals(value)) {
+            return FragmentAttachment.NEVER;
+        } else if (Constants.FRAGMENT_ATTACHMENT_RESOLVETIME.equals(value)) {
+            return FragmentAttachment.RESOLVE_TIME;
+        } else {
+            return FragmentAttachment.ALWAYS;
+        }
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public String getSymbolicName() {
+        return this.name;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public boolean isSingleton() {
+        return Boolean.valueOf(this.getDirectives().get(Constants.SINGLETON_DIRECTIVE));
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void setFragmentAttachment(FragmentAttachment fragmentAttachment) {
+        switch (fragmentAttachment) {
+            case NEVER:
+                this.getDirectives().put(Constants.FRAGMENT_ATTACHMENT_DIRECTIVE, Constants.FRAGMENT_ATTACHMENT_NEVER);
+                break;
+            case RESOLVE_TIME:
+                this.getDirectives().put(Constants.FRAGMENT_ATTACHMENT_DIRECTIVE, Constants.FRAGMENT_ATTACHMENT_RESOLVETIME);
+                break;
+            default:
+                this.getDirectives().remove(Constants.FRAGMENT_ATTACHMENT_DIRECTIVE);
+        }        
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void setSingleton(boolean singleton) {
+        this.getDirectives().put(Constants.SINGLETON_DIRECTIVE, Boolean.toString(singleton));         
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void setSymbolicName(String symbolicName) {
+        this.name = symbolicName;
+    }
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardDynamicImportPackage.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardDynamicImportPackage.java
new file mode 100755
index 0000000..352b280
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardDynamicImportPackage.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.internal;
+
+import java.util.List;
+
+import org.eclipse.virgo.util.osgi.manifest.DynamicImportPackage;
+import org.eclipse.virgo.util.osgi.manifest.DynamicallyImportedPackage;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderDeclaration;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderParser;
+
+
+/**
+ * <strong>Concurrent Semantics</strong><br />
+ * Not thread-safe.
+ */
+class StandardDynamicImportPackage extends CompoundParseable<DynamicallyImportedPackage> implements DynamicImportPackage {
+
+    /**
+     * @param parser
+     */
+    StandardDynamicImportPackage(HeaderParser parser) {
+        super(parser);
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    List<HeaderDeclaration> parse(String parseString) {
+        return this.parser.parseDynamicImportPackageHeader(parseString);
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public DynamicallyImportedPackage addDynamicallyImportedPackage(String dynamicallyImportedPackage) {
+        return add(dynamicallyImportedPackage);
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public List<DynamicallyImportedPackage> getDynamicallyImportedPackages() {
+        return this.components;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    DynamicallyImportedPackage newEntry(String name) {
+        return new StandardDynamicallyImportedPackage(this.parser, name);        
+    }
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardDynamicallyImportedPackage.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardDynamicallyImportedPackage.java
new file mode 100755
index 0000000..2f72898
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardDynamicallyImportedPackage.java
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.internal;
+
+import java.util.List;
+
+import org.eclipse.virgo.util.osgi.manifest.DynamicallyImportedPackage;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderDeclaration;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderParser;
+import org.osgi.framework.Constants;
+
+
+
+/**
+ * <strong>Concurrent Semantics</strong><br />
+ * Not thread-safe.
+ */
+class StandardDynamicallyImportedPackage extends BaseCompoundHeaderEntry implements DynamicallyImportedPackage {
+    
+    StandardDynamicallyImportedPackage(HeaderParser parser, String name) {
+        super(parser, name);
+    }
+
+    @Override
+    HeaderDeclaration parse(HeaderParser parser, String parseString) {
+        List<HeaderDeclaration> headerDeclarations = parser.parseDynamicImportPackageHeader(parseString);
+        return headerDeclarations.get(0);
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public String getPackageName() {
+        return this.name;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void setPackageName(String packageName) {
+        this.name = packageName;
+    }
+    
+    /** 
+     * {@inheritDoc}
+     */
+    public String getBundleSymbolicName() {
+        return getAttributes().get(Constants.BUNDLE_SYMBOLICNAME_ATTRIBUTE);
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public VersionRange getBundleVersion() {
+        return new VersionRange(getAttributes().get(Constants.BUNDLE_VERSION_ATTRIBUTE));
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public VersionRange getVersion() {
+        String value = getAttributes().get(Constants.VERSION_ATTRIBUTE);
+        return new VersionRange(value);        
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void setVersion(VersionRange versionRange) {
+        if (versionRange != null) {
+            getAttributes().put(Constants.VERSION_ATTRIBUTE, versionRange.toParseString());
+        } else {
+            getAttributes().remove(Constants.VERSION_ATTRIBUTE);
+        }
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void setBundleSymbolicName(String bundleSymbolicName) {
+        getAttributes().put(Constants.BUNDLE_SYMBOLICNAME_ATTRIBUTE, bundleSymbolicName);        
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void setBundleVersion(VersionRange versionRange) {
+        if (versionRange != null) {
+            getAttributes().put(Constants.BUNDLE_VERSION_ATTRIBUTE, versionRange.toParseString());
+        } else {
+            getAttributes().remove(Constants.BUNDLE_VERSION_ATTRIBUTE);
+        }
+        
+    }
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardExportPackage.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardExportPackage.java
new file mode 100755
index 0000000..1b00315
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardExportPackage.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.internal;
+
+import java.util.List;
+
+import org.eclipse.virgo.util.osgi.manifest.ExportPackage;
+import org.eclipse.virgo.util.osgi.manifest.ExportedPackage;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderDeclaration;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderParser;
+import org.osgi.framework.Constants;
+
+
+
+/**
+ * <strong>Concurrent Semantics</strong><br />
+ * Not thread-safe.
+ */
+class StandardExportPackage extends CompoundParseable<ExportedPackage> implements ExportPackage {
+
+    StandardExportPackage(HeaderParser parser) {
+        super(parser);
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    List<HeaderDeclaration> parse(String parseString) {
+        return this.parser.parsePackageHeader(parseString, Constants.EXPORT_PACKAGE);        
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public ExportedPackage addExportedPackage(String exportedPackage) {
+        return add(exportedPackage);        
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public List<ExportedPackage> getExportedPackages() {
+        return this.components;        
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    ExportedPackage newEntry(String name) {
+        return new StandardExportedPackage(this.parser, name);
+    }
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardExportedPackage.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardExportedPackage.java
new file mode 100755
index 0000000..dbc43d6
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardExportedPackage.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.internal;
+
+import java.util.List;
+
+import org.eclipse.virgo.util.osgi.manifest.ExportedPackage;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderDeclaration;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderParser;
+import org.osgi.framework.Constants;
+import org.osgi.framework.Version;
+
+
+/**
+ * <strong>Concurrent Semantics</strong><br />
+ * Not thread-safe.
+ */
+public class StandardExportedPackage extends BaseCompoundHeaderEntry implements ExportedPackage {    
+    
+    StandardExportedPackage(HeaderParser parser, String name) {
+        super(parser, name);
+    }
+    
+    @Override
+    HeaderDeclaration parse(HeaderParser parser, String parseString) {
+        List<HeaderDeclaration> header = parser.parsePackageHeader(parseString, Constants.EXPORT_PACKAGE);
+        return header.get(0);
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public List<String> getExclude() {
+        return HeaderUtils.toList(Constants.EXCLUDE_DIRECTIVE, getDirectives()); 
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public List<String> getInclude() {
+        return HeaderUtils.toList(Constants.INCLUDE_DIRECTIVE, getDirectives());        
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public List<String> getMandatory() {
+        return HeaderUtils.toList(Constants.MANDATORY_DIRECTIVE, getDirectives());
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public String getPackageName() {
+        return this.name;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public List<String> getUses() {
+        return HeaderUtils.toList(Constants.USES_DIRECTIVE, getDirectives());
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public Version getVersion() {
+        String value = getAttributes().get(Constants.VERSION_ATTRIBUTE);
+        if (value != null) {
+            return new Version(value);
+        } else {
+            return Version.emptyVersion;
+        }
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void setVersion(Version version) {
+        if (version != null) {
+            getAttributes().put(Constants.VERSION_ATTRIBUTE, version.toString());
+        } else {
+            getAttributes().remove(Constants.VERSION_ATTRIBUTE);
+        }
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void setPackageName(String packageName) {
+        if (packageName == null) {
+            throw new IllegalArgumentException("packageName must not be null");
+        }
+        this.name = packageName;        
+    }
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardFragmentHost.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardFragmentHost.java
new file mode 100755
index 0000000..7c1ea1f
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardFragmentHost.java
@@ -0,0 +1,104 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.internal;
+
+import org.eclipse.virgo.util.osgi.manifest.FragmentHost;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderDeclaration;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderParser;
+import org.osgi.framework.Constants;
+
+
+
+/**
+ * <strong>Concurrent Semantics</strong><br />
+ * Not thread-safe.
+ */
+class StandardFragmentHost extends BaseParameterised implements FragmentHost {
+
+    StandardFragmentHost(HeaderParser parser) {
+        super(parser);
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    HeaderDeclaration parse(HeaderParser parser, String parseString) {        
+        return parser.parseFragmentHostHeader(parseString);
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public String getBundleSymbolicName() {
+        return this.name;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public Extension getExtension() {
+        String value = getDirectives().get(Constants.EXTENSION_DIRECTIVE);
+        if (Constants.EXTENSION_BOOTCLASSPATH.equals(value)) {
+            return Extension.BOOTCLASSPATH;
+        } else if (Constants.EXTENSION_FRAMEWORK.equals(value)) {
+            return Extension.FRAMEWORK;
+        }
+        return null;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void setBundleSymbolicName(String hostName) {
+        this.name = hostName;        
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void setExtension(Extension extension) {
+        if (extension == null) {
+            getDirectives().remove(Constants.EXTENSION_DIRECTIVE);
+            return;
+        }
+        
+        switch (extension) {
+            case BOOTCLASSPATH:
+                getDirectives().put(Constants.EXTENSION_DIRECTIVE, Constants.EXTENSION_BOOTCLASSPATH);
+                break;
+            case FRAMEWORK:
+                getDirectives().put(Constants.EXTENSION_DIRECTIVE, Constants.EXTENSION_FRAMEWORK);
+                break;            
+        }
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public VersionRange getBundleVersion() {
+        return new VersionRange(getAttributes().get(Constants.BUNDLE_VERSION_ATTRIBUTE));        
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void setBundleVersion(VersionRange versionRange) {
+        if (versionRange == null) {
+            getAttributes().remove(Constants.BUNDLE_VERSION_ATTRIBUTE);
+            
+        } else {
+            getAttributes().put(Constants.BUNDLE_VERSION_ATTRIBUTE, versionRange.toParseString());
+        }        
+    }
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardImportBundle.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardImportBundle.java
new file mode 100755
index 0000000..f526c2c
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardImportBundle.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.internal;
+
+import java.util.List;
+
+import org.eclipse.virgo.util.osgi.manifest.ImportBundle;
+import org.eclipse.virgo.util.osgi.manifest.ImportedBundle;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderDeclaration;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderParser;
+
+
+
+/**
+ * <strong>Concurrent Semantics</strong><br />
+ * Not thread-safe.
+ */
+class StandardImportBundle extends CompoundParseable<ImportedBundle> implements ImportBundle {
+
+    StandardImportBundle(HeaderParser parser) {
+        super(parser);
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public ImportedBundle addImportedBundle(String importedBundle) {
+        return add(importedBundle);
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public List<ImportedBundle> getImportedBundles() {
+        return this.components;
+    }
+
+    @Override
+    List<HeaderDeclaration> parse(String parseString) {
+        return this.parser.parseImportBundleHeader(parseString);        
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    ImportedBundle newEntry(String name) {
+        return new StandardImportedBundle(this.parser, name);
+    }
+
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardImportLibrary.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardImportLibrary.java
new file mode 100755
index 0000000..615c5a8
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardImportLibrary.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.internal;
+
+import java.util.List;
+
+import org.eclipse.virgo.util.osgi.manifest.ImportLibrary;
+import org.eclipse.virgo.util.osgi.manifest.ImportedLibrary;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderDeclaration;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderParser;
+
+
+
+/**
+ * <strong>Concurrent Semantics</strong><br />
+ * Not thread-safe
+ */
+public class StandardImportLibrary extends CompoundParseable<ImportedLibrary> implements ImportLibrary {
+
+    StandardImportLibrary(HeaderParser parser) {
+        super(parser);        
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    List<HeaderDeclaration> parse(String parseString) {
+        return this.parser.parseImportLibraryHeader(parseString);        
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public ImportedLibrary addImportedLibrary(String importedLibrary) {
+        return add(importedLibrary);
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public List<ImportedLibrary> getImportedLibraries() {
+        return this.components;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    ImportedLibrary newEntry(String name) {
+        return new StandardImportedLibrary(this.parser, name);
+    }
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardImportPackage.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardImportPackage.java
new file mode 100755
index 0000000..bae3c63
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardImportPackage.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.internal;
+
+import java.util.List;
+
+import org.eclipse.virgo.util.osgi.manifest.ImportPackage;
+import org.eclipse.virgo.util.osgi.manifest.ImportedPackage;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderDeclaration;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderParser;
+import org.osgi.framework.Constants;
+
+
+/**
+ * <strong>Concurrent Semantics</strong><br />
+ * Thread-safe.
+ */
+public class StandardImportPackage extends CompoundParseable<ImportedPackage> implements ImportPackage {
+
+    /**
+     * @param parser
+     */
+    StandardImportPackage(HeaderParser parser) {
+        super(parser);
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public ImportedPackage addImportedPackage(String importedPackage) {
+        return add(importedPackage);
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public List<ImportedPackage> getImportedPackages() {
+        return this.components;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    List<HeaderDeclaration> parse(String parseString) {
+        return this.parser.parsePackageHeader(parseString, Constants.IMPORT_PACKAGE);        
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    ImportedPackage newEntry(String name) {
+        return new StandardImportedPackage(this.parser, name);
+    }
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardImportedBundle.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardImportedBundle.java
new file mode 100755
index 0000000..61d3dc6
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardImportedBundle.java
@@ -0,0 +1,121 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.internal;
+
+import java.util.List;
+
+import org.eclipse.virgo.util.osgi.manifest.ImportedBundle;
+import org.eclipse.virgo.util.osgi.manifest.Sharing;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderDeclaration;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderParser;
+
+
+/**
+ * <strong>Concurrent Semantics</strong><br />
+ * Not thread-safe.
+ */
+class StandardImportedBundle extends BaseImported implements ImportedBundle {
+
+    private static final String SHARING_SHARE = "share";
+
+    private static final String SHARING_CLONE = "clone";
+
+    private static final String SHARING_DIRECTIVE = "sharing";
+
+    private static final String IMPORT_SCOPE_APPLICATION = "application";
+
+    private static final String IMPORT_SCOPE_DIRECTIVE = "import-scope";
+
+    public StandardImportedBundle(HeaderParser parser, String name) {
+        super(parser, name);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    HeaderDeclaration parse(HeaderParser parser, String parseString) {
+        List<HeaderDeclaration> header = parser.parseImportBundleHeader(parseString);
+        return header.get(0);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isApplicationImportScope() {
+        return IMPORT_SCOPE_APPLICATION.equals(getDirectives().get(IMPORT_SCOPE_DIRECTIVE));
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getBundleSymbolicName() {
+        return this.name;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Sharing getSharing() {
+        String value = getDirectives().get(SHARING_DIRECTIVE);
+        if (SHARING_SHARE.equals(value)) {
+            return Sharing.SHARE;
+        } else if (SHARING_CLONE.equals(value)) {
+            return Sharing.CLONE;
+        } else {
+            return Sharing.AUTOMATIC;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void setApplicationImportScope(boolean applicationImportScope) {
+        if (applicationImportScope) {
+            getDirectives().put(IMPORT_SCOPE_DIRECTIVE, IMPORT_SCOPE_APPLICATION);
+        } else {
+            getDirectives().remove(IMPORT_SCOPE_DIRECTIVE);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void setBundleSymbolicName(String bundleSymbolicName) {
+        if (bundleSymbolicName == null) {
+            throw new IllegalArgumentException("bundleSymbolicName must not be null");
+        }
+        this.name = bundleSymbolicName;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void setSharing(Sharing sharing) {
+        if (sharing == null) {
+            getDirectives().remove(SHARING_DIRECTIVE);
+            return;
+        }
+        
+        switch (sharing) {
+            case CLONE:
+                getDirectives().put(SHARING_DIRECTIVE, SHARING_CLONE);
+                break;
+            case SHARE:
+                getDirectives().put(SHARING_DIRECTIVE, SHARING_SHARE);
+                break;
+            default:
+                getDirectives().remove(SHARING_DIRECTIVE);
+                break;
+        }
+    }
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardImportedLibrary.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardImportedLibrary.java
new file mode 100755
index 0000000..00ac336
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardImportedLibrary.java
@@ -0,0 +1,97 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.internal;
+
+import org.eclipse.virgo.util.osgi.manifest.ImportedLibrary;
+import org.eclipse.virgo.util.osgi.manifest.Sharing;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderDeclaration;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderParser;
+
+
+/**
+ * <strong>Concurrent Semantics</strong><br />
+ * Not thread-safe.
+ * 
+ */
+public class StandardImportedLibrary extends BaseImported implements ImportedLibrary {
+    
+    private static final String SHARING_SHARE = "share";
+    
+    private static final String SHARING_CLONE = "clone";
+    
+    private static final String SHARING_DIRECTIVE = "sharing";
+
+    StandardImportedLibrary(HeaderParser parser, String name) {
+        super(parser, name);
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    HeaderDeclaration parse(HeaderParser parser, String parseString) {
+        return parser.parseImportLibraryHeader(parseString).get(0);
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public String getLibrarySymbolicName() {
+        return this.name;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void setLibrarySymbolicName(String librarySymbolicName) {
+        if (librarySymbolicName == null) {
+            throw new IllegalArgumentException("librarySymbolicName must not be null");
+        }
+        this.name = librarySymbolicName;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public Sharing getSharing() {
+        String value = getDirectives().get(SHARING_DIRECTIVE);
+        if (SHARING_SHARE.equals(value)) {
+            return Sharing.SHARE;
+        } else if (SHARING_CLONE.equals(value)) {
+            return Sharing.CLONE;
+        } else {
+            return Sharing.AUTOMATIC;
+        }
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void setSharing(Sharing sharing) {
+        if (sharing == null) {
+            getDirectives().remove(SHARING_DIRECTIVE);
+            return;
+        }
+        
+        switch (sharing) {
+            case CLONE: 
+                getDirectives().put(SHARING_DIRECTIVE, SHARING_CLONE);
+                break;
+            case SHARE:
+                getDirectives().put(SHARING_DIRECTIVE, SHARING_SHARE);
+                break;
+            default:
+                getDirectives().remove(SHARING_DIRECTIVE);
+                break;       
+        }   
+    }
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardImportedPackage.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardImportedPackage.java
new file mode 100755
index 0000000..0e82a63
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardImportedPackage.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.internal;
+
+import org.eclipse.virgo.util.osgi.manifest.ImportedPackage;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderDeclaration;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderParser;
+import org.osgi.framework.Constants;
+
+
+
+/**
+ * <strong>Concurrent Semantics</strong><br />
+ * Not thread-safe.
+ */
+public class StandardImportedPackage extends BaseImported implements ImportedPackage {
+
+    StandardImportedPackage(HeaderParser parser, String name) {
+        super(parser, name);
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    HeaderDeclaration parse(HeaderParser parser, String parseString) {
+        return parser.parsePackageHeader(parseString, Constants.IMPORT_PACKAGE).get(0);
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public String getBundleSymbolicName() {
+        return getAttributes().get(Constants.BUNDLE_SYMBOLICNAME_ATTRIBUTE);
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public VersionRange getBundleVersion() {
+        return new VersionRange(getAttributes().get(Constants.BUNDLE_VERSION_ATTRIBUTE));
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public String getPackageName() {
+        return this.name;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void setBundleSymbolicName(String bundleSymbolicName) {
+        getAttributes().put(Constants.BUNDLE_SYMBOLICNAME_ATTRIBUTE, bundleSymbolicName);
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void setBundleVersion(VersionRange versionRange) {
+        getAttributes().put(Constants.BUNDLE_VERSION_ATTRIBUTE, versionRange.toParseString());
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void setPackageName(String packageName) {
+        if (packageName == null) {
+            throw new IllegalArgumentException("packageName must not be null");
+        }
+        this.name = packageName;
+    }
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardRequireBundle.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardRequireBundle.java
new file mode 100755
index 0000000..c73fe71
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardRequireBundle.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.internal;
+
+import java.util.List;
+
+import org.eclipse.virgo.util.osgi.manifest.RequireBundle;
+import org.eclipse.virgo.util.osgi.manifest.RequiredBundle;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderDeclaration;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderParser;
+
+
+
+/**
+ * <strong>Concurrent Semantics</strong><br />
+ * Not thread-safe.
+ */
+public class StandardRequireBundle extends CompoundParseable<RequiredBundle> implements RequireBundle {
+
+    StandardRequireBundle(HeaderParser parser) {
+        super(parser);
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public RequiredBundle addRequiredBundle(String requiredBundle) {
+        return add(requiredBundle);
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public List<RequiredBundle> getRequiredBundles() {
+        return this.components;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    List<HeaderDeclaration> parse(String parseString) {
+        return this.parser.parseRequireBundleHeader(parseString);        
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    @Override
+    RequiredBundle newEntry(String name) {
+        return new StandardRequiredBundle(this.parser, name);
+    }
+
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardRequiredBundle.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardRequiredBundle.java
new file mode 100755
index 0000000..2718872
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardRequiredBundle.java
@@ -0,0 +1,130 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.internal;
+
+import org.eclipse.virgo.util.osgi.manifest.RequiredBundle;
+import org.eclipse.virgo.util.osgi.manifest.Resolution;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderDeclaration;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderParser;
+import org.osgi.framework.Constants;
+
+
+/**
+ * <strong>Concurrent Semantics</strong><br />
+ * Not thread-safe.
+ */
+public class StandardRequiredBundle extends BaseCompoundHeaderEntry implements RequiredBundle {
+
+    StandardRequiredBundle(HeaderParser parser, String name) {
+        super(parser, name);
+    }
+
+    public String getBundleSymbolicName() {
+        return this.name;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Resolution getResolution() {
+        String value = getDirectives().get(Constants.RESOLUTION_DIRECTIVE);
+        if (Constants.RESOLUTION_OPTIONAL.equals(value)) {
+            return Resolution.OPTIONAL;
+        } else {
+            return Resolution.MANDATORY;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Visibility getVisibility() {
+        String value = getDirectives().get(Constants.VISIBILITY_DIRECTIVE);
+        if (Constants.VISIBILITY_REEXPORT.equals(value)) {
+            return Visibility.REEXPORT;
+        } else {
+            return Visibility.PRIVATE;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void setBundleSymbolicName(String bundleSymbolicName) {
+        if (bundleSymbolicName == null) {
+            throw new IllegalArgumentException("bundleSymbolicName must not be null");
+        }
+        this.name = bundleSymbolicName;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void setResolution(Resolution resolution) {
+        if (resolution == null) {
+            getDirectives().remove(Constants.RESOLUTION_DIRECTIVE);
+        } else {
+            switch (resolution) {
+                case OPTIONAL:
+                    getDirectives().put(Constants.RESOLUTION_DIRECTIVE, Constants.RESOLUTION_OPTIONAL);
+                    break;
+                default:
+                    getDirectives().remove(Constants.RESOLUTION_DIRECTIVE);
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void setVisibility(Visibility visibility) {
+        if (visibility == null) {
+            getDirectives().remove(Constants.VISIBILITY_DIRECTIVE);
+        } else {
+            switch (visibility) {
+                case REEXPORT:
+                    getDirectives().put(Constants.VISIBILITY_DIRECTIVE, Constants.VISIBILITY_REEXPORT);
+                    break;
+                default:
+                    getDirectives().remove(Constants.VISIBILITY_DIRECTIVE);
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    HeaderDeclaration parse(HeaderParser parser, String parseString) {
+        return parser.parseRequireBundleHeader(parseString).get(0);
+    }
+    
+    /** 
+     * {@inheritDoc}
+     */
+    public VersionRange getBundleVersion() {
+        return new VersionRange(getAttributes().get(Constants.BUNDLE_VERSION_ATTRIBUTE));        
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void setBundleVersion(VersionRange versionRange) {
+        if (versionRange == null) {
+            getAttributes().remove(Constants.BUNDLE_VERSION_ATTRIBUTE);
+            
+        } else {
+            getAttributes().put(Constants.BUNDLE_VERSION_ATTRIBUTE, versionRange.toParseString());
+        }        
+    }
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/BundleManifestParseException.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/BundleManifestParseException.java
new file mode 100755
index 0000000..677e32e
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/BundleManifestParseException.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.parse;
+
+/**
+ * Signals an exception during parsing of an OSGi bundle manifest.<p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br/>
+ * 
+ * Threadsafe.
+ * 
+ */
+public class BundleManifestParseException extends RuntimeException {
+
+    private static final long serialVersionUID = -1858207019089158397L;
+
+    public BundleManifestParseException(String message) {
+        super(message);
+    }
+
+    public BundleManifestParseException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/DummyParserLogger.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/DummyParserLogger.java
new file mode 100755
index 0000000..90fd31a
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/DummyParserLogger.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.parse;
+
+/**
+ * A dummy implementation of {@link ParserLogger} that swallows all
+ * error messages and always returns null from {@link #errorReports()}.
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Thread-safe.
+ *
+ */
+public class DummyParserLogger implements ParserLogger {
+    
+    /** 
+     * {@inheritDoc}
+     */
+    public String[] errorReports() {
+        return null;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public void outputErrorMsg(Exception re, String item) {        
+    }
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/FatalParseException.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/FatalParseException.java
new file mode 100755
index 0000000..642fe82
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/FatalParseException.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.parse;
+
+/**
+ * Signals a fatal exception in the parser subsystem.<p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br/>
+ * 
+ * Threadsafe.
+ * 
+ */
+public class FatalParseException extends RuntimeException {
+
+    private static final long serialVersionUID = -4743527883152311469L;
+
+    /** 
+     * Creates a new <code>FatalParseException</code> with the supplied error message.
+     * 
+     * @param message The exception's message
+     */
+    public FatalParseException(String message) {
+        super(message);
+    }
+
+    /** 
+     * Creates a new <code>FatalParseException</code> with the supplied error message and cause.
+     * 
+     * @param message The exception's message
+     * @param cause The exception's cause
+     */
+    public FatalParseException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/HeaderDeclaration.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/HeaderDeclaration.java
new file mode 100755
index 0000000..2d5c488
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/HeaderDeclaration.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.parse;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Describes a header declaration (Import-Package, Export-Package, Require-Bundle, etc.) in an OSGi manifest header.
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br/>
+ * 
+ * Implementations need not be thread-safe.
+ * 
+ */
+public interface HeaderDeclaration {
+
+    /**
+     * Returns a <code>List</code> of the names of the entries in the declaration. If the declaration has no names,
+     * an empty <code>Map</code> must be returned, rather than <code>null</code>. 
+     * 
+     * @return the names, never <code>null</code>.
+     */
+    List<String> getNames();
+
+    /**
+     * Returns a <code>Map</code> of the attributes included in this declaration. If the declaration has
+     * no attributes, an empty <code>Map</code> must be returned, rather than <code>null</code>.
+     * 
+     * @return the attributes.
+     */
+    Map<String, String> getAttributes();
+
+    /**
+     * Returns a <code>Map</code> of the directives included in this declaration. If the declaration has
+     * no directives, an empty <code>Map</code> must be returned, rather than <code>null</code>.
+     * 
+     * @return the directives.
+     */
+    Map<String, String> getDirectives();
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/HeaderParser.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/HeaderParser.java
new file mode 100755
index 0000000..0cef889
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/HeaderParser.java
@@ -0,0 +1,125 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.parse;
+
+import java.util.List;
+
+/**
+ * Strategy for parsing OSGi manifest headers.<p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br/>
+ * 
+ * Implementations need not be threadsafe.
+ * 
+ */
+public interface HeaderParser {
+
+    /**
+     * Parses the supplied import/export package header text and returns the list of corresponding
+     * {@link HeaderDeclaration}s.
+     * 
+     * @param header the header text to parse.
+     * @param headerType 
+     * @return the {@link HeaderDeclaration}s.
+     */
+    List<HeaderDeclaration> parsePackageHeader(String header, String headerType);
+
+    /**
+     * Parses the supplied dynamic import header text and returns the list of corresponding
+     * {@link HeaderDeclaration HeaderDeclarations}. Dynamic imports allow wildcarded package names.
+     * 
+     * @param header the header text to parse.
+     * @return the {@link HeaderDeclaration}s.
+     */
+    List<HeaderDeclaration> parseDynamicImportPackageHeader(String header);
+
+    /**
+     * Parses the supplied require bundle header text and returns the list of corresponding
+     * {@link HeaderDeclaration HeaderDeclarations}.
+     * 
+     * @param header the header text to parse.
+     * @return the {@link HeaderDeclaration}s.
+     */
+    List<HeaderDeclaration> parseRequireBundleHeader(String header);
+
+    /**
+     * Parses the supplied fragment host header text and returns the corresponding
+     * {@link HeaderDeclaration HeaderDeclaration}.
+     * 
+     * @param header the header text to parse.
+     * @return the {@link HeaderDeclaration}.
+     * 
+     */
+    HeaderDeclaration parseFragmentHostHeader(String header);
+
+    /**
+     * Parses the supplied bundle symbolic name header text and returns the corresponding
+     * {@link HeaderDeclaration HeaderDeclaration}.
+     * 
+     * @param header the header text to parse.
+     * @return the {@link HeaderDeclaration} for the Bundle-SymbolicName.
+     */
+    HeaderDeclaration parseBundleSymbolicName(String header);
+
+    /**
+     * Parses the supplied import bundle header text and returns the list of corresponding
+     * {@link HeaderDeclaration HeaderDeclarations}.
+     * 
+     * @param header the header text to parse.
+     * @return the {@link HeaderDeclaration}s.
+     */
+    List<HeaderDeclaration> parseImportBundleHeader(String header);
+
+    /**
+     * Parses the supplied Import-Library header text and returns the list of corresponding
+     * {@link HeaderDeclaration HeaderDeclarations}.
+     * 
+     * @param header the header text to parse.
+     * @return the {@link HeaderDeclaration}s.
+     */
+    List<HeaderDeclaration> parseImportLibraryHeader(String header);
+
+    /**
+     * Parses the supplied Library-SymbolicName header text and returns the list of corresponding
+     * {@link HeaderDeclaration HeaderDeclarations}.
+     * 
+     * @param header the header text to parse.
+     * @return the {@link HeaderDeclaration}.
+     */
+    HeaderDeclaration parseLibrarySymbolicName(String header);
+    
+    /**
+     * Parses the supplied <code>Web-FilterMappings</code> header text and returns the list
+     * of corresponding {@link HeaderDeclaration HeaderDeclarations}.
+     * @param header 
+     * @return the {@link HeaderDeclaration}s.
+     */
+    List<HeaderDeclaration> parseWebFilterMappingsHeader(String header);
+    
+    /**
+     * Parses the supplied <code>Bundle-ActivationPolicy</code> header text and returns the
+     * corresponding {@link HeaderDeclaration}.
+     * @param header 
+     * @return the {@link HeaderDeclaration}.
+     */
+    HeaderDeclaration parseBundleActivationPolicy(String header);
+    
+    
+    /**
+     * Parses the supplied header text and returns the list of corresponding {@link HeaderDeclaration}.
+     * Format for the header is expected to follow OSGi 3.2.4 "Common Header Syntax"
+     * 
+     * @param header the header text to parse.
+     * @return the {@link HeaderDeclaration}s.
+     */
+    List<HeaderDeclaration> parseHeader(String header);
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/HeaderParserFactory.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/HeaderParserFactory.java
new file mode 100755
index 0000000..639c3e8
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/HeaderParserFactory.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.parse;
+
+import org.eclipse.virgo.util.osgi.manifest.parse.standard.StandardHeaderParser;
+
+/**
+ * Factory for creating {@link HeaderParser} instances
+ * <p/>
+ * .
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.
+ * 
+ */
+public final class HeaderParserFactory {
+
+	/**
+	 * Creates a new {@link HeaderParser} that logs to the supplied {@link ParserLogger}.
+	 * 
+	 * @param logger the <code>ParserLogger</code> to log to.
+	 * @return the new <code>HeaderParser</code>.
+	 */
+	public static HeaderParser newHeaderParser(ParserLogger logger) {
+		return new StandardHeaderParser(logger);
+	}
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/ParserLogger.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/ParserLogger.java
new file mode 100755
index 0000000..27461f2
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/ParserLogger.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.parse;
+
+/**
+ * <p>
+ * This is a stand-in logging service just for parsing manifests. It can run before the normal serviceability services
+ * have come up and allow errors to be correctly reported from the start of the server bootstrap process.
+ * </p>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Implementations of this interface should be Thread Safe
+ * 
+ */
+public interface ParserLogger {
+
+    /**
+     * Deal with a exception at level 'Error' logging it with what ever services are available.
+     * 
+     * @param re
+     * @param item
+     */
+    void outputErrorMsg(Exception re, String item);
+
+    /**
+     * Reports if this logging service has been used or not. If it has been used the parsing activities that have taken
+     * place since this logger was created or reset have encountered problems of some kind.
+     * 
+     * @return String array of all log event messages since the parser was created or cleaned
+     */
+    String[] errorReports();
+
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/BasicHeaderToken.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/BasicHeaderToken.java
new file mode 100755
index 0000000..472f58b
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/BasicHeaderToken.java
@@ -0,0 +1,389 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.parse.standard;
+
+
+
+/**
+
+ * Instances of BasicHeaderToken represent tokens lexed from the input data.
+
+ * <p>
+
+ * Internals:
+
+ * <p>
+
+ * A BasicHeaderToken effectively encapsulates the start and end of the token
+
+ * within the input data and some bitflag information that was learned during
+
+ * lexing that can benefit parsing. To avoid unnecessary chopping up of the
+
+ * input data, each token holds a reference to the complete headertext - and
+
+ * should the token ever need to be extracted we can grab the piece of interest.
+
+ * Sometimes the token values are never used and it would be a waste to chop up
+
+ * the data and create an unnecessary array.
+
+ * 
+
+ * Due to the way the grammar is defined to support parameter values, there is a
+
+ * notion in a HeaderToken of extension. The grammar defines a token to be
+
+ * ([a-z][A-Z][0-9]_-)+ but in order to allow things like 1.2.3 and com.foo.bar
+
+ * as parameter values without needing them to be quoted it defines an extended
+
+ * token that is allowed for parameter values. The lexer only knows about
+
+ * Tokens. However, it understands the notion of extension, which at its
+
+ * simplest means a sequence of tokens with dots between them. So for any token
+
+ * it can have the IS_EXTENDED bitflag set - and if that is set the token is the
+
+ * start of an extended token, and it ends at the extendedEndOffset.
+
+ * 
+
+ * <strong>Concurrent Semantics</strong><br />
+
+ * 
+
+ * Threadsafe.
+
+ * 
+
+
+ */
+
+public final class BasicHeaderToken implements HeaderToken {
+
+
+
+	private HeaderTokenKind kind;
+
+	private char[] headerText; // The entire header of which this token is a chunk
+
+	private int startoffset; // start index into the headerText
+
+	private int endoffset; // end index into the headerText
+
+	private int extendedEndOffset; // if this token IS_EXTENDED, this is the end of the extended token within the headerText
+
+	private byte bits; // bitflags capturing information learned during lexing, see below
+
+
+
+	//
+
+	// The bit flags are set by the lexer for optimized parsing:
+
+	// STARTED_WITH_LETTER - did this token begin with one of [a-zA-Z] - this can avoid later checks
+
+	// (which can be expensive if Character.isJavaIdentifierStart() must be called)
+
+	// ATTRIBUTE_NAME - does this token represent an attribute name? ie. is the token after this '='
+
+	// DIRECTIVE_NAME - does this token represent an directive name? ie. is the token after this ':='
+
+	// FOLLOWED_BY_SPACE - was this token followed by a ' '
+
+	// SPACED - this token is part of an extended token and it has a space in it (may not be a problem if the consumer is not
+
+	// consuming it as an extended token)
+
+	// IS_EXTENDED - this token is part of an extended token (it is followed by
+
+	// dots and further tokens). If IS_EXTENDED then the the extendedEndOffset
+
+	// provides the end position in the header
+
+	private static final byte STARTED_WITH_LETTER = 0x01;
+
+	private static final byte ATTRIBUTE_NAME = 0x02;
+
+	private static final byte DIRECTIVE_NAME = 0x04;
+
+	private static final byte SPACED = 0x10;
+
+	private static final byte IS_EXTENDED = 0x20;
+
+	private static final byte FOLLOWED_BY_SPACE = 0x40;
+
+
+
+	/**
+
+	 * Private constructor, please use the factory method
+
+	 */
+
+	private BasicHeaderToken(char[] headerText, HeaderTokenKind kind, int start, int end) {
+
+		this.headerText = headerText;
+
+		this.kind = kind;
+
+		this.startoffset = start;
+
+		this.endoffset = end;
+
+	}
+
+
+
+	/**
+
+	 * BasicHeaderToken factory method.
+	 * @param data header text
+	 * @param kind of header
+	 * @param start offset
+	 * @param end offset
+	 * @return a new BasicHeaderToken
+
+	 */
+
+	public static BasicHeaderToken makeToken(char[] data, HeaderTokenKind kind, int start, int end) {
+
+		return new BasicHeaderToken(data, kind, start, end);
+
+	}
+
+
+
+	/**
+
+	 * This method creates a new array each time it is called - try not call it more than once.
+
+	 * 
+
+	 * @return the characters making up this token.
+
+	 */
+
+	public char[] value() {
+
+		return subarray(startoffset, endoffset);
+
+	}
+
+
+
+	@Override
+
+	public String toString() {
+
+		StringBuilder s = new StringBuilder();
+
+		s.append("'").append(stringValue()).append("'");
+
+		s.append("@").append(startoffset).append(":").append(endoffset);
+
+		return s.toString();
+
+	}
+
+
+
+	public HeaderTokenKind getKind() {
+
+		return kind;
+
+	}
+
+
+
+	public int getEndOffset() {
+
+		return endoffset;
+
+	}
+
+
+
+	public int getStartOffset() {
+
+		return startoffset;
+
+	}
+
+
+
+	public String stringValue() {
+
+		return new String(value());
+
+	}
+
+
+
+	/**
+
+	 * This method creates a new array each time it is called - try not call it more than once.
+
+	 * 
+
+	 * @return the characters making up this token.
+
+	 */
+
+	public char[] extendedValue() {
+
+		return subarray(startoffset, extendedEndOffset);
+
+	}
+
+
+
+	private final char[] subarray(int start, int end) {
+
+		char[] result = new char[end - start];
+
+		System.arraycopy(headerText, start, result, 0, end - start);
+
+		return result;
+
+	}
+
+
+
+	public boolean isExtended() {
+
+		return (bits & IS_EXTENDED) != 0;
+
+	}
+
+
+
+	public void setExtendedOffset(int endOffset) {
+
+		bits |= IS_EXTENDED;
+
+		extendedEndOffset = endOffset;
+
+	}
+
+
+
+	public int getExtendedEndOffset() {
+
+		return extendedEndOffset;
+
+	}
+
+
+
+	public boolean isSpaced() {
+
+		return (bits & SPACED) != 0;
+
+	}
+
+
+
+	public boolean firstCharIsLetter() {
+
+		return (bits & STARTED_WITH_LETTER) != 0;
+
+	}
+
+
+
+	public boolean isAttributeOrDirectiveName() {
+
+		return (bits & (DIRECTIVE_NAME | ATTRIBUTE_NAME)) != 0;
+
+	}
+
+
+
+	public boolean hasFollowingSpace() {
+
+		return (bits & FOLLOWED_BY_SPACE) != 0;
+
+	}
+
+
+
+	/** @return the first character of this token */
+
+	public char firstChar() {
+
+		return headerText[startoffset];
+
+	}
+
+
+
+	public boolean isAttributeName() {
+
+		return (bits & ATTRIBUTE_NAME) != 0;
+
+	}
+
+
+
+	public boolean isDirectiveName() {
+
+		return (bits & DIRECTIVE_NAME) != 0;
+
+	}
+
+
+
+	public void tagAsDirectiveName() {
+
+		bits |= DIRECTIVE_NAME;
+
+	}
+
+
+
+	public void tagAsAttributeName() {
+
+		bits |= ATTRIBUTE_NAME;
+
+	}
+
+
+
+	public void tagAsStartedWithLetter() {
+
+		bits |= STARTED_WITH_LETTER;
+
+	}
+
+
+
+	public void tagAsSpaced() {
+
+		bits |= SPACED;
+
+	}
+
+
+
+	public void tagAsFollowedBySpace() {
+
+		bits |= FOLLOWED_BY_SPACE;
+
+	}
+
+
+
+}
+
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/DebugVisitor.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/DebugVisitor.java
new file mode 100755
index 0000000..ac0cc44
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/DebugVisitor.java
@@ -0,0 +1,163 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.parse.standard;
+
+
+
+import java.io.PrintStream;
+
+import java.util.Collections;
+
+import java.util.List;
+
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderDeclaration;
+
+
+
+
+
+
+/**
+
+ * Simple debug visitor that can be plugged into the parser to observe the
+
+ * visiting order. Plugging it in is as easy as using the StandardHeaderParser
+
+ * constructor that takes a visitor:
+
+ * <code>new StandardHeaderParser(new DebugVisitor())</code>. By default the
+
+ * logged output will go to System.out - but a difference PrintStream can be
+
+ * specified through the DebugVisitor constructor.
+
+ * 
+
+ * <strong>Concurrent Semantics</strong><br />
+
+ * 
+
+ * Threadsafe.
+
+ * 
+
+
+ */
+
+public class DebugVisitor implements HeaderVisitor {
+
+
+
+	private PrintStream printStream;
+
+
+
+	public DebugVisitor() {
+
+		printStream = System.out;
+
+	}
+
+
+
+	public DebugVisitor(PrintStream ps) {
+
+		this.printStream = ps;
+
+	}
+
+
+
+	public void visitAttribute(String name, String value) {
+
+		printStream.println("visitAttribute(" + name + "=" + value + ")");
+
+	}
+
+
+
+	public void visitDirective(String name, String value) {
+
+		printStream.println("visitDirective(" + name + ":=" + value + ")");
+
+	}
+
+
+
+	public void visitSymbolicName(String symbolicName) {
+
+		printStream.println("visitSymbolicName(" + symbolicName + ")");
+
+	}
+
+
+
+	public void visitUniqueName(String uniqueName) {
+
+		printStream.println("visitUniqueName(" + uniqueName + ")");
+
+	}
+
+
+
+	public void visitWildcardName(String name) {
+
+		printStream.println("visitWildcardName(" + name + ")");
+
+	}
+
+
+
+	public void endvisit() {
+
+		printStream.println("endVisit()");
+
+	}
+
+
+
+	public void clauseEnded() {
+
+		printStream.println("clauseEnded()");
+
+	}
+
+
+
+	public List<HeaderDeclaration> getHeaderDeclarations() {
+
+		printStream.println("getHeaderDeclarations()");
+
+		return Collections.emptyList();
+
+	}
+
+
+
+	public HeaderDeclaration getFirstHeaderDeclaration() {
+
+		printStream.println("getFirstHeaderDeclaration()");
+
+		return null;
+
+	}
+
+	
+
+	public void initialize() {
+
+		
+
+	}
+
+}
+
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/HeaderProblem.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/HeaderProblem.java
new file mode 100755
index 0000000..b141d2e
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/HeaderProblem.java
@@ -0,0 +1,188 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.parse.standard;
+
+
+
+/**
+
+ * Encapsulates a single problem found during header parsing. The problem
+
+ * includes a kind {@link HeaderProblemKind}, together with the start and end
+
+ * offset for the problem in the data and some inserts that would be included in
+
+ * the formatted form of this message. The toString() methods like to have the
+
+ * context passed in so that they can produce nice results - the source context
+
+ * encapsulates the source data that was being processed together with useful
+
+ * information from that (eg. where the line breaks are - but that is less
+
+ * useful in this situation where all problems are on the same line).
+
+ * 
+
+ * <strong>Concurrent Semantics</strong><br />
+
+ * 
+
+ * Threadsafe.
+
+ * 
+
+
+ */
+
+public class HeaderProblem {
+
+
+
+	private HeaderProblemKind problemKind;
+
+	private int startoffset;
+
+	private int endoffset;
+
+	private String[] inserts;
+
+
+
+	public HeaderProblem(HeaderProblemKind problem, int startoffset, int endoffset, String... inserts) {
+
+		this.problemKind = problem;
+
+		this.startoffset = startoffset;
+
+		this.endoffset = endoffset;
+
+		this.inserts = inserts;
+
+	}
+
+
+
+	public String toString(SourceContext context) {
+
+		return problemKind.format(context.getLine(startoffset), context.getColumn(startoffset), inserts);
+
+	}
+
+
+
+	public String toStringWithContext(SourceContext context) {
+
+		int relevantLine = context.getLine(startoffset);
+
+		String relevantLineData = context.getLineAsString(relevantLine);
+
+		String theMessage = toString(context);
+
+		StringBuilder beautifulMessage = new StringBuilder();
+
+		beautifulMessage.append(relevantLineData).append('\n');
+
+		int scol = context.getColumn(startoffset);
+
+		int ecol = context.getColumn(endoffset);
+
+		int where = 0;
+
+		for (where = 0; where < scol; where++) {
+
+			beautifulMessage.append(' ');
+
+		}
+
+		beautifulMessage.append('^');
+
+		if (ecol != scol) {
+
+			where++;
+
+			for (; where < ecol; where++) {
+
+				beautifulMessage.append(' ');
+
+			}
+
+			beautifulMessage.append('^');
+
+		}
+
+		beautifulMessage.append('\n');
+
+		beautifulMessage.append(theMessage);
+
+		return beautifulMessage.toString();
+
+	}
+
+
+
+	@Override
+
+	public String toString() {
+
+		return this.problemKind.format(0, 0, inserts);
+
+	}
+
+
+
+	public HeaderProblemKind getKind() {
+
+		return this.problemKind;
+
+	}
+
+
+
+	public String[] getInserts() {
+
+		String[] insertCopy = new String[inserts.length];
+
+		System.arraycopy(inserts, 0, insertCopy, 0, inserts.length);
+
+		return insertCopy;
+
+	}
+
+
+
+	public int getStartOffset() {
+
+		return this.startoffset;
+
+	}
+
+
+
+	public int getEndOffset() {
+
+		return this.endoffset;
+
+	}
+
+
+
+	public boolean isSeverity(Severity severity) {
+
+		return this.problemKind.isSeverity(severity);
+
+	}
+
+
+
+}
+
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/HeaderProblemKind.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/HeaderProblemKind.java
new file mode 100755
index 0000000..3a7e171
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/HeaderProblemKind.java
@@ -0,0 +1,159 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.parse.standard;
+
+
+
+import java.text.MessageFormat;
+
+
+
+/**
+
+ * Enumerated type that captures all the errors that can occur during parsing.
+
+ * By using enumerated types it is easier to test for errors without creating a
+
+ * dependency on the actual text in the message. Messages can be formatted by
+
+ * specifying the necessary missing pieces: a position and optionally some
+
+ * inserts. Messages have a severity so that the programmer may choose to ignore
+
+ * info/warning problems if they wish. The funky '//' chars are there to stop
+
+ * the formatter messing the whole file up on save !
+
+ * 
+
+ * <strong>Concurrent Semantics</strong><br />
+
+ * 
+
+ * Threadsafe.
+
+ * 
+
+
+ */
+
+public enum HeaderProblemKind {
+
+
+
+	EXPECTED_TOKEN("HP001", "Expected a sequence of ([A-Z][a-z][_][-]*) but found ''{0}''", Severity.ERROR), //
+
+	EXPECTED_IDENTIFIER("HP002", "Expected an identifier but found ''{0}''", Severity.ERROR), //
+
+	UNEXPECTED_CHARACTER("HP003", "Unexpected character ''{0}'' ({1})", Severity.ERROR), //
+
+	NON_TERMINATING_QUOTED_STRING("HP004", "Quoted string did not terminate before end of data", Severity.ERROR), // 
+
+	UNEXPECTED_SPACE_WARNING("HP005", "Unexpected space found", Severity.WARNING), //
+
+	ILLEGAL_SPACE("HP006", "Space not allowed here", Severity.ERROR), //
+
+	EXPECTED_ATTRIBUTE_OR_DIRECTIVE("HP007", "Expected a simple attribute or directive name, but found ''{0}''", Severity.ERROR), //
+
+	UNEXPECTEDLY_OOD_AT_ARGUMENT_VALUE("HP008", "Unexpectedly ran out of data whilst processing an argument value", Severity.ERROR), //
+
+	UNEXPECTEDLY_OOD("HP009", "Unexpectedly ran out of data", Severity.ERROR), // 
+
+	INVALID_ARGUMENT_VALUE("HP010", "Invalid argument value ''{0}'' - must either be a quoted string or a simple sequence",
+
+			Severity.ERROR), //
+
+	UNCONSUMED_DATA("HP011", "Unconsumed data found at end of header ''{0}''", Severity.ERROR), //
+
+	EXTRANEOUS_DATA_AFTER_PARAMETER("HP012",
+
+			"Extraneous data found at end of the attribute/directive ''{0}'' - non simple values must be quoted", Severity.ERROR), //
+
+	EXPECTED_SEMICOLON("HP013", "Expected a semicolon but found ''{0}''", Severity.ERROR), //
+
+	EXPECTED_SEMICOLON_OR_COMMA("HP014", "Expected a semicolon or comma but found ''{0}''", Severity.ERROR), //
+
+	TOKEN_CANNOT_END_WITH_DOT("HP015", "Sequence cannot end with a dot", Severity.ERROR), //
+
+	ATTRIBUTES_NOT_ALLOWED_FOR_THIS_HEADER("HP016", "This header cannot specify attributes.  Attribute found was ''{0}''",
+
+			Severity.ERROR), //
+
+	EXPECTED_COMMA("HP017", "Expected a comma but found ''{0}''", Severity.ERROR), //
+
+	ILLEGAL_DOUBLE_SLASH("HP018", "A path cannot contain two slashes together", Severity.ERROR);
+
+
+
+	private Severity severity;
+
+	private String code;
+
+	private String message;
+
+
+
+	private HeaderProblemKind(String i, String string, Severity severity) {
+
+		this.code = i;
+
+		this.message = string;
+
+		this.severity = severity;
+
+	}
+
+
+
+	public boolean isSeverity(Severity severity) {
+
+		return this.severity == severity;
+
+	}
+
+
+
+	public String getCode() {
+
+		return code;
+
+	}
+
+
+
+	/**
+     * @param line unused 
+	 * @param scol column offset
+	 * @param inserts into format
+	 * @return formatted problem string 
+     */
+	public String format(int line, int scol, String... inserts) {
+
+		StringBuilder str = new StringBuilder();
+
+		str.append(code).append(severity.name().charAt(0)).append(":");
+
+		if (scol != 0) {
+
+			str.append(MessageFormat.format("[col {0}]: ", scol));
+
+		}
+
+		str.append(MessageFormat.format(message, (Object[]) inserts));
+
+		return str.toString();
+
+	}
+
+
+
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/HeaderToken.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/HeaderToken.java
new file mode 100755
index 0000000..cd6c192
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/HeaderToken.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.parse.standard;
+
+
+
+/**
+
+ * HeaderTokens are lexed from some input data.
+
+ * 
+
+ * <strong>Concurrent Semantics</strong><br />
+
+ * 
+
+ * Threadsafe.
+
+ */
+
+public interface HeaderToken {
+
+
+
+	public HeaderTokenKind getKind();
+
+
+
+	public int getStartOffset();
+
+
+
+	public int getEndOffset();
+
+
+
+	public char[] value();
+
+
+
+	public String stringValue();
+
+
+
+	public boolean isExtended();
+
+
+
+	public int getExtendedEndOffset();
+
+
+
+	public char[] extendedValue();
+
+
+
+	public boolean firstCharIsLetter();
+
+
+
+	public boolean isAttributeName();
+
+
+
+	public boolean isDirectiveName();
+
+
+
+	boolean isSpaced();
+
+
+
+	public boolean isAttributeOrDirectiveName();
+
+
+
+	public boolean hasFollowingSpace();
+
+
+
+	public char firstChar();
+
+
+
+}
+
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/HeaderTokenKind.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/HeaderTokenKind.java
new file mode 100755
index 0000000..1b267ee
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/HeaderTokenKind.java
@@ -0,0 +1,161 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.parse.standard;
+
+/**
+ * Enumeration of token kinds created by the lexer. Very confusing that the grammar defines a token called TOKEN.
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.
+ * 
+ */
+public enum HeaderTokenKind {
+    NUMBER("Number", true), //
+
+    ALPHAS("Alphas", true), //
+
+    ALPHANUMERIC("Alphanumeric", true), //
+
+    DOT("."), //
+
+    DOTSTAR(".*"), //
+
+    TOKEN("Token", true), //
+
+    QUOTEDSTRING("QuotedString"), //
+
+    IDENTIFIER("Identifier"), //
+
+    SEMICOLON(";"), //
+
+    COLONEQUALS(":="), //
+
+    COMMA(","), //
+
+    EQUALS("="), //
+
+    STAR("*"), //
+
+    SLASH("/"), //
+
+    PATHELEMENT("PathElement");
+
+    private String tokenString;
+
+    private boolean canBeTreatedAsToken; // Number/Alphas/Alphanumeric can all be treated as TOKEN
+
+
+    private HeaderTokenKind(String messageString, boolean canBeTreatedAsToken) {
+        this.tokenString = messageString;
+        this.canBeTreatedAsToken = canBeTreatedAsToken;
+    }
+
+    private HeaderTokenKind(String messageString) {
+        this(messageString, false);
+    }
+
+    public String getString() {
+        return tokenString;
+    }
+
+    public static boolean isNumber(HeaderToken token) {
+        return token.getKind() == NUMBER;
+    }
+
+    public static boolean isAlphas(HeaderToken token) {
+        return token.getKind() == ALPHAS;
+    }
+
+    public static boolean isAlphanumeric(HeaderToken token) {
+        return token.getKind() == ALPHANUMERIC;
+    }
+
+    public static boolean isToken(HeaderToken token) {
+        return token.getKind() == TOKEN;
+    }
+
+    public static boolean isEquals(HeaderToken token) {
+        return token.getKind() == EQUALS;
+    }
+
+    public static boolean isColonEquals(HeaderToken token) {
+        return token.getKind() == COLONEQUALS;
+    }
+
+    public static boolean isQuotedString(HeaderToken token) {
+        return token.getKind() == QUOTEDSTRING;
+    }
+
+    public static boolean isDot(HeaderToken token) {
+        return token.getKind() == DOT;
+    }
+
+    public static boolean isSemicolon(HeaderToken token) {
+        return token.getKind() == SEMICOLON;
+    }
+
+    public static boolean isSlash(HeaderToken token) {
+        return token.getKind() == SLASH;
+    }
+
+    public static boolean isComma(HeaderToken token) {
+        return token.getKind() == COMMA;
+    }
+
+    public static boolean isIdentifier(HeaderToken token) {
+        return token.getKind() == IDENTIFIER;
+    }
+
+    public static boolean canBeTreatedAsIdentifier(HeaderToken t) {
+        return t.getKind() == IDENTIFIER || t.getKind().canBeTreatedAsToken;
+        
+        //remove check for number-starting packages to align with Equinox's header parser behavior
+        // this can be enabled at a later point if required
+        //    && (t.firstCharIsLetter() || Character.isJavaIdentifierStart(t.firstChar()));
+    }
+
+    public static boolean canBeTreatedAsToken(HeaderToken token) {
+        return token.getKind().canBeTreatedAsToken;
+    }
+
+    public static boolean canBeTreatedAsExtendedToken(HeaderToken argumentToken) {
+        return canBeTreatedAsToken(argumentToken) || isDot(argumentToken);
+    }
+
+    public static boolean isSemicolonOrComma(HeaderToken t) {
+        HeaderTokenKind k = t.getKind();
+        return k == SEMICOLON || k == COMMA;
+    }
+
+    public static boolean isStar(HeaderToken token) {
+        return token.getKind() == STAR;
+    }
+
+    public static boolean isDotStar(HeaderToken token2) {
+        return token2.getKind() == DOTSTAR;
+    }
+
+    public static boolean canBeTreatedAsPathElement(HeaderToken t) {
+        if (t == null) {
+            return false;
+        }
+        HeaderTokenKind k = t.getKind();
+        boolean pathElement = (k == DOT || k == STAR || k == DOTSTAR || k == COLONEQUALS || k == PATHELEMENT || canBeTreatedAsIdentifier(t));
+        if (pathElement) {
+            return true;
+        } else {
+            // one last special check because of hyphens
+            return (k == TOKEN && t.firstChar() == '-');
+        }
+    }
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/HeaderTokenStream.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/HeaderTokenStream.java
new file mode 100755
index 0000000..bb2407b
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/HeaderTokenStream.java
@@ -0,0 +1,378 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.parse.standard;
+
+
+
+import java.util.ArrayList;
+
+import java.util.List;
+
+
+
+/**
+
+ * Represents a stream of {@link HeaderToken} instances as lexed from some input
+
+ * data by the lexer.
+
+ * 
+
+ * <strong>Concurrent Semantics</strong><br />
+
+ * 
+
+ * Threadsafe.
+
+ */
+
+
+
+public class HeaderTokenStream {
+
+
+
+	private List<HeaderToken> tokens = new ArrayList<HeaderToken>(20);
+
+	private int tokenStreamLen = -1;
+
+	private int tokenStreamPosition = 0;
+
+	private List<HeaderProblem> problems = new ArrayList<HeaderProblem>();
+
+	SourceContext sourceContext;
+
+
+
+	HeaderTokenStream(String header) {
+
+		tokens.clear();
+
+		tokenStreamPosition = 0;
+
+		sourceContext = new SourceContext(header);
+
+	}
+
+
+
+	@Override
+
+	public String toString() {
+
+		return toFormattedString(true);
+
+	}
+
+
+
+	public int getCount() {
+
+		return tokenStreamLen;
+
+	}
+
+
+
+	public int getPosition() {
+
+		return tokenStreamPosition;
+
+	}
+
+
+
+	public HeaderToken next() {
+
+		if (tokenStreamPosition >= tokenStreamLen) {
+
+			return null;
+
+		} else {
+
+			return tokens.get(tokenStreamPosition++);
+
+		}
+
+	}
+
+
+
+	public void setPosition(int newPosition) {
+
+		tokenStreamPosition = newPosition;
+
+	}
+
+
+
+	public HeaderToken peek() {
+
+		if (tokenStreamPosition >= tokenStreamLen) {
+
+			return null;
+
+		}
+
+		return tokens.get(tokenStreamPosition);
+
+	}
+
+
+
+	public HeaderToken peekLast() {
+
+		return tokens.get(tokenStreamLen - 1);
+
+	}
+
+
+
+	public HeaderToken peek(int offset) {
+
+		int pos = tokenStreamPosition + offset;
+
+		if (pos >= tokenStreamLen) {
+
+			return null;
+
+		} else if (pos < 0) {
+
+			return null;
+
+		}
+
+		return tokens.get(pos);
+
+	}
+
+
+
+	public String toFormattedString() {
+
+		return toFormattedString(false);
+
+	}
+
+
+
+	public String toFormattedString(boolean includePositionsInOutput) {
+
+		StringBuilder sb = new StringBuilder();
+
+		sb.append("TokenStream:#").append(tokens.size()).append(" tokens:");
+
+		sb.append("[");
+
+		int i = 0;
+
+		for (HeaderToken token : tokens) {
+
+			if (i > 0) {
+
+				sb.append(",");
+
+			}
+
+			if (i == tokenStreamPosition) {
+
+				sb.append("[[");
+
+			}
+
+			if (includePositionsInOutput) {
+
+				sb.append(token.toString());
+
+			} else {
+
+				sb.append(token.value());
+
+
+
+			}
+
+			if (i == tokenStreamPosition) {
+
+				sb.append("]]");
+
+			}
+
+			i++;
+
+		}
+
+		sb.append("]");
+
+		return sb.toString();
+
+	}
+
+
+
+	void addToken(HeaderToken token) {
+
+		tokens.add(token);
+
+	}
+
+
+
+	public SourceContext getSourceContext() {
+
+		return sourceContext;
+
+	}
+
+
+
+	public boolean hasMore() {
+
+		return tokenStreamPosition < tokenStreamLen;
+
+	}
+
+
+
+	public void skip() {
+
+		tokenStreamPosition++;
+
+	}
+
+
+
+	public void recordProblem(HeaderProblem problem) {
+
+		problems.add(problem);
+
+	}
+
+
+
+	public boolean containsProblems() {
+
+		return !problems.isEmpty();
+
+	}
+
+
+
+	public boolean containsProblems(Severity severity) {
+
+		if (problems.size() != 0) {
+
+			for (HeaderProblem problem : problems) {
+
+				if (problem.isSeverity(severity)) {
+
+					return true;
+
+				}
+
+			}
+
+		}
+
+		return false;
+
+	}
+
+
+
+	public List<HeaderProblem> getProblems() {
+
+		return problems;
+
+	}
+
+
+
+	public void reset() {
+
+		setPosition(0);
+
+	}
+
+
+
+	/**
+
+	 * Check if the next token is of a particular kind and return it if it is (consuming it in the process).
+
+	 * 
+
+	 * @param kind the kind of token wanted
+
+	 * @return the token (if it was the right kind) otherwise null
+
+	 */
+
+	public HeaderToken peekFor(HeaderTokenKind kind) {
+
+		if (tokenStreamPosition < tokenStreamLen) {
+
+			HeaderToken t = tokens.get(tokenStreamPosition);
+
+			if (t.getKind() == kind) {
+
+				tokenStreamPosition++;
+
+				return t;
+
+			}
+
+		}
+
+		return null;
+
+	}
+
+
+
+	// public HeaderToken peekForToken() {
+
+	// if (tokenStreamPosition < tokenStreamLen) {
+
+	// HeaderToken t = tokens.get(tokenStreamPosition);
+
+	// if (HeaderTokenKind.canBeTreatedAsToken(t)) {
+
+	// tokenStreamPosition++;
+
+	// return t;
+
+	// }
+
+	// }
+
+	// return null;
+
+	// }
+
+
+
+	/**
+
+	 * Called by the lexer to indicate that population of the tokenStream is now complete.
+
+	 */
+
+	public void lexComplete() {
+
+		tokenStreamLen = tokens.size();
+
+	}
+
+
+
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/HeaderVisitor.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/HeaderVisitor.java
new file mode 100755
index 0000000..c94ce70
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/HeaderVisitor.java
@@ -0,0 +1,174 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.parse.standard;
+
+
+
+import java.util.List;
+
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderDeclaration;
+
+
+
+
+
+
+/**
+
+ * HeaderDeclarations are constructed through a visitor pattern. As the parser
+
+ * processes data it calls methods on the visitor interface. The standard
+
+ * implementation is {@link StandardHeaderVisitor} but other visitors can be
+
+ * plugged in. For example, the {@link DebugVisitor} produces diagnostics about
+
+ * the visiting process. A validation visitor could be plugged in to verify
+
+ * package names or attribute names and values.
+
+ * 
+
+ * <strong>Concurrent Semantics</strong><br />
+
+ * 
+
+ * Threadsafe.
+
+ * 
+
+
+ */
+
+public interface HeaderVisitor {
+
+
+
+	/**
+
+	 * Visit a new directive (parsed from input of the form name:=value)
+	 * @param name 
+	 * @param value 
+
+	 */
+
+	void visitDirective(String name, String value);
+
+
+
+	/**
+
+	 * Visit a new attribute (parsed from input of the form name=value)
+	 * @param name 
+	 * @param value 
+
+	 */
+
+	void visitAttribute(String name, String value);
+
+
+
+	/**
+
+	 * @return a list of all HeaderDeclarations if this visitor has been collecting the information. Empty list if nothing has been
+
+	 *         collected
+
+	 */
+
+	List<HeaderDeclaration> getHeaderDeclarations();
+
+
+
+	/**
+
+	 * @return the first (and probably only) HeaderDeclaration, otherwise null
+
+	 */
+
+	HeaderDeclaration getFirstHeaderDeclaration();
+
+
+
+	/**
+
+	 * Called when a clause ends. Clauses are comma separated: header=clause (',' clause)*. It is a sign that a new clause is about
+
+	 * to start.
+
+	 */
+
+	void clauseEnded();
+
+
+
+	/**
+
+	 * Called to visit a symbolic name. These are of the form: "symbolic-name :: = token('.'token)*". So basically a sequence of dot
+
+	 * separated tokens.
+	 * @param name 
+
+	 */
+
+	void visitSymbolicName(String name);
+
+
+
+	/**
+
+	 * Called to visit a unique name. These are of the form: "unique-name :: = identifier('.'identifier)*". So basically a sequence
+
+	 * of dot separated identifiers..
+	 * @param name 
+
+	 */
+
+	void visitUniqueName(String name);
+
+
+
+	/**
+
+	 * Called to visit a wildcard name. These are similar to a unique name but wildcards are permitted. These are valid wildcarded
+
+	 * names: '*' or 'com.foo.*' or 'com.foo.goo'.
+	 * @param name 
+
+	 */
+
+	void visitWildcardName(String name);
+
+
+
+	/**
+
+	 * Called when the end of the input has been reached.
+
+	 */
+
+	void endvisit();
+
+
+
+	/**
+
+	 * Called ahead of parsing a new header
+
+	 */
+
+	void initialize();
+
+
+
+}
+
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/MultiplexingVisitor.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/MultiplexingVisitor.java
new file mode 100755
index 0000000..e5eaec1
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/MultiplexingVisitor.java
@@ -0,0 +1,177 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.parse.standard;
+
+
+
+import java.util.List;
+
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderDeclaration;
+
+
+
+
+
+
+/**
+
+ * A basic visitor that delegates to some array of other visitors. This visitor
+
+ * is used when multiple are plugged into the parser - to ensure the standard
+
+ * visitor still runs, in addition to the user specified visitors.
+
+ * 
+
+ * <strong>Concurrent Semantics</strong><br />
+
+ * 
+
+ * Threadsafe.
+
+ * 
+
+
+ */
+
+public class MultiplexingVisitor implements HeaderVisitor {
+
+
+
+	private static final HeaderVisitor[] NONE = new HeaderVisitor[] {};
+
+	private HeaderVisitor[] visitors = NONE;
+
+
+
+	public MultiplexingVisitor(HeaderVisitor... visitors) {
+
+		this.visitors = visitors;
+
+	}
+
+
+
+	public void endvisit() {
+
+		for (int i = 0; i < visitors.length; i++) {
+
+			visitors[i].endvisit();
+
+		}
+
+	}
+
+
+
+	public List<HeaderDeclaration> getHeaderDeclarations() {
+
+		return visitors[0].getHeaderDeclarations();
+
+	}
+
+
+
+	public void visitAttribute(String name, String value) {
+
+		for (int i = 0; i < visitors.length; i++) {
+
+			visitors[i].visitAttribute(name, value);
+
+		}
+
+	}
+
+
+
+	public void visitDirective(String name, String value) {
+
+		for (int i = 0; i < visitors.length; i++) {
+
+			visitors[i].visitDirective(name, value);
+
+		}
+
+	}
+
+
+
+	public void visitSymbolicName(String name) {
+
+		for (int i = 0; i < visitors.length; i++) {
+
+			visitors[i].visitSymbolicName(name);
+
+		}
+
+	}
+
+
+
+	public void visitWildcardName(String name) {
+
+		for (int i = 0; i < visitors.length; i++) {
+
+			visitors[i].visitWildcardName(name);
+
+		}
+
+	}
+
+
+
+	public void visitUniqueName(String name) {
+
+		for (int i = 0; i < visitors.length; i++) {
+
+			visitors[i].visitUniqueName(name);
+
+		}
+
+	}
+
+
+
+	public void clauseEnded() {
+
+		for (int i = 0; i < visitors.length; i++) {
+
+			visitors[i].clauseEnded();
+
+		}
+
+	}
+
+
+
+	public HeaderDeclaration getFirstHeaderDeclaration() {
+
+		return null;
+
+	}
+
+	
+
+	public void initialize() {
+
+		for (int i = 0; i < visitors.length; i++) {
+
+			visitors[i].initialize();
+
+		}
+
+	}
+
+
+
+}
+
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/Severity.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/Severity.java
new file mode 100755
index 0000000..1802a2b
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/Severity.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.parse.standard;
+
+
+
+/**
+
+ * Enumeration of parsing problem severities.
+
+ * 
+
+ * <strong>Concurrent Semantics</strong><br />
+
+ * 
+
+ * Threadsafe.
+
+ * 
+
+
+ */
+
+public enum Severity {
+
+	INFO, WARNING, ERROR;
+
+}
+
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/SourceContext.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/SourceContext.java
new file mode 100755
index 0000000..35af996
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/SourceContext.java
@@ -0,0 +1,206 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.parse.standard;
+
+
+
+import java.util.Arrays;
+
+import java.util.List;
+
+
+
+/**
+
+ * SourceContext captures information about the data being processed by the
+
+ * lexer and parser. This information can be used to provide more accurate
+
+ * informational or error messages. Internally it has a copy of the original
+
+ * source and where the linebreaks are within it.
+
+ * <p>
+
+ * The header parser actually doesn't benefit from this class knowing about
+
+ * linebreaks because all data is on one line. But for the general Manifest
+
+ * parser where data is split across multiple lines, it is very useful.
+
+ * 
+
+ * <strong>Concurrent Semantics</strong><br />
+
+ * 
+
+ * Threadsafe.
+
+ * 
+
+
+ */
+
+public class SourceContext {
+
+
+
+	private int[] linebreaks;
+
+	private String theSource;
+
+
+
+	public SourceContext(String theSource) {
+
+		this.theSource = theSource;
+
+		this.linebreaks = new int[] { 0, theSource.length() };
+
+	}
+
+
+
+	// Unused in this variant of Source
+
+	public void setLinebreaks(List<Integer> linebreaks) {
+
+		this.linebreaks = new int[linebreaks.size()];
+
+		for (int i = 0; i < linebreaks.size(); i++) {
+
+			this.linebreaks[i] = linebreaks.get(i);
+
+		}
+
+	}
+
+
+
+	// public SourceContext(char[] theSource, List<Integer> linebreaks) {
+
+	// this.theSource = theSource;
+
+	// this.linebreaks = new int[linebreaks.size()];
+
+	// for (int i = 0; i < linebreaks.size(); i++) {
+
+	// this.linebreaks[i] = linebreaks.get(i);
+
+	// }
+
+	// }
+
+	 
+
+
+
+	/**
+
+	 * @return the positions in the source data where the lines start.
+
+	 */
+
+	public int[] getLinebreaks() {
+
+		int[] linebreaksCopy = new int[linebreaks.length];
+
+		System.arraycopy(linebreaks, 0, linebreaksCopy, 0, linebreaks.length);
+
+		return linebreaksCopy;
+
+	}
+
+
+
+	public int getLine(int offset) {
+
+		return getRelevantStartLinebreakEntry(offset) + 1;
+
+	}
+
+
+
+
+
+
+
+	public int getColumn(int offset) {
+
+		int lb = getRelevantStartLinebreakEntry(offset);
+
+		return offset - linebreaks[lb];
+
+	}
+
+
+
+	// ---
+
+
+
+	private int getRelevantStartLinebreakEntry(int startoffset) {
+
+		int pos = Arrays.binarySearch(linebreaks, startoffset);
+
+		if (pos < 0) {
+
+			return -pos - 2;
+
+		} else {
+
+			return pos;
+
+		}
+
+	}
+
+
+
+	// private int getRelevantEndLinebreakEntry(int offset) {
+
+	// int pos = Arrays.binarySearch(linebreaks, offset);
+
+	// if (pos < 0) {
+
+	// return -pos - 2;
+
+	// } else {
+
+	// return pos;// - 1;
+
+	// }
+
+	// }
+
+
+
+	public String getLineAsString(int relevantLine) {
+
+		int startoffset = linebreaks[relevantLine - 1];
+
+		// int endoffset = theSource.length;
+
+		// if ((relevantLine + 1) < linebreaks.length) {
+
+		int endoffset = linebreaks[relevantLine];
+
+		// }
+
+		return theSource.substring(startoffset, endoffset - 1);
+
+	}
+
+
+
+}
+
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/StandardHeaderDeclaration.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/StandardHeaderDeclaration.java
new file mode 100755
index 0000000..98e6fa3
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/StandardHeaderDeclaration.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.parse.standard;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderDeclaration;
+
+
+final class StandardHeaderDeclaration implements HeaderDeclaration {
+
+    private final List<String> names;
+
+    private final Map<String, String> attributes;
+
+    private final Map<String, String> directives;
+
+    /**
+     * Creates a new <code>ImmutableHeaderDeclaration</code> that contains a copy of the supplied names, attributes, and
+     * directives.
+     * 
+     * @param names the names in the declaration.
+     * @param attributes the attributes in the declaration.
+     * @param directives the directives in the declaration.
+     */
+    StandardHeaderDeclaration(List<String> names, Map<String, String> attributes, Map<String, String> directives) {
+        if (names == null) {
+            throw new IllegalArgumentException("names must not be null");
+        }
+
+        this.names = new ArrayList<String>(names);
+
+        if (attributes == null) {
+            throw new IllegalArgumentException("attributes must not be null");
+        }
+
+        this.attributes = new HashMap<String, String>(attributes);
+
+        if (directives == null) {
+            throw new IllegalArgumentException("directives must not be null");
+        }
+
+        this.directives = new HashMap<String, String>(directives);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Map<String, String> getAttributes() {
+        return this.attributes;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Map<String, String> getDirectives() {
+        return this.directives;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public List<String> getNames() {
+        return this.names;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String toString() {
+        return super.toString() + " attributes: " + this.attributes + " directives: " + this.directives + " names: " + this.names;
+    }
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/StandardHeaderLexer.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/StandardHeaderLexer.java
new file mode 100755
index 0000000..db06fea
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/StandardHeaderLexer.java
@@ -0,0 +1,1033 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.parse.standard;
+
+/**
+ * 
+ * Lex an input string into a series of tokens. The possible tokens are defined
+ * 
+ * in {@link HeaderTokenKind}
+ * 
+ * 
+ * 
+ * Basic token descriptions:
+ * 
+ * <ul>
+ * 
+ * <li>digit ::= [0..9]
+ * 
+ * <li>alpha ::= [a..zA..Z]
+ * 
+ * <li>alphanum ::= alpha | digit
+ * 
+ * <li>token ::= ( alphanum | '_' | '-' | '.')+
+ * 
+ * <li>number ::= digit+
+ * 
+ * <li>jletter ::= <see [5] Lexical Structure Java Language for
+ * 
+ * JavaLetter>Character.isJavaIdentifierStart()
+ * 
+ * <li>jletterordigit::= <See [5] Lexical Structure Java Language for
+ * 
+ * JavaLetterOrDigit > Character.isJavaIdentifierPart()
+ * 
+ * <li>identifier ::= jletter jletterordigit *
+ * 
+ * <li>quoted-string ::= '"' ( [^"\#x0D#x0A#x00] | '\"'|'\\')* '"'
+ * 
+ * <li>DOT ::= .
+ * 
+ * <li>COLON_EQUALS ::= ':='
+ * 
+ * <li>EQUALS ::= '='
+ * 
+ * <li>DOTSTAR ::= .*
+ * 
+ * </ul>
+ * 
+ * 
+ * 
+ * header ::= clause ( ',' clause ) *
+ * 
+ * clause ::= path ( ';' path ) * ( ';' parameter ) *
+ * 
+ * 
+ * 
+ * path ::= path-unquoted | ('"' path-unquoted '"')
+ * 
+ * path-unquoted ::= path-sep | path-sep? path-element (path-sep path-element)*
+ * 
+ * path-element ::= [^/"\#x0D#x0A#x00]+
+ * 
+ * path-sep ::= '/'
+ * 
+ * 
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * 
+ * 
+ * Threadsafe.
+ * 
+ * 
+ */
+
+public class StandardHeaderLexer {
+
+    private HeaderTokenStream tokenStream;
+
+    private int tokenStart;
+
+    private boolean tokenStartedWithLetter;
+
+    char[] data; // visible directly to parser
+
+    private int state;
+
+    private int datapos; // where are we in the current data being lexed
+
+    private int datalen; // how long is the data
+
+    // Attribute/directive values in the header support an extended token - that is a token which also includes Dots.
+    // There is no
+
+    // notion of an 'extended' token, instead we produce the regular tokens: TOKEN,DOT,TOKEN,DOT,TOKEN but where it is
+
+    // a valid extension we give the first token in the list a special end offset indicating the end of the final token
+    // in the
+
+    // extension.
+
+    private BasicHeaderToken extensionStart = null;
+
+    private BasicHeaderToken lastEmittedToken = null;
+
+    private boolean foundSpace = false;
+
+    private boolean allowsPathToken = false; // general headers following OSGI 3.2.4 Common Header Syntax allow paths
+
+    public StandardHeaderLexer() {
+
+    }
+
+    public StandardHeaderLexer(boolean allowsPathToken) {
+
+        this.allowsPathToken = allowsPathToken;
+
+    }
+
+    public HeaderTokenStream getTokenStream() {
+
+        return tokenStream;
+
+    }
+
+    private void initializeLexer(String header) {
+
+        // Create a NUL (0) terminated character array - by setting such a terminal we don't have to keep checking the
+        // length as we
+
+        // move along the data
+
+        int stringlen = header.length();
+
+        data = new char[stringlen + 1];
+
+        header.getChars(0, stringlen, data, 0);
+
+        data[stringlen] = 0;
+
+        tokenStream = new HeaderTokenStream(header);
+
+        datapos = 0;
+
+        tokenStart = -1;
+
+        datalen = data.length;
+
+    }
+
+    /**
+     * 
+     * Start in the UNKNOWN state where anything may come next, as characters are encountered and consumed the state
+     * will transition
+     * 
+     * amongst other states. It is operating on a maximal munch approach where we eat as much data as we can before
+     * being forced
+     * 
+     * into a new state and onto a new token.
+     * 
+     * @param header string
+     */
+
+    public void process(String header) {
+
+        initializeLexer(header);
+
+        state = UNKNOWN;
+
+        while (datapos < datalen) {
+
+            char ch = data[datapos];
+
+            if (isDigit(ch)) {
+
+                processDigit();
+
+            } else if (isAlphabetic(ch)) {
+
+                processAlphabetic();
+
+            } else if (isUnderlineMinus(ch)) {
+
+                processUnderlineMinus();
+
+            } else if (ch == '"') {
+
+                processQuote();
+
+            } else if (ch == '/') {
+
+                processSlash();
+
+            } else if (ch == 0) {
+
+                processNul();
+
+            } else if (ch == ':') {
+
+                processColon();
+
+            } else if (ch == ';') {
+
+                emitToken(datapos);
+
+                emitToken2(HeaderTokenKind.SEMICOLON, datapos++);
+
+            } else if (ch == '=') {
+
+                emitToken(datapos);
+
+                lastEmittedToken.tagAsAttributeName();
+
+                emitToken2(HeaderTokenKind.EQUALS, datapos++);
+
+            } else if (ch == ',') {
+
+                emitToken(datapos);
+
+                emitToken2(HeaderTokenKind.COMMA, datapos++);
+
+            } else if (ch == '.') {
+
+                processDot();
+
+            } else if (ch == '*') {
+
+                processStar();
+
+            } else if (Character.isJavaIdentifierStart((int) ch)) {
+
+                processJavaIdentifierStart();
+
+            } else if (Character.isJavaIdentifierPart((int) ch)) {
+
+                processJavaIdentifierPart();
+
+            } else {
+
+                processUnexpected();
+
+            }
+
+        }
+
+        if (state != UNKNOWN) {
+
+            emitToken(datapos);
+
+        }
+
+        tokenStream.lexComplete();
+
+    }
+
+    private void processSpace() {
+
+        // ERROR: hit whitespace outside of a quoted string
+
+        // RECOVER: emit what we have, skip the space, log a message
+
+        if (state != UNKNOWN) {
+
+            emitToken(datapos);
+
+        }
+
+        if (lastEmittedToken != null) {
+
+            lastEmittedToken.tagAsFollowedBySpace();
+
+        }
+
+        char ch = data[datapos];
+
+        recordProblem(HeaderProblemKind.UNEXPECTED_SPACE_WARNING, datapos, datapos, Character.toString(ch), Integer.toString(ch));
+
+        foundSpace = true;
+
+        datapos++;
+
+    }
+
+    private void processDot() {
+
+        if (lastEmittedToken != null && lastEmittedToken.getKind() == HeaderTokenKind.SEMICOLON) {
+
+            if (state == UNKNOWN) {
+
+                processDotOrigin();
+
+            } else if (state == DIGITS || state == ALPHABETIC || state == ALPHANUMERIC || state == TOKEN) {
+
+                state = TOKEN;
+
+                do {
+
+                    // is ".*" ?
+
+                    if (data[datapos + 1] == '*' && data[datapos] == '.') {
+
+                        datapos++;
+
+                    }
+
+                    datapos++;
+
+                } while (isToken(data[datapos]));
+
+            } else {
+
+                assert state == QUOTEDSTRING;
+
+                emitToken(datapos);
+
+                state = UNKNOWN;
+
+            }
+        } else {
+
+            processDotOrigin();
+
+        }
+
+    }
+
+    private void processDotOrigin() {
+
+        emitToken(datapos); // emit what we have so far
+
+        boolean isDotStar = (data[datapos + 1] == '*');
+
+        if (isDotStar) {
+
+            emitDotStar(datapos);
+
+            datapos += 2;
+
+        } else {
+
+            emitToken(HeaderTokenKind.DOT, datapos);
+
+            datapos++;
+
+        }
+
+    }
+
+    private void processSlash() {
+
+        if (!allowsPathToken) {
+
+            char ch = data[datapos];
+
+            recordProblem(HeaderProblemKind.UNEXPECTED_CHARACTER, datapos, datapos, Character.toString(ch), Integer.toString(ch));
+
+            datapos++;
+
+        } else {
+
+            emitToken(datapos);
+
+            emitToken(HeaderTokenKind.SLASH, datapos);
+
+            datapos++;
+
+        }
+
+    }
+
+    private void processStar() {
+
+        emitToken(datapos); // emit what we have so far
+
+        emitToken(HeaderTokenKind.STAR, datapos);
+
+        datapos++;
+
+    }
+
+    private void processUnexpected() {
+
+        // TODO [later] perhaps cope with some typical cases here
+
+        // ERROR: encountered something unexpected
+
+        // RECOVERY: could special case in here, for now skip whitespace and record an issue with everything else
+
+        if (data[datapos] == ' ') {
+
+            processSpace();
+
+        } else {
+
+            // If the lexer allows for paths then we have to cope with all the wierd chars and build a pathelement for
+            // them
+
+            if (allowsPathToken) {
+
+                // path elements can be ANYTHING except: / " \ #x0D #x0A# x00
+
+                state = PATHELEMENT;
+
+                while (!pathEnd(data[datapos])) {
+
+                    datapos++;
+
+                }
+
+                emitToken(datapos);
+
+                char ch = data[datapos];
+
+                if (pathEnd(ch) && ch != 0) {
+
+                    recordProblem(HeaderProblemKind.UNEXPECTED_CHARACTER, datapos, datapos, Character.toString(ch), Integer.toString(ch));
+
+                    datapos++;
+
+                }
+
+            } else {
+
+                emitToken(datapos);
+
+                char ch = data[datapos];
+
+                recordProblem(HeaderProblemKind.UNEXPECTED_CHARACTER, datapos, datapos, Character.toString(ch), Integer.toString(ch));
+
+                datapos++;
+
+            }
+
+        }
+
+    }
+
+    private boolean pathEnd(char ch) {
+
+        return (ch == 0 || ch == '/' || ch == '\"' || ch == '\n' || ch == '\r' || ch == '\\' || ch == ' ');
+
+    }
+
+    private void processNul() {
+
+        if (tokenStart != -1) {
+
+            emitToken(datapos);
+
+            // If the stream has ended with an ExtendedToken
+
+            if (extensionStart != null && lastEmittedToken != extensionStart) {
+
+                extensionStart.setExtendedOffset(lastEmittedToken.getEndOffset());
+
+            }
+
+        }
+
+        datapos = datalen; // end of data reached
+
+    }
+
+    private void processDigit() {
+
+        if (state == UNKNOWN) {
+
+            // start new token, looks like it will be a number
+
+            state = DIGITS;
+
+            tokenStart = datapos++;
+
+            while (isDigit(data[datapos])) {
+
+                datapos++;
+
+            }
+
+        } else if (state == ALPHABETIC || state == ALPHANUMERIC) {
+
+            // Digit encountered here where everything previously was alphabetic or alphanumeric, upgrade what we
+            // currently
+
+            // think it is to ALPHANUMERIC
+
+            state = ALPHANUMERIC;
+
+            do {
+
+                datapos++;
+
+            } while (isAlphanumeric(data[datapos]));
+
+        } else {
+
+            // assert - cannot be in TOKEN or IDENTIFIER state because those states would have continued to consume this
+            // digit
+
+            assert state == QUOTEDSTRING;
+
+            emitToken(datapos);
+
+            state = UNKNOWN;
+
+        }
+
+    }
+
+    private void processAlphabetic() {
+
+        if (state == UNKNOWN) {
+
+            // start new token, assuming it will be an alphabetic string
+
+            tokenStart = datapos;
+
+            state = ALPHABETIC;
+
+            tokenStartedWithLetter = true;
+
+            while (isAlphabetic(data[++datapos])) {
+            }
+
+        } else if (state == DIGITS || state == ALPHANUMERIC) {
+
+            state = ALPHANUMERIC;
+
+            while (isAlphanumeric(data[++datapos])) {
+            }
+
+        } else {
+
+            assert state == QUOTEDSTRING;
+
+            emitToken(datapos);
+
+            state = UNKNOWN;
+
+        }
+
+    }
+
+    private void processUnderlineMinus() {
+
+        if (state == UNKNOWN || state == DIGITS || state == ALPHABETIC || state == ALPHANUMERIC) {
+
+            if (state == UNKNOWN) {
+
+                tokenStart = datapos;
+
+            }
+
+            state = TOKEN;
+
+            do {
+
+                datapos++;
+
+            } while (isToken(data[datapos]));
+
+        } else {
+
+            assert state == QUOTEDSTRING;
+
+            emitToken(datapos);
+
+            state = UNKNOWN;
+
+        }
+
+    }
+
+    private void processQuote() {
+
+        if (state != UNKNOWN) {
+
+            // Finish whatever was before and process this quoted string
+
+            emitToken(datapos);
+
+            state = UNKNOWN;
+
+        }
+
+        tokenStart = datapos;
+
+        state = QUOTEDSTRING;
+
+        boolean run = true;
+
+        boolean escape = false;// encountered a backslash
+
+        while (run) {
+
+            char ch = data[++datapos];
+
+            if (ch == '\\') {
+
+                escape = true;
+
+            } else {
+
+                if (!escape) {
+
+                    if (ch == '"') {
+
+                        run = false;
+
+                    }
+
+                    if (ch == '\r' || ch == '\n') {
+
+                        recordProblem(HeaderProblemKind.UNEXPECTED_CHARACTER, datapos, datapos, Character.toString(ch), Integer
+
+                        .toString(ch));
+
+                    }
+
+                }
+
+                if (ch == 0) {
+
+                    // hit end of the data before string terminated
+
+                    recordProblem(HeaderProblemKind.NON_TERMINATING_QUOTED_STRING, tokenStart, datapos);
+
+                    run = false;
+
+                }
+
+                escape = false;
+
+            }
+
+        }
+
+        datapos++;
+
+    }
+
+    private void processJavaIdentifierPart() {
+
+        if (state == ALPHABETIC || (state == ALPHANUMERIC && tokenStartedWithLetter)
+
+        || (state == TOKEN && (data[tokenStart] == '_' || isAlphabetic(data[tokenStart])))) {
+
+            state = IDENTIFIER;
+
+            char ch = 0;
+
+            do {
+
+                ch = data[++datapos];
+
+            } while (ch != 0 && Character.isJavaIdentifierPart(ch));
+
+        } else {
+
+            // ERROR: hit a JavaIdentifierPart in an unexpected State
+
+            // RECOVERY: emit anything we have been processing and skip over this character
+
+            // Unexpected states will be: UNKNOWN, DIGITS, ALPHANUMERIC (where first tokenchar is a number), TOKEN
+            // (where first
+
+            // token char is not a letter or underscore), IDENTIFIER (can't happen...), QUOTEDSTRING
+
+            if (state != UNKNOWN) {
+
+                emitToken(datapos);
+
+            }
+
+            char ch = data[datapos];
+
+            recordProblem(HeaderProblemKind.UNEXPECTED_CHARACTER, datapos, datapos, Character.toString(ch), Integer.toString(ch));
+
+            datapos++;
+
+        }
+
+    }
+
+    private void processColon() {
+
+        if (state != UNKNOWN) {
+
+            emitToken(datapos);
+
+        }
+
+        boolean isColonEquals = (data[datapos + 1] == '=');
+
+        if (isColonEquals) {
+
+            lastEmittedToken.tagAsDirectiveName();
+
+            emitColonEquals(datapos);
+
+            datapos += 2;
+
+        } else {
+
+            // ERROR: cannot have colon by itself
+
+            // RECOVERY: record a problem and skip over it
+
+            recordProblem(HeaderProblemKind.UNEXPECTED_CHARACTER, datapos, datapos, ":", Integer.toString(':'));
+
+            datapos++;
+
+        }
+
+    }
+
+    private void processJavaIdentifierStart() {
+
+        if (state == QUOTEDSTRING) {
+
+            emitToken(datapos);
+
+            state = UNKNOWN;
+
+        }
+
+        if (state == UNKNOWN) {
+
+            tokenStart = datapos;
+
+        }
+
+        state = IDENTIFIER;
+
+        char ch = 0;
+
+        do {
+
+            datapos++;
+
+            ch = data[datapos];
+
+        } while (ch != 0 && Character.isJavaIdentifierPart(ch));
+
+    }
+
+    private boolean isDigit(int ch) {
+
+        if (ch > 255) {
+
+            return false;
+
+        }
+
+        return (lookup[ch] & IS_DIGIT) != 0;
+
+    }
+
+    private boolean isAlphabetic(int ch) {
+
+        if (ch > 255) {
+
+            return false;
+
+        }
+
+        return (lookup[ch] & IS_ALPHA) != 0;
+
+    }
+
+    private boolean isAlphanumeric(int ch) {
+
+        if (ch > 255) {
+
+            return false;
+
+        }
+
+        return (lookup[ch] & IS_ALPHANUM) != 0;
+
+    }
+
+    private boolean isUnderlineMinus(int ch) {
+
+        if (ch > 255) {
+
+            return false;
+
+        }
+
+        return (lookup[ch] & IS_UNDERLINE_OR_MINUS) != 0;
+
+    }
+
+    private boolean isToken(int ch) {
+
+        if (ch > 255) {
+
+            return false;
+
+        }
+
+        if (state == TOKEN) {
+
+            if ((ch == '.' || ch == '*') && lastEmittedToken != null && lastEmittedToken.getKind() == HeaderTokenKind.SEMICOLON) {
+
+                if (extensionStart != null) {
+
+                    return true;
+
+                }
+
+            }
+
+        }
+
+        return (lookup[ch] & IS_TOKEN) != 0;
+
+    }
+
+    private final static int UNKNOWN = 0;
+
+    private final static int DIGITS = 1;
+
+    private final static int ALPHABETIC = 2;
+
+    private final static int ALPHANUMERIC = 3;
+
+    private final static int TOKEN = 4;
+
+    private final static int IDENTIFIER = 5;
+
+    private final static int QUOTEDSTRING = 6;
+
+    private final static int PATHELEMENT = 7;
+
+    private static final HeaderTokenKind[] stateToTokenMap = new HeaderTokenKind[] { null, HeaderTokenKind.NUMBER,
+
+    HeaderTokenKind.ALPHAS, HeaderTokenKind.ALPHANUMERIC, HeaderTokenKind.TOKEN, HeaderTokenKind.IDENTIFIER,
+
+    HeaderTokenKind.QUOTEDSTRING, HeaderTokenKind.PATHELEMENT };
+
+    private static final boolean[] tokenExtension = new boolean[] { false, true, true, true, true, false, false, true };
+
+    private void emitToken(HeaderTokenKind kind, int pos) {
+
+        pushExtensionToken(BasicHeaderToken.makeToken(data, kind, pos, pos + 1));
+
+    }
+
+    private void emitToken2(HeaderTokenKind kind, int pos) {
+
+        pushToken(BasicHeaderToken.makeToken(data, kind, pos, pos + 1));
+
+    }
+
+    private void emitDotStar(int pos) {
+
+        pushToken(BasicHeaderToken.makeToken(data, HeaderTokenKind.DOTSTAR, pos, pos + 2));
+
+    }
+
+    private void emitColonEquals(int pos) {
+
+        pushToken(BasicHeaderToken.makeToken(data, HeaderTokenKind.COLONEQUALS, pos, pos + 2));
+
+    }
+
+    private void emitToken(int tokenEnd) {
+
+        HeaderTokenKind kind = stateToTokenMap[state];
+
+        if (kind == null) {
+
+            return; // nothing to emit
+
+        } else {
+
+            if (kind == HeaderTokenKind.QUOTEDSTRING) {
+
+                tokenStart += 1;
+
+                tokenEnd -= 1;
+
+            }
+
+            BasicHeaderToken newToken = BasicHeaderToken.makeToken(data, kind, tokenStart, tokenEnd);
+
+            if (tokenStartedWithLetter) {
+
+                newToken.tagAsStartedWithLetter();
+
+            }
+
+            if (tokenExtension[state]) {
+
+                pushExtensionToken(newToken);
+
+            } else {
+
+                pushToken(newToken);
+
+            }
+
+        }
+
+        state = UNKNOWN;
+
+        tokenStartedWithLetter = false;
+
+        tokenStart = -1;
+
+    }
+
+    private void pushExtensionToken(BasicHeaderToken token) {
+
+        if (extensionStart == null) {
+
+            extensionStart = token; // set this as first element of an extended token
+
+        } else if (foundSpace) {
+
+            // this extension has a space in it... not good if someone wants to consume it as an extended token eg.
+
+            // "com. foo.bar"
+
+            extensionStart.tagAsSpaced();
+
+        }
+
+        foundSpace = false;
+
+        lastEmittedToken = token;
+
+        tokenStream.addToken(token);
+
+    }
+
+    private void pushToken(BasicHeaderToken token) {
+
+        if (extensionStart != null) {
+
+            if (lastEmittedToken != extensionStart) {
+
+                extensionStart.setExtendedOffset(lastEmittedToken.getEndOffset());
+
+            }
+
+            extensionStart = null;
+
+        }
+
+        foundSpace = false;
+
+        lastEmittedToken = token;
+
+        tokenStream.addToken(token);
+
+    }
+
+    // Fast lookup table for determining kind of character
+
+    private static final byte[] lookup;
+
+    private static final byte IS_DIGIT = 0x0001;
+
+    private static final byte IS_ALPHA = 0x0002;
+
+    private static final byte IS_UNDERLINE_OR_MINUS = 0x0004;
+
+    private static final byte IS_ALPHANUM = IS_DIGIT | IS_ALPHA;
+
+    private static final byte IS_TOKEN = IS_ALPHANUM | IS_UNDERLINE_OR_MINUS;
+
+    static {
+
+        lookup = new byte[256];
+
+        for (int ch = '0'; ch <= '9'; ch++) {
+
+            lookup[ch] |= IS_DIGIT;
+
+        }
+
+        for (int ch = 'a'; ch <= 'z'; ch++) {
+
+            lookup[ch] |= IS_ALPHA;
+
+        }
+
+        for (int ch = 'A'; ch <= 'Z'; ch++) {
+
+            lookup[ch] |= IS_ALPHA;
+
+        }
+
+        lookup['_'] |= IS_UNDERLINE_OR_MINUS;
+
+        lookup['-'] |= IS_UNDERLINE_OR_MINUS;
+
+    }
+
+    /**
+     * 
+     * Record a problem with lexing.
+     * 
+     * 
+     * 
+     * @param parseProblem the kind of problem that occurred
+     * 
+     * @param startOffset the start offset of the problem
+     * 
+     * @param endOffset the end offset of the problem
+     * 
+     * @param inserts the inserts for the problem message text
+     */
+
+    private void recordProblem(HeaderProblemKind parseProblem, int startOffset, int endOffset, String... inserts) {
+
+        tokenStream.recordProblem(new HeaderProblem(parseProblem, startOffset, endOffset, inserts));
+
+    }
+
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/StandardHeaderParser.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/StandardHeaderParser.java
new file mode 100755
index 0000000..9835f10
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/StandardHeaderParser.java
@@ -0,0 +1,1938 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.parse.standard;
+
+
+
+import java.util.List;
+
+import org.eclipse.virgo.util.osgi.manifest.parse.BundleManifestParseException;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderDeclaration;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderParser;
+import org.eclipse.virgo.util.osgi.manifest.parse.ParserLogger;
+
+
+
+
+
+
+
+
+
+/**
+
+ * Parses OSGI Standard Headers.
+
+ * 
+
+ * <strong>Concurrent Semantics</strong><br />
+
+ * 
+
+ * Threadsafe.
+
+ * 
+
+
+ */
+
+public class StandardHeaderParser implements HeaderParser {
+
+
+
+	private HeaderVisitor visitor; // a visitor that will be called to collect parsed information
+
+	private HeaderTokenStream tokenStream;
+
+	private StandardHeaderLexer lexer;
+
+	private final ParserLogger logger;
+
+
+
+	public StandardHeaderParser(ParserLogger logger) {
+
+		this.visitor = new StandardHeaderVisitor();
+
+		this.logger = logger;
+
+	}
+
+
+
+	public StandardHeaderParser(HeaderVisitor visitor, ParserLogger logger) {
+
+		this(logger);
+
+		// A multiplexing visitor will delegate to all visitors passed to it - first one is expected to be the one accumulating
+
+		// headers
+
+		this.visitor = new MultiplexingVisitor(this.visitor, visitor);
+
+	}
+
+
+
+	// HeaderParser interface implementation
+
+
+
+	public HeaderDeclaration parseBundleSymbolicName(String header) {
+
+		HeaderDeclaration declaration = internalParseBundleSymbolicName(header);
+
+		if (tokenStream.containsProblems(Severity.ERROR)) {
+
+			throw new BundleManifestParseException(createErrorMessage());
+
+		}
+
+		return declaration;
+
+	}
+
+
+
+	public List<HeaderDeclaration> parsePackageHeader(String header, String headerType) {
+
+		List<HeaderDeclaration> declarations = internalParsePackageHeader(header, headerType);
+
+		if (tokenStream.containsProblems(Severity.ERROR)) {
+
+			throw new BundleManifestParseException(createErrorMessage());
+
+		}
+
+		return declarations;
+
+	}
+
+
+
+	public HeaderDeclaration parseBundleActivationPolicy(String header) {
+
+		HeaderDeclaration declaration = internalParseBundleActivationPolicy(header);
+
+		if (tokenStream.containsProblems(Severity.ERROR)) {
+
+			throw new BundleManifestParseException(createErrorMessage());
+
+		}
+
+		return declaration;
+
+	}
+
+
+
+	public List<HeaderDeclaration> parseDynamicImportPackageHeader(String header) {
+
+		List<HeaderDeclaration> declarations = internalParseDynamicImportPackageHeader(header);
+
+		if (tokenStream.containsProblems(Severity.ERROR)) {
+
+			throw new BundleManifestParseException(createErrorMessage());
+
+		}
+
+		return declarations;
+
+	}
+
+
+
+	public HeaderDeclaration parseFragmentHostHeader(String header) {
+
+		HeaderDeclaration declaration = internalParseFragmentHostHeader(header);
+
+		if (tokenStream.containsProblems(Severity.ERROR)) {
+
+			throw new BundleManifestParseException(createErrorMessage());
+
+		}
+
+		return declaration;
+
+	}
+
+
+
+	public List<HeaderDeclaration> parseImportBundleHeader(String header) {
+
+		List<HeaderDeclaration> declarations = internalParseImportBundleHeader(header);
+
+		if (tokenStream.containsProblems(Severity.ERROR)) {
+
+			throw new BundleManifestParseException(createErrorMessage());
+
+		}
+
+		return declarations;
+
+	}
+
+
+
+	public List<HeaderDeclaration> parseImportLibraryHeader(String header) {
+
+		List<HeaderDeclaration> declarations = internalParseImportLibraryHeader(header);
+
+		if (tokenStream.containsProblems(Severity.ERROR)) {
+
+			throw new BundleManifestParseException(createErrorMessage());
+
+		}
+
+		return declarations;
+
+	}
+
+
+
+	public HeaderDeclaration parseLibrarySymbolicName(String header) {
+
+		HeaderDeclaration declaration = internalParseLibrarySymbolicName(header);
+
+		if (tokenStream.containsProblems(Severity.ERROR)) {
+
+			throw new BundleManifestParseException(createErrorMessage());
+
+		}
+
+		return declaration;
+
+	}
+
+
+
+	public List<HeaderDeclaration> parseRequireBundleHeader(String header) {
+
+		List<HeaderDeclaration> declarations = internalParseRequireBundleHeader(header);
+
+		if (tokenStream.containsProblems(Severity.ERROR)) {
+
+			throw new BundleManifestParseException(createErrorMessage());
+
+		}
+
+		return declarations;
+
+	}
+
+
+
+	public List<HeaderDeclaration> parseWebFilterMappingsHeader(String header) {
+
+		List<HeaderDeclaration> declarations = internalParseWebFilterMappingsHeader(header);
+
+		if (tokenStream.containsProblems(Severity.ERROR)) {
+
+			throw new BundleManifestParseException(createErrorMessage());
+
+		}
+
+		return declarations;
+
+	}
+
+
+
+	public List<HeaderDeclaration> parseHeader(String header) {
+
+		List<HeaderDeclaration> declarations = internalParseHeader(header);
+
+		if (tokenStream.containsProblems(Severity.ERROR)) {
+
+			throw new BundleManifestParseException(createErrorMessage());
+
+		}
+
+		return declarations;
+
+	}
+
+
+
+	// end of main HeaderParser interface implementation
+
+
+
+	/**
+
+	 * @return true if problems were found during parsing
+
+	 */
+
+	public boolean foundProblems() {
+
+		return tokenStream.containsProblems();
+
+	}
+
+
+
+	/**
+
+	 * @param severity of problems to look for
+	 * @return true if problems were found during parsing
+
+	 */
+
+	public boolean foundProblems(Severity severity) {
+
+		return tokenStream.containsProblems(severity);
+
+	}
+
+
+
+	/**
+
+	 * @return the list of problems that occurred during parsing
+
+	 */
+
+	public List<HeaderProblem> getProblems() {
+
+		return tokenStream.getProblems();
+
+	}
+
+
+
+	/**
+
+	 * @return the source context for the parsed manifest
+
+	 */
+
+	public SourceContext getSourceContext() {
+
+		return tokenStream.getSourceContext();
+
+	}
+
+
+
+	// internal parse methods - these are public for callers that want to parse without throwing an exception if an error occurs
+
+
+
+	private HeaderDeclaration internalParseBundleSymbolicName(String header) {
+
+		return parseOneBundleDescription(header);
+
+	}
+
+
+
+	private HeaderDeclaration internalParseLibrarySymbolicName(String header) {
+
+		return parseOneBundleDescription(header);
+
+	}
+
+
+
+	private HeaderDeclaration internalParseFragmentHostHeader(String header) {
+
+		return parseOneBundleDescription(header);
+
+	}
+
+
+
+	public List<HeaderDeclaration> internalParseRequireBundleHeader(String header) {
+
+		return parseMultipleBundleDescriptions(header);
+
+	}
+
+
+
+	public List<HeaderDeclaration> internalParseImportLibraryHeader(String header) {
+
+		return parseMultipleBundleDescriptions(header);
+
+	}
+
+
+
+	public List<HeaderDeclaration> internalParseWebFilterMappingsHeader(String header) {
+
+		return parseMultipleBundleDescriptions(header);
+
+	}
+
+
+
+	public List<HeaderDeclaration> internalParseImportBundleHeader(String header) {
+
+		return parseMultipleBundleDescriptions(header);
+
+	}
+
+
+
+	// Bundle-ActivationPolicy ::= policy ( ';' directive )*
+
+	// policy ::= 'lazy'
+
+	public HeaderDeclaration internalParseBundleActivationPolicy(String header) {
+
+		initializeTokenStream(header);
+
+		eatActivationPolicy();
+
+		checkNextIsSemiColon();
+
+		while (maybeEatSemicolon()) {
+
+			eatParameter(false);
+
+		}
+
+		visitor.clauseEnded();
+
+		confirmEnd();
+
+		return visitor.getHeaderDeclarations().get(0);
+
+	}
+
+
+
+	/**
+     * @param headerType  
+     */
+	List<HeaderDeclaration> internalParsePackageHeader(String header, String headerType) {
+
+		initializeTokenStream(header);
+
+		parsePackageHeader();
+
+		return visitor.getHeaderDeclarations();
+
+	}
+
+
+
+	/**
+
+	 * Attempt to consume multiple bundleDescriptions from the header.
+
+	 * 
+
+	 * @param header the data containing the bundleDescription. For example: "a.b.c.d;attr=5;dir:=hello,a.b.c.d;a.b.c.d.e;attr=3"
+
+	 * @return the parsed HeaderDeclaration
+
+	 */
+
+	// Format: "bundledescription (',' bundledescription)*"
+
+	private List<HeaderDeclaration> parseMultipleBundleDescriptions(String header) {
+
+		initializeTokenStream(header);
+
+		eatMultipleBundleDescriptions();
+
+		return visitor.getHeaderDeclarations();
+
+	}
+
+
+
+	/**
+
+	 * Attempt to consume just a single bundleDescription from the header. An error will be recorded if there is more data after the
+
+	 * first bundleDescription.
+
+	 * 
+
+	 * @param header the data containing the bundleDescription. For example: "a.b.c.d;attr=5;directive:=foo"
+
+	 * @return the parsed HeaderDeclaration
+
+	 */
+
+	private HeaderDeclaration parseOneBundleDescription(String header) {
+
+		initializeTokenStream(header);
+
+		eatSingleBundleDescription();
+
+		return visitor.getFirstHeaderDeclaration();
+
+	}
+
+
+
+	private void initializeTokenStream(String header) {
+
+		visitor.initialize();
+
+		lexer = new StandardHeaderLexer();
+
+		lexer.process(header);
+
+		tokenStream = lexer.getTokenStream();
+
+	}
+
+
+
+	/**
+
+	 * At the end of a name this will assert the next token in the tokenstream (if any) is a semicolon. If not then an error is
+
+	 * recorded and recovery attempted to the next semicolon.
+
+	 */
+
+	private void checkNextIsSemiColon() {
+
+		if (tokenStream.hasMore() && !HeaderTokenKind.isSemicolon(tokenStream.peek())) {
+
+			// ERROR: following a symbolic name should be a semi colon - that is the only option
+
+			// RECOVERY: skip to next semi colon
+
+			HeaderToken next = tokenStream.next();
+
+			recordProblem(HeaderProblemKind.EXPECTED_SEMICOLON, next.getStartOffset(), next.getEndOffset(), next.stringValue());
+
+			recoverToNextSemiColon();
+
+		}
+
+	}
+
+
+
+	// /**
+
+	// * At the end of a clause this will assert the next token in the tokenstream (if any) is a comma. If not then an error is
+
+	// * recorded and recovery attempted to the next comma.
+
+	// */
+
+	// private void checkNextIsComma() {
+
+	// if (tokenStream.hasMore() && !HeaderTokenKind.isComma(tokenStream.peek())) {
+
+	// // ERROR: following a clause should be a comma - that is the only option
+
+	// // RECOVERY: skip to next comma
+
+	// HeaderToken next = tokenStream.next();
+
+	// recordProblem(HeaderProblemKind.EXPECTED_COMMA, next.getStartOffset(), next.getEndOffset(), next.stringValue());
+
+	// recoverToTheNextComma();
+
+	// }
+
+	// }
+
+
+
+	private boolean eatActivationPolicy() {
+
+		// TODO [later] could check in that code that the name is 'lazy'
+
+		return eatUniqueName();
+
+	}
+
+
+
+	// bundleDescription::= symbolic-name (';' parameter)*
+
+	private void eatSingleBundleDescription() {
+
+		eatSymbolicName();
+
+		checkNextIsSemiColon();
+
+		while (maybeEatSemicolon()) {
+
+			eatParameter(true);
+
+		}
+
+		visitor.clauseEnded();
+
+		confirmEnd();
+
+	}
+
+
+
+	private void eatBundleDescription() {
+
+		eatSymbolicName();
+
+		while (maybeEatSemicolon()) {
+
+			eatParameter(true);
+
+		}
+
+		visitor.clauseEnded();
+
+	}
+
+
+
+	// Require-Bundle ::= bundle-description ( ',' bundle-description )*
+
+	// bundle-description ::= symbolic-name (';' parameter )*
+
+	private void eatMultipleBundleDescriptions() {
+
+		eatBundleDescription();
+
+		// checkNextIsComma();
+
+		while (maybeEatComma()) {
+
+			eatBundleDescription();
+
+		}
+
+		visitor.endvisit();
+
+		confirmEnd();
+
+	}
+
+
+
+	// PackageHeader::= pkgInfo ( ',' pkgInfo )*
+
+	// pkgInfo ::= package-names ( ';' parameter )*
+
+	// package-names ::= package-name ( ';' package-name )*
+
+	private boolean parsePackageHeader() {
+
+		boolean ok = eatPackageInfo();
+
+		visitor.clauseEnded();
+
+		while (maybeEatComma() && ok) {
+
+			ok = eatPackageInfo();
+
+			visitor.clauseEnded();
+
+		}
+
+		visitor.endvisit();
+
+		confirmEnd();
+
+		return ok;
+
+	}
+
+
+
+	// DynamicImport-Package ::= dynamic-description ( ',' dynamic-description )*
+
+	private void parseDynamicImportPackage() {
+
+		eatDynamicDescription();
+
+		visitor.clauseEnded();
+
+		while (maybeEatComma()) {
+
+			eatDynamicDescription();
+
+			visitor.clauseEnded();
+
+		}
+
+		visitor.endvisit();
+
+		confirmEnd();
+
+	}
+
+
+
+	// header ::= clause ( ',' clause ) *
+
+	private void parseHeader() {
+
+		eatClause();
+
+		visitor.clauseEnded();
+
+		while (maybeEatComma()) {
+
+			eatClause();
+
+			visitor.clauseEnded();
+
+		}
+
+		visitor.endvisit();
+
+		confirmEnd();
+
+	}
+
+
+
+	// DynamicImport-Package ::= dynamic-description ( ',' dynamic-description )*
+
+	// dynamic-description::= wildcard-names ( ';' parameter )*
+
+	// wildcard-names ::= wildcard-name ( ';' wildcard-name )*
+
+	// wildcard-name ::= package-name | ( package-name '.*' ) | '*'
+
+	private List<HeaderDeclaration> internalParseDynamicImportPackageHeader(String header) {
+
+		initializeTokenStream(header);
+
+		parseDynamicImportPackage();
+
+		return visitor.getHeaderDeclarations();
+
+	}
+
+	
+
+//	 *
+
+//	 * path ::= path-unquoted | ('"' path-unquoted '"')
+
+//	 * path-unquoted ::= path-sep | path-sep? path-element (path-sep path-element)*
+
+//	 * path-element ::= [^/"\#x0D#x0A#x00]+
+
+//	 * path-sep ::= '/'
+
+	// header ::= clause ( ',' clause ) *
+
+	// clause ::= path ( ';' path ) * ( ';' parameter ) *
+
+	private List<HeaderDeclaration> internalParseHeader(String header) {
+
+		visitor.initialize();
+
+		lexer = new StandardHeaderLexer(true);
+
+		lexer.process(header);
+
+		tokenStream = lexer.getTokenStream();
+
+		parseHeader();
+
+		return visitor.getHeaderDeclarations();
+
+	}
+
+		
+
+	
+
+
+
+	// pkgInfo ::= package-names ( ';' parameter )*
+
+	// package-names ::= package-name ( ';' package-name )*
+
+	private boolean eatPackageInfo() {
+
+		boolean ok = eatPackageNames();
+
+		while (maybeEatSemicolon()) {
+
+			ok = eatParameter(true);
+
+		}
+
+		return ok;
+
+	}
+
+
+
+	// dynamic-description::= wildcard-names ( ';' parameter )*
+
+	// wildcard-names ::= wildcard-name ( ';' wildcard-name )*
+
+	// wildcard-name ::= package-name | ( package-name '.*' ) | '*'
+
+	private void eatDynamicDescription() {
+
+		eatWildcardNames();
+
+		while (maybeEatSemicolon()) {
+
+			eatParameter(true);
+
+		}
+
+	}
+
+
+
+	// clause ::= path ( ';' path ) * ( ';' parameter ) *
+
+	private void eatClause() {
+
+		eatPaths();
+
+		while (maybeEatSemicolon()) {
+
+			eatParameter(true);
+
+		}
+
+	}
+
+	
+
+	private boolean peekSemiColon() {
+
+		HeaderToken t = tokenStream.peek();
+
+		return t != null && HeaderTokenKind.isSemicolon(t);
+
+	}
+
+
+
+	// private boolean peekComma() {
+
+	// HeaderToken t = tokenStream.peek();
+
+	// return t != null && HeaderTokenKind.isComma(t);
+
+	// }
+
+
+
+	private boolean peekNextIsAttributeOrDirective() {
+
+		HeaderToken tok = tokenStream.peek(1);
+
+		return tok != null && tok.isAttributeOrDirectiveName();
+
+	}
+
+
+
+	/**
+
+	 * Attempt to recover to the next semicolon.
+
+	 * 
+
+	 * @return true if recovery succeeded or false if we ran out of tokens
+
+	 */
+
+	private boolean recoverToNextSemiColon() {
+
+		while (!peekSemiColon() && tokenStream.hasMore()) {
+
+			tokenStream.next();
+
+		}
+
+		return tokenStream.hasMore(); // if it has more then we hit a semi
+
+	}
+
+
+
+	// /**
+
+	// * Attempt to recover to the next comma.
+
+	// *
+
+	// * @return true if recovery succeeded or false if we ran out of tokens
+
+	// */
+
+	// private boolean recoverToTheNextComma() {
+
+	// while (!peekComma() && tokenStream.hasMore()) {
+
+	// tokenStream.next();
+
+	// }
+
+	// return tokenStream.hasMore(); // if it has more then we hit a semi
+
+	// }
+
+
+
+	// wildcard-names ::= wildcard-name ( ';' wildcard-name )*
+
+	private void eatWildcardNames() {
+
+		boolean ok = eatWildcardName();
+
+
+
+		if (tokenStream.hasMore() && !HeaderTokenKind.isSemicolonOrComma(tokenStream.peek())) {
+
+			// ERROR: next token must be a semicolon (end of this name) or a comma (end of this clause)
+
+			// RECOVERY: record a problem and skip
+
+			HeaderToken next = tokenStream.next();
+
+			recordProblem(HeaderProblemKind.EXPECTED_SEMICOLON_OR_COMMA, next.getStartOffset(), next.getEndOffset(), next
+
+					.stringValue());
+
+			recoverToNextSemiColonOrComma();
+
+			if (tokenStream.hasMore() && !HeaderTokenKind.isSemicolon(tokenStream.peek())) {
+
+				return;
+
+			}
+
+		}
+
+
+
+		do {
+
+			if (peekSemiColon() && peekNextIsAttributeOrDirective()) {
+
+				// Finished eating package names - now hit a directive or attribute
+
+				return;
+
+			}
+
+			if (maybeEatSemicolon()) {
+
+				ok = eatWildcardName();
+
+			} else {
+
+				break;
+
+			}
+
+		} while (ok);
+
+	}
+
+	
+
+	// paths ::= path ( ';' path ) *
+
+	// path ::= path-unquoted | ('"' path-unquoted '"')
+
+	// path-unquoted ::= path-sep | path-sep? path-element (path-sep path-element)*
+
+	// path-element ::= [^/"\#x0D#x0A#x00]+
+
+	// path-sep ::= '/'
+
+	private void eatPaths() {
+
+		boolean ok = eatPath();
+
+
+
+		if (tokenStream.hasMore() && !HeaderTokenKind.isSemicolonOrComma(tokenStream.peek())) {
+
+			// ERROR: next token must be a semicolon (end of this name) or a comma (end of this clause)
+
+			// RECOVERY: record a problem and skip
+
+			HeaderToken next = tokenStream.next();
+
+			recordProblem(HeaderProblemKind.EXPECTED_SEMICOLON_OR_COMMA, next.getStartOffset(), next.getEndOffset(), next
+
+					.stringValue());
+
+			recoverToNextSemiColonOrComma();
+
+			if (tokenStream.hasMore() && !HeaderTokenKind.isSemicolon(tokenStream.peek())) {
+
+				return;
+
+			}
+
+		}
+
+
+
+		do {
+
+			if (peekSemiColon() && peekNextIsAttributeOrDirective()) {
+
+				// Finished eating path - now hit a directive or attribute
+
+				return;
+
+			}
+
+			if (maybeEatSemicolon()) {
+
+				ok = eatPath();
+
+			} else {
+
+				break;
+
+			}
+
+		} while (ok);
+
+	}
+
+	 
+
+	 private boolean eatPath() {
+
+		HeaderToken startToken = tokenStream.peek();
+
+		if (startToken == null) {
+
+			// ERROR: run out of tokens
+
+			HeaderToken previousToken = tokenStream.peek(-1);
+
+			recordProblem(HeaderProblemKind.UNEXPECTEDLY_OOD, (previousToken==null?0:previousToken.getEndOffset()), 
+
+					previousToken==null?0:previousToken.getEndOffset());
+
+			return false;
+
+		}
+
+		HeaderToken endToken = startToken;
+
+		if (HeaderTokenKind.isQuotedString(startToken)) {
+
+			// done
+
+			tokenStream.next();
+
+		} else if (HeaderTokenKind.isSlash(startToken)) {
+
+			// done
+
+			tokenStream.next();
+
+		} else {
+
+			tokenStream.next();
+
+			// skip on to the next non path element (should be a , / ;)
+
+			while (HeaderTokenKind.canBeTreatedAsPathElement(tokenStream.peek())) {
+
+				if (endToken.hasFollowingSpace()) { // ERROR: unquoted space
+
+					recordIllegalSpaceProblem(startToken, endToken);
+
+				}
+
+				endToken = tokenStream.next();
+
+			}
+
+			HeaderToken slashToken = maybeEatSlash();
+
+			while (slashToken != null) {
+
+				if (endToken.hasFollowingSpace()) { // ERROR: unquoted space
+
+					recordIllegalSpaceProblem(startToken, slashToken);
+
+				}
+
+				endToken = slashToken;
+
+				while (HeaderTokenKind.canBeTreatedAsPathElement(tokenStream.peek())) {
+
+					if (endToken.hasFollowingSpace()) { // ERROR: unquoted space
+
+						recordIllegalSpaceProblem(startToken, endToken);
+
+					}
+
+					endToken = tokenStream.next();
+
+				}
+
+				if (slashToken.hasFollowingSpace()) { // ERROR: the dot has a space after it
+
+					recordIllegalSpaceProblem(startToken, endToken);
+
+				}
+
+				slashToken = maybeEatSlash();
+
+				if (slashToken!=null && HeaderTokenKind.isSlash(endToken)) { // ERROR: two slashes in a row
+
+					recordDoubleSlashProblem(endToken,slashToken);
+
+				}
+
+			}
+
+		}
+
+		visitor.visitUniqueName(subarray(lexer.data, startToken.getStartOffset(), endToken.getEndOffset()));
+
+		return true;
+
+	}
+
+
+
+
+
+	// package-names ::= package-name ( ';' package-name )*
+
+	private boolean eatPackageNames() {
+
+		boolean ok = eatPackageName();
+
+
+
+		if (tokenStream.hasMore() && !HeaderTokenKind.isSemicolonOrComma(tokenStream.peek())) {
+
+			// ERROR: following a symbolic name should be a semi colon - that is the only option
+
+			HeaderToken next = tokenStream.next();
+
+			recordProblem(HeaderProblemKind.EXPECTED_SEMICOLON_OR_COMMA, next.getStartOffset(), next.getEndOffset(), next
+
+					.stringValue());
+
+			recoverToNextSemiColonOrComma();
+
+			if (tokenStream.hasMore() && !HeaderTokenKind.isSemicolon(tokenStream.peek())) {
+
+				return ok;
+
+			}
+
+		}
+
+
+
+		do {
+
+			if (peekSemiColon() && peekNextIsAttributeOrDirective()) {
+
+				// Finished eating package names - now hit a directive or attribute
+
+				break;
+
+			}
+
+			if (maybeEatSemicolon()) {
+
+				ok = eatPackageName();
+
+			} else {
+
+				break;
+
+			}
+
+		} while (ok);
+
+		return ok;
+
+	}
+
+
+
+	// package-name ::= unique-name
+
+	private boolean eatPackageName() {
+
+		return eatUniqueName();
+
+	}
+
+
+
+	// wildcard-name ::= package-name | ( package-name '.*' ) | '*'
+
+	private boolean eatWildcardName() {
+
+		return eatWildcardedUniqueName();
+
+	}
+
+
+
+	private final static String STAR = "*";
+
+
+
+	/**
+
+	 * Like processing a unique-name, but it may either be followed by a DOTSTAR or replaced entirely by a STAR
+
+	 */
+
+	private boolean eatWildcardedUniqueName() {
+
+		HeaderToken start = maybeEatStar();
+
+		if (start != null) { // wildcard '*'
+
+			visitor.visitWildcardName(STAR);
+
+			return true;
+
+		}
+
+		start = eatIdentifier();
+
+		if (start == null) {
+
+			// ERROR: cannot even start processing, error already reported
+
+			return false;
+
+		}
+
+		HeaderToken end = start;
+
+		HeaderToken dot = maybeEatDot();
+
+		while (dot != null) {
+
+			if (end.hasFollowingSpace()) { // ERROR: between the first token and the dot was a space
+
+				recordIllegalSpaceProblem(start, dot);
+
+			}
+
+			end = eatIdentifier();
+
+			if (end == null) {
+
+				return false;
+
+			}
+
+			if (dot.hasFollowingSpace()) { // ERROR: the dot has a space after it
+
+				recordIllegalSpaceProblem(start, end);
+
+			}
+
+			dot = maybeEatDot();
+
+		}
+
+		HeaderToken dotStarEnding = maybeEatDotStar();
+
+		if (dotStarEnding != null) {
+
+			if (end.hasFollowingSpace()) {// ERROR: there was a space after the final token and the dotstar
+
+				recordIllegalSpaceProblem(start, dotStarEnding);
+
+			}
+
+			visitor.visitWildcardName(subarray(lexer.data, start.getStartOffset(), dotStarEnding.getEndOffset()));
+
+		} else {
+
+			visitor.visitWildcardName(subarray(lexer.data, start.getStartOffset(), end.getEndOffset()));
+
+		}
+
+		return true;
+
+	}
+
+
+
+	// unique-name ::= identifier ( '.' identifier )*
+
+	private boolean eatUniqueName() {
+
+		HeaderToken startToken = eatIdentifier();
+
+		if (startToken == null) { // already reported
+
+			return false;
+
+		}
+
+		HeaderToken endToken = startToken;
+
+		HeaderToken dotToken = maybeEatDot();
+
+		while (dotToken != null) {
+
+			if (endToken.hasFollowingSpace()) { // ERROR: space before the dot
+
+				recordIllegalSpaceProblem(startToken, dotToken);
+
+			}
+
+			endToken = eatIdentifier();
+
+			if (endToken == null) {
+
+				return false;
+
+			}
+
+			if (dotToken.hasFollowingSpace()) { // ERROR: the dot has a space after it
+
+				recordIllegalSpaceProblem(startToken, endToken);
+
+			}
+
+			dotToken = maybeEatDot();
+
+		}
+
+		visitor.visitUniqueName(subarray(lexer.data, startToken.getStartOffset(), endToken.getEndOffset()));
+
+		return true;
+
+	}
+
+
+
+	/**
+
+	 * Eat a symbolic-name - defined as "symbolic-name :: = token('.'token)*". If possible it will continue in the presence of
+
+	 * errors.
+
+	 * 
+
+	 * (R)eviewed
+
+	 */
+
+	private void eatSymbolicName() {
+
+		HeaderToken startToken = eatToken(); // eatToken() will report any problem if a token is not found
+
+		if (startToken == null) {
+
+			return;
+
+		}
+
+		HeaderToken endToken = startToken;
+
+		HeaderToken dotToken = maybeEatDot();
+
+		while (dotToken != null) {
+
+			if (endToken.hasFollowingSpace()) { // ERROR: between the first token and the dot was a space
+
+				recordIllegalSpaceProblem(startToken, dotToken);
+
+			}
+
+			endToken = eatToken();
+
+			if (endToken == null) {
+
+				recordProblem(HeaderProblemKind.TOKEN_CANNOT_END_WITH_DOT, dotToken.getStartOffset(), dotToken.getEndOffset());
+
+				endToken = dotToken;
+
+				break;
+
+			}
+
+			if (dotToken.hasFollowingSpace()) { // ERROR: the dot has a space after it
+
+				recordIllegalSpaceProblem(startToken, endToken);
+
+			}
+
+			dotToken = maybeEatDot();
+
+		}
+
+		visitor.visitSymbolicName(subarray(lexer.data, startToken.getStartOffset(), endToken.getEndOffset()));
+
+		return;
+
+	}
+
+
+
+	/**
+
+	 * @return a new array chopped out of the supplied character array
+
+	 */
+
+	private static final String subarray(char[] array, int start, int end) {
+
+		return new String(array,start,end-start);
+
+//		char[] result = new char[end - start];
+
+//		System.arraycopy(array, start, result, 0, end - start);
+
+//		return new String(result);
+
+	}
+
+
+
+	/**
+
+	 * @return a substring representing the characters from a chunk of the supplied character array
+
+	 */
+
+	private static final String substring(char[] data, int start, int end) {
+
+		return new String(data, start, end - start);
+
+	}
+
+
+
+	private void confirmEnd() {
+
+		if (tokenStream.hasMore()) {
+
+			HeaderToken current = tokenStream.next();
+
+			tokenStream.setPosition(tokenStream.getCount() - 1);
+
+			HeaderToken last = tokenStream.peek();
+
+			String insert = substring(lexer.data, current.getStartOffset(), last.getEndOffset());
+
+			recordProblem(HeaderProblemKind.UNCONSUMED_DATA, current.getStartOffset(), last.getEndOffset(), insert);
+
+		}
+
+	}
+
+
+
+	/**
+
+	 * Record a problem with parsing.
+
+	 * 
+
+	 * @param parseProblem the kind of problem that occurred
+
+	 * @param startOffset the start offset of the problem
+
+	 * @param endOffset the end offset of the problem
+
+	 * @param inserts the inserts for the problem message text
+
+	 */
+
+	private void recordProblem(HeaderProblemKind parseProblem, int startOffset, int endOffset, String... inserts) {
+
+		tokenStream.recordProblem(new HeaderProblem(parseProblem, startOffset, endOffset, inserts));
+
+	}
+
+
+
+	/**
+
+	 * Record a problem for a mismatch. The token of an expected kind was not found next in the stream - either the wrong token was
+
+	 * found or the end of the stream was found. Depending on the situation this will record either an 'out of data' error or a
+
+	 * 'expected token X' error.
+
+	 * 
+
+	 * @param token the token that was found
+
+	 * @param kind the kind of error to report if the problem was not that the end of the stream was reached
+
+	 */
+
+	private void recordMismatch(HeaderToken token, HeaderProblemKind kind) {
+
+		if (token == null) {
+
+			if (tokenStream.getCount() == 0) {
+
+				// ERROR: no data
+
+				recordProblem(HeaderProblemKind.UNEXPECTEDLY_OOD, 0, 0);
+
+			} else {
+
+				HeaderToken previous = tokenStream.peek(-1);
+
+				recordProblem(HeaderProblemKind.UNEXPECTEDLY_OOD, previous.getEndOffset(), previous.getEndOffset());
+
+			}
+
+		} else {
+
+			recordProblem(kind, token.getStartOffset(), token.getEndOffset(), token.stringValue());
+
+		}
+
+	}
+
+
+
+	private void recoverToNextSemiColonOrComma() {
+
+		HeaderToken tok = tokenStream.peek();
+
+		while (!(tok == null || HeaderTokenKind.isComma(tok) || HeaderTokenKind.isSemicolon(tok))) {
+
+			tokenStream.next();
+
+			tok = tokenStream.peek();
+
+		}
+
+	}
+
+
+
+	// parameter ::= directive | attribute
+
+	private boolean eatParameter(boolean attributesAllowed) {
+
+		// Either of those must start with a token
+
+		HeaderToken parameterName = eatToken();
+
+		if (parameterName == null) {
+
+			// error already reported
+
+			return false;
+
+		}
+
+		if (!parameterName.isAttributeOrDirectiveName()) {
+
+			// ERROR: this is not of the form "a:=" or "a=" - it is likely to either be "com.foo.goo;" - as in a rogue extra
+
+			// bundle name, or a "a.b.c:=" - a rogue dotted name for an attribute/directive
+
+			// RECOVERY: check which situation - record a problem, then skip to the recovery token
+
+			int pStart = parameterName.getStartOffset();
+
+			char[] insert = parameterName.value();
+
+			int pEnd = parameterName.getEndOffset();
+
+			if (parameterName.isExtended()) {
+
+				pEnd = parameterName.getExtendedEndOffset();
+
+				insert = parameterName.extendedValue();
+
+			}
+
+			recordProblem(HeaderProblemKind.EXPECTED_ATTRIBUTE_OR_DIRECTIVE, pStart, pEnd, new String(insert));
+
+			recoverToNextSemiColonOrComma();
+
+			return false;
+
+		} else {
+
+			// Handle everything other than parameter 'version'
+
+			HeaderToken selector = tokenStream.next();
+
+			assert HeaderTokenKind.isColonEquals(selector) || HeaderTokenKind.isEquals(selector);
+
+			HeaderToken argument = eatArgument();
+
+			if (argument == null) {
+
+				return false;
+
+			}
+
+			String argumentValue = null;
+
+			if (argument.isExtended()) {
+
+				argumentValue = new String(argument.extendedValue());
+
+			} else {
+
+				argumentValue = new String(argument.value());
+
+			}
+
+			if (parameterName.isAttributeName()) {
+
+				if (!attributesAllowed) {
+
+					recordProblem(HeaderProblemKind.ATTRIBUTES_NOT_ALLOWED_FOR_THIS_HEADER, parameterName.getStartOffset(),
+
+							parameterName.getEndOffset(), substring(lexer.data, parameterName.getStartOffset(), parameterName
+
+									.getEndOffset()));
+
+					return false;
+
+				}
+
+				visitor.visitAttribute(new String(parameterName.value()), argumentValue);
+
+			} else {
+
+				visitor.visitDirective(new String(parameterName.value()), argumentValue);
+
+			}
+
+		}
+
+		// Either should have run out of tokens or the next one is a semicolon or comma
+
+		HeaderToken next = tokenStream.peek();
+
+		if (next != null) {
+
+			if (!(HeaderTokenKind.isSemicolon(next) || HeaderTokenKind.isComma(next))) {
+
+				recordProblem(HeaderProblemKind.EXTRANEOUS_DATA_AFTER_PARAMETER, next.getStartOffset(), next.getEndOffset(), next
+
+						.stringValue());
+
+				recoverToNextSemiColonOrComma();
+
+			}
+
+		}
+
+		return true;
+
+	}
+
+
+
+	// TODO [later] decide whether to include positions in the visit method so exception throwing visitors can include the right
+
+	// context?
+
+
+
+	// argument ::= extended | quoted-string
+
+	private HeaderToken eatArgument() {
+
+		HeaderToken argumentToken = tokenStream.peek();
+
+		if (argumentToken == null) {
+
+			// ERROR: run out of tokens
+
+			HeaderToken lastToken = tokenStream.peek(-1);
+
+			int lastCharacterOfThatToken = lastToken.getEndOffset()-1;
+
+			recordProblem(HeaderProblemKind.UNEXPECTEDLY_OOD_AT_ARGUMENT_VALUE, lastCharacterOfThatToken, lastCharacterOfThatToken);
+
+			return null;
+
+		}
+
+		if (HeaderTokenKind.isQuotedString(argumentToken)) {
+
+			tokenStream.next();
+
+			return argumentToken;
+
+		} else if (HeaderTokenKind.canBeTreatedAsExtendedToken(argumentToken)) {
+
+			// Skip to the end of any extended token
+
+			if (argumentToken.isExtended()) {
+
+				HeaderToken next = tokenStream.next();
+
+				// TODO [later] optimize jump to end of token (maybe token count within the stream)
+
+				while (next.getEndOffset() != argumentToken.getExtendedEndOffset()) {
+
+					next = tokenStream.next();
+
+				}
+
+			} else {
+
+				tokenStream.next();
+
+			}
+
+			return argumentToken;
+
+		} else {
+
+			// ERROR: the token found as the argument value is not a valid token or a quoted string (it probably should be the
+
+			// latter)
+
+			// RECOVERY: report the problem
+
+			recordProblem(HeaderProblemKind.INVALID_ARGUMENT_VALUE, argumentToken.getStartOffset(), argumentToken.getEndOffset(),
+
+					argumentToken.stringValue());
+
+			recoverToNextSemiColonOrComma();
+
+			return null;
+
+		}
+
+	}
+
+
+
+	private HeaderToken eatToken() {
+
+		HeaderToken tok = tokenStream.peek();
+
+		if (tok != null && HeaderTokenKind.canBeTreatedAsToken(tok)) {
+
+			tokenStream.skip();
+
+			return tok;
+
+		} else {
+
+			recordMismatch(tok, HeaderProblemKind.EXPECTED_TOKEN);
+
+			recoverToNextSemiColonOrComma();
+
+			return null;
+
+		}
+
+	}
+
+
+
+	private HeaderToken eatIdentifier() {
+
+		HeaderToken hToken = tokenStream.peek();
+
+		if (hToken != null && HeaderTokenKind.canBeTreatedAsIdentifier(hToken)) {
+
+			tokenStream.skip();
+
+			return hToken;
+
+		} else {
+
+			recordMismatch(hToken, HeaderProblemKind.EXPECTED_IDENTIFIER);
+
+			recoverToNextSemiColonOrComma();
+
+			return null;
+
+		}
+
+	}
+
+
+
+	// The maybeEatXXX() methods attempt to eat XXX from the tokenStream. If there are no more tokens or the next token is not of
+
+	// type XXX then they will not succeed in eating it. Some variants return the token (or null) depending on whether it can be
+
+	// eaten, some return boolean indicating whether eating was successful - the boolean variants are for callers that do not want
+
+	// the token value.
+
+
+
+	// private HeaderToken maybeEatToken() {
+
+	// return tokenStream.peekForToken();
+
+	// }
+
+	//
+
+	// private HeaderToken maybeEatQuotedString() {
+
+	// return tokenStream.peekFor(HeaderTokenKind.QUOTEDSTRING);
+
+	// }
+
+	//
+
+	// private HeaderToken maybeEatNumber() {
+
+	// return tokenStream.peekFor(HeaderTokenKind.NUMBER);
+
+	// }
+
+
+
+	private HeaderToken maybeEatDot() {
+
+		return tokenStream.peekFor(HeaderTokenKind.DOT);
+
+	}
+
+
+
+	private HeaderToken maybeEatSlash() {
+
+		return tokenStream.peekFor(HeaderTokenKind.SLASH);
+
+	}
+
+
+
+	private HeaderToken maybeEatStar() {
+
+		return tokenStream.peekFor(HeaderTokenKind.STAR);
+
+	}
+
+
+
+	private HeaderToken maybeEatDotStar() {
+
+		return tokenStream.peekFor(HeaderTokenKind.DOTSTAR);
+
+	}
+
+
+
+	private boolean maybeEatComma() {
+
+		return tokenStream.peekFor(HeaderTokenKind.COMMA) != null;
+
+	}
+
+
+
+	private boolean maybeEatSemicolon() {
+
+		return tokenStream.peekFor(HeaderTokenKind.SEMICOLON) != null;
+
+	}
+
+
+
+	private void recordIllegalSpaceProblem(HeaderToken start, HeaderToken end) {
+
+		recordProblem(HeaderProblemKind.ILLEGAL_SPACE, start.getStartOffset(), end.getEndOffset(), substring(lexer.data, start
+
+				.getStartOffset(), end.getEndOffset()));
+
+	}
+
+	
+
+	private void recordDoubleSlashProblem(HeaderToken first, HeaderToken second) {
+
+		recordProblem(HeaderProblemKind.ILLEGAL_DOUBLE_SLASH, first.getStartOffset(), second.getEndOffset(), substring(lexer.data, first
+
+				.getStartOffset(), second.getEndOffset()));
+
+	}
+
+
+
+	/**
+
+	 * Produce a summary string of all errors. The errors are also sent to the logger
+
+	 * 
+
+	 * @return a string error message containing all problems found during parsing.
+
+	 */
+
+	private String createErrorMessage() {
+
+		StringBuilder sb = new StringBuilder();
+
+		sb.append("Error parsing bundle manifest header ["); // TODO [later] decide whether to include header name in message
+
+		char[] data = lexer.data;
+
+		sb.append(subarray(data, 0, data.length - 1)).append("]\n");
+
+		List<HeaderProblem> problems = tokenStream.getProblems();
+
+		for (HeaderProblem headerProblem : problems) {
+
+			logger.outputErrorMsg(null, headerProblem.toString(tokenStream.getSourceContext()));
+
+			sb.append(headerProblem.toString(tokenStream.getSourceContext())).append("\n");
+
+		}
+
+		return sb.toString();
+
+	}
+
+
+
+	/**
+
+	 * Provide useful string that shows the header and progress through the tokenStream consuming it.
+
+	 */
+
+	@Override
+
+	public String toString() {
+
+		StringBuilder sb = new StringBuilder();
+
+		sb.append("StandardHeaderParser for [").append(lexer.data).append("]\n");
+
+		sb.append(tokenStream.toFormattedString()).append("\n");
+
+		return sb.toString();
+
+	}
+
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/StandardHeaderVisitor.java b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/StandardHeaderVisitor.java
new file mode 100755
index 0000000..784ec68
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/StandardHeaderVisitor.java
@@ -0,0 +1,190 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.parse.standard;
+
+
+
+import java.util.ArrayList;
+
+import java.util.HashMap;
+
+import java.util.List;
+
+import java.util.Map;
+
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderDeclaration;
+
+
+
+
+
+
+/**
+
+ * Standard implementation of the HeaderVisitor. This implementations collects
+
+ * up the names, attributes and directives visited and for each clause creates a
+
+ * HeaderDeclaration. These are then available at the end of the parse through
+
+ * getHeaderDeclaration() and getFirstHeaderDeclaration()
+
+ * 
+
+ * <strong>Concurrent Semantics</strong><br />
+
+ * 
+
+ * Threadsafe.
+
+ * 
+
+
+ */
+
+public class StandardHeaderVisitor implements HeaderVisitor {
+
+
+
+	// The complete list of HeaderDeclarations discovered during the parse
+
+	private List<HeaderDeclaration> headerDeclarations;
+
+
+
+	// Collections populated as names/directives/attributes are visited
+
+	private List<String> names;
+
+	private Map<String, String> directives;
+
+	private Map<String, String> attributes;
+
+
+
+	public void visitAttribute(String name, String value) {
+
+		attributes.put(name, value);
+
+	}
+
+
+
+	public void visitDirective(String name, String value) {
+
+		directives.put(name, value);
+
+	}
+
+
+
+	public void visitSymbolicName(String name) {
+
+		names.add(name);
+
+	}
+
+
+
+	public void visitUniqueName(String name) {
+
+		names.add(name);
+
+	}
+
+
+
+	public void visitWildcardName(String name) {
+
+		names.add(name);
+
+	}
+
+
+
+	public void endvisit() {
+
+	}
+
+
+
+	/**
+
+	 * Record a new HeaderDeclaration and reset the collections accumulating names, attributes and directives.
+
+	 */
+
+	public void clauseEnded() {
+
+		headerDeclarations.add(new StandardHeaderDeclaration(names, attributes, directives));
+		
+
+		names.clear();
+
+		directives.clear();
+
+		attributes.clear();
+
+	}
+
+
+
+	/**
+
+	 * @return the first header declaration or null if there are none.
+
+	 */
+
+	public HeaderDeclaration getFirstHeaderDeclaration() {
+
+		if (headerDeclarations.size() == 0) {
+
+			return null;
+
+		} else {
+
+			return headerDeclarations.get(0);
+
+		}
+
+	}
+
+
+
+	public List<HeaderDeclaration> getHeaderDeclarations() {
+
+		return headerDeclarations;
+
+	}
+
+	
+
+	/**
+
+	 * Called ahead of parsing a header - allowing state to be reset in a reused visitor
+
+	 */
+
+	public void initialize() {
+
+		headerDeclarations = new ArrayList<HeaderDeclaration>();
+
+		names = new ArrayList<String>();
+
+		directives = new HashMap<String, String>();
+
+		attributes = new HashMap<String, String>();
+
+	}
+
+}
+
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/main/resources/about.html b/util/org.eclipse.virgo.util.osgi.manifest/src/main/resources/about.html
new file mode 100644
index 0000000..c258ef5
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/main/resources/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>June 5, 2006</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/BaseParameterisedTests.java b/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/BaseParameterisedTests.java
new file mode 100755
index 0000000..eb6bfb0
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/BaseParameterisedTests.java
@@ -0,0 +1,129 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.internal;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.virgo.util.osgi.manifest.internal.BaseParameterised;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderDeclaration;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderParser;
+import org.junit.Test;
+
+
+public class BaseParameterisedTests {
+    
+    private static class TestParameterised extends BaseParameterised {
+        
+        private final Map<String, String> attrs;
+        private final Map<String, String> dirs;
+        private final String name;
+
+        TestParameterised(HeaderParser parser, String name, Map<String, String> attrs, Map<String, String> dirs) {
+            super(parser);
+            this.attrs = attrs;
+            this.dirs = dirs;
+            this.name = name;
+        }
+
+        @Override
+        HeaderDeclaration parse(HeaderParser parser, String parseString) {
+            StubHeaderDeclaration stubHeaderDeclaration = new StubHeaderDeclaration(this.name);
+            stubHeaderDeclaration.getAttributes().putAll(this.attrs);
+            stubHeaderDeclaration.getDirectives().putAll(this.dirs);
+            return stubHeaderDeclaration;
+        }
+        
+    }
+    
+    @Test
+    public void constructor() throws Exception {   
+        new TestParameterised(new StubHeaderParser(), "foo", null, null);
+    }
+    
+    @Test
+    public void resetFromParseString() throws Exception {
+        // a=b;c:=d;e=f;g:=h
+        Map<String, String> attrs = new HashMap<String, String>();
+        attrs.put("a", "b");
+        attrs.put("e", "f");
+        Map<String, String> dirs = new HashMap<String, String>();
+        dirs.put("c", "d");
+        dirs.put("g", "h");
+        TestParameterised testParameterised = new TestParameterised(new StubHeaderParser(), "foo", attrs, dirs);
+        testParameterised.resetFromParseString("");
+        
+        TestParameterised testParameterised2 = new TestParameterised(new StubHeaderParser(), "foo", attrs, dirs);
+        testParameterised2.resetFromParseString("");
+        
+        assertEquals(testParameterised, testParameterised2);
+        assertEquals(testParameterised.hashCode(), testParameterised2.hashCode());
+    }
+    
+    @Test
+    public void equality() {
+        Map<String, String> attributes = new HashMap<String, String>();
+        attributes.put("a", "b");
+        
+        Map<String, String> directives = new HashMap<String, String>();
+        directives.put("c", "d");
+        
+        TestParameterised a = new TestParameterised(new StubHeaderParser(), "foo", attributes, directives);
+        a.resetFromParseString(null);
+        
+        assertFalse(a.equals(null));
+        assertFalse(a.equals(new Object()));
+        assertTrue(a.equals(a));
+        
+        TestParameterised b = new TestParameterised(new StubHeaderParser(), "foo", attributes, directives);
+        b.resetFromParseString(null);
+        
+        assertTrue(a.equals(b));
+        assertTrue(b.equals(a));
+        assertEquals(a.hashCode(), b.hashCode());
+        
+        TestParameterised c = new TestParameterised(new StubHeaderParser(), "bar", attributes, directives);
+        c.resetFromParseString(null);
+        
+        assertFalse(a.equals(c));
+        assertFalse(c.equals(a));
+        
+        TestParameterised d = new TestParameterised(new StubHeaderParser(), "bar", new HashMap<String, String>(), directives);
+        d.resetFromParseString(null);
+        
+        assertFalse(c.equals(d));
+        assertFalse(d.equals(c));
+        
+        TestParameterised e = new TestParameterised(new StubHeaderParser(), "bar", attributes, new HashMap<String, String>());
+        e.resetFromParseString(null);
+        
+        assertFalse(c.equals(e));
+        assertFalse(e.equals(c));
+        
+        TestParameterised f = new TestParameterised(new StubHeaderParser(), null, attributes, directives);
+        f.resetFromParseString(null);
+        
+        assertFalse(a.equals(f));
+        assertFalse(f.equals(a));
+        
+        TestParameterised g = new TestParameterised(new StubHeaderParser(), null, attributes, directives);
+        g.resetFromParseString(null);
+        
+        assertTrue(f.equals(g));
+        assertTrue(g.equals(f));
+        assertEquals(f.hashCode(), g.hashCode());
+    }
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/MapUpdatingListTests.java b/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/MapUpdatingListTests.java
new file mode 100755
index 0000000..85833b3
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/MapUpdatingListTests.java
@@ -0,0 +1,139 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.internal;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.virgo.util.osgi.manifest.internal.MapUpdatingList;
+import org.junit.Test;
+
+public class MapUpdatingListTests {
+
+    private final Map<String, String> map = new HashMap<String, String>();
+
+    private static final String KEY = "key";
+
+    private final List<String> list = new MapUpdatingList(this.map, KEY);
+
+    @Test
+    public void add() {
+        list.add("foo");
+        assertEquals("foo", map.get(KEY));
+        list.add("foo");
+        assertEquals("foo,foo", map.get(KEY));
+    }
+
+    @Test
+    public void addAtIndex() {
+        list.add("foo");
+        assertEquals("foo", map.get(KEY));
+        list.add(0, "bar");
+        assertEquals("bar,foo", map.get(KEY));
+    }
+
+    @Test
+    public void addAll() {
+        list.addAll(Arrays.asList("a"));
+        assertEquals("a", map.get(KEY));
+        list.addAll(Arrays.asList("b", "c"));
+        assertEquals("a,b,c", map.get(KEY));
+    }
+
+    @Test
+    public void addAllAtIndex() {
+        list.addAll(Arrays.asList("a"));
+        assertEquals("a", map.get(KEY));
+        list.addAll(0, Arrays.asList("b", "c"));
+        assertEquals("b,c,a", map.get(KEY));
+    }
+
+    @Test
+    public void clear() {
+        list.add("a");
+        list.add("b");
+        assertEquals("a,b", map.get(KEY));
+        list.clear();
+        assertNull(map.get(KEY));
+    }
+
+    @Test
+    public void removeAtIndex() {
+        list.add("a");
+        list.add("b");
+        list.add("c");
+        assertEquals("a,b,c", map.get(KEY));
+        assertEquals("b", list.remove(1));
+        assertEquals("a,c", map.get(KEY));
+        assertEquals("a", list.remove(0));
+        assertEquals("c", list.remove(0));
+        assertNull(map.get(KEY));
+    }
+
+    @Test
+    public void remove() {
+        list.add("a");
+        list.add("b");
+        list.add("c");
+        assertEquals("a,b,c", map.get(KEY));
+        assertTrue(list.remove("b"));
+        assertEquals("a,c", map.get(KEY));
+        assertTrue(list.remove("a"));
+        assertTrue(list.remove("c"));
+        assertNull(map.get(KEY));
+        assertFalse(list.remove("a"));
+    }
+
+    @Test
+    public void removeAll() {
+        list.add("a");
+        list.add("b");
+        list.add("c");
+        assertEquals("a,b,c", map.get(KEY));
+        assertTrue(list.removeAll(Arrays.asList("b")));
+        assertEquals("a,c", map.get(KEY));
+        assertTrue(list.removeAll(Arrays.asList("a", "c", "d")));
+        assertNull(map.get(KEY));
+        assertFalse(list.removeAll(Arrays.asList("a", "b")));
+    }
+
+    @Test
+    public void retainAll() {
+        list.add("a");
+        list.add("b");
+        list.add("a");
+        list.add("c");
+        assertEquals("a,b,a,c", map.get(KEY));
+        assertTrue(list.retainAll(Arrays.asList("a", "b")));
+        assertEquals("a,b,a", map.get(KEY));
+        assertFalse(list.retainAll(Arrays.asList("a", "b")));
+        assertTrue(list.retainAll(Arrays.asList("c")));
+        assertNull(map.get(KEY));
+    }
+
+    @Test
+    public void set() {
+        list.add("a");
+        list.add("b");
+        list.add("c");
+        assertEquals("a,b,c", map.get(KEY));
+        assertEquals("b", list.set(1, "d"));
+        assertEquals("a,d,c", map.get(KEY));
+    }
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardBundleActivationPolicyTests.java b/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardBundleActivationPolicyTests.java
new file mode 100755
index 0000000..0a35e5e
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardBundleActivationPolicyTests.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.internal;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.virgo.util.osgi.manifest.BundleActivationPolicy;
+import org.eclipse.virgo.util.osgi.manifest.internal.StandardBundleActivationPolicy;
+import org.junit.Test;
+import org.osgi.framework.Constants;
+
+
+public class StandardBundleActivationPolicyTests {
+    
+    private StubHeaderParser parser = new StubHeaderParser();
+    private BundleActivationPolicy bundleActivationPolicy = new StandardBundleActivationPolicy(parser);
+    
+    @Test
+    public void defaults() {
+        assertEquals(BundleActivationPolicy.Policy.EAGER, this.bundleActivationPolicy.getActivationPolicy());
+        assertTrue(this.bundleActivationPolicy.getInclude().isEmpty());
+        assertTrue(this.bundleActivationPolicy.getExclude().isEmpty());
+        assertNull(this.bundleActivationPolicy.toParseString());
+    }
+    
+    @Test
+    public void lazy() {              
+        this.parser.setBundleActivationPolicy(new StubHeaderDeclaration("lazy"));
+        this.bundleActivationPolicy.resetFromParseString("");        
+        assertEquals(BundleActivationPolicy.Policy.LAZY, this.bundleActivationPolicy.getActivationPolicy());
+        assertTrue(this.bundleActivationPolicy.getInclude().isEmpty());
+        assertTrue(this.bundleActivationPolicy.getExclude().isEmpty());
+        assertEquals("lazy", this.bundleActivationPolicy.toParseString());
+    }
+    
+    @Test
+    public void includeDirective() {
+        Map<String, String> directives = new HashMap<String, String>();
+        directives.put(Constants.INCLUDE_DIRECTIVE, "a,b,c");
+        this.parser.setBundleActivationPolicy(new StubHeaderDeclaration(new HashMap<String, String>(), directives, "lazy"));
+        this.bundleActivationPolicy.resetFromParseString("");
+        assertEquals(BundleActivationPolicy.Policy.LAZY, this.bundleActivationPolicy.getActivationPolicy());
+        assertTrue(this.bundleActivationPolicy.getExclude().isEmpty());
+        List<String> include = this.bundleActivationPolicy.getInclude(); 
+        assertEquals(3, include.size());
+        assertEquals("a", include.get(0));
+        assertEquals("b", include.get(1));
+        assertEquals("c", include.get(2));
+        assertEquals("lazy;include:=\"a,b,c\"", this.bundleActivationPolicy.toParseString());
+    }
+    
+    @Test
+    public void excludeDirective() {
+        Map<String, String> directives = new HashMap<String, String>();
+        directives.put(Constants.EXCLUDE_DIRECTIVE, "a,b,c");
+        this.parser.setBundleActivationPolicy(new StubHeaderDeclaration(new HashMap<String, String>(), directives, "lazy"));
+        this.bundleActivationPolicy.resetFromParseString("");
+        assertEquals(BundleActivationPolicy.Policy.LAZY, this.bundleActivationPolicy.getActivationPolicy());
+        assertTrue(this.bundleActivationPolicy.getInclude().isEmpty());
+        List<String> exclude = this.bundleActivationPolicy.getExclude(); 
+        assertEquals(3, exclude.size());
+        assertEquals("a", exclude.get(0));
+        assertEquals("b", exclude.get(1));
+        assertEquals("c", exclude.get(2));
+        assertEquals("lazy;exclude:=\"a,b,c\"", this.bundleActivationPolicy.toParseString());
+    }
+    
+    @Test
+    public void setActivationPolicy() {
+        this.bundleActivationPolicy.setActivationPolicy(BundleActivationPolicy.Policy.EAGER);
+        assertNull(this.bundleActivationPolicy.toParseString());
+        this.bundleActivationPolicy.setActivationPolicy(BundleActivationPolicy.Policy.LAZY);
+        assertEquals("lazy", this.bundleActivationPolicy.toParseString());
+    }
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardBundleManifestTests.java b/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardBundleManifestTests.java
new file mode 100755
index 0000000..3434eda
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardBundleManifestTests.java
@@ -0,0 +1,413 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.internal;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.net.URL;
+import java.util.Arrays;
+import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.virgo.util.osgi.manifest.BundleActivationPolicy;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifest;
+import org.eclipse.virgo.util.osgi.manifest.BundleManifestFactory;
+import org.eclipse.virgo.util.osgi.manifest.DynamicImportPackage;
+import org.eclipse.virgo.util.osgi.manifest.ExportPackage;
+import org.eclipse.virgo.util.osgi.manifest.ImportBundle;
+import org.eclipse.virgo.util.osgi.manifest.ImportLibrary;
+import org.eclipse.virgo.util.osgi.manifest.ImportPackage;
+import org.eclipse.virgo.util.osgi.manifest.RequireBundle;
+import org.eclipse.virgo.util.osgi.manifest.parse.DummyParserLogger;
+import org.junit.Test;
+import org.osgi.framework.Constants;
+import org.osgi.framework.Version;
+
+public class StandardBundleManifestTests {
+
+    private File resources = new File("src/test/resources/org/eclipse/virgo/util/osgi/manifest/internal");
+
+    @Test
+    public void constructionFromReader() throws IOException {
+        try (Reader fileReader = new InputStreamReader(new FileInputStream(new File(resources, "basic.mf")), UTF_8)) {
+            BundleManifest bundleManifest = new StandardBundleManifest(new DummyParserLogger(), fileReader);
+            assertEquals("bar", bundleManifest.toDictionary().get("Foo"));
+        }
+    }
+
+    @Test
+    public void constructFromManifestWithMissingVersion() throws IOException {
+        try (Reader fileReader = new InputStreamReader(new FileInputStream(new File(resources, "badManifest.mf")), UTF_8)) {
+            BundleManifest bundleManifest = new StandardBundleManifest(new DummyParserLogger(), fileReader);
+            assertEquals(StandardBundleManifest.MANIFEST_VERSION_VALUE, bundleManifest.toDictionary().get("Manifest-Version"));
+        }
+    }
+
+    @Test
+    public void constructionFromManifestWithVersion() throws IOException {
+        try (Reader fileReader = new InputStreamReader(new FileInputStream(new File(resources, "goodManifest.mf")), UTF_8)) {
+            BundleManifest bundleManifest = new StandardBundleManifest(new DummyParserLogger(), fileReader);
+            assertEquals("2.0", bundleManifest.toDictionary().get("Manifest-Version"));
+        }
+    }
+
+    @Test
+    public void constructionFromDictionary() {
+        Dictionary<String, String> dictionary = new Hashtable<String, String>();
+        dictionary.put("Bundle-SymbolicName", "com.foo.bar");
+
+        BundleManifest bundleManifest = new StandardBundleManifest(new DummyParserLogger(), dictionary);
+        assertEquals("com.foo.bar", bundleManifest.getBundleSymbolicName().getSymbolicName());
+    }
+
+    @Test
+    public void bundleActivationPolicy() throws IOException {
+        try (Reader fileReader = new InputStreamReader(new FileInputStream(new File(resources, "all-headers.mf")), UTF_8)) {
+            BundleManifest bundleManifest = new StandardBundleManifest(new DummyParserLogger(), fileReader);
+            assertEquals(BundleActivationPolicy.Policy.LAZY, bundleManifest.getBundleActivationPolicy().getActivationPolicy());
+        }
+    }
+
+    @Test
+    public void bundleClasspath() throws IOException {
+        try (Reader fileReader = new InputStreamReader(new FileInputStream(new File(resources, "all-headers.mf")), UTF_8)) {
+            BundleManifest bundleManifest = new StandardBundleManifest(new DummyParserLogger(), fileReader);
+            List<String> bundleClasspath = bundleManifest.getBundleClasspath();
+            assertEquals(3, bundleClasspath.size());
+            assertEquals(Arrays.asList(".", "a.jar", "b.jar"), bundleClasspath);
+            bundleClasspath.add("baz.jar");
+            assertEquals(".,a.jar,b.jar,baz.jar", bundleManifest.toDictionary().get(Constants.BUNDLE_CLASSPATH));
+            assertEquals(4, bundleManifest.getBundleClasspath().size());
+            bundleClasspath.clear();
+            assertNull(bundleManifest.toDictionary().get(Constants.BUNDLE_CLASSPATH));
+        }
+    }
+
+    @Test
+    public void bundleClasspathCreation() {
+        BundleManifest bundleManifest = new StandardBundleManifest(new DummyParserLogger());
+        assertNotNull(bundleManifest.getBundleClasspath());
+        List<String> bundleClasspath = bundleManifest.getBundleClasspath();
+        assertEquals(0, bundleManifest.getBundleClasspath().size());
+        assertNull(bundleManifest.toDictionary().get(Constants.BUNDLE_CLASSPATH));
+        bundleClasspath.add("foo.jar");
+        bundleClasspath.add("bar.jar");
+        assertEquals(2, bundleManifest.getBundleClasspath().size());
+        assertEquals("foo.jar,bar.jar", bundleManifest.toDictionary().get(Constants.BUNDLE_CLASSPATH));
+        bundleClasspath.clear();
+        assertNull(bundleManifest.toDictionary().get(Constants.BUNDLE_CLASSPATH));
+    }
+
+    @Test
+    public void bundleDescription() throws IOException {
+        try (Reader fileReader = new InputStreamReader(new FileInputStream(new File(resources, "all-headers.mf")), UTF_8)) {
+            BundleManifest bundleManifest = new StandardBundleManifest(new DummyParserLogger(), fileReader);
+            assertEquals("The description", bundleManifest.getBundleDescription());
+
+            String bundleDescription = "New description";
+            bundleManifest.setBundleDescription(bundleDescription);
+            assertEquals(bundleDescription, bundleManifest.getBundleDescription());
+
+            bundleManifest.setBundleDescription(null);
+            assertNull(bundleManifest.getBundleDescription());
+
+            bundleManifest.setHeader(Constants.BUNDLE_DESCRIPTION, bundleDescription);
+            assertEquals(bundleDescription, bundleManifest.getBundleDescription());
+        }
+    }
+
+    @Test
+    public void bundleManifestVersion() throws IOException {
+        try (Reader fileReader = new InputStreamReader(new FileInputStream(new File(resources, "all-headers.mf")), UTF_8)) {
+            StandardBundleManifest bundleManifest = new StandardBundleManifest(new DummyParserLogger(), fileReader);
+            assertEquals(2, bundleManifest.getBundleManifestVersion());
+            assertEquals("2", bundleManifest.getHeader(Constants.BUNDLE_MANIFESTVERSION));
+
+            bundleManifest.setHeader(Constants.BUNDLE_MANIFESTVERSION, null);
+            assertEquals(1, bundleManifest.getBundleManifestVersion());
+            assertNull(bundleManifest.getHeader(Constants.BUNDLE_MANIFESTVERSION));
+
+            bundleManifest.setBundleManifestVersion(2);
+            assertEquals(2, bundleManifest.getBundleManifestVersion());
+            assertEquals("2", bundleManifest.getHeader(Constants.BUNDLE_MANIFESTVERSION));
+
+            bundleManifest.setHeader(Constants.BUNDLE_MANIFESTVERSION, "1");
+            assertEquals(1, bundleManifest.getBundleManifestVersion());
+            assertEquals("1", bundleManifest.getHeader(Constants.BUNDLE_MANIFESTVERSION));
+
+            StringWriter writer = new StringWriter();
+            bundleManifest.write(writer);
+        }
+    }
+
+    @Test
+    public void bundleName() throws IOException {
+        try (Reader fileReader = new InputStreamReader(new FileInputStream(new File(resources, "all-headers.mf")), UTF_8)) {
+            BundleManifest bundleManifest = new StandardBundleManifest(new DummyParserLogger(), fileReader);
+            assertEquals("The name", bundleManifest.getBundleName());
+            assertEquals("The name", bundleManifest.getHeader(Constants.BUNDLE_NAME));
+
+            bundleManifest.setBundleName("New name");
+            assertEquals("New name", bundleManifest.getBundleName());
+            assertEquals("New name", bundleManifest.getHeader(Constants.BUNDLE_NAME));
+
+            bundleManifest.setBundleName(null);
+            assertNull(bundleManifest.getBundleName());
+            assertNull(bundleManifest.getHeader(Constants.BUNDLE_NAME));
+
+            bundleManifest.setHeader(Constants.BUNDLE_NAME, "New name");
+            assertEquals("New name", bundleManifest.getBundleName());
+            assertEquals("New name", bundleManifest.getHeader(Constants.BUNDLE_NAME));
+        }
+    }
+
+    @Test
+    public void bundleSymbolicName() throws IOException {
+        try (Reader fileReader = new InputStreamReader(new FileInputStream(new File(resources, "all-headers.mf")), UTF_8)) {
+            BundleManifest bundleManifest = new StandardBundleManifest(new DummyParserLogger(), fileReader);
+            assertEquals("com.foo.bar", bundleManifest.getBundleSymbolicName().getSymbolicName());
+        }
+    }
+
+    @Test
+    public void bundleUpdateLocation() throws IOException {
+        try (Reader fileReader = new InputStreamReader(new FileInputStream(new File(resources, "all-headers.mf")), UTF_8)) {
+            BundleManifest bundleManifest = new StandardBundleManifest(new DummyParserLogger(), fileReader);
+            assertEquals(new URL("http://update.com"), bundleManifest.getBundleUpdateLocation());
+
+            bundleManifest.setHeader(Constants.BUNDLE_UPDATELOCATION, null);
+            assertNull(bundleManifest.getBundleUpdateLocation());
+
+            URL newUpdateLocation = new URL("http://new.update.location");
+            bundleManifest.setBundleUpdateLocation(newUpdateLocation);
+            assertEquals(newUpdateLocation, bundleManifest.getBundleUpdateLocation());
+
+            bundleManifest.setBundleUpdateLocation(null);
+            assertNull(bundleManifest.getBundleUpdateLocation());
+        }
+    }
+
+    @Test
+    public void dynamicImportPackage() throws IOException {
+        try (Reader fileReader = new InputStreamReader(new FileInputStream(new File(resources, "all-headers.mf")), UTF_8)) {
+            BundleManifest bundleManifest = new StandardBundleManifest(new DummyParserLogger(), fileReader);
+            DynamicImportPackage dynamicImportPackage = bundleManifest.getDynamicImportPackage();
+            assertEquals(1, dynamicImportPackage.getDynamicallyImportedPackages().size());
+            assertEquals("com.foo.*", dynamicImportPackage.getDynamicallyImportedPackages().get(0).getPackageName());
+        }
+    }
+
+    @Test
+    public void exportPackage() throws IOException {
+        try (Reader fileReader = new InputStreamReader(new FileInputStream(new File(resources, "all-headers.mf")), UTF_8)) {
+            BundleManifest bundleManifest = new StandardBundleManifest(new DummyParserLogger(), fileReader);
+            ExportPackage exportPackage = bundleManifest.getExportPackage();
+            assertEquals(1, exportPackage.getExportedPackages().size());
+            assertEquals("com.bar", exportPackage.getExportedPackages().get(0).getPackageName());
+        }
+    }
+
+    @Test
+    public void fragmentHost() throws IOException {
+        try (Reader fileReader = new InputStreamReader(new FileInputStream(new File(resources, "all-headers.mf")), UTF_8)) {
+            BundleManifest bundleManifest = new StandardBundleManifest(new DummyParserLogger(), fileReader);
+            assertEquals("com.foo.host", bundleManifest.getFragmentHost().getBundleSymbolicName());
+        }
+    }
+
+    @Test
+    public void importBundle() throws IOException {
+        try (Reader fileReader = new InputStreamReader(new FileInputStream(new File(resources, "all-headers.mf")), UTF_8)) {
+            BundleManifest bundleManifest = new StandardBundleManifest(new DummyParserLogger(), fileReader);
+            ImportBundle importBundle = bundleManifest.getImportBundle();
+            assertEquals(1, importBundle.getImportedBundles().size());
+            assertEquals("com.baz", importBundle.getImportedBundles().get(0).getBundleSymbolicName());
+        }
+    }
+
+    @Test
+    public void importLibrary() throws IOException {
+        try (Reader fileReader = new InputStreamReader(new FileInputStream(new File(resources, "all-headers.mf")), UTF_8)) {
+            BundleManifest bundleManifest = new StandardBundleManifest(new DummyParserLogger(), fileReader);
+            ImportLibrary importLibrary = bundleManifest.getImportLibrary();
+            assertEquals(1, importLibrary.getImportedLibraries().size());
+            assertEquals("com.lib", importLibrary.getImportedLibraries().get(0).getLibrarySymbolicName());
+        }
+    }
+
+    @Test
+    public void importPackage() throws IOException {
+        try (Reader fileReader = new InputStreamReader(new FileInputStream(new File(resources, "all-headers.mf")), UTF_8)) {
+            BundleManifest bundleManifest = new StandardBundleManifest(new DummyParserLogger(), fileReader);
+            ImportPackage importPackage = bundleManifest.getImportPackage();
+            assertEquals(1, importPackage.getImportedPackages().size());
+            assertEquals("com.pkg", importPackage.getImportedPackages().get(0).getPackageName());
+        }
+    }
+
+    @Test
+    public void moduleScope() throws IOException {
+        try (Reader fileReader = new InputStreamReader(new FileInputStream(new File(resources, "all-headers.mf")), UTF_8)) {
+            BundleManifest bundleManifest = new StandardBundleManifest(new DummyParserLogger(), fileReader);
+            assertEquals("the.scope", bundleManifest.getModuleScope());
+
+            bundleManifest.setModuleScope("new.scope");
+            assertEquals("new.scope", bundleManifest.getModuleScope());
+
+            bundleManifest.setModuleScope(null);
+            assertNull(bundleManifest.getModuleScope());
+        }
+    }
+
+    @Test
+    public void moduleType() throws IOException {
+        try (Reader fileReader = new InputStreamReader(new FileInputStream(new File(resources, "all-headers.mf")), UTF_8)) {
+            BundleManifest bundleManifest = new StandardBundleManifest(new DummyParserLogger(), fileReader);
+            assertEquals("web", bundleManifest.getModuleType());
+
+            bundleManifest.setModuleType("new type");
+            assertEquals("new type", bundleManifest.getModuleType());
+
+            bundleManifest.setModuleType(null);
+            assertNull(bundleManifest.getModuleType());
+        }
+    }
+
+    @Test
+    public void requireBundle() throws IOException {
+        try (Reader fileReader = new InputStreamReader(new FileInputStream(new File(resources, "all-headers.mf")), UTF_8)) {
+            BundleManifest bundleManifest = new StandardBundleManifest(new DummyParserLogger(), fileReader);
+            RequireBundle requireBundle = bundleManifest.getRequireBundle();
+            assertEquals(1, requireBundle.getRequiredBundles().size());
+            assertEquals("com.req", requireBundle.getRequiredBundles().get(0).getBundleSymbolicName());
+
+            bundleManifest.setHeader(Constants.REQUIRE_BUNDLE, null);
+            assertEquals(0, requireBundle.getRequiredBundles().size());
+        }
+    }
+
+    @Test
+    public void bundleVersion() throws IOException {
+        try (Reader fileReader = new InputStreamReader(new FileInputStream(new File(resources, "all-headers.mf")), UTF_8)) {
+            BundleManifest bundleManifest = new StandardBundleManifest(new DummyParserLogger(), fileReader);
+            assertEquals(new Version(1, 2, 3), bundleManifest.getBundleVersion());
+            assertEquals("1.2.3", bundleManifest.getHeader(Constants.BUNDLE_VERSION));
+
+            bundleManifest.setBundleVersion(new Version(3, 2, 1));
+            assertEquals(new Version(3, 2, 1), bundleManifest.getBundleVersion());
+            assertEquals("3.2.1", bundleManifest.getHeader(Constants.BUNDLE_VERSION));
+
+            bundleManifest.setBundleVersion(null);
+            assertEquals(Version.emptyVersion, bundleManifest.getBundleVersion());
+
+            assertNull(bundleManifest.getHeader(Constants.BUNDLE_VERSION));
+        }
+    }
+
+    @Test
+    public void writerReaderRoundTrip() throws IOException {
+        try (Reader fileReader = new InputStreamReader(new FileInputStream(new File(resources, "all-headers.mf")), UTF_8)) {
+            BundleManifest bundleManifest = new StandardBundleManifest(new DummyParserLogger(), fileReader);
+            StringWriter writer = new StringWriter();
+            bundleManifest.write(writer);
+
+            String one = writer.toString();
+
+            bundleManifest = BundleManifestFactory.createBundleManifest(new StringReader(one));
+            writer = new StringWriter();
+            bundleManifest.write(writer);
+
+            assertEquals(one, writer.toString());
+        }
+    }
+
+    @Test
+    public void caseInsensitivity() {
+        Map<String, String> contents = new HashMap<String, String>();
+        contents.put("BunDLE-SymBOLICnAME", "foo");
+        contents.put("Bundle-Name", "the bundle");
+        BundleManifest bundleManifest = new StandardBundleManifest(new DummyParserLogger(), contents);
+        assertEquals("foo", bundleManifest.getBundleSymbolicName().getSymbolicName());
+        assertEquals("the bundle", bundleManifest.getHeader("BundlE-NAMe"));
+    }
+
+    @Test
+    public void preservationOfHeaderNameCase() {
+        Map<String, String> contents = new HashMap<String, String>();
+        contents.put("BunDLE-SymBOLICnAME", "foo");
+        contents.put("Bundle-Name", "the bundle");
+        BundleManifest bundleManifest = new StandardBundleManifest(new DummyParserLogger(), contents);
+
+        Dictionary<String, String> dictionary = bundleManifest.toDictionary();
+        Enumeration<String> keys = dictionary.keys();
+
+        while (keys.hasMoreElements()) {
+            String key = keys.nextElement();
+            if (!"BunDLE-SymBOLICnAME".equals(key) && !"Bundle-Name".equals(key) && !"Manifest-Version".equals(key)) {
+                fail("Unexpected key " + key);
+            }
+        }
+    }
+
+    @Test
+    public void copeWithNullHeaderStringsDuringSynchronisation() {
+        Map<String, String> contents = new HashMap<String, String>();
+        contents.put(Constants.BUNDLE_SYMBOLICNAME, "foo");
+
+        BundleManifest bundleManifest = new StandardBundleManifest(new DummyParserLogger(), contents);
+        assertEquals("foo", bundleManifest.getHeader(Constants.BUNDLE_SYMBOLICNAME));
+
+        bundleManifest.getBundleSymbolicName().setSymbolicName(null);
+
+        assertNull(bundleManifest.getHeader(Constants.BUNDLE_SYMBOLICNAME));
+    }
+
+    @Test
+    public void toDictionary() {
+        Map<String, String> contents = new HashMap<String, String>();
+        contents.put(Constants.BUNDLE_VERSION, "1.0");
+        contents.put(Constants.FRAGMENT_HOST, "host");
+
+        BundleManifest bundleManifest = new StandardBundleManifest(new DummyParserLogger(), contents);
+
+        bundleManifest.getBundleSymbolicName().setSymbolicName("foo");
+        bundleManifest.getFragmentHost().setBundleSymbolicName("bar");
+
+        Dictionary<String, String> dictionary = bundleManifest.toDictionary();
+        assertEquals("foo", dictionary.get(Constants.BUNDLE_SYMBOLICNAME));
+        assertEquals("bar", dictionary.get(Constants.FRAGMENT_HOST));
+    }
+
+    @Test
+    public void extremelyLargeManifest() throws FileNotFoundException, IOException {
+        try (Reader fileReader = new InputStreamReader(new FileInputStream(new File(resources, "verylarge.mf")), UTF_8)) {
+            BundleManifest bundleManifest = new StandardBundleManifest(new DummyParserLogger(), fileReader);
+            assertEquals("very.large.manifest", bundleManifest.getBundleSymbolicName().getSymbolicName());
+        }
+    }
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardBundleSymbolicNameTests.java b/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardBundleSymbolicNameTests.java
new file mode 100755
index 0000000..032924b
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardBundleSymbolicNameTests.java
@@ -0,0 +1,118 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.internal;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.virgo.util.osgi.manifest.BundleSymbolicName;
+import org.eclipse.virgo.util.osgi.manifest.BundleSymbolicName.FragmentAttachment;
+import org.eclipse.virgo.util.osgi.manifest.internal.StandardBundleSymbolicName;
+import org.junit.Test;
+import org.osgi.framework.Constants;
+
+
+public class StandardBundleSymbolicNameTests {
+    
+    private StubHeaderParser parser = new StubHeaderParser();
+    private BundleSymbolicName bundleSymbolicName = new StandardBundleSymbolicName(parser);
+    
+    @Test
+    public void defaults() {
+        assertTrue(this.bundleSymbolicName.getDirectives().isEmpty());
+        assertTrue(this.bundleSymbolicName.getAttributes().isEmpty());
+        assertEquals(FragmentAttachment.ALWAYS, this.bundleSymbolicName.getFragmentAttachment());
+        assertFalse(this.bundleSymbolicName.isSingleton());
+        assertNull(this.bundleSymbolicName.toParseString());
+    }
+    
+    @Test
+    public void symbolicName() {
+        this.parser.setBundleSymbolicName(new StubHeaderDeclaration("foo"));
+        this.bundleSymbolicName.resetFromParseString("");
+        
+        assertEquals("foo", this.bundleSymbolicName.getSymbolicName());
+        assertEquals("foo", this.bundleSymbolicName.toParseString());
+    }
+    
+    @Test
+    public void singletonDirective() {
+        Map<String, String> directives = new HashMap<String, String>();
+        
+        directives.put(Constants.SINGLETON_DIRECTIVE, "true");        
+        this.parser.setBundleSymbolicName(new StubHeaderDeclaration(new HashMap<String, String>(), directives, "foo"));
+        this.bundleSymbolicName.resetFromParseString("");        
+        assertTrue(this.bundleSymbolicName.isSingleton());
+        assertEquals("foo;singleton:=\"true\"", this.bundleSymbolicName.toParseString());
+        
+        directives.put(Constants.SINGLETON_DIRECTIVE, "false");
+        this.parser.setBundleActivationPolicy(new StubHeaderDeclaration(new HashMap<String, String>(), directives, "foo"));
+        this.bundleSymbolicName.resetFromParseString("");        
+        assertFalse(this.bundleSymbolicName.isSingleton());
+        assertEquals("foo;singleton:=\"false\"", this.bundleSymbolicName.toParseString());
+    }
+    
+    @Test
+    public void fragmentAttachmentDirective() {
+        Map<String, String> directives = new HashMap<String, String>();
+        
+        directives.put(Constants.FRAGMENT_ATTACHMENT_DIRECTIVE, Constants.FRAGMENT_ATTACHMENT_NEVER);        
+        this.parser.setBundleSymbolicName(new StubHeaderDeclaration(new HashMap<String, String>(), directives, "foo"));
+        this.bundleSymbolicName.resetFromParseString("");        
+        assertEquals(this.bundleSymbolicName.getFragmentAttachment(), FragmentAttachment.NEVER);
+        assertEquals("foo;fragment-attachment:=\"never\"", this.bundleSymbolicName.toParseString());
+        
+        directives.put(Constants.FRAGMENT_ATTACHMENT_DIRECTIVE, Constants.FRAGMENT_ATTACHMENT_RESOLVETIME);
+        this.parser.setBundleSymbolicName(new StubHeaderDeclaration(new HashMap<String, String>(), directives, "foo"));
+        this.bundleSymbolicName.resetFromParseString("");        
+        assertEquals(this.bundleSymbolicName.getFragmentAttachment(), FragmentAttachment.RESOLVE_TIME);
+        assertEquals("foo;fragment-attachment:=\"resolve-time\"", this.bundleSymbolicName.toParseString());
+        
+        directives.put(Constants.FRAGMENT_ATTACHMENT_DIRECTIVE, Constants.FRAGMENT_ATTACHMENT_ALWAYS);
+        this.parser.setBundleSymbolicName(new StubHeaderDeclaration(new HashMap<String, String>(), directives, "foo"));
+        this.bundleSymbolicName.resetFromParseString("");        
+        assertEquals(this.bundleSymbolicName.getFragmentAttachment(), FragmentAttachment.ALWAYS);
+        assertEquals("foo;fragment-attachment:=\"always\"", this.bundleSymbolicName.toParseString());
+    }
+    
+    @Test
+    public void setSingleton() {
+        this.bundleSymbolicName.setSingleton(true);
+        assertTrue(this.bundleSymbolicName.isSingleton());        
+        
+        this.bundleSymbolicName.setSingleton(false);
+        assertFalse(this.bundleSymbolicName.isSingleton());
+    }
+    
+    @Test
+    public void setFragmentAttachment() {
+        this.bundleSymbolicName.setFragmentAttachment(FragmentAttachment.NEVER);
+        assertEquals(FragmentAttachment.NEVER, this.bundleSymbolicName.getFragmentAttachment());
+        
+        this.bundleSymbolicName.setFragmentAttachment(FragmentAttachment.RESOLVE_TIME);
+        assertEquals(FragmentAttachment.RESOLVE_TIME, this.bundleSymbolicName.getFragmentAttachment());
+        
+        this.bundleSymbolicName.setFragmentAttachment(FragmentAttachment.ALWAYS);
+        assertEquals(FragmentAttachment.ALWAYS, this.bundleSymbolicName.getFragmentAttachment());
+    }
+    
+    @Test
+    public void setSymbolicName() {
+        this.bundleSymbolicName.setSymbolicName("foo");
+        assertEquals("foo", this.bundleSymbolicName.toParseString());
+    }
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardDynamicImportPackageTests.java b/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardDynamicImportPackageTests.java
new file mode 100755
index 0000000..dd2ad0c
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardDynamicImportPackageTests.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.internal;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.virgo.util.osgi.manifest.DynamicImportPackage;
+import org.eclipse.virgo.util.osgi.manifest.DynamicallyImportedPackage;
+import org.eclipse.virgo.util.osgi.manifest.internal.StandardDynamicImportPackage;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderDeclaration;
+import org.junit.Test;
+
+
+public class StandardDynamicImportPackageTests {
+
+    @Test
+    public void packageAddition() {
+        StubHeaderParser parser = new StubHeaderParser();
+
+        DynamicImportPackage dynamicImportPackage = new StandardDynamicImportPackage(parser);
+        assertEquals(0, dynamicImportPackage.getDynamicallyImportedPackages().size());
+
+        dynamicImportPackage.addDynamicallyImportedPackage("foo.*");
+        List<DynamicallyImportedPackage> dynamicallyImportedPackages = dynamicImportPackage.getDynamicallyImportedPackages();
+        assertEquals(1, dynamicallyImportedPackages.size());
+        assertEquals("foo.*", dynamicallyImportedPackages.get(0).getPackageName());
+    }
+
+    @Test
+    public void resetFromParseString() {
+        StubHeaderParser parser = new StubHeaderParser();
+
+        List<HeaderDeclaration> headers = new ArrayList<HeaderDeclaration>();
+        headers.add(new StubHeaderDeclaration("foo"));
+        headers.add(new StubHeaderDeclaration("bar"));
+
+        DynamicImportPackage dynamicImportPackage = new StandardDynamicImportPackage(parser);
+        parser.setDynamicImportPackage(headers);
+
+        dynamicImportPackage.resetFromParseString("");
+
+        assertEquals(2, dynamicImportPackage.getDynamicallyImportedPackages().size());
+
+        headers.clear();
+        headers.add(new StubHeaderDeclaration("foo", "bar"));
+
+        dynamicImportPackage.resetFromParseString("");
+
+        assertEquals(2, dynamicImportPackage.getDynamicallyImportedPackages().size());
+    }
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardDynamicallyImportedPackageTests.java b/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardDynamicallyImportedPackageTests.java
new file mode 100755
index 0000000..f577af7
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardDynamicallyImportedPackageTests.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.internal;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.virgo.util.osgi.manifest.DynamicallyImportedPackage;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+import org.eclipse.virgo.util.osgi.manifest.internal.StandardDynamicallyImportedPackage;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderDeclaration;
+import org.junit.Test;
+
+
+public class StandardDynamicallyImportedPackageTests {
+    private StubHeaderParser parser = new StubHeaderParser();
+    
+    @Test
+    public void defaults() {        
+        DynamicallyImportedPackage dynamicallyImportedPackage = new StandardDynamicallyImportedPackage(parser, null);
+        assertNull(dynamicallyImportedPackage.getBundleSymbolicName());
+        assertEquals(VersionRange.NATURAL_NUMBER_RANGE, dynamicallyImportedPackage.getBundleVersion());
+        assertEquals(VersionRange.NATURAL_NUMBER_RANGE, dynamicallyImportedPackage.getVersion());
+        assertNull(dynamicallyImportedPackage.toParseString());
+    }
+    
+    @Test
+    public void packageName() {     
+        DynamicallyImportedPackage dynamicallyImportedPackage = new StandardDynamicallyImportedPackage(parser, "foo");
+        assertEquals("foo", dynamicallyImportedPackage.getPackageName());
+        assertEquals("foo", dynamicallyImportedPackage.toParseString());
+        
+        dynamicallyImportedPackage.setPackageName("foo.*");
+        assertEquals("foo.*", dynamicallyImportedPackage.getPackageName());
+        assertEquals("foo.*", dynamicallyImportedPackage.toParseString());
+    }
+    
+    @Test
+    public void bundleVersion() {        
+        DynamicallyImportedPackage dynamicallyImportedPackage = new StandardDynamicallyImportedPackage(parser, "foo");        
+                
+        dynamicallyImportedPackage.setBundleVersion(new VersionRange("[1.0.0,2.0.0)"));
+        assertEquals(new VersionRange("[1.0.0,2.0.0)"), dynamicallyImportedPackage.getBundleVersion());
+        assertEquals("foo;bundle-version=\"[1.0.0, 2.0.0)\"", dynamicallyImportedPackage.toParseString());
+        
+        dynamicallyImportedPackage.setBundleVersion(null);
+        assertEquals(VersionRange.NATURAL_NUMBER_RANGE, dynamicallyImportedPackage.getBundleVersion());
+        assertEquals("foo", dynamicallyImportedPackage.toParseString());
+    }
+    
+    @Test
+    public void bundleSymbolicName() {        
+        DynamicallyImportedPackage dynamicallyImportedPackage = new StandardDynamicallyImportedPackage(parser, "foo");
+                
+        dynamicallyImportedPackage.setBundleSymbolicName("bar");
+        assertEquals("bar", dynamicallyImportedPackage.getBundleSymbolicName());
+        assertEquals("foo;bundle-symbolic-name=\"bar\"", dynamicallyImportedPackage.toParseString());
+    }
+    
+    @Test
+    public void version() {        
+        DynamicallyImportedPackage dynamicallyImportedPackage = new StandardDynamicallyImportedPackage(parser, "foo");
+                
+        dynamicallyImportedPackage.setVersion(new VersionRange("[1.0.0,2.0.0)"));
+        assertEquals(new VersionRange("[1.0.0,2.0.0)"), dynamicallyImportedPackage.getVersion());
+        assertEquals("foo;version=\"[1.0.0, 2.0.0)\"", dynamicallyImportedPackage.toParseString());
+        
+        dynamicallyImportedPackage.setVersion(null);
+        assertEquals(VersionRange.NATURAL_NUMBER_RANGE, dynamicallyImportedPackage.getBundleVersion());
+        assertEquals("foo", dynamicallyImportedPackage.toParseString());
+    }   
+    
+    @Test
+    public void resetFromParseString() {        
+        DynamicallyImportedPackage dynamicallyImportedPackage = new StandardDynamicallyImportedPackage(this.parser, "foo");
+        
+        List<HeaderDeclaration> dynamicImportPackage = new ArrayList<HeaderDeclaration>();
+        dynamicImportPackage.add(new StubHeaderDeclaration("bar"));
+        this.parser.setDynamicImportPackage(dynamicImportPackage);
+        dynamicallyImportedPackage.resetFromParseString("");
+        assertEquals("bar", dynamicallyImportedPackage.getPackageName());
+    }
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardExportPackageTests.java b/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardExportPackageTests.java
new file mode 100755
index 0000000..c0575fa
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardExportPackageTests.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.internal;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.virgo.util.osgi.manifest.ExportPackage;
+import org.eclipse.virgo.util.osgi.manifest.ExportedPackage;
+import org.eclipse.virgo.util.osgi.manifest.internal.StandardExportPackage;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderDeclaration;
+import org.junit.Test;
+
+
+public class StandardExportPackageTests {
+    
+    @Test
+    public void packageAddition() {
+        StubHeaderParser parser = new StubHeaderParser();
+        
+        ExportPackage exportPackage = new StandardExportPackage(parser);
+        assertEquals(0, exportPackage.getExportedPackages().size());
+        
+        exportPackage.addExportedPackage("foo");
+        List<ExportedPackage> exportedPackages = exportPackage.getExportedPackages();
+        assertEquals(1, exportedPackages.size());
+        assertEquals("foo", exportedPackages.get(0).getPackageName());
+    }
+    
+    @Test
+    public void resetFromParseString() {
+        StubHeaderParser parser = new StubHeaderParser();
+        
+        List<HeaderDeclaration> headers = new ArrayList<HeaderDeclaration>();
+        headers.add(new StubHeaderDeclaration("foo"));
+        headers.add(new StubHeaderDeclaration("bar"));
+        
+        ExportPackage exportPackage = new StandardExportPackage(parser);
+        parser.setExportPackage(headers);
+        
+        exportPackage.resetFromParseString("");
+        
+        assertEquals(2, exportPackage.getExportedPackages().size());
+        
+        headers.clear();
+        headers.add(new StubHeaderDeclaration("foo", "bar"));
+        
+        exportPackage.resetFromParseString("");
+        
+        assertEquals(2, exportPackage.getExportedPackages().size());
+    }
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardExportedPackageTests.java b/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardExportedPackageTests.java
new file mode 100755
index 0000000..4195ec0
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardExportedPackageTests.java
@@ -0,0 +1,97 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.internal;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.virgo.util.osgi.manifest.ExportedPackage;
+import org.eclipse.virgo.util.osgi.manifest.internal.StandardExportedPackage;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderDeclaration;
+import org.junit.Test;
+import org.osgi.framework.Version;
+
+
+public class StandardExportedPackageTests {
+    
+    private StubHeaderParser parser = new StubHeaderParser();
+
+    @Test
+    public void defaults() {        
+        ExportedPackage exportedPackage = new StandardExportedPackage(this.parser, "");
+        assertEquals(new Version("0"), exportedPackage.getVersion());
+        assertEquals(0, exportedPackage.getExclude().size());
+        assertEquals(0, exportedPackage.getInclude().size());
+        assertEquals(0, exportedPackage.getMandatory().size());
+        assertEquals(0, exportedPackage.getUses().size());
+    }
+    
+    @Test
+    public void version() {        
+        ExportedPackage exportedPackage = new StandardExportedPackage(this.parser, "foo");        
+        exportedPackage.setVersion(new Version(1, 2, 3));
+        assertEquals(new Version(1, 2, 3), exportedPackage.getVersion());
+        assertEquals("foo;version=\"1.2.3\"", exportedPackage.toParseString());  
+        exportedPackage.setVersion(null);
+        assertEquals(new Version(0, 0, 0), exportedPackage.getVersion());
+    }
+    
+    @Test
+    public void include() {        
+        ExportedPackage exportedPackage = new StandardExportedPackage(this.parser, "foo");
+        List<String> include = exportedPackage.getInclude();
+        assertEquals(0, include.size());
+        include.add("bar");
+        assertEquals("foo;include:=\"bar\"", exportedPackage.toParseString());
+        include.clear();
+        assertEquals("foo", exportedPackage.toParseString());
+    }
+    
+    @Test
+    public void exclude() {        
+        ExportedPackage exportedPackage = new StandardExportedPackage(this.parser, "foo");
+        List<String> exclude = exportedPackage.getExclude();
+        assertEquals(0, exclude.size());
+        exclude.add("bar");
+        assertEquals("foo;exclude:=\"bar\"", exportedPackage.toParseString());
+        exclude.clear();
+        assertEquals("foo", exportedPackage.toParseString());
+    }
+    
+    @Test
+    public void packageName() {        
+        ExportedPackage exportedPackage = new StandardExportedPackage(this.parser, "foo");
+        assertEquals("foo", exportedPackage.getPackageName());
+        assertEquals("foo", exportedPackage.toParseString());
+        exportedPackage.setPackageName("bar");
+        assertEquals("bar", exportedPackage.getPackageName());
+        assertEquals("bar", exportedPackage.toParseString());
+    }
+    
+    @Test(expected=IllegalArgumentException.class)
+    public void nullPackageName() {        
+        ExportedPackage exportedPackage = new StandardExportedPackage(this.parser, "foo");
+        exportedPackage.setPackageName(null);
+    }
+    
+    @Test
+    public void resetFromParseString() {        
+        ExportedPackage exportedPackage = new StandardExportedPackage(this.parser, "foo");
+        List<HeaderDeclaration> exportPackage = new ArrayList<HeaderDeclaration>();
+        exportPackage.add(new StubHeaderDeclaration("bar"));
+        this.parser.setExportPackage(exportPackage);
+        exportedPackage.resetFromParseString("");
+        assertEquals("bar", exportedPackage.getPackageName());
+    }
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardFragmentHostTests.java b/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardFragmentHostTests.java
new file mode 100755
index 0000000..48b97eb
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardFragmentHostTests.java
@@ -0,0 +1,113 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.internal;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import org.eclipse.virgo.util.osgi.manifest.FragmentHost;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+import org.eclipse.virgo.util.osgi.manifest.FragmentHost.Extension;
+import org.eclipse.virgo.util.osgi.manifest.internal.StandardFragmentHost;
+import org.junit.Test;
+import org.osgi.framework.Constants;
+
+
+public class StandardFragmentHostTests {
+    
+    private final StubHeaderParser parser = new StubHeaderParser();
+    
+    private final FragmentHost fragmentHost = new StandardFragmentHost(this.parser);
+    
+    @Test
+    public void defaults() {
+        assertNull(fragmentHost.getExtension());
+        assertTrue(fragmentHost.getAttributes().isEmpty());
+        assertTrue(fragmentHost.getDirectives().isEmpty());
+    }
+    
+    @Test
+    public void extensionDirective() {
+        this.fragmentHost.setBundleSymbolicName("foo");
+        
+        this.fragmentHost.getDirectives().put(Constants.EXTENSION_DIRECTIVE, Constants.EXTENSION_FRAMEWORK);
+        assertEquals("foo;extension:=\"framework\"", this.fragmentHost.toParseString());
+        
+        this.fragmentHost.getDirectives().put(Constants.EXTENSION_DIRECTIVE, Constants.EXTENSION_BOOTCLASSPATH);
+        assertEquals("foo;extension:=\"bootclasspath\"", this.fragmentHost.toParseString());
+        
+        this.fragmentHost.getDirectives().remove(Constants.EXTENSION_DIRECTIVE);
+        assertEquals("foo", this.fragmentHost.toParseString());
+    }        
+    
+    @Test
+    public void setExtension() {
+        this.fragmentHost.setBundleSymbolicName("foo");
+        
+        this.fragmentHost.setExtension(Extension.FRAMEWORK);
+        assertEquals(Extension.FRAMEWORK, this.fragmentHost.getExtension());
+        assertEquals("foo;extension:=\"framework\"", this.fragmentHost.toParseString());
+        
+        this.fragmentHost.setExtension(Extension.BOOTCLASSPATH);
+        assertEquals(Extension.BOOTCLASSPATH, this.fragmentHost.getExtension());
+        assertEquals("foo;extension:=\"bootclasspath\"", this.fragmentHost.toParseString());
+        
+        this.fragmentHost.setExtension(null);
+        assertNull(this.fragmentHost.getExtension());
+        assertEquals("foo", this.fragmentHost.toParseString());
+    }
+    
+    @Test
+    public void bundleVersionAttribute() {
+        this.fragmentHost.setBundleSymbolicName("foo");
+        this.fragmentHost.getAttributes().put(Constants.BUNDLE_VERSION_ATTRIBUTE, new VersionRange("[1.2.3,2.3.4)").toParseString());
+        assertEquals("foo;bundle-version=\"[1.2.3, 2.3.4)\"", this.fragmentHost.toParseString());
+        
+        this.fragmentHost.getAttributes().remove(Constants.BUNDLE_VERSION_ATTRIBUTE);
+        assertEquals("foo", this.fragmentHost.toParseString());
+    }
+    
+    @Test
+    public void setBundleVersionAttribute() {
+        this.fragmentHost.setBundleSymbolicName("foo");      
+        
+        VersionRange versionRange = new VersionRange("[1.2.3,2.3.4)");
+        this.fragmentHost.setBundleVersion(versionRange);
+        assertEquals(versionRange, this.fragmentHost.getBundleVersion());
+        assertEquals("foo;bundle-version=\"[1.2.3, 2.3.4)\"", this.fragmentHost.toParseString());                
+        
+        this.fragmentHost.setBundleVersion(null);
+        assertEquals(VersionRange.NATURAL_NUMBER_RANGE, this.fragmentHost.getBundleVersion());
+        assertEquals("foo", this.fragmentHost.toParseString());
+    }
+    
+    @Test
+    public void bundleSymbolicName() {
+        this.fragmentHost.setBundleSymbolicName("foo");
+        assertEquals("foo", this.fragmentHost.getBundleSymbolicName());
+        assertEquals("foo", this.fragmentHost.toParseString());
+        
+        this.fragmentHost.setBundleSymbolicName(null);
+        assertNull(this.fragmentHost.getBundleSymbolicName());
+        assertNull(this.fragmentHost.toParseString());
+    }
+    
+    @Test
+    public void resetFromParseString() {
+        StubHeaderDeclaration header = new StubHeaderDeclaration("bar");
+        this.parser.setFragmentHost(header);
+        this.fragmentHost.resetFromParseString("");
+        assertEquals("bar", this.fragmentHost.getBundleSymbolicName());
+        assertEquals("bar", this.fragmentHost.toParseString());
+    }
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardImportBundleTests.java b/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardImportBundleTests.java
new file mode 100755
index 0000000..ed6e70b
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardImportBundleTests.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.internal;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.virgo.util.osgi.manifest.ImportBundle;
+import org.eclipse.virgo.util.osgi.manifest.ImportedBundle;
+import org.eclipse.virgo.util.osgi.manifest.internal.StandardImportBundle;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderDeclaration;
+import org.junit.Test;
+
+
+public class StandardImportBundleTests {
+    @Test
+    public void bundleAddition() {
+        StubHeaderParser parser = new StubHeaderParser();
+        
+        ImportBundle importBundle = new StandardImportBundle(parser);
+        assertEquals(0, importBundle.getImportedBundles().size());
+        assertNull(importBundle.toParseString());
+        
+        importBundle.addImportedBundle("foo");
+        List<ImportedBundle> importedBundles = importBundle.getImportedBundles();
+        assertEquals(1, importedBundles.size());
+        assertEquals("foo", importedBundles.get(0).getBundleSymbolicName());
+        assertEquals("foo", importBundle.toParseString());
+    }
+    
+    @Test
+    public void resetFromParseString() {
+        StubHeaderParser parser = new StubHeaderParser();
+        
+        List<HeaderDeclaration> headers = new ArrayList<HeaderDeclaration>();
+        headers.add(new StubHeaderDeclaration("foo"));
+        headers.add(new StubHeaderDeclaration("bar"));
+        
+        ImportBundle importBundle = new StandardImportBundle(parser);
+        parser.setImportBundle(headers);
+        
+        importBundle.resetFromParseString("");
+        
+        assertEquals(2, importBundle.getImportedBundles().size());
+        
+        assertEquals("foo,bar", importBundle.toParseString());
+        
+        headers.clear();
+        headers.add(new StubHeaderDeclaration("foo", "bar"));
+        
+        importBundle.resetFromParseString("");
+        
+        assertEquals(2, importBundle.getImportedBundles().size());
+        
+        assertEquals("foo,bar", importBundle.toParseString());
+    }
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardImportLibraryTests.java b/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardImportLibraryTests.java
new file mode 100755
index 0000000..5ccc8c8
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardImportLibraryTests.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.internal;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.virgo.util.osgi.manifest.ImportLibrary;
+import org.eclipse.virgo.util.osgi.manifest.ImportedLibrary;
+import org.eclipse.virgo.util.osgi.manifest.internal.StandardImportLibrary;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderDeclaration;
+import org.junit.Test;
+
+
+public class StandardImportLibraryTests {
+    @Test
+    public void libraryAddition() {
+        StubHeaderParser parser = new StubHeaderParser();
+        
+        ImportLibrary importLibrary = new StandardImportLibrary(parser);
+        assertEquals(0, importLibrary.getImportedLibraries().size());
+        assertNull(importLibrary.toParseString());
+        
+        importLibrary.addImportedLibrary("foo");
+        List<ImportedLibrary> importedLibraries = importLibrary.getImportedLibraries();
+        assertEquals(1, importedLibraries.size());
+        assertEquals("foo", importedLibraries.get(0).getLibrarySymbolicName());
+        assertEquals("foo", importLibrary.toParseString());
+    }
+    
+    @Test
+    public void resetFromParseString() {
+        StubHeaderParser parser = new StubHeaderParser();
+        
+        List<HeaderDeclaration> headers = new ArrayList<HeaderDeclaration>();
+        headers.add(new StubHeaderDeclaration("foo"));
+        headers.add(new StubHeaderDeclaration("bar"));
+        
+        ImportLibrary importLibrary = new StandardImportLibrary(parser);
+        parser.setImportLibrary(headers);
+        
+        importLibrary.resetFromParseString("");        
+        
+        assertEquals(2, importLibrary.getImportedLibraries().size());
+        assertEquals("foo,bar", importLibrary.toParseString());
+        
+        headers.clear();
+        headers.add(new StubHeaderDeclaration("bar", "foo"));
+        
+        importLibrary.resetFromParseString("");
+        
+        assertEquals(2, importLibrary.getImportedLibraries().size());
+        assertEquals("bar,foo", importLibrary.toParseString());
+    }
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardImportPackageTests.java b/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardImportPackageTests.java
new file mode 100755
index 0000000..29ac8d6
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardImportPackageTests.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.internal;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.virgo.util.osgi.manifest.ImportPackage;
+import org.eclipse.virgo.util.osgi.manifest.ImportedPackage;
+import org.eclipse.virgo.util.osgi.manifest.internal.StandardImportPackage;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderDeclaration;
+import org.junit.Test;
+
+
+public class StandardImportPackageTests {
+    
+    @Test
+    public void packageAddition() {
+        StubHeaderParser parser = new StubHeaderParser();
+        
+        ImportPackage importPackage = new StandardImportPackage(parser);
+        assertEquals(0, importPackage.getImportedPackages().size());
+        assertNull(importPackage.toParseString());
+        
+        importPackage.addImportedPackage("foo");
+        List<ImportedPackage> importedPackages = importPackage.getImportedPackages();
+        assertEquals(1, importedPackages.size());
+        assertEquals("foo", importedPackages.get(0).getPackageName());
+        assertEquals("foo", importPackage.toParseString());
+    }
+    
+    @Test
+    public void resetFromParseString() {
+        StubHeaderParser parser = new StubHeaderParser();
+        
+        List<HeaderDeclaration> headers = new ArrayList<HeaderDeclaration>();
+        headers.add(new StubHeaderDeclaration("foo"));
+        headers.add(new StubHeaderDeclaration("bar"));
+        
+        ImportPackage importPackage = new StandardImportPackage(parser);
+        parser.setImportPackage(headers);
+        
+        importPackage.resetFromParseString("");
+        
+        assertEquals(2, importPackage.getImportedPackages().size());
+        assertEquals("foo,bar", importPackage.toParseString());
+        
+        headers.clear();
+        headers.add(new StubHeaderDeclaration("bar", "foo"));
+        
+        importPackage.resetFromParseString("");
+        
+        assertEquals(2, importPackage.getImportedPackages().size());
+        assertEquals("bar,foo", importPackage.toParseString());
+    }
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardImportedBundleTests.java b/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardImportedBundleTests.java
new file mode 100755
index 0000000..96283e4
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardImportedBundleTests.java
@@ -0,0 +1,125 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.internal;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.virgo.util.osgi.manifest.ImportedBundle;
+import org.eclipse.virgo.util.osgi.manifest.Resolution;
+import org.eclipse.virgo.util.osgi.manifest.Sharing;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+import org.eclipse.virgo.util.osgi.manifest.internal.StandardImportedBundle;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderDeclaration;
+import org.junit.Test;
+
+
+public class StandardImportedBundleTests {
+    
+    private StubHeaderParser parser = new StubHeaderParser();
+    
+    private ImportedBundle importedBundle = new StandardImportedBundle(this.parser, "foo");
+    
+    @Test
+    public void defaults() {
+        assertFalse(importedBundle.isApplicationImportScope());
+        assertEquals(Resolution.MANDATORY, importedBundle.getResolution());
+        assertTrue(importedBundle.getAttributes().isEmpty());
+        assertTrue(importedBundle.getDirectives().isEmpty());
+        assertEquals(Sharing.AUTOMATIC, importedBundle.getSharing());
+        assertEquals(VersionRange.NATURAL_NUMBER_RANGE, importedBundle.getVersion());
+        assertEquals("foo", importedBundle.getBundleSymbolicName());
+    }
+    
+    @Test
+    public void resolutionDirective() {
+        importedBundle.setResolution(Resolution.OPTIONAL);
+        assertEquals(Resolution.OPTIONAL, importedBundle.getResolution());
+        assertEquals("foo;resolution:=\"optional\"", importedBundle.toParseString());
+        
+        importedBundle.setResolution(Resolution.MANDATORY);
+        assertEquals(Resolution.MANDATORY, importedBundle.getResolution());
+        assertEquals("foo", importedBundle.toParseString());
+        
+        importedBundle.setResolution(null);
+        assertEquals(Resolution.MANDATORY, importedBundle.getResolution());
+        assertEquals("foo", importedBundle.toParseString());
+    }
+    
+    @Test
+    public void sharingDirective() {
+        importedBundle.setSharing(Sharing.CLONE);
+        assertEquals(Sharing.CLONE, importedBundle.getSharing());
+        assertEquals("foo;sharing:=\"clone\"", importedBundle.toParseString());
+        
+        importedBundle.setSharing(Sharing.AUTOMATIC);
+        assertEquals(Sharing.AUTOMATIC, importedBundle.getSharing());
+        assertEquals("foo", importedBundle.toParseString());
+        
+        importedBundle.setSharing(Sharing.SHARE);
+        assertEquals(Sharing.SHARE, importedBundle.getSharing());
+        assertEquals("foo;sharing:=\"share\"", importedBundle.toParseString());         
+        
+        importedBundle.setSharing(null);
+        assertEquals(Sharing.AUTOMATIC, importedBundle.getSharing());
+        assertEquals("foo", importedBundle.toParseString());
+    }
+    
+    @Test
+    public void importScope() {
+        importedBundle.setApplicationImportScope(true);
+        assertTrue(importedBundle.isApplicationImportScope());
+        assertEquals("foo;import-scope:=\"application\"", importedBundle.toParseString());
+        
+        importedBundle.setApplicationImportScope(false);
+        assertFalse(importedBundle.isApplicationImportScope());
+        assertEquals("foo", importedBundle.toParseString());
+    }
+    
+    @Test
+    public void bundleSymbolicName() {
+        importedBundle.setBundleSymbolicName("bar");
+        assertEquals("bar", importedBundle.getBundleSymbolicName());
+        assertEquals("bar", importedBundle.toParseString());
+    }
+    
+    @Test(expected=IllegalArgumentException.class)
+    public void nullSymbolicName() {
+        importedBundle.setBundleSymbolicName(null);
+    }
+    
+    @Test
+    public void resetFromParseString() {
+        List<HeaderDeclaration> headers = new ArrayList<HeaderDeclaration>();
+        headers.add(new StubHeaderDeclaration("bar"));
+        this.parser.setImportBundle(headers);
+        this.importedBundle.resetFromParseString("");
+        assertEquals("bar", this.importedBundle.getBundleSymbolicName());
+    }
+    
+    @Test 
+    public void versionAttribute() {
+        VersionRange versionRange = new VersionRange("[1.2.3,2.0)");
+        
+        importedBundle.setVersion(versionRange);
+        assertEquals(versionRange, importedBundle.getVersion());
+        assertEquals("foo;version=\"[1.2.3, 2.0.0)\"", importedBundle.toParseString());
+        
+        importedBundle.setVersion(null);
+        assertEquals(VersionRange.NATURAL_NUMBER_RANGE, this.importedBundle.getVersion());
+        assertEquals("foo", this.importedBundle.toParseString());
+    }
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardImportedLibraryTests.java b/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardImportedLibraryTests.java
new file mode 100755
index 0000000..75551a3
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardImportedLibraryTests.java
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.internal;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.virgo.util.osgi.manifest.ImportedLibrary;
+import org.eclipse.virgo.util.osgi.manifest.Resolution;
+import org.eclipse.virgo.util.osgi.manifest.Sharing;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+import org.eclipse.virgo.util.osgi.manifest.internal.StandardImportedLibrary;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderDeclaration;
+import org.junit.Test;
+
+
+public class StandardImportedLibraryTests {
+    
+private StubHeaderParser parser = new StubHeaderParser();
+    
+    private ImportedLibrary importedLibrary = new StandardImportedLibrary(this.parser, "foo");
+    
+    @Test
+    public void defaults() {        
+        assertEquals(Resolution.MANDATORY, importedLibrary.getResolution());
+        assertTrue(importedLibrary.getAttributes().isEmpty());
+        assertTrue(importedLibrary.getDirectives().isEmpty());
+        assertEquals(Sharing.AUTOMATIC, importedLibrary.getSharing());
+        assertEquals(VersionRange.NATURAL_NUMBER_RANGE, importedLibrary.getVersion());
+        assertEquals("foo", importedLibrary.getLibrarySymbolicName());
+    }
+    
+    @Test
+    public void resolutionDirective() {
+        importedLibrary.setResolution(Resolution.OPTIONAL);
+        assertEquals(Resolution.OPTIONAL, importedLibrary.getResolution());
+        assertEquals("foo;resolution:=\"optional\"", importedLibrary.toParseString());
+        
+        importedLibrary.setResolution(Resolution.MANDATORY);
+        assertEquals(Resolution.MANDATORY, importedLibrary.getResolution());
+        assertEquals("foo", importedLibrary.toParseString());
+        
+        importedLibrary.setResolution(null);
+        assertEquals(Resolution.MANDATORY, importedLibrary.getResolution());
+        assertEquals("foo", importedLibrary.toParseString());
+    }
+    
+    @Test
+    public void sharingDirective() {
+        importedLibrary.setSharing(Sharing.CLONE);
+        assertEquals(Sharing.CLONE, importedLibrary.getSharing());
+        assertEquals("foo;sharing:=\"clone\"", importedLibrary.toParseString());
+        
+        importedLibrary.setSharing(Sharing.AUTOMATIC);
+        assertEquals(Sharing.AUTOMATIC, importedLibrary.getSharing());
+        assertEquals("foo", importedLibrary.toParseString());
+        
+        importedLibrary.setSharing(Sharing.SHARE);
+        assertEquals(Sharing.SHARE, importedLibrary.getSharing());
+        assertEquals("foo;sharing:=\"share\"", importedLibrary.toParseString());         
+        
+        importedLibrary.setSharing(null);
+        assertEquals(Sharing.AUTOMATIC, importedLibrary.getSharing());
+        assertEquals("foo", importedLibrary.toParseString());
+    }
+    
+    @Test
+    public void librarySymbolicName() {
+        importedLibrary.setLibrarySymbolicName("bar");
+        assertEquals("bar", importedLibrary.getLibrarySymbolicName());
+        assertEquals("bar", importedLibrary.toParseString());
+    }
+    
+    @Test(expected=IllegalArgumentException.class)
+    public void nullSymbolicName() {
+        importedLibrary.setLibrarySymbolicName(null);
+    }
+    
+    @Test
+    public void resetFromParseString() {
+        List<HeaderDeclaration> headers = new ArrayList<HeaderDeclaration>();
+        headers.add(new StubHeaderDeclaration("bar"));
+        this.parser.setImportLibrary(headers);
+        this.importedLibrary.resetFromParseString("");
+        assertEquals("bar", this.importedLibrary.getLibrarySymbolicName());
+    }
+    
+    @Test 
+    public void versionAttribute() {
+        VersionRange versionRange = new VersionRange("[1.2.3,2.0)");
+        
+        importedLibrary.setVersion(versionRange);
+        assertEquals(versionRange, importedLibrary.getVersion());
+        assertEquals("foo;version=\"[1.2.3, 2.0.0)\"", importedLibrary.toParseString());
+        
+        importedLibrary.setVersion(null);
+        assertEquals(VersionRange.NATURAL_NUMBER_RANGE, this.importedLibrary.getVersion());
+        assertEquals("foo", this.importedLibrary.toParseString());
+    }
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardImportedPackageTests.java b/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardImportedPackageTests.java
new file mode 100755
index 0000000..78c8364
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardImportedPackageTests.java
@@ -0,0 +1,104 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.internal;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.virgo.util.osgi.manifest.ImportedPackage;
+import org.eclipse.virgo.util.osgi.manifest.Resolution;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+import org.eclipse.virgo.util.osgi.manifest.internal.StandardImportedPackage;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderDeclaration;
+import org.junit.Test;
+
+
+public class StandardImportedPackageTests {
+    
+    private StubHeaderParser parser = new StubHeaderParser();
+    
+    private ImportedPackage importedPackage = new StandardImportedPackage(this.parser, "foo");
+    
+    @Test
+    public void defaults() {
+        assertEquals(Resolution.MANDATORY, importedPackage.getResolution());
+        assertTrue(importedPackage.getAttributes().isEmpty());
+        assertTrue(importedPackage.getDirectives().isEmpty());
+        assertEquals(VersionRange.NATURAL_NUMBER_RANGE, importedPackage.getVersion());
+        assertEquals("foo", importedPackage.getPackageName());
+    }
+    
+    @Test
+    public void resolutionDirective() {
+        importedPackage.setResolution(Resolution.OPTIONAL);
+        assertEquals(Resolution.OPTIONAL, importedPackage.getResolution());
+        assertEquals("foo;resolution:=\"optional\"", importedPackage.toParseString());
+        
+        importedPackage.setResolution(Resolution.MANDATORY);
+        assertEquals(Resolution.MANDATORY, importedPackage.getResolution());
+        assertEquals("foo", importedPackage.toParseString());
+        
+        importedPackage.setResolution(null);
+        assertEquals(Resolution.MANDATORY, importedPackage.getResolution());
+        assertEquals("foo", importedPackage.toParseString());
+    }
+    
+    @Test
+    public void packageName() {
+        importedPackage.setPackageName("bar");
+        assertEquals("bar", importedPackage.getPackageName());
+        assertEquals("bar", importedPackage.toParseString());
+    }
+    
+    @Test
+    public void bundleSymbolicName() {
+        importedPackage.setBundleSymbolicName("bsn");
+        assertEquals("bsn", importedPackage.getBundleSymbolicName());
+    }
+    
+    @Test
+    public void bundleVersion() {
+        VersionRange versionRange = new VersionRange("[1.2.3.f,1.3.4.g)");
+        importedPackage.setBundleVersion(versionRange);
+        assertEquals(versionRange, importedPackage.getBundleVersion());
+    }
+    
+    @Test(expected=IllegalArgumentException.class)
+    public void nullSymbolicName() {
+        importedPackage.setPackageName(null);
+    }
+    
+    @Test
+    public void resetFromParseString() {
+        List<HeaderDeclaration> headers = new ArrayList<HeaderDeclaration>();
+        headers.add(new StubHeaderDeclaration("bar"));
+        this.parser.setImportPackage(headers);
+        this.importedPackage.resetFromParseString("");
+        assertEquals("bar", this.importedPackage.getPackageName());
+    }
+    
+    @Test 
+    public void versionAttribute() {
+        VersionRange versionRange = new VersionRange("[1.2.3,2.0)");
+        
+        importedPackage.setVersion(versionRange);
+        assertEquals(versionRange, importedPackage.getVersion());
+        assertEquals("foo;version=\"[1.2.3, 2.0.0)\"", importedPackage.toParseString());
+        
+        importedPackage.setVersion(null);
+        assertEquals(VersionRange.NATURAL_NUMBER_RANGE, this.importedPackage.getVersion());
+        assertEquals("foo", this.importedPackage.toParseString());
+    }
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardRequireBundleTests.java b/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardRequireBundleTests.java
new file mode 100755
index 0000000..9f30236
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardRequireBundleTests.java
@@ -0,0 +1,110 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.internal;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.virgo.util.osgi.manifest.RequireBundle;
+import org.eclipse.virgo.util.osgi.manifest.RequiredBundle;
+import org.eclipse.virgo.util.osgi.manifest.internal.StandardRequireBundle;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderDeclaration;
+import org.junit.Ignore;
+import org.junit.Test;
+
+
+public class StandardRequireBundleTests {
+
+    @Test
+    public void defaults() {
+        assertEquals(0, new StandardRequireBundle(new StubHeaderParser()).getRequiredBundles().size());
+    }
+
+    @Test
+    public void requiredBundleAddition() {
+        StubHeaderParser parser = new StubHeaderParser();
+        List<HeaderDeclaration> headers = new ArrayList<HeaderDeclaration>();
+        headers.add(new StubHeaderDeclaration());
+
+        parser.setRequireBundle(headers);
+        RequireBundle requireBundle = new StandardRequireBundle(parser);
+        assertEquals(0, requireBundle.getRequiredBundles().size());
+
+        RequiredBundle newRequiredBundle = requireBundle.addRequiredBundle("bar");
+        List<RequiredBundle> requiredBundles = requireBundle.getRequiredBundles();
+        assertEquals(1, requiredBundles.size());
+        assertEquals("bar", requiredBundles.get(0).getBundleSymbolicName());
+        assertEquals(newRequiredBundle, requiredBundles.get(0));
+    }
+
+    @Test
+    public void requiredBundleListAddition() {
+        StubHeaderParser parser = new StubHeaderParser();
+        List<HeaderDeclaration> headers = new ArrayList<HeaderDeclaration>();
+        headers.add(new StubHeaderDeclaration());
+
+        parser.setRequireBundle(headers);
+        RequireBundle requireBundle = new StandardRequireBundle(parser);
+
+        RequiredBundle newRequiredBundle = requireBundle.addRequiredBundle("foo");
+        List<RequiredBundle> requiredBundles = requireBundle.getRequiredBundles();
+        requiredBundles.clear();
+        assertEquals(0, requiredBundles.size());
+        requiredBundles.add(newRequiredBundle);
+        assertEquals(1, requiredBundles.size());
+        assertEquals("foo", requiredBundles.get(0).getBundleSymbolicName());
+
+        {
+            StubHeaderParser parser2 = new StubHeaderParser();
+            List<HeaderDeclaration> headers2 = new ArrayList<HeaderDeclaration>();
+            headers2.add(new StubHeaderDeclaration());
+
+            parser2.setRequireBundle(headers2);
+            requiredBundles.add(new StandardRequireBundle(parser2).addRequiredBundle("bar"));
+            assertEquals(2, requiredBundles.size());
+            assertEquals("foo", requiredBundles.get(0).getBundleSymbolicName());
+            assertEquals("bar", requiredBundles.get(1).getBundleSymbolicName());
+        }
+    }
+    
+    @Test
+    public void parse() {
+        StubHeaderParser parser = new StubHeaderParser();
+        List<HeaderDeclaration> headers = new ArrayList<HeaderDeclaration>();
+        headers.add(new StubHeaderDeclaration("foo"));
+
+        parser.setRequireBundle(headers);
+        RequireBundle requireBundle = new StandardRequireBundle(parser);
+        requireBundle.resetFromParseString("bar");
+        List<RequiredBundle> requiredBundles = requireBundle.getRequiredBundles();
+        assertEquals(1, requiredBundles.size());
+        assertEquals("foo", requiredBundles.get(0).getBundleSymbolicName());
+    }
+
+    @Test
+    @Ignore("[DMS-2887]")
+    public void requiredBundleDuplicateListAddition() {
+        StubHeaderParser parser = new StubHeaderParser();
+        List<HeaderDeclaration> headers = new ArrayList<HeaderDeclaration>();
+        headers.add(new StubHeaderDeclaration());
+
+        parser.setRequireBundle(headers);
+        RequireBundle requireBundle = new StandardRequireBundle(parser);
+
+        RequiredBundle newRequiredBundle = requireBundle.addRequiredBundle("foo");
+        List<RequiredBundle> requiredBundles = requireBundle.getRequiredBundles();
+        requiredBundles.add(newRequiredBundle);
+        assertEquals(1, requiredBundles.size()); // or expect an exception
+    }
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardRequiredBundleTests.java b/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardRequiredBundleTests.java
new file mode 100755
index 0000000..c6848af
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StandardRequiredBundleTests.java
@@ -0,0 +1,131 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.internal;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+
+import org.eclipse.virgo.util.osgi.manifest.RequiredBundle;
+import org.eclipse.virgo.util.osgi.manifest.Resolution;
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+import org.eclipse.virgo.util.osgi.manifest.RequiredBundle.Visibility;
+import org.eclipse.virgo.util.osgi.manifest.internal.StandardRequiredBundle;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderDeclaration;
+import org.junit.Test;
+import org.osgi.framework.Constants;
+
+
+public class StandardRequiredBundleTests {
+
+    @Test
+    public void defaults() {
+        RequiredBundle requiredBundle = new StandardRequiredBundle(new StubHeaderParser(), null);
+        assertTrue(requiredBundle.getDirectives().isEmpty());
+        assertTrue(requiredBundle.getAttributes().isEmpty());
+        assertEquals(Resolution.MANDATORY, requiredBundle.getResolution());
+        assertEquals(Visibility.PRIVATE, requiredBundle.getVisibility());
+        assertNull(requiredBundle.toParseString());
+    }
+    
+    @Test
+    public void resetFromParseString() {
+        StubHeaderParser parser = new StubHeaderParser();
+        ArrayList<HeaderDeclaration> requireBundle = new ArrayList<HeaderDeclaration>();
+        requireBundle.add(new StubHeaderDeclaration("x"));
+        parser.setRequireBundle(requireBundle);
+        RequiredBundle requiredBundle = new StandardRequiredBundle(parser, "");
+        requiredBundle.resetFromParseString("foo");
+    }
+
+    @Test
+    public void symbolicName() {
+        RequiredBundle requiredBundle = new StandardRequiredBundle(new StubHeaderParser(), "foo");
+        assertEquals("foo", requiredBundle.getBundleSymbolicName());
+        assertEquals("foo", requiredBundle.toParseString());
+        requiredBundle.setBundleSymbolicName("bar");
+        assertEquals("bar", requiredBundle.getBundleSymbolicName());
+        assertEquals("bar", requiredBundle.toParseString());
+    }
+    
+    @Test(expected=IllegalArgumentException.class)
+    public void setNullSymbolicName() {
+        RequiredBundle requiredBundle = new StandardRequiredBundle(new StubHeaderParser(), "");
+        requiredBundle.setBundleSymbolicName(null);
+    }
+
+    @Test
+    public void resolution() {
+        RequiredBundle requiredBundle = new StandardRequiredBundle(new StubHeaderParser(), "foo");
+        requiredBundle.setResolution(Resolution.OPTIONAL);
+        assertEquals(Resolution.OPTIONAL, requiredBundle.getResolution());
+        assertEquals("foo;resolution:=\"optional\"", requiredBundle.toParseString());
+        requiredBundle.setResolution(Resolution.MANDATORY);
+        assertEquals(Resolution.MANDATORY, requiredBundle.getResolution());
+        assertEquals("foo", requiredBundle.toParseString());
+    }
+    
+    @Test
+    public void setNullResolution() {
+        RequiredBundle requiredBundle = new StandardRequiredBundle(new StubHeaderParser(), "foo");
+        requiredBundle.setResolution(null);
+        assertEquals(Resolution.MANDATORY, requiredBundle.getResolution());
+        assertEquals("foo", requiredBundle.toParseString());
+    }
+    
+    @Test
+    public void visibility() {
+        RequiredBundle requiredBundle = new StandardRequiredBundle(new StubHeaderParser(), "foo");
+        requiredBundle.setVisibility(Visibility.REEXPORT);
+        assertEquals(Visibility.REEXPORT, requiredBundle.getVisibility());
+        assertEquals("foo;visibility:=\"reexport\"", requiredBundle.toParseString());
+        requiredBundle.setVisibility(Visibility.PRIVATE);
+        assertEquals(Visibility.PRIVATE, requiredBundle.getVisibility());
+        assertEquals("foo", requiredBundle.toParseString());
+    }
+    
+    @Test
+    public void setNullVisibility() {
+        RequiredBundle requiredBundle = new StandardRequiredBundle(new StubHeaderParser(), "foo");
+        requiredBundle.setVisibility(null);
+        assertEquals(Visibility.PRIVATE, requiredBundle.getVisibility());
+        assertEquals("foo", requiredBundle.toParseString());
+    }
+    
+    @Test
+    public void bundleVersionAttribute() {
+        RequiredBundle requiredBundle = new StandardRequiredBundle(new StubHeaderParser(), "foo");
+        requiredBundle.setBundleSymbolicName("foo");
+        requiredBundle.getAttributes().put(Constants.BUNDLE_VERSION_ATTRIBUTE, new VersionRange("[1.2.3,2.3.4)").toParseString());
+        assertEquals("foo;bundle-version=\"[1.2.3, 2.3.4)\"", requiredBundle.toParseString());
+        
+        requiredBundle.getAttributes().remove(Constants.BUNDLE_VERSION_ATTRIBUTE);
+        assertEquals("foo", requiredBundle.toParseString());
+    }
+    
+    @Test
+    public void setBundleVersionAttribute() {
+        RequiredBundle requiredBundle = new StandardRequiredBundle(new StubHeaderParser(), "foo");
+        requiredBundle.setBundleSymbolicName("foo");      
+        
+        VersionRange versionRange = new VersionRange("[1.2.3,2.3.4)");
+        requiredBundle.setBundleVersion(versionRange);
+        assertEquals(versionRange, requiredBundle.getBundleVersion());
+        assertEquals("foo;bundle-version=\"[1.2.3, 2.3.4)\"", requiredBundle.toParseString());                
+        
+        requiredBundle.setBundleVersion(null);
+        assertEquals(VersionRange.NATURAL_NUMBER_RANGE, requiredBundle.getBundleVersion());
+        assertEquals("foo", requiredBundle.toParseString());
+    }
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StubHeaderDeclaration.java b/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StubHeaderDeclaration.java
new file mode 100755
index 0000000..c9905e9
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StubHeaderDeclaration.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.internal;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderDeclaration;
+
+
+public class StubHeaderDeclaration implements HeaderDeclaration {
+    
+    private Map<String, String> attributes;
+    
+    private Map<String, String> directives;
+    
+    private List<String> names;
+    
+    StubHeaderDeclaration(String... names) {
+        this(new HashMap<String, String>(), new HashMap<String, String>(), names);
+    }
+    
+    StubHeaderDeclaration(Map<String, String> attributes, Map<String, String> directives, String... names) {
+        this.attributes = attributes;
+        
+        this.directives = directives;
+        
+        this.names = Arrays.asList(names);
+    }
+
+    public Map<String, String> getAttributes() {
+        return this.attributes;
+    }
+
+    public Map<String, String> getDirectives() {
+        return this.directives;
+    }
+
+    public List<String> getNames() {
+        return this.names;
+    }
+
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StubHeaderParser.java b/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StubHeaderParser.java
new file mode 100755
index 0000000..7a6bbe9
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/StubHeaderParser.java
@@ -0,0 +1,141 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.internal;
+
+import java.util.List;
+
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderDeclaration;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderParser;
+import org.osgi.framework.Constants;
+
+
+public class StubHeaderParser implements HeaderParser {
+    
+    private HeaderDeclaration bundleActivationPolicy;
+    
+    private HeaderDeclaration bundleSymbolicName;
+    
+    private List<HeaderDeclaration> dynamicImportPackage;
+    
+    private HeaderDeclaration fragmentHost;
+    
+    private List<HeaderDeclaration> importBundle;
+    
+    private List<HeaderDeclaration> importLibrary;
+    
+    private List<HeaderDeclaration> importPackage;
+    
+    private HeaderDeclaration librarySymbolicName;
+    
+    private List<HeaderDeclaration> requireBundle;
+
+    private List<HeaderDeclaration> exportPackage;
+
+    public HeaderDeclaration parseBundleActivationPolicy(String header) {
+        return this.bundleActivationPolicy;
+    }
+
+    public HeaderDeclaration parseBundleSymbolicName(String header) {
+        return this.bundleSymbolicName;
+    }
+
+    public List<HeaderDeclaration> parseDynamicImportPackageHeader(String header) {
+        return this.dynamicImportPackage;
+    }
+
+    public HeaderDeclaration parseFragmentHostHeader(String header) {
+        return this.fragmentHost;
+    }
+
+    public List<HeaderDeclaration> parseHeader(String header) {
+        return null;
+    }
+
+    public List<HeaderDeclaration> parseImportBundleHeader(String header) {
+        return this.importBundle;
+    }
+
+    public List<HeaderDeclaration> parseImportLibraryHeader(String header) {
+        return this.importLibrary;
+    }
+
+    public HeaderDeclaration parseLibrarySymbolicName(String header) {
+        return this.librarySymbolicName;
+    }
+
+    public List<HeaderDeclaration> parsePackageHeader(String header, String headerType) {
+        if (headerType.equals(Constants.IMPORT_PACKAGE)) {
+            return this.importPackage;
+        } else if (headerType.equals(Constants.EXPORT_PACKAGE)) {
+            return this.exportPackage;
+        }
+        return null;
+    }
+
+    public List<HeaderDeclaration> parseRequireBundleHeader(String header) {
+        return this.requireBundle;
+    }
+
+    public List<HeaderDeclaration> parseWebFilterMappingsHeader(String header) {
+        return null;
+    }
+
+    
+    void setBundleActivationPolicy(HeaderDeclaration bundleActivationPolicy) {
+        this.bundleActivationPolicy = bundleActivationPolicy;
+    }
+
+    
+    void setBundleSymbolicName(HeaderDeclaration bundleSymbolicName) {
+        this.bundleSymbolicName = bundleSymbolicName;
+    }
+
+    
+    void setDynamicImportPackage(List<HeaderDeclaration> dynamicImportPackage) {
+        this.dynamicImportPackage = dynamicImportPackage;
+    }
+
+    
+    void setFragmentHost(HeaderDeclaration fragmentHost) {
+        this.fragmentHost = fragmentHost;
+    }
+
+    
+    void setImportBundle(List<HeaderDeclaration> importBundle) {
+        this.importBundle = importBundle;
+    }
+
+    
+    void setImportLibrary(List<HeaderDeclaration> importLibrary) {
+        this.importLibrary = importLibrary;
+    }
+
+    
+    void setImportPackage(List<HeaderDeclaration> importPackage) {
+        this.importPackage = importPackage;
+    }
+
+    
+    void setLibrarySymbolicName(HeaderDeclaration librarySymbolicName) {
+        this.librarySymbolicName = librarySymbolicName;
+    }
+
+    
+    void setRequireBundle(List<HeaderDeclaration> requireBundle) {
+        this.requireBundle = requireBundle;
+    }
+
+    
+    void setExportPackage(List<HeaderDeclaration> exportPackage) {
+        this.exportPackage = exportPackage;
+    }
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/VersionRangeTests.java b/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/VersionRangeTests.java
new file mode 100755
index 0000000..dfd133d
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/internal/VersionRangeTests.java
@@ -0,0 +1,196 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.internal;
+
+import org.eclipse.virgo.util.osgi.manifest.VersionRange;
+import org.junit.Assert;
+import org.junit.Test;
+import org.osgi.framework.Version;
+
+public class VersionRangeTests {
+
+    @Test
+    public void floorInclusive() {
+        VersionRange versionRange = new VersionRange("[1.0,2.0)");
+        Assert.assertTrue(versionRange.isFloorInclusive());
+
+        versionRange = new VersionRange("(1.0,2.0)");
+        Assert.assertFalse(versionRange.isFloorInclusive());
+    }
+
+    @Test
+    public void ceilingInclusive() {
+        VersionRange versionRange = new VersionRange("[1.0,2.0)");
+        Assert.assertFalse(versionRange.isCeilingInclusive());
+
+        versionRange = new VersionRange("(1.0,2.0)");
+        Assert.assertFalse(versionRange.isCeilingInclusive());
+    }
+
+    @Test
+    public void getFloor() {
+        VersionRange versionRange = new VersionRange("[1.0.0.ga,2.0.0.ga)");
+        Version floor = versionRange.getFloor();
+        Assert.assertTrue(floor.equals(new Version("1.0.0.ga")));
+    }
+
+    @Test
+    public void getCeiling() {
+        VersionRange versionRange = new VersionRange("[1.0.0.ga,2.5.6.ga)");
+        Version ceiling = versionRange.getCeiling();
+        Assert.assertTrue(ceiling.equals(new Version("2.5.6.ga")));
+    }
+
+    @Test
+    public void openEndedRange() {
+        VersionRange versionRange = new VersionRange("1.2.3.four");
+        Assert.assertTrue(versionRange.getFloor().equals(new Version("1.2.3.four")));
+        Assert.assertTrue(versionRange.isFloorInclusive());
+        Assert.assertNull(versionRange.getCeiling());
+    }
+
+    @Test
+    public void includesVersionInMiddleOfRange() {
+        VersionRange versionRange = new VersionRange("[1.0.0, 2.0.0)");
+        Assert.assertTrue(versionRange.includes(new Version("1.5.0")));
+    }
+
+    @Test
+    public void includesVersionAtBottomOfFloorInclusiveRange() {
+        VersionRange versionRange = new VersionRange("[1.0.0, 2.0.0)");
+        Assert.assertTrue(versionRange.includes(new Version("1.0.0")));
+    }
+
+    @Test
+    public void excludesVersionAtBottomOfFloorExclusiveRange() {
+        VersionRange versionRange = new VersionRange("(1.0.0, 2.0.0)");
+        Assert.assertFalse(versionRange.includes(new Version("1.0.0")));
+    }
+
+    @Test
+    public void includesVersionAtTopOfCeilingInclusiveRange() {
+        VersionRange versionRange = new VersionRange("[1.0.0, 2.0.0]");
+        Assert.assertTrue(versionRange.includes(new Version("2.0.0")));
+    }
+
+    @Test
+    public void excludesVersionAtTopOfCeilingExclusiveRange() {
+        VersionRange versionRange = new VersionRange("(1.0.0, 2.0.0)");
+        Assert.assertFalse(versionRange.includes(new Version("2.0.0")));
+    }
+
+    @Test
+    public void intersectionOfDisjointRanges() {
+        VersionRange rangeOne = new VersionRange("[1.0.0,2.0.0)");
+        VersionRange rangeTwo = new VersionRange("[2.0.0,3.0.0)");
+
+        VersionRange intersection = VersionRange.intersection(rangeOne, rangeTwo);
+        Assert.assertTrue(intersection.equals(new VersionRange("[2,2)")));
+    }
+
+    @Test
+    public void intersectionOfEntirelyOverlappingRanges() {
+        VersionRange rangeOne = new VersionRange("[1.0.0,2.0.0)");
+        VersionRange rangeTwo = new VersionRange("[1.5.0,1.8.0)");
+
+        VersionRange intersection = VersionRange.intersection(rangeOne, rangeTwo);
+        Assert.assertTrue(intersection.equals(rangeTwo));
+
+        intersection = VersionRange.intersection(rangeTwo, rangeOne);
+        Assert.assertTrue(intersection.equals(rangeTwo));
+    }
+
+    @Test
+    public void intersectionOfPartiallyOverlappingRanges() {
+        VersionRange rangeOne = new VersionRange("[1.0.0,2.0.0]");
+        VersionRange rangeTwo = new VersionRange("(1.5.0,3.0.0)");
+
+        VersionRange intersection = VersionRange.intersection(rangeOne, rangeTwo);
+        Assert.assertTrue(intersection.equals(new VersionRange("(1.5.0, 2.0.0]")));
+
+        intersection = VersionRange.intersection(rangeTwo, rangeOne);
+        Assert.assertTrue(intersection.equals(new VersionRange("(1.5.0, 2.0.0]")));
+    }
+
+    @Test
+    public void intersectionOfRangesWithEqualFloors() {
+        VersionRange rangeOne = new VersionRange("[1.0.0,2.0.0]");
+        VersionRange rangeTwo = new VersionRange("(1.0.0,3.0.0)");
+
+        VersionRange intersection = VersionRange.intersection(rangeOne, rangeTwo);
+        Assert.assertTrue(intersection.equals(new VersionRange("(1.0.0, 2.0.0]")));
+
+        intersection = VersionRange.intersection(rangeTwo, rangeOne);
+        Assert.assertTrue(intersection.equals(new VersionRange("(1.0.0, 2.0.0]")));
+    }
+
+    @Test
+    public void intersectionOfRangesWithEqualCeilings() {
+        VersionRange rangeOne = new VersionRange("[1.0.0,2.0.0]");
+        VersionRange rangeTwo = new VersionRange("[0.5.0,2.0.0)");
+
+        VersionRange intersection = VersionRange.intersection(rangeOne, rangeTwo);
+        Assert.assertTrue(intersection.equals(new VersionRange("[1.0.0, 2.0.0)")));
+
+        intersection = VersionRange.intersection(rangeTwo, rangeOne);
+        Assert.assertTrue(intersection.equals(new VersionRange("[1.0.0, 2.0.0)")));
+    }
+
+    @Test
+    public void intersectionWithOpenedEndedRanges() {
+        VersionRange rangeOne = new VersionRange("1.5");
+        VersionRange rangeTwo = new VersionRange("2.0");
+
+        VersionRange intersection = VersionRange.intersection(rangeOne, rangeTwo);
+        Assert.assertTrue(intersection.equals(new VersionRange("2.0")));
+
+        intersection = VersionRange.intersection(rangeTwo, rangeOne);
+        Assert.assertTrue(intersection.equals(new VersionRange("2.0")));
+    }
+
+    @Test
+    public void exactRange() {
+        Version version = new Version(1, 2, 3);
+        VersionRange range = VersionRange.createExactRange(version);
+        Assert.assertTrue(range.isFloorInclusive());
+        Assert.assertTrue(range.isCeilingInclusive());
+        Assert.assertEquals(version, range.getFloor());
+        Assert.assertEquals(version, range.getCeiling());
+        Assert.assertTrue(range.isExact());
+    }
+
+    @Test
+    public void exactCheck() {
+        VersionRange range = new VersionRange("[1.2.3,1.2.3]");
+        Assert.assertTrue(range.isExact());
+    }
+
+    @Test
+    public void maximalNumeric() {
+        VersionRange range = new VersionRange("0");
+        Version high = new Version(Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE, "a");
+        Assert.assertTrue(range.includes(high));
+    }
+
+    @Test
+    public void equalityOfEmptyRanges() {
+        VersionRange[] emptyRanges = { new VersionRange("[2,1]"), new VersionRange("(4,3)"), new VersionRange("[6,5)"), new VersionRange("(7,6]") };
+
+        for (int i = 0; i < emptyRanges.length; i++) {
+            Assert.assertTrue(emptyRanges[i].isEmpty());
+            for (int j = i + 1; j < emptyRanges.length; j++) {
+                Assert.assertEquals(emptyRanges[i], emptyRanges[j]);
+            }
+        }
+    }
+
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/StandardHeaderLexerTests.java b/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/StandardHeaderLexerTests.java
new file mode 100755
index 0000000..f4d44e6
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/StandardHeaderLexerTests.java
@@ -0,0 +1,1078 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.parse.standard;
+
+
+
+import java.util.ArrayList;
+
+import java.util.List;
+
+import org.eclipse.virgo.util.osgi.manifest.parse.standard.HeaderProblem;
+import org.eclipse.virgo.util.osgi.manifest.parse.standard.HeaderProblemKind;
+import org.eclipse.virgo.util.osgi.manifest.parse.standard.HeaderToken;
+import org.eclipse.virgo.util.osgi.manifest.parse.standard.HeaderTokenKind;
+import org.eclipse.virgo.util.osgi.manifest.parse.standard.HeaderTokenStream;
+import org.eclipse.virgo.util.osgi.manifest.parse.standard.SourceContext;
+import org.eclipse.virgo.util.osgi.manifest.parse.standard.StandardHeaderLexer;
+
+
+
+import junit.framework.TestCase;
+
+
+
+/**
+
+ * Test the lexing of input data into appropriate tokens.
+
+ * 
+
+
+ */
+
+public class StandardHeaderLexerTests extends TestCase {
+
+	private StandardHeaderLexer lexer;
+	private static char oUmlaut = '\u00f6';
+
+
+
+
+	public void testLexNumber() {
+
+		checkLexer("12345", new Number("12345"));
+
+	}
+
+
+
+	public void testLexAlphas() {
+
+		checkLexer("abcdef", new Alphas("abcdef"));
+
+	}
+
+
+
+	public void testLexAlphanum1() {
+
+		checkLexer("abc123", new Alphanumeric("abc123"));
+
+	}
+
+
+
+	public void testLexAlphanum2() {
+
+		checkLexer("123abc", new Alphanumeric("123abc"));
+
+	}
+
+
+
+	public void testLexToken1() {
+
+		checkLexer("abc_123", new Token("abc_123"));
+
+		checkLexer("abc-123", new Token("abc-123"));
+
+	}
+
+
+
+	public void testLexToken2() {
+
+		checkLexer("123_abc", new Token("123_abc"));
+
+		checkLexer("123-abc", new Token("123-abc"));
+
+	}
+
+
+
+	public void testTokenKinds() {
+
+		lexer = new StandardHeaderLexer();
+		// \u00f6 is o-umlaut
+
+		lexer.process("123;abc;abc123;_123;c\u00f6m;*;.*"); // number alpha alphanumeric token identifier star dotstar
+
+		HeaderTokenStream stream = lexer.getTokenStream();
+
+		HeaderToken t = stream.next();
+
+		assertTrue("Should answer true for isNumber() :" + t, HeaderTokenKind.isNumber(t));
+
+		assertEquals("Number", HeaderTokenKind.NUMBER.getString());
+
+		stream.skip(); // skip semicolon
+
+		t = stream.next();
+
+		assertTrue("Should answer true for isAlphas() :" + t, HeaderTokenKind.isAlphas(t));
+
+		stream.skip(); // skip semicolon
+
+		t = stream.next();
+
+		assertTrue("Should answer true for isAlphanumeric() :" + t, HeaderTokenKind.isAlphanumeric(t));
+
+		stream.skip(); // skip semicolon
+
+		t = stream.next();
+
+		assertTrue("Should answer true for isToken() :" + t, HeaderTokenKind.isToken(t));
+
+		stream.skip(); // skip semicolon
+
+		t = stream.next();
+
+		assertTrue("Should answer true for isIdentifier() :" + t, HeaderTokenKind.isIdentifier(t));
+
+		stream.skip(); // skip semicolon
+
+		t = stream.next();
+
+		assertTrue("Should answer true for isStar() :" + t, HeaderTokenKind.isStar(t));
+
+		stream.skip(); // skip semicolon
+
+		t = stream.next();
+
+		assertTrue("Should answer true for isDotStar() :" + t, HeaderTokenKind.isDotStar(t));
+
+	}
+
+
+
+	public void testLexToken3() {
+
+		checkLexer("_", new Token("_"));
+
+		checkLexer("-", new Token("-"));
+
+		checkLexer("_-_", new Token("_-_"));
+
+	}
+
+	
+
+	public void testLexPath() {
+
+		checkLexer(true,"a/b/c",new Alphas("a"),SLASH,new Alphas("b"),SLASH,new Alphas("c"));
+
+	}
+
+
+
+	public void testExtendedToken1() {
+
+		checkLexer("com.this.that", new ExtendedToken("com.this.that"));
+
+	}
+
+
+
+	public void testExtendedToken2() {
+
+		checkLexer("com. this.that", new ExtendedToken("com. this.that"));
+
+		lexer.getTokenStream().reset();
+
+		HeaderToken hToken = lexer.getTokenStream().next();
+
+		assertTrue(hToken.isExtended());
+
+		assertTrue(hToken.isSpaced());
+
+
+
+		checkLexer("com.this .that", new ExtendedToken("com.this .that"));
+
+		lexer.getTokenStream().reset();
+
+		hToken = lexer.getTokenStream().next();
+
+		assertTrue(hToken.isExtended());
+
+		assertTrue(hToken.isSpaced());
+
+		hToken = lexer.getTokenStream().next();
+
+		assertFalse(hToken.isSpaced());
+
+	}
+
+
+
+	public void testLexPackageName1() {
+
+		checkLexer("com.foo.bar", new Alphas("com"), DOT, new Alphas("foo"), DOT, new Alphas("bar"));
+
+	}
+
+
+
+	public void testLexPackageName2() {
+
+		checkLexer("com.foo.bar.*", new Alphas("com"), DOT, new Alphas("foo"), DOT, new Alphas("bar"), new DotStar());
+
+	}
+
+
+
+	public void testLexInvalidPackageName() {
+
+		checkLexer("\"WibbleWobble\"", new QuotedString("WibbleWobble"));
+
+	}
+
+
+
+	public void testQuotedString1() {
+
+		// checkLexer("\"WibbleWobble\"", new QuotedString("WibbleWobble"));
+
+		// Next two are illegal due to non-terminating quoted strings
+
+		checkLexer("\"Wibbl\"eWobble\"aa", new QuotedString("Wibbl"), new Alphas("eWobble"), new QuotedString("aa"));
+
+		checkLexer("\"Wibbl\"eWobble\"", new QuotedString("Wibbl"), new Alphas("eWobble"), new QuotedString(""));
+
+		// Escaped quotes in the string itself
+
+		checkLexer("\"Wibbl\\\"eWobble\"", new QuotedString("Wibbl\\\"eWobble")); // slash quote in the middle
+
+	}
+
+
+
+	public void testQuotedString2() {
+
+		checkLexer("\"com.goo.foo\"", new QuotedString("com.goo.foo"));
+
+	}
+
+
+
+	public void testLexExtendedTokens() {
+
+		checkLexer("com.foo.goo", new Alphas("com"), new Dot(), new Alphas("foo"), new Dot(), new Alphas("goo"));
+
+		HeaderTokenStream stream = lexer.getTokenStream();
+
+		stream.setPosition(0);
+
+		HeaderToken first = stream.next();
+
+		stream.setPosition(stream.getCount() - 1);
+
+		HeaderToken last = stream.next();
+
+		assertTrue(first.isExtended());
+
+		assertEquals(last.getEndOffset(), first.getExtendedEndOffset());
+
+	}
+
+
+
+	public void testLexIdentifiers() {
+
+		checkLexer("com.123.goo", new Alphas("com"), new Dot(), new Number("123"), new Dot(), new Alphas("goo"));
+
+		HeaderTokenStream stream = lexer.getTokenStream();
+
+		stream.setPosition(0);
+
+		HeaderToken tokenCOM = stream.next();
+
+		stream.next();
+
+		assertTrue(HeaderTokenKind.canBeTreatedAsIdentifier(tokenCOM));
+
+		HeaderToken token123 = stream.next();
+
+		assertTrue(HeaderTokenKind.canBeTreatedAsIdentifier(token123));
+
+	}
+
+
+
+	public void testLexAttribute() {
+
+		checkLexer("a=5", new Alphas("a"), new Equals(), new Number("5"));
+
+		HeaderTokenStream stream = lexer.getTokenStream();
+
+		stream.setPosition(0);
+
+		HeaderToken t = stream.next();
+
+		assertTrue(t.isAttributeName());
+
+		assertFalse(t.isDirectiveName());
+
+		assertTrue(t.firstCharIsLetter());
+
+		t = stream.next(); // equals
+
+		assertTrue(HeaderTokenKind.isEquals(t));
+
+		assertFalse(HeaderTokenKind.isColonEquals(t));
+
+		t = stream.next(); // 5
+
+		t = stream.next(); // check not crashing walking off the end!
+
+	}
+
+
+
+	public void testTokenStream() {
+
+		checkLexer("a=5", new Alphas("a"), new Equals(), new Number("5"));
+
+		HeaderTokenStream stream = lexer.getTokenStream();
+
+		stream.setPosition(0);
+
+		assertEquals(0, stream.getPosition());
+
+		HeaderToken t = stream.next();
+
+		assertEquals(1, stream.getPosition());
+
+		t = stream.next();
+
+		assertEquals(2, stream.getPosition());
+
+		t = stream.next();
+
+		assertEquals(t, stream.peekLast());
+
+		stream.reset();
+
+		assertEquals(0, stream.getPosition());
+
+	}
+
+
+
+	public void testLexDirective() {
+
+		checkLexer("a:=5", new Alphas("a"), new ColonEquals(), new Number("5"));
+
+		HeaderTokenStream stream = lexer.getTokenStream();
+
+		stream.setPosition(0);
+
+		HeaderToken t = stream.next();
+
+		assertTrue(t.isDirectiveName());
+
+		assertFalse(t.isAttributeName());
+
+		assertTrue(t.firstCharIsLetter());
+
+		t = stream.next(); // equals
+
+		assertFalse(HeaderTokenKind.isEquals(t));
+
+		assertTrue(HeaderTokenKind.isColonEquals(t));
+
+	}
+
+
+
+	public void testLexFunkyChars1() {
+		// \u00f6 is o-umlaut
+
+		checkLexer("c\u00f6m", new Identifier("c\u00f6m"));
+
+		checkLexer("co" + Character.toString('\u0341') + "m", new Identifier("co" + Character.toString('\u0341') + "m"));
+
+		checkLexer("c\u00f6m.abc.goo", new Identifier("c\u00f6m"), new Dot(), new Alphas("abc"), new Dot(), new Alphas("goo"));
+
+		// HeaderTokenStream stream = lexer.getTokenStream();
+
+		// stream.setPosition(0);
+
+		// HeaderToken t = stream.next();
+
+	}
+	
+
+
+
+	public void testLexAdvancedIdentifiers() {
+
+		// acute accent (unicode 0341) is not a javaidStart but is a javaidPart (so cannot be used to start an identifier)
+
+		char ch = '\u0341';
+		// Alphabetic promoted to identifier when ch is hit
+
+		checkLexer("aa" + ch + "c"+oUmlaut+"m", new Identifier("aa" + ch + "c"+oUmlaut+"m"));
+
+		// Alphanumeric promoted to identifier when ch is hit
+
+		checkLexer("a2" + ch + "c"+oUmlaut+"m", new Identifier("a2" + ch + "c"+oUmlaut+"m"));
+
+		// Token promoted to identifier when ch is hit
+
+		checkLexer("a_2" + ch + "c"+oUmlaut+"m", new Identifier("a_2" + ch + "c"+oUmlaut+"m"));
+
+		// Token promoted to identifier when ch is hit
+
+		checkLexer("_2" + ch + "c"+oUmlaut+"m", new Identifier("_2" + ch + "c"+oUmlaut+"m"));
+
+	}
+
+
+
+	public void testLexBrokenIdentifiers() {
+
+		// acute accent (unicode 0341) is not a javaidStart but is a javaidPart (so cannot be used to start an identifier)
+
+		char ch = '\u0341';
+
+
+
+		// All these will also have errors in
+
+		checkLexer(ch + "c"+oUmlaut+"m", new Identifier("c"+oUmlaut+"m")); // identifier cannot start with a non JavaIdentifierStart
+
+		checkLexer("22" + ch + "c"+oUmlaut+"m", new Number("22"), new Identifier("c"+oUmlaut+"m")); // identifier cannot start with a digit
+
+		checkLexer("-a" + ch + "c"+oUmlaut+"m", new Token("-a"), new Identifier("c"+oUmlaut+"m")); // identifier cannot start with a minus
+
+
+
+		checkLexerError(ch + "c"+oUmlaut+"m", new ExpectedError(HeaderProblemKind.UNEXPECTED_CHARACTER));
+
+		checkLexerError("22" + ch + "c"+oUmlaut+"m", new ExpectedError(HeaderProblemKind.UNEXPECTED_CHARACTER));
+
+		checkLexerError("-a" + ch + "c"+oUmlaut+"m", new ExpectedError(HeaderProblemKind.UNEXPECTED_CHARACTER));
+
+	}
+
+
+
+	public void testLexFunkyChars3() {
+
+		checkLexer("e" + Character.toString('\u0341') + "c"+oUmlaut+"m", new Identifier("e\u0341c"+oUmlaut+"m"));
+
+	}
+
+
+
+	public void testLexFunkyChars4() {
+
+		checkLexer(":");
+
+		checkLexerError(":", new ExpectedError(HeaderProblemKind.UNEXPECTED_CHARACTER));
+
+		checkLexer(";", new SemiColon());
+
+		checkLexer(".", new Dot());
+
+		checkLexer("..", new Dot(), new Dot());
+
+		checkLexer(",", new Comma());
+
+		checkLexer(".;.;.:=;=;.,,");
+
+		System.out.println(lexer.getTokenStream().toFormattedString());
+
+		checkLexer("'$%(*&@!#%*(&))[]{}-=_+"); // 4 valid tokens: $ - = _
+
+		System.out.println(lexer.getTokenStream().toFormattedString());
+
+	}
+
+
+
+	public void testWhitespace() {
+
+		checkLexer("com.foo ", new Alphas("com"), new Dot(), new Alphas("foo"));
+
+		checkLexer("    foo", new Alphas("foo"));
+
+		checkLexerError("com.foo ", new ExpectedError(HeaderProblemKind.UNEXPECTED_SPACE_WARNING));
+
+		checkLexerError(" foo", new ExpectedError(HeaderProblemKind.UNEXPECTED_SPACE_WARNING));
+
+	}
+
+
+
+	public void testQuotedStringProblems() {
+
+		checkLexer("\"Wibbl\\\"eWobble\"", new QuotedString("Wibbl\\\"eWobble")); // slash quote in the middle
+
+		checkLexerError("\"Wibbl\"eWobble\"a", new ExpectedError(HeaderProblemKind.NON_TERMINATING_QUOTED_STRING));
+
+		checkLexerError("\"Wibbl\reWobble\"", new ExpectedError(HeaderProblemKind.UNEXPECTED_CHARACTER));
+
+		checkLexerError("\"Wibbl\neWobble\"", new ExpectedError(HeaderProblemKind.UNEXPECTED_CHARACTER));
+
+		checkLexer("\"Wibbl\\\neWobble\"", new QuotedString("Wibbl\\\neWobble"));
+
+	}
+
+
+
+	public void testWildcards() {
+
+		checkLexer("*", new Star());
+
+		checkLexer(".*", new DotStar());
+
+		checkLexer("com.foo.*", new Alphas("com"), new Dot(), new Alphas("foo"), new DotStar());
+
+	}
+
+
+
+	public void testSequencesThatExerciseUnexpectedStates() {
+
+		// Just finished a QUOTEDSTRING and hitting a DIGIT
+
+		checkLexer("\"a\"23", new QuotedString("a"), new Number("23"));
+
+		checkLexer("\"a\"a", new QuotedString("a"), new Alphas("a"));
+
+		checkLexer("\"a\"_", new QuotedString("a"), new Token("_"));
+
+		checkLexer("a\"a\"", new Alphas("a"), new QuotedString("a"));
+
+		checkLexer("1\"a\"", new Number("1"), new QuotedString("a"));
+
+		checkLexer("_\"a\"", new Token("_"), new QuotedString("a"));
+
+		checkLexer(""+oUmlaut+"\"a\"", new Identifier(""+oUmlaut+""), new QuotedString("a"));
+
+		checkLexer("\"a\""+oUmlaut+"", new QuotedString("a"), new Identifier(""+oUmlaut+""));
+
+	}
+
+
+
+	// -- real header data
+
+
+
+	// public void testLexRealHeaderValues1() {
+
+	// checkLexer("com.springsource.server.osgi;version=1.2.3;uses:=org.springframework.core,com.springsource.server.osgi.framework;version=1.3.2");
+
+	// System.out.println(lexer.getTokenStream().toFormattedString(false));
+
+	// System.out.println(lexer.getTokenStream().toFormattedString(true));
+
+	// }
+
+
+
+	public void testLexRealHeaderValues2() {
+
+		checkLexer("com.foo;version=\"1.2.3\";uses:=a.b,c.d;version=1.3.2");
+
+		String fmt = lexer.getTokenStream().toFormattedString(false);
+
+		assertTrue(">>" + fmt, fmt.startsWith("TokenStream:#25 tokens:[[[com]],.,foo,;,"));
+
+		fmt = lexer.getTokenStream().toFormattedString(true);
+
+		assertTrue(">>" + fmt, fmt.startsWith("TokenStream:#25 tokens:[[['com'@0:3]],'.'@3:4,'foo'@4:7"));
+
+		assertNotNull(lexer.getTokenStream().toString());
+
+	}
+
+	
+
+	public void testSourceContext() {
+
+		char[] theSource = "hello world".toCharArray();
+
+		SourceContext ctx = new SourceContext("hello world");
+
+		// When not told about linebreaks, it assumes just one line: first break
+
+		// at 0 to start it then final break at the end
+
+		int[] breaks = ctx.getLinebreaks();
+
+		assertNotNull(breaks);
+
+		assertEquals(2, breaks.length);
+
+		assertEquals(0, breaks[0]);
+
+		assertEquals(theSource.length, breaks[1]);
+
+		List<Integer> l = new ArrayList<Integer>();
+
+		l.add(5);l.add(10);l.add(15);
+
+		// ctx = new SourceContext("hello there world".toCharArray(), l);
+
+		// breaks = ctx.getLinebreaks();
+
+		// assertNotNull(breaks);
+
+		// assertEquals(3, breaks.length);
+
+		// assertEquals(5, breaks[0]);
+
+		// assertEquals(10, breaks[1]);
+
+		// assertEquals(15, breaks[2]);
+
+		ctx = new SourceContext("hello World");
+
+		ctx.setLinebreaks(l);
+
+		breaks = ctx.getLinebreaks();
+
+		assertNotNull(breaks);
+
+		assertEquals(3, breaks.length);
+
+		assertEquals(5, breaks[0]);
+
+		assertEquals(10, breaks[1]);
+
+		assertEquals(15, breaks[2]);
+
+	}
+
+
+
+	// ---
+
+
+
+	/**
+
+	 * Check that during lexing of the specified input data, the expected errors occur.
+
+	 * 
+
+	 * @param data input data for lexing
+
+	 * @param errors expected sequence of errors that should occur during lexing
+
+	 */
+
+	private void checkLexerError(String data, ExpectedError... errors) {
+
+		lexer = new StandardHeaderLexer();
+
+		lexer.process(data);
+
+		if (errors != null && errors.length != 0) {
+
+			HeaderTokenStream stream = lexer.getTokenStream();
+
+			assertTrue(stream.containsProblems());
+
+			assertEquals(errors.length, stream.getProblems().size());
+
+			List<HeaderProblem> problems = stream.getProblems();
+
+			// for debugging:
+
+			// for (HeaderProblem headerProblem : problems) {
+
+			// System.out.println(headerProblem.toStringWithContext(stream.getSourceContext()));
+
+			// }
+
+			for (int i = 0; i < errors.length; i++) {
+
+				assertEquals(errors[i].getKind(), problems.get(i).getKind());
+
+			}
+
+		}
+
+	}
+
+
+
+	static class ExpectedError {
+
+
+
+		private HeaderProblemKind problemKind;
+
+
+
+		public ExpectedError(HeaderProblemKind problemKind) {
+
+			this.problemKind = problemKind;
+
+		}
+
+
+
+		public HeaderProblemKind getKind() {
+
+			return problemKind;
+
+		}
+
+
+
+	}
+
+
+
+	/**
+
+	 * Check that the specified input data is lexed into the expected set of tokens
+
+	 * 
+
+	 * @param data input data for lexing
+
+	 * @param expectedTokens expected sequence of tokens to be found after lexing
+
+	 */
+
+	private void checkLexer(boolean supportSlashes, String data, ExpectedToken... expectedTokens) {
+
+		lexer = new StandardHeaderLexer(supportSlashes);
+
+		lexer.process(data);
+
+		if (expectedTokens != null && expectedTokens.length != 0) {
+
+			HeaderTokenStream stream = lexer.getTokenStream();
+
+			// System.out.println(stream.toFormattedString());
+
+			if (expectedTokens.length == 1 && expectedTokens[0] instanceof ExtendedToken) {
+
+				HeaderToken nextToken = stream.next();
+
+				assertTrue(nextToken.isExtended());
+
+				assertEquals(expectedTokens[0].expectedValue, new String(nextToken.extendedValue()));
+
+			} else {
+
+				assertEquals(expectedTokens.length, stream.getCount());
+
+				for (int t = 0; t < expectedTokens.length; t++) {
+
+					ExpectedToken exp = expectedTokens[t];
+
+					HeaderToken nextToken = stream.next();
+
+					// System.out.println(nextToken.stringValue());
+
+					assertEquals(exp.getKind(), nextToken.getKind());
+
+					String expValue = exp.getExpectedValue();
+
+					if (expValue != null) {
+
+						assertEquals(expValue, nextToken.stringValue());
+
+					}
+
+				}
+
+			}
+
+		}
+
+	}
+
+	
+
+	private void checkLexer(String data, ExpectedToken... expectedTokens) {
+
+		checkLexer(false,data,expectedTokens);
+
+	}
+
+
+
+	static class ExpectedToken {
+
+		HeaderTokenKind expectedKind;
+
+		String expectedValue;
+
+
+
+		ExpectedToken(HeaderTokenKind expectedKind) {
+
+			this.expectedKind = expectedKind;
+
+		}
+
+
+
+		ExpectedToken(HeaderTokenKind expectedKind, String expectedValue) {
+
+			this.expectedKind = expectedKind;
+
+			this.expectedValue = expectedValue;
+
+		}
+
+
+
+		HeaderTokenKind getKind() {
+
+			return expectedKind;
+
+		}
+
+
+
+		String getExpectedValue() {
+
+			return expectedValue;
+
+		}
+
+	}
+
+
+
+	static class Alphanumeric extends ExpectedToken {
+
+		Alphanumeric() {
+
+			super(HeaderTokenKind.ALPHANUMERIC);
+
+		}
+
+
+
+		Alphanumeric(String expectedValue) {
+
+			super(HeaderTokenKind.ALPHANUMERIC, expectedValue);
+
+		}
+
+	}
+
+
+
+	static class Alphas extends ExpectedToken {
+
+		Alphas(String expectedValue) {
+
+			super(HeaderTokenKind.ALPHAS, expectedValue);
+
+		}
+
+	}
+
+
+
+	static class Star extends ExpectedToken {
+
+		Star() {
+
+			super(HeaderTokenKind.STAR, "*");
+
+		}
+
+	}
+
+
+
+	static class DotStar extends ExpectedToken {
+
+		DotStar() {
+
+			super(HeaderTokenKind.DOTSTAR, ".*");
+
+		}
+
+	}
+
+
+
+	static class Number extends ExpectedToken {
+
+		Number(String expectedValue) {
+
+			super(HeaderTokenKind.NUMBER, expectedValue);
+
+		}
+
+	}
+
+
+
+	static class Equals extends ExpectedToken {
+
+		Equals() {
+
+			super(HeaderTokenKind.EQUALS, "=");
+
+		}
+
+	}
+
+
+
+	static class ColonEquals extends ExpectedToken {
+
+		ColonEquals() {
+
+			super(HeaderTokenKind.COLONEQUALS, ":=");
+
+		}
+
+	}
+
+
+
+	static class Identifier extends ExpectedToken {
+
+		Identifier(String expectedValue) {
+
+			super(HeaderTokenKind.IDENTIFIER, expectedValue);
+
+		}
+
+	}
+
+
+
+	private final static ExpectedToken DOT = new Dot();
+
+	private final static ExpectedToken SLASH = new Slash();
+
+
+
+	static class Dot extends ExpectedToken {
+
+		Dot() {
+
+			super(HeaderTokenKind.DOT, ".");
+
+		}
+
+	}
+
+	
+
+	static class Slash extends ExpectedToken {
+
+		Slash() {
+
+			super(HeaderTokenKind.SLASH, "/");
+
+		}
+
+	}
+
+
+
+	static class SemiColon extends ExpectedToken {
+
+		SemiColon() {
+
+			super(HeaderTokenKind.SEMICOLON, ";");
+
+		}
+
+	}
+
+
+
+	static class Comma extends ExpectedToken {
+
+		Comma() {
+
+			super(HeaderTokenKind.COMMA, ",");
+
+		}
+
+	}
+
+
+
+	static class Token extends ExpectedToken {
+
+		Token(String value) {
+
+			super(HeaderTokenKind.TOKEN, value);
+
+		}
+
+	}
+
+
+
+	static class ExtendedToken extends ExpectedToken {
+
+		ExtendedToken(String value) {
+
+			super(HeaderTokenKind.TOKEN, value);
+
+		}
+
+	}
+
+
+
+	static class QuotedString extends ExpectedToken {
+
+		QuotedString(String value) {
+
+			super(HeaderTokenKind.QUOTEDSTRING, value);
+
+		}
+
+	}
+
+
+
+	// private void printLexerProblems() {
+
+	// printProblems(lexer.getTokenStream().getProblems(),
+
+	// lexer.getTokenStream().getSourceContext());
+
+	// }
+
+
+
+	// private void printProblems(List<HeaderProblem> problems, SourceContext
+
+	// context) {
+
+	// System.out.println("Found " + problems.size() + " problems");
+
+	// for (HeaderProblem headerProblem : problems) {
+
+	// System.out.println(headerProblem.toStringWithContext(context));
+
+	// }
+
+	// }
+
+}
+
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/StandardHeaderParserTests.java b/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/StandardHeaderParserTests.java
new file mode 100755
index 0000000..f2fdf20
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/StandardHeaderParserTests.java
@@ -0,0 +1,1062 @@
+/*
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ */
+
+package org.eclipse.virgo.util.osgi.manifest.parse.standard;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.fail;
+
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.StringTokenizer;
+
+import org.eclipse.virgo.util.osgi.manifest.parse.BundleManifestParseException;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderDeclaration;
+import org.eclipse.virgo.util.osgi.manifest.parse.HeaderParser;
+import org.eclipse.virgo.util.osgi.manifest.parse.ParserLogger;
+import org.junit.Ignore;
+import org.junit.Test;
+
+/**
+ * Test header parsing - normal and error scenarios.
+ * 
+ */
+public class StandardHeaderParserTests {
+
+    private static ParserLogger tlogger = new TestLogger();
+
+    private static final char oUmlaut = '\u00f6';
+
+    private static final char aeDipthong = '\u00c6';
+
+    @Test
+    public void testPackageAttributeNameNastySplit() throws Exception {
+        String test = "a.split.pkg;nasty.split=\"split\"";
+        List<HeaderDeclaration> packageDeclarations = parseTestHeader(test);
+        assertNotNull(packageDeclarations);
+        assertEquals(1, packageDeclarations.size());
+
+        HeaderDeclaration decl = packageDeclarations.get(0);
+        assertEquals("a.split.pkg", decl.getNames().get(0));
+        assertEquals("split", decl.getAttributes().get("nasty.split"));
+	}
+
+    @Test
+    public void testPackageAttributeNameWithDotsAndUnderscores() throws Exception {
+        String test = "a.long.package.name;test.split_mixed_with.underscore=split";
+        List<HeaderDeclaration> packageDeclarations = parseTestHeader(test);
+        assertNotNull(packageDeclarations);
+        assertEquals(1, packageDeclarations.size());
+
+        HeaderDeclaration decl = packageDeclarations.get(0);
+        assertEquals("a.long.package.name", decl.getNames().get(0));
+        assertEquals("split", decl.getAttributes().get("test.split_mixed_with.underscore"));
+	}
+
+    @Test
+    public void testPackageAttributeNameWithUnderscore() throws Exception {
+        String test = "package;test_split=split";
+        List<HeaderDeclaration> packageDeclarations = parseTestHeader(test);
+        assertNotNull(packageDeclarations);
+        assertEquals(1, packageDeclarations.size());
+
+        HeaderDeclaration decl = packageDeclarations.get(0);
+        assertEquals("package", decl.getNames().get(0));
+        assertEquals("split", decl.getAttributes().get("test_split"));
+	}
+
+    @Test
+    public void testPackageAttributeNameWithDot() throws Exception {
+        String test = "package;test.split=split";
+        List<HeaderDeclaration> packageDeclarations = parseTestHeader(test);
+        assertNotNull(packageDeclarations);
+        assertEquals(1, packageDeclarations.size());
+
+        HeaderDeclaration decl = packageDeclarations.get(0);
+        assertEquals("package", decl.getNames().get(0));
+        assertEquals("split", decl.getAttributes().get("test.split"));
+	}
+
+    @Test
+    public void testParseGeneralHeaderError() {
+        checkGeneralHeaderFailure("a\"wibble\"", HeaderProblemKind.EXPECTED_SEMICOLON_OR_COMMA);
+        checkGeneralHeaderFailure("a\"wibble\"/", HeaderProblemKind.EXPECTED_SEMICOLON_OR_COMMA);
+        checkGeneralHeaderFailure("a\"wibble\",", HeaderProblemKind.EXPECTED_SEMICOLON_OR_COMMA);
+        checkGeneralHeaderFailure("a\"wibble\";foo", HeaderProblemKind.EXPECTED_SEMICOLON_OR_COMMA);
+        checkGeneralHeaderFailure("a//", HeaderProblemKind.ILLEGAL_DOUBLE_SLASH);
+        checkGeneralHeaderFailure("a.b\n", HeaderProblemKind.UNEXPECTED_CHARACTER);
+        checkGeneralHeaderFailure("a.b .*", HeaderProblemKind.ILLEGAL_SPACE);
+        checkGeneralHeaderFailure("a.b.*a.b;a=5.*", HeaderProblemKind.EXTRANEOUS_DATA_AFTER_PARAMETER);
+        checkGeneralHeaderFailure("", HeaderProblemKind.UNEXPECTEDLY_OOD);
+        checkGeneralHeaderFailure("a;", HeaderProblemKind.UNEXPECTEDLY_OOD);
+        checkGeneralHeaderFailure("a/ b", HeaderProblemKind.ILLEGAL_SPACE);
+        checkGeneralHeaderFailure("a /b", HeaderProblemKind.ILLEGAL_SPACE);
+        checkGeneralHeaderFailure("abc .goo", HeaderProblemKind.ILLEGAL_SPACE);
+        checkGeneralHeaderFailure("com.goo.*;a:=1;b=3,com.*.wibble;f;a:= foo;com.foo.bar.;a==5", HeaderProblemKind.UNEXPECTED_SPACE_WARNING);
+        checkGeneralHeaderFailure("com.goo.*;a:=1;b=3,com.*.wibble;f;a:= foo;com.foo.bar.;a==5", HeaderProblemKind.EXPECTED_ATTRIBUTE_OR_DIRECTIVE);
+        checkGeneralHeaderFailure("com.goo.*;a:=1;b=3,com.*.wibble;f;a:= foo;com.foo.bar.;a==5", HeaderProblemKind.INVALID_ARGUMENT_VALUE);
+    }
+
+    @Test
+    public void testBasicVisitors() {
+        StandardHeaderVisitor visitor = new StandardHeaderVisitor();
+        visitor.initialize();
+        assertNull(visitor.getFirstHeaderDeclaration()); // should not NPE
+
+        MultiplexingVisitor mv = new MultiplexingVisitor((HeaderVisitor) null);
+        assertNotNull(mv); // stop findBugs whining
+
+        mv = new MultiplexingVisitor();
+        assertNotNull(mv); // stop findBugs whining
+
+        mv = new MultiplexingVisitor(visitor);
+        assertNull(mv.getFirstHeaderDeclaration());
+    }
+
+    @Test
+    public void testPossibleGeneralHeaders() {
+        checkGeneralHeader("a", "names=[a]");
+        checkGeneralHeader("a.b", "names=[a.b]");
+        checkGeneralHeader("\"a/b/c.xml\"", "names=[a/b/c.xml]");
+        checkGeneralHeader("a/b.xml", "names=[a/b.xml]");
+        checkGeneralHeader("config/account-data-context.xml, config/account-security-context.xml", "names=[config/account-data-context.xml]",
+            "names=[config/account-security-context.xml]");
+        checkGeneralHeader("a/b.xml;a=b", "names=[a/b.xml] attrs=[a=b]");
+        checkGeneralHeader("a/b.xml;a:=b", "names=[a/b.xml] directives=[a:=b]");
+        checkGeneralHeader("a/b.xml;a=b,c.foo;a=b", "names=[a/b.xml] attrs=[a=b]", "names=[c.foo] attrs=[a=b]");
+        checkGeneralHeader("a/b.xml   ;    a=b,c.foo ; a=b", "names=[a/b.xml] attrs=[a=b]", "names=[c.foo] attrs=[a=b]");
+        checkGeneralHeader("*", "names=[*]");
+        checkGeneralHeader("*/*", "names=[*/*]");
+        checkGeneralHeader("/", "names=[/]");
+        checkGeneralHeader("*;create-asynchronously:=false", "names=[*] directives=[create-asynchronously:=false]");
+        checkGeneralHeader("config/account-data-context.xml;create-asynchronously:=false",
+            "names=[config/account-data-context.xml] directives=[create-asynchronously:=false]");
+        checkGeneralHeader("config/osgi-*.xml;wait-for-dependencies:=false", "names=[config/osgi-*.xml] directives=[wait-for-dependencies:=false]");
+        checkGeneralHeader("*;timeout:=60", "names=[*] directives=[timeout:=60]");
+        checkGeneralHeader("*;publish-context:=false", "names=[*] directives=[publish-context:=false]");
+        checkGeneralHeader("org.springframework.osgi.extender", "names=[org.springframework.osgi.extender]");
+        checkGeneralHeader(".*", "names=[.*]");
+        checkGeneralHeader("a.b.*a.b", "names=[a.b.*a.b]");
+        checkGeneralHeader("a.c+b.*a.b", "names=[a.c+b.*a.b]");
+        checkGeneralHeader("abc.", "names=[abc.]");
+        checkGeneralHeader("a:=,foo", "names=[a:=]", "names=[foo]");
+        checkGeneralHeader("a/", "names=[a/]");
+        checkGeneralHeader("a/b", "names=[a/b]");
+    }
+
+    @Test
+    public void testInfraDebugVisitor() {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        DebugVisitor dv = new DebugVisitor(); // check default ctor
+
+        assertNotNull(dv); // stop findBugs whining
+
+        dv = new DebugVisitor(new PrintStream(baos));
+        new StandardHeaderParser(dv, tlogger).parseImportBundleHeader("a.b;x=5;y:=\"a.b.c\"");
+        checkVisited(baos, "visitSymbolicName(a.b) visitAttribute(x=5) visitDirective(y:=a.b.c) clauseEnded() endVisit()");
+        assertNull(dv.getFirstHeaderDeclaration());
+        assertEquals(0, dv.getHeaderDeclarations().size());
+    }
+
+    @Test
+    public void testInfraDebugVisitor2() {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        DebugVisitor dv = new DebugVisitor(new PrintStream(baos));
+        new StandardHeaderParser(dv, tlogger).parseDynamicImportPackageHeader("a.b.*;*");
+        checkVisited(baos, "visitWildcardName(a.b.*) visitWildcardName(*) clauseEnded() endVisit()");
+    }
+
+    @Test
+    public void testInfraDebugVisitor3() {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        DebugVisitor dv = new DebugVisitor(new PrintStream(baos));
+        List<HeaderDeclaration> decls = new StandardHeaderParser(dv, tlogger).parsePackageHeader("com.foo.goo", "MyHeaderName");
+        checkVisited(baos, "visitUniqueName(com.foo.goo) clauseEnded() endVisit()");
+        assertNotNull(decls.get(0).toString());
+    }
+
+    @Test
+    public void testInfraVisitorReset() {
+        StandardHeaderParser shp = new StandardHeaderParser(tlogger);
+        List<HeaderDeclaration> lhd = shp.parsePackageHeader("com.foo.goo;a=b", "MyHeaderName");
+        assertEquals(1, lhd.size());
+        lhd = shp.parsePackageHeader("com.foo.hoo;a:=c", "MyHeaderName");
+        assertEquals(1, lhd.size());
+        lhd = shp.parsePackageHeader("com.foo.boo;b:=f", "MyHeaderName");
+        assertEquals(1, lhd.size());
+    }
+
+    // 3.5.2 BundleSymbolicName
+
+    // Bundle-SymbolicName ::= symbolic-name ( ';' parameter )*
+
+    @Test
+    public void testBundleSymbolicName() {
+        checkDecl(getParser().parseBundleSymbolicName("com.b.goo.foo"), "names=[com.b.goo.foo]");
+        checkDecl(getParser().parseBundleSymbolicName("c.b.goo.foo;a:=1"), "names=[c.b.goo.foo] directives=[a:=1]");
+        checkDecl(getParser().parseBundleSymbolicName("c.b.goo.foo;a=b"), "names=[c.b.goo.foo] attrs=[a=b]");
+        checkDecl(getParser().parseBundleSymbolicName("c.b.goo.foo;a=b;c:=d"), "names=[c.b.goo.foo] attrs=[a=b] directives=[c:=d]");
+        checkDecl(getParser().parseBundleSymbolicName("a.b.c;a=1;b=2;c:=d;e:=2"), "names=[a.b.c] attrs=[a=1 b=2] directives=[c:=d e:=2]");
+        checkDecl(getParser().parseBundleSymbolicName("a;a=\"foo\""), "names=[a] attrs=[a=foo]");
+        checkDecl(getParser().parseBundleSymbolicName("a ; a =    \"foo\""), "names=[a] attrs=[a=foo]");
+        checkDecl(getParser().parseBundleSymbolicName("a  "), "names=[a]");
+    }
+
+    @Test
+    public void testBundleSymbolicNameErrors() {
+        checkBundleSymbolicNameFailure("com .foo", HeaderProblemKind.ILLEGAL_SPACE);
+        checkBundleSymbolicNameFailure("1;uses:=c" + oUmlaut + "m.wibble", HeaderProblemKind.INVALID_ARGUMENT_VALUE);
+        checkBundleSymbolicNameFailure("1;uses:=wibble.c" + oUmlaut + "m", HeaderProblemKind.EXTRANEOUS_DATA_AFTER_PARAMETER);
+        checkBundleSymbolicNameFailure("1;uses:=wibble.c" + oUmlaut + "m.tribble", HeaderProblemKind.EXTRANEOUS_DATA_AFTER_PARAMETER);
+    }
+
+    @Test
+    public void testLibrarySymbolicName() {
+        checkDecl(getParser().parseLibrarySymbolicName("com.b.goo.foo"), "names=[com.b.goo.foo]");
+        checkDecl(getParser().parseLibrarySymbolicName("c.b.goo.foo;a:=1"), "names=[c.b.goo.foo] directives=[a:=1]");
+        checkDecl(getParser().parseLibrarySymbolicName("c.b.goo.foo;a=b"), "names=[c.b.goo.foo] attrs=[a=b]");
+        checkDecl(getParser().parseLibrarySymbolicName("c.b.goo.foo;a=b;c:=d"), "names=[c.b.goo.foo] attrs=[a=b] directives=[c:=d]");
+        checkDecl(getParser().parseLibrarySymbolicName("a.b.c;a=1;b=2;c:=d;e:=2"), "names=[a.b.c] attrs=[a=1 b=2] directives=[c:=d e:=2]");
+        checkDecl(getParser().parseLibrarySymbolicName("a;a=\"foo\""), "names=[a] attrs=[a=foo]");
+        checkDecl(getParser().parseLibrarySymbolicName("a ; a =    \"foo\""), "names=[a] attrs=[a=foo]");
+        checkDecl(getParser().parseLibrarySymbolicName("a  "), "names=[a]");
+
+        checkLibrarySymbolicNameFailure("com .foo", HeaderProblemKind.ILLEGAL_SPACE);
+        checkLibrarySymbolicNameFailure("1;uses:=c" + oUmlaut + "m.wibble", HeaderProblemKind.INVALID_ARGUMENT_VALUE);
+        checkLibrarySymbolicNameFailure("1;uses:=wibble.c" + oUmlaut + "m", HeaderProblemKind.EXTRANEOUS_DATA_AFTER_PARAMETER);
+        checkLibrarySymbolicNameFailure("1;uses:=wibble.c" + oUmlaut + "m.tribble", HeaderProblemKind.EXTRANEOUS_DATA_AFTER_PARAMETER);
+    }
+
+    @Test
+    public void testBundleSymbolicNameNastyErrors() {
+        checkBundleSymbolicNameFailure(";", HeaderProblemKind.EXPECTED_TOKEN);
+        checkBundleSymbolicNameFailure(".", HeaderProblemKind.EXPECTED_TOKEN);
+        checkBundleSymbolicNameFailure("com.", HeaderProblemKind.TOKEN_CANNOT_END_WITH_DOT);
+        checkBundleSymbolicNameFailure(".;.;", HeaderProblemKind.EXPECTED_TOKEN);
+        // checkBundleSymbolicNameFailure(".;.;", HeaderProblemKind.UNCONSUMED_DATA);
+
+        checkBundleSymbolicNameFailure("..;", HeaderProblemKind.EXPECTED_TOKEN);
+        checkBundleSymbolicNameFailure(",a=b;", HeaderProblemKind.EXPECTED_TOKEN);
+        checkBundleSymbolicNameFailure("a:=b;d", HeaderProblemKind.EXPECTED_SEMICOLON);
+        checkBundleSymbolicNameFailure("a:=b;d", HeaderProblemKind.EXPECTED_ATTRIBUTE_OR_DIRECTIVE);
+    }
+
+    @Test
+    public void testFragmentHostHeader() {
+        checkDecl(getParser().parseFragmentHostHeader("com.b.goo.foo"), "names=[com.b.goo.foo]");
+        checkDecl(getParser().parseFragmentHostHeader("c.b.goo.foo;a:=1"), "names=[c.b.goo.foo] directives=[a:=1]");
+        checkDecl(getParser().parseFragmentHostHeader("c.b.goo.foo;a=b"), "names=[c.b.goo.foo] attrs=[a=b]");
+        checkDecl(getParser().parseFragmentHostHeader("c.b.goo.foo;a=b;c:=d"), "names=[c.b.goo.foo] attrs=[a=b] directives=[c:=d]");
+        checkDecl(getParser().parseFragmentHostHeader("a.b.c;a=1;b=2;c:=d;e:=2"), "names=[a.b.c] attrs=[a=1 b=2] directives=[c:=d e:=2]");
+        checkDecl(getParser().parseFragmentHostHeader("a;a=\"foo\""), "names=[a] attrs=[a=foo]");
+        checkDecl(getParser().parseFragmentHostHeader("a ; a =    \"foo\""), "names=[a] attrs=[a=foo]");
+        checkDecl(getParser().parseFragmentHostHeader("a  "), "names=[a]");
+    }
+
+    // TODO Bug 463462 - As a developer I'd like to be able to build the Virgo artifacts with Gradle
+    @Ignore("Deactivated with Bug 463462 - As a developer I'd like to be able to build the Virgo artifacts with Gradle")
+    @Test
+    public void testDirectivesAttributes() {
+        checkFragmentHostHeaderFailure("a;x:=a/b", HeaderProblemKind.UNEXPECTED_CHARACTER);
+        checkDecl(getParser().parseFragmentHostHeader("a;x:=y"), "names=[a] directives=[x:=y]");
+    }
+
+    @Test
+    public void testFragmentHostHeaderErrors() {
+        checkFragmentHostHeaderFailure("com .foo", HeaderProblemKind.ILLEGAL_SPACE);
+        checkFragmentHostHeaderFailure("1;uses:=c" + oUmlaut + "m.wibble", HeaderProblemKind.INVALID_ARGUMENT_VALUE);
+        checkFragmentHostHeaderFailure("1;uses:=wibble.c" + oUmlaut + "m", HeaderProblemKind.EXTRANEOUS_DATA_AFTER_PARAMETER);
+        checkFragmentHostHeaderFailure("1;uses:=wibble.c" + oUmlaut + "m.tribble", HeaderProblemKind.EXTRANEOUS_DATA_AFTER_PARAMETER);
+    }
+
+    @Test
+    public void testHeaderProblemContext() {
+        StandardHeaderParser parser = checkFragmentHostHeaderFailure("1;uses:=c" + oUmlaut + "m.wibble", HeaderProblemKind.INVALID_ARGUMENT_VALUE);
+        HeaderProblem hProblem = parser.getProblems().get(0);
+        String s = hProblem.toStringWithContext(parser.getSourceContext());
+        assertEquals(0, s.indexOf("1;uses:=c" + oUmlaut + "m.wibbl"));
+        assertNotSame(-1, s.indexOf("        ^  ^"));
+    }
+
+    @Test
+    public void testHeaderProblemContext2() {
+        StandardHeaderParser parser = checkFragmentHostHeaderFailure("com .foo", HeaderProblemKind.ILLEGAL_SPACE);
+        HeaderProblem hProblem = parser.getProblems().get(0);
+        String s = hProblem.toStringWithContext(parser.getSourceContext());
+        System.out.println(s);
+        assertEquals(0, s.indexOf("com .fo"));
+        assertNotSame(-1, s.indexOf("   ^"));
+    }
+
+    @Test
+    public void testVersioning() {
+        checkDecl(getParser().parseBundleSymbolicName("a;version=1.2.3.qualifier"), "names=[a] attrs=[version=1.2.3.qualifier]");
+        checkDecl(getParser().parseBundleSymbolicName("a;version=1.2.3"), "names=[a] attrs=[version=1.2.3]");
+        checkDecl(getParser().parseBundleSymbolicName("a;version=1.2"), "names=[a] attrs=[version=1.2]");
+        checkDecl(getParser().parseBundleSymbolicName("a;version=1"), "names=[a] attrs=[version=1]");
+    }
+
+    @Test
+    public void testRequireBundle() {
+        checkDecls(checkRequireBundle("a.b.c;f=5"), "names=[a.b.c] attrs=[f=5]");
+        checkDecls(checkRequireBundle("a.b.c,f"), "names=[a.b.c]", "names=[f]");
+        checkDecls(checkRequireBundle("a.b.c;uses:=a.b"), "names=[a.b.c] directives=[uses:=a.b]");
+        checkDecls(checkRequireBundle("a.b.c;f=5,a.d,a.e"), "names=[a.b.c] attrs=[f=5]", "names=[a.d]", "names=[a.e]");
+        checkDecls(checkRequireBundle("a.b.c;f=5,a.d,a.e"), "names=[a.b.c] attrs=[f=5]", "names=[a.d]", "names=[a.e]");
+        checkDecls(checkRequireBundle("com.123"), "names=[com.123]");
+        checkDecls(checkRequireBundle("com"), "names=[com]");
+        checkDecls(checkRequireBundle("1"), "names=[1]");
+        checkDecls(checkRequireBundle("a.b.c;f:=\"c�m\",a.d,a.e"), "names=[a.b.c] directives=[f:=c�m]", "names=[a.d]", "names=[a.e]");
+    }
+
+    @Test
+    public void testRequireBundleFailures() {
+        checkRequireBundleFailure("com .foo", HeaderProblemKind.ILLEGAL_SPACE);
+        checkRequireBundleFailure("1;uses:=c" + oUmlaut + "m.wibble", HeaderProblemKind.INVALID_ARGUMENT_VALUE);
+        checkRequireBundleFailure("1;uses:=wibble.c" + oUmlaut + "m", HeaderProblemKind.EXTRANEOUS_DATA_AFTER_PARAMETER);
+        checkRequireBundleFailure("1;uses:=wibble.c" + oUmlaut + "m.tribble", HeaderProblemKind.EXTRANEOUS_DATA_AFTER_PARAMETER);
+        checkRequireBundleFailure("a.b.c;f=5,a.d,a.e,", HeaderProblemKind.UNEXPECTEDLY_OOD);
+        checkRequireBundleFailure("a.b.c;f=5,a.d,a.e;", HeaderProblemKind.UNEXPECTEDLY_OOD);
+        checkRequireBundleFailure("a.b.c.d;e.f.g.h;version=1.2.3;uses:=a.b.c", HeaderProblemKind.EXPECTED_ATTRIBUTE_OR_DIRECTIVE);
+        checkRequireBundleFailure("a.b.c;a.b.d;foo=bar", HeaderProblemKind.EXPECTED_ATTRIBUTE_OR_DIRECTIVE);
+        checkRequireBundleFailure("a.b.c;a.b.d", HeaderProblemKind.EXPECTED_ATTRIBUTE_OR_DIRECTIVE);
+        checkRequireBundleFailure("a.b.c;a=", HeaderProblemKind.UNEXPECTEDLY_OOD_AT_ARGUMENT_VALUE);
+        checkRequireBundleFailure("a.b.c;a:=", HeaderProblemKind.UNEXPECTEDLY_OOD_AT_ARGUMENT_VALUE);
+        checkRequireBundleFailure("a.b.c;a:= ", HeaderProblemKind.UNEXPECTEDLY_OOD_AT_ARGUMENT_VALUE);
+        checkRequireBundleFailure("  a.b.c ;  a := ", HeaderProblemKind.UNEXPECTEDLY_OOD_AT_ARGUMENT_VALUE);
+        checkRequireBundleFailure("c" + oUmlaut + "m.wibble", HeaderProblemKind.EXPECTED_TOKEN);
+    }
+
+    // These headers use the same parse method, parsePackageHeader()
+
+    // 3.5.5 Export-Package
+
+    // Export-Package ::= export ( ',' export )*
+
+    // export ::= package-names ( ';' parameter )*
+
+    // package-names ::= package-name ( ';' package-name )*
+
+    // 3.5.4 Import-Package
+
+    // Import-Package ::= import ( ',' import )*
+
+    // import ::= package-names ( ';' parameter )*
+
+    // package-names ::= package-name ( ';' package-name )*
+
+
+    // All these variants are legal
+
+    @Test
+    public void testPackageHeader() {
+        checkDecls(getParser().parsePackageHeader("com.foo", "Export-Package"), "names=[com.foo]");
+        checkDecls(getParser().parsePackageHeader("com.foo.goo.boo,com.bib.bob.bub", "Export-Package"), "names=[com.foo.goo.boo]",
+            "names=[com.bib.bob.bub]");
+        checkDecls(getParser().parsePackageHeader("com.a;com.b", "Export-Package"), "names=[com.a com.b]");
+        checkDecls(getParser().parsePackageHeader("com.a;com.bbbb,com.dd;com.eee", "Export-Package"), "names=[com.a com.bbbb]",
+            "names=[com.dd com.eee]");
+        checkDecls(getParser().parsePackageHeader("com.springsource.server.osgi;version=1.2.3", "Export-Package"),
+            "names=[com.springsource.server.osgi] attrs=[version=1.2.3]");
+        checkDecls(getParser().parsePackageHeader("com.springsource.server.osgi;uses:=org.springframework.core", "Export-Package"),
+            "names=[com.springsource.server.osgi] directives=[uses:=org.springframework.core]");
+        checkDecls(getParser().parsePackageHeader("com.springsource.server.osgi;version=1.2.3;uses:=org.springframework.core", "Export-Package"),
+            "names=[com.springsource.server.osgi] attrs=[version=1.2.3] directives=[uses:=org.springframework.core]");
+        checkDecls(getParser().parsePackageHeader(
+            "com.springsource.server.osgi;com.springsource.server.kernel;version=1.2.3;uses:=org.springframework.core", "Export-Package"),
+            "names=[com.springsource.server.osgi com.springsource.server.kernel] attrs=[version=1.2.3] directives=[uses:=org.springframework.core]");
+    }
+
+    /**
+     * Try a few things with an extended character set - some valid, some not
+     */
+    @Test
+    public void testPackageHeaderVarietyOfIdentifierChars() {
+        checkPackageHeaderFailure("a:=,foo", HeaderProblemKind.EXPECTED_SEMICOLON_OR_COMMA);
+        checkDecls(getParser().parsePackageHeader("c" + aeDipthong + "m.foo", "Export-Package"), "names=[c" + aeDipthong + "m.foo]");
+        checkPackageHeaderFailure("com .foo", HeaderProblemKind.ILLEGAL_SPACE);
+        checkPackageHeaderFailure("a;uses:=c" + aeDipthong + "m.wibble", HeaderProblemKind.INVALID_ARGUMENT_VALUE);
+        checkPackageHeaderFailure("x;uses:=wibble.c" + aeDipthong + "m", HeaderProblemKind.EXTRANEOUS_DATA_AFTER_PARAMETER);
+        checkPackageHeaderFailure("y;uses:=wibble.c" + aeDipthong + "m.tribble", HeaderProblemKind.EXTRANEOUS_DATA_AFTER_PARAMETER);
+        checkPackageHeaderFailure("a.b.c;f=5,a.d,a.e,", HeaderProblemKind.UNEXPECTEDLY_OOD);
+        checkPackageHeaderFailure("a.b.c;f=5,a.d,a.e;", HeaderProblemKind.UNEXPECTEDLY_OOD);
+        checkDecls(getParser().parsePackageHeader("a.b.c.d;e.f.g.h;version=1.2.3;uses:=a.b.c", "test"),
+            "names=[a.b.c.d e.f.g.h] attrs=[version=1.2.3] directives=[uses:=a.b.c]");
+        checkDecls(getParser().parsePackageHeader("a.b.c;a.b.d;foo=bar", "test"), "names=[a.b.c a.b.d] attrs=[foo=bar]");
+        checkDecls(getParser().parsePackageHeader("a.b.c;a.b.d", "test"), "names=[a.b.c a.b.d]");
+        checkPackageHeaderFailure("a.b.c;a=", HeaderProblemKind.UNEXPECTEDLY_OOD_AT_ARGUMENT_VALUE);
+        checkPackageHeaderFailure("a.b.c;a:=", HeaderProblemKind.UNEXPECTEDLY_OOD_AT_ARGUMENT_VALUE);
+        checkPackageHeaderFailure("a.b.c;a:= ", HeaderProblemKind.UNEXPECTEDLY_OOD_AT_ARGUMENT_VALUE);
+        checkPackageHeaderFailure("  a.b.c ;  a := ", HeaderProblemKind.UNEXPECTEDLY_OOD_AT_ARGUMENT_VALUE);
+        //verify number-starting packages don't generate an ERROR - Equinox style.
+        checkPackageHeader("co23.45o");
+        checkPackageHeader("1");
+        checkPackageHeaderFailure("a. b", HeaderProblemKind.ILLEGAL_SPACE);
+        checkPackageHeaderFailure("a.   b", HeaderProblemKind.ILLEGAL_SPACE);
+    }
+
+    @Test
+    public void testPackageHeaderNastyErrors() {
+        checkPackageHeaderFailure(";", HeaderProblemKind.EXPECTED_IDENTIFIER);
+        checkPackageHeaderFailure(".", HeaderProblemKind.EXPECTED_IDENTIFIER);
+        checkPackageHeaderFailure(".;.;", HeaderProblemKind.EXPECTED_IDENTIFIER);
+        checkPackageHeaderFailure(".;.;", HeaderProblemKind.UNEXPECTEDLY_OOD);
+        checkPackageHeaderFailure(".;.;", HeaderProblemKind.EXPECTED_IDENTIFIER);
+        checkPackageHeaderFailure("..;", HeaderProblemKind.EXPECTED_IDENTIFIER);
+        checkPackageHeaderFailure(",a=b;", HeaderProblemKind.EXPECTED_IDENTIFIER);
+        checkPackageHeaderFailure("a:=b;d", HeaderProblemKind.EXPECTED_SEMICOLON_OR_COMMA);
+    }
+
+    @Test
+    public void testPackageHeaderErrorMessagePositions() {
+        StandardHeaderParser parser = new StandardHeaderParser(tlogger);
+        parser.internalParsePackageHeader("a. b", "test");
+        HeaderProblem hp = parser.getProblems().get(0);
+        if (hp.getKind() == HeaderProblemKind.UNEXPECTED_SPACE_WARNING) {
+            hp = parser.getProblems().get(1);
+        }
+        assertEquals(HeaderProblemKind.ILLEGAL_SPACE, hp.getKind());
+        assertEquals(0, hp.getStartOffset());
+        assertEquals(4, hp.getEndOffset());
+        assertEquals("a. b", hp.getInserts()[0]);
+        assertEquals(false, hp.isSeverity(Severity.WARNING));
+        assertEquals(true, hp.isSeverity(Severity.ERROR));
+        assertEquals("HP006E:Space not allowed here", hp.toString());
+        assertNotNull(parser.getSourceContext());
+        assertNotNull(parser.toString());
+    }
+
+    // TODO [later] who checks activation policy is only 'lazy' if set to anything at all?
+
+    // Section 4.3.6.1
+
+    // TODO Bug 463462 - As a developer I'd like to be able to build the Virgo artifacts with Gradle
+    @Ignore("Deactivated with Bug 463462 - As a developer I'd like to be able to build the Virgo artifacts with Gradle")
+    @Test
+    public void testBundleActivationPolicy() {
+        checkDecl(getParser().parseBundleActivationPolicy("lazy"), "names=[lazy]");
+        checkDecl(getParser().parseBundleActivationPolicy("foobar"), "names=[foobar]");
+        checkDecl(getParser().parseBundleActivationPolicy("lazy;a:=b"), "names=[lazy] directives=[a:=b]");
+        checkDecl(getParser().parseBundleActivationPolicy("lazy;a:=b;b:=37"), "names=[lazy] directives=[a:=b b:=37]");
+
+        checkBundleActivationPolicyFailure("lazy;include:=", HeaderProblemKind.UNEXPECTEDLY_OOD_AT_ARGUMENT_VALUE);
+        checkBundleActivationPolicyFailure("lazy;include:=a/b", HeaderProblemKind.UNEXPECTED_CHARACTER);
+        checkBundleActivationPolicyFailure("lazy;a=b", HeaderProblemKind.ATTRIBUTES_NOT_ALLOWED_FOR_THIS_HEADER);
+        StandardHeaderParser parser = new StandardHeaderParser(tlogger);
+        parser.internalParseBundleActivationPolicy("lazy;wiring=magic");
+
+        // Let us do a bit more analysis on this
+
+        HeaderProblem problem = parser.getProblems().get(0);
+        assertEquals("wiring", problem.getInserts()[0]);
+        assertEquals(5, problem.getStartOffset());
+        assertEquals(11, problem.getEndOffset());
+    }
+
+    @Test
+    public void testDynamicImportPackageWithWildcards() {
+        checkDecls(getParser().parseDynamicImportPackageHeader("a.b.*"), "names=[a.b.*]");
+        checkDecls(getParser().parseDynamicImportPackageHeader("*"), "names=[*]");
+        checkDecls(getParser().parseDynamicImportPackageHeader("   *   "), "names=[*]");
+        checkDecls(getParser().parseDynamicImportPackageHeader("a.b.*;c.d.*"), "names=[a.b.* c.d.*]");
+        checkDecls(getParser().parseDynamicImportPackageHeader("a.b.*;a=andy,c.d.*"), "names=[a.b.*] attrs=[a=andy]", "names=[c.d.*]");
+        checkDecls(getParser().parseDynamicImportPackageHeader("*;c.d.*"), "names=[* c.d.*]");
+        checkDecls(getParser().parseDynamicImportPackageHeader("*,c.d.*"), "names=[*]", "names=[c.d.*]");
+    }
+
+    @Test
+    public void testDynamicImportPackage() {
+        checkDecls(getParser().parseDynamicImportPackageHeader("com.foo"), "names=[com.foo]");
+        checkDecls(getParser().parseDynamicImportPackageHeader("com.foo.goo.boo,com.bib.bob.bub"), "names=[com.foo.goo.boo]",
+            "names=[com.bib.bob.bub]");
+        checkDecls(getParser().parseDynamicImportPackageHeader("com.a;com.b"), "names=[com.a com.b]");
+        checkDecls(getParser().parseDynamicImportPackageHeader("com.a;com.bbbb,com.dd;com.eee"), "names=[com.a com.bbbb]", "names=[com.dd com.eee]");
+        checkDecls(getParser().parseDynamicImportPackageHeader("com.springsource.server.osgi;version=1.2.3"),
+            "names=[com.springsource.server.osgi] attrs=[version=1.2.3]");
+        checkDecls(getParser().parseDynamicImportPackageHeader("com.springsource.server.osgi;uses:=org.springframework.core"),
+            "names=[com.springsource.server.osgi] directives=[uses:=org.springframework.core]");
+        checkDecls(getParser().parseDynamicImportPackageHeader("com.springsource.server.osgi;version=1.2.3;uses:=org.springframework.core"),
+            "names=[com.springsource.server.osgi] attrs=[version=1.2.3] directives=[uses:=org.springframework.core]");
+        checkDecls(getParser().parseDynamicImportPackageHeader(
+            "com.springsource.server.osgi;com.springsource.server.kernel;version=1.2.3;uses:=org.springframework.core"),
+            "names=[com.springsource.server.osgi com.springsource.server.kernel] attrs=[version=1.2.3] directives=[uses:=org.springframework.core]");
+    }
+
+    @Test
+    public void testDynamicImportPackageErrors() {
+        checkDynamicImportPackageFailure("a.b .*", HeaderProblemKind.ILLEGAL_SPACE);
+        checkDynamicImportPackageFailure(".*", HeaderProblemKind.EXPECTED_IDENTIFIER);
+        checkDynamicImportPackageFailure("a.b.*a.b", HeaderProblemKind.EXPECTED_SEMICOLON_OR_COMMA);
+        checkDynamicImportPackageFailure("a.c+b.*a.b", HeaderProblemKind.UNEXPECTED_CHARACTER);
+        checkDynamicImportPackageFailure("a.b.*a.b;a=5.*", HeaderProblemKind.EXPECTED_SEMICOLON_OR_COMMA);
+        checkDynamicImportPackageFailure("", HeaderProblemKind.UNEXPECTEDLY_OOD);
+        checkDynamicImportPackageFailure("a.b.c;f=5,a.d,a.e;", HeaderProblemKind.UNEXPECTEDLY_OOD);
+        checkDynamicImportPackageFailure("abc .goo", HeaderProblemKind.ILLEGAL_SPACE);
+        checkDynamicImportPackageFailure("abc. goo", HeaderProblemKind.ILLEGAL_SPACE);
+        checkDynamicImportPackageFailure("abc.", HeaderProblemKind.UNEXPECTEDLY_OOD);
+        checkDynamicImportPackageFailure("a:=,foo", HeaderProblemKind.EXPECTED_SEMICOLON_OR_COMMA);
+        checkDynamicImportPackageFailure("com.goo.*;a:=1;b=3,com.*.wibble;f;a:= foo;com.foo.bar.;a==5", HeaderProblemKind.UNEXPECTED_SPACE_WARNING);
+        checkDynamicImportPackageFailure("com.goo.*;a:=1;b=3,com.*.wibble;f;a:= foo;com.foo.bar.;a==5", HeaderProblemKind.EXPECTED_SEMICOLON_OR_COMMA);
+        checkDynamicImportPackageFailure("com.goo.*;a:=1;b=3,com.*.wibble;f;a:= foo;com.foo.bar.;a==5",
+            HeaderProblemKind.EXPECTED_ATTRIBUTE_OR_DIRECTIVE);
+        checkDynamicImportPackageFailure("com.goo.*;a:=1;b=3,com.*.wibble;f;a:= foo;com.foo.bar.;a==5", HeaderProblemKind.INVALID_ARGUMENT_VALUE);
+    }
+
+    private void checkGeneralHeader(String headerText, String... expectedHeaders) {
+        checkDecls(getParser().parseHeader(headerText), expectedHeaders);
+    }
+
+    @Test
+    public void testParseGeneralHeader() {
+        checkDecls(getParser().parseHeader("com.foo"), "names=[com.foo]");
+        checkDecls(getParser().parseHeader("com.foo.goo.boo,com.bib.bob.bub"), "names=[com.foo.goo.boo]", "names=[com.bib.bob.bub]");
+        checkDecls(getParser().parseHeader("com.a;com.b"), "names=[com.a com.b]");
+        checkDecls(getParser().parseHeader("com.a;com.bbbb,com.dd;com.eee"), "names=[com.a com.bbbb]", "names=[com.dd com.eee]");
+        checkDecls(getParser().parseHeader("com.springsource.server.osgi;version=1.2.3"),
+            "names=[com.springsource.server.osgi] attrs=[version=1.2.3]");
+        checkDecls(getParser().parseHeader("com.springsource.server.osgi;uses:=org.springframework.core"),
+            "names=[com.springsource.server.osgi] directives=[uses:=org.springframework.core]");
+        checkDecls(getParser().parseHeader("com.springsource.server.osgi;version=1.2.3;uses:=org.springframework.core"),
+            "names=[com.springsource.server.osgi] attrs=[version=1.2.3] directives=[uses:=org.springframework.core]");
+        checkDecls(
+            getParser().parseHeader("com.springsource.server.osgi;com.springsource.server.kernel;version=1.2.3;uses:=org.springframework.core"),
+            "names=[com.springsource.server.osgi com.springsource.server.kernel] attrs=[version=1.2.3] directives=[uses:=org.springframework.core]");
+    }
+
+    /**
+     * Go mad on testing import bundle (which effectively tests all header variants that want to consume
+     * bundleDeclarations).
+     */
+    @Test
+    public void testImportBundle() {
+        checkDecls(checkImportBundle("a.b.c;f=5"), "names=[a.b.c] attrs=[f=5]");
+        checkDecls(checkImportBundle("a.b.c,f"), "names=[a.b.c]", "names=[f]");
+        checkDecls(checkImportBundle("a.b.c;uses:=a.b"), "names=[a.b.c] directives=[uses:=a.b]");
+        checkDecls(checkImportBundle("a.b.c;f=5,a.d,a.e"), "names=[a.b.c] attrs=[f=5]", "names=[a.d]", "names=[a.e]");
+        checkDecls(checkImportBundle("a.b.c;f=5,a.d,a.e"), "names=[a.b.c] attrs=[f=5]", "names=[a.d]", "names=[a.e]");
+        checkDecls(checkImportBundle("com.123"), "names=[com.123]");
+        checkDecls(checkImportBundle("com"), "names=[com]");
+        checkDecls(checkImportBundle("1"), "names=[1]");
+        checkDecls(checkImportBundle("a.b.c;f:=\"c" + aeDipthong + "m\",a.d,a.e"), "names=[a.b.c] directives=[f:=c" + aeDipthong + "m]",
+            "names=[a.d]", "names=[a.e]");
+
+        checkImportBundleFailure("com .foo", HeaderProblemKind.ILLEGAL_SPACE);
+        checkImportBundleFailure("1;uses:=c" + aeDipthong + "m.wibble", HeaderProblemKind.INVALID_ARGUMENT_VALUE);
+        checkImportBundleFailure("1;uses:=wibble.c" + aeDipthong + "m", HeaderProblemKind.EXTRANEOUS_DATA_AFTER_PARAMETER);
+        checkImportBundleFailure("1;uses:=wibble.c" + aeDipthong + "m.tribble", HeaderProblemKind.EXTRANEOUS_DATA_AFTER_PARAMETER);
+        checkImportBundleFailure("a.b.c;f=5,a.d,a.e,", HeaderProblemKind.UNEXPECTEDLY_OOD);
+        checkImportBundleFailure("a.b.c;f=5,a.d,a.e;", HeaderProblemKind.UNEXPECTEDLY_OOD);
+        checkImportBundleFailure("a.b.c.d;e.f.g.h;version=1.2.3;uses:=a.b.c", HeaderProblemKind.EXPECTED_ATTRIBUTE_OR_DIRECTIVE);
+        checkImportBundleFailure("a.b.c;a.b.d;foo=bar", HeaderProblemKind.EXPECTED_ATTRIBUTE_OR_DIRECTIVE);
+        checkImportBundleFailure("a.b.c;a.b.d", HeaderProblemKind.EXPECTED_ATTRIBUTE_OR_DIRECTIVE);
+        checkImportBundleFailure("a.b.c;a=", HeaderProblemKind.UNEXPECTEDLY_OOD_AT_ARGUMENT_VALUE);
+        checkImportBundleFailure("a.b.c;a:=", HeaderProblemKind.UNEXPECTEDLY_OOD_AT_ARGUMENT_VALUE);
+        checkImportBundleFailure("a.b.c;a:= ", HeaderProblemKind.UNEXPECTEDLY_OOD_AT_ARGUMENT_VALUE);
+        checkImportBundleFailure("  a.b.c ;  a := ", HeaderProblemKind.UNEXPECTEDLY_OOD_AT_ARGUMENT_VALUE);
+        checkImportBundleFailure("c" + aeDipthong + "m.wibble", HeaderProblemKind.EXPECTED_TOKEN);
+
+    }
+
+    @Test
+    public void testWebFilterMappings() {
+        checkDecls(checkWebFilterMappings("a.b.c;f=5"), "names=[a.b.c] attrs=[f=5]");
+        checkDecls(checkWebFilterMappings("a.b.c,f"), "names=[a.b.c]", "names=[f]");
+
+        checkWebFilterMappingsFailure("com .foo", HeaderProblemKind.ILLEGAL_SPACE);
+        checkWebFilterMappingsFailure("1;uses:=c" + aeDipthong + "m.wibble", HeaderProblemKind.INVALID_ARGUMENT_VALUE);
+        checkWebFilterMappingsFailure("1;uses:=wibble.c" + aeDipthong + "m", HeaderProblemKind.EXTRANEOUS_DATA_AFTER_PARAMETER);
+    }
+
+    @Test
+    public void testImportLibrary() {
+        checkDecls(checkImportLibrary("a.b.c;f=5"), "names=[a.b.c] attrs=[f=5]");
+        checkDecls(checkWebFilterMappings("a.b.c,f"), "names=[a.b.c]", "names=[f]");
+        checkImportLibraryFailure("com .foo", HeaderProblemKind.ILLEGAL_SPACE);
+        checkImportLibraryFailure("com. foo", HeaderProblemKind.ILLEGAL_SPACE);
+        checkImportLibraryFailure("1;uses:=c" + aeDipthong + "m.wibble", HeaderProblemKind.INVALID_ARGUMENT_VALUE);
+        checkImportLibraryFailure("1;uses:=wibble.c" + aeDipthong + "m", HeaderProblemKind.EXTRANEOUS_DATA_AFTER_PARAMETER);
+    }
+
+    @Test
+    public void testQuotedParameters() {
+        String test = "com.springsource.server.osgi;version=\"1.2.3\";uses:=\"org.springframework.core\"";
+        List<HeaderDeclaration> packageDeclarations = parseTestHeader(test);
+        assertNotNull(packageDeclarations);
+        HeaderDeclaration decl = packageDeclarations.get(0);
+        assertEquals("1.2.3", decl.getAttributes().get("version"));
+        assertEquals("org.springframework.core", decl.getDirectives().get("uses"));
+    }
+
+    @Test
+    public void testPackageHeader_MultiDeclarationMultiPackageWithAttributesAndDirectives() {
+        String test = "com.springsource.server.osgi;version=1.2.3;uses:=org.springframework.core,com.springsource.server.osgi.framework;com.springsource.server.osgi.boggle;version=1.3.2";
+        List<HeaderDeclaration> packageDeclarations = parseTestHeader(test);
+        assertNotNull(packageDeclarations);
+        assertEquals(2, packageDeclarations.size());
+
+        HeaderDeclaration decl = packageDeclarations.get(0);
+        assertEquals("com.springsource.server.osgi", decl.getNames().get(0));
+        assertEquals("1.2.3", decl.getAttributes().get("version"));
+        assertEquals("org.springframework.core", decl.getDirectives().get("uses"));
+
+        decl = packageDeclarations.get(1);
+        assertEquals("com.springsource.server.osgi.framework", decl.getNames().get(0));
+        assertEquals("com.springsource.server.osgi.boggle", decl.getNames().get(1));
+        assertEquals("1.3.2", decl.getAttributes().get("version"));
+    }
+
+    /**
+     * Hyphens need a little bit of special treatment in order for tokens containing them to be recognized as path
+     * elements. See HeaderTokenKind.canBeTreatedAsPathElement() for the fix that allows this test to pass. <br>
+     * In general hyphens are not quite handled correctly throughout by the parser right now. They are currently
+     * allowed in package headers although strictly by the spec they shouldn't be allowed. I believe they are being let
+     * through because some users want to Export-Package META-INF. With strict checking according to the spec this
+     * wouldn't be allowed. It appears to be one of those things where the spec implementors have decided to allow it
+     * but the spec doesn't allow it. <br>
+     * If more problems surface here then it may be time to have a new token kind for a pathelement, rather than trying
+     * to reuse TOKEN for this.
+     */
+    @Test
+    public void testParseHyphens() {
+        List<HeaderDeclaration> decls = getParser().parseHeader("Alpha-*,*-Bravo,Charlie-*-Delta,*-Echo-*");
+        checkDecls(decls, "names=[Alpha-*]", "names=[*-Bravo]", "names=[Charlie-*-Delta]", "names=[*-Echo-*]");
+    }
+
+    // -- PackageHeader: as used for Export-Package
+
+
+    private List<HeaderDeclaration> parseTestHeader(String text) {
+        return new StandardHeaderParser(tlogger).parsePackageHeader(text, "test");
+    }
+
+    // Performance tests
+
+
+    // -- end of test methods
+
+
+    // private void parse(String headerText) throws Exception {
+
+    // // long stime = System.currentTimeMillis();
+
+    // try {
+
+    // headerParser = new StandardHeaderParser(tl);
+
+    // headerParser.parseBundleSymbolicName(headerText);
+
+    // } catch (Exception e) {
+
+    // throw e;
+
+    // }
+
+    // // long etime = System.currentTimeMillis();
+
+    // // System.out.println("Parsed in " + (etime - stime) + "ms");
+
+    // // printProblems();
+
+    // // printManifest();
+
+    // }
+
+
+    private void checkImportBundleFailure(String header, HeaderProblemKind expected) {
+        StandardHeaderParser parser = new StandardHeaderParser(tlogger);
+        try {
+            parser.parseImportBundleHeader(header);
+            fail();
+        } catch (BundleManifestParseException bmpe) {
+            String msg = bmpe.getMessage();
+            if (!msg.contains(expected.getCode())) {
+                System.out.println(msg);
+                fail("Did not find problem " + expected.getCode() + " in exception text:\n" + msg);
+            }
+        }
+    }
+
+    private void checkWebFilterMappingsFailure(String header, HeaderProblemKind expected) {
+        StandardHeaderParser parser = new StandardHeaderParser(tlogger);
+        try {
+            parser.parseWebFilterMappingsHeader(header);
+            fail();
+        } catch (BundleManifestParseException bmpe) {
+            String msg = bmpe.getMessage();
+            if (!msg.contains(expected.getCode())) {
+                System.out.println(msg);
+                fail("Did not find problem " + expected.getCode() + " in exception text:\n" + msg);
+            }
+        }
+    }
+
+    private void checkImportLibraryFailure(String header, HeaderProblemKind expected) {
+        StandardHeaderParser parser = new StandardHeaderParser(tlogger);
+        try {
+            parser.parseImportLibraryHeader(header);
+            fail();
+        } catch (BundleManifestParseException bmpe) {
+            String msg = bmpe.getMessage();
+            if (!msg.contains(expected.getCode())) {
+                System.out.println(msg);
+                fail("Did not find problem " + expected.getCode() + " in exception text:\n" + msg);
+            }
+        }
+    }
+
+    private void checkRequireBundleFailure(String header, HeaderProblemKind expected) {
+        StandardHeaderParser parser = new StandardHeaderParser(tlogger);
+        // org.eclipse.virgo.util.osgi.manifest.parse.HeaderParser parser = new AntlrHeaderParser(tl);
+
+        try {
+            parser.parseRequireBundleHeader(header);
+            // List<org.eclipse.virgo.util.osgi.manifest.parse.HeaderDeclaration> decls =
+            // parser.parseRequireBundleHeader(header);
+
+            // List<HeaderDeclaration> decls2 = new ArrayList<HeaderDeclaration>();
+
+            // for (Iterator iterator = decls.iterator(); iterator.hasNext();) {
+
+            // org.eclipse.virgo.util.osgi.manifest.parse.HeaderDeclaration hd =
+
+            // (org.eclipse.virgo.util.osgi.manifest.parse.HeaderDeclaration) iterator
+
+            // .next();
+
+            // decls2.add(new ImmutableHeaderDeclaration(hd.getNames(), hd.getAttributes(), hd.getDirectives()));
+
+            // }
+
+            // StandardHeaderParser parser = new StandardHeaderParser(tl);
+
+            // try {
+
+            // parser.parseRequireBundleHeader(header);
+
+            fail();
+        } catch (BundleManifestParseException bmpe) {
+            String msg = bmpe.getMessage();
+            if (!msg.contains(expected.getCode())) {
+                System.out.println(msg);
+                fail("Did not find problem " + expected.getCode() + " in exception text:\n" + msg);
+            }
+        }
+    }
+
+    private void checkBundleActivationPolicyFailure(String header, HeaderProblemKind expected) {
+        StandardHeaderParser parser = new StandardHeaderParser(tlogger);
+        try {
+            parser.parseBundleActivationPolicy(header);
+            fail();
+        } catch (BundleManifestParseException bmpe) {
+            String msg = bmpe.getMessage();
+            if (!msg.contains(expected.getCode())) {
+                System.out.println(msg);
+                fail("Did not find problem " + expected.getCode() + " in exception text:\n" + msg);
+            }
+        }
+    }
+
+    private StandardHeaderParser checkFragmentHostHeaderFailure(String header, HeaderProblemKind... expected) {
+        StandardHeaderParser parser = new StandardHeaderParser(tlogger);
+        try {
+            parser.parseFragmentHostHeader(header);
+            fail("Parsing should have failed for " + header);
+        } catch (BundleManifestParseException bmpe) {
+            String msg = bmpe.getMessage();
+            if (expected == null || expected.length == 0) {
+                bmpe.printStackTrace();
+            } else {
+                if (!msg.contains(expected[0].getCode())) {
+                    System.out.println(msg);
+                    fail("Did not find problem " + expected[0].getCode() + " in exception text:\n" + msg);
+                }
+            }
+        }
+        return parser;
+    }
+
+    private void checkBundleSymbolicNameFailure(String header, HeaderProblemKind... expected) {
+        StandardHeaderParser parser = new StandardHeaderParser(tlogger);
+        try {
+            parser.parseBundleSymbolicName(header);
+            fail("Parsing should have failed for " + header);
+        } catch (BundleManifestParseException bmpe) {
+            String msg = bmpe.getMessage();
+            if (expected == null || expected.length == 0) {
+                bmpe.printStackTrace();
+            } else {
+                if (!msg.contains(expected[0].getCode())) {
+                    System.out.println(msg);
+                    fail("Did not find problem " + expected[0].getCode() + " in exception text:\n" + msg);
+                }
+            }
+        }
+    }
+
+    private void checkLibrarySymbolicNameFailure(String header, HeaderProblemKind... expected) {
+        StandardHeaderParser parser = new StandardHeaderParser(tlogger);
+        try {
+            parser.parseLibrarySymbolicName(header);
+            fail("Parsing should have failed for " + header);
+        } catch (BundleManifestParseException bmpe) {
+            String msg = bmpe.getMessage();
+            if (expected == null || expected.length == 0) {
+                bmpe.printStackTrace();
+            } else {
+                if (!msg.contains(expected[0].getCode())) {
+                    System.out.println(msg);
+                    fail("Did not find problem " + expected[0].getCode() + " in exception text:\n" + msg);
+                }
+            }
+        }
+    }
+
+    private void checkDynamicImportPackageFailure(String header, HeaderProblemKind... expected) {
+        StandardHeaderParser parser = new StandardHeaderParser(tlogger);
+        try {
+            parser.parseDynamicImportPackageHeader(header);
+            fail("Parsing should have failed for " + header);
+        } catch (BundleManifestParseException bmpe) {
+            String msg = bmpe.getMessage();
+            if (expected == null || expected.length == 0) {
+                bmpe.printStackTrace();
+            } else {
+                if (!msg.contains(expected[0].getCode())) {
+                    System.out.println(msg);
+                    fail("Did not find problem " + expected[0].getCode() + " in exception text:\n" + msg);
+                }
+            }
+        }
+    }
+
+    private void checkGeneralHeaderFailure(String header, HeaderProblemKind... expected) {
+        StandardHeaderParser parser = new StandardHeaderParser(tlogger);
+        try {
+            parser.parseHeader(header);
+            fail("Parsing should have failed for " + header);
+        } catch (BundleManifestParseException bmpe) {
+            String msg = bmpe.getMessage();
+            if (expected == null || expected.length == 0) {
+                bmpe.printStackTrace();
+            } else {
+                if (!msg.contains(expected[0].getCode())) {
+                    System.out.println(msg);
+                    fail("Did not find problem " + expected[0].getCode() + " in exception text:\n" + msg);
+                }
+            }
+        }
+    }
+
+    private void checkPackageHeaderFailure(String header, HeaderProblemKind... expected) {
+        StandardHeaderParser parser = new StandardHeaderParser(tlogger);
+        try {
+            parser.parsePackageHeader(header, "test");
+            fail("Parsing should have failed for " + header);
+        } catch (BundleManifestParseException bmpe) {
+            String msg = bmpe.getMessage();
+            if (expected == null || expected.length == 0) {
+                bmpe.printStackTrace();
+            } else {
+                if (!msg.contains(expected[0].getCode())) {
+                    System.out.println(msg);
+                    fail("Did not find problem " + expected[0].getCode() + " in exception text:\n" + msg);
+                }
+            }
+        }
+    }
+    
+    private void checkPackageHeader(String header) {
+        StandardHeaderParser parser = new StandardHeaderParser(tlogger);
+        try {
+            parser.parsePackageHeader(header, "test");
+            assertFalse(parser.foundProblems(Severity.ERROR));
+        } catch (BundleManifestParseException bmpe) {
+            System.out.println(bmpe.getMessage());
+            fail("Unexpected exception: " + bmpe.getMessage());
+        }
+    }
+
+    private List<HeaderDeclaration> checkImportBundle(String header) {
+        StandardHeaderParser parser = new StandardHeaderParser(tlogger);
+        try {
+            return parser.parseImportBundleHeader(header);
+        } catch (BundleManifestParseException bmpe) {
+            System.out.println(bmpe.getMessage());
+            fail("Unexpected exception: " + bmpe.getMessage());
+        }
+        return null;
+    }
+
+    private List<HeaderDeclaration> checkWebFilterMappings(String header) {
+        StandardHeaderParser parser = new StandardHeaderParser(tlogger);
+        try {
+            return parser.parseWebFilterMappingsHeader(header);
+        } catch (BundleManifestParseException bmpe) {
+            System.out.println(bmpe.getMessage());
+            fail("Unexpected exception: " + bmpe.getMessage());
+        }
+        return null;
+    }
+
+    private List<HeaderDeclaration> checkImportLibrary(String header) {
+        StandardHeaderParser parser = new StandardHeaderParser(tlogger);
+        try {
+            List<HeaderDeclaration> decls = parser.parseImportLibraryHeader(header);
+            assertFalse(parser.foundProblems());
+            assertFalse(parser.foundProblems(Severity.INFO));
+            assertFalse(parser.foundProblems(Severity.WARNING));
+            assertFalse(parser.foundProblems(Severity.ERROR));
+            return decls;
+        } catch (BundleManifestParseException bmpe) {
+            System.out.println(bmpe.getMessage());
+            fail("Unexpected exception: " + bmpe.getMessage());
+        }
+        return null;
+    }
+
+    private List<HeaderDeclaration> checkRequireBundle(String header) {
+        StandardHeaderParser parser = new StandardHeaderParser(tlogger);
+        // org.eclipse.virgo.util.osgi.manifest.parse.HeaderParser parser = new AntlrHeaderParser(tl);
+
+        try {
+            return parser.parseRequireBundleHeader(header);
+            // List<org.eclipse.virgo.util.osgi.manifest.parse.HeaderDeclaration> decls =
+            // parser.parseRequireBundleHeader(header);
+
+            // List<HeaderDeclaration> decls2 = new ArrayList<HeaderDeclaration>();
+
+            // for (Iterator iterator = decls.iterator(); iterator.hasNext();) {
+
+            // org.eclipse.virgo.util.osgi.manifest.parse.HeaderDeclaration hd =
+
+            // (org.eclipse.virgo.util.osgi.manifest.parse.HeaderDeclaration) iterator
+
+            // .next();
+
+            // decls2.add(new ImmutableHeaderDeclaration(hd.getNames(), hd.getAttributes(), hd.getDirectives()));
+
+            // }
+
+            // return decls2;
+
+        } catch (BundleManifestParseException bmpe) {
+            System.out.println(bmpe.getMessage());
+            fail("Unexpected exception: " + bmpe.getMessage());
+        }
+        return null;
+    }
+
+    private void checkDecls(List<HeaderDeclaration> decls, String... expectedHeaders) {
+        assertEquals(expectedHeaders.length, decls.size());
+        int i = 0;
+        for (String expectedHeader : expectedHeaders) {
+            checkDecl(decls.get(i++), expectedHeader);
+        }
+    }
+
+    private void checkDecl(HeaderDeclaration parsedHeaderDecl, String expectedHeaderDecl) {
+        assertEquals(expectedHeaderDecl, formatHeaderDeclaration(parsedHeaderDecl));
+    }
+
+    /**
+     * @param hd HeaderDeclaration to be formatted
+     * @return fixed formatted string containing the header information - attributes are sorted to ensure reliable
+     *         string formats.
+     */
+    private String formatHeaderDeclaration(HeaderDeclaration hd) {
+        StringBuilder sb = new StringBuilder();
+        sb.append("names=[");
+        List<String> names = hd.getNames();
+        int i = 0;
+        for (String name : names) {
+            if (i > 0) {
+                sb.append(" ");
+            }
+            sb.append(name);
+            i++;
+        }
+        sb.append("]");
+
+        Map<String, String> attrs = hd.getAttributes();
+        if (attrs != null && attrs.size() != 0) {
+            sb.append(" attrs=[");
+            i = 0;
+            Set<String> keys = attrs.keySet();
+            // Alphabetical order
+
+            List<String> keysList = new ArrayList<String>();
+            keysList.addAll(keys);
+            Collections.sort(keysList);
+            for (String key : keysList) {
+                if (i > 0) {
+                    sb.append(" ");
+                }
+                sb.append(key).append("=").append(attrs.get(key));
+                i++;
+            }
+            sb.append("]");
+        }
+        Map<String, String> dirs = hd.getDirectives();
+        if (dirs != null && dirs.size() != 0) {
+            sb.append(" directives=[");
+            i = 0;
+            Set<String> keys = dirs.keySet();
+            // Alphabetical order
+
+            List<String> keysList = new ArrayList<String>();
+            keysList.addAll(keys);
+            Collections.sort(keysList);
+            for (String key : keysList) {
+                if (i > 0) {
+                    sb.append(" ");
+                }
+                sb.append(key).append(":=").append(dirs.get(key));
+                i++;
+            }
+            sb.append("]");
+        }
+        return sb.toString();
+    }
+
+    private HeaderParser getParser() {
+        return new StandardHeaderParser(tlogger);
+    }
+
+    private void checkVisited(ByteArrayOutputStream baos, String expected) {
+        String visitorOutput = new String(baos.toByteArray());
+        StringTokenizer st = new StringTokenizer(expected);
+        int pos = -1;
+        while (st.hasMoreTokens()) {
+            String tok = st.nextToken();
+            int pos2 = visitorOutput.indexOf(tok);
+            if (pos2 == -1) {
+                fail("Could not find '" + tok + "' in data '" + visitorOutput + "'");
+            }
+            if (pos2 < pos) {
+                // doesn't appear to be in the right order...
+
+                System.out.println("VisitorOutput:\n" + visitorOutput + "\nExpected:" + expected);
+                fail("Visitor report incorrect");
+            }
+            pos = pos2;
+        }
+    }
+}
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/TestLogger.java b/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/TestLogger.java
new file mode 100755
index 0000000..8339018
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/test/java/org/eclipse/virgo/util/osgi/manifest/parse/standard/TestLogger.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi.manifest.parse.standard;
+
+
+
+import org.eclipse.virgo.util.osgi.manifest.parse.ParserLogger;
+
+
+
+/**
+
+ * Simple test logger for use in the other tests.
+
+ * 
+
+
+ */
+
+public class TestLogger implements ParserLogger {
+
+
+
+	public String[] errorReports() {
+
+		return null;
+
+	}
+
+
+
+	public void messageProcessed(String eventCode, String message) {
+
+	}
+
+
+
+	public void outputErrorMsg(Exception re, String item) {
+
+	}
+
+
+
+	public void outputInfoMsg(Exception re, String item) {
+
+	}
+
+
+
+	public void outputWarnMsg(Exception re, String item) {
+
+	}
+
+
+
+	public void resetErrorReport() {
+
+	}
+
+
+
+}
+
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/test/resources/manifests.zip b/util/org.eclipse.virgo.util.osgi.manifest/src/test/resources/manifests.zip
new file mode 100755
index 0000000..d9e16c0
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/test/resources/manifests.zip
Binary files differ
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/test/resources/org/eclipse/virgo/util/osgi/manifest/internal/all-headers.mf b/util/org.eclipse.virgo.util.osgi.manifest/src/test/resources/org/eclipse/virgo/util/osgi/manifest/internal/all-headers.mf
new file mode 100755
index 0000000..6454568
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/test/resources/org/eclipse/virgo/util/osgi/manifest/internal/all-headers.mf
@@ -0,0 +1,18 @@
+Manifest-Version: 1.0
+Bundle-ActivationPolicy: lazy
+Bundle-ClassPath: .,a.jar,b.jar
+Bundle-Description: The description
+Bundle-ManifestVersion: 2
+Bundle-Name: The name
+Bundle-SymbolicName: com.foo.bar
+Bundle-UpdateLocation: http://update.com
+DynamicImport-Package: com.foo.*
+Export-Package: com.bar
+Fragment-Host: com.foo.host
+Import-Bundle: com.baz
+Import-Library: com.lib
+Import-Package: com.pkg
+Module-Scope: the.scope
+Module-Type: web
+Require-Bundle: com.req
+Bundle-Version: 1.2.3
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/test/resources/org/eclipse/virgo/util/osgi/manifest/internal/badManifest.mf b/util/org.eclipse.virgo.util.osgi.manifest/src/test/resources/org/eclipse/virgo/util/osgi/manifest/internal/badManifest.mf
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/test/resources/org/eclipse/virgo/util/osgi/manifest/internal/badManifest.mf
@@ -0,0 +1 @@
+
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/test/resources/org/eclipse/virgo/util/osgi/manifest/internal/basic.mf b/util/org.eclipse.virgo.util.osgi.manifest/src/test/resources/org/eclipse/virgo/util/osgi/manifest/internal/basic.mf
new file mode 100755
index 0000000..a52fd09
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/test/resources/org/eclipse/virgo/util/osgi/manifest/internal/basic.mf
@@ -0,0 +1,2 @@
+Manifest-Version: 1.0
+Foo: bar
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/test/resources/org/eclipse/virgo/util/osgi/manifest/internal/goodManifest.mf b/util/org.eclipse.virgo.util.osgi.manifest/src/test/resources/org/eclipse/virgo/util/osgi/manifest/internal/goodManifest.mf
new file mode 100644
index 0000000..1ea6a8b
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/test/resources/org/eclipse/virgo/util/osgi/manifest/internal/goodManifest.mf
@@ -0,0 +1 @@
+Manifest-Version: 2.0
diff --git a/util/org.eclipse.virgo.util.osgi.manifest/src/test/resources/org/eclipse/virgo/util/osgi/manifest/internal/verylarge.mf b/util/org.eclipse.virgo.util.osgi.manifest/src/test/resources/org/eclipse/virgo/util/osgi/manifest/internal/verylarge.mf
new file mode 100755
index 0000000..8061290
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/src/test/resources/org/eclipse/virgo/util/osgi/manifest/internal/verylarge.mf
@@ -0,0 +1,10006 @@
+Manifest-Version: 1.0

+Bundle-ManifestVersion: 2

+Bundle-SymbolicName: very.large.manifest

+Import-Package: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx10,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx11,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx12,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx13,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx14,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx15,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx16,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx17,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx18,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx19,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx20,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx21,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx22,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx23,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx24,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx25,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx26,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx27,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx28,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx29,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx30,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx31,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx32,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx33,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx34,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx35,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx36,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx37,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx38,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx39,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx40,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx41,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx42,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx43,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx44,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx45,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx46,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx47,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx48,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx49,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx50,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx51,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx52,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx53,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx54,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx55,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx56,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx57,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx58,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx59,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx60,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx61,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx62,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx63,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx64,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx65,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx66,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx67,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx68,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx69,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx70,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx71,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx72,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx73,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx74,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx75,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx76,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx77,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx78,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx79,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx80,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx81,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx82,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx83,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx84,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx85,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx86,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx87,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx88,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx89,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx90,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx91,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx92,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx93,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx94,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx95,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx96,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx97,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx98,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx99,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx100,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx101,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx102,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx103,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx104,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx105,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx106,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx107,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx108,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx109,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx110,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx111,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx112,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx113,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx114,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx115,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx116,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx117,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx118,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx119,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx120,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx121,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx122,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx123,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx124,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx125,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx126,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx127,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx128,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx129,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx130,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx131,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx132,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx133,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx134,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx135,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx136,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx137,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx138,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx139,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx140,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx141,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx142,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx143,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx144,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx145,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx146,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx147,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx148,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx149,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx150,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx151,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx152,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx153,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx154,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx155,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx156,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx157,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx158,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx159,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx160,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx161,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx162,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx163,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx164,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx165,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx166,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx167,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx168,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx169,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx170,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx171,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx172,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx173,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx174,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx175,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx176,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx177,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx178,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx179,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx180,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx181,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx182,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx183,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx184,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx185,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx186,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx187,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx188,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx189,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx190,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx191,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx192,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx193,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx194,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx195,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx196,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx197,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx198,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx199,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx200,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx201,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx202,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx203,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx204,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx205,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx206,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx207,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx208,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx209,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx210,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx211,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx212,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx213,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx214,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx215,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx216,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx217,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx218,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx219,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx220,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx221,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx222,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx223,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx224,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx225,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx226,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx227,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx228,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx229,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx230,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx231,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx232,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx233,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx234,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx235,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx236,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx237,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx238,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx239,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx240,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx241,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx242,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx243,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx244,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx245,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx246,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx247,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx248,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx249,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx250,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx251,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx252,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx253,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx254,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx255,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx256,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx257,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx258,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx259,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx260,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx261,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx262,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx263,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx264,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx265,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx266,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx267,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx268,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx269,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx270,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx271,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx272,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx273,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx274,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx275,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx276,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx277,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx278,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx279,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx280,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx281,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx282,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx283,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx284,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx285,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx286,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx287,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx288,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx289,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx290,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx291,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx292,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx293,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx294,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx295,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx296,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx297,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx298,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx299,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx300,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx301,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx302,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx303,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx304,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx305,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx306,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx307,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx308,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx309,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx310,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx311,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx312,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx313,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx314,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx315,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx316,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx317,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx318,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx319,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx320,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx321,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx322,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx323,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx324,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx325,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx326,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx327,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx328,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx329,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx330,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx331,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx332,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx333,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx334,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx335,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx336,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx337,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx338,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx339,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx340,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx341,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx342,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx343,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx344,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx345,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx346,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx347,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx348,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx349,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx350,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx351,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx352,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx353,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx354,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx355,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx356,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx357,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx358,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx359,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx360,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx361,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx362,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx363,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx364,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx365,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx366,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx367,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx368,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx369,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx370,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx371,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx372,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx373,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx374,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx375,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx376,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx377,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx378,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx379,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx380,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx381,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx382,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx383,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx384,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx385,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx386,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx387,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx388,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx389,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx390,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx391,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx392,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx393,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx394,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx395,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx396,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx397,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx398,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx399,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx400,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx401,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx402,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx403,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx404,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx405,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx406,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx407,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx408,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx409,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx410,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx411,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx412,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx413,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx414,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx415,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx416,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx417,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx418,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx419,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx420,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx421,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx422,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx423,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx424,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx425,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx426,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx427,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx428,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx429,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx430,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx431,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx432,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx433,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx434,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx435,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx436,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx437,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx438,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx439,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx440,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx441,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx442,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx443,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx444,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx445,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx446,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx447,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx448,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx449,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx450,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx451,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx452,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx453,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx454,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx455,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx456,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx457,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx458,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx459,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx460,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx461,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx462,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx463,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx464,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx465,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx466,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx467,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx468,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx469,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx470,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx471,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx472,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx473,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx474,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx475,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx476,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx477,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx478,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx479,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx480,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx481,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx482,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx483,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx484,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx485,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx486,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx487,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx488,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx489,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx490,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx491,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx492,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx493,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx494,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx495,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx496,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx497,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx498,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx499,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx500,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx501,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx502,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx503,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx504,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx505,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx506,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx507,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx508,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx509,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx510,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx511,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx512,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx513,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx514,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx515,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx516,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx517,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx518,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx519,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx520,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx521,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx522,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx523,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx524,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx525,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx526,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx527,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx528,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx529,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx530,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx531,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx532,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx533,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx534,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx535,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx536,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx537,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx538,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx539,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx540,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx541,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx542,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx543,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx544,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx545,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx546,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx547,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx548,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx549,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx550,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx551,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx552,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx553,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx554,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx555,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx556,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx557,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx558,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx559,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx560,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx561,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx562,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx563,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx564,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx565,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx566,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx567,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx568,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx569,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx570,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx571,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx572,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx573,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx574,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx575,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx576,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx577,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx578,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx579,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx580,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx581,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx582,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx583,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx584,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx585,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx586,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx587,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx588,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx589,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx590,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx591,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx592,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx593,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx594,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx595,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx596,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx597,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx598,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx599,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx600,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx601,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx602,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx603,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx604,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx605,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx606,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx607,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx608,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx609,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx610,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx611,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx612,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx613,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx614,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx615,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx616,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx617,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx618,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx619,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx620,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx621,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx622,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx623,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx624,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx625,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx626,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx627,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx628,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx629,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx630,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx631,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx632,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx633,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx634,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx635,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx636,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx637,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx638,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx639,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx640,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx641,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx642,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx643,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx644,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx645,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx646,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx647,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx648,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx649,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx650,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx651,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx652,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx653,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx654,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx655,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx656,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx657,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx658,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx659,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx660,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx661,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx662,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx663,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx664,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx665,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx666,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx667,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx668,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx669,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx670,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx671,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx672,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx673,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx674,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx675,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx676,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx677,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx678,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx679,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx680,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx681,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx682,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx683,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx684,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx685,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx686,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx687,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx688,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx689,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx690,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx691,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx692,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx693,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx694,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx695,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx696,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx697,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx698,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx699,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx700,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx701,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx702,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx703,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx704,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx705,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx706,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx707,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx708,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx709,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx710,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx711,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx712,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx713,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx714,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx715,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx716,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx717,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx718,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx719,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx720,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx721,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx722,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx723,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx724,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx725,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx726,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx727,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx728,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx729,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx730,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx731,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx732,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx733,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx734,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx735,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx736,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx737,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx738,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx739,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx740,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx741,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx742,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx743,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx744,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx745,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx746,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx747,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx748,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx749,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx750,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx751,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx752,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx753,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx754,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx755,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx756,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx757,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx758,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx759,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx760,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx761,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx762,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx763,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx764,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx765,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx766,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx767,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx768,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx769,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx770,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx771,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx772,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx773,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx774,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx775,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx776,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx777,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx778,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx779,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx780,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx781,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx782,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx783,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx784,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx785,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx786,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx787,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx788,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx789,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx790,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx791,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx792,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx793,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx794,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx795,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx796,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx797,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx798,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx799,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx800,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx801,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx802,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx803,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx804,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx805,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx806,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx807,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx808,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx809,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx810,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx811,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx812,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx813,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx814,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx815,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx816,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx817,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx818,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx819,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx820,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx821,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx822,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx823,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx824,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx825,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx826,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx827,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx828,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx829,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx830,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx831,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx832,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx833,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx834,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx835,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx836,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx837,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx838,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx839,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx840,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx841,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx842,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx843,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx844,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx845,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx846,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx847,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx848,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx849,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx850,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx851,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx852,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx853,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx854,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx855,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx856,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx857,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx858,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx859,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx860,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx861,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx862,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx863,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx864,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx865,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx866,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx867,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx868,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx869,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx870,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx871,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx872,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx873,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx874,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx875,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx876,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx877,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx878,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx879,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx880,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx881,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx882,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx883,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx884,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx885,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx886,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx887,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx888,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx889,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx890,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx891,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx892,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx893,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx894,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx895,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx896,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx897,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx898,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx899,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx900,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx901,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx902,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx903,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx904,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx905,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx906,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx907,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx908,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx909,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx910,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx911,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx912,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx913,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx914,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx915,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx916,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx917,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx918,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx919,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx920,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx921,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx922,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx923,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx924,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx925,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx926,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx927,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx928,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx929,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx930,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx931,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx932,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx933,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx934,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx935,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx936,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx937,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx938,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx939,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx940,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx941,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx942,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx943,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx944,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx945,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx946,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx947,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx948,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx949,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx950,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx951,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx952,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx953,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx954,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx955,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx956,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx957,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx958,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx959,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx960,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx961,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx962,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx963,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx964,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx965,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx966,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx967,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx968,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx969,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx970,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx971,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx972,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx973,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx974,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx975,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx976,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx977,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx978,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx979,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx980,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx981,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx982,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx983,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx984,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx985,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx986,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx987,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx988,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx989,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx990,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx991,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx992,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx993,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx994,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx995,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx996,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx997,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx998,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx999,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1000,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1001,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1002,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1003,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1004,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1005,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1006,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1007,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1008,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1009,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1010,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1011,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1012,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1013,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1014,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1015,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1016,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1017,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1018,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1019,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1020,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1021,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1022,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1023,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1024,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1025,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1026,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1027,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1028,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1029,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1030,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1031,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1032,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1033,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1034,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1035,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1036,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1037,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1038,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1039,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1040,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1041,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1042,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1043,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1044,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1045,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1046,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1047,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1048,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1049,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1050,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1051,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1052,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1053,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1054,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1055,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1056,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1057,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1058,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1059,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1060,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1061,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1062,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1063,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1064,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1065,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1066,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1067,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1068,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1069,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1070,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1071,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1072,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1073,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1074,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1075,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1076,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1077,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1078,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1079,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1080,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1081,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1082,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1083,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1084,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1085,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1086,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1087,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1088,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1089,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1090,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1091,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1092,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1093,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1094,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1095,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1096,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1097,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1098,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1099,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1100,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1101,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1102,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1103,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1104,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1105,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1106,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1107,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1108,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1109,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1110,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1111,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1112,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1113,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1114,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1115,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1116,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1117,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1118,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1119,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1120,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1121,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1122,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1123,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1124,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1125,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1126,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1127,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1128,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1129,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1130,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1131,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1132,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1133,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1134,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1135,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1136,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1137,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1138,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1139,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1140,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1141,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1142,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1143,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1144,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1145,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1146,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1147,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1148,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1149,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1150,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1151,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1152,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1153,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1154,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1155,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1156,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1157,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1158,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1159,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1160,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1161,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1162,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1163,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1164,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1165,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1166,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1167,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1168,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1169,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1170,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1171,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1172,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1173,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1174,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1175,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1176,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1177,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1178,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1179,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1180,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1181,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1182,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1183,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1184,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1185,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1186,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1187,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1188,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1189,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1190,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1191,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1192,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1193,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1194,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1195,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1196,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1197,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1198,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1199,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1200,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1201,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1202,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1203,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1204,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1205,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1206,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1207,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1208,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1209,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1210,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1211,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1212,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1213,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1214,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1215,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1216,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1217,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1218,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1219,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1220,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1221,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1222,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1223,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1224,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1225,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1226,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1227,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1228,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1229,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1230,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1231,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1232,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1233,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1234,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1235,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1236,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1237,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1238,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1239,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1240,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1241,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1242,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1243,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1244,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1245,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1246,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1247,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1248,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1249,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1250,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1251,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1252,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1253,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1254,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1255,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1256,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1257,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1258,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1259,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1260,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1261,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1262,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1263,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1264,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1265,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1266,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1267,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1268,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1269,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1270,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1271,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1272,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1273,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1274,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1275,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1276,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1277,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1278,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1279,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1280,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1281,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1282,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1283,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1284,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1285,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1286,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1287,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1288,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1289,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1290,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1291,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1292,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1293,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1294,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1295,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1296,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1297,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1298,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1299,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1300,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1301,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1302,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1303,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1304,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1305,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1306,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1307,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1308,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1309,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1310,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1311,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1312,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1313,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1314,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1315,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1316,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1317,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1318,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1319,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1320,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1321,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1322,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1323,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1324,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1325,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1326,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1327,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1328,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1329,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1330,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1331,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1332,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1333,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1334,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1335,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1336,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1337,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1338,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1339,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1340,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1341,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1342,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1343,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1344,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1345,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1346,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1347,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1348,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1349,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1350,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1351,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1352,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1353,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1354,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1355,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1356,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1357,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1358,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1359,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1360,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1361,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1362,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1363,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1364,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1365,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1366,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1367,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1368,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1369,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1370,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1371,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1372,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1373,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1374,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1375,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1376,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1377,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1378,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1379,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1380,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1381,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1382,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1383,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1384,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1385,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1386,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1387,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1388,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1389,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1390,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1391,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1392,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1393,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1394,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1395,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1396,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1397,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1398,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1399,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1400,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1401,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1402,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1403,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1404,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1405,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1406,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1407,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1408,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1409,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1410,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1411,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1412,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1413,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1414,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1415,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1416,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1417,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1418,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1419,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1420,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1421,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1422,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1423,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1424,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1425,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1426,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1427,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1428,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1429,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1430,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1431,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1432,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1433,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1434,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1435,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1436,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1437,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1438,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1439,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1440,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1441,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1442,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1443,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1444,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1445,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1446,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1447,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1448,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1449,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1450,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1451,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1452,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1453,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1454,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1455,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1456,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1457,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1458,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1459,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1460,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1461,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1462,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1463,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1464,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1465,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1466,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1467,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1468,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1469,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1470,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1471,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1472,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1473,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1474,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1475,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1476,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1477,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1478,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1479,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1480,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1481,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1482,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1483,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1484,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1485,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1486,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1487,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1488,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1489,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1490,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1491,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1492,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1493,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1494,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1495,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1496,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1497,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1498,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1499,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1500,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1501,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1502,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1503,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1504,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1505,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1506,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1507,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1508,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1509,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1510,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1511,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1512,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1513,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1514,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1515,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1516,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1517,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1518,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1519,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1520,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1521,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1522,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1523,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1524,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1525,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1526,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1527,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1528,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1529,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1530,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1531,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1532,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1533,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1534,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1535,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1536,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1537,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1538,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1539,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1540,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1541,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1542,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1543,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1544,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1545,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1546,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1547,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1548,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1549,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1550,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1551,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1552,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1553,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1554,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1555,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1556,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1557,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1558,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1559,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1560,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1561,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1562,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1563,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1564,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1565,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1566,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1567,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1568,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1569,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1570,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1571,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1572,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1573,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1574,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1575,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1576,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1577,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1578,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1579,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1580,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1581,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1582,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1583,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1584,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1585,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1586,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1587,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1588,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1589,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1590,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1591,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1592,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1593,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1594,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1595,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1596,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1597,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1598,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1599,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1600,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1601,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1602,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1603,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1604,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1605,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1606,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1607,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1608,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1609,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1610,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1611,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1612,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1613,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1614,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1615,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1616,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1617,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1618,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1619,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1620,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1621,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1622,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1623,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1624,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1625,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1626,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1627,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1628,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1629,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1630,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1631,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1632,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1633,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1634,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1635,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1636,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1637,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1638,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1639,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1640,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1641,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1642,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1643,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1644,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1645,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1646,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1647,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1648,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1649,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1650,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1651,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1652,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1653,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1654,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1655,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1656,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1657,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1658,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1659,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1660,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1661,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1662,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1663,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1664,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1665,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1666,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1667,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1668,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1669,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1670,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1671,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1672,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1673,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1674,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1675,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1676,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1677,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1678,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1679,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1680,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1681,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1682,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1683,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1684,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1685,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1686,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1687,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1688,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1689,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1690,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1691,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1692,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1693,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1694,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1695,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1696,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1697,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1698,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1699,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1700,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1701,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1702,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1703,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1704,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1705,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1706,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1707,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1708,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1709,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1710,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1711,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1712,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1713,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1714,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1715,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1716,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1717,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1718,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1719,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1720,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1721,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1722,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1723,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1724,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1725,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1726,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1727,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1728,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1729,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1730,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1731,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1732,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1733,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1734,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1735,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1736,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1737,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1738,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1739,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1740,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1741,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1742,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1743,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1744,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1745,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1746,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1747,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1748,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1749,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1750,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1751,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1752,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1753,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1754,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1755,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1756,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1757,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1758,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1759,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1760,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1761,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1762,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1763,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1764,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1765,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1766,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1767,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1768,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1769,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1770,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1771,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1772,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1773,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1774,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1775,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1776,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1777,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1778,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1779,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1780,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1781,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1782,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1783,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1784,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1785,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1786,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1787,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1788,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1789,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1790,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1791,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1792,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1793,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1794,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1795,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1796,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1797,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1798,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1799,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1800,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1801,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1802,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1803,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1804,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1805,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1806,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1807,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1808,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1809,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1810,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1811,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1812,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1813,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1814,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1815,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1816,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1817,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1818,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1819,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1820,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1821,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1822,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1823,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1824,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1825,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1826,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1827,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1828,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1829,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1830,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1831,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1832,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1833,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1834,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1835,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1836,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1837,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1838,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1839,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1840,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1841,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1842,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1843,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1844,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1845,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1846,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1847,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1848,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1849,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1850,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1851,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1852,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1853,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1854,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1855,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1856,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1857,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1858,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1859,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1860,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1861,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1862,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1863,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1864,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1865,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1866,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1867,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1868,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1869,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1870,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1871,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1872,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1873,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1874,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1875,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1876,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1877,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1878,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1879,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1880,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1881,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1882,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1883,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1884,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1885,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1886,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1887,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1888,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1889,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1890,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1891,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1892,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1893,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1894,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1895,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1896,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1897,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1898,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1899,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1900,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1901,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1902,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1903,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1904,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1905,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1906,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1907,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1908,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1909,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1910,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1911,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1912,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1913,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1914,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1915,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1916,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1917,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1918,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1919,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1920,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1921,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1922,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1923,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1924,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1925,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1926,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1927,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1928,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1929,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1930,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1931,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1932,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1933,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1934,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1935,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1936,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1937,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1938,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1939,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1940,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1941,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1942,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1943,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1944,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1945,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1946,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1947,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1948,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1949,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1950,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1951,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1952,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1953,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1954,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1955,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1956,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1957,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1958,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1959,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1960,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1961,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1962,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1963,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1964,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1965,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1966,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1967,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1968,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1969,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1970,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1971,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1972,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1973,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1974,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1975,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1976,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1977,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1978,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1979,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1980,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1981,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1982,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1983,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1984,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1985,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1986,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1987,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1988,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1989,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1990,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1991,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1992,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1993,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1994,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1995,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1996,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1997,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1998,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1999,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2000,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2001,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2002,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2003,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2004,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2005,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2006,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2007,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2008,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2009,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2010,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2011,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2012,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2013,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2014,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2015,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2016,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2017,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2018,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2019,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2020,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2021,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2022,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2023,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2024,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2025,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2026,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2027,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2028,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2029,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2030,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2031,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2032,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2033,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2034,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2035,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2036,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2037,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2038,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2039,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2040,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2041,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2042,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2043,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2044,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2045,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2046,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2047,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2048,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2049,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2050,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2051,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2052,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2053,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2054,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2055,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2056,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2057,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2058,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2059,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2060,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2061,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2062,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2063,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2064,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2065,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2066,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2067,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2068,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2069,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2070,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2071,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2072,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2073,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2074,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2075,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2076,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2077,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2078,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2079,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2080,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2081,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2082,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2083,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2084,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2085,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2086,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2087,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2088,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2089,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2090,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2091,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2092,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2093,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2094,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2095,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2096,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2097,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2098,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2099,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2100,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2101,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2102,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2103,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2104,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2105,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2106,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2107,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2108,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2109,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2110,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2111,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2112,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2113,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2114,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2115,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2116,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2117,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2118,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2119,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2120,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2121,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2122,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2123,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2124,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2125,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2126,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2127,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2128,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2129,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2130,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2131,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2132,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2133,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2134,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2135,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2136,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2137,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2138,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2139,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2140,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2141,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2142,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2143,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2144,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2145,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2146,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2147,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2148,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2149,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2150,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2151,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2152,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2153,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2154,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2155,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2156,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2157,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2158,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2159,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2160,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2161,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2162,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2163,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2164,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2165,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2166,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2167,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2168,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2169,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2170,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2171,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2172,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2173,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2174,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2175,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2176,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2177,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2178,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2179,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2180,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2181,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2182,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2183,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2184,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2185,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2186,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2187,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2188,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2189,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2190,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2191,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2192,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2193,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2194,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2195,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2196,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2197,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2198,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2199,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2200,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2201,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2202,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2203,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2204,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2205,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2206,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2207,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2208,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2209,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2210,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2211,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2212,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2213,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2214,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2215,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2216,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2217,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2218,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2219,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2220,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2221,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2222,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2223,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2224,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2225,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2226,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2227,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2228,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2229,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2230,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2231,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2232,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2233,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2234,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2235,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2236,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2237,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2238,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2239,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2240,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2241,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2242,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2243,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2244,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2245,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2246,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2247,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2248,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2249,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2250,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2251,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2252,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2253,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2254,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2255,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2256,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2257,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2258,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2259,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2260,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2261,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2262,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2263,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2264,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2265,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2266,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2267,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2268,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2269,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2270,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2271,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2272,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2273,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2274,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2275,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2276,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2277,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2278,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2279,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2280,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2281,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2282,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2283,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2284,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2285,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2286,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2287,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2288,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2289,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2290,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2291,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2292,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2293,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2294,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2295,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2296,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2297,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2298,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2299,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2300,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2301,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2302,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2303,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2304,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2305,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2306,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2307,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2308,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2309,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2310,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2311,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2312,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2313,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2314,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2315,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2316,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2317,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2318,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2319,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2320,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2321,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2322,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2323,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2324,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2325,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2326,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2327,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2328,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2329,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2330,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2331,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2332,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2333,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2334,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2335,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2336,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2337,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2338,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2339,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2340,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2341,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2342,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2343,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2344,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2345,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2346,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2347,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2348,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2349,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2350,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2351,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2352,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2353,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2354,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2355,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2356,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2357,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2358,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2359,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2360,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2361,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2362,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2363,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2364,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2365,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2366,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2367,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2368,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2369,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2370,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2371,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2372,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2373,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2374,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2375,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2376,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2377,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2378,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2379,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2380,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2381,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2382,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2383,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2384,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2385,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2386,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2387,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2388,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2389,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2390,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2391,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2392,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2393,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2394,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2395,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2396,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2397,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2398,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2399,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2400,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2401,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2402,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2403,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2404,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2405,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2406,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2407,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2408,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2409,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2410,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2411,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2412,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2413,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2414,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2415,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2416,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2417,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2418,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2419,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2420,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2421,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2422,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2423,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2424,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2425,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2426,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2427,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2428,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2429,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2430,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2431,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2432,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2433,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2434,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2435,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2436,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2437,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2438,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2439,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2440,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2441,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2442,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2443,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2444,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2445,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2446,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2447,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2448,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2449,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2450,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2451,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2452,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2453,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2454,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2455,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2456,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2457,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2458,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2459,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2460,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2461,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2462,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2463,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2464,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2465,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2466,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2467,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2468,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2469,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2470,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2471,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2472,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2473,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2474,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2475,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2476,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2477,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2478,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2479,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2480,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2481,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2482,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2483,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2484,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2485,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2486,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2487,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2488,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2489,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2490,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2491,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2492,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2493,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2494,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2495,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2496,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2497,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2498,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2499,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2500,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2501,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2502,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2503,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2504,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2505,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2506,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2507,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2508,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2509,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2510,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2511,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2512,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2513,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2514,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2515,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2516,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2517,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2518,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2519,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2520,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2521,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2522,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2523,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2524,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2525,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2526,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2527,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2528,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2529,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2530,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2531,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2532,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2533,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2534,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2535,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2536,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2537,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2538,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2539,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2540,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2541,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2542,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2543,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2544,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2545,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2546,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2547,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2548,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2549,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2550,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2551,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2552,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2553,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2554,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2555,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2556,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2557,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2558,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2559,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2560,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2561,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2562,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2563,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2564,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2565,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2566,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2567,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2568,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2569,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2570,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2571,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2572,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2573,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2574,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2575,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2576,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2577,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2578,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2579,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2580,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2581,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2582,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2583,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2584,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2585,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2586,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2587,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2588,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2589,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2590,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2591,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2592,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2593,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2594,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2595,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2596,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2597,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2598,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2599,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2600,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2601,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2602,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2603,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2604,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2605,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2606,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2607,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2608,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2609,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2610,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2611,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2612,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2613,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2614,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2615,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2616,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2617,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2618,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2619,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2620,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2621,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2622,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2623,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2624,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2625,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2626,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2627,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2628,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2629,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2630,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2631,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2632,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2633,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2634,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2635,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2636,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2637,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2638,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2639,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2640,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2641,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2642,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2643,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2644,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2645,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2646,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2647,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2648,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2649,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2650,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2651,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2652,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2653,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2654,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2655,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2656,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2657,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2658,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2659,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2660,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2661,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2662,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2663,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2664,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2665,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2666,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2667,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2668,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2669,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2670,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2671,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2672,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2673,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2674,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2675,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2676,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2677,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2678,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2679,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2680,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2681,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2682,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2683,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2684,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2685,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2686,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2687,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2688,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2689,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2690,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2691,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2692,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2693,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2694,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2695,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2696,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2697,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2698,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2699,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2700,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2701,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2702,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2703,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2704,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2705,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2706,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2707,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2708,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2709,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2710,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2711,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2712,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2713,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2714,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2715,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2716,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2717,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2718,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2719,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2720,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2721,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2722,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2723,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2724,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2725,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2726,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2727,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2728,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2729,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2730,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2731,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2732,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2733,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2734,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2735,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2736,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2737,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2738,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2739,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2740,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2741,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2742,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2743,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2744,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2745,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2746,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2747,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2748,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2749,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2750,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2751,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2752,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2753,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2754,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2755,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2756,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2757,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2758,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2759,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2760,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2761,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2762,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2763,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2764,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2765,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2766,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2767,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2768,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2769,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2770,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2771,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2772,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2773,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2774,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2775,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2776,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2777,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2778,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2779,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2780,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2781,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2782,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2783,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2784,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2785,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2786,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2787,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2788,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2789,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2790,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2791,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2792,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2793,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2794,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2795,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2796,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2797,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2798,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2799,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2800,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2801,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2802,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2803,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2804,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2805,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2806,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2807,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2808,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2809,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2810,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2811,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2812,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2813,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2814,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2815,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2816,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2817,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2818,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2819,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2820,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2821,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2822,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2823,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2824,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2825,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2826,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2827,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2828,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2829,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2830,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2831,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2832,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2833,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2834,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2835,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2836,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2837,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2838,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2839,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2840,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2841,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2842,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2843,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2844,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2845,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2846,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2847,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2848,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2849,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2850,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2851,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2852,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2853,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2854,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2855,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2856,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2857,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2858,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2859,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2860,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2861,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2862,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2863,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2864,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2865,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2866,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2867,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2868,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2869,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2870,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2871,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2872,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2873,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2874,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2875,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2876,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2877,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2878,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2879,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2880,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2881,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2882,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2883,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2884,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2885,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2886,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2887,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2888,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2889,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2890,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2891,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2892,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2893,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2894,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2895,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2896,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2897,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2898,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2899,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2900,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2901,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2902,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2903,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2904,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2905,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2906,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2907,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2908,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2909,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2910,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2911,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2912,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2913,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2914,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2915,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2916,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2917,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2918,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2919,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2920,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2921,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2922,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2923,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2924,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2925,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2926,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2927,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2928,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2929,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2930,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2931,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2932,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2933,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2934,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2935,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2936,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2937,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2938,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2939,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2940,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2941,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2942,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2943,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2944,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2945,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2946,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2947,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2948,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2949,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2950,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2951,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2952,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2953,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2954,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2955,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2956,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2957,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2958,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2959,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2960,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2961,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2962,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2963,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2964,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2965,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2966,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2967,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2968,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2969,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2970,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2971,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2972,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2973,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2974,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2975,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2976,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2977,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2978,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2979,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2980,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2981,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2982,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2983,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2984,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2985,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2986,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2987,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2988,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2989,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2990,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2991,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2992,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2993,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2994,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2995,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2996,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2997,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2998,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2999,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3000,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3001,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3002,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3003,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3004,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3005,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3006,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3007,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3008,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3009,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3010,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3011,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3012,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3013,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3014,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3015,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3016,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3017,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3018,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3019,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3020,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3021,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3022,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3023,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3024,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3025,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3026,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3027,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3028,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3029,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3030,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3031,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3032,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3033,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3034,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3035,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3036,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3037,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3038,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3039,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3040,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3041,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3042,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3043,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3044,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3045,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3046,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3047,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3048,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3049,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3050,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3051,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3052,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3053,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3054,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3055,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3056,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3057,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3058,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3059,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3060,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3061,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3062,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3063,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3064,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3065,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3066,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3067,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3068,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3069,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3070,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3071,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3072,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3073,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3074,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3075,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3076,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3077,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3078,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3079,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3080,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3081,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3082,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3083,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3084,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3085,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3086,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3087,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3088,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3089,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3090,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3091,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3092,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3093,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3094,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3095,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3096,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3097,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3098,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3099,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3100,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3101,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3102,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3103,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3104,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3105,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3106,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3107,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3108,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3109,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3110,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3111,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3112,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3113,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3114,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3115,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3116,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3117,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3118,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3119,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3120,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3121,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3122,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3123,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3124,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3125,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3126,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3127,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3128,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3129,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3130,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3131,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3132,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3133,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3134,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3135,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3136,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3137,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3138,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3139,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3140,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3141,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3142,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3143,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3144,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3145,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3146,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3147,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3148,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3149,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3150,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3151,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3152,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3153,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3154,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3155,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3156,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3157,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3158,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3159,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3160,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3161,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3162,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3163,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3164,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3165,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3166,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3167,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3168,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3169,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3170,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3171,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3172,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3173,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3174,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3175,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3176,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3177,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3178,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3179,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3180,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3181,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3182,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3183,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3184,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3185,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3186,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3187,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3188,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3189,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3190,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3191,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3192,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3193,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3194,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3195,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3196,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3197,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3198,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3199,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3200,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3201,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3202,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3203,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3204,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3205,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3206,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3207,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3208,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3209,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3210,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3211,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3212,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3213,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3214,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3215,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3216,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3217,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3218,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3219,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3220,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3221,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3222,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3223,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3224,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3225,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3226,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3227,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3228,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3229,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3230,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3231,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3232,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3233,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3234,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3235,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3236,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3237,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3238,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3239,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3240,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3241,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3242,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3243,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3244,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3245,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3246,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3247,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3248,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3249,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3250,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3251,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3252,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3253,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3254,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3255,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3256,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3257,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3258,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3259,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3260,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3261,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3262,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3263,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3264,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3265,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3266,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3267,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3268,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3269,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3270,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3271,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3272,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3273,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3274,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3275,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3276,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3277,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3278,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3279,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3280,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3281,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3282,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3283,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3284,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3285,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3286,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3287,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3288,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3289,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3290,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3291,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3292,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3293,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3294,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3295,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3296,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3297,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3298,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3299,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3300,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3301,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3302,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3303,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3304,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3305,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3306,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3307,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3308,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3309,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3310,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3311,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3312,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3313,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3314,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3315,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3316,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3317,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3318,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3319,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3320,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3321,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3322,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3323,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3324,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3325,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3326,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3327,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3328,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3329,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3330,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3331,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3332,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3333,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3334,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3335,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3336,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3337,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3338,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3339,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3340,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3341,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3342,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3343,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3344,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3345,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3346,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3347,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3348,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3349,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3350,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3351,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3352,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3353,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3354,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3355,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3356,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3357,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3358,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3359,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3360,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3361,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3362,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3363,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3364,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3365,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3366,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3367,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3368,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3369,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3370,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3371,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3372,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3373,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3374,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3375,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3376,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3377,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3378,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3379,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3380,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3381,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3382,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3383,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3384,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3385,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3386,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3387,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3388,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3389,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3390,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3391,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3392,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3393,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3394,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3395,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3396,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3397,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3398,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3399,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3400,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3401,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3402,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3403,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3404,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3405,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3406,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3407,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3408,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3409,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3410,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3411,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3412,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3413,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3414,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3415,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3416,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3417,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3418,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3419,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3420,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3421,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3422,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3423,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3424,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3425,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3426,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3427,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3428,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3429,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3430,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3431,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3432,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3433,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3434,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3435,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3436,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3437,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3438,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3439,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3440,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3441,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3442,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3443,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3444,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3445,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3446,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3447,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3448,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3449,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3450,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3451,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3452,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3453,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3454,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3455,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3456,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3457,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3458,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3459,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3460,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3461,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3462,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3463,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3464,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3465,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3466,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3467,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3468,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3469,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3470,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3471,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3472,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3473,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3474,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3475,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3476,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3477,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3478,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3479,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3480,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3481,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3482,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3483,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3484,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3485,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3486,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3487,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3488,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3489,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3490,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3491,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3492,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3493,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3494,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3495,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3496,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3497,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3498,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3499,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3500,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3501,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3502,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3503,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3504,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3505,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3506,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3507,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3508,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3509,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3510,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3511,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3512,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3513,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3514,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3515,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3516,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3517,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3518,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3519,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3520,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3521,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3522,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3523,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3524,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3525,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3526,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3527,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3528,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3529,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3530,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3531,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3532,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3533,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3534,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3535,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3536,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3537,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3538,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3539,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3540,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3541,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3542,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3543,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3544,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3545,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3546,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3547,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3548,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3549,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3550,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3551,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3552,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3553,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3554,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3555,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3556,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3557,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3558,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3559,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3560,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3561,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3562,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3563,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3564,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3565,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3566,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3567,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3568,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3569,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3570,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3571,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3572,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3573,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3574,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3575,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3576,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3577,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3578,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3579,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3580,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3581,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3582,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3583,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3584,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3585,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3586,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3587,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3588,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3589,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3590,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3591,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3592,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3593,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3594,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3595,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3596,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3597,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3598,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3599,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3600,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3601,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3602,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3603,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3604,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3605,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3606,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3607,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3608,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3609,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3610,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3611,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3612,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3613,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3614,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3615,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3616,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3617,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3618,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3619,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3620,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3621,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3622,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3623,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3624,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3625,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3626,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3627,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3628,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3629,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3630,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3631,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3632,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3633,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3634,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3635,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3636,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3637,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3638,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3639,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3640,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3641,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3642,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3643,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3644,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3645,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3646,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3647,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3648,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3649,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3650,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3651,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3652,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3653,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3654,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3655,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3656,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3657,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3658,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3659,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3660,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3661,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3662,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3663,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3664,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3665,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3666,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3667,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3668,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3669,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3670,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3671,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3672,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3673,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3674,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3675,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3676,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3677,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3678,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3679,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3680,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3681,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3682,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3683,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3684,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3685,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3686,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3687,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3688,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3689,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3690,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3691,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3692,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3693,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3694,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3695,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3696,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3697,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3698,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3699,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3700,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3701,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3702,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3703,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3704,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3705,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3706,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3707,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3708,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3709,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3710,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3711,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3712,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3713,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3714,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3715,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3716,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3717,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3718,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3719,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3720,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3721,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3722,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3723,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3724,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3725,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3726,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3727,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3728,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3729,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3730,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3731,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3732,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3733,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3734,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3735,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3736,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3737,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3738,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3739,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3740,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3741,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3742,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3743,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3744,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3745,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3746,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3747,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3748,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3749,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3750,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3751,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3752,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3753,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3754,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3755,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3756,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3757,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3758,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3759,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3760,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3761,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3762,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3763,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3764,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3765,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3766,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3767,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3768,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3769,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3770,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3771,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3772,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3773,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3774,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3775,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3776,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3777,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3778,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3779,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3780,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3781,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3782,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3783,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3784,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3785,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3786,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3787,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3788,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3789,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3790,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3791,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3792,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3793,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3794,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3795,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3796,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3797,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3798,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3799,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3800,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3801,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3802,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3803,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3804,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3805,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3806,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3807,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3808,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3809,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3810,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3811,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3812,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3813,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3814,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3815,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3816,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3817,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3818,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3819,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3820,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3821,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3822,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3823,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3824,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3825,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3826,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3827,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3828,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3829,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3830,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3831,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3832,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3833,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3834,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3835,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3836,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3837,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3838,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3839,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3840,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3841,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3842,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3843,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3844,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3845,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3846,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3847,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3848,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3849,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3850,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3851,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3852,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3853,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3854,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3855,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3856,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3857,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3858,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3859,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3860,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3861,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3862,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3863,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3864,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3865,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3866,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3867,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3868,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3869,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3870,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3871,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3872,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3873,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3874,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3875,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3876,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3877,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3878,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3879,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3880,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3881,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3882,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3883,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3884,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3885,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3886,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3887,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3888,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3889,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3890,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3891,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3892,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3893,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3894,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3895,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3896,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3897,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3898,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3899,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3900,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3901,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3902,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3903,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3904,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3905,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3906,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3907,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3908,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3909,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3910,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3911,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3912,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3913,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3914,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3915,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3916,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3917,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3918,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3919,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3920,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3921,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3922,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3923,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3924,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3925,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3926,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3927,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3928,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3929,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3930,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3931,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3932,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3933,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3934,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3935,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3936,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3937,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3938,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3939,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3940,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3941,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3942,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3943,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3944,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3945,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3946,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3947,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3948,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3949,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3950,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3951,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3952,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3953,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3954,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3955,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3956,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3957,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3958,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3959,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3960,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3961,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3962,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3963,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3964,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3965,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3966,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3967,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3968,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3969,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3970,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3971,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3972,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3973,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3974,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3975,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3976,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3977,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3978,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3979,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3980,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3981,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3982,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3983,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3984,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3985,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3986,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3987,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3988,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3989,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3990,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3991,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3992,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3993,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3994,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3995,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3996,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3997,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3998,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3999,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4000,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4001,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4002,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4003,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4004,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4005,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4006,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4007,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4008,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4009,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4010,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4011,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4012,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4013,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4014,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4015,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4016,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4017,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4018,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4019,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4020,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4021,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4022,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4023,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4024,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4025,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4026,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4027,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4028,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4029,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4030,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4031,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4032,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4033,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4034,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4035,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4036,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4037,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4038,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4039,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4040,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4041,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4042,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4043,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4044,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4045,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4046,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4047,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4048,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4049,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4050,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4051,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4052,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4053,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4054,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4055,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4056,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4057,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4058,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4059,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4060,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4061,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4062,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4063,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4064,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4065,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4066,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4067,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4068,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4069,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4070,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4071,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4072,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4073,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4074,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4075,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4076,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4077,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4078,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4079,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4080,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4081,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4082,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4083,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4084,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4085,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4086,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4087,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4088,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4089,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4090,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4091,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4092,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4093,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4094,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4095,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4096,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4097,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4098,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4099,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4100,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4101,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4102,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4103,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4104,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4105,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4106,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4107,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4108,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4109,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4110,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4111,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4112,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4113,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4114,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4115,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4116,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4117,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4118,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4119,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4120,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4121,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4122,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4123,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4124,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4125,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4126,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4127,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4128,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4129,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4130,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4131,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4132,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4133,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4134,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4135,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4136,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4137,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4138,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4139,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4140,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4141,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4142,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4143,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4144,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4145,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4146,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4147,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4148,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4149,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4150,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4151,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4152,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4153,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4154,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4155,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4156,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4157,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4158,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4159,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4160,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4161,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4162,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4163,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4164,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4165,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4166,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4167,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4168,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4169,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4170,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4171,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4172,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4173,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4174,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4175,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4176,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4177,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4178,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4179,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4180,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4181,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4182,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4183,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4184,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4185,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4186,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4187,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4188,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4189,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4190,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4191,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4192,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4193,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4194,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4195,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4196,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4197,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4198,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4199,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4200,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4201,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4202,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4203,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4204,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4205,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4206,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4207,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4208,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4209,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4210,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4211,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4212,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4213,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4214,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4215,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4216,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4217,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4218,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4219,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4220,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4221,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4222,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4223,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4224,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4225,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4226,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4227,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4228,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4229,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4230,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4231,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4232,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4233,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4234,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4235,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4236,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4237,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4238,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4239,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4240,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4241,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4242,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4243,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4244,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4245,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4246,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4247,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4248,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4249,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4250,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4251,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4252,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4253,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4254,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4255,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4256,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4257,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4258,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4259,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4260,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4261,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4262,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4263,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4264,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4265,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4266,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4267,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4268,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4269,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4270,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4271,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4272,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4273,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4274,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4275,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4276,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4277,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4278,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4279,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4280,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4281,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4282,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4283,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4284,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4285,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4286,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4287,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4288,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4289,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4290,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4291,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4292,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4293,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4294,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4295,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4296,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4297,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4298,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4299,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4300,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4301,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4302,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4303,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4304,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4305,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4306,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4307,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4308,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4309,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4310,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4311,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4312,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4313,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4314,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4315,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4316,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4317,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4318,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4319,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4320,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4321,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4322,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4323,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4324,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4325,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4326,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4327,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4328,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4329,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4330,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4331,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4332,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4333,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4334,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4335,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4336,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4337,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4338,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4339,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4340,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4341,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4342,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4343,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4344,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4345,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4346,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4347,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4348,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4349,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4350,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4351,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4352,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4353,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4354,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4355,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4356,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4357,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4358,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4359,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4360,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4361,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4362,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4363,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4364,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4365,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4366,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4367,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4368,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4369,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4370,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4371,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4372,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4373,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4374,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4375,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4376,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4377,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4378,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4379,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4380,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4381,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4382,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4383,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4384,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4385,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4386,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4387,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4388,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4389,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4390,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4391,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4392,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4393,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4394,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4395,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4396,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4397,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4398,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4399,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4400,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4401,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4402,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4403,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4404,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4405,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4406,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4407,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4408,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4409,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4410,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4411,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4412,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4413,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4414,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4415,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4416,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4417,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4418,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4419,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4420,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4421,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4422,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4423,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4424,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4425,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4426,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4427,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4428,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4429,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4430,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4431,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4432,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4433,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4434,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4435,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4436,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4437,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4438,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4439,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4440,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4441,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4442,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4443,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4444,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4445,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4446,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4447,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4448,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4449,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4450,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4451,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4452,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4453,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4454,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4455,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4456,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4457,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4458,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4459,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4460,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4461,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4462,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4463,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4464,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4465,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4466,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4467,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4468,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4469,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4470,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4471,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4472,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4473,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4474,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4475,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4476,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4477,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4478,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4479,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4480,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4481,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4482,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4483,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4484,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4485,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4486,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4487,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4488,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4489,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4490,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4491,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4492,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4493,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4494,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4495,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4496,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4497,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4498,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4499,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4500,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4501,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4502,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4503,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4504,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4505,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4506,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4507,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4508,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4509,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4510,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4511,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4512,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4513,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4514,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4515,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4516,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4517,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4518,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4519,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4520,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4521,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4522,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4523,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4524,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4525,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4526,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4527,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4528,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4529,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4530,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4531,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4532,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4533,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4534,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4535,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4536,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4537,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4538,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4539,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4540,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4541,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4542,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4543,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4544,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4545,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4546,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4547,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4548,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4549,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4550,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4551,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4552,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4553,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4554,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4555,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4556,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4557,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4558,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4559,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4560,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4561,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4562,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4563,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4564,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4565,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4566,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4567,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4568,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4569,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4570,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4571,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4572,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4573,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4574,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4575,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4576,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4577,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4578,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4579,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4580,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4581,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4582,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4583,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4584,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4585,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4586,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4587,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4588,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4589,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4590,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4591,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4592,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4593,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4594,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4595,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4596,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4597,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4598,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4599,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4600,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4601,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4602,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4603,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4604,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4605,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4606,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4607,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4608,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4609,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4610,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4611,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4612,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4613,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4614,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4615,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4616,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4617,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4618,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4619,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4620,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4621,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4622,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4623,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4624,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4625,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4626,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4627,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4628,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4629,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4630,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4631,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4632,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4633,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4634,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4635,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4636,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4637,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4638,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4639,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4640,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4641,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4642,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4643,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4644,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4645,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4646,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4647,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4648,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4649,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4650,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4651,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4652,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4653,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4654,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4655,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4656,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4657,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4658,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4659,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4660,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4661,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4662,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4663,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4664,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4665,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4666,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4667,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4668,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4669,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4670,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4671,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4672,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4673,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4674,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4675,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4676,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4677,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4678,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4679,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4680,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4681,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4682,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4683,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4684,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4685,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4686,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4687,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4688,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4689,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4690,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4691,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4692,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4693,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4694,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4695,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4696,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4697,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4698,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4699,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4700,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4701,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4702,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4703,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4704,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4705,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4706,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4707,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4708,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4709,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4710,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4711,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4712,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4713,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4714,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4715,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4716,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4717,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4718,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4719,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4720,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4721,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4722,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4723,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4724,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4725,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4726,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4727,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4728,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4729,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4730,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4731,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4732,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4733,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4734,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4735,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4736,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4737,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4738,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4739,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4740,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4741,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4742,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4743,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4744,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4745,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4746,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4747,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4748,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4749,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4750,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4751,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4752,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4753,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4754,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4755,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4756,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4757,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4758,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4759,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4760,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4761,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4762,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4763,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4764,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4765,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4766,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4767,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4768,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4769,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4770,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4771,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4772,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4773,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4774,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4775,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4776,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4777,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4778,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4779,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4780,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4781,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4782,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4783,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4784,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4785,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4786,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4787,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4788,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4789,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4790,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4791,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4792,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4793,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4794,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4795,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4796,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4797,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4798,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4799,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4800,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4801,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4802,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4803,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4804,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4805,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4806,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4807,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4808,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4809,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4810,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4811,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4812,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4813,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4814,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4815,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4816,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4817,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4818,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4819,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4820,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4821,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4822,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4823,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4824,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4825,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4826,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4827,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4828,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4829,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4830,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4831,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4832,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4833,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4834,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4835,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4836,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4837,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4838,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4839,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4840,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4841,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4842,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4843,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4844,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4845,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4846,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4847,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4848,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4849,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4850,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4851,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4852,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4853,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4854,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4855,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4856,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4857,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4858,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4859,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4860,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4861,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4862,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4863,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4864,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4865,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4866,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4867,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4868,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4869,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4870,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4871,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4872,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4873,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4874,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4875,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4876,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4877,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4878,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4879,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4880,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4881,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4882,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4883,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4884,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4885,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4886,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4887,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4888,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4889,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4890,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4891,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4892,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4893,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4894,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4895,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4896,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4897,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4898,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4899,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4900,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4901,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4902,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4903,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4904,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4905,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4906,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4907,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4908,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4909,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4910,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4911,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4912,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4913,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4914,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4915,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4916,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4917,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4918,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4919,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4920,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4921,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4922,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4923,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4924,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4925,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4926,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4927,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4928,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4929,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4930,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4931,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4932,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4933,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4934,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4935,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4936,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4937,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4938,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4939,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4940,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4941,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4942,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4943,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4944,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4945,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4946,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4947,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4948,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4949,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4950,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4951,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4952,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4953,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4954,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4955,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4956,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4957,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4958,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4959,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4960,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4961,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4962,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4963,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4964,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4965,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4966,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4967,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4968,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4969,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4970,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4971,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4972,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4973,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4974,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4975,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4976,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4977,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4978,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4979,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4980,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4981,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4982,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4983,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4984,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4985,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4986,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4987,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4988,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4989,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4990,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4991,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4992,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4993,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4994,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4995,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4996,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4997,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4998,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4999,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5000,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5001,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5002,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5003,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5004,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5005,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5006,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5007,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5008,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5009,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5010,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5011,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5012,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5013,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5014,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5015,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5016,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5017,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5018,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5019,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5020,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5021,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5022,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5023,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5024,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5025,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5026,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5027,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5028,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5029,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5030,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5031,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5032,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5033,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5034,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5035,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5036,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5037,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5038,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5039,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5040,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5041,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5042,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5043,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5044,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5045,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5046,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5047,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5048,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5049,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5050,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5051,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5052,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5053,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5054,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5055,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5056,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5057,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5058,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5059,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5060,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5061,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5062,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5063,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5064,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5065,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5066,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5067,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5068,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5069,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5070,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5071,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5072,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5073,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5074,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5075,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5076,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5077,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5078,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5079,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5080,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5081,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5082,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5083,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5084,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5085,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5086,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5087,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5088,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5089,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5090,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5091,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5092,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5093,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5094,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5095,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5096,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5097,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5098,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5099,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5100,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5101,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5102,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5103,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5104,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5105,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5106,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5107,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5108,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5109,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5110,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5111,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5112,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5113,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5114,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5115,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5116,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5117,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5118,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5119,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5120,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5121,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5122,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5123,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5124,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5125,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5126,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5127,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5128,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5129,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5130,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5131,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5132,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5133,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5134,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5135,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5136,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5137,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5138,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5139,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5140,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5141,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5142,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5143,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5144,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5145,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5146,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5147,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5148,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5149,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5150,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5151,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5152,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5153,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5154,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5155,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5156,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5157,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5158,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5159,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5160,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5161,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5162,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5163,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5164,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5165,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5166,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5167,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5168,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5169,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5170,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5171,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5172,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5173,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5174,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5175,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5176,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5177,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5178,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5179,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5180,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5181,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5182,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5183,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5184,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5185,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5186,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5187,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5188,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5189,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5190,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5191,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5192,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5193,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5194,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5195,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5196,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5197,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5198,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5199,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5200,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5201,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5202,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5203,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5204,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5205,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5206,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5207,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5208,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5209,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5210,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5211,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5212,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5213,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5214,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5215,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5216,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5217,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5218,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5219,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5220,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5221,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5222,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5223,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5224,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5225,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5226,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5227,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5228,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5229,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5230,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5231,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5232,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5233,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5234,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5235,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5236,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5237,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5238,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5239,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5240,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5241,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5242,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5243,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5244,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5245,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5246,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5247,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5248,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5249,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5250,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5251,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5252,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5253,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5254,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5255,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5256,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5257,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5258,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5259,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5260,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5261,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5262,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5263,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5264,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5265,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5266,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5267,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5268,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5269,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5270,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5271,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5272,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5273,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5274,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5275,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5276,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5277,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5278,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5279,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5280,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5281,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5282,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5283,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5284,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5285,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5286,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5287,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5288,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5289,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5290,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5291,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5292,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5293,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5294,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5295,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5296,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5297,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5298,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5299,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5300,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5301,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5302,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5303,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5304,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5305,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5306,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5307,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5308,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5309,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5310,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5311,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5312,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5313,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5314,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5315,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5316,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5317,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5318,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5319,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5320,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5321,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5322,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5323,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5324,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5325,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5326,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5327,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5328,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5329,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5330,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5331,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5332,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5333,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5334,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5335,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5336,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5337,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5338,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5339,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5340,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5341,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5342,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5343,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5344,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5345,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5346,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5347,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5348,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5349,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5350,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5351,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5352,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5353,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5354,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5355,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5356,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5357,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5358,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5359,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5360,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5361,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5362,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5363,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5364,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5365,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5366,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5367,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5368,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5369,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5370,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5371,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5372,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5373,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5374,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5375,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5376,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5377,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5378,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5379,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5380,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5381,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5382,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5383,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5384,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5385,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5386,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5387,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5388,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5389,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5390,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5391,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5392,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5393,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5394,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5395,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5396,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5397,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5398,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5399,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5400,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5401,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5402,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5403,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5404,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5405,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5406,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5407,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5408,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5409,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5410,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5411,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5412,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5413,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5414,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5415,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5416,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5417,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5418,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5419,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5420,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5421,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5422,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5423,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5424,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5425,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5426,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5427,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5428,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5429,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5430,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5431,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5432,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5433,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5434,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5435,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5436,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5437,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5438,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5439,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5440,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5441,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5442,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5443,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5444,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5445,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5446,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5447,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5448,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5449,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5450,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5451,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5452,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5453,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5454,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5455,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5456,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5457,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5458,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5459,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5460,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5461,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5462,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5463,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5464,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5465,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5466,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5467,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5468,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5469,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5470,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5471,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5472,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5473,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5474,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5475,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5476,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5477,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5478,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5479,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5480,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5481,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5482,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5483,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5484,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5485,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5486,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5487,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5488,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5489,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5490,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5491,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5492,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5493,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5494,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5495,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5496,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5497,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5498,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5499,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5500,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5501,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5502,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5503,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5504,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5505,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5506,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5507,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5508,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5509,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5510,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5511,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5512,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5513,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5514,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5515,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5516,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5517,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5518,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5519,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5520,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5521,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5522,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5523,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5524,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5525,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5526,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5527,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5528,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5529,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5530,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5531,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5532,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5533,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5534,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5535,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5536,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5537,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5538,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5539,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5540,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5541,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5542,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5543,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5544,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5545,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5546,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5547,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5548,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5549,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5550,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5551,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5552,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5553,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5554,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5555,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5556,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5557,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5558,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5559,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5560,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5561,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5562,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5563,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5564,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5565,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5566,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5567,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5568,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5569,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5570,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5571,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5572,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5573,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5574,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5575,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5576,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5577,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5578,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5579,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5580,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5581,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5582,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5583,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5584,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5585,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5586,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5587,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5588,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5589,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5590,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5591,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5592,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5593,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5594,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5595,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5596,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5597,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5598,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5599,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5600,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5601,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5602,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5603,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5604,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5605,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5606,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5607,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5608,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5609,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5610,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5611,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5612,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5613,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5614,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5615,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5616,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5617,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5618,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5619,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5620,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5621,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5622,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5623,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5624,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5625,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5626,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5627,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5628,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5629,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5630,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5631,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5632,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5633,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5634,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5635,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5636,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5637,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5638,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5639,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5640,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5641,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5642,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5643,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5644,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5645,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5646,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5647,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5648,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5649,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5650,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5651,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5652,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5653,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5654,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5655,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5656,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5657,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5658,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5659,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5660,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5661,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5662,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5663,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5664,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5665,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5666,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5667,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5668,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5669,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5670,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5671,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5672,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5673,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5674,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5675,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5676,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5677,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5678,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5679,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5680,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5681,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5682,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5683,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5684,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5685,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5686,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5687,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5688,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5689,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5690,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5691,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5692,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5693,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5694,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5695,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5696,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5697,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5698,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5699,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5700,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5701,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5702,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5703,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5704,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5705,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5706,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5707,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5708,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5709,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5710,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5711,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5712,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5713,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5714,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5715,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5716,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5717,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5718,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5719,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5720,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5721,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5722,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5723,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5724,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5725,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5726,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5727,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5728,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5729,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5730,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5731,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5732,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5733,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5734,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5735,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5736,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5737,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5738,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5739,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5740,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5741,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5742,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5743,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5744,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5745,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5746,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5747,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5748,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5749,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5750,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5751,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5752,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5753,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5754,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5755,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5756,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5757,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5758,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5759,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5760,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5761,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5762,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5763,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5764,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5765,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5766,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5767,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5768,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5769,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5770,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5771,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5772,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5773,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5774,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5775,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5776,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5777,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5778,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5779,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5780,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5781,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5782,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5783,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5784,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5785,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5786,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5787,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5788,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5789,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5790,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5791,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5792,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5793,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5794,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5795,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5796,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5797,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5798,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5799,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5800,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5801,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5802,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5803,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5804,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5805,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5806,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5807,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5808,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5809,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5810,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5811,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5812,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5813,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5814,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5815,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5816,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5817,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5818,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5819,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5820,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5821,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5822,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5823,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5824,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5825,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5826,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5827,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5828,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5829,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5830,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5831,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5832,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5833,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5834,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5835,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5836,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5837,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5838,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5839,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5840,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5841,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5842,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5843,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5844,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5845,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5846,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5847,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5848,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5849,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5850,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5851,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5852,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5853,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5854,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5855,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5856,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5857,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5858,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5859,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5860,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5861,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5862,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5863,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5864,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5865,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5866,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5867,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5868,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5869,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5870,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5871,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5872,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5873,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5874,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5875,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5876,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5877,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5878,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5879,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5880,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5881,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5882,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5883,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5884,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5885,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5886,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5887,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5888,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5889,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5890,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5891,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5892,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5893,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5894,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5895,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5896,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5897,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5898,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5899,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5900,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5901,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5902,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5903,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5904,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5905,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5906,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5907,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5908,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5909,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5910,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5911,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5912,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5913,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5914,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5915,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5916,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5917,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5918,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5919,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5920,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5921,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5922,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5923,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5924,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5925,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5926,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5927,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5928,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5929,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5930,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5931,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5932,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5933,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5934,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5935,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5936,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5937,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5938,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5939,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5940,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5941,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5942,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5943,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5944,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5945,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5946,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5947,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5948,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5949,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5950,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5951,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5952,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5953,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5954,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5955,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5956,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5957,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5958,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5959,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5960,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5961,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5962,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5963,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5964,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5965,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5966,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5967,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5968,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5969,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5970,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5971,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5972,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5973,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5974,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5975,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5976,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5977,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5978,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5979,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5980,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5981,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5982,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5983,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5984,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5985,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5986,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5987,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5988,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5989,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5990,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5991,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5992,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5993,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5994,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5995,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5996,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5997,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5998,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5999,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6000,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6001,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6002,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6003,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6004,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6005,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6006,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6007,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6008,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6009,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6010,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6011,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6012,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6013,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6014,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6015,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6016,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6017,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6018,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6019,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6020,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6021,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6022,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6023,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6024,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6025,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6026,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6027,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6028,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6029,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6030,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6031,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6032,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6033,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6034,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6035,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6036,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6037,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6038,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6039,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6040,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6041,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6042,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6043,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6044,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6045,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6046,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6047,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6048,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6049,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6050,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6051,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6052,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6053,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6054,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6055,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6056,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6057,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6058,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6059,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6060,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6061,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6062,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6063,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6064,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6065,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6066,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6067,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6068,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6069,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6070,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6071,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6072,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6073,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6074,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6075,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6076,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6077,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6078,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6079,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6080,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6081,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6082,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6083,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6084,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6085,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6086,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6087,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6088,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6089,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6090,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6091,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6092,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6093,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6094,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6095,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6096,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6097,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6098,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6099,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6100,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6101,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6102,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6103,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6104,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6105,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6106,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6107,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6108,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6109,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6110,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6111,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6112,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6113,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6114,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6115,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6116,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6117,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6118,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6119,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6120,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6121,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6122,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6123,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6124,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6125,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6126,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6127,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6128,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6129,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6130,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6131,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6132,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6133,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6134,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6135,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6136,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6137,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6138,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6139,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6140,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6141,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6142,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6143,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6144,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6145,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6146,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6147,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6148,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6149,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6150,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6151,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6152,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6153,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6154,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6155,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6156,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6157,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6158,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6159,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6160,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6161,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6162,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6163,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6164,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6165,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6166,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6167,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6168,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6169,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6170,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6171,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6172,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6173,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6174,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6175,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6176,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6177,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6178,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6179,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6180,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6181,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6182,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6183,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6184,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6185,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6186,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6187,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6188,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6189,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6190,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6191,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6192,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6193,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6194,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6195,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6196,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6197,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6198,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6199,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6200,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6201,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6202,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6203,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6204,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6205,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6206,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6207,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6208,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6209,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6210,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6211,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6212,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6213,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6214,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6215,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6216,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6217,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6218,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6219,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6220,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6221,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6222,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6223,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6224,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6225,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6226,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6227,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6228,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6229,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6230,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6231,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6232,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6233,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6234,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6235,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6236,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6237,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6238,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6239,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6240,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6241,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6242,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6243,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6244,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6245,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6246,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6247,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6248,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6249,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6250,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6251,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6252,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6253,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6254,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6255,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6256,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6257,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6258,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6259,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6260,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6261,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6262,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6263,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6264,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6265,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6266,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6267,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6268,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6269,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6270,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6271,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6272,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6273,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6274,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6275,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6276,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6277,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6278,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6279,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6280,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6281,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6282,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6283,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6284,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6285,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6286,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6287,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6288,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6289,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6290,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6291,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6292,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6293,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6294,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6295,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6296,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6297,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6298,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6299,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6300,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6301,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6302,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6303,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6304,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6305,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6306,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6307,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6308,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6309,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6310,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6311,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6312,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6313,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6314,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6315,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6316,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6317,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6318,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6319,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6320,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6321,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6322,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6323,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6324,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6325,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6326,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6327,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6328,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6329,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6330,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6331,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6332,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6333,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6334,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6335,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6336,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6337,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6338,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6339,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6340,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6341,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6342,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6343,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6344,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6345,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6346,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6347,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6348,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6349,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6350,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6351,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6352,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6353,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6354,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6355,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6356,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6357,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6358,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6359,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6360,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6361,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6362,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6363,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6364,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6365,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6366,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6367,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6368,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6369,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6370,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6371,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6372,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6373,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6374,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6375,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6376,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6377,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6378,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6379,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6380,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6381,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6382,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6383,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6384,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6385,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6386,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6387,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6388,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6389,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6390,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6391,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6392,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6393,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6394,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6395,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6396,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6397,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6398,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6399,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6400,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6401,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6402,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6403,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6404,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6405,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6406,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6407,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6408,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6409,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6410,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6411,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6412,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6413,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6414,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6415,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6416,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6417,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6418,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6419,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6420,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6421,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6422,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6423,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6424,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6425,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6426,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6427,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6428,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6429,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6430,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6431,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6432,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6433,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6434,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6435,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6436,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6437,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6438,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6439,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6440,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6441,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6442,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6443,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6444,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6445,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6446,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6447,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6448,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6449,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6450,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6451,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6452,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6453,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6454,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6455,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6456,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6457,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6458,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6459,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6460,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6461,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6462,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6463,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6464,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6465,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6466,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6467,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6468,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6469,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6470,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6471,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6472,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6473,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6474,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6475,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6476,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6477,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6478,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6479,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6480,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6481,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6482,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6483,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6484,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6485,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6486,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6487,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6488,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6489,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6490,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6491,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6492,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6493,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6494,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6495,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6496,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6497,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6498,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6499,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6500,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6501,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6502,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6503,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6504,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6505,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6506,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6507,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6508,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6509,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6510,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6511,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6512,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6513,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6514,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6515,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6516,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6517,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6518,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6519,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6520,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6521,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6522,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6523,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6524,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6525,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6526,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6527,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6528,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6529,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6530,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6531,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6532,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6533,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6534,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6535,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6536,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6537,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6538,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6539,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6540,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6541,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6542,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6543,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6544,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6545,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6546,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6547,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6548,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6549,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6550,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6551,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6552,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6553,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6554,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6555,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6556,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6557,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6558,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6559,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6560,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6561,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6562,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6563,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6564,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6565,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6566,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6567,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6568,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6569,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6570,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6571,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6572,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6573,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6574,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6575,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6576,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6577,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6578,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6579,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6580,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6581,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6582,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6583,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6584,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6585,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6586,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6587,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6588,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6589,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6590,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6591,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6592,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6593,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6594,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6595,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6596,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6597,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6598,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6599,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6600,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6601,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6602,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6603,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6604,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6605,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6606,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6607,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6608,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6609,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6610,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6611,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6612,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6613,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6614,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6615,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6616,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6617,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6618,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6619,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6620,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6621,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6622,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6623,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6624,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6625,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6626,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6627,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6628,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6629,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6630,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6631,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6632,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6633,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6634,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6635,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6636,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6637,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6638,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6639,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6640,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6641,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6642,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6643,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6644,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6645,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6646,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6647,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6648,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6649,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6650,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6651,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6652,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6653,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6654,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6655,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6656,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6657,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6658,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6659,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6660,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6661,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6662,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6663,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6664,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6665,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6666,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6667,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6668,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6669,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6670,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6671,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6672,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6673,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6674,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6675,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6676,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6677,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6678,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6679,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6680,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6681,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6682,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6683,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6684,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6685,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6686,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6687,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6688,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6689,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6690,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6691,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6692,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6693,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6694,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6695,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6696,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6697,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6698,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6699,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6700,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6701,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6702,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6703,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6704,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6705,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6706,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6707,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6708,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6709,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6710,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6711,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6712,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6713,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6714,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6715,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6716,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6717,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6718,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6719,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6720,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6721,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6722,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6723,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6724,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6725,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6726,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6727,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6728,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6729,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6730,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6731,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6732,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6733,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6734,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6735,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6736,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6737,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6738,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6739,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6740,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6741,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6742,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6743,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6744,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6745,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6746,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6747,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6748,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6749,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6750,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6751,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6752,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6753,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6754,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6755,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6756,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6757,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6758,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6759,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6760,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6761,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6762,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6763,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6764,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6765,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6766,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6767,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6768,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6769,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6770,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6771,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6772,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6773,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6774,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6775,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6776,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6777,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6778,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6779,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6780,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6781,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6782,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6783,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6784,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6785,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6786,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6787,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6788,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6789,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6790,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6791,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6792,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6793,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6794,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6795,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6796,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6797,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6798,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6799,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6800,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6801,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6802,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6803,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6804,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6805,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6806,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6807,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6808,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6809,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6810,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6811,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6812,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6813,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6814,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6815,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6816,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6817,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6818,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6819,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6820,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6821,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6822,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6823,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6824,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6825,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6826,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6827,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6828,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6829,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6830,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6831,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6832,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6833,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6834,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6835,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6836,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6837,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6838,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6839,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6840,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6841,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6842,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6843,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6844,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6845,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6846,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6847,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6848,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6849,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6850,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6851,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6852,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6853,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6854,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6855,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6856,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6857,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6858,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6859,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6860,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6861,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6862,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6863,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6864,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6865,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6866,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6867,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6868,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6869,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6870,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6871,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6872,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6873,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6874,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6875,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6876,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6877,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6878,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6879,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6880,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6881,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6882,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6883,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6884,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6885,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6886,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6887,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6888,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6889,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6890,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6891,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6892,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6893,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6894,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6895,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6896,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6897,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6898,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6899,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6900,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6901,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6902,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6903,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6904,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6905,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6906,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6907,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6908,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6909,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6910,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6911,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6912,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6913,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6914,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6915,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6916,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6917,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6918,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6919,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6920,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6921,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6922,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6923,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6924,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6925,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6926,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6927,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6928,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6929,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6930,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6931,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6932,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6933,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6934,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6935,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6936,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6937,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6938,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6939,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6940,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6941,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6942,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6943,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6944,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6945,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6946,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6947,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6948,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6949,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6950,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6951,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6952,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6953,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6954,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6955,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6956,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6957,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6958,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6959,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6960,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6961,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6962,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6963,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6964,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6965,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6966,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6967,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6968,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6969,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6970,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6971,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6972,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6973,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6974,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6975,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6976,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6977,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6978,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6979,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6980,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6981,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6982,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6983,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6984,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6985,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6986,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6987,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6988,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6989,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6990,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6991,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6992,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6993,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6994,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6995,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6996,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6997,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6998,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6999,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7000,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7001,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7002,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7003,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7004,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7005,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7006,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7007,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7008,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7009,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7010,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7011,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7012,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7013,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7014,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7015,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7016,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7017,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7018,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7019,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7020,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7021,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7022,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7023,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7024,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7025,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7026,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7027,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7028,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7029,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7030,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7031,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7032,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7033,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7034,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7035,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7036,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7037,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7038,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7039,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7040,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7041,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7042,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7043,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7044,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7045,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7046,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7047,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7048,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7049,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7050,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7051,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7052,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7053,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7054,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7055,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7056,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7057,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7058,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7059,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7060,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7061,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7062,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7063,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7064,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7065,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7066,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7067,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7068,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7069,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7070,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7071,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7072,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7073,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7074,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7075,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7076,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7077,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7078,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7079,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7080,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7081,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7082,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7083,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7084,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7085,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7086,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7087,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7088,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7089,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7090,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7091,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7092,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7093,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7094,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7095,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7096,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7097,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7098,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7099,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7100,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7101,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7102,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7103,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7104,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7105,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7106,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7107,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7108,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7109,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7110,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7111,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7112,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7113,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7114,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7115,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7116,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7117,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7118,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7119,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7120,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7121,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7122,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7123,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7124,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7125,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7126,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7127,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7128,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7129,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7130,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7131,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7132,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7133,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7134,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7135,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7136,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7137,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7138,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7139,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7140,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7141,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7142,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7143,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7144,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7145,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7146,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7147,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7148,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7149,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7150,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7151,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7152,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7153,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7154,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7155,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7156,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7157,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7158,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7159,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7160,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7161,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7162,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7163,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7164,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7165,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7166,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7167,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7168,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7169,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7170,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7171,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7172,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7173,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7174,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7175,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7176,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7177,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7178,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7179,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7180,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7181,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7182,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7183,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7184,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7185,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7186,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7187,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7188,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7189,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7190,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7191,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7192,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7193,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7194,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7195,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7196,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7197,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7198,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7199,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7200,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7201,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7202,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7203,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7204,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7205,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7206,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7207,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7208,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7209,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7210,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7211,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7212,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7213,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7214,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7215,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7216,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7217,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7218,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7219,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7220,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7221,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7222,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7223,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7224,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7225,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7226,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7227,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7228,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7229,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7230,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7231,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7232,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7233,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7234,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7235,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7236,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7237,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7238,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7239,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7240,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7241,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7242,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7243,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7244,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7245,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7246,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7247,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7248,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7249,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7250,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7251,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7252,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7253,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7254,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7255,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7256,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7257,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7258,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7259,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7260,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7261,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7262,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7263,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7264,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7265,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7266,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7267,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7268,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7269,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7270,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7271,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7272,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7273,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7274,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7275,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7276,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7277,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7278,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7279,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7280,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7281,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7282,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7283,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7284,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7285,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7286,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7287,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7288,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7289,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7290,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7291,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7292,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7293,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7294,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7295,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7296,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7297,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7298,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7299,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7300,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7301,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7302,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7303,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7304,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7305,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7306,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7307,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7308,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7309,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7310,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7311,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7312,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7313,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7314,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7315,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7316,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7317,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7318,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7319,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7320,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7321,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7322,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7323,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7324,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7325,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7326,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7327,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7328,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7329,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7330,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7331,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7332,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7333,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7334,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7335,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7336,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7337,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7338,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7339,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7340,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7341,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7342,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7343,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7344,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7345,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7346,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7347,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7348,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7349,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7350,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7351,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7352,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7353,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7354,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7355,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7356,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7357,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7358,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7359,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7360,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7361,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7362,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7363,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7364,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7365,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7366,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7367,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7368,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7369,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7370,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7371,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7372,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7373,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7374,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7375,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7376,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7377,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7378,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7379,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7380,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7381,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7382,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7383,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7384,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7385,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7386,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7387,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7388,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7389,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7390,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7391,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7392,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7393,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7394,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7395,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7396,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7397,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7398,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7399,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7400,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7401,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7402,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7403,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7404,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7405,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7406,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7407,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7408,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7409,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7410,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7411,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7412,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7413,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7414,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7415,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7416,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7417,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7418,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7419,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7420,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7421,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7422,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7423,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7424,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7425,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7426,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7427,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7428,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7429,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7430,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7431,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7432,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7433,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7434,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7435,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7436,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7437,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7438,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7439,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7440,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7441,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7442,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7443,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7444,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7445,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7446,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7447,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7448,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7449,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7450,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7451,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7452,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7453,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7454,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7455,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7456,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7457,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7458,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7459,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7460,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7461,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7462,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7463,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7464,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7465,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7466,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7467,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7468,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7469,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7470,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7471,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7472,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7473,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7474,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7475,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7476,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7477,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7478,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7479,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7480,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7481,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7482,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7483,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7484,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7485,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7486,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7487,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7488,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7489,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7490,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7491,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7492,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7493,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7494,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7495,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7496,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7497,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7498,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7499,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7500,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7501,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7502,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7503,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7504,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7505,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7506,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7507,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7508,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7509,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7510,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7511,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7512,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7513,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7514,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7515,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7516,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7517,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7518,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7519,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7520,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7521,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7522,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7523,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7524,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7525,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7526,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7527,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7528,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7529,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7530,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7531,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7532,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7533,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7534,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7535,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7536,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7537,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7538,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7539,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7540,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7541,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7542,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7543,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7544,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7545,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7546,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7547,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7548,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7549,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7550,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7551,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7552,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7553,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7554,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7555,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7556,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7557,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7558,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7559,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7560,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7561,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7562,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7563,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7564,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7565,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7566,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7567,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7568,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7569,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7570,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7571,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7572,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7573,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7574,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7575,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7576,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7577,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7578,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7579,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7580,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7581,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7582,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7583,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7584,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7585,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7586,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7587,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7588,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7589,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7590,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7591,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7592,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7593,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7594,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7595,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7596,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7597,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7598,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7599,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7600,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7601,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7602,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7603,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7604,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7605,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7606,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7607,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7608,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7609,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7610,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7611,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7612,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7613,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7614,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7615,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7616,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7617,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7618,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7619,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7620,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7621,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7622,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7623,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7624,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7625,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7626,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7627,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7628,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7629,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7630,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7631,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7632,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7633,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7634,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7635,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7636,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7637,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7638,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7639,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7640,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7641,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7642,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7643,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7644,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7645,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7646,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7647,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7648,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7649,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7650,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7651,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7652,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7653,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7654,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7655,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7656,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7657,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7658,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7659,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7660,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7661,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7662,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7663,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7664,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7665,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7666,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7667,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7668,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7669,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7670,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7671,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7672,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7673,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7674,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7675,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7676,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7677,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7678,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7679,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7680,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7681,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7682,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7683,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7684,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7685,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7686,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7687,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7688,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7689,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7690,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7691,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7692,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7693,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7694,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7695,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7696,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7697,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7698,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7699,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7700,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7701,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7702,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7703,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7704,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7705,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7706,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7707,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7708,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7709,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7710,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7711,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7712,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7713,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7714,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7715,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7716,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7717,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7718,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7719,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7720,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7721,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7722,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7723,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7724,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7725,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7726,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7727,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7728,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7729,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7730,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7731,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7732,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7733,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7734,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7735,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7736,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7737,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7738,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7739,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7740,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7741,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7742,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7743,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7744,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7745,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7746,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7747,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7748,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7749,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7750,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7751,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7752,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7753,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7754,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7755,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7756,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7757,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7758,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7759,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7760,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7761,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7762,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7763,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7764,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7765,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7766,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7767,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7768,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7769,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7770,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7771,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7772,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7773,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7774,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7775,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7776,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7777,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7778,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7779,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7780,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7781,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7782,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7783,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7784,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7785,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7786,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7787,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7788,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7789,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7790,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7791,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7792,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7793,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7794,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7795,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7796,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7797,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7798,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7799,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7800,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7801,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7802,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7803,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7804,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7805,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7806,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7807,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7808,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7809,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7810,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7811,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7812,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7813,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7814,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7815,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7816,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7817,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7818,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7819,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7820,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7821,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7822,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7823,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7824,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7825,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7826,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7827,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7828,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7829,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7830,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7831,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7832,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7833,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7834,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7835,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7836,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7837,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7838,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7839,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7840,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7841,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7842,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7843,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7844,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7845,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7846,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7847,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7848,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7849,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7850,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7851,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7852,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7853,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7854,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7855,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7856,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7857,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7858,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7859,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7860,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7861,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7862,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7863,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7864,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7865,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7866,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7867,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7868,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7869,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7870,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7871,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7872,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7873,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7874,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7875,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7876,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7877,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7878,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7879,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7880,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7881,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7882,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7883,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7884,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7885,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7886,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7887,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7888,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7889,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7890,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7891,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7892,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7893,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7894,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7895,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7896,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7897,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7898,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7899,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7900,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7901,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7902,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7903,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7904,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7905,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7906,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7907,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7908,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7909,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7910,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7911,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7912,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7913,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7914,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7915,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7916,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7917,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7918,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7919,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7920,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7921,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7922,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7923,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7924,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7925,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7926,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7927,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7928,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7929,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7930,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7931,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7932,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7933,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7934,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7935,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7936,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7937,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7938,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7939,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7940,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7941,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7942,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7943,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7944,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7945,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7946,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7947,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7948,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7949,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7950,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7951,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7952,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7953,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7954,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7955,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7956,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7957,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7958,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7959,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7960,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7961,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7962,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7963,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7964,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7965,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7966,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7967,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7968,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7969,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7970,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7971,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7972,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7973,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7974,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7975,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7976,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7977,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7978,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7979,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7980,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7981,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7982,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7983,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7984,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7985,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7986,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7987,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7988,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7989,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7990,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7991,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7992,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7993,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7994,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7995,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7996,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7997,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7998,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7999,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8000,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8001,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8002,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8003,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8004,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8005,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8006,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8007,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8008,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8009,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8010,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8011,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8012,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8013,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8014,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8015,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8016,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8017,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8018,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8019,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8020,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8021,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8022,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8023,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8024,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8025,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8026,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8027,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8028,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8029,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8030,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8031,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8032,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8033,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8034,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8035,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8036,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8037,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8038,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8039,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8040,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8041,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8042,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8043,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8044,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8045,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8046,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8047,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8048,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8049,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8050,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8051,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8052,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8053,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8054,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8055,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8056,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8057,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8058,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8059,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8060,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8061,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8062,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8063,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8064,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8065,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8066,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8067,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8068,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8069,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8070,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8071,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8072,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8073,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8074,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8075,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8076,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8077,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8078,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8079,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8080,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8081,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8082,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8083,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8084,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8085,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8086,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8087,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8088,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8089,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8090,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8091,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8092,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8093,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8094,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8095,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8096,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8097,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8098,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8099,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8100,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8101,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8102,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8103,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8104,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8105,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8106,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8107,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8108,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8109,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8110,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8111,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8112,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8113,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8114,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8115,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8116,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8117,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8118,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8119,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8120,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8121,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8122,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8123,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8124,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8125,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8126,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8127,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8128,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8129,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8130,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8131,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8132,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8133,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8134,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8135,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8136,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8137,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8138,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8139,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8140,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8141,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8142,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8143,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8144,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8145,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8146,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8147,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8148,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8149,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8150,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8151,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8152,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8153,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8154,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8155,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8156,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8157,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8158,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8159,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8160,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8161,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8162,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8163,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8164,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8165,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8166,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8167,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8168,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8169,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8170,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8171,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8172,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8173,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8174,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8175,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8176,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8177,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8178,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8179,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8180,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8181,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8182,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8183,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8184,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8185,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8186,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8187,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8188,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8189,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8190,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8191,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8192,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8193,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8194,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8195,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8196,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8197,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8198,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8199,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8200,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8201,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8202,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8203,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8204,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8205,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8206,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8207,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8208,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8209,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8210,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8211,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8212,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8213,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8214,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8215,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8216,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8217,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8218,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8219,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8220,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8221,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8222,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8223,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8224,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8225,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8226,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8227,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8228,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8229,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8230,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8231,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8232,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8233,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8234,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8235,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8236,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8237,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8238,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8239,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8240,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8241,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8242,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8243,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8244,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8245,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8246,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8247,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8248,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8249,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8250,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8251,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8252,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8253,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8254,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8255,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8256,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8257,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8258,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8259,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8260,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8261,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8262,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8263,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8264,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8265,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8266,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8267,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8268,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8269,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8270,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8271,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8272,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8273,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8274,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8275,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8276,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8277,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8278,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8279,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8280,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8281,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8282,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8283,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8284,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8285,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8286,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8287,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8288,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8289,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8290,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8291,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8292,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8293,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8294,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8295,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8296,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8297,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8298,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8299,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8300,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8301,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8302,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8303,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8304,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8305,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8306,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8307,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8308,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8309,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8310,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8311,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8312,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8313,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8314,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8315,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8316,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8317,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8318,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8319,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8320,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8321,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8322,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8323,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8324,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8325,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8326,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8327,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8328,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8329,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8330,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8331,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8332,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8333,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8334,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8335,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8336,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8337,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8338,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8339,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8340,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8341,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8342,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8343,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8344,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8345,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8346,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8347,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8348,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8349,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8350,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8351,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8352,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8353,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8354,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8355,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8356,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8357,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8358,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8359,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8360,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8361,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8362,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8363,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8364,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8365,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8366,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8367,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8368,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8369,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8370,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8371,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8372,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8373,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8374,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8375,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8376,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8377,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8378,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8379,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8380,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8381,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8382,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8383,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8384,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8385,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8386,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8387,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8388,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8389,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8390,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8391,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8392,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8393,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8394,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8395,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8396,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8397,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8398,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8399,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8400,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8401,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8402,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8403,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8404,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8405,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8406,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8407,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8408,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8409,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8410,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8411,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8412,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8413,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8414,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8415,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8416,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8417,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8418,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8419,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8420,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8421,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8422,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8423,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8424,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8425,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8426,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8427,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8428,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8429,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8430,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8431,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8432,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8433,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8434,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8435,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8436,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8437,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8438,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8439,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8440,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8441,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8442,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8443,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8444,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8445,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8446,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8447,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8448,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8449,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8450,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8451,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8452,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8453,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8454,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8455,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8456,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8457,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8458,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8459,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8460,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8461,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8462,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8463,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8464,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8465,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8466,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8467,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8468,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8469,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8470,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8471,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8472,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8473,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8474,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8475,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8476,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8477,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8478,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8479,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8480,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8481,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8482,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8483,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8484,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8485,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8486,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8487,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8488,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8489,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8490,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8491,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8492,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8493,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8494,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8495,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8496,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8497,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8498,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8499,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8500,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8501,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8502,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8503,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8504,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8505,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8506,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8507,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8508,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8509,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8510,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8511,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8512,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8513,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8514,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8515,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8516,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8517,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8518,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8519,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8520,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8521,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8522,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8523,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8524,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8525,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8526,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8527,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8528,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8529,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8530,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8531,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8532,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8533,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8534,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8535,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8536,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8537,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8538,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8539,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8540,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8541,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8542,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8543,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8544,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8545,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8546,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8547,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8548,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8549,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8550,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8551,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8552,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8553,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8554,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8555,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8556,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8557,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8558,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8559,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8560,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8561,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8562,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8563,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8564,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8565,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8566,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8567,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8568,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8569,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8570,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8571,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8572,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8573,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8574,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8575,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8576,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8577,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8578,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8579,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8580,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8581,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8582,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8583,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8584,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8585,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8586,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8587,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8588,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8589,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8590,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8591,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8592,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8593,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8594,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8595,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8596,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8597,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8598,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8599,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8600,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8601,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8602,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8603,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8604,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8605,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8606,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8607,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8608,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8609,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8610,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8611,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8612,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8613,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8614,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8615,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8616,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8617,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8618,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8619,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8620,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8621,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8622,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8623,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8624,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8625,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8626,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8627,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8628,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8629,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8630,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8631,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8632,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8633,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8634,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8635,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8636,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8637,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8638,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8639,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8640,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8641,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8642,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8643,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8644,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8645,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8646,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8647,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8648,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8649,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8650,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8651,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8652,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8653,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8654,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8655,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8656,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8657,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8658,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8659,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8660,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8661,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8662,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8663,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8664,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8665,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8666,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8667,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8668,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8669,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8670,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8671,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8672,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8673,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8674,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8675,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8676,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8677,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8678,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8679,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8680,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8681,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8682,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8683,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8684,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8685,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8686,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8687,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8688,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8689,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8690,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8691,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8692,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8693,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8694,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8695,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8696,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8697,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8698,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8699,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8700,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8701,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8702,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8703,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8704,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8705,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8706,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8707,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8708,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8709,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8710,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8711,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8712,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8713,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8714,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8715,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8716,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8717,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8718,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8719,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8720,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8721,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8722,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8723,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8724,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8725,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8726,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8727,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8728,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8729,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8730,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8731,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8732,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8733,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8734,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8735,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8736,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8737,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8738,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8739,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8740,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8741,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8742,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8743,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8744,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8745,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8746,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8747,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8748,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8749,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8750,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8751,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8752,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8753,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8754,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8755,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8756,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8757,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8758,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8759,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8760,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8761,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8762,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8763,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8764,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8765,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8766,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8767,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8768,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8769,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8770,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8771,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8772,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8773,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8774,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8775,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8776,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8777,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8778,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8779,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8780,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8781,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8782,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8783,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8784,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8785,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8786,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8787,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8788,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8789,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8790,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8791,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8792,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8793,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8794,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8795,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8796,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8797,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8798,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8799,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8800,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8801,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8802,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8803,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8804,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8805,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8806,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8807,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8808,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8809,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8810,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8811,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8812,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8813,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8814,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8815,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8816,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8817,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8818,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8819,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8820,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8821,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8822,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8823,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8824,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8825,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8826,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8827,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8828,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8829,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8830,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8831,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8832,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8833,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8834,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8835,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8836,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8837,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8838,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8839,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8840,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8841,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8842,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8843,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8844,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8845,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8846,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8847,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8848,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8849,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8850,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8851,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8852,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8853,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8854,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8855,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8856,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8857,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8858,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8859,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8860,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8861,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8862,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8863,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8864,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8865,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8866,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8867,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8868,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8869,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8870,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8871,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8872,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8873,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8874,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8875,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8876,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8877,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8878,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8879,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8880,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8881,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8882,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8883,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8884,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8885,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8886,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8887,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8888,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8889,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8890,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8891,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8892,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8893,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8894,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8895,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8896,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8897,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8898,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8899,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8900,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8901,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8902,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8903,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8904,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8905,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8906,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8907,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8908,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8909,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8910,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8911,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8912,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8913,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8914,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8915,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8916,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8917,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8918,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8919,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8920,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8921,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8922,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8923,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8924,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8925,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8926,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8927,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8928,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8929,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8930,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8931,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8932,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8933,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8934,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8935,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8936,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8937,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8938,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8939,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8940,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8941,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8942,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8943,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8944,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8945,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8946,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8947,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8948,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8949,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8950,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8951,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8952,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8953,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8954,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8955,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8956,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8957,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8958,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8959,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8960,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8961,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8962,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8963,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8964,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8965,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8966,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8967,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8968,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8969,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8970,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8971,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8972,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8973,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8974,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8975,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8976,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8977,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8978,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8979,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8980,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8981,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8982,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8983,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8984,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8985,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8986,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8987,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8988,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8989,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8990,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8991,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8992,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8993,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8994,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8995,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8996,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8997,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8998,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8999,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9000,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9001,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9002,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9003,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9004,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9005,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9006,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9007,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9008,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9009,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9010,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9011,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9012,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9013,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9014,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9015,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9016,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9017,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9018,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9019,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9020,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9021,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9022,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9023,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9024,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9025,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9026,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9027,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9028,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9029,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9030,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9031,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9032,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9033,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9034,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9035,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9036,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9037,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9038,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9039,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9040,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9041,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9042,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9043,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9044,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9045,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9046,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9047,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9048,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9049,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9050,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9051,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9052,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9053,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9054,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9055,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9056,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9057,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9058,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9059,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9060,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9061,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9062,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9063,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9064,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9065,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9066,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9067,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9068,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9069,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9070,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9071,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9072,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9073,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9074,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9075,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9076,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9077,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9078,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9079,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9080,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9081,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9082,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9083,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9084,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9085,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9086,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9087,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9088,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9089,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9090,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9091,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9092,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9093,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9094,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9095,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9096,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9097,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9098,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9099,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9100,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9101,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9102,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9103,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9104,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9105,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9106,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9107,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9108,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9109,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9110,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9111,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9112,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9113,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9114,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9115,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9116,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9117,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9118,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9119,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9120,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9121,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9122,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9123,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9124,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9125,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9126,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9127,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9128,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9129,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9130,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9131,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9132,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9133,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9134,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9135,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9136,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9137,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9138,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9139,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9140,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9141,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9142,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9143,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9144,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9145,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9146,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9147,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9148,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9149,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9150,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9151,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9152,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9153,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9154,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9155,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9156,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9157,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9158,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9159,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9160,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9161,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9162,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9163,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9164,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9165,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9166,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9167,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9168,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9169,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9170,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9171,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9172,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9173,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9174,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9175,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9176,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9177,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9178,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9179,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9180,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9181,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9182,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9183,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9184,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9185,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9186,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9187,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9188,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9189,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9190,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9191,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9192,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9193,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9194,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9195,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9196,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9197,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9198,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9199,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9200,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9201,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9202,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9203,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9204,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9205,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9206,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9207,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9208,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9209,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9210,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9211,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9212,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9213,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9214,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9215,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9216,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9217,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9218,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9219,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9220,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9221,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9222,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9223,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9224,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9225,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9226,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9227,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9228,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9229,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9230,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9231,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9232,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9233,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9234,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9235,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9236,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9237,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9238,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9239,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9240,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9241,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9242,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9243,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9244,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9245,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9246,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9247,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9248,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9249,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9250,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9251,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9252,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9253,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9254,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9255,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9256,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9257,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9258,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9259,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9260,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9261,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9262,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9263,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9264,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9265,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9266,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9267,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9268,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9269,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9270,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9271,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9272,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9273,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9274,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9275,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9276,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9277,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9278,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9279,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9280,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9281,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9282,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9283,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9284,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9285,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9286,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9287,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9288,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9289,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9290,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9291,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9292,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9293,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9294,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9295,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9296,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9297,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9298,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9299,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9300,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9301,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9302,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9303,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9304,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9305,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9306,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9307,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9308,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9309,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9310,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9311,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9312,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9313,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9314,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9315,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9316,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9317,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9318,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9319,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9320,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9321,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9322,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9323,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9324,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9325,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9326,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9327,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9328,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9329,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9330,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9331,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9332,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9333,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9334,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9335,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9336,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9337,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9338,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9339,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9340,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9341,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9342,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9343,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9344,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9345,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9346,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9347,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9348,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9349,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9350,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9351,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9352,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9353,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9354,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9355,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9356,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9357,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9358,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9359,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9360,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9361,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9362,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9363,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9364,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9365,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9366,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9367,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9368,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9369,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9370,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9371,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9372,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9373,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9374,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9375,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9376,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9377,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9378,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9379,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9380,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9381,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9382,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9383,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9384,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9385,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9386,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9387,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9388,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9389,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9390,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9391,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9392,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9393,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9394,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9395,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9396,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9397,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9398,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9399,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9400,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9401,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9402,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9403,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9404,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9405,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9406,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9407,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9408,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9409,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9410,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9411,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9412,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9413,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9414,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9415,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9416,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9417,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9418,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9419,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9420,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9421,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9422,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9423,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9424,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9425,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9426,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9427,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9428,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9429,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9430,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9431,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9432,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9433,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9434,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9435,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9436,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9437,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9438,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9439,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9440,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9441,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9442,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9443,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9444,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9445,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9446,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9447,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9448,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9449,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9450,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9451,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9452,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9453,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9454,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9455,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9456,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9457,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9458,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9459,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9460,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9461,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9462,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9463,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9464,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9465,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9466,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9467,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9468,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9469,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9470,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9471,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9472,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9473,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9474,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9475,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9476,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9477,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9478,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9479,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9480,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9481,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9482,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9483,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9484,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9485,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9486,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9487,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9488,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9489,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9490,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9491,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9492,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9493,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9494,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9495,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9496,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9497,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9498,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9499,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9500,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9501,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9502,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9503,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9504,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9505,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9506,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9507,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9508,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9509,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9510,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9511,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9512,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9513,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9514,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9515,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9516,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9517,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9518,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9519,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9520,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9521,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9522,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9523,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9524,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9525,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9526,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9527,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9528,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9529,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9530,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9531,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9532,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9533,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9534,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9535,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9536,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9537,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9538,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9539,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9540,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9541,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9542,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9543,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9544,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9545,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9546,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9547,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9548,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9549,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9550,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9551,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9552,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9553,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9554,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9555,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9556,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9557,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9558,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9559,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9560,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9561,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9562,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9563,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9564,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9565,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9566,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9567,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9568,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9569,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9570,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9571,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9572,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9573,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9574,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9575,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9576,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9577,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9578,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9579,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9580,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9581,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9582,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9583,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9584,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9585,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9586,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9587,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9588,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9589,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9590,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9591,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9592,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9593,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9594,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9595,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9596,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9597,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9598,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9599,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9600,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9601,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9602,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9603,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9604,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9605,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9606,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9607,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9608,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9609,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9610,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9611,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9612,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9613,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9614,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9615,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9616,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9617,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9618,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9619,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9620,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9621,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9622,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9623,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9624,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9625,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9626,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9627,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9628,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9629,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9630,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9631,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9632,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9633,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9634,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9635,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9636,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9637,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9638,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9639,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9640,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9641,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9642,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9643,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9644,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9645,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9646,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9647,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9648,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9649,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9650,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9651,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9652,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9653,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9654,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9655,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9656,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9657,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9658,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9659,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9660,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9661,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9662,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9663,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9664,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9665,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9666,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9667,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9668,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9669,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9670,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9671,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9672,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9673,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9674,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9675,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9676,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9677,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9678,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9679,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9680,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9681,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9682,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9683,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9684,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9685,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9686,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9687,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9688,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9689,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9690,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9691,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9692,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9693,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9694,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9695,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9696,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9697,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9698,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9699,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9700,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9701,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9702,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9703,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9704,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9705,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9706,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9707,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9708,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9709,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9710,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9711,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9712,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9713,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9714,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9715,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9716,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9717,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9718,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9719,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9720,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9721,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9722,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9723,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9724,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9725,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9726,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9727,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9728,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9729,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9730,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9731,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9732,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9733,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9734,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9735,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9736,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9737,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9738,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9739,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9740,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9741,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9742,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9743,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9744,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9745,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9746,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9747,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9748,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9749,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9750,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9751,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9752,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9753,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9754,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9755,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9756,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9757,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9758,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9759,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9760,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9761,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9762,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9763,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9764,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9765,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9766,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9767,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9768,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9769,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9770,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9771,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9772,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9773,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9774,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9775,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9776,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9777,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9778,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9779,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9780,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9781,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9782,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9783,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9784,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9785,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9786,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9787,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9788,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9789,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9790,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9791,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9792,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9793,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9794,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9795,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9796,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9797,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9798,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9799,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9800,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9801,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9802,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9803,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9804,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9805,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9806,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9807,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9808,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9809,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9810,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9811,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9812,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9813,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9814,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9815,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9816,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9817,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9818,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9819,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9820,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9821,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9822,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9823,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9824,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9825,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9826,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9827,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9828,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9829,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9830,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9831,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9832,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9833,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9834,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9835,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9836,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9837,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9838,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9839,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9840,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9841,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9842,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9843,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9844,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9845,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9846,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9847,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9848,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9849,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9850,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9851,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9852,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9853,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9854,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9855,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9856,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9857,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9858,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9859,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9860,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9861,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9862,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9863,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9864,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9865,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9866,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9867,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9868,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9869,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9870,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9871,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9872,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9873,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9874,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9875,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9876,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9877,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9878,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9879,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9880,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9881,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9882,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9883,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9884,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9885,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9886,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9887,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9888,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9889,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9890,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9891,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9892,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9893,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9894,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9895,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9896,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9897,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9898,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9899,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9900,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9901,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9902,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9903,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9904,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9905,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9906,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9907,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9908,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9909,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9910,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9911,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9912,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9913,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9914,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9915,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9916,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9917,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9918,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9919,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9920,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9921,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9922,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9923,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9924,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9925,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9926,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9927,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9928,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9929,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9930,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9931,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9932,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9933,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9934,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9935,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9936,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9937,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9938,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9939,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9940,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9941,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9942,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9943,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9944,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9945,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9946,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9947,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9948,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9949,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9950,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9951,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9952,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9953,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9954,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9955,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9956,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9957,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9958,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9959,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9960,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9961,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9962,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9963,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9964,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9965,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9966,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9967,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9968,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9969,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9970,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9971,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9972,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9973,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9974,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9975,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9976,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9977,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9978,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9979,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9980,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9981,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9982,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9983,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9984,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9985,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9986,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9987,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9988,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9989,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9990,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9991,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9992,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9993,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9994,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9995,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9996,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9997,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9998,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9999

+

+

diff --git a/util/org.eclipse.virgo.util.osgi.manifest/template.mf b/util/org.eclipse.virgo.util.osgi.manifest/template.mf
new file mode 100755
index 0000000..61892fa
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi.manifest/template.mf
@@ -0,0 +1,10 @@
+Bundle-ManifestVersion: 2
+Bundle-Name: OSGi Manifest Utility Code
+Bundle-SymbolicName: org.eclipse.virgo.util.osgi.manifest
+Bundle-Version: ${version}
+Import-Template: 
+ org.eclipse.virgo.util.*;version="${version:[=.=.=, =.=.+1)}",
+ org.osgi.*;version="0"
+Excluded-Exports: 
+ org.eclipse.virgo.util.osgi.manifest.internal.*,
+ org.eclipse.virgo.util.osgi.manifest.parse.standard.*
diff --git a/util/org.eclipse.virgo.util.osgi/.springBeans b/util/org.eclipse.virgo.util.osgi/.springBeans
new file mode 100644
index 0000000..d079ca1
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi/.springBeans
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beansProjectDescription>
+	<version>1</version>
+	<pluginVersion><![CDATA[2.2.4.RELEASE]]></pluginVersion>
+	<configSuffixes>
+		<configSuffix><![CDATA[xml]]></configSuffix>
+	</configSuffixes>
+	<enableImports><![CDATA[false]]></enableImports>
+	<configs>
+	</configs>
+	<configSets>
+	</configSets>
+</beansProjectDescription>
diff --git a/util/org.eclipse.virgo.util.osgi/src/main/java/org/eclipse/virgo/util/osgi/ServiceRegistrationTracker.java b/util/org.eclipse.virgo.util.osgi/src/main/java/org/eclipse/virgo/util/osgi/ServiceRegistrationTracker.java
new file mode 100644
index 0000000..7a712aa
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi/src/main/java/org/eclipse/virgo/util/osgi/ServiceRegistrationTracker.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.osgi.framework.ServiceRegistration;
+
+/**
+ * Utility class that tracks a set of {@link ServiceRegistration ServiceRegistrations} and allows for them to be safely
+ * unregistered.
+ * <p/>
+ * <code>ServiceRegistrations</code> are tracked in a threadsafe manner, and importantly are unregistered without
+ * holding any locks.
+ * 
+ * @see ServiceRegistration
+ */
+public final class ServiceRegistrationTracker {
+
+    private final Object monitor = new Object();
+
+    private Set<ServiceRegistration<?>> registrations;
+
+    /**
+     * Tracks the supplied {@link ServiceRegistration}. This <code>ServiceRegistration</code> will be
+     * {@link ServiceRegistration#unregister unregistered} during {@link #unregisterAll()} or 
+     * {@link #unregister()}.
+     * 
+     * @param registration the <code>ServiceRegistration</code> to track.
+     */
+    public void track(ServiceRegistration<?> registration) {
+        synchronized (this.monitor) {
+            if (this.registrations == null) {
+                this.registrations = new HashSet<ServiceRegistration<?>>();
+            }
+            this.registrations.add(registration);
+        }
+    }
+
+    /**
+     * Safely unregisters a tracked <code>ServiceRegistration</code>.
+     */
+    public void unregister(ServiceRegistration<?> registration) {
+        synchronized (this.monitor) {
+            this.registrations.remove(registration);
+        }
+        registration.unregister();
+    }
+
+    /**
+     * Safely unregisters all the tracked <code>ServiceRegistrations</code>.
+     */
+    public void unregisterAll() {
+        Set<ServiceRegistration<?>> toUnregister = null;
+        synchronized (this.monitor) {
+            toUnregister = this.registrations;
+            this.registrations = null;
+        }
+        if (toUnregister != null) {
+            for (ServiceRegistration<?> serviceRegistration : toUnregister) {
+                serviceRegistration.unregister();
+            }
+        }
+    }
+}
diff --git a/util/org.eclipse.virgo.util.osgi/src/main/resources/about.html b/util/org.eclipse.virgo.util.osgi/src/main/resources/about.html
new file mode 100644
index 0000000..c258ef5
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi/src/main/resources/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>June 5, 2006</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/util/org.eclipse.virgo.util.osgi/src/test/java/org/eclipse/virgo/util/osgi/ServiceObject.java b/util/org.eclipse.virgo.util.osgi/src/test/java/org/eclipse/virgo/util/osgi/ServiceObject.java
new file mode 100644
index 0000000..d7371f2
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi/src/test/java/org/eclipse/virgo/util/osgi/ServiceObject.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi;
+
+/**
+ * <p>
+ * TODO Document ServiceObject
+ * </p>
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * TODO Document concurrent semantics of ServiceObject
+ *
+ */
+class ServiceObject {
+    
+}
diff --git a/util/org.eclipse.virgo.util.osgi/src/test/java/org/eclipse/virgo/util/osgi/ServiceRegistrationTrackerTests.java b/util/org.eclipse.virgo.util.osgi/src/test/java/org/eclipse/virgo/util/osgi/ServiceRegistrationTrackerTests.java
new file mode 100644
index 0000000..a757811
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi/src/test/java/org/eclipse/virgo/util/osgi/ServiceRegistrationTrackerTests.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi;
+
+import org.junit.Test;
+import org.osgi.framework.ServiceRegistration;
+
+import static org.easymock.EasyMock.*;
+
+
+public class ServiceRegistrationTrackerTests {
+
+    @Test
+    public void testTrackAndUnregister() {
+        ServiceRegistration<?> registration = createServiceRegistration();
+
+        replay(registration);
+
+        ServiceRegistrationTracker tracker = new ServiceRegistrationTracker();
+        tracker.track(registration);
+        tracker.unregister(registration);
+
+        verify(registration);
+    }
+
+    @Test
+    public void testTrackAndUnregisterAll() {
+        ServiceRegistration<?> registration1 = createServiceRegistration();
+        ServiceRegistration<?> registration2 = createServiceRegistration();
+        replay(registration1, registration2);
+
+        ServiceRegistrationTracker tracker = new ServiceRegistrationTracker();
+        tracker.track(registration1);
+        tracker.track(registration2);
+        tracker.unregisterAll();
+
+        verify(registration1, registration2);
+    }
+
+    private ServiceRegistration<?> createServiceRegistration() {
+        ServiceRegistration<?> registration = createMock(ServiceRegistration.class);
+        registration.unregister();
+        expectLastCall();
+        return registration;
+    }
+
+}
diff --git a/util/org.eclipse.virgo.util.osgi/src/test/java/org/eclipse/virgo/util/osgi/StubBundleContext.java b/util/org.eclipse.virgo.util.osgi/src/test/java/org/eclipse/virgo/util/osgi/StubBundleContext.java
new file mode 100644
index 0000000..db5e94b
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi/src/test/java/org/eclipse/virgo/util/osgi/StubBundleContext.java
@@ -0,0 +1,286 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.osgi;
+
+import java.io.File;
+import java.io.InputStream;
+import java.util.Collection;
+import java.util.Dictionary;
+import java.util.Map;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.BundleListener;
+import org.osgi.framework.Filter;
+import org.osgi.framework.FrameworkListener;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceListener;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
+
+/**
+ * TODO Document StubBundleContext
+ * <p />
+ *
+ * <strong>Concurrent Semantics</strong><br />
+ *
+ * TODO Document concurrent semantics of StubBundleContext
+ *
+ */
+public class StubBundleContext implements BundleContext {
+
+    /**
+     * {@inheritDoc}
+     */
+    public void addBundleListener(BundleListener arg0) {
+        // System.out.println("1");
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void addFrameworkListener(FrameworkListener arg0) {
+        // System.out.println("2");
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void addServiceListener(ServiceListener arg0) {
+        // System.out.println("3");
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void addServiceListener(ServiceListener arg0, String arg1) throws InvalidSyntaxException {
+        // System.out.println("4");
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Filter createFilter(String arg0) throws InvalidSyntaxException {
+        // System.out.println("5");
+        return new Filter() {
+
+            public boolean match(ServiceReference<?> arg0) {
+                return true;
+            }
+
+            public boolean match(Dictionary<String, ?> arg0) {
+                return true;
+            }
+
+            public boolean matchCase(Dictionary<String, ?> arg0) {
+                return true;
+            }
+
+            public boolean matches(Map<String, ?> map) {
+                return true;
+            }
+
+        };
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public ServiceReference<?>[] getAllServiceReferences(String arg0, String arg1) throws InvalidSyntaxException {
+        // System.out.println("6");
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Bundle getBundle() {
+        // System.out.println("7");
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Bundle getBundle(long arg0) {
+        // System.out.println("8");
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Bundle[] getBundles() {
+        // System.out.println("9");
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public File getDataFile(String arg0) {
+        // System.out.println("10");
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getProperty(String arg0) {
+        // System.out.println("11");
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @SuppressWarnings("unchecked")
+    public <S> S getService(ServiceReference<S> arg0) {
+        // System.out.println("12");
+        return (S) new ServiceObject();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public ServiceReference<?> getServiceReference(String arg0) {
+        // System.out.println("13");
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public ServiceReference<?>[] getServiceReferences(String arg0, String arg1) throws InvalidSyntaxException {
+        // System.out.println("14");
+        ServiceReference<?>[] refs = new ServiceReference[1];
+        refs[0] = new ServiceReference<ServiceObject>() {
+
+            public int compareTo(Object arg0) {
+                return 0;
+            }
+
+            public Bundle getBundle() {
+                return null;
+            }
+
+            public Object getProperty(String arg0) {
+                return null;
+            }
+
+            public String[] getPropertyKeys() {
+                return null;
+            }
+
+            public Bundle[] getUsingBundles() {
+                return null;
+            }
+
+            public boolean isAssignableTo(Bundle arg0, String arg1) {
+                return false;
+            }
+
+        };
+        return refs;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Bundle installBundle(String arg0) throws BundleException {
+        // System.out.println("15");
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Bundle installBundle(String arg0, InputStream arg1) throws BundleException {
+        // System.out.println("16");
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public ServiceRegistration<?> registerService(String[] arg0, Object arg1, Dictionary<String, ?> arg2) {
+        // System.out.println("17");
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public ServiceRegistration<?> registerService(String arg0, Object arg1, Dictionary<String, ?> arg2) {
+        // System.out.println("18");
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void removeBundleListener(BundleListener arg0) {
+        // System.out.println("19");
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void removeFrameworkListener(FrameworkListener arg0) {
+        // System.out.println("20");
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void removeServiceListener(ServiceListener arg0) {
+        // System.out.println("21");
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean ungetService(ServiceReference<?> arg0) {
+        // System.out.println("22");
+        return true;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public Bundle getBundle(String location) {
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public <S> ServiceReference<S> getServiceReference(Class<S> clazz) {
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public <S> Collection<ServiceReference<S>> getServiceReferences(Class<S> clazz, String filter) throws InvalidSyntaxException {
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public <S> ServiceRegistration<S> registerService(Class<S> clazz, S service, Dictionary<String, ?> properties) {
+        return null;
+    }
+
+}
diff --git a/util/org.eclipse.virgo.util.osgi/src/test/resources/manifests.zip b/util/org.eclipse.virgo.util.osgi/src/test/resources/manifests.zip
new file mode 100644
index 0000000..d9e16c0
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi/src/test/resources/manifests.zip
Binary files differ
diff --git a/util/org.eclipse.virgo.util.osgi/src/test/resources/org/eclipse/virgo/util/osgi/manifest/internal/all-headers.mf b/util/org.eclipse.virgo.util.osgi/src/test/resources/org/eclipse/virgo/util/osgi/manifest/internal/all-headers.mf
new file mode 100644
index 0000000..6454568
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi/src/test/resources/org/eclipse/virgo/util/osgi/manifest/internal/all-headers.mf
@@ -0,0 +1,18 @@
+Manifest-Version: 1.0
+Bundle-ActivationPolicy: lazy
+Bundle-ClassPath: .,a.jar,b.jar
+Bundle-Description: The description
+Bundle-ManifestVersion: 2
+Bundle-Name: The name
+Bundle-SymbolicName: com.foo.bar
+Bundle-UpdateLocation: http://update.com
+DynamicImport-Package: com.foo.*
+Export-Package: com.bar
+Fragment-Host: com.foo.host
+Import-Bundle: com.baz
+Import-Library: com.lib
+Import-Package: com.pkg
+Module-Scope: the.scope
+Module-Type: web
+Require-Bundle: com.req
+Bundle-Version: 1.2.3
diff --git a/util/org.eclipse.virgo.util.osgi/src/test/resources/org/eclipse/virgo/util/osgi/manifest/internal/basic.mf b/util/org.eclipse.virgo.util.osgi/src/test/resources/org/eclipse/virgo/util/osgi/manifest/internal/basic.mf
new file mode 100644
index 0000000..a52fd09
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi/src/test/resources/org/eclipse/virgo/util/osgi/manifest/internal/basic.mf
@@ -0,0 +1,2 @@
+Manifest-Version: 1.0
+Foo: bar
diff --git a/util/org.eclipse.virgo.util.osgi/src/test/resources/org/eclipse/virgo/util/osgi/manifest/internal/verylarge.mf b/util/org.eclipse.virgo.util.osgi/src/test/resources/org/eclipse/virgo/util/osgi/manifest/internal/verylarge.mf
new file mode 100644
index 0000000..8061290
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi/src/test/resources/org/eclipse/virgo/util/osgi/manifest/internal/verylarge.mf
@@ -0,0 +1,10006 @@
+Manifest-Version: 1.0

+Bundle-ManifestVersion: 2

+Bundle-SymbolicName: very.large.manifest

+Import-Package: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx10,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx11,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx12,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx13,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx14,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx15,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx16,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx17,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx18,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx19,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx20,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx21,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx22,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx23,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx24,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx25,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx26,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx27,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx28,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx29,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx30,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx31,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx32,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx33,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx34,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx35,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx36,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx37,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx38,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx39,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx40,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx41,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx42,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx43,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx44,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx45,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx46,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx47,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx48,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx49,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx50,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx51,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx52,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx53,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx54,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx55,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx56,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx57,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx58,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx59,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx60,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx61,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx62,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx63,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx64,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx65,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx66,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx67,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx68,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx69,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx70,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx71,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx72,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx73,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx74,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx75,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx76,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx77,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx78,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx79,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx80,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx81,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx82,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx83,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx84,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx85,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx86,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx87,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx88,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx89,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx90,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx91,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx92,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx93,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx94,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx95,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx96,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx97,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx98,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx99,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx100,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx101,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx102,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx103,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx104,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx105,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx106,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx107,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx108,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx109,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx110,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx111,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx112,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx113,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx114,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx115,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx116,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx117,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx118,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx119,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx120,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx121,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx122,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx123,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx124,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx125,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx126,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx127,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx128,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx129,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx130,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx131,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx132,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx133,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx134,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx135,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx136,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx137,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx138,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx139,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx140,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx141,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx142,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx143,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx144,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx145,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx146,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx147,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx148,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx149,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx150,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx151,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx152,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx153,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx154,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx155,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx156,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx157,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx158,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx159,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx160,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx161,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx162,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx163,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx164,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx165,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx166,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx167,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx168,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx169,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx170,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx171,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx172,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx173,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx174,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx175,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx176,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx177,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx178,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx179,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx180,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx181,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx182,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx183,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx184,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx185,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx186,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx187,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx188,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx189,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx190,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx191,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx192,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx193,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx194,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx195,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx196,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx197,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx198,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx199,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx200,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx201,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx202,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx203,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx204,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx205,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx206,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx207,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx208,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx209,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx210,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx211,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx212,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx213,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx214,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx215,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx216,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx217,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx218,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx219,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx220,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx221,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx222,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx223,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx224,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx225,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx226,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx227,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx228,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx229,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx230,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx231,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx232,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx233,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx234,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx235,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx236,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx237,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx238,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx239,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx240,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx241,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx242,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx243,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx244,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx245,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx246,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx247,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx248,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx249,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx250,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx251,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx252,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx253,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx254,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx255,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx256,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx257,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx258,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx259,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx260,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx261,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx262,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx263,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx264,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx265,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx266,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx267,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx268,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx269,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx270,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx271,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx272,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx273,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx274,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx275,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx276,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx277,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx278,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx279,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx280,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx281,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx282,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx283,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx284,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx285,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx286,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx287,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx288,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx289,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx290,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx291,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx292,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx293,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx294,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx295,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx296,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx297,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx298,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx299,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx300,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx301,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx302,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx303,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx304,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx305,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx306,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx307,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx308,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx309,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx310,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx311,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx312,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx313,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx314,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx315,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx316,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx317,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx318,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx319,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx320,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx321,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx322,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx323,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx324,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx325,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx326,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx327,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx328,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx329,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx330,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx331,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx332,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx333,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx334,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx335,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx336,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx337,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx338,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx339,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx340,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx341,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx342,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx343,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx344,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx345,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx346,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx347,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx348,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx349,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx350,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx351,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx352,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx353,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx354,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx355,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx356,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx357,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx358,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx359,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx360,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx361,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx362,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx363,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx364,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx365,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx366,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx367,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx368,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx369,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx370,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx371,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx372,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx373,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx374,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx375,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx376,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx377,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx378,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx379,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx380,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx381,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx382,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx383,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx384,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx385,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx386,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx387,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx388,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx389,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx390,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx391,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx392,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx393,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx394,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx395,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx396,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx397,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx398,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx399,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx400,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx401,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx402,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx403,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx404,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx405,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx406,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx407,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx408,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx409,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx410,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx411,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx412,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx413,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx414,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx415,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx416,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx417,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx418,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx419,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx420,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx421,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx422,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx423,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx424,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx425,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx426,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx427,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx428,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx429,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx430,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx431,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx432,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx433,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx434,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx435,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx436,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx437,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx438,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx439,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx440,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx441,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx442,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx443,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx444,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx445,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx446,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx447,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx448,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx449,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx450,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx451,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx452,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx453,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx454,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx455,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx456,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx457,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx458,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx459,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx460,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx461,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx462,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx463,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx464,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx465,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx466,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx467,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx468,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx469,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx470,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx471,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx472,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx473,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx474,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx475,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx476,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx477,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx478,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx479,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx480,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx481,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx482,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx483,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx484,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx485,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx486,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx487,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx488,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx489,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx490,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx491,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx492,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx493,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx494,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx495,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx496,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx497,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx498,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx499,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx500,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx501,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx502,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx503,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx504,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx505,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx506,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx507,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx508,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx509,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx510,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx511,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx512,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx513,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx514,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx515,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx516,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx517,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx518,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx519,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx520,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx521,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx522,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx523,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx524,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx525,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx526,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx527,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx528,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx529,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx530,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx531,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx532,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx533,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx534,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx535,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx536,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx537,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx538,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx539,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx540,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx541,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx542,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx543,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx544,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx545,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx546,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx547,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx548,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx549,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx550,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx551,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx552,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx553,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx554,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx555,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx556,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx557,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx558,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx559,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx560,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx561,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx562,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx563,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx564,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx565,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx566,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx567,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx568,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx569,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx570,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx571,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx572,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx573,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx574,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx575,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx576,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx577,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx578,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx579,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx580,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx581,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx582,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx583,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx584,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx585,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx586,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx587,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx588,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx589,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx590,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx591,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx592,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx593,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx594,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx595,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx596,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx597,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx598,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx599,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx600,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx601,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx602,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx603,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx604,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx605,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx606,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx607,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx608,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx609,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx610,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx611,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx612,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx613,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx614,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx615,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx616,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx617,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx618,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx619,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx620,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx621,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx622,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx623,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx624,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx625,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx626,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx627,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx628,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx629,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx630,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx631,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx632,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx633,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx634,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx635,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx636,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx637,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx638,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx639,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx640,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx641,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx642,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx643,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx644,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx645,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx646,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx647,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx648,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx649,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx650,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx651,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx652,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx653,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx654,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx655,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx656,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx657,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx658,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx659,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx660,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx661,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx662,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx663,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx664,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx665,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx666,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx667,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx668,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx669,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx670,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx671,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx672,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx673,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx674,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx675,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx676,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx677,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx678,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx679,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx680,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx681,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx682,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx683,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx684,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx685,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx686,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx687,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx688,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx689,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx690,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx691,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx692,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx693,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx694,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx695,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx696,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx697,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx698,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx699,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx700,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx701,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx702,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx703,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx704,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx705,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx706,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx707,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx708,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx709,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx710,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx711,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx712,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx713,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx714,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx715,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx716,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx717,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx718,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx719,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx720,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx721,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx722,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx723,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx724,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx725,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx726,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx727,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx728,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx729,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx730,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx731,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx732,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx733,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx734,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx735,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx736,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx737,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx738,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx739,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx740,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx741,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx742,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx743,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx744,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx745,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx746,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx747,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx748,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx749,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx750,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx751,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx752,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx753,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx754,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx755,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx756,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx757,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx758,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx759,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx760,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx761,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx762,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx763,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx764,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx765,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx766,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx767,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx768,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx769,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx770,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx771,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx772,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx773,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx774,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx775,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx776,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx777,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx778,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx779,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx780,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx781,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx782,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx783,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx784,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx785,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx786,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx787,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx788,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx789,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx790,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx791,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx792,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx793,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx794,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx795,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx796,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx797,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx798,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx799,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx800,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx801,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx802,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx803,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx804,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx805,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx806,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx807,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx808,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx809,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx810,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx811,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx812,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx813,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx814,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx815,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx816,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx817,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx818,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx819,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx820,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx821,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx822,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx823,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx824,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx825,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx826,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx827,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx828,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx829,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx830,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx831,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx832,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx833,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx834,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx835,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx836,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx837,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx838,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx839,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx840,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx841,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx842,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx843,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx844,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx845,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx846,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx847,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx848,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx849,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx850,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx851,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx852,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx853,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx854,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx855,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx856,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx857,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx858,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx859,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx860,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx861,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx862,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx863,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx864,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx865,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx866,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx867,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx868,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx869,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx870,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx871,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx872,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx873,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx874,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx875,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx876,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx877,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx878,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx879,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx880,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx881,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx882,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx883,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx884,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx885,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx886,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx887,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx888,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx889,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx890,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx891,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx892,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx893,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx894,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx895,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx896,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx897,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx898,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx899,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx900,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx901,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx902,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx903,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx904,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx905,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx906,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx907,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx908,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx909,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx910,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx911,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx912,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx913,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx914,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx915,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx916,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx917,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx918,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx919,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx920,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx921,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx922,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx923,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx924,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx925,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx926,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx927,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx928,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx929,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx930,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx931,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx932,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx933,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx934,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx935,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx936,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx937,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx938,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx939,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx940,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx941,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx942,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx943,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx944,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx945,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx946,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx947,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx948,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx949,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx950,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx951,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx952,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx953,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx954,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx955,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx956,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx957,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx958,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx959,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx960,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx961,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx962,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx963,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx964,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx965,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx966,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx967,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx968,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx969,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx970,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx971,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx972,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx973,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx974,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx975,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx976,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx977,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx978,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx979,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx980,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx981,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx982,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx983,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx984,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx985,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx986,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx987,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx988,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx989,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx990,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx991,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx992,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx993,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx994,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx995,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx996,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx997,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx998,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx999,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1000,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1001,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1002,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1003,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1004,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1005,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1006,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1007,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1008,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1009,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1010,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1011,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1012,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1013,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1014,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1015,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1016,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1017,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1018,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1019,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1020,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1021,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1022,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1023,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1024,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1025,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1026,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1027,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1028,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1029,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1030,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1031,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1032,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1033,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1034,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1035,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1036,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1037,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1038,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1039,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1040,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1041,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1042,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1043,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1044,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1045,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1046,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1047,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1048,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1049,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1050,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1051,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1052,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1053,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1054,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1055,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1056,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1057,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1058,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1059,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1060,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1061,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1062,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1063,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1064,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1065,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1066,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1067,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1068,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1069,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1070,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1071,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1072,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1073,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1074,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1075,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1076,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1077,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1078,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1079,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1080,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1081,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1082,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1083,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1084,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1085,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1086,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1087,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1088,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1089,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1090,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1091,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1092,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1093,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1094,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1095,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1096,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1097,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1098,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1099,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1100,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1101,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1102,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1103,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1104,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1105,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1106,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1107,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1108,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1109,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1110,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1111,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1112,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1113,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1114,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1115,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1116,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1117,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1118,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1119,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1120,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1121,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1122,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1123,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1124,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1125,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1126,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1127,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1128,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1129,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1130,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1131,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1132,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1133,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1134,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1135,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1136,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1137,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1138,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1139,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1140,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1141,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1142,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1143,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1144,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1145,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1146,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1147,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1148,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1149,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1150,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1151,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1152,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1153,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1154,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1155,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1156,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1157,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1158,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1159,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1160,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1161,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1162,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1163,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1164,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1165,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1166,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1167,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1168,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1169,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1170,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1171,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1172,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1173,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1174,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1175,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1176,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1177,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1178,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1179,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1180,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1181,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1182,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1183,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1184,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1185,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1186,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1187,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1188,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1189,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1190,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1191,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1192,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1193,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1194,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1195,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1196,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1197,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1198,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1199,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1200,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1201,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1202,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1203,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1204,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1205,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1206,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1207,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1208,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1209,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1210,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1211,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1212,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1213,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1214,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1215,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1216,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1217,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1218,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1219,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1220,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1221,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1222,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1223,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1224,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1225,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1226,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1227,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1228,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1229,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1230,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1231,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1232,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1233,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1234,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1235,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1236,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1237,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1238,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1239,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1240,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1241,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1242,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1243,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1244,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1245,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1246,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1247,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1248,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1249,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1250,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1251,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1252,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1253,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1254,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1255,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1256,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1257,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1258,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1259,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1260,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1261,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1262,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1263,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1264,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1265,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1266,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1267,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1268,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1269,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1270,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1271,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1272,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1273,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1274,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1275,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1276,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1277,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1278,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1279,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1280,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1281,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1282,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1283,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1284,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1285,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1286,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1287,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1288,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1289,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1290,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1291,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1292,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1293,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1294,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1295,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1296,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1297,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1298,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1299,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1300,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1301,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1302,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1303,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1304,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1305,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1306,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1307,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1308,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1309,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1310,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1311,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1312,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1313,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1314,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1315,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1316,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1317,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1318,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1319,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1320,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1321,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1322,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1323,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1324,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1325,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1326,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1327,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1328,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1329,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1330,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1331,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1332,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1333,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1334,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1335,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1336,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1337,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1338,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1339,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1340,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1341,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1342,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1343,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1344,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1345,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1346,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1347,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1348,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1349,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1350,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1351,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1352,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1353,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1354,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1355,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1356,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1357,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1358,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1359,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1360,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1361,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1362,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1363,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1364,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1365,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1366,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1367,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1368,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1369,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1370,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1371,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1372,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1373,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1374,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1375,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1376,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1377,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1378,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1379,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1380,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1381,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1382,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1383,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1384,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1385,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1386,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1387,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1388,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1389,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1390,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1391,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1392,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1393,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1394,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1395,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1396,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1397,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1398,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1399,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1400,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1401,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1402,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1403,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1404,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1405,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1406,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1407,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1408,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1409,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1410,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1411,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1412,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1413,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1414,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1415,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1416,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1417,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1418,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1419,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1420,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1421,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1422,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1423,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1424,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1425,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1426,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1427,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1428,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1429,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1430,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1431,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1432,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1433,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1434,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1435,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1436,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1437,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1438,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1439,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1440,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1441,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1442,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1443,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1444,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1445,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1446,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1447,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1448,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1449,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1450,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1451,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1452,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1453,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1454,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1455,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1456,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1457,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1458,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1459,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1460,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1461,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1462,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1463,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1464,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1465,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1466,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1467,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1468,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1469,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1470,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1471,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1472,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1473,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1474,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1475,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1476,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1477,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1478,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1479,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1480,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1481,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1482,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1483,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1484,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1485,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1486,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1487,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1488,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1489,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1490,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1491,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1492,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1493,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1494,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1495,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1496,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1497,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1498,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1499,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1500,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1501,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1502,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1503,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1504,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1505,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1506,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1507,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1508,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1509,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1510,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1511,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1512,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1513,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1514,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1515,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1516,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1517,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1518,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1519,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1520,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1521,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1522,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1523,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1524,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1525,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1526,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1527,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1528,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1529,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1530,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1531,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1532,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1533,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1534,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1535,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1536,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1537,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1538,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1539,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1540,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1541,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1542,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1543,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1544,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1545,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1546,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1547,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1548,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1549,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1550,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1551,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1552,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1553,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1554,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1555,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1556,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1557,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1558,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1559,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1560,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1561,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1562,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1563,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1564,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1565,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1566,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1567,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1568,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1569,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1570,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1571,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1572,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1573,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1574,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1575,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1576,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1577,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1578,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1579,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1580,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1581,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1582,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1583,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1584,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1585,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1586,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1587,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1588,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1589,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1590,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1591,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1592,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1593,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1594,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1595,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1596,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1597,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1598,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1599,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1600,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1601,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1602,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1603,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1604,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1605,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1606,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1607,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1608,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1609,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1610,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1611,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1612,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1613,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1614,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1615,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1616,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1617,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1618,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1619,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1620,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1621,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1622,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1623,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1624,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1625,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1626,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1627,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1628,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1629,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1630,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1631,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1632,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1633,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1634,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1635,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1636,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1637,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1638,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1639,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1640,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1641,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1642,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1643,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1644,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1645,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1646,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1647,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1648,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1649,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1650,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1651,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1652,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1653,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1654,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1655,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1656,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1657,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1658,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1659,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1660,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1661,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1662,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1663,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1664,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1665,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1666,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1667,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1668,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1669,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1670,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1671,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1672,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1673,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1674,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1675,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1676,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1677,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1678,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1679,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1680,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1681,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1682,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1683,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1684,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1685,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1686,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1687,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1688,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1689,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1690,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1691,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1692,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1693,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1694,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1695,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1696,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1697,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1698,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1699,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1700,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1701,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1702,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1703,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1704,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1705,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1706,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1707,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1708,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1709,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1710,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1711,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1712,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1713,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1714,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1715,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1716,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1717,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1718,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1719,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1720,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1721,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1722,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1723,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1724,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1725,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1726,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1727,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1728,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1729,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1730,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1731,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1732,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1733,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1734,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1735,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1736,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1737,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1738,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1739,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1740,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1741,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1742,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1743,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1744,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1745,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1746,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1747,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1748,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1749,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1750,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1751,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1752,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1753,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1754,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1755,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1756,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1757,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1758,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1759,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1760,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1761,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1762,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1763,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1764,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1765,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1766,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1767,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1768,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1769,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1770,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1771,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1772,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1773,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1774,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1775,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1776,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1777,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1778,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1779,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1780,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1781,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1782,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1783,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1784,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1785,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1786,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1787,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1788,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1789,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1790,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1791,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1792,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1793,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1794,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1795,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1796,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1797,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1798,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1799,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1800,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1801,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1802,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1803,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1804,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1805,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1806,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1807,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1808,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1809,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1810,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1811,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1812,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1813,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1814,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1815,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1816,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1817,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1818,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1819,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1820,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1821,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1822,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1823,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1824,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1825,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1826,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1827,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1828,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1829,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1830,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1831,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1832,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1833,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1834,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1835,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1836,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1837,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1838,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1839,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1840,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1841,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1842,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1843,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1844,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1845,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1846,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1847,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1848,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1849,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1850,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1851,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1852,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1853,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1854,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1855,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1856,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1857,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1858,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1859,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1860,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1861,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1862,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1863,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1864,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1865,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1866,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1867,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1868,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1869,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1870,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1871,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1872,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1873,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1874,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1875,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1876,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1877,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1878,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1879,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1880,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1881,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1882,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1883,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1884,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1885,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1886,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1887,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1888,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1889,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1890,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1891,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1892,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1893,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1894,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1895,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1896,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1897,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1898,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1899,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1900,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1901,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1902,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1903,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1904,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1905,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1906,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1907,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1908,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1909,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1910,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1911,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1912,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1913,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1914,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1915,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1916,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1917,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1918,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1919,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1920,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1921,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1922,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1923,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1924,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1925,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1926,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1927,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1928,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1929,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1930,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1931,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1932,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1933,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1934,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1935,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1936,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1937,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1938,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1939,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1940,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1941,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1942,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1943,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1944,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1945,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1946,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1947,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1948,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1949,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1950,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1951,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1952,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1953,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1954,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1955,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1956,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1957,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1958,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1959,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1960,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1961,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1962,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1963,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1964,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1965,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1966,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1967,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1968,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1969,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1970,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1971,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1972,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1973,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1974,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1975,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1976,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1977,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1978,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1979,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1980,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1981,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1982,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1983,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1984,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1985,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1986,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1987,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1988,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1989,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1990,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1991,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1992,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1993,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1994,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1995,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1996,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1997,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1998,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1999,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2000,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2001,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2002,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2003,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2004,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2005,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2006,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2007,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2008,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2009,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2010,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2011,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2012,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2013,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2014,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2015,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2016,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2017,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2018,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2019,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2020,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2021,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2022,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2023,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2024,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2025,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2026,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2027,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2028,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2029,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2030,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2031,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2032,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2033,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2034,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2035,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2036,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2037,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2038,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2039,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2040,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2041,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2042,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2043,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2044,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2045,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2046,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2047,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2048,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2049,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2050,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2051,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2052,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2053,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2054,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2055,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2056,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2057,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2058,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2059,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2060,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2061,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2062,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2063,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2064,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2065,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2066,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2067,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2068,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2069,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2070,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2071,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2072,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2073,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2074,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2075,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2076,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2077,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2078,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2079,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2080,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2081,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2082,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2083,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2084,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2085,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2086,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2087,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2088,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2089,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2090,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2091,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2092,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2093,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2094,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2095,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2096,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2097,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2098,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2099,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2100,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2101,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2102,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2103,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2104,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2105,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2106,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2107,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2108,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2109,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2110,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2111,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2112,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2113,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2114,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2115,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2116,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2117,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2118,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2119,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2120,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2121,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2122,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2123,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2124,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2125,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2126,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2127,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2128,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2129,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2130,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2131,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2132,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2133,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2134,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2135,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2136,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2137,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2138,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2139,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2140,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2141,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2142,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2143,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2144,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2145,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2146,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2147,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2148,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2149,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2150,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2151,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2152,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2153,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2154,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2155,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2156,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2157,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2158,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2159,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2160,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2161,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2162,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2163,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2164,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2165,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2166,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2167,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2168,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2169,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2170,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2171,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2172,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2173,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2174,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2175,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2176,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2177,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2178,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2179,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2180,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2181,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2182,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2183,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2184,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2185,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2186,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2187,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2188,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2189,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2190,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2191,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2192,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2193,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2194,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2195,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2196,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2197,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2198,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2199,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2200,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2201,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2202,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2203,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2204,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2205,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2206,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2207,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2208,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2209,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2210,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2211,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2212,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2213,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2214,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2215,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2216,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2217,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2218,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2219,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2220,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2221,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2222,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2223,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2224,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2225,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2226,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2227,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2228,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2229,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2230,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2231,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2232,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2233,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2234,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2235,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2236,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2237,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2238,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2239,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2240,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2241,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2242,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2243,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2244,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2245,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2246,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2247,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2248,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2249,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2250,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2251,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2252,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2253,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2254,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2255,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2256,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2257,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2258,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2259,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2260,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2261,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2262,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2263,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2264,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2265,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2266,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2267,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2268,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2269,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2270,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2271,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2272,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2273,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2274,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2275,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2276,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2277,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2278,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2279,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2280,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2281,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2282,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2283,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2284,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2285,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2286,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2287,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2288,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2289,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2290,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2291,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2292,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2293,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2294,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2295,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2296,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2297,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2298,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2299,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2300,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2301,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2302,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2303,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2304,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2305,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2306,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2307,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2308,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2309,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2310,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2311,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2312,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2313,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2314,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2315,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2316,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2317,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2318,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2319,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2320,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2321,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2322,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2323,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2324,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2325,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2326,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2327,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2328,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2329,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2330,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2331,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2332,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2333,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2334,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2335,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2336,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2337,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2338,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2339,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2340,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2341,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2342,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2343,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2344,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2345,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2346,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2347,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2348,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2349,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2350,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2351,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2352,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2353,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2354,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2355,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2356,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2357,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2358,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2359,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2360,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2361,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2362,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2363,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2364,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2365,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2366,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2367,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2368,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2369,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2370,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2371,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2372,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2373,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2374,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2375,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2376,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2377,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2378,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2379,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2380,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2381,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2382,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2383,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2384,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2385,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2386,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2387,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2388,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2389,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2390,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2391,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2392,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2393,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2394,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2395,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2396,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2397,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2398,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2399,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2400,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2401,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2402,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2403,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2404,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2405,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2406,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2407,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2408,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2409,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2410,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2411,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2412,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2413,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2414,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2415,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2416,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2417,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2418,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2419,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2420,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2421,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2422,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2423,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2424,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2425,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2426,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2427,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2428,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2429,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2430,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2431,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2432,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2433,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2434,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2435,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2436,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2437,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2438,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2439,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2440,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2441,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2442,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2443,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2444,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2445,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2446,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2447,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2448,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2449,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2450,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2451,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2452,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2453,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2454,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2455,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2456,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2457,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2458,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2459,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2460,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2461,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2462,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2463,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2464,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2465,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2466,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2467,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2468,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2469,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2470,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2471,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2472,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2473,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2474,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2475,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2476,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2477,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2478,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2479,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2480,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2481,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2482,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2483,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2484,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2485,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2486,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2487,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2488,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2489,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2490,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2491,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2492,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2493,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2494,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2495,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2496,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2497,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2498,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2499,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2500,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2501,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2502,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2503,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2504,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2505,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2506,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2507,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2508,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2509,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2510,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2511,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2512,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2513,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2514,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2515,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2516,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2517,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2518,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2519,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2520,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2521,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2522,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2523,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2524,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2525,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2526,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2527,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2528,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2529,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2530,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2531,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2532,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2533,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2534,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2535,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2536,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2537,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2538,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2539,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2540,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2541,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2542,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2543,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2544,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2545,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2546,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2547,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2548,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2549,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2550,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2551,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2552,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2553,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2554,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2555,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2556,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2557,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2558,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2559,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2560,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2561,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2562,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2563,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2564,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2565,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2566,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2567,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2568,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2569,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2570,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2571,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2572,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2573,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2574,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2575,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2576,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2577,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2578,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2579,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2580,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2581,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2582,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2583,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2584,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2585,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2586,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2587,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2588,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2589,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2590,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2591,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2592,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2593,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2594,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2595,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2596,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2597,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2598,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2599,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2600,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2601,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2602,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2603,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2604,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2605,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2606,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2607,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2608,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2609,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2610,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2611,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2612,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2613,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2614,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2615,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2616,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2617,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2618,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2619,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2620,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2621,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2622,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2623,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2624,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2625,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2626,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2627,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2628,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2629,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2630,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2631,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2632,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2633,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2634,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2635,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2636,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2637,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2638,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2639,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2640,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2641,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2642,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2643,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2644,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2645,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2646,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2647,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2648,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2649,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2650,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2651,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2652,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2653,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2654,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2655,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2656,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2657,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2658,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2659,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2660,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2661,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2662,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2663,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2664,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2665,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2666,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2667,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2668,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2669,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2670,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2671,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2672,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2673,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2674,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2675,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2676,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2677,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2678,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2679,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2680,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2681,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2682,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2683,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2684,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2685,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2686,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2687,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2688,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2689,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2690,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2691,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2692,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2693,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2694,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2695,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2696,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2697,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2698,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2699,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2700,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2701,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2702,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2703,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2704,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2705,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2706,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2707,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2708,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2709,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2710,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2711,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2712,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2713,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2714,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2715,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2716,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2717,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2718,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2719,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2720,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2721,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2722,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2723,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2724,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2725,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2726,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2727,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2728,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2729,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2730,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2731,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2732,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2733,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2734,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2735,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2736,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2737,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2738,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2739,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2740,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2741,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2742,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2743,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2744,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2745,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2746,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2747,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2748,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2749,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2750,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2751,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2752,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2753,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2754,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2755,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2756,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2757,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2758,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2759,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2760,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2761,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2762,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2763,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2764,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2765,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2766,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2767,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2768,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2769,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2770,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2771,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2772,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2773,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2774,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2775,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2776,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2777,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2778,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2779,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2780,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2781,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2782,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2783,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2784,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2785,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2786,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2787,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2788,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2789,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2790,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2791,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2792,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2793,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2794,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2795,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2796,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2797,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2798,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2799,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2800,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2801,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2802,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2803,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2804,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2805,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2806,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2807,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2808,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2809,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2810,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2811,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2812,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2813,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2814,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2815,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2816,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2817,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2818,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2819,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2820,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2821,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2822,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2823,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2824,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2825,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2826,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2827,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2828,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2829,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2830,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2831,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2832,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2833,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2834,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2835,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2836,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2837,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2838,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2839,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2840,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2841,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2842,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2843,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2844,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2845,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2846,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2847,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2848,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2849,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2850,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2851,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2852,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2853,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2854,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2855,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2856,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2857,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2858,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2859,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2860,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2861,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2862,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2863,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2864,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2865,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2866,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2867,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2868,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2869,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2870,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2871,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2872,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2873,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2874,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2875,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2876,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2877,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2878,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2879,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2880,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2881,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2882,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2883,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2884,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2885,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2886,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2887,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2888,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2889,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2890,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2891,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2892,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2893,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2894,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2895,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2896,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2897,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2898,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2899,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2900,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2901,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2902,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2903,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2904,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2905,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2906,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2907,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2908,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2909,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2910,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2911,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2912,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2913,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2914,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2915,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2916,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2917,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2918,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2919,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2920,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2921,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2922,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2923,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2924,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2925,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2926,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2927,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2928,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2929,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2930,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2931,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2932,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2933,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2934,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2935,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2936,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2937,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2938,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2939,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2940,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2941,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2942,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2943,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2944,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2945,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2946,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2947,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2948,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2949,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2950,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2951,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2952,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2953,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2954,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2955,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2956,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2957,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2958,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2959,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2960,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2961,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2962,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2963,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2964,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2965,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2966,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2967,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2968,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2969,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2970,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2971,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2972,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2973,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2974,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2975,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2976,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2977,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2978,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2979,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2980,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2981,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2982,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2983,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2984,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2985,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2986,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2987,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2988,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2989,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2990,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2991,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2992,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2993,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2994,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2995,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2996,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2997,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2998,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2999,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3000,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3001,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3002,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3003,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3004,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3005,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3006,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3007,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3008,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3009,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3010,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3011,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3012,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3013,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3014,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3015,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3016,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3017,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3018,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3019,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3020,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3021,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3022,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3023,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3024,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3025,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3026,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3027,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3028,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3029,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3030,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3031,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3032,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3033,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3034,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3035,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3036,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3037,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3038,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3039,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3040,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3041,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3042,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3043,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3044,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3045,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3046,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3047,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3048,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3049,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3050,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3051,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3052,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3053,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3054,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3055,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3056,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3057,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3058,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3059,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3060,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3061,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3062,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3063,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3064,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3065,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3066,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3067,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3068,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3069,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3070,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3071,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3072,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3073,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3074,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3075,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3076,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3077,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3078,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3079,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3080,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3081,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3082,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3083,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3084,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3085,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3086,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3087,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3088,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3089,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3090,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3091,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3092,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3093,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3094,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3095,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3096,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3097,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3098,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3099,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3100,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3101,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3102,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3103,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3104,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3105,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3106,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3107,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3108,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3109,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3110,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3111,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3112,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3113,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3114,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3115,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3116,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3117,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3118,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3119,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3120,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3121,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3122,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3123,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3124,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3125,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3126,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3127,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3128,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3129,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3130,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3131,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3132,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3133,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3134,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3135,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3136,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3137,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3138,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3139,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3140,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3141,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3142,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3143,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3144,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3145,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3146,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3147,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3148,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3149,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3150,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3151,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3152,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3153,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3154,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3155,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3156,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3157,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3158,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3159,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3160,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3161,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3162,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3163,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3164,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3165,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3166,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3167,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3168,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3169,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3170,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3171,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3172,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3173,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3174,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3175,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3176,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3177,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3178,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3179,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3180,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3181,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3182,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3183,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3184,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3185,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3186,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3187,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3188,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3189,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3190,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3191,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3192,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3193,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3194,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3195,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3196,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3197,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3198,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3199,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3200,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3201,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3202,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3203,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3204,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3205,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3206,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3207,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3208,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3209,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3210,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3211,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3212,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3213,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3214,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3215,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3216,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3217,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3218,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3219,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3220,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3221,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3222,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3223,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3224,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3225,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3226,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3227,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3228,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3229,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3230,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3231,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3232,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3233,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3234,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3235,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3236,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3237,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3238,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3239,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3240,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3241,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3242,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3243,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3244,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3245,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3246,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3247,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3248,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3249,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3250,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3251,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3252,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3253,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3254,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3255,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3256,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3257,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3258,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3259,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3260,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3261,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3262,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3263,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3264,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3265,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3266,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3267,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3268,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3269,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3270,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3271,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3272,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3273,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3274,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3275,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3276,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3277,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3278,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3279,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3280,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3281,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3282,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3283,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3284,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3285,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3286,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3287,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3288,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3289,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3290,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3291,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3292,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3293,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3294,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3295,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3296,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3297,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3298,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3299,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3300,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3301,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3302,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3303,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3304,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3305,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3306,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3307,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3308,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3309,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3310,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3311,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3312,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3313,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3314,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3315,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3316,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3317,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3318,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3319,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3320,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3321,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3322,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3323,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3324,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3325,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3326,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3327,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3328,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3329,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3330,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3331,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3332,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3333,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3334,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3335,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3336,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3337,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3338,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3339,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3340,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3341,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3342,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3343,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3344,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3345,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3346,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3347,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3348,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3349,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3350,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3351,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3352,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3353,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3354,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3355,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3356,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3357,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3358,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3359,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3360,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3361,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3362,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3363,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3364,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3365,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3366,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3367,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3368,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3369,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3370,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3371,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3372,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3373,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3374,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3375,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3376,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3377,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3378,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3379,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3380,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3381,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3382,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3383,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3384,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3385,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3386,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3387,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3388,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3389,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3390,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3391,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3392,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3393,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3394,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3395,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3396,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3397,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3398,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3399,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3400,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3401,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3402,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3403,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3404,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3405,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3406,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3407,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3408,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3409,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3410,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3411,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3412,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3413,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3414,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3415,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3416,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3417,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3418,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3419,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3420,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3421,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3422,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3423,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3424,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3425,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3426,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3427,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3428,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3429,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3430,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3431,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3432,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3433,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3434,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3435,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3436,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3437,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3438,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3439,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3440,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3441,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3442,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3443,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3444,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3445,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3446,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3447,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3448,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3449,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3450,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3451,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3452,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3453,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3454,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3455,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3456,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3457,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3458,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3459,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3460,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3461,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3462,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3463,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3464,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3465,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3466,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3467,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3468,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3469,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3470,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3471,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3472,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3473,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3474,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3475,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3476,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3477,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3478,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3479,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3480,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3481,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3482,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3483,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3484,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3485,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3486,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3487,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3488,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3489,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3490,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3491,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3492,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3493,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3494,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3495,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3496,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3497,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3498,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3499,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3500,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3501,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3502,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3503,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3504,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3505,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3506,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3507,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3508,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3509,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3510,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3511,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3512,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3513,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3514,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3515,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3516,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3517,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3518,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3519,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3520,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3521,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3522,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3523,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3524,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3525,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3526,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3527,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3528,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3529,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3530,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3531,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3532,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3533,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3534,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3535,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3536,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3537,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3538,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3539,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3540,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3541,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3542,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3543,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3544,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3545,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3546,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3547,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3548,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3549,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3550,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3551,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3552,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3553,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3554,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3555,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3556,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3557,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3558,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3559,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3560,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3561,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3562,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3563,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3564,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3565,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3566,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3567,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3568,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3569,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3570,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3571,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3572,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3573,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3574,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3575,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3576,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3577,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3578,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3579,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3580,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3581,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3582,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3583,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3584,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3585,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3586,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3587,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3588,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3589,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3590,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3591,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3592,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3593,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3594,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3595,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3596,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3597,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3598,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3599,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3600,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3601,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3602,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3603,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3604,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3605,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3606,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3607,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3608,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3609,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3610,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3611,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3612,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3613,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3614,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3615,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3616,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3617,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3618,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3619,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3620,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3621,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3622,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3623,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3624,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3625,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3626,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3627,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3628,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3629,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3630,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3631,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3632,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3633,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3634,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3635,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3636,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3637,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3638,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3639,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3640,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3641,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3642,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3643,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3644,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3645,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3646,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3647,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3648,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3649,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3650,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3651,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3652,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3653,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3654,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3655,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3656,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3657,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3658,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3659,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3660,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3661,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3662,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3663,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3664,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3665,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3666,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3667,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3668,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3669,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3670,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3671,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3672,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3673,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3674,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3675,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3676,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3677,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3678,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3679,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3680,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3681,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3682,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3683,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3684,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3685,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3686,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3687,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3688,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3689,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3690,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3691,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3692,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3693,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3694,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3695,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3696,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3697,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3698,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3699,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3700,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3701,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3702,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3703,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3704,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3705,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3706,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3707,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3708,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3709,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3710,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3711,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3712,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3713,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3714,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3715,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3716,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3717,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3718,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3719,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3720,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3721,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3722,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3723,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3724,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3725,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3726,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3727,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3728,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3729,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3730,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3731,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3732,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3733,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3734,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3735,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3736,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3737,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3738,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3739,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3740,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3741,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3742,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3743,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3744,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3745,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3746,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3747,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3748,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3749,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3750,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3751,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3752,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3753,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3754,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3755,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3756,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3757,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3758,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3759,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3760,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3761,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3762,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3763,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3764,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3765,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3766,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3767,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3768,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3769,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3770,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3771,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3772,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3773,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3774,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3775,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3776,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3777,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3778,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3779,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3780,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3781,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3782,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3783,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3784,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3785,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3786,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3787,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3788,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3789,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3790,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3791,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3792,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3793,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3794,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3795,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3796,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3797,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3798,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3799,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3800,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3801,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3802,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3803,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3804,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3805,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3806,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3807,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3808,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3809,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3810,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3811,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3812,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3813,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3814,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3815,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3816,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3817,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3818,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3819,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3820,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3821,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3822,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3823,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3824,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3825,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3826,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3827,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3828,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3829,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3830,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3831,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3832,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3833,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3834,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3835,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3836,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3837,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3838,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3839,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3840,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3841,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3842,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3843,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3844,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3845,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3846,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3847,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3848,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3849,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3850,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3851,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3852,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3853,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3854,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3855,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3856,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3857,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3858,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3859,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3860,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3861,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3862,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3863,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3864,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3865,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3866,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3867,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3868,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3869,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3870,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3871,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3872,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3873,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3874,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3875,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3876,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3877,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3878,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3879,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3880,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3881,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3882,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3883,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3884,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3885,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3886,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3887,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3888,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3889,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3890,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3891,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3892,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3893,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3894,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3895,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3896,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3897,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3898,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3899,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3900,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3901,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3902,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3903,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3904,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3905,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3906,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3907,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3908,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3909,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3910,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3911,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3912,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3913,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3914,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3915,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3916,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3917,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3918,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3919,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3920,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3921,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3922,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3923,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3924,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3925,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3926,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3927,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3928,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3929,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3930,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3931,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3932,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3933,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3934,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3935,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3936,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3937,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3938,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3939,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3940,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3941,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3942,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3943,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3944,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3945,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3946,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3947,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3948,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3949,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3950,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3951,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3952,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3953,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3954,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3955,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3956,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3957,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3958,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3959,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3960,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3961,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3962,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3963,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3964,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3965,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3966,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3967,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3968,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3969,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3970,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3971,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3972,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3973,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3974,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3975,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3976,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3977,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3978,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3979,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3980,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3981,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3982,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3983,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3984,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3985,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3986,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3987,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3988,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3989,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3990,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3991,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3992,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3993,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3994,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3995,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3996,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3997,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3998,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3999,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4000,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4001,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4002,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4003,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4004,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4005,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4006,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4007,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4008,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4009,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4010,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4011,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4012,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4013,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4014,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4015,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4016,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4017,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4018,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4019,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4020,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4021,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4022,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4023,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4024,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4025,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4026,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4027,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4028,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4029,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4030,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4031,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4032,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4033,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4034,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4035,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4036,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4037,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4038,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4039,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4040,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4041,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4042,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4043,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4044,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4045,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4046,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4047,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4048,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4049,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4050,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4051,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4052,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4053,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4054,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4055,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4056,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4057,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4058,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4059,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4060,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4061,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4062,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4063,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4064,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4065,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4066,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4067,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4068,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4069,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4070,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4071,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4072,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4073,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4074,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4075,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4076,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4077,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4078,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4079,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4080,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4081,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4082,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4083,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4084,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4085,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4086,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4087,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4088,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4089,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4090,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4091,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4092,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4093,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4094,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4095,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4096,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4097,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4098,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4099,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4100,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4101,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4102,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4103,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4104,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4105,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4106,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4107,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4108,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4109,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4110,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4111,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4112,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4113,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4114,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4115,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4116,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4117,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4118,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4119,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4120,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4121,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4122,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4123,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4124,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4125,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4126,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4127,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4128,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4129,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4130,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4131,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4132,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4133,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4134,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4135,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4136,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4137,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4138,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4139,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4140,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4141,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4142,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4143,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4144,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4145,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4146,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4147,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4148,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4149,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4150,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4151,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4152,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4153,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4154,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4155,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4156,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4157,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4158,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4159,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4160,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4161,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4162,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4163,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4164,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4165,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4166,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4167,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4168,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4169,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4170,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4171,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4172,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4173,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4174,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4175,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4176,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4177,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4178,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4179,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4180,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4181,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4182,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4183,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4184,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4185,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4186,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4187,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4188,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4189,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4190,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4191,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4192,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4193,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4194,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4195,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4196,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4197,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4198,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4199,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4200,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4201,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4202,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4203,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4204,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4205,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4206,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4207,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4208,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4209,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4210,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4211,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4212,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4213,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4214,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4215,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4216,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4217,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4218,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4219,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4220,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4221,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4222,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4223,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4224,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4225,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4226,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4227,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4228,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4229,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4230,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4231,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4232,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4233,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4234,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4235,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4236,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4237,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4238,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4239,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4240,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4241,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4242,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4243,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4244,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4245,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4246,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4247,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4248,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4249,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4250,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4251,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4252,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4253,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4254,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4255,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4256,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4257,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4258,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4259,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4260,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4261,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4262,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4263,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4264,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4265,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4266,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4267,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4268,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4269,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4270,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4271,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4272,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4273,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4274,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4275,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4276,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4277,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4278,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4279,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4280,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4281,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4282,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4283,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4284,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4285,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4286,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4287,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4288,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4289,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4290,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4291,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4292,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4293,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4294,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4295,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4296,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4297,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4298,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4299,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4300,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4301,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4302,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4303,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4304,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4305,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4306,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4307,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4308,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4309,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4310,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4311,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4312,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4313,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4314,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4315,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4316,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4317,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4318,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4319,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4320,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4321,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4322,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4323,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4324,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4325,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4326,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4327,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4328,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4329,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4330,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4331,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4332,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4333,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4334,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4335,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4336,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4337,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4338,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4339,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4340,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4341,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4342,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4343,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4344,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4345,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4346,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4347,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4348,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4349,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4350,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4351,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4352,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4353,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4354,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4355,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4356,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4357,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4358,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4359,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4360,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4361,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4362,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4363,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4364,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4365,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4366,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4367,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4368,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4369,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4370,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4371,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4372,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4373,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4374,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4375,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4376,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4377,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4378,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4379,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4380,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4381,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4382,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4383,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4384,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4385,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4386,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4387,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4388,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4389,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4390,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4391,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4392,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4393,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4394,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4395,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4396,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4397,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4398,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4399,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4400,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4401,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4402,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4403,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4404,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4405,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4406,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4407,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4408,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4409,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4410,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4411,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4412,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4413,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4414,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4415,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4416,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4417,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4418,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4419,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4420,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4421,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4422,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4423,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4424,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4425,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4426,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4427,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4428,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4429,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4430,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4431,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4432,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4433,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4434,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4435,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4436,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4437,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4438,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4439,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4440,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4441,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4442,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4443,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4444,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4445,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4446,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4447,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4448,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4449,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4450,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4451,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4452,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4453,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4454,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4455,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4456,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4457,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4458,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4459,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4460,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4461,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4462,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4463,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4464,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4465,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4466,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4467,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4468,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4469,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4470,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4471,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4472,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4473,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4474,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4475,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4476,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4477,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4478,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4479,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4480,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4481,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4482,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4483,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4484,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4485,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4486,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4487,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4488,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4489,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4490,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4491,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4492,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4493,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4494,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4495,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4496,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4497,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4498,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4499,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4500,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4501,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4502,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4503,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4504,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4505,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4506,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4507,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4508,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4509,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4510,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4511,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4512,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4513,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4514,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4515,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4516,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4517,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4518,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4519,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4520,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4521,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4522,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4523,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4524,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4525,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4526,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4527,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4528,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4529,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4530,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4531,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4532,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4533,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4534,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4535,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4536,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4537,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4538,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4539,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4540,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4541,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4542,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4543,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4544,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4545,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4546,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4547,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4548,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4549,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4550,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4551,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4552,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4553,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4554,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4555,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4556,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4557,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4558,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4559,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4560,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4561,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4562,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4563,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4564,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4565,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4566,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4567,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4568,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4569,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4570,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4571,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4572,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4573,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4574,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4575,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4576,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4577,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4578,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4579,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4580,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4581,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4582,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4583,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4584,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4585,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4586,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4587,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4588,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4589,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4590,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4591,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4592,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4593,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4594,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4595,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4596,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4597,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4598,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4599,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4600,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4601,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4602,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4603,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4604,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4605,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4606,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4607,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4608,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4609,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4610,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4611,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4612,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4613,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4614,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4615,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4616,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4617,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4618,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4619,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4620,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4621,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4622,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4623,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4624,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4625,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4626,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4627,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4628,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4629,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4630,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4631,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4632,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4633,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4634,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4635,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4636,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4637,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4638,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4639,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4640,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4641,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4642,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4643,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4644,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4645,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4646,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4647,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4648,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4649,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4650,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4651,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4652,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4653,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4654,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4655,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4656,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4657,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4658,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4659,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4660,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4661,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4662,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4663,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4664,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4665,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4666,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4667,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4668,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4669,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4670,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4671,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4672,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4673,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4674,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4675,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4676,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4677,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4678,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4679,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4680,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4681,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4682,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4683,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4684,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4685,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4686,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4687,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4688,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4689,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4690,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4691,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4692,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4693,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4694,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4695,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4696,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4697,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4698,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4699,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4700,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4701,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4702,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4703,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4704,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4705,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4706,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4707,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4708,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4709,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4710,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4711,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4712,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4713,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4714,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4715,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4716,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4717,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4718,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4719,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4720,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4721,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4722,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4723,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4724,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4725,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4726,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4727,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4728,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4729,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4730,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4731,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4732,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4733,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4734,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4735,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4736,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4737,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4738,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4739,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4740,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4741,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4742,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4743,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4744,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4745,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4746,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4747,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4748,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4749,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4750,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4751,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4752,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4753,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4754,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4755,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4756,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4757,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4758,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4759,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4760,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4761,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4762,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4763,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4764,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4765,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4766,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4767,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4768,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4769,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4770,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4771,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4772,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4773,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4774,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4775,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4776,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4777,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4778,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4779,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4780,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4781,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4782,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4783,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4784,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4785,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4786,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4787,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4788,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4789,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4790,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4791,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4792,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4793,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4794,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4795,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4796,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4797,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4798,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4799,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4800,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4801,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4802,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4803,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4804,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4805,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4806,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4807,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4808,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4809,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4810,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4811,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4812,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4813,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4814,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4815,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4816,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4817,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4818,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4819,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4820,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4821,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4822,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4823,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4824,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4825,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4826,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4827,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4828,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4829,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4830,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4831,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4832,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4833,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4834,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4835,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4836,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4837,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4838,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4839,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4840,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4841,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4842,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4843,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4844,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4845,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4846,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4847,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4848,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4849,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4850,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4851,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4852,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4853,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4854,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4855,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4856,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4857,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4858,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4859,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4860,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4861,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4862,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4863,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4864,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4865,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4866,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4867,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4868,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4869,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4870,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4871,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4872,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4873,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4874,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4875,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4876,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4877,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4878,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4879,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4880,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4881,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4882,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4883,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4884,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4885,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4886,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4887,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4888,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4889,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4890,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4891,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4892,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4893,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4894,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4895,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4896,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4897,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4898,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4899,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4900,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4901,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4902,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4903,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4904,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4905,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4906,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4907,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4908,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4909,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4910,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4911,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4912,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4913,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4914,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4915,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4916,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4917,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4918,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4919,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4920,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4921,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4922,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4923,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4924,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4925,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4926,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4927,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4928,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4929,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4930,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4931,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4932,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4933,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4934,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4935,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4936,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4937,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4938,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4939,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4940,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4941,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4942,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4943,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4944,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4945,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4946,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4947,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4948,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4949,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4950,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4951,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4952,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4953,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4954,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4955,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4956,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4957,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4958,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4959,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4960,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4961,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4962,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4963,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4964,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4965,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4966,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4967,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4968,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4969,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4970,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4971,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4972,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4973,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4974,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4975,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4976,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4977,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4978,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4979,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4980,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4981,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4982,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4983,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4984,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4985,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4986,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4987,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4988,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4989,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4990,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4991,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4992,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4993,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4994,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4995,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4996,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4997,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4998,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4999,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5000,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5001,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5002,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5003,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5004,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5005,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5006,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5007,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5008,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5009,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5010,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5011,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5012,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5013,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5014,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5015,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5016,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5017,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5018,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5019,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5020,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5021,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5022,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5023,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5024,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5025,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5026,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5027,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5028,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5029,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5030,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5031,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5032,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5033,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5034,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5035,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5036,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5037,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5038,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5039,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5040,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5041,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5042,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5043,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5044,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5045,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5046,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5047,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5048,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5049,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5050,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5051,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5052,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5053,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5054,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5055,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5056,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5057,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5058,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5059,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5060,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5061,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5062,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5063,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5064,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5065,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5066,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5067,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5068,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5069,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5070,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5071,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5072,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5073,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5074,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5075,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5076,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5077,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5078,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5079,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5080,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5081,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5082,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5083,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5084,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5085,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5086,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5087,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5088,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5089,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5090,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5091,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5092,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5093,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5094,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5095,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5096,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5097,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5098,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5099,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5100,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5101,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5102,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5103,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5104,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5105,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5106,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5107,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5108,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5109,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5110,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5111,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5112,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5113,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5114,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5115,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5116,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5117,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5118,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5119,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5120,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5121,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5122,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5123,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5124,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5125,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5126,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5127,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5128,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5129,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5130,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5131,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5132,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5133,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5134,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5135,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5136,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5137,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5138,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5139,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5140,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5141,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5142,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5143,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5144,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5145,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5146,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5147,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5148,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5149,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5150,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5151,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5152,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5153,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5154,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5155,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5156,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5157,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5158,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5159,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5160,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5161,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5162,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5163,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5164,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5165,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5166,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5167,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5168,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5169,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5170,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5171,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5172,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5173,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5174,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5175,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5176,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5177,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5178,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5179,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5180,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5181,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5182,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5183,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5184,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5185,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5186,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5187,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5188,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5189,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5190,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5191,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5192,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5193,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5194,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5195,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5196,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5197,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5198,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5199,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5200,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5201,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5202,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5203,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5204,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5205,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5206,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5207,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5208,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5209,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5210,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5211,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5212,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5213,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5214,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5215,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5216,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5217,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5218,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5219,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5220,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5221,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5222,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5223,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5224,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5225,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5226,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5227,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5228,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5229,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5230,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5231,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5232,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5233,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5234,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5235,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5236,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5237,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5238,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5239,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5240,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5241,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5242,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5243,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5244,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5245,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5246,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5247,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5248,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5249,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5250,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5251,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5252,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5253,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5254,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5255,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5256,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5257,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5258,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5259,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5260,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5261,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5262,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5263,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5264,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5265,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5266,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5267,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5268,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5269,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5270,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5271,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5272,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5273,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5274,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5275,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5276,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5277,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5278,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5279,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5280,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5281,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5282,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5283,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5284,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5285,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5286,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5287,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5288,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5289,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5290,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5291,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5292,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5293,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5294,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5295,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5296,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5297,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5298,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5299,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5300,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5301,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5302,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5303,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5304,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5305,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5306,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5307,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5308,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5309,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5310,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5311,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5312,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5313,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5314,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5315,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5316,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5317,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5318,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5319,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5320,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5321,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5322,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5323,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5324,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5325,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5326,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5327,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5328,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5329,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5330,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5331,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5332,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5333,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5334,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5335,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5336,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5337,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5338,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5339,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5340,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5341,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5342,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5343,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5344,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5345,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5346,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5347,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5348,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5349,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5350,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5351,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5352,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5353,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5354,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5355,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5356,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5357,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5358,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5359,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5360,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5361,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5362,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5363,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5364,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5365,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5366,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5367,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5368,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5369,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5370,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5371,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5372,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5373,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5374,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5375,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5376,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5377,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5378,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5379,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5380,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5381,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5382,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5383,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5384,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5385,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5386,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5387,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5388,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5389,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5390,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5391,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5392,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5393,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5394,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5395,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5396,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5397,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5398,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5399,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5400,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5401,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5402,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5403,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5404,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5405,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5406,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5407,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5408,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5409,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5410,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5411,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5412,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5413,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5414,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5415,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5416,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5417,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5418,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5419,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5420,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5421,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5422,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5423,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5424,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5425,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5426,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5427,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5428,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5429,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5430,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5431,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5432,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5433,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5434,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5435,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5436,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5437,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5438,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5439,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5440,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5441,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5442,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5443,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5444,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5445,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5446,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5447,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5448,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5449,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5450,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5451,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5452,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5453,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5454,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5455,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5456,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5457,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5458,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5459,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5460,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5461,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5462,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5463,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5464,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5465,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5466,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5467,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5468,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5469,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5470,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5471,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5472,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5473,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5474,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5475,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5476,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5477,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5478,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5479,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5480,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5481,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5482,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5483,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5484,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5485,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5486,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5487,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5488,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5489,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5490,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5491,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5492,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5493,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5494,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5495,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5496,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5497,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5498,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5499,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5500,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5501,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5502,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5503,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5504,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5505,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5506,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5507,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5508,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5509,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5510,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5511,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5512,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5513,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5514,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5515,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5516,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5517,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5518,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5519,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5520,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5521,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5522,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5523,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5524,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5525,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5526,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5527,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5528,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5529,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5530,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5531,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5532,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5533,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5534,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5535,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5536,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5537,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5538,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5539,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5540,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5541,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5542,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5543,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5544,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5545,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5546,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5547,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5548,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5549,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5550,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5551,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5552,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5553,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5554,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5555,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5556,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5557,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5558,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5559,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5560,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5561,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5562,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5563,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5564,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5565,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5566,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5567,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5568,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5569,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5570,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5571,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5572,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5573,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5574,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5575,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5576,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5577,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5578,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5579,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5580,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5581,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5582,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5583,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5584,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5585,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5586,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5587,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5588,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5589,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5590,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5591,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5592,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5593,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5594,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5595,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5596,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5597,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5598,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5599,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5600,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5601,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5602,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5603,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5604,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5605,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5606,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5607,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5608,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5609,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5610,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5611,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5612,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5613,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5614,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5615,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5616,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5617,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5618,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5619,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5620,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5621,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5622,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5623,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5624,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5625,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5626,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5627,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5628,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5629,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5630,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5631,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5632,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5633,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5634,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5635,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5636,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5637,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5638,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5639,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5640,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5641,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5642,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5643,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5644,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5645,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5646,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5647,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5648,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5649,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5650,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5651,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5652,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5653,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5654,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5655,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5656,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5657,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5658,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5659,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5660,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5661,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5662,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5663,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5664,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5665,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5666,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5667,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5668,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5669,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5670,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5671,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5672,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5673,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5674,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5675,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5676,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5677,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5678,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5679,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5680,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5681,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5682,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5683,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5684,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5685,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5686,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5687,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5688,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5689,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5690,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5691,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5692,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5693,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5694,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5695,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5696,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5697,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5698,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5699,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5700,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5701,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5702,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5703,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5704,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5705,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5706,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5707,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5708,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5709,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5710,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5711,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5712,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5713,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5714,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5715,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5716,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5717,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5718,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5719,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5720,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5721,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5722,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5723,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5724,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5725,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5726,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5727,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5728,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5729,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5730,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5731,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5732,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5733,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5734,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5735,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5736,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5737,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5738,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5739,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5740,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5741,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5742,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5743,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5744,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5745,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5746,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5747,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5748,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5749,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5750,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5751,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5752,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5753,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5754,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5755,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5756,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5757,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5758,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5759,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5760,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5761,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5762,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5763,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5764,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5765,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5766,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5767,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5768,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5769,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5770,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5771,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5772,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5773,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5774,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5775,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5776,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5777,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5778,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5779,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5780,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5781,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5782,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5783,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5784,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5785,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5786,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5787,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5788,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5789,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5790,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5791,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5792,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5793,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5794,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5795,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5796,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5797,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5798,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5799,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5800,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5801,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5802,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5803,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5804,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5805,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5806,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5807,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5808,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5809,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5810,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5811,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5812,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5813,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5814,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5815,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5816,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5817,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5818,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5819,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5820,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5821,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5822,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5823,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5824,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5825,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5826,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5827,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5828,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5829,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5830,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5831,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5832,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5833,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5834,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5835,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5836,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5837,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5838,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5839,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5840,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5841,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5842,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5843,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5844,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5845,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5846,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5847,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5848,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5849,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5850,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5851,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5852,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5853,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5854,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5855,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5856,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5857,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5858,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5859,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5860,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5861,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5862,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5863,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5864,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5865,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5866,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5867,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5868,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5869,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5870,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5871,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5872,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5873,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5874,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5875,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5876,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5877,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5878,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5879,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5880,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5881,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5882,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5883,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5884,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5885,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5886,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5887,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5888,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5889,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5890,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5891,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5892,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5893,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5894,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5895,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5896,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5897,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5898,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5899,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5900,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5901,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5902,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5903,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5904,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5905,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5906,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5907,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5908,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5909,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5910,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5911,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5912,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5913,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5914,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5915,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5916,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5917,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5918,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5919,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5920,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5921,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5922,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5923,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5924,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5925,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5926,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5927,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5928,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5929,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5930,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5931,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5932,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5933,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5934,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5935,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5936,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5937,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5938,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5939,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5940,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5941,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5942,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5943,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5944,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5945,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5946,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5947,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5948,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5949,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5950,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5951,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5952,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5953,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5954,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5955,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5956,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5957,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5958,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5959,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5960,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5961,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5962,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5963,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5964,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5965,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5966,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5967,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5968,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5969,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5970,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5971,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5972,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5973,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5974,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5975,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5976,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5977,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5978,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5979,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5980,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5981,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5982,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5983,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5984,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5985,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5986,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5987,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5988,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5989,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5990,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5991,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5992,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5993,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5994,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5995,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5996,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5997,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5998,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5999,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6000,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6001,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6002,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6003,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6004,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6005,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6006,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6007,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6008,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6009,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6010,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6011,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6012,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6013,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6014,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6015,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6016,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6017,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6018,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6019,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6020,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6021,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6022,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6023,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6024,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6025,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6026,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6027,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6028,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6029,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6030,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6031,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6032,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6033,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6034,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6035,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6036,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6037,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6038,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6039,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6040,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6041,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6042,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6043,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6044,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6045,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6046,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6047,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6048,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6049,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6050,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6051,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6052,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6053,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6054,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6055,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6056,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6057,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6058,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6059,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6060,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6061,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6062,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6063,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6064,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6065,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6066,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6067,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6068,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6069,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6070,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6071,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6072,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6073,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6074,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6075,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6076,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6077,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6078,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6079,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6080,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6081,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6082,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6083,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6084,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6085,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6086,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6087,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6088,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6089,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6090,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6091,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6092,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6093,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6094,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6095,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6096,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6097,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6098,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6099,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6100,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6101,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6102,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6103,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6104,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6105,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6106,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6107,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6108,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6109,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6110,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6111,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6112,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6113,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6114,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6115,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6116,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6117,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6118,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6119,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6120,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6121,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6122,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6123,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6124,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6125,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6126,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6127,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6128,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6129,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6130,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6131,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6132,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6133,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6134,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6135,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6136,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6137,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6138,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6139,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6140,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6141,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6142,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6143,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6144,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6145,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6146,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6147,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6148,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6149,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6150,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6151,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6152,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6153,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6154,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6155,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6156,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6157,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6158,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6159,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6160,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6161,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6162,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6163,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6164,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6165,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6166,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6167,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6168,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6169,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6170,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6171,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6172,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6173,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6174,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6175,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6176,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6177,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6178,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6179,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6180,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6181,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6182,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6183,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6184,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6185,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6186,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6187,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6188,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6189,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6190,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6191,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6192,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6193,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6194,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6195,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6196,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6197,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6198,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6199,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6200,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6201,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6202,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6203,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6204,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6205,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6206,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6207,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6208,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6209,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6210,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6211,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6212,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6213,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6214,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6215,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6216,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6217,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6218,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6219,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6220,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6221,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6222,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6223,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6224,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6225,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6226,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6227,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6228,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6229,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6230,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6231,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6232,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6233,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6234,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6235,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6236,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6237,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6238,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6239,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6240,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6241,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6242,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6243,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6244,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6245,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6246,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6247,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6248,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6249,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6250,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6251,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6252,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6253,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6254,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6255,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6256,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6257,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6258,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6259,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6260,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6261,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6262,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6263,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6264,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6265,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6266,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6267,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6268,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6269,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6270,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6271,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6272,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6273,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6274,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6275,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6276,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6277,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6278,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6279,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6280,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6281,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6282,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6283,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6284,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6285,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6286,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6287,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6288,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6289,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6290,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6291,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6292,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6293,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6294,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6295,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6296,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6297,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6298,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6299,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6300,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6301,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6302,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6303,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6304,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6305,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6306,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6307,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6308,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6309,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6310,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6311,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6312,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6313,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6314,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6315,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6316,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6317,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6318,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6319,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6320,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6321,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6322,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6323,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6324,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6325,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6326,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6327,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6328,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6329,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6330,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6331,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6332,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6333,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6334,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6335,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6336,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6337,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6338,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6339,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6340,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6341,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6342,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6343,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6344,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6345,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6346,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6347,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6348,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6349,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6350,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6351,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6352,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6353,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6354,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6355,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6356,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6357,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6358,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6359,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6360,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6361,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6362,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6363,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6364,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6365,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6366,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6367,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6368,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6369,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6370,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6371,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6372,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6373,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6374,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6375,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6376,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6377,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6378,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6379,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6380,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6381,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6382,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6383,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6384,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6385,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6386,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6387,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6388,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6389,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6390,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6391,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6392,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6393,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6394,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6395,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6396,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6397,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6398,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6399,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6400,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6401,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6402,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6403,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6404,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6405,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6406,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6407,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6408,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6409,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6410,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6411,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6412,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6413,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6414,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6415,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6416,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6417,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6418,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6419,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6420,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6421,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6422,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6423,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6424,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6425,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6426,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6427,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6428,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6429,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6430,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6431,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6432,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6433,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6434,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6435,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6436,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6437,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6438,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6439,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6440,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6441,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6442,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6443,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6444,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6445,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6446,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6447,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6448,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6449,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6450,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6451,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6452,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6453,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6454,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6455,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6456,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6457,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6458,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6459,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6460,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6461,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6462,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6463,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6464,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6465,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6466,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6467,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6468,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6469,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6470,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6471,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6472,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6473,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6474,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6475,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6476,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6477,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6478,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6479,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6480,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6481,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6482,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6483,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6484,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6485,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6486,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6487,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6488,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6489,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6490,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6491,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6492,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6493,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6494,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6495,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6496,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6497,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6498,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6499,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6500,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6501,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6502,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6503,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6504,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6505,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6506,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6507,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6508,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6509,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6510,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6511,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6512,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6513,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6514,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6515,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6516,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6517,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6518,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6519,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6520,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6521,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6522,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6523,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6524,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6525,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6526,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6527,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6528,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6529,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6530,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6531,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6532,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6533,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6534,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6535,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6536,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6537,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6538,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6539,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6540,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6541,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6542,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6543,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6544,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6545,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6546,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6547,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6548,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6549,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6550,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6551,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6552,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6553,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6554,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6555,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6556,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6557,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6558,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6559,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6560,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6561,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6562,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6563,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6564,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6565,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6566,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6567,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6568,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6569,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6570,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6571,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6572,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6573,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6574,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6575,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6576,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6577,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6578,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6579,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6580,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6581,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6582,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6583,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6584,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6585,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6586,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6587,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6588,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6589,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6590,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6591,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6592,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6593,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6594,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6595,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6596,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6597,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6598,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6599,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6600,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6601,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6602,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6603,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6604,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6605,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6606,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6607,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6608,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6609,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6610,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6611,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6612,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6613,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6614,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6615,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6616,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6617,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6618,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6619,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6620,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6621,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6622,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6623,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6624,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6625,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6626,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6627,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6628,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6629,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6630,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6631,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6632,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6633,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6634,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6635,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6636,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6637,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6638,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6639,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6640,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6641,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6642,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6643,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6644,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6645,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6646,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6647,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6648,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6649,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6650,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6651,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6652,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6653,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6654,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6655,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6656,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6657,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6658,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6659,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6660,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6661,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6662,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6663,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6664,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6665,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6666,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6667,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6668,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6669,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6670,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6671,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6672,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6673,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6674,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6675,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6676,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6677,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6678,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6679,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6680,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6681,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6682,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6683,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6684,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6685,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6686,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6687,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6688,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6689,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6690,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6691,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6692,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6693,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6694,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6695,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6696,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6697,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6698,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6699,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6700,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6701,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6702,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6703,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6704,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6705,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6706,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6707,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6708,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6709,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6710,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6711,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6712,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6713,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6714,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6715,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6716,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6717,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6718,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6719,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6720,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6721,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6722,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6723,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6724,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6725,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6726,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6727,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6728,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6729,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6730,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6731,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6732,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6733,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6734,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6735,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6736,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6737,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6738,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6739,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6740,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6741,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6742,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6743,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6744,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6745,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6746,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6747,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6748,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6749,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6750,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6751,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6752,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6753,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6754,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6755,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6756,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6757,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6758,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6759,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6760,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6761,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6762,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6763,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6764,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6765,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6766,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6767,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6768,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6769,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6770,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6771,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6772,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6773,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6774,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6775,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6776,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6777,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6778,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6779,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6780,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6781,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6782,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6783,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6784,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6785,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6786,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6787,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6788,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6789,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6790,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6791,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6792,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6793,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6794,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6795,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6796,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6797,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6798,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6799,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6800,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6801,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6802,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6803,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6804,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6805,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6806,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6807,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6808,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6809,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6810,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6811,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6812,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6813,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6814,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6815,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6816,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6817,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6818,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6819,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6820,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6821,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6822,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6823,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6824,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6825,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6826,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6827,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6828,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6829,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6830,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6831,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6832,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6833,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6834,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6835,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6836,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6837,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6838,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6839,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6840,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6841,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6842,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6843,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6844,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6845,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6846,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6847,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6848,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6849,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6850,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6851,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6852,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6853,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6854,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6855,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6856,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6857,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6858,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6859,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6860,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6861,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6862,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6863,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6864,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6865,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6866,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6867,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6868,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6869,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6870,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6871,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6872,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6873,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6874,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6875,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6876,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6877,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6878,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6879,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6880,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6881,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6882,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6883,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6884,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6885,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6886,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6887,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6888,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6889,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6890,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6891,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6892,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6893,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6894,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6895,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6896,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6897,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6898,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6899,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6900,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6901,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6902,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6903,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6904,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6905,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6906,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6907,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6908,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6909,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6910,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6911,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6912,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6913,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6914,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6915,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6916,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6917,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6918,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6919,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6920,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6921,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6922,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6923,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6924,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6925,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6926,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6927,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6928,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6929,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6930,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6931,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6932,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6933,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6934,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6935,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6936,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6937,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6938,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6939,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6940,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6941,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6942,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6943,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6944,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6945,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6946,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6947,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6948,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6949,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6950,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6951,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6952,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6953,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6954,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6955,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6956,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6957,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6958,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6959,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6960,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6961,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6962,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6963,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6964,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6965,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6966,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6967,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6968,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6969,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6970,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6971,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6972,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6973,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6974,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6975,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6976,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6977,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6978,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6979,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6980,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6981,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6982,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6983,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6984,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6985,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6986,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6987,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6988,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6989,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6990,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6991,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6992,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6993,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6994,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6995,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6996,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6997,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6998,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6999,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7000,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7001,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7002,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7003,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7004,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7005,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7006,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7007,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7008,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7009,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7010,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7011,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7012,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7013,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7014,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7015,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7016,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7017,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7018,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7019,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7020,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7021,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7022,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7023,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7024,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7025,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7026,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7027,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7028,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7029,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7030,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7031,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7032,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7033,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7034,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7035,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7036,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7037,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7038,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7039,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7040,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7041,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7042,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7043,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7044,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7045,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7046,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7047,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7048,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7049,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7050,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7051,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7052,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7053,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7054,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7055,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7056,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7057,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7058,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7059,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7060,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7061,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7062,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7063,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7064,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7065,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7066,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7067,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7068,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7069,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7070,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7071,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7072,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7073,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7074,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7075,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7076,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7077,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7078,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7079,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7080,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7081,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7082,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7083,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7084,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7085,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7086,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7087,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7088,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7089,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7090,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7091,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7092,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7093,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7094,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7095,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7096,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7097,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7098,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7099,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7100,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7101,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7102,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7103,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7104,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7105,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7106,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7107,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7108,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7109,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7110,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7111,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7112,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7113,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7114,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7115,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7116,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7117,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7118,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7119,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7120,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7121,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7122,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7123,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7124,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7125,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7126,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7127,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7128,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7129,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7130,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7131,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7132,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7133,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7134,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7135,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7136,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7137,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7138,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7139,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7140,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7141,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7142,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7143,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7144,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7145,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7146,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7147,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7148,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7149,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7150,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7151,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7152,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7153,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7154,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7155,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7156,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7157,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7158,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7159,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7160,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7161,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7162,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7163,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7164,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7165,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7166,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7167,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7168,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7169,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7170,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7171,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7172,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7173,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7174,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7175,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7176,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7177,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7178,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7179,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7180,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7181,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7182,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7183,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7184,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7185,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7186,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7187,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7188,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7189,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7190,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7191,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7192,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7193,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7194,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7195,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7196,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7197,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7198,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7199,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7200,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7201,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7202,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7203,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7204,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7205,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7206,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7207,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7208,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7209,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7210,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7211,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7212,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7213,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7214,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7215,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7216,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7217,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7218,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7219,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7220,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7221,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7222,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7223,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7224,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7225,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7226,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7227,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7228,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7229,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7230,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7231,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7232,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7233,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7234,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7235,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7236,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7237,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7238,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7239,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7240,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7241,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7242,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7243,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7244,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7245,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7246,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7247,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7248,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7249,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7250,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7251,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7252,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7253,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7254,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7255,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7256,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7257,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7258,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7259,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7260,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7261,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7262,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7263,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7264,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7265,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7266,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7267,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7268,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7269,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7270,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7271,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7272,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7273,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7274,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7275,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7276,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7277,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7278,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7279,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7280,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7281,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7282,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7283,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7284,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7285,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7286,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7287,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7288,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7289,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7290,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7291,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7292,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7293,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7294,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7295,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7296,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7297,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7298,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7299,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7300,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7301,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7302,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7303,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7304,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7305,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7306,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7307,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7308,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7309,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7310,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7311,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7312,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7313,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7314,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7315,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7316,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7317,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7318,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7319,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7320,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7321,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7322,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7323,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7324,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7325,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7326,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7327,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7328,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7329,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7330,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7331,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7332,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7333,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7334,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7335,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7336,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7337,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7338,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7339,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7340,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7341,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7342,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7343,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7344,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7345,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7346,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7347,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7348,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7349,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7350,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7351,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7352,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7353,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7354,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7355,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7356,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7357,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7358,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7359,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7360,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7361,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7362,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7363,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7364,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7365,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7366,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7367,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7368,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7369,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7370,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7371,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7372,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7373,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7374,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7375,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7376,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7377,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7378,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7379,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7380,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7381,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7382,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7383,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7384,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7385,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7386,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7387,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7388,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7389,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7390,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7391,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7392,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7393,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7394,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7395,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7396,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7397,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7398,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7399,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7400,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7401,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7402,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7403,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7404,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7405,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7406,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7407,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7408,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7409,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7410,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7411,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7412,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7413,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7414,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7415,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7416,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7417,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7418,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7419,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7420,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7421,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7422,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7423,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7424,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7425,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7426,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7427,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7428,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7429,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7430,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7431,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7432,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7433,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7434,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7435,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7436,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7437,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7438,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7439,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7440,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7441,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7442,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7443,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7444,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7445,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7446,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7447,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7448,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7449,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7450,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7451,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7452,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7453,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7454,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7455,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7456,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7457,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7458,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7459,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7460,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7461,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7462,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7463,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7464,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7465,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7466,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7467,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7468,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7469,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7470,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7471,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7472,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7473,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7474,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7475,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7476,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7477,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7478,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7479,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7480,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7481,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7482,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7483,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7484,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7485,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7486,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7487,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7488,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7489,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7490,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7491,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7492,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7493,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7494,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7495,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7496,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7497,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7498,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7499,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7500,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7501,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7502,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7503,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7504,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7505,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7506,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7507,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7508,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7509,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7510,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7511,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7512,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7513,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7514,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7515,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7516,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7517,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7518,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7519,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7520,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7521,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7522,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7523,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7524,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7525,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7526,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7527,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7528,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7529,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7530,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7531,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7532,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7533,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7534,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7535,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7536,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7537,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7538,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7539,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7540,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7541,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7542,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7543,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7544,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7545,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7546,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7547,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7548,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7549,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7550,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7551,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7552,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7553,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7554,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7555,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7556,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7557,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7558,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7559,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7560,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7561,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7562,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7563,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7564,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7565,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7566,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7567,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7568,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7569,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7570,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7571,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7572,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7573,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7574,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7575,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7576,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7577,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7578,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7579,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7580,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7581,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7582,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7583,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7584,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7585,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7586,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7587,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7588,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7589,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7590,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7591,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7592,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7593,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7594,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7595,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7596,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7597,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7598,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7599,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7600,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7601,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7602,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7603,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7604,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7605,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7606,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7607,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7608,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7609,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7610,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7611,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7612,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7613,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7614,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7615,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7616,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7617,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7618,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7619,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7620,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7621,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7622,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7623,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7624,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7625,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7626,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7627,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7628,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7629,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7630,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7631,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7632,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7633,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7634,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7635,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7636,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7637,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7638,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7639,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7640,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7641,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7642,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7643,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7644,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7645,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7646,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7647,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7648,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7649,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7650,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7651,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7652,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7653,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7654,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7655,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7656,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7657,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7658,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7659,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7660,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7661,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7662,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7663,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7664,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7665,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7666,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7667,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7668,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7669,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7670,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7671,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7672,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7673,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7674,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7675,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7676,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7677,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7678,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7679,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7680,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7681,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7682,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7683,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7684,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7685,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7686,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7687,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7688,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7689,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7690,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7691,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7692,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7693,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7694,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7695,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7696,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7697,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7698,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7699,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7700,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7701,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7702,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7703,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7704,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7705,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7706,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7707,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7708,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7709,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7710,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7711,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7712,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7713,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7714,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7715,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7716,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7717,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7718,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7719,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7720,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7721,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7722,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7723,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7724,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7725,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7726,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7727,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7728,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7729,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7730,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7731,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7732,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7733,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7734,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7735,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7736,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7737,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7738,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7739,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7740,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7741,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7742,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7743,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7744,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7745,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7746,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7747,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7748,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7749,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7750,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7751,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7752,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7753,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7754,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7755,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7756,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7757,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7758,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7759,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7760,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7761,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7762,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7763,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7764,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7765,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7766,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7767,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7768,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7769,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7770,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7771,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7772,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7773,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7774,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7775,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7776,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7777,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7778,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7779,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7780,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7781,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7782,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7783,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7784,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7785,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7786,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7787,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7788,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7789,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7790,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7791,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7792,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7793,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7794,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7795,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7796,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7797,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7798,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7799,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7800,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7801,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7802,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7803,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7804,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7805,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7806,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7807,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7808,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7809,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7810,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7811,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7812,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7813,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7814,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7815,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7816,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7817,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7818,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7819,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7820,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7821,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7822,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7823,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7824,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7825,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7826,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7827,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7828,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7829,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7830,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7831,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7832,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7833,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7834,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7835,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7836,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7837,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7838,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7839,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7840,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7841,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7842,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7843,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7844,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7845,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7846,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7847,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7848,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7849,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7850,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7851,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7852,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7853,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7854,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7855,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7856,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7857,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7858,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7859,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7860,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7861,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7862,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7863,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7864,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7865,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7866,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7867,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7868,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7869,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7870,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7871,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7872,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7873,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7874,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7875,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7876,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7877,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7878,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7879,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7880,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7881,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7882,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7883,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7884,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7885,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7886,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7887,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7888,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7889,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7890,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7891,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7892,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7893,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7894,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7895,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7896,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7897,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7898,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7899,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7900,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7901,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7902,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7903,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7904,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7905,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7906,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7907,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7908,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7909,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7910,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7911,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7912,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7913,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7914,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7915,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7916,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7917,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7918,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7919,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7920,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7921,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7922,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7923,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7924,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7925,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7926,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7927,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7928,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7929,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7930,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7931,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7932,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7933,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7934,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7935,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7936,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7937,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7938,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7939,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7940,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7941,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7942,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7943,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7944,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7945,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7946,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7947,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7948,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7949,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7950,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7951,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7952,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7953,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7954,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7955,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7956,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7957,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7958,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7959,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7960,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7961,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7962,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7963,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7964,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7965,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7966,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7967,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7968,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7969,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7970,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7971,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7972,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7973,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7974,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7975,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7976,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7977,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7978,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7979,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7980,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7981,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7982,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7983,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7984,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7985,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7986,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7987,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7988,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7989,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7990,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7991,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7992,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7993,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7994,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7995,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7996,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7997,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7998,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7999,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8000,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8001,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8002,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8003,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8004,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8005,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8006,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8007,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8008,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8009,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8010,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8011,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8012,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8013,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8014,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8015,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8016,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8017,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8018,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8019,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8020,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8021,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8022,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8023,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8024,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8025,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8026,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8027,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8028,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8029,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8030,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8031,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8032,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8033,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8034,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8035,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8036,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8037,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8038,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8039,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8040,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8041,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8042,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8043,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8044,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8045,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8046,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8047,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8048,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8049,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8050,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8051,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8052,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8053,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8054,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8055,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8056,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8057,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8058,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8059,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8060,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8061,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8062,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8063,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8064,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8065,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8066,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8067,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8068,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8069,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8070,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8071,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8072,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8073,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8074,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8075,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8076,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8077,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8078,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8079,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8080,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8081,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8082,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8083,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8084,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8085,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8086,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8087,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8088,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8089,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8090,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8091,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8092,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8093,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8094,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8095,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8096,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8097,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8098,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8099,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8100,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8101,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8102,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8103,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8104,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8105,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8106,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8107,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8108,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8109,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8110,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8111,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8112,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8113,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8114,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8115,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8116,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8117,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8118,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8119,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8120,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8121,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8122,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8123,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8124,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8125,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8126,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8127,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8128,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8129,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8130,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8131,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8132,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8133,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8134,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8135,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8136,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8137,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8138,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8139,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8140,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8141,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8142,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8143,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8144,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8145,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8146,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8147,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8148,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8149,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8150,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8151,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8152,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8153,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8154,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8155,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8156,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8157,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8158,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8159,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8160,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8161,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8162,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8163,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8164,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8165,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8166,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8167,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8168,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8169,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8170,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8171,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8172,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8173,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8174,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8175,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8176,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8177,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8178,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8179,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8180,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8181,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8182,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8183,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8184,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8185,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8186,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8187,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8188,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8189,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8190,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8191,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8192,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8193,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8194,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8195,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8196,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8197,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8198,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8199,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8200,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8201,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8202,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8203,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8204,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8205,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8206,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8207,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8208,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8209,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8210,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8211,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8212,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8213,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8214,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8215,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8216,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8217,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8218,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8219,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8220,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8221,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8222,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8223,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8224,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8225,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8226,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8227,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8228,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8229,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8230,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8231,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8232,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8233,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8234,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8235,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8236,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8237,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8238,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8239,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8240,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8241,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8242,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8243,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8244,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8245,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8246,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8247,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8248,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8249,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8250,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8251,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8252,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8253,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8254,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8255,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8256,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8257,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8258,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8259,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8260,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8261,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8262,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8263,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8264,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8265,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8266,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8267,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8268,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8269,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8270,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8271,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8272,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8273,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8274,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8275,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8276,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8277,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8278,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8279,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8280,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8281,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8282,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8283,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8284,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8285,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8286,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8287,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8288,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8289,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8290,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8291,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8292,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8293,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8294,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8295,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8296,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8297,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8298,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8299,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8300,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8301,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8302,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8303,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8304,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8305,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8306,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8307,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8308,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8309,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8310,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8311,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8312,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8313,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8314,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8315,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8316,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8317,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8318,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8319,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8320,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8321,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8322,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8323,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8324,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8325,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8326,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8327,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8328,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8329,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8330,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8331,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8332,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8333,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8334,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8335,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8336,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8337,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8338,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8339,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8340,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8341,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8342,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8343,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8344,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8345,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8346,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8347,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8348,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8349,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8350,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8351,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8352,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8353,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8354,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8355,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8356,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8357,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8358,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8359,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8360,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8361,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8362,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8363,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8364,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8365,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8366,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8367,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8368,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8369,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8370,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8371,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8372,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8373,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8374,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8375,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8376,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8377,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8378,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8379,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8380,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8381,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8382,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8383,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8384,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8385,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8386,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8387,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8388,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8389,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8390,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8391,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8392,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8393,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8394,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8395,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8396,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8397,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8398,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8399,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8400,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8401,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8402,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8403,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8404,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8405,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8406,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8407,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8408,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8409,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8410,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8411,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8412,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8413,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8414,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8415,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8416,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8417,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8418,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8419,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8420,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8421,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8422,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8423,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8424,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8425,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8426,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8427,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8428,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8429,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8430,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8431,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8432,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8433,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8434,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8435,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8436,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8437,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8438,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8439,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8440,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8441,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8442,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8443,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8444,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8445,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8446,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8447,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8448,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8449,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8450,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8451,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8452,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8453,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8454,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8455,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8456,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8457,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8458,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8459,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8460,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8461,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8462,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8463,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8464,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8465,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8466,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8467,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8468,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8469,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8470,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8471,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8472,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8473,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8474,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8475,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8476,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8477,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8478,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8479,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8480,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8481,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8482,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8483,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8484,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8485,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8486,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8487,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8488,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8489,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8490,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8491,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8492,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8493,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8494,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8495,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8496,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8497,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8498,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8499,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8500,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8501,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8502,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8503,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8504,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8505,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8506,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8507,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8508,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8509,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8510,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8511,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8512,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8513,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8514,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8515,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8516,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8517,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8518,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8519,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8520,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8521,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8522,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8523,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8524,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8525,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8526,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8527,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8528,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8529,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8530,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8531,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8532,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8533,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8534,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8535,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8536,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8537,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8538,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8539,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8540,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8541,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8542,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8543,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8544,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8545,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8546,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8547,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8548,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8549,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8550,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8551,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8552,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8553,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8554,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8555,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8556,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8557,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8558,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8559,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8560,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8561,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8562,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8563,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8564,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8565,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8566,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8567,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8568,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8569,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8570,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8571,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8572,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8573,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8574,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8575,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8576,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8577,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8578,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8579,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8580,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8581,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8582,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8583,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8584,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8585,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8586,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8587,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8588,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8589,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8590,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8591,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8592,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8593,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8594,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8595,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8596,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8597,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8598,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8599,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8600,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8601,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8602,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8603,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8604,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8605,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8606,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8607,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8608,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8609,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8610,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8611,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8612,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8613,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8614,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8615,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8616,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8617,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8618,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8619,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8620,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8621,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8622,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8623,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8624,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8625,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8626,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8627,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8628,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8629,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8630,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8631,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8632,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8633,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8634,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8635,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8636,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8637,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8638,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8639,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8640,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8641,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8642,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8643,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8644,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8645,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8646,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8647,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8648,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8649,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8650,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8651,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8652,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8653,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8654,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8655,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8656,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8657,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8658,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8659,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8660,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8661,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8662,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8663,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8664,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8665,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8666,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8667,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8668,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8669,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8670,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8671,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8672,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8673,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8674,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8675,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8676,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8677,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8678,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8679,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8680,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8681,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8682,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8683,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8684,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8685,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8686,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8687,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8688,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8689,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8690,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8691,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8692,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8693,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8694,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8695,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8696,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8697,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8698,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8699,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8700,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8701,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8702,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8703,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8704,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8705,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8706,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8707,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8708,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8709,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8710,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8711,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8712,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8713,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8714,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8715,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8716,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8717,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8718,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8719,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8720,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8721,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8722,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8723,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8724,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8725,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8726,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8727,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8728,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8729,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8730,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8731,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8732,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8733,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8734,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8735,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8736,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8737,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8738,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8739,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8740,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8741,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8742,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8743,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8744,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8745,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8746,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8747,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8748,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8749,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8750,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8751,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8752,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8753,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8754,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8755,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8756,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8757,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8758,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8759,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8760,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8761,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8762,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8763,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8764,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8765,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8766,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8767,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8768,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8769,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8770,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8771,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8772,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8773,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8774,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8775,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8776,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8777,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8778,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8779,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8780,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8781,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8782,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8783,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8784,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8785,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8786,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8787,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8788,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8789,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8790,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8791,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8792,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8793,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8794,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8795,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8796,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8797,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8798,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8799,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8800,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8801,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8802,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8803,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8804,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8805,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8806,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8807,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8808,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8809,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8810,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8811,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8812,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8813,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8814,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8815,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8816,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8817,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8818,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8819,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8820,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8821,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8822,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8823,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8824,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8825,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8826,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8827,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8828,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8829,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8830,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8831,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8832,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8833,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8834,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8835,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8836,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8837,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8838,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8839,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8840,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8841,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8842,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8843,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8844,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8845,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8846,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8847,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8848,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8849,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8850,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8851,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8852,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8853,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8854,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8855,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8856,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8857,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8858,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8859,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8860,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8861,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8862,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8863,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8864,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8865,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8866,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8867,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8868,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8869,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8870,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8871,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8872,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8873,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8874,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8875,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8876,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8877,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8878,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8879,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8880,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8881,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8882,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8883,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8884,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8885,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8886,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8887,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8888,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8889,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8890,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8891,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8892,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8893,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8894,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8895,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8896,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8897,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8898,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8899,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8900,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8901,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8902,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8903,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8904,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8905,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8906,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8907,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8908,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8909,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8910,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8911,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8912,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8913,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8914,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8915,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8916,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8917,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8918,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8919,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8920,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8921,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8922,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8923,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8924,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8925,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8926,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8927,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8928,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8929,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8930,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8931,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8932,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8933,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8934,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8935,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8936,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8937,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8938,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8939,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8940,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8941,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8942,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8943,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8944,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8945,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8946,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8947,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8948,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8949,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8950,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8951,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8952,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8953,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8954,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8955,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8956,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8957,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8958,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8959,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8960,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8961,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8962,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8963,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8964,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8965,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8966,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8967,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8968,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8969,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8970,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8971,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8972,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8973,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8974,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8975,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8976,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8977,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8978,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8979,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8980,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8981,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8982,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8983,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8984,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8985,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8986,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8987,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8988,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8989,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8990,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8991,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8992,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8993,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8994,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8995,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8996,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8997,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8998,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8999,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9000,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9001,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9002,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9003,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9004,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9005,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9006,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9007,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9008,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9009,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9010,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9011,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9012,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9013,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9014,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9015,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9016,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9017,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9018,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9019,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9020,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9021,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9022,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9023,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9024,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9025,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9026,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9027,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9028,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9029,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9030,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9031,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9032,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9033,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9034,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9035,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9036,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9037,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9038,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9039,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9040,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9041,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9042,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9043,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9044,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9045,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9046,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9047,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9048,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9049,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9050,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9051,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9052,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9053,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9054,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9055,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9056,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9057,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9058,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9059,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9060,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9061,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9062,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9063,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9064,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9065,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9066,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9067,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9068,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9069,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9070,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9071,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9072,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9073,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9074,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9075,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9076,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9077,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9078,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9079,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9080,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9081,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9082,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9083,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9084,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9085,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9086,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9087,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9088,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9089,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9090,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9091,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9092,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9093,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9094,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9095,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9096,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9097,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9098,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9099,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9100,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9101,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9102,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9103,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9104,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9105,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9106,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9107,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9108,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9109,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9110,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9111,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9112,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9113,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9114,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9115,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9116,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9117,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9118,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9119,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9120,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9121,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9122,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9123,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9124,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9125,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9126,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9127,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9128,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9129,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9130,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9131,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9132,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9133,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9134,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9135,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9136,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9137,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9138,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9139,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9140,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9141,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9142,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9143,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9144,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9145,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9146,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9147,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9148,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9149,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9150,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9151,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9152,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9153,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9154,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9155,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9156,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9157,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9158,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9159,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9160,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9161,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9162,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9163,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9164,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9165,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9166,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9167,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9168,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9169,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9170,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9171,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9172,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9173,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9174,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9175,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9176,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9177,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9178,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9179,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9180,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9181,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9182,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9183,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9184,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9185,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9186,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9187,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9188,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9189,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9190,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9191,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9192,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9193,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9194,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9195,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9196,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9197,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9198,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9199,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9200,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9201,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9202,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9203,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9204,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9205,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9206,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9207,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9208,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9209,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9210,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9211,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9212,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9213,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9214,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9215,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9216,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9217,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9218,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9219,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9220,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9221,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9222,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9223,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9224,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9225,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9226,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9227,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9228,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9229,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9230,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9231,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9232,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9233,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9234,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9235,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9236,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9237,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9238,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9239,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9240,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9241,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9242,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9243,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9244,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9245,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9246,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9247,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9248,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9249,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9250,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9251,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9252,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9253,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9254,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9255,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9256,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9257,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9258,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9259,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9260,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9261,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9262,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9263,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9264,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9265,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9266,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9267,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9268,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9269,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9270,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9271,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9272,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9273,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9274,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9275,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9276,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9277,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9278,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9279,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9280,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9281,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9282,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9283,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9284,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9285,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9286,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9287,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9288,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9289,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9290,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9291,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9292,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9293,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9294,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9295,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9296,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9297,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9298,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9299,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9300,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9301,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9302,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9303,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9304,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9305,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9306,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9307,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9308,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9309,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9310,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9311,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9312,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9313,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9314,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9315,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9316,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9317,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9318,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9319,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9320,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9321,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9322,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9323,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9324,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9325,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9326,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9327,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9328,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9329,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9330,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9331,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9332,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9333,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9334,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9335,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9336,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9337,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9338,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9339,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9340,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9341,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9342,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9343,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9344,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9345,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9346,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9347,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9348,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9349,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9350,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9351,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9352,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9353,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9354,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9355,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9356,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9357,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9358,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9359,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9360,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9361,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9362,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9363,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9364,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9365,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9366,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9367,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9368,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9369,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9370,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9371,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9372,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9373,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9374,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9375,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9376,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9377,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9378,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9379,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9380,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9381,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9382,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9383,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9384,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9385,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9386,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9387,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9388,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9389,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9390,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9391,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9392,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9393,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9394,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9395,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9396,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9397,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9398,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9399,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9400,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9401,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9402,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9403,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9404,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9405,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9406,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9407,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9408,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9409,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9410,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9411,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9412,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9413,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9414,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9415,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9416,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9417,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9418,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9419,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9420,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9421,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9422,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9423,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9424,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9425,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9426,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9427,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9428,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9429,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9430,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9431,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9432,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9433,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9434,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9435,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9436,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9437,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9438,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9439,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9440,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9441,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9442,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9443,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9444,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9445,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9446,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9447,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9448,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9449,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9450,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9451,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9452,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9453,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9454,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9455,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9456,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9457,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9458,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9459,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9460,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9461,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9462,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9463,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9464,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9465,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9466,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9467,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9468,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9469,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9470,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9471,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9472,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9473,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9474,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9475,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9476,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9477,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9478,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9479,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9480,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9481,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9482,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9483,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9484,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9485,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9486,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9487,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9488,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9489,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9490,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9491,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9492,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9493,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9494,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9495,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9496,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9497,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9498,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9499,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9500,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9501,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9502,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9503,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9504,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9505,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9506,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9507,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9508,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9509,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9510,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9511,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9512,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9513,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9514,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9515,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9516,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9517,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9518,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9519,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9520,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9521,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9522,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9523,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9524,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9525,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9526,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9527,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9528,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9529,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9530,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9531,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9532,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9533,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9534,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9535,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9536,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9537,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9538,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9539,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9540,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9541,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9542,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9543,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9544,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9545,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9546,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9547,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9548,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9549,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9550,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9551,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9552,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9553,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9554,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9555,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9556,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9557,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9558,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9559,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9560,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9561,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9562,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9563,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9564,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9565,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9566,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9567,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9568,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9569,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9570,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9571,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9572,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9573,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9574,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9575,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9576,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9577,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9578,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9579,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9580,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9581,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9582,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9583,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9584,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9585,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9586,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9587,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9588,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9589,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9590,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9591,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9592,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9593,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9594,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9595,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9596,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9597,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9598,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9599,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9600,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9601,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9602,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9603,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9604,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9605,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9606,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9607,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9608,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9609,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9610,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9611,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9612,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9613,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9614,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9615,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9616,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9617,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9618,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9619,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9620,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9621,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9622,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9623,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9624,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9625,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9626,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9627,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9628,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9629,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9630,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9631,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9632,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9633,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9634,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9635,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9636,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9637,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9638,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9639,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9640,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9641,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9642,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9643,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9644,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9645,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9646,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9647,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9648,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9649,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9650,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9651,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9652,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9653,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9654,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9655,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9656,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9657,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9658,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9659,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9660,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9661,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9662,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9663,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9664,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9665,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9666,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9667,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9668,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9669,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9670,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9671,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9672,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9673,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9674,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9675,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9676,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9677,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9678,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9679,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9680,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9681,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9682,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9683,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9684,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9685,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9686,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9687,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9688,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9689,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9690,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9691,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9692,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9693,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9694,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9695,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9696,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9697,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9698,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9699,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9700,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9701,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9702,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9703,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9704,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9705,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9706,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9707,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9708,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9709,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9710,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9711,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9712,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9713,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9714,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9715,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9716,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9717,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9718,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9719,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9720,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9721,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9722,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9723,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9724,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9725,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9726,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9727,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9728,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9729,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9730,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9731,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9732,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9733,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9734,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9735,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9736,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9737,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9738,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9739,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9740,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9741,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9742,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9743,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9744,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9745,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9746,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9747,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9748,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9749,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9750,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9751,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9752,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9753,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9754,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9755,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9756,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9757,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9758,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9759,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9760,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9761,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9762,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9763,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9764,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9765,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9766,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9767,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9768,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9769,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9770,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9771,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9772,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9773,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9774,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9775,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9776,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9777,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9778,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9779,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9780,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9781,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9782,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9783,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9784,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9785,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9786,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9787,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9788,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9789,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9790,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9791,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9792,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9793,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9794,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9795,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9796,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9797,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9798,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9799,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9800,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9801,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9802,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9803,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9804,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9805,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9806,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9807,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9808,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9809,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9810,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9811,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9812,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9813,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9814,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9815,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9816,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9817,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9818,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9819,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9820,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9821,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9822,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9823,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9824,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9825,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9826,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9827,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9828,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9829,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9830,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9831,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9832,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9833,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9834,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9835,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9836,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9837,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9838,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9839,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9840,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9841,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9842,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9843,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9844,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9845,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9846,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9847,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9848,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9849,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9850,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9851,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9852,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9853,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9854,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9855,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9856,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9857,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9858,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9859,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9860,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9861,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9862,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9863,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9864,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9865,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9866,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9867,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9868,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9869,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9870,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9871,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9872,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9873,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9874,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9875,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9876,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9877,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9878,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9879,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9880,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9881,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9882,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9883,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9884,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9885,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9886,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9887,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9888,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9889,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9890,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9891,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9892,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9893,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9894,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9895,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9896,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9897,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9898,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9899,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9900,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9901,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9902,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9903,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9904,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9905,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9906,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9907,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9908,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9909,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9910,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9911,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9912,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9913,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9914,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9915,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9916,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9917,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9918,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9919,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9920,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9921,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9922,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9923,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9924,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9925,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9926,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9927,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9928,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9929,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9930,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9931,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9932,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9933,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9934,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9935,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9936,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9937,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9938,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9939,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9940,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9941,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9942,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9943,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9944,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9945,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9946,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9947,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9948,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9949,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9950,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9951,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9952,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9953,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9954,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9955,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9956,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9957,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9958,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9959,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9960,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9961,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9962,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9963,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9964,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9965,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9966,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9967,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9968,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9969,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9970,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9971,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9972,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9973,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9974,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9975,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9976,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9977,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9978,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9979,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9980,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9981,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9982,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9983,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9984,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9985,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9986,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9987,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9988,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9989,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9990,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9991,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9992,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9993,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9994,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9995,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9996,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9997,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9998,

+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9999

+

+

diff --git a/util/org.eclipse.virgo.util.osgi/template.mf b/util/org.eclipse.virgo.util.osgi/template.mf
new file mode 100644
index 0000000..6e5a034
--- /dev/null
+++ b/util/org.eclipse.virgo.util.osgi/template.mf
@@ -0,0 +1,10 @@
+Bundle-ManifestVersion: 2
+Bundle-Name: OSGi Utility Code
+Bundle-SymbolicName: org.eclipse.virgo.util.osgi
+Bundle-Version: ${version}
+Import-Template: 
+ org.eclipse.virgo.util.*;version="${version:[=.=.=, =.=.+1)}",
+ org.osgi.*;version="0",
+ org.slf4j.*;version="${slf4jVersion:[=.=.0, +1.0.0)}"
+Excluded-Exports: 
+ org.eclipse.virgo.util.osgi.internal.*
diff --git a/util/org.eclipse.virgo.util.parser.launcher/.springBeans b/util/org.eclipse.virgo.util.parser.launcher/.springBeans
new file mode 100644
index 0000000..d079ca1
--- /dev/null
+++ b/util/org.eclipse.virgo.util.parser.launcher/.springBeans
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beansProjectDescription>
+	<version>1</version>
+	<pluginVersion><![CDATA[2.2.4.RELEASE]]></pluginVersion>
+	<configSuffixes>
+		<configSuffix><![CDATA[xml]]></configSuffix>
+	</configSuffixes>
+	<enableImports><![CDATA[false]]></enableImports>
+	<configs>
+	</configs>
+	<configSets>
+	</configSets>
+</beansProjectDescription>
diff --git a/util/org.eclipse.virgo.util.parser.launcher/src/main/java/org/eclipse/virgo/util/parser/launcher/ArgumentParser.java b/util/org.eclipse.virgo.util.parser.launcher/src/main/java/org/eclipse/virgo/util/parser/launcher/ArgumentParser.java
new file mode 100644
index 0000000..767efb9
--- /dev/null
+++ b/util/org.eclipse.virgo.util.parser.launcher/src/main/java/org/eclipse/virgo/util/parser/launcher/ArgumentParser.java
@@ -0,0 +1,208 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.parser.launcher;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Properties;
+
+/**
+ * Utility class for parsing command-line arguments for the OSGi launcher.
+ * <p/>
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Threadsafe.
+ * 
+ */
+public final class ArgumentParser {
+
+    private static final int MAXIMUM_BUNDLE_DECLARATION_COMPONENTS = 2;
+
+    private static final int MAX_PROPERTY_DECLARATION_COMPONENTS = 2;
+
+    private static final String MARKER_PROPERTY = "-F";
+
+    private static final String MARKER_BUNDLE = "-B";
+
+    private static final String MARKER_CONFIG = "-config";
+
+    private static final String PROPERTY_DELIMITER = "=";
+
+    private static final String BUNDLE_PATH_DELIMITER = "@";
+
+    private static final String START_FLAG = "start";
+    
+    protected static final String IVY_CACHE_RELATIVE = File.separator + "virgo-build-cache" + File.separator + "ivy-cache";
+
+    public LaunchCommand parse(String[] args) {
+        LaunchCommand command = new LaunchCommand();
+        for (int x = 0; x < args.length;) {
+            String arg = args[x];
+            if (arg.startsWith(MARKER_BUNDLE)) {
+                BundleEntry entry = parseBundleMarker(arg);
+                command.declareBundle(entry.getURI(), entry.isAutoStart());
+                x++;
+            } else if (arg.startsWith(MARKER_PROPERTY)) {
+                parseFrameworkProperty(arg, command);
+                x++;
+            } else if (MARKER_CONFIG.equals(arg.trim())) {
+                x++; // consume the -config arg
+                if (x == args.length) {
+                    throw new ParseException("Option -config supplied without path.");
+                }
+                String configPath = args[x];
+                parseConfigProperties(configPath, command);
+                x++;
+            } else {
+            	command.declareUnrecognizedArgument(arg);         
+            	x++;
+            }
+        }
+        return command;
+    }
+
+    /**
+     * Parses a comma-separated list of bundle entries in the form &lt;uri&gt;[@start].
+     * @param entryList comma-separated list of bundle entry declarations
+     * @return an array of bundle entries parsed from the list
+     * 
+     * @see #parseBundleEntry(String)
+     */
+    public BundleEntry[] parseBundleEntries(String entryList) {
+        String[] entries = entryList.split(",");
+        BundleEntry[] result = new BundleEntry[entries.length];
+        for (int x = 0; x < result.length; x++) {
+            result[x] = parseBundleEntry(entries[x]);
+        }
+        return result;
+    }
+
+    /**
+     * Parses bundle entry in the form &lt;uri&gt;[@start].
+     * @param decl string to parse
+     * @return bundle entry denoted by the string
+     */
+    public BundleEntry parseBundleEntry(String decl) {
+        String[] components = parseCommandComponents(decl, BUNDLE_PATH_DELIMITER, MAXIMUM_BUNDLE_DECLARATION_COMPONENTS);
+
+        String path = components[0];
+        path = processIvyCachePlaceholder(path);
+        URI uri = pathToURI(path);
+
+        boolean autoStart = false;
+        if (components.length == MAXIMUM_BUNDLE_DECLARATION_COMPONENTS) {
+            String bundleCommand = components[1];
+            if (START_FLAG.equals(bundleCommand)) {
+                autoStart = true;
+            } else {
+                throw new ParseException("Unrecognized bundle command '" + bundleCommand + "' in '" + decl + "'.");
+            }
+        }
+        return new BundleEntry(uri, autoStart);
+    }
+    
+    private String processIvyCachePlaceholder(String path) {
+        return path.replace("${ivy.cache}", System.getProperty("user.home") + IVY_CACHE_RELATIVE);
+    }
+
+    private void parseConfigProperties(String configPath, LaunchCommand command) {
+        File file = new File(configPath);
+        if (!file.exists()) {
+            throw new ParseException("Config path '" + file.getAbsolutePath() + "' does not exist.");
+        }
+        Properties props = new Properties();
+        InputStream stream = null;
+        try {
+            stream = new FileInputStream(file);
+            props.load(stream);
+        } catch (IOException e) {
+            throw new ParseException("Unable to read config properties file '" + file.getAbsolutePath() + "'.", e);
+        } finally {
+            if (stream != null) {
+                try {
+                    stream.close();
+                } catch (IOException ex) {
+                }
+            }
+        }
+        command.setConfigProperties(props);
+    }
+
+    /**
+     * Parses a framework property of the form <code>-F&lt;name&gt;=&lt;value&gt;</code>.
+     */
+    private void parseFrameworkProperty(String arg, LaunchCommand command) {
+        String decl = arg.substring(MARKER_PROPERTY.length());
+
+        String[] components = parseCommandComponents(decl, PROPERTY_DELIMITER, MAX_PROPERTY_DECLARATION_COMPONENTS);
+
+        String value = (components.length == MAX_PROPERTY_DECLARATION_COMPONENTS ? components[1] : "");
+
+        command.declareProperty(components[0], value);
+    }
+
+    /**
+     * Parses a bundle declaration of the form <code>-B&lt;path&gt;[@start]</code>
+     */
+    private BundleEntry parseBundleMarker(String arg) {
+        String decl = arg.substring(MARKER_BUNDLE.length());
+        return parseBundleEntry(decl);
+    }
+
+    private String[] parseCommandComponents(String decl, String delimiter, int maxComponents) {
+        String[] components = decl.split(delimiter);
+
+        if (components.length > maxComponents) {
+            throw new ParseException("Invalid declaration: '" + decl + "'. Too many occurrences of '" + delimiter + "'.");
+        }
+
+        return components;
+    }
+
+    private URI pathToURI(String path) {
+
+        URI uri = null;
+
+        // see if the path is a valid file first
+        File f = new File(path);
+        if (f.exists()) {
+            uri = f.getAbsoluteFile().toURI();
+        }
+
+        if (uri == null) {
+            // now try URI; it should contain only slashes
+        	path = replaceBackslashWithSlash(path);
+            try {
+                URI u = new URI(path);
+                if (u.isAbsolute()) {
+                    uri = u;
+                }
+            } catch (URISyntaxException e) {
+            }
+        }
+        
+        if(uri == null) {
+            throw new ParseException("Path '" + path +"' is not a valid URI or file path");
+        }
+        
+        return uri;
+    }
+    
+    private String replaceBackslashWithSlash(String path) {
+    	return path.replace('\\', '/');
+    }
+}
diff --git a/util/org.eclipse.virgo.util.parser.launcher/src/main/java/org/eclipse/virgo/util/parser/launcher/BundleEntry.java b/util/org.eclipse.virgo.util.parser.launcher/src/main/java/org/eclipse/virgo/util/parser/launcher/BundleEntry.java
new file mode 100644
index 0000000..ae54c1a
--- /dev/null
+++ b/util/org.eclipse.virgo.util.parser.launcher/src/main/java/org/eclipse/virgo/util/parser/launcher/BundleEntry.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.parser.launcher;
+
+import java.net.URI;
+
+/**
+ * Represents a declaration by the user to install a bundle into OSGi and to
+ * optionally start that bundle.
+ * <p/>
+ * Bundle declarations are typically represented as a string of the form:
+ * <code>&lt;path&gt;[&lt;@start&gt;]</code>. In this string, path is either a
+ * {@link URI} or a file path (relative or absolute). The <code>@start</code> flag
+ * indicates that the bundle should be started by the launcher. Bundles are not started
+ * automatically unless specified.
+ */
+public final class BundleEntry {
+
+	private final URI uri;
+
+	private final boolean autoStart;
+
+	public BundleEntry(URI uri, boolean autoStart) {
+		this.uri = uri;
+		this.autoStart = autoStart;
+	}
+
+	public URI getURI() {
+		return this.uri;
+	}
+
+	public boolean isAutoStart() {
+		return this.autoStart;
+	}
+
+}
diff --git a/util/org.eclipse.virgo.util.parser.launcher/src/main/java/org/eclipse/virgo/util/parser/launcher/LaunchCommand.java b/util/org.eclipse.virgo.util.parser.launcher/src/main/java/org/eclipse/virgo/util/parser/launcher/LaunchCommand.java
new file mode 100644
index 0000000..7798fd2
--- /dev/null
+++ b/util/org.eclipse.virgo.util.parser.launcher/src/main/java/org/eclipse/virgo/util/parser/launcher/LaunchCommand.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.parser.launcher;
+
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+/**
+ * Simple value object encapsulating the command line arguments passed by the user.
+ * <p />
+ * 
+ * <strong>Concurrent Semantics</strong><br />
+ * 
+ * Not threadsafe.
+ */
+public final class LaunchCommand {
+
+    private final List<BundleEntry> bundleEntries = new ArrayList<BundleEntry>();
+
+    private final Map<String, String> declaredProperties = new HashMap<String, String>();
+
+    private Properties configProperties;
+    
+    private final List<String> unrecognizedArguments = new ArrayList<String>();
+
+    public BundleEntry[] getBundleEntries() {
+        return this.bundleEntries.toArray(new BundleEntry[this.bundleEntries.size()]);
+    }
+
+    public Map<String, String> getDeclaredProperties() {
+        return new HashMap<String, String>(this.declaredProperties);
+    }
+
+    public Properties getConfigProperties() {
+        return configProperties;
+    }
+
+    public List<String> getUnrecognizedArguments() {
+    	return new ArrayList<String>(this.unrecognizedArguments);
+    }
+    
+    void declareBundle(URI uri, boolean autoStart) {
+    	this.bundleEntries.add(new BundleEntry(uri, autoStart));
+    }
+    
+    void declareProperty(String key, String value) {
+    	this.declaredProperties.put(key, value);
+    }
+    
+    void setConfigProperties(Properties configPath) {
+        this.configProperties = configPath;
+    }
+    
+    void declareUnrecognizedArgument(String additionalArgument) {
+    	this.unrecognizedArguments.add(additionalArgument);
+    }    
+}
diff --git a/util/org.eclipse.virgo.util.parser.launcher/src/main/java/org/eclipse/virgo/util/parser/launcher/ParseException.java b/util/org.eclipse.virgo.util.parser.launcher/src/main/java/org/eclipse/virgo/util/parser/launcher/ParseException.java
new file mode 100644
index 0000000..748b628
--- /dev/null
+++ b/util/org.eclipse.virgo.util.parser.launcher/src/main/java/org/eclipse/virgo/util/parser/launcher/ParseException.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.parser.launcher;
+
+
+public class ParseException extends RuntimeException {
+
+    private static final long serialVersionUID = -7356047425917168452L;
+
+    public ParseException() {
+    }
+
+    public ParseException(String message) {
+        super(message);
+    }
+
+    public ParseException(Throwable cause) {
+        super(cause);
+    }
+
+    public ParseException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+}
diff --git a/util/org.eclipse.virgo.util.parser.launcher/src/main/resources/.gitignore b/util/org.eclipse.virgo.util.parser.launcher/src/main/resources/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/util/org.eclipse.virgo.util.parser.launcher/src/main/resources/.gitignore
diff --git a/util/org.eclipse.virgo.util.parser.launcher/src/main/resources/about.html b/util/org.eclipse.virgo.util.parser.launcher/src/main/resources/about.html
new file mode 100644
index 0000000..c258ef5
--- /dev/null
+++ b/util/org.eclipse.virgo.util.parser.launcher/src/main/resources/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>June 5, 2006</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/util/org.eclipse.virgo.util.parser.launcher/src/test/java/org/eclipse/virgo/util/parser/launcher/ArgumentParserTests.java b/util/org.eclipse.virgo.util.parser.launcher/src/test/java/org/eclipse/virgo/util/parser/launcher/ArgumentParserTests.java
new file mode 100644
index 0000000..2f58221
--- /dev/null
+++ b/util/org.eclipse.virgo.util.parser.launcher/src/test/java/org/eclipse/virgo/util/parser/launcher/ArgumentParserTests.java
@@ -0,0 +1,219 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.parser.launcher;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.List;
+import java.util.Properties;
+
+import org.eclipse.virgo.util.parser.launcher.ArgumentParser;
+import org.eclipse.virgo.util.parser.launcher.BundleEntry;
+import org.eclipse.virgo.util.parser.launcher.LaunchCommand;
+import org.eclipse.virgo.util.parser.launcher.ParseException;
+import org.junit.Ignore;
+import org.junit.Test;
+
+/**
+ * 
+ */
+public class ArgumentParserTests {
+
+    private ArgumentParser parser = new ArgumentParser();
+
+    @Test
+    public void testParseRelativeFileBundleEntry() {
+        String commandLine = "-Bsrc/test/resources/test-bundle@start";
+        LaunchCommand command = parse(commandLine);
+
+        BundleEntry[] bundleDeclarations = command.getBundleEntries();
+        assertNotNull(bundleDeclarations);
+        assertEquals(1, bundleDeclarations.length);
+
+        BundleEntry bd = bundleDeclarations[0];
+        assertTrue(bd.isAutoStart());
+        assertEquals(new File("src/test/resources/test-bundle").toURI(), bd.getURI());
+    }
+    
+    @Test
+    public void testParseRelativeFileBundleEntryNotStarting() {
+        String commandLine = "-Bsrc/test/resources/test-bundle";
+        LaunchCommand command = parse(commandLine);
+
+        BundleEntry[] bundleDeclarations = command.getBundleEntries();
+        assertNotNull(bundleDeclarations);
+        assertEquals(1, bundleDeclarations.length);
+
+        BundleEntry bd = bundleDeclarations[0];
+        assertFalse(bd.isAutoStart());
+        assertEquals(new File("src/test/resources/test-bundle").toURI(), bd.getURI());
+    }
+    
+    @Test
+    @Ignore("[Bug 463462] - As a developer I'd like to be able to build the Virgo artifacts with Gradle")
+    public void testIvyCachePlaceholderSubstitution() {
+        String commandLine = "-B${ivy.cache}/repository/org.junit/com.springsource.org.junit/4.7.0/com.springsource.org.junit-4.7.0.jar";
+        LaunchCommand command = parse(commandLine);
+        
+        BundleEntry[] bundleDeclarations = command.getBundleEntries();
+        assertNotNull(bundleDeclarations);
+        assertEquals(1, bundleDeclarations.length);
+        
+        BundleEntry bd = bundleDeclarations[0];
+        assertFalse(bd.isAutoStart());
+        assertEquals(new File(System.getProperty("user.home") + "/virgo-build-cache/ivy-cache" + "/repository/org.junit/com.springsource.org.junit/4.7.0/com.springsource.org.junit-4.7.0.jar").toURI(), bd.getURI());
+    }
+    
+    @Test(expected=ParseException.class)
+    public void testParseRelativeFileBundleEntryNotExists() {
+        String commandLine = "-B/src/test/resources/test-bundleoeuoeu@start";
+        parse(commandLine);
+    }
+    
+
+    @Test
+    public void testParseAbsoluteFileBundleEntry() {
+        File f = new File("src/test/resources/test-bundle");
+
+        String commandLine = "-B" + f.getAbsolutePath() + "@start";
+        LaunchCommand command = parse(commandLine);
+
+        BundleEntry[] bundleDeclarations = command.getBundleEntries();
+        assertNotNull(bundleDeclarations);
+        assertEquals(1, bundleDeclarations.length);
+
+        BundleEntry bd = bundleDeclarations[0];
+        assertTrue(bd.isAutoStart());
+        assertEquals(new File("src/test/resources/test-bundle").toURI(), bd.getURI());
+    }
+
+    @Test
+    public void testParseFileURIDeclaration() {
+        File f = new File("src/test/resources/test-bundle");
+
+        String commandLine = "-B" + f.getAbsoluteFile().toURI() + "@start";
+        LaunchCommand command = parse(commandLine);
+
+        BundleEntry[] bundleDeclarations = command.getBundleEntries();
+        assertNotNull(bundleDeclarations);
+        assertEquals(1, bundleDeclarations.length);
+
+        BundleEntry bd = bundleDeclarations[0];
+        assertTrue(bd.isAutoStart());
+        assertEquals(new File("src/test/resources/test-bundle").getAbsoluteFile(), new File(bd.getURI()));
+    }
+    
+    @Test
+    public void testParseHttpDeclaration() throws URISyntaxException {
+        URI uri = new URI("http://www.springsource.org/");
+        
+        String commandLine = "-B" + uri + "@start";
+        LaunchCommand command = parse(commandLine);
+
+        BundleEntry[] bundleDeclarations = command.getBundleEntries();
+        assertNotNull(bundleDeclarations);
+        assertEquals(1, bundleDeclarations.length);
+
+        BundleEntry bd = bundleDeclarations[0];
+        assertTrue(bd.isAutoStart());
+        assertEquals(uri, bd.getURI());
+    }
+
+    @Test(expected = ParseException.class)
+    public void testTooManyBundleDelimiters() {
+        String commandLine = "-Bsrc/test/resources/test-bundle@start@stop";
+        parse(commandLine);
+    }
+
+    @Test(expected = ParseException.class)
+    public void testIncorrectBundleCommand() {
+        String commandLine = "-Bsrc/test/resources/test-bundle@stop";
+        parse(commandLine);
+    }
+    
+    @Test(expected=ParseException.class)
+    public void testPropertyWithExtraEquals() {
+        String commandLine = "-Fprop=val=extra";
+        parse(commandLine);
+    }
+    
+    @Test
+    public void testDeclaredProperty() {
+        String commandLine = "-Fprop=val";
+        LaunchCommand command = parse(commandLine);
+        
+        assertEquals("val", command.getDeclaredProperties().get("prop"));
+    }
+
+    @Test
+    public void testPropertyWithNoEquals() {
+        String commandLine = "-Fprop";
+        LaunchCommand command = parse(commandLine);
+        assertEquals("", command.getDeclaredProperties().get("prop"));
+    }
+    
+    @Test
+    public void testParseConfigFile() {
+        String commandLine = "-config src/test/resources/config.properties";
+        LaunchCommand command = parse(commandLine);
+        
+        Properties configProperties = command.getConfigProperties();
+        
+        assertNotNull(configProperties);
+        assertEquals("bar", configProperties.getProperty("foo"));
+    }
+    
+    @Test(expected=ParseException.class)
+    public void testParseConfigFileInvalidFile() {
+        String commandLine = "-config src/test/resources/.properties";
+        parse(commandLine);
+    }
+    
+    @Test(expected=ParseException.class)
+    public void testParseEmptyConfig() {
+        String commandLine = "-config";
+        parse(commandLine);
+    }
+    
+    @Test
+    public void testParseBundles() {
+    	String bundles = "src/test/resources/test-bundle,http://test@start";
+    	BundleEntry[] entries = this.parser.parseBundleEntries(bundles);
+    	
+    	assertNotNull(entries);
+    	assertEquals(2, entries.length);
+    }
+    
+    @Test
+    public void testUnrecognizedArguments() {
+    	String commandLine = "-Bfile:foo.jar -Fa=b -Cbar:foo=baz -plan web";
+    	LaunchCommand command = parse(commandLine);
+    	
+    	List<String> unrecognizedArgs = command.getUnrecognizedArguments();
+    	
+    	assertEquals(3, unrecognizedArgs.size());
+    	assertEquals("-Cbar:foo=baz", unrecognizedArgs.get(0));
+    	assertEquals("-plan", unrecognizedArgs.get(1));
+    	assertEquals("web", unrecognizedArgs.get(2));
+    }
+    
+    private LaunchCommand parse(String commandLine) {
+        String[] args = commandLine.split(" ");
+        return this.parser.parse(args);
+    }
+}
diff --git a/util/org.eclipse.virgo.util.parser.launcher/src/test/resources/config.properties b/util/org.eclipse.virgo.util.parser.launcher/src/test/resources/config.properties
new file mode 100644
index 0000000..c9f0304
--- /dev/null
+++ b/util/org.eclipse.virgo.util.parser.launcher/src/test/resources/config.properties
@@ -0,0 +1 @@
+foo=bar
\ No newline at end of file
diff --git a/util/org.eclipse.virgo.util.parser.launcher/src/test/resources/test-bundle/META-INF/MANIFEST.MF b/util/org.eclipse.virgo.util.parser.launcher/src/test/resources/test-bundle/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..49b0fa5
--- /dev/null
+++ b/util/org.eclipse.virgo.util.parser.launcher/src/test/resources/test-bundle/META-INF/MANIFEST.MF
@@ -0,0 +1,4 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: test.bundle
+Bundle-Vendor: SpringSource Inc.
diff --git a/util/org.eclipse.virgo.util.parser.launcher/template.mf b/util/org.eclipse.virgo.util.parser.launcher/template.mf
new file mode 100644
index 0000000..78fd937
--- /dev/null
+++ b/util/org.eclipse.virgo.util.parser.launcher/template.mf
@@ -0,0 +1,4 @@
+Bundle-ManifestVersion: 2
+Bundle-Name: Virgo Launcher Parser
+Bundle-SymbolicName: org.eclipse.virgo.util.parser.launcher
+Bundle-Version: ${version}
diff --git a/util/org.eclipse.virgo.util.parser.manifest/.springBeans b/util/org.eclipse.virgo.util.parser.manifest/.springBeans
new file mode 100644
index 0000000..d079ca1
--- /dev/null
+++ b/util/org.eclipse.virgo.util.parser.manifest/.springBeans
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beansProjectDescription>
+	<version>1</version>
+	<pluginVersion><![CDATA[2.2.4.RELEASE]]></pluginVersion>
+	<configSuffixes>
+		<configSuffix><![CDATA[xml]]></configSuffix>
+	</configSuffixes>
+	<enableImports><![CDATA[false]]></enableImports>
+	<configs>
+	</configs>
+	<configSets>
+	</configSets>
+</beansProjectDescription>
diff --git a/util/org.eclipse.virgo.util.parser.manifest/src/main/java/org/eclipse/virgo/util/parser/manifest/ManifestContents.java b/util/org.eclipse.virgo.util.parser.manifest/src/main/java/org/eclipse/virgo/util/parser/manifest/ManifestContents.java
new file mode 100644
index 0000000..540803a
--- /dev/null
+++ b/util/org.eclipse.virgo.util.parser.manifest/src/main/java/org/eclipse/virgo/util/parser/manifest/ManifestContents.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.parser.manifest;
+
+
+
+import java.util.List;
+
+import java.util.Map;
+
+
+
+/**
+
+ * <p>
+
+ * Encapsulates the section and header name/value information parsed from a
+
+ * manifest.
+
+ * 
+
+ * <strong>Concurrent Semantics</strong><br/>
+
+ * 
+
+ * This class is thread safe.
+
+ * 
+
+
+ */
+
+public interface ManifestContents {
+
+
+
+	/**
+
+	 * @return the version number discovered in the manifest
+
+	 */
+
+	String getVersion();
+
+
+
+	/**
+
+	 * @return the main attributes discovered in the manifest
+
+	 */
+
+	Map<String, String> getMainAttributes();
+
+
+
+	/**
+
+	 * @return the section names discovered in the manifest
+
+	 */
+
+	List<String> getSectionNames();
+
+
+
+	/**
+
+	 * @param sectionName 
+	 * @return the attributes discovered for a particular section in the manifest
+
+	 */
+
+	Map<String, String> getAttributesForSection(String sectionName);
+
+
+
+}
+
diff --git a/util/org.eclipse.virgo.util.parser.manifest/src/main/java/org/eclipse/virgo/util/parser/manifest/ManifestParser.java b/util/org.eclipse.virgo.util.parser.manifest/src/main/java/org/eclipse/virgo/util/parser/manifest/ManifestParser.java
new file mode 100644
index 0000000..068e00c
--- /dev/null
+++ b/util/org.eclipse.virgo.util.parser.manifest/src/main/java/org/eclipse/virgo/util/parser/manifest/ManifestParser.java
@@ -0,0 +1,104 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.parser.manifest;
+
+
+
+import java.io.IOException;
+
+import java.io.Reader;
+
+import java.util.List;
+
+
+
+/**
+
+ * <p>
+
+ * Strategy for parsing manifests. The only format enforced is that defined for
+
+ * regular JDK manifests.
+
+ * </p>
+
+ * 
+
+ * <strong>Concurrent Semantics</strong><br />
+
+ * 
+
+ * This class is thread safe.
+
+ * 
+
+
+ */
+
+public interface ManifestParser {
+
+
+
+	/**
+
+	 * Parse an input string of data as a manifest.
+	 * @param manifestData 
+	 * @return manifest contents
+
+	 */
+
+	ManifestContents parse(String manifestData);
+
+
+
+	/**
+
+	 * Parse a manifest from the supplied reader.
+	 * @param manifestReader 
+	 * @return ManifestContents
+
+	 * 
+
+	 * @throws IOException if there is a problem with the Reader
+
+	 */
+
+	ManifestContents parse(Reader manifestReader) throws IOException;
+
+
+
+	/**
+
+	 * @return true if problems were found during parsing
+
+	 */
+
+	boolean foundProblems();
+
+
+
+	/**
+
+	 * @return the list of problems that occurred during parsing
+
+	 */
+
+	List<ManifestProblem> getProblems();
+
+
+
+	void setTerminateAfterMainSection(boolean shouldTerminate);
+
+
+
+}
+
diff --git a/util/org.eclipse.virgo.util.parser.manifest/src/main/java/org/eclipse/virgo/util/parser/manifest/ManifestProblem.java b/util/org.eclipse.virgo.util.parser.manifest/src/main/java/org/eclipse/virgo/util/parser/manifest/ManifestProblem.java
new file mode 100644
index 0000000..703106c
--- /dev/null
+++ b/util/org.eclipse.virgo.util.parser.manifest/src/main/java/org/eclipse/virgo/util/parser/manifest/ManifestProblem.java
@@ -0,0 +1,216 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.parser.manifest;
+
+
+
+import org.eclipse.virgo.util.parser.manifest.internal.SourceContext;
+
+
+
+/**
+
+ * <p>
+
+ * Encapsulates a problem discovered during manifest parsing.
+
+ * 
+
+ * <strong>Concurrent Semantics</strong><br />
+
+ * 
+
+ * This class is thread safe.
+
+ * 
+
+
+ */
+
+public class ManifestProblem {
+
+
+
+	private ManifestProblemKind problemKind;
+
+	private SourceContext context;
+
+	private int startoffset;
+
+	private int endoffset;
+
+	private String[] inserts;
+
+
+
+	public ManifestProblem(ManifestProblemKind problem, SourceContext context, int startoffset, int endoffset, String... inserts) {
+
+		this.problemKind = problem;
+
+		this.context = context;
+
+		this.startoffset = startoffset;
+
+		this.endoffset = endoffset;
+
+		this.inserts = inserts;
+
+	}
+
+
+
+	@Override
+
+	public String toString() {
+
+		return problemKind.format(context.getLine(startoffset), context.getColumn(startoffset), inserts);
+
+	}
+
+
+
+	/**
+
+	 * Returns a multi line message that includes the manifest extract that gave
+
+	 * rise to the problem.
+
+	 * 
+
+	 * @return a multi line string
+
+	 */
+
+	public String toStringWithContext() {
+
+		int relevantLine = context.getLine(startoffset);
+
+		String relevantLineData = context.getLineAsString(relevantLine);
+
+		String theMessage = problemKind.format(context.getLine(startoffset), context.getColumn(startoffset), inserts);
+
+		StringBuilder beautifulMessage = new StringBuilder();
+
+		beautifulMessage.append(relevantLineData);
+
+		int scol = context.getColumn(startoffset);
+
+		int ecol = context.getColumn(endoffset);
+
+		int where = 0;
+
+		for (where = 0; where < scol; where++) {
+
+			beautifulMessage.append(' ');
+
+		}
+
+		beautifulMessage.append('^');
+
+		if (ecol != scol) {
+
+			where++;
+
+			for (; where < ecol; where++) {
+
+				beautifulMessage.append(' ');
+
+			}
+
+			beautifulMessage.append('^');
+
+		}
+
+		beautifulMessage.append('\n');
+
+		beautifulMessage.append(theMessage);
+
+		return beautifulMessage.toString();
+
+	}
+
+
+
+	public ManifestProblemKind getKind() {
+
+		return problemKind;
+
+	}
+
+
+
+	public int getInsertCount() {
+
+		return inserts.length;
+
+	}
+
+
+
+	public String getInsert(int insertIndex) {
+
+		return inserts[insertIndex];
+
+	}
+
+
+
+	public int getStartLine() {
+
+		return context.getLine(startoffset);
+
+	}
+
+
+
+	public int getEndLine() {
+
+		return context.getLine(endoffset);
+
+	}
+
+
+
+	public int getStartColumn() {
+
+		return context.getColumn(startoffset);
+
+	}
+
+
+
+	public int getEndColumn() {
+
+		return context.getColumn(endoffset);
+
+	}
+
+
+
+	public int getStartOffset() {
+
+		return startoffset;
+
+	}
+
+
+
+	public int getEndOffset() {
+
+		return endoffset;
+
+	}
+
+
+
+}
+
diff --git a/util/org.eclipse.virgo.util.parser.manifest/src/main/java/org/eclipse/virgo/util/parser/manifest/ManifestProblemKind.java b/util/org.eclipse.virgo.util.parser.manifest/src/main/java/org/eclipse/virgo/util/parser/manifest/ManifestProblemKind.java
new file mode 100644
index 0000000..7c055a0
--- /dev/null
+++ b/util/org.eclipse.virgo.util.parser.manifest/src/main/java/org/eclipse/virgo/util/parser/manifest/ManifestProblemKind.java
@@ -0,0 +1,125 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.parser.manifest;
+
+
+
+import java.text.MessageFormat;
+
+
+
+/** 
+
+ * <p>
+
+ * Enumeration of all the kinds of problem that can occur whilst parsing a manifest.
+
+ * </p>
+
+ *
+
+ * <strong>Concurrent Semantics</strong><br />
+
+ *
+
+ * This class is thread safe.
+
+ *
+
+
+ */
+
+public enum ManifestProblemKind {
+
+	NAME_MUST_START_WITH_ALPHANUMERIC("MP001",
+
+			"Header names in the manifest must begin at the start of the line with an alphanumeric character.  Found a ''{0}''"), //
+
+	NAME_ENDED_PREMATURELY_WITH_NEWLINE("MP002",
+
+			"Header name ended prematurely when a newline was encountered.  Expected form is '[Name]: [Value]'"), //
+
+	VALUE_MUST_IMMEDIATELY_FOLLOW_NAME("MP003",
+
+			"The value must immediately follow the '[Name]:' either on the same line or the next line."), //
+
+	MISSING_VALUE("MP004", "The value appears to be missing for the header name ''{0}''"), //
+
+	ILLEGAL_NAME_CHAR("MP005", "Header names cannot contain the character ''{0}''"), //
+
+	VALUE_MUST_START_WITH_SPACE("MP006", "Values must start with a space, either following the ':' or on the next line"), //
+
+//	UNEXPECTED_BLANK_LINES_AT_START_OF_MANIFEST("MP007", "Manifest cannot start with blank lines"), //
+
+	UNEXPECTED_NAME("MP008", "Expected the name ''{0}'' but found the name ''{1}''"), //
+
+	UNEXPECTED_TOKEN_KIND("MP009", "Expected a ''{0}'' but found a ''{1}''"), //
+
+	EXPECTED_NEWLINE("MP010", "Expected a new line but found a ''{0}''"), //
+
+	UNEXPECTED_NEWLINE_DURING_VALUE_PARSING("MP011", "Unexpectedly found a newline in the middle of a value"), //
+
+	MISSING_SPACE_FOR_CONTINUATION("MP012",
+
+			"Illegal character found where expecting new Name or value continuation - assuming missing space"), //
+
+	EXPECTED_COLON("MP013", "Expected a ':' but found a ''{0}'' ''{1}''"), //
+
+	UNEXPECTED_EOM("MP014", "Unexpectedly reached end of the manifest when expecting {0}"), //
+
+	MISSING_NAME_HEADER("MP015", "Expected the header 'Name:' at the start of the section but found ''{0}''"), // 
+
+	NAME_ENDED_WITH_SPACE_RATHER_THAN_COLON("MP016", "Name ended with a space instead of a colon"), //
+
+	NAME_TOO_LONG("MP017", "Name is too long, max 65535 chars allowed"), //
+
+	VALUE_TOO_LONG("MP018", "Value is too long, max 65535 chars allowed");
+
+
+
+	private String code;
+
+	private String message;
+
+
+
+	private ManifestProblemKind(String i, String string) {
+
+		this.code = i;
+
+		this.message = string;
+
+	}
+
+
+
+	public String format(int line, int scol, String... inserts) {
+
+		StringBuilder str = new StringBuilder();
+
+		str.append(code).append(":");
+
+		if (line != 0) {
+
+			str.append(MessageFormat.format("[line {0}, col {1}]: ", line, scol));
+
+		}
+
+		str.append(MessageFormat.format(message, (Object[])inserts));
+
+		return str.toString();
+
+	}
+
+
+
+}
diff --git a/util/org.eclipse.virgo.util.parser.manifest/src/main/java/org/eclipse/virgo/util/parser/manifest/RecoveringManifestParser.java b/util/org.eclipse.virgo.util.parser.manifest/src/main/java/org/eclipse/virgo/util/parser/manifest/RecoveringManifestParser.java
new file mode 100644
index 0000000..75882ee
--- /dev/null
+++ b/util/org.eclipse.virgo.util.parser.manifest/src/main/java/org/eclipse/virgo/util/parser/manifest/RecoveringManifestParser.java
@@ -0,0 +1,603 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.parser.manifest;
+
+
+
+import java.io.IOException;
+
+import java.io.Reader;
+
+import java.util.List;
+
+import org.eclipse.virgo.util.parser.manifest.internal.ManifestVisitor;
+import org.eclipse.virgo.util.parser.manifest.internal.RecoveringManifestLexer;
+import org.eclipse.virgo.util.parser.manifest.internal.StandardVisitor;
+import org.eclipse.virgo.util.parser.manifest.internal.Token;
+import org.eclipse.virgo.util.parser.manifest.internal.TokenKind;
+import org.eclipse.virgo.util.parser.manifest.internal.TokenStream;
+
+
+
+
+
+// Allow for the tokenizer also having trouble on bad data, so collect errors across the two
+
+// things parser and tokenizer.
+
+
+
+// manifest-file:    main-section newline *individual-section
+
+// main-section:     version-info newline *main-attribute
+
+// version-info:     Manifest-Version : version-number
+
+// version-number:   digit+{.digit+}*
+
+// main-attribute:   (any legitimate main attribute) newline
+
+// individual-section: Name : value newline *perentry-attribute
+
+// perentry-attribute: (any legitimate perentry attribute) newline
+
+// newline : CR LF | LF | CR (not followed by LF)
+
+// digit: {0-9}
+
+
+
+/**
+
+ * Builds upon the ManifestLexer that breaks a bunch of text data into a series
+
+ * of tokens
+
+ * <p>
+
+ * <strong>Concurrent Semantics</strong><br/>
+
+ * 
+
+ * This class is thread safe.
+
+ * 
+
+
+ */
+
+public class RecoveringManifestParser implements ManifestParser {
+
+
+
+	// Well known headers:
+
+	// private static final char[] MANIFEST_VERSION_HEADER =
+
+	// "Manifest-Version".toCharArray();
+
+	private static final String NAME_HEADER = "Name";
+
+
+
+	ManifestVisitor visitor;
+
+	TokenStream tokenStream;
+
+
+
+	public RecoveringManifestParser() {
+
+		this.visitor = new StandardVisitor();
+
+	}
+
+
+
+	public RecoveringManifestParser(ManifestVisitor visitor) {
+
+		this.visitor = visitor;
+
+	}
+
+
+
+	public ManifestContents parse(String manifestString) {
+
+		tokenStream = RecoveringManifestLexer.tokenize(manifestString);
+
+		return parseManifest();
+
+	}
+
+
+
+	public ManifestContents parse(Reader reader) throws IOException {
+
+		tokenStream = RecoveringManifestLexer.tokenize(reader);
+
+		return parseManifest();
+
+	}
+
+
+
+	ManifestContents parseManifest() {
+
+		checkForRogueNewlinesProceedingInput();
+
+		boolean cont = eatSection(true); // cont indicates whether the visitor
+
+		// decided to stop processing early
+
+		while (tokenStream.hasMore() && cont) {
+
+			cont = eatSection(false);
+
+		}
+
+		if (cont) {
+
+			confirmEnd();
+
+		}
+
+		return visitor.getManifestContents();
+
+	}
+
+
+
+	public ManifestContents getManifestContents() {
+
+		return visitor.getManifestContents();
+
+	}
+
+
+
+	private void confirmEnd() {
+
+	}
+
+
+
+	private void checkForRogueNewlinesProceedingInput() {
+
+		// boolean rogueNewlines = false;
+
+		while (maybeEatNewline()) {
+
+			// rogueNewlines = true;
+
+		}
+
+//		if (rogueNewlines) {
+
+//			recordProblem(ManifestProblemKind.UNEXPECTED_BLANK_LINES_AT_START_OF_MANIFEST, 0, tokenStream.peek().getStartOffset());
+
+//		}
+
+	}
+
+
+
+	public void eatNewline() {
+
+		assert tokenStream.hasMore();
+
+		Token t = tokenStream.next();
+
+		assert t.getKind() == TokenKind.NEWLINE;
+
+		// if (tokenStream.hasMore()) {
+
+		// Token t = tokenStream.peek();
+
+		// if (TokenKind.isNewline(t)) {
+
+		// tokenStream.next();
+
+		// return;
+
+		// } else {
+
+		// recordProblem(ManifestProblemKind.EXPECTED_NEWLINE,
+
+		// t.getStartOffset(), t.getEndOffset(), new String(t.value()));
+
+		// }
+
+		// } else {
+
+		// recordProblem(ManifestProblemKind.UNEXPECTED_EOM,
+
+		// tokenStream.peekLast().getStartOffset(), tokenStream.peekLast()
+
+		// .getEndOffset(), "newline");
+
+		// }
+
+	}
+
+
+
+	/**
+
+	 * Eat a section from the input data. The boolean indicates if it is
+
+	 * expected to be the main section. The main section starts with the version
+
+	 * and then some number of attributes, whilst the other sections should
+
+	 * start with a name and then attributes.
+
+	 * 
+
+	 * @param isMain is this expected to be the main section?
+	 * @return continue?
+
+	 */
+
+	public boolean eatSection(boolean isMain) {
+
+		boolean cont = true;
+
+		if (isMain) {
+
+			// cont =
+
+			visitor.visitSection(true, null);
+
+			// Cannot terminate visit to main section
+
+			// if (!cont) {
+
+			// return false;
+
+			// }
+
+			//eatVersionInfo();
+
+		} else {
+
+			// Skip any extra newlines between sections
+
+			while (maybeEatNewline()) {
+
+			}
+
+			if (tokenStream.hasMore()) {
+
+				cont = eatNameAttribute();
+
+			}
+
+		}
+
+		// Once a Newline is eaten we have finished the section
+
+		while (!maybeEatNewline() && tokenStream.hasMore() && cont) {
+
+			eatAttribute(isMain);
+
+		}
+
+		return cont;
+
+	}
+
+
+
+	public void eatVersionInfo() {
+
+		if (maybeEatHeaderName("Manifest-Version")) {
+
+			eatColon();
+
+			eatVersionNumber();
+
+			eatNewline();
+
+		} else {
+
+			// The problem will have been reported - jump out of here which will
+
+			// treat this (whatever it is...) as a regular header
+
+		}
+
+	}
+
+
+
+	/**
+
+	 * Consume a specific Name token from the token stream, report an error if
+
+	 * it is the wrong kind or the wrong name.
+
+	 * 
+
+	 * @param expectedName
+
+	 * @return
+
+	 */
+
+	private boolean maybeEatHeaderName(String expectedName) {
+
+		Token t = tokenStream.peek();
+
+		if (TokenKind.isName(t)) {
+
+			if (t.value().equals(expectedName)) {
+
+				tokenStream.next();
+
+				return true;
+
+			} else {
+
+				recordProblem(ManifestProblemKind.UNEXPECTED_NAME, t.getStartOffset(), t.getEndOffset(), expectedName, t.value());
+
+				return false;
+
+			}
+
+		} else {
+
+			recordProblem(ManifestProblemKind.UNEXPECTED_TOKEN_KIND, t.getStartOffset(), t.getEndOffset(), "Name", t.getKind()
+
+					.getTokenString());
+
+			return false;
+
+		}
+
+	}
+
+
+
+	public void eatColon() {
+
+		Token t = tokenStream.next();
+
+		assert t.getKind() == TokenKind.COLON;
+
+	}
+
+
+
+	// ATTRIBUTE := NAME_TOKEN COLON_TOKEN VALUE_TOKEN NEWLINE
+
+	public void eatAttribute(boolean isMain) {
+
+		Token nameToken = tokenStream.next();
+
+		// Token colonToken =
+
+		tokenStream.next();
+
+		Token valueToken = tokenStream.next();
+
+		// Token newlineToken =
+
+		tokenStream.next();
+
+		// This gives the visitor a chance to decide what it wants to do about
+
+		// the value
+
+		visitor.visitHeader(nameToken.value(), valueToken.value());
+
+	}
+
+
+
+	public void eatVersionNumber() {
+
+		Token tok = tokenStream.next();
+
+		assert tok.getKind() == TokenKind.VALUE;
+
+		visitor.visitManifestVersion(tok.value());
+
+	}
+
+
+
+	// ---
+
+
+
+	/**
+
+	 * @return true if able to consume a Newline token from the tokenstream
+
+	 */
+
+	private boolean maybeEatNewline() {
+
+		if (tokenStream.hasMore()) {
+
+			Token t = tokenStream.peek();
+
+			if (TokenKind.isNewline(t)) {
+
+				tokenStream.next();
+
+				return true;
+
+			} else {
+
+				return false;
+
+			}
+
+		} else {
+
+			return false;
+
+		}
+
+	}
+
+
+
+	/**
+
+	 * Expects to eat "Name" ":" "<value>"
+	 * @return continue?
+
+	 */
+
+	public boolean eatNameAttribute() {
+
+		boolean cont;
+
+		if (maybeEatHeaderName("Name")) {
+
+			eatColon();
+
+			Token valueToken = tokenStream.next();
+
+			tokenStream.next(); // newline
+
+			cont = visitor.visitSection(false, valueToken.value());
+
+			if (!cont) {
+
+				return false;
+
+			}
+
+			visitor.visitHeader(NAME_HEADER, valueToken.value());
+
+		} else {
+
+			Token token = tokenStream.peek();
+
+			// ERROR: they didn't supply a Name. Report an error and treat this
+
+			// as a regular attribute
+
+			cont = visitor.visitSection(false, null); // still the start of a
+
+			// section, just has no
+
+			// name
+
+			recordProblem(ManifestProblemKind.MISSING_NAME_HEADER, token.getStartOffset(), token.getEndOffset(), token.value());
+
+		}
+
+		return cont;
+
+	}
+
+
+
+	/**
+
+	 * @return true if problems were found during parsing
+
+	 */
+
+	public boolean foundProblems() {
+
+		return tokenStream.containsProblems();
+
+	}
+
+
+
+	/**
+
+	 * @return the list of problems that occurred during parsing
+
+	 */
+
+	public List<ManifestProblem> getProblems() {
+
+		return tokenStream.getProblems();
+
+	}
+
+
+
+	/**
+
+	 * Record a problem with parsing.
+
+	 * 
+
+	 * @param parseProblem the kind of problem that occurred
+
+	 * @param startOffset the start offset of the problem
+
+	 * @param endOffset the end offset of the problem
+
+	 * @param inserts the inserts for the problem message text
+
+	 */
+
+	private void recordProblem(ManifestProblemKind parseProblem, int startOffset, int endOffset, String... inserts) {
+
+		tokenStream
+
+				.recordProblem(new ManifestProblem(parseProblem, tokenStream.getSourceContext(), startOffset, endOffset, inserts));
+
+	}
+
+
+
+	// public String getVersion() {
+
+	// return visitor.getVersion();
+
+	// }
+
+	//
+
+	// public Map<String, String> getMainAttributes() {
+
+	// return visitor.getMainAttributes();
+
+	// }
+
+	//
+
+	// public Map<String, String> getAttributesForSection(String sectionName) {
+
+	// return visitor.getAttributesForSection(sectionName);
+
+	// }
+
+	//
+
+	// public List<String> getSectionNames() {
+
+	// return visitor.getSectionNames();
+
+	// }
+
+
+
+	public void setTerminateAfterMainSection(boolean shouldTerminate) {
+
+		visitor.setTerminateAfterMainSection(shouldTerminate);
+
+	}
+
+}
+
diff --git a/util/org.eclipse.virgo.util.parser.manifest/src/main/java/org/eclipse/virgo/util/parser/manifest/internal/ManifestToken.java b/util/org.eclipse.virgo.util.parser.manifest/src/main/java/org/eclipse/virgo/util/parser/manifest/internal/ManifestToken.java
new file mode 100644
index 0000000..4576d45
--- /dev/null
+++ b/util/org.eclipse.virgo.util.parser.manifest/src/main/java/org/eclipse/virgo/util/parser/manifest/internal/ManifestToken.java
@@ -0,0 +1,79 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.parser.manifest.internal;
+
+/**
+ * Represents part of a single header from a bundle manifest
+ *
+ */
+public final class ManifestToken implements Token {
+
+	private static final String COLON_VALUE = ":";
+
+	private static final String NEWLINE_VALUE = "\\n";
+
+	private String value;
+
+	private TokenKind kind;
+
+	private int startoffset;
+
+	private int endoffset;
+
+	public static ManifestToken makeName(char[] value, int start, int end) {
+		return new ManifestToken(new String(value), TokenKind.NAME, start, end);
+	}
+
+	public static ManifestToken makeValue(char[] value, int start, int end) {
+		return new ManifestToken(new String(value), TokenKind.VALUE, start, end);
+	}
+
+	public static ManifestToken makeColon(int start, int end) {
+		return new ManifestToken(COLON_VALUE, TokenKind.COLON, start, end);
+	}
+
+	public static Token makeNewline(int start, int end) {
+		return new ManifestToken(NEWLINE_VALUE, TokenKind.NEWLINE, start, end);
+	}
+
+	private ManifestToken(String value, TokenKind kind, int start, int end) {
+		this.value = value;
+		this.kind = kind;
+		this.startoffset = start;
+		this.endoffset = end;
+	}
+
+	public String value() {
+		return value;
+	}
+
+	@Override
+	public String toString() {
+		StringBuilder s = new StringBuilder();
+		s.append("'").append(value).append("'");
+		s.append("@").append(startoffset).append(":").append(endoffset);
+		return s.toString();
+	}
+
+	public TokenKind getKind() {
+		return kind;
+	}
+
+	public int getEndOffset() {
+		return endoffset;
+	}
+
+	public int getStartOffset() {
+		return startoffset;
+	}
+
+}
\ No newline at end of file
diff --git a/util/org.eclipse.virgo.util.parser.manifest/src/main/java/org/eclipse/virgo/util/parser/manifest/internal/ManifestVisitor.java b/util/org.eclipse.virgo.util.parser.manifest/src/main/java/org/eclipse/virgo/util/parser/manifest/internal/ManifestVisitor.java
new file mode 100644
index 0000000..c672852
--- /dev/null
+++ b/util/org.eclipse.virgo.util.parser.manifest/src/main/java/org/eclipse/virgo/util/parser/manifest/internal/ManifestVisitor.java
@@ -0,0 +1,141 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.parser.manifest.internal;
+
+
+
+import java.util.List;
+
+import java.util.Map;
+
+import org.eclipse.virgo.util.parser.manifest.ManifestContents;
+
+
+
+
+
+/**
+
+ * <p>
+
+ * Visited whilst processing the manifest, to build an object implementing
+
+ * {@link ManifestContents}
+
+ * </p>
+
+ * 
+
+ * <strong>Concurrent Semantics</strong><br/>
+
+ * 
+
+ * This class is thread safe.
+
+ * 
+
+
+ */
+
+public interface ManifestVisitor {
+
+
+
+	public void visitManifestVersion(String version);
+
+
+
+	/**
+
+	 * @param isMainSection or not
+	 * @param name of section
+	 * @return true if parsing should continue
+
+	 */
+
+	public boolean visitSection(boolean isMainSection, String name);
+
+
+
+	public void visitHeader(String name, String value);
+
+
+
+	/**
+
+	 * @return the version number discovered during the visit
+
+	 */
+
+	String getVersion();
+
+
+
+	/**
+
+	 * @return the main attributes discovered during the visit
+
+	 */
+
+	Map<String, String> getMainAttributes();
+
+
+
+	/**
+
+	 * @return the section names discovered during the visit
+
+	 */
+
+	List<String> getSectionNames();
+
+
+
+	/**
+
+	 * @param sectionName 
+	 * @return the attributes discovered for a particular section during the visit
+
+	 */
+
+	Map<String, String> getAttributesForSection(String sectionName);
+
+
+
+	/**
+
+	 * @return the contents of the manifested as constructed during the visit
+
+	 */
+
+	public ManifestContents getManifestContents();
+
+
+
+	/**
+
+	 * Force the parsing to finish once the main section is completed (ignoring
+
+	 * the rest of the data)
+
+	 * 
+
+	 * @param shouldTerminate true if parsing should finish after the main
+
+	 *            section is visited
+
+	 */
+
+	public void setTerminateAfterMainSection(boolean shouldTerminate);
+
+}
+
diff --git a/util/org.eclipse.virgo.util.parser.manifest/src/main/java/org/eclipse/virgo/util/parser/manifest/internal/RecoveringManifestLexer.java b/util/org.eclipse.virgo.util.parser.manifest/src/main/java/org/eclipse/virgo/util/parser/manifest/internal/RecoveringManifestLexer.java
new file mode 100644
index 0000000..5b73099
--- /dev/null
+++ b/util/org.eclipse.virgo.util.parser.manifest/src/main/java/org/eclipse/virgo/util/parser/manifest/internal/RecoveringManifestLexer.java
@@ -0,0 +1,1150 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.parser.manifest.internal;
+
+
+
+import java.io.IOException;
+
+import java.io.Reader;
+
+import java.util.ArrayList;
+
+import java.util.List;
+
+import org.eclipse.virgo.util.parser.manifest.ManifestProblem;
+import org.eclipse.virgo.util.parser.manifest.ManifestProblemKind;
+
+
+
+
+
+/*
+
+ * section:           *header +newline 
+
+ * nonempty-section:  +header +newline
+
+ * newline:           CR LF | LF | CR (not followed by LF)
+
+ * header:            name : value
+
+ * name:              alphanum *headerchar
+
+ * value:             SPACE *otherchar newline *continuation
+
+ * continuation:      SPACE *otherchar newline
+
+ * alphanum:          {A-Z} | {a-z} | {0-9}
+
+ * headerchar:        alphanum | - | _
+
+ * otherchar:         any UTF-8 character except NUL, CR and LF
+
+ */
+
+
+
+/**
+
+ * <p>
+
+ * Process some input data according to the expected layout above. However, this
+
+ * is not a dumb lexer and intelligently processes the data to allow for some
+
+ * errors (which will be reported but are recovered from) and automatically
+
+ * processes some constructs so that the real parser building on top of this
+
+ * lexer does not have to (ie. it identifies ; = , := in the values)
+
+ * 
+
+ * <p>
+
+ * The end of result of a 'lex' is that the data is broken into these tokens:
+
+ * NAME, COLON, VALUE, NEWLINE. Importantly:
+
+ * <ul>
+
+ * <li>value continuations are dealt with during the lex stage so only complete
+
+ * VALUE tokens are in the lex token stream
+
+ * <li>tokens are inserted where they will help the next stage cope with the
+
+ * data. For example if the input data is apparently missing a COLON to
+
+ * terminate a value, this lexer will report the problem but also insert a COLON
+
+ * <li>According to the specification for processing this data, two newlines are
+
+ * appended to data for processing - this allows for a file that is missing a
+
+ * final return and cleanly marks the end of a section. These 2 newline tokens
+
+ * will appear in the token stream output from this lexer
+
+ * <li>Due to the lexer automatically handling values commencing on the line
+
+ * after the name and values being spread across several lines, the NEWLINEs
+
+ * that may be in the input whilst lexing a "NAME: VALUE" sequence are not
+
+ * contained in the output token stream. Only the NEWLINEs at the end of a value
+
+ * or for blank lines are included.
+
+ * </ul>
+
+ * 
+
+ * <p>
+
+ * Hopefully building the above knowledge into the lexer isn't make it too
+
+ * difficult to understand...
+
+ * <p>
+
+ * <strong>Concurrent Semantics</strong><br/>
+
+ * 
+
+ * This class is thread safe.
+
+ * 
+
+ * 
+
+
+ */
+
+public class RecoveringManifestLexer {
+
+
+
+	private final static char[] BLANK_TOKEN_VALUE = "".toCharArray();
+
+	private final static char SPACE = ' ';
+
+	private final static char COLON = ':';
+
+	public final static int MAX_TOKEN_LENGTH = 65535;
+
+
+
+	private SimpleTokenStream tokenStream;
+
+	private SourceContext context;
+
+	private char[] data; // the manifest as a char array
+
+	private int dataLength; // data.length
+
+	private int dataPos; // current position in data
+
+	private List<Integer> linebreaks = new ArrayList<Integer>(); // position of a new line
+
+	private ParsingState parsingState = null;
+
+	private char[] token; // Used to hold accumulated token data
+
+	private int tokenPos = 0; // index into token array
+
+	private int startPosition;
+
+	private int possibleTokenEnd;
+
+	private ManifestToken lastEmittedNameToken = null;
+
+	private List<Token> newlineTokens = new ArrayList<Token>();
+
+
+
+	private RecoveringManifestLexer() {
+
+	}
+
+
+
+	/**
+
+	 * Tokenize a string representing a manifest.
+	 * @param manifestString the string
+	 * @return the token stream
+
+	 */
+
+	public static TokenStream tokenize(String manifestString) {
+
+		manifestString = manifestString + "\n\n";
+
+		RecoveringManifestLexer lexer = new RecoveringManifestLexer();
+
+		lexer.initialize();
+
+		lexer.process(manifestString);
+
+		return lexer.tokenStream;
+
+	}
+
+
+
+	/**
+
+	 * Tokenize input from a Reader as a manifest.
+	 * @param reader for input
+	 * @return token stream
+	 * @throws IOException for read errors
+
+	 */
+
+	public static TokenStream tokenize(Reader reader) throws IOException {
+
+		StringBuilder manifestString = new StringBuilder();
+
+		char[] data = new char[8192];
+
+		int dataRead = reader.read(data);
+
+		while (dataRead != -1) {
+
+			manifestString.append(data, 0, dataRead);
+
+			dataRead = reader.read(data);
+
+		}
+
+		manifestString.append("\n\n");
+
+		RecoveringManifestLexer lexer = new RecoveringManifestLexer();
+
+		lexer.initialize();
+
+		lexer.process(manifestString.toString());
+
+		return lexer.tokenStream;
+
+	}
+
+
+
+	private void initialize() {
+
+		parsingState = ParsingState.Default;
+
+		tokenStream = new SimpleTokenStream();
+
+		dataPos = 0;
+
+		linebreaks.clear();
+
+		linebreaks.add(0);
+
+	}
+
+
+
+	private void process(String str) {
+
+		this.data = str.toCharArray();
+
+		this.context = new SourceContext(str);
+
+		this.tokenStream.setSourceContext(context);
+
+		this.dataLength = data.length;
+		this.token = new char[this.dataLength];
+
+
+
+		while (dataPos < dataLength) {
+
+			char ch = data[dataPos];
+
+			if (parsingState == ParsingState.Default) {
+
+				// In state Default: expecting a name to start or a newline
+
+				if (isAlphanumeric(ch)) {
+
+					// it is a Name
+
+					parsingState = ParsingState.ParsingName;
+
+					startNewToken();
+
+					dataPos++;
+
+				} else if (isNewline(ch)) {
+
+					// it is a blank line
+
+					processNewlines(true);
+
+				} else if (ch == SPACE) {
+
+					// ERROR: Found SPACE where alphanumeric expected
+
+					// RECOVERY: skip over it and continue in this state
+
+					recordProblem(ManifestProblemKind.NAME_MUST_START_WITH_ALPHANUMERIC, dataPos, dataPos, " ");
+
+					dataPos++;
+
+				} else {
+
+					// ERROR: Found something other than an alphanumeric, space
+
+					// or newline
+
+					// RECOVERY: skip over it and continue in this state
+
+					recordProblem(ManifestProblemKind.ILLEGAL_NAME_CHAR, dataPos, dataPos + 1, Character.toString(ch));
+
+					dataPos++;
+
+				}
+
+			} else if (parsingState == ParsingState.ParsingName) {
+
+				// In state ParsingName: process name characters until something
+
+				// else is encountered
+
+				while (isNameChar(ch) && tokenPos < MAX_TOKEN_LENGTH) {
+
+					token[tokenPos++] = ch;
+
+					ch = data[++dataPos];
+
+				}
+
+				if (tokenPos >= MAX_TOKEN_LENGTH) {
+
+					recordProblem(ManifestProblemKind.NAME_TOO_LONG, this.startPosition, dataPos);
+
+					// skip over the rest of this name...
+
+					while (isNameChar(ch)) {
+
+						ch = data[++dataPos];
+
+					}
+
+				}
+
+				if (ch == COLON) {
+
+					// correct end to a Name
+
+					emitNameToken();
+
+					emitColonToken(dataPos, dataPos + 1);
+
+					parsingState = ParsingState.ParsingValueHeaderChar;
+
+					dataPos++;
+
+				} else if (ch == SPACE) {
+
+					// ERROR: missed out a colon and headed straight into value
+
+					// RECOVERY: assume they missed the ':' and dive straight
+
+					// into processing the value
+
+					emitNameToken();
+
+					emitPhantomColonToken(dataPos);
+
+					recordProblem(ManifestProblemKind.NAME_ENDED_WITH_SPACE_RATHER_THAN_COLON, dataPos, dataPos);
+
+					// lastEmittedNameToken
+
+					// .getStartOffset(), lastEmittedNameToken.getEndOffset());
+
+					parsingState = ParsingState.ParsingValueHeaderChar;
+
+					// dont move the dataPos on so the SPACE is handled OK as
+
+					// the start of the value
+
+				} else if (isNewline(ch)) {
+
+					// ERROR: name ended prematurely with a newline
+
+					// RECOVERY: assume they forgot the ':' and that the value
+
+					// is on the next line
+
+					emitNameToken();
+
+					int endOfNamePosition = dataPos;
+
+					emitPhantomColonToken(endOfNamePosition);
+
+					recordProblem(ManifestProblemKind.NAME_ENDED_PREMATURELY_WITH_NEWLINE, lastEmittedNameToken.getStartOffset(),
+
+							lastEmittedNameToken.getEndOffset());
+
+
+
+					// Did they follow this line with a blank line?
+
+					boolean blanklines = processNewlines(false);
+
+					// If the prematurely ending name is followed by a blank
+
+					// line then assume they forgot the
+
+					// value and go back to looking for a name
+
+
+
+					if (blanklines) {
+
+						// ERROR: The Name (which was incorrectly followed by a
+
+						// Newline rather than a Colon) now also has blanklines
+
+						// following the Newline
+
+						// RECOVERY: emit a phantom value token and move on back
+
+						// to default parsing mode (looking for a name)
+
+						// TODO [later] could do recovery here if next char is a
+
+						// SPACE and just assume the accidentally put line
+
+						// breaks in between Name and value
+
+						recordProblem(ManifestProblemKind.MISSING_VALUE, lastEmittedNameToken.getStartOffset(),
+
+								lastEmittedNameToken.getEndOffset(), substring(this.data, lastEmittedNameToken.getStartOffset(),
+
+										lastEmittedNameToken.getEndOffset()));
+
+						emitPhantomValueToken(endOfNamePosition);
+
+						emitAccumulatedNewlineTokens();
+
+						parsingState = ParsingState.Default;
+
+					} else {
+
+						// Couple of choices here...
+
+						// 
+
+						// (1) Determine whether to switch into name or value
+
+						// parsing mode based on first char of next line. that
+
+						// won't cope with this:
+
+						// Name
+
+						// value
+
+						// where they forgot the : and also failed to start the
+
+						// value with a space
+
+						// (2) Just treat the next line as the value, that won't
+
+						// handle the situation where they've forgotten the
+
+						// value very cleanly as we could accidentally treat
+
+						// something that is meant to be a name as a value
+
+
+
+						// option (1)
+
+						// clever? If the next char is not a space then the
+
+						// value is missing and we should go back to looking for
+
+						// a
+
+						// name
+
+						if (dataPos < dataLength && data[dataPos] == SPACE) {
+
+							parsingState = ParsingState.ParsingValueHeaderChar;
+
+							newlineTokens.clear();
+
+						} else {
+
+							recordProblem(ManifestProblemKind.MISSING_VALUE, lastEmittedNameToken.getStartOffset(),
+
+									lastEmittedNameToken.getEndOffset(), lastEmittedNameToken.value());
+
+							emitPhantomValueToken(endOfNamePosition);
+
+							emitAccumulatedNewlineTokens();
+
+							parsingState = ParsingState.Default;
+
+						}
+
+					}
+
+				} else {
+
+					// TODO [later] does this cause a problem? We might have
+
+					// gotten into a state where a value is being treated as a
+
+					// name
+
+					recordProblem(ManifestProblemKind.ILLEGAL_NAME_CHAR, dataPos, dataPos, Character.toString(ch));
+
+					dataPos++;
+
+				}
+
+			} else if (parsingState == ParsingState.ParsingValueHeaderChar) {
+
+				// In state ParsingValueHeaderChar: expecting a space or newline
+
+				// then a space
+
+				if (ch == SPACE) {
+
+					// Found the expected space, move to value parsing state
+
+					startPosition = dataPos + 1;
+
+					tokenPos = 0;
+
+					parsingState = ParsingState.ParsingValue;
+
+					dataPos++;
+
+				} else if (isNewline(ch)) {
+
+					boolean blankline = processNewlines(false);
+
+					// Cannot be a blankline - and the char following the
+
+					// newline must be a space
+
+					if (blankline) {
+
+						// hmm, the colon was followed by at least one blank
+
+						// line, that's no good
+
+						// Record the problem, assume the value is missing and
+
+						// go back to looking for a name
+
+						recordProblem(ManifestProblemKind.VALUE_MUST_IMMEDIATELY_FOLLOW_NAME,
+
+								lastEmittedNameToken.getStartOffset(), lastEmittedNameToken.getEndOffset());
+
+						emitPhantomValueToken(newlineTokens.get(0).getStartOffset());
+
+						emitAccumulatedNewlineTokens();
+
+						parsingState = ParsingState.Default;
+
+					} else {
+
+						newlineTokens.clear();
+
+						// we can drop through here - as there were no
+
+						// blanklines we know the next
+
+						// char must be 'something' and if it is not a SPACE
+
+						// we'll barf on coming through this
+
+						// parsingState section next time
+
+					}
+
+				} else {
+
+					// ERROR: failed to start the value with a space
+
+					// RECOVERY: assume they just missed out the space, and
+
+					// treat what is there as the value
+
+					recordProblem(ManifestProblemKind.VALUE_MUST_START_WITH_SPACE, dataPos, dataPos);
+
+					startPosition = dataPos;
+
+					tokenPos = 0;
+
+					parsingState = ParsingState.ParsingValue;
+
+					// currentPosition++; don't do this - and so we will reparse
+
+					// this char as the start of the value
+
+				}
+
+			} else if (parsingState == ParsingState.ParsingValue) {
+
+				// In state ParsingValue: process characters making up the value
+
+				// until a newline is hit
+
+				while (!isNewline(ch)) {
+
+					token[tokenPos++] = ch;
+
+					ch = data[++dataPos];
+
+				}
+
+				if (tokenPos >= MAX_TOKEN_LENGTH) {
+
+					recordProblem(ManifestProblemKind.VALUE_TOO_LONG, this.startPosition, dataPos);
+
+				}
+
+				possibleTokenEnd = dataPos; // this may not be the end of the
+
+				// token if there is a continuation
+
+				boolean blanklines = processNewlines(false);
+
+				if (blanklines) {
+
+					// Check if there is accidentally just a rogue newline in
+
+					// and the continuation is after that...
+
+					if (dataPos < dataLength && data[dataPos] == SPACE) {
+
+						recordProblem(ManifestProblemKind.UNEXPECTED_NEWLINE_DURING_VALUE_PARSING, possibleTokenEnd, dataPos);
+
+						parsingState = ParsingState.ParsingNameOrContinuation;
+
+					} else {
+
+						// no continuation, emit the value token, the
+
+						// accumulated newlines and move on
+
+						emitValueToken(startPosition, possibleTokenEnd);
+
+						emitAccumulatedNewlineTokens();
+
+						parsingState = ParsingState.Default;
+
+					}
+
+				} else {
+
+					// (*)
+
+					parsingState = ParsingState.ParsingNameOrContinuation;
+
+				}
+
+			} else {
+
+				assert parsingState == ParsingState.ParsingNameOrContinuation;
+
+				// if (isNewline(ch)) {
+
+				// emitValueToken();
+
+				// emitAccumulatedNewlineTokens(); // from (*) above
+
+				// processNewlines(true);
+
+				// } else
+
+				if (ch == SPACE) {
+
+					// continuation
+
+					newlineTokens.clear(); // will not need these
+
+					parsingState = ParsingState.ParsingValue;
+
+					dataPos++;
+
+				} else if (isAlphanumeric(ch)) {
+
+					// on the next name, that value was complete
+
+					emitValueToken(startPosition, possibleTokenEnd);
+
+					emitAccumulatedNewlineTokens(); // from (*) above
+
+					// new name
+
+					startPosition = dataPos;
+
+					tokenPos = 0;
+
+					token[tokenPos++] = ch;
+
+					parsingState = ParsingState.ParsingName;
+
+					dataPos++;
+
+				} else {
+
+					// ERROR: whilst expecting new Name or a continuation,
+
+					// encountered another char
+
+					// RECOVERY: assume it was meant to be a continuation and
+
+					// the initial SPACE is missing
+
+					assert !isNewline(ch); // Cannot be, will have been dealt
+
+					// with before entering this state
+
+					recordProblem(ManifestProblemKind.MISSING_SPACE_FOR_CONTINUATION, dataPos, dataPos + 1);
+
+					newlineTokens.clear();
+
+					token[tokenPos++] = ch;
+
+					parsingState = ParsingState.ParsingValue;
+
+					dataPos++;
+
+					// throw new
+
+					// InternalManifestProcessingException("No idea how to deal with '"
+
+					// + ch + "' whilst in state "
+
+					// + parsingState);
+
+				}
+
+			}
+
+		}
+
+		// End of the data - must be in default state
+
+		assert parsingState == ParsingState.Default;
+
+		tokenStream.getSourceContext().setLinebreaks(linebreaks);
+
+		tokenStream.lexComplete();
+
+	}
+
+
+
+	// Note on token emission:
+
+	// If the start and end position are the same, it is a phantom token -
+
+	// inserted by the lexer because of malformed input data.
+
+	// Phantom tokens enable the parser to be straightforward because it will
+
+	// not see bad data.
+
+
+
+	private int correctMaxPosition(int pos) {
+	    return pos;
+
+//		if (tokenPos < MAX_TOKEN_LENGTH) {
+
+//			return tokenPos;
+
+//		}
+
+//		return MAX_TOKEN_LENGTH - 1;
+
+	}
+
+
+
+	private void emitNameToken() {
+
+		lastEmittedNameToken = ManifestToken.makeName(subarray(token, 0, correctMaxPosition(tokenPos)), startPosition, dataPos);
+
+		tokenStream.addToken(lastEmittedNameToken);
+
+	}
+
+
+
+	private void emitColonToken(int spos, int epos) {
+
+		tokenStream.addToken(ManifestToken.makeColon(spos, epos));
+
+	}
+
+
+
+	private void emitPhantomColonToken(int pos) {
+
+		tokenStream.addToken(ManifestToken.makeColon(pos, pos));
+
+	}
+
+
+
+	private void emitValueToken(int spos, int epos) {
+
+		tokenStream.addToken(ManifestToken.makeValue(subarray(token, 0, correctMaxPosition(tokenPos)), spos, epos));
+
+	}
+
+
+
+	private void emitPhantomValueToken(int pos) {
+
+		tokenStream.addToken(ManifestToken.makeValue(BLANK_TOKEN_VALUE, pos, pos));
+
+	}
+
+
+
+	private void emitAccumulatedNewlineTokens() {
+
+		for (Token newlineToken : newlineTokens) {
+
+			tokenStream.addToken(newlineToken);
+
+		}
+
+		newlineTokens.clear();
+
+	}
+
+
+
+	private void startNewToken() {
+
+		startPosition = dataPos;
+
+		tokenPos = 0;
+
+		token[tokenPos++] = data[dataPos];
+
+	}
+
+
+
+	private void recordProblem(ManifestProblemKind problemKind, int start, int end, String... inserts) {
+
+		tokenStream.recordProblem(new ManifestProblem(problemKind, context, start, end, inserts));
+
+	}
+
+
+
+	public static final char[] subarray(char[] array, int start, int end) {
+
+		char[] result = new char[end - start];
+
+		System.arraycopy(array, start, result, 0, end - start);
+
+		return result;
+
+	}
+
+
+
+	public static final String substring(char[] array, int start, int end) {
+
+		return new String(array, start, end - start);
+
+	}
+
+
+
+	// Private bit flags for fast detection of char types
+
+	private static byte[] fastCharLookup = new byte[256];
+
+	private final static byte letterChar = 0x01;
+
+	private final static byte digitChar = 0x02;
+
+	private final static byte underscoreHyphenChar = 0x04;
+
+	private final static byte newlineChar = 0x10;
+
+	private final static byte alphanumMask = letterChar | digitChar;
+
+	private final static byte nameMask = letterChar | digitChar | underscoreHyphenChar;
+
+
+
+	static {
+
+
+
+		int i;
+
+		for (i = 0; i < 256; i++) {
+
+			fastCharLookup[i] = 0;
+
+		}
+
+		for (i = 'a'; i <= 'z'; i++) {
+
+			fastCharLookup[i] |= letterChar;
+
+		}
+
+		for (i = 'A'; i <= 'Z'; i++) {
+
+			fastCharLookup[i] |= letterChar;
+
+		}
+
+		for (i = '0'; i <= '9'; i++) {
+
+			fastCharLookup[i] |= digitChar;
+
+		}
+
+		fastCharLookup['-'] |= underscoreHyphenChar;
+
+		fastCharLookup['_'] |= underscoreHyphenChar;
+
+		fastCharLookup['\r'] |= newlineChar;
+
+		fastCharLookup['\n'] |= newlineChar;
+
+	}
+
+
+
+	// private static boolean isAlpha(char ch) {
+
+	// if (ch > 256) {
+
+	// return false;
+
+	// }
+
+	// return (fastCharLookup[ch] & letterChar) != 0;
+
+	// }
+
+
+
+	// private static boolean isDigit(char ch) {
+
+	// if (ch > 256) {
+
+	// return false;
+
+	// }
+
+	// return (fastCharLookup[ch] & digitChar) != 0;
+
+	// }
+
+
+
+	private static boolean isAlphanumeric(char ch) {
+
+		if (ch > 256) {
+
+			return false;
+
+		}
+
+		return (fastCharLookup[ch] & alphanumMask) != 0;
+
+	}
+
+
+
+	private static boolean isNameChar(char ch) {
+
+		if (ch > 255) {
+
+			return false;
+
+		}
+
+		return (fastCharLookup[ch] & nameMask) != 0;
+
+	}
+
+
+
+	private static boolean isNewline(char ch) {
+
+		if (ch > 255) {
+
+			return false;
+
+		}
+
+		return (fastCharLookup[ch] & newlineChar) != 0;
+
+	}
+
+
+
+	/**
+
+	 * Process newlines from the currentposition until something other than a
+
+	 * newline is encountered. Newlines are either "\n" or "\r" or "\n\r". The
+
+	 * parameter emitToTokenStreamImmediately determines whether tokens for the
+
+	 * newlines should be emitted to the tokenstream immediately or recorded for
+
+	 * emitting later. The reason a caller may want to emit them later is that
+
+	 * they are making a decision based on: (1) whether there was a blankline
+
+	 * (2) what the next character is after the newlines
+
+	 * 
+
+	 * @param emitToTokenStreamImmediately whether to emit the Newline tokens
+
+	 *            immediately or simply record for later emission
+
+	 * @return true if a blank line was found (ie. at least two Newlines
+
+	 *         together)
+
+	 */
+
+	private boolean processNewlines(boolean emitToTokenStreamImmediately) {
+
+		assert newlineTokens.size() == 0;// If not zero then someone forgot to
+
+		// deal with them
+
+		char ch = data[dataPos];
+
+		assert isNewline(ch);
+
+		newlineTokens.clear();
+
+		int newlines = 0;
+
+		do {
+
+			newlines++;
+
+			int toskip = 1;
+
+			if (ch == '\r' && ((dataPos + 1) < dataLength) && data[dataPos + 1] == '\n') {
+
+				// need to skip over the following LF too
+
+				toskip++;
+
+			}
+
+			Token newlineToken = ManifestToken.makeNewline(dataPos, dataPos + toskip);
+
+			if (emitToTokenStreamImmediately) {
+
+				tokenStream.addToken(newlineToken);
+
+			} else {
+
+				newlineTokens.add(newlineToken);
+
+			}
+
+			linebreaks.add(dataPos + toskip);
+
+			dataPos += toskip;
+
+		} while (dataPos < dataLength && isNewline(ch = data[dataPos]));
+
+		return newlines > 1; // If >1 then a blank line has been encountered
+
+	}
+
+
+
+	// For lexer debugging, gives stream position
+
+	// @Override
+
+	// public String toString() {
+
+	// StringBuilder sb = new StringBuilder();
+
+	// sb.append("Manifest Lexer.  Data length = ").append(dataLength).append("\n");
+
+	// for (int i = 0; i < dataLength; i++) {
+
+	// if (data[i] == '\n' || data[i] == '\r') {
+
+	// sb.append("~");
+
+	// } else {
+
+	// sb.append(data[i]);
+
+	// }
+
+	// }
+
+	// sb.append("\n");
+
+	// for (int i = 0; i < dataPos; i++) {
+
+	// sb.append(" ");
+
+	// }
+
+	// sb.append("^");
+
+	// sb.append("\n");
+
+	// sb.append(tokenStream.toFormattedString(true));
+
+	// sb.append("\n");
+
+	// return sb.toString();
+
+	// }
+
+
+
+	private enum ParsingState {
+
+		// In Default state we are expecting a name
+
+		Default, ParsingName, ParsingValue, ParsingValueHeaderChar, ParsingNameOrContinuation
+
+	}
+
+}
+
diff --git a/util/org.eclipse.virgo.util.parser.manifest/src/main/java/org/eclipse/virgo/util/parser/manifest/internal/SimpleTokenStream.java b/util/org.eclipse.virgo.util.parser.manifest/src/main/java/org/eclipse/virgo/util/parser/manifest/internal/SimpleTokenStream.java
new file mode 100644
index 0000000..42a9686
--- /dev/null
+++ b/util/org.eclipse.virgo.util.parser.manifest/src/main/java/org/eclipse/virgo/util/parser/manifest/internal/SimpleTokenStream.java
@@ -0,0 +1,279 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.parser.manifest.internal;
+
+
+
+import java.util.ArrayList;
+
+import java.util.List;
+
+import org.eclipse.virgo.util.parser.manifest.ManifestProblem;
+
+
+
+
+
+/**
+
+ * 
+
+ * <strong>Concurrent Semantics</strong><br/>
+
+ * 
+
+ * This class is thread safe.
+
+ * 
+
+
+ */
+
+public class SimpleTokenStream implements TokenStream {
+
+
+
+	private int tokenStreamPosition = 0;
+
+	private List<Token> tokens = new ArrayList<Token>();
+
+	private int tokenStreamLen;
+
+	private List<ManifestProblem> problems = new ArrayList<ManifestProblem>();
+
+	private SourceContext sourceContext;
+
+
+
+	SimpleTokenStream() {
+
+		tokens.clear();
+
+		tokenStreamPosition = 0;
+
+	}
+
+
+
+	@Override
+
+	public String toString() {
+
+		return toFormattedString(true);
+
+	}
+
+
+
+	public int getCount() {
+
+		return tokens.size();
+
+	}
+
+
+
+	public int getPosition() {
+
+		return tokenStreamPosition;
+
+	}
+
+
+
+	public Token next() {
+
+		if (tokenStreamPosition >= tokenStreamLen) {
+
+			return null;
+
+		} else {
+
+			return tokens.get(tokenStreamPosition++);
+
+		}
+
+	}
+
+
+
+	public void setPosition(int newPosition) {
+
+		tokenStreamPosition = newPosition;
+
+	}
+
+
+
+	public Token peek() {
+
+		if (tokenStreamPosition >= tokens.size()) {
+
+			return tokens.get(tokens.size() - 1);
+
+		}
+
+		return tokens.get(tokenStreamPosition);
+
+	}
+
+
+
+	public Token peekLast() {
+
+		return tokens.get(tokens.size() - 1);
+
+	}
+
+
+
+	public Token peek(int offset) {
+
+		// TODO [later] negative offset check >0
+
+		if ((tokenStreamPosition + offset) >= tokenStreamLen) {
+
+			return null;
+
+		} else {
+
+			return tokens.get(tokenStreamPosition + offset);
+
+		}
+
+	}
+
+
+
+	public String toFormattedString() {
+
+		return toFormattedString(true);
+
+	}
+
+
+
+	public String toFormattedString(boolean includePositionsInOutput) {
+
+		StringBuilder sb = new StringBuilder();
+
+		sb.append("TokenStream:#").append(tokens.size()).append(" tokens:");
+
+		sb.append("[");
+
+		int i = 0;
+
+		for (Token token : tokens) {
+
+			if (i > 0) {
+
+				sb.append(",");
+
+			}
+
+			if (includePositionsInOutput) {
+
+				sb.append(token.toString());
+
+			} else {
+
+				sb.append(token.value());
+
+
+
+			}
+
+			i++;
+
+		}
+
+		sb.append("]");
+
+		return sb.toString();
+
+	}
+
+
+
+	void addToken(Token token) {
+
+		tokens.add(token);
+
+	}
+
+
+
+	public boolean containsProblems() {
+
+		return !problems.isEmpty();
+
+	}
+
+
+
+	public List<ManifestProblem> getProblems() {
+
+		return problems;
+
+	}
+
+
+
+	public SourceContext getSourceContext() {
+
+		return sourceContext;
+
+	}
+
+
+
+	public boolean hasMore() {
+
+		return tokenStreamPosition < tokens.size();
+
+	}
+
+
+
+	public void recordProblem(ManifestProblem manifestProblem) {
+
+		problems.add(manifestProblem);
+
+	}
+
+
+
+	public void setSourceContext(SourceContext sourceContext) {
+
+		this.sourceContext = sourceContext;
+
+	}
+
+
+
+	/**
+
+	 * Called by the lexer to indicate that population of the tokenStream is now
+
+	 * complete.
+
+	 */
+
+	public void lexComplete() {
+
+		tokenStreamLen = tokens.size();
+
+	}
+
+
+
+}
diff --git a/util/org.eclipse.virgo.util.parser.manifest/src/main/java/org/eclipse/virgo/util/parser/manifest/internal/SourceContext.java b/util/org.eclipse.virgo.util.parser.manifest/src/main/java/org/eclipse/virgo/util/parser/manifest/internal/SourceContext.java
new file mode 100644
index 0000000..a87c060
--- /dev/null
+++ b/util/org.eclipse.virgo.util.parser.manifest/src/main/java/org/eclipse/virgo/util/parser/manifest/internal/SourceContext.java
@@ -0,0 +1,266 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.parser.manifest.internal;
+
+
+
+import java.util.Arrays;
+
+import java.util.List;
+
+import org.eclipse.virgo.util.parser.manifest.ManifestProblem;
+
+
+
+
+
+/**
+
+ * SourceContext captures information about the data being processed by the
+
+ * lexer and parser. This information can be used to provide more accurate
+
+ * informational or error messages. Internally it has a copy of the original
+
+ * source and where the linebreaks are within it.
+
+ * <p>
+
+ * <strong>Concurrent Semantics</strong><br/>
+
+ * 
+
+ * This class is thread safe.
+
+ * 
+
+
+ */
+
+public class SourceContext {
+
+
+
+	private int[] linebreaks;
+
+	private String theSource;
+
+
+
+	public SourceContext(String theSource) {
+
+		this.theSource = theSource;
+
+		this.linebreaks = new int[] { 0, theSource.length() };
+
+	}
+
+
+
+	public void setLinebreaks(List<Integer> linebreaks) {
+
+		this.linebreaks = new int[linebreaks.size()];
+
+		for (int i = 0; i < linebreaks.size(); i++) {
+
+			this.linebreaks[i] = linebreaks.get(i);
+
+		}
+
+	}
+
+
+
+	/*
+
+	 * public SourceContext(char[] theSource, List<Integer> linebreaks) {
+
+	 * this.theSource = theSource; this.linebreaks = new int[linebreaks.size()];
+
+	 * for (int i = 0; i < linebreaks.size(); i++) { this.linebreaks[i] =
+
+	 * linebreaks.get(i); } }
+
+	 */
+
+
+
+	/**
+
+	 * @return the positions in the source data where the lines start.
+
+	 */
+
+	public int[] getLinebreaks() {
+
+		int[] linebreaksCopy = new int[linebreaks.length];
+
+		System.arraycopy(linebreaks, 0, linebreaksCopy, 0, linebreaks.length);
+
+		return linebreaksCopy;
+
+	}
+
+
+
+	/**
+
+	 * Compute the line that the token is on, using the linebreak information
+
+	 * and the tokens offset
+	 * @param token on the line
+	 * @return the line number
+
+	 */
+
+	public int getLine(Token token) {
+
+		return getRelevantStartLinebreakEntry(token.getStartOffset()) + 1;
+
+	}
+
+
+
+	public int getLine(int offset) {
+
+		return getRelevantStartLinebreakEntry(offset) + 1;
+
+	}
+
+
+
+	public int getLine(ManifestProblem manifestParserProblemInstance) {
+
+		return getRelevantStartLinebreakEntry(manifestParserProblemInstance.getStartOffset()) + 1;
+
+	}
+
+
+
+	public int getEndLine(Token token) {
+
+		return getRelevantEndLinebreakEntry(token.getEndOffset()) + 1;
+
+	}
+
+
+
+	public int getStartColumn(Token token) {
+
+		int lb = getRelevantStartLinebreakEntry(token.getStartOffset());
+
+		return token.getStartOffset() - linebreaks[lb];
+
+	}
+
+
+
+	public int getStartColumn(ManifestProblem manifestParserProblemInstance) {
+
+		int lb = getRelevantStartLinebreakEntry(manifestParserProblemInstance.getStartOffset());
+
+		return manifestParserProblemInstance.getStartOffset() - linebreaks[lb];
+
+	}
+
+
+
+	public int getColumn(int offset) {
+
+		int lb = getRelevantStartLinebreakEntry(offset);
+
+		return offset - linebreaks[lb];
+
+	}
+
+
+
+	public int getEndColumn(Token token) {
+
+		int lb = getRelevantEndLinebreakEntry(token.getEndOffset());
+
+		return token.getEndOffset() - linebreaks[lb];
+
+	}
+
+
+
+	public int getEndColumn(ManifestProblem manifestParserProblemInstance) {
+
+		int lb = getRelevantEndLinebreakEntry(manifestParserProblemInstance.getEndOffset());
+
+		return manifestParserProblemInstance.getEndOffset() - linebreaks[lb];
+
+	}
+
+
+
+	// ---
+
+
+
+	private int getRelevantStartLinebreakEntry(int startoffset) {
+
+		int pos = Arrays.binarySearch(linebreaks, startoffset);
+
+		if (pos < 0) {
+
+			return -pos - 2;
+
+		} else {
+
+			return pos;
+
+		}
+
+	}
+
+
+
+	private int getRelevantEndLinebreakEntry(int offset) {
+
+		int pos = Arrays.binarySearch(linebreaks, offset);
+
+		if (pos < 0) {
+
+			return -pos - 2;
+
+		} else {
+
+			return pos;// - 1;
+
+		}
+
+	}
+
+
+
+	public String getLineAsString(int relevantLine) {
+
+		int startoffset = linebreaks[relevantLine - 1];
+
+		// int endoffset = theSource.length;
+
+		// if ((relevantLine + 1) < linebreaks.length) {
+
+		int endoffset = linebreaks[relevantLine];
+
+		// }
+
+		return theSource.substring(startoffset, endoffset);
+
+	}
+
+
+
+}
+
diff --git a/util/org.eclipse.virgo.util.parser.manifest/src/main/java/org/eclipse/virgo/util/parser/manifest/internal/StandardVisitor.java b/util/org.eclipse.virgo.util.parser.manifest/src/main/java/org/eclipse/virgo/util/parser/manifest/internal/StandardVisitor.java
new file mode 100644
index 0000000..ea05eea
--- /dev/null
+++ b/util/org.eclipse.virgo.util.parser.manifest/src/main/java/org/eclipse/virgo/util/parser/manifest/internal/StandardVisitor.java
@@ -0,0 +1,159 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.parser.manifest.internal;
+
+
+
+import java.util.ArrayList;
+
+import java.util.HashMap;
+
+import java.util.List;
+
+import java.util.Map;
+
+import org.eclipse.virgo.util.parser.manifest.ManifestContents;
+
+
+
+
+
+// TODO [later] make the StandardVisitor configurable to terminate after parsing the main section
+
+/**
+
+ * <strong>Concurrent Semantics</strong><br/>
+
+ * 
+
+ * This class is thread safe.
+
+ * 
+
+
+ */
+
+public class StandardVisitor implements ManifestVisitor, ManifestContents {
+
+	private String version;
+
+	private Map<String, String> mainAttributes = new HashMap<String, String>();
+
+	private List<String> otherSectionNames = new ArrayList<String>();
+
+	private Map<String, Map<String, String>> otherSectionAttributes = new HashMap<String, Map<String, String>>();
+
+
+
+	private Map<String, String> currentAttributes;
+
+	protected boolean terminateAfterMainSection = false;
+
+
+
+	public void visitManifestVersion(String version) {
+
+		mainAttributes.put("Manifest-Version", version);
+
+		this.version = version;
+
+	}
+
+
+
+	public void visitHeader(String name, String value) {	  
+	    if (this.currentAttributes == this.mainAttributes && "Manifest-Version".equals(name)) {
+	        this.version = value;
+	    }
+
+		currentAttributes.put(name, value);
+
+	}
+
+
+
+	public List<String> getSectionNames() {
+
+		return otherSectionNames;
+
+	}
+
+
+
+	public boolean visitSection(boolean isMain, String name) {
+
+		currentAttributes = new HashMap<String, String>();
+
+		if (isMain) {
+
+			mainAttributes = currentAttributes;
+
+		} else {
+
+			if (terminateAfterMainSection) {
+
+				return false;
+
+			}
+
+			otherSectionNames.add(name);
+
+			otherSectionAttributes.put(name, currentAttributes);
+
+		}
+
+		return true;
+
+	}
+
+
+
+	public String getVersion() {
+
+		return version;
+
+	}
+
+
+
+	public Map<String, String> getMainAttributes() {
+
+		return mainAttributes;
+
+	}
+
+
+
+	public Map<String, String> getAttributesForSection(String sectionName) {
+
+		return otherSectionAttributes.get(sectionName);
+
+	}
+
+
+
+	public void setTerminateAfterMainSection(boolean b) {
+
+		this.terminateAfterMainSection = b;
+
+	}
+
+
+
+	public ManifestContents getManifestContents() {
+
+		return this;
+
+	}
+
+}
+
diff --git a/util/org.eclipse.virgo.util.parser.manifest/src/main/java/org/eclipse/virgo/util/parser/manifest/internal/Token.java b/util/org.eclipse.virgo.util.parser.manifest/src/main/java/org/eclipse/virgo/util/parser/manifest/internal/Token.java
new file mode 100644
index 0000000..2fbeffd
--- /dev/null
+++ b/util/org.eclipse.virgo.util.parser.manifest/src/main/java/org/eclipse/virgo/util/parser/manifest/internal/Token.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.parser.manifest.internal;
+
+
+
+/**
+
+ * <strong>Concurrent Semantics</strong><br/>
+
+ * 
+
+ * This class is thread safe.
+
+ * 
+
+
+ */
+
+public interface Token {
+
+
+
+	public TokenKind getKind();
+
+
+
+	public String value();
+
+
+
+	public int getStartOffset();
+
+
+
+	public int getEndOffset();
+
+
+
+}
+
diff --git a/util/org.eclipse.virgo.util.parser.manifest/src/main/java/org/eclipse/virgo/util/parser/manifest/internal/TokenKind.java b/util/org.eclipse.virgo.util.parser.manifest/src/main/java/org/eclipse/virgo/util/parser/manifest/internal/TokenKind.java
new file mode 100644
index 0000000..ab8f312
--- /dev/null
+++ b/util/org.eclipse.virgo.util.parser.manifest/src/main/java/org/eclipse/virgo/util/parser/manifest/internal/TokenKind.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.parser.manifest.internal;
+
+
+
+/**
+
+ * Token kinds created by the Manifest lexer.
+
+ * <p>
+
+ * <strong>Concurrent Semantics</strong><br/>
+
+ * 
+
+ * This class is thread safe.
+
+ * 
+
+
+ */
+
+public enum TokenKind {
+
+	NAME("Name"), VALUE("Value"), COLON(":"), NEWLINE("\\n");
+
+
+
+	private String tokenString;
+
+
+
+	private TokenKind(String messageString) {
+
+		this.tokenString = messageString;
+
+	}
+
+
+
+	public static boolean isNewline(Token t) {
+
+		return t.getKind() == NEWLINE;
+
+	}
+
+
+
+	public static boolean isName(Token t) {
+
+		return t.getKind() == NAME;
+
+	}
+
+
+
+	public static boolean isValue(Token t) {
+
+		return t.getKind() == VALUE;
+
+	}
+
+
+
+	public static boolean isColon(Token t) {
+
+		return t.getKind() == COLON;
+
+	}
+
+
+
+	public String getTokenString() {
+
+		return tokenString;
+
+	}
+
+}
diff --git a/util/org.eclipse.virgo.util.parser.manifest/src/main/java/org/eclipse/virgo/util/parser/manifest/internal/TokenStream.java b/util/org.eclipse.virgo.util.parser.manifest/src/main/java/org/eclipse/virgo/util/parser/manifest/internal/TokenStream.java
new file mode 100644
index 0000000..627ed24
--- /dev/null
+++ b/util/org.eclipse.virgo.util.parser.manifest/src/main/java/org/eclipse/virgo/util/parser/manifest/internal/TokenStream.java
@@ -0,0 +1,168 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.parser.manifest.internal;
+
+
+
+import java.util.List;
+
+import org.eclipse.virgo.util.parser.manifest.ManifestProblem;
+
+
+
+
+
+/**
+
+ * Provides a stream of tokens for parsing.
+
+ * <p>
+
+ * <strong>Concurrent Semantics</strong><br/>
+
+ * 
+
+ * This class is thread safe.
+
+ * 
+
+
+ */
+
+public interface TokenStream {
+
+
+
+	/**
+
+	 * @return the next token and consume it
+
+	 */
+
+	public Token next();
+
+
+
+	/**
+
+	 * @return the next token but do not consume it
+
+	 */
+
+	public Token peek();
+
+
+
+	/**
+
+	 * @param offset the offset from the current TokenStream position, can be
+
+	 *            negative.
+
+	 * @return the token at that particular offset from the current position.
+
+	 */
+
+	public Token peek(int offset);
+
+
+
+	/**
+
+	 * @return position within the token stream
+
+	 */
+
+	public int getPosition();
+
+
+
+	/**
+
+	 * @param newPosition the new position to move to in the token stream
+
+	 */
+
+	public void setPosition(int newPosition);
+
+
+
+	/**
+
+	 * @return number of tokens in the stream
+
+	 */
+
+	public int getCount();
+
+
+
+	/**
+
+	 * @return true if problems were found whilst processing the input data
+
+	 */
+
+	public boolean containsProblems();
+
+
+
+	/**
+
+	 * @return all the problems that occurred whilst processing the input data
+
+	 */
+
+	public List<ManifestProblem> getProblems();
+
+
+
+	/**
+
+	 * @return the source context which can be used to create improved messages
+
+	 */
+
+	SourceContext getSourceContext();
+
+
+
+	public String toFormattedString(boolean b);
+
+
+
+	public String toFormattedString();
+
+
+
+	/**
+
+	 * @return true if there are still more tokens to process (ie. the position
+
+	 *         is not yet at the end)
+
+	 */
+
+	public boolean hasMore();
+
+
+
+	public Token peekLast();
+
+
+
+	public void recordProblem(ManifestProblem manifestProblem);
+
+
+
+}
+
diff --git a/util/org.eclipse.virgo.util.parser.manifest/src/main/resources/about.html b/util/org.eclipse.virgo.util.parser.manifest/src/main/resources/about.html
new file mode 100644
index 0000000..c258ef5
--- /dev/null
+++ b/util/org.eclipse.virgo.util.parser.manifest/src/main/resources/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>June 5, 2006</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/util/org.eclipse.virgo.util.parser.manifest/src/test/java/org/eclipse/virgo/util/parser/manifest/RecoveringManifestParserTests.java b/util/org.eclipse.virgo.util.parser.manifest/src/test/java/org/eclipse/virgo/util/parser/manifest/RecoveringManifestParserTests.java
new file mode 100644
index 0000000..f1428f8
--- /dev/null
+++ b/util/org.eclipse.virgo.util.parser.manifest/src/test/java/org/eclipse/virgo/util/parser/manifest/RecoveringManifestParserTests.java
@@ -0,0 +1,786 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.parser.manifest;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.StringReader;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Map;
+import java.util.jar.Manifest;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+import junit.framework.TestCase;
+
+import org.eclipse.virgo.util.parser.manifest.internal.RecoveringManifestLexer;
+import org.eclipse.virgo.util.parser.manifest.internal.TestVisitor;
+
+public class RecoveringManifestParserTests extends TestCase {
+
+    private static final String ABC = "abcdefghijklmnopqrstuvwxyz";
+
+    TestVisitor v;
+
+    RecoveringManifestParser mp;
+
+    /**
+     * 
+     * Example of how to basically create a parser, parse a file then check for the problems.
+     * 
+     * @throws Exception sometimes
+     */
+
+    public void testBasicParserUsage() throws Exception {
+
+        ManifestParser mParser = new RecoveringManifestParser();
+
+        try (InputStream broken = new FileInputStream("build/resources/test/broken001.mf")) {
+            ManifestContents contents = mParser.parse(new InputStreamReader(broken, UTF_8));
+
+            // has errors but recoverable
+
+            assertTrue(mParser.foundProblems());
+
+            Map<String, String> mainAttrs = contents.getMainAttributes();
+
+            assertEquals("toys", mainAttrs.get("Bundle-Name"));
+
+            assertEquals("1.0", contents.getVersion());
+
+            Map<String, String> secondaryAttrs = contents.getAttributesForSection("secondSection");
+
+            assertEquals("secondSection", secondaryAttrs.get("Name"));
+
+            List<String> sectionNames = contents.getSectionNames();
+
+            assertEquals("secondSection", sectionNames.get(0));
+        }
+    }
+
+    public void testNameTooLong() {
+
+        StringBuffer sb = new StringBuffer();
+
+        sb.append("Manifest-Version: 1.0\n");
+
+        while (sb.length() < (RecoveringManifestLexer.MAX_TOKEN_LENGTH + 10000)) {
+
+            sb.append(ABC);
+
+        }
+
+        sb.append("abc: value\n");
+
+        ManifestParser mParser = new RecoveringManifestParser();
+
+        ManifestContents contents = mParser.parse(sb.toString());
+
+        assertNotNull(contents);
+
+        assertTrue(mParser.foundProblems());
+
+        assertEquals(ManifestProblemKind.NAME_TOO_LONG, mParser.getProblems().get(0).getKind());
+
+    }
+
+    public void testValueTooLong() throws Exception {
+
+        StringBuffer sb = new StringBuffer();
+
+        sb.append("Manifest-Version: 1.0\nName:\n");
+
+        while (sb.length() < (RecoveringManifestLexer.MAX_TOKEN_LENGTH + 10000)) {
+
+            sb.append(" " + ABC).append("\n");
+
+        }
+
+        ManifestParser mParser = new RecoveringManifestParser();
+
+        ManifestContents contents = mParser.parse(sb.toString());
+
+        assertNotNull(contents);
+
+        assertTrue(mParser.foundProblems());
+
+        assertEquals(ManifestProblemKind.VALUE_TOO_LONG, mParser.getProblems().get(0).getKind());
+
+    }
+
+    // Checking the isXXX methods in the lexer now by passing chars with a value
+
+    // > 256 (this means the lookup tables won't be used)
+
+    public void testFunkyChars() {
+
+        ManifestParser mParser = new RecoveringManifestParser();
+
+        mParser.parse("Manifest-Version: 1.0\nName: " + new Character((char) 257));
+
+        mParser = new RecoveringManifestParser();
+
+        mParser.parse("Manifest-Version: 1.0\n" + new Character((char) 257) + "ame: value");
+
+        mParser = new RecoveringManifestParser();
+
+        mParser.parse("Manifest-Version: 1.0\nN" + new Character((char) 257) + "ame: value");
+
+    }
+
+    public void testSkippingSections() {
+
+        TestVisitor tv = new TestVisitor();
+
+        tv.setTerminateAfterMainSection(true);
+
+        ManifestParser mParser = new RecoveringManifestParser(tv);
+
+        ManifestContents contents = mParser.parse("Manifest-Version: 1.0\na: b\n\nName: Second\nc: d\n");
+
+        assertFalse(mParser.foundProblems());
+
+        // Attributes are "Manifest-Version" and "a"
+
+        assertEquals(2, contents.getMainAttributes().size());
+
+        assertTrue(contents.getSectionNames().isEmpty());
+
+    }
+
+    public void testSkippingSections2() {
+
+        ManifestParser mParser = new RecoveringManifestParser();
+
+        mParser.setTerminateAfterMainSection(true);
+
+        ManifestContents contents = mParser.parse("Manifest-Version: 1.0\na: b\n\nName: Second\nc: d\n\nName: Third\ne: f\n");
+
+        assertFalse(mParser.foundProblems());
+
+        // Attributes are "Manifest-Version" and "a"
+
+        assertEquals(2, contents.getMainAttributes().size());
+
+        // Nothing there:
+
+        assertEquals(0, contents.getSectionNames().size());
+
+    }
+
+    public void testTheMostBasic() throws Exception {
+
+        parse("Manifest-Version: 1.0");
+
+        assertEquals("1.0", v.getVersion());
+
+        parse("Manifest-Version:\n 1.0");
+
+        assertEquals("1.0", v.getVersion());
+
+    }
+
+    // public void testRogueNewlines() throws Exception {
+
+    // parse("\n\nManifest-Version: 1.0");
+
+    // assertEquals("1.0", v.getVersion());
+
+    // assertTrue(mp.foundProblems());
+
+    // assertEquals(1, mp.getProblems().size());
+
+    // }
+
+    public void testErrorScenarios() throws Exception {
+
+        parse("Manifest-Version\n 1.0");
+
+        assertEquals("1.0", v.getVersion());
+
+        // MP002:[line 1, col 0]: Name header ended prematurely when a newline
+
+        // was encountered. Expected form is Name: Value
+
+        assertTrue(mp.foundProblems());
+
+        assertEquals(1, mp.getProblems().size());
+
+    }
+
+    public void testErrorScenarios2() throws Exception {
+
+        // Here the manifest-version is not found, because there is no space on
+
+        // the second line ahead of 1.0 - so we assume it is a
+
+        // new header
+
+        parse("Manifest-Version\n1.0");
+
+        // assertEquals("1.0", v.getVersion());
+
+        // Printing problems: #5
+
+        // Manifest-Version
+
+        // ^ ^
+
+        // MP002:[line 1, col 0]: Name header ended prematurely when a newline
+
+        // was encountered. Expected form is Name: Value
+
+        // Manifest-Version
+
+        // ^ ^
+
+        // MP004:[line 1, col 0]: The value appears to be missing for the header
+
+        // name 'Manifest-Version'
+
+        // 1.0
+
+        // ^
+
+        // MP005:[line 2, col 1]: The name of a header cannot contain the
+
+        // character '.'
+
+        // 1.0
+
+        // ^ ^
+
+        // MP002:[line 2, col 0]: Name header ended prematurely when a newline
+
+        // was encountered. Expected form is Name: Value
+
+        // 1.0
+
+        // ^ ^
+
+        // MP004:[line 2, col 0]: The value appears to be missing for the header
+
+        // name '1.0'
+
+        assertTrue(mp.foundProblems());
+
+        assertEquals(5, mp.getProblems().size());
+
+    }
+
+    public void testErrorScenarios3() throws Exception {
+
+        // Now we work out that they have missed the colon and the value is on
+
+        // the second line
+
+        parse("Manifest-Version\n 1.0");
+
+        // Manifest-Version
+
+        // ^ ^
+
+        // MP002:[line 1, col 0]: Name header ended prematurely when a newline
+
+        // was encountered. Expected form is Name: Value
+
+        assertEquals("1.0", v.getVersion());
+
+        assertTrue(mp.foundProblems());
+
+        assertEquals(1, mp.getProblems().size());
+
+    }
+
+    public void testSimpleSetOfNameValueHeaders() throws Exception {
+
+        parse("Manifest-Version: 1.0\na: b\nc: d");
+
+        v.assertHeaderCount(3);
+
+    }
+
+    public void testTwoSectionManifest() throws Exception {
+
+        parse("Manifest-Version: 1.0\na: b\nc: d\n\nfoo: bar\nWibble: wobble");
+
+        v.assertSecondarySectionsCount(1);
+
+    }
+
+    private void readFromJar(String manifestName) {
+
+        try (ZipFile manifestTestDataZip = new ZipFile("build/resources/test/manifests.zip")) {
+
+            ZipEntry manifestZipEntry = manifestTestDataZip.getEntry(manifestName);
+
+            InputStreamReader inputStreamReader = new InputStreamReader(manifestTestDataZip.getInputStream(manifestZipEntry), UTF_8);
+            parse(inputStreamReader);
+
+        } catch (IOException e) {
+
+            e.printStackTrace();
+            fail("Unexpected IOException " + e.getMessage());
+
+        }
+    }
+
+    // --- tests involving testdata on the disk
+
+    public void testBasicOsgiManifest() throws Exception {
+
+        readFromJar("manifest0000.mf");
+
+        assertFalse(mp.foundProblems());
+        assertContainsHeaderNameValuePair("Bundle-Localization", "plugin");
+
+    }
+
+    // public void testBasicOsgiManifest0011() throws Exception {
+    // parse(readFromJar("manifest0011.mf"));
+    // assertTrue(mp.foundProblems());
+    // assertProblem(ManifestProblemKind.UNEXPECTED_NAME);
+    // }
+
+    // public void testBasicOsgiManifest0210() throws Exception {
+
+    // parse(readFromJar("manifest0210.mf"));
+
+    // assertTrue(mp.foundProblems());
+
+    // assertProblem(ManifestProblemKind.UNEXPECTED_BLANK_LINES_AT_START_OF_MANIFEST);
+
+    // // assertProblem(ManifestProblemKind.UNEXPECTED_TOKEN_KIND);
+
+    // // assertProblem(ManifestProblemKind.UNEXPECTED_EOM);
+
+    // }
+
+    public void testStreamParsing() throws IOException {
+
+        Reader iStream = new StringReader(
+
+        "Manifest-Version: 1.0\r\nGrobble: gribble\r\n\r\n\r\nName: wobble\r\nFlibble:\r\n Fl\r\n ob\r\n le");
+
+        mp = new RecoveringManifestParser(v = new TestVisitor());
+
+        mp.parse(iStream);
+
+        // printProblems();
+
+        assertFalse(mp.foundProblems());
+
+    }
+
+    public void testBrokenManifests001() throws Exception {
+
+        parse(new File("build/resources/test/broken001.mf"));
+
+        assertTrue(mp.foundProblems());
+
+        // printProblems();
+
+        assertProblem(ManifestProblemKind.NAME_ENDED_WITH_SPACE_RATHER_THAN_COLON);
+
+    }
+
+    public void testMessageFormatting() {
+
+        String fmtd = ManifestProblemKind.NAME_MUST_START_WITH_ALPHANUMERIC.format(0, 0, "test");
+
+        assertNotNull(fmtd);
+
+    }
+
+    public void testBrokenManifests002() {
+
+        parse(getTestFile("broken002.mf"));
+
+        assertTrue(mp.foundProblems());
+
+        // printProblems();
+
+        // printHeaders();
+
+        assertProblem(ManifestProblemKind.NAME_ENDED_WITH_SPACE_RATHER_THAN_COLON);
+
+        assertProblem(ManifestProblemKind.VALUE_MUST_START_WITH_SPACE);
+
+        assertProblem(ManifestProblemKind.VALUE_MUST_IMMEDIATELY_FOLLOW_NAME);
+
+        assertProblem(ManifestProblemKind.ILLEGAL_NAME_CHAR);
+
+    }
+
+    public void testBrokenManifests003() {
+
+        parse(getTestFile("broken003.mf"));
+
+        assertTrue(mp.foundProblems());
+
+        // Name = secondSection
+
+        // intendedValueContinuationForLastLine =
+
+        // MissingColon = abcde
+
+        // OrdinaryName = OrdinaryValue
+
+        assertTrue(mp.getManifestContents().getAttributesForSection("secondSection").size() == 4);
+
+        assertProblem(ManifestProblemKind.NAME_ENDED_PREMATURELY_WITH_NEWLINE);
+
+        assertProblem(ManifestProblemKind.MISSING_VALUE);
+
+    }
+
+    // Funky package name char
+
+    public void testBasicOsgiManifest004() {
+
+        parse(getTestFile("broken004.mf"));
+
+        String myway = v.getMainAttributes().get("Export-Package");
+
+        assertEquals(".,p!yuck, a^f", myway);
+
+        assertFalse(mp.foundProblems());
+
+    }
+
+    public void testAllManifestTestData() throws Exception {
+
+        // few warmups before the monitored run
+
+        runPerformanceTest(false);
+
+        runPerformanceTest(false);
+
+        runPerformanceTest(false);
+
+        runPerformanceTest(true);
+
+    }
+
+    public void runPerformanceTest(boolean measure) throws Exception {
+
+        ZipFile manifestTestDataZip = new ZipFile("build/resources/test/manifests.zip");
+
+        try {
+
+            Enumeration<? extends ZipEntry> manifestsFromZip = manifestTestDataZip.entries();
+
+            int c = 0;
+
+            long stime = System.currentTimeMillis();
+
+            while (manifestsFromZip.hasMoreElements()) {
+
+                ZipEntry manifestEntry = manifestsFromZip.nextElement();
+
+                String manifestName = manifestEntry.getName();
+
+                if (!manifestName.endsWith(".mf") || !manifestName.startsWith("manifest")) {
+
+                    continue;
+
+                }
+
+                InputStream fis = manifestTestDataZip.getInputStream(manifestEntry);
+
+                try {
+
+                    c++;
+
+                    Manifest mf = new Manifest(fis);
+
+                    mf.getEntries();
+
+                } catch (IOException e) {
+
+                    e.printStackTrace();
+
+                }
+
+                fis.close();
+
+            }
+
+            long etime = System.currentTimeMillis();
+
+            if (measure) {
+
+                System.out.println("JDK processed " + c + " manifests in " + (etime - stime) + "ms");
+
+            }
+
+            boolean pauseToAttachProfiler = false;
+
+            if (measure && pauseToAttachProfiler) {
+
+                System.in.read();
+
+            }
+
+            manifestsFromZip = manifestTestDataZip.entries();
+
+            stime = System.currentTimeMillis();
+
+            c = 0;
+
+            while (manifestsFromZip.hasMoreElements()) {
+
+                ZipEntry manifestEntry = manifestsFromZip.nextElement();
+
+                String manifestName = manifestEntry.getName();
+
+                if (!manifestName.endsWith(".mf") || !manifestName.startsWith("manifest")) {
+
+                    continue;
+
+                }
+
+                c++;
+
+                Reader r = new InputStreamReader(manifestTestDataZip.getInputStream(manifestEntry));
+
+                try {
+
+                    parse(r);
+
+                } catch (Exception e) {
+
+                    e.printStackTrace();
+
+                    fail("Failed on manifest " + manifestName);
+
+                }
+
+                r.close();
+
+            }
+
+            etime = System.currentTimeMillis();
+
+            if (measure) {
+
+                System.out.println("RecoverableParser processed " + c + " manifests in " + (etime - stime) + "ms");
+
+            }
+
+            if (measure && pauseToAttachProfiler) {
+
+                try {
+
+                    Thread.sleep(10000);
+
+                } catch (Exception e) {
+
+                }
+
+            }
+
+        } finally {
+
+            manifestTestDataZip.close();
+
+        }
+
+    }
+
+    // ---
+
+    private void assertContainsHeaderNameValuePair(String name, String value) {
+
+        Map<String, String> headers = v.getAllHeaders();
+
+        boolean found = false;
+
+        for (Map.Entry<String, String> headerEntry : headers.entrySet()) {
+
+            String headerName = headerEntry.getKey();
+
+            String headerValue = headerEntry.getValue();
+
+            if (headerName.equals(name) && headerValue.equals(headerValue)) {
+
+                found = true;
+
+                break;
+
+            }
+
+        }
+
+        if (!found) {
+
+            fail("Failed to find header name value pair: " + name + ": " + value);
+
+        }
+
+    }
+
+    private void parse(Reader r) {
+
+        try {
+
+            StringBuilder fileData = new StringBuilder(512);
+
+            char[] buf = new char[4096];
+
+            int numRead = 0;
+
+            while ((numRead = r.read(buf)) != -1) {
+
+                fileData.append(new String(buf, 0, numRead));
+
+            }
+
+            r.close();
+
+            parse(fileData.toString());
+
+        } catch (Exception e) {
+
+            throw new RuntimeException("Problem during parsing", e);
+
+        }
+
+    }
+
+    private void parse(File f) {
+
+        try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f))) {
+
+            StringBuilder fileData = new StringBuilder(512);
+
+            byte[] buf = new byte[4096];
+
+            int numRead = 0;
+
+            while ((numRead = bis.read(buf)) != -1) {
+
+                fileData.append(new String(buf, 0, numRead));
+
+            }
+
+            parse(fileData.toString());
+
+        } catch (Exception e) {
+            throw new RuntimeException("Problem during parsing", e);
+        }
+
+    }
+
+    private void parse(String manifest) throws Exception {
+
+        // long stime = System.currentTimeMillis();
+
+        try {
+
+            mp = new RecoveringManifestParser(v = new TestVisitor());
+
+            mp.parse(manifest);
+
+        } catch (Exception e) {
+
+            printProblems();
+
+            throw e;
+
+        }
+
+        // long etime = System.currentTimeMillis();
+
+        // System.out.println("Parsed in " + (etime - stime) + "ms");
+
+        // printProblems();
+
+        // printManifest();
+
+    }
+
+    private void printProblems() {
+
+        List<ManifestProblem> problems = mp.getProblems();
+
+        System.out.println("Printing problems:  #" + problems.size());
+
+        for (ManifestProblem manifestProblem : problems) {
+
+            System.out.println(manifestProblem.toStringWithContext());
+
+        }
+
+    }
+
+    private File getTestFile(String name) {
+
+        return new File("build/resources/test/" + name);
+
+    }
+
+    private ManifestProblem assertProblem(ManifestProblemKind expectedProblem) {
+
+        List<ManifestProblem> problems = mp.getProblems();
+
+        for (ManifestProblem manifestProblem : problems) {
+
+            if (manifestProblem.getKind() == expectedProblem) {
+
+                return manifestProblem;
+
+            }
+
+        }
+
+        printProblems();
+
+        fail("Did not find the expected problem " + expectedProblem);
+
+        return null;
+
+    }
+
+    // private void printManifest() {
+
+    // Map<String, String> allHeaders = v.getAllHeaders();
+
+    // for (Map.Entry<String, String> header : allHeaders.entrySet()) {
+
+    // System.out.println(header.getKey() + ": " + header.getValue());
+
+    // }
+
+    // }
+
+    // private void printHeaders() {
+
+    // Map<String, String> attrs = v.getAttributesForSection("secondSection");
+
+    // for (Map.Entry<String, String> attr : attrs.entrySet()) {
+
+    // System.out.println(attr.getKey() + " = " + attr.getValue());
+
+    // }
+
+    // }
+
+}
diff --git a/util/org.eclipse.virgo.util.parser.manifest/src/test/java/org/eclipse/virgo/util/parser/manifest/internal/ManifestLexerTests.java b/util/org.eclipse.virgo.util.parser.manifest/src/test/java/org/eclipse/virgo/util/parser/manifest/internal/ManifestLexerTests.java
new file mode 100644
index 0000000..da80abb
--- /dev/null
+++ b/util/org.eclipse.virgo.util.parser.manifest/src/test/java/org/eclipse/virgo/util/parser/manifest/internal/ManifestLexerTests.java
@@ -0,0 +1,1332 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.parser.manifest.internal;
+
+
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StringReader;
+import java.util.Iterator;
+import java.util.List;
+import java.util.jar.Attributes;
+import java.util.jar.Manifest;
+
+import org.eclipse.virgo.util.parser.manifest.ManifestProblem;
+import org.eclipse.virgo.util.parser.manifest.ManifestProblemKind;
+import org.eclipse.virgo.util.parser.manifest.internal.RecoveringManifestLexer;
+import org.eclipse.virgo.util.parser.manifest.internal.SourceContext;
+import org.eclipse.virgo.util.parser.manifest.internal.Token;
+import org.eclipse.virgo.util.parser.manifest.internal.TokenKind;
+import org.eclipse.virgo.util.parser.manifest.internal.TokenStream;
+
+import junit.framework.TestCase;
+
+
+
+/*
+
+ * section:           *header +newline 
+
+ * nonempty-section:  +header +newline
+
+ * newline:           CR LF | LF | CR (not followed by LF)
+
+ * header:            name : value
+
+ * name:              alphanum *headerchar
+
+ * value:             SPACE *otherchar newline *continuation
+
+ * continuation:      SPACE *otherchar newline
+
+ * alphanum:          {A-Z} | {a-z} | {0-9}
+
+ * headerchar:        alphanum | - | _
+
+ * otherchar:         any UTF-8 character except NUL, CR and LF
+
+ */
+
+
+
+/**
+
+ * These tests verify the lowest level of processing - lexing the input into tokens with some simple error recovery.
+
+ * 
+
+
+ */
+
+public class ManifestLexerTests extends TestCase {
+
+
+
+	TokenStream tokenStream;
+
+	Token t;
+
+
+
+	public void testTokenKinds() {
+
+		tokenStream = RecoveringManifestLexer.tokenize("Name: Andy");
+
+		t = tokenStream.next();
+
+		assertTrue(TokenKind.isName(t));
+
+		assertEquals("Name", t.getKind().getTokenString());
+
+		t = tokenStream.next();
+
+		assertTrue(TokenKind.isColon(t));
+
+		assertEquals(":", t.getKind().getTokenString());
+
+		t = tokenStream.next();
+
+		assertTrue(TokenKind.isValue(t));
+
+		assertEquals("Value", t.getKind().getTokenString());
+
+		t = tokenStream.next();
+
+		assertTrue(TokenKind.isNewline(t));
+
+		assertEquals("\\n", t.getKind().getTokenString());
+
+		t = tokenStream.next();
+
+		assertTrue(TokenKind.isNewline(t));
+
+		assertEquals("\\n", t.getKind().getTokenString());
+
+
+
+		// Check what happens off the end of the stream
+
+		assertNull(tokenStream.next()); // null - no more tokens
+
+		assertNull(tokenStream.peek(5)); // peek off the end
+
+	}
+
+
+
+	public void testIllegalNameChar() {
+
+		// % not allowed in the name, it is ignored but logged as a problem
+
+		checkTokenization(false, "Anima%l: Elephant", new Name("Animal"), new Colon(), new Value("Elephant"), Any, Any);
+
+		assertTrue(tokenStream.containsProblems());
+
+		ManifestProblem problem = tokenStream.getProblems().get(0);
+
+		assertEquals(ManifestProblemKind.ILLEGAL_NAME_CHAR, problem.getKind());
+
+		assertEquals(5, problem.getStartOffset());
+
+		assertEquals(5, problem.getEndOffset());
+
+		assertEquals(1, tokenStream.getSourceContext().getLine(problem.getStartOffset()));
+
+	}
+
+
+
+	public void testIllegalContinuation() {
+
+		// First char where name or continuation expected is not a space or
+
+		// valid name char
+
+		checkTokenization(false, "Animal: Ele\n$phant", new Name("Animal"), new Colon(), new Value("Ele$phant"), Any, Any);
+
+		assertTrue(tokenStream.containsProblems());
+
+		ManifestProblem problem = tokenStream.getProblems().get(0);
+
+		assertEquals(ManifestProblemKind.MISSING_SPACE_FOR_CONTINUATION, problem.getKind());
+
+		assertEquals(12, problem.getStartOffset());
+
+		assertEquals(13, problem.getEndOffset());
+
+		assertEquals(2, problem.getStartLine());
+
+		assertEquals(2, problem.getEndLine());
+
+		assertEquals(0, problem.getStartColumn());
+
+		assertEquals(1, problem.getEndColumn());
+
+		assertEquals(2, tokenStream.getSourceContext().getLine(problem.getStartOffset()));
+
+	}
+
+
+
+	public void testRogueExtraSpaceEndingNameLine() {
+
+		checkTokenization(false, "Animal: \n Elephant", new Name("Animal"), new Colon(), new Value("Elephant"), Any, Any);
+
+		assertStream("[Animal,:,Elephant,\\n,\\n]");
+
+	}
+
+
+
+	public void testMissingColonInNameValueHeader() {
+
+		checkTokenization(false, "Animal Elephant", new Name("Animal"), new Colon(), new Value("Elephant"), Any, Any);
+
+		assertTrue(tokenStream.containsProblems());
+
+		assertEquals(ManifestProblemKind.NAME_ENDED_WITH_SPACE_RATHER_THAN_COLON, tokenStream.getProblems().get(0).getKind());
+
+	}
+
+
+
+	public void testTokenStreamMovement() {
+
+		tokenStream = RecoveringManifestLexer.tokenize("Name: Andy");
+
+		assertEquals(0, tokenStream.getPosition());
+
+		t = tokenStream.next();
+
+		assertEquals(1, tokenStream.getPosition());
+
+		assertTrue(TokenKind.isName(t));
+
+		tokenStream.setPosition(0);
+
+		assertEquals(0, tokenStream.getPosition());
+
+		t = tokenStream.next();
+
+		assertTrue(TokenKind.isName(t));
+
+	}
+
+
+
+	public void testTokenInsertion() {
+
+		// ':' should be inserted during lexing (it will be logged as a problem too)
+
+		tokenStream = RecoveringManifestLexer.tokenize("Manifest-Version\n1.0");
+
+		assertEquals("TokenStream:#9 tokens:[Manifest-Version,:,,\\n,10,:,,\\n,\\n]", tokenStream.toFormattedString(false));
+
+		assertTrue(tokenStream.containsProblems());
+
+	}
+
+
+
+	public void testTokenPositioning() {
+
+		// Andy value starts on line 4 and ends on 5
+
+		tokenStream = RecoveringManifestLexer.tokenize("\n\n\nName: An\n dy");
+
+		t = tokenStream.next(); // skip newline
+
+		t = tokenStream.next(); // skip newline
+
+		t = tokenStream.next(); // skip newline
+
+		t = tokenStream.next(); // skip name
+
+		t = tokenStream.next(); // skip colon
+
+		t = tokenStream.next();
+
+		assertEquals("Andy", t.value());
+
+		assertEquals(4, tokenStream.getSourceContext().getLine(t));
+
+		assertEquals(5, tokenStream.getSourceContext().getEndLine(t));
+
+	}
+
+
+
+	/**
+
+	 * Check the line breaks are calculated as being in the right places - this is required for accurate messages if they need to
+
+	 * include column and line numbers.
+
+	 */
+
+	public void testLinebreaks() {
+
+		// Relies on the tokenizer basically working (this data is valid)
+
+		tokenStream = RecoveringManifestLexer.tokenize("Foo: Bar\nGrobble: gribble\n\n\nWibble: wobble\nFlibble:\n Fl\nob\nle");
+
+		SourceContext context = tokenStream.getSourceContext();
+
+		int[] linebreaks = context.getLinebreaks();
+
+		int[] expectedLinebreaks = new int[] { 0, 9, 26, 27, 28, 43, 52, 56, 59, 62, 63 };
+
+		assertEquals(expectedLinebreaks.length, linebreaks.length);
+
+		for (int i = 0; i < expectedLinebreaks.length; i++) {
+
+			if (expectedLinebreaks[i] != linebreaks[i]) {
+
+				fail("At position '" + i + "' in linebreak expected output, we expected " + expectedLinebreaks[i] + " but found "
+
+						+ linebreaks[i]);
+
+			}
+
+		}
+
+	}
+
+
+
+	/**
+
+	 * Check the line breaks are calculated as being in the right places - this is required for accurate messages if they need to
+
+	 * include column and line numbers. This variant includes carriage returns.
+
+	 */
+
+	public void testLinebreaksIncludingCarriageReturns() {
+
+		// Relies on the tokenizer basically working (this data is valid)
+
+		tokenStream = RecoveringManifestLexer
+
+				.tokenize("Foo: Bar\r\nGrobble: gribble\r\n\r\n\r\nWibble: wobble\r\nFlibble:\r\n Fl\r\nob\r\nle");
+
+		SourceContext context = tokenStream.getSourceContext();
+
+		int[] linebreaks = context.getLinebreaks();
+
+		int[] expectedLinebreaks = new int[] { 0, 10, 28, 30, 32, 48, 58, 63, 67, 70, 71 };
+
+		assertEquals(expectedLinebreaks.length, linebreaks.length);
+
+		for (int i = 0; i < expectedLinebreaks.length; i++) {
+
+			if (expectedLinebreaks[i] != linebreaks[i]) {
+
+				fail("At position '" + i + "' in linebreak expected output, we expected " + expectedLinebreaks[i] + " but found "
+
+						+ linebreaks[i]);
+
+			}
+
+		}
+
+	}
+
+
+
+	public void testNewlineTokens() {
+
+		tokenStream = RecoveringManifestLexer
+
+				.tokenize("Foo: Bar\r\nGrobble: gribble\r\n\r\n\r\nWibble: wobble\r\nFlibble:\r\n Fl\r\n ob\r\n le");
+
+		// Newlines will occur for blank lines and at the end of values:
+
+		String exp = "[Foo,:,Bar,\\n,Grobble,:,gribble,\\n,\\n,\\n,Wibble,:,wobble,\\n,Flibble,:,Floble,\\n,\\n]";
+
+		String actual = tokenStream.toFormattedString(false);
+
+		assertEquals(19, tokenStream.getCount());
+
+		assertEquals(exp, actual.substring(actual.indexOf("[")));
+
+	}
+
+
+
+	public void testNewlineTokensStreamProcessing1() throws IOException {
+
+		Reader iStream = toStream("Foo: Bar\nGrobble: gribble\n\n\nWibble: wobble\nFlibble:\n Fl\n ob\n le");
+
+		tokenStream = RecoveringManifestLexer.tokenize(iStream);
+
+		// Newlines will occur for blank lines and at the end of values:
+
+		String exp = "[Foo,:,Bar,\\n,Grobble,:,gribble,\\n,\\n,\\n,Wibble,:,wobble,\\n,Flibble,:,Floble,\\n,\\n]";
+
+		String actual = tokenStream.toFormattedString(false);
+
+		assertEquals(19, tokenStream.getCount());
+
+		assertEquals(exp, actual.substring(actual.indexOf("[")));
+
+	}
+
+
+
+	public void testNewlineTokensStreamProcessing2() throws IOException {
+
+		Reader iStream = toStream("Foo: Bar\r\nGrobble: gribble\r\n\r\n\r\nWibble: wobble\r\nFlibble:\r\n Fl\r\n ob\r\n le");
+
+		tokenStream = RecoveringManifestLexer.tokenize(iStream);
+
+		// Newlines will occur for blank lines and at the end of values:
+
+		String exp = "[Foo,:,Bar,\\n,Grobble,:,gribble,\\n,\\n,\\n,Wibble,:,wobble,\\n,Flibble,:,Floble,\\n,\\n]";
+
+		String actual = tokenStream.toFormattedString(false);
+
+		assertEquals(19, tokenStream.getCount());
+
+		assertEquals(exp, actual.substring(actual.indexOf("[")));
+
+	}
+
+
+
+	private Reader toStream(String data) {
+
+		return new StringReader(data);
+
+	}
+
+
+
+	public void testUsingTokenizer() {
+
+		// Should produce a stream of 3 tokens (name=Foo colon value=Bar)
+
+		tokenStream = RecoveringManifestLexer.tokenize("Foo: Bar");
+
+		assertEquals(5, tokenStream.getCount());
+
+		checkNextToken(new Name("Foo", 0, 3, 1, 0, 3));
+
+		checkNextToken(new Colon(3, 4, 1, 3, 4));
+
+		checkNextToken(new Value("Bar", 5, 8, 1, 5, 8));
+
+	}
+
+
+
+	public void testUsingTokenizerMultiLine() {
+
+		tokenStream = RecoveringManifestLexer.tokenize("Char: Drizzle\nClass: Warlock");
+
+		assertEquals(9, tokenStream.getCount());
+
+		checkNextToken(new Name("Char", 0, 4, 1, 0, 4));
+
+		checkNextToken(new Colon(4, 5, 1, 4, 5));
+
+		checkNextToken(new Value("Drizzle", 6, 13, 1, 6, 13));
+
+		checkNextToken(new Newline(13, 14, 1, 13, 0)); // offset for end of a
+
+		// newline is 0, first
+
+		// char on the next row!
+
+		checkNextToken(new Name("Class", 14, 19, 2, 0, 5));
+
+		checkNextToken(new Colon(19, 20, 2, 5, 6));
+
+		checkNextToken(new Value("Warlock", 21, 28, 2, 7, 14));
+
+		checkNextToken(new Newline(28, 29, 2, 14, 0));
+
+	}
+
+
+
+	public void testUsingTokenizerMultiLineAsStream() throws IOException {
+
+		tokenStream = RecoveringManifestLexer.tokenize(toStream("Char: Drizzle\nClass: Warlock"));
+
+		assertEquals(9, tokenStream.getCount());
+
+		checkNextToken(new Name("Char", 0, 4, 1, 0, 4));
+
+		checkNextToken(new Colon(4, 5, 1, 4, 5));
+
+		checkNextToken(new Value("Drizzle", 6, 13, 1, 6, 13));
+
+		checkNextToken(new Newline(13, 14, 1, 13, 0)); // offset for end of a
+
+		// newline is 0, first
+
+		// char on the next row!
+
+		checkNextToken(new Name("Class", 14, 19, 2, 0, 5));
+
+		checkNextToken(new Colon(19, 20, 2, 5, 6));
+
+		checkNextToken(new Value("Warlock", 21, 28, 2, 7, 14));
+
+		checkNextToken(new Newline(28, 29, 2, 14, 0));
+
+
+
+	}
+
+
+
+	public void testStreamProcessingUnicode() throws IOException {
+
+		tokenStream = RecoveringManifestLexer.tokenize(toStream("Char: Drizzle\nClass: foo�bar"));
+
+		assertEquals(9, tokenStream.getCount());
+
+	}
+
+
+
+	public void testProcessingUnicode() throws Exception {
+
+		tokenStream = RecoveringManifestLexer.tokenize("Char: Drizzle\nClass: foo�bar");
+
+		assertEquals(9, tokenStream.getCount());
+
+	}
+
+
+
+	public void testJustTheHeaderName() {
+
+		// Missing a value for this name
+
+		tokenStream = RecoveringManifestLexer.tokenize("JustTheName");
+
+		assertTrue(tokenStream.containsProblems());
+
+		assertStream("[JustTheName,:,,\\n,\\n]"); // phantom colon and value
+
+		// inserted
+
+		ManifestProblem problem = tokenStream.getProblems().get(0);
+
+		assertEquals(ManifestProblemKind.NAME_ENDED_PREMATURELY_WITH_NEWLINE, problem.getKind());
+
+		String s = problem.toString();
+
+		assertTrue(">" + s, s.startsWith("MP002:[line 1, col 0]: Header name ended prematurely"));
+
+		s = problem.toStringWithContext();
+
+		assertTrue(">" + s, s.startsWith("JustTheName"));
+
+
+
+	}
+
+
+
+	public void testNameWithoutValue() {
+
+		checkTokenizationProblemOccurs("JustTheName:", new ExpectedProblem(ManifestProblemKind.VALUE_MUST_IMMEDIATELY_FOLLOW_NAME,
+
+				1, 0, 11));
+
+	}
+
+
+
+	public void testStartingWithNewlines() {
+
+		checkTokenization("\n\nName: value", new Newline(), new Newline(), new Name("Name"), new Colon(), new Value("value"), Any,
+
+				Any);
+
+	}
+
+
+
+	public void testFailingToStartValueWithSpace() {
+
+		checkTokenizationProblemOccurs("\n\nName:value", new ExpectedProblem(ManifestProblemKind.VALUE_MUST_START_WITH_SPACE, 3, 5,
+
+				5));
+
+		String exp = "[\\n,\\n,Name,:,value,\\n,\\n]";
+
+		String act = tokenStream.toFormattedString(false);
+
+		assertEquals(exp, act.substring(act.indexOf("[")));
+
+	}
+
+
+
+	public void testSplitNameValue() {
+
+		tokenStream = RecoveringManifestLexer.tokenize("Class:\n Warlock");
+
+		assertEquals(5, tokenStream.getCount());
+
+		t = tokenStream.peek(2);
+
+		assertEquals("Warlock", t.value());
+
+
+
+		tokenStream = RecoveringManifestLexer.tokenize("Class:\n  Warlock");
+
+		assertEquals(5, tokenStream.getCount());
+
+		t = tokenStream.peek(2);
+
+		assertEquals(" Warlock", t.value());
+
+		t = tokenStream.peekLast();
+
+		assertEquals("\\n", t.value());
+
+	}
+
+
+
+	public void testMultiLineValue() {
+
+		tokenStream = RecoveringManifestLexer.tokenize("Class:\n War\n lo\n ck");
+
+		assertEquals(5, tokenStream.getCount());
+
+		t = tokenStream.peek(2);
+
+		assertEquals("Warlock", t.value());
+
+	}
+
+
+
+	public void testIncorrectStartCharacterForName() {
+
+		// Manifest cannot start with a 'space', recovery will attempt to treat
+
+		// it as a name and move on
+
+		checkTokenizationProblemOccurs(" Foo: Bar", new ExpectedProblem(ManifestProblemKind.NAME_MUST_START_WITH_ALPHANUMERIC, 1,
+
+				0, 0));
+
+		assertStream("[Foo,:,Bar,\\n,\\n]");
+
+	}
+
+
+
+	public void testMultipleErrorsAllDetected() {
+
+		// Manifest cannot start with a 'space', recovery will attempt to treat
+
+		// it as a name and move on - but there is a further problem in that it
+
+		// is only a name by itself, no colon or value
+
+		checkTokenizationProblemOccurs(" Foo", new ExpectedProblem(ManifestProblemKind.NAME_MUST_START_WITH_ALPHANUMERIC, 1, 0, 0));
+
+
+
+		checkTokenizationProblemOccurs(" Foo",
+
+				new ExpectedProblem(ManifestProblemKind.NAME_ENDED_PREMATURELY_WITH_NEWLINE, 1, 1, 4));
+
+
+
+		checkTokenizationProblemOccurs(" Foo", new ExpectedProblem(ManifestProblemKind.MISSING_VALUE, 1, 1, 4));
+
+	}
+
+
+
+	/**
+
+	 * Names are:
+
+	 * <ul>
+
+	 * <li>NAME = ALPHANUM *HEADERCHAR
+
+	 * <li>ALPHANUM = {A-Z}|{a-z}|{0-9}
+
+	 * <li>HEADERCHAR = ALPHANUM | - | _
+
+	 * </ul>
+
+	 */
+
+	public void testParsingValidNames() {
+
+		checkTokenization("abc: x", new Name("abc"), new Colon(), new Value("x"), new Newline(), new Newline());
+
+		checkTokenization("abc42: x", new Name("abc42"), new Colon(), new Value("x"), new Newline(), new Newline());
+
+		checkTokenization("37abc: x", new Name("37abc"), new Colon(), new Value("x"), new Newline(), new Newline());
+
+		checkTokenization("abc-37: x", new Name("abc-37"), new Colon(), new Value("x"), new Newline(), new Newline());
+
+		checkTokenization("abc_7: x", new Name("abc_7"), new Colon(), new Value("x"), new Newline(), new Newline());
+
+		checkTokenization("3-1: x", new Name("3-1"), new Colon(), new Value("x"), new Newline(), new Newline());
+
+		checkTokenization("3_Z: x", new Name("3_Z"), new Colon(), new Value("x"), new Newline(), new Newline());
+
+	}
+
+
+
+	public void testTokenizingInvalidNames() {
+
+		checkTokenizationProblemOccurs("_", new ExpectedProblem(ManifestProblemKind.ILLEGAL_NAME_CHAR, "_"));
+
+		checkTokenizationProblemOccurs("-", new ExpectedProblem(ManifestProblemKind.ILLEGAL_NAME_CHAR, "-"));
+
+		checkTokenizationProblemOccurs(":", new ExpectedProblem(ManifestProblemKind.ILLEGAL_NAME_CHAR, ":"));
+
+	}
+
+
+
+	public void testTokenizingValidValues() {
+
+		checkTokenization("a: somevalue", Any, Any, new Value("somevalue"), Any, Any);
+
+		checkTokenization("x: !@#$%^&*()", Any, Any, new Value("!@#$%^&*()"), Any, Any);
+
+	}
+
+
+
+	public void testTokenizingValidValuesSpecialChars() {
+
+		checkTokenization("a: \"string\"", Any, Any, new Value("\"string\""), Any, Any);
+
+		checkTokenization("a: a=3", new Name("a"), new Colon(), new Value("a=3"), Any, Any);
+
+		checkTokenization("a: \"a=3\"", new Name("a"), new Colon(), new Value("\"a=3\""), Any, Any);
+
+		checkTokenization("a: b:=3", new Name("a"), new Colon(), new Value("b:=3"), Any, Any);
+
+		checkTokenization("a: \"b:=3\"", new Name("a"), new Colon(), new Value("\"b:=3\""), Any, Any);
+
+		checkTokenization("a: b,3", new Name("a"), new Colon(), new Value("b,3"), Any, Any);
+
+		checkTokenization("a: \"b,3\"", new Name("a"), new Colon(), new Value("\"b,3\""), Any, Any);
+
+	}
+
+
+
+	/**
+
+	 * Investigating special character behaviour.
+	 * @throws Exception for IO errors, for example 
+
+	 */
+
+	public void testSpecialCharacters() throws Exception {
+
+		String twoByteUtf8 = "Export-Package: sch\u00f6n\n\n"; // the umlauted 'o' is
+
+		// \u00f6
+
+		byte[] twoByteUtf8data = twoByteUtf8.getBytes("UTF-8");
+
+		// The byte data is one longer than the string length as 2 bytes are
+
+		// needed to encode the special character
+
+		assertEquals(twoByteUtf8.length() + 1, twoByteUtf8data.length);
+
+
+
+		// String threeByteUtf8 = "Export-Package: Euro\u20acSymbol\n\n"; // the euro
+
+		// symbol is \u20ac
+
+		// byte[] threeByteUtf8data = threeByteUtf8.getBytes("UTF-8");
+
+		// // The byte data is two longer than the string length as 3 bytes are
+
+		// needed to encode the special character
+
+		// assertEquals(threeByteUtf8.length() + 2, threeByteUtf8data.length);
+
+		// String exports = new Manifest(new
+
+		// ByteArrayInputStream(threeByteUtf8data)).getMainAttributes().getValue("Export-Package");
+
+		// assertEquals("Euro\u20acSymbol", exports);
+
+		// System.out.println(exports);
+
+
+
+		String s = "Export-Package: c\u00f6m\n\n";
+
+		ByteArrayInputStream is = new ByteArrayInputStream(s.getBytes("UTF-8"));
+
+		Attributes attrs = new Manifest(is).getMainAttributes();
+
+		String exports = attrs.getValue("Export-Package");
+
+		assertEquals("c\u00f6m", exports);
+
+		// How is it treated by the lexer?
+
+		// String defaultManifestParser = new Manifest(new ByteArrayInputStream(twoByteUtf8data)).getMainAttributes().getValue(
+
+		// "Export-Package");
+
+		// System.out.println(defaultManifestParser);
+
+
+
+	}
+
+
+
+	public void testTokenizingMultipleValidValuesSpecialChars() {
+
+		checkTokenization("a: a=3,b:=2,d=\"foo\"", Any, Any, new Value("a=3,b:=2,d=\"foo\""), Any, Any);
+
+	}
+
+
+
+	public void testReal01() {
+
+		checkTokenization(false,
+
+				"Bundle-Localization: plugin\n\rExport-Package: org.eclipse.ajdt.core,\n\r org.eclipse.ajdt.core.builder,", Any,
+
+				new Colon(), Any, new Newline(), Any, new Name("Export-Package"), new Colon(), new Value(
+
+						"org.eclipse.ajdt.core,org.eclipse.ajdt.core.builder,"), new Newline(), Any);
+
+		assertTrue(tokenStream.containsProblems());
+
+		assertEquals(ManifestProblemKind.UNEXPECTED_NEWLINE_DURING_VALUE_PARSING, tokenStream.getProblems().get(0).getKind());
+
+	}
+
+
+
+	public void testReal02() {
+
+		checkTokenization(true,
+
+				"Bundle-Localization: plugin\r\nExport-Package: org.eclipse.ajdt.core,\r\n org.eclipse.ajdt.core.builder,", Any,
+
+				new Colon(), Any, new Newline(), new Name("Export-Package"), new Colon(), new Value(
+
+						"org.eclipse.ajdt.core,org.eclipse.ajdt.core.builder,"), new Newline(), Any);
+
+	}
+
+
+
+	public void testMultiLineValues() {
+
+		checkTokenization("a: foo\n goo", Any, Any, new Value("foogoo"), Any, Any);
+
+		checkTokenization("a: foo\n goo\n hoo", Any, Any, new Value("foogoohoo"), Any, Any);
+
+	}
+
+
+
+	public void testNameValueSequences() {
+
+		checkTokenization(false, "a: foo\n goo\nhoo", Any, Any, new Value("foogoo"), Any, new Name("hoo"), Any, Any, Any, Any);
+
+	}
+
+
+
+	public void testValidNameValues() {
+
+		checkTokenization("abc: foo", new Name("abc"), new ExpectedToken(":", TokenKind.COLON), new Value("foo"), Any, Any);
+
+	}
+
+
+
+	// Before parsing, two newlines are added to the file (spec)
+
+	public void testNewlines() {
+
+		tokenStream = RecoveringManifestLexer.tokenize("");
+
+		assertEquals(2, tokenStream.getCount());
+
+		assertEquals(TokenKind.NEWLINE, tokenStream.peek(0).getKind());
+
+		assertEquals(TokenKind.NEWLINE, tokenStream.peek(1).getKind());
+
+	}
+
+
+
+	public void testFinalValueHasNoPreceedingSpace() {
+
+		tokenStream = RecoveringManifestLexer.tokenize("Foo: Bar\nGrobble: gribble\n\n\nWibble: wobble\nFlibble:\nFl\n ob\n le");
+
+		assertTrue(tokenStream.containsProblems());
+
+		assertEquals(ManifestProblemKind.VALUE_MUST_START_WITH_SPACE, tokenStream.getProblems().get(0).getKind());
+
+		assertEquals(7, tokenStream.getSourceContext().getLine(tokenStream.getProblems().get(0).getStartOffset()));
+
+		t = tokenStream.next();
+
+		while (!t.value().equals("Flibble")) {
+
+			t = tokenStream.next();
+
+		}
+
+		tokenStream.next(); // colon
+
+		t = tokenStream.next();
+
+		assertEquals("Floble", t.value());
+
+		assertTrue(TokenKind.isValue(t));
+
+	}
+
+
+
+	// ---
+
+
+
+	private static final ExpectedToken Any = new Anything();
+
+
+
+	private void checkNextToken(ExpectedToken etoken) {
+
+		Token nexttoken = tokenStream.next();
+
+		assertEquals(etoken.kind, nexttoken.getKind());
+
+		assertEquals(etoken.value, nexttoken.value());
+
+		if (etoken.hasExpectedOffsets()) {
+
+			assertEquals(etoken.soff, nexttoken.getStartOffset());
+
+			assertEquals(etoken.eoff, nexttoken.getEndOffset());
+
+		}
+
+		if (etoken.hasExpectedLineAndColumn()) {
+
+			assertEquals(etoken.line, tokenStream.getSourceContext().getLine(nexttoken));
+
+			assertEquals(etoken.scol, tokenStream.getSourceContext().getStartColumn(nexttoken));
+
+			assertEquals(etoken.ecol, tokenStream.getSourceContext().getEndColumn(nexttoken));
+
+		}
+
+	}
+
+
+
+	static class ExpectedProblem {
+
+		ManifestProblemKind kind;
+
+		String[] inserts;
+
+		int line = -1;
+
+		int scol = -1;
+
+		int ecol = -1;
+
+
+
+		ExpectedProblem(ManifestProblemKind problemKind, int line, int scol, int ecol, String... inserts) {
+
+			this.kind = problemKind;
+
+			this.line = line;
+
+			this.scol = scol;
+
+			this.ecol = ecol;
+
+			this.inserts = inserts;
+
+		}
+
+
+
+		ExpectedProblem(ManifestProblemKind problemKind, String... inserts) {
+
+			this.kind = problemKind;
+
+			this.inserts = inserts;
+
+		}
+
+
+
+		public boolean hasExpectedPosition() {
+
+			return line != -1 && scol != -1 && ecol != -1;
+
+		}
+
+	}
+
+
+
+	static class Anything extends ExpectedToken {
+
+		Anything() {
+
+			super(null, null);
+
+		}
+
+	}
+
+
+
+	static class Name extends ExpectedToken {
+
+		Name(String txt) {
+
+			super(txt, TokenKind.NAME);
+
+		}
+
+
+
+		Name(String txt, int soff, int eoff, int line, int scol, int ecol) {
+
+			super(txt, TokenKind.NAME, soff, eoff, line, scol, ecol);
+
+		}
+
+	}
+
+
+
+	static class Colon extends ExpectedToken {
+
+		Colon() {
+
+			super(":", TokenKind.COLON);
+
+		}
+
+
+
+		Colon(int soff, int eoff, int line, int scol, int ecol) {
+
+			super(":", TokenKind.COLON, soff, eoff, line, scol, ecol);
+
+		}
+
+	}
+
+
+
+	static class Newline extends ExpectedToken {
+
+		Newline() {
+
+			super("\\n", TokenKind.NEWLINE);
+
+		}
+
+
+
+		Newline(int soff, int eoff, int line, int scol, int ecol) {
+
+			super("\\n", TokenKind.NEWLINE, soff, eoff, line, scol, ecol);
+
+		}
+
+	}
+
+
+
+	static class Value extends ExpectedToken {
+
+		Value(String txt) {
+
+			super(txt, TokenKind.VALUE);
+
+		}
+
+
+
+		Value(String txt, int soff, int eoff, int line, int scol, int ecol) {
+
+			super(txt, TokenKind.VALUE, soff, eoff, line, scol, ecol);
+
+		}
+
+	}
+
+
+
+	private void checkTokenizationProblemOccurs(String data, ExpectedProblem eProblem) {
+
+		tokenStream = RecoveringManifestLexer.tokenize(data);
+
+		assertTrue(tokenStream.containsProblems());
+
+		List<ManifestProblem> problems = tokenStream.getProblems();
+
+		boolean checked = false;
+
+		for (ManifestProblem manifestParserProblemInstance : problems) {
+
+			if (manifestParserProblemInstance.getKind() == eProblem.kind) {
+
+				if (eProblem.inserts != null) {
+
+					for (int i = 0; i < eProblem.inserts.length; i++) {
+
+						assertTrue(manifestParserProblemInstance.getInsertCount() > 0);
+
+						if (!eProblem.inserts[i].equals(manifestParserProblemInstance.getInsert(i))) {
+
+							fail("Insert " + i + " was expected to be '" + eProblem.inserts[i] + "' but was '"
+
+									+ manifestParserProblemInstance.getInsert(i) + "'");
+
+						}
+
+					}
+
+				}
+
+				if (eProblem.hasExpectedPosition()) {
+
+					assertEquals(eProblem.line, tokenStream.getSourceContext().getLine(manifestParserProblemInstance));
+
+					assertEquals(eProblem.scol, tokenStream.getSourceContext().getStartColumn(manifestParserProblemInstance));
+
+					assertEquals(eProblem.ecol, tokenStream.getSourceContext().getEndColumn(manifestParserProblemInstance));
+
+				}
+
+				checked = true;
+
+			}
+
+		}
+
+		if (!checked) {
+
+			fail("Did not find a problem of the expected kind '" + eProblem.kind + "'\n" + stringifyProblems(problems));
+
+		}
+
+	}
+
+
+
+	private void checkTokenization(String data, ExpectedToken... expectedTokens) {
+
+		checkTokenization(true, data, expectedTokens);
+
+	}
+
+
+
+	private void checkTokenization(boolean careAboutProblems, String data, ExpectedToken... expectedTokens) {
+
+		tokenStream = RecoveringManifestLexer.tokenize(data);
+
+		if (careAboutProblems && tokenStream.containsProblems()) {
+
+			printProblems(tokenStream.getProblems());
+
+			fail("Unexpected problems during processing of '" + data + "'\n" + stringifyProblems(tokenStream.getProblems()));
+
+		}
+
+		assertEquals("Tokenstream: " + tokenStream.toFormattedString(), (expectedTokens == null ? 0 : expectedTokens.length),
+
+				tokenStream.getCount());
+
+		if (expectedTokens != null) {
+
+			for (int i = 0; i < expectedTokens.length; i++) {
+
+				ExpectedToken etoken = expectedTokens[i];
+
+				if (etoken == Any) {
+
+					continue;
+
+				}
+
+				Token t = tokenStream.peek(i);
+
+				assertEquals(etoken.kind, t.getKind());
+
+				assertEquals(etoken.value, t.value());
+
+				if (etoken.hasExpectedOffsets()) {
+
+					assertEquals(etoken.line, tokenStream.getSourceContext().getLine(t));
+
+				}
+
+			}
+
+		}
+
+	}
+
+
+
+	static class ExpectedToken {
+
+		String value;
+
+		TokenKind kind;
+
+		int soff = -1;
+
+		int eoff = -1;
+
+		int line = -1;
+
+		int scol = -1;
+
+		int ecol = -1;
+
+
+
+		ExpectedToken(String value) {
+
+			this.value = value;
+
+		}
+
+
+
+		ExpectedToken(String value, TokenKind kind) {
+
+			this.value = value;
+
+			this.kind = kind;
+
+		}
+
+
+
+		ExpectedToken(String value, TokenKind kind, int soffset, int eoffset, int line, int scol, int ecol) {
+
+			this.value = value;
+
+			this.kind = kind;
+
+			this.soff = soffset;
+
+			this.eoff = eoffset;
+
+			this.line = line;
+
+			this.scol = scol;
+
+			this.ecol = ecol;
+
+		}
+
+
+
+		boolean hasExpectedOffsets() {
+
+			return soff != -1 && eoff != -1;
+
+		}
+
+
+
+		public boolean hasExpectedLineAndColumn() {
+
+			return line != -1 && scol != -1 && ecol != -1;
+
+		}
+
+	}
+
+
+
+	private void printProblems(List<ManifestProblem> lexerProblems) {
+
+		for (Iterator<ManifestProblem> iterator = lexerProblems.iterator(); iterator.hasNext();) {
+
+			ManifestProblem manifestProblem = iterator.next();
+
+			System.out.println(manifestProblem.toStringWithContext());
+
+		}
+
+	}
+
+
+
+	private String stringifyProblems(List<ManifestProblem> problems) {
+
+		StringBuilder sb = new StringBuilder();
+
+		for (ManifestProblem manifestProblem : problems) {
+
+			sb.append(manifestProblem.toString()).append("\n");
+
+		}
+
+		return sb.toString();
+
+	}
+
+
+
+	private void assertStream(String expectedFormattedStream) {
+
+		String actualFormattedStream = tokenStream.toFormattedString(false);
+
+		actualFormattedStream = actualFormattedStream.substring(actualFormattedStream.indexOf("["));
+
+		assertEquals(expectedFormattedStream, actualFormattedStream);
+
+	}
+
+}
+
diff --git a/util/org.eclipse.virgo.util.parser.manifest/src/test/java/org/eclipse/virgo/util/parser/manifest/internal/TestVisitor.java b/util/org.eclipse.virgo.util.parser.manifest/src/test/java/org/eclipse/virgo/util/parser/manifest/internal/TestVisitor.java
new file mode 100644
index 0000000..83c4311
--- /dev/null
+++ b/util/org.eclipse.virgo.util.parser.manifest/src/test/java/org/eclipse/virgo/util/parser/manifest/internal/TestVisitor.java
@@ -0,0 +1,99 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.util.parser.manifest.internal;
+
+
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.virgo.util.parser.manifest.internal.StandardVisitor;
+
+
+/**
+
+
+ */
+
+// CLOVER:OFF
+
+public class TestVisitor extends StandardVisitor {
+
+
+
+	@Override
+
+	public boolean visitSection(boolean isMain, String name) {
+
+		if (!isMain && terminateAfterMainSection) {
+
+			return false;
+
+		}
+
+		boolean b = super.visitSection(isMain, name);
+
+		return b;
+
+	}
+
+
+
+	public void assertHeaderCount(int i) {
+
+		if (getMainAttributes().size() != i) {
+
+			throw new RuntimeException("Expected " + i + " headers but found " + getMainAttributes().size());
+
+		}
+
+	}
+
+
+
+	public void assertSecondarySectionsCount(int i) {
+
+		if (getSectionNames().size() != i) {
+
+			throw new RuntimeException("Expected " + i + " sections but found " + getSectionNames().size());
+
+		}
+
+
+
+	}
+
+
+
+	public Map<String, String> getAllHeaders() {
+
+		Map<String, String> newMap = new HashMap<String, String>();
+
+		newMap.putAll(getMainAttributes());
+
+		List<String> names = getSectionNames();
+
+		for (String name : names) {
+
+			newMap.putAll(getAttributesForSection(name));
+
+		}
+
+		return newMap;
+
+	}
+
+
+
+}
+
diff --git a/util/org.eclipse.virgo.util.parser.manifest/src/test/resources/broken001.mf b/util/org.eclipse.virgo.util.parser.manifest/src/test/resources/broken001.mf
new file mode 100644
index 0000000..15f0206
--- /dev/null
+++ b/util/org.eclipse.virgo.util.parser.manifest/src/test/resources/broken001.mf
@@ -0,0 +1,9 @@
+Manifest-Version: 1.0

+Bundle-ManifestVersion: 2

+Bundle-Name: toys

+Bundle-SymbolicName: toys

+Bundle-Version: 1.0.0

+Export-Package: com.doodaa

+

+Name: secondSection

+MissingColon SomeValue
diff --git a/util/org.eclipse.virgo.util.parser.manifest/src/test/resources/broken002.mf b/util/org.eclipse.virgo.util.parser.manifest/src/test/resources/broken002.mf
new file mode 100644
index 0000000..8bd83f4
--- /dev/null
+++ b/util/org.eclipse.virgo.util.parser.manifest/src/test/resources/broken002.mf
@@ -0,0 +1,12 @@
+Manifest-Version: 1.0

+Bundle-ManifestVersion: 2

+Bundle-Name: toys

+Bundle-SymbolicName: toys

+Bundle-Version: 1.0.0

+Export-Package: com.doodaa

+

+Name: secondSection

+MissingColon SomeValue

+IncorrectValueStart:missingSpace

+InvalidöNameChar: foo

+MissingValue:
diff --git a/util/org.eclipse.virgo.util.parser.manifest/src/test/resources/broken003.mf b/util/org.eclipse.virgo.util.parser.manifest/src/test/resources/broken003.mf
new file mode 100644
index 0000000..0844893
--- /dev/null
+++ b/util/org.eclipse.virgo.util.parser.manifest/src/test/resources/broken003.mf
@@ -0,0 +1,11 @@
+Manifest-Version: 1.0

+Bundle-ManifestVersion: 2

+Bundle-Name: toys

+Bundle-SymbolicName: toys

+Bundle-Version: 1.0.0

+Export-Package: com.doodaa

+

+Name: secondSection

+MissingColon: abcde

+intendedValueContinuationForLastLine

+OrdinaryName: OrdinaryValue
diff --git a/util/org.eclipse.virgo.util.parser.manifest/src/test/resources/broken004.mf b/util/org.eclipse.virgo.util.parser.manifest/src/test/resources/broken004.mf
new file mode 100644
index 0000000..2f730ba
--- /dev/null
+++ b/util/org.eclipse.virgo.util.parser.manifest/src/test/resources/broken004.mf
@@ -0,0 +1,7 @@
+Manifest-Version: 1.0

+Bundle-ManifestVersion: 2

+Bundle-Name: toys

+Bundle-SymbolicName: toys

+Bundle-Version: 1.0.0

+Export-Package: .,

+ p!yuck, a^f

diff --git a/util/org.eclipse.virgo.util.parser.manifest/src/test/resources/manifests.zip b/util/org.eclipse.virgo.util.parser.manifest/src/test/resources/manifests.zip
new file mode 100644
index 0000000..d9e16c0
--- /dev/null
+++ b/util/org.eclipse.virgo.util.parser.manifest/src/test/resources/manifests.zip
Binary files differ
diff --git a/util/org.eclipse.virgo.util.parser.manifest/template.mf b/util/org.eclipse.virgo.util.parser.manifest/template.mf
new file mode 100644
index 0000000..e2bedd2
--- /dev/null
+++ b/util/org.eclipse.virgo.util.parser.manifest/template.mf
@@ -0,0 +1,6 @@
+Bundle-ManifestVersion: 2
+Bundle-Name: Java Manifest Parser
+Bundle-SymbolicName: org.eclipse.virgo.util.parser.manifest
+Bundle-Version: ${version}
+Excluded-Exports: 
+ org.eclipse.virgo.util.parser.manifest.internal.*